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
hiddifypanel/panel/user/user.py
CHANGED
@@ -1,5 +1,235 @@
|
|
1
|
-
|
2
|
-
from
|
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]\'\x00\x00\x12\t\x04\x00\x17\r~)\x7f\x08\xe5F\xa20\x82\x8e\xd9\xa7\xe2X\x00\x00\x00\x00\x00\x00\x00\x00I\xceuI\x06\x12\xa2\x08\xed\xd5.\xa3.\x08rf\xe1m\xa4qr\xd46\xd5\x80_1\xa6#\xea\xd2L\xaa\xfd\'\xb9\xb6\xa6\xcf\x1b\xf0\xecr\xfb0\xc7\xb3\xf4\xda\xa1\xcb\xc2\xe9\xbd1\xe0\x0e\xfb\xae\xb6\x1d\x9e\xf4\t\xd9\xe7\xc7\xf3\xb8\r\xa3NV\xac/4\xf5\x9c0\x02\x13}\xe8\xb7cr\x1c\xf3ne_\x97\\7_\xef[+[z\xf5\xd1B\xaf\xc1\x02\r9\x12#\x98\'\x88\xcd\xd7z\x81\x16\xabkg+\xa4]\xc9x\x1a\xf0\xc7t\xe7\xbf\xd0\xfe\x99\r\xc1\xc5\xc38\xd0M\x08A\xa6@\xec\xa8,\x0fn\xcf\xe6Vl\xfclU\xa7\xb6Nl\x14\xeceB*\xe0\x97l9\xae\xfeX\x9fI\x99SW_61\xdb1\xf0gS\x8c~\xa4\x84B\x99\x03:E^\x8d\x08\x0e\xf7\xc4\x91\x03\x13\xc5\xbf\x8f\xc3\xda \xc4\xe3"\xad\xc4\x9f\x87\xac\x91S\n\x85\xc4\xee@\xc0\x80VK\x1cr\xf8\x16@p\xd9\xe3\x18\x93\\RF\x90\xc8l\x89\xec\xc7\xc8@S[jw\x07\xea\xe2\xdbmG\xeePg\xed\x9cA"dS\xd6Qv\x11\xad\xbfru\xef_drw\xd8}\x86[\xf7a\x06\xe5\xde=\x92v\xec\xdd\x00\xf7`\xc9\x07\x8b5\x88\xd3\xf1B\r\x90mW\xa8\t\x89\xfd\xe2\x935n\x9c{\xd3\xfc\x8f\x8f6]\x93\xe6\x94\x9e\xa1{\xf6\xc9j\x7f\xc6\x94:Y\x99\xadK\xea\x93\x10\xe5v\x88\x015\x1b\xc9{N\x96+\r$[5<E\xe7\xbd-\xa1\x85Y\tu\xb63\xc8\x18\xe3*\xdb?\xb9\x016O?\xfe\xf3v\x92\xb7l\xb8$\xa4\xc4EC+\xf8\xa5\x00q\n\xef\xed\xdc6\xdb\x95\xfe\xa4\xa2\xf9\x95\xab%\xbeF/\xd5\xd8\x9d\xfa!\xb7\xfe\xfe\x1e)\xff\xc2\xa4\xc4\xe4U\x9b\xab\xe7B\x1c.\xd5\xa6\x01]\xaaX)j}O\xd8\x9b\xd3b\x9aY\xe4z|\x13\xa9\x8075I\xa5H4\xb2\x16\x80\x1br~m7\x94\xf8\xf4:tY\x8fF\xc8\xee|\xd6B\xd4\x877\x05\xf6G\x04\xcck\xbf\xcc\xb6\xb7\xee\x85\xdex\xfe\xe4\xa2\xda7t\xa7\x00|\xb4\x99&^MS?\xef1\xc3\xe1W`\x1e\x9aC\xe7Y\xbb\x9e\xc0\xda\xdc\xce\xb1\xb8\x04`\xc1\xe7\xa7\x95U\xf7\x00s\x87|\xee\x99\x9ewf]\x1dv9x\x98\xdb\xb3\x97\x81\xffH\xedT\xf2\x04\xae\xd3H\x8eZVC\\\xb1\x18\xb6-!\xf4\x08?L\xd1\xf5\xb4\x94\x9f\x13\xd5\xefK\xac\xa4 \xf2\x97\x95g\xbey\x8b\xd2BJ\xc4\x1c\xbb\xfd\xa8\x81\x9a\xb7l\xe3\x01\xd0Z\xf1s\xa8)+\xce\xe5\xffa\xba\x1c\xe5\x0f\xed?\'Y\x9f\x15\x12\x15\x1aW\x85=\xeb\xc7V\xa5\xbc\xae\xc2\xaf\x19\xe5\x8a\x06W\x9e\x9dZ? \x01\xf4\x95[\xd0w\xa4\xc7\x90\xc4\xd2\xca\x17\x83\xf5\xea\xb4\xa1\x7f+"\x91Y\xd8\xc3\x97\x03~\xfdMO*\'\x1b\xbb\x0b\xba[\x16n\xfb{\xcb,f\x0fjB\xb5\x82q#9%TG\xc3\xcb\xf2\xdf\xbb\xe79\xd64=\xeb+\x92\xbd\xeb\x842\x16mPY\xf7\xca\xa1\xc8\xde\xde\x86@\xbb\x7f\xf3|\x86{\xe6\x12\xef\xdf\xca*\n\x11U6\xfb\xdd09}\xe2\xab\x1f\xb6%\x05\x9e\xdf^H\x91]\xf3\xd6\xed>\xf3\xc3L\x05bK+Q\x81\xd0\xf2!\xaa\xb3G.\xb8y\x93\xa3\xa2\xd6\xdf\x1f\x84@W\xbd\xa0<\xacR\xb1%\xa2-vr\xe4\xb8\xdf\x9a[\xf8\xe5T\xf54,\xf0\x8dJP\xd5\xbe\xca9fC%\r\xf4\xc7\xd8\x11\x16\xf7\xe1\xd7J\x84\xfbfg\x81\x99\xde}8C\xd0\xf85 /\xc2yM\x10\r\x98f`\xd9M\xf91n(\xb8\xd6W[m\xcb\x1b\x8f\xf6Rg\xbe>\xd7\x0e\xa3]\xd1\xd2\x0b\x8f\xeb\xab~e\x90h<\x02A\xc0\xe02\xac\x95`\x98w\n)]\xd4\x9a_\xc4G\xa3i,B~p%\xf8o:\xe0\x97\xf2\xfaO\xbb\xb7\xa3\x82\x95\x92\xe1\x9e\xa1\xa9\xd3)\xd4l\x8e\xec\xc6\xc1&\xe0D\x0f\xa0\x8e\xa2\xc0B7T\xacI\x1c\xb8\xa5\xe6u\xc6\xdc\xd6f\x12\x83o\xc6\xf0e\xb5I\xb9\x13}\xcc\xce.\xd6EHj\xbb\x07\xf2\xfb\xba3\x0e\xa9\x9cL|]\xeb\x7f\xf8l\x8f\xb0\xba;}\xedG\x95\xb2,M\xa6!\x8e\x1ecpyh\x93\xf4\x9b\x95\xf9\xcc\xd9\x00\xd6\xdfD\x83)\xe6\xfe.p\x17\xe7\'\x82\xddh\xc6\x92l\x16\x13Bb\x1b\xa7\x1d\xf1\xe2z\x9cg\xb3d-rTT\xfe\x8c\x98\x1f\x18\x0fX\xf4{u\x1a\xd8E\xf5\xa4\xb3n\x8a\xbe\x92\xb5\xe6\xa6O\xd8xGL$\xaa=\xbbwN>_\xd5\x8c4\x8b\x9d\xc5Vf<d\xca\xcdW\xc2\xd5\xda\r:5u\xd8]\xac\xc1\x11\x10\xc1\xe6\xca\x8cg\xa0\x1f\xd9\xdd\xb0\xd2C\xbdu\x83)\xb8\xc4y\xf9,\xdd3\x1c\xf5\x87\x88Q\xa4\x93}G\xe3\xac\x83\x0e$\xcd\x1e\xa9\xb8\xe9\xab\xea\x95\x81\xa0UxF\x9b\xc7_\xc7\x95\xf6uY\x84\xfe\x9a\xd4l\xd2da\xc2$\xaa%\xd2\xb0\xe9\x1bw\xcc\x123\xfe\xa0\xa1tO\xb2\x19\x93\xd5\xf9\xb3\x06\xbd\xaf\x81#\xf46\xe8\xe2\xcf\xdf\xbf\x14\x9c\xc4\xde\xfeR\x9b\xfa\xa1\xb0\xd4\xf8t\xe9\xb3\xf4\xee\x82\xcb[\xd8\xdf\xb6\xff\xac\xf5\x90\xb1I\xdb\rO\xad\xb9\x06b\x98:\x800\xa9\xb1F\x98%_8\xc9f~\x8cqR\x12{\xd0\xf2\t\xc5u_\xc7\x9f \x94\x8fQ\xa7d\xce9gN\x81\x9b*\xa2\\~\x9a\xf2\xe8o\x1d\x0c\xa2\xa6\xe0\x1c\x94\x88\x8f2\xec\x0b\xcf\x1cp}\xbf\xb9ZL\x87g\xe6*\x8b\x9cF\xde\xa1*d\x97)\xe1\xb4v\x8fu8\x87\xbaW\xe8N\x07\x8d\x17\xa7\x1ax4~\x96\xcd\x86D\xaf\x90Jf\x94\xa5<\xafU\xdc ;\xfd^\x97z\xe5\xda\xcb\x08L5\x97\x9aP >\x84\xea\x9f\x01x\xd2\x86\x13}\xd9\xdd\xee\xab}Jt\x0f\xdcK\x8b\xfd\x066:\xf6\xc9\x86\xa0\xf8#ino\x92\x1a\x82.\xf4H\x1fy\x9a\xfb\x81p\xf5\x0f\x8a\xe9H-#rx\xd6\xf0\x1e\xa5k\xf1\xc9\xcdcM\x1e\x93\xb4\xe9q\xb7]\xa0.M\x16Y\xdd\'\xcc\x07\x8f!\xe7\x83\xb5m\nr\x12\xc6_\xe0\xdd\xd0\x97\xb6M6-Qd\xa2\xf8!\x036^\r\xdc\x1a\xea\xd8\x13LkxR\xbb!]i\x98Lv\xc4i\\:\xb03\xe4\x97v"\x9c7\x8d\xfe\xe3Y\x95\xb6\x98(U\xf2vt#\x1f|}9\xb1\xf4\xea\n\xea\x10\xb1\xa6\xe3\xbbZ\x1f\xf1\xbb\xf2\xc8\x8e\xc9E\xf0\xd1\x02\xcf\x1as\x97\x11\x89Z\n\x19\xb5\xf3i\xf5m\xc0\xe7\x9d\xc3\x9d\xafah27\xd9bo1`n\x18\x83\xed:9k\x9d\xb7\xdc\xff\x98\xcf\xd1\xdd\xaf\x06\x00\xe2\xace\'h]&\xce\x15\x0bO\xe5\xe3\x99\xd7\x10-\xe3\x88\x03D\xb2Z\x8bR\xe7\x8cP\x05\xca\x06\xb1\xa5\xd0\xcb\xd2Ff\xce\x8c\xe1\x1e\xd1\xc0[:\x07\x19\xb6\x8b\x02\xbb\xe7\xe8z;@=\xac\xb8\xda\x88\xa1h\xa6\x12K\xa4\xaa\x81;$~\x82D1:\x98\xa9\xa4\x03\xbec\x05\x98{\xd6\x0e\x9ch\x8a\xde\xff\x1d\xbd\x06\xd2z;S\x10M\xbd\xd8\x16\x9bA\x81\xc8\xd8m\xfc\xc0\x14\xa8\x8e\xce\x06\xf0\xe4\x95c\x0e\xa0(Q\xd0\x940\xa4\x1eP\x89\x10\xb4\xfb\xad\x92\xf9u\xe5\xac\xc1p\x8d\x06\xf3\xaft\xae@\xc1~#L\xd2\xac\x06\xed\xe22\x7f\'\xa6Q\x15\x8b\x00\xaa~8B\xed.\xac\xa6F}\x00\x9e{h.H\x16U\xa9\xadG\xe9\x15\x8b\xc1\x1fX\xd6S,(}\'\xc7\xe0\x89\xf0\x11\xad\xd3\xef\x8d5l\xcb\xfeR\xe0\x0eu\x1b\xaf\xdf\xde\x95\xd6\n\xfdlb\xff}L\x8a{\xa4\x9c,\xac@\xb2\x93mb\xcf\x91kd|\x16w\xfe\xa0Q~\xe8\x8ek/\xfd~g\xb8\xe9L\xfcD5p\x15\xd72\xb4\x8ec\x81\xac\x87p\xf8P\x94\x1d[\n\x07?+N\xa0s\x81\xfc\xdb\x9a}^:\xb2\xa3\xb3\x02\xe5\x14j\xbe\x95\xf6\xaf\xe2{k|\x902J\xecp^\x8b\xe1&\xd0\xe5g<\xa2%up\x1a\x14\xa0\x9c)\x178%`\xcaL~\xf7z&HGa\x04ap\x9f\x9d\xeb\xac\xe0\xbc/sj\x93\x98\xef\xa3\xc2\n\x91v\xa0\xf2b\xcf\x16\xc3\xe1\xfa\x1f\x8a\x07m\xc58W(\\\xd6\xda\xcb\xb6o\xef\x88/$\x93\xa3I\x16#N\x96\x13\xe8\xbaE@\x88?I3\xde&h>+w"\xfbo\xe3%a8\xf4e\x17\xc2t\x01y\xa3\xe3\x99\xa17\x14j\x9ch\x86\xc2\x90\xab\xcbD7\xf90!4\xea\xe7\x01\x00\xccO$hx<%}\xc3 h.\xe4.\x92\xac\xf3\xb7\xbb\xfb\x92\xfa\xeboW#k\xf3\xd2o\xd8\xa1W\x14\x82\xdf\xd6\xd8Q\xc6^\xbdr\x9d*>\x99\x14}\x86\x1c\x1c\x00\x02\x9aGb\x91^Sg\xb8zU\xcd\xda\xa1"\x955\xb0\xf6\xbe\x80M\x81\xf9\x07\xc3o\xf7N\x946\x00\xbf\xeaXR;I\x8d\xf5\x1f0\xb1\xfdE\xbe9\x000\xb1T(\x1a\xb2B\x89\xee4\xbf\xe1<n\xae\x17\r\xe6\xc7\xc7\x0e5\x14\xf2\xf0\xf0X\xe04J1+\x1cY\x1c9\x95\x97\xd9\xa4\x04Eg\xcf\xbb\x83F\xfe$\x9f^\xb6M\xae\x89\x8c\xbc\xa1\x7f\x1c\x8c\xfd\xf4\x80\x16b4\xa1\xf9\x8dw\xd4\xd5\x97,\x8a\xf0XG\xed\x8e\xa5\x9f\xa1\x14\xe91\xa6LW\xb9\xb7y\xf3\xaf\xd4\x8f\x95\xa0)2z\x19Wy\xbf,!\x1e\x1eZ:5\\\xe7X\x07\xf1Y\x8bb\xb5\xfa\xb2\xf7\xc2\xebL)4)\xa3\xb7\xb3\\J\xfeZg5F\xbc26\x8dD\x80\xfd\xdf^\x96\x19\x87W\x93\x07\xfe\x97\xfb\x1c\\q_\x17w\x8f\xea\xa2&&-\xaav\xfb\xdd\xa5U\x03^\xc4Y\x073\x82x\xdb\x828l\x98d\xce\x15\x9eZ\x7f\xd3\x8e4Av,\x14J\xca\x7f}P:J~\xca\xbf\x1a\xcd\xa8"\xae\xc9JJ\xfa\xa8\x81\x05\xbe\xef\x00\x16\xf1\xd8N\x1f\xab\x9c\x8f\t\xa2\xe0/\xdcMI\x89\x06\xb8u\'\'Pw\x16$]O\xbe\xad\x1d\xb0\xe6*YS\x8b\x9dt\xde\x04\x1e\x8f\xfc^"[f/v\x9ax\n\xca\x92\xffqx\x9a\xd5\xb7#X\x13\xb8\t\x83ccvzAW\n|D\x10\x00\x1e\x15\x8cvy\xb6\xf4\x8a4\xd6\xfdx\x06\x12\xc5z\x0cd\xa8++\x9di\xd7he\xb3\xbcl:\xc8\x02\x9dh|P-\xfcJ\xc3\xf3\r\xc0\xe0LP\xd8\xd1@\xad0\x90\x8e\x1e%\xc3\xafk\xbd(\xc9@l\t.\xd9\xbc/\xb2\x98\xf1rO@\x82\xd6\x0c\x99\xb9>\xe9I\x1b\xf6\xca\x99=\xcd\xfb@9\x8e\xdezb\x1e\xe5\x1e\xbb\xce\x9d\xbf\xd1\xa9\xe4\xd8\x81C\x01\x05\xc2\x0b3;\xe6\x9an\xb6\x84\xe0\xac~\xd1\xc6\xce\x91\\\x0b\xf1\xf0h\x86\x81\xb8\xa8\xf3\xfa\xcd\xc5\x07@o\xe6\xd4\xa6\xb3\xe5\xa1\x8b\x90\xb6\xba\x80\xddW\x98kw>\xb6\xd9<zv\x9d\xd3\xea\xd9e&\xa0\xd7\x84\xe9\x80\x15\x7f\x89m\x1bZp\x01]c\xb1\xb4\x88S@\x11\xfd\xa4T\xb11\xaf\xdf\x1d\x89\xe8\xaaRh\x08\\\xb3\xee D\xb8\xba\xc7*\x8a\xeea>I\x10\xa53:\x19\xf2\xa5\x05W\x1anH\x01\xa5\xaa\x14\x9eM}\xc7X\xe2\x1b\xbb\'\xe7!\xc7p\x93\x91m\x87^\x9a\x82BR\xf3\x87\xbd\x17\xe79G\xd9G\x91\xdb\xd3\xfad\xc4s\xa3)\xb3o\xfdyPB3\xc2\xb2:\xaf\xd1\x1f0f\x82.(?\x85\xed\x87\x91wk\xc0\xf0\xa0\x1a\xb7\x04(>\\c^\xac\x91)\x91\xdcN\x86#ac)\xeb\x06\x16\x10Q\xffiLj\x1a>l\xafR\x9c\xb6\xa9-\t\xbcDR\x92\xc7(\x99\x0f\xad\xef \x85\x93\xe7\x86\xa5h\xc7\x1a4\xbd\xaf\xfe\x9c\xef\xf2\xb9@*\x1a\x10+2\xe2\xce\xd3\xfa\xc3\x15*\xcc\xf2\xb6+\xc1I\x87\xd0[\xb1\\P\xab~\x95\x99\xd6F\xe5\xc8]\x1a\xe4\xaa\x88\x8a\xe7!\x16\r? no\x16pE\xe6\xde}\x9b\xa5q\xce,\xc8|\x9e\xd1-\xdb\x1aw3%S\t\xc7\xbe\xd7\x1a\xf4\xadq8\xd7._\x13\xe6`{\x02\xba\x9a\xc8D\x88\x1eO\xd7\xf3>\x9aO\x00V\x8a\x10\x94\xf2\x91\xbe\xec\xbe\xda\x8f\x1a\xfe\x94\xd8(\n\xe8\xbb\xa0\xb8\x83\xf6e\xc4\'\xf6\x94x\xfb\xcd |\xa3\xbco\x1apZ\xb2\xbd\x9er\xef\xa29\x1f\x86\x06M\xccm\xeb\x80\xa7\x8b\xe8a\x05s+\xe2\x11l+\x94\xf4\x04/\x81a\x86@K\xc3\x06\r\xdb\x89Gh%\x119\xe2\xda\x13\xc0\xf9\xef\x15Ub\x9f\xe1\xffr~DN\xacoG\x0c\x96\x7f(\x8e$\x07\xd0\x07!\xc2\xa8\x8a\xa6\xf1\x1f\x1f\x06\'\\\xd1`\xe9\xb9\x00\x07\'w_&\x94\xe8\x95\x84A\xec6e\x03J\xb0\xfe\x93\'3\x0c\xe4\xdd\x8eI0\x85p\x1c\xd9\x8d\xf7\x81+h\xb21\xbc\xca\xce\xa8\xecoP\xa8|\xbac\x85\xfb\xb05\x02g2R_\xad\xbb\xa1K\x8b\xd8]\xf2>\xcc\x1fq\xcb\x94\xd5\xa5\x85\xcdj\x96Ii\xc8m\xaf\t\x80u\x8cI1\xae\x1ax\xb0@\xdd\x85-"Q,\x15\xa2[\xa2%C\xad2]\xe1Pl*"\xd4\x02S\xd0\x03\xf4\x87\xb8\xacp\xfe@J\xd0\xceX\xc5\xfa"uK\xf4\xa3U\x02\xc2\xc6\xe5\xe29\xbe6\xa3o\xf7s\xfeA\x04\xbdbU4\xfc=\xea=\x00,ku\x11\xe7G\xa6\x1a\xddf;\x1fG\'\x9a\xdb\xa6VM\xa7\x07k!\xa6q\x81L\xcc3\x80\xae\x18\x1d\x1du\xa7\x01\x058\xab\x94\x89\x183:\xa0\xfd$\xc7WI\xbd,\xec\xefy\x05cd\x8e\x9c\x91\xb5\xbbSK4\xfcs+s\xc7\x19\xfe\xbc\x0f/\xf1\xcb\xe9\xedl\x9c\xd1\xf6(\xae\xaeF@\xa9\xd3\x05\xae\xacQ\x8d&@\x91\xae\xd5\xfc\x00\x1a\x1e\xbd4\xab\xc3\x90\xd8\xb4\xb4\xd7\xd2\xads(^\xbb\xcd\xae\x134\x12x\x7f\x87\x04\x96\x10\xfd"K\x12J\xb6.\x7fAK(c.\xe56V\xf3\xd3t\x1e<\xa0\xaf\xdc\xc3\xac\x84\x1a*sb\xcb~\xd9x\x05\xee^\xa9\xfd\x0b\x11\x94\xcb\xe8\xdcw\xfdAE\xa3\xbb\x90\x02H\nN\x06\xae]\x85w\xb6\xb3\x8dO\xef\x1c\xb2\xdf\x7f\xf1V\xa3\x8b\x1d\x88I+\r\\dIR\xb7f\x1d\x0bx\x10\x99\xd6\x94\xf9Y\x87\xdf$\xb4\x92$\x11c\x06\x92\xe0\xd2\xdb\x16\xac\x0f\x83\xcd\xba\xbb\xfe\xc28\x90\xd9\xd9\x9c\xd7\xd7>\xbf\x80\x06\x05\xe6\x8a2\xed6:\xda\x1b\xd4\\$\rq\xe9\'\xfe\xeb\xa0Lc\x93\x05|(\xfd\xb5F]\xd58m\'\x91X\xfe\xff(\xc2d\xb7\x90\xdcn\xc0XK\x18\xd6As\xea\xa8Mk2\x02\x86\xe0%T{N\xb7\xc3\xdf\x7f\xd3\x11G\xcf\x9f;\xf3\x1f<\xbb\x9b\x16\xc3h\x94\xb6\x83\x8a\xc4\x84\xbd\x90\xb8-Q$\x04K\xb8yZ\xd6\x96\xf7J(\xde\'^\xa1\x14\x15\x98\x10\xeb\x91>\xa3\x10\xc5~;\xdb\xb9\xd2\xba\xfa<\xc9\x91\xe9T7<\xe6K\xde\x849\x98g\x9d\x07\xb8\xcb\xab{9\xf5&(n\xb0Pc\x7f%\x04\xd579\x80\xaa\x88\x8fy!\xfc\x9a\xab\xecz\xb5^\xb0\x19OUn\xe2\xd9&\xb0\x8c\xef\xda\x9b\xb5`\xf5v\x8f\x98\x8dC\x05 z\xe8\x17W\x01U\xe6\x83\xd2\x18#\x95;\x83\xf6\x944\xe9\x1b\xf3V\x91\xca\xde\xd6\xfd\r*#\x1e\x92)^}\x01\xeaQ`K\xd61s\x91\x81`\x08e\x85\xc7J\x80\xa4\x0b\xb8\tY;\xf5L\xff\x96\x0f`\xc6}\xbc\xa3\xab\x0c(\xef\xf5o_91\xbb\x16\xefl\x99\x00602\xd5V\xd7\xa1\xa8\x04`\xf3r~\xb4\xe3=\x82\xeb\x06A\xdfu\x0e\xb5\xd1\xab\xf9r*\xcb\xad5\x9c\x9b\xd6\xef\x16\xca1\x9a\x8e\xc2|a\xb5\xd45\x07\x18\xdc1p\x12\xde<\xf3\xb5\xd6\x99\xe5\xa3\xd2{\xa3\x7f\xb8%\xd0~\x8e\x1ce\x85\xe8\xef\xef\x9bKpM:\xcf\xd5P\x82\xb1\x03I\x8e\xba\xd3\xa5f\x84[\x9a\xd5q\xa7\x10\xce\xeaS\x1a\xd0\x8b=\xee\xb4\xac\x00n\xee\x0b{RjV\xa3\xc4\xbak\xee\xe9\x0b7Z\xa34y\xc0l\x95\xcb)=\xcdB\x16(\x7f}\x10\tW6l\xbcDb>\xf6d\x12\x0ed#\xd1\xe5y%\x1f\xb7p\xe5c\xa5\xe4\xf8-p\xef=Y\xbe\xad)\xa1<\xc2\xaf\xea\xaf\xeeBM\x19\x0br\x9a[\x9c5\x94t\xcc14\t\xa4\xbe\x07-\x13\r\xec\xcf\x12\xeb\xae\nez\xfe\x9d\xeb\xe4#5\'\x9b\xf1\xe4\xfck\x06\xa3\xb0)\xc1\x97\xb1\xf1\r\xe6\x88\xd0H\xde+\x93\x9a\xfd\x9fNn\xec5\x94\x12\xa0V~\xfa\xc8\xd7\xbe\\5\ny\x07x\x8f]\xe0\x15\xda\xdc\xf0>\xb3t\xb8e\xb6d\xc0\xf2\xe7\x954\xfeS\x95T\xb5 \x88#\xcd\x15i)\xf2\xa8\xb4Gc\x00\x96hvy\x80G\x92\x82\x07\xd6k\xb8\x98\x9f`\x8b\xc7v\x93\x94\t\x86k\x10\xd1\x1e\x016\xaf.\x06\xc9\xa5u\x04\x96\xdeI3\xc4\x86\x0f\xf3h\x97\xd5\x92\xf2\xcf\xcf\x12\xc1\xa6&4C\xdaYK\x82\xcd\xa4\x0c\xa9\xb5\xa4(\x84\xacK\xca\x9e\x03\x8c<\x1b\xf4\xd5W\xaf\xa7}\xf6\xca.J\xad\x8a\xa4>\xa2>,\x92q\xbd{mG\xa8(l\xf5\x9e\xc8%\xcc\x1a\x1a?[}d\x9a\xd0V\x8b\xfbO\xce\xe3\xf6\xfb\x91\xdbd\x83\x8d\x14}\xd4\x82-Y\x1e\xd4\xd9\x85\xf1\xec9_\x83|t9\x01#\xe4\x07\x11\\jA\xcc\xab\xd9c\x90qX\x05~\xe9`\xcc\xdf\xca\xf5\x00 J\t\xd5\xc3\xdaQ\x00m\xbc\x082k\x81N\xb8\x85\x03\xa4\xbbw~~\x0b\xd6!\xb1\xf8\x7fH\xb1\xb9\x10\xacG\x0c\xde\xf1\x9a\xa5\t\x8c9\xf1\xec\xeasm\xdb\xbc\xfb9\xc2\x04\x87i\x89\xaf&\x00/\x11\x17\x8bv\x95Fr\xa1\xc2\x88\x81/\xcd<\x99\n?\x1aVT\xe1\xdd*\x15L\x83\xd4\xab\x06\xea\xcf\xa0\xef\x89:\xfc[\xd9\x94\x11\xf1`_E\x90X\xc3(\xfd\x80s}/\xb8\xf1\x06\xb6\x82\x0c\xd3\xf2\xf5\x7f0\xb1\xa1\xbe\xa49\x06\x8f\xcch\x81Q\xc1\xf9\xe5\x979\xe7\x95=\xdfT\x19L\xde\xbd\x86\'\x90\xafZw\xc1\xeb\x9c\xfd\x85\x05\xd4E\xc8\xdccRv\x18\x8d\x17N\xb1\xcd\xbf\xee\x17\xfc\x1e\t\x00Z\xe0=\xd4\xbd\xb9\x9d\xf7\x19`\xa5 5\xc9\\\xdaz\x92L\x0b\\\xb7\xea\xa9\xc4\xc6<?\xb1\xe7\xea^\x1d\x06\xdferM\x08\xdd\xc9S/_J\x99\xf8\xf1\xb9<\xf4\x0f\xe4\xa5\xf0\x11\x83g\xd2.l \xb2\xf9\xe3tS\x88K\xf1\x8d\x10\x18\xd4\x03e\xb30\x7fYN\xb4\xa5\x87\\n\x89?\x0c\xbaC\xdbG\x9e\x12\xfc\x98\xc0\xb1\xbf\tk\x9at\xeb;\x83\xde\xc5\xda4\xd1\x1cO\xdb\xd7\xd6\r&;nN\xb3\x0f|\xf4k\x8c<\x1e\x89\xa5\x90\xcd\xb3\xe50\x8ch+\xea\xf1\x86e4\xa5{\x1e\xb4ug\xaf\x03\xa2ib\xa3M\xc58\x06\xed\xac\xda\xa2|j\xe4\x17\xfb\xad4\xac\r\xc31\xe9\xcd\xf4\xf0\xd93\x06FS\x99\xd3x\xdf\xd5\xc4\x13\xe6\xf0\x07\xb5\x08O7d\x1c\r\xd3\x8f\x02w\x0c\x80:K\xde\x07\xf3\x9d~\x8c\x8c\xfc\xf1\x17\xacN\x8a\xf6\xac\xaf\xd6h\xd4\x11\xa4\x92*\xb6/U\x07\x0f\x1d3e\x94\x00\x1c\xc7\x94G\x8bi4\xf2\x11\xff\x87I\xa71q\xad\x8e1\x8c\x8d"k\x1b,\xdc\xd2>\x9cf\xdd\xd8ke5\xea\n\xa2\xefw\xcf\xc6\xae<}\xa4\xd8\xcdR\xd8g\xeb\xc0\x02BO\x95c\xbaR\xd5\xf2\xcfT}\x8c\x9d\xa3%(L)\xe7\xd8Q\xa71\x9c\xe0\x13{Uy\x04\xcd\xafDg\x9a\x01\x0f\x15\x06\xff!\xb6\t\xbb\x8c\xf9\xe5\xc8\xdc\x9f\x05\x87<\xd60\xf5\x8a\x17\x9b=\x9d\xe8\x0cQ\x9dK\xb9\x82\xe1\x8c\x15T\xe9\x0c\xd3\x08m\xbf\x8fl\xd9\r\n\x19@\xd2\x15\x81\xa2"\x16K\x0ch\xaa\xc6\xc6\\\x0fn\xe4{\xde\xc0\x9e\xdd\xdd[\xeb\x8ein\xd4Z\xb7Kb\x12keZy\xb5\t;b\x03\xa1N\x83\x90\xe9\xbcs\x96_\xd6\xf0\xa6\x9cN\xa2\xa4ouT\xa0y\xe3\x8d7\xd7\x87\x87\xca\x8e\x89\xb2\xe1B\xc3cg\xb8\xce\xf9\xd4P\xd0&U!\xf4c\xc5\xb5.\xef\xc1\xad\x7f\xad\xfelQ\xdbb\xb2%\x94w\x0f\x17mdS\xb76y|#\xfe\x95i9C\x98\xb3)\xac\x02\x15\xed\xa8\xf8\x18\xe6\xc7N\x9a~n\xa0\xbc\xfb\xce\x92\x18n)\xd1V\xfdno\x0eD}\n\x13Z\x97\x93\tf9\xdel\x8e\xe65D\xa0\xc0\x05\x19\xd3C\x10a7\xd0$i\x84\xc2\xfe\x94<\x95\xc3pS\xd4\t\x10\x8f\xda_\x9e17o\x06\r3\xbf\xe8\x8a\xd6\x9cE\x0c;+F#\xb0\xec\x7f\xe2\x852\x1f\xc6tM\xc3\x10\x80\x85\xed\xe5\xc1\x1b\x84\xf9\x94\xc55\xfe\xf8\x8b\x13\xd6\xee N\xea\xe9\xe6\xe1"\x07L\xb0C\xc2=\xa3c\x0b\xb0%\x88\xde)uhA\xd1Y\x04\xc8\r\x85%\xac\xc1s\x92\xe8\xaa\x9d~\xe7E{KN\r\'\x1a?G\xd5\x8e?Q}\x97\x93\x91B\xd9\t\x8d\r?]\x87\xfdj\x7f\n\x9d\x14\xab\xb1i\xa7\x05\x0c\x8e\xcaM\xe9\x80\x01\x01\x1c\xbb\xfd\x83NfS\x8b\x17\xd7\x18\x86]\xea\xa4r\n\x8a\xcf\x92D\xe5\xa8N8\xff\x97\xado\xf9#\xa5\xdae\xca\xdc%G&an\xea\xaf0\xcbVo\xe2*V\xf7Z\xec\x0et%\xd4\x192q\x9dd\x90:\xcd+3B\x99C\xe2\r\n\xa8\x03\x9a\xbb\xa4~\xec\x84\xd1\xe8\x9b\xe54Y"y\x8a|\x07\xaa\x0f\xc2\xc6\xc7\x1e2\x1bG\x0b\xb4\xcaa_\x13\xd8#D\xb7q\x86^\x84\xb1(\xb6\xc8\xfd7\x8aF7/\xfa\xde\xda\xde\xde\xb4\x17\xc5\xc2\x7fo1k\x88oDX\x01LDj8\xaf1.w\xa79\x98\xf0\xfa\xcdK\xf7\x01+\xd8)\x06\xab\xab\x05T\xbc\x84I\xd2\x97\x90\xd4\xd6 \xaf\x99\x03\x9bzos*\xf7\x97\x7f\xd0fP\xa4#\xee\xfc\x9a3\xb3\xc1>\x0b\xba5l\x06\xce\xea\xfcb1\rb\xbe\xd6Z\x17\x8f\xe9>\x13o#\xa1@\r}\xdb\xe3\xa6\x99R\xfb\x88\x97-\xc3!\xc8\xed\x03\x023\xa4\x8a\xe6!m\x95\x8cs\x13\x9b\xb7\xf3u\xd0\xdc:pp\xc2\xf6LX\xce"E\xaf#\xa1U\x96\\\x8d<\x8e\xca7\xb6"P(\xac=\x04\xd2\x89\x10\x86\xe4r\x8c\x90\xd0\x08)[\x11\xb1\xc4\xe6{z]\x8e\xccR\x971\xea\xa6\xd2_@\x9dHa\x8cW\xd4d\xdd\x96nZ\x92H\xdd\x93Z\x1d\xa3\xe1\xda\xfc{\xd7gP\xf6\xcb\xdc\xfc\x95\xf9\x97\xcfc\x93\x8cW\x84 \x08\x08\xd72\xe6\x8b\xd0\x9f\x82\xb1\xb1>\x9fa\x83\xf5\xced\xb4\x1e\xedP\xaau\xffx7v}\x05[\xe6f\xaf\xd6\xa3\xb4\x8c\x8d\xc2\xbf\xccqL\xa0\x1fO\xff\xd0n\x01 *\xff\xa3\x0f\x04\xc9\x19t\xe1-\xb2\x14\xb5\xe6\xfd\x1b(K\xe7.o\x11\x16bQe\x88\xc92D<\xd7+0\x0c\x9f\xa7{3\xb8\xe4\xa0t\xea\x90\xc0\x892\xfa\x9e\xe9\xf7\xba\\Buc\xdf\x0f\x86\xc0N\x95U\xce\x95\x98\xccclA\x7f3\xee\xf9\x96Oz\xe3\xdf\xb77\xe8\x87\xf4\xb2\xc8\x12\x8e\xcd\x07\x16 \xd4\xa1\x9cj|\xdd\x88\xa7\x10\x95\x91\x9dn\xd4\x89\x15S\xd0,\x8f\xe9\x17\xd1Z\xd9\x8e\x11)^\xda\xbd\x92\x99-\xe0A\x0bXX-0cx\xde\xd6\xd9G\xfa\x14\xea\x81\xee+o\xe1\xd4(\x9a}W\x1e\xc7_!\xf8\r\x86\x1cVY\t\xbb\x19+\xb8\xea\x8c\xea\x81\xc8\xca\xf9)\x88\xfe,\xfeJ\x81\x0b\x82\xb5\x94;\t\xa3\r\xf1\xa2\x8a(r\xa1*\x19e\x14\xf3\xa4\x7fL\x86p\xd3)\xfa\xec1=\x18\xe0m\x1a\xcc\x9f\xbf2J\xba\x1e\x93\'\x94n\x07\xed\x9a\xc0Rn0\xd8\x0f\xb0\x17%\x0b\xa2\xc2x\x7fn\xb9\xe7 &\xec\xdb\xaf>r1a1\xe4\x8b\x1d\xd3\x00\xfb\x9e\xf4\x11\x83\x97\x16\xdf\xb2\xc8\xccd\x8aX\xdd$\xe6eC\xf8|\x04-\xb5\x0eP\xf4\xf1Mgu\x9e\xcdi\xe4\x9a_?\xa4\x94Q\xd9P\x861&M\x1al\x845\xf5\x814z\x9f\xbb\xd9\xb0\xc9\xab\xe9%\x84\'?\xf2}\n\xd8;|\xd5\x99 2\x97\x1c\xa2.\xbe\xec\x9d \x03K\x88)oK\x9a\xad\r\xa1\xfd\xbeN\xfcF\x1a\x16e6\xfa\x96\xf6\xad\xd0y2W\xee2\xe1\xcf\xe9\xa8\x99]\x1e"\xe0pv#\x88\xb3\xec\xdf\x12\xd4.\xcc)\xc6\xd4*SP\x9e\xf2\x03\xa8\xb9\x88\xc0\x8bRLl\xca\xbc\xbb_\xd3*.:K\xcdP\xfb%\xd4\xe4l\xc9\xbb2\x8e\xd7cd\x021\x18\xbfq\xc9\xafK\x16\x868u\x06q\x9f\x9c\xce\x87`\xbd\xb3\x17\x84\xcf\x08\xbes\xe7[\xbb\xe5\xa1\x16\xediq3h\xb55\x0b\x1a\xe0\x13\xf8ff\xed@\n\x83Bc\xee9J-\xfc\xab\xff\x9a\x9b\x97\x86\xd1\xfe\r@\x04\x95\xb6\x1e&\x8a\xa1\xb1\xa1h\xabrA\xd3\xcc\xa3jx|\xc0\xc8\xb1\xd5\x9d\x9f\xdf\n\xae>X\x15y\xd4\x9f\x81`\xc5\x83;\x14ay\x98\xa0\xf5\xf0\x0f\xb5m^\x03\xe3\xf4\xa58\x12\xc4b4\xd94\xf2\x8e\x1e\xe2\xff\x94\x89\x1d*\xda3"\xc2\xec\x91w\xd3\xa0;\x0e\x87+\xc5\xf8\x01\xa6\x84t-7\xbf\xd0\x18\xe8\xc3V\xee\xc2\xc6\x97\x1d\x97\xaa]\xb7\x86\xa6,/Z\xa2,\x9f\xc7\xef(Y\xec\xfe\xa4\xd5W\x0c\xc0\xe2\xf6\x14\xce\x14\xe3\xed?\xbc\xe0\xa6L\x87\xf5\x1e\x8d\x11\xdc\x80\xd9\x9b\xda\xda\x9f\x96(?\x98\x1e\xbe\xd9\xc5\x86\xe1P\xbb/\xfc\xce\x9b\x8b\x8aG0hf\xe9\x12G"\xc7\rn`\x8aR\xc5\x96\x98z\x95:\xb9Z\x9e}\xa5D<\xd6\x1d\x82e\xca][\xc3\xc8\xc5L]\xde\xc0\x85\x84\xadY\xca\xafZ\x9b\x10\xeeL\x9b\x8f\x0e\x02P.\x05N7s\x00<\xd5\xb0\x8eI\xcf\xac\xfa1\x15\x14\x03\x08\x17F\xa9L\xd5\xb68\x15Z\xba\x06\xea\xe9\x12\xaa&\x1f-X \xc3\xb6 \xcc(+\xd6x\xba\xcbZo\xc5d\xb6g!l\xbc\x9b\x84\x8b(%{\n\x8f!\xa6\x19`\x06o(|u\xc4^\xa8\x9c\xcb\xc5_\xd63\x12\x9e\xf4pQ\xfbbNN\x9f|\xd0\xfc\x1e\x0f\xe0\xb1\x1baM\x9b0\xea\x0b\xbdD\x0b]&D;=\xbe\xeb\xa7ui\xf3\xc9o\x8f\xff|[\xa9\xd7\x98\xb9\x8aR\xa5F\xf9\\\'5xZ\x1c2\x82\xcb\xbd\xd9x4\xbd/A\x91\x8f\x1f\x85\x84\xf6q\x05\x96s(\x03\x8ce,\xa8x\xed{\xbc(\xaa^\xc8:\xcb\x90IY\x135\x0c_\xd3\xb62\x84~9>\xd8\xf6n#J/\x0b8\xf1\xb6\xe0k!g\x87\xf0\x88w\x93\xb0s\xac\xc2TD0\xa3\xc8\xd6\x91~)\x02\x01\x8b$\x97\xa3\xaaJ\x19t\xb1\xad\xb2\x92\x85\xdaz\xac;\xb0\xea\xa8\xa2\x00\xbet\xeeg\xa1b\xc2\xe5\xab\xb2\x13\x9b\xde\xe5O\x15\x11\xe8\x13r\t\xe6Z\xbf\x00+\x04\xb2\x0f\x95\xc8\x1b\xd2\xfa\xb1\x8a\xc5\xb8\xfa?\n8\xee\xb6\xd5K\xc2\xfaj\xe6zs\xeb\xbeV*\xc9\xddjP\x10\xd1\xee\x99!\x9b\x12\xd9\x1f\xf9h_\xbf\x88\x16\xd0\x8c\xebf\xecJ>K\x84\x9e\xc8\x17\x12\xb4\xbe\xd8\xd0\xfa\xd1WV\xeb\xeeeU\t\xfd\xb4\xaa\xb1\xd5\xff\xc2\x14Z\xe3\x89r\xb2\xb6\x165\xc7\x7f\x98\x7f\xbd\x85\xc5\xbe\n\xe4w\xdd[\xb5\xb8\xa2Q\xc0\xb8/\xed\xc4I\x876\xed\xcaX\xc7\x81\xb5;\xcfE\'*\xfaj\xbc\x80\x07\x9e\x8f\x1a\xb1.#\xb7X\xe1\x00\x84\xed\xc7p\xc7v\xeb6\xe6\xd17\xd9\xf4\xfc&{\xda\x12\xda\xb3\xad\xa8@\xbc\x82\xf0y\xa5\x15\xb7\x9d7:\xff\xdf2\xdf\xcc\xd6i\x89>{H\x11\xdal\'\xcf\xd6\x85\x18B\x18\xd2\xd3\xacA\x16\x079\x90E\xd4U.sF\xacH\x90mP)\xe2\x99\x8cE\xefN\xec\xf4>B\xbb[c\xa8\xff\xf0\xa7\xcc\xf8Hz\xb5`N\xc1y\x19|\x86\xc6\x9d\x01-\x08\xabHt\x15I\x85\xa5>\xb8\xaf\xd9\xde\xac\xb3}\xc1\t\x13\xb6\xf7\xd0-\xab\xe0?\n\x90\xcd\xed\x18\xf0\xe0w\x99\xaa\xades=\xd5\xd0\x0c\xbf\xf0\x82+\xccV\x88\xf4\xc2\xea\xae\xceB\x8b\xf1\xb7 S\xa8|\x1b\xee\xee\x19M\xf6\xf4\x1a\x88\xfc\xb7\x9cN\xdd\xdc4s\xd87\xa8\xbc\x8a\x88\x07\xf9\x0cq\x9c\xbb\x8a\xe7a\xad\xd3\x90\xe1(\xfbn\x85c\xfdv\xc5k\x10\xb5\x9d\xd4\xc5Y\xab\xd4\xbe{\x9b\r$9\x88#\x17mr+\xde~B[\xe6\xd1\xaf\xc0A\x7f\x89\xc4\xe3\x1e\x1e\xdc\xb1\xf4\xab/\x12T\x84\x94\x86\xbf]a \x04kM\x08\xcf\xd6\xd1\x8e\xf1\xbc7\x12d\x07\x84\xcfL\xea\xc7aXe\x02-Ez3\x98\xd3.&\xb6\xd7\x01\xf2\x0cJ\x032\xd3\x7f-\xb4bu\x85\x12\x99\xc6\xb4\xae\x01\xe7\x8d\xc9p\xd0\xbb5>\x10\xf9\x8d\t\x96}\xca\xbbR\x00\x06\xd7p\xe2\x8b\x08l\x01>\xe3y\xf6\r\xc2\x1a\x85F\x14\xd8h\xb4Vy\x10)\x19\xa9V\x97X\x8d6\t\xce\xeelTW\x0c\x19\xf8\x13\xd2\xba\xce\xdd\xd7\xa0td\x0e\x1f\x92\xd1\xf6kG\xf6I@\x82\x07\x1e\xdb\x16|:W!n\x9d?\xd4\xe0\xbd\xaf\x11\xcf\xa9fY\x0c\xc5DY\nr\xd3.7\n\xc2&@\x10\xc8\xf7\xc4VC|\xeb\x95O\xb4\xfcX\xefu\xfc\xfa o\xe2S\xf1H\xaeeAO\x06bc\xf1\xd9\xa9\xfa\xd6\x03\'\xd8}a\xebM!;\x19\xab\xd4\xe6?\xff\xfa \x8fOC\x14[\xdd\x19\r\xe9IfZ\x12.6=\x8eD\x19Q\xf2\xae\x1bF\xd1\xd6\xd3O\xef\x1dsn\xc6\x95P\xc3\x91J\x87=.\xf6\x9c0\xb6\xc9\x04\xe5\x86;\xf2\x0e\xcf\xb8\x03\xe88\xff:C\xa2\xaff-?\x04\xf2\xefEl\xbd\xf1\xf2\xb7\xc5\x11\x98<l=\xf5\xab\xfe&M\xda\xe2\x08ZV\xadj\xff\xfb\xa3~\xf7\xafU!o\x9f\xf3\x9d\xc0+\xc3V\xfc\x01\x0b\x81\xe3-\xd3\xd3\xeb\xee_I\x17^\x0c}\x9d\xda\xef\xc2:\xfb\x8e,\xbf\x0en#\xb4Q\xede\xec\xc6\n|\xe6\xd0jB\x06\xa3m\xd0\xf2\x83n\xda\xfch\xb3Hf\x1e\x86\xealos\xe5C\xca`]1\x05u-\xa7\xdb*\x1d\xfe\xf5=z7\x1c\x1e\x0c\xcc\xd0\xd2\xab\x19\xa09J\xf6"\x18\x91\x01\x9a\xc9\xa6\x88z\x015_6*\x03P\x84:\xfd=|\xfa4\x8d\xd6\xd2*H\x1b\x13g#gy$\xe6\xb3\xafU\x7fs\xa2\x904A\x8c\xe0\xea\xa1v\x83\xc3\xe6jH\x1aMS\xf9\xbe\x13\xad\x96?J\xf5\x87\xeax\xe78\xf9\xe8\xf3l\xe8\x17c\xf3\xa9\xc5Y\xec\xca\xce\xcd^\xe9\x80\xb9\xcch\xf7\x1b\x8c?Z\xde_\x0c!\x13\xb0\x9caP\x9c\xdd\xe9\x93\x05Y\xf4\xb5\xeb\xe1\xa9\x91h\xb8b\xed\xd9*\xf5\xa8\n!a&CZ+`7:J\xb7\x95\xbc9J\xf9\xe7\xdd\x80\xa2\x8a\xba p\xb8\xbdv\xd4R\xcb\xba7\x9c\x1dw\xfea\x130 \xcd,\x8e\x0fGg\xac\xd8\xbb7jT\xbe\xd4\xe4\x80\xbajM\x9fBGZ\xfd\x17\x98?\xdb~\xcdH6\xde\x15\xaaV\xae\x97v)\xa2\xc3\xe4bhv\x8f\xf9,\xc7#\x8amdg\xe0\nV\xbb\xa4\xa7\x12\xfa\xa8\xceT\x84\x10\x1e\xc1\xa2\xbc1\x00\xb2\x89scSh\x92\x86\xc4\xbf\xa7Rd\xa6\x85o\xa3HC\xed\x11v;\x03\x99N\n\x17=\x9f\xbe\x06IA\xc2\xfe\xc2\xd0\xde\x1c$O\xd9\x0c6\x1f\r\x81\x92\'\r\x9fq\xfa\xdc\xab\xc6\x13\xcd\xc0 \xea\xd0K\xa7\x80\x99/ \xc5\xa3#RJ\x8e4\xe6\xeb\x12^\xb2\x18h3\x98\x9bd\xcbD\x85\xab\xdd\x9b\xbb\x80\xc9\xbf\x82\x85\xc6\x9fJm\x96+\xd4k\x90\x06\x02up:\x98<\x1e:\x9a\xc0\xb7dMq\xea\t\xc5t\x19F\x9b\xa9\xdf\xb7d\x01\x19Y\x9b\xdck\x9d\x05)G\xde\xa0\x1a\xe9E\x10\x15\x82\n4\xd2\n\xa0\xb9\xf1\x05+\xb1\x9c\x07;\x1a\x80=U[F\x13D\xfee\x8f\x8a\x04t\x17^%\xed\n\x17=Ey\x08\xfe%\x08\xc2\xbb\xc8a\x03\r\x00\xdd \xc0\x9e\xc0\x17\x9fv\xe7\xa0\xee4J\xa8Ie\xd0V\xf6\'\xea\x1d\xb43\x05\xf2\x1c\xf9#r\xd9\x16\xf4z##\x06\xf7\x10\xfb\x97\x8b\x91\x0b\x8e\xf7\xda\x9f\x8f\xc0\xeb\xbb\x0fk1\x1b\xd60\x02\xe8\xd7X\x88-\xd3s\xb1\x1fU`8\xf5lv\x1dZ@\xe8\x91j\xce\xcb\x87\xdd\x83OA\xa3\xf9\xabI\xfc\x90\xd7\xacD\xd5\xd5<,\xc0\xba\xb3+\xbe*Ek\xd2\xd5\x12\x04E\xa2\xbfh\x1e\xdb?iq{\xcf\xfbaC\xf2\xf4v\x94\r5\x95\xfe\xe7I-\xde]\xf6\x8d\xf4\x89\x1b#\xfc\xec8\nYW\xb9\x9cC\x80\xd3}\xe7>\xee@\xc2\xf3\xec \xe3HZ;\xadj\xd8\xd0n\xd8\x93\x08\xa4\x08\xa7\x18e\xd2\xdf\xef\x95\xef]\xe6\x83\x1e$\x0b\xc4\x03\xdb\xe0;l\xec\xd1\xdc!b\r\xaf\xc8\x93\xff#\x85,\xed\xaa\xa2\xd5UWD\x01\xc7d\x10\x1e\xf8\xe34iD\xfc\xb0\xffCM\xcdc\xa7\xfa6\x94BW\xf4\xc5\xb6\xf0G\x19+\xfdZp\xdd]\xcc\x8b\x86\x83\x8b7\x9a\t:\x08\x8aJ\xf7\xe2y;\x8b\xcb\x03YSf\xbc\xe3\x8a.I\'e\x0b\x08;\xb4\x05\xf4\xcdV\x92w\xf0cc\xb9O\xc1E834\x04\x9f{\x9c\xc8\xa9\xf1E#\x84Q?\n\x1e\x19C\xf8P#>\x99\xcc\x04\xfb6b \x8bA\x9a\x1eZ\x00\xf2\x87\xedF\x7f\',\xb8\x12\x0f\xee\xed\x13B\x15\\\xfa\x7fj\xf8[\x15\xb0:\x81l\x90y\xacY\xec\xc0\xf8\x1e\xd4<+\r\x02\xe7r\xab\xac\x9e\x8d\x8a\x8c\xcc-\xac\xf3\x8b\xca\x0c\xd9\xf7\xf5\x08\x92\xca\x88\x9b\x0f"\xd3o\x94\xeb !AK\xd0\xf1eo\xd9A\xa1}h\x8f\x87H\xef\x87\rN"\xc5\xe6\xe3\x86D&\x18\xca\xdc\xa6%1\x92\x18&\xdd\xb5\x8f\xa5\xfbd\xdc\x84J@\xf2\xa5/N+W\x08\xeb\x0e{\x08\xa4\xb3s\xcc\t\x14z\xf3\xb7M\xc1\x9f\x98{v\xe8x\x08\xba\x81\xf8\xc8\xa1\xf3QQ\x08~\xb7S7x\xd8\xf6\xa7\x98\x1fS\x00\xcf)\xb7\x02\x99}A\xd4I\xea.\xdb\xf6\xd7n\x04%4\x0f\x90\x9fT\xa3K\xc4\xdc\xa5B\xa6\xbe\x83\xee\x91i\xe1P\x92$tc\x15\xefjk\xfb\x07\x17_\xdfy\x12\x04n>"\xcf(\nc4P\x84\x04gw\xe0a\xcf\xdb\xcc6\xa6\xd5\xe4=\xee"A\xd7\xb9\x05W\xe0\x0e\x9b\xfe\x8d\x87\x0f\x9e\xf1\xeb\xef\x8f\x1f\xd6\x1aX\x9c9\xb2G8y\xd5P\xe0\xd4\xdb&\xd3\xc5J\x87\xb9\x99\xe4a\x80\xe8\x99\x9e\xed(\x7f\x99\x8b\xceL/\xc8\xf2E6\x96\xb8\xd2\xce^]O\x8a\xbf\xbf\x00\x15\xfa\xe1\xf2w\xb3\xa03o\xca\xa7\xd8\xe2\xc0b\xe5\x84\x15\xea\x9d3\xa1\xa2\xc1\x94\xc3\xd2\xfe1\x17\xd8\xb05\xb7\xce\xd559\xec\xbfA\xd5\x05\x93+&OOh\x14eC\xb6ne\x80c\x16\x82\xd1}\xe5\x00%\xb2\xd9\x1e\xcb\x91\xb2\xbb\xe1F<\xd85\x88\xb8\xca;W\xd6\x95\x11G\xe3a\xd7O=J\xc4\xbd\x01k9g\x11\x01&\x96\xb6=\x08M.\x17dC\x17\xce"9\xcb\xfd\x13\xcdfj{J\x93r\x80\xbf\xe9\x08^\xbb\x035\xab\xae}16o,K\xf8\xff\xe8a\x0c?\xee\xabi\x80\xfb\x19\x7f\xd43\xbf\xd4\x01I\x88)\xcf\x81G\xe0\x9bj\x96\xadF,\xac-\xb5\xc5"\xe5k\xce\x17\xb8\xd9\x14\xd4\x1b\xfd\xc2p\xfc\x82\xe1\xb4\x1f\xc9\xeb\xeet\x8e\xff\xdcD\xdc\x9f\x81\xe6\xba\tR\x08Y\xc9\xb4&E5\xb2\x16\x1a\x87\xd9\xd3\x9c<q\xaeN\xd5OAf\xba\xa1\x8f\xab\x0e\xe5 \xc1\x1e\x1a\xb7b\x9d\x14nm+Wu\xc0\x7f\ty\x9e\xa8m{\xdeD5\x19\xbc\xcdM\xb8\xc7\x03\x9f9^\xe9\xea\x08Iu\xa5\xbdY\xd8\x16\xd2/ \x87\xaa\xa9H\xdf\x86-\x8aN\x83\xf0L>x\xc8\xf5;\n\xc4U\xed\xd8f\x81\x8f\x19\x9c"\xf3^\xde\xee\xbb\xfe\x12\xa6\x07\x84A\x92\xb3\\\xcc\xa1\x96\xb0\\I\xd02\x8a\xe0\xbe\x9a\xebR>\x1dZ\xe9\xaaX8\xc48\x1f&\x07\xa9\x99/\xcb\x804\xb1\xcdD\xab\x85\x8a\xbe5\x08\xf4Ye\xd0j\xd9\xde\xaa\x8b\xa2\x9enG\xb9|\xd5\x17\xcd\xdb\xa8\xf3\x1fG\x07\x1d\xe1\xa2G-\xb5\xd4\x1f\x10\xa7\x99CU6{\xae\x18B\x1e\x8fl\xf8 \xa3+\xc1*\x1cF\xab&=!dv\x9d#m\x7fj\xe3\x85\xab\xf1\xc0\x03\xc4\x94{\xe9\x80\xfas\xa5\xcf\xe0&\xba\xfe\x02\\\x11[V\x93\xdf=fpP\xbb\x98\xf7\xeaT<\nTe\xa5\x9a\xe8\xc4b\xb4\xe4\n0]r\xd9x\xd79\xfcmiX\xe5\xed5\x0f\x18\xd1~\x84O<6\x8d\xc5\'U#\xd1_(N\xb8\xf2?\x03\xc1=s\xa4\xb5\xf1Q\t\xa2+\xc7\xca\xdb\xa3\x05\x83\xd7!\xc4C\xa8\xe6x.9Pe\x07|\xb3/&9\xf2=\x87\xaf\xef\x1f\x12p6\xfeIY@\x18\x8eg\xc7\xb85\x8b_i\x9f\xeb\xc9\xc1~\xb2\x88\xf5\xe5\xfe\x9e8\x05\x9d\xac8\x12\x9aBdX\xec\x00\xa8\\\xe1p\xfe`J\xea\xfa\xd7<A`@\xc2k\x9f<\xfc\xb1\x0b\x7f\t\xac\x89G($\x8fC\xcdkj\xe7\n\xd6\xdb\xdd\x8b\x81!\xb3\x10\xd7\x8f\xf9\xe7\xc0\xf7\x02\xc0\x0fcn\xa1<W\xa8&\xed\x14\xc0\x00\x04\x12\xcb\xd0\x90S\x1d0\xab1J\x19\x06\x03\xa5\x83\xf9\xb9\x10"\x8b\x9c\xe0\x93]\x82\x19d\x12\xfd4\xa1M\x0bl\x93z\xe4-5\xd2\x93\x9d\x00\xfb=\xcbV\x8d_\xc6N;\x9d?\xc2\xc8\xdb\x01 \xb3\xd7o_\xb6)\xd25z0e=07\xd2\xa8\xaa\x1f\x01J}v\x0cZ^\xf0\xad|Ae\xd1\x94\xe8uD\xad\x94*M\xf3\xa6\xf2\xb1Y\xebuvj\xf9\x13*\x14\x80P\xaa\xdcE\x9a4\x92\xb7\xca\xa38A>\x8c\xad1\xfd\xec\x03\x07e\x97\xa6A\xa7\xe8\x18\x8f\xc5|\xd3\xbdL:)\xf3N\x15C\xb8\xd0\xbcr\x99d\x08=\xbb\x89\xf8\xa5\xb5\x8c\x9b\xa7X\xaa\xc8sD\x05\xe6RX*\xdc\xe1j\x12O\x81\xc1\x1d\xa9\xe5\x9en\xe2\x8d\xe5\xc3\xb1\x05\xcd\r\xa05\xa8)J\xbe\xb1>xF\xb8\xb4\xc7\x10\x9d.:\x9b\\"\xe9\xb7\xe7\xc3\xc8\xf3L\x8a\xa8\xb1\xd0\x81d\x1f\x91\x93\n\xe9{\x850K\xfd\xcf4\x820x\xa2\xa7\r%&u\x03\xc4g\x9861x\xd3\xd8\x85\xe2C\xc7~\x131"G3\xa0\xb9`\xc6\'\xd1\xbd\xa4x\xacp;\xb4\xfb\xfd\xe2\x86G\x10\xa0\xe7\xd8E\xe1\xa0\xb4\xfc\x13\x9dd\xca\xbb\xf8\xbe\x1a\x81\x9a\xc4\xb9\xe0\xec\'\xac\x01\xde\xcb>R&\xc9\x96n\xbdd\x94\xf5t\x8b\x0e\xac\x90\xe2\xf9J\x86\xb1f\x1f\xb8\xfdH\xbf$j\xe7\x1d=\xa1I\xb6\xb9\xc5H\xab\xccg\xb6\xac\x94\xde\xd6A/\xebZ\x7f\x9b\x8f\xfa\xd1u\x19\x8a\x8f\xf3\xf3\t2\x9d\xc4h8\nD\xfc\xe5-\xa4\xfb:oo\xa2\x7f\xb6_H!3\xba\xd1w\xa6_\x0f\xd9\xc3\x8b\xa2\x80\x17\xd2\xd8\x17\xba\x1a\xa1\xb0\xe4\x1a\xfa\x05D\x80Au>\x1ck$\xf5*XEB\xd4\xe8\x01\xfd\xed\x9f[{\xe4i\x1b\xec\xcf\xe4n\xea\xc0-\xd7\xb5\xbfXhVI\x13\x90Yr\x1b\xfc\x177\xff\x87\xd8\'G\xd5\x8d%\x91\x9c\x8dN@\xec\xbct\x0f\x0f%:\xcc\x95D\xf9q\xc3\x03mt2\xf3:\xa9 >\x81\x93\x9d\x80L4\x1fE\x97*>p\xa1\xf6\xdf\x92\xf9\x91\xbd\x198\xd8?\x97v7\xbb\xf9a/pS\xb0\x90h\xdf\xb0\x05\x11\xb5:\x89\xa6**\x97\xbd$\x8b\x04GaKwY@T\xf5\x10\xfb*\xc0z\x0e\x87\xc6x\xd0/\xbf\x7f*\xb1F;\xd0DSb\xfeF\x0fZ\xe3\xbc\xefl\xcd\x99D\xaa\xe5[\xf7eG!u\xeb]Gd|\xd6H8Z\xf2b\x08\xdd\x92m$\xd0)\xf8\x92D!\x85\x9a\x90\xecq\xc7:>\x97\x96\xb4n\x08\x86\x98\xc5b=W\xed\xe4Y\xd61e\x11\xabU\xce\x9b-\x96\x11\xe9\x15:\xady\xe6\xd0H\xb7\x9f\x84\xa4\xf1\t3=\x89\xda\xef\x0b\xd3d/\x14\xd0\xb1\xb1\xf1H\xb7\xd53\xbb$\xd8m\xb7c\x7f\xf1?\xc8\xb3\xba\x0e.>\xe8a\xc1\x88\x8e\xc1\xff\xf3\x93\nRv\xcc[\xa2\x9e\xbf+;\xb6\x87\xa5}\xdem\xe7\xe7\xc0\x800\xf7\x91\xa2M\xd0\xb8\x8cO\x86\xe3\xb8\xe3\xb9\xce\xfa\x7f\xf5\x9d*D\xb1\xd5$A\xfb\xe7\xc3#\xcbTH\xe7\xce:%{\x96\xb8\x83\\\x12\xaf\xa4\xa3\xef\x19\xe6\x93\xbd\x17\x00\t\x85\xba\n6z\xb7\xbd\xb5\x05\x90\x98\x99Ht\\`O\xdc\xe3\xe3\xe2\xc0\x95\xd7\x8b1\x91\x8a\xa0\xd4\x9a4h\x80\xefi\xcd+\xd0.~\xf6\x041\xfc\xbc\xfd3`\xcf\x9d\n\xbb\xf1{\x87\xf5jm\xe9!\x9ae\xff\x9c\xde\xcdm\x96\xff\xf66\xf8&I\x9fm[\xc6\xd2\x1d\xc2p\x82\xb91\x0f\xd5\xbfU{\x04$\xe6\xfb_\x8e\\-\xbd\x95w\x00O\x95:\xa1\xe0\xdc\xe0Y\x15\xe4|%\x02\xf3\x80\xc9;\xdd\xd6!\x17]9H4\x81\x04\xe2Y\x89\xe7\xdd`=\xe0s\x9b\xaf\xa3^o8:o\xc9\x86C\xc9g\xb2_\x1c{\xf4h\xb3\xf3\xbd\xf54\xe1\x81\x9an\xb9|\xe6:\x16\xef3\x88>\xb5\xbe\xec')
|
1
|
+
|
2
|
+
from flask import abort, render_template,request,Response,g,url_for,jsonify
|
3
|
+
from wtforms.validators import Regexp,ValidationError
|
4
|
+
import urllib,uuid
|
5
|
+
import datetime
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from hiddifypanel.panel import hiddify,clean_ip
|
9
|
+
|
10
|
+
from . import link_maker
|
11
|
+
from flask_classful import FlaskView,route
|
12
|
+
import random
|
13
|
+
from urllib.parse import urlparse
|
14
|
+
import user_agents
|
15
|
+
|
16
|
+
|
17
|
+
class UserView(FlaskView):
|
18
|
+
|
19
|
+
@route('/old')
|
20
|
+
@route('/old/')
|
21
|
+
def index(self):
|
22
|
+
|
23
|
+
c=get_common_data(g.user_uuid,mode="")
|
24
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
25
|
+
|
26
|
+
|
27
|
+
return render_template('home/index.html',**c,ua=user_agent)
|
28
|
+
@route('/multi/')
|
29
|
+
@route('/multi')
|
30
|
+
def multi(self):
|
31
|
+
|
32
|
+
c=get_common_data(g.user_uuid,mode="multi")
|
33
|
+
|
34
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
35
|
+
|
36
|
+
return render_template('home/multi.html',**c,ua=user_agent)
|
37
|
+
|
38
|
+
@route('/new/')
|
39
|
+
@route('/new')
|
40
|
+
@route('/')
|
41
|
+
def new(self):
|
42
|
+
|
43
|
+
c=get_common_data(g.user_uuid,mode="new")
|
44
|
+
|
45
|
+
user_agent = user_agents.parse(request.user_agent.string)
|
46
|
+
|
47
|
+
return render_template('home/multi.html',**c,ua=user_agent)
|
48
|
+
|
49
|
+
@route('/clash/<meta_or_normal>/proxies.yml')
|
50
|
+
@route('/clash/proxies.yml')
|
51
|
+
def clash_proxies(self,meta_or_normal="normal"):
|
52
|
+
mode=request.args.get("mode")
|
53
|
+
domain=request.args.get("domain",None)
|
54
|
+
|
55
|
+
|
56
|
+
c=get_common_data(g.user_uuid,mode,filter_domain=domain)
|
57
|
+
resp= Response(render_template('clash_proxies.yml',meta_or_normal=meta_or_normal,**c))
|
58
|
+
resp.mimetype="text/plain"
|
59
|
+
|
60
|
+
return resp
|
61
|
+
|
62
|
+
@route('/clash/<typ>.yml')
|
63
|
+
@route('/clash/<meta_or_normal>/<typ>.yml')
|
64
|
+
def clash_config(self,meta_or_normal="normal",typ="all.yml"):
|
65
|
+
mode=request.args.get("mode")
|
66
|
+
|
67
|
+
c=get_common_data(g.user_uuid,mode)
|
68
|
+
|
69
|
+
|
70
|
+
hash_rnd=random.randint(0,1000000) #hash(f'{c}')
|
71
|
+
resp= Response(render_template('clash_config.yml',typ=typ,meta_or_normal=meta_or_normal,**c,hash=hash_rnd))
|
72
|
+
resp.mimetype="text/plain"
|
73
|
+
resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
|
74
|
+
return resp
|
75
|
+
|
76
|
+
@route('/all.txt')
|
77
|
+
def all_configs(self):
|
78
|
+
mode=request.args.get("mode")
|
79
|
+
base64=request.args.get("base64","").lower()=="true"
|
80
|
+
c=get_common_data(g.user_uuid,mode)
|
81
|
+
# response.content_type = 'text/plain';
|
82
|
+
|
83
|
+
resp= render_template('all_configs.txt',**c,base64=do_base_64)
|
84
|
+
res=""
|
85
|
+
for line in resp.split("\n"):
|
86
|
+
if "vmess://" in line:
|
87
|
+
line="vmess://"+do_base_64(line.replace("vmess://",""))
|
88
|
+
res+=line+"\n"
|
89
|
+
if base64:
|
90
|
+
res=do_base_64(res)
|
91
|
+
resp= Response(res)
|
92
|
+
resp.mimetype="text/plain"
|
93
|
+
resp.headers['Subscription-Userinfo']=f"upload=0;download={c['usage_current_b']};total={c['usage_limit_b']};expire={c['expire_s']}"
|
94
|
+
return resp
|
95
|
+
|
96
|
+
@route('/manifest.webmanifest')
|
97
|
+
def create_pwa_manifest(self):
|
98
|
+
|
99
|
+
domain=urlparse(request.base_url).hostname
|
100
|
+
name=(domain if g.is_admin else g.user.name)
|
101
|
+
return jsonify({
|
102
|
+
"name": f"Hiddify {name}",
|
103
|
+
"short_name": f"{name}"[:12],
|
104
|
+
"theme_color": "#f2f4fb",
|
105
|
+
"background_color": "#1a1b21",
|
106
|
+
"display": "standalone",
|
107
|
+
"scope": f"/",
|
108
|
+
"start_url": f"https://{domain}"+url_for("admin.Dashboard:index" if g.is_admin else "user2.UserView:new_1")+"?pwa=true",
|
109
|
+
"description": "Hiddify, for a free Internet",
|
110
|
+
"orientation": "any",
|
111
|
+
"icons": [
|
112
|
+
{
|
113
|
+
"src": url_for('static', filename='images/hiddify-dark.png'),
|
114
|
+
"sizes": "512x512",
|
115
|
+
"type": "image/png",
|
116
|
+
"purpose": "maskable any"
|
117
|
+
}
|
118
|
+
]
|
119
|
+
})
|
120
|
+
|
121
|
+
@route("/offline.html")
|
122
|
+
def offline():
|
123
|
+
return f"Not Connected <a href='/{hconfig(ConfigEnum.proxy_path)}/{g.user.uuid}/'>click for reload</a>"
|
124
|
+
def do_base_64(str):
|
125
|
+
import base64
|
126
|
+
resp=base64.b64encode(f'{str}'.encode("utf-8"))
|
127
|
+
return resp.decode()
|
128
|
+
|
129
|
+
def get_common_data(user_uuid,mode,no_domain=False,filter_domain=None):
|
130
|
+
default_asn=request.args.get("asn")
|
131
|
+
if filter_domain:
|
132
|
+
domain=filter_domain
|
133
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[],child_id=0)
|
134
|
+
domains=[db_domain]
|
135
|
+
else:
|
136
|
+
domain=urlparse(request.base_url).hostname if not no_domain else None
|
137
|
+
if hconfig(ConfigEnum.is_parent):
|
138
|
+
from hiddifypanel.panel.commercial import ParentDomain
|
139
|
+
db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
|
140
|
+
else:
|
141
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
|
142
|
+
if not db_domain:
|
143
|
+
db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
|
144
|
+
print("no domain")
|
145
|
+
flash(_("This domain does not exist in the panel!" + domain))
|
146
|
+
print("HI")
|
147
|
+
if mode =='multi':
|
148
|
+
domains=Domain.query.all()
|
149
|
+
elif mode =='new':
|
150
|
+
# db_domain=Domain.query.filter(Domain.domain==domain).first()
|
151
|
+
domains=db_domain.show_domains or Domain.query.all()
|
152
|
+
else:
|
153
|
+
|
154
|
+
domains=[db_domain]
|
155
|
+
direct_host= domain
|
156
|
+
|
157
|
+
# if db_domain and db_domain.mode==DomainType.cdn:
|
158
|
+
# direct_domain_db=Domain.query.filter(Domain.mode==DomainType.direct).first()
|
159
|
+
# if not direct_domain_db:
|
160
|
+
# direct_host=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
|
161
|
+
# direct_domain_db=Domain(domain=direct_host,mode=DomainType.direct)
|
162
|
+
|
163
|
+
# domains.append(direct_domain_db)
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
# uuid_secret=str(uuid.UUID(user_secret))
|
168
|
+
user=User.query.filter(User.uuid==f'{user_uuid}').first()
|
169
|
+
if user is None:
|
170
|
+
abort(401,"Invalid User")
|
171
|
+
|
172
|
+
has_auto_cdn=False
|
173
|
+
for d in domains:
|
174
|
+
db.session.expunge(d)
|
175
|
+
d.has_auto_ip=False
|
176
|
+
if d.mode==DomainType.auto_cdn_ip or d.cdn_ip:
|
177
|
+
has_auto_cdn=True
|
178
|
+
d.has_auto_ip=d.mode==DomainType.auto_cdn_ip or "MTN" in d.cdn_ip
|
179
|
+
d.cdn_ip=clean_ip.get_clean_ip(d.cdn_ip,d.mode==DomainType.auto_cdn_ip ,default_asn)
|
180
|
+
print("autocdn ip mode ",d.cdn_ip)
|
181
|
+
if "*" in d.domain:
|
182
|
+
d.domain=d.domain.replace("*",hiddify.get_random_string(5,15))
|
183
|
+
|
184
|
+
|
185
|
+
package_mode_dic={
|
186
|
+
UserMode.daily:1,
|
187
|
+
UserMode.weekly:7,
|
188
|
+
UserMode.monthly:30
|
189
|
+
|
190
|
+
}
|
191
|
+
bot=None
|
192
|
+
if hconfig(ConfigEnum.license):
|
193
|
+
from hiddifypanel.panel.telegrambot import bot
|
194
|
+
|
195
|
+
g.locale= hconfig(ConfigEnum.lang)
|
196
|
+
expire_days=remaining_days(user)
|
197
|
+
reset_days=days_to_reset(user)
|
198
|
+
# print(reset_days)
|
199
|
+
# raise
|
200
|
+
if reset_days>=expire_days:
|
201
|
+
reset_days=1000
|
202
|
+
# print(reset_days,expire_days,reset_days<=expire_days)
|
203
|
+
expire_s=int((datetime.date.today()+datetime.timedelta(days=expire_days)-datetime.date(1970, 1, 1)).total_seconds())
|
204
|
+
|
205
|
+
user_ip=clean_ip.get_real_user_ip()
|
206
|
+
return {
|
207
|
+
# 'direct_host':direct_host,
|
208
|
+
'user':user,
|
209
|
+
'user_activate':is_user_active(user),
|
210
|
+
'domain':domain,
|
211
|
+
'mode':mode,
|
212
|
+
'fake_ip_for_sub_link':datetime.datetime.now().strftime(f"20.%y.%m.%d:{max(1,datetime.datetime.now().hour)}"),
|
213
|
+
'usage_limit_b':int(user.usage_limit_GB*1024*1024*1024),
|
214
|
+
'usage_current_b':int(user.current_usage_GB*1024*1024*1024),
|
215
|
+
'expire_s':expire_s,
|
216
|
+
'expire_days':expire_days,
|
217
|
+
'expire_rel':hiddify.format_timedelta(datetime.timedelta(days=expire_days)),
|
218
|
+
'reset_day':reset_days,
|
219
|
+
'hconfigs':get_hconfigs(),
|
220
|
+
'hdomains':get_hdomains(),
|
221
|
+
'ConfigEnum':ConfigEnum,
|
222
|
+
'link_maker':link_maker,
|
223
|
+
'domains':domains,
|
224
|
+
"bot":bot,
|
225
|
+
"db_domain":db_domain,
|
226
|
+
"telegram_enable":hconfig(ConfigEnum.telegram_enable) and any([d for d in domains if d.mode!=DomainType.cdn and d.mode!=DomainType.auto_cdn_ip ]),
|
227
|
+
"ip":user_ip,
|
228
|
+
"ip_debug":clean_ip.get_real_user_ip_debug(user_ip),
|
229
|
+
"asn":clean_ip.get_asn_short_name(user_ip),
|
230
|
+
"country":clean_ip.get_country(user_ip),
|
231
|
+
'has_auto_cdn':has_auto_cdn
|
232
|
+
}
|
233
|
+
|
4
234
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
235
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/templates/500.html
CHANGED
Binary file
|