Python之路【第七篇续】:进程、线程、协程
Socket Server模块
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进 程” 专门负责处理当前客户端的所有请求。
socket server 和 select & epoll 还是不太一样他的本质是:客户端第一次链接的时候,只要一进来,我服务端有个while循环为你创建一个
线程和进程,客户端就和服务端直接创建通信,以后传送数据什么的就不会通过server端了,直接他俩通过线程或者进程通信就可以了! 如果在多进程的时候,client1和client2他们同时传输10G的文件都是互相不影响!
如果在多线程的时候,python中的多线程,在同一时间只有一个线程在工作,他底层会自动进行上下文切换,client1传一点,client2传一点。 知识回顾:
python中的多线程,有一个GIL在同一时间只有一个线程在工作,他底层会自动进行上下文切换.
这样会导致python的多线程效率会很低,也就是人们经常说的python多线程问题
如下图:
第一次连接后,数据通讯就通过线程或进程进行数据交换(红色箭头)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4IAAAJXCAIAAABJ730eAAAgAElEQVR4nO3de3xb1Z33+3XO85rn9ZyWGWZ62inlVi7h1lJat7RNW4Z2xtRl+pwzL53neM4zF5gOkAGi8cMMoIRACEmUC+RKFOJgopArBNJSl2I35TLIIc2LS5tAPaSFALWS4CQkgEMgCeDY0vljS1tb0t720vKW9k/an/fr90diy5es9VtL3+yLpLIAAABAzamgfwEAAACEETEUAAAAASCGAgAAIADEUAAAAASAGAoAAIAAEEMBAAAQAGIoAAAAAkAMBQAAQACIoQAAAAgAMRQAAAABIIYCAAAgAMRQAAAABIAYCgAAgAAQQwEAABAAYigAAAACQAwFAABAAIihAAAACAAxFAAAAAEghgIAACAAxFAAAAAEgBgKAACAABBDAQAAEABiKAAAAAJADAUAAEAAiKEAAAAIADEUAAAAASCGAgAAIADEUAAAAASAGAoAAIAAEEMBAAAQgFrH0K88fVh1DlBUPdZXnj5c4/XSAFjyFEVRgVRdPGfVOoaqzoEa/0TAL3SvAQYNAAJRF9svMRTQRfcaYNAAIBB1sf0SQwFddK8BBg0AAlEX2y8xFNBF9xpg0AAgEHWx/RJDAV10rwEGDQACURfbLzEU0EX3GmDQACAQdbH9EkMBXXSvAQYNAAJRF9svMRTQRfcaYNAAIBB1sf0SQwFddK8BBg0AAlEX2y8xFNBF9xpg0AAgEHWx/RJDAV10rwEGDQACURfbLzEU0EX3GmDQACAQdbH9EkMBXXSvAQYNAAJRF9svMRTQRfcaYNAAIBB1sf0SQ6XriSnb5St32R+0/mz/ATVA9xpg0CDErpWXu2ymQOOqi+2XGCrZrpWXKxXryf+1J6Z8SJ+7Vl7u+J6oAN1rgEGDBJ6bKdC46mL7JYbKtWvl5aUbZU/M2kmJoYGgew0waJCgbM/kTBIaX11sv8RQuUbYJt1PyufP3xefu1+ZP6sf63GeliKJVo7uNcCgQQKX/9U7uW2esZh9RVRhu8z9N36ExxNuIUZdbL/EULFGOmrpEkMLu2zhYz0xewMtfJqjocboXgMMGmRwXBpakhQ1Ns/8lrlr5eUqtnLkxwNS1MX2SwwVq7IY6ny087PlHySGGqN7DTBokMWOo/kwOurmme2JORPpylEfD8hQF9svMVSuik7KF90Emv9vufM7EEPHju41wKBBpMJNSqNunnYOtTZPjccDItTF9ksMFax8Y8ufPBr5aKjrNyCGjh3da4BBgwAu257+5pnN5dBdKy+/fOUurccDEtTF9ksMlczlNUZK/uftdm2o24VOxFA/0L0GGDRIsGvl5UXXhDpvWRpt88zm/n755aWP8n48IEBdbL/EUOn0X76+/C541xia+45smZWjew0waJDCuZkW/1985M3T/mLNzRYQoi62X2IooIvuNcCgAUAg6mL7JYYCuuheAwwaAASiLrZfYiigi+41wKABQCDqYvslhgK66F4DDBoABKIutl9iKKCL7jXAoAFAIOpi+yWGArroXgMMGgAEoi62X2IooIvuNcCgAUAg6mL7JYYCuuheAwwaAASiLrZfYiigi+41wKABQCDqYvslhgK66F4DDBoABKIutl9iKKCL7jXAoAFAIOpi+yWGArroXgMMGgAEoi62X2IooIvuNcCgAUAg6mL7JYYCuuheAwwaAASiLrZfYiigi+41wKABQCDqYvslhgK66F4DDBoABKIutl9iKKCL7jXAoAFAIOpi+yWGArroXgMMGgAEoi62X2IooIvuNcCgAUAg6mL7JYYCuuheAwwaAASiLrbfWsfQ//KzAdVJUXVZ/+VndbCkpfnTrkOBTxxFUVRo6ytPHw76eWAkHA0FdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemKoIOMuzCiVpXRq3IWZ2k8Q3WuGcZNDzlyw3VH+ViBPCnVBzqp3RQwVRKms6hygtKrWnZvN0r2mGDc55MwF2x3lcwXxpFAXlJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7svAdh+41w7jJIWcu2O4on4sY6kGJWfWuiKGCsC8L33HoXjOMmxxy5oLtjvK5iKEelJhV74oYKgj7suQdJ5PJqM6BTD2r9ZDlserlkDMXbHeUz0UM9aDErHpXxFBB2Jcl7zgZYqgpVr0ccuaC7Y7yuYihHpSYVe+KGCoI+7LkHSeTyajOgXSypSWZtoNdKqZiKbNMmE6l0s6/JluU8zs7PxMr/bjrjy3+1dLJlrKH1HrI8lj1csiZC7Y7yucihnpQYla9K2KoIOzLknecTCajOgdiSsVSmVRMKaViyWSLUrFUOtmilPIIkSPk0KLYmIp55Fn7YalUyv5QWTAtfDSdbMn9Zkop1dLSUvjVaj1keax6OeTMBdsd5XMRQz0oMaveFTFUEPZlyTtOJpNWnQOpwqHI3PHGVKzS/FkcHNOpVDqTzsdGpZRSsVjhaGfhM7FYrCUWa8lHy1zMtBJqzPHVLcl0Kpn/ldJpx+9W6yHLY9XLIWcuGmq7izaraG/uz/E2FelSHb3+fOd4m2pK5L5n4P9M4UUM9aDErHpXxFBBGmpfbrgdJ52Mqc4BR1q0MmE+I7ofyhxdKplMlx7eTMVakqlcfnQeJc0lXo8Dp85vkj+Emoo5D9LWesjyWPVyyJmLBtruelVTW+Gv8TYVH1DRZqXa3B6pVFNCxROqyd48mlVTs+rw+ObxtlzAjbYVPSaaKPy5I6GaEqqzOA2P5YfWaRFDPSgxq94VMVSQBtqXG3DHyZTcouRIfZ4n1DVSaCplf6fcYdZ0Mml/N+uK0VSypXDO3zqE6nLlZ+7b5I6MtiTTzoOksRQxVNOOHTteeOGFjRs3Ll64cNrUqV41b+7cjRs3bt26dceOHYODg0H/1rrkzEXjbHcdCRXtVZ1dKj6gOvMxtLM4KUby4a+j+DGdA6qzV0Xyj4w2q5HZx0Tt6Fn4BcqiquYPbZgihnpQYla9K2KoII2zLzfijmPF0KLT347T6HYm9HiA62Mz6WQyZcfZkrufMpniQ6WpWPHpeJdv1uL4SCpWfoi21kOWJ3zV9/f3P/HEE4sXLrzm6qtbW1unxm6ePfW2VQvmb1qZ3Lphg1c9uXrVqgXz502bNjV289//3d/905VXzps7t7u7O51OB/0PGomcuWiU7S6f5+Jtbqu9+IijHRP1E6EdMcsrmlAdCfdNJj62H1qnRQz1oMSselfEUEEaZV9uzB3HiqGFC0EdR0OLLsCsQDqZTBW+OJ2MJZP2bUjOZJlPnIWjrsVn8dPpVNK6EymVv1sqaR8TtXJxSzJNDC32wgsvWNHzf02cuHT2rE0rk68//ssDW54xq/RTTz65etXyuXNvbGuzIunWrVsFHiWVMxcNst1F8uvTPjZpn0YvVK9qUko1q0hzLptGizNrkyMRRttyp86bmlWkS3UkckdAR7g81P1oaCU/tDGKGOpBiVn1roihgtR6X46o3OZl/6GOKqAYWjgIWXxbUEtLZZeHpmKq5N763Mn2wgn5ok/kvigWKz3YGktlyi8wdR5hdfxatR6yPFGrPp1O39fRcc3VV8+eetsYo+fIkXTetGnXXHXVsqVLd+zYEfQ/ukDOXDRIDO0oy38dCdXkOLde2Fp785dj9uav0WwrHEO1H1Z68LIrlz4L13125WKlfUGq10l5/R/aGEUM9aDErHpXxFBBAouhBhVtDvjOzUCvDU0nW1RLi+OApNu1mqMpOaKZf7mlshxaFENTbl9bnj3tO+iLkm6thyxPyKp/4YUXbv73f7+xre2R9mXVSJ+uefTn93VMjd088brrenp6gh6AbFbMXGQbJoZ22oc/uwrR09obS26Wt0+gF3bdLpddtDSGWmfPi++Csr/Wupa0qeyKUuclpDo/tDGKGOpBiVn1roihgtR3DI0nanrfZXAxNHf3eT43pl3ynhbn1xTd71TyrdLJWDKVbGlJpjVjaD6Klh5vDW8M7enpmXjddbOn3rb9pz+tQfosr1d+0b145sxrrr66q6sr2DP1gc+FrUFiaOGSUDsmdqmmRO7oo3OTjLapSJvqcF6U6RpDHZnSupQz0qyi5Sf6HV9buCmq7Gio5g9tjCKGelBiVr0rYqgg1d2XC7tbfrt0PSlffr4molQ0UfS19rfKbWf5k0QhiKHKvvHHcX97Wd7TjKH2648Wf3nxqyxZ9yblbo7Pf01pVk3FYqmiGFr4osJvHMYY+tJLL0287rrFM2e+8ovuQAKos15//JfL75w78bprU6lUUAMiZwdukBja2eXyn/lI+cshdalobyEmlt8RH3d8be5oqCNlurz2kyNNFr5tm+EPbYwihnpQYla9K2KoIFXcl50bWbQ5d3F6eQztSOTTZFchVkbs5NqrmvKPLD8aGmnwGBpTSnm8YJOxtPOVmEo+Xvxh55n5oieSfMS0sqv9SeclAvYVA9UeokOHDrke6gtk1R86dGjWjBnTb5ksIYCWhNHF8Zm3Tp7c399f+2GRswM3Sgy1N8n8f8Wt8+D2dZzWiXXrlHp5TPQ6MGlHxmhCqTYVUbnvEy87t+68I6r0FqUKf2i9FzHUgxKz6l0RQwWp4r7sev69PIY6w6Xzs+UfDF8MzZS8bmgdqvYQ9fT0TJgwobu7uySM1n7V//SRR66/9tqe9esDD51e9fzGjf9r4sQH1q2r8Tl6OTtwg8TQiPOwYpdSquiV5IteIymfCF1fHNQ+NOA8GVU4fGAdAkg47lLK32lUct6/fBMe9Yc2TBFDPSgxq94VMVSQqu3LvarJ7fyLawx1sja4SMkJemJovar2EPX09LS2tra2tpaE0Vqu+sHBwcULFqxcsGBvTyrwrDlqrbv77vj06UeOHKnZ+MjZgRskhtpV/rZJ1nbq/P+/a0x0r7JLSzvtXbf4dqVR82UFP7TOixjqQYlZ9a6IoYLIOhrq+rViYuhJJ700vSZWrFixcePGjRs3Zuo/hu7YsWPnzp3Va2A7hpaE0Zqt+oMHD06ZNGnT/fcHni/1a+uGDTfdcEPNXvRezg7caDGUCryIoR6UmFXvihgqSI2uDbX/PNK1oY7LQEXG0E9+8uCOmuju7t6YpzoHNlZNbVJ1LBZrra0JEyb88Zrf12D57Ny5c8rNN4/lXvj/vvj1bU88W/sk+sovuqfGYs8//3wNRknODkwMpXwuYqgHJWbVuyKGClKrO+Ud9x6VB83Su+A9Yqh1WZLz1E+jn5TP0r2jKTka2tra2t7efvDgwRqMW+rpp6fGYmN8NVAV6z971ptbNz1X+ySafurJ2bfd9tOf/KTaAyWnh4mhlM9FDPWgxKx6V8RQQep2Xy573eYG3XHo3pE5Y6gVQK2PV3vcViWTi2fFx34xqIr1f7F96JQZe5/uer72SfTAlmeSC+YvWrCgqjctyenhut3uKKlFDPWgxKx6V8RQQdiXhe84dO/IrBjqDKCW6o3bkSNHpk2d+vCye3xJgSrW33Rf9kvLh0+buXf9I9sCSaKb7l85ZdKk6t20JKeH2e4on4sY6kGJWfWuiKGCsC8L33Ho3pGl0+mSAGqp3rhNmzrVx1dlsmLoV+7LXtg+/PlZ+1c+vD2QJLr9pz+9JRar0jFROT3Mdkf5XMRQD0rMqndFDBWEfVn4jkP3mqnSuK1KJv06DloSQ7/ckf3SvZlTZh2Yv743kCT65JrVc2fNqsagyelhtjvK5yKGelBiVr0rYqgg7MvCdxy610w1xu3xX/7ynjlz/A1/zhh6UUf2S/dmT59z8KbkjkCS6Lq77159//2+j1sgPXx84sTh7dtLfxO2O8rfIoZ6ULKfuYihgrAvC99x6F4zvo/bjh07pk+Z4vsL1JfH0C/dmz3jznevvvfVQJLonbff3uP3u88H0sPHx48/Pn58SRhlu6N8LmKoByX7mYsYKgj7svAdh+414++4HTx4cMrNN4/xtZn0Y+iF92bPuOvQD+9+o/YxdG9PatK//dsf/vAHH0cvkB7OxdDiMMp2R/lcxFAPSvYzFzFUEPZl4TsO3WvGx3EbHBycMmnSWF6j3iCGfvHe7FkLPrhkft+ezVtqnERf+UX3pBv/fWDAZAAzO3cOb99eUpcu2Vz6we7uoWRy1Doejx+fOHHUGoxEikKnV02ceOmfbA9+G6EaqYihHpTsZy5iqCDEUOE7Dt1rxsdxu2vu3KfWrqlS5hshhn5hefbMhUfHz0u/9vSvnF/yzkMb3lm9atQ6NGfO4Wm3j1pHrrnm2D/8Q0kNtLa+9oMfDF5/fSHqXXaZVtQTX0/97b9cumRz8JsJ1RhFDPWgZD9zEUMFIYYK33HoXjNjHDf7uN1/zJ//iym3eEU9nZx3eNrt5TnPrv/4wTXPRyY+H5n4XGTiu5c2SNSTXL/+m38ghlK+FTHUg5L9zEUMFYQYKnzHadTuzRw+XH721rV0zt4OJZMlJ2r/42//xf0cbtAxiAqqBiORf/pMd/DbCNVIRQz1oGQ/cxFDBSGGCt9xxtK9ulFv82atqLd4sdaFeldcEXjgCGEd+/u/97EO3z718O1T37zxxl+2tn60fPnQihVjqe/e3TO8bZtfpdn8zgtGB5ubh5LJzOHDbHeUz0UM9aBk5y5iqCDsy2PccTL79mlFPdN7MlyP6jVy1Lv+el/q6dYJx6+/fizhaff06T1//3dWILPqnVX3G9SmhQ9efWP3D65/vPXG1BW3PXftzG3/MnPbv8zc9rUV2a+uyDatyI5wbegXlmcvWJ49vz17Xnv2zCVDJ9f8refb58556KGHxrrJBLEDDy1ZkuuoeDxz+HDuN2G7o/wtYqgHJTt3EUMFYV+uaMcZ7u6uuzhVXj4emtI/OlVjY1z1g4ODE6+7diyv0LRn85YZq3s/M+3NU2cfuGDpR99cmf3Gyuw3ktmvJ7MXJ7MXJ7OVxtBzl2XHLR0+tbZvPb+3J3XdhAn79+8PcC7MZF599fjEiZl9+4p+E7Y7yt8ihnpQsnMXMVQQ9mXhOw7da2aM49bV1bX8zrnG6e2+h7Z9+vb+M+9696sdQ+Pvz35zZdaXGHrusuzZS4dPq+1bzz+8dOk9iUQmkwlqLnzEdkf5XMRQD0rMqndFDBWEfVn4jkP3mhnjuF1z9dVmh0I3PfrC+bN2nT777a+vGPr2quy37s/6G0PPWZYdtzTzufiBebV66/m9PamrfvSjsRwQldPDbHeUz0UM9aDErHpXxFBB2JeF7zh0r5mxjNsLL7wwe+ptlca1PZu3XLns1ZNm7Pty+8ffWZX99qpslWLoOfdkx92TPWX2wRtr9dbz7XPnrF+/3viAqJweZrujfC5iqAclZtW7IoYKwr4sfMehe82MZdxu/vd/r/Q9k7Zueu6MGXsuWHT4L1ZnL1mdrUEMPfue7Klz3716eS3eev71x3957YQJ77zzTu3nwl8nnJhViqJ8qxNODLqnpZKz6l0RQwVRihhKDG1AxuO2Y8eOqbGbK0pps9b+50nT91583/FLV2drGUPPXpo9dc6hv15ci7eeXzhj+iOPPGJ2QJQeBsJG+KonhgpCDCWGNiTjcVu2dOnP7+vQz2f/191vnDPv7b9Ynbl0Tbb2MfSspdnT7vrgO/Oq/tbzWzdsuGXSpMP5Vz6qzVwAqFPCVz0xVBBiKDG0IZmN2+Dg4DVXXZV+6kmdZLZn85bvL/rDl5d+8L212e+uyQYVQ89MZE++6+g37yp963nf6+of/ej3v/99zeYCQP0SvuqJoYIQQ4mhDcls3LZu3Tpv2jTNDPrt+emL7jnyl2uzgcfQMxLZU+YfO2/W7qom0RXz5t2/cuVHH31Um7kAUL+Er3piqCDEUGJoQzIbt3lz5z65epVmBv3a8mN/tS4rJIaekcj++V0fXjQ7Xb0Yuv2nP72hre3tt9+uzVwAqF/CVz0xVBBiKDG0IZmN2z9deeWoZ+T3bN5y/qzdFy8/9lfrsnJi6MkLB0+d0V/tt/q88oorXnnllUpvVKKHgbARvuqJoYIQQ4mhDclg3NLp9I1tbaNGsW/clb54+bHmdVk5MfTku46eN2v3tieerWoGPbDlmfitUx577LGjR49Wey4A1DXhq54YKggxlBjakAzGrbu7e/ncUd7As3Xpa19OvH/ZuqycGHry3MPfmddX7fuTrHp4aSKxZEmlLyBKDwNhI3zVE0MFIYYSQxuSwbiNemHozckdX1j07mXrs3Ji6Cmz3v7HZbV4BXurrMtD9+zZU+25AFDXhK96YqggvK2I8DfMoHvNGIzbyBeGbnr0hc/N3Pf99VkhMfTMxPBnpu+Pr/nPakfP/2/pq84XJb3yiit+97vfHT9+vKpzAaCuCV/1xFBAF91rptJxO3To0DVXXfZI/1MAACAASURBVOUVxfZs3nLGjD3fTh4XEkM/v2Toc9P3/qzz19XOoC8/tVXF+jc9+oL9kUk33NDT0/PBBx9Uby4A1Dvhq54YCuiie81UOm4jv4fndR2vfHHxe99fn5UQQ09b+PGp0/ds3fRcDc7CP/TIb1Ssf9aa39ofWThj+o9//OOKXraJHgbCRviqJ4YCuuheM5WO2xNPPLF09iyvI4J/fNvelgeyEmLo5+d/8MXZu2pzQ9KBLc/MWvPb/3br/kjidfsj6xYvam9v37dvX/XmAkC9E77qiaGALrrXTKXjtvr++x9emnCNYv/c/soXl7wvIYaeNvfdH979RrXfPt5Z31vwh7MXHr5g9i77I0+uXjXjjjt2795dvbkAUO+Er3piKKCL7jVT6bh53Sb/8lNbP3X73u+vz/gSQy9cNvj5BUdOnf32STP2nzh1r4r1f2raPp0Yeu6yzMnxgzcld9QsgFr1iSn9f7lm6BNT+u2PWDfL9/X1DQ8PV2kuANQ74aueGAroonvNVDpu06ZO3bphg9eh0B88kB1LDL1o+fHT73rvU9P2njlj99/d8+p9D237WeevrVebV7H+UWPouKVDn52+t33DizXOoE93Pf/Z6Xt/uCH7R5P77UOwr/yi+9oJE/r6+vTfXJ4eBsJG+KonhgK66F4zvsTQPZu3nHhbf/O6YeMYelH74KmzD5xyx56bVrzselPRqDH0zCWDp1X/XTpd66YVL5+36L0fbsh++o699i9vx9AjR45UaS4A1Dvhq54YCuiie81UOm4Tr7vulV90l+Sw+x7adtbcty9/MGsQQ7++Yui02QfOmrF7zcbfjBD1Ro6hZy48en5N3qXTtU6dvufS+4//cEP2tFn7nS8O1dra2tfXp/+aTfQwEDbCVz0xFNBF95rxJYaOv6vv4ns/NIih59995KQ73hw5gI4aQ0+fd/iS+TV6l87y2rrpuU9P2/vXD2Z/uCF79p1v3/fQtpIY+v7771dpLgDUO+GrnhgK6KJ7zVQ6btdcffXrj//SmcNee/pX/8eU/ssfzFYUQ7++YujU+Fv/95LXNeOjVww9fc7bV9TwXTrL66YVL5+76D0rhp4z/935614qiaGHDh2q0lwAqHfCVz0xFNBF95oZ+9HQNRt/c8bcAxXF0IuWfXT6jD0PPTL6QdARYugX2oc/O2P/rOq/S+cItWfzlk9P6//LNUO5GLrocCxZ+H2IoQBGJnzVE0MBXXSvmbHH0KvbX7lgyQf6MfSCxYe/Midd6Tn0khh63j1Dp8yoxbt0jlx2BCeGAjAgfNUTQwFddK+ZSsft1smTn9+40RnFzpq5+zsrB3Vi6KVrMmfOPXil0Tl0Zwwdt6R279I5cn1lbvob933kGkPtO+WJoQC8CF/1xFBAF91rZowv2LRn85ZPTOn/wQOZUWPoX6waPmWm+Yt62jH0nEUfXFjDd+kcoayXC7X+4SPE0Pfee69KcwGg3glf9cRQQBfda6bScZs1Y0bP+vV2FPtZ569Pm7X/rx/MjhxDL109fMasvWN5UU8rhp5517v/vbbv0jlCfXfBH5raj3nFUPtdlHjBJgBehK96Yiigi+41M8b3lLdeuX3kGDr2DGrF0NNmB/AunV5lHQr9wQNZrxhqvac8MRTACISvemIooIvuNVPpuD3xxBNLZ8+y01jT3PQ37/tohBj6XT8y6IEtz3zqtj21f5fOEeqsmbu/lRwcIYauW7yovb29r6/v6NGjVZoLAPVO+KonhgK66F4zlY7bjh07psZuttPYn09703q5ItcY+ldrM6fM9CGDSqs1G3/z+TkHWh7IlsbQBQOz1vzWesydt0/t7Ozs6+sbHBys0lwAqHfCVz0xFNBF95qpdNwOHTp0zVVX2YHsjyb3X/5gxiuGjpv3zp1rfxt4avS39mzecvIdey5ZNVQeQ8fNeyfxYO6Q7aQbbujp6enr66veXACod8JXPTEU0EX3mjEYt3+68sr0U09ageyPJvf/cEPWNYZ+tf3opfP7Ak+NvtffLHn9oqVHvr8+Wx5Dne8pf+UVV/zud7978803qzoXAOqa8FVPDAV00b1mDMZt3ty5T65edWDLM9ueePbPbt/rGkMvWTV0+ow9El5Wyd9a/MBvz77rbStnl8fQk6bnrkCwb5N/6623qjoXAOqa8FVPDAV00b1mDMatu7t7+dy5B7Y8s+nRF06euc81hp4a3x/4Wxz5XtueePbk6f3fWzPsFUP/7Pa925549sCWZx5emkgsWVLRa9ebzQWAuiZ81RNDAV10rxmDcUun0ze2tR3Y8sxDj/zm87PfKo+hF9z9/o/aXwk8NfpbezZv+dKcXV+/9+PL1me9YqiK9VsPjt865bHHHuvr6/vwww+rOhcA6prwVU8MBXTRvWbMxs26PDTx4Ivj5r1TEkMvW5/51O17X35qa+DB0arXnv7V/5vYOfYM+u356YuXH7tsXdYrhjavHfrT23Ix1LowNJ1OZzKZas8FgPolfNUTQwFddK8Zs3FbvHDhppXJ+eteOmf+uyUx9PxFA5NXvhx4+rRq2xPPnjZ9j32QciwZ9GvLjzWvy44QQ7+2/Nj3FvzhwJZnnt+48eYbb+zr69u3b18N5gJA/RK+6omhgC6614zZuL300kvTb5lcfjT0e2uGPj2tX8ibbT7d9fxJd/R/sX1oLDHUzqB/tS47cgy1XzQ0EY8/+OCDlV4YajwXAOqX8FVPDAV00b1mjMftmquvnrf6+ZIYeu78d2es7g08gB7Y8sz6R7adNGPvl5YPN92XNY6hLz+19dxZu7/afuyv1mVHjaHWqzXt7Uld9aMf/e53v+vr6/v4449rMxcA6pTwVU8MBXTRvWaMx+3B9euvnfMzZwxtXjd84m0iDoXOX9978sz9F92b+cp9WeMY+nTX86dOf/Pi+wb/cm121Bj6gwcyn5jSv2fzlk0rk7Pj8b6+vopeMXSMcwGgTglf9cRQQBfda8Z43NLpdMu/3eeMoV9c8v4/C7hB/pp7Xz19zsGLOrJf7sgax9D2DS+eMnPvt1YOfW9tVieGfmvFxxfM3nXAcY/8e++9V7O5AFCnhK96Yiigi+41M5Zx+9sZPz7rzoN2DP30tL1bNz0XYADds3nLD+9+48y7Dn3p3qxxDN2zecu1Ha+cMefgJasz312T1YyhFyz54Or2V+xXre/r6xsaGqrlXACoR8JXPTEU0EX3mhnLuM1+5D9Pm7XfiqFN7bn7xIOq157+1fh56bMXfvCle7PGMXTrpue+NGfXuQveu3R19tI1Wf0YesbcA2s2/qZ97py1a9f29fXt37+/xnMBoB4JX/XEUEAX3WtmLOPW88ZHn5m2x4qhZ9/1TuLBF4PKoC8/tfX8WbvPXnzswnuzxjF08sqXT7pj75fbP/6L1dmKYmjLA5lPTOnfsenxaydMeO211/r6+o4ePVrjuQBQj4SvemIooIvuNTOWcUsPDJ04be8PN2R/8EDmT27rD+od5Ldueu7zM988a8ngF+/NmsXQhx75zVkzdp89f+Bb92cuWZ2tNIZ+MXHk7+951T4U2t/fX/u5AFCPhK96Yiigi+41M5ZxO3Rs+BO37fvhhuzF9344/q6+QDLopkdfOHnG3nOWDn1hedYghv6s89dfnpM+Jf7Wl5cPfmdV9jurspdUHkM/O33vYz/ZPMZDoWOcCwD1SPiqJ4YCuuheM2Mct09O3ff99cOnzX4rkDPy7Rte/NyMfecuG/7C8mxFMfS1p381f91Lp9yx53Mz93/hno++dX/226uyZjH02ysHz5q5275B3vhQ6NjnAkDdEb7qiaGALrrXzBjH7Zx5By65f/CPb3vz3qWra5xBp676z5NnHTxvWeaC5VnNGLrp0Rfmr3vp0vl/+G9T+k+b++5Fy49/c2V2/P3ZscTQM+YemLXsl1NvvdW6Qf7YsWNBzQWAuiN81RNDAV10r5kxjtvfrB44b/H7fz5j/0033PD647+sWQa9Ytmrp8x557z27Pnt2VFj6H+9Za+K9atY/2en7zt1zrvjFh/7RjL7jZXZb67MjjGGfjs5eNaM3f/2r//6/PPP9/X1vfXWWwHOBYC6I3zVE0MBXXSvmTGO26RfHD7h9rf+54OHfvWrX827444aBNA9m7dctvAPp911+NxlWc0Y2rQi+9UV2a+tyF6czF6czH49mfUrhp4x50B01ob7k8m+vr50Om3wWqE+zgWAuiN81RNDBRl3YUapLKVT4y7M1H6C6F4zYxy31b85qmL9d2/5IJvNPrB27folS6qaQV97+ldfnbvr1PlHzl2WDTyGfvO+j8+84zXrrTv7+voOHz4c7FwAqDvCVz0xVBClsqpzgNKqWnduNkv3mhrjuL20d1DF+nve+Mj6a3zG9J4H1lcpg2574tnzZ+0+dcFH5yzLBh5Dm9dlPnvHm1fdGLfujt+7d28mM9b/fdHDQNgIX/XEUEGIocTQhjT2cfv8nLcOHRu2/nzkyJEpsVjvzx/1PYM+3fX8qTP6T1s0eM49WQkx9PyFA5fc9JPt27f39fXt2bNnjKfjLfQwEDbCVz0xVBBiKDG0Ifk+bv39/bfcdFP6qSd9zKDrH9l26oy9ZywZGndPVkIM/UbHxydN2fHUU09Zl4R+9NFHvgwdPQyEjfBVTwwVhBhKDG1I1Ri3F198cfotk/3KoPPW954a33/mkuGz78lKiKHfWTX0mVvfWLn2YeuS0CNHjvg1bvQwEDbCVz0xVBBiKDG0IVVp3Loee2z5nXPHnkFvTO44ZdbBMxOZs5dmJcTQ760e/sztu6YvXGFl0HfffdfHQZPTw9yRSflbgdy3WhfkrHpXxFBBlCKGEkMbUPXGbfGCBT9PrhhLBv0fiddOmfPumYnsWUuzEmLoX67NnDT9zYlTl1i3Je3fv9/fEZPTw2x3lM8VxJNCXVBiVr0rYqgg7MvCdxy610z1xm1wcPCeJUva55ocE92zect35vWdcuf7ZySyQmLo99ZmTo+/+T9vvc/KoG+++ebw8LC/Iyanh9nuKJ+LGOpBiVn1roihgrAvC99x6F4z1R63x37+81m33lrpHUtNc/r+fM4HZySyQmLo99ZmTp2x59q7Nlrn4nft2jU4OOj7WMnpYbY7yucihnpQYla9K2KoIOzLwnccutdMDcbtuWefvfXmm1/5Rbd+DN266blT7thz8sJBCTH0u2syJ0/fPenex60M2t/ff/z48WoMlJweZrujfC5iqAclZtW7IoYKwr4sfMehe83UZtzS6fSkG298fuNG/ST62tO/Ghfffcr8Y8HG0EtWDX/ujl2zNjxvZdADBw6M/WXqvcjpYbY7yucihnpQYla9K2KoIOzLwnccutdMzcbt0KFDU6dM2XT/yoquEL14bvq0uz4IKoZ+/b7j/+dtf1j0aK+VQQ8dOlTVIZLTw2x3lM9FDPWgxKx6V8RQQdiXhe84dK+ZWo7b4ODgwnnz2ufO3duT0g+jf734jdPmvlv7GHrB3R986pad3c++al0MevTo0WqPj5weZrujfC5iqAclZtW7IoYKwr4sfMdRnQOZOhfAqAWx6h979NHrJkzoWV/BW89f3/H7U2YfrFkM/dbK4ZNn7vvazO2vvN5nvVdnNW5IKidnB2a7o3wuYqgHJWbVuyKGCsK+LHzHUcRQ03Gr/Q8dGBi44/bbp02K6d+3NG9970kz9p+VGK52DD174eFP3pK+7eEd1on4/fv3+/7CTF7k7MBsd5TPRQz1oMSselfEUEHYl4XvOKpzIJPJpJMtLcm0HexSMRVLmWXCdCqVdv412aKc39n5mVjpx11/bPGvlk62lD0kgFELdNW/8MIL/3r99e1z57z++C91kqj1zvJnLRmqUgw9f8mxE6bsalnw4m9f6evr69u9e7ePb9SpQ84OzHZH+VzEUA9KzKp3RQwVhH1Z+I6jOgcymVRMqVgqk4oppVQsmWxRKpZKJ1uUUh4hcoQcWhQbUzGPPGs/LJVK2R8qC6aFj6aTLbnfTCmlWlpaCr9aAKMW9Kr/+OOPf/LjH187YYJmGH266/nTZvR//u7jPsbQi1cMn7XwyCen7PrSrN89/us3rIOg77zzTs0Ogtrk7MBsd5TPRQz1oMSselfEUEHYl4XvOKpzwDrAmD8Umc7/tdL8WRwc06lUOpPOx0allFKxWOFoZ+EzsVisJRZryUfLXMy0EmrM8dUtyXQqmf+V0mnH7xbAqMlY9ceOHXv44YevnTDhztunPrl61chJdNsTz541c8/pCz8eeww9L/HhybMOfmJy36V3brMD6FtvvfXxxx8HMg4S5sLCdkf5XMRQD0rMqndFDBWEfVn4jqM6B5IpZ1q0MmE+I7ofyhxdKplMlx7eTMVakqlcfnQeJc0lXo8Dp85vkj+Emoo5D9IGMGqSVv2xY8cef/zxmXfccfWPfpSIx7f/9KcjvKToF2fvOn3+0UpjaFPH8HmJj06+8/BnZ+z732Nvnj75xX9ZtmXby69ZAfTgwYO1uRXJi5y5YLujfC5iqAclZtW7IoYKwr4sfMdRJbcoOVKf5wl1jRSaStnfKXeYNZ1M2t/NumI0lWwpnPO3DqG6XPmZ+za5I6MtybTzIGksRQy1DA0NpdPphx9++Ia2tiuvuCJ+65SHlyZ6f/5o+UuKXjKv7/Pz3teJoZ+atk/F+lWs/79O3v3nN2//+g0b2u5+7LnfvGilz927d7/99ttVemOkisiZC7Y7yucihnpQYla9K2KoIOzLwncc1TmQKTn9rVwOhno8wPWxmXQymbLjbMndT5lM8aHSVKz4dLzLN2txfCR3FWuRAEZN8Kr/8MMPd+3a1dXVlViyJHr99VdeccWtN93YPmfOusWLtm7YYF1I+j8Sr506551RY6iK9V87YcKiBQs6Ozt7e3OvRW+9JVINXg1Un5y5YLujfC5iqAclZtW7IoYKwr4sfMdR1i1KdlJ0HA0tugCzAulkMlX44nQylkzatyE5k2U+cRaOuhafxU+nrasFWvJXDbQkk/YxUSsXtyTTxFA3mUzm2LFj77777htvvPHUU0+tXbu2vb39lkmTrvrnf25tbW1tbb1own1/dvubF7RnRo6hdvTs7+9/5513jh49Wvs7kEYlZy7Y7iifixjqQYlZ9a6IoYKwLwvfcVTngON2oVTJbUEtLZVdHpqKqZJ763Mn2wsn5Is+kfuiWKz0YGsslSm/wNR5hNXxawUwanW16oeHh48dO3bo0KGDBw/u27dv165dVrJc9Piuk2cdOG/Z8Agx9NChQ0ePHh0aGgr6HzESOXPBdkf5XMRQD0rMqndFDBWk1vtyRKlob9Ef6qiCvjY0nWxRLS2OA5Ju12qOpuSIZv7llspyaFEMTbl9bXn2tO+gL0q6AYxa/a/64eHhDz/88Infv3/63IPn3jPkFUOD/jW1yJmLhoqh0ebCFhpvU5Eu1eHTjhpvU02J3PcM/J8pvIihHpSYVe+KGCpIYDHUoKLNAW+LgcbQ3N3n+dyYdsl7WpxfU3S/U8m3SidjyVSypSWZ1oyh+ShaeryVGDomL+0dPGf+2+MSg8TQsWugGNqrmtoKf423qfiAijYr1eb2SKWaEiqeUE326Yxm1dSsOjy+ebwtt0tH24oeE00U/tyRUE0J1VmchsfyQ+u0iKEelJhV74oYKkh9x9B4oqabWlAxNBUr3APkuL+9LO9pxlD79UeLv7z4VZase5NyN8fnv6Y0q6ZisVRRDC18keM+pgBGrbFWfXpg6MJFb5+1+CNi6Bg1TgztSKhor+rsUnFrJ2zL/cGZFCP58NdR/JjOAdXZqyL5R0abR7m70d517ehZ+AXKoqrmD22YIoZ6UGJWvStiqCDV3ZcLG1z+/+iuJ+XjbblH2R+JKBVNFH2t/a1ye2JX0WbXuDuO6hwouvzT/a2MKpN2vhJTyceLP+w8M19+bWgmn13tTxb/prkrBqo6PgcPHvQat6r+3Bo7dGz4m/e8M+7uo8TQsWiUGJrPc/bOWaR4V7Rjon4itCNmeUUTqiPh9kOV45sb/dA6LWKoByVm1bsihgpSxX053lZIn9Hm3H+jy2NoRyK/b3YVNtCInVx7VVP+keVHQyOhiKFjDJ2Bq+r4bNy4MRqN9vT0lI9bVX9u7X14PPP/rD109sL3iaHGGiSGRvLJzz42aZ9GL1SvalJKNatIcy6bRosza5MjEUbbcqfOm5pVpEt1JHI77QiXh7ofDa3khzZGEUM9KDGr3hUxVJAq7suu59/LY6gzXDo/W/5BYmh9qur4bNy40XqFo5Iw2qirvu3Rw2fOP0QMNdMgMbSjLP91JFST49x6YePtzV+O2Zu/RrPN5exT6cHLrtxOW7juM3/2yb4g1eukvP4PbYwihnpQYla9K2KoIFXbl3tVU/FpGqtcY6iTtf1FSk7QE0PrWFXHx46hJWG0gVf93VuOnHbnu1/uyBBDK9UgMbTTPvzZVbpzltwsb59AL4S/LpcDnKUx1Dp7XnwXlP211o7dVHZFqfMSUp0f2hhFDPWgxKx6V8RQQWQdDXX9WjEx9AtfKEo8taE6B2r/Q+tdNBr95PrXg15bVfST3mOnzXmbGFqpBomhhUtC7ZjYpZoSuf/8OzfJaJuKtKkO50WZrjHUkSnj+a01Wn6i3/G1hZuiyo6Gav7QxihiqAclZtW7IoYKUqNrQ+0/j3RtqOMyUJExNKijoQH81PpRcjS0tbW1vb394MGDDT9uz+36+JTZbwX9W2iRMxcNEkM7u9z+h1/+ckhdKtpbiInld8THHV+bOxrqSJkur/3kSJOFb9tm+EMbo4ihHpSYVe+KGCpIre6Ud9x7VB40S++C94ih1jEA50XuxNDQc8ZQK4BaH2fc5JAzF40SQ/Mbo721WufB7es4rRPr1in18pjodWDS3oejCaXaVETlvk+87Ny6846o0luUKvyh9V7EUA9KzKp3RQwVpG735bKLohp0x6F7R2bFUGcAtTBuctR4Lo5PnDi8fbv7b1Kv211xRZyHFbsK/zm37igqeo2kfCJ0fXFQ+9VLnJdyFo6DWqenEo67lPJ3GpWc9y8/FjDqD22YIoZ6ULJ3YGKoIA2yLzfujkP3jmzHjh2uLx3KuMlR47k4Pn788fHjXcNoo2135W+bZCU/5yl715joXmWXlnbal0IV3640ar6s4IfWeRFDPSjZOzAxVJBG25cbbsehe80wbnLUeC5yMdQtjLLdUT4XMdSDkr0DE0MFYV8WvuPQvWYYNzkqnYvMzp3D27c7ayiZLKnjEyeWljN9llQ+jLLdUT4XMdSDkr0DE0MFYV8WvuPQvWYYt9pziY8PPzyUTE67+Z5CfJw8uSQ+Dl522UgJ0seaOPHSP9ke/DZCNVIRQz0o2TswMVQQYqjwHYfuNcO46cvs21cSH4e7u0uPPgYYH4mhlNgihnpQsndgYqggxFDhOw7dayYM46YVH+Px0vgYiQSfCGseQDkpT1WliKEelOwdmBgqCPuy8B2H7jUjedwyhw+XxsfNm0svf1y8uDQ+XnFF8HmuGnX99S41adLQihXlNdzdPbxtW3llDh+2h9c1gFrY7iifixjqQQnegbPEUFHYl4XvOHSvmSqNW0jj49iS4nfv7ilJilXlGkAtbHeUz0UM9aBkP3MRQwVhXxa+49C9ZkrGrTQ+jv3ma2E1+I//6BoWjY8pVm8uqq3xX76eklPEUA9K9jMXMVQQ9mXhO07Iu9fr5uuR754JPBSOPSkOPfSQe1Lcty/oOamYnB5mu6N8LmKoByVm1bsihgrCvix8x6nT7jWLj4HffB3apFhVcnqY7Y7yuYihHpSYVe+KGCoI+7LwHafG3Sv/5uvBSMQ9KS5a5MyId9y0NHcC2jUp7txZy1ENOTk7MNsd5XMRQz0oMaveFTFUEPZl4TuOZvfq3Hxds/iomRQLlypWISmy6uWQMxdsd5TPRQz1oMSselfEUEHYl4PdcUaNj9NuvqcaN18PNje73/4cj9csKVYVq14OOXPBdkf5XMRQD0rMqndFDBWEfdl4xzG4+bqi+GglxadbJ+gmxZ4e17AYUGcFjFUvh5y5YLujfC5iqAclZtW7IoYKwr5c6Y4z3N1tfkyx8qRI95ph3OSQMxdsd5TPRQz1oMSselfEUEHYl4XvOHSvGcZNDjlzwXZH+VzEUA9KzKp3RQwVhH1Z+I5D95ph3OSQMxdsd5TPRQz1oMSselfEUEHYl4XvOHSvGcZNDjlzwXZH+VzEUA9KzKp3RQwVhH1Z+I5D95ph3OSQMxdsd5TPRQz1oMSselfEUEHYl4XvOHSvGcZNDjlzwXZH+VzEUA9KzKp3RQwVhH1Z+I5D91Zq3IUZpbKUtBp3YSbo1siecGLw40A1Up1wYtA9LZXwZy5iqCBKEUOJoQ2FlhZaHDcCQkPJfuYihgrCc7bw51G6t1K0tNAihgKhoWQ/cxFDBeE5W/jzKN1bKVpaaBFDgdBQsp+5iKGC8Jwt/HmU7q0ULS20iKFAaCjZz1zEUEG4Zl/41eh0b6WIoUKLGAqEhpL9zEUMBXTRvZUihgotYigQGkr2MxcxFNBF91aKGCq0iKFAaCjZz1zEUEAX3VspYqjQIoYCoaFkP3MRQwFddG+liKFCixgKhIaS/cxFDAV00b2VIoYKLWIoEBpK9jMXMRTQRfdWihgqtIihQGgo2c9cxFBAF91bKT9jaLRZ2ZoSJt8h3mb4hSNUR0KpNtU5oDq7lGpWHcb/OvsX61XRrtxvG+1VnV0q2ksMBWBM+DMXMRTQRfdWyrcYGm3Op70B1TmgIkZJVD+GRptVpGv0x8QHVEciFxM7Ei5fEk+oSD49xx2/hkuY7sr/tVdFErmv7XCkUmIoACPCn7mIoYAuurdSLjE0l64qrIgqPihodOjR5xjapjoGCkcr7XCpVOF3yx3RzD/YOqBb/p0j+a9qUiqaUCWKHt+lIm2lDyiJucRQ5DjkLQAAHDRJREFUAA7Cn7mIoYAuurdSxTG0qyiiVVTR5pESpDMCxh1fktNWeJj1TToSSjlyrf3luciY/8KRk6gdQ62HRdpUZ2/pP80+VmrH0JHCYq+Kj3r+vct9HHK/DDEUQCnhz1zEUEAX3Vspl6OhEbMLKHtVk8eFofG2oqOP1p/jbYX0aUdYK4Z2JIqicOGvjiOsFR0NjXTlj4n2qqbif115DM3l3a7cPycXhbtUPB8x7SOjccdh0cIvQwwFUBnhz1zEUEAX3Vsp/2KoMzUWh9GS8/XWX0tP4tshtexwrDNxRhwHRDVjqHVJaMS+brU4JnodDS1Njb0q2lV4sPWRiOvRX2IogMoIf+YihgK66N5K+R9D7TRmH0osSZzRZhVJqCa3ayWtY6VNxWfbnTfg28cddWJoR/7OpJK8Gx0hhubDYnkMjSRyV812dKlom2pqVk3NuYOmTc5T+cRQAJUR/sxFDAV00b2V8imG9rrEyohHDB35aGhTIhdhnZeQlidOnRgaT6gmx9nzSJeKWLcZlZzxd9y0ZP/by1NjNKHiXbkvieSPjFoPizheIoAYCqBCwp+5iKGALrq3Uhox1HFcc4SKNntc0Fl8baj9cee1ofaf7VuUnJ8tfKte1VTJSfl4m4oPOF5fqfiv9mMKR0MdnypPjXZgjXcRQwH4SPgzFzEU0EX3VkrvaGiXy41HrrGvoM3zUy53yjsCq/3anM5T8+W3xlvfcORfSSuGJoqic+F3c6bGXtXk/FmjxVB3FR5jJoYCoSH8mYsYCuiieyvl9oJNrq+F1FWaLOWXTgx1/gOdoXakKxM4GgrAT8KfuYihgC66t1IN+p7yjleP8lIUFntVU3HIHiGGFr0bU8mBUv+KGAqEhvBnLmIooIvurVSDxtD6L2IoEBpK9jMXMRTQRfdWihgqtIihQGgo2c9cxFBAF91bKWKo0CKGAqGhZD9zEUMBXXRvpYihQosYCoSGkv3MRQwFdNG9lSKGCi1iKBAaSvYzFzEU0EX3VqoWMdT1DZO83mPJtewXmXd+ROelTOu3iKFAaAh/5iKGArro3koFFkM1P9s5UHg1Jedr4Je/hVI8kXvTTudjyl/3vl6KGAqEhvBnLmIooIvurVRxDHW83OaoRyhrFkMjjvdYyr3LUVfpmxJFlIokSl+XvvwYah0VMRQIDeHPXMRQQBfdW6miGBptduS8St4zyfkO79HmwrnyaLOK9qqIUtH8cUr7U64n5e3jnfZHrF/Jelv5aJsqVzgvX/b2SCO9E5L4IoYCoSH8mYsYCuiieytVFEOdibCiDNeRyMfWXtXUnH9Hol7V1Kw6BlREOT5blj7tP1hZs2Og6GBnR2/hl3EeDS05yV54e/r8+feOhFKO96+vuyKGAqEh/JmLGAroonsr5XFtqNcbr3tVPnFab3QZUflDmG25oGmnxvL0af/BeUi15BCp9fF4m4r3Fl8A2ub5O0eaVaRNxRP1el6eGAqEhvBnLmIooIvurZR7DDU4nW2df7cux7T/bMXHooOsI8bQkhuMrOjZlI+n0WYVL36z+JL3hbdjaO7XaFMdxem2jooYCoSG8GcuYiigi+6tlEsMjRidy+5IqKZELr/m/pz/PvoxtDQv9qpoV+4Ia+eAirapjvxd8yW50/5rRKlIm+PxY/gXEUMB1ITwZy5iKKCL7q1UaQx1SWxdejfO96qm5nwu7FKquZAXNWNo4dpQxyWknQOFGBppK7qXv+T+pCalmppVNOG4QSofQzu66u9eJWIoEBrCn7mIoYAuurdSHnfKD6h4whHdurReK77kGlDXCz1HiKGdA+4v85mLob0q2lV4DVEreuZSb/7K1JLfx46h9VjEUCA0hD9zEUMBXXRvpRwxtPhAY+kLNlX4Ek4+lhVDc7fJj3BtKDEUQF0S/sxFDAV00b2VqoP3lM/FUOv46AjXhpYVrxsKoB4If+YihgK66N5K1UEMDWcRQ4HQULKfuYihgC66t1LEUKFFDAVCQ8l+5iKGArro3koRQ4UWMRQIDSX7mYsYKsi4CzNKZSmdGndhpvYTRPdWihgqtIihQGgo2c9cxFBBeM4W/jxK91aKlhZaxFAgNJTsZy5iqCA8Zwt/HqV7K0VLCy1iKBAaSvYzFzFUEJ6zhT+P0r2VoqWFFjEUCA0l+5mLGCoIz9nCn0fp3krR0kKLGAqEhpL9zEUMFYTnbOHPo3RvpWhpoUUMBUJDyX7mIoYKwnO28OdRurdStLTQIoYCoaFkP3MRQwXhOVv48yjdWylaWmgRQ4HQULKfuYihgvCcLfx5lO6tFC0ttIihQGgo2c9cxFBBeM4W/jxK91bqhBODf6cDqrxOODHozgBQK8KfuYihgihFDCWGNiDGTQ7mAggb4aueGCoIMZQY2pAYNzmYCyBshK96YqggxFBiaENi3ORgLoCwEb7qiaGCEEOJoQ2JcZODuQDCRviqJ4YKQgyVHEMzmYzqHMjUs1oPWR6rXg7mAggb4aueGCoIMZQYWlW1HrI8Vr0czAUQNsJXPTFUEGKo/BiaTra0JNN2sEvFVCxllgnTqVTa+ddki3J+Z+dnYqUfd/2xxb9aOtlS9pBaD1keq14O5gIIG+GrnhgqCDFUfgyNKRVLZVIxpZSKJZMtSsVS6WSLUsojRI6QQ4tiYyrmkWfth6VSKftDZcG08NF0siX3mymlVEtLS+FXq/WQ5bHq5WAugLARvuqJoYIQQ2XH0LTqHEgVDkXmjjemYpXmz+LgmE6l0pl0PjYqpZSKxQpHOwuficViLbFYSz5a5mKmlVBjjq9uSaZTyfyvlE47frdaD1keq14O5gIIG+GrnhgqCDFUcgxNJ2Oqc8CRFq1MmM+I7ocyR5dKJtOlhzdTsZZkKpcfnUdJc4nX48Cp85vkD6GmYs6DtLUesjxWvRzMBRA2wlc9MVQQYqjkGJopuUXJkfo8T6hrpNBUyv5OucOs6WTS/m7WFaOpZEvhnL91CNXlys/ct8kdGW1Jpp0HSWMpYiiyzAUQPsJXPTFUEGKo/BhadPpbuRwM9XiA62Mz6WQyZcfZkrufMpniQ6WpWPHpeJdv1uL4SCpWfoi21kOWx6qXg7kAwkb4qieGCkIMlR9DCxeCOo6GFl2AWYF0MpkqfHE6GUsm7duQnMkynzgLR12Lz+Kn06mkdSdSKn+3VNI+Jmrl4pZkmhgK5gIIH+GrnhgqSK1jaESpaG/RH+qoAoqhhYOQxbcFtbRUdnloKqZK7q3PnWwvnJAv+kTui2Kx0oOtsVSm/AJT5xFWx69V6yHLY9XLwVwAYSN81RNDBQkshhpUtFlFukIYQwtHKVtaHAck3a7VHE3JEc38yy2V5dCiGJpy+9ry7GnfQV+UdGs9ZHmsejmYCyBshK96Yqgg9R1D4wnVEYoYmrv7PJ8b0y55T4vza4rudyr5VulkLJlKtrQk05oxNB9FS4+3EkPBXAChI3zVE0MFqW4MjTbnz+O2lcZQZx6Nt+UeZX8kolQ0UfS19rfKJdEupZRSzWGIoYV7gBz3t5flPc0Yar/+aPGXF7/KknVvUu7m+PzXlGbVVCyWKoqhhS9y3MdU6yHLY9XLwVwAYSN81RNDBaliDI23FdJntFk1JdxjaEcinya7CrEyYifXXtWUf2T50dBIg8fQmFLK4wWbjKWdr8RU8vHiDzvPzLveKm9lV/uTzksE7CsGqj1Ehw4dGhwcLP84q14O5gIIG+GrnhgqSBVjqOv59/IY6gyXzs+WfzB8MTRT8rqhdajaQ9TT0zNhwoTu7u6SMMqql4O5AMJG+KonhgpStRjaq5qUintnU2e4dLKCZqTkBD0xtF5Ve4h6enpaW1tbW1tLwiirXg7mAggb4aueGCqIrKOhrl8rJoaedNJL02tixYoVGzdu3LhxY6b+Y+iOHTt27txZvQa2Y2hJGGXVy8FcAGEjfNUTQwWp0bWh9p9HujbUcRmoyBj6yU8e3FET3d3dG/NU58DGqqlNqo7FYq21NWHChD9e8/ug1xZy2IGBsBG+6omhgtTqTnnHvUflQbP0LniPGGrdUG/d6hREDK39Sfks3TuakqOhra2t7e3tBw8eZNzkYC6AsBG+6omhgtTtm3l2lV5OSgwNJWcMtQKo9XHGTQ7mAggb4aueGCpI3cbQIIoYKo8VQ50B1MK4ycFcAGEjfNUTQwUhhhJD61o6nS4JoBbGTQ7mAggb4aueGCoIMZQY2pAYNzmYCyBshK96YqggxFBiaENi3ORgLoCwEb7qiaGCEEOJoQ2JcZODuQDCRviqJ4YKQgwlhjYkxk0O5gIIG+GrnhgqCDGUGNqQGDc5mAsgbISvemKoIMRQYmhDYtzkYC6AsBG+6omhghBDiaENiXGTg7kAwkb4qieGCkIMNYihx8ePH7ziiuMTJx6fPHkomRxKJoc3bx7evj2zc6f/E0T3GmHc5GAugLARvuqJoYIQQw1iaDabzezcObxt23B399CKFUOLFh2//vrj119/fPx4q3wMqXSvGcZNDuYCCBvhq54YKggx1CyGjmDkhFppSKV7zTBucjAXQNgIX/XEUEGIob7H0BG4JtTB5uYRQurf3NU9vH17Zt8+P2Y7RFj1cjAXQNgIX/XEUEGIobWMoSPI7Ns3vG3bcE/P0IoVQytWuCbU4+PHH5848fjEicfj8dyR1O3bCamuWPVyMBdA2Ahf9cRQQYihQmKo5wR1DugmVEKqA6teDuYCCBvhq54YKggxVH4MHeGz7gk1EnFJqCELqax6OZgLIGyEr3piqCDE0LqOoSPIHD48vG3b8LZtuYQ6adJICbXhQiqrXg7mAggb4aueGCoIMbRRY+gIKk6odRhSWfVyMBdA2Ahf9cRQQYihIYyhIyhNqPH48euvH/zHfxwpoYoMqax6OZgLIGyEr3piqCDEUGKovlxCfeihChJqQCFV1LiFHHMBhI3wVU8MFYQYSgz1hWFCLQmpDz+cC6mHD4/x96mXcQsD5gIIG+GrnhgqCDGUGFptVkId4W2lvGrwssuskDq0eHGlIbUBxq1hMBdA2Ahf9cRQQYihxNAAjfrGp8YhtbHHrb4wF0DYCF/1xFBBiKHEUJnGklCPjx9/8LvNxkdS4a/Q9jAQWsJXPTFUEGIoMbTu5BKqzttKVeF0PypFDwNhI3zVE0MFIYYSQxuJ/bZSd9y01CyhElJ9Rw8DYSN81RNDBTnhxKxSlFadcGIAE0T3mikfN/c3Pq0woRJSDcjp4XEXZgLfRqhGqnEXZoJuaqHkrHpXxFBAF91rpqJxM3lbKUKqNjk9rBQnfyhfK4hTZHVBiVn1roihgC6614xf4+ZjQi0KqdYr+Xd3WyHVl19VLDk9TAylfC5iqAclZtW7IoYCuuheMzUYN/eEqvmi/a4hNRJpyJAqp4eJoZTPRQz1oMSselfEUEAX3Wsm8HEzf1uphgupgc+FjRhK+VzEUA9KzKp3RQwFdNG9ZiSPm+8JVXhIlTMXxFDK5yKGelBiVr0rYiigi+41U6fjVp5QK3rRfpkhVc5cEEMpn4sY6kGJWfWuiKGALrrXTOON2xjfVirAkCpnLoihlM9FDPWgxKx6V8RQQBfdayZU41a9hOpLSJUzF8RQyucihnpQYla9K2IooIvuNcO4WYoS6hhetH8sIVXOXBBDKZ+LGOpBiVn1roihgC661wzjNiq/3lZqpJB6xRXHJ078yZU35kLq5s3D27dndu4M6p9MDKV8LmKoByV7ByaGArroXjOM21jUIKHaIfX45Mn+htTjkydn9u1z/RQxlPK5iKEelOwdmBgK6KJ7zTBuVZJLqD69rVQ1Qurx8eMHL7tsKJks/xQxlPK5iKEelOwdmBgK6KJ7zTButefvG58ah1TndaulV6kSQyl/ixjqQcnegYmhgC661wzjJofqHKhlQi0txzl6YijlcxFDPSjZOzAxFNBF95ph3OQYeS4KCdXXt5UqOnSaP0dPDKV8LmKoByV7ByaGArroXjOMmxxjmQsfE+pgJHLpn2wPPrhQjVTEUA9K9g5MDAV00b1mGDc5qjQXFSXUwUhkaNGiL39iZ/DBhWqkIoZ6ULJ3YGIooIvuNcO4yVHLuci8+mpR+mxuPh6PD/f05H6TRjopH21W0d7cn+NtKtKlOnr9+c7xNtWUyH3PwP+ZwosY6kHJ3oGJoYAuutcM4yZHLediaMmSXAadNGm4uztz+HDRb9I4MbRXNbUV/hpvU/EBFW1Wqs3tkUo1JVQ8oZpUXrNqalYdHt883pYLuNG2osdEE4U/dyRUU0J1FqfhsfzQOi1iqAclewcmhgK66F4zjJsctZyL45MnDz30UOO/fH1HQkV7VWeXig+oznwM7SxOipF8+OsofkzngOrsVZH8I6PNamT2MVE7ehZ+gbKoqvlDG6aIoR6U7B2YGAroonvNMG5yyJmLRomh+TwXb3OLjcVHHO2YqJ8I7YhZXtGE6ki4p9X42H5onRYx1IMSs+pdEUMBXXSvGcZNDjlz0SAxNJJPfvaxSfs0eqF6VZNSqllFmnPZNFqcWZsciTDaljt13tSsIl2qI5E7AjrC5aHuR0Mr+aGNUcRQD0rMqndFDAV00b1mGDc55MxFg8TQjrL815FQTY5z64VI2pu/HLM3f41mW+EYqv2w0oOXXbn0WbjusysXK+0LUr1Oyuv/0MYoYqgHJWbVuyKGArroXjOMmxxy5qJBYminffizq/QKzpKb5e0T6IXw1+VygLM0hlpnz4vvgrK/1rqWtKnsilLnJaQ6P7QxihjqQYlZ9a6IoYAuutcM4yaHnLlokBhauCTUjoldqimRO/roDHzRNhVpUx3OizJdY6gjU1qXckaaVbT8RL/jaws3RZUdDdX8oY1RxFAPSsyqd0UMBXTRvWYYNznkzEWDxNDOLpdT25Hyl0PqUtHeQkwsvyM+7vja3NFQR8p0ee0nR5osfNs2wx/aGEUM9aDErHpXxFBAF91rhnGTQ85cNEoMHVCdxS+NZJ0Ht6/jtE6sW6fUy2Oi14FJOzJGE0q1qYjKfZ942bl15x1RpbcoVfhD672IoR6UmFXvihgK6KJ7zTBucsiZiwaJoRHnYcWuwh3o1h1FRa+RlE+Eri8Oan2Vfd+9lSwLx0F7VZNS0YTjLqX8nUYl5/3LX5F+1B/aMEUM9aDErHpXxFBAF91rhnGTQ85cNEgMtav8bZOs5Oc8Ze8aE92r7NJS6xtGukpvVxo1X1bwQ+u8iKEelJhV74oYCuiie80wbnLImYtGi6FU4EUM9aDErHpXxFBAF91rhnGTQ85cEEMpn4sY6kGJWfWuiKGALrrXDOMmh5y5IIZSPhcx1IMSs+pdEUMBXXSvGcZNDjlzQQylfC5iqAclZtW7IoYCuuheM4ybHHLmghhK+VzEUA9KzKp3RQwFdNG9Zhg3OeTMBTGU8rmIoR6UmFXvihgK6KJ7zTBucsiZC2Io5XMRQz0oMaveFTEU0EX3mmHc5JAzF8RQyucihnpQYla9K2IooIvuNcO4ySFnLoihlM9FDPWgxKx6V8RQQBfda4Zxk0POXBBDKZ+LGOpBiVn1roihgC661wzjJoecuSCGUj4XMdSDErPqXRFDAV10rxnGTQ45c0EMpXwuYqgHJWbVuyKGArroXjOMmxxy5oIYSvlcxFAPSsyqd0UMBXTRvWYYNznkzAUxlPK5iKEelJhV74oYCuiie80wbnLImQtiKOVzEUM9KDGr3hUxFNBF95ph3OSQMxfEUMrnIoZ6UGJWvStiKKCL7jXDuMkhZy6IoZTPRQz1oMSselfEUEAX3WuGcZNDzlwQQymfixjqQYlZ9a6IoYAuutcM4yaHnLkghlI+FzHUgxKz6l0RQwFddK8Zxk0OOXNBDKV8LmKoByVm1bsihgK66F4zjJsccubihBOzSlGUb3XCiUH3tFRyVr0rYiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr3piKKCL7jXDuMnBXABhI3zVE0MBXXSvGcZNDuYCCBvhq54YCuiie80wbnIwF0DYCF/1xFBAF91rhnGTg7kAwkb4qieGArroXjOMmxzMBRA2wlc9MRTQRfeaYdzkYC6AsBG+6omhgC661wzjJgdzAYSN8FVPDAV00b1mGDc5mAsgbISvemIooIvuNcO4ycFcAGEjfNUTQwFddK8Zxk0O5gIIG+GrnhgK6KJ7zTBucjAXQNgIX/XEUEAX3WuGcZODuQDCRviqJ4YCuuheM4ybHMwFEDbCVz0xFNBF95ph3ORgLoCwEb7qiaGALrrXDOMmB3MBhI3wVU8MBXTRvWYYNzmYCyBshK96Yiigi+41w7jJwVwAYSN81RNDAV10rxnGTQ7mAggb4aueGAroonvNMG5yMBdA2Ahf9cRQQBfda4Zxk4O5AMJG+KonhgK66F4zjJsczAUQNsJXPTEU0EX3mmHc5GAugLARvuqJoYAuutcM4yYHcwGEjfBVTwwFdNG9Zhg3OZgLIGyEr/pax9A/7TqkOgcoqh7rT7sO1Xi9NAZWvZz634L+BSiKqnEJf+aqdQwFAAAAssRQAAAABIIYCgAAgAAQQwEAABAAYigAAAACQAwFAABAAIihAAAACAAxFAAAAAEghgIAACAAxFAAAAAEgBgKAACAABBDAQAAEABiKAAAAAJADAUAAEAAiKEAAAAIADEUAAAAASCGAgAAIADEUAAAAASAGAoAAIAAEEMBAAAQAGIoAAAAAkAMBQAAQACIoQAAAAgAMRQAAAABIIYCAAAgAMRQAAAABIAYCgAAgAAQQwEAABAAYigAAAACQAwFAABAAIihAAAACAAxFAAAAAEghgIAACAAxFAAAAAEgBgKAACAABBDAQAAEABiKAAAAAJADAUAAEAAiKEAAAAIADEUAAAAASCGAgAAIADEUAAAAASAGAoAAIAAEEMBAAAQAGIoAAAAAkAMBQAAQACIoQAAAAgAMRQAAAABIIYCAAAgAMRQAAAABIAYCgAAgAD8/+8aBRr4/jesAAAAAElFTkSuQmCC" alt="" />
ThreadingTCPServer
ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互。
1、ThreadingTCPServer基础
使用ThreadingTCPServer:
- 创建一个继承自 SocketServer.BaseRequestHandler 的类
- 类中必须定义一个名称为 handle 的方法
- 启动ThreadingTCPServer
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import SocketServer class MyServer(SocketServer.BaseRequestHandler): def handle(self): #定义handle方法
# print self.request,self.client_address,self.server
conn = self.request #如果连接请求过来,获取client端对象
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.') #发送一个信息
Flag = True #并把Flag设置为True
while Flag:当Flag为True的时候执行
data = conn.recv(1024) #接收client端数据
if data == 'exit': #判断如果data == 'exit' 退出
Flag = False #并把Flag设置为Flase
elif data == '': #如果为 == ‘0’
conn.sendall('通过可能会被录音.balabala一大推') #发送数据
else:#上面的都没匹配上,发送请重新输入
conn.sendall('请重新输入.') if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer) #实例化对象,设置启动的IP/PORT并把自己定义的类写上作为SocketServer.ThreadingTCPServer的构造函数
server.serve_forever() #调用对象中的启动方法
Socket Server
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8009)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5) while True:
data = sk.recv(1024)
print 'receive:',data
inp = raw_input('please input:')
sk.sendall(inp)
if inp == 'exit':
break sk.close()
Socket Client
2、ThreadingTCPServer源码剖析
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABR4AAAM8CAIAAAC+iSsXAAAgAElEQVR4nOzd61sT19438OdvWkmAcAYBCRgwlIhpRQuI4qlSVCqixU1vLQVFN1Y819ubWrRUrVqrFtTdikIVKyoCFaQIQSPnAAESMvk9L9blXNNMEoJBrO7v51UyWbNmZVYC881aM/P/CAAAAAAAAAB88P/edgMAAAAAAAAA3m2I1gAAAAAAAAA+QbQGAAAAAAAA8AmiNQAAAAAAAIBPEK0BAAAAAAAAfIJoDQAAAAAAAOATRGsAAAAAAAAAnyBaAwAAAAAAAPgE0RoAAAAAAADAJ4jWAAAAAAAAAD5BtAYAAAAAAADwCaI1AAAAAAAAgE8QrQEAAAAAAAB8gmgNAAAAAAAA4BNEawAAAAAAAACfIFoDAAAAAAAA+ATRGgAAAAAAAMAniNYAAAAAAAAAPkG0BgAAAAAAAPAJojUAAAAAAACATxCtAQAAAAAAAHyCaA0AAAAAAADgE0RrAAAAAAAAAJ8gWgMAAAAAAAD4BNEaAAAAAAAAwCeI1gAAAAAAAAA+QbQGAAAAAAAA8AmiNQAAAAAAAIBPEK0BAAAAAAAAfIJoDQAAAAAAAOATRGsAAAAAAAAAnyBaAwAAAAAAAPgE0RoAAAAAAADAJ4jWAAAAAAAAAD5BtAYAAAAAAADwCaI1AAAAAAAAgE8QrQEAAAAAAAB8gmgNAAAAAAAA4BNEawAAAAAAAACfIFoDAAAAAAAA+ATRGgAAAAAAAMAniNYAAAAAAAAAPkG0BgAAAAAAAPAJojUAAAAAAACATxCtAQAAAAAAAHyCaA0AAPA+sFqtJ06cWLx4cUBAAAMAAIDpqFQqvV5//Phxq9Xq+z9iRGsAAIB3ntVqzczMfNuHKAAAAO+k5cuX+56uEa0BAADeeSdOnGCMpaamtrS02Gy2t90cAACAd8DU1NSff/65dOlSxtj//u//+lgbojUAAMA7b/HixYyxlpaWt90QAACAd0xLSwtjLCUlxcd6EK0BAADeefz8aoxXAwAAzJTNZmOM+fn5+VgPojUAAMA7j58q9rZbAQAA8E6alX+jiNYAAADvPERrAACA14ZoDQAAAESI1gAAAD5AtAYAAAAiRGsAAAAfIFoDAAAAEaI1AACADxCtAQAAgAjRGsAH7BWFQhEZGblly5b+/n7fq7VarWVlZfHx8SqVKjQ0NDMz0/c6AeANQbQGAAAAIkRrAB/wr8+ePXuKiori4uIYY7MSgz///HPGWHJy8q5du7Zu3Tp//nzf6wSANwTRGgAAAIgQrQF8wL8+VquViJ49e8YY8/f3973awMBAxlhfXx9/Oj4+7uWKDofjtTfqy7oA/80QrQEAAIAI0RrAB9Jo3drayhj7+OOPiaiuri49PT04ODggIGDFihXPnj3j5VtbWzMzM9VqdWBgYE5ODhFduXJl0aJFfn5+UVFRu3bt4lVFRUUxxoqLi/lTkcvCvA379u0LDg6uqqqqqKhgjOXm5vJVdu3axRg7ePCgN+vO3Y4DeI8gWgMAAAARojWAD6QTwqOjo5cvX97T00NEu3bt+uijj7766qt169YxxtLS0nj5+Ph4xtjmzZt37tyZnZ39888/ixO/MzIyGGNfffUVEZ0+fZrXPH/+/MrKSkEQiMhdYV5So9GUlJTU19ebTCalUhkREcHX0uv1jLFvv/3Wm3Xf1m4EeKchWgMAAAARojWAD9jfJSQk1NXVEZHFYhEEoaOj48qVK4wxpVLJg25kZCRj7Pz58zabjYg++OADxlhRUVFZWVlxcTFjLDIyktd848aNpKQkXm1xcbGHwrzMvXv3xFZlZmYyxpqbm3t7e3mw935dAJgpRGsAAAAgQrQG8IE4Idxqtf7www+MscTERCKqrq6OiIgICwvjKVecNH7t2rXo6GjGWHh4+E8//aRSqZiMWLkgCIcOHWKMBQcHE5G7wvyBxWIRVzxz5gxj7Pjx4xcvXmSMnT171vt1AWCmEK0BAACACNEawAfS2NzT08MYU6vV9Gp0+sWLF4ODg9IygiDY7fZffvmFMRYYGDh//nzGmHgmtqi1tZU/MJvNjDGVSiUIgrvC0vrFtfz8/LKysrZt2xYQEDA6Our9ugAwU4jWAAAAQIRoDeAD/vXZs2fPrl27EhMT2avrh4WHh/PHqamp0viakJBQVFS0ZcsWxlhsbOzXX3/NGNNoNF999VVJScnKlSt5tSqV6tNPP929e/dHH33EGMvOziYid4VdxuP169eHhIRotdrPPvtspusCwIwgWgMAAAARojWAD8TJ1QqFIioqaufOnXxy9aVLl+bNmxccHMxndIvxNSMjIygoKCAgID09vampyW6379+/PzY2VqlURkVF7dixg1ebk5MTERHBFxYWFprNZiJyV9hlPL58+TJffvPmzZmuCwAzgmgNAAAARIjWAAAAPkC0BgAAACJEawAAAB8gWgMAAAARojUAAIAPEK0BAACACNEaAADAB4jWAAAAQIRoDQAA4ANEawAAACBCtAYAAPABojUAAAAQIVoDAAD4ANEaAAAAiBCtAQAAfIBoDQAAAESI1gAAAD5AtAYAAAAiRGsAAAAfIFoDAAAA0atjAgAAAHhtPv4vRrQGAAB4573toxEAAIB3no//ixGtAQAA3nmzckwAAADw3wnRGgAAAIgQrQEAAHyAaA0AAABEiNYAAAA+QLQGAAAAIkRrAAAAHyBaAwAAABGiNQAAgA8QrQEAAIAI0RoAAMAHiNYAAABAhGgNAADgA0RrAAAAIEK0BgAA8AGiNQAAABAhWgMAAPgA0RoAAACIEK0B/jHGxsbedhMAYMYQrQEAAIAI0fq/TGdnZ2lp6WzVdv/+/Xv37k1bbM+ePU1NTe5eNZlMGo3GYrHwp11dXR9++OFstfAd8vz585CQEKPR6LRcEIRDhw69fPnSaaFOp5vD1gGAW4jWAAAAQOTFMcHDhw/ZKyEhIbm5uQMDA3PWPM+tslqtHpb4Uu3r1TY6Orp3716tVuvn5xceHr5z585ZaZWX2tradDrd0NCQhzIHDhwoKChw92pERESoG0qlUl7+3LlzkZGRZrNZ/pIgCCtWrBgdHSWikydPpqWliY3MzMyUljxy5MjmzZvFpxUVFV9++aW0wJvYhzPt6Lnp2YKCghMnTsiXX7lyRaPR1NbWikvsdruHr63ZbNbr9a2trbPYNgBwB9EaAAAAiLyO1jxCGI3G9PT0tWvXzlXr/ubZs2cLFy7kLfkHRuuRkZHk5OTs7Oy2trapqSmTyXT9+vU5i9aCIBgMht9++03+Eo9hEW54c0RosVh4McZYkEfS2pYtW3bt2jUislqt0dHRPBmeP3/+008/FdscERHh5+cXFBTEG0NEBoMhICBArLCpqemtR+s31LMPHjxw2ntqtVq+S3nhx48fd3Z2GgyGqFcYY+JjeeX19fV6vV4QhNduHgB4CdEaAAAAiGYYrYmorq5OqVS+lUN2aUv+gdG6sLAwMzPTac/MWbS+ceOGu3nUHkY4PQ9+iqTR2kMxp9qOHz+el5fHH1dXV/NB1Ly8vG+//VZa3mq1Wq3W8fFxxlhjY2NqaqpYg1arbWlpeevReg56VqlUupsM8uTJk59++slpoTcdl5aWVl1dPSvNAwAPEK0BAACAaObRuqamRhxJs1qtxcXF4eHhQUFBeXl5fPYvEQ0NDeXk5KjV6tjY2LKyMpcZRvrUXT3nzp3jU3CTkpKmpqaYhOdoffjw4bi4OJVKpdPpGhoaxFfPnj27cOFCPz8/vV7f3NzMVzSbzZs2bfLQWpfN4wXu3LkTGRl58OBBq9WqVqvr6uo87D15q+Tv0eUSb2zevNnlXGKa1WhdVVXloZjD4Th16pT41GQyBQUFDQ4OikvGxsZCQ0P7+vrkW+ePCwsL//Of/4jlNRpNe3s734fnzp3jfZecnPzw4UNeYA46eg561mazMcYmJiZc7tWmpqbw8PCjR49KF3rTcZWVlbm5uZ7LAIDvEK0BAACAaCbR2uFwtLe3JyUl7dmzh7/0+eefp6WlmUymoaGhzMzM7du38+Xr1q3Lysrq7+/v6+tLS0ubNlq7rMdoNCoUioaGBovFcuvWLUEQvB+13r9/f2trq9Vq3bVrV2JiovhqQUFBf3//0NDQ+vXrDQYDXzE7O3vFihV9fX3uWuuyebxAcXGx2Wzu6elpb29njMnPOvbcKvl7lC/xsh8XLFjwxx9/uHyJx7AoN8TeHx8fd3eidWhoKC/mcga40xLxlxEiys3NLSsrE58eP348JyfHqWHSx4IglJaWimOt0dHRXV1dfB/m5+f39fUNDw9nZ2cvWrSIF5iDjp6Dnh0dHZXvxqCgoI6ODl6gtbVVq9VKh7W9idYPHz6Mi4vzXAYAfIdoDQAAAEQzvIyZv7//qVOnHA4HEQ0NDSkUivb2dl7s5s2bISEhRDQwMMAYEy+hdPv2bc/R2l09JpNJqVRevHjRqSXSaC0nDdsmk+nkyZOMMbvdzsuLI6h1dXUKhUIQhGlb6655vIA4mNnS0sIYk988Sf4TgLRV8vcoX+IlPz8/+cWlOS9HrcWhabmJiYn4+Hix2PPnz6ddhWtvbw8ODu7u7iai3t7e8PBwcU+S7CRwXtVff/0VFRXF30tERITJZOL7UAyW9fX1vO/Eet5oR89Bzz59+lSr1TotDAgIMJlM4lObzdbX1+f0m4j0qbxak8nk5+cnXw4AswvRGgAAAIhmMmrd29u7du1anU7H75PU3NwsT7Y2m40vHx8fd1rdXbR2Vw8RXb16NT4+PiUlpb6+nlxFa3ej1pWVlTExMQaDYeXKld5s3UNr3TWPFxAHM4eGhhhjjx49crf3XLZK/h5dLvGGSqXq6elx+ZLv0Vrq8uXLGo3G+1XKyspSU1MtFsuKFSvE+Q7yrUsfHz9+nF8qLzg4eHBw0MN8hzno6Dno2bNnz27cuFG6hE8RF29IRkTl5eX9/f38cXd3d1BQkHyOuhNEa4C5gWgNAAAARDM819piscTFxRUXFxPRy5cvGWO9vb1O5bu7uxljXV1d/GlNTQ1fvbW1VZpF6+vr+XJ39XB2u720tJRfO9rLaP3ixQuFQsFvpCxuxV3i6urqYox1dnby5dXV1U7l3TVP3oCMjIz8/Hx3xVy2Sv4e3S2ZlkajEc9Alu9D5sWE8Glz8oULF7q7u4uLi7ds2SJdRTpv/OzZs05rTU1NZWZmRkdHr1q1ym63yxsmfzw1NfXs2TMiUiqVFovFXd/NTUfTm+/Z1NRUp9Hsvr4+f39/8enLly/VajVP2na7PS0tjX8H796929jYKG8w9+jRI0wIB5gDiNYAAABANPPLmN26dUupVPIgkZWVlZubazKZ7HZ7R0fHpUuXeBm9Xr9p06aRkRGj0ZiSksJXn5ycDA4O/u6774hocnJy3bp1YrUu6+np6bl7967NZquqqgoLC3M4HJ2dnYyx33//3Ww2e4jWT58+ZYzV19ePjIysXbvWc+IiouTk5JycHLPZbDQa9Xq9vLzL5skb0NraGhQUVFRU9Pz5c7vd3tXVdenSJc+tkr9H+RIv+zEnJ6eystLlS16OWvNrdHvYhF6v//XXX+fPn79kyRIe87wZteY3bAsJCUlJSRGvKCbfuryRk5OTjDGnc+xpzjua3nDP/vjjj3FxcXyahqi5uXn+/Pni09OnT2dnZ/PHe/bsSU1N5Q2+d+9eYmKiu+ufnTp1ymkwHADeBERrAAAAIJp5tCairVu3GgwGu90+PDycn58fFhamUqkSExN5bCaip0+fpqam+vn56XS6gwcPiqvfuHFDq9Vqtdq0tLSjR4+Ky13W093drdPp+FWX+S2RieiLL74ICAiIioryPCG8qKhIrVZrNJp9+/ZNm7ja29vF1h46dEhe3mXzXN57qa2tLScnJywsTKlUajSa8vJyz62Sv0eX79obly9fTktLc/mSl9FaEISAgIC7d+/KizkcjqamJn9///Ly8oKCgqNHj2q12jNnzrS1tTnVbLPZxLOgu7q6iouLQ0NDDxw4YLVaDx48GBgY+Omnn9bW1vLha751l/fEJqIHDx7IZyvQnHc094Z6tr6+PigoiM8Pt1qtRqNxYmLCZrOVlJSsWLFC3HpGRsaFCxeI6PTp0xqNxmQyjY2N9fT0PH78WK/Xl5SUuOzcjIyMK1euuHwJAGYRojUAAAAQzdIxgQdzdmPn/3JTU1PSOz9JeTkhnIgqKip4xJULCQnZvXu3wWDgF/RqbGzMy8uLj48PDAxUKpVKpVKlUvGSbW1tNTU1y5cvV6vVO3bsEK95RkQmk2n37t0hISGhoaEVFRUuR60bGhqio6OTkpICAwO//vrrN7vX3qo//vhDrVaLU8HNZrO4D2NiYsSZ3iaTSaVSDQ8PE1FoaKifn5+/v390dHRKSkpWVtbmzZtVKpX8VPB79+7pdDqnGfgA8CYgWgMAAAARovV75OHDh4sWLZJe+4oTBCEzM9PlKi5fssvwgWi73f7y5Ut39fBivOTjx48rKyvlN6ziJicnf/nlF54VpeeH8/PzbTZbR0dHS0sLv674e0wQhCdPnjgtnJycHBsbk54IYDKZxKn+RqNxeHjY6TSBEydOiFc+5ywWi16vf/DgwZtpOAD8DaI1AAAAECFav18sFsvU1NTbbgW8ZVNTU/JfWADgDUG0BgAAAKI3H60BAADeY4jWAAAAQIRoDQAA4ANEawAAACBCtAYAAPABojUAAAAQIVoDAAD4ANEaAAAAiBCtAQAAfIBoDQAAAESI1gAAAD5AtAYAAAAiRGsAAAAfIFoDAAAAEaI1AACADxCtAQAAgAjRGgAAwAeI1gAAAECEaA0AAOADRGsAAAAgQrQGAADwAaI1AAAAECFaAwAA+ADRGgAAAIgQrQEAAHyAaA0AAABEiNYAAAA+QLQGAAAAIkRrAAAAHyBaAwAAANGrYwIAAAB4bT7+L0a0BgAAeOe97aMRAACAd56P/4sRrQEAAN55s3JMAAAA8N8J0RoAAACIEK0BAAB8gGgNAAAARIjWAAAAPkC0BgAAACJEawAAAB8gWgMAAAARojUAAIAPEK0BAACACNEaAOAfY2xs7G03AWYM0RoAAACIEK0BwCOLxRITE9PQ0CAuaWpqSktLm5XKBUHIyspy+VJVVZX4+IcffrDZbC6LjYyMrFq1qrW11ZvNPXr0aGhoiIgsFsuDBw/kBW7cuGEymfjjgIAAcfmlS5eMRqP4tK6uTvqY1+nEYrEIgsAfW61Wh8NBROfOnfPQvOfPn4eEhEg3xAmCcOjQoZcvXzot1Ol0Hmrz4Nq1a05b2b59+717916vNiKqr69/7XXfA4jWAAAAQDTzY4KHDx8yxqxWq4cyZ86ciYqKUqvVM22MyWTS6XT8GPT1Cnh29erVjIwM8Xh3WtI3+9pv6p/GXQ9607Oz2AAuJCQkNzd3YGDgTW/Uy1ZJ3/6s7BCxkterbXR0dO/evVqt1s/PLzw8fOfOnT62ymw2L1y40Msgyn399dd+fn6LX9m2bVtOTk5UVJS4ZM+ePQ6Ho98jaYMFQSgqKuKP7Xa7u78/oaGh4uOwsDCLxSIv43A4cnJyDAaD1WotKSkJkpEW7uzsjIiIuHnzJhG1tLRERUV9//33ThXeuHFDq9U+fvyYXkVri8VSUFCg1+ufPn0qFouPj+cPxsbGFixYMDIyIm9baWnpF198wR9v2rSppqaGiKb9Y1tQUHDixAn58itXrmg0mtraWnGJh103rZMnT6ampkr/ElZXV//rX/+Sl2SMxb/CGIuLi5M+FYvxfRUQEBAbGxsbG8sY4w8UCsXrtfDdgmgNAAAARG8gWptMJqVSee3atTca0p49e7Zw4cIZbWJgYCA8PFx6fDwt8c3OzZuaG/+QaM03ZDQa09PT165d+6Y36pL0U/QPjNYjIyPJycnZ2dltbW1TU1Mmk+n69eu+t+rq1at6vd7LH5iam5s/+OADo9Go1+sHBweJ6MaNGwaD4fbt219//bVYzGKxMI9u3LghFpZmQv44SuLy5cv8JWm0DgwMnJyclDdv586dGo3GaTjXJZPJFB8fX1FRIS7p7OxMSEj46quvnHbF/fv3+YA5j4u1tbW7du1y2uFitD527Ji/v3/E3/EBYavV+sEHH3z//fdmszksLEyMo2I0PXv27IMHD5x+C1Cr1e5+IHj8+HFnZ6fBYBD3lXTXTbsHpBwOx8cff1xZWRnrRllZGS8p/e/g9MFzGa2lT4nI6deN9xWiNQAAABC9gWj96NGjOUhorxEwysrKcnJyXm8rc/Om5sY/KloTUV1dnVKp9H4qwRtqyT8wWhcWFmZmZjrtGd9b5XA4tFrt1atXvWwDnwpeXl5+5coVIurs7GxsbLTb7Rs2bLDb7a/RAHm0dirAA6pCoYiIiBgYGAgICGCMBbwiDoRu3749Pj7eaDSeOXPmt99+87BFo9Go1WrLy8udlg8ODhoMhpycHL4/09PTdRIKhUL3d5s3b05ISNBqtSqVKiEh4eLFi4mJiRMTE9I6NRqNOKX88ePHz58/P3r0qMuk6kSpVLqbvvHkyZOffvrJaaEvo9ZE1NXV5XKw/cCBA/w3FG7aUevk5OSEhASFQpGQkIBo7QtEawAAgHeeN8cEZrN506ZNarWaj2aIR/ZWq7W4uDg8PDwoKCgvL290dFSs8PUONZxyyNmzZxcuXOjn56fX65ubm6UFXmMr8fHxP//8M3987tw5Psk2KSlpamrK3XuZ0eZmVOedO3ciIyMPHjy4evXqnTt3ipXo9frKykov13XZjMOHD8fFxalUKp1OJ54f664HXS6Xb8VlY1y+ZfkSD73Mn9bU1IjH3+42NDQ0lJOT47KdYj3Sp142WNqtnqO1fK+6+4h63qsemue0261Wq1qtlp7T602rvOyU0tJS/jOTyWRKSkrycIaFzWZLT09PkGCMSR+7W9GDaaM1J45aOxwO6WnPSqWSPzh9+nR/f39HR4darZbOlHby7NmzefPmHTlypLCwUAy9RDQ5Obl69ere3t6lS5ceOXJEXC4IQkVFxdatW/39/YuLi69du+Z0mndjYyMftS4oKKiqqhodHc3Pzxd/ZZg3b57Tqde//fZbT08Pf+zuzdpsNsaYU0oXNTU1hYeHHz16VLrQx2jNjY2NlZaWih/7tra20NBQ6dx7hlFrLyBaAwAAAJF3xwTZ2dkrVqzo6+vr6+tLS0sTD7A+//zztLQ0k8k0NDSUmZm5fft28m1UzSlaFxQU9Pf3Dw0NrV+/3mAwyAt4v5WBgQHGWGdnJxEZjUaFQtHQ0GCxWG7dusVHBT2/l2k3N9M6i4uLzWZzT0/Pzz//HBUVxcs/efIkICDAbDZ7ua7Lluzfv7+1tdVqte7atSsxMZEvdNeDLpfLt+KyMfK37HIneOhlh8PR3t6elJS0Z88e/pLLDRHRunXrsrKy+vv75e10Ga29bLD3o9byveruI+p5r077xRF3e3t7O2OMfxhc7j2XrfKyU65evRoTE+Puw+yBU5wTU66XGhoa5LOd3c1/FqP14OBgRESEWIk0Zk9MTOj1+hMnTlitVmkNjDHxsSAId+7cIaJ//etf0gh9/vz55cuXE5HFYhH7vba2NjU1dd++fYIgBAQE/PXXX3v37k1KSiouLn7y5Akvs23bttDQ0K1bt/b29jocjvLy8i+//FL8ISk4OHh8fPzEiROxsbEJCQlElOBGenq62JjR0VFpm0UdHR28QGtrq1arlQ5rv3a0Pnr0aGhoKN+NNpvtiy++SEtL4yPVn3zyybFjx6SFvYzW/v7+p0+fxrnWvkC0BgAAeOdNe0zAQ6l43aPbt2/zA6yhoSGFQtHe3s6X37x5MyQkhGY1WovzEuvq6hQKhTQLzXQrLS0tjDE+GsNPnL548aL46rTvxcszzL2vUxyNnJiYCA4O5of+ZWVleXl53q/rgclkOnnyJGPMbre760F3y5224q4x8rcsX+KS9DJm/v7+p06d4qOm7jbkuZ3yaO19g+XRWk7a6dK96u4jOm1rvexc/omV34pJ/lGUtsrLTrl37x5vreee4jZu3KjRaGZx1JqIBEHgvxoMDg5u2LDB6dXJycmmpqaAgIBVq1ZdvHhRq9Xq9Xrx1cDAQP7AZrOtW7dO/F5LMcbkV+1++vTpvHnz+HatVqtWq71165b4qtlsTkxMTElJES+U/c033/AHVqv1woULH3zwwfLly//888+0tLT4+PhTp07t2rWrp6dHq9UajcbFixfzs8H9/f0FQbDZbBaLRfwVQKfTOeVqp4t7P336VKvVOjU4ICBAOsxus9n6+vqk56Wzv5+m7mmPy0h/oaiqqkpISNi7d++HH37oNETPPE4IdzgcN2/eXL9+PWNs+fLl0jo5jFp7D9EaAADgnTftMUFzczNjbHx8nD8Vj+z5cic2m20Wo7U8Nb12tOatFQ/Br169Gh8fn5KSwu8ZM+178WZzM6pTOhq5ffv2HTt2OByOBQsW/P777zNaV66ysjImJsZgMKxcuVLaU+56UL7caSvuGiN/yy6XyIkb6u3tXbt2rU6n4/3ibkOe2yn/kHjfYO9HreV71fPWPbTWy84dGhpijD169Mjd3nPZKi875Y8//mCMeRmtV65cKX5xnEZK+U9CMyUIwrZt2z799FMiMplM0kxYWVn5/Pnz4ODgzMxMtVrN59hXVlb6+/vv3buXz5znv0QQ0apVq7Zs2cK8jtZEVFRUtHnzZiLavXt3dna206vNzc3i3PjBwUGnsCoIwqNHjz788MPffvuNTwi3Wq2rVq3iV2g7duwYH+v28/MTVxGjpnx432nJ2bNnN27cKF3Cp4hL31p5eXl/fz9/3N3dHRQU5M2vbO44xeDt27czxuSnmezfv1987PQF2b9///j4eFRUVG5urr+/v9VqlUfrtra2127hO4R/i32sBNEaAADgnTftMUFXVxd7NZWaiKqrq/kB1suXLxljvch6gA8AACAASURBVL29TuX/mdGat7arq0tcYrfbS0tL+UTTad+Ll5ubUZ3ikoaGhnnz5t27d0+r1fIj+9fety9evFAoFE1NTURUX1/PC7vrQXfLnbbirjHyt+xuiYd3YbFY4uLiiouLPWyou7tb2nc1NTV89dbWVmkWFd+v9w32Mlq73KvuPqLT7lXvOzcjIyM/P99dMZet8rJTqqur582b53L/yK1bt44PtMbFxfE/F9LRV6VSKb3q1bRsNtuWLVs+/vhjfg0tMVrbbLYdO3YkJCQ8f/6cn7csTgj/5ptv9u3bt3nz5lWrVhFRcHAwEY2Pj1+/fl0QhBlF6/Hx8cWLF69evXrBggXya4ZJL5EdGhrKGAsLC5MuXLZsGZ9SzqN1VVWVn59fSkoKv8hZcHBwa2ur9MLm3kfr1NRUp5kFfX19/v7+4tOXL1+q1Wr+Tu12e1paGv/W3L17t7Gx0d3e9kBs2/Pnz3NyctLS0h4+fGgwGDZv3uzyPmcki9by2uTRWhCEH3/88a1cpHAuIVoDAAAAkXfHBMnJyTk5OWazmd+DRzzAysrKys3NNZlMdru9o6Pj0qVLNFfRurOzkzH2+++/ex7ClZo/fz6/KnJPT8/du3dtNltVVVVYWBhPs57fy7Rv6jXqFNd1OBzx8fEZGRnSE0Ffb98+ffqUMVZfXz8yMrJ27VqxsLsedLlcvhWXjZG/ZZc7Qc6p/lu3bimVSh4RXW6IiPR6/aZNm0ZGRoxGY0pKCl99cnIyODj4u+++I6LJyUk+N9jDJ1PePOmnyEO0drlXPZzpPe1e9bJzW1tbg4KCioqKeNrs6uq6dOmS51Z52SllZWXr1q1z9ylyyWKxrFmzJicnR/rnQhAElUrl/Zfd4XCsWrUqJydHHNXn0bqhoUGv169du1aah3lGFQQhKSmJz4vm5zNHRERYLJbIyEge2GYUrScnJwsLCxljq1atevHihYemrlq1auvWrXq93uVVu3m0HhkZaWtrM5vNvCX19fWtra3iSezSUVylUhn/d9Jo/eOPP8bFxTnNxG5ubp4/f7749PTp0+Iw+549e1JTU/luv3fvnvwq5Zzdbj937pzLl3jbxsfHCwsLY2NjKysr+VuYmJjIy8vT6/W8cqc7crFXZ1CLxK53F62fP38eFBTk4Tp57wdEawAAACDy7pigvb09NTXVz89Pp9MdOnRIDADDw8P5+flhYWEqlSoxMZGHnLmJ1kT0xRdfBAQEeH+G4e7du3Nzc4mou7tbp9Px6yqLFxb2/F6k2+3r6wsICHA6CfY16pSuXl5erlQqpedVvva+LSoqUqvVGo1m3759YmF3PehyuXwrLhsjf8vyJS73lbz+rVu3GgwGu93uckNE9PTpU7GdBw8eFFe/ceOGVqvVarVpaWlHjx71/Ml02Ufip8jzhHD5XvUQrafdq953bltbW05OTlhYmFKp1Gg05eXlnlvlTacQkU6n42OkJpNJp9NNm3x4fissLJycnOR/LngSa2xs5AGYeeHx48f8HYljmBMTE5cvX87IyNBqteLV+0VhYWFEVFlZuWXLFulyg8Fw5syZDz/8kD+VRmuLxSIIQk9PD2NMvCw8NzAwcOLEiZiYmE2bNnV3d+/YsUOtVm/duvXOnTtOY6o8fq9bt87hcFRUVMTFxV27ds1pF4n3tRYr5z1y8eLFpUuXElFfX19qampWVlZ5efno6Kh8Yr+4pL6+PigoiM/Vt1qtRqNxYmLCZrOVlJSsWLFCLJ+RkXHhwgUiOn36NL+/19jYWE9Pz+PHj/V6fUlJibzXmpqaNBqNfPnQ0FBaWpper//3v/999epVefYWLwTgxMMfHx6qQ0NDu7u7pctPnTqVmZnpcpX3CaI1AAAAEM3SMcE74eXLl2FhYc+ePfOxnsuXL/OIDtN6E/vKl99ugIiuX7+u0+nc3RrNye3bt/mE8GvXrpHkXOtFixap1eqQkJDjx48T0YgXBEEQBKG7u7u2tvbIkSOrV68ODQ1dt25ddXW10/2xTSbT4ODg/Pnz+U2nnC6GX1FRwRj73//9X/5UGq35qdeMsbVr14rl//Of/2RmZvr7+69fv/7+/fvi8s7OzsLCwsDAwMjIyOvXr09OTt65c2ffvn2xsbE7duwQP2D37t1bsmSJVqstKSm5dOkST+xO0XrZsmWMMYVCERMTw3+/qKysPH78uCAIhw8fTkxMjImJiY6Ojo2NjY+Pj42NjYyMDAkJ0ev1f/zxh1qtFqeCm81mlUrF30JMTIw409tkMqlUquHhYSIKDQ318/Pz9/ePjo5OSUnJysravHmzSqWSp/eTJ0/ySePy5eXl5VartaysLCEhITY2Ni4uLjExMTk5WafTxcXFRUVFbdiwYdeuXRF/xxiLkOnu7h4YGIiOjiai0tJStVod+kpwcLBWqxUvC/ceQ7QGAAAAojmM1t6Ma73pmi9durRixQofT/wrLCy8fv26LzXMltnagW/Om9hXiNa+GBkZSUpK4tPvvXH16tWamhox+gqC4Ms1n81m8+LFi3NycsrLy2/evOnunF6DwRASElJeXl5XV3f69Gl5gZcvX4qPGxoaxG/01NTU+Pi402fjxYsXFRUV0ikhUqOjo5cuXZqamrJYLKtXr96/f794nrxUc3PzwYMHd+zYwbflFK2JyG63S2d0u/zlwmazjY+Pj4+PT0xMTE5O2mw2QRDEe3qJJicnx8bGpOPkJpOJ3+6eiIxG4/DwsNMo+okTJ8SL0otyc3PFu51Lyb87giBYrdbx8XHLK06z0z1YuHChWq0Wr6b+3wnRGgAAAIj+m0at4f2AaP3f470/RxfeD4jWAAAAQIRoDQAA4ANEawAAACBCtH5/OV2dqKWl5W21BOaG0+XiAGBuIFoDAAAAEaL1+yI3N1eapXt6eqKjo6VXh5LfF4eIvvnmG+mZpefOnTt//ryHrXR2dpaWls5Ge4mI7t+/780ljvbs2ePh3GCTyaTRaMSzdru6usRrR/9Xef78eUhIiNFodFouCMKhQ4ekJyfzhTqdbg5bB/A+Q7QGAAAAIi+OCfiprYwxpVK5bNkyl9f4eQ1itYyxkJCQ3Nxcl/ePnWOe78Dke7U+1hYcHCxeepeI0tPT9Xq9Xq/fv39/bGzsli1bxGspnz59urS0tLS0NOEVhUKRIEFE7e3tCxYsEAP5ixcvkpOTk5OTPXTEgQMHCgoK3L0aERER6ob0Lr6ic+fORUZGurwzuSAIK1as4FdjPnnyZFpaGl/e1tbmdC+fI0eObN68WXxaUVHx5ZdfSgu8iXOzZ9qho6Oje/fu1Wq1fn5+4eHhO3fufBOtKigoOHHihHz5lStXNBqNeOctklzoGwB8h2gNAAAARF5Ha6vVarVaz58/z+/a6jtptDAajenp6dL75cylZ8+eLVy4kLfkHx6t9Xo9uRlynD9/fnV19dGjR/nTZcuWOd2cVj5q/cknn/z2229//vnnwMDA1NRUenr67du3b9y4kZqaKr0nMI9h8pvuiPfjmbbZFouFF2OMBXkkrW3ZsmX8hk9WqzU6Oponw/Pnz3/66ae8gCAIERERfn5+QUFBvDFEZDAYAgICxAqbmpreerQeGRlJTk7Ozs5ua2ubmpoymUzXr1/3vVUPHjxw2ntqtVq+S3nhx48fd3Z2GgyGqFcYY+Lj124DABCiNQAAAHDeR2v+dMGCBT7evMpltXV1dUqlclZq9qUl70S01ul08mgtnf795MmT8PBw/lj3ikKh4A9SU1OJqKampqCgwGKxaDSa+/fvb9u2bf/+/XyVkydP6vV6cWqxhxFOLwc/pdHaQzGn2o4fP56Xl8cfV1dX83sL5eXlffvtt9Ly/Eef8fFxxlhjYyN/d5xWq21paXnr0bqwsDAzM9Ppsz27rVIqle7mGjx58uSnn35yWohRa4BZhGgNAAAARDOM1oIgzJ8/X3zp8OHDcXFxKpVKp9OJN1A9d+4cn/ialJTEb+5qtVqLi4vDw8ODgoLy8vL4iKhTtKipqRFH2FyWJ6KhoaGcnBy1Wh0bG1tWVuYy20ifuqvHqYVMwnO0lr9f/urZs2cXLlzo5+en1+ubm5v5imazedOmTR5a62G33LlzJzIy8uDBg059IY3WBw4c0EuoVCr+gIjy8vL4EC4RhYaGOlXCl+j1ep1OFx8fX1BQ8K9//WvLli3SGx1VVVWFh4f39vbSrEbrqqoqD8UcDsepU6fEpyaTKSgoaHBwUFwyNjYWGhra19cn3zp/XFhY+J///Ecsr9Fo2tvb+S49d+4c76Pk5OSHDx/yAnPQoVarVa1W19XVOb1Zz58rcvU9ki/hbDYbY8zpqnWipqam8PBwcTqDfNcBgI8QrQEAAIBoJtF6YmKivLx82bJl4kv79+9vbW21Wq27du1KTEwkIqPRqFAoGhoaLBbLrVu3+Ejd559/npaWZjKZhoaGMjMzt2/fLq3W4XC0t7cnJSXt2bOHV+uyPBGtW7cuKyurv7+/r68vLS1t2mjtsh55C70ftZa/X/5qQUFBf3//0NDQ+vXrDQYDXzE7O3vFihV9fX3uWuthtxQXF5vNZvHEaRFPzklJSdJR69WrVxNRTEyM2ODFixeL0VqpVOr/jkfrycnJ7u5ujUYzPDxcXV19+PDh+L8TL3zFY1iUG+KHZ3x83N2J1qGhobyYyxngTkukc9Fzc3PLysrEp8ePH8/JyRGfyqO1IAilpaXV1dV8YXR0dFdXF9+l+fn5fX19w8PD2dnZixYtcvcBnvUObW9vZ4zJzyf3/LmSf0pdfrO40dFR+W4MCgrq6OjgBVpbW7VarXRYG9EaYBYhWgMAAADRTC5jxhjz8/M7cODA5OSktIDJZDp58iRjzG63m0wmpVJ58eJF8dWhoSGFQiGe93vz5s2QkBCnav39/U+dOsVHTd2VHxgYYIzxWcFEdPv2bc/R2l098hbKo7WcNGxL3y8vL46s1tXVKRQKQRCmba3n3SIf5OR4tOYDzkSUnJxMRPHx8UQUFxfH49bFixcbGhqmHbUmojVr1ogp1AMvR63FoWm5iYkJ3khe7Pnz59OuwrW3twcHB3d3dxNRb29veHi49ARyp5PAeVV//fVXVFQUn80eERFhMpn4LhWDZX19Pe8jsZ432qEtLS2MMfltseQ/4nj+HsmXiJ4+farVap0WBgQEmEwm8anNZuvr63P6TUT61EMvAIBniNYAAABANJNRa4fD0dPTs2nTpqysLP5SZWVlTEyMwWBYuXKlmBOuXr0aHx+fkpJSX19PRM3NzfKkarPZxGp7e3vXrl2r0+n4/ZPclefLx8fHnVrlLlq7q0feQu9HreXv1/PWPbTW825xedFsItLr9ePj42lpaTxa8wt983nLWq2Wr8V/oZh21PrkyZOxsbFHjhwpKSl58eIFnxwuJW7U92gtdfnyZY1G4/0qZWVlqampFotlxYoV4rwG+dalj48fP84viRccHDw4OOhhXsMcdOjQ0BBj7NGjR07vy3MzSPYpdbmEO3v27MaNG6VL+BRx8YZkRFReXt7f388fd3d3BwUFufv5BgBmin/ffawE0RoAAOCdN+0xgVPYaGho4ON4L168UCgU/IbD9fX10jJ2u720tJSnu5cvXzLG+Fm77qq1WCxxcXHFxcUeynd3dzPGurq6+NOamhq+emtrqzSLii1xV4+8hV5Ga5fv110S6+rqYoyJNyqrrq52Ku/NbpHT6/VtbW2fffaZNFrzGLx+/fq//vpLLDntqPWNGzeOHTt28eLF+vp6q9XqdP1w6VMvJ4RPm5MvXLjQ3d1dXFy8ZcsW6SrSeeNnz551WmtqaiozMzM6OnrVqlXS23ST+2g9NTX17NkzIlIqlRaLxV0fzU2HElFGRkZ+fr7TQs/NEN+U+Cl1t4SIUlNTnUaz+/r6/P39xacvX75Uq9U8advt9rS0NP5du3v3bmNjo7zBADAjiNYAAABANMNRa6PRmJ2dnZ6eTkRPnz5ljNXX14+MjKxdu5aX6enpuXv3rs1mq6qqCgsL4yOoWVlZubm5JpPJbrd3dHRcunSJZBny1q1bSqWSBwyX5YlIr9dv2rRpZGTEaDSmpKTw1ScnJ4ODg7/77jsimpycXLdunVity3rkLezs7GSM/f7772az2UO0dvl+PYyIJicn5+TkmM1mo9Go1+vl5b3ZLU7u3btXUVHx0UcftbS00N+j9e7du2/fvv3DDz94OWotmpiYGBsbmzZau2yP9CV+jW53nyLefb/++uv8+fOXLFnCY543o9b8xmwhISEpKSniFcXkW5c3cnJykjHmdC49zXmHElFra2tQUFBRUdHz58/tdntXV9elS5c8N0P+KXX5zSKiH3/8MS4ujk/HEDU3N0svN3j69Ons7Gz+eM+ePampqbzB9+7dS0xMdHf9MwDwEqI1AAAAEM3wXOvw8PD8/HzxtNWioiK1Wq3RaPbt28cjQXd3t06n49c65jciJqLh4eH8/PywsDCVSpWYmMhjsDxDbt261WAw2O12l+WJ6OnTp6mpqX5+fjqd7uDBg+LqN27c0Gq1Wq02LS3t6NGj4nKX9bhs4RdffBEQEBAVFeV5Qrj8/XpIYu3t7WJrDx06JC/v5W6RGh8fX7BgwRdffFFeXk6vorVGo7l79255efm3336blJTES047al1TU/PVV1+lpqZGRUXduXPH92gtCEJAQMDdu3flxRwOR1NTk7+/f3l5eUFBwdGjR7Va7ZkzZ9ra2pxqttls4lnQXV1dxcXFoaGhBw4csFqtBw8eDAwM/PTTT2tra/nwNd+6y3tiE9GDBw/ksxJozjuUa2try8nJCQsLUyqVGo2mvLzcczPkn1KXn9v6+vqgoCA+P9xqtRqNxomJCZvNVlJSsmLFCnHrGRkZFy5cIKLTp09rNBqTyTQ2NtbT0/P48WO9Xl9SUuKycwHAS4jWAAAAQDRLxwRz703crPgfbmpqatOmTXv27BEEobi4+LvvvlOr1R988AG/7daVK1fWrFmzePFiXjgiIuL//u//EhISlEplwt/xJd99911VVdXTp0/5+GdAQID0RGvpR8LLCeFEVFFRwSOuXEhIyO7duw0GA7+gV2NjY15eXnx8fGBgoFKpVCqVKpWKl2xra6upqVm+fLlard6xY4d4zTMiMplMu3fvDgkJCQ0NraiocDlq3dDQEB0dnZSUFBgY+PXXX7/5bnlr/vjjD7VaLU4FN5vN4j6MiYkRZ3qbTCaVSjU8PExEoaGhfn5+/v7+0dHRKSkpWVlZmzdvVqlU8lPBAcB7iNYAAABAhGj97mhpaSksLBQHdS9fvnz+/PmWlhZxJ+Tl5YkjkN5c+lvq0KFD0qdHjhwRHwuCkJmZ6XItly/ZZXib7Xa7eEMveT28GC/5+PHjyspKd9dym5yc/OWXX3hWFO9QTUT8PHybzdbR0dHS0sKvK/4eEwThyZMnTgsnJyfHxsaktyg3mUyVlZX8sdFoHB4elr5KRCdOnBCvfA4ArwHRGgAAAIgQrQEAAHyAaA0AAABE72y0BgAA+CdAtAYAAAAiRGsAAAAfIFoDAAAAEaI1AACADxCtAQAAgAjRGgAAwAeI1gAAAECEaA0AAOADRGsAAAAgQrQGAADwAaI1AAAAECFaAwAA+ADRGgAAAIgQrQEAAHyAaA0AAABEiNYAAAA+QLQGAAAAIkRrAAAAHyBaAwAAABGiNQAAgA8QrQEAAIAI0RoAAMAHiNYAAABAhGgNAADgA0RrAAAAIEK0BgAA8AGiNQAAABAhWgMAAPgA0RoAAACIEK0BAAB8gGgNAAAARIjWAAAAPkC0BgAAACJEa/g7u93+tpsAAP9ot27dwh8KKURrAAAAIEK09o3FYomJiWloaBCXNDU1paWlzUrlgiBkZWX5WMnZs2f5g6VLl05OTk5bnjFmMpl83Ci8x3p7ewcGBma61tGjRy0Wy5tojzuCIJjNZqPR+Pjx49ra2vPnzx8+fHjHjh1Ozejs7KyqqprLhr11165dEx9brdaff/6ZiBwOh/c1MMZGRkZmv2XvLERrAAAAIPpnR+szZ85ERUWp1eq33RC3vv76az8/v8WvbNu2LScnJyoqSlyyZ88eIhodHe33SKxQEISioiL+2G63+9g1Dx48WLNmDX/MGPMm27iM1syVhw8fMsasVqsvLfRM3ITJZNLpdDM6+pfWkJGRIX/JYDBMW7n4Zl+n9a7qkeIvjY6O7t27V6vV+vn5hYeH79y5k7eZMaZQKCIjI7dv3242m3nhZ8+e5eTkhIaGKpVKjUbT3t7uY8New8WLFzUaTVNTk/jWQl9xt6P+/PNPrVb7Gt3nxN/ff6krsbGxYhmr1RoeHh4QEKBQKIKDgzUaTUpKysqVKzdv3lxcXHz06NHu7m5pnaWlpRs3bnS5ObEjlErlsmXLOjs7fWy/6O32o1KpFB+PjY0FBAR0dnYuWbKktbWVL/z99995h6pUqoCAALF/iWhoaIgQrWUQrQEAAIDoHxytTSaTUqm8du3aGw1vvmhubv7ggw+MRqNerx8cHCSiGzduGAyG27dvf/3119KS+fn5LsOVPLlJ4zR/HCVx+fLlGbUwPz9fPDKWRqDQ0NCoqChe5qeffgqQYIwF/J1Ym1OWnsto7WMNjLE///xTuryhoYEv91z57L5HeW0jIyPJycnZ2dltbW1TU1Mmk+n69etiMUEQOjo6li1btn79eiKyWq2xsbHFxcUvX7602+1tbW0vXryYlYbNVE1NzeLFi6empqxWqzSnSR8/fPhQ/LAplcrg4OBQV2a0XX9//zRXnKI1Y2xsbEwQBHf1SNvm9L2QEjvCarWeP39+6dKlM2qtO2+9H6XdJAgCf/rw4cOEhARpS4xGY2xsrNFoNBqNHR0d9GrfEqK1DKI1AAAAEP2Do/WjR4/edHLzUWFhIZ8KXl5efuXKFSLq7OxsbGy02+0bNmx4vXMR5dH6tZvX1dWl0+nEgMF8GLXm3tForVAoEhMTCwsLpcs3bNig0+neerQuLCzMzMx0CoFOxW7fvq1SqQRBaG1tZYwNDw/PSmNeG58Nztt87dq1RYsWiS/5+/tLp2Bw9+/fT0lJmZV9KI3Q7paL8c8bFy9e5D9bEJEgCPX19dJXnTpiwYIFHuK6995iP6anp8fGxjLGYmNjxZ2mVqutVmt/f39DQ8Mvv/zCx6UtFsuSJUt+/fVXImpqauI9iGjtDqI1AAAAEHl3THDu3Dk+YTUpKWlqaoqIrFZrcXFxeHh4UFBQXl7e6OgovToSvXPnTmRk5MGDB1evXr1z506xEr1eX1lZ6W5ddw0Tm2ez2fbv3x8XF+fn5xcXF3fkyBF+mOu0UXf1z6gx8jpdstls6enpCRKMMelj73rgb2YxWm/ZsuXMmTPi0zcUrc+dO7dw4UI/P7/k5OSHDx+S1z1CRIcPH46Li1OpVDqdTjxf3Ww2b9q0Sa1Wx8bGlpWV8S2Km+YPzp49yzeq1+ubm5v5ikNDQzk5OWq1WqPR7Nu3T1r+2LFjarVanFbd09OjVCqPHj3qVPn3338fFRU1Pj5ORDU1NTExMXV1ddNu13tOO9BqtarV6rq6Os/Fbty4ERISQkSjo6PBwcGFhYW8hVKz/n109xWYmJhYsGDB8ePHiai2tjYsLOz69eviqzt27IiIiAgNDb1w4QJf8uLFi/nz54eGhsbKvEZM9XJCOGMsyCO+A00mk0ajEeeHWywWp6+btCMEQZg/f774ksuPrpd/J996P/Jh6hs3bmzdujUzM1OpVIaGhup0ulWrVhUWFhqNRiJavnx5TEzMhg0bli9frtfrw8PDDx8+jGjtDqI1AAAAEHlxTGA0GhUKRUNDg8ViuXXrFj8g/vzzz9PS0kwm09DQUGZm5vbt2+nVYVxxcbHZbO7p6fn555+joqJ4+SdPngQEBPBs43JdOaeAUVBQsHjx4idPnkxNTT148ECj0ZSXl8s36q7+GTVGXqc3nJKwdNYlEQ25NzExQUQNDQ2e8wDnZWOIqKurS5pe3lC0zs/P7+vrGx4ezs7O5gOYXvYIEe3fv7+1tdVqte7atSsxMZEvzM7OXrFiRV9fX19fX1pamstoXVBQ0N/fPzQ0tH79eoPBwFf85JNPsrKy+vv7+/r6Pv74Y2n5wcHBsLAwHgiJqLS01GAwONVptVodDkdaWtqxY8dsNltCQsKvv/7qzXa957QD29vbGWNi4JcXEwTh8ePHer3+3//+N3/pt99+i4iImDdv3rFjx6TBbNa/jx6+Aj09PQsXLqyoqGhqauJXwHLHaDQmJSW5/PPCGJvRtI6PPvroo48+ioqK+sgVvvzEiRNEZLVaFQrFtBUKgrBy5Urp7wIeovXExER5efmyZcvEl+QfXe//TtLb7kf+p6mlpaW6uvrRo0cBAQH8NPiOjg7xfPJ79+5VV1f/8ccf+fn5Vqt1ZGSkpKQE0dodRGsAAAAg8uKYgJ/zfPHiRXHJ0NCQQqEQL71z8+ZNPqrGD+PEUbiJiYng4OA7d+4QUVlZWV5enod15aQ5hK/16NEj8dXz58/zs4WdNuqu/hk1xqlODzZu3KjRaLwZtWbuOQ2M8ysbE9Hg4OCGDRumbYNLHR0d4imjKpUqNDQ0KChIfCz6/vvvnaI7YywwMNBlnncZrcWLRdfX1ysUCkEQvOwRkclkOnnyJM9aAwMDjDHxckq3b992Ga35me1EVFdXxzc6ODgoXfHWrVtOK+7bty8uLk4QhPHx8bCwsMuXL8ujNRE9ffo0KiqqvLx869at0rfsbrsz6hSnHdjS0sIYGxsbc1mMMaZUKrVa7fHjx6UbMpvN5eXl4eHh8fHxbW1tHvawL99Hz1+BgYEB/jMNH6OOfyUkJET8seD+/fv86gCMsXiZmUZrIkpISHD52InFYvH395+2Nj5ngYi2bdsW8QpjTHxMko5gjPn5+R04cMDpGvvSj673fye5t9WPU1NTvJ27ivotVwAAIABJREFUd+/mXaDRaIaHh0dGRhYuXPjTTz9J36DTz4WI1u4gWgMAAACRd8cEV69ejY+PT0lJ4eciNjc3y/OhzWbjh3HSUbjt27fv2LHD4XAsWLDg999/97CufKPSHMLXkg663r9/nzEmBjlxox7q974x8jfizsqVK8VWOR2G8mPfmRIEYdu2bZ9++ikRmUwm8WJjRFRZWfka52dOTU2pVCoxxiiVSndj1x0dHcHBwTydugyNns+1dkqh3vRIZWVlTEyMwWBYuXIlX5cXFsfx5OnX3UanXXFgYCAgIOD69evff/99fHy83W53V2dubi5jjF+3adrtzqgvnNYaGhpijEl/MPK+8tHR0bVr1+r1eg972Jfvo+evQGNjI/+ctLa2ildfdzgcKSkp/CcJXqaiooKI2GyMWhNRQkKCOAM8PDzcZrMFBgZ++OGHS5cu1ev14iSR/v7+8PBwvokIGd6YxsbGRYsWOTXMw6i1w+Ho6enZtGmTeDM8+UeXvP47Kd3EXPajIAhLliwJDg5mjO3cubOqqop3werVq2tra5csWXLo0CFxE/LLvOl0OkRrd/gO97ESRGsAAIB3npfHBHa7vbS0lA/mvHz5kjHW29vrVEYeCRoaGubNm3fv3j3x1jvu1pWT1tbX18cYk57dyu8AJN+oh/q9b4z3wWndunV8jDouLo7vSemp10qlUhzn9IbNZtuyZcvHH3/MD1vFaG2z2Xbs2JGQkPD8+XPva+MePXqUnJwsPpVGa+nEb0EQPv74Y3HK9IYNG86dO+dU1Yyi9bQ98uLFC4VCwe/hVF9fz1fp6upijImzUqurq5l30dppxdraWnn5//mf/1m1atUHH3zAz011WWdra6tGoyktLf3ss888vKlZidZElJGRkZ+fP20xl+7evctHzt/E99FzGzZs2MBjMxGtWbPm6tWrRHTy5EmdTicfhHf554XNxqj1zp07+TXz9+/fL861bm5u1ul0Ljch/vj166+/3rlzh3kdrfnThoYGvsNdfnTFTUz7d9LJXPYjn8TudK7KwYMHAwMD+XR6Jxi19hKiNQAAABB5cUzQ09Nz9+5dm81WVVUVFhbGj+SysrJyc3NNJpPdbu/o6Lh06RK5OgR0OBzx8fEZGRlHjhwRF7pcV86ptk2bNn344YdtbW12u/3Ro0fx8fFOAWna+r1vzEyDk8ViWbNmTU5OjnRPCoKgUqm8r8ThcKxatSonJ0cceuXRuqGhQa/Xr127ll+514ndbj937hw/W9uljRs3ioGZJNGaHyWLVxQ7cODAqlWrxMHq1tbWkJAQ8fpM3OtFa3Kzk58+fcoYq6+vHxkZWbt2rbhKcnJyTk6O2WzmdzXzMloTkV6v5yuaTCb5SdpE9OzZM6VSGR4ezvewvM6pqamUlJSzZ89aLJZ58+bJz7WeNlp77g75Wq2trUFBQUVFRc+fP7fb7V1dXZcuXXJX+ZMnT7755pvu7m5BEHp7ez/77LOVK1d62MO+fB89fAUmJiaCgoLEX3l6enri4+MPHToUHx/Pr4DlxOn3JvF0CZfR2sMOdBq1JiKj0ajT6WpraxcsWCD+hlVVVcXvU+0hWosNk77qedTaaDRmZ2enp6eTm4+u938n33o/itHa4XD8+OOP8+bNE08jr6+vF8+qkO8xRGt3EK0BAACAyItjgu7ubp1Ox6+FW1tbyxcODw/n5+eHhYWpVKrExMTvvvuO3BzGlZeXK5VK6QCpy3XlnGqbmJgoKSmJjo7mLfn+++9dFvNcv5eNmVG0vnfvHr+30+TkJN+TPKA2Njby2/ZOTU15uIaZiIja2trEcDsxMXH58uWMjAytVuvhYlFNTU189F5uYGBg8+bN6enp0jmoAQEB/O23tLSIZwtXV1fHxcWJ4cRqtY6Ojh47dmzevHnSffXa0dpdjxQVFTld0JuI2tvbU1NT/fz8dDrdoUOHvI/WHR0dS5cu5ddnPnz4MJOcLyCd7M2vfueyweXl5Xq9nu+TyspKjUbDXvEyWnvoDndrtbW15eTkhIWFKZVKfnE+d5WbTKYVK1aEh4crlcqYmJgvvvhCPEFg1r+PHr4C1dXVS5Yska6enZ3NGCsqKnIZiV3+eXEXrT3swISEhGfPnjU0NFy8eDEiIqKwsPDFixelpaWMsZMnT4rF0tLSeKqcrWjNhYeH5+fni1cWkH90vf87+db7kUfra9euGQyG1NTU1tbWpUuX8hMTdu7c+cMPP/T29jY2NtbW1l68eJExduTIkd27d5eVlRGR1WodGxtjkpMvgBCtAQAAgJuVY4L/Trdv3+YTwq9du0aSA/dFixap1eqQkBA+XMynjE5LEITu7u7a2tojR46sXr06NDR03bp11dXVnufNnjx5sri4WL78/v37wcHBRUVFThde4rfnCQ0NjYqK4tedbm1tVSgUarU6PDw8MjJSo9HodLqPPvooPT09JSVl2bJl/DZC75YrV67ExcXN/Xbddcf7ZOPGjceOHXM4HI8ePfryyy/Dw8NLSko6Ojo2bNgQFha2bdu2CxcuiBGU/p5g+/v7jUbjnTt3xKtSO3G3A/Py8pYtW7Zly5by8vLz58/Pnz//2rVrn3zyyfLly2/evJmRkZGenv7777//9ttvWq2W/5bEXt29WcopWg8ODsrLiGZzr/0z9Pf39/T0qFQqIjp06FB1dTXvhV9//VWr1ba1tRkMhtbW1ps3b27ZsmX//v0//vjj3bt3nz17Jv4ZWb9+PWMsLS3tbb6Nfx5EawAAACD6x0RredR82y2a3tWrV2tqasToKwjCjG6O5cRsNi9evDgnJ6e8vPzmzZve3CiLiHJzc52mbXMOh8PdPbTkmpqaBgYG5Bl+cnKS37bHy3rerh9++IFPq25padHpdNK5snPGXXe8T/bu3dvR0WE2mz/++OOysrIXL16IL3V2dh48eDA7O1t6s3rpd/nMmTNJSUmLFy/+9ttvXVbu5Q4sKSkxGo2//PKLmM9bWlo6OzuNRiO/hBgRrVmzxulqfIIgrFmzRnzq4TLj76vdu3dHRUV9/vnn8pcqKyvDwsKWL1/u8icP0dTUFMar5RCtAQAAgOgfE60BfLRly5bIyEiVSqXVao8dOzbTO2MBALweRGsAAAAgQrQGAADwAaI1AAAAECFaAwAA+ADRGgAAAIgQrQEAAHyAaA0AAABEiNYAAAA+QLQGAAAAIkRrAAAAHyBaAwAAABGiNQAAgA8QrQEAAIAI0RoAAMAHiNYAAABAhGgNAPD/2bv3vyauxP/j/9MkwUTuyi3SiKFGxJa21GK1la+WVj9etuqDrtYPKu5SS7Xata6f1rVuta1aZfGyW2+oaFERWG9FCTYICCgICUnO94fzcB7TTBIiITU2r+dPyWTm5MyZyXDenLkAUSBaAwAAIYjWAABEgWgNAACEIFoDABAFojUAABCCaA0AQBSI1gAAQAiiNQAAUSBaAwAAIYjWAABEgWgNAACEIFoDABAFojUAABCCaA0AQBSI1gAAQAiiNQAAUSBaAwAAIYjWAABEgWgNAACEIFojwZw5c8br9T7vWgD4nQwODsb6K4jWAABACKI1whoaGsrJyWlsbFSnNDc3l5aWTkjhPp9v/vz5z7TI8ePH1ddut/vHH38UQvj9/shLUBTl0aNHz/Sl2Ldvn/r6n//8p8fjCTrbo0ePFixY0NbW9nvVSwghXC6X1WodGhqSb+/duzdnzpzfswKIZ/fv309NTXU6nQHTfT7ftm3burq6Aiba7fZxfAvRGgAACDGuPsHVq1cVRXG73RNYDbXMWBT+wgnVCONrnDBL1dXVvfHGGwUFBaHi0JYtW5KSkmY/9eGHH1ZUVGRlZalTNm/eLJ7uRWGoBfp8vvXr18vXXq/3Wfc9o9Govh4cHDSbze3t7a+++qpa//Pnz6elpaWlpZlMJrPZnPaUEKKvr0/EQbT+9ttvs7KyLBbLc6zDs5INKKWnp6s5Vsvv91dUVBQXF7vd7g0bNiTrqHMqipL/lKIo06ZN076VX6dlsViMRmPAxOvXr8vStm/fvmzZMrXw3bt3f/zxx+FXhyNYrMXPEUwIsXr16l27dumnHz161Gq1nj59Wp0yjiOSRLQGAABCEK0nwt27d2fMmDGBdf59Oqa9vb0ZGRm3b9+uq6tzOBw+ny9ghpaWlpdfftnpdDocjocPHwohTp48WVxcfPbs2S1btmjnVBSlv7/f6/UODQ0ZDAbZQ33y5InX6+3v79fuYNrOq3ydpXHkyJHw66KN1j6fT769evXq9OnTf/31V/Ujp9OZl5fndDqdTuedO3eEEG63W37v843WLpfLaDQeP378xdrDtdF68uTJIyMj+nnWrVtntVoDhgGD0u4PAXtm0GPR8uXL//a3v+mn+3y+zMzMpKSk5OTkzMzMzMxMIURxcbHZbFbzfHNzs35BjmAB/khHsCtXrgT8T8disYT6R8/169fb29uLi4vVQ5D2iBR5DYnWAABACKL1RJjwOv8+HdOampqKigohhN/vt9lsdXV1ATNUVlbKU8Fra2uPHj0qhGhvb29qavJ6ve+//772imU1rw4MDJjNZqGJTI8ePQofrSNcizfffDMvL09RlLy8vLy8PDnRYrG43e6enp7GxsZ//etfclx6aGjo1Vdf/c9//iOEaG5uLioqcrvdcRKtr1279mLt3jKyGgyGzMzM3t5es9msKIr5KYPBIGdbs2ZNfn6+0+n89ttvf/rpp/BljjlqLYSwaxgMBpvNpp3icDjE0/1HbtwnT54oitLU1FRSUqJ+kc1ma21t1VeAI1iAP+oRzGg09vb2Bi3zxo0bhw4dCpjIqDUAAIjKuKP1gQMHZsyYkZSUNHPmzKtXr8qPPv/882nTpplMJrvdLlOZnHn//v1yZofD0dLSImceGBhYsmSJxWLJy8urqanRd0zdbndVVVVGRkZycvLy5csfP34cpj4XLlyYMmXK1q1bwyzY19dXUVER5hvFb7txoco5cOCAzWZLSkoqLCwcHR1VNEJVL2gLeDyeTz/9dNq0aUlJSdOmTdu+fbsceJGL7Nmzx2q1ms3m8vJyGRq1dQu1rKz2pk2bsrKyzGbzqlWr1KX8fv+aNWsKCgpkdzM/P19eqyyEqK6ulp1ULY/H8+abb07XUBRF+1qdU82rHR0dcrRnwqO1JIepT548+ac//amsrEyeJ2y32xcsWFBZWSmvqHzrrbdycnLef//9t956y+FwZGRkfP755/poHbARQ23ugL3rnXfeWbdunVofh8OxZ8+eMLtKgIBdJfwOMOYu/UyV0ZcZOXXU2u/3y3+daDeHEGLv3r09PT137tyxWCzaM2xDNYL2ddBRa7Vk7eCh+lp+qt+XKisr//3vf6vzW63WW7du6SvAESwRjmAej0dRlOHh4aBt3tzcnJGRsWPHDu1EojUAAIjKuKP1ypUru7u7+/v7Fy9ePGvWLPnRp59+2tbW5na7N27cWFBQoM68evXqnp6evr6+RYsWFRcXy5kXL148b9687u7u7u7u0tJSfTdx1apVpaWlLperr6+vrKxszZo1YepTVVU1MDDQ2dkZZsHy8vL58+f39PSE+kbx285f0HKcTqfBYGhsbBwaGjpz5ozP5ws/FBOmBVavXj179uwbN26Mjo5euXLFarXW1taqi5SXl/f29nZ1dRUXF69YsSKgbqGWFUKsWbNmzpw57e3tIyMjTU1N6lKbNm3Kzc2VTdTb26soSnt7u1ykrq4uJycn/HYP6Hdqz81W8+qpU6fkTaT00bqxsVF/WmaYK3KDkl/a2tpaX19/7do1s9ks72F2584ddV0uXbpUX19/+fLllStXut3uR48ebdiwISBa6zdiqM0dsHf9+OOPWVlZcv4bN26YzeaBgYFQy4baGdRdJfwOMOYu/UyV0ZcZOTVaP3z4UJ53LWlj9vDwsMPh2LVrl9vt1m5QRVECNm7sorXP56uurq6vr5cTs7Oz7927p18djmCJcAR7/Pixdt9TyStEhBBtbW02m007rE20BgAAURl3tFZ7JA0NDQaDQXulrsvl+uqrrxRF8Xq9cmZ5pa4Q4ty5c3Jm2TFS7z1z9uzZgG5iX1+fwWBQB51OnTqVmpoapj7nzp2Tb0MtOOY3aksLUwF5uezBgwcDKhC+Y6pvAVn+tWvX1Dm///57GR7kImoqOHr0aEpKir5uQZcdGBgwGo3aS0zlUlu2bMnIyFBXp7W1VVEU9X5Uly5dCtiI0gcffGC1WiMctfb7/e+88051dbUQIikpSY4hDwwMBOxgPp9PJsCHDx++//77QRstqNHRUdnymzZtkqejW63W/v7+R48ezZgxI+D0zoBeckC01m/EUJs7YO8aHh5OSUm5cOGCEKKmpmb58uVhltXT7ipj7gBj7tLPVJmAMiM0MjLS3NxsNpsXLFhw8OBBm80mT8aWJk+eLF94PJ7y8nLtHqVSFEWOWGqnjHlCuBqtTSaT46mg0TrzKbnsL7/8kpWVJfe9zMxMl8ulXymOYIlwBLt9+7bNZgtYF7PZrN0lPB5Pd3e39nYPym/v/hC0QfSI1gAAQIiJuNZa+3bPnj05OTnFxcVvv/12+G5fS0uLoihPnjwJmB4wQ4CgT/2Ri8i0JoQIteCY3xi0hkErUFdXl5+fX1RU1NDQoG+QCJtLlq+NIj///LOiKPpBpMuXLwdMD7Os/iO5lKIof/nLX9SJAbOpXxFQ+bfffludJyCsykQnKYridDqXLl2anZ3d09MjhNiwYcOkSZOMRuN7772nXcrn83344YfvvfeeEMLlcmk7r3v27Onv7w/ahj6f79VXX01JSVEUZd26dfv27ZPR+p133jl9+vSrr766bds2dWb1JtKKosgXdrtdf0J4wEYMtbkD9i4hxJo1a9auXev3+1966aXz58+HWVa/ItotO+YOMOYu/UyV0a/ImAYHB1NSUsrKyiwWizwHeM+ePZMmTfrLX/4iTy1Ws+KCBQtWrFihRBatP/30U+2n2h+O+tH4Rq3l6507dy5cuFAIkZKSogZCLY5giXAE279//wcffKBdEXmKuLbk2tpaebwSQnR0dCQnJz/r/54kWb1xLKhFtAYA4IU3jj5BqJ7Wr7/+ajAY5GhDQ0ND+G7fvXv3FM3pfPX19QHzd3V1KYry4MGDZ61PqAU7OjoUzUDKsWPH5FJtbW3afq1a8/AV8Hq91dXV8uTY8XVMu7u7FUVRr1oUQhw8eNBqtarzqKNqBw4c0E4Pv+z9+/cVRdFeYiqX+vzzz41Go7wbmdpKamvU19dPnTpVX/ny8nI5Rj1t2jS5q2gvvTYajTK6KIqyZs2aGTNmqBtUCOH3++XwlLqDeTyeFStWvPHGGzLcqtHa4/GsXbt2+vTp9+/fD9qGQgh5mq72LHQhxNatWydPnhz0yTrhR63VedSNGGpz6zduY2Pj1KlTL126ZLPZ5Ono49tXx9wBxtyln6ky4ffSUOS/MNQTwv/2t7998skny5YtW7BggRBCDkU+efLkxIkTPp9PiSxaB3watEqRj1qr9VRfj46O3r17V84W9DlhHMFEAhzBSkpKtCPzQoju7u5Jkyapb7u6uiwWi9xDvF5vaWlpVVWVEOLixYtNTU1BmyIUojUAABBiQqP17du3FUVpaGh49OjRwoULw3dMhRAzZ86sqKgYGBiQj3fSzz9//vylS5e6XC6v13vnzp3Dhw9HUp8wCzocjiVLlshLbYuKiuRSIyMjKSkpX3/9tRBiZGREntcapgKdnZ0XL170eDz79u1LT0/3+/3t7e2Kopw/fz7okGCYFliyZMmcOXNu3rzp9XqvXbuWn58vb0Ml5/nwww8HBwfb29ttNttnn30W4bJCiLKysrKysvv37z958uTChQvqUl988UVSUtKZM2fkbLm5ueo9dWtqasrLy0Nt8aGhoXfffbeiokL57fizyWSSlVEUpb+/P2iMUa+19vv9CxYsqKioUIfdZLRubGx0OBwLFy4ME8BUauLy+/3ffffd1KlTX3/9dTmloaFB+2zb8NFavxFFiM2t37v8fn9+fv7cuXO3b9+uThzfvhp+B4hkl468MuHjk9frPXDgQKh7Pslo7fP5CgsL5fm08sZvmZmZQ0NDU6ZMkaOFkUTrvN9Snt7yXSVrGM2otTQyMqIEOxFD3xQcwf54R7Dvvvtu2rRpAecItLS05Obmqm/37t27ePFi+Xrz5s0lJSWyYpcuXSooKAj1WwiKaA0AAISY6BPC169fb7FYrFbrJ598MmbH9NatWyUlJUlJSXa7fdu2bfr5+/v7V65cmZ6ebjKZCgoKZN9xzPqEWfD27dvqN27dulVd6uTJkzabzWazlZaW7tixI3wFOjo67Ha7vIewejPkjz76yGw2B702L0wLDA8Pb9iwITs7W5b2zTffaOfZuXNnRkZGWlpaVVWVTDKRLCuE6O3tXbJkSXJycnp6+ubNm7VLff7555MnT5ZjMps2bVq6dKlcxG63B4zwqGRHs7KyUmYVIYSMK01NTepgphL6iVbaO4TfvHlTjTrDw8NHjhyZO3euzWZTb/M7Jpmpjh8/XlxcXFJS0tbW9tprr8krNtetW/fPf/7zwYMHTU1Np0+fPnjwoKIo27dv37RpU01NjRDC7XYPDg4qivLkyZOgGzHo5g6aSGtra41Go/aizfHtq+F3gEh26cgrEz5aNzc3yzHDoNLT04UQe/bskTejUhUXF3/77bfyxnXit9F6aGjI5/N1dnYqihLqztgiglHrMaO19n5p2hKuXLmiveOaFkewP/YRrKGhITk5WZ7r7na7nU7n8PCwx+PZsGHDvHnz1G+ZO3fuDz/8IITYu3ev1Wp1uVyDg4OdnZ3Xr193OBwbNmwIurGCIloDAAAhJqhP8CIa3/mxfyRdXV3p6el37949ceKE3W6XfV+ts2fPyhPCjx8/LjQDg7NmzbJYLKmpqTt37pRzKmMRQvh8vo6OjtOnT2/fvv2dd95JS0srLy+vr6/XPh87jJ6ens7OTpPJJITYtm1bfX29HGr+z3/+Y7PZbt68WVxc3NbWdurUqRUrVnz66afffffdxYsX7969OzIyIktYtGiRoiilpaUT0np/MF999ZU8GzaAy+V6+PBhbm6ufFhRwK3Fd+/erSjKl19+Kd9qo7W89FpRFHnZs7Rx48bM31I09yFTyaLkI6wzMjLUx1mrr8OMWjc2NmZnZxcWFk6ePHnLli0T31JxgyNY0CPY5cuXLRaLGrMHBgZMJpPcFXNyctQzvV0ul8lkkjd3SEtLS0pKmjRpUnZ2dlFR0fz585ctW2YymbR3WQuPaA0AAISIoE8QNCY9RxNVnxh1TOOtucI7fPjw3LlzCwsLtffjVdXV1R07dkyNvj6fL9TDsbZu3RqqJd1ut3xU78DAwOzZsysqKmpra0+dOhX07PEw5HNuV61apf9oz5496enpb731lgzboYyOjqrnov8+XqCdYenSpfIxzgGKi4tTU1Nra2vPnTu3d+9e/QxdXV3q68bGRvWsBNna4/59Ba2MSg1IV58+j1oIIS+79Xg8d+7caW1t7ejokNPjbStwBJtA+iOYz+e7ceNGwGwjIyODg4Pa44PL5VLPP3c6nf39/QFHj127dmkvMAmPaA0AAIRg1DqBx3yAyIX/twV+fxzB4gfRGgAACJHA0RoAgOgRrQEAgBBEawAAokC0BgAAQhCtAQCIAtEaAAAIQbQGACAKRGsAACAE0RoAgCgQrQEAgBBEawAAokC0BgAAQhCtAQCIAtEaAAAIQbQGACAKRGsAACAE0RoAgCgQrQEAgBBEawAAokC0BgAAQhCtAQCIAtEaAAAIQbQGACAKRGsAACAE0RoAgCgQrQEAgBBEawAAokC0BgAAQhCtAQCIAtEaAAAIQbQGACAKRGsAACAE0RoAgCgQrQEAgBBEawAAokC0BgAAQhCtgSgMDQ3l5OQ0NjaqU5qbm0tLS0PN73Q609LSIizc5/PNnz8/2ioiAfT09Fy6dOl51yJxEa0BAIAQkfUJvv3226ysLIvF4nK57Ha73+8PNWeYGa5evaooitvtjrbGz0NdXd3cuXN9Pl+E82tXVm29WFbwd6Wu3Zj7w+9Qhwinj9vAwMCMGTPa2tqCfrply5akpKTZT3344YcVFRVZWVnqlM2bN2vnv3fvXvifm8/nW79+vXzt9Xr5t1c8+B2OXaG+4vvvv08LTZ2tpaVl6tSpJ0+eFEIYjcbp06dPnz79pZdemv5UZmamEMLtdiuKoi1B+1ZRFK/Xe+bMGWUsaoUVRTEaja+//np7e/tENcXdu3crKirS0tKMRqPVar1169ZElRw7RGsAACBEBH0Cl8tlNBqPHz8eZc/yBYrWd+/enTFjhlrV3t7ejIyM27dvR16CNnxOSOvFTsDKRiL6TTmOL42wDrHYzerq6hwOh/4fKy0tLS+//LLT6XQ4HA8fPhRCnDx5sri4+OzZs1u2bAla1JjRWhun5essjSNHjkzECkGIsXZC7afPMVoLIe7du5eRkRGw+128ePGll17STrl8+fLSpUuFEDJFCyGysrLUT9VobTQa1YkB/7uR0drr9T4Kpq+vr7q62mQyffzxx9oKu93u77///rXXXou+EWQN8/Lyqqqqurq6vF7vzZs3f/311wkpOaaI1gAAQIgI+gTXrl2bkG7lCxStA6paU1NTUVExvhImqvViZxzbJfpNGbsSYrGb+f1+m81WV1cXML2yslKeCl5bW3v06FEhRHt7e1NTk9frff/9971er74obbT2eDxOp/Py5ctHjhw5duyYnKiP1hO4ItAKv6toP32+0VoIkZub29raqp1SW1v70UcfBZ05MzPz8OHDDofDZDI5HA6HwyGeJVoHLbOtre3VV1+dNWvW1atXg1b4pZdeivyknjDa2toURenv74++qN8T0RoAAAgRQZ9Aex6g2p2SL/bv3z9jxoykpCRWsvphAAAgAElEQVSHw9HS0iJ+2986cOCAzWZLSkoqLCwcHR2VHx04cEAuMnPmTLWXFkDOeeHChSlTpmzdulUI4Xa7q6qqMjIykpOTly9f/vjxYzlnX19fRUWFxWLJy8urqanR1k3t82nfhionoKoBpz7m5+f/+OOPQecMVab6pQFFxf/KBuV2uzdt2pSVlWU2m1etWhWwG4T5ulD7yZhf+vnnn0+bNs1kMtntdvVK5oGBgSVLlgS0QKjpkTesfpvqp1RXV+v/veLxeN58883pGoqiaF/L2R4+fNjY2Pjjjz9++eWXq1evVhSluLh46tSpBoNhypQpxcXF77333q5du+TMExWt5erv2bPHarWazeby8vK+vj4RbH/zeDyffvrptGnTkpKSpk2btn37djUjBWz3KNswaA3jds/XH/f0x67IV+GZ9me9devW/fWvf1Xfyv/1NDQ0yLdHjhzJy8ubNWuWfBt+1FpRlEwN7VslRLTeuHFjRkbG7t27tZ9qG9zn8+Xm5qofBV3ZCI+cjx8/TklJqaysfPLkSUA1whxh1E3wzjvvrFu3Tl3E4XDs2bMnwmWDtnyEwh8/I0S0BgDghTdmnyDo6I18sXr16p6enr6+vkWLFhUXF2tncDqdBoOhsbFxaGjozJkzPp9PfrRy5cru7u7+/v7FixerfcGg31hVVTUwMNDZ2SmEWLVqVWlpqcvl6uvrKysrW7NmjZyzvLx8/vz5PT093d3dpaWlY/a5g5YTqqpykd7eXkVR5JWE+jlDlRk0fMb/yoayZs2aOXPmtLe3j4yMNDU1BV27MO0QZj8J9Y2ffvppW1ub2+3euHFjQUGBnLh48eJ58+Z1d3drWyDU9AgbVt8gQbdyXV1dTk5OmCYSuiSsDg/+85//LC4uXrRo0bp16zZt2iR783fv3g1Y/cbGxuQIhK+DSq5+eXl5b29vV1dXcXHxihUrRLD9bfXq1bNnz75x48bo6OiVK1esVmttbW3Q7R5lGwatYdzu+frjnv7YFfkqPNP+rNfc3JyVlTU8PCzfnjx5csaMGQH3OFATdWZmphysVket29vb5acjIyPjGLVWFCVgzFzbPsPDw7W1ta+//rr6kX5lIz9yCiF++umnzMzMqVOnfvHFF9qAHeYIo26CH3/8MSsrS5Z/48YNs9k8MDAQ4bJBWz5CRGsAACBEdNFaXl8qhDh37pzBYND2VuU1xgcPHgwop7e3V75taGiQi4T6xnPnzsm3fX19BoNBvZnNqVOnUlNTxdPQq95f6uzZs+H73KHKCVVVWUJra6uiKENDQ0HnDFXms0brOFnZoAYGBoxGY3Nzs36RMb9uzP0k1JdKLpfrq6++kj3+UC0QvmXGbFh9g+inCCEuXboUdHf94IMPrFZr+FFrrTGvtRZC+Hw+mQcePnz4/vvvh585FLn69+7dk2/r6upSUlJEiP3t2rVr6oLff/+9HO3Ub/co2zBoDeN2z9cf9/THrghXQdssY+7PoZpr3rx527ZtE0K43e6CgoL6+vqAGbTRWr+4nPj48WPt/RQjj9bqjhTQPlJSUtJnn302MjISamUjP3JKAwMDtbW1GRkZ+fn5N2/eDDN/wCYYHh5OSUm5cOGCEKKmpmb58uWRLxsNojUAABAiumit79dqp9fV1eXn5xcVFckTF8OMMgX9RpkuhBAtLS2KjsfjkdPVYY0x6xaqnPBVlUvJaK2fM1SZzxqt42RlgwpogaDfPmY7hK+23p49e3JycoqLi99++23tV+hbIHzLjNmw+gYJOuXy5cuKouij9dtvv622TEBQkf37AJHcIfzDDz987733hBAul0t7Tu+ePXsivwY1oIXV+gdtFu3G/fnnn+Wc+o+ibMOgNYzbPT/ocS9oHSLZxyLfn0Nt0Bs3bqSkpFy5cmX16tULFy7Uz6COS2dnZwshCgsL5ZB1WVmZ+qnL5TIYDNob4yma++Qpzx6t3W633+/v7OxcsmSJ+qA4/crqGz9MW6keP368cOFCea14+COMugmEEGvWrFm7dq3f73/ppZfOnz//TMuOmywzykKI1gAAvPDG7BOMO1oLIbxeb3V1tezVPWu0Vj/q6upSFOXBgwcBs3V0dGj7fMeOHZNLyRvhqB2mhoYGOT1UOeGrKpfS9iy1c4Yq81mjdZysbFD3799XFEX7CBz92o3ZDs/ULL/++qvBYJDjpeoayVCqPuOnvr4+/PQIG1bfIEGn1NfXT506Vb9geXm5HKOeNm2a/ClpL702Go3qiL0UNFofOXJEPjbJ4/GsWLHijTfeePTokdBEa4/Hs3bt2unTp9+/fz9o/fUCBloPHDhgtVqFbot0d3criiIvgJcOHjwo59Rv9yjbMGgN43bPjzxaj7kKz7Q/B62MtG/fvsmTJ9tsNn0a9Pl86enpX3zxxZYtW+Q1F/n5+fKjvLw88TRaNzc3z5kzR9saSnSj1mqFGxsb5Uh+0JVVv27MI2eAixcvymIjPMLImkydOvXSpUs2m02eMx/5suNGtAYAAELELFp3dnZevHjR4/Hs27cvPT3d7/ePO1oLIebPn7906VKXy+X1eu/cuXP48GE53eFwLFmy5NGjR06ns6ioSC41MjKSkpLy9ddfCyFGRkbKy8vV0oKWo69qe3u7oijnz5+XXdjc3Fx5d2j9nKHKHHe0fu4rG1RZWVlZWdn9+/efPHly4cKFoGsXvh0CVjb8l96+fVtRlIaGhkePHi1cuFAtYebMmRUVFQMDA/J5V+GnR9iw+gYJupVramrKy8tDtc/Q0NC7775bUVGh/Sn5fD6TyRSw6YNG68rKytraWr/fv2DBgoqKCnUkU0brxsZGh8OxcOFCeR+yAF6v98CBA+pVuCq5+h9++OHg4GB7e7vNZvvss8/0W0QIsWTJkjlz5ty8edPr9V67di0/P1/e+UnotnuUbRi0hnG752s/jfw/REG/+ln356C6uroWLVpktVpTUlJ27doVMOfFixcVRVm/fv3u3bsrKyuFEPKugQ6HQxutDx06pL0bX+TRuqOjI9Tm8/v9Tqdz8eLFb775ZqiVjfzIeePGjb/97W8dHR0+n+/Bgwf/8z//8/bbb4dpW/0m8Pv9+fn5c+fO3b59e/jtQrQGAAATLEbRuqOjw263y5vEnj59WoROWeG/Uerv71+5cmV6errJZCooKJD9aSHE7du3S0pKkpKS7Hb71q1b1aVOnjxps9lsNltpaemOHTvU6UHL0VdVCPHRRx+ZzWY5Zrhp0yb5wNigcwYtM2hDdXd3m83mwcHBuF3ZoDUUQvT29i5ZsiQ5OTk9PX3z5s1B1y58O+hXVtvCeuvXr7dYLFar9ZNPPlEXuXXrltoC27ZtCz89wobVN0jQJrLb7aGuHL506VJBQUFlZeXIyIj8KcnzxpuamtLS0gJm7unpkcFDTZsul2v69Ok//fSTEOLmzZvqOefDw8NHjhyZO3euzWZTb1Cv19zcLAeZA8jV37lzZ0ZGRlpa2v/+7//K2zLrm2V4eHjDhg3Z2dlylb/55hv1o4DtHmUbBq1hnOz5QWuofhp5tA61Cs+0Pwdob2/fsGFDamrqhg0bhoaGmpqaZs6cmZeXt337dvXmW/39/bW1tT6f7+WXX5Zrp45aSzJa//nPf9YGzjDR2u12P3z40Ov1ygsEAk6+UBtBysjIWLlypXqKhH5lIz9yulyuefPmZWRkGI3GnJycjz76SL0IIpIjjFRbW2s0Gl0uV/jtQrQGAAATbEL6BPFgAvtJAbq6utLT0+/evRtlOUeOHJERPXoxWtkJrOEfyYkTJ+x2u/4JUmfPnpUnhB8/flxogsqsWbMsFktqaurOnTv1pa1bt85oNKqxxGAwLFq0aHR01OfzdXR0nD59evv27e+8805aWlp5eXl9fX2oRw1LX331VVVVlX567H4Oz9cfdb2CamtrKykpSU5OXrt2rXbc2Ov1/vDDDzNnzlQURV6WL+3du3f27NnaOwLInXZgYCA7O3tkZCQzM1N7r2+5x/r9/tHR0QcPHhiNRnVZl8ul7qLy3vIIg2gNAACEiINoreiMr5yY9rkPHz48b968oPczj1xlZeWJEycmpD4xWtkJrGHkJmoHiJFHjx4VFhZqb5StqqurO3bsmBp9fT5fhA/Hcrvdj55SN+LAwMDs2bMrKipqa2tPnTqlvX9YGEuXLlUfHawVbxE0zn/m8bkTer3e77//Xl54H1RTU5P2Yvh333034ClZr7zySkpKSnp6+l//+tempqbS0lLtp3KP9fl8ZrNZ/otH+6l8bJv6aG6EQbQGAABCxEG0nijxliViKqFWFuPwR91D/qjrNSHG/N9fqJzs9/sD7s6NZ0K0BgAAQvyBojUAAL8/ojUAABCCaP27098kDADw4iJaAwAAISLuE7hcLqvVql7/ee/ePe3zURGh+/fvp6amOp3OgOk+n2/btm1dXV0BE+12++9YOwDAMyNaAwAAISLuE2zfvn3ZsmXq2927d3/88ccB83z77bdZWVkWi8Xlctnt9qAPs5XCzPBCX0tZV1f3xhtvFBQUtLW1hZpn9erVu3bt0k8/evSo1WrVPqko4NE4AIA4RLQGAABCRNAn8Pl8mZmZSUlJycnJmZmZ8vmoxcXFZrM5+anm5maXy2U0Go8fPx5lKn6BovXdu3dnzJihVrW3tzcjI+P27dt1dXUOh0PeUujKlSvJv2WxWJJ1ZAnXr19vb28vLi7OekpRFPX1c1tPAEBoRGsAACBEBH0COXbqdrvdbveTJ08URWlqaiopKVFnsNlsra2t165dm5BI/AJF64Cq1tTUVFRUCCH8fr/NZqurqwuY32g09vb2Bi3qxo0bhw4dCpjIqDUAxD+iNQAAECLiaK19XVlZ+e9//1udwWq13rp1S/tIWDVzyhf79++fMWNGUlKSw+FoaWkRvw2lBw4csNlsSUlJhYWFo6Oj8qMDBw7IRWbOnHn16tWgFZNzXrhwYcqUKVu3bhVCuN3uqqqqjIyM5OTk5cuXq0+a6evrq6iosFgseXl5NTU12rqpwVj7NlQ5AVUNeApufn7+jz/+KOesrq6WMVvl8XgURRkeHg66Ls3NzRkZGTt27AjV8gCA+ES0BgAAQowrWvt8vurq6vr6ejkxOzv73r172mgaEK1Xr17d09PT19e3aNGi4uJi7QxOp9NgMDQ2Ng4NDZ05c8bn88mPVq5c2d3d3d/fv3jx4lmzZgWtmJyzqqpqYGCgs7NTCLFq1arS0lKXy9XX11dWVrZmzRo5Z3l5+fz583t6erq7u0tLS8eM1kHLCVVVuUhvb6+iKO3t7bK0urq6nJwcbW0fP36sKIr+VPA7d+7IGdra2mw2m3ZYm2gNAPGPaA0AAISIOFpnPiVn/uWXX7KysuSdrjMzM10uV5ho/fDhQ1nUuXPnDAaDNpTKK7QPHjyofp38SE2YDQ0NchF9xeSc586dk2/7+voMBsOtW7fk21OnTqWmpoqnoVe9r9jZs2fDR+tQ5YSqqiyhtbVVURT1DuqXLl0KqPbt27dtNlvAKpjNZpfLpb71eDzd3d1ZGtprrbncGgDiENEaAAAIMa5Ra/l6586dCxcuFEKkpKQ8fPgwTLTWx1ft9Lq6uvz8/KKiooaGBqG7gDnMpdfyo4GBAfm2paVF0fF4PHL6kydPwtRBOz1UOeGrKpdSo/Xly5fl8L5a2/3793/wwQfa+stTxNVFhBC1tbU9PT3ydUdHR3JysvqPAwBAfCJaAwAAIaKI1qOjo3fv3hVCGI3GoaGhcUdrWWx1dbW89/izRmv1o66uLkVRHjx4EDBbR0eHoij37t2Tb48dOyaXamtr0ybzhoYGOT1UOeGrKpdSv6W+vn7q1KnaBUtKSrQj3kKI7u7uSZMmqW+7urosFotM2l6vt7S0tKqqSghx8eLFpqamoJUBADx3RGsAACBEFNFaGhkZkcOz44vWnZ2dFy9e9Hg8+/btS09P9/v9447WQoj58+cvXbrU5XJ5vd47d+4cPnxYTnc4HEuWLHn06JHT6SwqKpJLjYyMpKSkfP3113ItysvL1dKClqOvant7u6Io58+fl/k8NzdXvSt4TU1NeXm5WrHvvvtu2rRpcuhb1dLSkpubq77du3fv4sWL5evNmzeXlJTIyly6dKmgoCDU/c8AAM8X0RoAAAgRcbRWb7sVMPOVK1f0Q7iRR+uOjg673W4ymex2++nTp0UUo9ZCiP7+/pUrV6anp5tMpoKCAhmbhRC3b98uKSlJSkqy2+1bt25Vlzp58qTNZrPZbKWlpTt27FCnBy1HX1UhxEcffWQ2m+VV0Js2bVq6dKmcbrfb1THqhoaG5ORkeQ65vHPb8PCwx+PZsGHDvHnz1MrPnTv3hx9+EELs3bvXarW6XK7BwcHOzs7r1687HI4NGzaMtSUBAM8B0RoAAAgx3lHrxsbG7OzswsLCyZMnb9my5feo6ASJ3XOzu7q60tPT7969e+LECbvdPjo6KoS4fPmyxWJRY/bAwIDJZJJtnpOTo57p7XK5TCZTf3+/ECItLS0pKWnSpEnZ2dlFRUXz589ftmyZyWS6du3ahNcZABAlojUAABAisj6B9snS8nJij8dz586d1tbWjo6O2NbvKUVnfOXELloLIQ4fPjx37tzCwsLm5mY5xefz3bhxI2C2kZGRwcFBv9+vTnG5XHv27JGvnU5nf3+/9lMhxK5du9SbnAMA4gfRGgAACDFBfYIXSEyjNQAg0RCtAQCAEIkXrQEAmEBEawAAIATRGgCAKBCtAQCAEERrAACiQLQGAABCEK0BAIgC0RoAAAhBtAYAIApEawAAIATRGgCAKBCtAQCAEERrAACiQLQGAABCEK0BAIgC0RoAAAhBtAYAIApEawAAIATRGgCAKBCtAQCAEERrAACiQLQGAABCEK0BAIgC0RoAAAhBtAYAIApEawAAIATRGgCAKBCtAQCAEERrAACiQLQGAABCEK0BAIgC0RoAAAhBtAYAIApEawAAIATR+g9kcHBwAkvzer0TWNrvz+/3P+8qAEgIRGsAACBEbKK1z+cbGBhwOp3Xr18/ffr0999///nnn69du3ZoaGhivwiq+/fvp6amOp3OgOk+n2/btm1dXV0BE+12e/gCFUVxuVz66T09PZcuXYqythOipaVlYGAgYOLAwIDdbh8ZGVmwYEFbW9uYhbS3t1dXV485288//xzJWm/evLm5uTnUpy6Xy2q1qr+Ce/fuzZkzZ8wyAcQ5ojUAABAi4j7BpEmTXgsmLy9PncftdmdkZJjNZoPBkJKSYrVai4qK3n777WXLllVVVe3YsaOjoyPyin377bdZWVkWi8Xlctnt9jCDkGFmuHr1qqIobrc78u+NH3V1dW+88UZBQUEkEVEIsXr16l27dumnHz161Gq1nj59Wp3i9XrH3OihonVLS8vUqVNPnjwphDAajdOnT58+ffpLL700/anMzEwhhNvtVhQlTUP7VlEUr9d75swZZSyhquf3+2fNmtXe3h4w/dChQwsWLBBCNDQ0vPzyy6dPn9aWpv/nzmeffbZ69erwTSGEOHDgwJQpU/RJXgjh8/nmzZv3+PFjIcRXX31VWloqp9+8ebOsrEw75/bt25ctW6a+3b1798cffzzmV/t8Pp/PFzBRu2Orv5SAT6XU1NSlS5f29vaO+UWxpv8xTsjPUy1kfKU9fvz4L3/5i81mS0pKysjIWLdu3UQdNOrq6ubOnavfdvFPbYExj72/Qx0inP58Ea0BAIAQzxKtS4MJiNaKogwODkbfm3S5XEaj8fjx4xPV7Y6yPr+Du3fvzpgxQ61qb29vRkbG7du36+rqHA6HvkmvXLmS/FsWiyVZR858/fr19vb24uLirKcURVFfy3kOHTpk1lAUxfxb6ldfvnx56dKlQgiZooUQaiHqRLfbbTQa1YkBYV5Ga6/X+yiYvr6+6upqk8mkJk+DwZD5lHybp6Eted68efX19fL12bNntS2mRmtZmcwQZGmKougbU0v7pa+//vrx48flWmdnZ8v/Ynz//ffvvfeenMHn82VmZiYlJSUnJ6trUVxcbDab1QJDDXc3NjZevnw5YKI2/Oh/Kdrd3ul0vvnmmwsXLgxaeKxp9+o4jNaPHj2aOXPm4sWLb968OTo66nK5Tpw4MSG1Un+/0RQyIQIOLJGIvgXG8aUR1iE+D+lEawAAIETEfQJthA41XUbrCanVtWvXJqT/FJ/9sKACqlpTU1NRUSGE8Pv9Nputrq4uzLJGozHUsOSNGzcOHToUMDGaUWutzMzMw4cPOxwOk8nkcDgcDod4lmgdtMy2trZXX3111qxZV69eVSeq0V0Wrv7LQFJj/507dwwGw+jo6NDQkH4FA6J10G9XPwrfPgEl7Ny5c/ny5fJ1fX29PMtg+fLl//d//6ed3+12u93uJ0+eKIrS1NRUUlKilmCz2VpbW4N+V1VV1caNGwMmqntL0F9KwL507tw5o9H4XIZPtTWJw2hdWVlZVlYW0DITUiv19/vcjWN1om+B2JUQn4d0ojUAABBiok8IH3Os78mTJwElFxYW7tixI2itpICu8/79+2fMmJGUlORwOFpaWsRvO1sHDhyQ53YWFhaOjo7Kjw4cOCAXmTlzpjawack5L1y4MGXKlK1bt8rVqaqqysjISE5OXr58uTzjVwjR19dXUVFhsVjy8vJqamqCduu1b0OVE1BV7SoLIfLz83/88Uc5Z3V1dZhuusfjURRleHg46KfNzc0ZGRkBLTzuaH3kyJG8vLxZs2bJt+FHrQNGhrVvQ0XrjRs3ZmRk7N69O+DTCKP1qlWr5HpFH6337dsXdAbJ7/f/4x//UN+6XK7k5OSHDx+qUwYHB9PS0rq7uwOKVV9XVlb++9//Vue3Wq23bt0Sur3C5/Pl5uampqYG7D/qDhaw20gBe+OxY8fUFnuOe3X4aP35559PmzbNZDLZ7fbGxkb1U/3vXQgxMDCwZMmSMLUNWr2A37jb7bZYLOfOnQvYuOFrpV/HoFPU32+8HViCcrvdmzZtysrKMpvNq1atCvrfijBNqt9GY35p0IYNulnDb+5IGjaS7RWl8M0bIaI1AAAvvDH7BK+88sorr7ySlZX1SjByurzE1+12GwyGZ63Arl279DeICjrYJV+sXr26p6enr69v0aJFxcXF2hmcTqfBYGhsbBwaGjpz5ozP55MfrVy5sru7u7+/f/HixWosDPqNVVVVAwMDnZ2dQohVq1aVlpa6XK6+vr6ysrI1a9bIOcvLy+fPn9/T09Pd3V1aWjpmDzhoOaGqKhfp7e1VFEW9kLiuri4nJydUAz5+/FgJ9h+NO3fuyBna2tpsNpt2WDvKUWs1UWdmZsrBanXUur29XX46MjIyjlFrRVGCDt4GROugJ4TfvHlTnuguIovWWSHIBYOeAR4wRe27CyGWLl1aU1Ojvt25c6f2vyH6aO3z+aqrq9Vz17Ozs+/du6ffK65cuSJ/oadOndLuP+GHatWJfr//1q1bhYWFmzdvlh89x706fLT+9NNP29ra3G73xo0bCwoK1E/1v3chxOLFi+fNm9fd3R2qtkGrF/Abv3XrlqIo+uvnw9dKv476Kdrfb1wdWEJZs2bNnDlz2tvbR0ZGmpqagu5dYZo0zDE51DfqGzbUZg2/ucds2Ei2V5iWiRDRGgAACBFZn2D69OlBXwcYGhqaNGnShNQqTLRWxwbPnTtnMBi0fUd53enBgwcDylFTZUNDg1wk1DeqQ1h9fX0Gg0EOJAohTp06lZqaKp6GXvW+YmfPng3fAw5VTqiqyhJaW1sVzT23Ll26FKraQojbt2/bbLaAiWazWRuMPR5Pd3d3QIDUvv3mm2/0SXLy5MkBE2Vp2mitr4+c+PjxY+2NtSKP1vfu3dNPj2TUeu3atV9//XXk0Vr/LQEfDQ0N3b9/X30d/mdy69atlJQUeaO+Bw8eZGRkqBtd6K7ulkX98ssvWVlZ8qbumZmZLpdLv1d8/PHH8hcqc7u6/0QSraVJkyb94x//kHeier57tbZWWtrKu1yur776Su4eoX7vY9Y2VPUCfuPyV6Z/ZJ2+SbW10q+jfor29xtXB5agBgYGjEaj9lJ//d4VvknDHJNDfam+YUO1QPiWGbNhI9le0SNaAwAAISKO1uoZ4BkZGR6PZ/LkyXPmzHnttdccDoc6ONnT05ORkSHLDHV3qAiFidb6XqZ2el1dXX5+flFRUUNDg9B1K8N0+ORH6hBWS0uLPgN4PB45XT2tfcy6hSonfFXlUmq0vnz5sqIooaL1/v37P/jgA+0UeYq49m7YtbW1PT098nVHR0dycrL+PFjVnTt3UlJSZF826Jeq49LZ2dlCiMLCQjlkLW+ILT91uVwGgyFUmFdiEK2vXr2qBuMJidZHjhyxWq3y9ZjRWghRU1NTUlIyNDQ0b948dZRYX6z29c6dO+UNxlJSUmQ+0e4Vfr8/Nzc36P4T4aj1gwcPFi5caLfb5Yo/3706/Kj1nj17cnJyiouL33777Ui+PUxtQ1Uv4Dfe19enKMq1a9cCtmP4WunXUT9F+/uNqwNLUAFHm3E0afhjclD6hg3VAuFbZsyGjWR7RU9+XZSFEK0BAHjhRdIn0I9ar1u37siRI0KITz/9VD2hsaWlRT4tWdEFp0jOQNYad7SW31VdXS0z2LNGa/Wjrq4uRVEePHgQMFtHR4eiiX/Hjh2TS7W1tWn7eQ0NDXJ6qHLCV1UupX5LfX391KlTQ7VVSUlJwAhMd3e39vSBrq4ui8WipsrS0tKqqiohxMWLF5uamgJK8/l8b7zxxs6dO+Xb999//8CBAwEzpKenf/HFF1u2bJEnf+bn58uP5IX3cnWam5u1D22e2FHrMHcIVybohHAhRFVV1YoVK+RrWaD2WWL79+8PKH90dLSsrCw7O3vBggVh9n/t69HR0bt37wohjEajmm3UvSIgLdy4cUMtMMJoLWs+bdo0ueF5BWMAACAASURBVMWf714dJlr/+uuvBoNBDpyq3xLqx3vv3j1Fc7lEfX19wPyhqqevwNy5c1euXBlqtqC10q+jfor29xtXB5ag7t+/ryiK9iQL/d4VYZNGGK2DNmyozTrm5g7fsPoGCTUlGkRrAAAgxLhGrYUQTqfTbrefPn36pZdeUs8G3Ldvnxw+faZovWvXrjDPFhLPEq07OzsvXrzo8Xj27duXnp7u9/vHHa2FEPPnz1+6dKnL5fJ6vXfu3Dl8+LCc7nA4lixZ8ujRI6fTWVRUJJcaGRlJSUn5+uuvhRAjIyPl5eVqaUHL0Ve1vb1dUZTz58/LbnRubq56V/Campry8vKgrffdd99NmzZNDs6oWlpacnNz1bd79+5dvHixfL158+aSkhJZsUuXLhUUFATc/+yzzz5bsGCBOljd1taWmpqq3mdICHHx4kVFUdavX7979+7KykohhLx9kcPh0EbrQ4cOhbrYWISN1kEffm4wGGSgDX8bM/Es0Vr/LdqPPB5Pbm7uq6++KheJZNRaPuYqNTW1qKhIveFWQLFBv31kZERRFJ/PF7BXfPLJJ9poXVtbq+4/kUdrIcSZM2fUM36f414dJlrfvn1bUZSGhoZHjx4tXLgw/O9dCDFz5syKioqBgQGn0+lwOPTzB62evgJtbW3Jycnr16+/f/++1+u9d+/e4cOHw9dKv476KULz+423A0tQZWVlZWVl9+/ff/LkyYULF4LuXZE0qfo2/JcGbdhQmzWSzR2mYSPcXlEiWgMAACEijtZ3795tbGw8ePBgZmZmZWXlr7/+Wl1drSjKV199pc5WWloqezPPFK2D3iF8fNG6o6PDbrfLu87KZwtHE637+/tXrlyZnp5uMpkKCgpk71YIcfv27ZKSkqSkJLvdvnXrVnWpkydP2mw2m81WWlq6Y8cOdXrQcvRVFUJ89NFHZrNZjtBu2rRJPjtaCGG324NeGdjQ0JCcnCzPaXS73U6nc3h42OPxbNiwYd68eepsc+fO/eGHH4QQe/futVqtLpdrcHCws7Pz+vXrDodjw4YN6pz19fXTpk1T/1fidrsfP378xRdfTJ06Vb1yu7+/v7a21ufzvfzyy7Lm6qi1JNPvn//85+3bt6sTw0Rrt9v98OFDr9f7888/K5rrNrUivEO4GCtay/8jRBKtd+7cuXr16h07dthstm+//fbmzZsBi3g8HvUfEPfu3auqqkpLS/vss8/cbvfWrVsnT5783nvvnT59Wq6mLFZ7Hbu2qCtXrsj10u4Vp06dmjFjhjZaGwwGdf8J+qNwuVx2u13/HyUhxJ/+9Kfi4mKv1/sc9+rwJ4SvX7/eYrFYrVb5D4Xw0frWrVtqbbdt26afP2j1gv78b968WVFRkZ6ebjQarVZrbW1t+Frp1zHoWqu/37g6sHR3d5vNZv3l5b29vUuWLElOTk5PT9+8eXPQvSuSJtW+1R7N9PQNG2qzRrK5wzRsJNsrVLNEjmgNAACEiKBPsHz58tdff33FihW1tbXff/99bm7u8ePH/9//+39vvfXWqVOn5s6d++abb54/f/6nn36y2Wxy+FRRlDyd6HsecSjCu/WMQ1dXV3p6+t27d0+cOGG32/VPiLl8+bLFYlEj98DAgMlkklszJydHPdPb5XKZTKb+/n4hRFpaWlJS0qRJk7Kzs4uKiubPn79s2TKTySQvN21razMYDBaLJSMjY8qUKVar1W63v/LKK2+++WZRUdHrr7+urcPevXtnz56tvRJbfjowMJCdnT0yMpKZmam917fMln6/f3R09MGDB9rHLLtcLjU9qidgB1DPvpZVfaYTwuXWaW9vlydciAhOCHc6ncXFxbKr3dTUtHz58vz8/MmTJxuNRqPRqLbzzZs3jx079tZbb1kslrVr16r3PJMrtWnTptTU1LS0NPksMUU3at3Y2JidnV1YWDh58uQtW7YErLIM8wF++eWXoO0zsWK3VycO9fc7vsVjtAmOHDmi/sMOquibhWgNAACEePY+wYYNG5xO57/+9S/1PLrW1tb29nan06neEubdd98NuP2Vz+d79913J6rO0dOHlvGVE9MQcvjw4blz5xYWFmpv3qvy+Xzai2+lkZGRwcFB7SmOLpdrz5498rXT6ezv7w84AXLXrl3q3Xebm5t7e3v1p2qPjIzIh9yoU959992Ap2S98sorKSkp6enpf/3rX5uamkpLSwNqm5yc7PP5zGazwWBYtGiR9tPe3t6uri7ts6zCW7Vqlfbthx9+qL6Wm9Ln86nPtSorKzMYDCkpKeq/IXw+n7zjmp78yOv1dnV1hZrB6/X6fD65h1+/fn3Pnj2hTrUdGRn517/+Jf+vcVXzQHV5Sa3H47lz505ra2vQc+DluGUA/fkdsUC0nhCHDx+eN2/e+J7tFKNNUFlZeeLEiYktc0wTdbCNneibhWgNAACEmKA+QcJK2BAyZmAIlZP9fn/AleETK+izuCfkcsrfmbymNID6YOeYSti9On6wCV4sRGsAACAE0RqIP/IuUEHJ52ADiB9EawAAIEQ8Reto7iID/JF88cUXoaL1rl27nnftAPwG0RoAAAgRN9H6/v37qamp+hE5n8+3bdu2gAtffT6ffIA28Ic0Z86cUNH6tddee961A/AbRGsAACDEhEZr7fWB3377bVZWlsVimTFjhnqXrPBWr14ddETu6NGjVqtVfZCMCPvwJOBF19nZGSpXS0GvJwfwvBCtAQCAELGJ1i6Xy2g0Hj9+3O1219XVORwO/V2vrly5kvxbFoslWUfOfP369fb29uLiYu0TktTXE1J5ID7FyXklAEIhWgMAACFiE62vXbumDl/7/X6bzVZXVxdmQaPR2NvbG/SjGzduHDp0KGAio9ZIHERrIM4RrQEAgBCR9QkOHDhgs9mSkpIKCwtHR0eFEG63u6qqKiMjIzk5efny5fJJS2q01p68KoSorq6uqKgIVbjH41EUZXh4OOinzc3NGRkZAY/zJVojcRCtgThHtAYAAEJE0CdwOp0Gg6GxsXFoaOjMmTPy1O5Vq1aVlpa6XK6+vr6ysrI1a9YITbQOeChrXV1dTk5OqPIfP36sKIr+VPA7d+7IGdra2mw2m3ZYm2iNxEG0BuIc0RoAAAgRQZ9AXjh98OBBdUpfX5/BYLh165Z8e+rUqdTUVBE6Wl+6dMlgMOgvt5Zu375ts9kCJprNZu29mjweT3d3d5aG9lprLrfGHxjRGohzRGsAACBEZH2Curq6/Pz8oqKihoYGIURLS4v+rsUejydUtL58+bKiKKGi9f79+z/44APtFHmK+NDQkDqltra2p6dHvu7o6EhOTj537ty4Vxl4gRCtgThHtAYAAEJE3Cfwer3V1dWZmZlCiK6uLkVRHjx4EDBPqGhdX18/derUUCWXlJRoh8SFEN3d3ZMmTVLfdnV1WSwWmbS9Xm9paWlVVZUQ4uLFi01NTZGuJ/BiIloDcY5oDQAAhIigT9DZ2Xnx4kWPx7Nv37709HS/3y+EmD9//tKlS10ul9frvXPnzuHDh0XoaF1TU1NeXh608O+++27atGkej0c7saWlJTc3V327d+/exYsXy9ebN28uKSmRJV+6dKmgoCDU/c+APwaiNRDniNYAAECICPoEHR0ddrvdZDLZ7fbTp0/Lif39/StXrkxPTzeZTAUFBV9//bUIHa3tdnvAuLTU0NCQnJwsTzJ3u91Op3N4eNjj8WzYsGHevHnqbHPnzv3hhx+EEHv37rVarS6Xa3BwsLOz8/r16w6HY8OGDRPUEkA8IloDcY5oDQAAhIh9x/3EiRN2u10+skvr8uXLFotFjdwDAwMmk0lWJicnRz3T2+VymUym/v5+IURaWlpSUtKkSZOys7OLiormz5+/bNkyk8l07dq12NUfeL6I1kCcI1oDAAAhYtxxf/ToUWFhYXNzs/4jn89348aNgIkjIyODg4PynHPJ5XLt2bNHvnY6nf39/dpPhRC7du1qa2ub6IoD8YJoDcQ5ojUAABCCjjsQ3/iFAnGOaA0AAISg4w7EN36hQJwjWgMAACHouAPxjV8oEOeI1gAAQAg67kB84xcKxDmiNQAAEIKOOxDf+IUCcY5oDQAAhKDjDsQ3fqFAnCNaAwAAIei4A/GNXygQ54jWAABACDruQHzjFwrEOaI1AAAQgo47EN/4hQJxjmgNAACEoOMOxDd+oUCcI1oDAAAh6LgD8Y1fKBDniNYAAEAIOu5AfOMXCsQ5ojUAABCCjjsQ3/iFAnGOaA0AAISg4w7EN36hQJwjWgMAACHouAPxjV8oEOeI1gAAQAg67kB84xcKxDmiNQAAEIKOOxDf+IUCcY5oDQAAhBDCZDIpijI6Ovq8KwIgCKI1EM/cbreiKJMmTYqyHKI1AAAvPIfDoSjKf//73+ddEQBBEK2BeNbS0qIoyuzZs6Msh2gNAMALb+fOnYqivPbaa62trR6P53lXB8BvEK2B+OR2u1taWkpKShRF+fvf/x5laURrAABeeG63+6233lIAAMCzmzdvXvT/mCZaAwDwR+B2u7/88suioqKkpKTn3UUBAOAFMGnSpNmzZ//973+fkBO+iNYAAABADMlO/POuBYDYIloDAAAAMUS0BhIB0RoAAACIIaI1kAiI1gAAAEAMEa2BREC0BgAAAGKIaA0kAqI1AAAAEENEayAREK0BAACAGCJaA4mAaA0AAADEENEaSAREawAAACCGiNZAIiBaAwAAADFEtAYSAdEaAAAAiCGiNZAIiNYAAABADBGtgURAtAYAAABiiGgNJAKiNQAAABBDRGsgERCtAQAAgBgiWgOJgGgNAAAAxBDRGkgERGsAAAAghojWQCIgWgMAAAAxRLQGEgHRGgAAAIghojWQCIjWAAAAQAwRrYFEQLQGAAAAYohoDSQCojUAAAAQQ0RrIBEQrQEAAIAYIloDiYBoDQAAAMQQ0RpIBERrAAAAIIaI1kAiIFoDAAAAMUS0BhIB0RoAAACIIaI1kAiI1gAAAEAMEa2BREC0BgAAAGKIaA0kAqI1AAAAEENEayAREK0BAACAGCJaA4mAaA0AAADEENEaSAREawAAACCGiNZAIiBaAwAAADFEtAYSAdEaAAAAiCGiNZAIiNYAAABADBGtgURAtAYAAABiiGgNJAKiNQAAABBDRGsgERCtAQAAgBgiWgOJgGgNAAAAxBDRGkgERGsAAAAghojWQCIgWgMAAAAxRLQGEgHRGgAAAIghojWQCIjWAAAAQAwRrYFEQLQGAAAAYohoDSQCojUAAAAQQ0RrIBEQrQEAAIAYIloDiYBoDQAAAMQQ0RpIBERrAAAAIIaI1kAiIFoDAAAAMUS0BhIB0RoAAACIIaI1kAiI1gAAAEAMEa2BREC0BgAAAGKIaA0kAqI1AAAAEENEayAREK0BAACAGCJaA4mAaA0AAADEENEaSAREawAAACCGiNZAIiBaAwAAADFEtAYSAdEaAAAAiCGiNZAIiNYAAABADBGtgURAtAYAAABiiGgNJAKiNQAAABBDRGsgERCtAQAAgBgiWgOJgGgNAAAAxBDRGkgERGsAAAAghojWQCIgWgMAAAAxRLQGEgHRGgAAAIghojWQCIjWAAAAQAwRrYFEQLQGAAAAYohoDSQCojUAAAAQQ0RrIBEQrQEAAIAYIloDiYBoDQAAAMQQ0RpIBERrAAAAIIaI1kAiIFoDAAAAMUS0BhIB0RoAAACIIaI1kAiI1gAAAEAMEa2BREC0BgAAAGKIaA0kAqI1AAAAEENEayAREK0BAACAGCJaA4mAaA0AAADEENEaSAREawAAACCGiNZAIiBaAwAAADFEtAYSAdEaAAAAiKG8vLy8vLznXQsAsRVH0drtdu/atWv27Nlms1kBACQwk8nkcDh27tzpdruf91+nFxh/WAEAUMW6dxEv0drtdpeVlT3v1gYAxJe33nqLdD0+/GEFACCoGPUu4iVa79q1S1GUkpKS1tZWj8fzvKsDAHieRkdH//vf/7722muKonz55ZfPuzovJP6wAgCgFeveRbxE69mzZyuK0tra+rwrAgCIF62trYqiFBUVPe+KvJD4wwoAgF7sehfxEq3lZWD8Wx0AoPJ4PIqiJCUlPe+KvJD4wwoAgF7sehfxEq3lWe/PuxYAgPjCX4dxo+kAAAgqRn8iidYAgPjFX4dxo+kAAAiKaA0ASDj8dRg3mg4AgKCI1gCAhMNfh3Gj6QAACIpoDQBIOPx1GDeaDgCAoIjWwMQL9Rx59aNYPE1e+9Wy/FmzZtntdr/fH01RiqIcPXpUnfjgwQODwaD9ZYX/loDVB+IE++S40XRA5ML0B4QQPp/vH//4R1FRkdlsTk5OLi4uDljKaDRardZNmzYNDw8LIdxud01NTX5+vslkSktLKysre24rBiAYojUw8WpqampqajZv3iz3wJqnxO8brQ8dOvTDDz9EWdSkSZOWLVumTvzmm2+SkpK0v6zw36JthHHXBJhw/HUYN5oOiFyY/oAQYsWKFYqiWK3Wjz/+eN26dS+99JKcLmfevHnz2rVrp0yZoihKZWWlEGLVqlWKosycOXPjxo1/+tOfcnNzn9uKAQiGaA3Eitvt1u+BkUTrcY8zR1j+MxVVXFyckpKiPsN2/vz5s2fPjvyXFbQRgOeO3XLcaDrgWQX9U3jo0CFFUWbPnj04OCinjI6OyhfaP+VXr15VFCUjI0MIMXnyZEVRuru75WxPnjyJsALR9CuiWRZINERrIFbCROutW7empqbm5OScPn1aO/2TTz5JSUnZt2+fEOLo0aOzZs1KSkrKysrauHGj2+0+d+7cm2++mZKSYjab582bd/fuXSGEz+fbsmXLlClTUlJSPvvsM+3fY/3rAwcOzJgxIykpyeFwXL9+Xbt4amrqF198oV9E/q9d1nNgYMBkMm3ZskW7Xuoi27dvVxTlrbfeEkI8fPjQYrGkp6d3dHToZ9ZXA/id8ddh3Gg64FkF7Q/MnTtXUZRTp07p59f+LX748KGiKBaLRQiRlZWlKEpVVVXAP9D1HQah61fs3r1bUZSlS5fKRTZu3Ch7I5EsG5tWAf6AiNb/n70zf2jiavf4/3QSQpAtgbAECBAwQqSokaKiUGlU6o5FaREUWxVcKdeXWqq28rogUlRaRUUERUVAEGSJGHbCmoXJuT+c67njzCSEuGF5Pj/NnDnLM89MMvOd5ywA8LFwIq0TEhJSUlIQQmq1mp2uVCrz8vJqa2uvXbuG3nb6Ik/f/fv3HzhwICEhYf/+/WlpaQghnU6HMf6f//kfhFBwcHBubq5KpXIurUNCQnJycmJjYxFCiYmJtHhQUJCj4s+fP0cI7d27F2N85coVhNCLFy8EpbXVal26dClCqLm5ubCwECF05coVjhMcmQEAnxh4OrgNuA4A5ovg+4CPjw9CyGQy8fPTB6vJZMrLy0MIbdiwAWN87tw5+hgtLS1lGAZjLPjCgHnvFUajUSwWy+VyUkqj0SCEfv31V1fKfgIXAcC/A5DWAPCxcCKte3t7x8bGyDZ5yJHthoYGko3IzpycnMOHD+fm5iKEAgICpqamGIbp7Oy8fv06QkgsFjMMExkZiRCqq6vDGHd1dTmX1q2trRjjV69eIYQkEgnGOCoqCiH04MEDJ8U1Go1CoWAYRq/XL1u2TFAtkyKPHz8WiUQZGRlyuTwtLY3vBEdmAMAnBp4ObgOuA4D5Ivg+QCYuGR8f5+dH7xIWFkb6qWGMq6urY2JiSHpubi528MKAee8VGOPk5GSEUHNz88DAAEJIp9O5XhYAAFcAaQ0AH4s5x1rzt6empkg2Dw8PxKOqqkoul/v7+5OnIylLck5MTGCMGYZxXj/ZZhtGipNHu6PipKf3gwcPvLy8Tp065URaY4x1Oh1JIWrfSWYYhg18RuDecxtwHQDMF8HnHfm0TZ6VHEjmQ4cOFRYWXrt2jTOmmmGYEydOIIR8fHywgxcGzHuvwBj/+eefCKHi4mLSB+3ixYuulwUAwBU+0iMSpDUAuCOtqUANCQlBCNGv1AQyTeibN2/IyCuSPzAwECHU1NSEMSadt+esn20YqfPJkycY4+bmZsEiPT09CCGi51+9euVELd+9exchlJWVJZFIdDqd3W4HaQ0sTODecxtwHQDMF8HnHZnKRKfT0Ue/2WwmG5xXAgrp84UxNplMCCEPDw+GYQRfGAQrMZlMEolk3bp1u3btkkqlExMTrpcFAMAVQFoDwMfifaQ1mSpMqVTu378/Ly9v7dq1GGOZTIYQysjISExMpPn37dtHcubm5oaFhc1XWu/duxchFBYWlpeX56R4QkICQkij0fDPi2abnJxUKpVSqXR4eHjHjh0IoQsXLnAW3wJpDSwQ4N5zG3AdAMwXweedyWQiQ7qioqJyc3OzsrKCg4PJIUfK1sPD49tvvz148CB5KKenp2MHLwyOKtm4caOvr69Kpfruu+/mWxYAgDkBaQ0AH4v3kdazs7MFBQWhoaFisVihUGRnZ2OMy8vLAwMDfXx8SE8wKmi/++47Ly8vhULx22+/zVdaT05Obt26lRQn04eSIdycIv/5z38QQidPnuSfF82WlZWF3k541traihDy8/NDLJyYAQCfGLj33AZcBwDzxdHzbnh4eN++fcHBwWKxWCaTpaSkkHRHylav18vlcvJikJWVRaZAE3xhcFRJRUUFSSczk8+rLAAAcwLSGgAWO0RIY4xra2vR29A0APy7gaeD24DrAAAAAEAQkNYAsNjRaDR5eXmZmZne3t4IoWvXrn1uiwDgowNPB7cB1wEAAACAICCtAWCxs3LlSqlUKpVKly9fXlFR8bnNAYBPATwd3AZcBwAAAACCgLQGAAAAFh3wdHAbcB0AAAAACALSGgAAAFh0wNPBbcB1AAAAACAISGsAAABg0QFPB7cB1wEAAACAICCtAQAAgEUHPB3cBlwHAAAAAIKAtAYAAAAWHfB0cBtwHQAAAAAIAtIaAAAAWHTA08FtwHUAAAAAIAhIawAAAGDRAU8HtwHXAQAAAIAgi0JaAwAAAACfz/2M+iL53BcNAAAAABY0H/zJC9IaAAAAWOh87mfUF8nnvmgAAAAAsKD54E/ehSWtP7cVAAAAwMICng5uA64DAAAAAEFAWgMAAACLDng6uA24DgAAAAAEAWkNAAAALDrg6eA24DoAAAAAEASkNQAAXwyzs7Of24RPxOTk5Oc2gcvo6CgnZXh4+LNY8kGAp4PbgOsAAAAAQBCQ1gCw2JmamgoODq6vr6cpTU1NOp3ug1TOMMy6deuc5xkfH//tt9+MRuOctSGEBLMNDQ01NDS4aSKPmzdvGgwGdsqePXvep36j0ahUKqempshuT0/P8uXLneTv6+vz9fXl2IAxZhjmxIkT/f39nES1Wu2eYbMsGIZxknN8fFwmk01PT7MTpVLp8+fPjx075l7rnxd4OrgNuA4AAAAABAFpDcybysrKpKQk5y/iC5OnT58ihCwWi9FoVKvVdrv9M9rgYrrbmEym6Ojo1tbWOXMePXpUIpHEv2XXrl16vV6hUNCUQ4cOYYylc3Hq1ClSIcMwOTk5ZHt2dtb5b5BhmPXr10dHR3/77bdz3lSOpHVzc3NgYGB1dTXGWCwWR0ZGRkZGRkRERL5FLpdjjC0WC0LIjwV7FyFEouJnz55NTExkG1NVVfX9998L2hP+FoRQWFgYe5dmO3Xq1NatW+luSUnJjz/+6PxMMzMzz5w5w0+/fv26UqmsqamhKXN6GGPc3t6uVqv5YWexWKx+i5+fXygPev+cO3fOw8NDLpfL5XL6rUQqlTIMs2nTptLSUucGLEDg6eA24DoAAAAAEASkNTAH3d3d0dHRVPINDw/LZLKOjo7PaxXmGeYK7y9f3WjURRs+uLTGGFdWVmo0Gud6tbm5OTY21mAwaDSakZERjHF1dbVWq713797Ro0cFi9y7dy8hIcFJnWyxR7YVLCoqKmhOhmF27typ1+ttNltGRsb27ds5Hrh69SpbvSOEOHqe5nz06FFGRgbGmKhojLFCoaBHqbQWi8WCdmKMqbS22+2rVq0qLS3lS03C4cOHaRF2cbbx5BDDMHK5XCKReHt7E12KMdZqtVKp1PstTU1NT5488X4XLy8vbx6k5ufPn3d1dWm1WupStof5l4NhGK1We/v2bf4hPz8/we0lS5aws9lsNrVa/fr1a4xxdXW1Xq8n1fr4+GCMzWbz+Pg4v/IFDjwd3AZcBwAAAACCgLQG5oAj+Q4fPkxerD87bmjR95evH6+GjyGt7Xa7SqWqrKx0kicrK4t0BS8sLLx+/TrGuKurq7GxcXZ2dtOmTYJjm0tLS3fs2OGkTr60Fsw2PT29efNmvV5Pztpms+3evTsxMdHJhxtHUWs2crm8vLxco9F4eHhoNBqNRoPnKa0xxj09PYJy8dixY+QDBC3iPGpNmrBYLBaLZXp6GiHU2NiYmJhIa1CpVC0tLewmxGKxozHMbW1tV69e5STOGbWurq521P+cI62PHj1aXFzMMAxHWv/666979+4tLCx88uRJXl5eTk4OkfEikciJpF/gwNPBbcB1AAAAACDIYpfWRM+UlpYqlUqpVJqWlkb6TJL0urq6gICA48ePY4ytVmtBQUFYWJhEIgkLCzt16hQNBlosloMHDyoUCqlUunv3bpKSm5srk8m8vb23bds2MTFBcpaVlalUKolEEhMTY7PZBFMELWRb4qjy0dFRvV7v5eVFomrkhZ4j2Ni7LhqJWGCMw8PDr127tgANE4RzaWgrczZHMly8eDE6OloikWg0mubmZnpHOWn05MmTYWFhHh4earWajl42mUxbtmzheMBRuuuOdeV2ys/Pd/4pxGq1rl69OpIFQoi9zS+Sk5ND+34L4oq0fvHihUaj2b9/PyeofuHCBZlMlpub29vbyy8lKK0rKipCQ0OXLVtGdp1HrRFCchbsXba0JkxOTubn59O79ND/PwAAIABJREFUtL293c/Pjw6Zxi5ErfmuyMrK+vvvv2k2pVL58uVLumu1WhFCMzMz/HPHGDc1NclkstOnT7MT55TWW7duFexbjlmd5yMjI/38/DIyMq5duzYyMhIUFETzdHV1KZXK7u7ujo4OnU4nk8mI8ic36gcc4v6JAX3oNuA6AAAAABAEpPVThFBaWtrw8HB/f79Wq92+fTtNz83NNZlMpBtkZmZmfHx8W1ubzWZ78uSJUqksLCwklezZs2f58uVdXV1ms7mxsRFjvHv3bp1OZzQaR0dHk5OT9+zZgzE2GAwikai+vn5qauru3bsMw/BTHFnItkSwcoxxWlraunXrhoaGBgcHdTrdnArWRSPZRYaHhxFCXV1dC80wR3AujaC0FmyOZMjMzBwaGhodHd24caNWq8UuxJYLCgpaW1stFsuBAweioqJIYnp6+po1awYHB9kecJTuomNdvJ0qKyuDg4OduIgDR6exY7ybNm0ifbDFYrGHh4dgx+z6+np+N2Y+tbW1CoXi+vXrfkIYDIbdu3eHhITwZ8kWlNYEqqjlcjkJVtOodVdXFzlqNpvnjFqfPn3az8+PnJHVat27d69OpyOR6m+++aaoqIhjD3vbFWnNMEx+fn5VVRVJDAoK6unpoaUmJiYQQnyPdXZ2kgytra0qlYod1p5TWkdERDx69EjwECdqHRER0dnZ2dLSwo5yNzY2VlRU6PX6I0eOHD16NDc3l6RnZWWlpaWRj4lfIqAP3QZcBwAAAACCgLR+ihCir7aVlZVk9CBJv3//PkkfHR0ViUTPnj2jBS9dukRiYiaTSSwWNzU10UMkM41E3blzx9fXF2NsNBrFYvGVK1doTn6KIws5lvArJ6KXzjl079495wrWdSPZNbS0tCCESNRuQRkmCP/S8KW1o+ZIBtr19/79+yKRyEU9T6w9e/YskWqOPODcM3M61sXbqaGhgVjuxNrNmzcrlUrXo9ZKpfL58+d0d3x8nJ+NYRiTyYQxHhkZ2bRpE//o2NiYE5MwxhaL5fz58xyFiRBasmSJ4AhktrTm10YSJyYmvLy8aKKTDuHsUdwXLlyIjIz86aefli9fbrVa2dUi1zqEswPjGONXr14pFAoyAbhcLmd/LOjo6FCpVBzjpVIpO4/Vah0cHGQPX0fvjmbnFJdIJPzJxgmcqDWx3N/fHyEUHBxMu6iQE9m8ebNKpSKdJmpqapRK5cTERExMDHtu+S8I0IduA64DAAAAAEFAWr+jlB49ekTCSiSdaAOMcXNzM5WUhMePH5Oc/EMkhQN5I6+srAwPD4+Li6utrSWZ+SmCFnIs4VdO0unSOILhWXa660aya2Cf7IIyTBD+peG37qg5R+bN2WhpaWlwcLBWq127di27Cb4HnHtmTse6eDvRW9qRwRjjtWvXUi9x1GZdXR0ns9lsFolE7HgyX1ozDLNr165vv/0WY2w0Gtlir7S0lIhqwXg1G86M3J2dnT4+PuRLhODp0Lg06cwcExNDQtbJycn0qNFoZA8P5ohS5EBaY4z37NmDECL989kUFBTQbc6NQQ456htfXFycmpqKMfbx8WEP3r548eLmzZvZTZAu4uzbuLCwcGhoiGz39vZ6e3vTDzGCeHh4kO4PfGjUemRkhHbDSU9PRwixu6ljjCsrK2nf9WvXrgUEBDx9+hRjXF9fHxAQ4OjvayFDfkqf24ovEnAdAAAAAAjykR6RX5i0pr0ry8rKlEol5sm2wcFBhBAZbUu4cuUKydnX18d5De3v70cIDQwMCLY4Ozubn5/PDqzxU/gWUkscVd7b24tY4fcbN26QUq2trWydVltbS9JdN5JtAClFWllQhgnCvzR8heyoOfek9Zs3b0QiEYmT0zPq6elBb3vRY4yrqqqcp7voWL5DBFOqqqoCAwMduYiQlpZG4pZhYWHkJ8Meei0Wi9nar729nRMX5Uhrq9W6ffv2VatWkWnAqLS2Wq3Z2dmRkZF9fX3s4hcuXNBqteR82QKSDcMwq1atKi4uJrubNm0qKyvjZPD39y8qKjp69Cjpuh8eHk4OhYaG4rfSuqmpid3V2ZWodV9fn16v1+l0T58+1Wq1W7dudWSk4I3hSFrbbLbu7m6MsVgsZleYmJjI6XcwODjo6elJd/v7+728vEiR2dlZnU5Hemg/fPiQjEbho1QqiQzmQ6T15OTksmXLyD3W1dUVFha2bNky+sOxWCw7d+6MiYl59eoVxrikpISzqFtVVVVERAT9LX8pgD50G3AdAAAAAAgC0vopQmjXrl2Tk5NdXV0qlerYsWNYSLZt2bJl+fLl7e3ts7Ozz549Cw8Pp0u5JicnJycn9/X1TU9PkyjfunXrMjIyjEbj7OxsZ2dneXk5xvj169cPHz60Wq0XLlzw9/e32+38FEcWsi0RrBxjrNFotmzZMj4+bjAY4uLiSCmz2ezj4/Pbb79hjM1mc1paGq3NRSO7uroQQg8ePCCvziEhIWTG6YVmmCCcSyOokAWbcyStnTfa0dGBEKqtrR0fH09NTaU1LF26VK/Xm0wmssaV83QXHevi7XT48OG0tDRH/mEzNTW1YcMGvV7P/skwDOPh4cE25saNG0lJSeyCbGltt9tTUlL0ej2NxhNpXV9fr9FoUlNTOUsrv3r1KiQkhIjMiYmJ4ODgu3fv8m07duxYSkoKDVa3trb6+vqy+yE/fPgQIZSTk1NSUpKVlYUxJpPPaTQatrS+evUqe1I3R9LaYrFIpdLp6emsrKzQ0NDS0lLS9MzMzLZt2zQaDXEIZ0UuhBAnxWKxOJ/RzWw2I1afgv/+979hYWGcPufNzc0hISF099y5c+np6WT70KFDiYmJxJiGhoaoqCjB+c/0er2jdaf9/PxGRkZ+//332NjYzMxMu92+fv36c+fOJSQkvHz5sqmp6ebNmxjj6urq0tJSi8UyMDDQ1dVlsVhGRkaIkh8aGsrPzxecSX6BA/rQbcB1AAAAACAISOunCKHi4mKZTObn57d//34yrzJf3szMzOTl5QUFBZHJn8+fP08PDQ8Pb9myxdvb29/f/9ChQxjjsbGxHTt2+Pv7e3h4REVFEQHZ29urVqtJ8ZqaGsEURxayLRGsHGPc0dGRmJgokUjUavXx48dpqerqapVKpVKpdDrd6dOnabqLRmKM9+7dK5VKSezx4MGDZPXgBWXY4OCgVCrlz3rFuTSC0lqwOSezrLG9wScnJ8fLy0upVB45coQWefnyJfXAiRMnnKe76FgXbye1Wu18MD+BCLOsrCwi9vDbTteNjY3sma4wxsXFxUS7UjhR6/b2dqoVZ2ZmKioqkpKSVCoVHbXLPq+YmBj2nX/58mVPT89bt26xs1VVVYWFhdHIucVimZiYKCoqCgwMpCOQx8bGCgsLGYaJjY0lFdKoNYFI63379rHnNheU1qOjozqdTqPR/Pzzz5WVlXyxyukpzS7uKGrNHivOPvrkyRPav6C2tpZM8EbO0WAwzMzMWK3WvLy8NWvW0CJJSUmXL1/GGJ87d06pVBqNxsnJydevXz9//lyj0eTl5fENq6io0Ol0/PS2tjaRSETu1a6urvr6+p9++mn16tUMwyQmJra0tJw/f57MRt7Y2BgXF4cx/uOPP7Zt24YxNhgMQUFBJpOJYZiEhAQ6K9sXBOhDtwHXAQAAAIAgIK25Mubfwcc7r/7+fn9/fxJmdIOPZFhFRQUR/ACbW7duqdVqwUXdKPfu3SMdwkl8kqrNZcuWeXl5+fr6km7YP//8MxGHEolEIpHwZxcjGwzD9Pb21tTUnDp1av369X5+fmlpaVVVVfyoJpHB3t7eS5cuVSqVcrk8MDBQpVLFx8d7enr+888/JFtra6tIJPLy8pLJZAEBAUqlUq1WJyQkrF69Oi4ubuXKleyzO3fuXHx8PHskNjlqMpmCgoLMZrNcLmcvIk1O1m6322y2gYEBsVjMMMzZs2cLCwstFsvhw4cjIyNDQ0PDwsKioqKWLl2qVqvDwsIUCsWmTZsOHDggfxf07rJeBMGodX19fVBQUExMzJIlS44ePYoxfvTokZeXF/0IYjKZPDw8yN9XcHAw7eltNBo9PDzoYHWJROLp6RkUFBQXF7du3bqtW7d6eHiwZ1ukTmAvBUexWCxlZWX00pSWli5dupR8wjh06NCSJUsUCgX5jvD1118T8Wy1WkNCQsjC4z/88MPJkycxxo8fP1ar1YKdbhYyoA/dBlwHAAAAAIKAtF5Y0hrxcK+ej3pe5eXla9ascT4zliM+kmFZWVmcUOcn4ENdrI/E+Ph4TEwMe4J0QSorK2/cuEH1FcMwdM5tNzCZTPHx8Xq9vrCw8M6dO46GJRPu3bvX1NRkMBgmJibYwuyPP/5gR0GbmpqGh4f54txsNpMlymjKhg0b2MoZY5yQkODj4+Pv7//zzz83NjZygrfkZBmGkUqlIpFo48aNGGP+zckwjMVimZ6ennoLp8+2c9jjnMmkA1arlaxxRdfuZhimra2Nf4KTk5NszxiNRtq122AwjI2NcQTtmTNn2KOg2TYsW7bM+eUwmUyCwxxmZ2evXr1KG3r58iX5YDExMUH9wF4M7EthAf5mvxTAdQAAAAAgCEjrhSWtPxQL9rwWrGHAv4A5P/eQhaP42O32eanlL5GpqSnn/RcWG6AP3QZcBwAAAACCLHZpDQAAACxC4OngNuA6AAAAABAEpDUALFK+xFmdFw42m81oNC60ODA7LG+3281m82c0ZoEDTwe3AdcBAAAAgCAgrf/lnD592vkAS8B1qI4ym838+a4pfX19KpWKdjAeHR11fhOaTCZHI6KvXLni9oxxc4IQojNsA/PCaDSuWLFCpVIVFBR87Om7WltbXRTwr169ioiIoLulpaXp6elum1ddXU1vD7rKN8a4vLzcYDDQXaPRqFQq6Z9MT08Pe+VwwtDQUENDg3tmfDzg6eA24DoAAAAAEGSxS2sy9BchJBaLV65c2dXV9aGa7u7u1uv1fn5+YrFYqVQ6WrDno/LixQuVSvXFzdy7MJmdnY2Li7t9+zbG+M2bNxKJxFHO3377LSUlhe7OKa0zMzO//vprwUPnzp3T6XQMw/g54KefftqzZ0/kW8RiMWeDIFi5oLTmz82GEPoEI+RpE0aj0b3ppkkNnDW3CVqtds7KXZyLzmq1nj17VqVS3bhxw2az5efnJyUlOfoyUlpaqlKpPDw8li5d+uDBg/meEeGbb77ZunUrwzBXrlzx5sE2uLCwcO/evXTXZrOtXr26s7PTvXbJ2njPnz/Hb6X11NRUZmamRqMhM4QTTp06tXXrVrpbUlLy448/cqpqbm4ODAysrq7GGNM7MyIigt6fZAUyi8WCEGLf3uxd9HbV8Q8F6EO3AdcBAAAAgCAgrf/vhd5isVy6dGnFihUfpF2LxRIaGpqbm9vf3z87O9ve3v7mzZsPUvOcPH36lL6MisViHx8fQUn2aYz5ounu7o6OjmbryRcvXigUitra2q6uLl9fX0cFly9ffvXqVbrrXFrfuXPHy8vLUWjabrevWLGirKyMnZiamvrf//5XMD+9soKX+OrVq1IWCCHpu9CcTpb1/ki8fxP0M9mLFy/Y6fX19STdeeVzGjA5Ofn7779HRESsWbMmKipqxVsCAwOXLl2q0+nOnz8/NDTELnL48OGmpqaRkZGTJ0/6+fm51z17YmKCLAgveFQsFpMNq9UaFBT08uVLR19hpqen59v048ePL1y4gN9K65qamgMHDlAXMQwjl8vJSmxkpTGMsVarlUqlVPnTjw6PHj0iy+PRdbzZK8NTaU1PBztYdXy+p+AE0IduA64DAAAAAEFAWr/zPh0REeHemlIcWltbEUJk+dnPxePHj+Pi4mAubrcR1FovX740m82PHj1SqVSCpZ4/f44QYi9i5ERa9/b2ymQyol4wxnq9/uzZs5w8L1++JEsNE9ra2kQiEefW8vPz02g0Go1GLBZzNjQajaPFtJx0CP9CpbVIJIqKisrKymKnb9q0Sa1Wv6e0np2dValUer2ev0QWxthsNp8+fTo0NNRR5xSz2YwQ6uvrc/ls3qGjo8PRlaJa9MKFC5zbjCNN58Xq1avVLEQikfpdtm7dSuon3yWnp6cRQo2NjYmJibQSlUrFWQsNYyyXy8vLyzUajYeHB7k/MUjrLw1wHQAAAAAIAtL6/9+nGYYJCQmhh06ePBkWFubh4aFWq+vr60liWVmZSqWSSCQxMTFkAKTFYsnNzZXJZN7e3tu2bSPTCE1MTPj4+GRlZfEjRYL5iRl1dXUBAQHHjx9fv379Dz/8QItoNBqymK0rZUmRN2/ehISE+Pn5hfIg3w5IqdLSUqVSKZVK09LSRkdHBWuzWq0FBQVhYWESiSQsLOzUqVP064PFYjl48KBCoZBKpbt373ZkoaDf+CmCl4ZtiaPKR0dH9Xq9l5dXaGjo4cOHyQV1Ig5dNBKxmJ6eFr+LSCRi7yKESNdZvV6PEJqampp9y/DwMFEFBOq90dHRpUuXZmZmkt3y8nI/Pz/n6stutycnJyOEBgcH2en8YDU7av2hpHVZWVl0dLREIlm6dClZq9n1ayT4azKZTFu2bHF04cjGxYsXSaMajaa5uZlzxZVK5ZEjR9j5i4qKvLy86KeN169fi8Xi06dPcyo/f/68QqEgP88bN24EBwffv3/febukztDQ0BU8PD09ydVxdOFqamrCwsI+yGc7DkSLTk1NhYSEfEBpTWAYpqSkZOfOnZ6enrm5uTdv3mQvUcaun2xnZWX9/fffNAMZCFNRUREaGrps2TKS6DxqjRCSs2DvgrReOIDrAAAAAEAQkNb/96o9MzNTWFi4cuVKeqigoKC1tdVisRw4cCAqKgpjbDAYRCJRfX391NTU3bt3yYvy7t27dTqd0WgcHR1NTk7es2cPKX779m25XB4YGFhUVMQW2IL5iRm5ubkmk+n169fXrl1TKBSk/ra2NqlUSl7rXSlL7IyJiRE8cfp6SkqlpaUNDw/39/drtdrt27cL1paZmRkfH9/W1maz2Z48eaJUKgsLC0lte/bsWb58eVdXl9lsbmxsdGQh32+CnhS8NGxLHLk6LS1t3bp1Q0NDg4ODOp1uTmntopFOwpj79+/Py8tjpygUivb29sePH8tkMiKtkQM2bNiAMTaZTFqtdsOGDUSrvH792t/fnzM12unTp/38/Nj9tI8fPx4YGIgQUiqV7F7inyZqvWPHjsHBwbGxsfT0dKKUXL9G/F8Txjg9PX3NmjWDg4OCF45sZGZmDg0NjY6Obty4UavVkoLffPMNveKrVq1i5x8ZGfH39y8uLiY58/PztVotp06LxWK323U6XVFRkdVqjYyM/Oeff1xpF2McGhrKd5dgIqWxsTE0NPTRo0dO8jhi9+7d3t7eNJbr7e3N6eZNfubZ2dl79+5lh3zxe0vrmpqaxMTEI0eOMAwjlUpfvXr1008/xcTE5ObmktA9X1ozDJOfn19VVUUSg4KCenp6yDZV1HK5nNyWNGrd1dVFjprNZohafxGA6wAAAABAEJDWT6nmkUgkx44d44yHNBqNZ8+eJW91RqNRLBZfuXKFHh0dHRWJRLQX6J07d9hDcE0mU2FhoUwmCw8Pb29vd5KfmHH//n2SPjMz4+PjU1dXhzE+fPjwtm3bXC/7+PFjhUJRUVGBEArnwZHW9MW3srLSx8eHXxtp9NmzZ/SkLl26RMJNJpNJLBazJ3ByZCHfb/wUR5eGYwm/chITbm1tJen37t1zLq1dN9KRtLbb7RERETU1NdXV1fSjia+vb3d394oVKy5fvkykNdstnJuwt7dXrVanpKSQm81msyUmJmZnZwv6gUrrkpIShULR0tKCECLjwAsKCsih5ORkjLHVat20aRO7LzqBzOx1/vx5/gxYS5Ys4SQKnjvZHR4eJru1tbUikYh+fZjzGlHYv6Y5LxyVyiTD/fv3SaMjIyPsgnfv3uUUPHLkCAkRT09P+/v7V1RU8KU1xrijo0OhUBQWFu7cuZN9yo7aJbvh4eEbeISHhzsaRz00NCSXy2mg3j2o4OT/m61duxZjvGHDhvHxcZLt77//FpwGzPXmTCZTVFRUXFwcndb7l19+IRsWi+Xy5cuxsbFff/211WpF70aVMcavXr1SKBRkCnG5XE6/3bClNb9FkjgxMeHl5UUTQVovWMB1AAAAACAISOv/j2K9fv16y5Yt69atI4dKS0uDg4O1Wu3atWvp63hlZWV4eHhcXFxtbS3GuLm5GfFg95nEGE9MTKSmppIhhY7yEzPYomjPnj3Z2dlExZG5hV0s29jYWFJSgoXewjEvak2106NHjxBCVCzR2kijbKH4+PFjkpN/yIk3OH4TTBG8NBxL+JWTdCpxBUUUO911Ix1J69u3b4eEhNhstpMnT2q1WiI4JRJJf38/UVBoLmmdn5+/d+9e2g0+KysrMTHRYrEMDQ3xPzdIpdKpqak9e/ZotVqDwUD1xsjIyPLly4uLi+k0yyEhIRKJJFKII0eOsOvs7Oz08fEh6tRJlwFHY605Tp7zGmGhX9OcF875FXRScHh4WCqV3rp16/z58+Hh4bOzs47qzMjIQAiRObTnbNdkMul0upUrV65atUqn0yUlJUVGRup0ulWrVq1ater777/nuxFj/Ndff+l0OsFDruNEWhOItR8wat3c3Ez7t4+MjLA7b2OMGYZpamriR63JdnFxcWpqKsbYx8eHfqGgcemgoCCMcUxMDAlZk69C5KjRaBSJRAoWCCH2NkjrBQK4DgAAAAAE+UiPyC9PWpPd+vp6EqF68+aNSCQiIdna2lp2ntnZ2fz8fPIu2N/fjxAaGBhwbsbDhw9JtY7y81VcfX19YGBgQ0MDXT3L9bL03AUdwpbWNA5ZVlamVCr5tQ0ODiKE6BhXjPGVK1dIzr6+PoQQe94m595g+81RipPzclR5b28vYoXfb9y4QUqRmeSo6qMX0XUjBR1rsVhiYmLI0HeMcUlJyb59+2ZmZhBCdFzxnNKarWZLSkrCw8PJhTAajf7+/g8fPmRnlkqlly9fPnbsGLGErWEmJyfpFXzy5Mny5cup9mhoaJBKpWS5Iw4Mw6xatYp2md60aRNnBnL+uTuX1nNeI8FfU09PD0KILndXVVXlorTmFKypqeHn37dvX0pKSmxsLLlSgnW2trYqlcr8/PzvvvvOyUmxd61WK3tAtSuhYJPJ9P5L+jmR1kNDQzdu3OBkI7yPtGbPzkCi3/7+/uzElStXOpLWNpuNzHgvFovJD4FhGH9//6KioqNHj5Le9eHh4bQh/FZaNzU1sdfEhqj1ggVcBwAAAACCgLT+v/dmu91uMBjS09NXr16NMe7o6EAI1dbWjo+Pp6amkjyvX79++PCh1Wq9cOGCv78/eclet25dRkaG0WicnZ3t7OwsLy/HGLe1tf3yyy+9vb0MwwwMDHz33Xek36aj/HwVZ7fbw8PDk5KSTp06RRNdLEvPnR+95EjrXbt2TU5OdnV1qVSqY8eOCda2ZcuW5cuXt7e3z87OPnv2LDw8nArL5OTk5OTkvr6+6elp0n1d0EK+3wQ96ejSOD99jLFGo9myZcv4+LjBYIiLiyOlzGazj4/Pb7/9hjE2m81paWm0NheN7OrqQgg9ePCA6nO73b5r166VK1eytbHdbu/v72f3GZ5TWlOuXLkil8vZnyf+/PPPsLCwyclJskuGubKLONJLFRUVCQkJq1evLikpKSsrCwoKunXrlmCjx44dS0lJoda2trb6+vpyeiy7J60d+Vbw14QxXrp0qV6vN5lMBoNBo9G4KK0xxhqNhhQ0Go2Co+u7u7vFYrFMJiPBbX6dNpstLi7u4sWLU1NTgYGB/LHWgu2mpqbqWIjFYvauoLcfPXr0n//8R/AQ57KWlZXNzMwIHhWLxQzDkMnnOYfu37+fkJBAs3HqdP7v57xRSkpKys6dOzUaDf2Ow6+f3xaZFJ3cZg8fPkQI5eTklJSUkPnbyfxwGo2GLa2vXr2q1+sd2S8orV08BUFAH7oNuA4AAAAABAFp/RS9RSaT7dixg74+5uTkcKYgJkNkySzHNTU1JNvY2NiOHTv8/f09PDyioqKIljMajWvWrJHJZGKxODg4eO/evXS1JMH8gvK4sLBQLBazJ5pyvSx2LWpdXFwsk8n8/Pz2799P+ifza5uZmcnLywsKCiInfv78eXpoeHh4y5Yt3t7e/v7+hw4dcmQh32+CnhS8NGxLBCvHGHd0dCQmJkokErL8Ly1VXV2tUqlUKpVOp6NzRLtuJMZ47969UqmU9IadmZnZvn27SqXq7+/HGNvt9uHhYavVarFYTpw4ERkZyXayK9L60qVLMpmMDla32WxkMrCYmBgy7npsbGz9+vURERGHDh0ijWKMGYbhLC5FGR8fP378OJGU4eHh+fn5t2/fZluCMa6qqgoLC6PddC0Wy8TERFFRUWBgIPtOc1taO7pG/F8Txvjly5f0wp04ccJ1ad3Z2blixQoyl/vJkycRaywDu7M3nW+PX2dhYaFGoyHCj8yTT/8HHLXLnxhcLBZzUu7du8e5KKdPn46NjRW8XmyamppIZxA+ZHKvVatWnT17ViKRsOeQZxhm//79dDWB+UprJ43SprOystLS0ux2e0lJSVhY2M2bN+mHMFI/e+g+u+yTJ09oh5SxsbHCwkKGYWJjY8mPi0atCSTnvn372F8SXZHWc56CE0Afug24DgAAAAAEWezS+l8M+8SHhoYMBkNdXZ1UKiVvxk6mv/6i+UjnNTw8HB0drdVq2frTx8eH3GABAQG3b9+m6a5I619//RUh5OvrGxYWJpfLPT09PT09AwMDo6KiEhISpFLpo0ePSktLCwoKZmZmDh06pFKpyITzAQEBgYGBCoWCLHC1Y8eOysrKzZs3x8bGKhSKnTt3ku4D7e3tRUVFOp1OKpWSafAwxq2trSKRyMvLSyaTBQQEKJVKtVpNYt2ca/gaAAAgAElEQVRxcXErV64UXAVtgXP9+vWwsLBP2SIR5CMjI4GBgR+qzrNnz+bm5goeqq+vDwkJIcMEyBcKqma9vLzi4+NJ72v8Vlpz5g+n22RUsyuNms3murq6I0eOhIaGZmdn019TQ0PDV199pVKp8vLyysvLx8bG+FHr+vr6oKCgmJiYJUuWHD16lF3tuXPn4uPj2T0+yP1mMpmCgoLMZrNcLmevg03qtNvtNpttYGCAhO5d99ucLOanw3sCrgMAAAAAQUBa/2thn/iff/4ZExMTHx//66+/kpSFJq0RD/fq+XjndevWLc4EdRaLZXx83GQycTq03759m6Mf2MKbYDQay8vLHz161NnZOTg4yDH4l19+uXnzpiOhyzCM7S0Mw/T19VVVVXV2dgr2qzeZTC9evKC7TU1Nw8PD/Oif2Wwma2g5PP+FxB9//NHX1zc7O9vS0qJWq9mhzk9AY2NjQEBASEjI4cOHP1SdGRkZTmYRp8P4nVNUVPRBGp2amlq/fn1BQYHgKPHm5ubjx49nZ2eTngI0ncx3YLVaOzs7W1paent7OQU3bNjAVs4Y44SEBB8fH39//59//rmxsZHTqZ5hGG9vbzImQiQSbdy40fVTcIXF/HR4T8B1AAAAACAISOtFykKT1h+Kf+t5AWy2b98eEBDg4eGhUqmKiooEJzkHFhpzXiZHXxDsdjvnq9YHAZ4ObgOuAwAAAABBQFoDAAAAiw54OrgNuA4AAAAABAFp/e/EYrEYDAaMMV3+FwAINpvNaDR+icOqAeADsmifDu8PuA4AAAAABAFpjTHGz549a2ho+AT2sKmurqZzYrEXWCovLyeq+H1oa2uLjY0dGxtTq9VVVVX8DAzDuLIqrxPoLNNzYjQalUolndmrp6eHvXotZb4OGRoacuXinj59mjNL9vswPj7+22+/sScz4/Ddd9+xO75u27bNve7KH9y9NPOKFStUKlVBQYHg2GwAWCSAPnQbcB0AAAAACALSGmOMc3JyTpw4MWc2qVRKF4gWiUTs9aLZUtDbAQgh9joxZGmo58+f47dKcmpqKjMzU6PRdHR0uHO2LHp7e8lyUG/evNm9e7fgerBsz3R2du7evZuKQE9PT/5SQytWrCCL0BLS09PPnTtHi9fV1VVUVJw5c2bfvn3Jycnp6ek056lTp7Zu3Up3S0pKfvzxR77N83WIK9L6xYsXKpXqQ2lIhmHWr18fHR397bffOhLMZE5juuvh4cHP+Vnca7Vaz549q1Kpbty4YbPZ8vPzk5KS6NJfHEwmk0ajaW1tncMjAPDFAvrQbcB1AAAAACAISGuMMV69evWdO3forlgsZq9eQ9PZ+pm9zd/lYDQaN2zYoFarHz16xE5//PjxhQsXaPGampoDBw7Mdwque/fu+fHw9fVlnwUNULM/ByCEyMa3336rUqmokMMYe3p66oRga7/+/v6QkJC2tjZi/8aNG7Ozs4uKiioqKp4+fUrW8WYYRi6XSyQSb29vuVxOVq/VarVSqZR+cWCru3k5xJG0fvr0KT1rsVjs4+PD948bEXuGYXbu3KnX6202W0ZGxvbt2/mGMQzDXlvYbreLRCJ+VZ/YvZOTk7///ntERMSaNWuioqKokg8MDFy6dKlOpzt//vzQ0BDHyNraWrryMwD8+wB96DbgOgAAAAAQZLFL66ysLKlUihCSSqVkA79dHpbWQLelUqnmLSKRSMPCibQuKyuTy+WHDx9mK7HVq1erWYhEIvW7sOOQbjAxMaFQKJxkoFHr1tZWjUZz/fp19lG2xnOS/s8//xBh7Oj0SSsWi8VisUxPTyOEGhsbExMTaQaVSkXW43HRIYi1Tq+vry9718fHhwTqKY8fP46Li/sgs4VPT09v3rxZr9eT2mw22+7duxMTEznh9OnpaW9vb7o7MzMjFov5MfNP6d6mpiaVSqXX64lK52A2m0+fPh0aGvry5Uv+UZ1OJziaAAD+BYA+dBtwHQAAAAAIstilNca4tbVVrVZjjMfGxogcdSKtBbf5u5QNGzZotVpHHWsZhikpKdm5c6enp2dubu7Nmzc/1BozDMP4+PiwU2prayPfhUStPT09/f39aSLJ7EqPZTbOtR97Oysr6++//6YZlEolW9TN6RCEEB1UzIlat7a2sqX1mzdvQkJC/Pz8QnnMNxL74sULjUazf/9+TsELFy7IZLLc3Fy6hO/w8HBAQADNMDAwgBDiDxT/xO4lq1WHhobyW/T09MQYO+owX1pampGR4dgxAPAFA/rQbcB1AAAAACAISGt89uzZH374AWPc2NiYnJyMnUprV8ZacwxwNB9VTU1NYmLikSNHGIaRSqWvXr366aefYmJicnNzBQOMzhGLxeHh4eHh4dR4mUxGdOmmTZuGh4fZmWdmZv7888+vvvoqLy+Ps5ZsQkJCQkKCQqFIEIKknzlz5uzZswqFgkpBT09P9pBysvHnn3/ytR/DMPn5+TQWGhQU1NPT47pDXJTWBoMhJiZG8NIjhPgjz51QW1urUCiuX78u2KvcYDDs3r07JCRkcnISY9zZ2YkQOn78OCnb1NSEEGL3CPiM7hXU7Y7EPOHp06dhYWGu+woAviBAH7oNuA4AAAAABAFpjTds2PDPP/9gjH/55ZcjR45gx9I6Li6ObnO0NDl09OhR/tRl/PnMTCZTVFRUXFwcnZb8l19+IRsWi+Xy5cuxsbFff/31vIKrtPs33dBoNH19fU1NTTExMTRbd3f3wYMH/f39EUIymYx2t9ZoNDQPO/bL6WLNgTjBarWyI+RsjxG9J38LOfTq1SuFQkFiuXK53Gg0uu4QV6T148ePFQpFRUUFQiicx3ylNcMwZGCzE2if87t37+p0upiYGDJi/Pz58xEREXv27GFn/vTuJZnDw8M38AgPDzebzY4MMBqNEonE+bkDwBcK6EO3AdcBAAAAgCAgrXFiYuLBgwdtNptGoyFDW/nSuqenR/EuCCEFD0EDRkdH+enNzc20F+7IyAinLMMwjqZudgRfWm/atKmurm779u1lZWUY4ydPnmzYsMHLywshxO92zj7lyMhI2mGYhL6XLFmyfPnyFStWaDQadk6i/QwGQ3R0NPuU6TY/rEq2i4uLU1NTMcY+Pj4kqu+iQ1wZa93Y2FhSUsKxhG3evKQ1xlgwXs3m+++/JzmPHTv2888/9/b2BgYG1tTUpKSkXLp0KSgoaGZm5jO612Qy6XS6lStXrlq1SqfTJSUlRUZG6nS6VatWrVq1ihrPB6Q18C8G9KHbgOsAAAAAQBCQ1thsNu/YsUOtVq9cuZKkOIpaE6qqqtasWePp6anX648ePTqnAYLSmj3018/PDyHk7+/PTqTGuIhYLCYFqfGnTp3avn17bGwsUZL37t1LSUnp6uoSdAhHWnO2f/jhh4qKCoxxQUEBOwZLtF9FRcW2bdvYp0y3HWk/m83W3d1N2iVRaBcdsmLFChpl5UStu7u7OQODP5S0ply4cEGr1ZIYteBa2QkJCQ8ePMAY37179+TJkwEBAWazeevWrUTqEz6Le61WK3tAtYsTpD979gw6hAP/VkAfug24DgAAAAAEAWmNMcadnZ0+Pj5KpfLJkyfYqbS+ePGiRqMZHh6WSqUWiyU9PT0jI8NJh2FH0ppNSkrKzp07SbVOss3OzpaVlbHjn2yoqrx48SLZaGhoEIlE9fX1GONr166RwcDEpHgeTqLWGGODwaBWq2tqaiIiIthDx4n2++abbyorK9mnzLZZUPsRzGYzGR7snkPmXNcavV1djDN5m6C0du5ejPGrV69CQkKIZJ2YmAgODr579y47Q1NTU0hICDkdhmGSk5OLi4sxxi0tLTKZ7M2bNyTbZ3Fvamoqe5UvsVjM3nV0yr///vvmzZsdHQWALxrQh24DrgMAAAAAQUBa4+7ubqVSef78+fLy8iVLljx48EAsFnPGr2KM+/v7MzIyEhMTyQrARPYwDFNYWCiTyX7++WfBucecS2uz2ZyVlZWWlma320tKSsLCwm7evOlouuampialUslPHx4efvDgwdWrV4uKivbt25eWlrZp06bHjx9rNBq1Wk1mtIqOjmZLa34lHGnd3d1dX19/5coVuVyelZX15s2b/Px8hNDZs2dJHpvNdu3aNQ8Pj7/++isyMpLdw5yv/dgjz9mNPnnyhCzF7J5DXJHWgomC0tqRewljY2MxMTE1NTU05fLly56enrdu3SK7drs9OTm5tLSU7Obn5ycmJtpsNrL7448/Llu2jMjmT+9e/sTgYrGYk3Lv3j3+WSclJXFWZQOAfw2gD90GXAcAAAAAgix2ad3Y2BgYGJifn092r169OjIywo9ad3Z2LlmyJDc3l05YxZ7G7OXLl5s2bQoNDSWrHGGMTSaTyWRqa2tDCE1PT3MaNZvNdXV1R44cCQ0Nzc7OpnU2NDR89dVXKpUqLy+vvLycM3f32bNnc3Nz+afQ2tpaUFBw6dKlhoYGo9HY19f3zTfffPXVV01NTcPDw6tWrdq4cWNKSgr7jNQ86Clv27Zt5cqV27dvLywsvHTpUkhIyM2bN7/55puvv/76zp07SUlJq1evfvDgQWVlZVpaWlVVVWpqqlQqlcvlQUFBSqVSpVKRUei+vr4VFRWCYdX6+vqgoKCYmJglS5aQHvXuOWRe0npoaMhgMNTV1UmlUkGt7si9GGOGYWJjY729vZcuXapUKuVyeWBgoEqlio+P9/T0JHPgXbx4UavVEg28f/9+lUrV399Pa7BYLGvWrNFqtVu3bv307mWfCMZ4ZGQkMDDQid8IDQ0NarXa7c7zALDAAX3oNuA6AAAAABBksUvrv/7668SJE5zEkydP0m0y1TPGmLM6MX9uZyoIMcbnz59HCInFYs7s0ISpqan169cXFBR0dXXxjzY3Nx8/fjw7O5vTUzojI4P07p4T9jLadru9q6uLPQs0pxsz4f79+4JV5eXlGQyGv/76i8rRlpaWrq4uhmE45s3Ozloslunp6enpaYvFQgOtT58+pXnIQlBWq7Wzs7OlpYUuB+2eQyYnJ7Ozsx164V1p/eeff8bExMTHx//666+CmZ279969e01NTQaDYWJigq3M//jjD9IvwGQyUeOvXbs2MDDAqcFisXR0dHASP417KY2NjQEBASEhIYcPH3Z0poSpqSmNRkPGRwDAvxLQh24DrgMAAAAAQRa7tP548NURAHwp2Gw2wXnaAOBfA+hDtwHXAQAAAIAgIK0BAACARQc8HdwGXAcAAAAAgoC0BgAAABYd8HRwG3AdAAAA4B50WuV/KyCtAQAAgEUHPB3cBlwHAMAXwdTUVHBwMHsmnaamJidrjs4LhmHWrVvHTx8aGmpoaPggTbB59uwZWXJoampKcCqc6upqo9FIttlzLZeXl7OnizIajUqlkg766+npWb58Ob829hxM9+/fF1ztaGpqig59tVgsZNqgsrIyJ2fR19fn6+vLmb4KY8wwzIkTJ9gTAJNEtVrtpLaFCUhrAAAAYNEBTwe3mdN1T58+JXnEYvHKlSsF56d0j+7ubr1e7+fnJxaLlUrly5cvP1TNHxCj0ahWqx0tG+lKBudUVlYmJSW5PpkLuRxkptU///xToVB4eXm51/TCgX1SrqR/JAMIvr6+GRkZw8PDH7tRF61in/4HcQitxL3aJiYmfvrpJ5VKJZFIZDLZDz/88J5WmUym6Oho9pS9jjh69KhEIol/y65du/R6vUKhoCmHDh2aV9MMw+Tk5JBt9iotbJqbmwMDA6urqzHGYrE4MjIyMjIyIiIi8i1kYVSLxYIQ8mPB3kXvrhTb1dUll8vv3LmDMW5paVEoFOfPn+e0W11drVKpnj9/jt9K66mpqczMTI1Gw55G99SpU1u3bqW7JSUlP/74I/8swsPDycbk5GRERMT4+Dg/T35+/t69e8n2li1bbty4gR0sfMsmMzPzzJkz/PTr168rlUr2MreOPLzAAWkNAAAALDrg6eA2Lkpri8VisVguXbq0YsWKD9KuxWIJDQ3Nzc3t7++fnZ1tb29/8+bNB6n5c9Hd3R0dHT0vgTE8PCyTyfjrTTiBXg6j0SgWi2/evPkJlOfHZoFIa9KQwWBYvXp1amrqx25UEPZdtACl9fj4+NKlS9PT09vb2202m9FovHXr1vtbVVlZqdFonH9gam5ujo2NNRgMGo1mZGQEY1xdXa3Vau/du8dZmtR1+IueKlhUVFSQQ48ePcrIyMAYExWNMVYoFLQSKq3Za/1yZCRbWhuNxvDw8JKSEnq0q6srMjJy//79HA88fvyYLGxEpHVNTc2BAweonxmGkcvlEonE29tbLpcTM7RarVQq9X5LU1MTyUyldVFRkaenp/xdSNjZYrHExsaeP3/eZDL5+/uHh4eHh4cjhMLfcvHixSdPnni/i5eXlzcP0tbz58+7urq0Wi11KdvD7l2yTw9IawAAAGDRAU8Ht3FdWpPdiIiID7JeRmtrK0JobGzs/ataILghMA4fPqzX691r5dmzZ59Gdn4CFpS0xhjfv39fLBZ/lnVh2JYsQGmdlZWVnJzM8cz7W2W321UqVWVlpfOmSVfwwsLC69evY4y7uroaGxtnZ2c3bdrEjgm7Dl9aO88vl8vLy8s1Go2Hh4dGo9FoNHie0tpgMKhUqsLCQk7NIyMjWq1Wr9cTN65evVrNQiQSqd9l69atpAny0XN6ehoh1NjYmJiYSOtUqVQtLS2RkZEqlcrDwyMyMvLKlStRUVEzMzPsppVKJe15/vz5876+vtOnT9NVXZ34RCwWO+rc0dbWdvXqVU4iRK3ZgLQGAAAAFi7wdHCbeUlrhmFCQkLooZMnT4aFhXl4eKjVajoAsqysjHQWjYmJsdlsGGOLxZKbmyuTyby9vbdt2zYxMYExnpiY8PHxycrKmp6e5rQomJ+YUVdXFxAQcPz48fXr1//www+0iEajKS0tdbHsvPzD0SEXL16Mjo6WSCQajaa5uZmdAbFwsfLw8PBr167Ny2/zam5edX483wreJyaTacuWLV5eXqGhoYcPH6b3mGA6vxVBYwRPmZ/i5CqT3Rs3btDIm6OGRkdH9Xq9oJ20HvauiwazL6tzac33qqNb1LlXnZjHcbvFYvHy8mKP2nXFKhcvSn5+vvPPTFardfXq1ZEsEELsbSdlHTGntK6oqAgNDV22bBnZdR61RgixQ8HsXSKtu7u7AwMDT506lZWVRdUsxthsNq9fv35gYGDFihWnTp2i6QzDlJSU7Ny509PTMzc39+bNm1ar1YnxWVlZf//9N81AR9k0NjaSqHVmZuaFCxcmJiZ27NhBP0YEBgZyhl7fvn379evXZNuRY61WK0KIo9IpTU1NMpns9OnT7ESQ1mxAWgMAAAALF3g6uI3r0npmZqawsHDlypX0UEFBQWtrq8ViOXDgQFRUFMbYYDCIRKL6+vqpqam7d++S6Nbu3bt1Op3RaBwdHU1OTt6zZw8pfvv2bblcHhgYWFRUxBbYgvmJGbm5uSaT6fXr19euXVMoFKT+trY2qVRqMplcLDsv/3CkdWZm5tDQ0Ojo6MaNG7VaLT+D67G74eFhhBAZu+6631xvbr51fjzf8u8TjHF6evqaNWsGBwcHBwd1Oh09F8F0fiuCxvBPWdAJTq6y3W5/+fJlTEwMHbXr6O5NS0tbt27d0NAQ305Bae2iwa5HrfledXSLOveqE/M4bn/58iVCiNwMgt4TtMrFi1JZWRkcHOzoZubD0Wk0YmwymYwuUF9fz+/G7KhjM1XUcrmcBKtp1JqMmsYYm83mOaPWDMPU1dVhjL///nu2hL506dLXX3+NMZ6amqKXu6amJjEx8ciRIwzDSKXSV69e/fTTTzExMbm5uW1tbVhIWjMMk5+fX1VVRRKDgoJ6enowxrt27fLz89u5c+fAwIDdbi8sLPzxxx/pZyYfH5/p6ekzZ86EhoZGRkZijCMdsHr1amrzxMQEQojvsc7OTpKhtbVVpVKxw9ogrdmAtAYAAAAWLvB0cBsXpTVBIpEcO3bMbDazMxiNxrNnz5J3RzIA+MqVK/To6OioSCSiU5TduXPH19eXHjWZTIWFhTKZLDw8vL293Ul+YgaNmM3MzPj4+JD31MOHD2/bts31svOCI2XJIE+M8f3790UiEVsLzVdat7S0IITI1L6u+8315uZb58f2Lfs+IZ8V6MxV9+7dI+fiKJ3TiiNj+KfMTxGEfZN7enr+/vvvZF46Rw05t5MvrV03mC+t+bAvOturjm7ROa118eKSO5a/2BL/VnT+nyB4URoaGoi1Ti7T5s2blUql86j17t27BZ3GgdbJMAz5WDAyMrJp0ybBdtnS2tHRiYkJ9oSCTsZaY4w7OjoCAwNJuxaLRaVS3b17lx41mUxRUVFxcXF0ZvJffvmFbFgslsuXL8fGxn799dckbswOjGOMX716pVAoyNhpuVxuNBrb29t1Ol14ePjvv/9+4MCB169fq1Qqg8EQHx9P/sk9PT0ZhrFarVNTU3QqcrVazdHVnMm9Ozo6VCoVxxVSqZQdjbdarYODg+zh6+jd0eyC3l5ocG6YDwVIawAAAGDhAk8Ht5nTdeyA3uvXr7ds2UKXqCktLQ0ODtZqtWvXrqXv1pWVleHh4XFxcbW1tRjj5uZm/nstu1sjxnhiYiI1NZUMXHSUn5jBjpjt2bMnOzvbbrdHREQ8ePBgXmVdx5GU5afPV1oTa+mqOS76bV7NzavOj+db/n1CaqNdFei5OErntOLkpuKcsmAKH9rQwMBAamqqWq0m18VRQ87t5N8krhvsetSa71XnrTux1sWLOzo6ihB69uyZI+8JWuXiRXn06BFCyLm0Xrt2Lf29cLQr+RI0XxiG2bVr17fffosxNhqNbLFXWlpKZ4KgcemgoCCMcUxMDAlZJycn06NGo1EkEjmSkehdaY0xzsnJITN7Hzx4MD09nWNYc3MzXXRgZGSEo0IZhmlqanLUm724uJhMwufj4zM8PLx8+fLbt2+TDuEWiyUlJYXMdl5UVERC4hKJhNZMpTU7Ai+YcvHixc2bN7NTiNSnFwhjXFhYODQ0RLZ7e3u9vb3d+775eSE/hw9eLUhrAAAAYOECTwe3mdN1nPf1+vp6Elx68+aNSCQiM9DW1tay88zOzubn55M3zv7+foTQwMCAczMePnxIqnWUny8z6uvrAwMDGxoaVCoVeQ11vazrfDxpTawlPTYJrvhtvs3Nq06a8gF9K3if9PT0oLed4THGVVVVztM5rTi/qdin7CjFyVlMTU2FhYXl5uY6aai3t5d97W7cuEGKk8n5qBal5+u6wS5Ka0GvOrpF5/Sq6xc3KSlpx44djrK5+J8gmFJVVRUYGCjoH0paWhqJoIaFhZE/LnZYVSwW04i9K1it1u3bt69atYqsREWltdVqzc7OjoyM7OvrwxgzDOPv719UVHT06FHSwZ7Oth0aGorfSuumpib2gtLOo9YY4+np6fj4+PXr10dERPAnAwtlQdbu8vf3ZyeuXLnSkbS22Wzd3d0YY7FYPDU1RXqeE5svXLggkUji4uLIXGg+Pj6tra1+fn60XdeldWJiIqffweDgoKenJ93t7+/38vIiSnt2dlan05Hf1MOHDxsbGwWux0IFpDUAAACw6ICng9u4Lq3tdrvBYEhPTycj7jo6OhBCtbW14+PjqampJM/r168fPnxotVovXLjg7+9PVNm6desyMjKMRuPs7GxnZ2d5eTnGuK2t7Zdffunt7WUYZmBg4Lvvvlu7di1pUTA//y3fbreHh4cnJSWxRy26WNZ1XJfWXV1dCKEHDx64Hh4PCQkhsyK77jfXpbUbddKyH9C3gvcJxnjp0qV6vd5kMpHllJyn81sRNIZ/yoJO4MOp/+7du2KxmEhEwYYwxhqNZsuWLePj4waDIS4ujhQ3m80+Pj6//fYbxthsNqelpdFqXTSYfRc5kdaCXnUy0ntOr7p4cVtbW729vXNycvr6+mZnZ3t6esrLy51b5eJFOXz4cFpamqO7iM3U1NSGDRv0ej16t1+3h4eH679xu92ekpKi1+tpMJ9I6/r6eo1Gk5qaSmf2evjwIUIoJyenpKQkKysLY0ymiNNoNGxpffXqVfY0bHNKa7PZnJWVhRBKSUlxvu5gSkrKzp07NRoNR4E7n4PNbDYjVi8AIq3Hx8fb29tNJhNJr62tbW1tpUPcLRYLW1qHvwtbWv/3v/8NCwvjdD5qbm5mT3J57tw5Go0/dOhQYmIiuToNDQ38WcoXMiCtAQAAgEUHPB3cxkVpTZDJZDt27KBveDk5OV5eXkql8siRI+Q1ure3V61Wk/mBa2pqSLaxsbEdO3b4+/t7eHhERUUR4WE0GtesWSOTycRicXBw8N69e2n3S8H8ghKusLBQLBazR/e5UtZoNKrVakcqS/D0XZHWGOO9e/dKpVLXxxAePHiQrJfrut8E2x0cHJRKpZxBsG7U+f6+FYR/n2CMX758mZiYKJFI1Gr1iRMnnKfzWxE0hn/K/BRBX/Hr37lzp1arnZ2dFWwIY9zR0UHtPH78OC1eXV2tUqlUKpVOpzt9+jRNd9FgzLqLnHcI53vVibSe06uuX9z29na9Xu/v7y8Wi5VKZWFhoXOrXLkoGGO1Wj3nkHj8VphlZWUR6YgxJiqxsbGRHX11hfb2dqo8Z2ZmKioqkpKSVCoVnbSfMDY2VlhYyDBMbGwssZZGrQlEWu/bt4/9HcqJtB4eHj5z5kxwcPCWLVt6e3uzs7O9vLx27txZV1fH6Q9P5HdaWprdbi8pKQkLC7t58yb94yJN0PnDOH/jT548YfcR4Ng8PDxMrteVK1dWrFiBMR4cHExMTFy3bl1hYeHExAS/2z9Nqa2t9fb2Jj35LRaLwWCYmZmxWq15eXlr1qyh+ZOSki5fvowxPnfuHFnfa3Jy8vXr18+fP9doNHl5ebwLskABaQ0AAAAsOuDp4Dbgus9If3+/v78/6b35PiGh6NYAACAASURBVFRUVBCJDszJx/DV+3SLADDGt27dUqvVjpZGI9y7d490CL958yZmaddly5Z5eXn5+voWFxe73iLDML29vTU1NadOnVq/fr2fn19aWlpVVZWj9bHPnTsXHx/Plr7EWpPJFBQUZDab5XJ5S0sLPUrMs9vtNpttYGCALJP+999/Jycne3p6bty48fHjxzRzV1dXVlbWkiVLAgICbt26ZTab6+rqjhw5Ehoamp2dTe+rhoaGr776SqVS5eXllZeXj42N8aPW9fX1QUFBMTExS5YsOXr0KG2CI61XrlyJEBKJRMHBweR7QWlpaXFxMcMwJ0+ejIqKCg4ODgoKCg0NDQ8PDw0NDQgI8PX11Wg0jx498vLyoh9BTCaTh4cHeYgEBwfTnt5Go9HDw4N8LfXz85NIJJ6enkFBQXFxcevWrdu6dauHhwdfvS9MQFoDAAAAiw54OrjNYnYdcoGPXXN5efmaNWucz940J1lZWbdu3XqfGj4UH8qBH4+P4SuQ1u/D+Ph4TEwM6X7vhMrKyhs3blDpyzAMXRzLDUwmU3x8vF6vLywsvHPnDnvyLUE2bNjAVs4Y44SEBB8fH39//59//rmxsVGn07GPEvPIulkikWjjxo0Y4zdv3pSUlLB7grCZmJgoLy+32WxTU1Pr168vKCigw+PZNDc3Hz9+PDs7myxPQNPJyH+r1drZ2dnS0tLb28suxZHWGOPZ2Vl2j27B7xpWq3V6enp6enpmZsZsNlutVoZhyNJfbMxm8+TkJLsfkNFoLC0tJdsGg2FsbIzTS+jMmTN0yvoFDkhrAAAAYNEBTwe3AdcBwHsC0vpfz5wfvyYmJgTT7XY7Z0wy8GUB0hoAAABYdMDTwW3AdQAAAAAgCEhr4Atgzo43wJcIZ1YYAPiUwNPBbcB1AAAAACAISGvgkzI1NRUcHFxfX09TmpqaOANOONTV1UVHR5vN5jkrZxhm3bp1H8BK4OPT19fn6+trMBg46QzDnDhxor+/n5OoVqvda2hoaKihocFNK4F/L/B0cBtwHQAAAAAIAtL6//kEQ19oE/NayUMQwTlOPuUpkN3KysqkpCT2kBKTyaTRaBxNNnD06FGJRBL/ll27dun1eoVCQVMOHTrEL6XT6Y4cOSJYIcMwOTk5ZJu/TB/wUZnv1eeQmZl55swZfvr169eVSiVdYAM7uLKXLl3ycwzN1tzcHBgYWF1djTEWi8WRkZGRkZERERGRbyGrTVgsFoQQuwb2LkJodnb27t27gr87NvNwH/BZgevlNuA6AAAAABBksUvr7u7u6OhoIhQ/vS794BV+4lMYHh6WyWQd/9vevX5HUSYIHP6fXpKQSLiKQMAMRAk3F8eMB8RVRgbF8bKiB3VGAfVMVMTbKOMq47grq6jIwR13R1S8DohCjooTBTQYuQS5JSSp/VBn+/RUdzAdiF1UP8+npLqr89bbFSo/qrt6z57EfbZt29bc3Fx4CYddu3Zdeuml+/bta25uPnToUBRFb7755ty5c9955538K/4X+uyzz/72t78VvSk/uuKvJ+bZtGnT0DaTQvm/LFHpz/6OHTtG/bO6urpRBeI7f/bZZ+3t7XPnzs09lfnPbO4xv/nmm3HjxiV+1gcffHDxxRfnL/n444/jj07JfWZj/oPk0rqqqiq3sOgnTPb29h4t5vDhw/fff391dfXvf//7wc8n5aUPh8zUAUBRlZ7W+aEorUv9ia2trUuXLi16t5aWli1btiQWrlixIn4p+Jo1a15//fUoitrb27dv397b23v99dfnPiBhy5YtP3luMJHThV9zziX2rlKf/XxVVVUHDx4setPnn3/+yiuvJBae4ZmdPHly4vMt1qxZc+eddxa98/jx41999dXm5ubq6urm5ubm5uaolLQu+phtbW3/8i//MmvWrPzPtCD99OGQmToAKKrS0zo/1eJy2LBhw4wZM2pqambOnBn/rRwvf//99ydMmLB27dooirq7u1euXDlu3LhRo0bdfPPNuQvoP/bYY1OnTq2urm5qasq9nbirq2vZsmV1dXVTpkxpbW2N4yRXKfEXL774YvxDm5ubd+3aFa94+PDhpUuX1tXVNTQ0PPjgg0WbuWha/zybEEXRtGnTXnvttaITu379+vg8Yb6enp5f/epXv8gTQsj/Or5bf39/7yDEdx5CWl9yySVPPPFE0Zlcv359Q0NDbW3t4sWLDx8+XHTqenp6Hn744alTp9bU1EydOvXxxx/PnTXt7u6+7777Jk6cWFtbu3z58jPM84YNGxobG2tqai655JL4swELlxQd4WCexNyeU3SXy3+0+NtBDjLx/xqlPvs5PT09IYSTJ08WvfXTTz8dN25c4gk6wzP7u9/97g9/+EPu2/7+/sbGxm3btsXfbtq0acqUKbNmzYq/PfNZ6xDC+Dz53w6U1qtXrx43btwzzzwzUHiTWvpwyEwdABRV6WldeNb61ltv7ezsPHLkyJIlS+K/yOPlK1eu7Orq2r9/fxRFy5cvb2lp6ejoOHz48IIFC+6444740R5++OG2trbu7u7Vq1dPnz49XrhkyZKFCxd2dnZ2dna2tLQUTevbb7/9hx9+OHz48HXXXTd37tx4xV//+teLFi364YcfOjs7r7jiisGn9c+zCQcPHgwhFP14+vgnTp069czPTqKX8s8Z5nzwwQe5y4Pv2bMn/93pH374YeHLiQd6gXG+devWFV7XKp6ixYsXHzx48MCBA3Pnzr3llluKTt3tt98+Z86czz///PTp0zt27GhoaFizZk38IHfccce8efPa29tPnTq1ffv2geZ53759I0aM+PDDD48fP/7222/39fUVLik6pYN8EhcvXpzbcwp3ufxHi78d5CAT7wUY8rP/448/hhAKn6mvvvoqvkNbW1tjY2P+ae0zpPWnn346ceLEXKi/+eabM2bMSFzFIFfU48ePj09W585at7e3x7eeOnVqCGetQwiJc+acL/ThkJk6AChKWifTOvcH/bZt20aMGJErinfffTdefvjw4REjRnz55Zfxt2+99dbo0aPzH7Ojo+PZZ5+N/xaPCyR3Vad33nmnaFrHbzyOoujdd9+Nf+ihQ4fyV4yvnzTItP55NmH37t0hhIE+Fqujo6OmpqZw+Q033NDQ0HDms9Y533///QUXXPDf//3fURT19/fPnj37scceK3zMvr6+rq6uKIoOHTp0/fXXFx3PT4qn6Jtvvom/3bx5c319fW55Yup27tyZW/Gll16KT4F2dXVVVVV9+umnuZsGmueOjo6qqqqNGzfm7lm4ZKAR/uST+JO7XP6jdXd3D36Q+Y8wtGc/tmfPnsbGxsTC2trajo6O3Lc9PT2dnZ35b5sP//wu+vx1Fy5c+Oijj0ZR1N3dPX369MLXouendeF44oU//vhjXV1dbuHg0zq3z3B+0YdDZuoAoChpnUzrwvaIv4jjLYqiXbt2hQI9PT1RFK1fv37SpElz58696qqr4nXjO584caLoY54heAZa8Qzj/5k3IV5ealxdddVVuVUS9fL+++8n7nzrrbdeddVVuW+/+OKLCy64IPda31hfX99tt932m9/8Jv6h+dG1fv36I0eOFB1eocTUffzxxyGE3P9KJKYuf6v//ve/x/csvOkM87x58+Zp06bNnj07tzmFS4qO8CefxJ/c5RLLBz/I/EcY2rMfe/HFF2+44Yb8JfFLxPMfbc2aNT/88EP89d69e0eNGpX7P4VCn3/+eX19/Y4dO26//fZrr7228A6589IXXXRRFEWXXHJJfMp6wYIFuVs7OjpGjBgxUMwHaZ058a5e7lGcl0wdABQ1TIfIDKZ1bvmBAwdCCN9//33iob777rsRI0bEJy23bdsWr/LNN9+EvNfNxhfoGkxaJ1bcunVrOOu0PrebED/IQF2xc+fOoi8JXrx4cXyOeurUqfGzk//W66qqqtwJ/LfffvuCCy7Yu3dv/urr16+/8MILOzs74297enpuueWWK6644ujRo1FeWvf09Nx9992/+MUvvv3226LDK5Q44b9hw4aGhobCKe3s7Awh5N4PH0XRxo0b43t+++23IYTc6d9o4HmO9fb23n///fnnUQuXFI7wJ5/EvXv35j8vb7zxRrxWW1tbfpnnnt/BDzJ/AEN79mPz589PnJ/v7OwcOXJk7tsDBw7U1dXFpd3b29vS0rJy5cooij744IP4ZfaFXnjhhQsuuKCxsTG3gTl9fX1jx4598sknH3roofjdFtOmTYtvmjJlSvT/af3pp5/Omzcvf8ODs9aZpg+HzNQBQFGVntbt7e0hhPfee6+rq2uQXRpF0aJFi2688caOjo7e3t6vvvrq1VdfjaJoz549IYRt27YdPXr02muvza0yc+bMpUuXdnV1xR86Nci0jqKoubk5XrGjoyP3jtnE+IeW1udkE6Iomjx58ubNm4tO7J///OfEmcl8x48fv+aaa5YuXZr/7PT19VVXV+feyjtx4sT169cnVuzv77/qqquuvvrq/v7+/v7+q6++eunSpbkztHFaf/jhh83Nzddee218HbJC69at+/jjj4vO5G233Xbs2LH29vbGxsZHHnmkcEqjKFq2bNm8efO++OKL3t7enTt3Tps2LTfOBQsWLFiw4Ntvvz1x4kR8Er7oPO/fv/+DDz7o6el54YUXxo4d29/fX7ikcNiDfBKjKGpubl62bNnRo0f37ds3e/bseK1Tp07V19c/99xzURSdOnVq8eLFuUcb5CDzf1mioT77//Vf/zV16tT4rHjOrl27Jk+enPv2+eefX7JkSfz1Aw88MH/+/HicH3300fTp0wuvf3bgwIHrrruuoaGhvr5+3bp1iV+TDz74IIRwzz33PPPMMytWrIiiKL5eYHNzc35av/LKK/kXPB98Wif+94fzhT4cMlMHAEVVelpHUXTnnXfW1tZOnDhx8F165MiRW2+9dezYsdXV1dOnT49zJYqie+65p/CC3l9++eX8+fNramqampoeffTRwaf1V199dfnll8fXZ37sscdCCH19fR0dHU1NTbn0GnJan/0mRFF03333DXQh6CuvvDL+eK1CcSCtWLHi1KlT8bMTX7Vr+/btY8aMiaKou7v7l7/85a9//euiq+/fv3/UqFHr1q2LouiLL77IXfHr5MmTmzZtuvLKKxsbGwe6cnXsDFcIf+qpp8aNGzdmzJh77703vkx34dSdPHly1apVF110UXwd9b/85S+5mw4ePLhs2bJRo0aNHTv2gQceGGie9+7d29TUFK++devWoksKDf5J3LNnT+75Wrt2bW6tN998s7GxsbGxsaWl5YknnsgtH+Qgo7xflmhIz/62bdtGjRoVv7y8u7t73759J0+e7OnpWbVq1cKFC/NXf/nll6Moev755xsaGjo6Oo4dO7Z///7PPvusubl51apVuXu2t7evWrVq9OjRq1atOn78+Pbt22fOnDllypTHH388vtJbvHVr1qzp6+u79NJL4w3JnbWOxWl91113Pf7447mFZ0jr7u7uQ4cO9fb2xu8FyL3OgvOLPhwyUwcARUnr88Prr7/+kxfc/vkdOHBg7NixX3/9dWL5Rx991NTUVHiW75133olfEB5fmSxXL7Nmzaqrqxs9evRTTz0VRdEPP/wQnyQf6Odu3Ljxvffe6+vr27t379atWx9//PF//dd/HTNmzOLFi7ds2TK0j0H6GT4SvCyGb7tKffY//vjjurq63EvBu7q6qqur49/QSZMm5V7p3dHRUV1dHb9JfsyYMTU1NSNHjrzoootmz569aNGim266qbq6eufOnW1tbfPnzx81atTdd9+df964t7f35ZdfnjlzZgghfgd+7Pnnn58zZ07+pdfj/zrp6uq66KKLTp06NX78+Pxrfcc7Z39//+nTp7///vuqqqrcuh0dHeH/xZeR53yUmaPDz8/UAUBR0jq9/uM//uPbb7/t7e3dvXt3U1NT/im19Hj11VcXLlyYXyzHjx9vbm7esWNH4Z03b978xhtv5KKrr6+v6IdjDVJXV9ecOXOWLl26Zs2at956a6BLag1S2tI6FBja4wzrdpX07Pf19X3++eeJhadOnTp27Fj+C+A7OjpyL7Dft2/fkSNHEi+PX7duXVtbW29v70svvRS/x76o7du357/v/Zprrkl8StZll11WX18/duzYP/zhD9u3b29paUmMdtSoUX19fbW1tSNGjLjuuuvyb40/oS33AeCcj87ro0N5mToAKEpap9ctt9wyYcKE6urqxsbGJ598suhnHafQ6dOnz7JyyyJtaX2u/Mzbldpn/yd/fQbq5P7+/sQ7w8mG8/roUF6mDgCKktYAVBxHhyEzdQBQlLQGoOI4OgyZqQOAoqQ1ABXH0WHITB0AFCWtOWd+hrf1Jn7E5s2br7jiiunTp7e1tQ3fDwWyx9FhyEwdABQlrfkJX3/99YwZMwYK5vxbf+a0Pnjw4Lhx4/bs2bN58+bm5ubz5TJvQBo4OgyZqQOAoqQ1P+HMwZx/68+c1q2trUuXLo2iqL+/v7GxcfPmzcP3c4GMcXQYMlMHAEVVelrHqbZ+/fqGhoba2trFixcfPnw4t/z999+fMGHC2rVroyjq6el5+OGHp06dWlNTM3Xq1Mcffzx3mrS7u/u+++6bOHFibW3t8uXL4yUrV64cN27cqFGjbr755tzn+mzYsKGxsbGmpuaSSy45ffp00SVFR5g/koEe/PDhw0uXLq2rq5syZUpra2ucoInczf92kIMMeQaa4Vj84Bs2bJgxY0ZNTc3MmTM/+eSTkjbhsccemzp1anV1dVNT04cffhgv7OrqWrZsWWK7oiiaNm3aa6+9Ft/n/vvvjzMbYDD04ZCZOgAoSlp/EkJYvHjxwYMHDxw4MHfu3FtuuSW3fOXKlV1dXfv374+i6Pbbb58zZ87nn39++vTpHTt2NDQ0rFmzJn6QO+64Y968ee3t7adOndq+fXsURcuXL29paeno6Dh8+PCCBQvuuOOOKIr27ds3YsSIDz/88Pjx42+//XZfX1/hkoFGmD+Sog8eRdHixYsXLVr0ww8/dHZ2trS0/GRaD3KQpZ61vvXWWzs7O48cObJkyZJZs2aVtAkPP/xwW1tbd3f36tWrp0+fHi9csmTJwoULOzs787fr4MGDIYT29vb4Pps3b540adJgdgmASB+eBVMHAEVJ609CCN9880387ebNm+vr63PL33333Xj54cOHR4wYsXPnztyKL7300sSJE6Mo6urqqqqq+vTTT3M3xXf+8ssv42/feuut0aNHR1HU0dFRVVW1cePG3D0Llww0wsRICh88Ts3c1bzeeeedM6f14AdZalofPHgwvmnbtm0jRozIxflPbkL+tDz77LMhhN7e3oG2a/fu3SGE48ePx8s/+uij+GedYSYBcvThkJk6AChKWv9TN3788cchhFwNdnV1xct37dqVH3JRFP3973+P71l4U7wkoaenJ4qizZs3T5s2bfbs2du2bYvvXLik6AgTIyl88Hj5iRMnEts1UFoPfpBDfq91Ygw/uQlRFK1fv37SpElz58696qqr8sdZuF2Jac89cWd4rgFy9OGQmToAKEpafxLyTrRu2LChoaEhKqjEzs7OEMKuXbtyK27cuDG+57fffhtCyJ2DjaLowIEDIYTvv/++6E/s7e29//77x48ff4YlhSPMjWSgB9+7d2/IO/3+xhtvxGu1tbXlZ+22bdvi5YMf5LlK65/chO+++27EiBHx+f/cOL/55puQ98LvLVu25I8/t71btmy58MILi44QoJA+HDJTBwBFSetPQgi33XbbsWPH2tvbGxsbH3nkkahYTy5btmzevHlffPFFb2/vzp07p02btn79+vimBQsWLFiw4Ntvvz1x4sT7778fRdGiRYtuvPHGjo6O3t7er7766tVXX42iaP/+/R988EFPT88LL7wwduzY/v7+wiUDjTB/JEUfPIqi5ubmZcuWHT16dN++fbNnz47XOnXqVH19/XPPPRdF0alTpxYvXpx7tEEOsr29PYTw3nvv5fo8X/6tg0zrgX70nj17Qgjbtm07evTotddem1tl5syZS5cu7erq2rdvX3Nzc2755MmTc1cFb21tXbx48RmeaIB8+nDITB0AFCWtPwkhPPXUU+PGjRszZsy9994bX6a7sAZPnjy5atWqiy66KL5+9V/+8pfcTQcPHly2bNmoUaPGjh37wAMPRFF05MiRW2+9dezYsdXV1dOnT4/Ldu/evU1NTfHqW7duLbpkoBHmj6Tog0dRtGfPnvnz59fU1DQ1Na1duza31ptvvtnY2NjY2NjS0vLEE0/klg9ykFEU3XnnnbW1tfF7ywvlbh18Wg+0Cffcc09dXV1DQ8ODDz6YW+XLL7/Mbdejjz6aW37ffffdeOON8YpNTU1nfss6QD59OGSmDgCKktZnerXz+Sur25XvwIEDY8eO/frrr//61782NTUV/egygKL04ZCZOgAoSlqnK0FDgaE9zjBt17ka3rny6quvXnnllZdcckn+FdoBflIa/gU7T5k6AChKWqcrrc+VrG4XwDmhD4fM1AFAUZWe1gBUIEeHITN1AFCUtAag4jg6DJmpA4CipDUAFcfRYchM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aX3ZZZddffXVIYSmpqb85Q0NDatWrdq2bdtrr72WewV1nLL33nvv6tWrL7vssnvvvXfx4sUhhJaWliiKnn766RDCpEmTVq5c2djYeOa0njx58j333HPppZeGEObPn59b/aKLLipcfaBNqK+vDyF0dXUVbnJu9a6urlWrVoUQrrnmmiiKnn/++dwA1q9f39fXF0VR0W0snIqOjo6qqqrx48fHazU3N4cQ/v3f/30w657T5/OspHD/BIBzS1oDZEEK0+UMab13794jR47EX8fFGH/90UcfxXeL6/eee+5pbW1duXJlCGHChAnHjx/v6+v76quvXn/99RBCVVVVX1/fL37xixDC+++/H0VRe3v7mdO6ra0tiqJ//OMfIYSampooiqZPnx5CeO+99wpXH2gTampqQghHjx4t3OTwz6ZOnRqfWo+i6M0337zkkkvi5StXrhxoGwunIoqiBQsWhBB27dr1/fffx/+nMPh1UyKF+ycAnFvSGiALUpguP/le68Kvjx8/Ht+turo6FNiyZcv48ePHjh0bp2a8bnzPH3/8MYqivr6+Mz9+/HX+wOLV405OrD7QJsQ1Hsd8QnznBx54YM2aNa+99lriPdV9fX2PPvpoCKG+vn6gbSyciiiK/vM//zOE8NRTT23cuDGE8OKLLw5+3ZRI4f4JAOeWtAbIghSmyxDSOte0kydPDiHkTvnG4mtuf/fdd/HbmOP7X3jhhSGETz/9NIqizz77rNS0jh9zx44dURTt2rVrMGkdXza8paUld7dTp04Vbl2++Gx5FEVdXV0hhOrq6r6+vqLbWPRBurq6ampqFi1adNttt9XW1v7444+DXzclUrh/AsC5Ja0BsiCF6XI2af3QQw+FEBoaGu69995Vq1ZdddVVURSNGzcuhHDjjTfOnz8/d/+77rorvufKlSunTp1aalrfeeedIYSpU6euWrUqsfpAm9DV1RW/Cn369OkrV65csWLFpEmTCrcuX3V19W9+85v77rvvsssuCyEsWbJkoG0c6EGuu+660aNHNzY2/va3vy113TRI4f4JAOeWtAbIghSmy9mkdW9v78MPPzxlypSqqqqJEyfefffdURS9+uqrF154YX19ffyy6vj+x44d++1vf1tXVzdx4sTnnnuu1LQ+duzYTTfdFK8eX4s7fgv3GTYhiqKDBw/eddddkyZNqqqqGjdu3NVXX124dfmWLl06fvz4eFtWrFgRXwKt6DYO9CCbNm2Kl8dXJi9p3TRI4f4JAOeWtAbIAukyZLmQ3rZtWwihubm5vOPJJPsnAJknrQGyQLoMWXNz86pVq26//fZRo0aFEF577bVyjyiD7J8AZJ60BsgC6TJkv/zlL2tra2tra+fNm7dp06ZyDyeb7J8AZJ60BsgC6UKa2T8ByDxpDZAF0oU0s38CkHnSGiALpAtpZv8EIPOkNUAWSBfSzP4JQOZJa4AskC6kmf0TgMyT1gBZIF1IM/snAJknrQGyQLqQZvZPADJPWgNkQYDUK/dvCQAMI2kNkAXljib4aeX+LQGAYSStAbJAupBm9k8AMk9aA2SBdCHN7J8AZJ60BsgC6UKa2T8ByDxpDZAF0oU0s38CkHnSGiALpAtpZv8EIPOkNUAWSBfSzP4JQOZJa4AskC6kmf0TgMyT1gBZIF1IM/snAJknrQGyQLqQZvZPADJPWgNkgXQhzeyfAGSetAbIAulCmtk/Acg8aQ2QBdKFNLN/ApB50hogC6QLaWb/BCDzpDVAFkgX0sz+CUDmSWuALJAupJn9E4DMk9YAWSBdSDP7JwCZJ60BskC6kGb2TwAyT1oDZIF0Ic3snwBknrQGyALpQprZPwHIPGkNkAXShTSzfwKQedIaIAukC2lm/wQg86Q1QBZIF9LM/glA5klrgCyoqakJIZw+fbrcA4Gk7u7uEMLIkSPLPRAAGEbSGiALmpubQwhtbW3lHggk7dq1K4QwZ86ccg8EAIaRtAbIgqeffjqEcPnll+/evbu7u7vcw4EoiqLu7u5du3bNnz8/hPCnP/2p3MMBgGEkrQGyoLu7e8GCBQFSaeHChT09PeX+LQGAYSStATKiu7t73bp1s2fPHjlyZLlLCkIIYeTIkXPmzPnTn/6kqwHIPGkNAAAAZ0VaAwAAwFmR1gAAAHBWpDUAAACcFWkNAAAAZ0VaAwAAwFmR1gAAAHBWpDUAAACclf8DuJSxJP4vVosAAAAASUVORK5CYII=" alt="" />
学会看源码非常重要!不能仅仅光会用!大赞~ 知道他的过程和实现~ 怎么学会看源码呢?多看然后画类图,如上图!!!
在理解的时候可以把他们想象为,把所有需要用的方法,都抓到ThreadingTCPServer中
内部调用流程为:
- 启动服务端程序
- 执行 TCPServer.__init__ 方法,创建服务端Socket对象并绑定 IP 和 端口
- 执行 BaseServer.__init__ 方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 MyRequestHandle赋值给 self.RequestHandlerClass
- 执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
- 当客户端连接到达服务器
- 执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
- 执行 ThreadingMixIn.process_request_thread 方法
- 执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 MyRequestHandler的handle方法)
精简源码:
模拟Socekt Server的简化版本:
import socket
import threading
import select def process(request, client_address): #模拟定义的handle()方法,这个方法内的代码是socket server与Client端交互代码
print request,client_address
conn = request
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
flag = True
while flag:
data = conn.recv(1024)
if data == 'exit':
flag = False
elif data == '':
conn.sendall('通过可能会被录音.balabala一大推')
else:
conn.sendall('请重新输入.') sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.bind(('127.0.0.1',8002))
sk.listen(5) while True: #这里一个while循环循环监控sk文件句柄
r, w, e = select.select([sk,],[],[],1)
print 'looping'
if sk in r: #当sk文件句柄发生变化的时候说明是新的客户端连接过来了
print 'get request'
request, client_address = sk.accept()
t = threading.Thread(target=process, args=(request, client_address)) #创建一个线程,并调用自己定义的process方法执行~然后样客户端与之交互
t.daemon = False
t.start() sk.close()
如精简代码可以看出,SocketServer的ThreadingTCPServer之所以可以同时处理请求得益于 select 和 Threading 两个东西,其实本质上就是在服务器端为每一个客户端创建一个线程,当前线程用来处理对应客户端的请求,所以,可以支持同时n个客户端链接(长连接)。
ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和执行流程基本一致,只不过在内部分别为请求者建立 “线程” 和 “进程”。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import SocketServer class MyServer(SocketServer.BaseRequestHandler): def handle(self):
# print self.request,self.client_address,self.server
conn = self.request
conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
Flag = True
while Flag:
data = conn.recv(1024)
if data == 'exit':
Flag = False
elif data == '':
conn.sendall('通过可能会被录音.balabala一大推')
else:
conn.sendall('请重新输入.') if __name__ == '__main__':
server = SocketServer.ForkingTCPServer(('127.0.0.1',8009),MyServer)
server.serve_forever()
socket server - multiprocess
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8009)
sk = socket.socket()
sk.connect(ip_port)
sk.settimeout(5) while True:
data = sk.recv(1024)
print 'receive:',data
inp = raw_input('please input:')
sk.sendall(inp)
if inp == 'exit':
break sk.close()
client
以上ForkingTCPServer只是将 ThreadingTCPServer 实例中的代码:
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyRequestHandler)
变更为:
server = SocketServer.ForkingTCPServer(('127.0.0.1',8009),MyRequestHandler)
Python线程
Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time def show(arg):
time.sleep(2)
print 'thread'+str(arg) for i in range(10):
t = threading.Thread(target=show, args=(i,)) #这里实例化对象的时候传的两个参数第一个参数是,线程需要执行的方法,第二个参数方法的参数
t.start() print 'main thread stop'
上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。
再次回顾:这里为什么是分片执行?
python中的多线程,有一个GIL(Global Interpreter Lock 全局解释器锁 )在同一时间只有一个线程在工作,他底层会自动进行上下文切换.这个线程执行点,那个线程执行点!
更多方法:
- start 线程准备就绪,等待CPU调度
- setName 为线程设置名称
- getName 获取线程名称
- setDaemon 设置为后台线程或前台线程(默认)
- 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
- 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
- join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义
- run 线程被cpu调度后执行Thread类对象的run方法
线程锁
由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,CPU接着执行其他线程。所以,可能出现如下问题:
aaarticlea/png;base64,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" alt="" />
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import time gl_num = 0 def show(arg):
global gl_num
time.sleep(1)
gl_num +=1
print gl_num for i in range(10):
t = threading.Thread(target=show, args=(i,))
t.start() print 'main thread stop'
thread nolock
设置线程锁
#!/usr/bin/env python
#coding:utf-8 import threading
import time gl_num = 0 lock = threading.RLock() #实例化调用线程锁 def Func():
lock.acquire() #获取线程锁
global gl_num
gl_num +=1
time.sleep(1)
print gl_num
lock.release() #释放线程锁,这里注意,在使用线程锁的时候不能把锁,写在代码中,否则会造成阻塞,看起来“像”单线程 for i in range(10):
t = threading.Thread(target=Func)
t.start()
event
他的作用就是:用主线程控制子线程合适执行,他可以让子线程停下来,也可以让线程继续!
他实现的机制就是:标志位“Flag”
事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
- clear:将“Flag”设置为False
- set:将“Flag”设置为True
#!/usr/bin/env python
# -*- coding:utf-8 -*- import threading def do(event):
print 'start'
event.wait() #执行对象weit方法,然后他们停下来,等待“Flag”为True
print 'execute' event_obj = threading.Event() #创建事件的对象 for i in range(10):
t = threading.Thread(target=do, args=(event_obj,)) #吧对象传到每个线程里面了~
t.start() event_obj.clear() #设置"Flag"为Flase inp = raw_input('input:')
if inp == 'true':
event_obj.set() #thread enent 就是这个3个方法的使用
Python进程
from multiprocessing import Process
import threading
import time def foo(i):
print 'say hi',i for i in range(10):
p = Process(target=foo,args=(i,))
p.start()
注意:由于进程之间的数据需要各自持有一份,所以创建进程需要的非常大的开销。并且python不能再Windows下创建进程!
并且在使用多进程的时候,最好是创建多少个进程?:和CPU核数相等
默认的进程之间相互是独立,如果想让进程之间数据共享,就得有个特殊的数据结构,这个数据结构就可以理解为他有穿墙的功能
如果你能穿墙的话两边就都可以使用了
使用了3种方法
默认的进程无法进行数据共享:
#!/usr/bin/env python
#coding:utf-8 from multiprocessing import Process
from multiprocessing import Manager import time li = [] def foo(i):
li.append(i)
print 'say hi',li for i in range(10):
p = Process(target=foo,args=(i,))
p.start() print 'ending',li
使用特殊的数据类型,来进行穿墙:
默认的进程之间相互是独立,如果想让进程之间数据共享,就得有个特殊的数据结构,这个数据结构就可以理解为他有穿墙的功能
如果你能穿墙的话两边就都可以使用了
使用了3种方法 第一种方法: #通过特殊的数据结构:数组(Array) from multiprocessing import Process,Array #创建一个只包含数字类型的数组(python中叫列表)
#并且数组是不可变的,在C,或其他语言中,数组是不可变的,之后再python中数组(列表)是可以变得
#当然其他语言中也提供可变的数组
#在C语言中数组和字符串是一样的,如果定义一个列表,如果可以增加,那么我需要在你内存地址后面再开辟一块空间,那我给你预留多少呢?
#在python中的list可能用链表来做的,我记录了你前面和后面是谁。 列表不是连续的,数组是连续的 '''
上面不是列表是“数组"数组是不可变的,附加内容是为了更好的理解数组!
''' temp = Array('i', [11,22,33,44]) #这里的i是C语言中的数据结构,通过他来定义你要共享的内容的类型!点进去看~ def Foo(i):
temp[i] = 100+i
for item in temp:
print i,'----->',item for i in range(2):
p = Process(target=Foo,args=(i,))
p.start() 第二种方法:
#方法二:manage.dict()共享数据
from multiprocessing import Process,Manager #这个特殊的数据类型Manager manage = Manager()
dic = manage.dict() #这里调用的时候,使用字典,这个字典和咱们python使用方法是一样的! def Foo(i):
dic[i] = 100+i
print dic.values() for i in range(2):
p = Process(target=Foo,args=(i,))
p.start()
p.join()
OK那么问题来了,既然进程之间可以进行共享数据,如果多个进程同时修改这个数据是不是就会造成脏数据?是不是就得需要锁!
进程的锁和线程的锁使用方式是非常一样的知识他们是用的类是在不同地方的
#!/usr/bin/env python
# -*- coding:utf-8 -*- from multiprocessing import Process, Array, RLock def Foo(lock,temp,i):
"""
将第0个数加100
"""
lock.acquire()
temp[0] = 100+i
for item in temp:
print i,'----->',item
lock.release() lock = RLock()
temp = Array('i', [11, 22, 33, 44]) for i in range(20):
p = Process(target=Foo,args=(lock,temp,i,))
p.start()
进程锁
进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池中有两个方法:
- apply
- apply_async
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process,Pool
import time def Foo(i):
time.sleep(2)
return i+100 def Bar(arg):
print arg pool = Pool(5) #创建一个进程池
#print pool.apply(Foo,(1,))#去进程池里去申请一个进程去执行Foo方法
#print pool.apply_async(func =Foo, args=(1,)).get() for i in range(10):
pool.apply_async(func=Foo, args=(i,),callback=Bar) print 'end'
pool.close()
pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。 '''
apply 主动的去执行
pool.apply_async(func=Foo, args=(i,),callback=Bar) 相当于异步,当申请一个线程之后,执行FOO方法就不管了,执行完之后就在执行callback ,当你执行完之后,在执行一个方法告诉我执行完了
callback 有个函数,这个函数就是操作的Foo函数的返回值!
'''
协程
首先要明确,线程和进程都是系统帮咱们开辟的,不管是thread还是process他内部都是调用的系统的API
而对于协程来说它和系统毫无关系!
他就和程序员有关系,对于线程和进程来说,调度是由CPU来决定调度的!
对于协程来说,程序员就是上帝,你想让谁执行到哪里他就执行到哪里
协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
适用场景:其实在其他语言中,协程的其实是意义不大的多线程即可已解决I/O的问题,但是在python因为他有GIL(Global Interpreter Lock 全局解释器锁 )在同一时间只有一个线程在工作,所以:如果一个线程里面I/O操作特别多,协程就比较适用
greenlet
收先要明确,线程和进程都是系统帮咱们开辟的,不管是thread还是process他内部都是调用的系统的API
而对于协程来说它和系统毫无关系!
他就和程序员有关系,对于线程和进程来说,是不是有CPU来决定调度的!
对于协程来说,程序员就是上帝,你想让谁执行到哪里他就执行到哪里 #!/usr/bin/env python
# -*- coding:utf-8 -*- from greenlet import greenlet def test1():
print 12
gr2.switch()#切换到协程2执行
print 34 #2切回来之后,在这里和yield类似
gr2.switch() def test2():
print 56
gr1.switch()#上面执行了一句,在切换到协程1里去了
print 78 gr1 = greenlet(test1) #创建了一个协程
gr2 = greenlet(test2) gr1.switch() #执行test1 '''
比I/O操作,如果10个I/O,我程序从上往下执行,如果同时发出去了10个I/O操作,那么返回的结果如果同时回来了2个
,是不是就节省了很多时间? 如果一个线程里面I/O操作特别多,使用协程是不是就非常适用了! 如果一个线程访问URL通过协程来做,协程告诉它你去请求吧,然后继续执行,但是如果不用协程就得等待第一个请求完毕之后返回之后才
继续下一个请求。 协程:把一个线程分成了多个协程操作,每个协程做操作
多线程:是把每一个操作,分为多个线程做操作,但是python中,在同一时刻只能有一个线程操作,并且有上下文切换。但是如果上下文切换非常频繁的话
是非常耗时的,但对于协程切换就非常轻便了~ '''
协程就是对线程的分片,上面的例子需要手动操作可能用处不是很大了解原理,看下面的例子:
上面的greenlet是需要认为的制定调度顺序的,所以又出了一个gevent他是对greenlet功能进行封装
遇到I/O自动切换
from gevent import monkey; monkey.patch_all()
import gevent
import urllib2 def f(url):
print('GET: %s' % url)
resp = urllib2.urlopen(url) #当遇到I/O操作的时候就会调用协程操作,然后继续往下走,然后这个协程就卡在这里等待数据的返回
data = resp.read()
print('%d bytes received from %s.' % (len(data), url)) gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'), #这里的f是调用这个方法,第二个是调用方的参数
gevent.spawn(f, 'https://www.yahoo.com/'),
gevent.spawn(f, 'https://github.com/'),
]) '''
gevent.spawn(f, 'https://www.python.org/'), #这里的f是调用这个方法,第二个是调用方的参数 当函数f里的代码遇到I/O操作的时候,函数就卡在哪里等待数据的返回,但是协程不会等待而是继续操作!
'''
更多请参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html
Python之路【第七篇续】:进程、线程、协程的更多相关文章
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
- 进程&线程&协程
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
- python的进程/线程/协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
- python-socket和进程线程协程(代码展示)
socket # 一.socket # TCP服务端 import socket # 导入socket tcp_sk = socket.socket() # 实例化一个服务器对象 tcp_sk.bin ...
- python进程/线程/协程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- python基础(16)-进程&线程&协程
进程之multiprocessing模块 Process(进程) Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. 介绍 初始化参数 Process([group [, t ...
- python -- 进程线程协程专题
进程专栏 multiprocessing 高级模块 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork() ...
随机推荐
- Oracle触发器反向调用Java程序
导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加载j ...
- Hive 按某列的部分排序 以及 删列操作
脑袋果然还是智商不足. 涉及到的小需求: 某个表test 有一列 tc: a字符串+b字符串+c字符串 拼接组成 把test表,按b字符串排序 输出 遇到的问题: select 里面必须包含 orde ...
- js-JavaScript高级程序设计学习笔记12
第十五章 使用canvas绘图 1.要使用<canvas>元素,必须先设置其width和height属性. 2.要在这块画布上绘图,需要先取得绘图上下文,取得绘图上下文对象的引用,需要调用 ...
- js-关于性能优化的一些学习总结
性能优化的方法有: 1.减少HTTP请求:合并CSS/JS,使用CSS sprite等 2.压缩CSS/JS/图片 3.样式表放头部,JS放body底部:JS放在head中,将会等到js全部下载解析和 ...
- [iOS 视频流开发-获得视频帧处理]
调用视频流所使用框架:<Foundation/Foundation.h> 必须定义的参数: 1.AVCaptureDevice(捕获设备:前置.后置摄像头等) 2.AVCaptureInp ...
- xpath中/和//的差别
xpath中 "/"是在子节点中查找,"//"是在所有子节点中查找,包括子节点的子节点. example: leve1/leve2:得到文本leve2 leve ...
- 数据结构作业——brothers(二叉树)
brothers Description 给你一棵节点编号从 1 到 n 的,根节点为 1 的二叉树.然后有 q 个询问,每个询问给出一个整数表示树的节点,要求这个节点的兄弟节点数目和堂兄弟节点的数目 ...
- IIS7.5
一.发布mvc遇到的HTTP错误 403.14-Forbidden解决办法 <system.webServer> <validationvalidateIntegratedMod ...
- primefaces p:dataExporter filename 支持中文 utf8
p:fileDownload and p:dataExporter : for p:fileDownload, the Content-Disposition header should be set ...
- Ubuntu学习总结-02 Ubuntu下的FTP服务的安装和设置
一 安装vsftpd 在安装前vsftpd,先更新apt-get下载的数据源输入如下命令: sudo apt-get update 然后安装vsftpd sudo apt-get install vs ...