hiddifypanel 3.0.0.dev63__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
1
- # 2023-04-08T15:11:22.333076
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd1)\x00\x00\x12\t\x04\x00\xa0!\xe0\xa0I\xee\xef\xc9h\xd7\xcb\xd3z\xeb\x06\x15\x00\x00\x00\x00\x00\x00\x00\x00\x92\xfa\xad``)\x06/\n\x10\xf2$\xbf\x02\xb9wg\xf2\xcc\x86\xe1)\xbbz\xe7\x7f\xfad\xabK\xdd\x8b[`o-\x0cR\xbb\x0c\xb6\xe6\xb3\xc3\xd4)zTHVxM\x98A\xdf/\xd1\x988\x97\xac\xa9\xd5\x99\x8cNN/\xfeQ\xb5\xe6\\8\xc1\xe8p\xa5\x86jK\xb3\x86\xf8\x98Bf\x92#[\xf4\xb9\xa8\xb2m\x1a\xf4\xbc?{~\x11\x0e\x11w\xa1\xd3\x1f\xb4\xce\xde\x0e.O^1=\xb5E\x92i\x7fC~J\x8c]T\xd5G\xb8\x11i\xc7jQ\xf4\x18_\x02e&\x05\x85)2\xcc\x8f=\xd8h\xe1\xe4\xbe\xda\x98\x81\xf7"\xa2aic\x1f>\x80a\x0f\\\x15u\x88@\x9a\xda\xcc\x16[\xea;\x05"5q\xe1\xac\x9cdI\x18\xfd\xd7\xdc\xe8z\xd1\xeb\x87N\x17\xd6\xd7\xb1\xf0T9f\xc9\xea2/#\xdf\x8b\x90q\tM\xb4\x05\xa88zs\xaf\xe37\x94\xfc\xe4\xc0g?\xa4x\x9f\xd7]\xbb\x8b\x9f[\xc7v\xa8Q\xfd\xed\xfdm-\x9c\x99R_\xff\xf3\x9c\'\xd5\xcb\x8d\xc1p\xec\xc4\x85A6t\xed}\xd3\x86a\x13\xde=\'\xd8\xcc\x01\xb7T\x1f5\x9a\xd4\xe8\x0f\xa0S\xd6\xee_w\xd3j\xb68\xdb\xab\xbdW\xb0/\xe3\xbb\xe4\xd6\xe2D_\x92\xb8\xfd\xaf\x9df\xa4\xd9u\xff\x7f\x05ap\xdd4<\x01k\xc2Yz\x0eH\xe2 \x08V3\xa0S_\xbb McL\xde5-\xc9\xfb\xe6\n\x0fjf5C\xea3\xa8\xf6,`\xa0\x08u\x8e\x96\x05G\xf6\xe4\x11\xae~\xa3#\xcd\xb2\xd0t\x86\xdc\xd2\xb7\x99\xf1\xccY\xb3*\x9d}(n\xb79\x99RF\xc2%\x1cuy\x83U\xaa\x8cO\xff\xff\xd0\xc9\x02\x92\xabN\x15\xd3\x10/\xb8\x95$\xf7\x90\xeey9\xa1\xff#\x8d\x9a\x8f;\x80\xdd\x10W\x9e\xf4l$\x9c\xf8%\xbd\xcb\x17\xc0B\x81\xf9&mT\x99\xf3-\xeeAx\xf4\x7f\xda\xac\x93\xd7b~\xb6P\x9a\x0fy\x08\xd6\xbdQ\xa4\xda@{,\xb9\xcaA\x8c\xdf;2\xe9c,2\xba\xa4\x0c\xaea\\\x01]\x0b\x15\xf3\xc9o\x0cs\xd8m\xc8\xd4\xe2\xa8\xd0F\x96\x838\x9e\x84\xb6`\xdc*`\xb8{\xff\r\x81jA\xf2\xa5\x90\xfeAJS\xf8\x9a\xa2/\xf2w\\\xcb\x05\x99r\xe5\xc1!\xe9\x83\xa6\'\xbap\xab\'T\x82\x9f\x81\x14#\x1fy>\x14\x87\xb3\x8f\xe5,\x03\xc1n\xa4"9\x0e\x04\xeb\x05\x91\xc2O\x1fc\xbb\xf3\xd6\xb1A\x04=\x16\xe6\xeb\xcdJ\x92\xdb\x13\x18T\xb61\xa5\xa6\xf3\x0f\x05\\\x14\xe0\xda\xaa\xe4\x9d\xc9A\xdc\x9a\xba3\xb7\xd1\xe5\x1a\xef\x8d\x8e]j>.\xbf;\x17w\x83\xa0i\xf0\xba\xdf\x00\xc3\xddk\xe6\x13?\xb9\xf5&\xbbMI\xd1j\xa3\xe1\x00zo\x02\xed^H\xf0WY\x9f\xecO\x90;B\xe2\xd2\x17|\x8eN\xd0\\#\xec\x16\xdd\x90J\xd4\xf7\xc5\xcb\xb4\xfbm\xbd\xbbcL\xdabIe5\xbf\x08F\x9b|\xc7\xd3\x84\'\x07DS\xef\xc5\xecpw\xae\x9a\x80\x19\xe2\xbci,\x8e\x05\x04k\x9f\xc7\xc3@\xdd\x8e\xde\xce\'1\x9az\x8e\xaa\xde\xa5c\xe68\x7f\x08!R\xfa\x82;\xcen\xaf\xc4\x94\x98\x84]\x9e\x17&\xba\t#\xd0\xf4\x84\x9a\x17]F\x8d\x91\xd3\x02!*;\xfe\x16^uv\xe3\xb3\x17\x01\x97j\xaf\x1e(\xbf\xfcT3S\x03d\xb2\xbf\xf3\xaf\x87\xb73\x17\xe4)\xab\xf4U\xb5\xf7\xc2\tP6\xe7=@\x8bK\xecY\xe8/\xbb[\x80\x80<\xce\x960L.E=%\xb3*\x99n\xf5\xae\x1f\xfb\xd5\x13\x81\x96;\x92;\x93\x80~6y\xa4\xb1\x15{\x0e\xc1EV\xbf\xc6\xc5\x04\xbe\xc74\x93\xdc\x1c\xf1r\xb2\xf8\xbeft\xbf`\xd5\x8c4M=\xe2\xab\xa6\xb2I\x98.\x00\x87\xa3\x9a\x90\x11;\x1a\xe0\x93+\xf4Ps\x8c2\xd5q&\x16=\x9aQ\xd7\xad#\'a\xd4\xba?\xee\xc2\xd7+\xe5@F\x88\xd7gi\xf8\x95\xda7\x92\x91\xeb\xb5\t\xed\x9d]i\xd3R\x120$U^\x0f\xbe\xcc\xf8c\'\xe6V\x05\x82\xff4\x0c\xd2g,\xc8\xf0\x8fB\x1c\xca\x02\x866\xdb\xe3\x94\xaa\x91n\xdb\xa7\xa2\xc1\x1d*\x84\xb5\xc5V\x02\xcd\x8a\x90\x8ce\xbb2\xc2hMd\xd2\xc1IG\xe9\x17\xc3X_\x0f\xa9&nS\x86\x15\xbbz\xdf\xf7\xad\x8d\xf9\x0b\x1b\xec\x98Ij`\x8e1F\xd6\x85v\xa2\xcc\xd8r\x02I\x81\xac\xc2\x15y8F\xae\xeaBL\x82\xda\xef\x19Sw3H\x90\xf6\xbe$\xf0\xda\x02\xf2=|"\xc9\x98&\x01\x14\x9a\xd2\xd1!\x88\x86\xd4\xbbi1e\xf6\xd7L\xd9\xc2\xe7\xba\x9d\xf6\x95n\xac6\xc0\xd0\xa9\x13\xaa\xff\x03:\xdc\x8eJ<U\x01X\x12~\xa1a)\xba\xc8\xfa\xb1R\x1e\xeb\xb8\x08\x11\xe1\x82,\x194\xbf\x18&\x94>r\x962U\xb76\xc5\xd1\xb3\xd9j\xd6c\xb5\x9f\x13gq\xab\x168\x98{\xddf?\x9f\xad\xbdT4\xd8\xf7\xd1p%D\xb3CX\xf4P6\xef\x15H\x8fm\x13\xf4[\x00\x80(1%\x01n\xea\xfcu\x93tGjV\xcdA\x01<p\x91\xd6\xb8\x88\x12=\xa8\xe1\xccL\xc1\x8c\x0e\xff\x9b}\xd4\xca\xdb\xb8\xcb\x02\xb7\x82\x11\x95\x1e\x9a\xd1\xd2Lx\xaa\x8b<Z_\x00v\xa5\xc6\xc1\xfa\x00\x11n~\x9c\x0bJ\xfct3\xd2yl%\xdeO\x04\xc0L\xd4\xa5\xff\x93\x86H\xb8\xc6dK\x02\x82Y1\x81\xd3\x079\xa9\x9bI#$\x10\xder\xc4\x9c\xb1\xc5\xcc\x10\xf97\x90\x8eB\t[\xab\x0e0\xaf\x07\xfbgg\x9bT0c\x12\xd2\xd6\xb4]\xd5\x96b\x99B~\x8e\x19\xfa\x10\xab\xf0\x82|\x8e\x9d\xef\xda\x98V\x98\xa1l\xead\x8fy\xfb\x9eb4\xc1\xb5b\xdc\xd8\xa0\x91G\xd8\xf8\xb5\xb4\xb7\xe6l\xce]\xe5\xf541\xfbk\xc0yO\xfe\xbc\xf3\x1b\x12\x82\t\xd2V\x08\xbf6wuLc\xfcsq\x99\xfe\xe7\xe8\xbc\x86\x7f\x03\x9a\xd4u\xe5\xablSWXm\x1a\x97\xde\xc1\x0f\x1a\xd0\xe4\x0e\t\x99\xb9\xa9\x82\\\xfd\x19\xbf\xd7kb\xa1&l\xaa\x08\x1b&\x82\x13l\xc0\x89\xaaoiF}4\xcbvqc\xd4\rS\xf8U\xa3c\xb8\x90^\x18\xbd`B\x03\xc0\xaeo\x00\xddJ\xcc\x08\xed8\x86\xaf\xfc\xff\xc8\x15\xc4P\xfb\xb1\x1f\xc5\xb1\xe9\tL\xf3Cp\xe3lv\x93\x1d\xef|;\x98\x92\xa2\\S={a\xa0\xabK\xdf\xf1\x90\xcd/+\x93l\xbe\x8b\xc5\\1\xfc\x04;\xfcD&\x86\x91\x9b<R\x85UMp\x08\tu\xa9\xe1\xd8\xea\xf6F4\xb9\xac+\x8e1\xd6-\xc4\xae\rX\x02\x1e\xb94Mct#\xc9\xed\x98\xf9\xac\xceH\x11fj\t\xff\t\xc8I\x98\x0b\\\x00\x1ag\xbe\xd0\x08\xde\x9c~\x82[\xc9\xa0b\xa4\x19\x04\xf059;\xea510\xb2\x90\x86\xe0.\x9d\xbd6\x8e\xe8\xab\x8cE\xa0q\xdc\x08\xedz\x83\'\xf5\xac\xa7\xa1M\xe7\xda\xd1\xc5|\xcca\xcbE\x9c\xaaIY\xf6\xa8\x07\x03rK\x98\x08\xbcp\xdb\x08\xabk\x8a\xd6\x8f(\x15\xf5\xf6\'g\xff\xdb\xbe\x8bi\xfb<;\x06\xe5\xa8l\x99\xb9\x0c\x97b\'\xed\xba\x16\xfbN\xa5nI\x99%\x1d_\x18\xbb\x11:\xad0\xa8N\xeb\x88v\x89\xe0\xcc\xb4\x9fK\xff\xe5\x92o#\x06b\t-c\xe9\x04\xe4\xc7\x1f\x95yeb\xec\x90\xc7a\x8fz\xe4t\xd7x\xd9vel\xbfE;\xbd\\\x84\xf8\xcd\xab\x08\x1c\x03\x88\xb3\x8a\x1c\x9e\x0c-\x85\xd6$\xcfgE\r\xe2O\x88Z\xffz*TA\xb0T\xae\xb3\x8e\x9e.\xa9\xcc\x12\xf25\xd0\x9d&\xeeU\x8b\x82\xf8S\xcb\xd4<\xa3-5\xa6\t\x95\x04H_\x13\xa1\xae{\xeb\x1fYd\xa8\xef<\x84\x17\xb1\xad4(\xcc\xaf\x8f\xc7\x85}\x872\x1c\x89\x86(\x0f\xffo\xb6:\xd4\x85Z\xb8\xd7\x99\xff_\x1c\xd3=\x02m\x9e\x03,g\xaf\xbb+xn\xe2\xa9\x0c\xa9l2G]\xc2\xc9$,\x85\xaa\xe2\xae\xd8\x8d\xe9\xa4\xfa\x88-\xf3D\xbf\xfb\'M\x83i\xd0\x02R\xa8\x83g\x80o\xc4%\xf7\x1d\xb5c\xf8\x11\x88FY\xa3\x95\xdc#\xea,>\x05\x1b\xe4\xd8\xa6\xf4\xff\xb9\x10\x17\xbc\x81$\xba(P\x12\xb2\xea\xfb@\x8czv\xac\x91cp\x91\x81K\xe8G\x1e\x12\x99\xa8"\xad*\xda\xec\xca\xd9*\xcd>\x08\xd1\xf3\xab\x81\x99\xc4G\x9c\x92*\xf7\x16\xdb\x8f\xd87R\x07C\xcar\xa5\x91\x93PTfQ!SE\xbe^O\'\x9a\xbatWg\x99\x13|;7\x8e\xa7Ep@\x19\x1f\xa8&\xc7\xf1\xd7L\xb2+\x02A\xccR2\xa8\xfd}\xb8\x9a\x0f\x91\xfa\x8fj<\x9f\xb1\x86\x966_(8\x84\xf2|\t\x91\xe9\xc4`\xee\xdax\xad{3\x02F\x9bEe\x003\xcb\xdb\x02\xbau\xef\xf1h\x06\x8e\xc5Z)\xd5"$\x9fz}\xb4\x8atM_\xca\x0b\xad\x81\x17B\xaf\xeb$?\xf9Z\x9c\x16\xfa\x14\x8bV\x12\xc3\x06\xc1\xc2\xda($\xe5\xa7\xd3\x03\xe3\xfa\x1erx\\\x98\xa9\xb7\xd8V\xad\x95\xca_\x93\xf7\xe0Q8\x85^m\xc5|\xc5]\xae\xfbN\xfdS\xcd\xcb\'\x1f\x82$\xaf\xc8\xed\xb6\xb10\xeajP\xa5\x9b\xdf\x9d\xa4\xb1me\x8c\x85An\xebYj9\x93.\xe2\xc6\x08R\xb3\x18\xeb\xe3\xc2/\xd4\x1c\xeeEw\xf5\x99bk*\x10\xf6\xb4\xbaU\x97\xbb\x02\xa2\xccY\x93\xa3\xfb/9\x07X\xd0\x11-\xef|\x0eb<\xc6\xe1\xa4\'\xae\xac<h\xe2\xc4\xcc\x97C\xb9\x85#\xdar\xaaQ%\xe7w\xe5\xa9u\xf4\xaai/e\xcb\x0f0\xce\x18A\x9f\x9f\xc7\xa6R\xa5{\x98\x06\x83\xeeD&pr\x98qbb7\xbe\x1e\xef\xd7tb\xa5\xa4V\xeb\xda\xf5\xf6\x9c\x8bJR\x13\x98J\xad\x7f\xbd\xcd\x9aR\x19\x1a\t\x88\x95dh\xcb\xbd\xb2\x04\xf7:\x06\x0e\xf9r\xd6{\x87\x925\xda\xcf\xb8F\x80\xe5\x03od\xc8Q\xcd\x98\x0c\x08N\xac\xea\x04\xd7\x07s\x02\xee\x97\x96a\xe2\xe5\xfc\x17\x94\\\xf8`\x9d\xb0N\x89\xedw\xa6\xbfCE\x19*7\x9b\xb5<\xb2D\xf7\'r\x8dnF\xbce\xce\x81\xcf\xb42\x94\x9bi\xea\xb5\xa0\xf5;\xbdR\xe2\xa3\xf0\xa8:\xbe\x10\xe1\x82\xb7S\x0f\x90\xe7\xafJ\x9e\x7f\xa1\xbcK]\xb8d\xc0 \xe7\xa9\xb0\xb1\xa2\x1b}q\x18\xa3X\xd6Nk\xc6\x8c\x87&\xb9M\x99-\x11l\xc9^\xbc\xd1&\xb8\xe4_\x81[\xa4\x03\xff\xde\xf8\xa0\x85#<\xdf\x9b\x82\xe0D\x95\x01\x8dY\x1a\xadL`*\xe5;\xef!\xd6\xfdFT\xd1\t\x13\xeb\xaa\x07\'_\x9f\xcd\xca:\xe7\xab\xc8=8\xba\xe0U\x012\xf5\x06\xc0\x83\xd2\xd9\xcf#\x12\x1e\x08\x82\x16\x8ee\xcb\x11R\xa5"~q\xb2\x17\x0c\xc1\x1f\x16f\xc3\x8ag\xd3r<\x16zU\x0c\x824\x0c\x98\xcc\xa5W\x19\xf8\xcaZ\x04\xc2c^A\x8d\x04\xef\x0b\x85\xa5VJ\xc2\x81ipO\xdc\xea-\xa3KQco\xc0\x96\xfb\xa0\x96\xc7\x1b\x83\x07\xe8\x9e!x$1\xd76\x82\xae\x16yU\xf9\xa9\xbc\x074\xd3\xa7J\x1d\xfe\x80\xcc\xe8\xf6"\x08.\xf1\x0b\x1e\xcc`6\x8dB\xda\xca\xbc%\x18E\xe4\xc5\x8f\xd2\xaf\x7f\xe3)y\xa0\xad\x8dX\xbd\t\xdb{\xff\xa5@/%\x9f\xad\xce\x9fTs_ahe\x17\xb9\xda\x8d\xa9\x9d\x9dc\xb8\xc1\xf0&\xd2h\xd0)\xa6\x19\x16\x00\xb1\xbd\xdd\xde\xaaTZ\xec\x7f\x8bT\xfb$o\xcb\xd1j\xfa+}\x87\xadK\x9cC/\xdb\xd0}b\xfc\x92\x81\xa5%\xa4$\xe6\xfdD\xb4\x9c\xad\x85ir\x82\x89V\x066\xd6\x99\xd4X\x8d\xaa\xdc\xb8\xc0\x0fM@0Ifr\x0fF\xed\x85\xfa\xde\xa6\x1111\xe9=2\x0f\xa6su\x0cOD\xeb\xcb\x8a\x1cTK\xa9\x8d\x01\x8eA2\xb0\xfbLw\xf5\x93\xad\xc5\xcd\xf6\x1d\xf5\x08e\x18t\xb6\xf0\x08\xcfx\xa6\xec\x84\xbb\x00\xe0R\x89WE\xd4Oo0\xe8Oh\x0b8$TE\xb1f\x08,\xaa\xc4Y\xae\n\xc7c\x83-\xd0v\xbe\xc2X;`"(_-\x1c\xd3w\x91\xd5?G1v\xa2\x12\x02\x0b\x17\xd7w\xa8\xb9f\xd4\x80\xd6\x95\xd1d\xf6A\x96\x1e\xb6\x01\x7f\x9b>\x9f\xf0\xce\xcb\xbf?\x88\xf6\xe4\xec\xf4#\xcft\t\xfd\xde\x04\xe5\xf7\xb2S\xb6\xea8\x19\xddL\x9e\xe8\x85P\x8b\x8fg{\xf8\xa1\x8c\xa6\x9b\xf9\xca,\x12\x81h\x089\xb1\xb6R\x91\xaa\xb5=\xf0\xbdC\x1b{\xe0W1D*>\xa9*\xfc\xcf\xef\x9b\x127(xs\xe4\x7fdQ\xdb#\xcf\xed\xcdU\xef.3\xbbI\xb6\x03\xe0\xf5\xde\xc2\xf0\xd853dj$\xb5\xf5\xe2\xc36\'\xb4!\x15\x99\x01\xe2n\xde\xcb\x90\x9b\xac\xc682l\xd2L*\x91.l\x92\x84\x17,\xdf\x1f\xeej\xc0\xa0\xb1u\xb9\xe6\x1b2K\xbdn\x0e\xea\xfd\x8d\'Y\x04\xc7[s\xca\x89\xe2^\xe2%&\xa6zm\xe5\r\x83\xedu5\x18K\xe5e\xdc\x88\x1d\r\xcb\xeb5\xa6\x92\xe4\xfd\xa3J[\x80\xd8\r\x80\xec\xb2$?\xa4\x03\xbf$cU\xe1q\xd7\xcc: ?\x91\xb7\x84\x973.\x17\xa9\x1f\xf8I\xb3\xf8\xdef\xb4\xc4\x03E\xb0\x1a:\x91w\xd4\x1cS\xff\xa8A\x16S@B\x8b\xe1\xb3yMv\xe0O\xc5\xec\x0c\x99\x8e\xb9\xa8w.\xb7\xd1I\xc3\x92*\x0e\xcf\xee\x024H\xb6\xf2W\xb2}\xae\xc4\x12\x94\xe0\xa9\x8e\xc9\xc7R\xc1\x06\xb4\xc1\xc77\x88\x87<\x0c\x00\x06\xee\xa1a\xd8\xb60\xd9\xaf\xeb\xaa]\xb3\x92\xe4h\xfd\x00\x05\xc5\x19\xf4T\x1e^\x88_\x15\x9f>d_%2A\xf6\x88Q\x92p}\xcf3\x11\x86s*\xbb\xd4,\xa1X\'S\xd8\xa4\xd8\xbf\x8f<\x88\xdc\xed\xc7>\xb5\xad\xc3s\xf4a\x1fG\x98\xde\x8fX\xe4\xc69\x15mH\x7fOX\xb9\xb9\xe7\xf6tY<\x8b\xe1opU,\xf6\x8f\xbeuhQ\x1bQ@\x86\xc7.\x18K\xf4\x8c\x89z\xe95\xb4P\x18?bj]z\x0b\x18\xfcg\xa5\xcf0]\x94h\xb8f\xfeRB\xf6\x98\xe5\x96\xedGV\xe7X:_\x00\xc4\x87\xb6#}\xf8\xc8\xfd\x8f[\x9e\x10\xfbt\xf8\x08T\x97\x87\xc0n\xaa\xaf\xbaj\xb5\\\xafg\xcf$\xf1\x93\x93\xf4\x88\x8fR:\xfe|\x1b\x1f\xb0\xb5M\xda\xcf*\x8e\x89\xd9$\xb8\xe8Z\xab\xf5K\x9d(\xeb\xd5\xe4\xe3\xe2\xc6$G\x9e\xf7L`\xb9q\x11\xd3O\x8a\xef\xea0\xad^.\xdc\xeduY\x11\x12\xe1\x01\x0b\xf3Z.1_\x13\x91\xc35\x7f\xfb\xf8\x80\xd7\xd5\x02=\xf0 \x90\x9e\x9c\x8a\x9b\x1f\xac\xbe\xdc\xb5\xfd3\xca\xfb\x01(\xe1\x10\xeag2e\xe5\x81\x87\xe0^D\x1eF\xd4\xbf\xe6\xe6\xc0\xf5\x19u\xe84S\xb4\xaf\xd2S\xc0\xebm\x16\xbdz\xca\x0c\x05\x85\x00u\xcc\xb1\xf8\xa2\xd9\xf4i\xe3\x02\xaa\x16V-\x1cw\x7fJ\x07\xc5T\xee#\xea#.[Z\xb7\x84H\xa7\x81\x99\xb1\x1b`\xc8d\x16*\x92\x7f\xca$\xfd\xe0\x84\xde\r\xa3rI\xfa9\xab\x9d\x18\xf8\xf0\xfaO\x93\x89\xe7L\x02n\xd2\xde\xf4\x1bR\n3\xa2\xd5\xbf{\x9e\x93\xc3s\xf5\xc4\xa7\xcb\xffD\xc7\xfa\'\xc5\xfd]\x8f$\xa5\xf8\xa8\x10t-\xa4x\x94O\xc4i\n\x1c\x90 v\xbc\xf4\x05\x01\x00\xee\xbc\xe8\xbcXY`\xfbO\xae\xd0\xf4M\x18\x11\xc15\x8a\x1b:\xd5\x95\x92\xc7\x0b6\x9b\x02Z\x92\xf4\xd1O\xf5\x05\xba\xc6\x92H\xb8(\x9c\xf5\x0b\x1byc\x13\x87alD|\xa5\x0e\xffq\xc3=\xba\xfb\x02\xb6\xcdLqU\x02\xa2?\x88\xfa~:g\x19\x04\xf3\xa5\xebD\xdf \x80\xd9(\xde\x98\x8c0\x12\xd6>,\xa8.\xc1\x9c\xf7\xae\xf4H?\x90\xfc-I\x91\xfe\x93X\x9ad[\x7f\xf5\xf4\xec\xcf\xa1p\xa7"\x9e\xfcw\t\xa7\xeb\x7f)M\x9d\xec\r\x15(\xd4\xbe"\xa3\x8cq4\xa9\xa5ut\\u\x14!a\xa9\x1a\xbeEA\xdavo\xfb\xa5\xa9m\xdfv_[\x95t\x9f\x04\xc2Vf\xca\xb5\xb2\x04\xaevK\x90rT\x87\xc2?>\xfcU\xb4<[\x17\xe5V\xdc=\xaa\x18s\xc1#\xa9\xf5#\x84\xf4\xa0\xc4\x02<\x1f+\xfe8\xcd\x07Q\xab\x97\xec\xfd\xd0[\x16#?\xa3oD\x99t\xd1\xcd\xf5\xf2o\xf8"[\xd8\x00\x84\x80\xf7*X\xe3F"v\xf0\xe5?\xf3\xca\xc2\xce\xbf\xd7\xbf\x84\x1779\xf5\x9d\xf9\xd2\x17\x9d\xb6\x17\xbf\x87\xfa\x98\xf0\xd8?\x81\xa9\x12\xf2B\x9e\xc2\xa9\xe8Rm\x116\xbc\xa4\xc3\x0c\xe7\xc9\xbeg?\xc3\xbcC\xff\x1c\x8f\x13S\x804\x0b4\xe9l|v\xb7\xacLr\xf5zF\n\'\xe9\xd2\xd2l\xc5\xc0\xca"t\x8b\xa90!\xcc\xd9\xf4\xbd\xc2{\xa78y\xf2\xa8\xa3\xeb \xec6\xd7\x90\xe2H\xbf#\xd5S\n\xf2\\\xcf\xb7\xdf\xec\xfc\xf33\xd30\xcd>fc{\x91\x01\xbf\x1fG\x13\x18\xc3\xee\x1f\xe7l_\xfd\x12HJ+\xbd\x1e\xaa\x10\x1b\'\xf3\xaa\x8e\xed@$\x95\x92\n\xc0<\x9b\xef\\e\xfc\x8d\xf8UJ\xd9\xf6\xb5\x14\xc0=\x97\x86?\x89o\xeb_Q6Q\xb1.\xa8*\xc5\xabCL\xd0\xc6\x0b\xcd\x0e\xde\xc8XGsR!\x1e\x97\xd4g/\n\xabB\xe1PL\x80\xad\x19\x1dMg\x8c\xf8\xc7\x80\xd1\x82\xde\xf6\xf3\xd5\xcf\xa3\xae/\x81\xb7\xf8\xd1\x14\xd5\x15\x95\xdc|\xefH\xf3\x12\x8d\xd0d\x1d\xa2\xbf\xffJ\xf0\x0b\x80r\xa4\xc5@\x85\xbdT0\xc7=ti\x9c\xb75\x9d\xb7\x1eo\nV?\xe3\t\xe1\xbe\xb8\x8aW\x96@\x9a`\xc3\xb5\xd1\xb8c\xa8+v\xf4\xf2WA\xcc%\n\x92\xdbVRm\xe0\x9cbx\x1f\xbd\xb3\';x\xaa\'\x86D\x07\xd5\xa6\xbd\x14\xa6\xb0\xc1\x19\x1e\xbe\xefm\x18\x8cU\xbe\\\xab\xc9\xe2\x0028\x99\n\xd5\xa2X9\xe4*lK\x94\xf2>F\xa1\xe4\xc4wV\xed\x1eu(\x11P;\x9a\xff\x9f\x0e\x96+\xae\x06\x96X\x0e\xe7\xa7\x8aCN\x98\x82lf8}\xa6x\x1f\xa3j!\x83]D\xea\x1b\xf5+\x9f*\xc8\xe4\xabd\x93\xc5b\x14[2\x89\xd5)6\x80O!\xbb\xc7"T7\xbc\xa3\xa2wa\x9d-\x8cc\xd3+\xb4\xc2\xd9\xc6\xc2m\xa9\xa2\xfb \x0bN\xd1\xc6\xb6\x1f\xeb\x89\xc9@+\xc7j\xf4P\x93ZO^\xe5<\x04\xd3}\x91[\x1bO\x04\x0f.\\l\xb3~\x98x\x9d1\xab\x93\xbb\xa7\x03\xc1\xd9!\x8d\xc2\x02D\xf0zp\x18l\x81\x8f\t\xe3\x00\xca\xed\xb0\xbc%p\xa91TfI<\xf0\x18a\xd2\x0e\x1c\x97\x14\x16\xae\x8e\xf5\x91\xed\xb9 #\x8c\x15m\xdbh\xa8P\xffA7\x188\xf9=\x88_\x98h\xd4\xd4\x89\x01a\x08\xcf\x04L\xa6\x0c\x91\xc3\xb8\x16[@\x823\xd7\xf6\xd6ag\x97\xca\x89\xf0&\xa6\xf5\x98_B~\x19E\xa8\x1c\xadj\xfa\\W`\xdc\xf0R\'\xa65\x16J\xc1\x0b\xa0\xb0C\xac\x18Vt\xe9\xe9}\xb8eR\xa2X\xaa\x0c\x19#Q\xd1DHP\xa1\xeeN\x8a\xc8\x10+\xe6\xd2B\xd9\x95B\x7f\xd9\xf3@Y\x1f&\x02B{0\x0fjB3\xa6\xad6\xf3\xfb\xa5\xc9\x8c=\xcbf\xd3w\x15c\xff\xf3\xf7V^\x0b\x96\x15\x14\xd3d\xda\x12\xfc\x10`\xcf*\xfd\xa6j\x15V\xf1\xe7L\x85\x03h\x822\x06\xa6\xda\xfc\xbc\xf5\xc0\xe2Q#:R\xbe\x02.\xf3!\xd3\xa2\xdd\x13O\x13\xb3%j\x00\xa5\x84\\\x1b\x98Z\x87\xc8w\xd4y\x7f&\x1a\xb6\xc9nGP#ZW0\xcd\xf6\xa3\xf4\xf7\xd8\x93\x84[G\x81\xedz\'\xe3\xc5\xec\x83\xda)p\x05b-x\xd1\xe3tDy\x1fY\xa2\x06|\xcf9F\x97!\xab0\x94\x1eH\xe45|\xb1\x8b"Jiv_\xf8)"8\x88\x9e\xa0tc[\xbb\x85\xf1\xdd\xdah\xa6 \x84C\x81J\x04\x08?\xa8 \xf8\xcf\xa4<=\xc8\x98d>\xe8\x05t^\x9d\xd6k\x11\xca\xadLb\x85Z/;\x19[b\x80\xf9\x00-\x04O\x90 \xd0v\x89\xdc\x17\xb9Nx\xdc]\xa3\xdb\xb7\xcd\xb5\xdb6\\A\x8f\xd0\x86\xa1\xdaee*c\x08[\xac)ds\x844p>n\xd9\\S\xd0\'$\xe2A\xb4t\x92(\xdb%\x8d\x1a\xddw\xd2\x91\xb8\xa4\x7f\xe2\xa9u\xbf\x15\xa6\xee\x0c.\x11\x0f\xdd\x1a\xf45 \x9dW\x02\x9a\x82\xd8\xc9\x07%0\x91P?\x01\xf2\xad|\xf6\xd5\xb9\xf9\xd8=\n6Z\x19c\xcc\x86VV\x91#\xef\xf3s\x15uC\xcd\x19\x86S\x96T2gWX\x14] G\xd5\xa2\xe8\x11\xa6?\x83b\xbbH!Qz\xe3\xb0}\nH\xfb\xde\x93\xf8\xf9\xa2g]qH\xe5\xd5vx8#\xfbc\x8bP\x87\xfbj\xf8\x82\xe4\xd5\x1e\xf5S\xd5fz{\xa5\xd6\x8f\x9f\xf8-\xd0\x8e\xf1%\t\xc5_\xdc\x06ibv\x0f5\xc1\xef\x17\xefJ\xdc\xb7\x9c\xa5\x99u\\_\xf8\x14\x81\xf9\x83B\xd0\x98CS\x15r\x01\xf2\x1f%\x1d\xb5\x17S\xf7\xeaq\xff\xdbw0\xda\xa3\x17+\xe6\xc8C\x8e\xa8\xcd\x9bU\xed\x1a$w\x8cX\x98\xbd\xb65?g\x93wn3\xeeN\x95\t\x1bt\xce)zHBLb\xd8F\xa9\xda"\x8cF\xd4\xc1r\xf6\xd9\xc3=\xf6!&\xba\x11oJ\xb9Q\x96\x16\x810\xd8\x066Z\xc4\xcdM1\xd1\x1f\x04`\xd2\xf5\x9c\x13\xb9$6&\x95\xa0X\x08p\xca`\x1eto*\xd5@\xc7\xe1\xdd\xdd\xb3\x16{\xab0A\x9f-\xbe\x1dE3|5\xe9\t\x0b\xac\xd0\x86\x9e\xd2\x96\xcf%U\x10\xabSSl?a\x9a\x0e\xe7\xf4,R?Y*\xee\x8e\x1d\xa7\x087\xa9\xdax\x18\x93\xb2%\x9a]i\xc7\xa8\x15\xabD\x8407;\xadF\xd0\x80S\xddr\x9c\xf0\xa6\x05\x00b\x9d\xc4\x18\x8a\x1ehY\xcbKGt\xa6F\x83\x91\xfaAX\xf3O\x04\x11l\xa75BG\xde\xf0J5C\xb8!;\xceH_o\xe2\x92\xa2\x93\xed9L_jK\xc3\xa2\xcfz\xa62\x9a\xf2T\xb4)\x0ew0\x06O\x89\xca\x01H6H.\x95}\xf6\xd8\xfc\x9b\x85\x85e/\xf9\xfa\xb9\x81_#\xa1\xe2;+M\xd5\xb4J=\xcf\x9b\x90\xdbV\xdc?\xde\x99`tp\x9f#\x88\xcd\n\xf8\xe22\x94\xda\x88\xb00\xc6\xbf\xf4\x11K}x,\x0f\xe1\xdd\xd5ts\x98\xcfJb\'\x12\x9b=\xb9X\x1c\xa9)\xdd\x91?u\x80\x7fU\xb9\x9bg\x99Z\x13\xad\x17\x07x\xd1.\xf9S\xdc\xc8\x17&\xb07\xa8\xcaz\x9b4\xcb\xa5B\xba\xb4\xeb$\x8an\x83T@\xf9\xd9\x0b.3s\xa0\x1d\\\xc8.\x95i\xc2\xa2\xbc\xa8\x90Cz\xed\xca\xa1\x1bc\x9b+\x0fC\x12\x036\xb30\xf2\xdd\x92\xbc5\r\xfcEv``V\xfa\xe7\x01\xa9:U\x0ff=\xff\x97j\xd2\x13\xbb\xe0\xa4\x01z\x02$\x80kp\xb3\x1a\x96\xbed\xaf\x04\xbb\x0e_\xfb\xe8Z\xfc\xd2\x13K\xe8\xc6\xe7b\x1e\'\x11\xf0\xe2\xe5:\x9d\x00wte]\xa3J\xa1-\x0b\x18``\xdc\xe22\xcf\x18@U\xf1&Z\xb8\xa4\x02\x9b\x19?*\xcf\xf5 e\xf8!\xdb&\xd93\xc8\xadiG8\xc2\x00\xdd\xc3,v\xaaZ\xa0\xc7l\xb4u\xb4\xd9\x84\x9cwYR\x8bn \xad\x9c\xab\xb9Gh\x1c1r\x15z\r\xf5\xdf]c\xc0\xa2\xaa\xf8\xc0\xe3\x88\x96ln^\xb7#\xccWN8\x96\x88\x89\x10\x9c\x84C\xa9\r\x07\x8c\x12x\xf1\xd7\xb3\x1fo\xc4\x16\xbdQ!\xa9\xe2~\\[\x06\xc0`}\xff\x146\x9d}o\x08\x1b\xdd83\x0f\n\x14(\xda\xc3M\xc0\xb4\x19q\xca\xc0\x04\xe1\xc6<h$Fl\xca5\x9a\xc9\x88\xdc~3g+\xe0\xbcFYD\xf2\xb21\xb1\xe6/\xd5\x9e\xa5=i\xfc\xb7$\xbeu\xaa;w\xc0\x05\xde\x99\xba+\xf2\xf6\x10\x0e|\xfc\x1a\x9fg]\xa5\x95C\xcd\xcfkWS\xd6a\xdd"\xfc\xaa\xe5\'\xa5~g\xd1e\xff\n\xf6-\xdb\t\x07\xd3M\x15\xbd\xae\xe7XNiQ\xb5\xc9\xa2\xd2\xf4\x033D\x9e\xe8\xc4\x9b\x84\xa6%\x88&W1\xa5c\xac=3s\x0eO?\xb1z;\x01~\x8fa\x90H\x1e\xf6}\xeb\xe2\x84\xa9\xb6:[\x99Jb\xec\xe5\xbb\x06:\x1bN\x1fS\x8b\xe5\xf9|\xf0\x1c\x9d\x99\xfa\xbb\x93\xbbd\x86M|\xe5J\xa2\x8e\xda\xfaC\x8e\xe5\x0337BL\x95@t\xfc#\x9d\x9fiU\xf9\xa3\x1b\x8fK\xf2k\xc0\x99\xbb\xe8y\xf9m\xf5\xa6,|t!XX\x99\xb5\x9f\xfa\xed\xcc\xea\xb7(\xac\xfe~CT\xc4\x1d\xdb\x15\xc6\xe5\xb5ea\xa3\xf9i%\xe4\xcb\x9b\xf3\x04Q\xbfL\xe1\x86\x01\x01\xc5\xff}\x80\xb0Jg"O\x0b.\x9eC7,\xbe?\xe5\xc4\xc4,=\xb4\xbd;_.\'&\x06\xc9\x96\x16o\x87\xe6\x8e\xec\xbe\xc8]\xc9\xcbL\x19\x0f\xcdO\xfc\x8b\xf1\x0cX\xd6X\x83\t\x93\xd6Y\'\x05\x17\xd0\x06\xa8\xbd\xc5\xa9\xb1\xbd\xdd\x96\xa2o0\xf1\xcbP\x9f\x1exp\x8c\xf1\xf5s\xbc\x1b\xd9\xac\xad\xe5}\xfcu\x92\x83\x9e\xa4!\xf8t\xa2 \xc9(\xf7\x14)\x0c+\xc0\xad\xd4\x94e}\x14}$\xfd;\xbd\x00b\x85x\x07i{\xfbS\xf83\xbdy8\xdd\xaf\xff\xce\xaa\x06B\xd3\xe4&\x06\xe1\xe0i\xcd\xb9m\xbb\x9c\x86\x1dz?:\xf5I\xd6\xc6\t\x1aG$r\x10\xe8@\xa3\xc3\xf6\xc5k&\xfc\x88\xc7\x9c\xb5\xbf\xba\x88\x0fI(m5\xbc|\x00\xda\xeb\xf8\xc4\x84jyp\xde\xb3\x10\x80\xdc\xda\x12:v\xedz~z\xa4\x17\xf4\xf5\x05`e\xffQ\xad\xc6\xdd;\x1b\x0fq\xab\xbfY\xbf\xb0)\x96\xb4D\x1d\xdf\xc3A\xf2@\xe5\t\x96G\x92\xd0\xad\xf8\xa1\xcb\x88\x8e\x02\x14\xad\xb1\xbc\x04\xcfh;\xea\x88L\xfd\xe6\x94{\xa4\xe5F\x16\xd4\x0c\xbb\x97>GX\x16\xbf$\xa2\x1c\x7fo\xf3\xac\x92\xc4d\xd6\x04\x12\xf9\xb8 \xaf:vC\xb0O@o\x99\xb3\x15\xb5\xa86\xa3Z\xcf\xd0\xe6T*uP\x17@\xab\xe9x\xa00\xe2\xd2\xcc!\xb7_\xc9\xa4\xb7\xb9\x84O\xb5V0\xbe\x96W\xb8\x98\xbe\xc7Gcv\xf8_\xf6\t\x86\x8cX\xc2\xe6\x18[\xd6,\xf7\xb6%\x92\xaa\x96\n\x1ba\xe7i\x18\xcdU:%\x8a\x9d}K\xedA\xf3\x1d\x87S\x04\xc3\x83\xa4\xc28\xbd\xed3T{/\x15\xe4\xd0L\x13\x14jk\xd0\xbc\x9a\xc8\xb2\xcd\\\xc9\xea~r\xb5\xee{!\xed\xa4\x8e_*\x00\x0b\x14\x9f\xd9Y\x93\x94\xc5\xca1\xbce\x18"\xd0\xab\x93\x9f`\x97a\xb7\xd1\xd6\xb0\xf6R\xb5\xad\x8d5TdQ\xdc\xed\x17;\x1c\xb8\x95\xea\x8e \xd3s(\xf8&Bsv\x85\xa0\xd3\xda\x88#{;x\\.n\x1c{\xb4\xa1("E\x9el\xc2\xe0\xdc\xba\xfat\xd8\x88\xe2\xe7\xd23:\xd4\xd5\xae\x98<\xefEE\x08`\x0e\xaf\xb8\xfb\xca\x9a\xf4g\x1e\xc2\x95\x0f\x88\xfd>| d\x0e/9\x0fQ5T\xce\xce\xf4nt\xb3\x06(\x9c2z\xba\xba\x1f:\xcd\x11}\xceX\xaa\xba\x0c|o\'j*\\\x86E\x1bX\x96O\x82\x10\xb7K\xa5Y\xd7\xce\x13!\xe0a;e\x7f\xf9\x0b\xe4D\xe7\x9d\xe9\xa6\x81\xe1\x17\xc8\xaeV\xfdX\xb0t\xe1\xbd3\xd4{(\x8d \xc8TZ\x1f<\xd3\x15\xfd\xf1q\xea\x84\xc2\x95{\xf1q]\xa3`\xec\xa8\xa0\xe6\xc2\xd8\x99y:\xb8\x8e\xb34\xa7I\x9f\xbbE&R,\x99f\x0f\xf3l\x9e\x9d\xc7\xc6n\x19\xa4\x9a\xa2oL\x98d>\x90\x93K 4\xad\'\xd3\x00\x04MG\xe3\xee\xeei9.\xe1_\xf7w\xea\xe6\xe8\xab&>\x8d\n\xf9\x0c3\x02\x1c\xaa\xf0:\x1dKt\x8ezu7\x95\x94\xa2\xdaz\x11c\xa3o\xe1QOj\xcd\x94\xf7\xd4\x1c\t=[?\xdc\x82\x9d\xbd\x8f\x1054\xbf\xb2\xc0\x9c\xb6\x9e\xd5\xcc\x939\xa1\xfc1(:m\x041\xd6\xb7\xa61\x13:\xde&\xd1\xcf\x8e\xebU/\xe8Y\x04.\xf4\xef\xabE\x14D\xde>\xe5\x0e\xfa\xe7\xb1\xcf\xb9\xcf\\|\xe7\xec\xb0\x98W\xcd\x07\x83\x03\x12\xfa\xa4\xed\xa2*\x97\x0cdx\xbezg;\x0ea`t?\x91_@\xf0\xa1\xbc(I\xccB\xd3\x96PQ\x93\xb7\x9f\xe1\x18\xbd\xd0FTn\xc0g\x7f\x9f\x9c\xe3\x06\xf7\x8b\x1f\xbbM\xa1\xc6O\xf1\xfe\xd6\x82\xf1\xd8\xa1(x\x89\xbeM\x15\x8d\x02Y\xe8\xeeWl\xbb\xafrVE;\x96\xd9\xe0\x98\xa4\x15P\x04Z\xfa\xcd\xb0\xc3\x81\x1c@\xd3\x07\x18\xcb\xcc\x1b,\x11B\xa7\xb4r\x91\x88Z\xad\x93\x03\x80`V\xad\xbb\xbe^\xb5\xca\x8af8\x03\x1eW\x96\xb3.o\xf1`>\x84\\"(\xa8x\x1ai\x18\x92Qy\x8d\xa7\x13\x0cUQ@\xd1\xbc\xc9\xe3\x19\x1a]\x82$,wz\xd5\xb6/\xd8\x9e\x18\x03\x03\xf3Vu8d\x82\x7f\x1f\xe3|\xb2\x80.?X\xabW\xe5mx\xb2\x8c%\xa0\n\xfa\x1c!:\xe4\x0fPEB\xce\x05\x89X\x1buj\x84\x0f\x04\x89\xae\xd8@D=\x9b\xb7\xab\xf5\x99m\x9a\xd9+=\xab\xcc\x1d\x8dk\xfb\xfa\xc3w\x9b\xf5}*xm\xa8W<\x17\xe4+G\x89<\xf2\x82\x9d&\xc1@\xe1\xe4<C\xda\x0638#t\x87UF\x91\xff\xe9\t,|T{\xbb\xba\xf5\xa4Pkiz_\x15\xd6\xbey\xf5pHHZ\x15@\xe99\xcc\xe0dv9\xd2\xdb\x1a\x82\xa9\x9c\xb9\xe7\x1cS\x12\xb3Z\x8a\xac\xcc[\xe2\xbf\x07\xda\xc5\xd4\xa0\xc6a\xef@\xf6`\xe4\xca7\x89\xf8\x7fQ\xab\x9a\xe5\x11\x06\xd3\xb6\xc0~\xa4f\xbdLo\xcb\xc6(\x92\xee\xa2"\x04`\xad\xa1\xe3%\xb8\xa8\xbd\x8dP|\xf7\xbflGZ\x11\xb7vw`\xd4%\xaa\xbb\x8bTe\xf0\xb0J\x0f\xe2\xfb\xe0\xaaB\xec\x17\xb4DN\x11\tr\xd8\xb9\xe36GyP\x81\x0f\xc3w\x18\xaa\xca\xd9\xc8y\xc9\x19\x92\xd6\x17Z\x1bTl\xfa\xe7\x1bg\x06\xd5rD\x11\xf1\xfdl\x01,\xf1\x12\xddL\rt\xa4\xd2\xf7zO\xda*\x1eyx\x9e\xdf\'\t\xa1Bp\x82\x87\x89\xd7"\xb45\x97\x80\xf9x\xbd\xe4\xf5\x86e\xa6n\xa3?\x0c\xfdB\xdakW\xe0\x138\xc1\x05\xe8\xb5\xde\x02\xca+ \xb0s\x98:E2F\xbb\x1c\xf4\xc0\xaa\xa9\x98\xa6xP\x8d\x93\xccd\xa1w\xac\xac\xfa\xcc\x8dI\xa9mH\xdd\xb2\xe3SqDd\xca\xb5\x0e\xc4%\x8e#\x12\xafY\xa2\xf0\xa8\x93^\xe7\xd1\xad\xff\x87\xc1`%#1\x95-F\x03\xb9\xa0vb\xa6\x89\xe8\x11$\xf80C)\xdc\xfa\xf0\xea\xed\x96:\xc8\xe4\x05\xff/\xce\xf3\x8cEX\xb0\xe2\xa9\xe5/\xc8nD\xb9>\x9c@\xbd\xd9\xf8m\xb5\xcf\x14\xae\xed\x05u\xb3\xcf\xc1\xa0<\xc9JB\xa0\x03\x86]\x86.9]\x02h\x07SI&\xf6+\xf3\x8d\xe59\x14\xdb\xd6i\xbe\x11\xc6\x8a\x80P\xc7K\xaf\xab\xfeS(\xb83\x87r\xb1\xc1\x83\x88\xb9\x12\xb0\xb5$8\x1c\x8f.6DT\xe69\x0b\xffM\xd0\xf27\xd4\x1fF\x9b\xfe\x9fP\xb3;H$\xf9\xb7.\xde\xf2"H\xe5\xb5\xf8\xd4;\xe4r\xfb\x88\x8d\xd9\x89\xd1\x96\xe7\x1d\xf5tC\x1a\xa3\xe5\xba@\xf3\xe5\xd7\n\xea\xce`v]\xca\x0c\xb7\x9f\x8eTU\xae\xa6Z\xea\x90\x15\x87|\x05\xe6T\xb6\x88\xc2S\x0e\xd03\xa1\x88\xc5\x95\x1a\xc8\xf3c\x83\xa56\x1f}H\xd4\x8f\xf4\x90[\x9e\xd6u^\x90n\xd7x\xc6]\x86l&\xde\xfb\xf3\xb5\xdf/lNj\xa5\xdd5\x13pdf\xd2\xe9\n\x88,RV-\xc3U\xa0Q\x8b\xc4K$\x8a\xedD\x7f\xc6\xf2W\x8e E\xe6\xfb\x9a\x05\x90\xf5\xdd\'\xc1\xb9\x03\x84\x1d\x8f\xe9\x86[\xa4\x91\x86\xe83\xb9\xd6\xff}\xfa2\x17\x00h\x1f\xb8\xe0\x94\xfb \xec\x05\x8c\x0c\x9b\xb6\xbf\x128\x04\x95\x14\x89+\xc9\xae4\xb5\x99\x04\x13K\x9fC\x1cg\xfb\xfc\x0e\xb1\x17\xe2^\xdd\xcb\xf7D\xc8\x19\xf0\x87\x1f\x91\xa6\xb0J\xe5\xe0<\xea\xfb\xacM }\xd2H4dB^3\xb37\xa5\x17\xc5Sj\xba\x92VO\xc1`\xc1\xd4~\xf4J-F\xa8\xa5=l\xab\xfd\xa58d\xb6\x96\x95\x8eH\\\xb2\x1f\xf6\xdfW\x99\xae\x96Ia\x84\xb2[\xb2+\x95\xe5\xf5n\x88b\xb8\xc7cu_\xf8\x9e\x8f\x1d=\xac\xa8|\x8c:S2\x1e\xa2qz\x15\xe9]\x1e~\xd7\xca\x8cU\xff\x90\x9b\xc3\x95VweY+~\xf1\xff\xd7)2\x93\xa8\xc5+\xcfX<l]\xe1\xdf\x9a\x18Xy\xc0\xcb\xc8K{\xce\xb7R\xa4\xc1\x13\xfa!\xe1;|\xdf=E\xb6\xa6?\xf1\xcb\x99\x0e\xa8_o\xa4(e\xe8\x1c\x89j%o\xb5\x96\xfc\x07o\x1aP\x8e\xee\x1f\\\x10\xc8\xb8\xda\xd8\x87\x16R\xfa \xe4,\xdc\x90\xd6gaI\x84\x92Q\xd6\xf7VUa\xe3\x16(\xf0\xd1\xe4K\xd2\xfc\xe6w\xfbg\xa7\xe0dqv\x8a\x86tE\xf8\xa7\xe4eo\xe9\xf3uhHv\xd8r\xf4Yx!,\x05\'\xb2\x9a\x1aG\xe4\xd4\x93\xba\x17\x8c(\xb3\x04\xe0\xd5utv\xc4\xfaq\x10\xe1\x99\xbe/{5\xfd\x16X\xb5Tu\xd4\xa5\xee\xe3Uc\x80\xec\x96\xf4\xda\xd0\xc6\x98 do\x86O\xd3l\xc5\xbd2\t\x1f\xbf_\x12b\xe6\x91\x19R\x15\x14\xcb\\\xd6\x80B\xd1_\x81\xee\xc2\xbdK\x8e\xbc\xb1\x19\x9dk\x80:\xde;\xcc2\x851?7\x01\x8c*-\xa6%\xdc\xb5\xd11Ed\xd0W\xa3\xc0\x19\xf7\x06v\x12&\x82BS\xa8\xb9\x19\x8d\xf2\xc5\x0c\x1d3\x00O~\xef\x0f\'\x81\xab\xd44\x81[\x0f\xca\x1f\xc9\xbd.\xb2\xd3\xcek\xd1:\xbe5\xe8\xfc:\xb3\x14\xf9\xcfV$\x1f\x16\x83-\xea\xfd\x7f\x96$\xbb|j\xe6A-\x8a\x1a\xf9@\xb7\xa2\x19\x98V\xb8B\x1c\xd5&\x06\r\xae\xd9\x05\x07\xefMl9\xaae\xf3_I\x04\xb9@\xf4\xcb\x14\xddW\x90\xb8b\xfc\xdbx\xbc\xfe\x11\x19\xa2\x866\xee9\x1d\x17{\x0e=\xef\xf5c/.{\xe3\xaf1uo\x00\x94\xea%\xbc\x11\xb8\t\xed\x8d\xdb\xf7\xe33\x82\xd4\x17O\xac\x02\xec\x90\xd6\x9b\xac6\xee\x96\tY\x90\xfb\x87\x88\xea5E\xb5\x87\x0bs\x18\x04a(+\x11\xf5\xa8\xd1$9\xafX\xcd\x16\x03\x9e\xe3s\x0b1\x8b;c\x15\x05\x7f\x9f\xcbl\x81N\x8dt6\x0c\xf9\xae\xc2W\xab\x12\xaeEj\xeb\xf8\xe0\x93\'\xa2\x92\xefdk\x83Y\xdd;\x8b\xb2\xb9\xed>w\x1ax\x86\xf7\xcd\x7f\xc7\x96\x97!\xd0 %\xb5\x19u&M\xc1\xed\xafIL\x86?\x8cJl$\x7f)\xf8+u\x84\xd1[\xb6\xaa\xae\x1c\xc1\xb1("\xa8!\x96\xd5\x9e\xbf?@\xd2\x0ce\x86\n\xe8\x9dp\xcc\x9ea\x88|\x81@\x0b\xd5\x8d2\xa7\x0bpQ\xde\xe2=\xab\x16\x1e*\x10\xa2\xd8\xd9<\xda\x8f\xbfU\xd26\xf2W\xe4\xb7\xb2Rk\x95+\xe1\x87\xa0\xad\xe4\xe3\xbf\xe2M>B,\xf2Ps\xcfN\xcb\x02L\xb8\xeb\xd6\n@\xea\x9er:\xea\x93LS\xe6]\x05\xb9\x1e,\x0b\xd0\xd9Q\x1b\x0f\xd3\x10[\xd4O\x19;\xb7\x99O\x06/\x0bi\xb8^\t\xf3\xc8\xdf{\xb7G\x99e\xaa\xba\x99\x14-I\xb0\xfaV\xf2VD\x04c\xaf1\x88\xd4\x00\x15\x8e]P\x10\xa6\xe9\x83>\x95u^\x1a1\xf8\x0e\xbb\xd8\xe19\xbd\x8d\xf60\xf4\'Wx\x93\xabY\xd8&\xe9\x85t\xfe\x81~\x84\x90e$0M\x7f\xea\x1d\x84b\x88]\x17A\x0c\x01%(\xb9=\xf6^\x8b\xb9\x1d\xae\x81\xdb2\xd1\xbf30\x87\xd6\xf4B\x82\xeb\x96U\xb2:\xbb<\xbc)\xb7\x8e\x1d|YK\x18/\xe1@~\x98\xaf\xceN\x9d-\xae\x08\xb0\x80\n\x02\xd3\x10A\x08ui\x83\x19g\x8et}\xcb\x1b#\xe8<\x92\x15\x0e\x8f\xc4\x96\nmj?X\xd2\xe4~5\xf8\xa3xI\xc3\xc3\xd1u\xb0\x1b\x12\x93\x9c\x84@\xadh\xc8{\xd0\xdd1\xe7\x86\xd35\xa7\xdc2\r\x84\xcf\x00\x12N\xa9-\xd6\x98@0\x9b\x8dJ&\xb7Cc\x9fg\xa5\xee\xe4\x07\xe9_\xe6\xb0 A\xf0\x93-\xbcjD\xf2Y2\xf2\xd2x\xfb\xb7O\xd2s\xf0\xe28\x8e\x1e\x155\xb7\xdaO\xf1\xe7;b)\x9elC\x1b\n\xa3\xd6\xaa\x1c\xf7gi6X\xa5\xc4\xe8\xff\xe2\xe1g\xea\x9d\xe1\xa3\xdd\xa4[c\xaa\xaa\xd3#A\x89\x14A\xc3ad\xe7\x9f\x05\xc1PI\xf2?\x84G\xce{6e\x96\x91N\xd9\xf4g|\xf0\xb6\xfd\xca\x13\x05\x80)\xec_\xbfT\x88\xebM\x93\x14\x02\xea.\xd4\xd2\x9c\x1d\xc5\xd2\xe0\x9c\xcff|\x1a0x\xeeN\xf1\xe8R\xc2\xbc\x19\xac\x1c\xd7\xd4\xcc\xc0<$\xaba\x92\xb29\xff\x13\xc4\x1e\xa9\x0f6\xf5\xe0\xb5\xc4\xf6\x14\xea\xa4\x8c\x87\x07-\xfd\xe0~\xa2?\'\x9b\xe52\'\x15\xe5Xv\x86\x7f\xcc\xfe\x9eqO\x18\n\x7ft)W\x99\xbc\x8as\x8e\x9a\xb4\xc8\xa8\x11\x7f\xa9\xb79\x1a9\xe4\xc3\xbfJ\xe1$\x94\xcf1\x02\r\xbb-\xc8\xa5&\xdc2\xd5\x04\xb5?gmXt\xf8\x84\x15\x01\xcf\x03|^L\xf4\xbc\xa40\x05\x0c\x038\xfcH\x08\x01\xc5\x8ao\x15+X\xda\xf9\x00\x97\x81\x00#\xf0\x89\xbb\x15\xa6\xae\xaeq\'\xe2\xb9\xfe\xb1\xa2v=\xce\xb8\xecN%\xc0\xe1\x1d\xda\x82\xce\xeaB\x9d\x87\xfb\x8fO8\'\\\x15\x9e\xefx\xb5IO7\x979i}\x9f\xbe;d6\x98,w\xbf]\x1b2!\xf1`\x82\x96\xb2\x1c\xb6\xc8\xa1\x04\xabJ\xbe\xaa\t\xe4\xd9\xbf\xe0\x1c\x87]*A\xf9\x89\x05\xb8)\\\xac_\xfe\xa7t+\xaa\xe4\xa1\xef"\xc4\xba\xa6\x1e\xd3\xc8\xec\x91$\x98\xef\xe6\xbe\x91s\x8e\x80\xfe\xb2\x0bd\x91P\xf7\xd4\x92\xb0bU\x90\xab1\xa6\x86$\'*\x15H\x85\xc6\x1c\xd5T\xeau\xfdr\x84\x19w\xa2\xa3\xfc\x1f:\xcf\x94\x9f\xe8\x8bHZZ\x80\xe0\xbdk\xaay0\x15\xb2]\xfau\x8b\xe1\xa8\x14\x1f\x84\xf5\xaf\xd5m@\xedcu\x84\xd70\'\xf0m!\xc3 \x87\x84n\x9ac\xdaA\xa0,\x07\xfa1HYoH\xc3\xabk]:\xd9\x1f\x82\xdaBI(\xbf\xdbE!\xadN\x8f\x887r\x14\xa8T$\x1b\xbd\x01\xa9(\xa1v\xc6\'q\x0b\xa0\xb1m\xed\xaa\x08\xd0\xa1\xcdV&{\x9aa\xcct*\xdd\xd7\xe0?%\xc5\x7f#\xb9Z\x1d\x9b\x87\xc1\x94\xeeT\xe2\xcf\xa1Y\x9bRo\xdd\xbb\x10\xca\xd1H\xb6Lr\x91\xe4\xc8\x93E\xee\x11{\xfaFk\xee\x9e\xa3/\xaeU@SC\xb9@@\x1b\x9b\xf7\xc2\xc3\xc1\'\xa4\xfc\xd7\xfa!\xe7\x0c\xd6\x18\xbbn&\xbc!\xf4w\xb9\xfc\xf0(\x84O\xf2\xfb,\xc3\x8a\x83\x05\xca\xd4\xbd\x82;8(\xa6{\xcd\xd2\xbb\x98\x87\x0fFHM\x94iK\xee\x99 4\xafoE\xa4\x16\xc4C8NMu?\xad\xb5<\xdeQ\x88 \xa2\xcbH9\x04\x11\xa3\xd4A\x92\xf2g\xe8\xcf\x8fi\xa6\xfa\xcf\xc3\x02\xe7\x9d\xf7\x9b/\x16\xdf\x8a\xdcGW\xd5\xd9\x17\xaa-\xbb#\x8a\x19[X\xa3\xbf\x0f\x85h\xac#\xdbm\xb7\xe7*d\xc0\xfd\x07p;\xd7v}]\xb4\xf1A\x02\xe5\x07\xc5`G\xd2\x7f\xf8\x0cl\xe2Q%\x98/R\xee+\xaf\xf7t>\xc4\x1fb\xa2\x9b>\x8bSO\x03\xee!\x81\xe7w\xc9\x1a\t\x19[/\xad\x83y\xe3\n\xeb\xf1\xbc\x14\x10!\x12d\xa8K\x88\x11a#\xa8\xbam\n\xdc\\M\x04\xa7O\x05\xcb\x03ee\x93]\xe4\x15\xd3w\xe2W\x90[+\xf8a\xd4\x96\xfb\x8b\xd6\xcc\x08]\xe6(\xe1a\xbf\xf9\xfb\xdf-\x1dm\x17\xc3@\xd6\xb8\xd9\xce\xfe\xc37nS\x84\xc6\xe3\x0c\xd8\xf3\x9a/\xfe\x91\r\xc6!\xb7B\x84[g\xcc\x81\xb1\x96\x8f]H\xb0f\xed\x03\x056m\xbe>R\xe6wjB\n\x1e\xd9\xb9|\xd3\xd2\x08^\x02V\x95\xac\x17\xbe\xcb\xd9f\xbd\xdcly\xc2\xda\x90\xa7)\xe7y\x0f\x8f\x03\x13B ;i\xa6\xfe\x8f\xfd\xec\x1b/\x971\xeeR\xcfEz\x90* \xa2\x86L4\xfa\xd0\xa8\x0c\xe4\x7fT\xa8a\x18\xb43\xbc\xfc\x19c\xccr9\xf5\xf4\x99~\xb1a\xbd\xf6\x10-\x1c;<\xdd"oa\x01\xd3\x89ZR\x17:\xfe\xaa\x9eP[N]g\xa4\xdf{\xa2\x89\xf3\xbe\xcdH\xd6\xa3\xf3VE\x02\xb2dm78\x89\xfe5\x1dl\xfa\xf2\xbd\xcc\x89o\xe3\xdc\x19\xf6\xfe\xe9\xf4;\xbd\x94\xf29tE\xc0\xe5b(\xaa\xe0B<\xcf\x93\\F\x18E\x07J\xf2\xf3u\t\x81\x183\xbf ,\xe9L$\xcf\xacK\xc2\x7f\x08sd1mT\xf5\x02\xb6\x97+P\x05g\xf0\xdb\x15h\xdd\xb4R\x16lL \xf1\xdb*\xee\xfd\xb93w#c\xc9/\xa2\x1d]\xa9\x93fO4\xaa`\xbe\xbc\xd7\x82O\xda\xf6\xdc\x01\x11At>\xcf\x8a\xad\xe2\x04P\xd4\xc5\x1e\x9b\x7f\xbaw\xe3\x96\xa6\xd6@t\x15\xb51#U\xce\xfc\x01\xc9\x10\xbc^*\xf0\xd5\x83\xc6Bk\t\x0c\x83-\x86\x92M\x91?\x16-\xdea\xa948"\x15=&\x94\xb6U\x04\xdc9\xaf\x1c\xea%\x1foRFMg\x97y\xa5\xe2\x9bb\x13\xbf\x07\xc4\xd9\x83\xd4\xbbO<\xcdn\xfag@\xbe\x9a\xff\xae5*w\xb2d\xa6g\xe34\xdf6A3\x985\xff\xa6=\xd2\xce\xaaa\xa3)\xcb=C\xc1&rz\xbe\x1b\x03\xd3k*Y1\xa5K\x9a\xb9\xdb\x8b\x16\x8dDy`j\xee\xbc\xb6\x89\xba\x19\xd6\xa3H\tqH\xba\xd8g/\xae1\xc3$I&\x10xE\xcbM\xc7\xe4\xa9\x08\xba\xb9\x16Lp\xc1\x14\xb6\xdf\xae\xe9\x98\x07\xcf\xb9\r\xef\xb3\xd8\xc0\xdb\xa3R\xfc\xbeA\xd5\xf6\xe86gD;[\x15y\xd1G[\x05\xbd\xff\xf7\xccs\xbc\x9c\x82\x88\xa6\x16y\xcb\xdb\xb3\r\x03{q\xe1q\x92\x1c\xcb2\xe6g\x7f\xd4#\xa7\x0b\x88\xee\xb8\xd9\xb4\x12\xdb\xc3k\xfe\xe8*\x8csB%\x1c5#(\xf4\x86\x10\xa7\xfc;\x00\x83U\xda\xfd\xa2\xa5\x95\xed\xaarH\xac\x13=\xa7\xf7\x12\xcc\x81]\x80\x08\x8d $\xa8\xbc\x180\x95r\x7f\x10\xa7\x88\n\x12\xc1bd\xf4G$;\x87\xf0\x02\xde\x9dK\xf2\x8b7\x15\xc4\xdcR\xf4\xa4X{*\n\x88>F\x83Gh\xd9U\xec\xba\x9e\x02\x15T\x97\x007B\xc3dVi9\xea()^\xb4=\xa7\xac5q\x10\xa5\xbe*\t\rYu\x01A\xfaC\x01\x88r3;\n\xac\xba\xbf\xd3\xa2\x8c\x80Q\xac\xe4\xe3\xe19\x90\x82c\xfd\x85P\xc5o\xa2\x92<\xab\x80\xf0\xbd];\xdd\xb4\x18[\xfco\xec\x97\x82\xfc\xb5\x9e\xf5\x94Jk\xe9%\x8e\x9e\x1d\x9fM\x89.\xd1\xbf\xfb+\r\x08\xd2\x0e\x8f1TD\x02\xef\xf2v\t8\x16=v\xa0t=%\x0f\x83N\x14\x11vc\xfa\xafGQ~\x1b8\xc3P\xb7\xb9\xddD~\xc4\x02A\xcd*F\r8\xde\xbc\x9e\r_\x98\'e\xdd\'\xc6\xe6Ao\xcf\xa4\xc1\xee\xbd\x9e\x81\x17\xbc\xf2\xd9\x02_-:\xcf\xf1\x7f}Ve\xb9"%\xa1\x89\x13+\xad\xffI\xc5o\x97\xcdI\xe9\xd2\xc6?o;\x9cg\r2\xf9P\xac\x01b62\xbd\xc0\x8e\xb4\xd0\xf2;\xb7\xf4\xd4\xd7\x1b=\xdb\xd0a"\x16\xd1\xd19\x11C\x19\xe4Y\xa2\x0f\x97\xd9]\x13\x1fQ?\xe6a\xc7\x92\xe3\xdcL_\x13\xf8\x19\xa4*\xa6\xba*7\xb68?\xde\x147S\xc7C+\xce\x8d\x06"J?Y\xdc"\xe3\x91\x1b\x9f\xe4\xc0#=\xca\x04Dv)P\xdez\xb9\xd1/\xacp\xb0\xd2{G\xa3\x81\xe0BY\xb6\xcb\x96\x98\x0e\xaeBF\xb5\xa0z\xa9\x9d\xcd\x1a\xf5Q\xc6k\x16/\xdeZ\xbdP\xf3G\xa5Zo\xa3O\x1fW\xc3-^d<jH\xe5r\xe7`\xf01\xec\xf2!Y\xb2\xb9bL\x9a}\x8b\x04e\x9e:\xc6\x9b4\xe8!\xb7\xa3\xd9\xac\x0e\xb6\rM\xbcX\xfd\xe9\x16')
1
+ import flask_babel,flask_babelex
2
+ from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
3
+ from wtforms.validators import Regexp, ValidationError
4
+ from flask_babelex import lazy_gettext as _
5
+ # from flask_babelex import gettext as _
6
+ import wtforms as wtf
7
+ from flask_wtf import FlaskForm, CSRFProtect
8
+ from flask_bootstrap import SwitchField
9
+
10
+ from flask_admin.base import expose
11
+ # from gettext import gettext as _
12
+
13
+
14
+ import re
15
+ from flask import render_template,current_app, Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+ from hiddifypanel.models import *
18
+ from hiddifypanel.panel.database import db
19
+ from wtforms.fields import *
20
+ from flask_classful import FlaskView
21
+ from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
22
+
23
+ class SettingAdmin(FlaskView):
24
+
25
+
26
+
27
+ def index(self):
28
+ form=get_config_form()
29
+ return render_template('config.html',form=form)
30
+
31
+
32
+ def post(self):
33
+ form=get_config_form()
34
+ if form.validate_on_submit():
35
+
36
+
37
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
38
+ bool_types={c.key:'bool' for c in boolconfigs}
39
+ old_configs=get_hconfigs()
40
+ for cat,vs in form.data.items():#[c for c in ConfigEnum]:
41
+
42
+ if type(vs) is dict:
43
+ for k,v in vs.items():
44
+
45
+ if k in [c for c in ConfigEnum]:
46
+ #if not k.commercial():continue
47
+ if k in bool_types:
48
+ BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
49
+ else:
50
+ if "_domain" in k or k in [ConfigEnum.admin_secret]:
51
+ v=v.lower()
52
+ if "port" in k:
53
+ for p in v.split(","):
54
+ for k2,v2 in vs.items():
55
+ if "port" in k2 and k!=k2 and p in v2:
56
+ flash(_("Port is already used! in")+f" {k2} {k}",'error')
57
+ return render_template('config.html', form=form)
58
+ if k == ConfigEnum.parent_panel and v!='':
59
+ # v=(v+"/").replace("/admin",'')
60
+ v=re.sub("(/admin/.*)","/",v)
61
+
62
+ try:
63
+ if hiddify_api.sync_child_to_parent(v)['status']!=200:
64
+ flash(_("Can not connect to parent panel!"),'error')
65
+ return render_template('config.html', form=form)
66
+ except:
67
+ flash(_("Can not connect to parent panel!"),'error')
68
+ return render_template('config.html', form=form)
69
+ StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
70
+
71
+ # print(cat,vs)
72
+
73
+ db.session.commit()
74
+ flask_babel.refresh()
75
+ flask_babelex.refresh()
76
+
77
+
78
+ from hiddifypanel.panel.commercial.telegrambot import register_bot
79
+ register_bot()
80
+ if hconfig(ConfigEnum.parent_panel):
81
+ hiddify_api.sync_child_to_parent()
82
+ reset_action=hiddify.check_need_reset(old_configs)
83
+ if reset_action:
84
+ return reset_action
85
+
86
+ if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
87
+ form=get_config_form()
88
+ return render_template('config.html', form=form)
89
+ flash(_('config.validation-error'), 'danger')
90
+ return render_template('config.html', form=form)
91
+
92
+
93
+
94
+
95
+
96
+ # form=HelloForm()
97
+ # # return render('config.html',form=form)
98
+ # return render_template('config.html',form=HelloForm())
99
+ form=get_config_form()
100
+ return render_template('config.html',form=form)
101
+
102
+ def get_babel_string(self):
103
+ res=""
104
+ strconfigs=StrConfig.query.all()
105
+ boolconfigs=BoolConfig.query.all()
106
+ bool_types={c.key:'bool' for c in boolconfigs}
107
+
108
+ configs=[*boolconfigs,*strconfigs]
109
+ for cat in ConfigCategory:
110
+ if cat=='hidden':continue
111
+
112
+ cat_configs=[c for c in configs if c.key.category()==cat]
113
+
114
+ for c in cat_configs:
115
+ res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
116
+
117
+
118
+ res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
119
+ for c in ConfigEnum:
120
+ res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
121
+ return res
122
+
123
+
124
+ def get_config_form():
125
+
126
+
127
+ strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
128
+ boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
129
+ bool_types={c.key:'bool' for c in boolconfigs}
130
+
131
+ configs=[*boolconfigs,*strconfigs]
132
+ # categories=sorted([ c for c in {c.key.category():1 for c in configs}])
133
+ # dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
134
+ class DynamicForm(FlaskForm):
135
+ pass
136
+ is_parent=hconfig(ConfigEnum.is_parent)
137
+ for cat in ConfigCategory:
138
+ if cat=='hidden':continue
139
+
140
+ cat_configs=[c for c in configs if c.key.category()==cat and (not is_parent or c.key.show_in_parent()) ]
141
+
142
+ if len(cat_configs)==0:continue
143
+
144
+ class CategoryForm(FlaskForm):
145
+ description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
146
+ for c in cat_configs:
147
+ if c.key in bool_types:
148
+ field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
149
+ elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
150
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
151
+ elif c.key==ConfigEnum.country :
152
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other",_("Others"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
153
+ elif c.key==ConfigEnum.package_mode:
154
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
155
+ elif c.key==ConfigEnum.utls:
156
+ field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
157
+ elif c.key==ConfigEnum.telegram_lib:
158
+ # if hconfig(ConfigEnum.telegram_lib)=='python':
159
+ # continue6
160
+ libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
161
+ field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
162
+ elif c.key==ConfigEnum.branding_freetext:
163
+ validators=[wtf.validators.Length(max=2048)]
164
+ render_kw={'class':"ltr",'maxlength':2048}
165
+ field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
166
+ else:
167
+ render_kw={'class':"ltr"}
168
+ validators=[]
169
+ if c.key==ConfigEnum.domain_fronting_domain:
170
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
171
+ validators.append(hiddify.validate_domain_exist)
172
+ elif '_domain' in c.key:
173
+ validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
174
+ validators.append(hiddify.validate_domain_exist)
175
+
176
+ if c.key!=ConfigEnum.decoy_domain:
177
+ validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
178
+ validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
179
+ render_kw['required']=""
180
+
181
+ if c.key ==ConfigEnum.parent_panel:
182
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
183
+ if c.key == ConfigEnum.telegram_bot_token:
184
+ validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
185
+ if c.key==ConfigEnum.branding_site :
186
+ validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
187
+ # render_kw['required']=""
188
+
189
+ if 'secret' in c.key:
190
+ validators.append(wtf.validators.Regexp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",re.IGNORECASE,_('config.invalid uuid')))
191
+ render_kw['required']=""
192
+
193
+ if c.key==ConfigEnum.proxy_path:
194
+ validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
195
+ render_kw['required']=""
196
+
197
+ if 'port' in c.key:
198
+ if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
199
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
200
+ render_kw['required']=""
201
+ else:
202
+ validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
203
+
204
+
205
+ # validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
206
+
207
+ for val in validators:
208
+ if hasattr(val,"regex"):
209
+ render_kw['pattern']=val.regex.pattern
210
+ render_kw['title']=val.message
211
+ field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
212
+ setattr(CategoryForm,c.key , field)
213
+
214
+ multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i>&nbsp'+_(f'config.{cat}.label')))
215
+
216
+ setattr(DynamicForm, cat, multifield)
217
+
218
+ setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
219
+
220
+
221
+ return DynamicForm()
222
+
223
+
224
+
4
225
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
226
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,52 @@
1
- # 2023-04-08T15:11:22.204078
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x97\x00\x00\x00\x12\t\x04\x00\xa1\xbc\xbfp\xb7\n@-\x96\xa8\xfaw\xb82\xfd\xc0\x00\x00\x00\x00\x00\x00\x00\x00\xe2>.\xb32\xfb\xd2K\'vo\xd9\x1cL\xbe\xe7\x7f\xf7\xb9MiOh\xcb8\xf1n2\xb5Ft\x82\xd2\xae\xea\x0b\x03?FI\x05\xac\xc8\x1b\x86\xf1\xf0,\x84a\xca!\xbd\xd8\xad\x1f\xf9\x0e\x9d\xaa\x80\xa7\xe9I\xa5\x1a\xbd\xd0\xd0\xaf\xe4\xe6\x94\xe0)U\x00\xa6\xc6\xdf\xbcMs\x1a\xc7\'\x91\x0b\x97\xf2\x9fG\xee,\x02[\xe1\x18=U~\xad\xad\xfdL\xd4\xbca\xe1\xdcs\rS\xbe\xe0HE!L\xe3\xfe/\xc1\xfbd5\x90T\x18\xaa\xd9^=\x84\x8d\x91\x11\xc9.*\x83\xbe\xd3\x08"#\x85\x06\x1dr<')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ # #!/usr/bin/env python3
2
+ # from hiddifypanel.panel.database import db
3
+ # import uuid
4
+ # from flask_babelex import gettext as _
5
+ # from flask_bootstrap import SwitchField
6
+ # # from flask_babelex import gettext as _
7
+ # import wtforms as wtf
8
+ # from flask_wtf import FlaskForm
9
+ # import pathlib
10
+ # from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy,User,Domain,DomainType
11
+
12
+ # from datetime import datetime,timedelta,date
13
+ # import os,sys
14
+ # import json
15
+ # import urllib.request
16
+ # import subprocess
17
+ # import re
18
+ # from hiddifypanel.panel import hiddify
19
+ # from flask import current_app,render_template,request,Response,Markup,url_for
20
+ # from hiddifypanel.panel.hiddify import flash
21
+ # from flask_wtf.file import FileField, FileRequired
22
+ # import json
23
+
24
+ # from flask_classful import FlaskView
25
+ # from flask import Flask, render_template
26
+ # from flask_socketio import SocketIO, send, emit
27
+ # from flask_socketio import Namespace, disconnect
28
+ # from flask import current_app as app
29
+
30
+ # class Terminal(Namespace):
31
+
32
+ # def on_connect(self):
33
+ # pass
34
+
35
+ # def on_disconnect(self):
36
+ # disconnect()
37
+ # app.logger.info("socket disconnected")
38
+ # db.session.remove() # this is important
39
+
40
+ # def on_get_foo_details(self, **kwargs):
41
+ # try:
42
+ # # Do something useful like print statement
43
+ # print("Hello! Awesome world")
44
+ # # Then send a event back to the world
45
+ # emit("event_name", dict(random_key="random_value"), namespace=self.namespace)
46
+ # # or
47
+ # emit("event_name", dict(random_key="random_value"))
48
+ # except Exception as e:
49
+ # print("Catch the exception")
50
+ # # Db session remove is important
51
+ # db.session.remove()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
52
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product