hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev66__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.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,418 @@
|
|
1
|
-
|
2
|
-
|
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\x00\x1d\x07\xa4\xf8\xb6\x94\xe5\xc6?\xfc\xf3\xf0y|\xcb,\x00\x00\x00\x00\x00\x00\x00\x00\x92\xb2\x8b\xc9\xef7{\xf4\xdd\x03\x05\xb9WO\xa6\xb7\x82\xdaOdt\xb7\xbb\x13X\'d\x00B/\xbf\xea\x1a\xbe|\x99\xfe<\x00\x1b\x1e\xf9\xb3\xadh\x87\x7fG\xb4\xfd\x94A\x91\x870 %U\xcf\xf5\xfd\x1e\x0b\x1b\x07]\x88\x83\x86\xdeI8\xfb\x00Ll\x00s1\x9c\x0b\r\xc0\x88+\x0b\x96\x9a\xbc\xc15G\x95\x1aM\xb5\xd6Oh\x8c\xf7P\x87\xd9\x0b\xf1\xb8\xa6Y\xcd\x8d\x9f\xd0,.\xd0\x8f\xb16\xdfT\xa3rs\xea\x94\xb3\xd5)\xb1:\x9e\xd1\xe8\xc3.\xaau\xfa\xde\xd8\xe9#s\xf3AF\xb6{_8y\xdc\xa5m\xa8\xd3\xd3\xce\x10e,bV}\xbf0\xaa%\xecf!\xb8.\xf1\xf4rDYfdXZ\x1f\x9d\xaa\xc9\x12#\x9c\xe7\x85\xbc\xc9\x91\x03\xf0\xcfa\xe0;\x93d\xde\xb2\xea6?\xfar\x1c\xf1 \xc5\x86\xa4\x0f\xad1\x04\x8f\xad\xb7/\x89\x85\xfa2\n_\xb6G\xed\xf4\xf1zh\xda\xae\xadvoto\x97b\x90\xa5\t\xb0\xa5\x87b/\xf6\xf76\xbb\xa9\xb3E6i\xc2\xb6<\x9dN\xdfK\x0f\xf4h#-P\x82\xc7\x18\x90\xf4\x97\xa0\xe5@\xe9\x81\x93\xe6\xbe`7\xbc`\xa4\x03P\x06\x06Nl\xd0l\xc8e\x16\x00\x1dmt\x9b\x88\xef\xb6\x80\x1c\x06a\xa6W\x9c\xdcl\x80\xcb\xb9\x87\\\x96xdl\xf6\x8e\xc6b\x1c\xbf\xff\x97\x14v:H\x15\x1a\t\xcb\x8e\xdd\x02\x95\xe4=\xfcA\xa5\xb8\x9bTK8bz9<\xa6V\xb1f"\x9f\x8e\xf2pNm\xd7H\xb6E\x00\x99\xa8nz\xdd\x14\x91\x06\x03xU\xee\xfc\xbc\xd8\xc0\xfd\x9f\xa7\xcd\x05\xb3R}\xca\r\xec\xfb\x86O\xaa\x8e\xe9\xacUz\xa16\xf8\x13\x88\x06&\xedh\xcbq\x1d\xdc\xa7\xa6f\x02\xac\x97\xee`n`\xb3\xa2\xe1~\xea\x14=\xeak\t\xdbc\x82\x9fq\xf6U\xd6=\xac\xa4\x9b\xe6\x1e\xd3\xb6\xddoC\xb9dU\xfd\xad\x05^\xd2\xc7\x04\x91f\xf2\x95\xdc\x9b\xbd\xfcf:\x13AT|Nr\x17\n\xe16\xa7\x9a\x0b\x9b\xc0\x8e\xd3\x17m\xd5\xa9\xf8\x80%t\x0c\x0f\xc9\xa1\x03\x9bT\x81\xebG(\xde\xa5S\x01)\xb0\xb6Hq\xf3z\x8d\xc3\x98\xd6\x92\rBF\x96\xea\xc3\xd1\xaf\xc0:\xfcJ{\xfd\xd5\x8e\xa7\x83?\x18H\xe4\xa3\x0b!\x03\'Pl9\xfbj\xe1\xddT}\xb8\x93\x00\x82\x8e\xcb\xbe\x85e\xf7\x8c\\G\rW\xbb\xeb\xac\xf3\x18&:\xa0U\x0e\nP\xae|\x00\xb4)\x9d7\xfe\xd6\xeb\x92\xdf\xec\x1dB\x89\xd8\xda!e\x9ay\x8b\xf6\x1e\xe0!t\x10\xa2\x9dM\xbaO\x8f5\xd4\x93ZFM5\xb3t\xa8\xacO\x1fh\xb9\x15\xcb1g\x0e\x89\xaczY+\xbe\x8a\xed\xbd\xbf\xc9\x0c\xdeA6\x00-H\xea\xdfB\xdb\xb8@\xbb\x9a\x1a\x8d\xdd\xa4J]\xb1\xfd|z\x9e\xe0\'\x9e\xad\x83\x98%)!Fd\x8e\xb0\xec\xef\xb6m\xc9l^\x8f8\x8d\xa1\xde\x8d\xbc]\x942\xfd\xdf\xcbu\xb4\x9d\xc8\xc0H\x14Fq\xe5\xfa\x11\x9f\xeb\x9c\xa2\xf3\x10\xb8S\x08B\x1d\xc9t\xcf\xf3\xb3\xfd^o\xa5\xbbQ\x17\xfdJ^\xe7\x16P\xcaW\xfa5\xc6m\x19\xd4\xd7;#\xe2\xa1v\xeb\xa5\xc8\x02\xa4k# \xc2H\x1c\xaaG\x87\xfa\xb6\xd5V*\xc2\xa00R\xa1\xe1\x1e\x17\x04\x8c\xcbp\xb7\xeb\xb5>\xa3\xc2d\xcbk\x12\xebz\xff\xcd\x92\xff\x13\xfe\xfba\xa6\xd3<\xac\x80k\xc1\x94!9\x9aI\xdb\xd5\xee\xd26M|\xad\xaa\xbd\x93#\x9c\x80u+\x1c\xe1$Q\xd9\x90\x19\x0c\xb5>\xef\xcb\x85\x90g\x975\xd9\xca\xd0\x8fV\xf6\xf0\xc1u\x18H\xd6\x7f\xee|qo\x8c\xfc\xdfz\x01p\xbdcc\xa3\xfd8\xf3\xf1\x10a\xf4\xe3\xf2\xee\x94vde\x1c?<\xe1<lyy\xee\x8fo\x0eZ\x8aEm!*O\x9a\x8e(\xb9\xf3\x8e\xff6l\x98\xa1\xf7\x8f\'q1\xc4z\x13`\xf9\'~;\xfcI\x0c\x13\xf9\x17\x97Qm\xef\xfbDm\xd9\x1dcp\x89\x1d\xd6dYyO\xb4\x908\xd2\x00m\x01\xad\x1c\xb3]\x15YC\xf4y\xfd\xd4_\x9b\x17c3#j\xadP*\xc0\x08\x883\x965\x13\xc7\xb0\x1d-\x89\xbdE\x1ckM\xd6D\x86?v\x16-\xd10\xff\x9f\x84e2k9@\xdc\xdd"\xb9\x9fBS\xe9B,c\x7f\xa1\xe6]e\xacR\xcc\x12\xa4\xcf9:@\xb1\xdb\x9c\xf2\x9c{i]\xf85\xa1\xbd~\xd8\x11g\xde\x0fa\xe0\x8bE\x82\xaf\xee\xa9]Gly\xc4\xb6\xac\xf4\x7f\x8cAB\x9a\xb5\x13\x1bj\xc4\xf6=\xb3\xf4dl@\xc6\x8f\x83\xa6\xb9\xc4eZ@\xfe\xcd}\x9a\xab\xb3\xf6\xf9;\xe8r\xa5\x0b\xa3\x1d\xe8A\xde\xef\x00\x961\xbc{\xbe\xe8%\x16\xa5c\x14\x8f\xad\xd3\x85o\xa4\xec#\x12\xd6\xd8\x1a\x96V\xbcm\xe1\xa1\xa7Z\xabm\xffv\x0e\xf0\'RI\x10\xdd\xd0\xe2e\xa4\x05\xfa\xed\xfaQ\r\n\xda\x17k\xa49\x9c\xd6u\x926\x16V\xf74\xbb\x9b(\xfd\x8cPB\xff\x10T#\x1b\x1e[\xb3\xa3\x89\xd1)\x81\x15\xf9\xd7N\xa7\x8c^\xe2\x0bN\x1d\x043lx\xc1\x1a\xbe4\xb1\xec\x0cqo\xe4\xdc\xf4\xf8\xeb\xb4\xc9\x86\x98+Nk\xaa\xd2\xee\x99\x12\x1cT%\xb6\xac\xdd\xb1\'\xd8\x7f\x9fa\xb4\x16\xf6\xdc\xd8\xa9\xf9u\rk\x94\xcb\xaaUFX\xb5\xc7\x1c\xe8\xf5,\xb9\xa7eO5\xe5\'\x1d\x15\x01&=\x95\xb6\xa2e\xf7L\xd8\xddn\xf5jj\xdcS\xf1Zc\xf9\x90\xa5"\x80p\xe3c\xa6\x80\x10\x0f\xa6\x08b{r\x19\xaa\xe0\xe1\xdc\xa0\x8f\x8e\xbb\xfb`o\xb5\x0ct\xb0}\xd0l\xdd\x9a7\xc0S\x15\xfe\xccb>\xa5\xe0\xab\xfbW\xd4P\xa1\x01\xfdX\xe3\x837B\xd4\xb3\x85k(%\x07g\x05\xb9tf\xafJ\xb6\r\xfb\t\x1d\x11\xec\xc1\x95P\xac\x96\x8ft\x8e\x06\xdb\x0b\xbf\xb0)\xd2\xdf\xaf`\xee-\t`\xa9C5\xa4\x8b\xa8(\x93\xb8\xe5\xb4}l\x1e\xd7\xff\xc9\x9d\x1aj\x1f\xe2\x92\xec\x9d\x07V4\xd3\x99K(\xa54\x1a\x08j\xae\xed\x84\xb7\x07/QY\x87D%\xbb^f\x1d\xf0\x0b\x07\x1e\xb69\x1b\xaeP0\x02BVE\x04\x1b\xf2(q\x9d\x83+\xa2# gH);\xa9\x9d\xf2\x14\x89\xad\x8c^\xe8o\xfc\x88\xdc/\x1a\xfe=\xf8UI\x1e*\x0b\x80\xb6\xe79\xcf;q^\xdd\x0b\xa3"j\xebf\x12\x07o-\xf3\xc1\xd2\xe9\x83\xd6\xc1S\xed3%\xcb\xe9\xcd\xc7\x917\xea\x86\xa3\x1a#%7\xec\x8eD\xa3\x92\xd9$\x00$/\xfa\xbaO}r\xe0\x103?\n\xd1\xb1\xae\x82^\x08\xff\xdc\xe6\xe7\x9fe\x13\xd0e\x8a\xa5\xbb\xf4t:%\xe03\xd5}z\x9e\xb7\xb4.\xfe\xb4\xd1\x1e\xfc\xe8O\xb8U5\x95{B\x88L@\xa1X\x11\x8e\xb1!\xa6\x84\x19\xdaF\xcc\xc7\xbeF<Ny\x05!&Jn\rI\x13\x915\x88f\xc4zA{\xfa\x85Sv\x17Y\xff\xe8\x90\xed\xe1\xbc\xba\n\xa9\x17*\x98QU\\\x84Z\xb3\xf9\x80\x96\x92\xd3\xf6=\x8e\x96\xb7\xfdE\xc0\x06]B@\xa7M\xcc\xa0d\x15I\xe0\xbf\x97Q\xe5\x80:\x02\xbd\xa3=\xdaV%\x00\x10\xc2\xde\xdc\xf6+A\xa9\xae\xb39\x03f ?\xe4\x84,\xba\x18\xd5=\x18\x1b\xc6\x0e\xf8\x98\xe7\xda\x94d\x0fD\x8e\xa1\x82\xdfJF\x07\xb3`\xd9;y\xc8\xbaU\xe4=1\x8dzBi\xb9\x9e \x9f\x91\x98\xf5f\x9eQ\xe5\xbc\xa0e\xd3\x9d`\x9a\xe0\x06\xdd\xf9\xce4\xe5\x02\t\xc8^\xa7J\xc6h;\xb3\x13\xe7y"\xab\xe5\xdf\x83\xfb\r]\xb7\x05\x1d\x9d\xa0\x89\xa7MJMUM\xbb\xe1/w4\x87\xbb\n\x8cA\xc9\xd9\xc6\xc4\x9fW^L\xceLA\xd6\x9d\x08\xdd\xfa\xc0\xc2\'\xed\xac5s\xc7\xb5"\x86\xa7\xe2]\r\xc4\xe8\xdc\xe0\xcd\xdbCf\xf0FC\rX:\xf1\xfa\x03\xab3(\x0b\xe5\xf0\x96#\xf0"W\x85\tJEA|\xcbl`\x80\xa66u\x00\xdc\xe4\x98\x8cg\xea\t\xab\xbbv\x8a"7\xbc\xfa\x1b\xf0\xeb\x06\xe7\xed\x00\xddK\xa4\xdf\xec\x83C\xbf,\x95\xf8&\x00\x92\xce.\x93L\xdd\\K\xd0\x0e\xf83g~U\xc6\xe9\xff\xa5eH\xc2\xb9\xd8\xb5l\x8d#\xc3\xde\xaa\xe7\xe0JP8\xe8y{\xe5\xbc\x83w\xc0I\xee\xa2\xecj\xaa\xc8\xc6\x87O{r\xc5o\x93\xb9\xeb>)*\x16Z\x11V\x80\xd3 \xd1\t\x06\x03\x84\x9b\xd9\xc7k\xdcS\x01\xd2w\xd4X\x97\x19d\xc3P\xc7\xea\xf7N%\xf4\xd8\xd3\xd6@5\x1d\xe4 \xefd\xf4\xa30!&\xabK\x97m\xe5\x0b\xa3\xb8\x04m\xce\xed\xf0\xac\x18i\xec\xd4\xc4Nd\x9e\x1e\x8b[\x19zy\xfb<\xe7\xe3:\xc6a\xca\xf4_\xf1\xa7S+ X\rZT\xa5\x06@\xdc\xbd\xa0k~\x17\x05|\x86)\x9a\xd3\xa7\xf5\x97\x11\x99\x14\xb5\xd2\x95;\xfa3\xb8\xfe\xe9\xbb\xb35\x12n\x98\xea\x1a\xd8\x16sl~E\xad\xe3\xb2`{\xd2\x13\x81\xa4\x00??[}p\xdf\x9f\x0c\xe9^\xeb,]m\n)\xfa\xf7\xbd\xb5Uy$\xa5!P\x9a\xf1_\xa3\xf4\xccFm~\x92\x94CPw\x15S\xd1\xca\xad\xc9?\x10$3RC5Nw\xc9a\x9b\xf6\x18@K\xaa\xa3dL\xba\'}\xf7\xe3\xe5\xc1\xa5+\xa9d\xe8>T\x8e\xa2\xa9\xd62\x0cg\x7fSZuY\x93u\xe2\xcb\xe1>\xb3t\xbcepW\xbb\xee\x07\xcb]\xea\xc9\xac\x019%\x8cG\xe8\xc2\xb3\x14\xd1\x81\x93\xb46\x14\x16\x1d\x92M`\x12\xe5\xdb\xd3\xd8\x82\x1d\x1byA=\x08}6\xbf\x89(\xc3\r%\xd6MZ5\xc4r7U\xf0\xa4\xb7e\x9cE\xe4\xf2\x18B\x8e`\x81\xc5\xdf\xd6\x8b\xde\xcd\x9d\xf3\xa2\x03\xe4\x86\x01\xd3\xa7\x91\xa1\xe60^\x95F\n\x8c\xb1\xe6\xb3\xb5\xe9K\xa0\x02\xac\xf8\te\xac\xb2\x05\x1c\x1d\xe83q9\xed\xb2\x06@\x966\xa4(\xb1\x80\xd8\x15`g[IV\xf2<\xabk\x8b\xbd9\xf4\xae\xa1]\xd3|-\x00\xd4\x93\x12ld\xb7-\x96\xf2\x8d)d\xa2}\xb2\x90\x85o\xf4]w\xa6\x12,\xd5\xe6\x89\x7f<I^\xbc\x05":\x04\x9e\xe8\xa8\xf2\x07\xa8MX\x84\xd3\x1d\x0c\xc2\xc7\xa9\x15\xa0r\xef\x89\xaa\xce1\xa3\xdc?\xac\xf1\x06_\xcdE\xe6\x88\x81|\x00\xf5D\xc2\n\xaf\xbf\x1c=?\xe4\xe1\xae\xd3\xcc\x0b\x8e>\xfd\x9f\xd0\x80\x00\xc2\xd8.Aqmas"\x9f}\xa4\x15\x04\x87\x06\x85\tl\xb8[t\xcda\xff\x91\xdcFr \x17@\xcf\xa4V}\xfbA\x18U\xa49^D\x99"\xa2\x189\xbb\xb1}\xe5\xfe[\xf5Pg\x96A\r\xb0\xbc\xef\xc8[$\xf3B\xd6a\xee\xbd\x07\xaa\x98\x85\xd4\xf7\xb7\xe2\xc5u\x04\xd4\xff\xaaL\x8a\x05;Z\x11\xed\xfc\'\xf5~J\x0ctX\xc9\xc2\xb7\x0e\x0b\xce\x16"!-\xc4l\x17\x95\x12>\xc0q\xe4M\xfc\x88\x81\xb9"5=*\x04\x97\xb8u\xef\xcdd@\x8a\xad8I\xe1\x154.\x9a\x01\xf6\xd8%K^j-J\xca+H\x83\n\xc7R\xcf\xaa\xe7^\x1c\xcd\xa7M\x18\xc9\xde\x8f\xc2\xab\x8c\xa1=\xa4f\xb0\xa7\xa8;\x04\xa3\'\xb3]\x89\x10\xdc\x02DK\xc9;2\xc4<\xc1\x11m\x03\x96@b^2\xd9"[\xa2\xf3"\xf5k\xe2\xe9\x86v\xd3\x95j\x06\xcd\x02v\xe5\xddp\x0b\xab\'>$\xc35\x1d=\xb4>]\x170\x19\xc9>5m\x9fh\xd6\xc1\xfe\x0cD\xbe^\x12m\xb8\x7fn\xeeI\xf5\x02\xb0\xb6\xbc\xf8u\x81K\x0b\xa9b\x02I\xde\xeek\x7f\xc7uDJ\x0b\xa9=\x1174\t\xb1\x01\xd8\xc03\x10g\xcc\xae\x16Hyd\xa2\x16\xf3\xb2E\x0c3wx\x0b%\xf7w\xefY\x030}SQ\xa1[k\xbd \x88\x11\xc0\x81\xa1B\xd1\xee\xbc\r1\x97\x16\xc2\x08*\xbe\xde\xdeA\x16<R\xcc\xd9\xbf\xc2\x0b\x10\xec\x17\xa1[z\xe7 zf\xba\xda3\xfb\xea\x9c-\x1f\xd36\xba \xf7c\xb4\x0f\xe1\x13\xc2\x92\x92\x89\xaf\xa6\xa7l\x91\xac\x1f\xc5\x08\t\xa10\xf9\xc1\xcc\x9cO\x90\xba\n=\xc9+\x94F\x19\xfe\xcfo\n\x9d\x8d\xc1/T\xc1e2p1u)\xc8\xe9\xf0\x1f\xaf\x81K\xfb\x1f\xd4\xf3@\xc0\xc0\'x\x80\xf7c\xbcQ\xb3k\x93\xc3\xed\x9c\x0c\x01T\xe8BS5\xb6\x9c\x18\xb5\xb8\xc0\rsD\xc59\xf2\x94!(\xdd\xd3\xd3T\xbdD\x98@c\x10;\xa6s]Z\xec\x12H?\x8b\xe15eR\xc8\x83/t\xe6|ne(\xcb4|\xba\x9b&_,\x91\x00\xc1M\xe1j\r=\xe2\x14\xae\xfe\xe7&\x94\xfd\x98\x89\xeb\x87\xd6_\x01?\xa6H\xbe+&{N=\xda\xd5/\xdc\xc5%-\xdb\xe6\x18\xf13\x8d\x8c\xe6ug\xb2\x8f<j\x89\xe5\x86\xd7\x91\xa5Z\x82\xb9\x9f\xcf\xfc:\xea-y\xd4\xe2)\x92\x04\x10\xe1t\x0e\xef\x8a%-|\xec\x7f\x96\xe4\xc7v\xbe"JpZ\xde\xda\xbff\x8a\xac\xc7\xb6i\xb6\xe1\xf6\x9a\xa4\xf1\xc1\x13\xa0R\xff\x08gH\xfa\xdb\x18\xc8-\x10\xb0\xa1\xc2>k\xa6\x0f\xd9\xa9c\x19z\xe2;\xeb\x88\xeb\x16\x01\x1a\xe9\xca\xc1j\xc1\xeb\xcd\xef\x93\xe7L\xe6@\xa99\xb7\x05A\xf9@Tn{\x96\xde\xc1\xf8\xa1K\xda\xe7\xe8\xd2\xf3\xeb\xde\x0f\xd4!h\x9d\x88\xe1"\xee\xaa\xa2X1\rD\xed\x17\x86<6[x$\xb8w\x015\x12\xb6\xf1\x08\x15\xa0\x95\xad\xb05\x87Jn\\s\xa5\xc7\x0b"s\x8a@\xe2\xf1\xa5\x08\xd7\xdb\xfcI!\x7fD\xfe\xe7\x9aZ\xfc\xa6g\x96\xa3\xb0\xc5\x0c\x00M9S\x81 \x06|\xefgH\x97\x8c\xee77\xe6S\x01\x85B\x8f\xbcS[\x05\xbb\xc7\xf3\xfa#\x1a\xdau\xc8\xc6&"\xd9\xa5K\xbb\x92\x0ba\x88\x89\xa2\xa7\x9e\xc7\x06\xe1o\xcb\x06j\xfbVJ\x89\x8f\xf0\xdfs+\xef\xba\x86\xaa\xa8\xdc|3\x11\x11\xc32.\x92r\n\xa4\xa7\x8eV\xe17Gu\x8d\x9e\xfd6\x1aK\xf0]D\xbe\xc2\xfb\xf9\xfc\xa2LF\xda.\x977\xd7\xa2\x9b\xec\xf8\x04ju\xe7n\x8e\xdf\xd4-\xe8B\x16\xda\xa7\xe6c/\xcaRP\x14Ex\xb0h\xa5?Y\x98q\xe6n\xa5\xbd\xfe#\xd4U\xad_D\x9f\x82=\xff\xc5^p\xee\xd4B^Z\xd0\x8b\x11j\xd8jC,$\xbdn\xbfT\t\xedP\xe9I(2@|S\x8dHv\xef)s"\x80I\x1f\x8a\xa2"J\x9e("\xf5Vf\xc4\xac7\x83=u\xc3\xcd\x13-\xc2\xe6\xad>\x1fP0zpA\x1f>\x1c\xba\xb0\xd57x\xc1w\x12[\x9dy\xf2\xf25*\xce\xebGID\x00\x10\x87\xbf\x83\xd3A/!\x11 hsf \xffe$t\xfb\xfa\xf7\x7f%\xe5_\xa5\x98I\xec{\x1f\x9e\xe1\\\x87MK\x08\x96\x0b\xc1\xf0\xcb\xf2\xe79WoB\x80\x88\x04\xdf\x7f\x02u")\xa5\x82\x17Yg\xa5\xa63F\x86\xde/\xbaP\x81^\r\x93F\x8b\xabF\x88\xaf\x84\x8cB\xe5."\x16y\x01^@\x88[\x00\x948\x83m\x05\xdfk\xf0v\xd0\xc39\xf5\x1b\x92\xe6\xfb)(\xceo\xfa\x05f\xafaTO\xe7\x86\x13C\x82\xc9\x0fo/\xe9\x07>\\\xf3\xe3\xb4\x9eu\xe0\x07E\xfe\x13\xa4\\\n\x902\xf4\xa9\xc8|{\xe6\x91\xf6P\xbc3\xddR@w\xe9C\xb3kB=L\x1a\xf8Q\xeb\xe2\xd6\x84o/\xe3\x82(\xc9\xaa\x98(\xc0\x14J\xa9\x1e\x92\xfc\xff\x14\x93\x06\xfdh\x9d\xb6\xb9{w\x0b\xc2\x04\xe2\xa0\xff\x0c\x7f\xd6`\xf3\xba\x9c\x87\xd2\xc7{\xa7\xcc\xb1\xdf\xba\xd1\xc6j\xe3\x8d\x83\x02\xff\xdf\xd9I\x9b\xcf\xbej\x08\x926\xe7\xfe}\xdf)\xbbt\x17\x94\xdba\x9d\xa7-\x02<\xc2\xb2\xb6\xf3\xd4\x15\xe3\x87\xecf\xc2B\xa4\xa4\x98%!(PA\xd5\xe2\x9f\xfb\xc3\xd3k3#\x9afM\x8a?L\xa3\n\x9cL\x1a\xdc\xa0\xd83\x00O\x9c2\xcaw\x18\xe4{\x9f3\x8ac\xc9r\xf9\xdb\xbc\x04%\xb6\xaa\xa8\xfa\x15\xc5\xb2\xb2\x9a&\xbb\xe1\xd7=\x03?\x89ns1\xf7;\rZ!\xf7\xfb1\xbb\xbbP\xc9F:\xc7\x92X,r\xf9\x83\xff9\'(\x15\xb7X\x98mF\xb3\x03\xacu/\x1f\n.\xb3\xe6\x16Yl\x14[V\x03\x154\x9b|!{\xe33\xe7|dj3p\xa3\xfb6r\x18\x176\x08\xf20\x97e\xdf\xf9`\xd5\xb1\x92\xf9\xcea\xdcm~*\xd0\xee0?\x96\x9dB7\xdf\xf3\xb2\xc9\x89\xe7\xa4\xb3\xee\xdd{\x12&4\xa1\xba\t\xca\xd2\x9b\xafq!\xa7\xbb\xdd\xfd\xd1\xa1\xe8A\x01\xc8\xb8\xc1\xcbL\x9c-\xa4\xb0\x10\x182\x82Ne\xa5\x87\xc4\x84(\xa7\x13X\xd7zO\x94\xa3BYm\xb0\xffc\x12$-\xfe\xbd\xba\xc1y\x90\xec\xe0\x02>\xcdz\xe2H\xf2\xe1;\xcc\x01B\xbaI\xf7\xb9k\xa7\xde,\x19\xb8O$Q=w\x1d\xed\xefS\xa0\xb1\x1e\xf7\xfcpya\xda\xb1\x13\xb5\xd0X\xf0\x1f1|\xe4C\xc9M#%\xbf\xc2\xbc\x1b\xdb71\x9fP\x9e\xba\\\x12\xe6\x9e\xe5\xdb\xc9p\xac_\xbd\x10\xa6\xdb\x9a%s\x97\x17h\x88Z\x00\xa1s\xd2\x92\xd1\x80\xec\x7fL\x9bYW\xfar\xec\x14k$#Q\x14@\xaeUS\xfc\x08\x95J=C\xf2UE\x83\x18\xb1E\xf24u8\xd0L\x80nj\xed\xc66\x06\xb3R\x02N\xe2\xedWM+\n\xe6\x10\xc9\x81\x10\xf1o\x1e?P\x8c\x14\x06\xa5\x07\x0b\xbdLkj\xaf\x9d\x87\xdcG\xa8\xa2\xef9\'\xec\xaf\x82\xd1\xd9yL\x94pJ-\xa2\x11\xb5d0fu\x8f\xa1\xea\xcb\xf5V\xfe\xb9h5\xb14=\x80\x12\xbe\xb2\xaa\xd8Z\xc4\xf0\t\x12\xe4\x13}\x10H)\x92\xccD4\x1a\x04\xc0v\xf4>\rb\x079t\xa8~\xa1\xb7\x9b\x0b\x1e3$*\x0e\xbfd\x04\x9f\xbe\xe8\xc3&\x00\xc5\x19X08\xc9\xe3\xac\x02"\x0b\xe4\xdc\xfe\x9d\xf3i4\xd3\xbdC\x9b\xd8F\xd3/\\\xa8\xde\t\xea]\xc5\xedlc\x92\x0e\x81\xecV\xf4\xc4\x8a\xa6\xab\x8b+lp\xd0\xf2\xb8?.u\xaa/\xd7\xfd7\xe0\x04\x0e$\xe2\xb6\xcf\xa4\xf4\xd2C*\x826\xbb\x1c\xfe\xb4\xec6\x1e\x85\xc5\xd8\xc3$\x9a\x19\x86\xee\xb6\xa9\xfc\x0fC)s\xb2\xd3\x9a(A\x9e#\xd9\xe3sr"8)\x1c\x9c\x99\'\xb9n\xe7\x02c\x06\x16\xaa\xeb\xe2\xab\x1e\x05\x8e*Q\x93O\x10\x11@\x88*\xc6z\xed\x02$0\x97!\x1e6\xe06\xef\x90\'\xb0-g;\\-\xf5~l\x02\x02<i\x8dL\n\x00AU\'\xcc\x89\xc4\xa7\xffD\x97\x1f\xaa\xd9\xb4\x12\x803y\x0eU\xf7(\\?\xfb\x94i\x85g\xab\xdf%7\x03h\xc5\x83\xee\x99`\xe9\x18\x1a\xf8%\xa9#\xecp \xd8\xca5\x88p\xb3s\x9b\xeb\xa7\x80D\xa4\xac\xda\x8a/\xaa\xac\x11\xa7\x1e\x1d\xaaDQ\xca\x973\x1c\x00g\x16\xf7\x9c\x90\x889\xdb\xf1\xd9v\xd4\x8c\xc8\x89\xb1\xb7\r<!\x15\xccJ\xf6J\x07*\xfa\xf8\xac\xd7\x06\xedOs\xc4\x1c\x80v\xdb\x03\xc5\x9f\xbcy\xc6@`g\xb9s\xf6T\x88L!\xaeDi\xf1D\xa1G\xd8\x81\xf4\xc2\xdb*v\xe3\xbc\xf0\x7f\x9aQ\x0e\xb1y\x9f\xa3y\xfd\x1e\x16{y\'\xb7\xbf2\x80\xde\x838\xb4\xc2/\xdb \xc8\xf7\x99\xd0\x19u\xcdI_!z\xb7~\xe7\xa3\xd0\xbc~\xe8\xbb\xd8\xe2\x91W\x14^1\xf5\xf3\xb3w\xff:y\x03\xa7\xfaH\x07D\xbd\xba"\x1ar\xb1\xdfSk\xd1\xad\x0c@&\x96\x96\xff\xcb\xa5N\xc0\xb1\xc7\xef\xc5\xa0\xd5\xc38;\xc4\xe5Uo|<\x11\x98\xfa#\xafF~\x9b\x94\xc4\xda\xc7\xd9\x8fl\x8c\xad\x89\xff\x8b\x91\xe2\x8c\xca2@\r\xcb/K4\xda\x1f\xb5-\x16\xcf\x9f\xe7#D\x08\xcc\x17*#Z\xf8\x07\n\xbd\x19\xd9\xf3d\x8b\x8b\xdehC\x9fA\xddKV\xa6\xeb\xfd]\xc6o\xe0\x1c\xbe\x82\x8f\x8f/\x85b\xe0\xa3\xef\xb9s^\xd3\x11\x91\n\xae\xdal\xe16\xb7_D\x94\x87\xcc\x04[8\xf4k?\x08\x14\x93\x99\xde\x91\xdf\x98\x8e\xf7i\x9d\x00!%1\xf6!$5PY\xfd\xaa\xed\x1c\xf8\xebT\xe2\xa7\xcc\x96?Y-\x98\xc3\xc2\x0cR\xb37\xda\xc7w\x9a\xf4\x99\x8e!\xbd\xe1\xb0\xabi\xd5\x07\x81t\x15\xf8\xe1\x0e\x807\xf7@\xb3y\xb6\xe5\x9d\x91\xe9\x13\xd0\xdetC< \x8b-ck\xc8X\x16\xf3^)\xd2\xd1\xba\x87\x82\xb1v\xdd\xfb\xa9\x10\xe1\xec\x8b\x8d\xdb^\xe2\xe9\x03\x05\xc14\xf3\x87\xaa\xc5P\\\x9c\xe9\x9f\xe7<v\xe90\x99HC\x93\xd3gl\xcb\x15\xb6z;\xb3{W\xa2\xf9\xf2\xc50\xb3:N\x1b\x04x\xc8{\x97\x1a2\xae\xe4\x02SDBY|\xf6\\\x96\x16<\xb4T\xc2\x9a\xdd\xc2\xc3\xe6\xa3n\x10m\xf0\xe6\xc5 c.\x8d\xb6\xbe\xbe\xfe\xa8=/\xd5\x84NJ\xcaQ;KX\x1a \x06$\xa1\x86<e\x82\xed\x01O\xc6]\x15Bc?\xf8\xf2\xb3\xf6\xd8\xd2\xfe\x95\xb2\xf7V]\xf4\x0c\xe7]IU#F\x0f\x995\x15\x85u!\xd9\xe9\xd8\t[J\xd2\xf2\x01|b\xeb\xb2\xbc5\n\xd2B.Y\x89\x1f\x96ES\xc8\\\x16\\\\\x85cc\x17# \x99\xcc\xae\xe1\xcf\x99\xa2=\xdd\xa0\xe7#O0\xe4\xa6KX\xef\x96\x0c\x00\xe3\x91E\xb7\x99\xe5\xaa\xea\x06\xe3\x95\xfa ]\xa5\x947\x81A#\xf9Q\xcd\xb0kz\xda5h\xba\x9ej\x16\x1e\xc6\x1f.\x8b\xd3,I@\x90\xf8\x869;Ct\xa1T\xb5P\x90\x95g\x84*\xe6\x9e\x83\\\x0e\x1fQ\xb9#\xea\x0e\x15\x1ck\xdb\xd0\x9c((\xb4\x1d\xbb]\xda\x1b\x18\x97\xdb\xe3FN\xbbxP@\xc7,qm\x8f;s\xd5\x11\x1d4\xd8`\x82\x9b\x17\xc7\x8f\x86\x15q\x9cm\xa6\xa6\xfd\x16\xc8\xe1\xc5\xfb\xe6\xfd\xbbA9^\x1e\x1f\x1aI[\xa7\x95F>\x93\xf9\xe5\xca\x84\xba/\xdb\x00?j\xf1sw5[x\xcf;\xda\xc6\xca\x01p\xe4\x11\x11#\x88\xa5\x86\\!\xe5I\xc1\x95*bR\xc1Q\xb0\xa8\xde\xbb<\xb5\x90`k2E\xf3\xe7\xa7\xdc1?\x9b\x9e8\xbc.\x11n\x13\xc7\x0b\x93\xff4"\x04\xf6\x08X\x99\x8b\x90\x08\xbdQg\x1d[\x87C\x95\xfe\x7f;\xb4\xed\x926H\xcc-\xd1Sh\x9b\rb\xbf\xeb\xd7\xae\xbf\x19\x15"\xfcI{\xc4esd`t2z\xb06?_\xe0\xfd\xbf\xd2\xade\xed\x8eSl\x9d\xd6\xf4\xd4)[\x8d\x86Q\xa7T\xdf\xb4?\xea\'\xd4\xf9y\x8e\xb9\xe62\xcf\xe4\x81\x9e(\xe7\x163;\x84\x1d\\\ttc\xf7u\xcb\xb5_\n\x9e\r\xcd\x13\x13z\x86\xff\x02tO\x12rb\x93]\xc7\x8b\xaf)\xac\x06\x9b\xdew\xd8\x18Ms\x0en\xe5\x8eV\xcf\xe1\xd9\xf8\xf1M}\xcb];T\xf4/\x87.\xe5\xb0\xdfi\xea\xa0m6jM\xfdo\xf9#n,\x06"\xb2Ty\xcf\xe8Kg^hN\xcb\xba\xbe@!v[\x81yx\x03\xceB\x83;\x0eT\xc9\xdd\xcfW\xf0?\xd6\x8e"\xb0\xda\x95b\xb4u\'\xe1\xaf\x86S\xa5\xac K\xb5\xc8\xb3\xbf\x00\x97\x07\x0e\xcb\x98#:8\x82\x99\x08O\x83\xa7\xe9\x1e\xc7-\x08\xdc\x10 \xd7\xab\x07\x93\xb4;\xf0KqX\xf2x\xab\xfe\xe1\xdd\xe0\x1a!o:8s\xe0\x05f\xec\x11$K\xfaH\xddl\x06D\x83\'3\x8eco,1\xa3\xedrp\xbe\xc9\x80</H\x00/^\x1e\xb6<\xc2\xc5=\xcd\xf1m\x9a\x98\x86\x01\x0c\xe5,\xdbM\xfd?A\xb0j\xf1\xef\xd3rJ\x97\xa7\x0cA\xe1^\xb3!T\xfc\x197C\xe3\xab\x11).\xba\x9cQ@>N\xeb[\x0e\x06W)\x01\x9b\x99y\xbb\xbe2\xe0\xbf\xa7\x16HpWA\x8b\xeb\xcf \xf8\xc5.\xfbD\xb2\x17\x82\x87c\xb4G@\x0b\xa0\xe6\x80\xf7\x9e\xfd\x88\xfe\x8et(@\x00[\x14\x10\xa8\xf30%\x84\xda>\xe5r\xa6\xf0o\xf4\x1e\xfc\xaa#\xc3\xcd,>:-.\xd9\x18F\xa6v\x8d\xa4\xa2\xb4\xd7\xf6\xdf\x8cB\x94?\xcb\xf0ZX\x91\xd5 \n\xf8s\x9f\x87\x9d\xfe\xaepB\\\xd4\xdd\xc7\xb3\x13\x1b\xc5\xce2\xbd\x1ce\x7f0\xfb\x93\xf1R\xc9z\x83D\xf0\x17\xe4;\x0c,<\x12~\xa1d\xa1\xbe\xf3S\\\xafm\x1aF\x80k\x07\xfc\x14c\xca\xdbjT\x8d=\x82h\x9f\xcf\xa0\n{*\x00\xf2\xa2\x1c\xf3R\x86\x13\xbf\x84(\x01\xaa\xd1\xfb*~\xf9\x9d\xd1\xbe@\xa9\xb5ge\x10\xc8d4\xcc\x92)?0I\x02\xdcC\xce\x99s\x90\xbaA\xb3\x90\x1f\xc7M\xd9\xd0\x1f\'\xe5pX\x8f/\xffX\x92\x03E\xc2\xe2\xdeL\xe0yI\xc1\x81\xcb\x07\x01I\x83\xaa\xf5&\x86\x10\x12\x9f\xeaZ\xab\x07\x96\r\xe2\xf1d\xe5iU\xfc\xd76\xdaG\x15\xb4\x88\xf5\x015(\xa6\x07\xd4\xae\xeb\xa9\xb5"=`r_\xa8_\xa2\x17J\tW\xca\x18\x87\xc4\xbc\x9c\xd0QP\x0f)\x10Hu\xael\x9a\xd7\xc9\xdd\xf6\xed\x12\xec-\xf2\xddM\x82\xebD\x19PgN-\\\xed\xd26\xe7\x80?6\xf2\x96|T\x1c\xed\x1a\xa6%\xc0M\xb6\xeb\xc1\xc3\xf5\x13\xb8\xa3 \xf1\x01D\x1a\xc3\xc1Iv\x1e`\x15!\xcfr\x81\xeb\xee\xf1\xa9\x7f\xf8-R\xe6\xbc\x8f\x05l\xcc\xc8x?\x8d\x97\xc8\xe6\x8d\x98\xd54ZG\xf6\x07\x8d\x17\xbb\xf4\x15\xe9\x14\x17;\x8d\xae\xf0|\x83:u\x8d/\xbd\x03\nA\xf5\xc7E\xf6N^\x8b]](sL\xca\x91\xee\xad\x07\x0cBl\xac\x11Z\x7f\xf5\x0b\xb9*\x04C\x004R\xac\xd4\xc9\'\x1d^\x9b\xaf\xd1\x0ec\xc2+\xb5\xdd\x80o\xb2\xff\xc7\xf5\xd5\x93\xbb\r\x84\x9b\xf7\xf7\xe2;\x17\x1fM\xc0\xa5\x1b\xbf\x8b\x97;Z\n6w\x8e\x11\xa6\xfb\xe3\t\x0e/\xa6\x0c2\xbb8\x87\xc9\xa2\x1a$a\x19\x89j\xcf\x13\xf2\x9a5\xdc\xfe\xef1\x8f\xc0\xc2\xe84\x90i\xd2[\xa6\xb8\xf0\xe2`\x95\xc6\xdb\xb9Ykl9\xf2Q\xfb\xf58b\xc5\xb9B\x91\xc0\xb1\xff/}\xc4\x17,\'\xe4\x0c0\xf5O\x9b8ni\xb8+\xc9\xdc\xf29!\xa2\x14\xe94\xa7N\xa1\x9b"q8\x99\xcf\xdb\xb2\x08\x10\xf2FuX4sF\xea$:\x19\x0c\xc4\xe1\x90Y\xe6\xb5\x02\x12\x00\xe1\xd4\xf2\xbc\xcb\xf6\r\xc0\xf8\xff\x1a\x9f]\xd98\xad\xfb\x1e\xb1\xa1\x03\xec*t\xcc\xd3\x13\x1b]\xcbx\x1e\xf1T\xa7<\x94|2\xcd\xeb\xa5@Sk)\xb3n\x8b\x8d\x13;\xbf\xd6\xfd\x19\x8a\x9c3\x8d\x15\xdf^\x8b\x03\x86\x10\xa3!3\x9awG\x10\xc4\xf8\xe6}\xe9\x1e:I\xb4\x03\xd2\x89z\xd7&\x95\xe7\\\n\x0f\x95i\xf8ny9\xde%\x80}X,\'$\x83l\x9b\x1b\x01\xf9\tja\xa2\xc8-\xb2_s\xb8\xb4\x11T\x0b\xae\x95\xa3\xe9\x00\x81\xd7Z\x0e\x15)\'\xb3\xab\x9e;^$\xb0\xba\x9d<~1\xf5V\x08o\xe9\xd5\xa3ys\xe9\x95\xea*og\xcczX\xbe?\x0c\x94\xb1\x84\xe79\x17\x9c\x90\xdcn\xab\xe4?\xa4\xbbjas9E\x17\xa6\xe8$\xf7\xa8\xe4\x8e\x85]\xb2\x96sp\xd2&i\xee<\x02k\\W\x0f\n\x05t2\xafo\x0fC\x97N"\x94\x9e\xdde\xba\xf4\xd4\x95x\x94\x86r(\xd2\x10\x02\x1c\xea\x98A\x15\x9f\xc3u\x87C\x92@\xffYe\xf8|\x97\xe2<PDj\x06@\x85\xdeg\x11\xd4 w\x00\xd7\x1f\x8b\xe9\x9e6R0\x04\xeb~\xc9\xd3\xf2\xb5\x83\xaa\x97\xb4\t-&2\xc3\xb40Tx\xad\x92\x00\xd2\x8c\x19\xfc\xac\x95\x1d\x8e\xa2\xa2"\xc16g\x00\x0c6\x9cC\xbc\xd5\xf5$M\xe5\xe8\xf9\xd9Ur\x00S\xf6\xb6h\xbc\x8ep1\x94\x17}\xbfi\x8b\x18\xc8\x08\xd6\xe8r\xfa\x16\x80c;v\x06\x92\xcd\xc4\xa2\x19"\xaf\x84\xa9@\xaf#v\xc6\xcf\xdb\xe1\x0eg?\xddt\xa3\x9dFL>a\x13EA\xc5\xdd>\x15\x08+?M\xc2csP\x84\xba\xb0\x83^\xa9\xed0K\x93\x03\xc4\xdb"+\x11\x8b\xea\xb0\xfbH5F\xbf%\x823\x95\t\xe7>\xcf\x04\xdaZ\x8a|\x0b\xbf)u>t\xc3\x98\xd2 P\xb9\xf3\x05\xfb\xf2\x80\xaa\x7f&_r\xe4\x0c\x0c\x1a\xa1s\xbae\xe9\xdbfp\x82e;\x05\xcd\xaa\xd6\xe9\r>O<\xce\x93\xc4\xb5\xc2\x16pg\xa6\x17\xaf\xb2\xb6\xf2\xd2t\xfb?0j\xd2\x01\x905\xcfJ\xaa\x87\x99\xa6b\xb8aq\xbf\x88EQ\xd7\xd4\x8aEN\x9b7\x15\xa4\x00\x91\x85\x9b"\xac<IL\x9ds\'\x01{\x15G\xe0\xbe=\xad"\x0f)\x93\x87>A\x98o\xe2\x87\xdb\x1e,\x81\xf2M\xca\xbfK\xe9bO\x96\xe2\x14:{\xa8\x84N>\xb9\xf4\xa0\x17\xf7w\x19\xfcm%\xb0\xb1\xccK0\xd7\xfc2/\xa73\xba\xab\xd08\xd7|\x1b#\xed\x88\xfb\xe7\xf7\t\xcc\xe9\xb57\xb5B\xdb\x86c\x1d\\\x14x\xeb\xf9X^\x14U8y\xbdBu\xee\x172\xd3aml9\x07_<7\x03\xaa\xd2\xb7\x19FM\x84\\\xb7w\xcdZe\xe4\xe0\x91\xf9C\x86/2mN\x8dX\xf1\x92T\xcb\xad\xa1!e\xdf\x89$\xa1\xf1\xc9\xc2_\xf3\xc1o@w\x12r\x02\xf9\xb4\x13\xecQ\x8d\xdd#\xb9"\xdf\xe1\xf3}"\xb1#\x17][$\xd4n\x02\xa8\x04 \xbbR\x85v\xee[\x9b\x8d\xd3H\x07r@\xdc"\xc2\x80\xee\x85o\n\xd7\x926\r\x8e\x94\xf87\xa3}\xf0\xb4\xe4.\xc2\xfc\xa5\xd4\x04[Z\x8d\\\xddfN-\x88K\x94d/\xac\xf4\xb0\xd2\xe97\x88\x14\xca\x92\x0b2-\xee8\xddP\xb3\xca\xd4\xb8\xe7\x04ho\x15\x9e%ZT\x00\xfbZ\xf9\xe3\xb4\x04\x80\xca\x95\xab\xb9l\nl;ko\xdf>&\'\x9e\xactcF\x12\xe4\xe3`6D^\xc5BQ\xff\xe3\xbc~\x0e\xb6\x01\xdb1U\x9c\xb6\xdd\x8ei\xb7\xb4Q\xad+\xdfp\x91Nk|\x12\xfe\xdf|<>\'\xa4u\xa3\xa2\x15\x99\x96aA\x81@\x1f\x1f\x82\x1f\xad\xf1\x15\xca\xea\xaf\xc4\xdf1\x9f\xc2?vgg\xf5\xb5\x182CN\xc1\x01\xf5\xde\xf6\x99\x85\xd1\xa0\xfd9d7W\x8b\x8arUI\xde\xb7\xd6\x92\xc2aS[GT,\x0c\x03\x9f\xef\x1e\xda\xc9rUi\x9d\x7fk\xa8x\xfb\x01UH\xd6\xe3\xf8\x92\xd8\r-\xf0\x1f\xa9\\\x13A\x93\x0c\t\xe0\xd2Y\xc41\xcb\x1fx\x86\xec\x81.\x86\xd7V\x12\xf7y%s \xc9).jS\x88\x87o\xda\x1c\x00)y\x9a\xb9\xd5\xf9HY"\x19\xe0\xcc\x9b\x88L\x93\xf7\xe5\x80\xdc1\xa9!\xbc\xef\xd5\xbe\x00^\xd9atXgP\x05no\xd0L%\xaff\xd5\x86\x01\x1c|\x08.\xe4W\x12G\xaf&\x1c\xd6C.V\xbd\xde\x0e%{=Q\x9d\x04\xe3\xab\xe7\xbb\xd2\x9eIH\x87m\xcbM\x91\x9b#\xd3\xed\xcd}\xa4y\x06\x1f\xccR:JV}j\'\xdb\xae\xaf\xe29\x1d\xd4;\x03E\xe3<\x8d\xed\x08Z\x83\xfa\xfb\xe8\xe6#O\xf2\x9cV\xa6\x83\xd7 \xcf>g/\xff\xf5\xd4j\x18\x15\x9e8B\x81\xd7<w,\xf3e\xcc\x18\xe7 \xbc\x07I\xf7\xbei\xd2\xc5\xc8\xd6P\xf7\x95\xfc\t8\x05\xd3\xec-\t\x01_r\xd3\xf9bOCj\x1e\xff:o\xb7\xbe\x08AH@xRc\xf4\x80\xde\xec\xef\x8cR\xbb\x0ek\xdc\xf6j`\x9f*\x86\xb8d\x86DoL\xd5\x1d\xac\r\x99\xc3&C\xfe\xde\x14K\x18\x0c\x19\n\xb9\xfb\x9e\xfc\xf0M\xd9f\xf2\xe7\x0e\x8a\xaaK\x88g\xe9W3q\xc8B\xc2\xb6\xf9 <\xddo\x9ck\x9a6\xbf\xf4\xeb\xac\x19\x1d\xfe\xaeS\xb2\xc6\xa2\xa6#\xe4V\x89\x8d\xa2^\x95\x8d\xfa11\xd4&\xab\xac\x1b\xfe\x9f\x89\x1c\xedn\x12\t\x9fYB?q\xb4H\x10\xe6\xd2\xe1bkQ&&\xc7\x8c`*\xa7\xd6wnj1\xd8\xf35\'U\xef\x9b\x8f\xc8\xdb\x95D~\x14\xce-*8\x15\xff\x07\x05\xfa\x95F\x1d\xcab\xc0,\x812\xe7w\xd4R\xe3\xf1\x90T\xdco\xab\'v\xc6T\xee\x17\xba\xe3\xc55\xdd\xe7\x145$B\xec\xa1e\xec\x8dDz%3k\xee0Q\xfd\x7f\xdc\x81\xfa\x89.~K\x9f]\xecNVk\x9f$\x81E=\x9be}\xcdH\xbcD\xf4\xcd\x8d\xdc\xe4\xe3vU\xb9\xb6\xc0E\xa1\xad\x88g_\xd5\xa4\x12\n\x9a\xf8\xf6\xc3r\xfe\xc2/\xc8\x01P\xb5E1vn\x13\xa8u\xdf\x7f\xe5\xc9\xf8\x1d\xcf\xe4\x8b\x8a\xe3\x04\xfb\x84\t\x18c\x8a\x1e\xdf\x1e\x18\x0bwl>\xf5\xd7\xfb|\x99\x96,\xe6\xa5]\xc7\x02\x00\xcc\x82\xe1\xc7\xef\xa2P\xdc\xc1-{\xd7\x1c\xf8,^\xa3X\x0f\xcf\x01Zg\xf2\xcfD\x0b\xda\xd9\x03\x08O\xb7\xf4 )\xba\xc9\xd5M\xfa\x1a!\x96\x90\x19!\xd5\x1cS;4\xcf\xfe\xaf\x11\xbf\x01\xa1\xcde\x8dtO\xbd6\xa6q$\xe4\x9fl\xf7S\x97\xcbp\x03\x83\x19\x91\xcc\x83\xf4\xcf2\x04\xfc>\xaa\xb4m\x88"\x1eHa\x9b\xe5\xa7"\'\xb1p\xa1\xcb\xc9\xaa4A\xeb+&j+\xcc\xd1I\x99\x82(e\x92B\xfe<6h\xe4\xc3\xe7\xe6\t\x04\x1e\xab\xc7\xa5\x0f[\xe4\xb1\x90\xba\x1a\xb1\xb0\x07<:\xd5[\xa0\xa2,\x9a\xda\x9d\x1bm\\\xde\xd2\x8e\xf9\xd8(Jz\xe8\r\xf5\x9d\xda\x02\x89\x05\xd7\xcdb\x13\xbd*\xd3ac~[B\x81\x97\xb6\x8cS\xf7h\xac\x1ci\xff\xd0\xb9?\xde~\xc72\x82\x8e9\x94+\x93\xfc\xcer\xd2\xc2\xde\x10\xa6a\x93\xba/r\xfa\xad\x1c\x1eo=\xbcF\x1c\xa9\xea\xfbB\xc4\xf5\xfa\xdf\x19\xd5T\x02l\x96\xb4HU\xcc\x82\xc8\xeb\xa9\xf6\x8c\xf2\x9cZ\xe0\x0eQ_\xf7\x9e\x08\x02\xde\x9e]\xce<\x0bk\xa3\xce\xb0X8\xd6\xf3\xe0m\xf1\x94\xea\x0e\xd3\xc1tk\t\x89\x00\xd4\x1f\xe4\xb0\xee\x19b\xf6\xdd\x10)\xfa+\x98p\xaeq\xea\xcb\x06\xb8!LV\x81\x1b\xd2\x0f\xbf5S\xd9W\xcc@I\x10)H\x9a6\xd7\x974\xd62\xaanX\xf0\xed\xa9\x0f\xea4/\xad\r\xb3\x16\xb6\xf5]\xe45\x84RM\x18\xe2I\xe8cM\xb1<\xfch\xa1\xd2fc\x02\x93@u\x15~\xcfl\x9dwa\xd9\xab\x93\xc3r\xc8\xb1b\x06\xa4\xbb,z^\xfb\xef\xd24\xbf$\x8eq2Q\xbf\\\xf9T\xf3\nK\xd7sI|HbY\xa8\xcd\xeeW\'\xb6\'\xad:S\xe7\x8b\xbd\xcf\xd1\xf5pII\x7f>\x19;g\x84\x1bU\xfa\xf4%\xa5X\xed\xf7\xd3\xff]\xdb\xe7;\x8e3\xdcQ#,\x1a\xa0,\xd8\r\x1b\x90\x95\xb3\x86*\xcc6Q\xe4T<\x1a!_\xe9\xbb\x99Z\xe6\x95w{\xf8\x00&\x7f\xd2H\x80\xc9<\x8f\xe9\xf8\x82Nfb\xc8\x1b\xe0\xd6\x02\xbc\xb02j\x0fneM\x90\xfb~\xe3\xba\xc9]\xe4M\x8bj$mU\xdc(\xaf\xcb(\x8e\n\x7f\x99\xffU\xa8!}*\xf2OJ\x07\x96_\x87\xb5hv.1\xe8\xcd\x90\xf6\x10\xdd\xa3\x98\x01\x92\x9f\x87m\xf0\x03\xe4\xde\xc8\xf6\x9b~\xe7\xe9F\x8c\xbb\x13\x8fA\xd7X\xda\x03M\xf8X@\x99\xd4(\xbd\x9e\x08d,L\xeb\x06U\x14\xc4\xd0Y\x01\x0b@H\xcf\x84\x8eR\xf1\xe5p\x05D\xa6OMA\nZ?+J\x84\x9a\xb6_\xf1\xa6\x11>\xd9\xb6\xf1=\xc2\xc4e$\xe9\x8b\xe2\x97\xc7]r\x0b\x04X\x12-\xdd]\xd0\xe17\xb7\xc0h\xef{\xb5\x1d\x915\xb7;J0\xb3\xef<\x99\xfdM\x9d\rS\xc6Jok1\xf4)\x1a\x7f\x10n\xf1Q\xe8\x97\x9cO\xad\x90\x9a3\xb7}&\xb8\xe4dt1\xa4@[d\xcf\x16\xdd\xaa\x84\xd6:\xe8\x16\x94\xd2\xef\x9a\x07`[\xb0(w\xdd\xe0C4;\xdd\xf3\xdeb\xd14h7\x94\xa1\xd2\xd2\x8c\x91Q\n(\x14"&\x98\xf0Gi\x83\xd5\xeb6l\xfefyx\x8e\xe5-\x01\xd3\x0c\xf8\x95\xcd.|\xeb\x91D\xe7P\t\xe6\x04\x9c\x96\x91\x1c2\x0c\x85\x81x\xd1\x86\xdd\xc9\t\xc31jpq"\x06H\x87E\x02H\xbfh\xec\r\xc1p\xe6B\xba\xf1!\xd4 \xd8\xe2}\xcb&\xc9\xb3\xc1\x99\x8bA\xdb\x11k\xaf,\xc1\xc8A\x87\x85\x08B\x9aJ\xfew\xc2\x80}\xea\\\xed\x89\x9b\x00\x9c0\xe0\x9f\x943\x9bO3\xfd!\xa5\xc7Re\xe6\x8d[%P\xdc#rmB\x1b:\x05@J\x8f\xd5\xd6e\x92\x85[\xae\xe0\xf7<\x07\x06\xc8\x1d\xe7*h\xca\xeb\xafcQ\x11\xe4\x00\x1b\x90(\x96\x02\x0bm\xcb\x03\x1d\xd2\x0cX\x02\x07\x0eh)\xdd\xdf\xb46h\xd5\x8bg\xbe\x0c\xe3,\xcd)\xcbA\xb4\xe6\xe5\x1d\xc6TI4\xa1f\xf9)/[:\xdcg\xa2\xa9\xc4\x81\x8c\xc4\r4v\xcbz\xf4.e\xa65\xee\x98\x0f\x01\xfd\x08#\x1d7\xb4\xa2V\x97\xb29\xdd\xc1#\xbe\xf5l7E\x08\xcb2\x832+\x8c*<\x06\xcbR>un\x86\xd32]\xefx\xae\xf5a\xa2/\x03?\xb7\x83\x91\xc1uDT\xe7\xb4o\x8f\xd4\xd3f\x02\xb4\xec\x90\x99\xd8^\x15.\xf4L\xea\xc5\x93\x97\xc8T\xe2^a4\xdaMz\x85W\x9c\x9d\x9cJ\x174!O\x9b\x8a<\x1f\r\x17\x08=\x03\x9d\x19\x8a\xaca\tKu]\x95]*y\xca\xf7\xe9l_D\xedt\x15+A\xe2^x\xad\xb5\xaf\xf8\x0c\xa2|(\xf3\x7f\xe8\xf1\x94S\xee\x04\xbc\x10f\x04J\xe1\xe1\xb9\x06\x9a=2l\x92\xd5\xb7[\xecr\xc9/\x99[\xd1/\xf0\xc2P~\xd7L\x0f\x14\x95f\x01n\xa9\x05\xedOy\xc2\xb4[dp\xdb\xb7\xd3\x14\xeb\xae^RoJvyJ,\xe3\r\xe8\xa1vp\xb3M\x99fB\xb3\xfb\xc1\x0f\xd16\xd72\x1d\x96p\x94@"wp\x8f\xd3\xbc\n\x0f\xd6=\r\x0b\xe8\xc7\xca\xf3>\x15\x9f\x81{\xd9I\x872U-q\xe2\x18\x0e\x0c]\xe3\xda#59\xf6*\'h\xeb\x94\xb9g2t\xcf:OP\x1a\xf4\xf0\x85\x15\x12J\xc5c\x8b\xf1\xcd\x1b\x8a\x8d\xa7\x92\x1b6]#\xbb\xbf\xe7Wph\x9di\xbc\x9c~n{f_\xe9\xb9\xbb\xfb\xa9\xae]\x88\x17L\xeb\x0b\xa2\x19\xb8qL\x00n\xa4Z\x0b\x0b\x84\x0e\x18\xea\x17\xdax\xfdy\xdb_\x0c%\xff?Z\xb3Z\xcd\x90\x1cZ\xf5X\xc4J\xa1\x0f\xf1\x16\xc6\xfe\xe9A\xf4\xbf\x81\xdf\x8d\xb3\x12\xf8C{\x9cN$$\xd4l3\xeeD\xf6\xc9\xdfLSY]h\x82\x9e=\xc2=\x19\x93xW\xd61\xf8i\xb4?\x0b\x0e\xf6\xafF\x7f\x86\xe8\xddr\x81\xf1\x80\x06\xdc\xf5\x8cpA\xb5F\xa9\xfb\xc17\x11Zk\xae0\xf8b\xf6`\xa8\xdd\x8a\x05B\xd9z\x1c\x86\xe5\xd4\xfc\x8a\x8d\xe3\x00p\x15E\\\xa8\xc4?\x9eF\xa4\xe7\x84p\xe9LKM\x8co(\xde5\xca\xc2\x8atN\xde\x0b(RL\x95\xae\xed\xad@\x84f8\x16\xc1\x8c5\xbd\xd2OM\x05\xdb\xb5f?\x8e3R\x00@\xb7\xe8\xd4\xe0\xb3{\xfb\x80\xf2\xdc<9\xec-\xe8\x1do\xb3\xec\x18\xaeK5\x88\x84\xa3=\xd9\x82"\xcfY\x00\xa6\xe8JV\xe7\x8e/\xde\x95-\x12\t\xada\xe4\x9dkQ\x89 \x90\xe3e\x8e}(s\xb5J\xe1J\x8a\xcb-\x0e\xd3\xd1\x85\x93\xa0\xd5\xa6^E\xd0\x00\xbfL\xe2)\xdcJ\xe2\xff\xc1-\xb8u\x96VN\x05\xb7\xca\x05\xe4\xd0\x11\xe7\xf7\x7f\ts\xfea(\x9cp]\xd7\xeb_m@\xdf\xe1\xd2\xff\x06\xe67M\xa7M\xb0\xd8^FP\'\x1cH\x17\xdd\xf4,\x1a\xee\xc2\xcb\xd5\xe4\xa51@\xaf\x7f\xcf\xc2H\x16\xa7\x16\x93p\xd9\x15\xc3(\x7f\xb4\xe5w\xf7\xbbG\xc7\x91A\xad:g:x\xa2\x12\x1e_\xc5\x06\xd8\xf2?Va\xfa\x96\xfd\x87? l\x160\xbb\xa7\xa4y\x1a\x01T\xa9\xf4\x8e*\xfe\x06+N/\x93\n\xe1\x15l\xd1\x0e\xea\xb5y\xd6\xd4\x83Dq\xb5a\x86B\xf7\xc6\xc3\xb1\xa8\xd1\xe8\x8c$\x0c\xe5+\x12\xf9\x19\xb2\x17\xc4\xf64\xa2\xa6\xf9\xcfP\xb9\xfa\x8a\x86\xb3\x97\x1f\xd3\x82\xb4\x93\xf9\xb4%\xf0]I\x82\x99\x16\x0f\x1f\xd1\xf7X\x99:\x84+P\xe9\xa1\xf5V6\x9d9\xcd*\xc8kb\x85n\x05\x94s\xd3&\x81\xf9c\xd1\xf9\xb3\xff\x9c\xb1Q\xbe{\xb2gk`\xb1\xd9\x04\x10\x02S\x96\xa03ss\xa5\xb2\x95\xe46\x0f\xad:\xd4!ByG%4\xd0WF\xb18F}@_L\x8c\x8e)V\xa5;\xeb\xe3j\x9f\x0bwk"`\x19\xd7\x95\xbe\x14\xb0\x975\x1c<\xfb\x0b3n\x82\xbf\xcc\t\x85\x08\x1a\x01\x10\xbb\x89\xdd0\x86\xf8\xb9[\xfbp(\xc3\x84I#\xc1j\xf2\xbf-\xdb\x0c\xe2=\x90aD\xb4D\xc7LO~R<\xd2\x1ej\x0b{\xf5Fnd"\xff\xc1\xca"\xfbUC!\xf0\xbb\xa5\xff\x15\x85H\',e\xf2\xa4:\xfc\x85]c\x9c\xb0\x96\x9f\x03n}\x94\x8foAB(s7\xdc\x81\x92\xb5\xf9\xc8V\xc7y^\xaaf\x93\x15\xa3\x0c\x87x\xeb\x11x\x89GB;F\x18v\xe0\xe5u\x88\xcat\xb7h\x92\x07\x02o\xd9\xe7h\xa4q\x1f\xff\xc9%\x11\xc8;\x1b\x07\xb2\xfc\x0cfg\x00Y\xdez\x84\x17$\x99W\x88\xa1\xb58(\xe1\xd7*\xc8e\xbe\xd8\x8f9^_g\xce\x93B\x98\xbfP_\xc4\xa8\xee\x82\x92wY\xb8Y\xd4e\xe6\xb6OE-6\xd4\x8c\xf9\x0b\\\xc3\xd7Y.PQ\xc3\xf06Mi\xc8\xf36Y\xcc\x92\xba\x9d\x8f\x96v\xc6u\xab\xeep\x10"\x8f#\xbc\xa5\xd3\x18\xc8e\xd9g\xb5,\xc0\x8c\x96A\xa4O\xfd\x14\xb0\xe7\x81\xf3\xe5\xf9\xdd\x81Y\x82\xc8B\xf04\x88\xe3\xdd!\xf3\xa0`\x94$\x0b\xbb\xea0\xde\xf6RL\xe1\xf1i\x9f\xc1\x8b\xfd\xcd(4r\xac\xb1[\xe9=?\x7fY3\xe8h\xa1\x8e\xaa\x97\x1f\x18\xefi\xbc\xf8\xb35:\xaf\xdc\xb9\x05uW\x9e\xce$:\xde\x82\x95\x95d\x97\x95\x8c\x08\x901\xcd\x8e# \xff3mT\xd6hH\xdb\xe5\x0b\x92Dw\xf3y`Jc\xb7\xd7\xb1\xafV\xfb=\x0b\xe9\x14\xd7\x9c\xeb\x0e\xac\xfd}h\xf6|\xbeq(}\x8b:m\x8a\x91\xe7tff\xe1g\x115V7?\xe0\xe1\xaa\xaeK\x89$\xf5^\xe9\xab\xe0\xfcv\xc8\xfc\x93!!\xa3-\x9d=i\xaa\xed`\xc6{9\xe4\xccj\xd2\x10\xdc\x07\xe6\xd5\xef\xb0+\xee\xdc\xabn=\xe8\x9cz?\x90\xbb\xde\xb9\xed\x9a\xd2\xd3\x86th\xc9oJqC\xf1P\xaa\x97\xcaU\xbey\x12\xd1\x02gS\x06\xac\xce,\xcaW6\xe3\xdf\x97\x88\xfb)\x9b\x9e\x9a\xd9\xb0\xf6\x0b\xd4\x11\xebs\xb4\xcaE\xb7(U\xbe\xba\x15\xca \x0fU\x08\x13i\'\xf8\xb5\xa1T+\xe1\xd7\xff%F\xecTG\xa8\x8e\xc2\xb9\xd3\x86\x1bd\x88\x81\xd1\x06Vw\xcd\xb9\x17`\xb2\xbe\xb6\xb6l4\x04}\xac\x9e(\xf9\xc4c\x90\x8d\x97\xb1J*\x128H\x84\xc7\xe2\x02\xe1cxO\x00\xdf\x9d\xcf\xd5P\xdfv2sP;\xa8&\x94K\xbbb3(aj\xd87S\x87\xe0\xedN\x86\xd9\xf7\x95\xa5\':\xfb\x1c~\xcc\xda2\x95\xfb\xbb\xce8\xa6S\x1f\x82Z\xa7I\xae\xb3\xad$\xc1\xb8\xba\x9e\xa1\xb7\xd6\x8a\xda\xf5#\xb2\xe1CIZB\xce\x9c}\xf8\xcf^\xaf\xf9I4\x98B\xb44\x1e|\x04\x7f0\xc7\xdb\x99\x8f7\x8d9\xb8b\xf9\xc0\xef\xd2\xdaP\x99\xc2\xda\x11F\x9e(\x8f\x06\xbc.Dl\x91\x8a\x9c\xe7\xc2\xaf\x17\xc0\x18\x83I\x04+\xbdz\x9cf6W\xd85\xa2Q\xda\x9f\xfbQ\x02\\\xcb\xda\xe3\xda\x94\xdb\xa7\xb4\x0b$\xcf\x81\xce\xdeg\xac\xab\xab.\xb1|~\\\xa0\x14n\xa7\xc2\x1d\x00\x84\x17+L`A3\x1a\xdd\x81s\xba\xc2\x01\x15\xa7=\xd6rp\xf4\xe23y\xa6P\xfd\x96\x1e\xa7\x80Y\x90\xbcV\xfa\xc5\xc6|\x01\x01\x9a\x0c=\xb2+\xfa0\xc2\xeb?\x03\xe8R\x83H\xbb\xcf\xe6\xbd_\x81\xb9\t\xa5\xe04\xf4\xe5\x87\xb0\xf3\xad\xc0Pb\x0b\xae\x92\x9a\xfd\xc6`\xe9\xbd\x8ej\x04|\xdb\xc4\x81!\xad\xfaH_\x17\x0f\x0c\x00\xa3\xe0\xec\x12~\xfb\x8c\x8d \x14\xd3w.i\xc6w_\x1f\xea\xe0\xf3\x0c\x95\x9ewu\x81\r\xaeIa\x9fi\x1c\xc6J\xb5\xa1\x06\xd6"\x12\xd4\x83V\xcd\x17(#\xc3V\x1ec\xe9\x04{\xb8\xcd\xa7^\xe5\xbb\x94h\xa9\xeb\x1e%\x00 \\\xc1\x94\xaad\xe8\x9e?f\x9d\xf6\x7f\xf7\xf5\xd3\xeb\xe28T\x0f\xaf\xb6\x8f\xb9\xdako&R\x90K\xed\xc0\xc6\xad0\xa4\xae\x18\xdc\xba\x96JM\xb5;\xcb\xecn"\xa3\xb5U\xab\xf7\x8f\xf8\xc1\xd7\x1b\xac\xb04\x06!\xfd"\xd0\xb8?yG\x8f\xb8Q\x1c\xe0m;\x9cu\x8a93\xd6Y^\xf8^\xbbj\xf0\xc6w\xe1\xa8\xa6\xbd\xc5.E\x01\x98\xe5\x1b\x01W\xdfdJ\xb1\x83\x11\x97\xa9_\xe03\x94\x11\xe9<q\x8f\x9extTG\x1e\xd3\x96\x9f\x02\xc4\x9dc!Oi\xdeV\xd0\x9b\xd1z\xa6\x15\xd7\xeb\x10CH\xbc\x15@S\xe3\xe7\xf6t\xdf\x115$\xf0y\t\xca\xb4\xe03\xae\xf3\x17\x1fM\x95\xa3\xb1\x82~\xc6\xf0\x99t\xe7\xc9+L\x02i\x83k6\xd5\x0e\x1bm\x01\xcc\xd4+\x9f\x08\xa0\x1b\x10\xd6a\rg6\nT2\xec\x19/<j.Z\x95D/\x1c\xb9\x88tL\xba\xdf\xa7\xaf1\xc6>0\xfd\xc09\xab\xb7\x8b9$U\x9b\xd2:^\x02c\xfb5U\x91\xf1\x85\x11\xc5\x161\xcc\xbey:8\xef\rkV\xc2\xad5\x9a\xc4?ur\xd1g\x1eghK\xca\xf8\xdb\xc9\xdcXo\xca\x8b/\xa1\xe1\xb3$\xe4\xdc\x84\x95\x1b\\\xfdF\xf9qyP-\xe9\x99\x14\xad\x17\x96\x11\x7fr\x1a\x9f8aY\xe0\x8d\xbe\x9f\xfdF\xbe5\x84\']\xa0T\xdcw\x8a{]\x9d\x00B\x8fSKx\xd4\xcc\xf4\x8bo\xa9j\x82\x06\xe6)\xdc5\xae\xafY=\xce\xf9\x1c\x8a\xe8\x8dy\x8c\xa3\x8b+x\x81\xa5\x8e\xdf\xaaE\xf1\x9d\xe4\x02!\x1b\x19G\xf4\x0c:FM\xb2\x1d\xd2%\xb44\xc0\xbfNn\xdbhA\\\r\xd1`])8\xaeI\x8b\xb0\xa7fun0\x82^k\xfe\x8a\xfa\x8b.G\xcf\xbdD\xe0(\x01N\x02k\x12+\xa0!\n<=\xffr\xb5b\xee\x1bjr3\xe7\xa1,B\xf9\xa0\x1e\x93\xe7%\xc8O\xe2\x95\x0b7\x99"\x86\xeb4\xe7\r\t\xcf\x08\xedH\xb0Y$\xb6\x08\x0f|S&,\x9e\x84\xf5\x80r@\xb9 \xc6!9\x15 \xb9|\xaf\x1f7\xcd\xd4\xea\xd53\x81\xca\x1dI\xfd\xfe\xad\xf4\x04T\x89%H\xf5m\xce\xed\x1a_12m\xbd\xdc\xd0\x89.\x1f\xd0\x85\xb3[d\x1b\xb1XV\xa6\xc1\xc3\x80\x99C\xc23F\x89\xb2(4\xe5X\x8f\xcd}Y\xd4\xf8\x99\x04\xc1\xe3C\xca\x18{1/5\x86SY%u2X\x00Z\x9dC\xbb\xeb\xdb\xbb\x85m\xfb@\xe4\x069\x92=\x9a\x16\xc3\x9a\xd6\xd03Fi_\x7f\x88z\xb8F\xfd\x11.Do\x051\xd7\xeb-F/:\x1f\x02\x04\xd5\xf06x9\xa4E\x06\r1\xb4\xd2\x089n\x060\x1d\xbf[\r(%DA\x1dU\xb0\x1a\x87\xb3\x9c("\x05\x95T\xd1,/\x01~fa6\xe2k2/\xd3c\x1aBI^,\xbe\xf1-\xcd\x81\xe7\xd6\x0b\xae\xea\xbc\xbf\xf2[\x8b\xddh\xddq\xc2\xe7\xb5\xd6\x82hd\xe3]\xc7\xb3Js\x0cO\x90h`K\xa0,]\x0f\n\xbb\xcf\r\xa9\x8c\x1f\xe0ig\xe4\xf5\x11\x9e\xf7\x87\x8b\n\xd36{K\xc0\xbd\x16\xf1\x00K\xd8\xa1\xd9\'\xc1\x9dp-\xf1\x02\xf7\x86\xdavet\x03f\x1a\x0c!\x1d\x1f\\\xa3\xb0u\xa2\x10\xf9\xda\xa7\xc7f$[?\xf0Xu?=TfR\xaf\x89~\x8dW\xdb\x1d\xfca;<>\xb2\x96\x05\xdbPp\x12\x1a\x8eW\xe6M\x04\xbe/ \xbc\x81\xa1\xba\xedG\xc5s\xc5\xa8\xe0\xd2r\xe6\xbf\xa8\xf5\x97~\xd9\xdex\xa7&\x8b\xaa`\x8ax*\'\x9d\xd5X\xa5\xb9\t\xb0{\xdd\xdd\xe8\x8d\n\x0cQO\xbd\xea\xd7s:\xb8\'q\xc95\xe0 \xd3J\x1d\x13\x86_]\xe0\xbf;Z\xafK\xfc\xcaS\x84\x9dZ\x87G\x84\x96\xd4\x9ab{\xf7Xyv\xf1Jr0\x1a\x1bH\xb6\\\x9e\xa53\xef\x02\x06\x07\xdf\x06Ic\x8cN,M\x1b!\xc9\xd6\x04z\x98nc\xf2\xbe\xf1[\xec\xa7\x0f\x83\x9a\xffR\x07\xa1\xabk\xd8\xfb\xc2 \xa75\xc5\xca%\xa8\x95\xf8\xd2Y\xe2\xdb}\xa2\xd3Q\xd9\xf8r0\x953;\x83H\xedG\x06\x1c,\xb8P\xb2\x9eb#\x02.\xc4\x84G\xfe\x94\xe2@/#E\xac%\xd5\x93\x90\x10\xa1\x104\t\xcdX\x9c\x1d\x98\x96k@\x84\xfd\xdfnn\xcb\xcd7\xb9\xcc\xbf[\xa5zYu"\'\x01\x1b\xfe\x96\x1f\xfe\xa3\xb4\t\x04\t\xbe\xf434Tx\x14\t{6?D\x17\xc75\xdc\x9c\xe6\x17c7\x15\xf3\x8d\x9b;\xc1\xef\x7f\xe0Z\x80\x0f%\x93\xa19\xd7?6a\x87\xc6\x8f2\xe1L\x85[\xb3b\x80\x93\x90\xf2\t\xf55E?M\xe9Bh\xec\xa2\x06\x0c\xfc\xd6\x9e\x95\xbeC\xf6?\xa2\x01DP\x88o\xbb\xcb_\xbdS\x82\xf8\xc1(\xb9\x85\x04\x0f\xc6Tt&uO\xef\x85;DW\xad\xb8\x12\x94\x87\x93\xaeG\xdb\x1f\t\xae\x93\xd4\x88]\xbb\xc22\x98\xectq\xe2&\xdcr\xceN\xaa\x83a,[\x9by,\\\'\x87j\xe8\xf7\xdd\xf7\xc0\x93\x81\x03r\xa3\xc8\xbc{\xc0\xa2&4MW\xa3\xa8\xa1\xa0vq\xbe\x8d\xe8\xca\x8d21\x17"\x1b\x8d\xd5y\x066]#t+\xc2\x0b\xdd\xe6r\xd8\xe3\xb3\xd4\xbf\x03i.\x83\xa2\xfc\x8e`\x8bi\xb8\x91\x99\x8b\x016?\xe55\xeaa\x19a\x9cZ\xb4b`v\xd9\ng\xed\xb4\xd0\xf1M\xf93\xfa\xc9N\x16\x0b\xea\xa0\x85\x8dh1\xab\xe9\xe0\xfc``h\x0eu\xb6\xa2\xf9k\xc6\xda\x17Y\x01\x04\x02\xd2*\xaa)\x1a\xf9\t\xf3\xec\xe0\x06(\xc2\x17\xdf\xad\xca\xde\xdd\xfa\xf1fP\xca\xd6I\xa7\xe1\xf7\xaf\x94\xbdJ\xba\x91X\xf6 \xe1\xb0\xdf\xadb\xaf\xf5FVj\x81\xeea\x83c\xdb\xb09\xed\xac\xb9\x0e\xa5\x1c\xf8\xdd\x9f\xb5\x97fOn\xe7?\xae\xbf\x16\xa3o[\xf1\x18\xee9\x01\x96oS\xf8\xae\x12gx\xd7\x9c\xc3\x86\xcesg\x0b\x8eH\xa1\xd6\xb8^C\x9a\x92\n\x16\xae\xe7\xb5\xde{\xad\xb5+\xc2a\xf4\xb9\xcf[\xf8J\xe3\x8a\x11K;\xf0E\xcb\xff\x95\xe8\xdf\x81\xf5\xf1\xf9\xe2\xcaq\x00\xe6F\xb8\xce\x078]\n\x0bv\xb2>\x7f\xb7\x8b\xc8w\x0cFC\xa1KE\x82\x80\xeb\xb0\x0c\xad"vpF\x91VZ\xfe\xab\xe6\x85M\x1d\xad\x1eV\xd2-g\xabj\x8f\xbe\xa5\\m\x99}\x0fe\xb1\xe3\xd0\xc9B.\xf7\x83\x1a\xc4\xb3\x0c\xa5\xea\xeb\xd4\xe4\xbeL\xff\xb4T\xa0B\xc5*\xc4\xdc\xef\xf2\xbc\x11\x1cn\xc1\xe2\xf2\xd2r]\xd1#\xd3~6\xe0\xae\x13\xc1%\xb5~\x03\x00\xef\xda\x93H\x89\xa0\x9aXE?x\xa3\xf5\xa9\xb4\xa1\xcd\xd5\x8a\x9b\xba\xb9\x81M\x08\xe4\xea\xa2q6\xf1jk\x10\x0eg\x7f\x96ZW~n\x8bo\xfaO\x1e@\xd6A\xdcoz\xa4\xbf\x9dS\xcc\x0c\xb3\xa1\xa5\x9c\xcay\x8c\xbbi\x10\xab\xdd\x16ZT$\xf0\x84\x026Dk\x80\x14\xeb)\x05\xb7\x16\xe9\x90\x86\xb4\xa81\x8c(\x969\xb1d\xbbT\xe7rb<4\x04\xc9\x1fH\xd5+\xd9\xce\xb4\xfd\xa6Iw96\x06ZI`\x14\x9d\x19\xba\xa4\\}\xa4W\xc4\xe4Y\xed\xb9\xf9\xd6\xb0\xbc\xbe\xc9q\xc8\xcdjG\x19\x00\xf6Y\x86\x16s\x86\xff|\x92p\xb8O\xcd\xdeP|\xfcq\x13R\xb6\xacdr\x9da\x87\xb9w\'I\xc9\xe2\x15[H\xd6\xac\x0et\xc4 \xf2\x81TG\xe0*\x82v\xdc\xdf\xadR}\x19\xfd4\xa1\xee6\xf1\xe1>\xc1\xe2\x03\xff\xb1\xa1=\xc0\x90.\rt\xb8\x9eA\xbc\xde\xc8X\x7f\xe5\x9f\xf4K\xfeo#O\xce\xcb;\x7f"?0?Qc\x0eI\x03\x8a%\x1e\xa7T\x85\xfb\x0ff\xa6\x93\x140\xdb\xd1\xeb-f}\n\\GGP\x1e\xfc}}b\xf9\xb0\x8a\x1a2\xd3\xa1\xad\\W\xfe\xf1i\x1cX\xa3\x9a\x99nH\xee[,cd\x02^2\xc8\xdc\x89\xce\xb4Z\x8ci_\xda\x94=\xe3\xfe\xb3.81=\xae>\xfc\x17^WG\n\x84\xfcVc\xd6\xfb\x89+\xbee\x9e\xc9;\xcb\x1d~Xw\x07\xe7\xebi\xdd\x08\x8f\xb5\xfc\x13\xe7\x040\xb1\x9e!\x10\x8f]\xb1\x9aG\x86\xcc\x12\xa3\xe8\xb7M!3\xb7\xf55p}\x15Q"\xd4\x9e\xe9\x93/\x9b\x08\x8eLH\x9f\xfc\xea\xe5\x0c`\xb0\xce\xa0\xfc\xbb\xa0\x90\xb2\xfd\xeb\xaa\x95\xe5B\xd6\xf0I.a\x83\xe7EH\xe4\x80\xef\xf9\xa8\xb1\xc4K\xc84\xbe6\xb0e\xc8\xce3\xa5d\\\xbe\xd8\xe6kO\x7f\x06k\x18\xf0_\xa8\x9d\xbe\xeb9\xcf\x12\x828\xb9\xbd\xa2\x0e [G<\x00\xdb\x1c\x01\x04v\xea\x1b^6\x89\x956\xf1?r\x1f\xde\xa5\xf4\xf5\xd3E\xb6\x9c]BOT\xd4M\xd0t\xc7\x10m\x8b\xa8\xe8$\xa2|+\xc0.\xa2\xe2\x83\xdfF\xf4?\xee\xb0C\xbf#\xa0\xd4e\xdct/\xc7\x82\x06\xe1\x97ck\xd3.\xcf\xfc]n\xc0xN\x8d.,F\xdf\xf24\xfc5\x85wwSn\xb8SE\x9c\xb3\xdda\xc2\x1fF\xb3\xde\x13\xca%\xd8h=\n\x85\xc2\x94t\xa0\xa6\x17[L\x0f\xf2\xdac\\\x94l\x9b\xa54\x04\xea\xa9\xb4\xc4\x95\x82\xad\xe2n\xdc2\x84\xc9\x82\x0cY,\x82t.f\x17\xb7\xa4\xbe\xb2L\xc7\xb7A\xc0tJ8}\xe7\x10\x00e8yC\xf2\xae\xeb\xb6hk\xab\xeb\xf8\x87@Z\x85\xba\x01\x8b]\xf6[bN\xb3\xa5\xcf{\xfdW\xbd\xcd`0X\x0b1\xa9T9\xbe\x16\xd0\x80')
|
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"]}&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"]}&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&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)
|
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")}}
|