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,418 @@
1
- # 2023-04-08T15:11:21.956244
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^3\x00\x00\x12\t\x04\x00m|\xfau\xf9\xed|+\xfb[\x81:{\x15#\xf9\x00\x00\x00\x00\x00\x00\x00\x00\xad~Q\x8a!\xd3\x11P\xcao\x86\x11\x9aM\xa78\xce\xcf\x0b2\xc3\xa6\xdd\xe4\x0e\xd5\xe2\x8c#\xbcLX\xe2\x0e\xbbK\x1f\n_\xd7W\xb18\xc6^\xaf\xb3\x18\x14\x16#\xe6\xc7\xaf4\x1a\x13\x94\xe2\xaeAhn\x8e\x1c\xb0\xdaX\xcbaw\xbb>1J\xf1\xb4\x9dwk\xd4\xcd\x95\xb4\xd1\xbd\t\xc7D\xb2HK_\xc9\xcbP\xd7s\xbe\xdb\xd0\xc1~@f.\xf0\xd7\xc9\xb7J\xc9^\xa7B\xefs(\xfc\x94\x93\xca\xfcq\x1a{\xb0\x1e\x1e\xde\xd8\x16%\xc3\xaa\r\x8a\xfe\x90}\xec\xfe_F\xf7\xd8\x8c=\x848\x99\xb3\x01\xcc0sv(N\x82i\xdf\xf6id\xfcC\xf7\xf9q\x9a\xbf\x98\xa8\x12:\xcc\x8d\xa0\xbfO\xaf{#\xb63\xf6\xd8\x90O\xc0\xbf\xff\xd3\x10\xb8\x0cF]\xb6.\xabH\x0eN\xa6\xaa\x08"\xd0\xdd:\x08oo\x0f\xa3\xe2\xd1{ \x1f"\xe1|d\xcd\x83:c8\x10\x10?u\xbbNe\xec.$\x835\xbd\xee!V\xd6i\xde$\xfcP_X*}\x85\xcf\xc5E\x9a\xdb\x84\xd0g\xb2\xf7\xdf\x07\x1f\x90+\x0b\xc8Tl\xadc\xc2\x8f\xbeg\x93C\'\xc3\xad@\xd6\x841dso\x86\x89\x80\xff\x1d\x9b\xb2^\xcf\x81dT$I\xa08a\x8aOs\xb7\xf7W\xd4;;p>\x80\xfbi\xb6|hO\xf8\xad\x03\x9dl\xf0nR\xe1\xea\x81\x05\x06\xdd\xb8Ym\xc5\x05\xd4\xc4\x9b\x88\x1b\xb3\xe8,\xed\x91\xe3x0\xa0q\xcf\xe5Y\xd4\x03\xd9Zpu\x10coX\x15\xc5\xb1\xa4\x95\xc6?\xcb\xe7\xea\x1b\x87\xe0v\\<\xe3\xe3B\xe6\x18Q7|Yo\xce\xf2\x8d\xca)\x0e\xe1\xc4H+2\x957>9_\x84\xe2\xb4\xf0\xa5T\n\xd49Y#\x00\x19\xad\x12\xee\x93\xfc\xc3\x06\xfc\xb2f\x8bJ\x86\xe8\xd8Q|\xa5\xb35\xfd\xd7\x18wx\x11\xa3\x9ct\x0e\x14U\x1e\x9d\xf8h2\xf3Yl\xbb5t2W.\xdb\xb8\xadO\x81[\x7fB\x07\xc6\xd3\x94\x998\x80\xb0k\xa5\x87x\xb6r?/\xbakj,<C<i\xdb\xa7Xs\xdczG\xfa\xbcx\x11\xcd\xa6n|\xf0T\xd8>\xe6\x0b\x04\xb2]\xce)J@\x04v \xa3)I2B\x0ei;\x13\xddE,\xf0\x93ZU\xfc\xdfv\xb3\xfb_\x03\xd8B\x07!qp\xdc\x81{kB\x98!\xe08\xc8x\x94=r\xa6\xb8U\xc0\x9c9\xc6\xde\x98\xcd\xf9\xa8K((\x88\x1c \xd0_\xce\t\x9a\x15\xca`\x1b\xa8\xb9\x81y\xa9\xfc\xcd>\xb5\xf9?3u\x877\xa3\xe0\xe7\xedAV\x0f3g\xf88\xb5\xfe\xb0x =I\xcd\xb6\x9f\xc9\xae\x8a\x19\x0b\xb3i.\xa0Yc\xdfLn\x9e\x03\x8a\xf1\xe7z\xca\x98b\xa3\xff\xef6B\x02\xa2v\x0fn>\x0f\xf38\x0b\xa8\'X\xd1/$\x9a\x81\x1d\xa7\xfdf\x9b\xec%7\xf1\x08\xde!t\x9b\xf0\xfc\xe5UH\x96"\xb2\xb7 \x8b\x99\x8c\x0c\x13\xb7G\x13\xd8\x0b\x7f\xea=%HgH\xa3\x05!\xf6\xa6\x18\xc8#a\x82\xad\xc2E\xbf\xe7H\n:\x15\xae\xbb\xa5V\xfd\xf9\x05\xb9;g5\xa905\xa5\x1c\x04\x08\xe7s*\xed\x064\x16\xff\xf1"\x94B\x87\x19\x8d\x12\xd3\x1d?\x96\x88\xea\x11\xef\x03\x03\xc9\x91\x81\x1a\x85\x98\x95\xc6\xdf\xb1\x06\xd9N\x15F*+1s\xcc\x12\xe4\xd9\xdf\x86\x9a\x91\x0f\xbe\x07n^\xa6MYv\x9e\x9aM\x89]\xaa\x81\x8d8\xdf\xb5\xef\xd33\xac\xe1\xfa\x01\x91a\xa3\x06\xfe\xdb\xb1\xce\xf61\n\xe9\x08)\xc5\xcc\xf4\x18!_\xb16d6k`FcXy\x02\x8f\x12\x97\x8ayNM\xde^Er\r)\xb7\xd0X\x88&O\xce~h g\x0c\x9fo\xc5\xce\xadd\xcc\x95\xf4h\x85%a\xaf\'\xe2/\x9cl\xb1\x08\xf9\x0e\xa7?\xec\x89-\'\xee\xcat\x87\xe7(z2pP\xda\x9c,\xe2]\x16\xedq\x17e\xb2L\x17w\xa2\x89\xbdx=k\xdc;aH\xe8\xf9.\xa8\xe9\xf2\x8cP\xfb\xc9q\xc0\xc1>Z\xd9\xce\x1f\x11\xd8\xc5\x8e\x97\x04\xfe \xf2\xad\x7f\x02\xfc9\xfe\x8f\x07#\x1f\xa1\xf7YR\xb1\x90z\x8e\xc7\xb6C\xcd\x13\xa0\x87D\xe1l\xc9\tUF\xf7\xfb\x824\xa4\x08R\xd7\x04\x07\xe4\xbd]\xfa\x88%\x01-ky\xe1\x87\xb8X\x9f\x02\x8a7\xa0\xa8|\xb6\x86\xfe\x1a\xc2\x9a\xb3\xed0\xe0\xee\xb5\xf4\xccA-\x0b\xb8+\xc4\r\xe9\xd0}\xe8\xe9\xe6\x81uP\x07\x85\x1d$P\xdcj\xae\x7f\x9c\x80\xa7\xf5sC\xf0\xb7\xcfxw\x9b\xc2\\\xf8gf\xe2e\xd8\x17\xc2S\xb4J\xda\xfc\x11\x05q\x1e\x90|!\xeb\x1bpt\xc7\xeb\xd2\x86\xa4O*c\x16\xabkX+\x86\x9f&wMJ\x8d\xd3\xc3\x00\xe6\xb0\x11X/\x01\x8e\xe1\xcbQ\x95\xf9\xf7\xe3\xf6@h\xc5\x04\xe3\xd1\x9c\x9c=\r\xf1\xb4<\x17\x0b\t\x8c\x1f\xfdL \xd3\x98\x8f9#\xe72\xa7qd\xb8\xd6\xf1\x98X\xcf\xbc\xc9\x10c\xf0\xe5:I\x8e1\x91\xae\xab\x93\x19\xa1A\xcbJ\xabf\xe5\x88\x96;\xc8\xb8l(\xf1\x9e\xdb\x0c\xe9\xdd\xa0b\x88\x9d\xe4X;\xa3H\xa4\xbf\xc9IQT\xcc\xdcE\x8e@\x08\xe2\xe9\xec\xdb\xce\xbe\xa1\x1a\xc4\xdc\x19\n\xcaM\xcfK\xd8\xda\xe0m\xf6,\xf8\xd1\xa2}\xffy\x03K\x00\xb6+\xfc\x18b\x1e\xbeL\xcb\x84t\xb6pJB\x06\x9du\xfe8\xeb\xc7Z\xf9\x1d\x0c\xd3\x9e\xbd\x0b\x14*\xdf\xbe\x9a8J\x8f\x9e?\xa7\x1bw\x93\x10[\x05\xc6\xcbmx\nl\x11\x02\x9c\xf1\x97\xa0l\xb4SO\xf8X\xb4\x15\x10b\x05B\xd0\n&KV8\x97\x81\xd4\xb2\x7f\x023\xed\xe7\xdbmOG4v\xf1Vn\x0eU|\x92\xcc\xa5s\xf6\x07KJ\x84\x04_*$\x80\x03\x15R\x02\x00%\xbe%\x81\x1a\x1c5\xb5\xf6\x80\xb3\x94\'Yg\xe3PUq\xaa.=Ym\xc8\xb7\xfb\x0b\'\xd4\xbb\xfa~\xb3Q\xcfD\xa3\x01\xcd\xb6"\x18\xcf\xf0\xc8A\xe2HKv\x0eH%\xf0\xbb3\x84\xc2\xe5\xee<\x964\xc4L\xe8\xd7\x1b\x83\x05\x85\x06\x00\x10\xcc\xef\xb5\xd7E\x83\x00\xaf\xc4\xceL\x03\x10\x02I\xac\t\xbdY\xba\xdenh\x03\xb6" \x1d\x93\xc1\x8a\xff\xedj\xaf\xd6\x1e\xeckOK\xb4yHm\x8ek\x97\x00\xf6J\x87.\xbc}^\xe9\xe7\xda,<uh\xec\x14\x8cv=\xd2\xb1nw\xb0\x1e)e\xaf_\x9f\xa6&\xdd\xbf{\xb0\x7fK\x19\x04\xefG\xf3\x953\xfe\x93\x98\xbfu\xa2\x87\xf6\xf5\xd0\xbe\x9a\x12Js\x944\xd8\xf6A3\xbfH>&\xf0\x16\xbcz\x17\xc0\x93.\x19\xf0\x89\x1fz\xbb\xa3\xaf0\xdcS\x1d\xe0\x05\x16\xaa\x84b<\xf7\xd9l\xf1 \x15\x08\x84\x86\x05\xc9\xb8\x12\x02}@(]\xef(\\\xd0\xa1\xbenP@\xf6\x10[\xec\xa9\xae\xb6"\x1d\x93t\xa5\x17z\x81)me\x7f\x9c\x9a\xb5\xfb\x99r\x10\x9a\xc6>\xe6k\xdd+JD\xc7\x99\xb5\xa2\xd1\xb7\xab\xceh\xda\x9e\xadA\x01\x07\xf3\xe2\xdbD\xf9&M\xc8\xe7M\xd4P\xb6[N\xd4\xf3\n\xa7YW\xef\xfb3\x84\x16\x10\x15S\xec\x07\xeb\xd3\xd1\xd9\x8c\xc5A\x92\xcf\x00\xadN\xbev\xf4h\xe9\xaeq\xb51\xe5/\xeba\xc9\x08P\x95y\xf1\xb8(;rm\x8c\xddu\x86\xdf\x1b\x95\xea\x88\xb9k\x9c\xd3\xa7!\x07\x86\x95\x0fe\xbf\xac\xfc\x1d+&\xc7\xe7\xc8\t\xc3c\xe0h`\xb5\x9a\x94\x840\x86\xf8\x82\xc0\x18\xecK\xa3(CQ\x89H\xf5\xa5f\xf8>X\xecJ\x13D\xf8-O[EH\xd3:7\x11\xbag]\xd6\x07Hh\x1d\xa79\xe7V\xa7\xac\x1d\xb0p\x9e\xabr\x07\xcaU\x04\xb1\xa1\xf7*\xd3\xcd\x9c\xbc\xb2\x0b\x82ijaZ\x02\xca\xd1\x8a[\xe3\ry\xdbRz&\xbf\xe1G\xca\xd0\xd6\xc8\x92q\xe4\xb2i\xd85\xeesM)r\x11\xaf\x9cRE\r#(\x8e\nM\x98*\xb9\xdb;\x9bA\x9d\x91y\xf1\xe7\xc8\xf4_,\xae\xf8\xc26\xf99\x84\x96\xe2\x1c\xb2~\xd9\r6\xde\x85\x94\xc96\x12g\x16sBw=\x97\xce\xf6n\xacI\x8b\xf6\x01\xc6\x10g\xa4\x0c\xb1\xcc\x95\xfd\xd8\xfe0\xa7\x04\xb1x`\xe7f\xf6\xed\x93y&\x00\xdbL\xa55\xc1\xce\xe6e:e\xfbI\x8c\x14e\xbe\xb8s\xd0p\xc8X\x0eP\'\x93@\x8f\x86\xf7N\xee\xabm\xcd\xb6M\xd2\xcd\xd4\xa9\xc6W \xffb\xc6\xb5\xd73\xf8Vn\x003_\x83@{*\x10\x1e\x7f\xdc\x82l\xa6\xadpp\xb8\xd5;\xd3[L:\xc9U.4y.\xca\xf9L\x0bC\xfdrv\xa3+\x0f\xaf\xa6\x03\x10L\xc1z\x93|\xcb\x02qC-7\x03PB\xbfO\x06\xa3\x04\x93\x91\xbc\x05i\x17\xca+Y\xd6\xa1\xcbnP\x13\xba\xd0\xa28\xef3Ih\xaa\x87\xf4\xc9\xaa\xb1c\x8e\xa3A\xe1\xc5\xce\xf8\x17\x936\x8ew-\xbfL\xcc\x02@s\x16\x9bE\x8e{\xb3R\x02\x9a\xa5k\x91\xbc\xd7(7V\xbaw;g\x10\x9dO+\xba^\xdf\x92p\xa6\xf9\xa4a\xbe\xb0\xf5P\xa5\x8a\x88\x12\xc3\x8ffZ\xd1\x88\xad\x977\x1cL\x0fF\x19\x8f\x99\x12\xd975\xa25\x9c\x88\xf7D\xa6\xfbwR*:T#\x14\xc61\x80\xdd\x8b\xf6Y\'\xa7\xe3P\x8e\xaf\xc5\x0e\xf01|\x99\xdb7i\xb5z8\xfa\xc3\xe1\xe6/\xca\x13j\xe2\x86sn\x0f\xb4\t\xdd\xf0x\x0c\x19\xd8\x07X\xa2\xc1\x1a\x92\x96Z\xe7lf\n9\xcb\xd6\xd8ML\xd5fuV\x06\x01\\mi\xa9\xc4\xfdT\xd7\x7f\xd0;/=Ok\\\xd55i{\x9fPs\x0b8\x00\x8b\xc4\xedO\x83\x90\xea\x83\xda)\x8dK\xb3\x86\xe0\n\xe8\xdf\xa7G\x17\xc1\xeb\xa6s\x17\xea\x17?\xd2O\xde\x07g\x93\xa4\xa7!\x1a\xb8CFR\to\x0eK\xc5x\xb9X\xcf\xb4@_\xef\xcd\xf9\xb0\x06_\x00\'\xafW\x19\xdf\x070\x88\xe8vz\xa1GM\xfb\xec\xa1\x82F\r\x85\xb8J\x1bxht0J\x9b\xb0\xce\xc4\x07\x80\xe2u\x05\xed_\xb6d\xc8\xf5$l{\x07\xce\xca\xed\xb2\xa9\xd8\xc1?MH\x9a\xcet`\xf7Lh\xe4\x8dp\xcf\xd6\x8d\xb1\xfb\x9b\xeb\xcf<\x85\xd4\xf8\xff\xc2\x93\x8f\x1a^I\xa1\x1a\xbb\xbfj\xbd\xe9\xbf\x1d\x93\x8a\xa0RkY\x0f\xfd\xdf\x19\xee\x8f\x8f\xd4V\xd6X\xf8\xbcd\xcb\xa69\xa1\xdd\x94B\xff\x92\x16\xa3\x01\xdbD\xd5\xdd;\xd3\x96\x8cqD\x14Az\xea8s\xfc\xee\xce\xba\xcc\x19f1.\x01P$\xb7\xc1<\x0bwU}\x0f\x9a{5*\x15\x03n\xe9\xaa\x88%\xa0\x94\x8c\x8b\\#\xf1\xf1\xe9l\x93\xbaHy\xc7\xd0\x10L\x8a\x1e\x0ch,\xfezCE-\x83\x8a\x1e\x03\xc1\x8fl\x80\xaa3H\xeb\xa78 \x04\xc1p\x12\xb8\xc1:\xe1#\x83\xb0C\xf24\x89\xba\xc7\xc7(j4\x86\xb3\x1b\xdb\x14\x04\xfe\x1e\xdd2MB\xb7@+\xe1}\xde\x86\x94(\xeb\xca\xfc\xa3\x02\x0bM=v\xb5\xa2 \xc3\x85hO\xf2\x11NL\'\xd1\xb9\xcf\xde\xf8\xfe\x8d\xd1\xab&\xcc\xa7\x89\xdc\x9a1 \x84\xb9\x819DY\x17t\xee\xaa\xc1\xd1\xcbH\x15\xb7\xf5}\xea\x0b\xc3\xb0\xd4\x1f\x8cE\xe7\xf0[\xab\xbe|\x88>+\xed@z\xd3Y\x15\x82\xe3\xd1f\xd2\x80=w\xc7t\xe3\xdc!\x93\xea\xd6\xbf\xbf\xeb=\xd5\xbb\xa8\xe1\x07\x82s\xdb\x05\x13\x9d\x81\xbe\x90\xcd\x82\x02\xe73\xe2;\x06\xd3\x90\xa6\xa2*\xa2\x8f\xd8h\xa6\x89\xd3\xf2Y\xfd\xa6b/[\xeb\x81\x17*\xd1\xab\xd3\xc2\xf2\xd3\xd6$$\xc4\x9d\x89\xb4D\xc2\xae\xd7g\xf0o\xb9\xcf\xd4\x82,+\x08]\xb3\xac\x9b\xdad\xb6\x93hu\xf5\xc8\xdb\x84\xa2\x8c-\xdc\x84\xbf\xb4x-\xd8+\x04\xd9~\xbbj\x99\x96\x84\x14\xdeJu\xebFT\xa7s\'aq\x1d\x9f \x94\x1e\xb3\xd1\xac4B\xea _\x81\x999,\xa2j\xaf\xf0\xc3Nu!rkH\x98i\r@\xb0\x10\x96\xb8]\x10}#\x9d\xdaix\x0bNr\xcb\xa5sr\x16\xe4\xc9^\xd6\xc7\xd8P\xc1t\x8d\xc6}i\xc5]{x\x831M\x9b\xf6\xd0\x0b\xe4|\\\xa4\xfc\x89[\x1az3\xf26\x9e\xe1?\xbdL\x8eIO\xf8|\x04\xc6l\xb0\x1cD\x05\xe1:A_\xcbf\xf2"@\xd5N\xf5DJ\x1e\xbb2L\x95\xd8\x95\xf5\x99\xd6\x90\xa3pw1ez\xa0@\xf6\x9d\x00\xd9\xb5\x8c\x81~\xe9/\x8d\xe1\x93\xc1\xa1\x85\xaeNMn\x01\xc0\x1d\x00\x87\xe7=\xed\xca\xd0\x01\xd1\x15\xb0^\x883\x89\xe0.\xef\x0e\xf0\xccZg\x7fJvR\xcc\x96\xad"\xbf\xa44\x7f@\x19k\x1dr\x13\x90\xf39\x98(ek\x91\x00\xe7X\xe9\xd5\xbc\xb7hjn#1\x1bY\xb6\xb0E\x17(s#}m\xbbf)a\xb4S\xcf\xc3\x06\xcax\x87\xd5P-\xa3^t\x7f\xa19~3\t\x1d(W\xc9\xcc\x9f\xd5\xe1\xc4OK\x01P\xc7\xd4\xf9>}\xbb\xe0\x90\xdc\x15\xf6\x12\x8b\xc6\xf6\x94y\xfc\xb2\xeaPe\xd0J\xb10\x06V.\xbd\xde\xa4\xcd?\x08\x12z\x17q\xe8\xa5=\xe7\x8a\xf6\x95<\x88\x90\xf5\x1e\xcbK\r\xe3T\xd6\x13\xc9\x0c0-\x1b\xe8,5N\xe3H\xe0\xf1\xe0\xabd\x1bl\xe0\xa3\x1fC\xac\xe8/T5"\xda\xfe\x01\xab\x1b\x88}\xae\x95\xac\xce\xe2\xc5m\x13\x11<\x81\xe7_W|>\xcb\xa5\xd3\x1d\x1b\xfe\xb2\x83\x9e8\x81\xf1\x91\xcfQe %\xe8\xea\x14\xc0\xf0W(n\xd9\x8dFu\x8f\x96\x82)8\xf8\xcc\x9e\xfc\x9d\xadlx\x0f~Y\xba\x90\x0e\x03\xf1\xe6=a\xe29\xdf/[x\xc1)\xffX\xad\xf8\x19\x11\xbbP\xda\xc9\x19Z\x96M\xb2\x98%\r\x14J\xd5\xae\x08\xd1\xe4Yd\xb7<\x19\x07V\x01n\xd7\xb18\x8f\xf3p\xddW\xdc\xfb7\xbc\x1d\xfb\x05 \x9f\xed\xa0\x1f<c\xaeI\x06=U\xa7\x14%\x1a\x17\x83.\x91\xb0hc\x85\x1a\x05\xf5fA\x15\x95\xc3\xbe\xd744\x99\xb7\xad\xdf\x9c\xbcN\x076\xf5\xfc\xc7JS\x96\xcbL\\\x88\x13\xf3\x97\xb0\xa6\xd0\x96\xba\x88\xab\xd0}c\x82\x14q\xe82\x9b8\xcd\xee\xdc\xc5\xb7v\xe5\xae\x07\xd3\x8d\x0e\xac\xf4\xd6a\xed`\x0f\xdbsQlW\xf3\xa7~\xbc\xb7\x97\xa2\xb1\xe8\x9b\xc2x\xd9\x03A\xf59\xbfU\xa1\xea\xe8\x0e\xdd\xd7\xd8R\xad\x12\xfd\x06\xf5\x8c\x8e\xeb\xa7\xaa\xc5\xe39\x91\xa1\x02p\x0b\xc2N\xd6\xd0x\xdc$d\xa9P\x1f\x0c`\xfe\xe6\x8fz\xb6\x02?A6\x98\xbe\x83\xd6\x15&\xcb\xe6R0\xd5\x07\x83\xff2\x8e\x80\x07Q\xed\xa1\xa5;R(cP$f4Y;\xdb\xce\xe1)\xab\x80\xfd\xb1\xfe\xbc\xba\x95\xc9{O\x00wK$f\x0e\xe2Q\x02\x8eW\xce\xbf\xa0\x10\xdb\xe2G\xa5\xd3\xb5j\xaa\x0c\x19G\xe2`)\x04\x0fmv\x00RK8\x8ak4\x03\xb7\x1a0\x9b\xf1K\x94m\xf8g\xab\x9b\rh\xde\xf0\x8a\xe9\xc0\xbc\x04F\x0c}\xc1\'\xc0]\xf9D\xf1\xfa&?\tL\x9d\x94\x11\xa8H\xab\xb0R\x1bx\x1b:\xb8\x8a\xdf\xc1\x96\x13l<C\xe5\xf5Fl+P\xd9\x17\xf7$r\xd6\xc4\xf1\\K\xd8\xfa\xaa\x82q\x8dLj\n~\xceN+b\x8c\x00Sy\xfb\x04\x13H\xe2\xe7(\x01\x04o\xd8\x17x.BE\x88\xf2\x89p)Y3\xc7\xcb\xe2G\xb9 \xd2;aQ\xc05\xfe)\xef\xd4\x9e\xae\xf4dw\x04\x0c0\xe2\x0e\x16X\x88m\xf0\x811\xb0~\xcf4\xf1e\xd2\x0f\xa9\xc7\xb8d1c\xff\xe1\xb7\xb4.J\x15\xde\xfb\x8e"*\xd5;\x9f\xe6\x11y\xa0\x98#\xc3\xce\xaf,\xd4/\xd8\xa0)1\xf4l\x1f\xac?\x11\x1d\xa2\xbd}\x003\x7f\x8a\x06wR[\x15\x97\xcd\xd4\'\x12cj\xf0;=)\x7f3a\xe4\xc1g\xc8W\x8c\x1b8\xc8\t\x96Pw\xc2\x9f\x98TvUs\xd4\xb9D\xf0 \x99\x86\xd2MO\xbfD\x13\x83\xfb\x01/XxY\x14\xcd/\x10\xe9\x13B\x8a\x0fX\x97\xe7\xd2\xd1#\x93!\x83\x849\xa9\xe6>\xdd\x0c\xa2:?\xcd\xad\x037R\xc7\xe1vk\x1e0B,\x84Og|\x1b\xb96n\xc7\xf6\x102^\xe6\xd2\x9b\x08\x08:\x15\x1b\x14_\xe29\xea!\xad\x03\x9bs\xbf\x87 \xc5w2\xf7\x02\xa78OQ\xa4\x87L\xd2\xc2\x88\xda^\x91R\x17\xe48\x8d\xf8\x1cg6\xf4{\x8e\xe6\x1dT\xc7r\x81D\xfa\xb1Y!b!f\xd6\xdd\xab\xbb/\xfc\x12\x97X\xa9 \xba1|\xcax^\x06@\r\xfe\x16\xf6\xc2\xa4\xae\x83J\xad&\xefO\x1d\x8b>U\x14\xc4\xe1\xd5t\x19b\xb3\xef\'7\xd0\xa7\xaa\xf2\x8a\xf7\xd2\x85\xfdb%X\xb0yz|\x07\xde\xbd\xd3\x9cCu\xc5\x18)Xm\xfe\x8e\x11\xc02{\xc1\x0cmuT!\x98s \xf0E4\x9dr\xd3\x9d\xe20Gpj\xea\xf7\xad\x95\xa7Ul\x02^\xef\xcc\tH\xe3\x89I)~z\xacl\x81a\xd4\xf5]\x88\xa9\xab\xdejM\xc1\x97\xa2\xe5\x8c\xe9{\x97lE\xd5\x80h\x81]\xed7`\xe6\x19\t<\x18Q^\xbb\x0b\xbf9\xe8\x0c\xe3m\xa5\x9d\xd8>\xef77o\xa0\xf4rv\xc3f\xd2\xaa\xf8\xc6Q\xb7i\xacZ\\\xacO\xe2NN\xe9/\xeb\x02\xe6V\xa2p\xdd\xe9\xda\xce\xb0\x97\x07\xb1\x19\x91=y\xa8K\x9d\xf8y\xf0\xc6\xf1H\xefg\x8f\x89\x1e}21-\xc3\xae\xb4\xb2\xb8\x81\x08$\xa5\x88\x96\xb0u\x91\xab\xce\x14\xa3\x11\x0e\xb7\xc1_\x12\x14)\xe7\xfd!\xfatK@\xaf\x02\x8e\x1d\xb6\x1e\x8e(\xcd\xc7\xcc\xe7Y\xca\xa6\xf8\xd8ZPv\x8f\x04\xfd\x14\xaf)\xf7\xe1\x85\x1b\x07sp8\x99E \x16J\x93\x81\x17\x8b\x98y\x9fx\xef\xa3d\xc2y\x90\xd1\x05\xf2\x1e{\xcdZ\xe3\x16\x1a.z\x80\xc6SiU\xd4&\xc2\xa9\xf9\xe3kq\xf9:\x1aW\xf8\x01\x96G\x8d\xb9\xf1\x13\x8e\xc6\xfe\xdfe;\x1b\x9dSXO>\xce\xaf\xbf\xcb=\xd7\x07\xa0zd\x88\x014\xe9\xda/\x98\x15\xe8\xab\xa9\x9e\xa5\r\xbfV\x95\x03\x1b\xf5T\xc1)\x0c=1>wka\x1aA\xa0\xb6\x07\xcb\x98\xe0p\t9M\xcc5t\x1d<r\x11LS\xe4G\xdb\x17\xb8\x93~M4,=d\x91\xd9\x11\xf0\xab1\x16\x8c@G\xcd\xb6\x8b\x809\xab\xfc\xd1\x04x\xad\x8e`\x94\xb6\xc7\x91.\x9e\xfc\x8b\xbe\xbc]\x1b\x1b\xea\x1d\x12\xf6\xc6\xfb\xeb\xbd\xc4\\\xf9\xdf\x9dc,b\xd7\xc5\x86\x8f\xfb\x1c\xee\xa6\x10\x17{\x91=\xd6c\x85\x12\x13\x12\x8eW\xa0`\xb7\x0f\x1f\xe0f\x1a\xc5$M\xec\xe2 \x83\xa9c\xcf\xdcYl\xef\xf7?i\xec\xa0\xd8o\xa8\xdfo\x96.\xa6\x0f\xa6y\xaduu\xb5\x1bu"Fw\x04\x06\x90\x84J\xf9\x1b\x0bYv\xac\x04\x81.\xeb\xa0\xeb\x8a\xd2\xcd\xe0Y5U\xf3Y\xb2\x85-E\xf3-\xb9\x8c\xc8\xa9\xdfO\xb3\xa5\xfd\xcblJ\x197\x88\x80\x96\x8b\xe8\xe6\tv\xe2Rx\x97\xb3\x8f_`u\xe0\xf2\x8a\xbcf|B\x12az\xab%\xa5\x1c\x84"H3_\xbe\xe0\xba\xebZ\x9f\x06}\xb8\xe3?\x8eo\xbb\xad\xc4\x8b\xfc\xe7\x0c\xd2K\x91\xfd\xe4<.\xa6;\xb6\xf6\xf5\xbc\x08\xea\x96sY\xab\x01c}R\xbd\x7f\x0b\xe3\x96\xac\x91\x16\x82\xdb\xf5\x8cp\xbd\x11\xbb\xd1Jv0\xdf\xdc\xdf~\xa7\xe1\x996\xdbhd\xd8\xee\xe2\xa8\xaa\x95R\xe1\x06^\xd1\xc9\x14\x06{\x821\xf3w\x95\xe6\x93l\xd6\x1e\x98\xacd+\xf5\xac\xa4\xe6S\xe3/\xd0\x8c\xc3\xf6\xedE\xc9\xcf\x12\x91\xd6\xd1\x9dT\x90\xea\xa7\x90\x00\x041\x86]\x14\\-D\x8e5\xb3R\xfcG\xa9\x89L8\xb0c\xbc\xbek\x1a\xf0s\xe6\x8a$\x92\x860V\x14\xa7\x90\xa1I\xd2;\xe3/\xfegx\xa1%\xd0\xd3\xb7\x9a\x0ebu:=\xb8!\xe9\xc1s\xc1/O\xd5\x0eI\xcc\'\x0bx\xb5G\x84\xde\xd6&YP\x00\xd3\xd9~\x8b\xb8\xf4Y\xcb\xb4\xf2x\xfa\xe6Vz;\\\x04=\xa2\x8b\xc9H9:p\x93\x03\x9b\xc4\xd1\x8f1\xa4\xd9%\xdc\xf9\xd3\x8c\xa4i\xc7[\xfa\xebI:\xfde97\x9f\xc5?\x8a\x0f5\xc7\x94y\xff\n4\\\x08\x9a\x06T\xad\xd8\xa0j\xac)n\xc5\x0eE\xb21!&\xc4\xaf\x9a4\xb7\xbc\x9f\x12Q\xd3\xa2\xe6f\xc1\xee\x0b\xbf(\xa5\xa8"m&\xbe!\x8ae\xeb\'^I\xf8\r\x18\xb5N\x88\x07\xfd\x15\xbb\tX\xdd[\xa7\xcf\xba\xe4OoS\x12\xd1\xe9\xe3\xcf$\xff\xe9\x98\xc32Q\x92\x89\xf8\xab\x9b\xcf\x17\xb8`\xbc\x92\xa9\x93*\xd2\xa4\xa7\xa25\xbaI\xe3\xbb"\x00r\xd1\x1cv%\xe8C\x87;\xf8\xbc\xb66\xd5i\xac\xb3ma\x1dv\x9b!R\xf6d \xffHgF\xcf\xd1V\x13\x97\xb9\x10\xa0Y+3E\xf2\xa7G\x1b\xf9\xe9\n\xfb\n\x00\xd9F9K!t\xcd%\xf8C\xe0\x8c\xc7\xca<\xad\xa0\x1f\xb5\xaf\xbcC*\xf2\xc6f[\xbeR\xb4\x97]\xca0D]\xc8\x02y\xb9\xf2\x86\x99FX\x14\x87u\xdc\x7f\x06\x8c;\xe6\xbe\xab\x95 \xca\x99H\xe9\xeeO\xeb\xf9cc)o-}Y\xe3\x0b\xde\xd7\xfd\x0c\x9e\xdd]\x8b<\xe5v\xcb%[\xd3\x8ce\x16\x1fY\xf2a\xac\x0b\xf47\x0f\xb5\x1b\xcf]\xa9L\xbc\x83$\xcc=X\xa54m\x08\xbc\x1d\x1fh\r\xee :kn\xec\xcfGkL\xe4\xcb\x0b63\xdfe"{@\x11\xd5v\xb8~\x8frv\x86~T\xfc\xeb\xdb\x13aef\xaaW\xb4\xd4\x8cR\x1b\xd9\xb9\x876^\xf1?\x81\x1e8\xefJCI\xbb\x92\xa5D\x86\x83l\xa6\xd6\xb6\x81C\x1f\x18\x06\x8aE"\x1e\xbd\x92\x13\x95`B\x160\xea\x10\x0c-\x95\x03\xa9\x06\xb1\xba\x17\xdf~\xb7\x177\xc8N\x9d2\xc6S \xcdiO6|}\x0c\x93\xd6\xa5\x91QRy\xc0\x14EG\x89#\x0c\xcc{v\x11e\x1d4\x19\xb6\xb7\xe6\n#\x16\x93\xc4\xd6\xd1\xa8\xbe\x19\xcd\xcf`(\xad\xb4\x001\x0c\xea\xb0lP\xf5\xd0\x8c\xd3\x9ei1\xb9\xe1|\x03\xdcs?\xd9@\x95\x15\xcf\x107\xc4^)>\xd1fl\xa0\x05\xcd\xd5\x84M\xa3\x7f\x0b]U\xabZ\xf8\xb6\xad\x91UqZ6+\xc7\x10\xd7\x8a\xa0&\xe6\xd0\xac\x96\xa4.\xdd\xd3\xad\xb3\x90\x0b\xd4h\xe4\x15n3\x80,\xee\xcb\x01Q\xcb\x13B\x19>\x18\x11\xed\xc5\x8e[\x07|\xfb\xba\x97@\xcb=\xe4\xa6\x81\xc5<\x06\xcd\x98G\xb3N\xf85\xfcd\xd3H\xe8u&p~\x8eq/]K\x18U\x8a\xb5\xeaz\xaf~`m&\xb0X\x93;\x06\xd6\xd5\x06"\xc4\x97\xb2\x80\xb8\xc8\xc0\xc6\x01\x11J[\x9a\xdd`\xa0\xcc\xcc\xf45\xaf|!\xa6y\x99\xcb\xc7[|q\r\x02\x92"\x02)Y\x07e\xb0\xcd\x80y\x05{\xf0\x99\x92\xb4\xe3\xf9\xe3c\xcf\xe4}\x97\xf2j\x1c3\xba\x84\x81\x83\x03\xae\xf8b\xce\xc6\xc0\x00\n]s\x05\xf4\x0e[\x8c1%\nJx\x9eH\xf4\x11\xb4G\xd9\xa7\xac\xaay\xa0\x02\xbf\xf9\xed%\xff\xe3LZ\xfe\xa8\xb2J=\x1e`d8\xb2xQ\x95\\\x15BS\x95(\xd6\xcav\xf0\xd9\x1c\x87\xd7\xc89\xe3Y\x83\x15\xd0\x87\r\x1e\x91\x02\x9b\x89\xe2DQ\x85\xbaa4\x80\x1c\xbf\xe0\xb9k\xc6\xa53\x14\xc9\x19\xb1\xd4!~\xee\xd5\xa7\xddF\xcd\x81Z\xeb\x98#\x15j\x152\x19\t\x9f\xfa\x86\xd7X\x98p\x9d\'\xc0\xe2\xe2wG\xc1\x98iu\x18R3dm\xd3-\x96\xd8\xe5\x14\xd4N\xa4\xae\xf0;n\xe5\x91\x9796\xd8N\x04\x07)\x81Z\x8b\xbe\xf1\xff\xc0\x1f\xf1\xd4$)H!\xb6-\x93\xec\xdf\n\xf9\xc5\x03\xfe\x8d\xa6\xb6\x92t[\xbd\xd7\xe7\xba&4!\xc6f6\x81\xd8\x05\x8fcH0l\xcd!\xd0po\x1c\xa2Yr\x9f"\x15\xaa\xb7F\xcf\xe004\xc7\xc1[\x8e0R\xfc\x82\xb1\t\xc5\xe7\xa3\xc1\xa7\x8a\x0e\xeb\xfc\x81E!\xcc\xb4\xb2\x1f\x9b\x05\x8d\xbe\x1c\xdd\xc2-\xe84\x83^H\xb8\x19^\xbb\x02\x8f\xe6\xa5\xdf\x8b\x19[z\x15=q\xc3M\xeb\x96\x12\x8a:a5}\x90Z\xfa\xbc\xdbZ\x13V\x91U[\xd7\xbe\x91\x9a\xb8~\x0f\xa1\xf0HI\x152m\xb03\xb9\xe9N\x011(\xa5\xb8,y\xf9\xfb\x17R\x15\x954\xcaif\xbcH\x9cZ\xf0\xd3\xec\xa2\xca\x80]\xdc)^\x83\x9d\xf9\x9f\x8f+\xb9l+B\xb1w\xb5\xc9\x88\xc3\xb9\xb93\xa5\xf9\xd0\xa2\xd9\xee\xc9\x82\xd5\xd6T\xaf\xef\x8c5\xfbj_\x06\xc5(.i+\xb0k\xfe\xa4\xdb\x7fs\xb4\xfb\x0f\xf8\xb6\x17\x10\xfd-\x02\xd2\x15\xf5Tr\x0e\xe0@\xd6\x9e*\xa7?H\xcf\xd7\x1e\x12\xb5\xa8\x15\x9fp\xaa\x89\xad\x9d\xcd\x9e\x85\xcd\xecvjOWM;\x8eVk\xcf\x1c\xee\xf7\xc5\xcadLm\xf1\x891\x14\x11(\xa2\x1a\x9d\xa0\x9e9Wq\xefS\xd1\xcbnw\x94#\x0fo\x05\xd82\xc4r\x17\xb3\x18\xf4\x88\x01m7O2$\x8dD\xf0\x8b\xa1)qi \xc6\x027o\x03.\x8aG=\xceb\xfdi\xcd\xdc\xa5\x14M\xff\xf5\x8b\xa4\xfdX\xc2\x89n\x85C\xe63{\x11\x0b\x03Ot\x86\xc0@\xe4\x9f\x18\xdcv\xb3!Z\xa8\x1a\x97q:\x05\x11\x17\xbe\t\xb1\x83r\x95\xf8C\x07\xa9\x1c"\x06gc\x18\xac\n\x9f\x0b\xdf\xdb\\\x0c\x12Rlw\xab\xd7\xbeC\xa3\x1c\x82}$\x90\x8a]5\x1aI\x97\xc7\x97t>\xddm\x9a9\x1c4\xfe\xcf\x04U\xf2$.\'\x85TG&\xe4\xb5Y\xf6(\x15\x8b\xec\x958\xecNK\xcb\x0f\xf9\x94\xc3\xeb\x97V\xfb\x87\x8b\xf9\xc2f\x1c\x16r\x81\x15LAZ\xff\x82\xca\x1d\x88U8ITu\x17\xd0c\x03d4\xa3@\xa4\xa4Q\xe6\xd6\r\xa9\r\x89\x86\x12\x9a\xed\xe1\x15\xedf\x05\x00\xf9\x87\xb8\xc3\x07\xfaAU)\xb1\xaa\x9f\x02\x05\xefU\xd3\xce8\xa6\xd1\xda.\xe1\x1e\x9d\x1f\xc5q\xaf~\xc4\x1d\t\xb79\xd0\xb5 \x9a\xda\xaa\xbe\xb9|r\x0c\xb8U\x9f\x07\xb8\xfajp/\xc4\xae\xa0\xe2\x83\\\x1f\xb0\x93~)\xbbJ*$3\xf3\xb3\xa9\x05\x19\xfe\xf6\xf7\xfb\x9f\x17\r\xfb=>[\xf8\xac(.u\x88\xe3J;\x9f\x8a\x998\xc2\xd4\x1b\xfcY.\xbe\xe5\x1d\xe4:\xcc\\&)QR\x17~\x8f\xde\x1aD\x94^\x17_\xa2\x8b\x82m\xe8c\x19Z\x9ajhS1\x97\x19Zg`\xe4U\xddd)\xab\xdf@\xd3\xd1|9\x82$]\xbb\xac\x00\x06K\x0cvH\x07V\x19\xe2!\xf4\xe5\xb7\xb8\x05\x9b\x9d\xb6S\\78\xb4\x1e\xd4c\x8a\xc4\x87[;|\xfa\x9fb\xd4\x01W\x8c\x80\xc4\xba\x93\'+\xd4\xd45\xf8\xd9\xdaA,\x91M\x85\xb6J\x8ec\xc1\x94y\xbe\xf8_\x8a\x98\xb1F\xea\xef\xcc\x0ez\xea\x1a\xd4} .$\xb6\x03\xa6>P\xcf$NGf\x91\xda\x12\x82o\xa3t\xcb6h\xb3\x9e\xe8\xdeR\xd0yC\x9dGf\xd9\x114z\xa8Z\xd6\xcb\x07\xb5+]\xfa\xe5\xdd#s&C\xdc2\xd0\xffR\x93`\xb9\xcf(qHR\xe7\x87\xe1\xda\xb3\xfd\xf2\xaa\xa6\x04\xe6?\xf8\xfc\xd7\xde,\x12\xb8\xee"\xd5\x0c\x85\x1f\xfd\xb9\x12\xa88\xef\xb2\xcb6\xfetv\xdb\x92\xf2\xed\xe9\x8a7[4\x17L\xad`\xbf2\x80\xa4E\xc2\n\xb5Xh\x1b\xe9\x04\xbd\xa9\xf6g\xad\x0f\x10{cO\x9c\x9f\x88\x01]\xf8P\x99\x0f\xff\\\x1aA\xae\xec\xa9d\xfc\xaf\xabG\x1f\xfe\xcdI\x810\x10Z6\xaa\r\'\xe4\xd1\xf0_\x9a\x17\xd0m\xb7\xb7\x11T\xbb\xc8\x01G\xca\x8f\x0f\x1fW\x0f\x062\x82\x03\x1d/\x1d_\xdf\xefObXX\x03aC\xf5\x03\xde\xa2\n>v\xb45\xc0\x0e\x08n\x9a\x02\xd6\xde\x84\xd4\xda\xad\xcd1\xe6\xfc\x0c\x18\x05K\x12\xd1h\xd3\xcbPb\xbd\xa1\xfbA-\x0b\xfc\xc1b\x0fls\xc7\xb0\x183\xf1\x07\xear\xf4\xe3\xfd\xd9\x88\x910L\x8a2\xc9\x12\xca\xe7\x8b|\xd6\xe8\xe3^Ec\x05?33\xec\xe2\xcd\xa3\x86[&\xaa91\x16\x06\xed\xf9\x1eX\x93|f\xeb/p\r\x9a\x9d/\xbdy\xdfY\x17p\xf3\xb1\xf4\xb3\xf8\xca\r\xfe\xc5\xc7\x91\x99\xe3\x96\xdd6\x18\xea\x7f\x02#\x0f\xdc\x17\x0c\xfd\xb9\x93/\x14]&\xb19\x1a\x1b\xe0\xf9Q\x9f{\xd7\xc8g\t\x8a\xbd\xe3\xad\x8d\x1fdK\xaeE\xea\xb9.\xd0t\x1d\x03\x9bAf\x9d\nW\xf0\xf8\x8c\xedVu\xa3\x9b\xf5\x97M\x7f \x99\x1f\xac\xd4zO\xed#\x0f\x82\xc61\xe0\x8f<\xf4\xb0\xef\xb9Bf\x1bs.\xcaa\x92\xba\xf8p\xedr\x03\x15O\xf6\xc2\xc2h\x84[\xfc\x9d\xe1Be\x94a\xdfh\x7ff\xedW[\xd8Hh\x8e!\xc9\xe6\xe8\'\x16\xc7\xd5\xe0\xc5|bvc\x97+=\x95u\xb3H\xca\x8e\'~fr\xd1}\x8a\xb6;3\x86\xc0(\x9fo\xcf2\xb5\x14\x86p\xd2\xf8\x87\xa0\xe9;\xc44\xaf{\x82aZ\x80\x83#\xdf\xaf\xae\x0e\xb07H\xe4\xf3\xceoI\x12\x18\xb0\x0b\x8eg"\x18\xa3\xab\xad\x1d\xbd\x13(#+6\x13\x88\x81\xbdo+\x12\xff\x0e\x1ai3\xeb%\xee/\xc7\xe4\xc2\x14\x19\xac\x98\xba\x1d\x8f\xaa\x04\x03\xaf\xe9\x17f\xd3\xe4"(\x1a\xf5\x8c,\xb2>\x83R\xb4\x17\xce\xe5\xd0\x1d\xd5VZ\xbd\xff\xb2\xda\xf3\xb3\xe1\x11\xbf\xce\xc1\x82U\xebPm\xbc[\xd5<\x0b_\\\xce\n\xcdfq\xbd\xc7\x93\xf7@\xe7\xe3al\xd1\xf8fM\xfe\x02\x16\xfd\x0bX\xf8r{\xcf\x8d\x91l\x911\xe5\xb7i\x9b\x08eq\x92,\xa7\x1f\xe2f\xd4r\xec\xaef\x08\x1dA\x8f4\x15\xbe\x9c\xefo"\xa6\xde\xdb\x84e\xfb\x91\xbfn\xb4\xad+\x98>\xaa{hm#\xef\x96\xeaY\x85\x96[\x9ei\xfd\xcb@v{\x9c\xc0\xa4\x08\xd7\x7f\xc8\xa6T\xbcj|\x11%R\x9a\x9bM;7Q\xbe\xe6\xd6\xb1\xb9\x0f,\x8c4\xf9\xa1\xdd\x81\xe19^\x9cNP[=\x82\x1e\xffT\xc1\xa2d,"F\xed\x97\xbd5en\x97\xf3.Y\xce\xeb]\x85\x063s\x10\x9b-\xf4\x1d]\xe2\xfb\xdf\x95\x1c\xc2\x89\x12\xea\xaa\n\xcc#\xec\x9c\x82G\xe53\xcc\x06\xbby_K\x10M/{\xcc\x84\x8a\x8d}\x90\xb7\x81\xb7\x13b\xe515C\xea~\xd1\xdd\x8bU%\xe01\x1cyOP\x8f\x9c/\xf3\xb5\xbe\xf4\xb6\xb5!\xaar\xfd`\xcc<\xcb\x1f\xc9\xb0n]q\xbaBA\xa4\xa4_\xb6\x15\xef\x1c\xdf\xa8\xb5\xf4\xeb$\x01\xe6\xa9\x0e/\x9a\x1e\x8a=x\xfb\xac\x05\xf0\xbbl\xc0\x10x0+\x97H\x1b\xd6\x9d\xd9\xdf\xea\xc8.\'R\x1b\xb0-\r\xf4y[Ts\xf4Mj\x9a\xb0\xef\xfeb\x8e=\xf7b\xd5\xca\x13\x7fx\xcajRahs?7E\\\x03\xed\x8dq\x98\x91\xc9\xa2\xc5\x030x\xb4cJ}\xc8!s\xaa\xae\xc2d\x9a\xd9W\x8b\x13tK\xea\xfcy\xa6\xd5\x8bt\xcc*T"\xe0\x13\x9a\xc9G\xfb\xb17*x\x89\x03+Bu\xcd\xe2\xc6)0\xb6\xbc]6J\xa8\xdf\xce\xb70\xa6\xfaR\xd1&I[\xbe\x92\xa9\x02RnkK\xb5\xf5\x0b\x16Lh\xce\xee\xeb\t\x05\t\x0c\xe1\xc5orJf\xb7\x11\xd1l\xd7\x80\xcb\xc4\x1d\xcb\x94k\xe7\xc1\xc5P|\x1f\x00\xe4\x98N\x93\x11O\x1dy\xe5\x8f\xe7\x8e\xfe\xfc\xba\x9b\x12\x12C|X~\xaeb\x8d\t\xc6\xcf\xa6C\x8d\x17\r\x0b\xc7$\xb5g\xd8J\xe0\xc0\xe0R\xf8\xc17`x\x9e^\x9f\x8d9\xc2\xbe\x9e]\xba\xdbAh\xca+\xce+\xce\xbbr\xb2w\x83x\xc9v@\xcf\xfb\xd24\x9aa\x1fs\x02\x0fr0\xf8\xda\xca\x02\xd0\x05\xdd\xc1\x17\x04\xc2l\xa1P3M\xd7\x91\xe2\x05\xd6>\xc8\xbb\xfb\x9a\xccg\x9b\xef+\xb1\xc5\xd6\nd\xe2\xa0q\xfd\xc2p\xd2\n\x1eb\x1af\x8b\xbe|A9F\x06n\x11\x8a\x1aA,\xc4\xabD\xabZW\x97xE\xa0m+\x02%\xd0Y\xcb4a\xb6"P\xc9Oqk3\x92K\xf5B\xbb\xb3`\xf3\x15\x06\\\xbeX\xa2\x99\x18\xbc-\xc4h\xa5}\xc1$\xe84\xbc\xf4\xed\xa4K\xf7\x85\x9e\xd2D\xea2\xdb\xd0\xf1b\x12\xa7(\x82k[.%\x81\xe0\xfc\x86k\x04\x92q\xc6\xb2\x7f0\x82\xc2\x1aQ\xb7\xc6)\x85\xd8\xd3\xfc\xbb\xbc\x1f\xcf\x08\xf7m\xf4\xe0qV\x90\n\x17\x1bs\xd6\xfa\xca\x0b\xfe\x98Mb\xfe\x10\xa9.\x1f\xd8\x05\xf1\xd72\xa7\xdd\xbb8\x9d!\xf3\x17\xfb-H\xe1\xef\x9e+\x8c_\xfd\x91\x0f\xa2\x0f\xc7a\xd6mMst\xf0f\xe6\x0c|\x1b\x1b\xfdI\xed>3\x98\t\xadQ\xa3\x0e\xee\xc1\xca\x81w&\xe9|\xc9\xb5\xd6\x14\x1d:\xe9W"M\xc5\x90\x05R\x02\x8c\x96\xc1-\xbc\x8fh\xf9\xd8|\xa97x R\x1fe7\x9ed\xe9\x8fv|\xfd,^{9\x93O/\xc7\xa4:>X\xe7\xbc^eg\xac\x80-\xc1\x8f\xea/\xaec-U\x1e5\x9e\x98\x1c\x17V\xf7\x8c\xd9X\x9a\xdc\x9f\xaa\x00\xf4(\x9c;cE\x0f\x996 \x04\xdb\xef\xce\x83\x8ea\xce\x81\xdej\xb9\xe1\x01\n\xb0\xfbZ\xbb\xaf\xe5\xff\x9a\xdc\xc9!gy\x02<1w\xdd`\x9c!EN<\xd4\xbae}\xf5\x8b\xa6;\xc8\xb9\xb0x\x98\x9b\x04lG\xb2\xda\xd4W\xfdW\x88\x1c\x92f\xaes\x81\xad[S\xc1\xb8SY,\xe7\xd9\xc9yA\xe8\xac\xe2\x1e \xfc\x9a\x10\xca\xc8\xdf\\Sv\xfb\xc3\x98e\xe5\x9d&\x1f\xbe\x0fx\xc2\x9c\xcaC~#\xda\xd3t\xbe\xb6\x08\xe9P\xc3#*\x90\x1b\xab\xb1\xd0\xa0\x0b\xf3\x17+\xc5%\xafO\xcf\xb9\xb7\x95@A`b$\xda@FET\xd9\xe19\xe1\xc6n\\\xd5XY\x99\x80e\xd9\xd3\x95\xa7\xd3\xc0\xa8\'-\x03\x9fT\xa2\xff\x99_\x85\x7f\xb1\xba\xbf.$\xd5\x16\xcf\x1dC-\xf0\xd4\xbf2<\x14Fx\x91\xad\x86\x8bw \xeb\x87\x8a\xa3I6\xbfA%8\xcd\xf5}\xf3\xaf\xeb\xe3\xbd\xfd\xbb\xbe\x1c\xc7\x9a$\xfc\xab\xa6::i\x9a\x84J\xc6\x1f\x0e\x9e\xb87\xff<\x98M\xdb\x05m\xb2\x87\xce\xe5\xf9\x8f\xfd\xd6\xa6\xdc\xdb\xa0q\xc8\xd9(=\xe3^\x8b\xa6\x80\xe8\xaa\x94\xebj\xb6X\xb1\xd9~4,z\x03Q\x8b\xffL\x93\x00\xfc\xcf\xcb\xe6(\xab\xd5\x91[\xe6H+< \xce\xf6\xba\x10\xf9\x18\xa2\xba\x17m\x85\xcc\xc02N\xa3R\xe3RHR@G\x7f\xbe\xc1\xcb*\xf3;m\xb8\x9b\x8cC\x0fE\x04\xeb\x9f\x9f#r\x93\xb8\xfc\xb9\xf9I\'\xa2\x9b; \x93-\x05\xb9\x15\x10M#}\xd2%\xbe8\x14jk\xf9\xbe\x15\x91d\\\xd3\x16\x19\x0c\xec\xfd\xdf\x8c\xe1X\xf3\xb9\xdaK\x03W\xdd\x96\x89\xd5\xf3\xc7D\x07\xca\xf5ET\xa7TP\xf2N\x01\x96\xfd\x11UO\xbc\xcc4\x89\xb0\xa9\xc2ZPF\xe4\x8a\x14\x99\x8e\x84\xa4\x9d<\xa6\xa2[\x17\x1ee\xe1\xc7}\x8c\xa9\x142\xc7\xbco\x9cx\x08\xa5\xc0\x10=\x8b.\xc5w(\xe0Z\x153\xa65\xf2{o\xba9\x1d\x19\x18\xcc\xd7\xa5\xf4k\x81\xa1\xff(*\x92\xc9i\xfb4\xdc0\x87]\x0c\xe23T\xb5{^\xce\x921\xbf\xc8\x1c\xbc\x13?tT\xf1 F\x8e\xc8y\x97B\'\xf10\x94\xa4\x98\xa5[\x06\xee\x13\x1f\xdc\xfc\x04\xe2\xb3k\x94\xb9\xa6`,\x89"P\x8av\x9fM\xed\xf0\x8f\t\x14\x9e%E0M\x06\x8e\xf6\xfe.\xb7\xa7\xb1]4\x92rhN\xb8y_\x80\xaeT\xbb\xa4\x8b(\x7f\x96\xd6\x14\x05%td\x02\xb1\xe0\x99/\x1a#W\x8dWR\xcf\x8d)\x04\x91j\xd3\xb2\x12iO\xbf4vv^Dn\xb8\xbf\x1e\xc2\xdfT\x8a\xd6\xa1\x12vO\xa3\'2\xa4\x07\xc1\x8a\xdb4\xdb\xb7A&\xb7]~\xf4\xca\xabu$\n5LzX\x82z\xa6\xb3}\xd9*\x1f]\x97ay\x9b\xb7\xc4\xb3\xca\x08\xc3\xcd\xbc\t\xcbK\x99\xad\xbb\xa3Br\x0b\xfeu\x91\x8a\xb9\x96p\xe4Gx\xec\xc4\x06\x909;Q\x16\xdf\xee,\xe6)\xcf&wHr"o[i\x16\xcd\x81T\x08\x1c\xb4?\xd0\x80~\xe0\x0bg\xbf\x19\xfcV\xa0Euu#\xefq\xf1\x98 \x00\x04\x153\x91g\x12\xffF\x85\xff\x9c\xf4\x99\xb0\x9c\x1d\xfb\x82L\'n\x849\x99v\xd1\xedG\xf1<\xce \n\x1c0\x81T\xf4\x80\xb0\x9d\x96\n\xf70iO\xd9\x02>^\xf5W\x9c\xea(^\xf1\x83\x1fKNj\xee\n\xe6~\x9e\xad*qH\xe3\x82\xf4\x1cAV\x1a\x82\xd9?G\xb5\x19}\xff~\xb5Y\x08\xa8l\xc9\xbar\xc9g\x1b\x04\xe8\xde\xad\x83ic\xbbB%\xcf\xca\xb4\x99\xbc\x03\xbf\x7f\xdb+l\x85\xb1\xbdnLg\xfe\x98\xb13\x90\xa4\xbf"\xceI\xf2YI\x80\x05\xb2\x8f\xe6\x07\xcd\x9a[6\xb9lg"u\xccs\xb1@\x01\xce\xd5\xa3B^{\x0b^z+\xd8\xac\xbd\xcaQ\xdcXPwF\xd7\x9c\xec\xb3\xb4\xf1o\xf4\x87\xd0\x17\x83:\xfeL\xd3\xbe\xd9bh$\x91\xd5\x11\x1c\xed\xca\xbc\xc1QAOT\x10\xb0\xe0| \xff\x07:C_\xc7\xe6\x01r(\xa2\xf2\x07|\x85\xe8\xc5\xfa\xa0\xd3\xa8\xee\x98\x8c\nk\x06\xd0\xb68f\xdc\xe8\xe4\xc6\xaab\xa2\xd5m\xe7\xb7\x18rR4V&x\xd8\xbb\xd4\xa3\xce>\xe9\xb4E\xa18\x11\xb6-t\x83\xa6:@\x8d@#k\xfe\xc9\xcc\xef\x9e\x9f\xb1HF\xe4\xb6\xfb$AL\xee\xe4\x1e\x9b\x02\x12\x06\xb8^3\xda:\x82\xd3\x1a\xc2\xe5S\xca\xcf\x1ad\x01b\xd7\x85\xfa\xb7\xf4\n\x82\x07\t\x01\x1c\x84p\n~oe\xfe7\xe8\xef\x9b\x12s\x99\xc3\x82\xac\x8d\xecY\x93\x0b\xe8{\xd3\x183AT:\xf8o,Wh\xdax\x7fIH\x85}\xe5\xf4\x056\x16\xe1ci\xe6\xaf\xbf\xe0d\xb3C}\x96\x81Q\x1f\xac \xf4\xa2\xa0\xf7\x8c=\xcb7\x1eo.t\x8c\x95c\x9cA\x01\xdeR\x995\x10\x00%\xb25CW\x11}\x06\xda\xa1\x9b3a\xa7UMN^\xa0\x80\xfd\x88\xc2\xd6\xc8\x93<@7\xaf\x1eZ\n\xc4:\x05`\xcd\xb19\xd1\xedns\x8b\xb1\xa6Q\x14\xd7j\xb1s\xbb\xf0\x1f<\xb6\xebK\xbe]\n\xe2\x1b1\x1d\xe2l\x06Z\x06\xa3h\x80$\xcc\xea\x89\xdcl\xe63\xec\xee\\\xa1\x15\xc6\n5\x1c\x80Jv\x06\xeb\xdd\xee\xb6:\xa2\xfb\x10\xff\xce\xd1XM\xe3~\x00vX*\n^4\xcf\x11\x05o\xa4\xfa\xb8\x83\xe3U\x9f\xce\xc5\xa3\xee3O\xe6\xc5jg1\x98\xd4\x11\xef6\xf8\x1aMV\x00\xdd/$\x11\xc2\x94\xa0\xd6\x9bG&\x8eC\x0e\xe7\x98\xdb`\xa9\xadM\xea\x92\xec\xe0Z\xe2U\xd54\xa7R\xc5\xeaG\x8b/\x98\xf4R\xce2f\x90\xdf\t\xb2\xc7u_m\xfd,\x99\x98\x9d\xa2\x15\xffq?\xd2\x8f\x97\xa5\xcc\xcc\xf9)\xa8\x14\\\xc37\xcfe\xbf%f\x8b\xef\xe6\x19\x85\xb0qK^\x9c\xebC\x1b l\x07\x8a\x1e\x82\x03czy\xdejn\x06\xf3\x02I\xa7%L$o7G\x88\xfe\xd3C\xc1\xce\xe2\x91ui\x12Q\xc3uT\x00\x8b4\xd6\t\xb1\x9cw\xb6q\xab\xd9\xb1o"\x1f\xb8)\x9f\xf9\xcc\x89M\x05\xd4\xb9\xc2\xdc\x9a\xc7\x02Zu\x1e\x1b}\xeb{\xdb\x7f\x14\xbc\x19b\xf6\xff=\xae\xfbl\x98\x8bC<\xdc<\xbe#\xc8i>\xf5J\xfa\\K<\xd7#\xb7\xdd\x0bv\x9bM\xec\xe5\xd1\tZ\xdf\xee\x95i\xe13m\xb8\xfe\x95\xa9+\rM\x8c<{\x91\xe1\x14\xd62\xdbR\x10\xff\x1f\xbc\xf1,\xda \x97\xacE9\xd1[\xf8Ig\xe6\x97\x99\xb6\x90<\xce\xd0P\xff\x14\x05d\x03>d^V2\xb0\xf2\xbb\xce\xe4\xed\xa2\xed\xa1\x17\x0b{c\xdd\xb1\xab\xf7\xa3\xd0\r\x82\x02\xaf\xef;\xffI\xdb\xdc=\x13\x18\xb6E\x05\xef\xb6\xcc\xb7\x9b\x13\x17\x93urv;\xce)Bi\xef\xf2\x90*\xcaX\xbc\xb4\xf3h\n\xba@z\xcc\xafO\xf62\\\xd0\x08\xf1\x04\xe0-E\x1a\xd9ys\x8f\xee\xc8\x8f\x8e\x81\xd6Y?\x84\xf0I\xfb\xd94=\xb5_\xf8o\xfc\xcdu\x0f\xf3#f\x99:\xc0+}X!\x94\xbdK\xce\tn8\x14\x86WB]\x95\xbd\xc8\xa7\xe0#\xa25\x9d\xee\xc8c\xc6j)\x98J\xff\xa9!\x9aX\xb5\x05\xc6\xcdz\x1a\x00\xa1\xbb2D\xdc\xc6\x18\x95rf4jfw\xb2\xd7,\xdc\x90\x8b\xfa{\x02\x9c\x0b\xd3\x11\xff\x1a\xee\x92\x18]\xads\x869\xdex\xd3+\xb8\xb6\xb8vf\xaa\n&]\xde\x9f\t\xc9\xb3\xbf{\xb4_\xc7&%\xa2&\xc0\nP\xdc\xd1\x82\x0f\x8c\xd2\xa8\xbbv\xe0( \x07%8}Uu\xf1\xb4\xf7\x15@\\K\xd2\xe9V\xba\xbc/\xed\x97\x1a\xdfF3\xe2\xd7\xeaD\xd7Z\xdc+j\x88@\x96V\n\xba\x96\xa99t\xb7\x9c\x18y|6x\x9f\xf3\xa7>-U\x92#\xb7\xb9\x97\xf7\x1e1\xabHM\xea\xca\xd1\x14\x99;\xf9\xc9\x9d\xf1\x0e\xa7\x93fH\x14\xbc\xf0F\xf9\xa2L\xd7\xea\xec\x1a2]`\xf7{\xc9\xdeQ]\x98S\xd5Y\xc5S\xb3\xc7\x06\xf9\x1c\x00%`=\x95h\n\x177\x18i(\xac\xa2\x0f\xe8\xc6\x17z\xe9\x9d\x8dz\\\xc5\xf7\x89\xfby\xdc\xbb\xb8!2\xc6\x05\x05\xbdu=\xaf\x8c\xfb\xd5j\xf5aa\xe2\x9e%\xe0\xff\x993\xdc\x06F~!\xa6|\x18sE\x9a\xf8\xe2;6\xd9\xe7\xbd\x15r\xee\xd4\x0f\x9a\xf03A\x98\x04\x9e0\x9a0\xdc\x80$\xb1$\x9a\x8a\x0f\'|8\xbd\x0crM\xd0W\x85v\xd4\xbf\xe6\r\xf4JB\xc5\xa0\xcc\xdd\x90X\xdf\x89\xc4\x96p\xf9J\xb0\x1b\xb1\xe1\x06\xc0q\x0f\xd3\x10\x19\xc3\xb7\xfc+x\x88!\xfc\xfdd/\xc8\x94\xd4\\\xea\xaf\x02"\x9e[>`\x14\xe2\x88\x19\'lR\xdfx\x94\xaa\x80(\xc6\x02\x13\\\xd3\xc4@\xaa\x0b\xf7`\x9f\x1a\xb1\x82\xfc\xdd\x7fx$|\x017\xde\xe2\xf1\x9e4\xe4\x901\x18E$\xd2h\'*\xc5\x03\x05o\xb4\xe8\x95\xb2\x17\x9cG\x91\x04I\xb8\x8a\x04j\xbdP@Lz\xc6\x97\x91\t\x06\x1d\xee\x11\\\x98\x139\xb5\xe6\x05z\x06DW\xc9\x97\xf3\xf5\x1a\x19W\xb7\xf9M\x92 ~\x8dS\rFpo\xcc\xf6\xaac \xb8^*\xe0\xdb\t\xcf\xed\xfa\x9f\xf2\xe2\xa3z\xf8P\xc2\x01\x11&@\xc7\xa1\x1a;Hy\x99\x04\xc2\xeaY\x9f [\x08\xc7\x92\xba\x16\xd7d\xc0a1f\xf1\xae6l\r\xf6\xa7\x87\x8e\xd6\t\xf3U{\xb3\xa2\x1e]\xc790\x88b\xcc\xd0\xb4\x1dn\xe04\xba\x17st#\xc56\xd4\xc3\x12\xaf\xd5\xfbi\x95\xe5\xd6\xfb\x0c]B\x8bC\x8c\x0cL\xab\x89w_\xd3\xf2t\x9eQmn\xb3\xf6\xa5U\xaa\xce\x80\xec5\xc7\xd2E\xf4\xbe\xaa\xd3M_\r\x0cb\xd8\x8c3\xbd&\xe5B\x9d\xa7\xb2\xd6\xb1cB\x85\x8a\x8a\x9e\x86\xf5\x19\x81A\xf1\xed\x1b\xa6\xae`\xb7\xc6\xc1\xfdt\xb3#\xba\x12\xa7\xad\xd0fj\x0c\x10a7D\xddc\x1e\x0ez\x03\xb1\xe7`\xe9\xc91\xc2pZ3~\xfb\xcb\xd4sA"\x10\x0f\x90\xa9M\xa9&\x87\xae\x95\x87\xf6\t\xcd[2<\xec\xbd\x16\x8d:\xcb2\x18\x91\x9a1\x16\x1d!,W]3\xf88\xdb\x19\r-\xe04\xc9\xcfv\x91K\x15\xe0\xfa! 0\xbdn\xa1JQ\x08\xde\xe0\x8a2\x92\xaf\x11\xcb\xf0n\xb7\x9dH|\xdfLL\xbf\xd9dYUXM\xe8\xa8v\xc8\xeb\xd2\x0e2\x97\x16\x07\x83\xc8;5h\x89\nH\x95\xe9M^tV\xd7\xc1?5\x1c\x0c\x0e\xb7i\xadK\xb0\xdd\x9c}\xea\xaa"v\xf0\n\xa1\xabs)7\xe5\x81D\xaa\x87\x1c\xce-\x0f.\x13`U\xb4\x05\xf2^b*^A\x9e9\x9a\xf3?<S\x1aT\xf4\x8bp\x8fKY\x89\xb1\xfc\x0e[S\xe61\xe7-\xb1\xads{C\x1b\x8a\xedR$\xba\xcf\xd4\x0e\xb1\x08?\x94B\xe6\xb3\xb7\x08\xa3\x80\x9e,\xbcK\x9c6k\xb1\x18w\xd0\x0e\x81\xa2\xfb\x9d\xc6\xaa\xa6\x81\xc5\xe3Lq\x1d\xa8r\xa2k\xa9\xa7\x9dt\x14\x0e8\x8d\xcd\xcf|\xdc\x86\x97\xb5\xe6<\xc8\x08\xbeT\x94x\xe0\xc6f\xe8\x94x"\x13\xc2S\x1d\x88\xf93\x80*\x98\xe78\x98r\x18\xf2\xc4\xceA\x07\x11T\xa6\xf4\x86k\x19\xc9*\xfe\xd5\x98\xee!\xf4\xfc\xac\x14\xf6\x01W\x18\x06\xfbJ\xa1\xa3;\xff\nu\x80z\xc0\xe8d\x05W\xbd\xdbW\x85~\xb9_\t\xac\xfd\xfc\xd0LGG\xb6X\xde\x16\x8b\xe5\x8f>b\xfb\x84|\xe9s\xaf\xe2\xfd\xca\xd24\xc1u\x99)\xfc\xee\xd2\x03Z\xa3\x91\x92\x9b\x89\xd9n\xb2\xd0\xfeg\xfd\xfc\xf2xy\x9fs+\xe62\xc4\xb9Rv\xd5r\xa0\x8a\xe2\xe3\xf8\xaa\xa0\xed\x91\xa0F\xe5\x8a&\x04\xc0\xd6o\xe1\x16\xd0\xac\xb7x\xc7\xc5a\xe2\x8cN8\x131g3\x7f\x0c\t\xc0R\xae\xce\xd3\x14\x08\\x7\xfd\x01\xb6Q\xe1\xfe\xaaqD\x15\xdb\x94\x98%)\xe9\xd5I\xcd\x82\x15!\x02\n\xd7\xf9\xef\xd2\x81YuP\xd7\x06(\xd8g^\x141J?\xbc"r]V\xec\xc2^\xe3`P\xaa\xbb\xe2\xe1\xe7\xd3\x94,2#a\'\xc8\xfcz\xfc\x9d\xf8\x02\xb5\x9c\xf9o\xca\x81C\x17\xaa\xf0\xccd\xcax\xbf\xf7s,\x15\x91o_\xc16\x8ap\xc0;\x17\xc7f\xfd_\xc2`\x05\x84\x88f\xe3\xe5\xd4\x8b$\xde\x98\xae\xd9\x8a\xe6Z\x95M\x9c\x1b^\x82\x89\x9a\x1f\x95\x97#\xcf\x88\x8b\xe7\'\xc9\xfe\xd9\xf2\xd8\x95HH\x945\x9a\xb74Q\x1d\xe4c\x98\x9b\x88\x02\xa0!!\xd6+\x1e\x95"!8+\x17\xd4G\x19c\xd7\xdf\xcc\xf6\xee\x88\x97oT\x8c!?\xcez\xe9\xbc)\x07\xc6X\x95\xaf\xa1\t\xe0\x90\xdb\xaf\xaa\x9bKZ\xb3_\xcc\xf4\xf5<\xe2\x9f\x89W\x8a\x07se\x198\xed\xa0\xd0\x96BZ\xd1\x8e\x8f\xba\xa4\xbf\xe3\n\r\x12R\x16e\xfb*\x11\xc2\xe3\x17u1A\xc3\xdcx\x9a\xf5Q\xc9\xc7\x8a\xbc\xa8\xf5\x0fUy\x0b\xc9\x133\x94c\xf1*\xd2\x98\xe2f\xe5\xd0DS\x91\x96\x08\xfc;\x8fLu\xc7\xdcE\xba\x96+\x9c\x7fV\x8d\xa7P\xbe:\xf7\x80\xef\x08\xd8\xe1^\xce\xf0t\xecc\xdd9Po\xc67\xe8\xd5\xf3\xe5\xc7\x02\xa6\xb3\xf9!\xe1.\xd1\xba&\xb6_\xc8 &\xee*N\xca\xc4\xb0Yb\x11-U,\xecT\xbd\x8b\xcf\xd8\t\xa9\xb78\xe3z\xf4\x1bxJ|\xc8\xbf\x1dK\xa2iC\xc7\xc1\xc8\xf7)\xbc\xe2sl\xf60\x99\xb8\xac\xd1k6.a\x05\x8a\xed<\'\xad\xf0\xc7\x94\x983p\x89\x8cA\xf0\x1a9\xa7\xe0\xbf\x0c\x81\xdf\xcc\xc8&\xc214xv\xa3N\x1c\xf1&\xa0\x80W\xc9A4\xa89\x9f\x8b\xa8\xab\xc4\xdc\xe5ET\xb5uQ%\x9e\xec\x90\xabei\x9d\xa4T\xa1\xe9\x80\n\x19\x03\x99\x1b\xce\xaf\xb7\xcc\xd5\x17N|\x17a\xe6{w\xad\xdb,\xf3kn\xc5\xdbD\xe5\x06I\x00\xb0\xe3\x80Pg`\xe4\x8b\xe1\xbe\xbd\xbf\xe2\x9az\xcd\x84\x88\xc6\xda.\xf0y\xe9C!\x7f$\xe5\x0c\xee\x96\x181\xe7\xb3\x8a\xe5\x9dz/6.\xb9\x9ep\xd3m\xf6\xef\xa6\x1b\x85\xf5{\xa4\xe0A\xc8\x8d\xe0\xd6\xe3k\xa6\x9b\x95b\x1e|\x16\x8d\xd7\x06gE\x1d\xb3|F\x8c\x10\xa3\xb3+\xe7u/\xf5\x99\xf2\xe4uk\xccQ\xb1l\x1c\xa7J\\/xv\x00\x13R-*vf8\xf7\xe20[\x84Pl<p\x19\x05\x8a\xbdb\xdc\xee0\xd0vj]H\x80U9\xebSt\xd7h"\xfa\x99e2\xc7\t\xe9\xdb^V\xa3\xaa\xaf\xfb\xb4\r"\xfc\xb7\xc4s\x02Q\xef\x15\x9d<i\\(\xd9.\xa0\x0c\x15b\x85\x0c#f!G\xc9\xaeG\xcb/\xc6K\xe9\xef\x1fV\xb9O|\xc0\x8b]\xc4/\xad\x8b\xe1\x9aj\xc1\xa0\xc1l\xff\x8b"\x96\x13\xad\xc6\xed\xa0\xc1\xb9\xfe\x01%\n~\n~W\x15\xe33\xe1B\xedK\xde\xf8`I\xae\xb8A\xc8;\xf0\xfa.\x17k\xfe\xb5\xe8\x8a\x96A\xea\xde\x01\x870?\xcc\x0eq0.T2jS*\xcf\xb0(\x8bB/\xc5\x80G<\xfbz\xe3 5|\x1b\xedF^\xf3\xc8\x02(\x08\x8e\xacK\x0e\xc8g~m\x83-\xaf\x07P\'zZ\x81\xfb\xab\xf4L`\xd9O\x95PJ\xe5F\xe8/\xf5\x1d\xa7\xd8\n\xf3\xe6Kp\xbe\x95U\xe0\x07\xc9\xe9>\xfc[f\xae}\x0e2\xc3\xab\x03U\xab\xe7\xccfQG\xd0xV\x13?\x0eg\xc7b\x1d\xcf\xc2N\x0f"xM\x9d\xbb*1\xf1\xac~\x80\xa6(\xd5\xa7\xed-\xdf]\xbe\xf4\xe3\x05{\xa3K\x080z\xb2\x899&Q \xea\rE\xa9nX$r\xda\xb7\'\xcdO\x10\xef\'&\x03\xdb\x13\xde\x811\xfa \x9d@\xe8\xca\xce6\xa4\xbap\\\xad@\x0fl\x0c<\x04\x11*\x91cu*<\x8a\xd5-*\x8d%\xd9;\xbc\xd1\xe2\xa1Z*\xfa3\xad\x92\xa3v\xddE.\x1f\xa5\xcaT\x1c\xba\xf8=\xb2>L\xe1Tj-;tyC\x8fr\xd5\x123\xadT\x91=\xce\xcb\xf9f+\x1d?\t\xb0C\x1dc\xb5D\xe8H\xdc\xdc\xeeQ\x9c\x13\x16l.\xb6\x9f$0!\x9a:\xc8\xa7\x1d\xd5A3\x9b\xa5\xc2\x9b7\x9a\x1fS!:\x9a\xb8\xcf,\xc9|uK\xeb1\x86\xa0Z\xbc*b\x96SD7\x9b\xc0\xc2"\xf9o\x85\xa2\x8bH\xa3\xbf?\x81SGX\x9a\xb5\xb6\xeeU\x9b/J\x11\x97\x8fo\xa4\xe0;\x90+X\xa7\xfa\x10\xe3\xef@\xee\xcb\xac\x00\xe3\x14?q\riw\x875\'\xfe\xc5\x97\xc3\r\xb7\x89^\x9a\xf0B9-\xe4\xaab\x9aP\x1e\xf1\x98\xed \xdf\xd8\xf5\x05\x95\x1d{5x \xe1\x99\xbb\xc0\x1c\x17\x11 \xbd\x08\xcf`\'\xfe\x8cLm\x87fL\xc5\x9d9\x05\xbe\'\xa2Wu\x85i\xa0\xe9\x8b\n \xf8f+\xb6\x90\xc6\xb0\xdc\xf4\xf9\x98\x87\xc0\xc4H.\xac*n\xab\xbd\xa88\x96\xa0\xe2\xd0\x86\x9a\x82\x11\x96\xf6\xec\x89L\x1b\xf2\x15O[\xa0\x1d\x8c\x1b9>\xbd\xb5\xf2\xd8\x99\xda\xf4^ t\xfc\xec\x14\xb4\xb1n\x96\xd5\xca$\xa6[!\x8d\xe5a\xcf\xbf\xdb\xddO\x00\xd9\xdf\xb1\xa9\x90\xec\xad\x9f\xb8\xeeIn\xe1==Ht\xcf$3\xe6\x175\xffY0\xf0\rn\x97\x8c\xa9H4\xf9\xd7\r\x7f0\xa4\x1a\xb5\x84\x0e\xb2\x02\xee\x07n\x17\xb7\x00/\xd09\x95\x1e\x91P\xd1M\xd7\xb7\x8b\x16h\x8e\xc2\x12I\xe6\xf5G\x1fG\xba\xbe\xd6&\xfdC\xa7\x08[\xe8\x06H\x13>\xd6\xd6\xe6\x81\xe47\xd4\xe5\xfe\xf0\xdb\xf5\xc0\xd21tBN\x84g\xdaA\x93\x93=\\\x9c\xba\xfe\x17iC2X\xe6fe\xa1\xa4\xf5+Sp\xd0\xaf\x1f\x9e\x07\xdb-\xc2\x0b1e$\xacb\xb11\xe3\xeb\xdd"+j!\xc4\xc1\xdb\x1cdC8&%x\xca\xeb.\xb3\xfc\xb4\xf7\x80\xf4\\\xa7\x1cl\x15\xe9\xdaRq\xf8\x94d\xeaZ\xca\x8f\xdf\xbe\x9e\xd9\xd9\xd1\x81,]C\xf3\x8d\xa2\xc7\xa1\xb7\x84T\xf9\xd0}\x9a\x1a\x066\xd4,\xd8\x91\x8d\x82\x0b\xb0\xbea\xab\xde\xb5 f\xaa\xd2\\\xc8)\xac\xa9j0\xc9*o\x17\xb8\xbf%2\xf0\xdf*\xb4\xc2\xecPy3\n\xef\x8f~$D\xf3h7\x93\'V\x944\xc4\xd1\xed\xf5\xb1/*\xf2\xa4\xf3\x1f}"\x1f\xfak\n\xb2\xf3}\xf1\xc1\xe5ebB\x93\xadS\x88\x83\x84O\x8c\xc7\x0e\xbe\xea\xf14\x16\x8eQs(\nB\xef\xd1\x86\xb4\xc9\xac\xc1\xc3V\x1b\xe7\x05UO\xa5_\xae\xe5\xec\x10\x15<^F(o\xac\xf9\x0b\xa6\x9e\xde\xa7\xff\xbb\xfe\xec\x9f\xaa9\xa2\xe0\xa5\xae\xa7$-"3\x81Y9Ki\x80\xda\xc8#\xf8\xd1\xb2Dpv\xfa\xe2\xb39\xb3GX\xd4\x99\x1e\xe9pA\xbc\xe9dh\xe6\xbb&\xf8\xb7\x95\xb1\n\x87P"\xa87@-gB\x00\x94z\x85\xc2\x8e9\x81\x8f\xc0\xbd/\xd3\x02\xc3\xa7a=r\xc8\xbf\x06g0d\xdf\xce\x03x\x9a\xaf\xfb\xa8\xac\xfd\x17n\xf1J\x1e\x1cf=\xb4m\x8a\x8c\xcf\x89\xfa\xdd\x1fp\xadi\x0b\x1f\x08\x10\xd3*\xc0\xab\xda^\x8c\x88\xc7_n\x01\xffu\xe7\xaeZ\x18E\xc2\x03\x801\xec\x99&\x18:\xffF\x7f\xd7\xcd\xbd\xac\x91R\x8aH[~\xe1\xdaw\xf0C\xc3\x93\tm}\x10\xaaQ\x15T\x18z\xd4\x8ekb\x8f\xa8I\xa0\xce\x13\x04Z\xba\xc2\xd71\xb5`\x06\xb2\xaa\xdaz+\xfa!Z_[D\x1fw\xd8)\xb3\xf8\xb6\xde\xaf\x92\xaa\x8c\xd7\x9b\xfc\x04A\xbe\x07\x86\xbf\xf4\xaa\xf1\x8e\x06\xc7\x05:\x83\xe8\x16<}\x84=\xd7[}N\x02\xca\xab\xd6\x85\xaa)_ \xd1\xfa\xa51\xfd\xf3\xee)-3\x8f\x89#\xf0\xa6wH\x89VKzm\x98\xc72iJR\xeb\x04\n\x87\xa4\x05\x92\n\xdb\xd5\xc6-\x92x\xa0\xc7\xa0\x01z\xa0\n\x01\xb1\xd4\xe0\xe5\xc7\xa8R\x9a\xe2Q\x01\xe9\xa7\x9d`\x91\xc5\x0f\xaf\x82\x1bfF\xdcc\xc7\xeb\x98\n\xe5\xcd\xd7\'\xae/3\xad@\xb7\xd27\x9f)\x87\x921,\xb8\xb6\x0f\xe3+\xc3\xa2\xbf\x95c\x92<\xba\x04q\xcb(\xa5\xbaE\x0f\x9dTp\\\xf5\x8e\x8e\x1a9\xdb0Dr\x9e\xac\x01]yO\xddG\x07\x9e\xb6\xecXT\xf6{\x18\xea\xc6\xec\xb8\x96\xc21:\xc7L\x1e\x19\xd8y\x10\xe6V\xc4\'\x83\xa6\x8ab\xd9j\xfe\xb3\x95\xfe\x94WNb~\xa4\xc86r\xdd\xff\x0b_\xef\xe0JN\xefB\x90\xd1R\xf5G\xfd\x1b\x8b\xfb\xea]\xdd\x19\xf4\x1a$vZ\x99\xff\xb0>\x05\r\xeb\xe7\xe9l\x9b\x99\xaa\xce\xa4\xd2\xb9\xaf\xee(\x12n0\xeb\xd89\xe9\x1a\x01\xebX|D \x1e~\xee\xd9 ;\xba<\x10\xd7\xdb\x1f\xfe\xff\xf0\x84]Oh\x0e\xc2>U\xc5\xcca\xc0\x90\x83\x96c\xde\x15C\xad6\xae\xb7\xdf\xc1\xb2\xcdP/')
1
+ from flask import g,request
2
+ import enum
3
+ from hiddifypanel.models import *
4
+ import yaml
5
+ import json
6
+ from hiddifypanel.panel import hiddify
7
+
8
+
9
+ def all_proxies(child_id=0):
10
+ all_proxies = hiddify.get_available_proxies(child_id)
11
+ all_proxies = [p for p in all_proxies if p.enable]
12
+ # all_cfg=Proxy.query.filter(Proxy.enable==True).all()
13
+ # if not hconfig(ConfigEnum.domain_fronting_domain):
14
+ # all_cfg=[c for c in all_cfg if 'Fake' not in c.cdn]
15
+ # if not g.is_cdn:
16
+ # all_cfg=[c for c in all_cfg if 'CDN' not in c.cdn]
17
+ # if not hconfig(ConfigEnum.ssfaketls_enable):
18
+ # all_cfg=[c for c in all_cfg if 'faketls' not in c.transport and 'v2ray' not in c.proto]
19
+ # if not hconfig(ConfigEnum.vmess_enable):
20
+ # all_cfg=[c for c in all_cfg if 'vmess' not in c.proto]
21
+
22
+ return all_proxies
23
+
24
+
25
+ def proxy_info(name, mode="tls"):
26
+ return "error"
27
+
28
+
29
+ def pbase64(full_str):
30
+ return full_str
31
+ str = full_str.split("vmess://")[1]
32
+ import base64
33
+ resp = base64.b64encode(f'{str}'.encode("utf-8"))
34
+ return "vmess://"+resp.decode()
35
+
36
+
37
+ def make_proxy(proxy, domain_db, phttp=80, ptls=443):
38
+ if type(phttp) == str:
39
+ phttp = int(phttp) if phttp != "None" else None
40
+ if type(ptls) == str:
41
+ ptls = int(ptls) if ptls != "None" else None
42
+ l3 = proxy.l3
43
+
44
+ domain = domain_db.domain
45
+
46
+ child_id = domain_db.child_id
47
+ hconfigs = get_hconfigs(child_id)
48
+ port = 0
49
+
50
+ if l3 in [ProxyL3.tls, ProxyL3.tls_h2, ProxyL3.tls_h2_h1]:
51
+ port = ptls
52
+ elif l3 == "http":
53
+ port = phttp
54
+ elif l3 == "kcp":
55
+ port = hconfigs[ConfigEnum.kcp_ports].split(",")[0]
56
+ elif l3 == "tuic":
57
+ port = hconfigs[ConfigEnum.tuic_port].split(",")[0]
58
+
59
+ name = proxy.name
60
+ if not port:
61
+ return {'name': name, 'msg': "port not defined",'type':'error', 'proto': proxy.proto}
62
+
63
+ is_cdn = ProxyCDN.CDN in proxy.cdn
64
+ if is_cdn and domain_db.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
65
+ # print("cdn proxy not in cdn domain", domain, name)
66
+ return {'name': name, 'msg': "cdn proxy not in cdn domain",'type':'debug', 'proto': proxy.proto}
67
+ if not is_cdn and domain_db.mode in [DomainType.cdn,DomainType.auto_cdn_ip]:
68
+ # print("not cdn proxy in cdn domain", domain, name, proxy.cdn)
69
+ return {'name': name, 'msg': "not cdn proxy in cdn domain",'type':'debug', 'proto': proxy.proto}
70
+
71
+ cdn_forced_host = domain_db.cdn_ip or domain_db.domain
72
+
73
+ base = {
74
+ 'name': name.replace(" ", "_"),
75
+ 'cdn': is_cdn,
76
+ 'mode': "CDN" if is_cdn else "direct",
77
+ 'l3': l3,
78
+ 'host': domain,
79
+ 'port': port,
80
+ 'server': cdn_forced_host,
81
+ 'sni': domain,
82
+ 'uuid': str(g.user_uuid),
83
+ 'proto': proxy.proto,
84
+ 'transport': proxy.transport,
85
+ 'proxy_path': hconfigs[ConfigEnum.proxy_path],
86
+ 'alpn': "h2" if proxy.l3 == 'tls_h2' else 'h2,http/1.1' if proxy.l3 == 'tls_h2_h1' else "http/1.1",
87
+ 'extra_info': f'{domain_db.alias or domain}',
88
+ 'fingerprint': hconfigs[ConfigEnum.utls],
89
+ 'allow_insecure': domain_db.mode == DomainType.fake or "Fake" in proxy.cdn,
90
+ 'dbe':proxy,
91
+ 'dbdomain':domain_db
92
+ }
93
+
94
+ if base["proto"] == "trojan" and "tls" not in l3:
95
+ return {'name': name, 'msg': "trojan but not tls",'type':'warning', 'proto': proxy.proto}
96
+
97
+ if l3 == "http" and "XTLS" in proxy.transport:
98
+ return {'name': name, 'msg': "http and xtls???",'type':'warning', 'proto': proxy.proto}
99
+ if l3 == "http" and base["proto"] in ["ss", "ssr"]:
100
+ return {'name': name, 'msg': "http and ss or ssr???",'type':'warning', 'proto': proxy.proto}
101
+ if proxy.proto in ProxyProto.vmess:
102
+ base['cipher']="chacha20-poly1305"
103
+ if "Fake" in proxy.cdn:
104
+ if not hconfigs[ConfigEnum.domain_fronting_domain]:
105
+ return {'name': name, 'msg': "no domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
106
+ if l3 == "http" and not hconfigs[ConfigEnum.domain_fronting_http_enable]:
107
+ return {'name': name, 'msg': "no http in domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
108
+ if l3 == "tls" and not hconfigs[ConfigEnum.domain_fronting_tls_enable]:
109
+ return {'name': name, 'msg': "no tls in domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
110
+ base['server'] = hconfigs[ConfigEnum.domain_fronting_domain]
111
+ base['sni'] = hconfigs[ConfigEnum.domain_fronting_domain]
112
+ # base["host"]=domain
113
+ base['mode'] = 'Fake'
114
+
115
+ elif l3 == "http" and not hconfigs[ConfigEnum.http_proxy_enable]:
116
+ return {'name': name, 'msg': "http but http is disabled ",'type':'debug', 'proto': proxy.proto}
117
+ path = {
118
+ 'vless': f'{hconfigs[ConfigEnum.path_vless]}',
119
+ 'trojan': f'{hconfigs[ConfigEnum.path_trojan]}',
120
+ 'vmess': f'{hconfigs[ConfigEnum.path_vmess]}',
121
+ 'ss': f'{hconfigs[ConfigEnum.path_ss]}',
122
+ 'v2ray': f'{hconfigs[ConfigEnum.path_ss]}'
123
+ }
124
+
125
+ if base["proto"] in ['v2ray', 'ss', 'ssr']:
126
+ base['cipher'] = 'chacha20-ietf-poly1305'
127
+ if "shadowtls" not in proxy.transport:
128
+ base['uuid'] = f'{hconfigs[ConfigEnum.shared_secret]}'
129
+
130
+ if base["proto"] == "ssr":
131
+ base["ssr-obfs"] = "tls1.2_ticket_auth"
132
+ base["ssr-protocol"] = "auth_sha1_v4"
133
+ base["fakedomain"] = hconfigs[ConfigEnum.ssr_fakedomain]
134
+ base["mode"] = "FakeTLS"
135
+ return base
136
+ elif "faketls" in proxy.transport:
137
+ base['fakedomain'] = hconfigs[ConfigEnum.ssfaketls_fakedomain]
138
+ base['mode'] = 'FakeTLS'
139
+ return base
140
+ elif "shadowtls" in proxy.transport:
141
+
142
+ base['fakedomain'] = hconfigs[ConfigEnum.shadowtls_fakedomain]
143
+ base['mode'] = 'ShadowTLS'
144
+ return base
145
+
146
+ if "XTLS" in proxy.transport:
147
+ base['flow'] = 'xtls-rprx-vision'
148
+ return {**base, 'transport': 'tcp', 'l3': 'xtls'}
149
+ if "tcp" in proxy.transport:
150
+ base['transport'] = 'tcp'
151
+ base['path'] = f'/{path[base["proto"]]}{hconfigs[ConfigEnum.path_tcp]}'
152
+ return base
153
+ if proxy.transport in ["ws", "WS"]:
154
+ base['transport'] = 'ws'
155
+ base['path'] = f'/{path[base["proto"]]}{hconfigs[ConfigEnum.path_ws]}'
156
+ base["host"] = domain
157
+ return base
158
+
159
+ if proxy.transport == "grpc":
160
+ base['transport'] = 'grpc'
161
+ base['grpc_mode'] = "multi"
162
+ base['grpc_service_name'] = f'{path[base["proto"]]}{hconfigs[ConfigEnum.path_grpc]}'
163
+ base['path'] = base['grpc_service_name']
164
+ return base
165
+
166
+ if "h1" in proxy.transport:
167
+ base['transport'] = 'tcp'
168
+ base['alpn'] = 'http/1.1'
169
+ return base
170
+ return {'name': name, 'msg': 'not valid','type':'error', 'proto': proxy.proto}
171
+
172
+
173
+ def to_link(proxy):
174
+ if 'error' in proxy:
175
+ return proxy
176
+
177
+ name_link = proxy["name"]+"_"+proxy['extra_info']
178
+ if proxy['proto'] == 'vmess':
179
+ # print(proxy)
180
+ vmess_type = None
181
+ if proxy["transport"] == 'tcp':
182
+ vmess_type = 'http'
183
+ if 'grpc_mode' in proxy:
184
+ vmess_type = proxy['grpc_mode']
185
+ vmess_data = {"v": "2",
186
+ "ps": name_link,
187
+ "add": proxy['server'],
188
+ "port": proxy['port'],
189
+ "id": proxy["uuid"],
190
+ "aid": "0",
191
+ "scy": proxy['cipher'],
192
+ "net": proxy["transport"],
193
+ "type": vmess_type or "none",
194
+ "host": proxy.get("host", ""),
195
+ "alpn": proxy.get("alpn", "h2,http/1.1"),
196
+ "path": proxy["path"] if "path" in proxy else "",
197
+ "tls": "tls" if "tls" in proxy["l3"] else "",
198
+ "sni": proxy["sni"],
199
+ "fp": proxy["fingerprint"]
200
+ }
201
+
202
+ return pbase64(f'vmess://{json.dumps(vmess_data)}')
203
+ if proxy['proto'] == "ssr":
204
+ baseurl = f'ssr://proxy["encryption"]:{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
205
+ return baseurl
206
+ if proxy['proto'] in ['ss', 'v2ray']:
207
+ baseurl = f'ss://proxy["encryption"]:{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
208
+ if proxy['mode'] == 'faketls':
209
+ return f'{baseurl}?plugin=obfs-local%3Bobfs%3Dtls%3Bobfs-host%3D{proxy["fakedomain"]}&amp;udp-over-tcp=true#{name_link}'
210
+ if proxy['mode'] == 'shadowtls':
211
+ return f'{baseurl}?plugin=shadow-tls%3Bpassword%3D{proxy["proxy_path"]}%3Bhost%3D{proxy["fakedomain"]}&amp;udp-over-tcp=true#{name_link}'
212
+ if proxy['proto'] == 'v2ray':
213
+ return f'{baseurl}?plugin=v2ray-plugin%3Bmode%3Dwebsocket%3Bpath%3D{proxy["path"]}%3Bhost%3D{proxy["host"]}%3Btls&amp;udp-over-tcp=true#{name_link}'
214
+
215
+ infos = f'&sni={proxy["sni"]}&type={proxy["transport"]}'
216
+
217
+ infos += f"&alpn={proxy['alpn']}"
218
+
219
+ # infos+=f'&alpn={proxy["alpn"]}'
220
+ infos += f'&path={proxy["path"]}' if "path" in proxy else ""
221
+ infos += f'&host={proxy["host"]}' if "host" in proxy else ""
222
+ if "grpc" == proxy["transport"]:
223
+ infos += f'&serviceName={proxy["grpc_service_name"]}&mode={proxy["grpc_mode"]}'
224
+ if 'vless' == proxy['proto']:
225
+ infos += "&encryption=none"
226
+ if proxy.get('fingerprint','none')!='none':
227
+ infos += "&fp="+proxy['fingerprint']
228
+ if proxy['l3'] != 'quic':
229
+ infos += '&headerType=None' # if not quic
230
+ if proxy['mode'] == 'Fake' or proxy['allow_insecure']:
231
+ infos += "&allowInsecure=true"
232
+
233
+ infos += f'#{name_link}'
234
+ baseurl = f'{proxy["proto"]}://{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
235
+ if 'xtls' == proxy['l3']:
236
+ return f'{baseurl}?flow={proxy["flow"]}&security=tls&type=tcp{infos}'
237
+ if proxy['l3'] == 'http':
238
+ return f'{baseurl}?security=none{infos}'
239
+ if 'tls' in proxy['l3']:
240
+ return f'{baseurl}?security=tls{infos}'
241
+ return proxy
242
+
243
+ def to_clash_yml(proxy):
244
+ return yaml.dump(to_clash(proxy))
245
+
246
+
247
+ def to_clash(proxy, meta_or_normal):
248
+ name=proxy['name']
249
+ if proxy['l3'] == "kcp":
250
+ return {'name': name, 'msg': "clash not support kcp",'type':'debug'}
251
+ if proxy.get('flow', '') == "xtls-rprx-vision":
252
+ return {'name': name, 'msg': "vision not supported",'type':'debug'}
253
+ if meta_or_normal == "normal":
254
+ if proxy['proto'] == "vless":
255
+ return {'name': name, 'msg': "vless not supported in clash",'type':'debug'}
256
+ if proxy['l3'] == "xtls":
257
+ return {'name': name, 'msg': "xtls not supported in clash",'type':'debug'}
258
+ if proxy['transport'] == "shadowtls":
259
+ return {'name': name, 'msg': "shadowtls not supported in clash",'type':'debug'}
260
+ if proxy['l3']==ProxyL3.tls_h2 and proxy['proto'] in [ProxyProto.vmess,ProxyProto.vless] and proxy['dbe'].cdn==ProxyCDN.direct:
261
+ return {'name': name, 'msg': "bug tls_h2 vmess and vless in clash meta",'type':'warning'}
262
+ base = {}
263
+ # vmess ws
264
+ base["name"] = f"""{proxy["name"]} {proxy['extra_info']} {proxy['port']} {proxy["dbdomain"].id}"""
265
+ base["type"] = str(proxy["proto"])
266
+ base["server"] = proxy["server"]
267
+ base["port"] = proxy["port"]
268
+ base['alpn'] = proxy['alpn'].split(',')
269
+ if proxy["proto"] == "ssr":
270
+ base["cipher"] = proxy["cipher"]
271
+ base["password"] = proxy["uuid"]
272
+ base["udp"] = True
273
+ base["obfs"] = proxy["ssr-obfs"]
274
+ base["protocol"] = proxy["ssr-protocol"]
275
+ base["obfs-param"] = proxy["fakedomain"]
276
+ return base
277
+ elif proxy["proto"] in ["ss", "v2ray"]:
278
+ base["cipher"] = proxy["cipher"]
279
+ base["password"] = proxy["uuid"]
280
+ base["udp_over_tcp"] = True
281
+ if proxy["transport"] == "faketls":
282
+ base["plugin"] = "obfs"
283
+ base["plugin-opts"] = {
284
+ "mode": 'tls',
285
+ "host": proxy["fakedomain"]
286
+ }
287
+ elif proxy["transport"] == "shadowtls":
288
+ base["plugin"] = "shadow-tls"
289
+ base["plugin-opts"] = {
290
+ "host": proxy["fakedomain"],
291
+ "password": proxy["proxy_path"]
292
+ }
293
+
294
+ elif proxy["proto"] == "v2ray":
295
+ base["plugin"] = "v2ray-plugin"
296
+ base["type"] = "ss"
297
+ base["plugin-opts"] = {
298
+ "mode": "websocket",
299
+ "tls": "tls" in proxy["l3"] ,
300
+ "skip-cert-verify": proxy["mode"] == "Fake" or proxy['allow_insecure'],
301
+ "host": proxy['sni'],
302
+ "path": proxy["path"]
303
+ }
304
+ return base
305
+ elif proxy["proto"] == "trojan":
306
+ base["password"] = proxy["uuid"]
307
+ base["sni"] = proxy["sni"]
308
+
309
+ else:
310
+ base["uuid"] = proxy["uuid"]
311
+ base["servername"] = proxy["sni"]
312
+ base["tls"] = "tls" in proxy["l3"]
313
+ # if meta_or_normal == "meta":
314
+ # base['client-fingerprint'] = proxy['fingerprint']
315
+ if "xtls" == proxy['l3']:
316
+ base["flow"] = proxy['flow']
317
+ base["flow-show"] = True
318
+
319
+ if proxy["proto"] == "vmess":
320
+ base["alterId"] = 0
321
+ base["cipher"] = proxy["cipher"]
322
+ base["udp"] = True
323
+
324
+ base["skip-cert-verify"] = proxy["mode"] == "Fake"
325
+
326
+ base["network"] = proxy["transport"]
327
+
328
+ if base["network"] == "ws":
329
+ base["ws-opts"] = {
330
+ "path": proxy["path"]
331
+ }
332
+ if "host" in proxy:
333
+ base["ws-opts"]["headers"] = {"Host": proxy["host"]}
334
+
335
+ if base["network"] == "tcp" and proxy['alpn'] != 'h2':
336
+ # if proxy['proto']=='vless':
337
+ base["network"] = "http"
338
+
339
+ if "path" in proxy:
340
+ base["http-opts"] = {
341
+ "path": [proxy["path"]]
342
+ }
343
+ if 'host' in proxy:
344
+ base["http-opts"]["host"] = [proxy["host"]]
345
+ if base["network"] == "tcp" and proxy['alpn'] == 'h2':
346
+ base["network"] = "h2"
347
+
348
+ if "path" in proxy:
349
+ base["h2-opts"] = {
350
+ "path": proxy["path"]
351
+ }
352
+ if 'host' in proxy:
353
+ base["h2-opts"]["host"] = [proxy["host"]]
354
+ if base["network"] == "grpc":
355
+ base["grpc-opts"] = {
356
+ "grpc-service-name": proxy["grpc_service_name"]
357
+ }
358
+
359
+ return base
360
+
361
+
362
+
363
+ def get_clash_config_names(meta_or_normal, domains):
364
+ allphttp=[p for p in request.args.get("phttp","").split(',') if p]
365
+ allptls=[p for p in request.args.get("ptls","").split(',') if p]
366
+
367
+ allp = []
368
+ for d in domains:
369
+ hconfigs = get_hconfigs(d.child_id)
370
+ for t in (['http', 'tls'] if hconfigs[ConfigEnum.http_proxy_enable] else ['tls']):
371
+
372
+ for port in hconfigs[ConfigEnum.http_ports if t == 'http' else ConfigEnum.tls_ports].split(','):
373
+
374
+ phttp = port if t == 'http' else None
375
+ ptls = port if t == 'tls' else None
376
+ if phttp and len(allphttp) and phttp not in allphttp:
377
+ continue
378
+ if ptls and len(allptls) and ptls not in allptls:
379
+ continue
380
+
381
+ for type in all_proxies(d.child_id):
382
+ pinfo = make_proxy(type, d, phttp=phttp, ptls=ptls)
383
+ if 'msg' not in pinfo:
384
+ clash = to_clash(pinfo, meta_or_normal)
385
+ if 'msg' not in clash:
386
+ allp.append(clash['name'])
387
+
388
+ return yaml.dump(allp, sort_keys=False)
389
+
390
+
391
+ def get_all_clash_configs(meta_or_normal, domains):
392
+ allphttp=[p for p in request.args.get("phttp","").split(',') if p]
393
+ allptls=[p for p in request.args.get("ptls","").split(',') if p]
394
+
395
+ allp = []
396
+ for d in domains:
397
+ hconfigs = get_hconfigs(d.child_id)
398
+ for t in (['http', 'tls'] if hconfigs[ConfigEnum.http_proxy_enable] else ['tls']):
399
+
400
+ for port in hconfigs[ConfigEnum.http_ports if t == 'http' else ConfigEnum.tls_ports].split(','):
401
+
402
+ phttp = port if t == 'http' else None
403
+ ptls = port if t == 'tls' else None
404
+ if phttp and len(allphttp) and phttp not in allphttp:
405
+ continue
406
+ if ptls and len(allptls) and ptls not in allptls:
407
+ continue
408
+
409
+ for type in all_proxies(d.child_id):
410
+ pinfo = make_proxy(type, d, phttp=phttp, ptls=ptls)
411
+ if 'msg' not in pinfo:
412
+ clash = to_clash(pinfo, meta_or_normal)
413
+ if 'msg' not in clash:
414
+ allp.append(clash)
415
+
416
+ return yaml.dump({"proxies": allp}, sort_keys=False)
4
417
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
418
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -393,7 +393,7 @@ responsive: {
393
393
  %endif
394
394
  </script>
395
395
 
396
- %if country.lower()!=hconfig(ConfigEnum.country) and has_auto_cdn
396
+ %if has_auto_cdn and hconfig(ConfigEnum.country)!="other" and country.lower()!=hconfig(ConfigEnum.country)
397
397
  {% macro reload() -%}
398
398
  <button onclick='document.location.reload()' class='btn btn-primary'>
399
399
  {{_("Check again")}}