hiddifypanel 3.0.0.dev63__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-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/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- 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/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.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.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
hiddifypanel/models/user.py
CHANGED
@@ -1,5 +1,173 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xc8\x1d\x00\x00\x12\t\x04\x00\xa7\x96xU\xf5\xa6\x1a\xded\xacQ\xf1\xf9&\x1eN\x00\x00\x00\x00\x00\x00\x00\x00B\'F\x8c#\xef\xac0^\'\xbaR*\xd7\xbd\xb7$\xaa7w\xec@\x16\xa7\x10ehX\xcaW\xeb\xdcd\x15op\x8c>\xc4YT\xc1\x90\xff\xe3\xfb\xf5\x13g\x10\xb3B`\x7f\xce\xaa\xffgJR2Pq\xb9<\xaa\x90\xad\xeb\x1d\xa0\xa8\xd4a\xf9\xea|/R\xe9\x19\x893\x0f\xd9\x81M\xab\xe1\xe3\x15\xd8\x8d\xbf\x0bt\xaf\x8fh&\xfa\xbc?\xa2 \x0f\xa7\x85\x88\xafN\x1dT\xec]J\xba}\x80\xd0k\xf9u\x0b4\xba\xfdH"\xec\xdc\xb6(\xde\x95\xb7s\xc58^\x93F\xce\x9d \x833BMrjhO\xcd\xa9\xf5\xc58\x82\x90\x872^\xbc\xa4\xcc9\x8a\xa7\xf3\xd9\x19Q\x93 \x1c\xe9\xbd\x01\xab\x8e\xd3\x82\xa3\xecYe\x86|9\x1e9\x1e\x1c\xe0\x1bF\xe7\xb9\x85\x14n\xa5\xbb\x81\x7f\xda\x84\x04\xd9\xd0\xbb\x08\n,\xfb;\x08%\x9f\xad\x05\n\xd2C\xb15\xb5\xd8ga\xe3\x1d!0?\x1f\xd2\x811\xb6\xaf^e\xf6\xf5{s\x9a\xb77\x7fj\xa7\x12p\x89U\x87\xa8\x9c\xfc\xf7\xdf|\x98\x8f\xad\xc6\x98\xe1r1\x15\xc9\x18\xa5\x9f\xf2i\xf1\xcf&v\xedf\x1e\xe7e\x92\xa9\x86\x14Q\xfe$\xed\x7f\x81@\xc8s\xb5\xc0\x9a\x95a\x892h\xf4\xfbxh\x8e\xf8\x9e\x01\x9a\xfe\x8b\x1f\x91*\xe7[]!\xec\x112n\x83\x805x\xf4|\xc7\xeb\ng3;\xd7svT\x07q\xaf\x81]j\xdbk\xc3qR\xb7\xb4\x08\x0e\xc1K\xa1x\xc2\x9a\xac\xc9\xc0t\x04\xcf\xba\xb8\xf4/<\\:\xfc\x18\x90\xe4\xaaSze\x17\xf7\x996\xec\x1e9=\xeb\xc7M\'\xeb+\xb7\xd6\xc4=\xd1]\x00sj;~\x02*\xfbv]\xf6\x83_u\x0f\xdf<\xf4v\x98\x0c\x0b\xce\xd6\xbf\xb9\xff\t\xf5\xa4[\x0e\xa4\xae\xdfj\x05\xe9\t\x8a\x8e\x1fp!%\x02;\x0c\xe5\x15\xf3\xd5\x04\xdb\xd2\x07\x94\xc2h|\x10\xd1\xca4\xd3]\xf3\xb0\r\xcfoZ\x18\xfbTqb\x11\x15$3\xcb=W\x84%\x1d\xdel\xfe\xcc\xa5\x88\xfb\'\x12\x8e\x9a\x9f\xa1Ri\xa9bi\x84\xb3t;6\x17g\xd6\xfe\x15~\xca\xc0j>$\xaf\x94\xb5\x17&\xfd\xb3 \x9d\xea\xab\xc4\\\x9c8>S\x99\x0e\x16\xbc\x948_\x17\xfa\x8a\xe2\xf5\x94\xd6\x0bJ+\x02\x0bk\xb3>\xe3\xcf\x87\x11!\x84{\x11d\xce\xd0U\x0b\x92.c{\x96\xd5\x03\xbc1\xc52O\x1ah\xa3\x94w\x7f\xef\xbd\xde\xd4\xb9:"(\x8c\xe3\x17\xe1\xa9\xda8$_J\xf1\x06\xa0\x88\x98\x9a\x87\xa3\xc1,\x1e\x9a\xbf\x03#3\xe4\xd4\xbd\xa8\xde\x97\x94\x9a\xe1"\xbd\x90\x15\x98\x97\xd8M\xdd<\xe2W\xec\xc6Y\x9d\xf4F\xbb*\x99\xdf\xed\xf7\xac7\xbda\x81\xfe\x96\x9c\xaf\xad\x96F\xbb<\xa7$"c}\xab\x15\xde\xce\xbb\xc5\x93\r"\xe3\x93>\x99\x9e\x85Xa\x12F\xbe\xa4X\xbb\xdb\xcax\xf8\x04&fol\xa2F`iL\xe8\x97Twq"X\x15,\xe4\xaf\x10\xd0\xf2AN\xb3\xf9-BA:\xf2S\x95`mx\x80\xbf\'\x81Dj\x91\\\xb5\xd8\xdf\x0et\x9dL\xc6\xc3n@\xba\'\xce;\x91\x0fn\xaf\x8d\xfd\x9e\xa5\xb9UXN\x0f\x9co\x80<sv\xd6\x8d\xdad\x9bB\x1e\xa3v\xefM\xc3\xd3\xa7\xfd*X0\x9d\x15\xa6w\xdf*"\x1d\xda0A(\xa0m\xffe"\x0c\xa7\x0b-f=\xaf\xe5\xce2\xc6\xfa\x07U\x82C\xbf\xd0U\xc75R\x8f<kLsw\\\xf8E\xb6L\x0c\xf6D\xea\xf3G\xf9\xba\x95\xf3w\xe9`\xd1n\xbe\x1a(\xb6\x97\xe5\'\x84P\xd3\xed\xfa\x14br3\xae\'\xb5\x05\x94\x13\x17\x07\\x\xd7]\xb4z\xe7\x96\xd3eo\xfb@\xf2\xe1\xe6\xa7\xa7\x96\xa1\xb5\x81\x9b\xcf\xc0\\~\xa6&\x08\xa9\xd6\x1f\n\xe83fbG\tB6H\x18\x19\xa4&\x99*S\xfa\xd9\xca\xe3\xe7f\xbd\\\xe7\xb9\xf3\x02\xe7\xf1:\xbf\xd8k\x9d\x8a\xd5\x1d\x97"\xdf\x87\xb2\xbc\xd9\xc2@\xdf\xa0I\x98\x95\x8f\xa9\'\x90D\x17\xf1\xec\xd6\xc0IX\nBO\xc9\xd9\xf9\xa1:u\x1a\x13\xe3\xc4\xc2\xfb\\u3\xc0W\x91\xda\xc9\xd3\x15{\xcf\x90\x15y\x1e-\xa4\xc4\xf3O\xa5\x19\x18m\x97A\xf5\xa7NO{m\xcfQ\x9e+\xf5\x97\xdbv\x1bduO\xb1JKA\x9e\xf9x\xe4\xff\x10\xc0ihG\x02\xbc\xd9b\xe4\t\xc3\xf7\xf2\xc3\xf0L\x8de\xbf\xcb\xbd\xd7\xf7\xc7{\xbb\xb9\x9f\xce\xdb#\x0e\xcf\xf9\xa3\xfc\x07\xe7\xe7\xd2\xf6~\'^H\xdb\xf4\xc3\xab\xa5eh[\x0f\x11%\xbdf\xb9\xa7\x1dkZ\x05\xac\xfb\x07\x16\x0fM\xc1\xc5\x9f^{\xd2\xd1\xd8\xf7}U\xedxw\x02\xcb\xce\xe6t\xa2\xc6w\xf6\x1f\x93\xe2\xb5g&\xa9\xfe\xcc\xee\x10L\x89Rye\x8a\x85m\x9ai\xaa\t\xc7/\x9d\x8d\x8cET\xacJ\x1e9w\xf8 z\x8a\xaf\x9a]\x97~\xff\xc8xA\xb1Y\xb5l\xc9\xd0\xb4\xbef\xa7\xd1\xf7CY:\x06\xf0\x8fT\x92\'4\x97\xcaI\x1a?G\xe4\x88\xd9N\x08\xfd\xe7\xf6Q\xf7\xcd)ii8/&\xd7E\xbd\xcaA\xb9\xd9\x95\xc6\xc0\x82\x958\xc3\xe1\x08\x01\xc3\x03\xde\xefA\xa5"g\x18\xac\xf1\xc3IO\x9a\xafZ\x08\x90\xe3\x05ER1\xb3\xcbL\x0f\xdc\xb6n\xcbQ_\xdak\x17\x13\xe5`F\'\x1a\x7f\xe7;\\\xea\x8bT\xad\x1c\xa1R\x89\xff)26D\xfem\xc6\xcc\x1d"\x05&\xba}mir\xc8\xd1\xb0Dk\xed\x199U\xa2\x7fs"\xafdfx\xcfE\xa4\x07\x94\x1fd0f\x0b\xb8\x0b\xb5\xd0\xf2\xde\x08ZZ]\x9a-\xbe\n\x06\x8e}\xb2\xa6\x1aS\xee\xf5\x88\xac\xda\xbd\xd6\x03\x0c\xfc\x1av4\xfa\xf8\xb2\xa4\x80\xe2\xc7#\xf7X\x8fK\xcc\xf2\xae+y\\\x0b)/p\xc5\xb7\xb9\xe9\xdb\'\xee\xf7\x06\x8cx\xb8\xd6\xfe\x1cyN~x\xb9\x84\x9dQ\xa2r\x13\xf1\x02\xe4\xeb\xc1>\x95R\x8b\xc9kQB\x10\xd3\x00vS\xfc\xb8\xe8i\'\xf2N\x11\x04W\xf8B\xef<\xc7\xf0<iIUN`\xa9\'\x03\xab\xe2\x0c\xb4\t\xba\xb7|\x99Ss\x15~Q\x88\xb6\xdfM\xea\xd1\xf2\xd9\xfaNT\xe6d\xc3\xda\x0c\xd3\x91\x9c\x9bx\x82y\x1f\x85\xf8?U\xc6x\xf7|\xc7\xfe\x9d\x0b\xf4Oo\xeaDR\n\xfeU\x10\'\xf0\n7+\x98\xe3\x8e\x1b\xf9emQ\xa3^\x9c\xfe\x06\xfe\xa4\x0e\xcf\xbdd.\x99\x82\x11\xdf3!\x95;\xb0b\xe5\xa6\xcd\xe4\xa8\x8c\xf2\xf5,\x83^\xc9ot\xab4\xf15\x04\x9dz\xec\xd2\xc4\xc2OQ\xb3z\x96d\x11\xa8\xc6!\xeb\x05\xc4{,\xd0\x00\xd0\xe8Pw\xe0\xf6\x81Um\xb0\t\x00\xa1\x8a\n>q\xff\xdeK$\xf4F\xc8>\xa7\xf3\xea4\x1bg\xa6\x9euE\xb6v\x15@z\xb9\xaeZF\x8617M\xa1\x18\xa0\x8fO\x7f\xc0\x07Hj\xa1\xf7L,:|\x8ejo\xc0ys\x89\xc9\xe0\xe6zt\x99\xe8\x16}\x10\xe1z\xb0~Vi\x9a\xaf\x02k\xab\xcf\xd25\xe3\xc9\xf3^\x14\xbay\xf9\xb0Q\x0eh\xd8\x01\xb8\x8d@\x9c\x13\xcbb\xa9t7\x11\xa8\x1e\xcf\xa1\xa0\xbc\xe9\xa4\xa3VX\xf9\x11\xa1\xf9#:\xa9w$$+\xa0V\x16\x8d\x9f\xdb6\xfc\xc7\xea9\xd2\xe2\x7fHC:\x8ddH\x1e\x16a~+\xc7\xcd\x9dn\xeb\xc1\xa4M\x16\xf5\x8f3I\x0b\xe6n\x91\xce\x12\x83\xc4\xac@\xe98\xe3O?\xcf\\\xfd\xea(;\xbd\xa1W\xdat\x9bx\xe2\x80\xe9\xa3\xdb\xd2\xab\xd6\xadsE\x10ST\x8cq\xeb\xe8\xae0\x83X\x82S\x80:<k\xada\xe6\xd5\xa1\xc0\x9a\x92\x9f\x16Qa\xd9\x0c\xd3\xf0u\xf9\xb7\xe6>\xcb\x1e\xa3\xaaJ\xc9\xb8=;\xe2\x93\x9fx\xaePC\x91\xf7\x11wk\xb4C\xc0\x8bwx\x8f\x0b\xef\xac\xd4\xf9\x08%\x85\x11>k\xea\xa0(\xf2\xaa\x19W\x91h}@y\xbe\xb9\x8b\x08Bi.\xf9\xab\xc4$1\xf4\xaa\xd4*z\xddqpd\x877\x85k\xd8\x15\xdf\xe1\xdbX4\xb9\x94M\r\xd6\xd8\xa2p\xef\x13\xabx\x8fsKXK0\xb1\xd6\x97\xfa<)\xca\x9c\x1c\xec\x89\xf9\xa3\xc2[c\xd7\n`:jC\xc9S\xf3Q\xccm\x99\xa4\xfb\xb3T\xa2\x0c\x92,\xa0\x1a\x843\x87\xf29\xf0\xdc\n\xf7\xb3\x19l\x0ej\x03E\x9al\x14\xfe\x90\xc9\x95\x82\x9b\x90\x07GB\x80\xbc(\xf2Z~~\xc1e\x9e\xb2\x85\r)o^\xa0j\xd9\x1a\xc2^\x1f\xbd@\x93C\x02\xb9\xb4J\xcc\x92e\xe5\xf3\xdaK;\xb1\x90\xbc\xb6\xd5\x80[\x1e\xc1k\xc7\xf8>\xd4\xaf\xe5$j\x9f\xb6\xc3\xf6\x844\xa4\x8f\xaf\xd9oW\x0f+n\x9evQ\xe6\xd8\x17\xd2\x90J(\x1e\xb3d\x0c4\x13\t\x0bB\xb8\xb3H\x08/&\xa4(\x19T*fK\xc0\xa0\x87K\xac\xad\xf5p\xd0\x9f\x1e\x8a\xe4\x8f\xe7\x85\xefLq\xceJ\x1d\\N\xbd\xd0\xce6j\x99\x1d\xce_\x89\xe4}T\xf1uRI\xac\xb5\xbd;g-\xe9\xb3\x8bz\x98"V|\xdb\x02\x15\xb9\xa7\r()7\x8b\xe0\xf0\x00\xbd\xec\x05T\x1e\xa6*\xad0\xf9V\xdb\x8c\x95:\xa0\xad\x8b\xfb\xa2CSC\xf9n\x15\xcfS\xdd\x86P=\x17=EV\xf9\x94,Y\x8eZ}\xd6\x1c\xa4DU\xf7q \n\x1fF,\xde3\xe80\xd2\xbd5\xae\x1c\x95\x8bKl$\xd9>\xeb\x92\xfb\x8b>\xba\rikvk/\xe8\x84:\xd0\xd4\x00\xaa\xca4]V\xe9\xcc\x04\x16\rYRF[\xc9\xdd\xdclq\x1a\x0b\xd9FU\x8d\xf3a\xab\x0c%\xf5\xb7\xc1\x97\xab\x83FA\xc0K\xff\x9d\xa0\x1f\xfb\xf9\xc3\x83\xe0\xcd\xcaKJ)\x0b-B\xca\xe0\xec\xd4\xfd\x07\xf1\xcd\x04uwqG\xce\xe9\x07/\x99\xb5\x03\x8c\xd4\xac\xd3\xf1\xb9%\x87Y\x85C\xd5\x8f\xf5\x16\x9ed\xcc\xec[\xcfa\xd0\x1e\xd0m\xd3\xd1jV\xab\xcbl\xe0\xf7oQ\x19\'\xba\xbcO\x93\xe6\x99\xafg\xc5~(&\x99v\xfb\xf9\x0f\xc7\x1dq\x13\xbfco%$1P\xdb+p\xf29\xd1\x8d\xd7\xbb2\xb8\xf8\x97\xaa\xef\x7f\xed@\xd2\x0bOvY\xa9L\xd7\x93\x9e\xa5i\xd2\x0e\x18\x12\xb0%\xca\x109\xd30!\x9a5\\\xfdP\x90\xdf\xb1\x1bDl\xc0\x91Nn\xa0\xea\xbf\xf1\xb4&\xc2\xac\x1aX\x95\t\xb8\xe4\xc1\x1b\xebB\x82]\xc4\xe5\x03\xe4\x81\xf2\xcfhT\xa9F\xec\x92\xee\x8b\xcf\r\xfd\xf3l]z5\x13\xdd\x859\x9f\x1c3\xedf\xc5n3,\xafKth_Y\xd0k\xf2\xb3\xb8\xeb\xd1|\xbexv\xe2\xec\xda>\xda^\xe0\xd8\x80Q\x8c\xf1\xa6k\xd0(E\xc1\x10\xdd\xf2\x91\xd0o\xd0\x90\xbe\x9a\x08\x84\xbd\xfa\xa9\xc5\x99b\xfc\x82\xd4u\xde\r\x88^\xb2DQ\x93\xedG-\x92\'5\xf6\xc3\x98h\xa1\x07:\xa4@\xf1\xf38[\xb8\xd7a\xb2h\xb79%\x90nN\xeb\x99M\xb8O\xad\xa2\x07\xe4&\xed{\xd5\xed\xe3j\xd0\x9c\xe0\x85\xbek\xe4\xaf\x00\xb6\x07\xcd\xf3\x86l\xf0\x00Q\x9f\xee\xe6<\xa8\x15\x0cF\xdc\xa2\xcf\xdb$d{\x85\x10\x8f\xe6;:6\x17Y\xc5\xcf=\x81\xe8\xd3\xd5t<\x19mH\xcaI\x06sN\xf1*i.\xd3!dO\xa6*Z\x019\xb5\xc8u\xb1%\xc2\x99_\x860j\x9dU\x8f\xe09v\x01\xa1\xc4I1\xc4\x1dl\xdb\xd8Q\x05\xf4\x06%C\x9a\x9fx(\xf2\xae\xecP!\xa2\xbb\x01\x87\x1f\xb0k\xc0\xf7q&\xef\xe7[\xff\x02M\x96\xae\xcdE\xf0\x06\xd5G\xd5\x7fBQ\xc8z/\xa9\x90\xf9\xf8\x99\xad\xe6N\x85\x186\x9f`\xbe\xc1\x7f\xd0\xdbC[y:\x13Y\xe1\x9e\xb3/-#\xec\xac\xe7\x10\xba\xe2\x00\xd0\x1f\xab\xa1XM\xb2\xf2\xd6\xdd$\x02N\xec\xb7\xb6>\xac\x99\xb8\x99\xd2\x16\x93\x83\x7fL\x07\xd9\xba_\xbaS~\x9b\xfe\xf8\xce\\\xc6\x96\xdc\x89\xca\xcb\r\xd5\x9b\xe4,\xcb\xe5\x03\x81t\x12\xa0\x15\xe7\xb5*\xb5p\xd1\xb3jM\x9b$#\x9e\xa4j\xd1\x15\xbdH \xce\xeb\xfd+\\\xee\xd3O{Q\xf1A\x85N\xad\xf5[\x80Y\x8d\'\x07<\xb6\x9f\x96\x8f>\xf8\xbb&\x98\x92cd\xfcd\x9c\x9c\xa5@\xe3\x01\xcc\xcd!T\xc4\x16\xfc\x80\xbd$\xb6\xbf\xef\xb6\xe3m\xbe\x1a8\x96\xb5\x1c\x1b\xc7%\x14lZ\xc0\xebC\x0eN\x92\x7f\x02\xcb7A\xf8\x17\xab\x99\xd4\xe3\x10nZ}\x9c\xc64\x9cy)\xe3>\x95\x16\xf5\x0b\x8fm4\xb6\xc6\xa2\xf8:u\x16\xf4D\xb0@}v$\x1f@\x9cM\xb3\xed)\x17\x08\x1c\xcb\x95,81\xb6\x1fV\xb0;~\xfbs2\xea%\x15\xc7\xb5\x877gh\x84S\xae\xc5\xfc\x9f\xa6\x064i\'w\\\xc1Z\xaf\x08\xf2\xb6\xe6\xc1\xc4%^l\xd0`\xacGR%u\xbb\xc3+T\x1fY3\xef\xd9HbAY.x@`&\xcc\x7f\xea,[\xa3[\\\xe8\xce\x07\xce\xb4\xcc\xd0\xb65 u\xb7!\x11\x05\xb5P\xbdPM\xa9\xf1_\xca\xdb\xc7\xdf=v\x82\xdf8e{\x1d\x820\xea\x96\x19\x13\xa6\x07\x886\xe7X\x9bP\xcfd\x8dZ\xb3!\xbd\xeae\x7f4\xb6E\xc3\xeb\xe9u\ne\xd6L\xdd\x1b\'\x7f\xb4\xda\x9d\x8c\xe5\xe5\xde\xea\x9aX\x87u\xc9\xca!\xf49\x83\x01`\xc8o\x9e\x1b\xdc[\xc4\x86\x1a\x96\x89SRu\x8er\xf3\x858\xa1DT\x1e\x8d\xd0\xb1?.j\x0c~\x93\x9d\x05%\x8a\x1d\x0cq%\x15|\xf6[?\'g\xba\xbf\xce\xf8\xc5\x1c\xc44\xb1V\x19\xac\xecn@O\xd3\xa9$s\x1b1\xeb\xaa\x93fo\xf6\xa9\x9c\xb4LW\xbb\x88\x00\x8e]R]\xa2~\xf5\xba\xd4\xf6e\xa9J^\xcfhuj\x97\xd8\xa0\x10\xd8,p\x8fz\x7f\xbd\x7f`\xa3\xd34\xb4/~\xb00\xda\xaa\x00\x91\x89\x82,\x07\xa6\x13\xf7\x8a\x10#\xddaRcATy\x98\xfcx2y\x08U\x11\xfdAJ\x8c!\xbb\xa7k\xa3\x93\x02\xbf\xba\xe1\x1f}.\x1ea\xd3#\xbe \xd5I\xd3\x99\x92u\xc9\x0f\x1c6\x8e\xd6\xcb\xc9\xa8\x80XHU\x00\'~\x04;\xb1d\xc3\xc3\xd7\x0c\x8eQRE\x97\x12y\xab\x18@V\x8b\xed\x97\xf1\xe1\x83\x7f|\xdb\x12\xf5$\xf95\xbb\xed\xa6L\xb3\xbbG\x8c\xdaY`\xd6\xbd\xe6\xce\xb0<?v\x15\xe3\xc0N\xfbm\xb00/GL\x1aU\x8e\xca`\x9a\xfa\x8f\xe3\xa0\x8fS/\x87@\x8f\xfa\xa5aP\xf1>\xca\x1b+f\x9e\x9a\x1f\xee\xa3;\xe0\xd7\xfd\x1a}\x91\xd1z\xb1\x97B\x1e*\xf6bKak\xd4e\x88\xa3\t[\xabh\xb1dw\xdc"=\xb6\xd1\xd8\xa9\x91k\x8a\xb818+r[;\xd0C\x13\xbf\xa6\x14x\xf7\xa4\xa5\xf5s?\x85\xa6o\xe1?\xcb\x9d\xd0(n\xf1\xbf\xed.!\xa64\x7f\xd5q\x89\x9cY\xb9\x12>\xcbQdF\xe6\xeb\xae\x165Aq.\xb7/\xb8\'V\x1c\xd0\x91\xfc\xe2\x80\x9d\xd3\xb5\x88\xc3\xa3w\x1f\x97rK\xdc\xedU\xb0\x1a\x9b\xfc|\xeb~\x02TbF\xf0\x05?\x9dG\xfd\xcf\xc7\xc4\x8e\n,\xac\x88\x1a:dz%\xcdz\x13d\xa1\x1egH\x8eP\xc5:I\xea\xd1\x05l=\x08\x8d\xb1~\x8c\xc9t\xbe\xef\x7fMf\xe1\x15\xba\x86\xdd\xda\x81a|\x02\xf2[\xf0Zo\xc1x\x977\xc7\x17\xd6\xc9\xd1\xd0\x07Mv\x95\x90(M\x86s~\xc9\xac\xf8\xb9HHa\x18;\x1a5\x83\x9e\xe8\x9a\xfd\xab\xfb,\x11VE4\xd0i\x82t\xbeAV\xf1\xf7\xaf\xc7\x83C\x8c)!\x93\n\x17MF\xa5\x1f\xdb\xe4`\x9dg\xd6\xa5\x1f\xe2\xa3\xaf\x89\xb3\x0e/Y\x03CM\xe3_oD\xcf_\xbaw\x82Ny\x84%l\x90mN\x12\xe3\x16\x9b\x14.W\xb3\xed\xb8\xd2\xf1\xdepeGc)\xbf\xf0\xbf\xcc2\xa9\xaeKe\x81\xdf\xaf\r\xb5\xf0\t\xe8\xf79\xf2\xea\x9d\xbd#\xa5 #\x95\xd6\xf7\xc2%\xe0\xa3\xe0m\xa2\xcd\x8ck\x1e)4VK\xa8\x0bz\'\xc9\x98k\xc7\x8fN\xa6\x8d"\x86\xca\x13\x16>\xbdQ\xad\x8a>%\xd3\xc3\x05\xb1y\x90\xad\xd9\xfd\xa7\xbb\x12\xcf\n\'\x802\x16\xb2\xad\xe1d\x17\x8e\xa4O\x12*\xc8\xe3\x83P\x96\x8e\xcb\x10p\x88ky\xf2\x91\xe7k\xd84\xe5\x9d\x02\nn\xb5\xc7GkG_\xfct\x02z\xdfl\x0b\x9d \xe7\xe1\x15\x93\x06\x16\x0c\x1fC\x97y\x04%7VQE\x9e\xc5U\x1f\xc1mG\xa0\xfa\xef\xc47\xd9\xcc^\xba\xc5\xdc\xe5x\x835U9\xfa\xd0w(\xafbH\xcb\xaf\xde=\x01y;\xb7\xf7{A\xe1\xa8\x96x:]b\xdf0z\xd5\x7f0<\x82\x93\xe8\tr\x0e\xef\xed\xd0\x8cGJ\x1b\xb3\x9e\x8b\xb8fc."\xe7\xfezQ\xe5\xb1\x81\x1a@\x96\x89l\xe5\x87:Q\x15\x80i\xa4I\x87{&\x0e\x86\xe2I\\i\xae\xbb:\xa9%\xcd\x94&\'\x86i\xa0\xe1\xb5\x00\xad\x8f2\xc1\xa5\x81\xc8J\x9cN{\x14\xc7\x85\x18\x0e\xf1\x9ff\x17-\xdd;\xb5\x84\x8a-|\xf0\xd8\xee\x0b\xdd\xbd\xd83\x9c\x0b\xdf\xfdLd%\x05\x0e\xdcz\xcb//\xf3\xc7\x1d\xde\xeb\x9e\xf76\x01\xc3\x16\x1bri|\xaa\xb1eIg\xc9B\xa4\x85\x1c\r=\xfak\x0c\xd3\x99\xeb\xb5\x14k\x88\x9b\xd1L^:\x93M\x14\x8fz\xebw/\xcfq\xae} \xadF\x1ap\xec\x04\xb09\xf8\xb3\xaah\xac\xd2\x1c8\xfb\xc4~m>[\xd7\xa2\x93\x05;\xf5KS{|~AmG\x1d\xbc"\xa8\x9cS\x18\xa1^8R\xfaP<\xfd\xfd\'\x11%\x9c\xf2\xa9\xae\xf0\xe2\x07\x9d\x16dXL\xcf\x97\xfd`6t\xaf\xff\x91\xce\x8d\'G{\xf8`3f:\x04\x01Q4\xa9,\xfdRd}\xe4\x12]\x9ci\xffw}G\xfb\x12&)i\x1eE{\x82\xfc\x8a\xbc\x84L2\x98:\xb4\xc0=7c>\x9e\xeeF\x0fK0?\x80\xf2q8\x103\x80\xa6\xb5\xca\x8fQdO5\x8a\xc2,\x8a\x08\xab\xc0n\x7f\x07m\xb9\xf1\xeev\xd2\xc0\x17\x92\xbcC\xd8q\x80*PF\x96\xf37K\x1c8\xf7\xe6A\x0b \xd1\xf1\xcb\xaf\x9f\xabm\x82\x93\xd8\x12\x95?\xda8Y\x13\xdd\xb3Ch\xea\x94\xab\x10\xf6\x93\xa7]\xb8\x0c\xe5L\x10\xec\x04\x83\x9b5=\xfa\x82\xf2\xacT\xc4BH\x8c\xa6N\xba\xe3\x11\xf0\x8b\xd5\xee\xf59}\xe7_o\x9d=\xd4/x\xfc\xf7\xb7\x00\x1e\xe2w\xcew\xf6l\xfbe\xad\t%lq\x8c\xb1\x8aIi45k\x1cY4|\x80\\,Y\xa2\x08\xcd\xcd\xf9k\x82\x0f\x19\xdcI:\x19tO\x8b]\x9aP\xab\x9c$\xdc\x01\x12\xcdV\x15v\xf2\x18*\xd5\\\xec\x99pdfj\xfc\xff\xbej\xc5[\xd8\xe3a\xd4W\ne_P\xcb;\xf1^0%\x15\xcd\x9a\xf5=\x95\x03\xda\xf9\n|\xa9y\x0e\xf2\x85|\x1a\x9cr\xb88:\x82%c2\x82\x7fYR\xda\x9c\x9e\xd9\x0eZ"q\x91\x9f\xd0\xb6\x7f=\x12\x89JZ\x11rjf-\xcb\xc9\x7f\x86\x9d>\xb4j\xe5\x86\xc8Y\xb03\x01p\xd0\xb0\xd8\xcd\'\x07\x98\xeafUg\xe2\x9d\x12UH\x81\x98)\xe1\xea0H\x95"\x82YG\xc1k\xfbw\xac@8\x7f!\xb9Vi\x1e$\xad\n&B\x81\xb0\x00"\x94\xa6\x8d\xfd\xc3\x17\x1bG\xca\xeb\x1e\xc3"\xcb\xd9[B\x01^L\t\xe2\x8a\\#\x82\x9ba\xa5\\\x1e\x8bv)\x9f\xcaQ\xe6[\xd0u\x8a\xee\xfda{y\xf4\xcd\x04_pl\x9c_\x90@\x04\xbf\xae\x1b\xc3\xc0tE\x12\x93\xc3\x95\xdc\x8c\xcejOgZ\x11\x9a\x92gA\xe8\x8f\xf7%s\x92V\xfd\xfa\xbfYo\x80j\xa9\xabdLkkG\x9c\xfep*\xb3(\x16V/\xa1\xb5\xcbx\xf1\xec\x90\x87H\xa8\xf6\xbd\x85\x94\xa2\x96G\x03_{ \x1a\xb2\xf4e\x04|\x9c\x11{\xab\x08\xe5\x1e\x01\xac\xb7\x07\xcf\xc9\x07\x10\xcc.\x0bj\xcd\xdeIk\x9d\xa0=fZ\xe1\x06\x8e\x0bOj{\x94\x97\x11y*\x91R\xa7rs\x07\xe8I\xba\x0b\x0c\xdd#\x93\x01|\xc6I\x06\xd0Y\xce0G\x9d&\x94k\xff\xf1\x8eYy\xe6Mx\xaa\xa3\x83\xd2\x02BU\xb34\x1d\xa8di\x0b%\xd3\xe1(\x13\xaf\xc5\x16\x98\xb3\xe3\x9e>T\'`\xcb\xa6K\x91`\xf9\xfb\xce\xbb%\xcc\xc8\x8c\xb1\xbc\xe9\xc1\x12\x7f\x01r\xa1;=\'\xa1\xe4\xa7\x97^\xfc\xcd\x963\x0f\x0b\xf6\xa1d>\xed:\xfd\x88\nH\xef\x17\x08\xd5\xe1\xc3\xaa\x8d\xcd\x01\x1a\xda]\x18\x08\xb6d\xaej\x88\xa3\xbe\xeah\xec\xb1s\x00\r\x95>\xec\x11\xea\xe3\xebq\x92\xcf\x15U#$\x8d\xa2,\xd4x\xadN\xc0*\x15@;\xe1\xb2f\xcc\xb7\xee\xeb\xb3\xacB#\x9e~ht!&\x99\xca{\x1c_\xa3)\x98\xfe\x92}\xf6\xf9r\xca"\x8ax\xe0 \xd8\xdf\xa6a\x89\x83by\xe3\\!\xb97\xefe{\xbba)\xc8\xee\xae$wp\x9a#\x06*\xaccG\x83u\xa8Y\x9c\xc1\'\xa1\xba\xf0\x8fQ\xc8U_\x8ci\xe4vst`;;\xd1\x05\xea\x8dprn\x88\xf6b\xc0x\x8a\x8c2\xc0`\xb7N\x15\x84\xc1f/\xfa\x02\xec\xae\xf7<\x0e\x8e2\xba\xe7+\xe0\xeaKg_\r\xf3\x15\x1c\x11vrN\xfb\x9f\xe31`\x95\xfb\xd3)\x84\x11\x9br\x9e\xacU\xa8\xaa\xc0m\x90B\xb1_\x9d\xd2\x18\n\xfd:\xe5J\xff3\xa0\xbcRR\x18\x9c\xb5\x10\x82\xc3\xc3\x99P\xc6\xa90\x85\x99\x03\x18M\x0c\x17\x0b\xa0\xceavg\x1f[*w\xa1!t\xb8\xc3\x89\xea\x99b]\x89\xe3rn\x1c\x86("\xc0I-d\x94\xc8\x02\x18\x8e\xa3\x12J\x94{\x9e\x9d\xab\x99\x18t\xba%\xedU\xd3\x8d\xebP,\x8c\x19g_\xd9\xd8\x19\x8d\x9cp\xc7\x88O\xdav\xba\x9e\xa3\x86%\xf8P\xf3x\xe6\xcc\x0c\x0fHv\x0f]}j\x08c:v3\xfa5\xfc\xabbtmY\x10\xee\xec\x9e|\xc8\x12(6\xbfC\x0e\x93\xc3\xba\x17\xb7\xaf\x85\x03y\xa65\x9fE{\xc0\xea\xcc+\xfa\xcd\xba&#*\xd7\xd4R\x86\xf14\xd2\xb5]Is\x1e_\x19\x93LTm(&\xd6\x13\xfa\xf7g\x8f7\x91\xc6\x91\xdc\xf2\x90z\n\x93\xc3yW\xf9\xff\xf2\x01\xb9\x96\xdb\x9d\x0f9\x0e\xd0f\xfa\x82\xa6\xfeSp\x1d\xf4\x96\\\x80\xa6\xd2\x10\xeb\x9f\xa2M\xb2\x85\x7f\x8cy><[v\xd7-1`?\xe4(\x08\xe9\x8a\xf2\x1b\xd3a\x88}\xa2\xe5\xab\xbb\xc1\xa0x\xc1\xdb3\xc6m\xb7\n@\x8c\xab\xa4~C\xe2\x05\xc7\xb1\x1f\xa0\x8f\x8f*4nf\x81$\xf0\xb4[\xd6\x16{\xd59Xu\x10\xe8\xd1\xd4\x0f\x91\xfc\xf9?C\x8e\xca\xeey\xe1\xa2\xcd_\xef\xe4}2\xb2vh?c?.\xe9\x84\x91\xfa\xf7\x84\xa0\x1a\x18=\x8d\xcd\xce\xa2\xab\r5\xb5\xfc\xee*\xd0\xfc\xf75A\x1a\xc9\xa7\xe5fH[\xd1V\xbf\xaed\xda\xdc\x88\xaari\xa9\xe9\xde\xf7\xe0\xa8\xadhM\x86/\'D\x0e\xdesd08\x85\xf1\x90w.#6\xc5\xc3aW\xad?\x8c9\x0b\x1bc\x9dG\xb2\xb2\xad\xee+\xbf\x86\x8e\x0e*B\xfc\xc9"^\x93\xd9\x04\xef\xc1\x9e\xa3\xc7\xbc\xc4\n*vq\x91h\xd6\x99\x13\xfdJ\xa9T<\x9e\xa8\x92\x8ep\xdf"\xf4\x01\xeeyH\xb0\xa1:\xd1Tq\xf24\'\x7f5r\xbf\x00P\x134f9\xfe\x9c\xbd\xfa\xfb)\x01\x01D\xf4\x95\xb8J\xce\x96N\xac:\x863\x93{\xd0E\xc4\xbek\x9f\xf7\x1d\xd8[\xbej\xb4\xe6\x89\xcc-D\xa4\x19R\x9c \x99\xadzQPOTz\x1c\xed\x1b\xb7F1\xe7\xe3\xa7e\xc3&5\xd0\xfcQ\xd5(\xb9?\x0c\xd6\x8by\xa0\x04\x00\x0e\xfeqCP\xdb\xfe4\x8d\xd6\xcdC]\xc4\xe0\xf8ZS\xf1\r\xd4q\x11g\xc9]\xd0B\x8f\n_\xdb\x9b\xec\xe3~dz\xc8\xad\xd5\x9e0\xc3\x19\xd8\x96\x08-\xcd\xed\x11i\x02\xa0\xf2\xfb\tg6-\x9a\x98\x99\xf5\xf1\xe8c\xf1p\xa3]a\x88\xe75w|\xff\xe6\xa8dS\x8e`\x016\x19\xc1\xf3\x9a\x08!s\x16\xc8\xd0@\xd4\xcc\x08\x9c\xd0\\\x0c\xde\x1d)\xb8\x94\xf3\x18!\xe6x_2\xa2z\xc0\r\rW\xe7u\xdd\xae[E$\xb3\x83i"\x8a\xd8\x93\xca0\xffTzy\xb3\xe1/N;\x17\xe9~EP\x1eD.\xff\xe8[J\xa1Y8\x82P\xed\xad\xd4\xffU\x0c>\xecLp,\x83[g\x19\x8fl\xc2S\xb5\xbe1\x86~\xbb)o\xdc7\x98\x90\xef\xd3\x85\xf1]\x96\xde\x9cl\xee\xe1\x94\xa2\x00\xfaO\xfa\xf2\x04\xd0\\\xf6\xa5\xe5F\xf0y\x01/\xc0\xc7\x0f\'\xa5R\'\xb7\x0f\xfad\x1f\xaf\xc2\x10>T\xac\xf7\xeeS\xf9>!&\x94\xc8\xe0E\x1f\xcbw|\xe8\xcb\xdbs\x95\\\xf20\x93\x06\xdc\x95@\xb7\x1c\x91\xc8kD\xfe&\x89\xb4)\xe2$V(\x94\xae/\\\x06Vn\xb0+\xdfK\x87\x10\xce\x1b}\xe6\x96mb9\xe3\xd6\xe9q\xc09\x16D;hg\xaf\xc5bf\x0e\xe0gM\xe2S\xcb\xed<\xe9\x81\xb2!\x12\xbe\x8969\x87|M:\x97\xa3\no\xa0S\xa7\x7fznN\x86c\xec\xbe\x0b \x95\xbe1\xd8\x9e\x92\xc0\xd0\xae\xd8<\x0b_\x95\xf07#\x04\xc8\xc9ji\xeb\xb3\xe6\x06\x0b\xc5aLy\xbb^\xcd\x8a\xa0\xac\x02\xdc\x03\xf5\x85\xc6\xfa\xe7\x84vt\xe3\xd3\xaf\xde\xc6\xdf\xa2\xfd\xbfl\xdbU\xa6\x81P\x02C=\x85=\\\xd9\x11\x8d\x04\xf8\x16\x9e\x95,\x8c\x1cQ\rX\th\xb9\xc5\xe7\x9d,\xbftu\xb3e\x80~\xb1\x85.\x1e\x14,\xd0\xe5\xe4i\x04\xae\xc2\x10H\x02\xbf\x12P\xe3`gm\xf8\xcc\xdaph}V\xed\xe6\x03\xa3\xbe\xc6\xf1\x9d^\x92?\x91\xea\xfdmeUOU@\x92\x9a\x83w\xc33\xca\xc5 `*\n?)\'\x16\xbe\xcb\xbez\x9d\x00[\xe2\xf3l$\x91\\u\x1bj[\xf1\xadpT8\x1e\xbf\xb4h\x84\xac0\x91Z\x15\x96u\xb5\x89CI\x93\x12\xc1\x8bei\xa2\xf4>\x93\xc9\x06\xb5\x1c{\x1e\x96j\x050\'\x12\r\xfa2\x88\x1b)7\xdam\x9c\xa1\xb8\x15\x1aE"\xbc\x12\xf3N\xa5\xcaP\xb9\xdc\xe8\x12(c\xa9W\x13\xcbz.D\xc4N\xf6x\xeb\xa1\xd1l\x02F>\x88-\x9f6zvj\xf20\n\xca\x90A\x12\x00\x06\xbd\xd8\x1b\xcf\xbdn\xedG,<\xe3\xc5\xc9+{\x1b\xfeP\x05\xaa\xbb\x9c\x8b\xbf\xf7.\xd8\xf1\xc4R>\x9e\x1fJ\x03(\xf9\xf8\xef\xdeB\xf7\x9b\x98hHr\xfd\x12\x86\x1e\x0fi\x82S\x8c\x1e\x92\xbf\x83%\xc3c)\x11l\xab-\x8b0dH\xf5\xd77\x90Z\x02\xba\xea\xb2\xb0\x15A\xea\x11\xfd\xcc8vhO\xab(d\x88}Kq\ni\xf0\x9e\xfe\xa1\x8f\xbbR\x00\xdem\xd1\xdd\x04\x80Gl\x1c\x95I\xe1\x04\x87\xb6|\r\xf5\x95"]\x7f\xd3\xd1\x1emb\x9c\x04v\xc4\x12iZvg\x86\x91h\xf8(O\xbdc\xef\x1e\x93W.\xa4\xc4\xd0\xbdD\xfd4\x1ah\x90~\x9bZ\t\xdb*|\xfdJ\xb8\xdal\x89p\xd7\x97V\xb4w\xc2\xc7\xee\xa2\xff:n\x0cUZ\x86yh\x10\x130\xc7\x863\x86\xa71\xe7\xcfc\xb9\xd6\x8f^\xc5isNB\xb6\x07\xa9\x1d\xf5\x8f\xc5=\x9d\xf3~\x07\x9aI\x80\xd7\xff<e\xee\x86\xdf\xfcqa|\x81b\xec\xad[|\xc2pjryS,\xc42\x02\x9e\xeb\xae\xc4\xceI\r\x8e\xb3eI\xef\xc7\xcd\xdb\x8d\xdc-\x08\xca\x03n\xe6\x88k\xe2\x9a\x0e\xfe\x1f\xe8Y\xd1\x0c\x80\xaa\xe5D\xc3\xa9oh\xf9\xb1v\xdawg\x11\\l#=%\xe1\xe3\xbc~)W\xb6\xeb\x0bf\xa2*R<i\x9e\xd2\x91wp\xdd\x19\x96C\t1E\xc0\x99\xb6a\xe3k"\xee\xfb\x88\xffY\x02>\x80B\x85\xb7\x06\x88|".\x90\xff\x89hh\xb1\x97\xac\xad\x86\x03$>\'\xe9z\xe4\x96j\xb3\x92\xc3k\x00\x1f\x04t\xe2\xea~-\xae\x98\xddg\x85?oT\xca\xaf=\x97s,\xfdc\xcf\xcdj\xfcv\xc4/\x11J\x82\x93\xf2\xb7\xc8\xfa3\xe5\xab\xba\xe7\xc1s\xabE\xdc<\x80\xd6\x15\x0c\x1b\x18\xae\xc6\x0eT&\xa6\x1c\xf3-\xe2\xb3;\xb0\'1o\xc9)F\xac%\xba\xe3\xdd\xe3\x05\n\xb6\xde\xa6\x92\xe1\x87\xacS\xac^DL\x89F\x84*\x0f\xe5+\xf0\xe6\xdc\xf7\x81\x84\x13s\x89\x91\xcd\x85]eG\x04\x1c\xd6\x03 X\x16\x0b\x1b\x93S\x1bg\xb9\xe6\x0fx\x82.\xfb\xb1\xe6J\x04>\xed\xe6b\xedB`\xbf\xc2\xac\r~\x19\x85m \x0e\xbb\xb9i\xad\x9d\xcd\xb3W\xbb\x9c\xbc\x19\x95\x89\x80\xd2\x03\xb50Mdr\xf1\x9e\xc5p\'\x9d:\x06\xae\xb5WHi\x03\xf6\xdayk{\t\xe7T\xd9\xa5\t\xbe\xce\xd7M\xc0\xf6\xab\xdb\xca1\xec\x12?\x95j\xcf\x17vv+L\xde\xe8?\xddy\xadAu\x9d\x1b\x87%\x03\xb8\xbf\xe0t\xf3\xb0[\xd8\xc3b\x8a\x84\xb0\xfc"V\xdc\xd3N\xfa\xed\xef\x9e\xbaLt\xd1?\'\xe7\x13\xe2/Cb#\xab4R\x11\xf92\xce\xff\xdc2n.(,\xdd\xaf\xd7\x0b+X2l\xa3f\xa2\xd8\xfa\xb1\x1fF\x14\xb0\x01\xb0I\xdf\x90\xfaeh\xff\xd05Z\xf1ND\xc4\xb1l%\xb3\xdd\xb1^=\xbd\x9b\xf7A\xa4\xd7\x08\x8fT\xeex\xbb,n\xb7\x90\x950.\xc4G\x86\xbf\xd3\xdc*\xa6?\t\xd0\xb8y\xb6\x85D\x8a\xd4\x8e\xd1\xf5\xd2\x17\x8doTP\xa0"\x7f\x01\x1e:\x08\x7f\x1a\x1f\xb6\xd0\xd6~\x00\xbc\xe0\x93(\xb7or\xe3\x172\xbe\xd5F\xaa\x15D{\xd8vO\xdb\xbc>\x0e\xb2\x0e\xfd\x1e6\x8ab\xb5$\x97c\x81\xa27\xfb?\xe5\x07\xc5\xcb\x9d\xf2\x1e?(=\x8e\x99\xa4\xfd1\x1a\xd1\xd2\xc5\xf34\x07\xbd$\xdev><;\x15/\x84\xdbB\xec\xf6,\x16/\x8er\x95\xc3\x1e\xe7\xad\x9d\x08q.\xdbD\xb6[\xdb\x10\x85\x8d\xf3\xc2\x04\xa1\x8d\x89\xbf\xe7\x92J\\8J\x1e\x88\xf8\xec\xb7\x11\xdc[\xa0\x9d\x1e(K\xd1L\xa6\xc5\x8d\xd5"L\xe2\x86y\xb0\x95\x95b\x18\x95\x81S\xc6*\xaa\xde\xa6\x90Z\xe3\xfcU\x8aA\x9f\xa9V\x8b\x1fw\xbc;/\xcf\xee\x8b\xe9\x1f]\x07\xcd;\xcf\xebA\x0eIy\x0bCs\x7f\x95\x88\xbd\xd2\xc0{)\xae\xb4\x1e\x1a\x84\xad+0\xd5\xfbM-d\xc0\xcd\xdc\x01\xb8:\x05\xfa\xa6v\xd8P\\\xb4\xdc\xfe\xe9\x1f\x15\n>\xd4e\xf24\x89\xea\xd3}\xe9\x8c\xd9\\e\x1e3RS\xaa\x1e\x048\x12\x84\xca\x06BN\xaa\xda\xf2\xae\xa6\xb0D\xab\xebp$v\xde\x08\xbcb\xf1\xf0\xfd\x17\x86Jl^n\xc2\xa1\x99\xf65R_\xf0\x00\xc5VKFVh\x9a\xdau>\x81\xda4L\x16bW\x88\x8ec\x9b\xce&\xba%\x86\x02\xbd\xfc\x1c\xb3E\x88j\x08V)TV\x9eA P\xe0\xbfN\x0f\x9d\x9e\x11\x17\xa2\\\xed\xc7\x82\xc0\x92\xdex\xa1\xb2\x83N\x95\xbcD\xc8\x13\x12\xc8\xaf\xf8\xba\xd0<\x97\x90\x14Q7}\xc57\x8e\x9ci\xd6\xc4\x0c\x92\x9eP_%;1"]-\xfcgn\x7fu\xde\xed\xdf\x85')
|
1
|
+
import datetime
|
2
|
+
import uuid as uuid_mod
|
3
|
+
|
4
|
+
from sqlalchemy_serializer import SerializerMixin
|
5
|
+
from dateutil import relativedelta
|
6
|
+
from hiddifypanel.panel.database import db
|
7
|
+
from enum import auto
|
8
|
+
from strenum import StrEnum
|
9
|
+
|
10
|
+
|
11
|
+
class UserMode(StrEnum):
|
12
|
+
"""
|
13
|
+
The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
|
14
|
+
"daily", and "disable". These modes represent different settings that can be applied to a user account,
|
15
|
+
such as the frequency at which data is reset or whether the account is currently disabled. The class is
|
16
|
+
implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
|
17
|
+
"""
|
18
|
+
no_reset = auto()
|
19
|
+
monthly = auto()
|
20
|
+
weekly = auto()
|
21
|
+
daily = auto()
|
22
|
+
disable = auto()
|
23
|
+
|
24
|
+
|
25
|
+
class User(db.Model, SerializerMixin):
|
26
|
+
"""
|
27
|
+
This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
|
28
|
+
account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
|
29
|
+
"""
|
30
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
31
|
+
uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
|
32
|
+
name = db.Column(db.String(512), nullable=False)
|
33
|
+
last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
|
34
|
+
#removed
|
35
|
+
expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
|
36
|
+
usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
|
37
|
+
package_days = db.Column(db.Integer, default=90,nullable=False)
|
38
|
+
mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
|
39
|
+
monthly = db.Column(db.Boolean, default=False)#removed
|
40
|
+
start_date = db.Column(db.Date, nullable=True)
|
41
|
+
current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
|
42
|
+
last_reset_time = db.Column(db.Date, default=datetime.date.today())
|
43
|
+
comment = db.Column(db.String(512))
|
44
|
+
@property
|
45
|
+
def remaining_days(self):
|
46
|
+
return remaining_days(self)
|
47
|
+
@property
|
48
|
+
def is_active(self):
|
49
|
+
return is_user_active(self)
|
50
|
+
|
51
|
+
def is_user_active(u):
|
52
|
+
"""
|
53
|
+
The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
|
54
|
+
"disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
|
55
|
+
function returns a boolean value indicating whether the user is active or not.
|
56
|
+
"""
|
57
|
+
is_active=True
|
58
|
+
if u.mode == UserMode.disable:
|
59
|
+
is_active= False
|
60
|
+
elif u.usage_limit_GB < u.current_usage_GB:
|
61
|
+
is_active= False
|
62
|
+
elif remaining_days(u) < 0:
|
63
|
+
is_active= False
|
64
|
+
return is_active
|
65
|
+
|
66
|
+
|
67
|
+
def remaining_days(u):
|
68
|
+
"""
|
69
|
+
The "remaining_days" function calculates the number of days remaining for a user's account package based on the
|
70
|
+
current date and the user's start date. The function returns the remaining days as an integer value. If the start
|
71
|
+
date is not available, the function returns the total package days.
|
72
|
+
"""
|
73
|
+
res=-1
|
74
|
+
if u.package_days is None:
|
75
|
+
res= -1
|
76
|
+
elif u.start_date:
|
77
|
+
# print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
|
78
|
+
res=u.package_days - (datetime.date.today() - u.start_date).days
|
79
|
+
else:
|
80
|
+
# print("else",u.package_days )
|
81
|
+
res=u.package_days
|
82
|
+
return min(res,10000)
|
83
|
+
|
84
|
+
|
85
|
+
package_mode_dic = {
|
86
|
+
UserMode.daily: 1,
|
87
|
+
UserMode.weekly: 7,
|
88
|
+
UserMode.monthly: 30
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
def days_to_reset(user):
|
93
|
+
"""
|
94
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
95
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
96
|
+
date is not available, the function returns the total days for the user's mode.
|
97
|
+
"""
|
98
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
99
|
+
# if user.mode==UserMode.daily:
|
100
|
+
# return 0
|
101
|
+
if user.start_date:
|
102
|
+
days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
|
103
|
+
else:
|
104
|
+
days= package_mode_dic.get(user.mode,10000)
|
105
|
+
return max(-100000,min(days,100000))
|
106
|
+
|
107
|
+
|
108
|
+
def user_should_reset(user):
|
109
|
+
"""
|
110
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
111
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
112
|
+
date is not available, the function returns the total days for the user's mode.
|
113
|
+
"""
|
114
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
115
|
+
# if user.mode==UserMode.daily:
|
116
|
+
# return 0
|
117
|
+
res=True
|
118
|
+
if not user.last_reset_time:
|
119
|
+
res=True
|
120
|
+
elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
|
121
|
+
res=False
|
122
|
+
else:
|
123
|
+
res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
|
124
|
+
|
125
|
+
return res
|
126
|
+
|
127
|
+
|
128
|
+
def user_by_uuid(uuid):
|
129
|
+
return User.query.filter(User.uuid==uuid).first()
|
130
|
+
|
131
|
+
def user_by_id(id):
|
132
|
+
return User.query.filter(User.id==id).first()
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
def add_or_update_user(commit=True,**user):
|
137
|
+
# if not is_valid():return
|
138
|
+
dbuser = User.query.filter(User.uuid == user['uuid']).first()
|
139
|
+
|
140
|
+
if not dbuser:
|
141
|
+
dbuser = User()
|
142
|
+
dbuser.uuid = user['uuid']
|
143
|
+
# if not is_valid():
|
144
|
+
# return
|
145
|
+
db.session.add(dbuser)
|
146
|
+
|
147
|
+
if user.get('expiry_time',''):
|
148
|
+
if user.get('last_reset_time',''):
|
149
|
+
last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
|
150
|
+
else:
|
151
|
+
last_reset_time = datetime.date.today()
|
152
|
+
|
153
|
+
expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
|
154
|
+
dbuser.start_date= last_reset_time
|
155
|
+
dbuser.package_days=(expiry_time-last_reset_time).days
|
156
|
+
|
157
|
+
elif 'package_days' in user:
|
158
|
+
dbuser.package_days=user['package_days']
|
159
|
+
if user.get('start_date',''):
|
160
|
+
dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
|
161
|
+
else:
|
162
|
+
dbuser.start_date=None
|
163
|
+
dbuser.current_usage_GB = user['current_usage_GB']
|
164
|
+
|
165
|
+
dbuser.usage_limit_GB = user['usage_limit_GB']
|
166
|
+
dbuser.name = user['name']
|
167
|
+
dbuser.comment = user.get('comment', '')
|
168
|
+
dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
|
169
|
+
# dbuser.last_online=user.get('last_online','')
|
170
|
+
if commit:
|
171
|
+
db.session.commit()
|
4
172
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
173
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/__init__.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from . import user
|
2
|
+
from . import admin
|
3
|
+
|
4
|
+
from . import cli
|
5
|
+
from . import database
|
6
|
+
from . import common
|
7
|
+
from . import commercial#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
8
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,172 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x90 \x00\x00\x12\t\x04\x00\x89\xf2v\x1c\n-\x1b\x1c\xee\x8f\x93\x8c+2\x04\xf6\x00\x00\x00\x00\x00\x00\x00\x00=\x865|Y"\xdd\x856\xdf6\x01.S\xcf\x19\xc6\xf5x\x94\xa6L\xd1\xe9\x12ML\x99(\xb2r\xf1\xa2\xd0\x99\x80\x8e!\xce\xa7\xcfy`\x87iZ\xc1\xf6\xa4\x98\xa65\xddb\xfa\xbc\x06v\xec\xc3\xcd\x83\x05\xd2U\x87!\x935\x9d6\x0cO{B\x0c\x06p\xcd"\xa4*#Yc\x98\xa4\xfbRD\xb8\xc3.\xd0\x13\xfe\x8b\x85@0W\x9ds\t>\xcb\xc5\xcbV\\\xac\xe3\x07\x1c\xec\xd6\xf6yz\xaa\x7fU\xdf;\x16\xc2\xc1<\x99\x8a\xfa\xd9\x02\xff6\xb1\xe1\xb0\x1e\xab\xcc\xb6c$\x08I]"\x8a\xd3}b\\\xbeBc\xe2\x1c\xde!\xe4\xdc<\x86!\x83q\xe7\xaaB\x8a/k,YB\x1e\x82\x19~\xf9\xf6\xa6\xf3V\xd25.[\xf4q1!I:\xed\xe5dx\x93Yn\rc\n\x06\x16\xe3\xf8\x99\x06Z\x0b\xd7\x0e\xf5>\xc0=\xb3\x1d\xd5Lz^\xd3\xdfb`\xa4\xf5\x84e\xd6\xf6b\xae\x96d\x96G\xa4\x1f(0O\xf4t\xf7\x08\x88\x8d\xaa\x1en\xaea\xa4:\x13n\'(\xa3\xbb\x05`\x9d\xd9\x07\x14T\'\xd9\xacfe\x16\x0cs\xc2v\xc4\xd9\xea[\x87w\x80\xb6\xbc\xe9\xc4F\xc8\xc7\xe7\xcf\xbf5\x86\xa6 \xd2\xb1Z\xff\x8e\x08\xda\xde\xd47>=\xee\r+:g\xed\xc82\x9a9\x96\x02M\xd4\xb0w\x8f\xe1I\xc9Xw%\x9c\xc0\xb23\xe6\xee\xa8Nf\xdd\xf1\xa0A\xe6\x8c\xb5!\x06\xf4U\x86\xa0\xeb\xbe8\xe2\xc3\x1e\xcd\x13\x84.Sg\n\xdf\x83i\xb2`oi\xedq\x1a\xae\xa2\xed!\xa1\x8f!\xd8"8\xd1\xd6\xa9\xacb\xe16\xe3\xb4\xfbn\x8dV(\x9dv=;\x12\x19j\xed\xee\x18\xc1\x9c\xc4\xf8\xcc\xc2\xc7\xdbd\x99\xfa\xaf]G\x18.cQ\x02\x93.\xa8\x8b]\x91!\x01\xc2\xdbe\xc1\xe3\xd1R2\xe2\xb4/[.\xfb_\xd1\t\xa1\xd6\x93a\xd3\x9f8\xc2\xeaN\xc85(\xd4\x83<\x97\x91\x83\xfb\x9b*\xe9hg)\xc5HD\xfe\x19\xbf\xa2:\xe6\x0bR\xeb\x15f\x92[\x04\x9e\x1d\xc2V\xcc\x11WT\x08\xbe\x0b\x83\xe5\xd5i\x10q9\x95\x1b\x04\xfb\x1c\xfdy>\x08\xfc)\xb4+X\x88\r\xb3x1\x9d\x0e\xd7\xe1\xc8t\xc1_\x8c\x0b\xfddY\xdcx\xd5\x02`\xd3\x07\xfe\xde\xe6\xd4UOE:\xc0\xb1qn\xe8\x19x\xe9\x81\xf9\x01\xf5au}\xcdOR\xd3#D\xa7v\xac\x15\xf14\xfcM\x1e\xb2\xa3\xbb\x1b\xcd\xc3\x03Q<;i2"\x10(\x95!5\xe7\xc7\x13C\xbd\xc3\xd7Hv\xd6j\x01\xf46\x12{\x12;td1\xba\xe4i\xef\xa6\xc35:\x0c^x\x01\x1e\x93\x16\x90N\x10xE\xb2\xf8\xf5\xd0\xbf\x13bT\xc0~}\xfb\x1d\xaa5\xfa\x16\x90{;-\xa5@\x82\xf9\x03N\xaam\x08\x96\x14\x1a;\xab*\xff\xe9\x03\xa8\x12\x14s\xfe\xf3\x1a\xfc\xd4!\x97\xc5\xfaJ\xcc(\xb5fhwwK\xcb\x9aD\x05*}[\x82c\xe6\xc8A85\xe2\x17VV\xc9\x82{I\x1fq\x13\x97\xa8\x12\x9a\x1d\xaf8HX;V\xe8\xe0\xb8i\xdds^\x1b\x97os\x8d\x9d\x0c\xb9\x85\x0f6\xc2R\xecl\xbeWe-\xac<\x83\xbd]\x80\xf7f9\xd4\x16\x8e\xac\x9fg*\xb17\x9d\xee\xb0\xbb\x1f3d$\xa92\xb6\x05\xe4\x0cg\x9d\xd5?bk&\xd3f\xea\xd0\xee\x1b\xc2h\xe4\xb2\n\xf0\xcc\xeb|\xd4\x15\xef\xc1\xfd\x06^6\xfc\xa4V\x11\x99K\xfb\xf7\xb7\xe7\xea\x86\x96}\x7f2\x00c\xa7\xe2\x97\xfd\xa5\xdb\x8d6\x0f\xd8SR$o\x0exj\xc5\x891)\xe6\x8b\xf4cw\x18\x12\xa3\xda\xd4\x95\x90@q\xd1T\xab;\xe5\x80\xab\x97j\xcd\x1bi,g\xacdad\xd9\x0093p\\\x9e6\xc7\xd0\xf1\xe9\xaf\xd8\x07\xb1\x9d1`\xa1\x12\xb0V\x0bl<^w\xd9\x1d\xf0P\xa9\xd3\x19(\xdbl=\xc5\x8b\xa5\xbch]\x84\x8aw|#\xd8C_:\x87]\xb9\x8dL\x02\xe0%D\xa6\xe4\xf9\x9aqF\xe1\xde\xa0J;s\xf8\x93\x01\x07~.[\x9a\xc7K~\'\xf49\xa1\\\x1b}G\x0bSu.v\xcd\x86\x05\x9e\x1e\x94\xe5\xe1\x9b\x92,\xec&\x94L\x086\xe35m\xccO\x92\xf9\x9bP\x9b\xdf\xfe\x8e\x06,>b\xa7c\x01\xae2\xb1\xa7Q?\xfd\xb5\xca\xa8{`\xb2\x02\xf9"q\x98R\xea\xf3\x1d\xdd\xfaV\xb8\xc5*l,\xf5Nx\xac\x9a\xa25l\x8fQ\xd0e\xb2m\x1dd\x0b#\xa5=\xda\xe2\x19\xb6\xb3W\x04\x84\x9ea\x1c\xd7g\xab\xa7\x0b\xf1\x058\xfb\xe90\x8d5C\x82\xad&*\x0f\xe9\x1e\xbe\xbc\xc4\xc0\xcc\x97\xc3\xd5\x8ckk\xa3_\x86\x1d\x814~\xe1#\xe0\xbd\xb8Qf\xda^S|\x87@U\x12\x0bVa\xa1\xe6\xacI:\x0f\t\x12\x94#,uK\x9f\x9cn\xec\xf1\xce\xca\xb3p{\x94\xcf\xc4\x9d\x04+\x18|\xe7e\x9c\x8bU\xaaz\xb0_7\xcc\xbb\x9b\x9a\xe0\r\xc3z\t\xbe*6\\\xa9\xccb(\x01\xcf\xf9e\xc4\xacC\xf3\xdb]\x12\x02B\x8c\x90\xf0XN\xdfW\xf9*\x89\xba\xc5\xa2\xe2\x95\xd6\xdeaRZ6\xe2f?4\x03\x99Jt\xde\xa6\x82\xd6x\x19\x0e\x8f\xfb\xc5\xb6<*\xb9\x14j\x12\x99ky\x14o=T\xba\x0e \xc19q\xcd\x8b\xf8\xe8\xa9\xcb\xa5\r\x99\xc7\x11\xf6\x1c\xbe\n\xf0\xd3\\_\xfa|\xad\xac\xe0\xdb\x07K\xc8v\x01l\xcb\xc9\xd22(c\xeb\x0e\xe2ipFR,\xa9\xfc\x7fQ.\xa0\xea)\x00\xd6\xfb\xa3\xbc\xa7 \x17\x93\xf8q\xad\r>\xbe\xd0\xdb\x1c+\xd8\xf9\\\x11W\x80\x8e\x94\x10\xb5\xc7a\xb0*\xef\x86\xfa\xebT\x084\xfdG\x8c?\xe91{\xe55\x02\x11\x82\x12#\xfc\xe8\x10/\xc4V8\xa3\x19\x81\x0b\xc0\x0e\xed\x86\x08\xb2 {h\xe1\xaa\x14\xc9\xe5\xd9hA\x81\x9c\xcd\x03\x80\x99\x9b\x84\xc7\xd0\x15\xec\xe5\xd4\x15P;f(\x93R\\>d7\xfe\xc4"&G\xb2\xb4\x99\xc8\xd7\x0f\xef\xdf\xa8\xa7\xd0o&\xedj\x16\xe3\x1b\xb2B\xbc\xcf)\x88\xf9!\xfd\xda\xba\xe2\xa1A\xf2\xab\x11\x82\xa2\xc6\x0f0\xeb\xf2.\x19\xfc\xd7\x84&\xbe\xca\xf9\xfc\xd7\xbc\x12{f\x86\xe36\xddL\xebT\x97k1\x13\xfe\x0b\xfd\x9d\xd3\xfd\xb4\x88\xdf/=%v\xa8\x0f\xac\xc6\x8d\xfe1\xc5\xf9\x14\xaf\xa7T\x94\xb2:I\xf8!\xb5N\x9bn\x1b\x8c\xcdQp\xc9\xfc|\xf3U\x1e\xbeT\xf17\x90$\xf8\x99\xda\x00G\xe9\x0c\xde(\xe2\x0e\xee\'\xe7\x0c\x97\xc1\xbaV\xdd\x9d\x9b\xc6?v\x0bl\x87\xab\x8c\xfb/\xbe|t\x08\xddV\xba\x9c\'\xeadc9\xfd)\xe7`\xd5(\xd5\xaav\xb3 \xef\xc9\xb4c\xb4\n\xba\x85,\x07\x0bJ\xa7\xa3\xfaKH\x19\xfa\x16(<\xc9Y\x14\xb5\xb5\xe7"3\xa5\x89\x90\x1a\xa6\xd2\xccG\xe1_ \x11%h\xa8\xacxBT\x9b\xb8\x1e\xd4\x83\xcc\xadg&\xba\xee\xcb\xff\xe1\x98\x9b\x87Z\xa1\xe8\x0eZy\xa2\xd7\x18\xbd\xdd\xea\xc1\x18\x17(V\xa0\x8aI\x1b\x05\xc8\xc1\xe9\x03-\x94\x00\xd6\x93\x03X^\xb7\xe8\xa0$\xa9\xb4\xf4\xb7\xc6\r\x03`\xf0\xbdea\xd4\xfb\xa9\x97\x8aT\xbd\x95\xb0\xe6\xfc !\xd49\x7f\x90\xa2\x07\x90\xb4+\xaa\x85\xe3\xb0\x08i5%"\x1e\xe0\xac\x7f\xce\xaa\xb6\x87)\xab\xa0\xfa,\x8a\xdcQ\xd7\x15?2\xea\xd9v\xc4\'!90\xb8c\xfeO\xc0n\x9e\rc\x9bh\xf8\x97\xd3\xd9[\xb85\x1e\xaf\x8as\x9di\xa2\xb2B\x08\x00\x07\x1b-\xb9\xc2?\xabc\x8cNN\x9a\x01]\xd9+6\xca\xf7\xc6\xb6\x1dt\xc3TSkh\xc32\xa2\t\xa4\xb9\x03<\xa8CF\xb1*yCC\xb9A\x00x\x19@DG\x0c\xd9\xf5\x93(\xca\x0e}&\xa9OZ|\x13\x99\xe5\xcf9\x02\x07&K\xff\xfa\xd8\x8a\xff\xaf\x9b=\x9c>\x90\xdcDw\xecklbc\xe76\xcf\xf3<\xbf\x9e\xdc|mq\xc7\xae\xb8\xf4%\xde\xa7\xa2\x861hoK\xbf\xde\x0b\x87\xbd;\xb3\x91R xO\x06\x0cL\xea\x0c\x02\x92r\x94M=j\xa4/\xf1-p\xdcX\xae\x14\x11\x8b\xf0\x8c\x99R\xaa1\x878\x8eo\xeb\x03\xf5\xc6\xd9\x96Z~de\r\xe9|\xb7tfn\x9c\x97\xe3G\x96<\xbd`\xf5\x9f\xef;A\x90,\x9br\xa3[\x9b\xf7H\xa4\xb0:\x95\x13+\xcd\xb7\x88\xba\x97\x9d\xd6\xc8T\x0f=\x06B\xc4\xb8\xe2\x88\xc5\x13\x94\x93\xb4\xdb\x9e\xe5\xab\xa2\x8a\xc4/\x14ZPo\xb1\x1f\xd5\x8ba\xef\x1c\xeb\x1f\xb4\xfa\xd8\xa2B\xab\xb5\x01\x1f\xf0\xdc\x1f\xefT\x1e\xa5j\xaeG\xfa\x14\xe2\x1a%;^\xb7Rt}\xeb\rq\xb3U\xa6\x10(\xc2\xbe\x13\x9f\x89!\xbeP\xe6\xdf\xcf\xedzn\x98\x83vH\xe0\xda\xbb\x92S\x81+\xccM\t\xf1\r\xe5=\xaf\x96\xbcKq\xb3Mz\xe5\x9bqjs\xc4\x03\x92\xb2Q2\x9a\xfd\xb2*G\xe2D_#G{-Sj-M\x85\xf8\x13\xa7\xde\xdc/k"\x98n\x08uHc\x0fdY"\xfe\xbb(\xf4/\xfc\xf2ue[\xfc\x0e\xeaSO\xd1\xd8\xcc\x15\xac/\xf8A\x13\x92x]\xbf\xfe%v1+w-\xd0Q\x86\x01a\r\x93\xe6F\xc8\x80\xebR\x1a\xe30\x17\xad\xee\xfd\xe6\xd7\x89v\x88\xc9\t\x9e\xcdU\xfe\x8e\rc\xe1\xf8\xb7\xcdA\xb9\xb6\x02\xd6JyR\x0c\x99\x8e\x80\xce\xa7\x86\x0e\x0eb2E\xf4\x15\xc2\x08\xf4IQ\xbb)\xdeJ"\xc2?\n\x11c0s\x06\xc8l7\xd3\xa3\x81x\xc6E\x11\xac\xea\xd5\xf2\xf2\xf5[\xef\x83\xd7-\xa3\x8d$\xd6\x99\xa5\xa8\\\xd9\x0e\x90\x03\x8b\xbfE@\xa6\xe3fk*\x80iHRDXR\xbb\xbc3x\xbaP\xc9\\\xf5\xa9\xde\x8ekN\xb7\xe0\x9b\xdc\xd9\xdal+E\xb5>\xb2\x1a\xad\xfa\xd6,\xf5\n\xa0\x13n\xb4\x97\xacS`tw\t\xc0O\x16\x01\xb6|\xacXd\xd8\xca\xb9\xd4\x00D\x02\xa21\x82\xd9n\xb0d\x07\t\xf3R\x86p\xd9Y\x10\\\x8d\xbf\xaf\t\x8aA?7\xa9\xf3++b\x1buH\x18~\x92\x8f\x8f\x13\xef\xa1\xb0\xd6\x90J\xf4D~\xb7F\xa0\x01\x0c\xf1rz\xfc\xaa\xe9\xea\t\xf2X\x00gPn\x11\xe2O\xcf\xc9W\x82\xe5M\xdf\x05\xd3_lu\xdb\x8a\x9b\xba\xf7T\x0c\xeb\xbb\x89\xacj)gxa\x11\xa4\xd1G\x9a\x83J\xedL\x01;Z\xcc\xa5J\r\x84\x10\xcb\xd1\xee\xfc\x0b\x9dJ\xb7\xdd|\x1b\xa9^\x0b\xb0\xf6\x87\xcc\xc2H\xd4f\x19#)u8\xbf\x07\xc9\xf2\xdd\xdc\x1a\t\x89\xd4\x86P\xefL\xbf;\x03[\x11:Z\x80#\xc1;\xaa\xfa\xef\x9f1f"\xfa9\xc1\x97\xa8\x9b\x93\x9a\xf0\x86k\xcd\x86j\n\x98(\x15T+\xcafw\xa1\x9f\x11\xc1\'\xf2WR\x93=\xf1\xf5\x00\xdd\x9c\xf2\x06Hj\xab\xcf&\xd4\x84\xb7J0\xca!\xc7\t\xe0N\x8b\xdbt(s\x134\xfc\xf2X\xbd\xf0V\x05\xc8~yDL\x94L\xa7w3z\xf1\xcaY\x81\xcd4c\xa2\x97\xe5\xcf\x8a\x18\xedhS\xdb\x14m\x8a\x80O\xa0\xe6\xe2\xdfE\x86\x16\x92\x97\xb5SK]\x0b\xa3\x81\xb0\xb5R6\x927\r\xb38\x01\xf4\xe0\xe7h\xa9\x0b S\xce\xafC\n\xec?eq=\x82\xdc.D\x85\x8165\xd7*\xdb\xef}&\x94\xd8ea+\xf8"6b9\xf7\xf9\x7f\x8a\x8f\xe4j\xd2^\xee\x9a{\x92\xfc\x1bm\xa5]5a=\xbf\x1c\x08\x1b\x0fm\xbe\xc2;\x10\x8e\x88\xc7D\x83I\xb5\x8b\x8b&\x16\xc3]\xb1\x97Zc2\x05\xa0Fe{\x9dt\xbf/.\xb5kw\xebO(\x90\xbe#\xbfs\x0b#\x94f\x0fD\xab\xcfu\x0bW\x93\x1c\x1f@\xd4l\n\xb8uP\xed\xd4\xafb\xd5\x96,\xe2\x9d\xda\t\xcaOQX,\xba\x07\xb3\x14[\x8e~\xd3\n <\xf9\xd6\xd7O\x10=\xbc\\\xceb@H/w&\xb9e\xc0^\'\xe1J\x0c\xd7\xf2\x19\xba\x05\xc7\xee\x98u\x89\xee\xf3\xe5p!\xed\xc9%{\xc4g\\5\x8e\xd8(\x1cX\xfd\x7f\'\xe1\x8c\x1fyM\xb2\xffO\xa3\xaa0\x9f\xdb\x80\xb6\xa2\x02\x7f\xbc\xe7y3yq6u5\xbd\xb6\xb1\x06\x00\x91\xf6\xd1\xab&\xda\x88\x11//\x05\xc4\x96^\xcc\n\xa2h\xe7p\xc5\x82\x93q\xed\xe5\x1er\xac\xaf\xda\xed.x\xff\x84\x15\xf3\xeeu\xc9/N?9\xb6\x9d\xf0K\x9b\xf3}\rK\x94t\xfd\\5\xebO\xd1H\xe7\x02!\xc1\xc8\xde\xadW\x1b~\xfa<!H\xad\xb4d;\xe3J\xf2Y\x1b\xea\x11I\xc9\xf45b\xd0)\xec\x9a{\x96\xa8\x8f\xf3\xc5t\xa0\xc4,y\xaf\xf4\xb5\xae\xa1\x86\x8b\x1d:~VQc`z\x05\xca\',\x97\x8fH\x0bG\x86%\xe8\x83\xc4L\xd8G\xfc\x1b\x99\xb1\xbe8|\xf8\xaa\xe7B\x1b\xe5\xb3\xfe\xc7F\\\xc7\xf2n8\xbf\xb9\x7f\x7f\xce\x9b\xc8AQNB\xf6\\\xfb\xf0\xd1\xd9\xa8b\x1aTd\x16\xec\x91\xef\x11\x807\xf9\x17 \x800\x97%\xb1V\xdf\x18\xbdTg\x9ar,\x86b\x9an\xe8\x1c\x9cm\xd4-\xd6(\x07![\xfe\xa6\x04NxZM\xbe5+;\xdd\x9f7\xf5\x04\xae\xe4B\x13\xc1{\x18\x1f\xc9\x0e\xd1\xcfR#\xd0g[\'\x01\xe6\xc2\xcb\xc7\xc2\x11\x8f\xe4XEI\xf7\xd8-\x8e\x8b\xf4\xaf\xa8\x08{W\xaa\x01\x9a\xd6\xa9(9w\x97l-P{\xb0\xd9\xf3\x0f\xcc\xd1Y3\x0f\xd7\xac\xd5\xf9\xe1\x9eXfiv\x1c\xd6Gy\xfc>\xde\x8f\xcb\xc1\xcf\x9f\xf7C\xc0\xff\xe8]\xcb\x012\x95\xfb\xa7!>#R\xcft\x0b\x01&)\xa2h\x81\x1e$\x94\xa5\x1ba\rm\x96&\xf3\xed\x95h\xb5)s\xe9\xe2s\x89\xca7\xc2mv\xc3~\xa1"\xb0\xed\nL^\xef\xccy\x9a\xf0\x14\x1b{\x85\x17R \x1f6\xc1\xb4r;\xf0\xd7\xf3\xd7\x87\xff\xac\x8d\n\x97\r\xad\xca!o[>;r\x9b\x9a\xdbG\x84\x91\xbc\xbe\x9e?\xf4\xb4\xee\x86}\x05W`\xf4\xce\xbe\xa1\x95-K\x84\x97\x9f9\x9aB\x12:\xd7hY\xc1\x82\n3FR\xe8\xa4N\x8b+\xedXM\xe1\x0e\x1f\xea\x06\x1eh\x10qIoN\x0f\x93\x047-\x0eD=\x8bt\xbb{Z\x8aJ3\xb0$\x16\x9d\x8a_\xae\x87\xf4\x96#\x80r\xb3|\xd2g\xba\x95U^\x1b\xe5\xbcrZ\x8eS!H\xec\x8aK\x95m\xc2\xcb\xe2\xe9\xb0\xd6nK\xd1\x0e\xb5\xc0\x03<-\xc3K\x88I\x8a!\x04\x88\xe9Ej\x94\x99p\xa7\xa8\xfb\xe1\xdc(Q\x9e\x97ZHy4\xf0#\x89\x944)H8\xbcI\xa2\xb3&%\x1b\x8eI\x85\xb9\xe83\xa5\xd6\x8en~&\xa4n\x9f\x9e\x1e@\n\x80$\r\xd8o\xedJ\x99\xb0\x93\x1d\xb5pn\xf2\xcfQwF\x94Y\xed\xe3\xc3\xb5>x\xd8\xaf6!F\x15\xd4G\xf6\xb2\xd5\x93r\xaf\x85\xbe@u\xef>\x95\xa3\xcf\x9d~\xd6Jw\x9d\x1d\xd5%\xd6\xcf\xa5\x8c\x1e\xa1p$\xd1@\x80\xbc\xb2\x81z\xb7y\xa4\x9f<\xe6\xb9\xf4*\xa9\xed\xcf\xb2/\x90\xf3E\x84\x99\xe5\x91-\xd6\xeb\xd9kq\\\xfc\xea\xcb\x9e(_B\x0f`\xe4XBc\xdc\x10\x1e\x94.}\xc2\\.\xb8o+\xc1,\xb5\xa4\xdeL \xf0\x15L\xa1g\xc6\n\\uo5O\xb6\x9e\xda8\xa4\xa2\xb8-)$\x1f\xb7\xf5\x19\xdaf\xcd)\xae\xf46S\x08\xa7U\x1a\x0b+\xb4\x8d_3\xee\x05\xef\xde\x07*\x07~p\\\xa2zxMpv4C9\xf0[}\x8f>\x9db\xfa\x9d\xfb\xc2\xce\x01\xf01)\xf7\xcf\xad\xeb$\x8a-+I-\x89\xa4\n\xb4r<\x9f\xf1\x1c\x0e\xb5\x97\x8a\x86\xe3\xf0\'\xf4V\xdc4\xbd\xf1\xcb\xe9\x80}\xda\xba\xd9R\xe0)\x03\xa3\x7f\xb2$\xb8/H\xe3N(\x8c_\xf56\xe4IX\xb1\n\nH\xf9\x0e\x8a/\x0e\x9164\xbd\x9f\xfc\xce\xb5\xbe\xf3\xd3\xc1U\xed\xed\x08y\xec\x16\xf3\xe9\xd3 f\xdbf`)e\xde\xa0~\xc8\x88>\x956\xd6!9%\x9b\n\x8d\x08H\x1f\x9da\xf9[w/\x98\xf8_{\x8a-\xe4\x13\xbd\x1f6<u\x11\x08&\x1c1\xf3\xfe\x8d>\xbcK\xbfdr\x08\x04v\x00$\x7f\x06r\xff\xd3\xea\xda\xe7\xe4\xecp\xa4\x04<\xe9\xd7=\x9e\x99)\x97T\xaf\xab\x05U\xd4\xeb\xb1\x94\xf7\x8ay\x86\xe6\x81\x95\xbds\xb5\xd0\x10>\x83\xff\x0cTz\xbc\x9b\xb7\x9f\xf3\xfd\xdd\x97``\x1a\xe1#\xe8\xd0\x9e\xda\xb9\x1f\x0f\xb1\x8a\x88\x8c\rwT\xeb\xbfe\x95\xaf\xe2q\xee0STj\x15C\x1c\x01\x08A\xea\x12%\xdfN,\xa6\xa7\xfe~sP\xc5_j\xd7\xb6.\x9d\xf1\xd1\xb5n\xf2\xe6\xd8mt9\x9d\xce]\xb7\xd0$NJ@\xbe\xdf\x1e\xebo9\xaf\xde#I\x13\x8e\xb3\x87\xd1\xf3\xa7\xfd\x12\x0e&\xe5\xdb\x9d\xf2\xf6q\xdcu\t\x96\xb2vJ\x01$qj\x80\xb6N\x19\xf1\xdf\xed\xbb\x9c\x94\xfe\x1a\xb3J5\xc0\xbf\x1dG\xcd\xa2[D\x9d\xf7\xa5\x89\xce^V\xd8\xa32\x9b}$4t\x1ae3\xbb#\xca\xa7i\xefx\xf2\xc7\xb2X\x1f5f(\xee\x14\x10T\xce\x89\xc6\x91#\x0c\xe3\x14O\xcf"\xc4&;l;>\x0c+\x0f\x9f\xf7m\x03\x11_s\xfb\xe6B\xe0\x9cT\x1a\xc2\xba\xff\x87M\xd0\xbf\xbc\xa0\x12\x0bM\x9d\xb1\xa6K"\xc5\xd3\x81Q\xc6\xa0\x84 \xd6E\xb1\xcd%\x96\xa84\x9e\xd3\x8f\xa7o\xfcxUO \x03\xf9\x99lT\xf8\xa8h\\\xc9>#\x9bm"\x10W\xa8\xf3\x1e\xe2\xbf9\xe5\x03\x05,{\xfemmP@\x16\xb6x\xa6Fu\xd7>\xb4\xf8S\xbd\x12\x13\xe2$\xee\xda\']\x98(\xb5c\xdf\x11\xef\x17]l\xd1)\xd6\xc2\xbe\xd8\xac\xa93\xa2\xc1\x1f\xfbbFN\xf5\xbb\xd9\xf8\xc9\xc2v\xc0T\xb4n\x08g\xcb\x9dN\xf14\x1f\x9e\x84{c\x02\xc0#\x90\x0b\xa8\xbe\x84W\xe3\xdaY\x81\r\x9e\xff\xbe\x91V\xe5\xc8\x91s\xa9\xd49\xc3\xf2!?\x084u\x03\xb0\xd9\x83\xb7\xd0\x08Y"&l\x1a\xa5\xfck\x9a\xe2l)\x81K\xe0\x06\xe6\xbc\xfb\xc7\xa1\x937\x99\xb0_\x12\xf7T\xc8\xb3\xe6.\x94O\xab\xb7V\xe2t:=\x86\xf8\xc1\xf9.\x8e\xca\xd3/H\xd4\xbd\xa8M<\x891\xf4\xd1\xf1C\xa6J\xbd\x96)\xe2-\xaa\xfcB\xc4\x80\xf8\x06\x048\x97_\xe8)\x8d\xf1W\xdc\xef\xa5\x01r\x8d\xdb\xcd\xa9\x084q\x13\xa0\xa3SY\x9c\x84\xe0\x82\xc7\x88\x00\xa5\x10x\xab\x13\x9b\xb2\xaf&j"/\xa0\xbd\x16\xa1}\xe8%M\xdf\xd0m\xb4Yk~h\x9a\xd3\x9f\xb4\xd8C\xa6]\xe3=T\x92\x98\xa92a\xd5\xad}(\xb3\xdd\xecyL`\x9b\xa2>=\xdf\x86\xfe\x14\x05*\xc3kv\xb3r\xac\xdc\xa67g\xc1\xf4H6?\xac>)\x83\x19\x9bV\xcf*\x1fH\x12%~\'Q-\xff\x94>\nkH\xb7m;\xd5\xe9\x93\x88\xb9\xec\xc7x7fqF\x917-\x1e\xee\xe22\x0b\xfde\x8f\xd0i\x949\xa8u\xa1?^\x18\xbcG\xb4\x91\xe0D\x97\x9d\x10|\xf5\xeau^\x1e\x0b@\xcd\xe8\xe8\xdc\x7f\xd8\xce[\x86^t\n\x1c\x91\x02(\xa6~\x88H\x0f\x98\xad\x05y\xf9O\xf7\'d\x84\x0e\x04\xb66A\x88\x98\xbeT\x02\xe2\x89"Z:V\xbd/\xb1\x8f\xa6\xb2\xcf\x1d\xc9\xe2\xb3,\xc18X\xcep\xf6R\x88\xdeA\x89\x0f\xe2\x85\x98%4\xf1\xbb\xc22\x07l\x06\x98U\x10\r\x90\xbc\xb8\xcf\x0c\xc9\xd7\x9a!0\x00S\xbb\x08\xa9\xad~\x85/\x90\xabW#\x11\xfc2\xd5p\xe1\x00\xc2$\xbe\x18\xab\xfcC\x91\xe5X`\xed\x9e\xfa\xda\xfcs\x01\xb2.\xed\x1b\x89\x8f\x94\x1c\xfb\x95]\x98.\xf4\xe8\x10\xfb\xf4\x8b\xc1\x12\xd1}5\xf5\xea\xe5\x89</\xc9\x06S\xb8\xe5\x0bx\x96:\xbb%\xbf\xdb\x03\xa4\xb2%\x04n\x99\xb8\xda\xfd~%\xf2\xb9\xfd\xca`\xbbO-\xe7\x1a\xdc\xa1\xa9u\xdcs,\x8a\x99O\xc7\x0e\xfa\x03p\x92Y\xf5\x95\xb4!\xe8\x97s"\xdc8\r\xdf\x03\xbb~N\xac2\xc0m\x03Q\x97!\x1e\x8aS\x11\x18\xf97\x8e\xd3\xaa,\x10\x10\x07x^\x17\x8beg\xc1bkQ\xbe\x96\x92&\xca{\xbbBw\xdc9\xbeM\x8e&>\xc9r\x81,\xd9\x19\xaa\xd9\xf9\x94\xed}9Q\x16\xd7:\xd3\xd1\xe3\xb99_f\x07m\x11qE17\xdf\t\xda\';h\xa5\xa0\x7fb\xa5g\\_}\x9f\xfc\x9b\xb9S\xa7:\xf8s\xcb\x1c\x84d\xd9\r3\x1bac\xf73J\x19\x1e[\xb8\xb8\xa1\xec*\xd3\x1e\x8e\xec\xaf-90T1\xf1bs\'zxv\xd2\xebY\x92:\xfd\xebb\xb1\xff%\xe7[\x03OGq\xa8G\xa9\x1c\x0c\x9bu\xc5\xb1I\xd1\x14\x85\xf7\r+[P\x84|\x1d\xbf\r?\t\xfc\xf0\xa8@\xe0f\xbc\x19\n\xfemn\xfd\xc806\x98\xba \xa3\xad\x83\x86\x88j\x83\xf5\x1dxY\x1e\x9e\xa7Zo\xe8\n\xe9\xbd\x92\x07\x80\x91\x96\xf2&\xc5\x1c\xf3\x9b\xbb\xcdw\xaf\x18\xee\x16\xdb\x83\t\x7f\xd8\xc6\xe0\xbfIt7\x9d]\xb7\xef\xd9\x07D\xc7\xd6\xd9\xe22\x9d=h\xd8\x0e\xed\x8e\xebh\xb2b\x1c\xd6\xeaFs&\x07Y\xb9v\xfa\xd0\xec\xce\xf0.\x85\x84X\x88.\x00\x1a\'%\x83\x1c\xd6c\x19\xf5\xda\xb1I\xa0\xc6u\xf1V\xff\x14C\x7f?\xe9\xfd\x96M\x01\xd2;\x9d\xda\\\x12\xf1\xc4j@\xe6=0\x15\xd7\xdaC\x97e-\xb7\xb9\xc6p\xc3\xe9\xf8\t\xf8u\xd9T\x88\xb0\xa96\xa6^\x02\xcf\xa0\x8b\x8f\x0f]R\x0e{\xa2\x9b;U\x8f\xb9\xb3};%\xf53\xa1\xb5\xc2\xb0\xbc\xf6\xfeq\x08\xfeQ\x94\xc5[\x9e\x03CD\xf9M\x14r\x9a6\xa7\xc8E#?6\x0e\xd1\xc7\xf3\xa0dE\x19\xe9\xeb\xf2G\xe3\x05k\xc4\x95\xb6Z\xcf\x83\x92\xe2\x12!\xec]\xa5)\xd9ii/\xd9<\xb8\x8a\xb8\x85=\x06\xb4I?\xb9\xe0)\xc2\xf8+D=R.\x0f3\x9ejnl\xf18"c\'3\x1b\x85M\xff,t\xbcz\xedT\xb2\x078\x8d\xddw.Qr\x971L\xed\xe9d*q}\nP\xc4Z\xd8&\xe3\xbeZZ\x01\xb4,@\x0c\xb4 \xdfs3N\xcf\n\x94\x0eGaV\xfcS\xb80\xfbgj72\r\x19\x98\x1fr\xba\xd7C\x88\xa4\xd9\x93\x90y\xea\xa9\x84\xa5\xd3\xd9\xc2\xfd\xd3*\xb0\xd0\x12QfR\xc2J|?C\x1d3%\x8ej\x93\xbb\x85\x87\xf1\x99\x9d{\xd82mh\xc7\x17N\x19\xefkI\x17\x80\xee\xb1mK\xe7\xad\xad\x9e/\xcf\x1b\x01\x91\xf3\xaf\x94\xcd\x15\x83\xb6\xbenW\xc8#\xe3T\x9f\xcd\x06\xd7\xa4\xec^+Yc\x92\xa7\'\xd8\x95\xf8\x9e\x91\xca\x16\xe3\xfe\xf5t\x88\x1c\xb2\xd4\x82{\xf8\xa2\x15\xaf\x80\xaa\xc9\xaawT\x8a\xd8\xb2O_K\x93\x877\xc9\x04\xdd\xc2\xb8\xbb\xec`d.\xa1?O\x9d\x1c|P\x85\x82\xcc[\n\xddzw|\x18\x98\xbc?]\xfaa\xf3\xc3Pz+\xb5w\x91M\xf5"\xf0\x9eS\x150R\x92i\x9e\x97\xd8\xe2\xc8nn*.\xb0t\x8d\x16\x9d\xf2\x975\x1b)\xbdG \x10\xf2\xcb\xd6\xbf\xe7%9k\xbcM\x9c\xed\x8f\xe9\x01\xe3\xf2\xfb\x15\xa9c\x94\x1b!\xf8z\x91\xc9\xd8\xdb\xd4-\xe7{v\x1b\x95Z\x15\x0c\x13L\xf4\xa2\x9f\xd0\xda\x99\xe6X\x1b\x18\x03\xe9\xc1\xfc\x04\xb1\x89Jx\x81\xeb\x81\x16\xd1\xb0$YT\xe2\xc6\xfb\xff\x1a\xa8\xab\x9b.\xea\xfa\x19\x9a%A+\xf4P\xcdN\x08]\xeb\x90\xf5\xc3b\x18\xbf\xb8\xb5\nw\xdfc"\x05c\x1b\xdc:\xd8<\xd6\xf2\xa6\xdeI\x9aO\x1e\x0b\xf3{,Z\xe8\x9f\xcd5\xe8\x97<{\xdd\x95\xd7\x0b\x92*\xd7\xd4s\xfc=/\xf1\xeb4o\xeb\x15Y\xdfS\x82\xd2p\x96\xa5d\xe2\x9d4\x89dP\x87\x80U\xd3Z0\xfe\xcc\x93\n\xcc\x03\xed\xcf\x97x\xdc\xec.Qi\xbf\x12\xe37m{\xf8\xa9\x16\x12\x81]\x82\xc4\xbd;\xd0\xd3\xffk\x07\xc4\xe5\xa39\xc8q\xb1\xbe+\xae\xf4\xce\x92\x00\xf2\x93\xc6\x87J\xa8y\xc1\x94$H\xf1\xcctS\x81\x1c]\x1f\x02\xff\xb1\xf3\xc1k \xa7\x9fqX\xf0\xfbk>\xb8\x9c\x1cF+n(AB*\x17\xb7GQ\xaaX\x9c\x0f\xec\xc5\xde\x85]nf\x83\xa8\xc6|b3\xac\xe0co\xad\xa0\x17\xfe\x01g.d\x15=\x9ca(\x96\xb9\xf3pj^\xd3\x83\x16\xb3TE\x17\x83gk^\xfa\xb5\xe9\x00wT\xe1\x9a\x83\xb1\n|[\xd0\x80I\xf5p\xd8KxO\x95\xee[\xa0"\xf6\xea\xd6\xa9\xa6\xe8{\xc9\x9f9{E\xb6\x07\xd6b\xde$%\x9a\xb3\xe9_O#\x16$\xff\xa3\x1a\xa6\xb7?s\xef3\xd7\x96\xdd\xe4\xe5\xe2s\xa1\xa4\xa5\xa8\xfd\xd4y\xde\x08\x92\xd4\xab\r\x9a\xc5\x9d\xbenQ\xb8J\xa1\x06\t\xfc\xe4\xf0u\x11\xf8\xef\x00\xb8e\xc9\xf0\x91FK\xcc\x9bl\x98\xc1\xf7Z\xd8T\xf93a,\xbe\x80\xc4}R\xb9\x1f\xa1\x9f\xd8\x9c\x19\x9d\x96\xf3\x96\xb5\x16\x04\xe5\xae\x1f\xee\x07\xa6\x82[\xeb\xe9o\x96\xfc\x19v.\xa0\xc9\x1f\xfc\xd2\x04\xab\x9e\xc4\x9d\xcd\xe1\x17\xc4\xb5\x18\x88!/m\xd9\x1b\xc67\xc4=\xa2\x1brx\x9br\xde\xc9\x8c\xac\xc3\xc4\x16pD\x96<\xab9\xc1h#\x95\x15\xaa\x11\x03\xaf\xeb*Y\x0b\xec\x02T\x8b4\x0e\x14\xc0 \xe74\xfc\x80.\xad\xde\x8ajfV\xe5\xf5\xd0\xb7\x1a\xe8!\xdd\xd1dM&\xe2_\xc1,\x96\xaa\xdb\xf3`e\xf8\x07\x8a\x08#\xc2\xdb\x0fl\xdc\x91\xac\x9e\n%\x93\x00I\x18yBmL\xf8\xffY\xe8\xd0J\xa2\xad\x9b\x16\x0e\x10q~\x9dJ:\x03X\xf4H\xd0\xa6-\xcaQ\xa6\xbc\xad\xf4\x83*\xf3w\xea\xfdGGig\xdbz?\xa6ws\xe2\xb5\xfe\x063\rc\x98\x88\xc5\x1b\xeb\xdd\xd6<\xb3zu\x90\'\xcc\xbe\x17\xde\x1e\xa4\x90Ww\xac\x15\x87\x88\noei_\xea~\x1c!M\xd2\t\xb8\xae\xd2|\x9bI\x8a\xea\xd0\xde\xa8\xea\xa4\x0ep\xb1\xb2\x88\xa5\x8f\x184\xbc\x900\xf2\x11\x8f\xf6\x9a)~\x93d\x19\xea\xcd\xb7A\\i\xbb\xb9D\xf9\xde\xd1\xfbG\xa9\xb9x\x06\x01\xde~\x8d~J8\x0f\xe4\x83\x88\xdd\xa7\x16\xbb,\x99N\x91\x02Z\xedh\x95F\xb1J\x14`\xf48\xdd0=\x80\xb4\x90g\x00~\xf3\xea\x96=U1Q\xabZrM,\x82k\x10\xb5\xb0\xd5\xf2\xf9e\xda$Ui\xc7\xcfnR\xfcf\xce\xda\x15/\x8b\xc9\xa8\x90 4\x06\x06\x1br\x93\xcc\xd1w\xd7\xdeF]\xb4$K\x90+]^\x85\xe6\xef\xcd\x88)\x1f3\x0c\xae\xd9\xd4^\\\x97@\x0c\xe4\xdeo\x08\xd3@\xddp8\x8b\xa3\xdb\xd4t\x94I\xa9\x91\x0b3yQp\xe4\xfc\x7f\xdb\\\xfc&<-\x0b[\n$\x7f[\xdfu\xd5X\x88=\xf5Y\xc7]+Z\x89k(\\\x81=\xe1\xc2\xb6\xb3\xc9\xbc\xc2\x1aP\x0f\xaf~\xb6Iq\x8c\xa6\xb2K\x1d\x8aN\x82d\xb3\xf6\xea\xa4bF;\xdb\xf0[\x83|\x9e\xd6\x99.\xc8\xea\x91\xf6\xdb\xa7\xaeg\x13\x08\xd7%\x80\xf5\xf3H\xf1\xeb]\xe9a\xae\x13\xf6\x19\xc2NZ\xa1\x07\x9e<\xe3#\xeago\x19\xeb:L\x19\xb9\xd5\xc8(\xc7\x02\xc7\x8cjz\xdf\xaf\xd4\x00\xa1{p^\x1dq\x89\x02\xf8\x94\x93\xea\xad\xc9$\x0c<\xed7\x88\xe6)\xd0c\x1b\xb1\x11m`\xf8kbf\xe6]\x1d\xa5 \x04\x99T\xed\x9a\x02\xdb\x1dh\xb1\x81F\xeeJ\xafB\xf3~n\x0f1\xf9v\'\x19\x04$\x0b\xd4$\xdb\xaf\x1a\xf2D\xfb&\xb6z\x83\xb8\xe8Ft\x029\xf5l\x97<\xa6\x84@\x07\xf7\x02\rN6\xfaL\xfa\x9b\xb61G\xfb\xc6\x836\x0c-\x98K\xa7\xb2\xdfY\x08\xde\x08\xba;K\x97\x85R\x88 Q\xf1\xe6%\x12\x15Z\xe2\xecpv\xdc\xeb\x1b\xabPC\xa6\xd0\xa6Lq0/m\x10^\xaf\xb77\xda\xb8\xb0\t$\xb3<\xd1o\xe5\xfa\xbb\xb9\xee\x1f\xde~/\xdb\x105\xf7\x94A\xc1^\xbc\x8a\x88\xb2\xef\n\x0b\xbd`\xc0v\xd21\xc2a\xbe\x8co$+\xfa\xc4hu\xdd\xa8&\x01?P9W\x91Z9\xef\x93\xe4\x06\xe2\xf4\xa09B[Y0!\t\xb05*Y\x9d\xa3M\\\xae\x02e\xb7+\xff\xf2P\xc6\x9aR4p!\xdat\xb6|6\x12\xb6\xe7\xbdIE\xd4*M\x1eX\xe2\xde\xe3al\x86\x10\xa5\xfe\x99\xe7\x80\x0f}n\xe1o\x03\xa2\x10\xa1\x7fF\xf6\x9c\xc7\xec?\xd8\xc1=\xc1t\xe7\xb0Xn\x80\x93\x1b\xe1\x8e\xd8\xd8]\x19\x00;\x1d\x1b\x97\x98\x19\x91\x04s\x0c!aK\x8b\x1b\xca-\xd8\xdf \xb8\xc1n"\x01KU\xe0\x8d\xd6\xb5\x06\xc8\xfe\x96\xc3\xe0z\x8c\x1dA\x13>E\xf7\xd7:\xc9\xb4M4\x1d\x83\xd8\x83\x8a\xf1\xf4J<\xf0x\xc0\x03\x10\xden\xac(\xcfS0k\x10\x92N\xb3\x06\x8dt\x19\x8cv\\\xae\xea\xee\x1a-\xd0\x99\n\xee}Q\x95\x1e\x06\x913/$4e\xbe\xbf\x9b\xb0\x9ecUx\xe2]\xfe\t\xbb\xd6\x865ux\xd5\x05\xd2\x14\xd4|\x82\xdeC\xc95\xff=Vo\xb8\xc4\x1eNZ\x1ak\xe2\\+\xfa@\x19ieQkn\xc0\x89\xc9\'!\xa7v\n\xdbv7\x8e\xc9\xe8\xfcJ0\xe4_\x18\n\xcfJ\x1c\x0e\xdd\x95\xffcQ1>\x0b\xf4\xa2\xfb\xd9\x01?\x91(:\xab\x161\xbd:\x83\xe3\xa7)\xa7\xdc\xc3n\xc5\x8egI6@\x80~\xb0$hl\xbc\xc4\xab\xdeD\x90 \xd4l\x80\x1e%\x95\x84\xdc\xd7\x94\x85\x03$9\nL?)=\xee\xfbq\x88\xd5\x8aCl\xa5\xc5\x8d\xcc&\r\xfc\x87\x1fCl\xd0\x83BdQ\xf4F\xf2_\xe7^\x83\xd0\\z\xf9\x0c\xc6\xfb\x92[E\x03\xca\x9e\xed\xf5\x90\xd2\xa0\x84\xd3{G\x19\x82\xd3\xc7[\xbd\xf1\xa2\x9c\x03b\\*-!s\xf0\xd7\x05\xf5`:\xe2\xf9\xb2w\xc4t\xdc\x14\xc8\xdd,\xcf\xa4\xcd\x94\xb3\xee\xfa\x0e\xfa[,dZM\xd4\x1dN\xac\x91\x83/5\x90N\xb2\xd3\rW\xd6z\xb8\x08\x96\x06[!\xba\xa1\xc8\'\x82\xcf\xb9\xc8\x8c\xd4\x98SWa\x8f\x83\xf8\xc9"Ge\xae\x13[}kk\x88\xdd\x86\xa0\xce\xfc\xdc\xbc\t\rX\xf0\xa7\x8f\xcb\xaa\x02+\t\xe8\xce\x1cP#Z\xb7\x99\x05Y\xc1i\x1e\x9dPQM\xc24d\x84i1\x19\xb9\x12\xb5\xf5\x10\xd1+\xd3\xe4Pc\x92\xcf\xd7@\xc4\x9d\x08\xb8?b\xc8\x17j\xbde\xd6\xfb!\x11\x89\x81-\x03>\x0cd\xce\x06\xde\xbdvYXRQ\xb3\xb7\x08\xc5\xcd\xba3\x1fp\x88\x08\x0b\xbaJ\xfez\x9e\x11f]6\xe7K\xd2\x9f\xeb\xe3A\xcd\xcb~\xd5\xe9\x84\xbc\x06t`\xd9a\xe5{T\x08XLIn\xe6\x97\x99\xba\x13\xf1\x8fQ\x19(\xa6OZB@t*_?#\x1b@\x8d\x99\x82U\xa1\tL\xfb9\x1e\x12\xc9{>C\xd5L\x1c\x8e\x12u\x9b|\x17e\x10"\x0f\xbb\xb3t`!%\x04\xc9<k\x00\xc5\xb2E\x8b\x15Lds\x19+J\xfdk\xb7:(2A\xfc3\x97e\x8eR\xcf\xaa\x9b\xab\x0bi\xe4D\x1d\xb4\x92\x91\xafK\x8d\xa4\x88\xed\xf8K\xb7o\xe1\xc8\xaf\xe6l%\x9f\xfe\x9a\xf1\xa1\x88\xdf\xda6 \xc1\xb2"\xd7\x9d\xa5\xc7\xb0\xc9\xcaF\x03\xf1\xc9\x80G\xea\x1f\xc3\xab\xe8\x8a%\x83W\xa8\x94US\xd2{`\x05\xd7wH\xd3Z\xb0x\xf9[\'\xdc+C\xaa\x89*O\xa8i\xa6\r\x14D\xdc\xaf\x8f\x9dl\xeb\x96\x03;\xf4\xcb\xbf\xba 5>\x17\x03\xa0\xee\xacl\xad\x93\xb4\x18/v\xe8\x0f?\x08I\xbfR@\x9a\xc4\xb4\x9cB\xa2\xe7\x0c\xdd\xd4\xd0\x8e{[ {\xdd\xcb!\x1c*r\xf8\xb6\x01g\xc8\xbblh%\\\x01\xdcxy2\x86\xad:\x08a\x1d!\xee\xd7\xb3:\x87k\x0b0I\xc9\xc3\xfb\x07\x86]\xb2\xf8\xf5\x8c\n\xc8#L\xb9\xb6Dh\x95\x18p\xa9hX\x8c+u\x83\x02\xb2\xdfG\xb6\xfe\xe9\x00\xeb\xa4\x1d#o\x89wG\xe8J\x97\xf1\xd9\x82\x1bc\xdc\x99F)\xf5\nI\xd9\xea\\\xd1>\xe5D\xad\xab\xb0t2~\xa3i"4fcM\xee\xe2\xe8\x9fn\xf9\x06\xbd\x9b$(\x92/(\xbd\xdaK\xee\xf3\xda\xbd8tk9L\xf8\x98\xb5v\xde\x9c\x84\xc8\xa2H\x84\xe0\x06\xe3\x13\xb4\x94w4\xde\x9e\xd3^\x0f\x98VD\x1d#\xa2\xc1sN\x8a\x80\xcb0\xc7Dg\x12\xd7\xed5>\x15\xcc\x98\xe6\x8f\x1e\xfbo*\xca}\x85\x97+\xe6U\x88\xfb4R\xcf\xd95\x82pz;\x17\x06m>\xfc"T\x06\x8a\xcd\x90\xcd\xa8\xefv-\x96\xe3\xb2\xd3\x006\xa7\x0b\xad!\xf6%[8\xe7t\xabv\x8d\x05f\xb1\xfb\x80\xdc\xd2\x82\xcb2\xf1\xac\xa2\xb7U4\xd0WT2\x0fnX\xd0\x82/\x0e\x90)o\xbe|\xa7\xadV\x80\xdfXr\x04\xda\xa1|\xbe\xd7\xcf\xe6(\xf4A\xe45\x03E\xfd\x87\xb9\xda\x8b\xd3\xb6ny\xbb\xc5\xdf\xd3\x06@\xf9\xeeD\xe1\xdch\x960\x98\x8dn\t\x0c%\x14\xe9f\xb7\x9d\xfa\x13\x02\x1cv>\xf3\x18\'\x98\xff\xd1\xf6\xf1\xbcE^\xd3S\xde\xb6\xb9\x8e[\n\xba6\xdf$\xaa\xf4 8\xaa\xf0IS\xcf\x1e\xc2\x01n\x10\xb2\x02\xe2y\x91\xf0\x96(\xe2\x1b\xde`)\x8e\xee\xae\xec\xb8\xb2~ \xa5\x90\xabPK:=\xb2\xcb8\xfc\x0f\xa50\xaa~(\xd8\x88\xc0\x83\x8e&\x04\xc1E\xe9Bq\x84d%C\x8a\xc6\xb2\x8a\xbe;\xf0pJu*\xda?^\xbe\xa6n\x87Y\x8a\x0e\xe0H\x7f\xd3\xad\x1c\xa1P\x91\x80<\xb4\xe6eJW\xc6nU\xb1+v\x03xQ?\xcb\xd9\xcf\x19\xf0\xe5\x04(\xf8\x94q\x90[-A\xee\x9f7.\'L\xfc-#\xdaR*]\xe2g\xb9&\x9bf\x97=k\xf8\xc0\x8e\xab\xf4\xc0\x12\n\xffBJ]J\xff\xc1\xd6\xc6\xe5F\xad\xf8\x8f\n\x8e\xc3\xf2\x8f2\x03\xa8V\xd3\xda\x83-\x1b\xe7\x16\xa9\xc7\xebM\xd7\xd6NmC\xfd\x99\t\x93\r')
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
import pprint
|
3
|
+
from flask_babelex import gettext as _
|
4
|
+
import pathlib
|
5
|
+
from hiddifypanel.models import *
|
6
|
+
|
7
|
+
from datetime import datetime,timedelta,date
|
8
|
+
import os,sys
|
9
|
+
import json
|
10
|
+
import urllib.request
|
11
|
+
import subprocess
|
12
|
+
import re
|
13
|
+
from hiddifypanel.panel import hiddify,usage
|
14
|
+
from hiddifypanel.panel import hiddify_api
|
15
|
+
from flask import current_app,render_template,request,Response,Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
|
18
|
+
from flask_classful import FlaskView,route
|
19
|
+
|
20
|
+
class Actions(FlaskView):
|
21
|
+
|
22
|
+
def index(self):
|
23
|
+
return render_template('index.html')
|
24
|
+
|
25
|
+
def reverselog(self,logfile):
|
26
|
+
if logfile==None:return self.viewlogs()
|
27
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
28
|
+
|
29
|
+
with open(f'{config_dir}/log/system/{logfile}') as f:
|
30
|
+
lines=[line for line in f]
|
31
|
+
logs="".join(lines[::-1])
|
32
|
+
# resp= Response()
|
33
|
+
# resp.mimetype="text/plain"
|
34
|
+
out=f'<pre style="background-color:black; color:white;padding:10px">{logs}</pre>'
|
35
|
+
if len(lines)>5 and "----Finished!---" in "".join(lines[-min(10,len(lines)):]):
|
36
|
+
out=f"<a href='#' target='_blank'><div style='background-color:#b1eab1; padding: 10px;border: solid;'>Finished! For scrolling the log click here.</div></a>{out}"
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
return out
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def viewlogs(self):
|
46
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
47
|
+
res=[]
|
48
|
+
for filename in sorted(os.listdir(f'{config_dir}/log/system/')):
|
49
|
+
res.append(f"<a href='{url_for('admin.Actions:reverselog',logfile=filename)}'>{filename}</a>")
|
50
|
+
return Markup("<br>".join(res))
|
51
|
+
|
52
|
+
@route('apply_configs', methods=['POST'])
|
53
|
+
def apply_configs(self):
|
54
|
+
return self.reinstall(False)
|
55
|
+
|
56
|
+
@route('reset', methods=['POST'])
|
57
|
+
def reset(self):
|
58
|
+
status=self.status()
|
59
|
+
flash(_("rebooting system may takes time please wait"),'info')
|
60
|
+
subprocess.Popen(f"reboot",start_new_session=True)
|
61
|
+
return status
|
62
|
+
|
63
|
+
@route('reinstall', methods=['POST'])
|
64
|
+
def reinstall(self,complete_install=True,domain_changed=False):
|
65
|
+
if int(hconfig(ConfigEnum.db_version))<9:
|
66
|
+
return ("Please update your panel before this action.")
|
67
|
+
if hconfig(ConfigEnum.parent_panel):
|
68
|
+
try:
|
69
|
+
hiddify_api.sync_child_to_parent()
|
70
|
+
except e as Exception:
|
71
|
+
flash (_('can not sync child with parent panel')+" "+e)
|
72
|
+
|
73
|
+
|
74
|
+
domain_changed=request.args.get("domain_changed",str(domain_changed)).lower()=="true"
|
75
|
+
complete_install=request.args.get("complete_install",str(complete_install)).lower()=="true"
|
76
|
+
if domain_changed:
|
77
|
+
flash((_('Your domains changed. Please do not forget to copy admin links, otherwise you can not access to the panel anymore.')),'info')
|
78
|
+
# flash(f'complete_install={complete_install} domain_changed={domain_changed} ', 'info')
|
79
|
+
# return render_template("result.html")
|
80
|
+
config=current_app.config
|
81
|
+
hiddify.add_temporary_access()
|
82
|
+
file="install.sh" if complete_install else "apply_configs.sh"
|
83
|
+
try:
|
84
|
+
server_ip=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
|
85
|
+
except:
|
86
|
+
server_ip="server_ip"
|
87
|
+
|
88
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
89
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
90
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
91
|
+
|
92
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
93
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
94
|
+
admin_links=f"<h5 >{_('Admin Links')}</h5><ul>"
|
95
|
+
admin_links+=f"<li><span class='badge badge-danger'>{_('Not Secure')}</span>: <a class='badge ltr share-link' href='http://{server_ip}/{proxy_path}/{admin_secret}/admin/'>http://{server_ip}/{proxy_path}/{admin_secret}/admin/</a></li>"
|
96
|
+
domains=get_panel_domains()
|
97
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
98
|
+
for d in domains:
|
99
|
+
link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
|
100
|
+
admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
|
101
|
+
|
102
|
+
resp= render_template("result.html",
|
103
|
+
out_type="info",
|
104
|
+
out_msg=_("Success! Please wait around 4 minutes to make sure everything is updated. During this time, please save your proxy links which are:")+
|
105
|
+
admin_links,
|
106
|
+
log_path=(f"https://{domains[0]}" if domain_changed else "")+f"/{proxy_path}/{admin_secret}/admin/actions/reverselog/0-install.log/"
|
107
|
+
|
108
|
+
)
|
109
|
+
|
110
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/{file}",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
111
|
+
import time
|
112
|
+
time.sleep(1)
|
113
|
+
return resp
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
def status(self):
|
118
|
+
# hiddify.add_temporary_access()
|
119
|
+
config=current_app.config
|
120
|
+
# configs=read_configs()
|
121
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
122
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
123
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
124
|
+
from urllib.parse import urlparse
|
125
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
126
|
+
o = urlparse(request.base_url)
|
127
|
+
domain=o.hostname
|
128
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/status.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
129
|
+
|
130
|
+
return render_template("result.html",
|
131
|
+
out_type="info",
|
132
|
+
out_msg=_("see the log in the bellow screen"),
|
133
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"status.log")
|
134
|
+
)
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
@route('update', methods=['POST'])
|
139
|
+
def update(self):
|
140
|
+
hiddify.add_temporary_access()
|
141
|
+
config=current_app.config
|
142
|
+
cwd = os.getcwd()
|
143
|
+
|
144
|
+
# os.chdir(config_dir)
|
145
|
+
# rc = subprocess.call(f"./install.sh &",shell=True)
|
146
|
+
# rc = subprocess.call(f"cd {config_dir};./update.sh & disown",shell=True)
|
147
|
+
# os.system(f'cd {config_dir};./update.sh &')
|
148
|
+
|
149
|
+
|
150
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/update.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
151
|
+
return render_template("result.html",
|
152
|
+
out_type="success",
|
153
|
+
out_msg=_("Success! Please wait around 5 minutes to make sure everything is updated."),
|
154
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"update.log")
|
155
|
+
)
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
def update_usage(self):
|
162
|
+
|
163
|
+
|
164
|
+
import json
|
165
|
+
|
166
|
+
return render_template("result.html",
|
167
|
+
out_type="info",
|
168
|
+
out_msg=f'<pre class="ltr">{json.dumps(usage.update_local_usage(),indent=2)}</pre>',
|
169
|
+
log_path=None
|
170
|
+
)
|
4
171
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
172
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,81 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00b\x12\x00\x00\x12\t\x04\x00\x11\xd1\\\xf1zo{\xf0x5\x8f\x19\x13\xcb\xb7\xe0\x00\x00\x00\x00\x00\x00\x00\x00s\x001e\xf4\xd4R\xf5\xd6\xb1Z\xf1\xd6\xc6\x84\xd1\x8crSf\x9c@\x07+\xb7\xcf\x93;\xdd\x1f\xe0\x03bA\x93d\xc4\x8a\x8f2e\xdch?\xc3z\xfa1\xd0[\xb9\x1aORt\x86\xaf\x14\xeb\xc1\x18\xae\x12\xef\xdf \x0f\xf2\xed(\xb7\xdfcb:\xfd<:\xc8R\xd3I\xd8\x1aLF\xae\xf3n\xbe%\x02\xf8\x1d\xa1\xd8\x8d"\x0bo\xc3\xbd\x086\xdb\xe6\xa1\x9d\x10\xe81\x89\xe8\x9c2&Z\x13\x95D\x84\xf5\x0c\x0b\xc2\xe0 n\x8e<\xa2\x86^\xa2`\x0fRC\xd8\x949\xde\xfe\xce\x16\xf2\x11\x9cp>5\x0b\xf9\x07\xe7\xea\xc8:\xcf\x84\xb6\xc9X\xfe\xb0\\\xc3\x01\x7f\xe4<\x9d\xe3\x90=|Pp\x08\x16\xe4{\x98\xce\xea{\xb7\xd1\x87,\x816\x10z\xe5PD\xa8\rU\x10\x12\xbe\x7f\xf2\xa1\xde4c\x90\x85\xcf\x9cdM\xbamVp\xdb\xb0%\x07\x93\x9cp\x9a\xd2\x9dc!\x81\x9eOj\xf0t\xbd\xae\xd2|\xac\xbd\xc78\x12O\xd6\xf7SZo\xd2\x07\xcdR(\x9cG\xa1\xfc\xac\xcc\xbc:n\xc2\xf1j\xdaT};\xafe\x99\xb5|\x17\xce\x85\x84\x8b\xe6\x07\xab\x7f\x1d\xb1r\xfd\xc6\x9b\xba\x8d\xb2\xfd\x86\xfd\x02\xfc+\xcb\xd6\x85\xf2\x13\xc3\xafNO\x82\xcd\xfc\xb2\x8cf"\xa5\xfa\x90\x9d\x05\x18+\xfe\xe1r~8\xe5\xdd"m\xd4-8\xc2\xca\xd3T0\x92I\xcciT\xad\xf3\x1e\xa2\xb7B\xa4`\x04\x82^\x95w\x07\x83\xf8V\xcbI\x11\xd5~0|\xbbGC\x9f\xc9\x0b2\x91P\xaa~\xc1\xcb\x97\xcf`\x98\x91\x05\xf7\x12WG\x11\x993Z\x9c\xfc\x9a+\xf3r<?@\xf8\xde\xcd\x19\x01\n-x\xa5\xfe\xbf\xbd\x92\xef\xaf\xf5\x98\xfa[\x19\x1e\xa2\x16\x9fi\xeb\xc0\t=\xb9\xcf\xabm?\xb47\xd1\xdby \xcc\xdf(5\x97\x9b\xbf\x08\x04\x92\xab<\xec\xc7\x91.Vz\xf8\x16\n!#\xc0\xd2\xf1\x8e\x0f/\xbe1\xe7H\x1eY\xa6x\x1f\x85]]\x19\xc2\x89\xcbB\']\xeb\xfdA\x98o0T\xff\xf9\xe6\x97\x94\x1ePC\xab\xb3mg\xd8LM%H\xe8<\x8a"\xce\r\xf3\xcf\xe7h\xa6\x07p\x9e\x86\x05\xbfBV^\xa5\xd8\x1d_^\x81\xbd\xf2\xa9T\xcb\xe1\xbd\x8e?\x98\x88C\xcc"?\xab\x15\xd3OH@\xd1\xa9\xe2\xe7\xe8\xdc\xecg\x90\x96\x84`XL\x05\xbc\x9f\xb1usJ\x1er\xac\x03\xb7\xe6\x7f\xb2\xc4\xe2\x95\xbe\xda\x1a\x8d\x86S}\xd9\x8f\x16\x0cdY\xdc?kdP\x91\x1d\x7f\xef/\x85(\xea\xf2*rm-q\xe0M\x02er\xb2R\xe9L1Pf\xf6!>K\xb6\xd0\x98\xff\x84\xe4I\xe7\xdf\xdf\xfb\xb0=\x7f\x97\x10l=|/Q\xc9\xbc\x8d\x0f\x05\x89\x1d\x91\xa1i\x8f{\x1bD\xeb\x83\x9bPx\xbd\xb94\xdd\x9f\x1d\\\xbe\xc5\xff\xa4\xe1?`\x84\xa2\xce2\xb4M\x8dv\xc1\xd5\x9bz\xa1o\xad.\xe3\xd1\xdeZ\x8f\xb2\xa8\x84\x12\xbf\x9cmse\x10\xc0\xc1\xcd\xd6\xf3\xe6\x89A/x/\xeey\x13\xa8\xb2\x9d\xbf\xa3;\xbb\xdc\x0eR?V\xc9c\xde\x9b3\xc4\xc6\x05\x9fR\xfb\xf8\xa9`!\xba\xaf\x19\x97&\x14\xfc\xb7\xb3\x08\x8fG\x0c\x13\xbe\x98e\x1du\x8e\xbd\xf0\xef>\x84\x1ff\x80\xcf%U[\xec/\xd2%\x8b\x96A\x04\xca\xc0\x17\xce \xeb\x14j\xb2\x19t\x98\xab\xa2\xe3U\xc3\x0c\xd6 \xb6\xee@\xbf\\\x14\x08\x11\xc2\xceq\x13\x02\xfe\x8fe\x9f\xca\x10\xa0P#\x97\xd2\xae\x97\xcd(jY&\xe1\xd11\xa3Sm\x9a\xfe\xe7\x156\xa5\r\xd9\xb0J\xf8V^\x10\x0e\xf5\xf7#\xb5\xc9A\x9c\xa5\xa6\x06\x7f\xbd\xaam\xe0@)\n*\xda\xda\x1d\xb2\xcc\x81\x9e\x93wv\xfd\xb8\xf6\xaa\x9f1\xd5\x18\x99C\xe4Z\xa0\xa0\x9fJ\x95\x02\x9fw\x9c\x80\xf5\x8fY)\xf97!\x92\x83\xd8\x89\x91\xbc$\xe8(\x0eD?\xf9\x06R_H\xcfuM\x08v\x8d\x86|\x9b=\x89s\x13\xd2\xae\xfb%(]\xc4\xa1\x00s%\r@\xd8\x00\xaf\xcb\xd9Q\xca*\xf1\r\x9a\xf2nL\xb4\xff\x1b?g\x1a\xbd\x9bm\xbd\to\xc9\xdf\x04d\xc2\xc7\xbb\x88\x19\xb2%\x10Q\x90\x95\xe4\xfe\x9a5\xe8X\x97\x93\x03\xb7\xedX\xee\xfa\xd8e\xe2\xc9T\x83\xc8\xccu\x9fN\xd5\xdfM\xaa\xc8\x06\\\xe8\xbb\xc16\x15\xd8\x9aE\xad\x9fO\xe3]\x9c\x8a\x9apjy\xd3\xfev\x14\xc4\xdd.\x8eWp\xbcy\t\xa3\x98\x88v2\x07$\x18\x10o\x9f\x85\x02\xcb\x07\xf0\xfcb\xa5\x07\xf4\xea\xe0\xaf\x1b\x8e9\x819\x1d\xd2i\xf0p,\x9c\xe8\xa4H\x13\xedw\x1a\xd3x\xdc\xd7\xd4\xb5AJ\x11\xf3\xd8\x88\xed\xa6o\xc8\x07\xe3\x0f\x1c2z9R\x9b\xbd\x10\xd77\x98\x0f\xc4k\xfc\x10vqx\xadg\n\xd4\xf2[\xb7\xc4\xac[w\xfb\x1c\xe9\xb3\x10M,@\xadQ\x0eM8\xa8\xca\xcese\xfb\x0b\xd1cO\xbf2\x97\x91\x8fZ\xbd$\xef\xfeh\x02l!s\rK\xb7\xf5\xa6\x06\x88G\xce:\xf9\x1f\xbcY\xcf\xb6\x07\xb2.R nB\xb3Q\xf1\xab\x89\xa5\xe5(\xe0NO\x8f\xcd?f"?oa\xea#\xcf\x8e\xa3\xdf\xe7lyz\xc9\xa3L\xfd\xcac\xb6\x99\t\xd5\tC\xf4_\x88\xe8s\x9d\xa0"q\xaahB[[\x1e}\xc7\x9f\x1f\xc6\xc0\x85\xda\xad\xbca8\xd0=\x1a\t?.W\x91\x18\x13\x8eF\xf5r\x1f\x04"o{\x1dbPj#\xb8\x87me\x10S\xcd0\x1a\x80^\xb3g\xbc\xfe\xae\xd8@\x06\x83n\x0f\xb5n\xe5\xcd\x85)<\x196K\xa0\xa6\xbf\xb8\xe8\x98\x06$l\xdd-7S\xdd\x14\xacgH^~I\xe5\xd7hz]\xfa_<\xe1\xa3\xca\xa6\xf3\xfbN$h\xec\xb1Tp\x17m\x97fxp\x8eQwt\x82\x01\x14+V(\xeb\xc4\xdf\x9d\x8d\x8aOx\x0c\x1ft\x1bc\x0ed\xee\x8d\xb2E\xd3\x0bd\xd6\xe6w\x8f\xddd/\x90\x05@fS\xc8qU\x8f\xa7Y\x02\xf1\xc12\x83?A%\xfcn\x17\x07\x89S^5U\xc3\xf9%\xf5c<\xb1@\xc0\x14Z\xa9\xa6N\xc3\xf3=Yb\x82\xbe\xa2\x9d~\xa3\x1f\xcbT\'\xa2\xa5\x88\xee\xa0V\x0b\n\xe2\xa3E\xa1\xa5\xae_6M|\xcf\x07J\xf2\xbe\x9d%\x8d6POeY\xfat\xe8%\xfb\xb3\x93\x81?\xad\xd5+\xea-\xf3)/ e\xe5\'\xd6\xee\xb4\x05\xf7\x8f\x8c"\xf2\x10\xf78\xe8\x11\xd5r\x17e\xca\xc0\xec\xc6\xef\xebevru\xac\x85/C\xfaC\x08\x93\xbe\xb1v\xf6d\xa3U\xee(\x97\xdd\t+t\xc9QM\xc4\x87_ \nXt)\xd0)\x91b\x19\xe2\x93\x99\xe9S\x9e\xf2\x84\xbfG\xea\xda\xe3\x90U\xac\xcal\xe3\x99Di\x16b\xe7&,$\x86#W\x16d\xbeGd\xce\xcf\xf9G+^E6&c\xe5\x9d\x84r\xc3\x04\x96\x8c\xb4\xf2y\xe0\x88n\xbd\xea\xa7=y\n\xd6\xdb\x17\xd6\xb8e\xe3\xe4\xa5W\x07\xa2~\x8a\xad{XaB-\xe4\xfc\xd5v\xf3\x98`\xaed\xb0\xac\xa2\x12_=#\x83H\x0c\xc0\xd0\x1eDq\x90\x1d\x0f\xfa\x03\xb5\xc6\xc4\x94\xff\x11{\xfe\x8e\x8e\x9a{\ra\xac\x1eQ|\x9f%\x0e$N0\xd3\xb8\x07i\x1b[\xbd_S\n\x19?S\xa2\xa5H\x8f{\x19O\x92\xbe\xeaM\xf9k({\xfcGl\x9b\xb7\xadN\xd6\xcdU\xf0\x84MhLu\x1c\\\xbfT\xf2\xc6je\xa6\xbd\xbc\x08|^\x80\xf4\xd3Nee\x8f\n\xae@T71Pv<\x14\x81/\xa0@Q\xf4O\x1dRx\xfa+\xa1\xfaY\x16kX\xbcKw\x97MX\xa1\x18\xf9!0\xd02\xeft\xbf,\xa0\x9e\xd0\xb9\xf4-\xb2\xd2\xfc\nE\xa9\x94\x0e\x1fn<\x10\x1a\x8eMC\xf9C9\xbf\xe0I\x80z\xc4%\xef1\xd6\xca\xd9*w\xe2\xe6]\xbdA\x9fP%a\x04\x94j\x89xx\xee[\xa5\x12\xbd\xcc\xf7\xc6+\xc7\xfck\xed\xc9\xc6\xa9\x19\xa2\xa7$\x062jT\xa0q\xb2;@\xc1k`\xa1\xb2\x08\xd9<\xb8\xe4\xfc\n\xff\xb0\xc2\x81\r\xeeNcS\x0c;}H\xff\\\xbd0\x1d\rg/\xd2/\xb0r\xee\xcbAM\x92v\x1a\xfd9\'\xe9\x0b\xc6\x8c\xc7F)O\x0b#\x04.u\xf9\x03\x01\xfck\xd5S<\xbf\xfa,\x8f\xf7\xcdd+\r\xa9>\x1c\xbc\xea\xf9\x15\x13\xfe\x13\xb0f\x9f\x9f:\x96\x04a=<\xefhh\xe2\xaa\xd4\xe9\xadd<\xf2\xa8[\x0eX\xbb\x9fA\xe1s\xba\x0c\xaa\xd8\xd3\x17\x1b\x8eB,,\xa7ZM\xcf@\xbb\x9d\xe9PJ\xbd\xb2\x1c\xff\x04;%\xc5\xdc\x98\xa4% N\x8f\xea\xb9\x10$\x96\xd3T\xd0\x9b\xad#Lo\xecV\x11\xec\xf84\x96\xf0\xcdQ\x95V)\x11\x81\ry\x9e\xd0\x84\x15Z\xb2\x1b\x0f>v\xb7M(\xc2a\xd9V\xf1c\xb7\xfc\xf2Y\x87oK}\x8cW8\xf30\x81\xb9F\x91\xc6\x90\x03\xa8m\xac\';t\'\xdb2t\x0c\xe0\xfa\xab\xdf\x0c{n\xd6\xbe\x88\x94\t\xc0\xe7P\xf6\x19\xdf\xe2\x82S\x8c]uh\xd3\xdf,\xa9\xb3"\x03\x87j\xf2\xc0^c\xbb\xf4\xccO<K\xa8p\x05"\x03\x99\x04\x9f\xdc\xdd\xc5b\x12\xd7\xd1\x8c\x02\x18\xe1e\x98\xfc\xae&\xf6\xe1\x18\xd9\xd8\x95#\xd0-\x8f\xce\xb0\x04d\xfe9\xcf\x02\x97\xdf\xcc\x13\xd0\xa3:,_\x8cSkN\x05/d\xe7\x1c\x14\xfa\x08\xf3\xc5rX\xac\x0c\xcb\xde\x9e"q\xf84F\x8b\x05;\xb2~kw\xb5\xc0@\xc0\x03\xdaKH\xe8\x9c\'c\n\xf4\x89\xc7\xb6\xd5Kd\x18\x18\xc9=\x05\x06Z\xa6\xac5\xb5\x14i\xb5\x8d\xe8p\xa7\xf2>\xad\xff\xac\xfe\xa2\xa3\xa4\x83\x10\xe2~\x02\xd08\xe7\xde\t\xbb\xc6\x00s\x86\xd2z\x0f\x82\x90N\xd79Z\xa0*\x94\xb1\x02\xc0\xdf\x90v\xd6\x0c\x1b@yt\xa2.\xcb^\xa7"o\x05\x91\xf38w\xe9\xf7A\xe1:QK\x92\x02\xd0Zn\xe6}\x1e@\x7f\xa9\x9b\x1e\xd3\n\xac\xd4\x00\x98M"\xb3\x0cb\xc0\xc2vT\xcf\x19\xaaAI\xbf\x12GY\rNjP\xfe\x07\x03\xcb\xf4\x18AYz\x8cIp\x02\x0c\xd8\xe6I\x16#4\xcb?Y.\xe9\x10;\xeaNW\tP\xb7\xa4\xe1\xd2\x1d\xda\x8c\x08\xa0\\\xf1h\x98\xcb\x1c\xf3\xa8Lv\xfa\x8b\xb9\x18\xfc\xac\xbf\xa8\xd63I49\n\xa6\x92\xfaWO\x86t\xa8\xc9(\xaf\x8d_N\\\x1dN\xfb*\xab\x9f\x91\xc1\xd0\xb6\xd5\xb1\xd5+\x06>=\xe1]\x1e?[\xc1\xc5\xc2\xc9\xeb\x19p\xbbSe\xd7vi\xbbz\xa2\x0c\xb7X\x1b\xa9(\x8a\x00\xad\x01\xcf\x82\x0c(\'\xda\xe1\xf8\x1aH\xa2\xa5U\x1fc-2\xcf\n7M*Z\x8bwc\t\x85\x18E\x9b9\xc6\x0b\x14\xf9\x90\xd1\xe35P\xafxQ\x8b\xb8\xe8\xa4\x11\x82q\x02\xa8\xc0\xddA\x94\xe2\xb0u\xf9\xfbp\x82\xfcY\x1d}X\xb8=\x15j\x1b\xf8\xf3\x9dw\x1c\x02\x13a\xc4 \xc1\xab\xe4\xa1!\xac6\xf6\xff*o-r~\xf4;\xe0\xa7\xc6\x9b\x83\xee\x99\x04\x157\xd90\xb0\x9dN\xf0\xb8\x1f\xa91\x0e\x08Hs\x17\xb58\x15n,E\x84\xd4\x1e\x9c\x9a.<\xc1\xdc\xf6\x9dVW\x08ao?[\x83\xef\xfd\x03\x0e\x07Z\xd5/O\x03\xc4\x88\xcc1\xeb\xf0w\x16\xb3\x8e\x0bv\xdc\x13\x1a<\x82\xfezL\x11\x08\xe5\xd0V\xcb\xfa\xc4\x9a\xb2\xa0G\x1d\x9b\xbd\x0b\x01#G\x1d\x86\xad7\x90\x85\xb5\xae=9\xfb\x82J\x04\xf6\xef\x87_"kp\xfaG\xdf\x01w\xfb\xe8p\xd6\x19F\xe0d<\xcb\xb6\x89\xbf\x89\x00sN\x0fS\x95\xa294\xf8\x02r\x07k\x1b\xf5\x86\x93>\x05\xe1P\xb3\xff\x12"\x0c:\x889C\xb5\xfe\xa7\xc6\x088\x1eCr\x12-"\xb5\xc6G,Sf0\x80H\x9cI)i\xa4\xc2[)\x08)\x7f\xfb\x8e\xc2c\x81\xea\x85T\xc5>g\x8fb\xa092m\xed\xec#\xd6\xdd\x08O\xb0)if\xae\x17\xe5u\xa1\x97\x07\x88\x8e\xcf\xc0\x91\xef\x9e\xa8\r1fc<4\xfao5\x00Y\xea\x1eG\t\x8b\x83P"\x80\xb1\xde\xe2\xa5\xf1O\xcf]\xfd\xe1}C\xda\x87\x8a\xd3B\xfa\xddJ\xb9\xdcC{f2\xdc\xe0\xa9gN\x00\xeaT{%\x19\xb0\x08U`\x0c\xd59%\x98Q\xa5\xcdi3\xb4M\x94\xd9\x18\xe0\xf8UT\x91q\xe9N\x08\xa1%-8\xaa\x02%~\xe9\x1a\xa1\xb9>\xe8X\xbfK\xbb\xbd\xc3\xfaL\tH\xb4\x80\x8b\xd0]\xf0\xd1\x80\x18m\x8e\x97\xab\x95\xfd\xed\x0e\xaa\xb4\x15;XC\xcd\x80\x8cwQ\xf1/F\x89\xcfng\xc4)?\xf4Q\x8e6\xcb\xbb\xf0\x12\xb4\x97\xfeY5\xabc\r\xf3\xa1T\x9ad\xa4\xee;\x00\xe5]\xdb\xb4OR\x92P\x1dD\xdd\x1a\xeeM\xfc\x97\xcd\xe1"coK\x844\xb5\x81\x8d\xb6\xf9C\xafo#\x98b~ae\xbb9\x97\xb4\xffPB\x9fr\x1fW!X\x153+m\x18\xf0B\xfa\x11\xae\xa2\x8eu\xd0\x95\xd2\xbff\xcc\xc6\x14\xb2xx\xa3\xbc\xc1\x88\x13\xad\xd5\xc3\x06llR\xda\x9d\xf9#p\x80\xa4\x19\xc5#b\x1d\xf9\x97\xf4\xfd[u\xbe\x80g\x85\x10#\xc4\x12&\rV\xb9oW\xd4\xab)f:Q\x0f\x05\xe8^\xfe\xbf\xb0\x01&\x8e\x10\x06\x9eA(\x81\x14\xaf\x93\xbb\x1f\x1c+\xdaTe\xe2\x1a&\x9e\xff\xbb0\xd4D\xde\xa7:\xe5\xb4\x98\xb2s\x1d\x01\xefA\xde\xa6\xf9\xf6xgB\xaf\x11\xd2\xb0\xed\xbb\x05\xed\xe9O\xd3r\x13\x00\xc4\xf1^\xbdN7n\xf0\xabY|6\xdck]\xae\xe8-;\xb7\xa8\xb3\xda#\xc4\xd2\x83<\x03\x95\xef\x8a\'\xf8M!\x82\x8c\xc6\xbb\xd5\xe1\x9e\xa0V\xfb\n\xc8i\xb8\x05\x15Z\xac\xe8\x10b\x07=\x9er\xac:A\xbcD\xbd\x9a6\x95>\\\xe17\x7f\x0b{\xb3\xee\xfd6\xcc\xac_\x8d\xfe\xed\x85\xa7\xd8\x0f,\xc0\x9bxo\xf8\\y\x03\xef7\xd8\x81\xcfwr-B\xe6\x0f\xc8\xe0\xa6\xf9\x9f`\xdbI\xe8\xc2\x80\xe4\x9c\xd4\xac>\xde\xcb\x91\xf5\xcfp\x81\xa8\x95\x11\x9bO\xbd\xc3\xdc[s\xfa7\xad\xf46w\x93\xed\x9d?TC9BG\x06\xde\xcd\xea\x80"\xde\xa7 (<\x8ax\x91[\xb5\xda\x17\x9c\xf4\xd3/\x1f\xa0\xecT\xb6\xfc2:\xc9\xb42\xb3\x08\xc5\xe1\xc0\xa0\xb6_C\n@\x04\xc0\xd6\x07\x12N{\x9f\xa3\xc0\xd7\xf3\xb4\xcf\xfa\x82\xb8\xcaH\x06T\xfd\xab\xe4<?\x9c~6_P\x86\xca\xfdm\xc9\x0fM\x14\xc5\xcf3\x8dwc^&\x0b\x0b;\x15"o\xa7\xaf\x93\x19~2\xa2U\x8c4`\xcb#\xe4*\x1b\xf5\x10\xc4bb\xae\x00>\x19\xaa\xd6$\xf9<\xcb\x03~|\xae\xe2\x0bd?\xec\xb1\xec\xdc\xee\x80\xfc\xd7F\xe6>6Il\xda\xf3\x04\xd9\xa6\xa8\x01\xe6\xc7\xd1\x1b\xc1\xf7\xc2KK\xaf\xe9b\xe6\xd3\x17\x0fn\x16\x93\xb7\\\xa4^,\xdc\x95\x08\xeb\x14\xb3\xddG#\xcc\xd46s*\xe7\x9b\n\xff\xbc~N\xb7\xf5y\xe6\x87\xd6e\xa4\xb7\x9aOUc!\x8dk\x8bh\xbf\x99\x1e\x8a\x9d\xf0Af,\x81?\xcd\xbfX\x12\xae.\xd7\x02\xfc\xcc\x01\xc4;\x8a\x0e\xf1\xfc\xc1\x9a\x98\xb1&v=\xf70\x83Lj\xf0-\xd8\x86\xdc\x0e\x03\xab\x02\xb8\xd1\x91m\x1f\xb3*\xc8\x90\xcb>\x15\x10\xde\x00=\xa3\xd8\xdd\xe5\x0f5A\xfd\xdb\x0f\r\x9c\xef\xf9!(1\x84\xf2L\xab\x0cw@\x066\xc3\xfa\x1d\xecM5@\xf6\xd5\xb1\xf9:\xa1\x8d\xd2\xb2\x8aM1\x9fi\xe0\xb8\x9cO\x06.W5\xb0\xaa\x19%&\x03 \xfbJ\xf7\x95t\xf6K\xf7\x89\xe9\x1b\xa27o\x86+\xf2l\x17\'I<\x9a\xcc$\x15JE\xe7\xe9\x8c.\x8a\xea\xae\x87\x01\x02Fc\xd9\x1b\xc6]f\xcc\xc6=H\xb7\xd1\x9ahT\xf5\xdf\x17\x1a\x05\xec\xaf\xc4U\xff\xc2I\xbd\x91>\xa6\rz"\x8d\xb1Mg\x8c\x0f\xd1D0\x98\x1cg.\x13\x16q\x94\xf9\xc9\x0c\xfb\x91\xe8\xf8\x97\xb0\xde\x07\xdb\x8dj5\x14t]\xa5o\xe1\xb8\x16\xe5\xa6\xbd\xb1\x83\xf1\x12\x04\xfaK\x19\x10\x06\xa5\xc5\xe2\xbd\x90^zE\x07\xf2\xe1\xe2)\xe5\xdd\x81\xc7C|\x9d&`\x89]\x90\xee\xaf\x1d\xc1\xf1jb\xf0\xa9\x91\xc4\x0eZ\xa3\x16\xe9w\xb7!\xf7\x87I\x00\x9e\x84\x9b#\xcd!\x8f\xf3[}\xaaY,\xe3\xd2\x88\xf1\x02\x01\xa7\xb1Y=\x85\xff38:=D\x8d\xca\xba\x14\xb5g\x81s\x9ee\xd2\xa8{\xf3\x072\xd2\xf8\xe3\xf2\x08\x1a(\xdbe\xa3\xf1Va\x9d[\xb6\xd2\xf08b\xe8Mq\xe8%\xbf(9\xb5\xae\x01\xefi\t\x19o]\xb6\x8c}\xa1\xfdi\r2\xdd3\xfa\x15\xben\x0b\x0f\x19Y\x1e\xdd!\x1a\x82\\\xc2\xccv\xfd\xf6]\x8c\x1a\x9a\xb7\x8f\xa1\xc6\xa8\xf0\xd0&\x08\xa3\xd4z\x1dJ\xb8\xaeJ\xc1\x97!\xf3\x84\xd4\x8c\xf8\xa4\xfc\x8b-N\xf4\xdd\xa5:\xda\xb3\xadD\r\xa2\xa9\x8d\xdacQ\x14\x9f\xf7\x1f:\xd6\xb5\xe0\xf5\xdd0\r\x0b}\xef\xfe\xa0\x05\xef\x1e$?\xde\x17\xa4\x0fs\xbf\xa5\x89\x17\x87;\xad\x028o\x18\x19\xf2\x15c\x10\xed\xd5\xe1*\t*\xe8\x87y\xc72\t\xa1JRr_\x1b\x8b\x9d\xff\xb6\xc3_\x04\xaa\x12\rQ\x7fN\x9b\x13\x10X\xf1\x18|\xa6\x07\x7fZ\xd7\xf8\xb3A\x9e\x11%L\xab\xbe\xab\x80\xd5\xf5(\x98\xd8\xc3\x87\\x\x06|;N\xbf!\xa36\xa5G[\xa2v\x86\x8d\'\xd5\xdf#\x1f+\xcf\xad\x11\x9c`!\xfc\xf9\x16;\xe8W\x85\xd4g\xca\xf9z;]\xc7+v\xebG\x08\xdeu\xc1z\x8d\xdb\xe5\x89\xb3+\x14#oj\xeb\x90L]\xcd\x88\x12`\x98d\x8e{\x92\xeb\xf8\x16\xd8\x11\x03\xbbD\x85O\xe3H;\x86\xf9\x12\xec]\xb7\x87\xfc\xc3\xe7F\x9bs\x86\x11\x806Vb\xc5\x98\xba\x1cA\x07\xb3@\xd7?p\xd2\x8cr\x1e+\x9e-n\xa8\xe9\x91\x82B\xd2\xbfO\xa4\xb3\x8d\xb4\x00p\x90[Dn/s7\x17Oi\xa4o\x1eZ;}\xebxGe\x04\xad\xdd\\\xedK\xd5f\xe6\x9e\xc8\xf7\xd9C\xe4z;\xdeU\xc8\xaa\x0f\xe5\xf1\x9e\xad\xf0\t\xe7*|\xf9/Z C=\x9c\xb6\xbbB\x85\x98\xa6FH\x85J\xd1Aa\xfdt+\xb5\x1b\xdba\x1du\x13\xba\xbfFO\x942?\xbbj\xe5\'\x88n\xd0\x7f\xa1d\xc7\x94F,$n\x0f\x9b`\x9b\xe2L\xd6\x14\x1dA\x8c\x97\xac2b\xfb\x04\xee&o\xaf\xe5\xd8\\7\x9b\r\xfa\xd6\xa9\x8fs\xde\x15vwj\xd5wd\x7fT\xa9+\xb8\x0bm\xc49%\xc5z\x83g\xd0\xb9 \xc0u\xa4\'\xdadYC\xb60s\xa5t\xa6\xd9\xe3\x81%D\xc1%\xd1\x1bZ2\xef\x8e\xbdr>\x99\x0f\x8bQ(\xa0\x18\n\x11\xa8\x1aA\xe2D\xb1\x84\xd1H\'\x9f\x04\xa8\xbax\xc2\x1b7\xb2&\x8d\xdc\xfcr\x81K\xcb\x9e\xf4\x93K\xf5\xc5 \x8e\xfb<J\xe4\xadeD\xcc\x91\xff\xeb\xda\xfdK\x1c\xe7\xbb*\xcf\x1f\xc4$k\x15B\x1e\xad\x7f\xa9 \xd4\xcd(\\\x05\xa7#\xba\xa0G\xea\xa8[\x9d\xc5\x9e\x1fg\xce\xcdkD0\x07_/ n\xb4\x06\xe2\x11\x99.\xea%\xe5\x0eG"\x81\x08\x8e\x96\xfc\xda%\x9ab')
|
4
|
-
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
from urllib.parse import urlparse
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
import uuid
|
6
|
+
from flask_babelex import gettext as _
|
7
|
+
from flask_bootstrap import SwitchField
|
8
|
+
# from flask_babelex import gettext as _
|
9
|
+
import wtforms as wtf
|
10
|
+
from flask_wtf import FlaskForm
|
11
|
+
import pathlib
|
12
|
+
from hiddifypanel.models import *
|
13
|
+
from hiddifypanel.panel import hiddify
|
14
|
+
from datetime import datetime,timedelta,date
|
15
|
+
import os,sys
|
16
|
+
import json
|
17
|
+
import urllib.request
|
18
|
+
import subprocess
|
19
|
+
import re
|
20
|
+
from hiddifypanel.panel import hiddify
|
21
|
+
from flask import current_app,render_template,request,Response,Markup,url_for,jsonify
|
22
|
+
from hiddifypanel.panel.hiddify import flash
|
23
|
+
from flask_wtf.file import FileField, FileRequired
|
24
|
+
import json
|
25
|
+
|
26
|
+
from flask_classful import FlaskView,route
|
27
|
+
|
28
|
+
class Backup(FlaskView):
|
29
|
+
|
30
|
+
def index(self):
|
31
|
+
return render_template('backup.html',restore_form=get_restore_form())
|
32
|
+
|
33
|
+
@route("/backupfile")
|
34
|
+
def backupfile(self):
|
35
|
+
response= jsonify(
|
36
|
+
hiddify.dump_db_to_dict()
|
37
|
+
)
|
38
|
+
o = urlparse(request.base_url)
|
39
|
+
domain=o.hostname
|
40
|
+
response.headers.add('Content-disposition', f'attachment; filename=hiddify-{domain}-{datetime.now()}.json');
|
41
|
+
|
42
|
+
return response
|
43
|
+
|
44
|
+
|
45
|
+
def post(self):
|
46
|
+
restore_form=get_restore_form()
|
47
|
+
|
48
|
+
if restore_form.validate_on_submit():
|
49
|
+
file=restore_form.restore_file.data
|
50
|
+
json_data=json.load(file)
|
51
|
+
|
52
|
+
hiddify.set_db_from_json(json_data,
|
53
|
+
set_users=restore_form.enable_user_restore.data,
|
54
|
+
set_domains=restore_form.enable_domain_restore.data,
|
55
|
+
set_settings=restore_form.enable_config_restore.data,
|
56
|
+
override_unique_id=False,
|
57
|
+
override_child_id=None
|
58
|
+
)
|
59
|
+
|
60
|
+
from flask_babel import refresh; refresh()
|
61
|
+
from . import Actions
|
62
|
+
action=Actions()
|
63
|
+
return action.reinstall(complete_install=True,domain_changed=True)
|
64
|
+
# hiddify.flash_config_success(full_install=True)
|
65
|
+
else:
|
66
|
+
flash(_('Config file is incorrect'))
|
67
|
+
return render_template('backup.html',restore_form=restore_form)
|
68
|
+
|
69
|
+
|
70
|
+
def get_restore_form(empty=False):
|
71
|
+
class RestoreForm(FlaskForm):
|
72
|
+
restore_file=FileField(_("Restore File"),description=_("Restore File Description"),validators=[FileRequired()])
|
73
|
+
enable_config_restore=SwitchField(_("Restore Settings"),description=_("Restore Settings description"),default=False)
|
74
|
+
enable_user_restore=SwitchField(_("Restore Users"),description=_("Restore Users description"),default=False)
|
75
|
+
enable_domain_restore=SwitchField(_("Restore Domain"),description=_("Restore Domain description"),default=False)
|
76
|
+
submit=wtf.fields.SubmitField(_('Submit'))
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
return RestoreForm(None) if empty else RestoreForm()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
81
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|