SIP音调通话调研结果

android中Sip音频通话调研结果       

        分类:            android移动开发1539人阅读评论(0)收藏举报
  1. <span style="font-family: Arial, Verdana, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);">     首先简单介绍一下sip协议,sip是会话启动协议,主要用于网络多媒体通话。必须是android2.3或其以上版本才可以调用Sip api,并且设备必须支持sip才可以进行sip通话。</span> 
     首先简单介绍一下sip协议,sip是会话启动协议,主要用于网络多媒体通话。必须是android2.3或其以上版本才可以调用Sip api,并且设备必须支持sip才可以进行sip通话。

SIP使用的api主要放在android.net.sip中,其中最核心的类为SipManager.java,关系图如下所示:

        本地的SipProfile存放在一个xml文件中,主要用于保存sip的username,domain和password,SharedPreference配置文件如下所示:

  1. <PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"> 
  2.     <EditTextPreference 
  3.         android:name="SIP Username" 
  4.         android:summary="Username for your SIP Account" 
  5.         android:defaultValue="" 
  6.         android:title="Enter Username" 
  7.         android:key="namePref"/> 
  8.     <EditTextPreference 
  9.         android:name="SIP Domain" 
  10.         android:summary="Domain for your SIP Account" 
  11.         android:defaultValue="" 
  12.         android:title="Enter Domain" 
  13.         android:key="domainPref"/> 
  14.     <EditTextPreference 
  15.         android:name="SIP Password" 
  16.         android:summary="Password for your SIP Account" 
  17.         android:defaultValue="" 
  18.         android:title="Enter Password" 
  19.         android:key="passPref" 
  20.         android:password="true"  
  21.         /> 
  22. </PreferenceScreen> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <EditTextPreference
        android:name="SIP Username"
        android:summary="Username for your SIP Account"
        android:defaultValue=""
        android:title="Enter Username"
        android:key="namePref" />
    <EditTextPreference
        android:name="SIP Domain"
        android:summary="Domain for your SIP Account"
        android:defaultValue=""
        android:title="Enter Domain"
        android:key="domainPref" />
    <EditTextPreference
        android:name="SIP Password"
        android:summary="Password for your SIP Account"
        android:defaultValue=""
        android:title="Enter Password"
        android:key="passPref"
        android:password="true" 
        />
</PreferenceScreen>

更新SharedPreference的代码如下:

  1. publicvoid updatePreferences() { 
  2.         Intent settingsActivity = new Intent(getBaseContext(), 
  3.                 SipSettings.class); 
  4.         startActivity(settingsActivity); 
  5.     } 
public void updatePreferences() {
        Intent settingsActivity = new Intent(getBaseContext(),
                SipSettings.class);
        startActivity(settingsActivity);
    }

调用updatePreferences()方法会有如下的效果图显示:

  1. <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAADrCAYAAAAPHt/6AAAgAElEQVR4Ae29f2jl1bn/u/zWQnIYIblMIbkomC8VzVChGSo0Qz1gxAMmODATLJhguRor1JkKdeYIR6dy8EQLdqYFO7FgJwqVjOCQEUYSoTLxD8ukYEkEvRM9ivGikHAdSMA5TWjndt/n9Xz288nan+xfyeydyY9nzWSvz4/1873Weq9nPWt91rpu//79uXPnzgU3joAjUD8EGq5vCOH6EBoaxBbD/bL8a5B/sR2uhLC8vBzUviJ2BWPhDr80HNpuadM4Tr58MvTc1RPa2pL74785rvE1NzXr+4l3JsK+O/aFhl1Jmrif+XimQkzJ64ZdIXR0toSuh+ZXu5e0k8dlsRvEnni1JUxPzofly6udbrUn1zlRbrUi8/RuWQSEPDBKkkKCJW3IswqSTEKLSBcyLmYg3zWEVyyI+JlyPXmx/MjlKkqHNIl31Ys4pK1znc/q1kmwp9QR2LIIQB5ijLRK2qtpJ/FY4jcbTglnNXucJb9twoVl8flfZd/6S0fAEXAEHIHgROmVwBFwBByBCgg4UVYAyF87Ao6AI1BWR3nq5VOJwhbdCi7ddhy8Hng72CE88MjDj6Q9REWJMqso9vtEde04OA60Iq8H27seGFOWXR6kEiWVQf6x3suM3zseXh+8PWx3Pnjk0TVKlLooNr8Oix50u9yTF13cK53i4vKiXmOzOoPn+n4b5ZeKvZ3Kz/Pj5Vnv+mydQdmhd5wII8ertbVy5xdiKUnReOX+asNdq3/7AoK4Fy8n5Gi2pQs3aw3X3SeLpR0Hx6Ee/LGR9cpIErvs0PvkSydrq7iGFJHQ+HwrY2uiNmqiIJ8OiHBheSE0yr+lfyyFxm+LLf+aG5JPvfTzMBK2UenyeGpb3xxPx/MqJp4OP35YackoIL1ZdVEiklgCVD+x5AUJFpEQzR02w1t6hkX5pz3E9UKefBcVx4dD7sWk4SGJ5iu/km0cT7l4xZuRswZIuPK3sLQQmm9oDgfvPxjabm5T8p75aCaMvjWqZFlA5pLS9D6O157nbQvfer6i95KeVfmw9JudCbdUePa8pE14efVBAb5OIoX1zfFwPGL+oT5E5lu33nrrf37yySfRo5XL7nu7w/I/l6VNX19gh7+HcPlvl8OVv18J3/zPN+G6/++6sPz35XDln1fC8t8SG0ntur9fFxb+R2x5jzvc8P7b3/p2+Ne7/1Uj+vLLL8N114l/acwsf79y5Uq4/n9JfHJP+Jfli3qeLXyzkPgXktL4xNb48vbC3wrji+O9LleYDu6//p+vw5W/XQn/ete/hr0de5WM5/7fuTDzf8+Euf9nTu9Jl4Wz8Pd8+Jl8pe+jfJI+e04e+DP/KQ6XJR+SDjoBzQf4ST4VP9znw0tt4v+n4LgseEe4Ku5R+Kl7/IOrhAuexKG4FinPbPn6fWF9dzx2Jh5/evtPKRlmeDN9rhepBJUZJs99M7fyXiSfpSsybL0+Gr4uLSUS25WFxJ2QgUmAPNh7x97Q+cPOsPTNUrh45WIy7BX/SDxIlkqa4k5tecawmHeQCmbZJNB/6K04EFtyAjkTT2pL/Ehaeo99We4lfO4JD8kWiRIz/cF0QNWgw24RbjUdCxKfhKsSLf4sPGyLx8Ln3t4Tvhjzp5Kc3Ot7JDzLB7giSVs+xI2qAQRPjOUDfEmH4UA4GA1fwjNj4af+pByaGyV/klfNR6YcS5WvPy+uHnJcdhYu1q6wy+sof3NSlwaZBx3eyZOFrxdC1z1dulWT8IQ2xNkvZsPZ02e1cUM+3Qe6Q/t327WBLl5aDGNvjYXp6emw76594eB9BxOCyAd89s2zgSGvkkaeupVMpIEzPB58ZlBd6vZQ4h93Mx/MhJE3RpRMSdfgs4NKfBPvTmj4c5fmwtBvhnQrqf4f9+vQGn+z87OBcCYnJ8PBAwdD111dBWk5+sRRve/9cW9ovy1K/9tJ+knI8ReOh8XFxXDhvQuh696usLy4HAZfGAytTa2h+6Dku5w/mTiamp4K+zr3haaGpjDzxUw4+/rZMLcwJ7loCK2trZqu1htbNR3zl+bDhXcvhAuTF0JzcwlcP5zWMkCFgHTc1NSkE1RzX80FsMVA7NpZMaWfN1aefp8g4HhIJ+71w5pDgAvMlJ/1LgEa+95BMJDk7MezAVJq3tWsNgRHg+34XkeYm5ehrBBa0+6mMPDQgDZgyMEkqvmv5pUg8Z81VNqlvGSKRATJQbKzn80qKXT8oEPJhiTqbLUQbEtTS+g70KdukcyIZ+AnA6H9e+1KbJMfTIa2G9tC/wP9oWV3i0a5LENgDGQ+/ddp9dP/k/7Q8f1M+h9M0m8E3tLSErrv6w5Nu5p0Aog0HuyTfEf+iKP/wX7Nt0IpbnjWdWeX5gMJhc5EsZRkEDbu274r+wiKAR/ytLCYSMBZXDX8h5LwO27v0HBID9Ix+WK/wRRDCc8bQVLWYOuk6KRYqT1QT8zk5Te7zdjSsM3YxAv3kCKGho1UR4OmUXLfcmOLSlRcD78yrKTW39CvZMWQe+T1kdDe3q7kgWR19q2zSja2iSjhUokZRkIkSmT5VI6/OR5GzoyEI784oqRAOKNvjuqwX4dFSJqyAenIHyVNi0IyQko2ScNmpkq4IllBZkheI6+NqJTWubszTH04FYZ+P6TukQiLpl/8EJ+Z2a9mw/DLw5pGOgPzd/qV08kwW9IDSRNX7G/87fEw/OpwOPJzyYdI5pAuaoE97Xv0mvAHfz0Y5r+c104GibVc+GzCOreYdDZ0GqNnRwMSfmtLq+Y5yGarGJXYk8t0Ii1/6/f5iUXHI0Egbu882Yn3VhewyxNl5BLyMgOp0MAZ4jHkRRIbPSeN89JsaLspkYZolLyLjZKhPIDUMDGjIwFiLB6VCPPuVMcm72j8XKst90rYco8Oj2ElhmEqBIb/tg5Ji+SQMLNpIe0Y88fSIMJub5PhNs+LpV+eWVpwwxB+cX5RJcqOjg4eqb+nn31ar+1HCUrCJr+kRXeTlnuG1amRe0sTw/r5T+WdpB2SBC/drVocE1ax8GemZ8LivYtKqMeeOaaSOoSpHY2EHb6dxqQXhrM99fuk/jgeCQJeHwrrQ0WiVElNSCi2GaYOPj8YmBVH18YwmOHi0SePpiRIYx89Iw1VGrkShcSE5Mm9GS0MGrEYnRC6IsNlyETi04kLeY5klxqIQ/wzcaQmf6+6N+KRf0zQ6MRSfgIEd0hZSI9KiuKH90a2lh7i03AkfvUTp58t88XMf1GYftLGuss0PeImzjdEznvzt6ry5ck9nWiR9JuxCTJNn2Bk6SwIX9Z7Ll0v4QuuqDnoDNANa5mI1Iw0bR2E5k9IlnBSvDLl6s8dH68fK+3D2iK20EZpUwo0hoFIUsN/GA4MI2mMSEPtt4guUEgUw/3MpzOqi4MoabRIUDZsxw3P+TNy5BmGeJEIF6/IOksaM+Qp/xjaMoGiZ4OIu4VLySw2fnCX2pIrZq8hEH0mccx9KfpSGZYj1TIkRVJTaVPeYRobhXzF39xcMoRdlX7RbWr6JVxLD3GSH9Jr0mE5fxqR/OAPXWJswGF2TiRmMYTBMHx2djZRS8g78LZ3xXAlT+h6rUyOP39cwwGr2S9nQ/O3k3Qqnk6W3lnQrrwelK0H2uDyP2WJEjcq0Ymr2EbnxgQEs6pKGtKQeQ/JoCuDkCA1Zqu5puEzi8uQEImIP8y+O/cp6U2/Px0uvH9hZVhr8YkkZUt7cM9sOUNcSBczPSOzveIWiU4LHYlM7iEdhshzX0taZDYdPeHRp46mpM0EyuEnDysZp0Npcd/Y0KjkWjL9TyXpN1ImLgzxGRHH+W5okg5CCPZY3l/qHlLHb96/BiI/EDuSLvk79ItDSuZ0SuNvjYfxd8ZX4ZqGL7hSJkwuMdmlZCgloxhImTRcSSR0xQkJXeKNy9PvHQ+vD0XahTVMscvOeiuJ0JiFRLRR522dhZVHEBCz2/Pz8+HsmbPJukSRuJjE0RlkaawMyyFJhoYYZr3R7eGHBo0kZOsaITvi0kLDlvt4WAtZtO4WaVAa++RfJlUfieRIOEZeqS3kxTWTTaQFiZRJHEgSMlI/uIFUxWDbH5NBxdKvnQLDcHDACDbqh/jFf9YfJGn5Vv1s5K9xVyLBJgHl9a0S3unXTidLpSRMJnnQMSIpEn4W1zj8pcuy1lLg0zxKJ4Vkz8QZ/vlnOti4HLPl6vdJmToOjoO2E2ucYpddR8mQWnVwInuZ4Z7/ussODZ8/yFQM5BOL8zzjHnI0k76XxoukQyNWA+mIfwtPyVJeMfs9/OKwDpmf+9VzugaRYzeNoCw8C8PiwYYceY/R8LjIx7PKX57E7HnqL59+fU54pDtPrgRn6dVr+UnjkfBwZ+HwXv1ZPEL2eg928iwbbxxuMVx5r89JT4x7XmLU+MDTcBXbvmW3iTPcFCtff19Y3x2PnYkHI2AzNNOyJq4kOOR+Qf41XS/rIeWfcIc2dCMFXScJufBebCU/cWKN2vw1hcQ/ZIa0ZZMOxGGGoSjPlZxwJw3fSFLjyZME7i0e86vkbWRCOozc8sSU9Y970pumL5t+/OfDK4jPEMyHazho/KQr8mckq7jkJ4gUF/nSSPGI4td8SHwWjqVL8xk9Bz9MGo9JvPl0Wb5VohR3xcpTA8j/+PsVUgASx2Nn42Fto/zQW1zZ7HNsa2OVhgjBca3DSnGrjZLnkIO9l2t9Hz+393kbvmUVPLPmZh9+4rB+7aLhIBkRPvERXuRf47dwJA4lFmxM/t78pOkV9+lnkBl3Gp+Fb/FBPvn0F4svVQ9YfJG/2H2cbgtPbcufxSu24Zr1nz7HDenifzl/kj+VJPkMVExcjn7veHh9KN8utNHIT1miBERrZLGNZ50lLmazHrHYc2aVs8+FWNItzWjsGMgmltzkOZMhkOjspzILLMN4yGJV/BZvKTuOn3j5BlpMGo75i91F79W9+FvlXvzp8LWc/yL+0vjL+YviT+PNpM/SZfYqd6SvRDn68+L123FxXGwEBkdgyhJlTI51qTwysLENH3RYGktWkjiVlEgl5CmGex3uy31d0uOk4rh6p1JUONqJ7S1hneQ3T0Hxo5XrDQFHJCTiQSIqZltq0BUhuSFNYupO4k6aTppOmju6nRn3YF9bibIKMiKRSopCkiYOO0n6cHpDOvEq6qenY/sO0+EeM2WJ0ivB9q0E3tl4Z+Ptu3z7NpLELjv0fu6/novd+rUj4Ag4AjsSgbIS5Y5ExDPtCDgCjkAGASfKDCB+6wg4Ao5AFgEnyiwifu8IOAKOQAYBJ8oMIH7rCDgCjkAWASfKLCJ+7wg4Ao5ABgEnygwgfusIOAKOQBYBJ8osIn7vCDgCjkAGASfKDCB+6wg4Ao5AFgEnyiwifu8IOAKOQAYBJ8oMIH7rCDgCjkAWASfKLCJ+7wg4Ao5ABgEnygwgfusIOAKOQBYBJ8osIn7vCDgCjkAGgbK7B2Xc+q0j4Ag4AnVHQM+Cklj0RFMO0tsEpu5EufC1nNi4e+W42myee7p7wvjb49nHW+qe87U///LzsHh5MTTfkJzFUywDU9NTeu5274979Rz0Ym78mSOw0xDg1AI4ou3mNj2TqmmX8IUcZKBn0svxy3Nzc2FhcSHMz89fM2jqTpR6xo1kb+bjmeT8ao6YlX96Ro7YCwsLV5X5zh92hv6f9IfDjx2+qnBq4Zl8VWOqdVdNWO7GEdiSCAjzdN3ZFVpubAl7btkTFr5ZCLNfzKqwMbcwp9KkCh3SpPbduS80NSXC1tz8XJh8dzLMzs8qn2xU3utOlEYK/Q/0h+kPpmuer8OPHw7d93VfU6LkLJ+1GOs81uLH3ToC2wUBpMe9t+0NnT/q1CxdmLwQGHkiTHHmPUNupEyuOVBwdvdsaGkRQr19TyJ13tOoJ7JO/HliwyCpO1EaKZDpWhvA67qrSyXUWoe9lvA4+GwtxjqPtfhxt47AVkcA0mN4ffD+g2Hx0mIY/sNwmL80H3SoLUzUvFvUVmIrSdrIE96Q/zNfzITpj6aVPJFE229vD21tbeHC+xeS0Wqdwan7rLeRgp2eWCo/3fd0h1wuF0ZeGQnd93YHepmlpaWQ+0cufD77eRh8frDA6+AvB8PMzIz2NCh/8csfPVNsBh4cCFPvT2lYhHfxw4vh0M8PxU702uI/9dIpDXPs3FgSv4TZdU/XKvfFHlinUOxd/Czr7un/eDpcnLmY5hedzPk/ndcKFfvjupb5IV9gduqVUyqVG+acpaKYP1uIuaVl4KcD4fzE+TD39VyCuQyb0L8OPDRgTlI7xVXiQIK48F5SrmlZ/CwpC/wSBuVt7/oe6EvDiS/6HuyrqkxjP3597RFo+26btqXZz2bDxLsTSpaQJATZurtVpUfjiZg3aN+8Z/iNe+op/ltuFkFJ6rD5qWsO9+/fn5MI6vYnjUnaYi7X/r32snGIZKjuLn56MScNJXf+vfO54785njv18qmc6DH1nZBlGoaQXe7kSyf1uTTs3MkXT+p97ObIvx/J8W7pGwlv4nxOGqmGjafYHfm3+EfeGMlJQag/Ia8c6RHJNY23GFYymZOkQ+Ip9t6eCRGou777+1J3pAMjOhpNoxBkbu7LBLPBZ1fySxi1zo9UMo1bSFExAh/F/JUI80waZNikaQVX6XRyY38aU1sD+kcuJ9JCmjfSbLhKZ5WTTiw3Nj6mcYCzkKLiTBkTnr574Xhu9OxoUm7yTMi1IDwwwIAX6aWeUF8wx58/XuDWcHe7fu27GmyFyHLtt7Xnnv7l0zkRgnIiNeaE/PSZkOeabZFK1X/L7hYNDy4g/GrSsm439SZKGgem4/sdZTMikoe640cknAK3ND4MDTqbUZ7TaLLPAQ6ChKjjuGm42rCkkcbkbfHjh3hkkmhVmNk47F4U0iRD47NnxWwjyphMPv/0c/Xb9aOugvgO3ncwBylZOPXIjxElCRBJPo2LOEWa03QVw1wkulzH9wrLkzLDQPSWZmzDlXd0ZvE788M7CDp+N3JaiFTMyB9X0kWjouxE4i5aprzLpisO06+vDWHSPmTEkDt44KAKHSIZ5iA76vR6/5QshYARYiBgwq9n+dZ96G3DTB1W5YfHUv91yMYw2IzpMLGfe77w9MezZ86GxcVF1W/YGivzh21ievyMmXDcDr86XDCJhMiO6I4upP/H/akXix8/x546Fib/Mpm+q3RxVTpKSQdm4XKhyuDsW5Jn0eOYqXd+jj17zKJS+/Trp3UGkqVPqkOK3p5+7bTqi6JHgWeY1tbW+LHqlHgAvideOFHwbuKdRBmP8l6k54J3Y2+P6T16KDOHHj2kw7OR10ZWlenEexP6rvtAtzl3e5MggLqIdjX+1rjWqdYWqSP5em/tbq02/ltvbNXw4AfC18mhfLi1znqdgl1JppHYzEcyoyUNQgFiEanEPPOpLBnKG9MzQA7oMLJG/crDtpa2MPPZir+sO7tn2RAGxa8M5VZm0WQ2re2mpPGxNMFMGr8QMiSxHmOdQiW/sTuWOrQ91KaVSIbhSuyW1ziceuZn/qt5XZoRx8f18qKU142Jkp01osUME2qNu1Yms6iwsUlxnZdy/aqwXOn8MHNfzWlHGPvTuOVBTNIyMlAnLBdBh0zjInzs9lva9R1LTdxsHgSoH7T12Y+l7KVqoGsM0v6t3LR+rPdeZnkIj2VF8AtlX6ouXy0idSdKI4XeB3o1M6USbD0KC0uLmaUryRIcc1fMTfys+TvJwm8jmPidXTc2rDRwC5d1Wus11ilU8h+7G3hcJkCkAjETKDrXcOTJIyqdDb4wqAtuLax65icrzVqc2qlxk6klh2QCpv/h/iDDXJXiUvdyYTjaM7svGQd+6EAzxuqN2bw2abVcmWbTmgnWbzcQAQQRJlsm/zypk3hIgFY+1AvawVXb1ydLiBhRDN41GDrl3+yrhR1yLbJc96G3kYJJFqUSXel94/UJqRVzFzcmC9/iZch63XXXFf3r71sZehcL18KqZKckkCGUrD+LY3F5RTrj6wPSIbpTlWQZlojOJVycvhhEf5MGsZH5SSNF8s8Y0gahQ5Ijr4+Eo08c1QX/x548pi4tj+Yte2/PY7tc+RXzD17VlGkch19vPAJIe4wAZUI0IUhpH5Qn5V1Lm2VHhDc7O6vx1SOndSdKawQmWZTKRPq+SOPETzmJ0kgkDpulKxh0bNWYSvGXC4MhJH+6TkyWQJQy2qPKS5nVXuWEXhcC2NuxV/WjLKVAqjSzkfmxOK33T+/lYuDhZAnQwGMD4ZGHHwknfntCJWB6dEyKo95F9yXKFWfFyq9YvUkxKINxPlq3NgEC1GXqw6KoXVDJ8I/7WtvNu5o1fOZBCL/aNr8WiOpOlNYIikkGcULT9yWksnISZbEGbV8BIfpXYyrFXykMdCQYJhyKGdYJsg4MHYqlrZg7vk448vMj+qq9fUWiND8blR9NQBFys0o4/mbh9/n7OveplxTHfObS+xLlmne2yipWb6b/mnzZhd7ZzeZHgC9wVNcsZd/c0JxIkpAlEmVsC7lhYhIte5/1L/eEP3dJPn0Uvbp97qiB1uin7kRZTDIolnZAUlOkcfK8lETJyn4kuazeaujFIdXxofhnQXdsAPLIL44UTBRUij/2X+z65Msn9fHAzwYCOrzY8IklEzWYk68m7rimIvU91KfDBu7N7O3cq5fxrPdG50cTUITc5hfn9RWqAjOoCA49luQ5xTH/Mr0vUa4WRtYuVm+GXh7SWU46C1lPWeCFSR/KNDuZVODIbzYUAXTKfFFD+0SYMXIkEUaWC8sLOkqh/hx54khgpIJd7B7BAfexf6snhI/kSnytN4kutMam7kRpksHYmTH9KoYlQVMfTqXXsn5Qs1RJ8iglUfKlB+bsm2eDLFhWpTH3zIQdffKoFg4kxXCXZUHEz5cvsm6vYCKiUvyEWc6wPGbo90NKvujw+EJI45J4maFl9o/lEc89s7L0iV6QL5FID2kj/XxFRNqYGSQcMxudH423CLlNvJUMsWWdo6aXL3T4jIydXSD2FMd8wtP7IqRreUsruz0Q2+pN6l+esRqCpVuQ7/EXjuuOTeBFfWJYDm7xLHkUnF9uMAKUg07SUYcgSdNNSslijDSZUKX+0F50ZYXIS8Vs3qODtAlY8x/XE+2UJT6Iudb1oEz11fxc9Y81grbbiuvuGm5IgKskeZSSKJlMQELce8denWHTXYryqYa4IBikDz6oR+qkEGhw4+/Imq788hScV4q/GiDYwYhCP/zw4SCL2XUyhvgYMg7/cTgM/W6oIJi5xTn93hXpjKUvFDBpwj2NnvVhsdno/BRTaegsvdSarnu79FNTCHL8zHjg+cTbE6GppSlOclW4WmWPPVq9Scsl/xIMKb9DvzgU9t2xL7R+P1luwpIx1mUywnCzCRCAWYS05COAhBQZMcozLc/Ixs3MhzP6ObIsSA/wAeuSF+Sf2dPvT+t7zVWeeLPh2D3x2ZKkWqJwHV/mnDt3rpZheliOgCOwwxFAeEGImfjTRJj6eCq0NrWmw206wVgitM6QoTUChu3pyq5cy98s62gRQlXJVHyu8p8Pj86SEWrLTTJ6kz1uY0HoaosD3nfjCDgCjkBNEdBVIHx8cIMEKyRnEl8pWyVL2eSGj1Dk813VNTOyij9KIYGl/PNc1TQSH3HXkiSJt+46SiJx4wg4AjsPAXSULbtaCtUv+SG5klpeSoQkU120XKM+04kZvtzDjb3nuoR/RVd4mfjYBLjWxomy1oh6eI6AI6AI6AJw1ryKelI/ysiTXKyrVCKU5yYp4hGd5ehbowlJ8iB+nyfL1H3+nvDbvyt7VEp881/UXk/tRElBuHEEHIGaI8DnwM3NyWa81UqGKlkKMdr+AUUlz6xkycpCecZyJOJjPWWtjRNlrRH18BwBR0ARmJlOdI58jMCnupBZVhKsxT3SJKtLWDONTrPY3gFXWyROlFeLoPt3BByBogggUbI8jw8S+HxXF4vnh99VSYpZybHEPSTJN+WYuS9qL00SrhMlKLhxBByBmiOAtMjaVobErJHk80LbnUslSWKE/MSs55611YTXcVuH7r5FXOPvFn5am4R+9b9OlFePoYfgCDgCZRDgy6nW78iZN3yMICNw/XgEyRJzFbZ+Ry7h8bEJ4ROPEW8SeO1+v3Xrrbf+5yeffFK7ED0kR8ARcAQiBGb/ezbMzs3qF2t8i//+1PuqR7zhX2TR4z/zDtdgQ7SXLl0Ku3btCl13d+mw/o033whfffFVFGttL12irC2eVYXGp4p8qywHc4XRN5Ld16vy6I4cgS2IAMNqPjtlfSMTO/qJIZLl5WQzbs1StZKlONbF5OKfyRvC43gXwq+nseTVJQ6+V+ZIWc7vjY0cMhUuTF8Ip19d35ELcVhb8Zpvu1nvxTfh9I6pfmYrZqZImlHeswuMbjwsFRqF/okXT+gRHBwVzOdtbDfHbu58K87uTrZ9HLOjfIo2/PJwxfOa2bqOneF7f9xbsBt8kSRd80ec57Knfc+qtnDNE7ZBCWAmmr1LqfdHHz+qm5iw8TPHgzQ1yJBcmAhpMz1/Kq+7ZCi9tCxtRPzrn5Bu913dof377Vrm7KFgWxzWMyt1JUoyWWzDAzJkuwHVM3ObNWyIQmcEM2fIbNb0riVdSMvs1sQmqkdfkt2bZNcYDqvniA96fTnlUjckZgPguINg42K2quObYIiPTpbD35jRLGqk5iq5Sh1jf0q+7d3MpueunjA7X1+pZzPnn7RBdNQBdnxiU9+eewUTudfD/qRDpT4sy9EOGOqN1Q9dWiTP2P2/7Za2sO+ufcorQ2eG0skh9VTHn/oSpYTOB+xFjfUY8pKD7nsO9ISWphbtYZAmOAWRRocEggQGyGxTxqmKZuQ86MAehb0He0PnDzp1WzU2uOU5DUclt5vbtLHR8GzjV/aHZBaOTWjZX3HszbH0QDEaK5vS0giRiCA0Tg9EzJczibXn03REUnKldMe5VmcAACAASURBVFp6sQd+KlIQu6RI3uRo1zD0hyHdJcjCIB4qCcOJ4d8Pp0RBnoZfGQ493T162tzhxw+v6kmLSeoc3QB2J359IsFT9soEFwwVlF6e9xi2TgNfOx2RLx3Ao3d/r6ajFN7qOf9DJ8AfOx3ZfprTHyUb7uIkrfzSKGLDsAwpkz/2FBw7O6YbJJQ6DZOyYSstpBLKKkuUKZ4yNENSoezZoi1+jv/Jv04WPi+BP9iMvDqiu06RbiQj8OjZ36OSjdU5GjG4kXe2ySP9SMydd8ppLtd3qgRMubIt4E401LXTZ06H02+eDnKUcWBXMdojZMiREXSMTNLIOe/J5hjyWSLtlMkaDLpO+EEPqos4pN5Y1pcoy0iUNttFhWMIxd6RZH7v7XsTECTnkCQAIX3Qm3CkKif2sUWaGcR4PneS8591iGfP+x/s191LCJPjMmkkECqG/R+HXxKRXYZ4zJhRkSffm9R4ISn8cgYMEsDgM4Pplmf4Z3cTCGlqcio9srWadFq6UEOgm0EKeuSxR+yxbjrLMgryw3AcG0yOPXMscSMlxTZuHOPKcAMcsgZy7b2vd0WlIX7Yisw2DWZjW+KAZJH2Dz1+SHFJ45AA4xGAdXJmE18pvC0tuiGBVHbyV4wMwBcTSwx2ry/4gUOpmWUawsF7DyrRU250Pui9GMabIa8cdcsxuDQ+1YvJy3LPy+Fvu91Y+IZT+lzSm9Y5UTWQJnbP6e3rDc/96jn9YoTF0Fk1lIW342wpW+or7Zq6DBnS9unUtOOW91xj2EtW92yVLQzpgFDlbLShOtbPSOhxI4sj0iUC8sAaDpIbIAAehp6fHgcyoQHwxya9HXd2FBAlvVB230b8IxUZoITZ92Cf7ihOHCZZmjt2JOfEOOulkLT0mnDEL/olJBcM+hDSwi7KSErVplM9Rz8mWfEIyQZJRMk5XwmGXhoKp145laYZ93w7W+4oXfAhL1Q60s8BYBikbNKJJHn4icMpLkjjp146FVp2C8nk93EsVl4pGUhYpfDWiOSHSs5EFSSPdMxRwQyrzVi+zc4+p3HQcUK40x+vSKLmDpu87L1zbzj+/HHNJ8M38mbYpHhK52hHaOCGsBXnzPPUPZ1jKfwzIyPDKbWlfKgr5p8OjZESYZOXbH7j/OzUa+oKeBlmhgOYKa7SYW4W3OpLlPQK8q+YMR0lO4UwbGJYiT16ZlSJqE2GzEgVSG+pZCH3WVBpAMVMfOwtymCMkTIb+HKQV3OLHEp0JdkN2dJDnJB2av4hhSXDAu3l8g8Jj8aKidNJoWp+i6Qz73XFEjdm6FVJW5w3kxgZxk1eEjWEvI83JTa/sQ3Z4YZh3uzrIp2LtAxRkHadWJE4F+ZXdlYBO/LdenNrSpTZ8kK5bmRAXKXwjtMBMQ58NKBDYiTQuR/PqeSKZGdlgB03AtQaDKGbr28OF7+4qJK86abisLlmppN0MmzG0Cn23NeTEmWKZ6Zu8Jzws3lI3UeSShZ/jSj6MZywwYf8FNSbvDRs9cTyHQXhlyUQKKmXLuF+Ix5HzbU+0cWNLI1BYjXy4hl6srNvnQ0DPxlQwmSYbGAhAS0triwjiAkLv9l7nmFKPWcIxnDsxO9OJHotqdCj50Zli9AkjrjxEo495zo25s5shlkxOZeKPw0j35DS+8yFhWt22llk3GVvUUtAOkhXnZ2dekIibiwcs3lG4yV/1ujVnTR6M/F7K8eK+cp7RopC0ld9ruiUug9ImuS4DIvfbItr4s8T4fTLp3WXGfyWM+QP6fD8+PmUpHCPWkRnQEvUastPubDtnaXPbJ7HOJnqyHCpVD5xOBaH21sHgbquo0SvEJ8kCCz0sHz3yX5zsaGXR1fGsJeGoJKPkAkTPDb0xl7ViMo0ijh8W3bAEg0qLQ2Yyo2Yz/IEe689f0RiWYnKwlR3cmPp1CUveRVB0XSax7xt/rm1Ib9Kp/n3SJIYk2wq6ezy3hQ/9L5IkODMDCOGdJLvOA47PjeVZPN4WFh2SFNKBrwogbf5ydoQK8N1znjGWL7NTt1LPwUOq8o3dZBcoCbg2IwTvzoRHnn0EdXbcmwuBImqBmNqkzivPDcss8+rwp86EQ2O2m5Kvi1OyRNconpDfLFZld/4pV9vegTqSpSQEb286s1kdosKjrSI0GLnQNOgGQpDNDa7RWNBokQ6Gnh0QP2hQ0RXSBgFpkTlzPbgJhlC3pB1xw86VDfHqYm4tfda2SMyyEpcFreFXyydbEe/Kp3mMW+bf24hE9QO5JVGDA79j/brjCmkq24kjdWQFDpYSAPVwswHsgGq4IjBZojKxBhxgCcn3TEra/pJCJPhL/FDtn3396nflAy4K4G3OpQfwmZtI+XKNZ0eQ2XOEsJYvs3Wh9Fzuy9lo2MkvdQN0ksHi82IRGfzpewYsqMvJH+aDskL7xSDIs+rwR+yJy/gRifWfX9CytaJaH6iepNNP/Wu4/YOrefUdTdbC4G6EiWzyswas47u1IundMhLY2e21YZwkBaLk1H6s5xi8evFMPxasgSIg6TYxBNJk1ltGnmWLEr21CUqLTo8ZmOZCBh6RdZhyW4jTO6YRKnhR2SQPs+UaxxvNp19DwvBlIg/DSbznuU0zIqikwUH1huSRjMaX5Que17Mtgko64zMjR7MJRNCxMESi4WFBZ14sfcsBYIUmUSi3JjswRgZcB3nm/tiBlJiORZLZvof6NelQugteY7aA8NyG5uJ5r6acHEHWY29NcZlgWEii3Tamd9DvxU8Z2c0f+RXSVR88JxJMSacCp5XwN8+jqAean2U0zMx1olUKh/qXHNTs36JxSSXmy2GAIeLSZL9bxthINJgTtZo5uTccC/XbVSu3k6vHU/VVaLcYn3GtkluR0dHcu6IDMPdOAKOwNUj4ER59RhumhBUzyt6wd4Dvaqz2zQJ84Q4AlscgYymbIvnZocnny+X2MSUiSH0lG4cAUegNgg4UdYGx00RCou73TgCjkDtEfChd+0x9RAdAUdgmyHgRLnNCtSz4wg4ArVHwImy9ph6iI6AI7DNEHCi3GYF6tlxBByB2iPgRFl7TD1ER8AR2GYIOFFuswL17DgCjkDtEXCirD2mHqIj4AhsMwTKrqNkIwHOrmj8dqPbjoPXA28HO4oH4p35yxKlf92xzbpFz44j4AisCwEfeq8LNvfkCDgCOwkBJ8qdVNqeV0fAEVgXAk6U64LNPTkCjsBOQsCJcieVtufVEXAE1oWAE+W6YHNPjoAjsJMQcKLcSaXteXUEHIF1IeBEuS7Y3JMj4AjsJAScKHdSaXteHQFHYF0IOFGuCzb35Ag4AjsJASfKnVTanldHwBFYFwJOlOuCzT05Ao7ATkLAiXInlbbn1RFwBNaFgBPlumBzT46AI7CTEHCi3Eml7Xl1BLYAAg0NDaGpqSmEsnubbWxG6p6Uua/nQsvulpK5urvr7rAdtnNblc8rISwvL4eZz2bCxDsT4fgLx8P8pfmSOGyVFx0/6ND8TH00Fe6+8+6tkmxP5yZGQIlxV1No+26bkmPrd1o1tbSfhW8WwuLiYliYX7im7afuRNkQGjTTMx/PhCDkgVmWf/Z8aWkpebjO364fdYWDfQfD4ccOrzOE2niz/Ez/dTosX5H80Svubgod3+/Qv/4H+8PAwwNh/O3x2kR4jULZ275Xe/u9t+29RinwaLcDArSPfZ37QtvNbaHlRhGkhBvgCMgRoYP7xsbG0HxDc9hzy57Q0tKi7yDNsXfGwuKlRb3fKCzqTpSQIqb3QK8CUeuM9T3aF/oP9F9zorR8QojaKeQz2vmjznDi1ydC5w87w8gfR8K+O/cVvK81HvUOb/j14dByc0uY+Ug6PjeOwDoQYISJ9KgnKIighHAxNzcXZr+YDYuXF5MQ80IVw++2G9uSzrljrxJmzz094eLMxTD5l8l1xL4+L9ft378/d+7cufX5rsLXwtcLKlntuX1PzRsXvczMhzMqvTXe0FhFaurnpFw+6T0vvHchMGwdf2s89OzvqV9CPGRHYJMi0HB9gxLkwfsP6nB69MyoSoYNu2Q8Jm2ksaFR7WzyFy4vqISJNImkibDR/r32sLC4EKbfn94QwaPukzkmadmwOwuC3dO75HK5cOrlU6H7vu5wYfJCYFjO3+ezn4enf/m0OVWb+5mZGSVhgMYvf59/+XmBu74H+8LU+1Nh6ZskrKnpqXDoZ4cK3HBj8Z988aT2WqPnRpP45aycrnu6VrnPPiiXT4YTR586ql4Ii+FG1lB5INOFhQU9l4Q8n3zppOYv65YwDCskVvyl+ftwKgz8dEC9DDw0EMgv5x6BI9fEkzW4P/+n8wGyV7eC1YX3LwT8Z43hdPHDiwWv7Hm15Vfg2W92BAKQ27679qnkiN4e4qPtNu9uDo27EpJEbYWJ7eZdyXtUWbiHG/BPOyI8SLbuBolSIqnbnzQ+adO5nIBUNo7ue7rVnRBEThp1Thp/7vhvjudOvXIqJ+Sh74Qc0zCO/PxITohEn+P+1Eun9H7w+cEVN/9+RN+LQljDI0zcYmJ35N/iH31jNCcFkcv9I5cT8T5HemSokIZZCqtq8klYGCHqgvCO5NMpJJUTUs8JaeVkKKJuhZBWxS9Eqe9wCzZjfxpTrEi7Gkm7EFaO8MbG5d0Lx3Nj58b0Fc9EDZDGL1J5gq/4mfowiRvbwum7vy91G+MENjEWhl+15Rf79ev6tb9Nge31Qds/7ffgfQdzMpzOyax2rv277bn229b+JwSp/mmXhEd7qsQvV41DvYlSFLPa5gCkXGJFIkkap/xCjrFbkQr13eeffl7wHDcYkaZWPRcdiJLi3JdzOZlQSd8TD2TJX5wmix/iobHLMDn1E6el1HU1+Tw/cV7TK1JrGjYFTFogc5Gk0+fSS6bkJrrN9DnxG1ESWBwW70798ZTGwU+2Mxg5PaLvINE4HyI5FmCh4UgZYCDa2K3hBIEXe46ftZRfHIZfb0/CFB1jjjZ88MDBnEiFCcnd3KJ1jnZKO1yrLXrynAzlNbzBXw5q+PWsP3UfettsMMpXaUMFfwwFzaC/MPPcs8/ZpdqnXzsdli8vq6hdrZh96NFDKpKPvD4Spj+YTsNjKRJDVcKJh6EWP+u3jj55VBXMqacqLiyf5dZ+qY5FwmL4YMbSie6SPzMM1w8/LjP5opPpPtCdrCuzl3mb4cmJ35woeDr5bqLgxj9LkmLDcAWDIj02w68Or9LznH39rDppu6nQreGUzWf6XHzVovzi9Pn11kWAeoH6q7WpNZx9S+qU1OfW3a2huaE5WR1Cu5dnuNPVIlXe47/1RllGJH5Hzoxo+KihquWHtSK6YbPeRlYxGDOfrsycmk5i9qtZ1WFkM8JsWMuuFiWM+fn57OtV9yzLwbAEAX1jXBhttySNv61thQQsftY6nj2TkMSqQMs8KKejNG8xmdgz9DYYyDtrmAWc/ng6dHyvQ3WoZ98sTNfi/OIqrOYuydIKMTqDiPI7Mii/MeUmvtADNTcllVgdZ2qI4QSesbHntSq/OGy/3roINDTJJI0s82GGuqkh0THSyVJfYnJc170IOwgd2k4+mtZlRFzPf1WZH9aKaKYZrNV7ZfcmaemymTJLSlISSXS5qwK298yMZU1KUtGL1tZk0Sq9TCnTeP1KWBb+0uL61nVaPrOSVhx3c3Oz3rIGzIwtrjWCs+dmLy8mgLBEImt0NjDzME1Hhsgyzgpumcw59NihIEOgVT2y4WIe0vtMzUmfr6P8LGy3txcCrErpubcniA5dR2itLa1av9ZFipHEGftnoofRJhM8tHXiG/7DcM2BzFT3moevi8s11AoNl8xjGDIWM/Z+6cpqIkvJIfJo5Nn7496qJEQLv1T8UdBFLy2+rKQVO267LSE7ZuvNVPLHLDQmdWceS9jmzvJTzFmM19P/8XQQXaauX1M1xbQsmJeKh2TJ0D0bTnqfKU97Xgo/e1+s/Iql0Z9tfQQgxqaWpjD/znyhBCmfm1AfqIc1sUWyZMSJJEl89TB1J8q0UVaIKZVISrnLP4+lwHKAmCQmM2vlnKXvKsafuix+USmfLLVhoS0kNPqWqALyhiU5mGISI89NMp6bT4bUPCtnLB1pfoo4NjLllX3RdPTxowFdpRmZtNHLbDjpfaacSj238EzSrrb8Un9+sWUR2CsLxKmPs/OzSd3ni7wSkuHVPA+7QmiRf8x5dN/brV/61Hr4XffJnLRRZiSQbOmbxFFSIsv7z0ok6i/TaAkbURzDOqtqTMX4KwRSLp+s93r6mWQdKIrneOhtXxfs7Vz9SSD++ENKs4mYCslIJc80P0U8GJnyynpgFv/GxnS82XDS+0x5lnqehlmi/NL3frHtEGBUwnyCdaLUO6sn2HqfH0HaSKRq2/znR6KAR7siPiaLam2KUExto0gbZYWYDEyTPLKpsPdZiUSHiTJTjX5i8s8rnzQNvzwcBn42EGR9X5B1ivoZoYXJzPahnx4KJ353Ih3qW/il4je/pexi+SRMdLNPP/W0Eh6K5mPPHCsIYviV4XDo54eCLJ3QhfY2883snawjVZ3O6ddP6+LcAo8lbiwdaX6KuEtJXd4heTfsbtCe+PSZ0+oaXSUSJiYbTnqfKc9SzzWQKJxs+dl7t7cXAtQH9O986kpdVl0iEiVkGdnkeuAnAwWrOuy9IWL37JNgaqtsOIQ/88VMYOTFKIx4jZQtnKuxM9X9aoIq7tca5ejricRimTa7/6F+VfSmmcpIKhaqvc9KlCz3gWTQr+nnjDc06K427Npz7MljSjbo2pisYEabQmM4jj30+6HVEliJ+C0dpWzL58irI4kTWfVg36jygO+/GX5nhwSznwl5ks4Xj4exs2Nh8oNJ/cqGmXn844/31RpLh+FVzJ+RKe9QA5CuoVeGQv9P+9V5V2eXfpnDjGU2nPQ+g1Op5xa/vc+Wn713e5shkGcWdv+BNNN6mSFJcs2Xc+jvbbKTZ+aea8zcgnwLPjur10aS3OAuvZc6SXw6QUr8mTqqntf5U3eitEZpy2Cy6Wxtbg3T8q+SRGKSXlYigUSaZIsmvv9svac1zH6cgEk8ECHLVeQrnrD3jr1KPDRYyAmCTT/AF7cV488mPHNv+eR7bjMQM1Iuy5OGfiekXGKiinTSEx594qjuNCQlH1j6g87wuWee0zxYmJVsS0eanyIe4kpInGDbe19v6L6rWyVX1AM8pwdHrxqbNNxMzSn1PPWbd58tv/S9X2wrBBBEFpaTb7Spb83yLyY1IzfqzbRMILJUkE+X2S0oa1CjQZK0H9wXDYdGgxFyJG7+SrW3xOHafuu+KcbakuOuHQFHYDsggPDChxvyZZfuycrQWIUdpDw6zYy9tLwU9t6+V5eoIVmy2qPx24269wEL1XmvSwMz/uJwEIo6f9AZWB+NCisWhK4W07pP5lxtAt2/I+AIbD0EVPpjwwvWDiPliSSIKWXzpQ2qMwiOjWEgSSRJ1dmLf96X82/hEh9fwNVSmiReJ0qF338cAUeglgig4jKyhCh1GC4RmK66qC2SJu7QyzPUZjiu/uR5UfdReLizL3+I19zXKk9OlLVC0sNxBByBAgQgO1ZQLC7Ll2h8R2KSpdg2/FZJ0O7lsUmWuhxOnqskae/FLnAf30v47GFAfBc/LdwCsCBR67xxolwncO7NEXAEyiPAOTd85w25KVmaZBjpKFXyK3bPs2rdi1PCZ1kQ8cXrlMunsPq3TpTVY+UuHQFHYA0IXJi+EGSbQ92YRiddkCrzpFhSMuS9mLLvY0lS3C9cSmbX2QCH+GqtnyQ9TpSg4MYRcARqjgCSHfpGhsN8AcbMtRJmtZJinlQrSZYQox1vy/rpehgnynqg6mE6Ao6ASnZsH8injP3394f5xflU+jPJ8mrspctLGh6L1fkCDr1mse0Ka1EUTpS1QNHDcAQcgaIIoINEqmTZTltLW7K2kckZ/jBXYSNJslZy3x37NHzOcarHsJtkfuvWW2/9z08++YRrN46AI+AI1ByBmf+WZT6yS1b//9Ufmv6PpuSYWSHIxn+R/WAZXv9T/tZgL/1tKVxevBwa/qUh/Nu9/xZa/89WXW/52eef1TztFqBLlIbEGmw+jxp8YVBPLpRzaPRzqTV4d6eOwM5CQEhxWnYg56RQtl5jDwNmqRk6q94SNKqULHG/KFsV4r/rzi4Nj8+RCb+eBh6vm2FTWA4rFzgUCD4xQo/AbjjX0nAMLOCu58gH0k0BddzWEfof7g+N8q9e4v61wgjlO5uI2Nk6fBs/9NKQLr848osjuv0+21kdeeKIbmtFOXOELgYsGGqNvCJnFVWovGzGIac8hp6DPZseQ/bnBI967J59rcp5Q+MVIjzx2xM6sTPw2EBYWlgKw68N654Gyw3yDbcIH3yune4FYBM5kkgIFTPP8bZis3Vi5/c7ddgtJ48WnImlDuvwU1eiJL1j747p5g4A0NEh5CJKVyrcc/9VeIBYHfJWMkgUvnwutV6DcrpeZ3OsN0018yc1gh3P2dEFcmRI1HF7h27aAQHyeRnbv/X3JTsNWbx0PKdfPa0kyjvC6P9Jf9nt4SBXlQyEhNiAYzMbtvGr5qymzZyHa502OlE6z/b29rDn9j2h576ewKGD03+d1rWPfB++KP+UNPMSpq6zlGv8sjdry40tunUiz9kWEOFrI0zdiRKR2rYWg1xmP53VLcX4htMOHAMYdvhhByAa5sR7E2H4d9LbiKIWI8er6glu9OpIO+y0c+KFE+qeHY1Zc0VDYxceM3Ler55eCLgsUxh9czSVZHX3bkkXDR9D+Pg3qQH3SJ22qa6FiS1nCCe7nMi3p3L+tkoYFBh5YF9JpE0M36nqfpcyTMDIEa6BPTJ79vfoh/t60mN0OiRu5OjZMP3hdIHUMvjsoG4ddeLXJ9I4wIk8Q/jsSmQ4oQZgm7fxdxLSoUMib8TJvp1cs/9lT7ekQRo+e05mpT7OOWGpBTsXGTGwt58ZXd8mN9haie2F4GmVFpJkMwTKqhiGeGFjYBoGUj2EmSVK3rGfqOIpdYI0gBmHSVEGq55XwH/0tOzg9OpQugEyW+2dfPlk6N3fq/hRPtTJtA6I9HLyN1IH/jqp+5lqnZF09z3Qp5KRfoNseXe7egSknjCibHizQcuQjTB6D/YqEdpkTHpaqZQp7YrTFllMLsc6a1umA4cDNnIkV3cdZUFjEjhpmAzlWBxqhuFc803NejzrwKMDga3XDj15yF6r3f9Av57hQiOHeJFqIGFApgGxJ2W8ldvsXDJc5D0EygFa9EZmsukifI5+JXyI+vATclRsEUNYI6+NhKmPpsLd/3a39mo4gyQ52pWjFfhrbG4s2EeS+HjOdvXYWYIiDKSyzs7oMDQhiPbvt6dLHsCp9aZWJThwYiYxixNbUGWNbb3Gc4Y9VMhHHn1Ed3XJuoUcIVW2pStmDDezzU32PtU5mYOMDTnSmYy9M5aQpkjpsRn4+UBov0U2EH7qqOZ39Gyynyk423OO842fl8U/g4vhlNpSPox26IC1DoiKiLgxdFIQPg387q67k40a4sT69ZoRgORoZ+yHSr3nc0f0l3RIbLdG/VBb7um4eU9ninsEro0kSTJXd4nSJJAYydkvZ7XB8wzJAXAgOwDA0GPQww/tFmlJpDsMjcokHCUUkYjYrBeDZMjejzQUk34Q583gHpJBiWzSbTbnFJrFjx4VyYEhtsVvYaV2hBxSDpIteziaVIX0iATHfo66YbBIYHyDWk4vShogAgiddHJMLfiRl2pxikmRtKoONSKJ+S/mU3JP8xJfSOeDRHjsqWPa44+fGw8Tf07OA8eZlWdWorTnVGoIh4psI4Y4eA1DpATKHGmZMqX8eu/tVZ2VvgdP2ZmeOmHlGT6TuIs8p9OtBv9VacjvXwhekCXp1wabH8pxzXnUcfllw/D7q0OAOkI9H/+qUO1CeVIeOlKS+rgZzIZLlJZpxGhMc0uyT52RFM+MbNpvXjkYDFHbDHvVAWLcqzAbprqNvKPOH3bqUHbkDRmO5memU0UxbjIFUBA+XxCIscavN9mfyD8EjCnIgzRgTOvN+fM7xD2NupyBlCEXG74jddNBIK1Vi5NJSMQDCTCRFpPn1IdT5ZKg75Ceevt6VU+JBIpKgMqLMcnRbH0oPxAfqggkPHTRkFxcPuYOm3zh3zozVAid96xI0imeGbwqPs93tMRhWKf4y7MYB8PJbOoD3yabSWdj8x1iNr/mzu3aI8CIRoffURurfSxrC7HuRFmMbNhY0yQ1e2+2JT8rCcWVHDfZe9ybQSJDKkJXN9A3oBMPNFqdfc87ysZXLjwLN7Zj/zSiOH7c2XuzkWBLEUccLqRhaomOOzpSHV8cTuye67Sxy3VBPqyRRxJl1m+peyorutdDjx4KHAnRfyCZvLF0mG3+IVdWAaDqeORhGdbn9b/2PrYZVrXualU95vmJ83oUxZ4b9xSoTrJ4xv6z19XgDy4FOInEgknxonykHEuZbH5LufPn2xOBuhNltvJxVAITLAxtMCqFSc/RfGOyMSfPeA+pzX21IkXG4WRJFD8xCe65ZY+SEgp3/DFslRZRYOLweJG9j8Mr8Ji/id2TTvbDI91mUEBj7NtTdZ8nLnNTzAYXJkGYiEGCgjgxhpNJVTyz+FKc6IGjfKLPxKRkwM0ae2kk9/lP5/UAMrxbvs3mGYazShhGmSI+ebr6l6E5u1Af+9Ux1ZNCquhLL3xwQYfb+CA/nK1j+bNQNJ+S/mLPK+G/cCXZr9DCMmyMPCuVD++dLA29nWfXnSg5AwMJj8aPzuf4s8dVGW4SB1IWSlokFxoARMA1wzLTSWqxRCQDiRU0fnEQSyBzX8/pMJzhNzom9H6rCCIKLxt+VdUg8k8eIDgmWMgD+WUdIlJWgeRcBUlBNEz0DDw8oAeNmRRaDU7oQJntB0PFW9YoZjuVSo2d2WCbGCMvKNQ7OjvCzAfJzLf5N9uwyt7b86yNzncyywAAHcpJREFULpdyBS/I3/4m3p7Q9XGoTyBnsANP9LSkAym02HN0mdXgj262615ZC0kdk04IHTTG6pGmv0z5sCyKA9+oT9rxZjPm99sagboTJctQRv44ojPWDClZMsPC09gwk8wxlOjCjr90XKWTY88ei52sIjqTBMxRLAEyAcCkCUfDDr0sYcuOIuj6YjJdRZxlGonFUWBn3A/9Vg4yyy99YiJH1xvK6Y+pwX1ErunzIheQCFLX1HuF+kRwmp6ZVpxYvoQUF+PEOkYkHybCjjx1RJcCIZkZGRBVVhLMRo9kBilxciWTUZDm8O+Hldh00i0/E8wyI5YSmakUrrljsTAz3Vn8yTPptMPZ+PKJLbOOPX9Ml/HQ6WHi56Sv44cd+rwS/iwFwmAPPjOYrBGV+7QeVSgf6lNrS2sYPj2s+lgNzH92DgL79+/PSW79bxNhIFJPTnR3ORmmerlsonLxdrJzeaLuEuXO6XJql9POOzp19ruSvq92MXpIjoAjUA4BJ8py6GzwO3Rf6M96Dsiid9HZuXEEHIHNgUCVWrPNkdjtngqWNEGULHi3zxC3e549f47AVkDAiXITlRKf5LlxBByBzYeAD703X5l4ihwBR2CTIeBEuckKxJPjCDgCmw8BJ8rNVyaeIkfAEdhkCDhRbrIC8eQ4Ao7A5kPAiXLzlYmnyBFwBDYZAk6Um6xAPDmOgCOw+RBwotx8ZeIpcgQcgU2GQNl1lGyC4MYRcAQcgZ2IABu1mClLlLFD8+C2I+AIOAI7DQEfeu+0Evf8OgKOwJoRcKJcM2TuwRFwBHYaAk6UO63EPb+OgCOwZgScKNcMmXtwBByBnYaAE+VOK3HPryPgCKwZASfKNUPmHhwBR2CnIeBEudNK3PPrCDgCa0bAiXLNkLkHR8AR2GkIOFHutBL3/DoCjsCaEXCiXDNk7sERcAR2GgJOlDutxD2/joAjsGYEnCjXDJl7cAQcgZ2GgBPlTitxz68j4AisGYGyuwetOTT34Ag4Ao7AVSLQsKshCWE5hOUr8rMJTN2JcuHrhdC0u6lkVnu6e8L42+Ml32+VF6vyeSWE+fn5MPXhVBj63dC2yOO1Lou2G9vC519+HuYvzYfW77Re6+R4/DVCoOH6BuWItpvbQmNjY4AomxqawuLlxbC8vBzm5ubCwuKCtqcaRbnmYOpOlMsh6RFmPprRxHHfIP/MXlhYWHOiYw+dP+wM/T/pD4cfOxw/3vBry+fkXydDEJJsaGgI7d9tD933dofue7rD4ScOK2FueMK2YYTUHzdbHAFhnq47u0LLjS1hzy17wsI3C2H2i9mwfFla0sJymFmeCc03NGs72nfnvtDUlAhbc/NzYfLdyTA7P6vtbKNQuG7//v25c+fO1S0+k7T23L4nGFnWMrKR0yPh4H0HQ+MNjbUMds1hFcsnhTv00lDoe6AvLC4uhvZb2lUaWnPg7kERoFHNfTnnEuUWrw+MMNtvaw92gsL0X6cD7Wfm4xkdaiNFImUy7EbgaN3dGlpahFCFQ6gD81/Nh4ufXgyTfxahZIPMhkmUSFm1NoBnYNc67LWGZxJlnE/IEWmXNJLWnvt6wvCrw2sN2t3nEWgMSWfoEuXWrBJKeje3hr77RXC4tBiG/zCsnV7TLpEWhYmadzerDUmagSyXlpfCzBczYfqjaSVPJNG9t+8Ne9r2hIn3J8LsxyJd1tnUfdY7rdQVKJnhaS6XC6deOaXD1QuTF8LS0lLI/SMXPp/9PAw+P1gAxeAvB8PMzIwSEDoN/PKHPiM2Aw8OhAvvJ2ER3sUPL4ZDPz8UO9Fri//kSyc1zLFzY0n8EmbXPV2r3GcflMyndBAXZy6qc3rD2Az8dCCcnzgf5r6e07Qz/JiangoDDw3EztLrp//jaQ3LcCGv5/90Phy8/2DqhotK7ogTrI78+5ECf23fbUtxPPLzwncdP+hI8JW0xgZp+cJ7gu83S2HpH0sq8RmGsTuuwZF4eY++McYY/GNz/PnjWu6UP+qZCxMXQvvt7eok7ZRiD3696RFQVZSU8+xns4FjZiBLSBKCRGqESGOSJEPcN+9K3jNCwz3cgP+Wm1tUrZX1Uw8g6k6UaaWuIFHa7Bb6iNGzo2HpylIY+v2QSmAASeOPyXJucS6MvD6imOCXCRN1L72UGYgA4u24rUPBRcSHDE6+eLIgLNxb/MR19s2zoeveLtWZzHw2o+RqYZayq8pnhAHDj+O/OR7I78L8Qhh/ZzzMfTEXOr7fEU69fGoV+ZF3/lpvbE0rCtIr5EPvaqYad9N/mVbn++7YZ97UPnhghXD33rkSJi/pxTFT70+pzQ9lMvzH4YCeePrj6YQww1I49LNDmh+k6GKGRjFyZkQ7RPRSNBwmvcxQZkf+40hobWkNE3+ZUJVN+x3tWi8op7RTMg9ub2oEIDKG2t0HEpI8e+ZsmP1qVtsi7Y331v7K2c1NzQmpSr3A//Dvh7XuDPxsQMOvKwjoKCWCuv2J7kGEiFyu/XvtZeMQiULd8SMNpcBt34N9+k4ky4LnpBsj0syq51IwOZHQcsQv5JO+Jx6RyHIi/eRwY3m3+AmLeKTxp+/MTTm7VD6lF8yJxKjpFFIrCJN8dXxvJW2EP/LKiLoVSbHA7eeffp6E8aPCMEQ/mxPSTd2Wctd9X3fqjnRgRNJN/RG3SHg5kd5yItXmRBdY8G70jVH1M/jsoD4n3YqjYCkTVqlbkQo0HByP/HEkfU74Fi/lQvjFMBY1RU6kSA2ba8Oc+iMz3poG8LTnbtev7dYKWxk95GSUlJOOOCedZ442ITPc2v5og+v5w78M1zW8p3/5tIZfq/QWDafeRGkkoTU88yPD4LTCawOR9xCYgiANK04wjQsjw+yC5zwrRpQiWfEqN/hC0rDjsGToqe8A2J5b/LyQ4WT63N5Xsi2fMflSQUbPJQQT57VcWJaOrHvIGxOTfrFwqnUHIUJIVFoLB7I//9557aiIKyYySBUjQ3B1L9Kw3stkWurfwhGpPSXRuLyMKPFYCmMZlpcMl/LCkE6Ly+3CdrIZ8ZCRR07UXTmRHLX90kaoI1drwxPUL8Ih/M4fiXAj5FkPDOo+9LZhEjPeDH2nP5A/s2eSIaBkLNVNLM4v6pCXZwUmv+6U4VjWpMPe6AXDQQxDRoby6MPMbmtr03dtNyU2N6bnYALm9Oun9f1afiyfI6+N6BAUXSgzc8zIs57y8OPlly8xTEUtYAa9a2xYEoEZf2tch7boc4qZat3pCgTRG5tuUCROXcs2Mz0TJt9L4mKNK6Zld4sudSIflB3Ghu3oi7KGoTRDatLI8qisKYexqRGmJleG4ubfZjmLlbe5cXtzIaDqF6lnOuEiVRa1i6pPmLAR1ZENu7X9rfEeP4RHXaM+s8wI3Xc9TIUplquP0ip17/29Ov1fKkTTTSxcLr6u0t7Hs8oWlpGU3WM3f0dm0MQYYepN5qexYWVJkYXPOq31GMsnkx4YXSgrYaF0PvH8iYCuM2vQ5fU/3B9kGKukEr+39NizgcdlgkfqFhM3TIYcefJIOP3a6SASs649W6u7icmJID1w2HvH3nD6zOl0wor0Qn7Ez3sM+lpmJZloMtPQlBD13FfF8WKiSXp61TOaH7MXLhUvY95buOigsoalQZhi5Z116/fXHgEmL2UUoct4Jt6bSEhM6hHlR/2qhU29pEMm/MG7BkOX/KvHypINkyjJUDljEl1JN3n/Fd3lA7DG1N/XH6677rqifyzdMVNtuOY+a1t8rPUiPr4w+N9t/zs88vAjRUlShpFKeJAkk1JHnziqS4mOPXlMg86mh4W45EWG5irxIlkTxsXpiwWK7GrdXXg3kQSN2JG8+RKCr6SQHJEA9nbs1UpYTHq0/GbTabg0frv0Up5sJ2B+sNPwitQX82edUuzPrzcfAkh7bS1tOrLScoXUmLjho5Ma2hAl4c3OzuqKlXogUXeiTCu1iNXljDWCYhKj+sv7T92VC0zeic5QXbTKuq1qTBpuhXSWCqvafJr/gYeTJUADjw0omZ747QmVEOkZMWl6zEPeZvgJYUJik3+Z1OE6M91ZU8kds+wQY9stbVq5ZLJEZ7SRhDGkg+UY++7aF3inz95J0sa1LcNqbkkkd3UQ/eAXU0wyjJytupy7lJQbs6FZY8urjKSz7/1+cyFAHaUe0/GiSuIf97W2WT5E+Ix4CN/qSS3RqDtRAoqaIhJCnBHtcXhQwp29Nzv2W8wPulCM6eAK3Be5ScMtEX8RLwWPqs2neTJdyvibhd+57+tMluyk6TEPGZuvGGytY3t7QmQZJ3qLO1s3WuBOOoSpD6Z0ONRzb4/2yKYDxCNrIzFImpAplR1iNmP42rIhe47dJt/sMuyGdC2c+H2569mZZMjd1SnD/YwxbNJOKfPebzcXAiyBQx9NXW5uaE4/W1aJEtJEssSOyJMclLtX9+YvsgmfTpb4WEZUa1N3okwrdQVJDXDUlHBn7802INggAdE7q4scenFIdXc0ZNb7xQZp59AvDhXoBdNwS8Qf+y92XW0+ze/84rxeMpQ2A7kcejxZDJ+mR15S4foe6tMKZ26x93Ymax1ZuIsp5c4IxtypY/mZfj/pTGzB+tj4mL0KZ986q0TH0BxSZ9F+bPg0E4lUv2WXiaDUSEfD+lA6LyaeKJ+1GNZlYphcMh0p9ywuPvRogk3aKfHCzaZFoLU1mWihfZowk5KjkByGzpTRFSOrI08cCYceO6R2sXs6etwbWar/PFkSvqqMZGInnqTVSGrwU3eitEo9+uaoLirW2WBmhOWPRcZdP0qIIpWgSkl0+eepu3zmp95LJhhYJE5DNwmGmbCjTx5VVwxNmQhgkoJ4GTae/M3JtPBwlIZbKv58fKUsy6dViFLu7PnE28kwlm/VSTdfy0BGfMdqvbC5pbeU9ZWabvKAexZ+KyEJsZ98WfIihgpZzJ3mNXJn4TJxg2HRO/HGEiO6Tma4TWKMF5rjB3zRpxInqwl4z1dCc7NzgYXrir/oXddqkGpRxtOZTchQn/IEm5kPZdWErJKA7NNOaa2Bu/sNQ4ChsKpxEDykTVn7MpJL24twKPVelnxpxwt/0gFnbd6jgxSW1PI3/2l4IrWq2k7io05mV41cbcbrTpRWqZGWmLhA32V/3IcbkiykEhTAFjP556m7vJuBJwZ0ZplPmxhm26wpr/lS5+79d+t7wEPqRGfJ8hV0gpCBmTTcUvGbwxK25bOkjjXjjx6TWWuTyva07wnjZ8Z1hpmlDml6xB9fIfFdLFtN8eUOUhxLifjCprevV8Mh+OXF5aLuIMDYnSUFIiJ+sGMWPGuowOCGKbYVHvj2HOzRdJAepGP5kFGJDvJdq37S4mcC7LlfPadDqY4fduiXR6Ovj4aBvgEN0xqJuXd78yGgxChtaWFpIR1ek0qr12bTXugEWXnBp6oLV2RFBP4iG+GA9+on3z7Nf4EthKzxQZQQZw1N3XcPqmFaPShHwBHYIggwImAlx9ifxnRZYGuTrJ+Uf6kEKFfpfV7txtAaIarhhgbZ/iRZNcH+B4wWVQBBMo39ZcJjCR7qGobedOyMzGpl1jnQrFX0Ho4j4AhsRwRUfSTDb/aUhORU8hO2KWWrZCmb3Mx8OqMfaYRdokMX1Q/3sSnl354TH3HXkiSJv+5D7ziTfu0IOAI7BwF0lKh1VBok20KYNiRXXX72Pu+GlRpMzChJMtTmD5Eu6z6+l9eoiYhv+ZsVlZo8rolxoqwJjB6II+AIZBFgYg/d9eLyYtAv7iKJ0sjPJEG7Jwx0lmNvyQoMCBKTJ0nsrHu7J3y2cSM+JhJrbZwoa42oh+cIOAKKAMc1NDcn26gp6VUjGUKK8te4K9FRGkmWlUQRICVsliMRn320UMticKKsJZoeliPgCKQIsMEKw2fW8eqSH4gyT5YmCZa6t+dml3OPNEn4rLQgPl2WlKaiNhdOlLXB0UNxBByBDAJsMMMwmKWBfLSwsCxLf6JhNCRYVlKs4r0Ox2WZn20SzebX9TBOlPVA1cN0BBwB1SeyVpchMR8hsM433Z0LyVKMSopcrOOeUxAIr+22ttB/f79+oDD+buEnwQRdC+NEWQsUPQxHwBEoiQBf4HEOe1OLzICLPhGCU8kSH0iYmHXYEC/hsbsV4etxInnCTQKt3e+3br311v/85JNPaheih+QIOAKOQITA7H/LRs5zs7pL1q5du8L7U++rHvGGf5HP8v6Zd7gGG6K9dOlSIKyuu7v0HKk33nwjfPXFV1Gstb10iXKdePIpId8gl/pUim9Nj79wXL9/HnljJP0UcJ3RuTdHYMsiwPCaz4b5yoaJHdUniiRYsEl3tRKloKCLyZEkZfKG8NizgPDraSx5dYmDXXvY4RjDd9V8YjT88nDZnc7rkpA6BGq6FbOzUVCArOliB3NMPWbisnFu5L3udCQ7vZBHDIuEh1+SzSxkeMWna3zCxqJhdoTBLqgLshCZ79nZKUiPpCiTcHZNQv/Ue7B302PIt+7gwXf5bgoRoP4P/XZI8Tn6+FHdL5YNq9kPoKlBhuTCROwryV4B+vlifgitw3RG2OJf/4R0wRlBBU6ppg4VpmR9d3WXKHUDWdlJ/NhTxzRj7Hijq/XXl95N48skSbOzCeOcGRTN7MrD37YyUqk5d5tdmNihiT92D2L9GuXNbk1UdnaQhyTViB/ePfKTR9Q9lZ4wINRypueeHm0g8XZ05dxfy3d8Z+wbdpQuAcocyY/NVlqbWwP7oLI7FcIGpMfmL+gd2fxl6fKS2tzrjlHynh3TcU9dwD/fc9dbkrTc1FWiJBLEbSOLmS9kxf3ZMf3wnR1t2HOQ2TCWDrA/49ibY+nBXgcfOBj6D/TrbkAcOHb8peO6S42c3hd6D/Tqc4gIKab3x3Iej3wnaj05G9UStkohAjCNka3AHnn0kcAZL7xHbIfkENs5H1jXeUl6OVN7+JXhwMFaVHwOBUPqIQzIno/2Kbixt5O9G4tJlId+msTP8JtNAUb+MKK7n/CJFefkUNBsCMABWrqLkVQgDHEPvTyk6WYfSLYxsw1y1YH8HH/xeGB9WnwuyOAvB3XpxYlfn9Ahfrn8sa3byKsjeu42YSIBEW/PfiEkwapU/i1+bDoBdmkiDUaEWckQySA2ipNICbqj0FchDH42qNvFIZnG27vFfpAawHD0zKiOTLI7GMV4IpGQBki7mufF8Acb8sRMLcaw6d3fq/UDbEgD5cfmxNQZOn6+SeYMeSVzySP7e5743QndjzPOj18nkiHnerPRBbt9MWNNW6XucRgfNkNrOY1VvxOnLDnLnskaDLpORqVaj+o0cVOsnOpOlAUSF3xAjPkMIpFAdAzJOeSK4ZmeAChuIBuGcBAb59BAllTOgZ8OFDynoUIcHXfIlm15wzXu2caNRkhjpADofYiD5QqI/4j12DSuY88cS3xL3IcfO6xEiFhvh2fpWTa8e/SwNkRzT/6yZDn0hyHVv0DGhGWGzYLbWtuSExkFAzbphXwtLNyRntG3RoOciV30Uyz2Z2SbNSNK4ie/HDKGOfKLI2XzZ7uvqGP5MQkofV4i/+Ye23p4yozNeasxilO+Q6jGPW5Q29CZQFxyLrTqtoyYeU9e2X1dRysSNhsXx8+PPiX7YUqds+fV4G94aEDyg2QMqZrpf7Bf6x8NdeDBAY2bDplOigPt5j6dC5S/mwoISP1HSOHsJ9oYwhIncDLa5JNHXWMpnST/Zr+cTfZiFUmUusfazI020izqa4xEkAyo7PQW0x8nO2vb0aekgMaAtMV5F7jBH6CwQ/b8u8nwTQlPnjPEi59PNU1pLw4JI/mh62CjYDtXBqJFMqMQOAMG0jOw2an71CuntDEpAUj4bBAaH1lLmEh4EKr2ZJLekTMj2lAtf5VQpGfsvqs7HH7i8ErcIj2eeumUSmi2Ezi9Kj1uKUPlMpyQ1OmRyTcdQlX5ixo9cRgJpHaR/GfTQp4ZXkNQDIXk7HIdVmfdpeTLC2kY1mmCZ/8D/dp5ZSVmCwO3hE082hmKDhTiZA9PDHgiwVEm0x8l9Sl8Vvg8lXLzz6vB33DQOKSRIhnH+aCeWt2hLPoe7EvrTuxOE+k/ZRHQobiQnuFpjk01ZzpJe34t7brrKJF+GH5OnJsIHR0i+TyzcrwqG+mefPFkYFZ49PSoNvTG6xt1YoAdwNm5G6nBVt0zYcBzRO/scxoOvRJrqqY+mtIP64kPwz53F2cuau9FA4wLxiRGPqjH8J54YkOvR7oK/NnRqeK+GoM0DKGlC27Fk+pX5Fl8AFolnQtkDrlAIhhsNjaFiEhnpfypp+iHxo1J7SL5j5ynlxAzh5xxoBPqCY7QpTM0k5XEyDvExi7oqEEoJyQ+GkMxQ4eGMSJFkkZfacbwtI4r+9zKddVzUdeYKYa/4YAbI02zeYb+zMzScqJeAHMzsX975vbaEEClwV+1QsjaQl+f67oT5cSfJ8Lhhw+H7oPduo7Ken/Ib/DZQdWV0eDYgRuR23Rb6O5ogDQ+dIboBjE8Z3gaP6exQW4QInothuLEg24D6UX1YNMrB2PFUFlhmG1qgdgN15Yue26NJ/VnL/K2vbfHqTshtNQIeWDixlWKOBKXyS+kwaw6hmF3KR0f7y1es3kWxweBYdL0xulLXpX8pTIjeXPmCR0V+mYzq/ASKVTJVVYBMFRlNUAq8ZmnyIZUKWOkVci1/6F+HW1Qlpg0P5n02nOzLcj0PnZfDP9I4jYCjPGqVD4pjhax29sCgboTpTCMDld17VMEGUcfUHlVxyWVF3GbZQK6NCDvjh7/uf96Ts9NiRshOs3scyZzUL4z3NZDsyRMyBOJFjP3mXx3KnoliFClkXwcJkmmEgiNJ25M+BUdCgbiNWMHGFljsudmx42LZ0iS5DeOGwmY/MaSaqnwLFxshnwQBvklDJUo5XlV+SNvKwJQehBTmt4i+SfOcgb9L2oAZiVLGfJlE3vZupD1Q+fGaIPjINDxMgmHTedn5blwKZHsYjwJp9TzavBHZ23DPsJqvUlGEvIvJr9s+cT1lfLNviccN1sfgboTZdqTZ7BiIgcpBN0fs6gDPxtQIkESQXqkodBg0FlSYdFTlXpO0AwBO26XtVVSWW04hmSJZILkwnOkAWYtBx4dUMKCZPof7VdJxyYJNL15ScOSjOSENITkhCQMQTFThymVP/NrNmSikxISBo2bfHHi3MRfJgpOKqwmPNXzyvCb9Ez+dVJ1fZqWKvKHDhSyIX46ie778/nIS1LF8m95MJv803EpWUteCI9ytFMdzV1KvjwQgq6WRJgNhXhVHyidJR0JnebEWxPpagUwYLkRZUm9AFN0mKWeV4P//BfzGgb1gjz23d+nI4k4H9nyiSVnznxhcol6G6shDA+3ty4CdSfKUo0DaY8lAqylG3plKMzJrh9M7lgPjQQx+sao6iMhVQ6XwpR6Tng0Fk5ZNAN5UuH1G9D8Qw7EYismdKPo1Za+WdI0mB9Nb0ai5J2dZMhs9NNPPa2nHfK8VP54lzVDvxvSiSKW+KBnpWHx9U6ByZB0wbvohuF35w86dVY4eqwHqpXL3+lXk8kQ8sFsO6c2YowMSuU/jgNOhcxYGsNEGMthWJqFmoWOiUkeypFVAxCyGslXlmQKwoxuIDxIMmsm3ptQvFlNgGGmn9M1mfBh6Q6da/ycuhU/r4Q/OnFwIE/o0ikjTCxRmqpCX2R+mIRDT4zOHXzcbCME9u/fn5Ps+N8Ww0A6hZx8QpkT6cXLbouVnbe3rcc3dZcot1Gfsqmy0nlHp+rsKun7NlWiPTGOwBZFwIlyixUcui9UDD0HelRnt8WS78l1BLYkAlVqxLZk3rZlotG7oXdl5nv8neq+itmWQHimHIENRMCJcgPBrkVUrC114wg4AhuLgA+9NxZvj80RcAS2IAJOlFuw0DzJjoAjsLEIOFFuLN4emyPgCGxBBJwot2CheZIdAUdgYxFwotxYvD02R8AR2IIIOFFuwULzJDsCjsDGIuBEubF4e2yOgCOwBREou46SDQ44u6Lx241uOw5eD7wd7CgeYHcqM2WJkq8/3DgCjoAjsNMR8KH3Tq8Bnn9HwBGoiIATZUWI3IEj4AjsdAScKHd6DfD8OwKOQEUEnCgrQuQOHAFHYKcj4ES502uA598RcAQqIuBEWREid+AIOAI7HQEnyp1eAzz/joAjUBEBJ8qKELkDR8AR2OkI/P/I3sGQq7ZNagAAAABJRU5ErkJggg=="

通过此界面可以修改本地的SipProfile帐号信息。

接打电话时需要更新对方SipProfile的信息,代码如下:

  1. /**
  2.      * Updates the status box at the top of the UI with a messege of your choice.
  3.      * @param status The String to display in the status box.
  4.      */ 
  5.     publicvoid updateStatus(final String status) { 
  6.         // Be a good citizen.  Make sure UI changes fire on the UI thread. 
  7.         this.runOnUiThread(new Runnable() { 
  8.             publicvoid run() { 
  9.                 TextView labelView = (TextView) findViewById(R.id.sipLabel); 
  10.                 labelView.setText(status); 
  11.             } 
  12.         }); 
  13.     } 
  14.  
  15.     /**
  16.      * Updates the status box with the SIP address of the current call.
  17.      * @param call The current, active call.
  18.      */ 
  19.     publicvoid updateStatus(SipAudioCall call) { 
  20.         String useName = call.getPeerProfile().getDisplayName(); 
  21.         if(useName == null) { 
  22.           useName = call.getPeerProfile().getUserName(); 
  23.         } 
  24.         updateStatus(useName + "@" + call.getPeerProfile().getSipDomain()); 
  25.     } 
/**
     * Updates the status box at the top of the UI with a messege of your choice.
     * @param status The String to display in the status box.
     */
    public void updateStatus(final String status) {
        // Be a good citizen.  Make sure UI changes fire on the UI thread.
        this.runOnUiThread(new Runnable() {
            public void run() {
                TextView labelView = (TextView) findViewById(R.id.sipLabel);
                labelView.setText(status);
            }
        });
    }

    /**
     * Updates the status box with the SIP address of the current call.
     * @param call The current, active call.
     */
    public void updateStatus(SipAudioCall call) {
        String useName = call.getPeerProfile().getDisplayName();
        if(useName == null) {
          useName = call.getPeerProfile().getUserName();
        }
        updateStatus(useName + "@" + call.getPeerProfile().getSipDomain());
    }

拨电话代码如下:

  1. /**
  2.      * Make an outgoing call.
  3.      */ 
  4.     publicvoid initiateCall() { 
  5.  
  6.         updateStatus(sipAddress); 
  7.  
  8.         try
  9.             SipAudioCall.Listener listener = new SipAudioCall.Listener() { 
  10.                 // Much of the client's interaction with the SIP Stack will 
  11.                 // happen via listeners.  Even making an outgoing call, don't 
  12.                 // forget to set up a listener to set things up once the call is established. 
  13.                 @Override 
  14.                 publicvoid onCallEstablished(SipAudioCall call) { 
  15.                     call.startAudio(); 
  16.                     call.setSpeakerMode(true); 
  17.                     call.toggleMute(); 
  18.                     updateStatus(call); 
  19.                 } 
  20.  
  21.                 @Override 
  22.                 publicvoid onCallEnded(SipAudioCall call) { 
  23.                     updateStatus("Ready."); 
  24.                 } 
  25.             }; 
  26.  
  27.             call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30); 
  28.  
  29.         } 
  30.         catch (Exception e) { 
  31.             Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", e); 
  32.             if (me != null) { 
  33.                 try
  34.                     manager.close(me.getUriString()); 
  35.                 } catch (Exception ee) { 
  36.                     Log.i("WalkieTalkieActivity/InitiateCall"
  37.                             "Error when trying to close manager.", ee); 
  38.                     ee.printStackTrace(); 
  39.                 } 
  40.             } 
  41.             if (call != null) { 
  42.                 call.close(); 
  43.             } 
  44.         } 
  45.     } 
/**
     * Make an outgoing call.
     */
    public void initiateCall() {

        updateStatus(sipAddress);

        try {
            SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                // Much of the client's interaction with the SIP Stack will
                // happen via listeners.  Even making an outgoing call, don't
                // forget to set up a listener to set things up once the call is established.
                @Override
                public void onCallEstablished(SipAudioCall call) {
                    call.startAudio();
                    call.setSpeakerMode(true);
                    call.toggleMute();
                    updateStatus(call);
                }

                @Override
                public void onCallEnded(SipAudioCall call) {
                    updateStatus("Ready.");
                }
            };

            call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);

        }
        catch (Exception e) {
            Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", e);
            if (me != null) {
                try {
                    manager.close(me.getUriString());
                } catch (Exception ee) {
                    Log.i("WalkieTalkieActivity/InitiateCall",
                            "Error when trying to close manager.", ee);
                    ee.printStackTrace();
                }
            }
            if (call != null) {
                call.close();
            }
        }
    }

接电话代码如下:

  1. // Set up the intent filter.  This will be used to fire an 
  2.         // IncomingCallReceiver when someone calls the SIP address used by this 
  3.         // application. 
  4.         IntentFilter filter = new IntentFilter(); 
  5.         filter.addAction("android.SipDemo.INCOMING_CALL"); 
  6.         callReceiver = new IncomingCallReceiver(); 
  7.         this.registerReceiver(callReceiver, filter); 
// Set up the intent filter.  This will be used to fire an
        // IncomingCallReceiver when someone calls the SIP address used by this
        // application.
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.SipDemo.INCOMING_CALL");
        callReceiver = new IncomingCallReceiver();
        this.registerReceiver(callReceiver, filter);
  1. package com.example.android.sip; 
  2.  
  3. import android.content.BroadcastReceiver; 
  4. import android.content.Context; 
  5. import android.content.Intent; 
  6. import android.net.sip.*; 
  7.  
  8. /**
  9. * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
  10. */ 
  11. publicclass IncomingCallReceiver extends BroadcastReceiver { 
  12.     /**
  13.      * Processes the incoming call, answers it, and hands it over to the
  14.      * WalkieTalkieActivity.
  15.      * @param context The context under which the receiver is running.
  16.      * @param intent The intent being received.
  17.      */ 
  18.     @Override 
  19.     publicvoid onReceive(Context context, Intent intent) { 
  20.         System.out.println("IncomingCallReceiver::::::"); 
  21.         SipAudioCall incomingCall = null
  22.         try
  23.             SipAudioCall.Listener listener = new SipAudioCall.Listener() { 
  24.                 @Override 
  25.                 publicvoid onRinging(SipAudioCall call, SipProfile caller) { 
  26.                     try
  27.                         call.answerCall(30); 
  28.                     } catch (Exception e) { 
  29.                         e.printStackTrace(); 
  30.                     } 
  31.                 } 
  32.             }; 
  33.  
  34.             WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
  35.  
  36.             incomingCall = wtActivity.manager.takeAudioCall(intent, listener); 
  37.             incomingCall.answerCall(30); 
  38.             incomingCall.startAudio(); 
  39.             incomingCall.setSpeakerMode(true); 
  40.             if(incomingCall.isMuted()) { 
  41.                 incomingCall.toggleMute(); 
  42.             } 
  43.  
  44.             wtActivity.call = incomingCall; 
  45.  
  46.             wtActivity.updateStatus(incomingCall); 
  47.  
  48.         } catch (Exception e) { 
  49.             if (incomingCall != null) { 
  50.                 incomingCall.close(); 
  51.             } 
  52.         } 
  53.     } 
package com.example.android.sip;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.sip.*;

/**
 * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */
public class IncomingCallReceiver extends BroadcastReceiver {
    /**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */
    @Override
    public void onReceive(Context context, Intent intent) {
    	System.out.println("IncomingCallReceiver::::::");
        SipAudioCall incomingCall = null;
        try {
            SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                @Override
                public void onRinging(SipAudioCall call, SipProfile caller) {
                    try {
                        call.answerCall(30);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };

            WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;

            incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
            incomingCall.answerCall(30);
            incomingCall.startAudio();
            incomingCall.setSpeakerMode(true);
            if(incomingCall.isMuted()) {
                incomingCall.toggleMute();
            }

            wtActivity.call = incomingCall;

            wtActivity.updateStatus(incomingCall);

        } catch (Exception e) {
            if (incomingCall != null) {
                incomingCall.close();
            }
        }
    }
}

设置本地sip:

  1. /**
  2. * Handles SIP authentication settings for the Walkie Talkie app.
  3. */ 
  4. publicclass SipSettings extends PreferenceActivity { 
  5.  
  6.  
  7.     @Override 
  8.     publicvoid onCreate(Bundle savedInstanceState) { 
  9.         // Note that none of the preferences are actually defined here. 
  10.         // They're all in the XML file res/xml/preferences.xml. 
  11.         super.onCreate(savedInstanceState); 
  12.         addPreferencesFromResource(R.xml.preferences); 
  13.         System.out.println("SipSettings::::::::::"); 
  14.     } 
/**
 * Handles SIP authentication settings for the Walkie Talkie app.
 */
public class SipSettings extends PreferenceActivity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        // Note that none of the preferences are actually defined here.
        // They're all in the XML file res/xml/preferences.xml.
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        System.out.println("SipSettings::::::::::");
    }
}
原文地址:https://www.cnblogs.com/sy171822716/p/2642187.html