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.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
1
- # 2023-04-08T15:11:20.485481
2
- from pyarmor_runtime_000000 import __pyarmor__
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\x00M\x1c\x00\x00\x12\t\x04\x00\xd7\xe6\x03\xa1(d\xb2tz\xa6c\x82{\xaf\xcf\r\x00\x00\x00\x00\x00\x00\x00\x00(f\xdbFb3\x8c\xe2XX;\xe7V\x87\xd4M51\xa6t\x89\xac\x1c\xd1\xa6\x10\'\xba\xe0\x14v\r\x93C\xf9\xaaj\xefVse\xec\x0b\x8f\xdek\xd7\x9f^^\x9d\xfb\xaf0:\xc7uj\xe60\xaa6\x07\x15\x0e\xd61L\xbfpsO\xd1\x97q\x80\x88\xb6iyf\x81\xb1k\xff\x823\x95\xe1\x97f\x07Wb >\xa3m\xf5Q\xea\xffke\x8e\xd7U\xfco\x8f\xeb/c\xab;\xc8\xb62\xda\xbf\x0b\xd7\xc4\x1cb\xe2o\xe5\xa3\xdf\xf2\xb6\x92\xbe\t\xca!\xccaJ\xdc\xe5i"\\\xdf\x14/\xeff\xae_)\xa9\xa4J6\x874t\xd2\xe8\x1b<\x90\x91\xc2Vre\xbc\x9f+\xd8\x13\xdb:a\x00\xbb\xe1aC\xb7;\xef\x13U\xacC\x07s\xc0j\x9b\xc7\x01\xe9\x9e\\3x{\xab\x95\xf9\xfd)\xc6\x94?n\n\xb9\xb4\x94B%\xbc\xfbcvdt(\xc89?\xde\x8a\x95\xdaE\xfc\x97\x010\x84NO\xca&\xce\x0f\xcf\x86\xb8\xce\x18\xd9\x18M\xdbH[+\xf1\xf8E\xf9\xdc(\xa8\xf7\xf7ZxU\x97tN:x-e\x8c\xee\x00\x01\xfeR\xf2\x17C\xe7\xa3\x95\xf1\x02\xb4\xf8\x16\xa0\xbc-+\xe7\xcc\xb7\xe1<\xaf\xff\xa1=\xfa\xa60\xb77~L\x94vri\x10\xaa\xdd\xdb(%\x064\x175\xe9\x81j\xd0\xaf\xf4\xdd\x9a\xa8\xbf\xff\xf1z\x00J\xb9\xf9\x95\x18\xd8\xff\xd9\xbf[E\xb6\xd4\x08\x94\x14C\xb7o\x9c[1<\x90\xa4De\xba\x9b\x96J\x94\xa7\x85nO\x0f1W\x1cC.\x02\x92\xf1\xedG\x16@\xd4|\x9c%\xbb\xe8\xd6\xd8\x00\xe3$\xfd\x11\xf3I\xe4\xe8\x90\xc2\xcfa?\xae\xbc\xa1f\x8c\xb4c\xb4+\x13@i\xf1\x1c\x8axE\xcf4\xff[<d8^\xf7\x87\xcf\xcd4\x88\xc8\xcfk\xca_B \xdc*\x8by\xbe\x13y\x834\xa3\x8d#o_\xdf?ZYFG\xdc\xc0`\xe5\x10\x99\xed\x90>c\xdc\xc4+\xe1x\xd9\xbe\xfe6\xd0\xee\xdf.\x81~\xd9\x90\x10bo\xdf\x03\xc5X\xf0\xb7\xea\xb1\xe0\xf4\xfdl\xba\xe6\xcd\xd5(le\x9d\x9c\xb9z~\xcd\x80zv\xbd\xe5\x06\xacG\xc6\xfa\xec\x81\x9bu\xfbLS\x17\xcb\x16=\x14\xa1b\xaaj\xe7\x83\xd0{\xd7W\xc4a\xf3\xac\'\x8dl\xf2.\x9bP\x9bW\x1d\xab\xbf\xee\xe6$\x13\xb2lK\x1f(\xb64\xfb\x92\xc8}\xad\xdd\x04\x0c"t\x0e\xb0\x8c\xfa\n\xb1\xa5\xd4\xf7S\xecTp\xbc\xb3\xda\xb1$<\xf3\x089jH\xe4[AKhR/h\x08\xbeu\x969\xf7\xaa\x9aFU\xcf\xf1\xe5\x88T\xfc\x1d\xf2\x08\n\xe2vf|T\xf6\xe1h\'h\x818\xbe>\x12\xcc\xbct\x8b\x15\xe6\x96Tw\xb8\xed\xdbD\xe6\xac\x00\xea\x8e\xa9i$O|\xac\x0bey\xf5\x15\x9d\'\x97\xce\x81\x0c-\x8dO\x92\x0e\xbcc\xefX lI&\xd0\xcd\x11R\x8d\xc1\xb5h$\x88\xa5\xc1\xa2\xdf\x02\xd2\xc8\xee\xa6\xc1\x15l,\xed\x00\xd4\x9fNo\x11?\xda\x19{z\xe4u\x91\x10J\xe9\xe9\x96\xb3(\x81\x93\x1f1\xe8\xa8\xf2\x8e\x8d\xb2\x0b\xde%\xa0%\xb1\xd7a\x80ML\xa4\xadu\'&\x1b\x91\x13\x0for\xb2\x8a\xc1X\xcd\xd5\x10q$8\x1fDMj\xfcn\'u$\xfd\x8a\xee\xb6\xa0:\xb6\x02Y|6+\xa1@\xedF\rm|\x0ezuCX\r\xbf\xc3W\xa9\xf1\x80\'\x80\xbe\xacxF\x11\xca\x8fl\x10\n\xceM\xd3\x9d\x9d\xfb\x93\x1c\xdfK\xfe\x8ae\x90\xf9\xfd\xfd\xbagS\\\xe4%~\xce\xee\xde\x1c\x11\x16r\xec?\xe2\x9c\xc0\xa0\xd9\xc2\x02\x17?3\xf2\xe7\xd5\xb4\xa9\xd8\x82\xe4\x17\x04\x1f\x92\x14\x9c\xfd/\xc7\xef\xa1CDv\xad\xc6\xc2\xee_m_\xfc\x8be\x1c^f\xe0\x91~\xd5\xcfR\xe6\xef-4\xb7*{\x0e\xe1I\x1dQ"\xc5\x00\xb9+vF\xeag\xad0\x11\xb3\x18V\\\xdfe\xd6$i\x92\x8cj\x8cx\x10s\xdf\xb7\x13\xf7\\\xe3\x03\xe8\x0b\x91\x92=\xb2\xd3\x1b=0\xab\xed\xd9\x1ce\x84\xaa%\xec\x95L\x81\xc6\x140\xa2AQ\x95K\x88Q\xb4\x97P\xc5D\xff\xa7dOP\xd5\xc8\xf5\xed\x1d\xae\xbe}\xb1\xcc{$\xad\xb8\xf1#q+RX\xaa\x1a\x84\x99`W\xf4\xbc4\x88\xde\x83\x156\xed\x8f:\x8f6\xed\x06J\xaf\xf3"J\xf8\x13\xf7\x06jdn\x95({\x15\xd0\x1e>\x19]\xd6Z\xe3\xa8 l\x00^\xfdp\xec\'5n\xc1\xda\xf2\xe7r\xc1\xca\xe5X\x81t*\xc25\xf5\xdf\xa4\xf5t\xff\xac9=>\xd57\xce\xeb_\xa3$\xdek\x0e\xac3\xfdk\xef\xb7~\xfc>a\xb7\x88\x17\x8c\x8dY\xb8-[\xbc\xe1\xcd\x82\xf86\xeb\x1f{q\xb0\xe8>I>\xaeI2\x99z\xe2\xdb[\xa3\x1f\xc9\xc7\xc1\xc4\x1c\xd2M\xc3\x12Q\x0b\x03\xcc\x9e\xa15\xe2P\x9cS\xb6UM\xcdS(\xbe\x88\x1e[\xa8\x9c\x13,\x98\xe7y%\x9b\xd1tb\xb4ED\x9f\xe5\xb3\xcew\x91-\xac\x89\xb6\x05\xb3\xf5\xf55\xf9\x98\x90\x0c^mhU1&\rM?\x02;3\x88\xa7\xf4\x19)\xb3=\x0e\xbd\xb6)q\xf1;\x17\xeey\xebp\x1dB\x85\x8aM\xb7\xadWK\xde\x102h\xf5\xac\xb2\x91\x84\x99\x8a "\x0e\xa6 1\xc5\xb0+\x08\xb8\x9b\xee?^\xcesp\x17d\xec\xe3\xa8\xb0\xe4\x80l\xa5<\xc8\xe4\x1e\x86\x05\xa0\xab\xc7\xc3\x0bL)!\t\xc1 pM\xf3<\x943\xa0m\xdeJ\x1b\xbe\xafK\xab\xf9o\x12\x99\xb1\x02a-\xd0\x1da|\xf39\xb1]\x0cO\xa7\xeao%\xb1\x9b\x93\x02\\\x84M\x1cS\x18\x8c!QD\x04\xa2\x0e\xb6\xe2\x94\xe6\xfd\xf2\xfc\xbc\xa7\x1e\x93/\xf8\xbe\xc1\xb1\xdcQNV\xbb\xc1!\xbddX\xb0\x9c\x86\xdc\x91\\Y\x83l\x9a\x88\x0c\xb1\x8c}\x1ci\xfb\xe0\xd1\x10]\x7f~n\x8f\x00\xb9\x96\xf0J\xbay\xf3\x8e\xfa\x04Z\xe8c4_]\x8dR\xd9{z\rc-\xde\xed\x01\x8d\xc228\x8b\xf8<\xaas\xee\x19\x8bO\xc4\xed\x15\xd2H\x96\xa1qo\x13RJ\xac\x8c\xf1L~\x13i\xf8\xa2\x86\r\xf3\xf8|B-\xaf\xf9\x92\xbaR\x92-m\x8f7\xd0\xc2\x0c\x06\xc0\xb2\xb5\x13\xf9\xa0\xa7a!C\n\x1e7\x0b\xa2\x84\xe3\'cc\x92\xd5\x7ffh\xa5\xb5\xf5q\x0f9\xe7;\xca\x932\x8e Q02\x0b\xc2\xc7\x1e\xc6\xb8q\x1er#Ke\xee\xe9\xa1W=T\x16m\xdc\'\xe8\xaf\x03$|\xed\xe8\x84|r&\x0f\x95\xb3\xd7\xa1,y\xdc\xe2\xaf\xc9\xdc\xdf\x16Yn\xafP,ce\xd05\n\xa5\x07@.\xa4\x8a5\xb1;\xb0\x05\xdaEx\xc5\xfe\xc9\xf2\xc4\xeaUu\xd4\xf5!_\xb0\x8f\xec\xd4\xef\xc6\xca\x86\x9eq]\xaeM\\K\x8b\x83\xa7\x0b\xf68\x8dyV\xf8>\xa6\xfc3s\x1f\xdfI8\xa9\x9a\x80\x862\x1d\xf9K\xf8/\xa0\x9e\x018\x87\xe5L\xde\r+\xf2\xb8[)\xc1Iw\x9b\xd2\xa3\xef\xb0\x19\x89\x12J\x97 \x7f7\xbf\x9f\xd5\x88I\xcf\x04\xb7\xa2\xd3G\x84\x1a\xbe\x80\x04\x92\x8de\x10<\x1b\xecaT\x9b^\xbe\xf4?\xa3\xa2oX,:\x98\xaf\x82\\Y\x17\xebnT\xfc\xaff\x11\t&\n\x12"\x0f\x8e\xa5~\x1f\x90\x84\x1b\x82KE\xfdd\x00\xe8_\x08\x88\xf9\xb2l\xb1\x1eZ=x(X\x04\xb1\x06\x15l\x18Z\xe88l\xee\xb1\x1b\xfb\x1a\xdc\xbf\x80\xe9"\xfb.2k]\r\xc8\x02\xae\xc3^FR\x14\xe2\xd7r,27\x0co\x8d:](l.Xe0g\xb7LwV\xfa-\xed\x8a\r\x8eA\xe3V\xed\xe1\xafk\x0cXoRu~#\xb0\x85\xc6\x1eST)K\x8c\x03Nb\xd1\x16\xccU\xf2\xafP\xa2Er\xbbw\xdd\x18<:/\xd3\xc9\xc6J\xb06\xbbvm\x84\x7f!\xd0\xd6a\xd8\x92\xb1\xe3\xba\xa4d\xbbWd\x02\xd2\x1d\x01m\xfa\x13\x98*\r\xfd\xdd\x13s\xa4b\xea\xe93E4\xb9g\x04\x13Ht\x1a\x02\r\xb4,g\xa4j5w\xb9\x154\xf9A\x89=z\x87\xccI\xa52\x1e\xa1_-3^\xcf\xc7\x8bm\xaa\xf4\xe2\xcb\x16\x9b\x84]\xbc\xf7\xd95\xe1l=\xd9\xab\x8f@\xa6\x9f\x15\x1a\xd7<?8\x1b\x14\xd3B8.K\xe1\xecB\xber\xf5%(\xa6\xf9Od\xf9\x15\xd5z,\xbbe\xb7`\x0e\xe6,D#\xc1\\\x97|\xb5\xaa\x87\xe7\xaf\xfb%o\ro\xde\x999\xdb4.^\xcc\x02\xe2\xdf\xc3\xb9\xe6\xbc\x10\xb4Dk\x97\xba\xf8\x90\xeb\xac#=\xed\xb0\xa1m\n$M}Tmc4\xef\x94\xa6\x98k\xa4\xf4xW\xf9\xf6\xd5\xab\x88[\xd1%\r1\x1c\x05Uz\xd8\xedRj\x0cw1#\xdeI#\x18\xa6PC\x8f\x17\xb91\xf1l?:H%\xa8\x1eoy\xc6=\xf8\xd3*P\xe6"\xed\x82\x12\x7fe6\x0e\xb9\xea,\x9e\x92\xdd\xcdt\x9e\x1e\xc9\x1a\xbc+\xd8\xbbAA\xb3=\xa8\xbb\xf0\xd9\x01GOR\x0e\x84^!$\xdc/7_\xde6aF\xf6\xd9z\x92\x17\xd3\xdei\xcb\xc7\xc0\xa7\xd1\xec\xe89\x91\x8d\xd4\xa3\xa6\x16l\x88o\x9d\xe1\x1b\x97\x905G\x95\xd3\xe4\x05\xb1\xd4\xa4\x8f\xc9a\xc1\x0b\xe1\xb63\'\x18\xd5\xfe?\x8d\x1bT\xcd\xd7\xa4\x18h\xb3\xe2\x9f\xd9:\xfaX\xea3x\xf2D\x89\x0c\xca6\xa7\xb1W\xf48\x08\xdf\x1f\x1d\xd2\xe2\xfb\xa7\x1dKWN\xabKS?\x16\x18[\xe49)ebnY;\xfc\xa1\xbf0\xef\xe3\x8a4\xea\x07\xaa\xba\xbbc\xddS\x7f\xd1Q3;#:\xfaZ\xd6\xc6\x8a\x8a\xd2\xe6\x12\xef\xb6}|\r\xc4\xc8]5j\xf9\xb0\x02\x88\x96\xd7D\xba\n\x97\xb2\x94\x17\x90\xac<\xad<\x198]\x19\x9fW\xc5"(\xea\xac\xb4z\xab\xecVH\xb2\xca\x9a\xa2\x06!\xf3\xc5d\x0c\x9d\x86J\xf6\xbd{b/:g\xbao\xec\x1eQr\x87V\x80\x91\x90\x05BF\xf6\xc8\x18B\x14&`\xcd\x06\xa5I\x9d\xe8\xb8\xea^\x1b\x17O\x9b\xa34\xc59/Ji\x0b\xdbu\x96:\xcf\xca\xc1\xe8\rV8\x0b\xb0\xdag\xfd\xf5\t\x03\x1a\xb8p\xd5\xe9\xbeJ\xb8X\t\x9e\xbc\x17\xce\xef\xd1\x16ldy\xb9\x84\x81 \x93\x8f\xd4\x93*]\xaf\xd7\x94\x8bs\xb8J\xee\xdf\xee(\xa8\x90\x017e<L)\xb7\x93\xa5\xf0y+>\xf7x\xe2\x84\xeb\xf9\x95\xf8\xb8\xfc\t|\x0cT\x15\xc6?T\xa8\xb2\xc8\xf9\x100\xf9\x991;\xee\xa1+\x9f\x03\xbe\xf8\xd0W/\'\x86\x91J\x0e\xf4\xe93\xc6\x10=\x01\xad\xaf\x92\xb7\x94\x81\x92$L\xed\xac]\x94\xb1\x8d\x94\xa9\xc6\xa7\xdf\n\x02R\xab\x12\xe7\xaf\xb2\xe1\t<y\xaex\x88*\x82\x0c\xc9w\x03\x1f\x9c5\xba\x9d+\x9aS0\xb5\xcd\xbaxl\\\x9f\xba\xe1\x9a\x95\x9b4\x8e,\xecO\xb1p\x04\xe5\xfdWr!\xd4\x16hD\x81\x03\x05\xe6\x08ea\xf4\xa0~\t\x16A\xf4c\xe0(\x19{ZQ{F\xebZ\x83+O\xea\xa4\x95\x8a\xf6\x17Ka\xea\xd7\x125i\x1f\x93\xe8=\xad\xe6\x1f\xd6u3\x9dj\xd5\xb7\xc4\x1d\x94\xcf0\x929\xffx\xa4\xf7\xbb\x17\xb3\xdb\xc2(:A;\xcc\x8b0F\xe6\xbf!sN"\x0cm\xd3\xd7\x93\xba\xaa\x92\xd7\xe7A\xee\r\xd3\xa9\x80\xc5;z\xe9\xd5{C\xc6\xb4ft\xe8{\xee\xf6x\xe7Uy\xe7"\xd1\xa2\xe7\xb6x\xcc?M\x94\xfc\xdd\x87w\x81\x8c\x95d\x1b\xab\xea\x9f\x16\x01*\xedN\xc9\xd82]\xf6\x0c\xec\xe6\xaa\n\x14\xee\xbf&!J\xfc\xb8i\xa5\xeel\x11|U\x88\xa1\xaf\xbe\x0e\x060\x1c\x7f,\xd0\xfc\x91\x1ds\x87\xef}J?\xcb\xef\xc3\x9f\xd3\xc8\x00~6S}\x95\xad\xee1(?z\x87\xc9\xe19\xf6X\x084\xc6B\xe2\xb3\x0e\xce\x0bJ\xef<5\x89\xb5\x03\xf0\xe7\x87\xe2\xcf\xae\x05\x8b\x8e\xb6\x99\xe6n\x16\xec\xd2\x83\xc5\xde\xae\x83\xbf8- _2\n\x04\xdb\xcd\x1c\x16)\x8e\xcd%\xc4Z\xc6\xc0\x14\xa1\x81\x18\xb1k\x15N\x10C\x11\xb4?\xc9\xbb\xa3rT%\xbf|\xb5-\xf8\x11\xdfFS_\xd8\x15\x9eb\x88e_\xd3g\xf2\xe6\x9c\xa8\x85L9\x9a\xcb}/?\x7f\xd8aR\xa7\x7f\xd5[\x11\x11L\x10\xb8 \xf7/5\x9d\xc2\xd9Y\x15\xca\xc7&{<_E&/WEh,\x8e\xf1\xc3\xd0\xb3s\xb2\x82\x96\x8aG0%J\xd7n\xe9~\x10\x17F\x18\x83B\x9a\x9a\xc1<\xfd\x0f\xf8\x05\xc4\x90B\xb2jz\xbb\xdd\xda\xe0u,;\xc8\\\x1bP\xd1\x1b\x85)\xe3K\xb5\\\xef\rF\x9bQ\xe15\xa3\x16:\xf6<\xe1\xcd\xa5`y\x0c\x9a\xaaYM\x9b\xfd\xb8\xbfa\x8a`\xb7$El\xa9\xa6\xe6)\x89\xc2\xea\xee\xf8\xdf\xf4ydw\x86\xed\x038V\xfdr\xae_v\n\xd3\xae(Yk~\x1a\xb6a-q\xcc3\x0blQhXB\x91\xbc\xbfj\x9c)\xd5q\xb6\xee\x1f\xfa\x00\xb5Sa2\xc5\xaf\x1d,\xb1\xf3\x91\xbc\xea m7\xa0Q\xd5Rg\xf1\xd3C\xb24B\xe4\x8e\x16X\x92\xcb\r.e\xeaV\xbf\xf1\xdb\x03F\x95d\xafi\x10\x11G\xcc\x8f\x95\xe7?)C\xef\xb2\xfdL\xfb\x9a\xe0$\x06\n\x05\xdb\xd6+d\xc6Bz\x98\x91B@\xfb\xder\xb5\xc2.\x14\xea\\vOp\x17\x19\xa8\xdd\'do\xe75L\x93\x8576\x9a\xc6\xcfS\xd1\xc0\xd8\xb0\xf5\x95\xea\xf9\xb7F\x19\xdd\xea\xe4\xdd\x8d"\xa2\x00\xa9}\xdd\xe0J\x1a6\x7f7\xda\x97\xeb\x07\xe1J\x8d3ndL)\x87W\x8e\x1a?ioy\xc4\x18\x95#R/t\x97\xef#\x8c-\xb8\xf1\xed\x1e\xbd\x9eGo\x98\x9cM\x8e~nN\xe0p\xd7.\x14\x9eW\x86\xe6\xa0m\x16\x80\xf9]\x0b\xd1\xe4\x0b\xf8\xf8\xf9\xfd\xdf\xaew\xa4\x86@\xe75\xeb\xe7Uw"\xe2~\xce?s\xcbN\x92\xe8\x88\xb1\xb8\xf4\r\x93\xc2\x1d[Q\x8b\xcb\xff\x9e\xa4\xba\xe1;\xa6\xf0\xfa\xa9R8\x83\xcc\xf4>\x05\x88\xcd\xd7\xcc\x8a\x19/Y\x1f\xbd\x98h\xa59\x85l\xdf\x8d"\x97\xf3\x14d\xef+qc\xba\'>jWA\x8e\x04\xf0J^{s\x9e$6\x99\x8e\xc3hJ@.\x17>\x04\nkH\xea\x9dTHP\xfdz"\xa37\x88\xa0\xb9U\xbb^7\xc2\xc2\xc6\xb0\xcd}\xed\x02B\x1b\xce~\xc2\xd0-{\x85\xd2\x88\xc4\xec\x80\x00w[\xacQ\x8b\xc3(z\x1ed\xb7!B\xec\xe0,3]\\\xf7tXe\xd4\xba;Z\x86hY\xf2G\xf3);\xb5\xa5\xf5\xc4\x85\xf06dO\x02\xfb\x93\x92\xb7.\xcd\xe9\xcb\x15\xe3\x15\x9fa\x89\xa0m\x9ds\xdd\xfe\xc2\x9e}K\xef\x99R\nC\x1b\xf4\xf5\xa3\x1ca):\x94\x9b\xf3\x8c\xf1\x99d\xe6\x87\xac<\x02&\xde6\xd6\xb0\xa95s)5\x9fH\xc6\xd3l\xd2|\xc0|n\xa8\xbda8-\xd6r&\xa7\xaet<\xca\xef\xf1|\xc4\xce\xdb\xa0\x83\xff\xbcVar\xed\xf8rv\x9c\xef\xf69&\xfe\xc5\x98\xd5\xca\x1b\xba\x97(\x05o5g9F\xd3\xec\xc4B\xe9\xb4\xf1y\xfc\x97\x81\xc15@\x04\x94\x815m\xf8\xdc\xee\xa1?%\x82\x01\x1c\x89b\x17\x14\x13\'\x19K#\xff\xf2\xb9\xd6\x1f}ucn\t\xff\xbf\xd8s\xb6\xdd\x17\xcd\xa5\x95`\x1clbJ\xb8\xc6\xfc\x14\'g^\xe9^\xc6\xa6c\xc4o\x05\x99!\x1d\xd5"\r~\xaf\xcd\xc98i\xc7\xec\x1ewm\x99\xdf(\\\xbe\x03S\x85\xfeG\xc2=\xeb\x95\x0b\x10\xcc\xaf\xe7\xf4y\x1dx\x02\xcbu\x7f\x14e\x8d\x9b8\xad7\x1bS\x0e\xd5"\xcf\xc3b\xe8\x92q\xf01\x9d\xd7\xe1\xdc\x8f\x14-\xd4\x07\xd5c|\x96\xc0=\x81\xef\xd7\xe5\x85t\xe7\x83\x14c\xc2~\x15\xe1\x88F)\xfe\xb0\x8c$\xfe\x17\x85\x7f\xfc\x90\xb6\x89\xb5\xb38\xc5f\xf6\x82:(\xd4\xdfu\x9d2/+^&<\xe7\xad\xc6\xad\n\xb6*\xcfp\x9a\xe0\xe3\xabn\r\x81\xa0m\xf9\xba\xde[\xb4\x0b7F\xc1\x1d\xde\x89t`\xc3N^\xd65C@\xa0\xfd\xbfX\x84\x85\'\xf8\xfd\x0c5\xf2\x88yg\xb1"Y\xeb\')\x15\xb8$\xdc\xfb\xa6\x9f\xc5"\t\x980q\xb1\xb4\xea_N.\xc9|\xcb\t\x0eZ\xcck\x90\xf5\xca\xb2\x10\n\x9a0\x01\xe9K\x1a[@\t\x0c\x92z~\xff\x02\t~\n\xc2\xc8\xc1\xce\xea\x0fY\xeb\xa5\x96\xbe\xd5Q\xe0\x13U!\x90\x89\x87\x13\xc8\x06\xb3\xa0r\x17\xa0IF\x9d\x18\xe3\x9eS\x11\x99\xa9r\xfd\xe6\x01\xb8f\x05)S\x89e\'\xab\t($?\x0b2\x85\x86\xf6\x8bnT\xf1\xcc\xd4\xe9<&\x84I\x99!\xe2X\r1\xdb\x1a\xb8\xe9{\x97\xc4\xa1*cd\xdfG\xfa(\x84\xb5:\x9f\xcdw\x02P3o\xceb\x0f(_\xc6i\xf9\xf5r\xfa\xfai\xac\xd2!Mf#\xb9\x9c\xcb(\xcb\x8b\x19\'r\xef\xbe\xdc\xbb\x01q\xc0\x8bo\xce\x93\xe3"\xb9V\xea\x1f\xade\x9cr\x83K\x8b#\x1aj\x92\x15\xba\x0f\xf7i\x89\x87\xa5\xee\xaeG^\x9f\xae\xdbf\x83\xfe\x94\x85\x0c\xcb\xd9\x9c\xcde\x10\xd1l\x06\xb4(\\J2\xd16\xdd\x03\x8fQ\x957\xder\x9d\xe4t\r\xa9\xb5\xb6\x97p\xe8\x84\n&\x17<3,\x89\x80\x18i\xc0e\xf2\xcc|Wz\xe6\x99\xff\xf6.\x08\xe3\x03_\xea\xd2\x02\xe5\xee\xc9t\xf8g\t\xe2\x80u\xd8\x7f \x88WQ%"81tb\xde3\xa5\xc35o\xb9\x92\xbc\xb1\xbe\xff\xda\xd1\xd6\x0b\x00\xd2\xa5Zt\x98\xe2\xe6\x14\x83\x02\xec,\xe7\x92\x9d/\x84\x90\xf435`\xb6\xdf\xca\xc7\xd8\xfd\x07i\xcf\x11\xbc\xd7\xeb\x80\xb6\x1e\xb0\x02V\xbak_\x95GZw\x11\xc0l\xc8\xb7\xe2\xda\xf5z\xa4}\xc0\x1c\xa8\xa3\xf2\xda\xbb\x91\x10\xe4\x1b\x81$\'\xd7\xaa\xa9\xf5#\x92\xbd\x05\x16\xa6x\x84J\xd7\x11?\xfd\xf5K\xb4\nD\xf1\x0c(\xd0\xd6Y#\xc9\x9bX\x1f+\xc5\\\x00*\xe4^Jib\xab0\x93J\x88\xb6\xa1\xb0W6\xd2\x19\xc89Nd\x03\xacv\x15h\x97GC\xec\'\xab\xd9\xd9i\xa5Q\x0cq\xb3\xe8y?\xe4\xe2:[;G\xf4\xe4\xe6\xe7\xf2\xd2\xaa\xa3\xbbQz~iJ?\x10\xad\x07\xcd8y\x91o\x06\xa0\xf8!hUqQg7\xa8\xa3p\xed\xfa\xa2\xa3\x94\xa4O\xc1,\x00\x1b\x806\xe4M\xd3\x81"v\x98\x85\xdb\x12o\xfe\x91e\xc1e&\xd8\x00\xbd\xf3k\t\x15j\x13\'M\x9e\x86\xca\xf0\xf6\xdf\x8c\xc9\x99\xecuy\xfc\x9b"\x81t\x1dW\xce6\xe6\xdf\x9b\xb1t\x06\xf3\x1a\xc3Y\x8f\xc0?4\xeb\x06<\xb9\x0f\x14u\xe5\xe7\x023\x84\x83\x8a}\x90\xdf~\x1c;![ \x01\xd8e9\xa6\xf2\xf8\xa9\xe0\xdf\xd0\xb4\xcb\x9d\x06\xd3\\<el\x06U\xf6\xf5\x05\x1d&)\x8d\xe5\x0e\x14\x81\x8cZ\x18G\xefo\xc8\xd1\x8bj{:{k}\xbc\rD\xfe\x14bbz\xed\x19\xca\x11\xeb]\x8e\x883\x91\xd8m\xafHLJc1\xe7\x95\x85\xf8\\\xb6\x16\x02F\xdd\xcah\xa9RM\x03\x90o\xc8%nq7\x14\x08\x8d\xf2k\xc9\xdd\nr\xfe\x8a\xacF\xf9\x9c\x8b\xf7^\x8bFZ\x1f\xf1b\xd4V\xe9\xf1\x18H\xf1\x81f\xd4C\xd4\x1d\'\x98vL\xe1f\xd6\xa5\xf3\xe6J\x8a1\xf0\xc4cx\x8f\xfaBk\xddf\xf0\xeb\xcb8\xcdN+?Y\xe2\xb0\x1an\xf6(\xda\x92\x9ct+\x83Bi\xf1\x11&=\x1a\x05\xd1\x08e\xee\x8d\x08\x07\x85\xdf\x96W\x04\xf7\xa9J;\x8e\xbbfD)\xdc\x0bQ,\x86u\x11\x0ee\xb3\xf5[M}\xb1G\xd9\xadjW\xf6\xa7\x0e\x9c\x06\x1b\x89R\xb0\xfdJ\x8d\xe6\xd4\xb0\x8e\xf4\xef\xe1A$\xe0\xe6iY.\xa4\x16\x06"\x92\xb8\x04d\xea\x9aT\xf9\x1a0\xba\xbe\x04\xe9\x17\xe1\'\x97\x15s>8\xc8\xf9\xb8-\xa2f\x9bO\x87\x01\x11\xd0#\xa5yu\x9b\xf3\xd9\xa6\xa3\x87\xe0\x81\xefI\xb0G\xc7\xb2\x17(gQR\x11X\xaa2Aw\xb0\xbf\xea\xd8KcJ\xcaR\xa5M]\x9a\xfe\xd0\xe9V\x9c\x88\x0f\xe6\x11\xf5\xba\x1e\x14\xe9\x00\xa6\xe3\xb9f\xd4\x99;K,P\xbdJP\xf2j\x83\xd8^\x00\xa0Gw\xbf\xbc\xbd}1\x83xQ\xd2tg\xba\x9d\xc7\xfa\x1a\xc3\x8f\xb3\\>\xdd\xb6\xdb\xfd+\r\xf4wU=0;\x95\x8a\\\x98\xdf\xf4HI=dE\xf1\xd8\xe5l\xcf\x03z\xf1R\xd6\xf4\x1b\x1c\xad$ku\x8e\xe8\xe85\x9a\\[\x04\xf1u\xfdH\xca#\xc5\xd9\x8f\xc1F\xa3\x9e-\xd6\x90\xa7t\x12A*\xd1\x89\x0e\x13\xa7\xd7\xcc)\x1b\xfcz\x03\xdepS\x0fK\xed\xfd\xd439\xcacA\xcc\x0b\x1c\x12\xf4\t\xa7\x06La\xa7\xee\r\x9cl\xa0\x07\x1e\xeb\x91\x7f\x02\xaf\xe7Y\xb5\xac_\xba\xdd4{Q\x85kB>\x8aM\xbfvX\xa0\xe8\xb0>\xbeq\x13\x0b\x98\xc46\xd18\x81{\xd2\x90\x1f\xaa\xe7\\\xbc\x8e\xe2\xee\x8b\xd1b0\xbc\xf5\x8e\xb2\x051\xb6\xc4y\xb2\xdfGi\xe46\xd2\xe0\xbf\xe7\xe2\xf6\xfe\xc4\xe1H\x04\x95uj\xeb<\xc9\x0fn\x0e\xfaS\xa8\xe4p\xfc\x9e\xca\x96\x94H\x0c\x7f\x97]\xdd+\xdb\xb4:J]z>\xfd\xf6\x03w\xc0\x18\xaa)\x07\xbf\x8c9\xe5c{X~1\xd7\xc5\x1f\x85\xe6H\xc6g\xbb~q\xcf=\xd6-\x19s2\x08?:J\x88\x13^\x14h\xfc1\xb9\x9c\xc3\xbc\xec\xf4:`\xda\x9av#\xb1\xdc\xf0\x96\xec\xcf\xcb\x1d\x17\x8e@\xccE`8D\xbcS:+\x8c\x94\x031/\xd6\xaeK\x87V\xd1\x9c\xb5)?\\\xdd\xd3\x1c}\xc5\xba(\xe3O\x8ahn<c\x9eL\x17\xaebA\xab>\x05\xe3\xa6\xa0g\xd7\xf0\x10\xd4\x92z!1\xae\x17\x90\x8e\xa3\x07s\x9df\xd4\xad\xc6\xde\xc5\xf3\xbcL\'Oj\x19\x89\xccN\xfa-\x19O\xcbpL\xb0g\xc7\x8c\x04\xc5\xe1\x8d\x0b\xf2!K\x83>\x91Y\xe1\x90\x83\xd7\xc1.\x0f2\xear\xe8,zHu\xaa\xf3\x86&e>\x17\xd2\x9eJ\x08\xf8.\xc8\xbc\x0c@\xa5h\x00\xc9\xbfe\x91\x95c_[\xb0O\x90#\x82k\xdc\xa1\xc19"\x9d8C\x94\x86\xfb0\x1c\x94]\xd6dV!\xce?\x06\xf7l|\xc3c\x12C\xaa_\xad$g\x15\rF\x95\xbe\x96"\xc5l\x039/\x88\x1f\xf8\x99A-Y\x83A\x96\xbd5\x87\x05u\xe1\x15\x94\x035\xd8\x1e\x83\x8b\x1f\x1d\xa8\xbdD\x11\xf4\xba1?\xed\x9a\x8e\xdd6\xb2\xd4%k\x87\x1b\x0e6 \x06\xe6\xf9\xd7x\xb7B\x1a\xba\x92\xa5\x8c3\xe3\xe3\x01j\x19\x9fK\xf2M:\x83\xa2\xb7\xd2\xd6\xc4\x15\x83x\x0c2\xdf\xec\xfe\x8d$\x19\x19Jl/\x12\xff\xbe\xd7\xf4\x00\xba\xf9p@\xfd\xab\r\xe2\xf1v\x02Sj}-\xd4\x84\x9b\x84\xa1\x01\xad\x8bfH\xe7\xce\xd2\xdcB\xb8Q\x9fN\\\n!Z\xcf\xcc\xdbU\xb9\xfc\x85\xe2\x13]\xe8O5\xcb\xeb7eXj ?\x91\x9c`\xa3\x86o\xb4~%\x87VJ)\x1bjAx\x1aj~\x1e\\\xa7\xd65\x1cx0\xfeh9\xda\xfa\xff>\x80\xc9#\xc1\xf6}:H#\xe8\xc5\xb7V\xdb\x8f,\xb9\x1f\xed\xe8&{\xfe\x02\xa7\x9cK\xa9\x0c\x16\t\xd5\x83c\xad+\xea\x0c\x02\x95M\xcd_\x9b\x9c\xcad\xfe\x02\x05k\x9a\xecR\xd3AHqz@F\xf2\x08=ur\xc4\x15Z\t\xbd\xc6\xb5\x17b\xafs"B\xee5y\xdb\xda\xdde\t\x94\xc6g\x97\x11\xde\x17D\xa6\x8bE\xf1\xbf\xa4\xaf\xfd\xe5\x14\xba\xfdX\xad\xca^\x12\r\xffH7\xe2\xd8\xf9\x9a\xa56K\xab\x19\xbcu\xd7\x85sN\xbc\xfd\xa9 \xb4\x01\x9f\x9a!w4\xc9\xd4\xc4"\xa6n\'4\x00\x8au\xe4\x88\x88rA\xb3\xc1\xbc\x07\xfd\xdd\xfc\xb6>\xb7\xa9\xeb\xc76=\xeb\xe7\xf5\xfc\xa9W\xc2\xd5\xfc0\x155\xec%\xad\xb5\x8aJ\x9f\x15wz\xb3\xbahE\x90[\xf7\xc2\xd7\xeb"\x82\x97\xa0\x8a\xe6)a\xcd\x84\x1dDh\xb7^#W\x15\x93\xfd\xc8\x957\xc2 \xdf\xe4\xbd\x06hn\xa4\x8f\xe1$Q\xdaw\xeay\x0fv\xe6\x8e\xa2!\x8d~\xfam\xec\t\x15\xe6\x162c\xb1}\xa4\x97!\x19\teJ!GvgT\xe3;\x8b\x0bfq\x03}U\xa8\xcc\xa7ST\xdd\x93\xec\x10\x82\x0f\xfd\x0fk7\xda\xcetw\xf0\xe3\xa2\xc97t\t%f\xc0\xb4Q-y\xde\xc8\\\xf4\x02z\x02+\xb2\x0bk\xe2p\xb3\x0f\xa0\x1e\x13\xed\x95\xb2\xf8j\xb2\x84\x9d~\xca\xf1\xbev9\xb7\xe4\xba\x8b\xd5\xec\xf5o\x05-]\x11\x0c?\xdd\xdc\xea\x05\xec\xed9\x18NO\xff\xc8\n\x82\x9b\xa6\x02\xb1\xfa\'\xa1i/8\x1bcl\x9a\t\xb4MMM\xebKQ\xdfF\n\xc9\xbbZ;\x10*D\xb8\xa5\\\x197\x08\xedh\x98\x16\xf4\xdc\xb2-\xb3\xcc1#W\x83)\xf3\xec$\xac~<\xdeZO\xe7\x90\x02\x8c\xd0\xb1\x0e~t\x18\'\xfb\x9a\x164+B\xba\xd2qX\x8f\x9d\xed\xaf\x81\x11\x10/d/\x00\xbc\xa7)\x8f\xb2kJC\x9d#\xe3/\xcd\xdf\x1c\x93\xf9\xdb\xbd\xae\xd3T=\xd7h\x9b\xb4\x15;Cy\xc6\xa33\xf7U\xa7\x0b\n\xf2[\xb2\xd7\xe3*\xde\x17\xcb\xf3\xa9\x7f\xc7\xe7\xe3\xe7T\x84\xe6\x83PC\x1a8A\xe1I\xf5\xcf\x1a\x91\x16\xe1Se\xb9\xb8c\x84\xb0\x1ee\xe2\n\x00\xcf?#9h\xbc\x86\xec%\x17!\x91\xd8\\qQ\r^X\xba\xfc\x18\x9f(pg&N\x8e\x93\x1c\xbd\x8b:\x01b\x05\xee\xc2[6\x01@\t\xdb\xdc\xbd\x19\x069\xd5&\xceg\xc4J\x1e\xb1V\xad;}\xa1\xb2\xa3\xaa^\x180\x0f\xb4*\xf2\xba\xdd\xa99\xe9\xe1\xdb\xf3\xe8\xe7j/\x01!\xd2\xc7UZ?\xb3\x7f\xd8\x9b:\xfa/\xed\x94M\x92\'\x15\x95]Y\x97\x8c[\x18\x1f\xc3Y9\x14#\xaa(&\x92\x83\xdb\x8eq\xb2u\xaa@\x9e\xb9J\xf6\x95"\xd1\xa9y\xb1#~\xb2\xf5#\xbcL\x90\xc3z\x81\xcb\x83\xb2>\x80\xd7X\x15T-\x1b\x12\x15i\x83\xc2G\xf0\x82\x00\x04V\x18`\x06AM\xfb\x1cW\x8b\xb4~\xe9v\xd0\xe5^z\xbd]\x00gAT\xae\xad\xba}p\xa6\xeb\x13\xcf\x9c\x9cC~\x838\x86\xc4\x8e4\xfa\x0c\xc0|\xb7\\gV\xc60 \tF\x90\xdaxg\xd1\xfd\xca\xcb\r\xc6p\x16\xcb\tOc\xda\xfd\x1cG\x83\'\r\xa8\x14\xcf\x7fBiO\xbc.\x93Q\xf7\xa9?\xba\\\x1a\xffLJ\x1f\xa4\xfe\x1d \x0e\xbewL\x07\xaa\xcc\xfa\xa3\xb5\xc0\xae\x87\n7\x94"\x173I\xb2\xe9>\x9cg\xcf\xe0/\x1d\x17M@\xd0]\xf12\xf1\xb4b\x83\x81\xcd\xa3\x93\xa0\x8a\x93\x1a\xba\xaa\xa3Y\xe7\x03v\xe1\x9a\xd3\xd1\x80J\x87\xd1HMq\x1d\x17\xb9T\x9b\xdccu>\x10\x83\x96\x02i\xe2\x16,!_2\x88\xde\xa8lQ\xa8\xd9\xc8\x11\xe7]\xde\x17\x87\xcf\xf0\x1e\xfeYG\xf5\x83\xd98<\xf4\xd96F\xd9\x17H\n\x9f\x81\xc7\xaeY\xd7\xb3\xaf\xc9\t\x0b\xe0B\xe6N^\xb3!\x7fJ\x8b!\xde\xcb\xd3N\xe4\\\x17\x16\xa9\xee\x04\x8d\x03*\xc9\xc4\'0 \xd3\xd9\xc3DH\\\x8a\x86\x0e\x9ey\xbd\xb9e-\xb9\x87\xb91\x0e\xe5~)x\xe3?<\x11\xe0"V\xb2\xeai\x85SRr\x03\xde7\x8eE\xa1!I>\xf6\xc7\x8b\xdc\x0f\xd2\xf09N\xc4\xfd\xb5\x82\x0c{\x00\xc6\xd1\xd2\x85\xdc \xbd\xe9\x1f\xbc.q\xac\xb7\x82\x85\xe1\xfb\xb9\xb9\x0b\x81\xc3\x1a/!\xbe\xf8\xd9\x10\xddO\x96\x1ek\x8e\x92+\xb7\xe8\x96.\x97\xa6)\x14\xd8\xa1\xe8\xeb\x03\x84\x7fl\x1ft;\xd0\xc81f\xa5.\x02X\x14i\xfe}\\Tw\x83yh\xff\xe0\xde\x95\xbc\xb3\x81\xd1D\x0c\xd2g\xf4 N\x00\xac\x04>\xd7f[\xd2\nE{m\x03\xb2\\\x97R\x81X\x86\xfd\x02\xf8]\xec\xa5Q|\x15\xab\x97\x999)\xa3\xc2\x9fwB?\x89<\xceF\xc7\x1e\x0b\x0e\xfd\x07\xfb\xd64v\xf3\xa3Q\xad\xf2O\x19\tJ\x062\x9c\xcc3a\xbeW\x93\x0c\xf8x\xe8\x17\x92\x15\xb7p\x13\x0c}!\xe8\x01\xc7\x08\xb7\xcb\x8b&j\xae\xd6\x8b3\x11\x8f\xa2|\xf9\xfboB\xb4M\x0cH\x03l\xbcO\xec\x04Ce\xf0N\r\xb3\xd6\xb5>;\xb1#fR\xea\x02\xe0o\xf2FL-\x0bjl\xe4\xceU|\xbb3\'3\x8e\xd9\x19\xc1\xa2\xd5\rU4\xb2:(\xf7\xa9\xf6\xa3\xdb\xe9$^\x9am\x9aN\xecJ[\xd0+F\xce\xbd_!\xabN\xf4\xee\x96\xd7im(\x97b0\xa7\xa5\xe5*\xe3\xbe\x99)\xcd\xb94\xb5V\x19o\xc5U@\xd60K\xb9cN\xe6>\x9a\x97\r\x06\x96\xab\x9d\xf7ix\x1e\xa4\x05\xa7b\x06=R\xff1ld-\xea\xdan\xb0\x96\x88R\x19}*\x80\x8c\xed\xac\x10A\x94OO\x16\'\x0e\x80\xd6`]J\x06\xf0\xe2/\x07\xc8=w\xdce ^\xc6K\x85\xb5\xf3 4\xde\xfb\x83\x13\xa7\xdcN\xb7h\x85\x0c\xf3r\xeb"}\x88\x89\xa1\x83\xa6\x1d\xd6X\xe6\xb3O\xab\x05@w\x81\x8a\xc3\x89\x99=VV\xab\xa0\xd5\xfb\xea\x8d\xa8\xfem75\x95_\x7f\xab\xd5TO\x08]~\x1c\xcd\xa4,E`q6\xe8b\xf2\x90K\x8d\xf4\x02\xaa\xd4\xb1\x1f}\xe4\xa5\xcc\xf7\xb1cwdI\xf2\xe8d\xed\x8e\x9e\x0bP\xd3+^\xf1h\xact=\xcd\xb6\x00\xd9\xbaB\xbe\xe7w\n\xe0V@f~\'o\x0f\xf49\xef\xaf\x94\xba\x01\xf7OH^\xb9!\xa7\xa80\xff\xd0\xa6\xddO\x7fp\xc7z\x84')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+ class ConfigCategory(StrEnum):
20
+ admin=auto()
21
+ branding=auto()
22
+ general=auto()
23
+ proxies=auto()
24
+ domain_fronting=auto()
25
+ telegram=auto()
26
+ http=auto()
27
+ tls=auto()
28
+ ssfaketls=auto()
29
+ shadowtls=auto()
30
+ tuic=auto()
31
+ ssr=auto()
32
+ kcp=auto()
33
+ hidden=auto()
34
+ advanced=auto()
35
+ too_advanced=auto()
36
+
37
+ class ConfigEnum(StrEnum):
38
+ cloudflare=auto()
39
+ license=auto()
40
+ country=auto()
41
+ package_mode=auto()
42
+ utls=auto()
43
+ telegram_bot_token=auto()
44
+ is_parent=auto()
45
+ parent_panel=auto()
46
+ unique_id=auto()
47
+ last_hash=auto()
48
+ cdn_forced_host=auto() # removed
49
+ lang = auto()
50
+ admin_lang = auto()
51
+ admin_secret = auto()
52
+ tls_ports = auto()
53
+ http_ports = auto()
54
+ kcp_ports = auto()
55
+ kcp_enable = auto()
56
+ decoy_domain = auto()
57
+ proxy_path = auto()
58
+ firewall = auto()
59
+ netdata = auto()
60
+ http_proxy_enable = auto()
61
+ block_iran_sites = auto()
62
+ allow_invalid_sni = auto()
63
+ auto_update = auto()
64
+ speed_test = auto()
65
+ only_ipv4 = auto()
66
+
67
+ shared_secret = auto()
68
+
69
+ telegram_enable = auto()
70
+ # telegram_secret=auto()
71
+ telegram_adtag = auto()
72
+ telegram_lib = auto()
73
+ telegram_fakedomain = auto()
74
+
75
+ v2ray_enable = auto()
76
+ torrent_block = auto()
77
+
78
+ ssfaketls_enable = auto()
79
+ # ssfaketls_secret="ssfaketls_secret"
80
+ ssfaketls_fakedomain = auto()
81
+
82
+ shadowtls_enable = auto()
83
+ # shadowtls_secret=auto()
84
+ shadowtls_fakedomain = auto()
85
+
86
+ tuic_enable = auto()
87
+ tuic_port = auto()
88
+
89
+ ssr_enable = auto()
90
+ # ssr_secret="ssr_secret"
91
+ ssr_fakedomain = auto()
92
+
93
+ vmess_enable = auto()
94
+ domain_fronting_domain = auto()
95
+ domain_fronting_http_enable = auto()
96
+ domain_fronting_tls_enable = auto()
97
+
98
+ db_version = auto()
99
+
100
+ branding_title=auto()
101
+ branding_site=auto()
102
+ branding_freetext=auto()
103
+ not_found=auto()
104
+ path_vmess=auto()
105
+ path_vless=auto()
106
+ path_trojan=auto()
107
+ path_v2ray=auto()#deprecated
108
+ path_ss=auto()
109
+
110
+ path_ws=auto()
111
+ path_tcp=auto()
112
+ path_grpc=auto()
113
+
114
+ # cdn_forced_host=auto()
115
+ @classmethod
116
+ def _missing_(cls, value):
117
+ return cls.not_found #"key not found"
118
+ def info(self):
119
+ map = {
120
+ self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
121
+ self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
122
+ self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
123
+ self.license:{'category': ConfigCategory.hidden, 'commercial':True},
124
+ self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
125
+ self.path_vmess:{'category': ConfigCategory.too_advanced},
126
+ self.path_vless:{'category': ConfigCategory.too_advanced},
127
+ self.path_trojan:{'category': ConfigCategory.too_advanced},
128
+ self.path_ss:{'category': ConfigCategory.hidden},
129
+ self.path_tcp:{'category': ConfigCategory.too_advanced},
130
+ self.path_ws:{'category': ConfigCategory.too_advanced},
131
+ self.path_grpc:{'category': ConfigCategory.too_advanced},
132
+ self.path_v2ray:{'category': ConfigCategory.hidden},
133
+ self.last_hash:{'category': ConfigCategory.hidden},
134
+
135
+ self.utls: {'category': ConfigCategory.advanced,'commercial':True},
136
+ self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
137
+ self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
138
+ self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
139
+ self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
140
+ self.unique_id:{'category': ConfigCategory.hidden,},
141
+ self.cdn_forced_host:{'category': ConfigCategory.hidden,},
142
+ self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
143
+ self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
144
+ self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
145
+ self.not_found:{'category': ConfigCategory.hidden},
146
+ self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
147
+
148
+ self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
149
+ self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
150
+ self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
151
+ self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
152
+ self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
153
+ self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
154
+ self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
155
+ self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
156
+ self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
157
+ self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
158
+ self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
159
+ self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
160
+ self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
161
+ self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
162
+ self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
163
+
164
+ self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
165
+
166
+ self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
167
+ # telegram_secret:{'category':'general'},
168
+ self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
169
+ self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
170
+ self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
171
+
172
+ self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
173
+
174
+ self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
175
+ # ssfaketls_secret:{'category':'ssfaketls'},
176
+ self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
177
+
178
+ self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
179
+ # shadowtls_secret:{'category':'shadowtls'},
180
+ self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
181
+
182
+ self.tuic_enable: {'category': ConfigCategory.tuic,'type':bool,'apply_mode':'apply'},
183
+ self.tuic_port: {'category': ConfigCategory.tuic,'apply_mode':'apply'},
184
+
185
+ self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
186
+ # ssr_secret:{'category':'ssr'},
187
+ self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
188
+
189
+ self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
190
+ self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
191
+ self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
192
+ self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
193
+
194
+ self.db_version: {'category': ConfigCategory.hidden},
195
+ }
196
+ return map[self]
197
+ def commercial(self):
198
+ # print(self,self.info().get('commercial',False))
199
+ return self.info().get('commercial',False)
200
+ def category(self):
201
+ return self.info()['category']
202
+ def type(self):
203
+ return self.info().get('type',str)
204
+ def apply_mode(self):
205
+ return self.info().get('apply_mode','')
206
+ def show_in_parent(self):
207
+ return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
208
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,107 @@
1
- # 2023-04-08T15:11:20.455443
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xfd\x19\x00\x00\x12\t\x04\x005\x8eI{Sca\x19\xfd\x05\x8f\xb2q\xc1O\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x87\xc4\xe7\xd3\xacb\x9f\x86\x0f\xfc0\xd7\xda\xc2\xd8x\xd1\xf9\xd6R\xe8ce+b\xe0\xad\xf8U \xd0\xbc!\x83\x06 \xb5\x00\x15GK[\xde<\t\x9es\xf9\x80\x99\x11#\xd0[\xc31\x9b\xa3\x90]0:!\xc2\x9f_\x95_;\x9c\xb1\x12\x1fx\r\xb5U\xd7-H*\xc98\xeca\xa3\xc2\x89Cmp\xc4A\xd9\x0bOb\xf6r%%\xf7(\x7f\xac\x19j\x9d\x12\xbd\x980A\xc1\xd6\xa6O\xf4\x1c\xee\x06s]\xef0\xacV\xe9\xdd\xb7\x96W\xe8\xde\x9e\xb9I}\xa3v\x8e\xcf\xea\xad6\xf3h|\\\xd8\xb8"\xbfc\x01\x058\x11W<\x8b\x12o\xbe\xdc\'\x00vv\xf6\xab;\xc33R+"G\x82\xd9\x19\xb3\x17\xe7f\r\xf2\xc6\xf2I\x99\r\x1a\x1d\x18\t\x93\xb8\x0f\x85\x04\xd4\xf8\xc7\xe3\x0be\xaf\xca,\x0fS\xf0\xd8\n\xb7\xa0\xe8\xa4rf\x87r\x1c\x16\xcf\xb7;+\xfd\\h=\xc2\xbe\x83\xc6\xb6\xa8\x0fs]\xf3\xf5\xf3B\x03K`\xee\x0bq\xd3\x0cP3R3\x06\xd89u\x02\xdd\xc0\x12\xf1v Q\xcc\xceqO-\xaa\xc7\x9b\xc88\x10\x95t2\x08;"\xb3h\xc38\x9d\xbe\xa4/\x14\xce\xc5|-\xcf@v\xeb7~\x800\xbde\xd8\xbf?-l\x95\xb8\xb4\'Cj\xf3\xc2\xf2\xa7I\xdf\xc5\x98\xb3m\x18\xbc}\xad\xc1m\xd0\xd8\xfb\x01Q\x11\x97\xd2\xe1Q\xea\r?!\x15l\'\xb6\xf8T6\x15\xd9Q\xe8\xd27\x98I\xc7f\xbe\xcd\xb8Cx\xd8\x84-\x17\xbav\xfa\xe0\xbf\xd4~\x1eWc\x0b\x80\x16\xa2h\xb9\x14\xb1\x16R!\xa8\xddV\x9d\xef\x84\x8c\x95b^\x92o\x19Q\x0f\x10\xf0\xb1\x84\xddXv\n\xe5\xef\x1f_\xc9L\x91\x8b@\xb3\xa8{\x86ivw\x8b)k\xf7\x12-4\xb3\x8dm+0/\xc0Y7Cj\xe4\x12M\xf9?\xc4? \x8b\x15\xfe\x1b\xb2f:dK\x99\xcb\x13\'\xd9\xa64\xd1\x9e\x8f\xe35\nr\xefz\xd8%\xae:\xc84\x05\x87?`dS\x0c\x9b\x15J\r\x9aR\xb6\xbe\xad\xaa\x98{\xe8\xe2\xb5\x81\x9a\x80c\xfd\x94~\xe2\xf2]\xf0\xc9\x8b\xe1\x93\xd5\xe7\xb8}\xba\xd7;?j:\x9es\xdfF\xa1\xe4\x15\xe07+\x8c\x12\x12e\xfb%\xb7\xf7\x81\xf6\xc6TJ\xe2\xd9\xe2\'\xf1\x84\xd1\x020&\xf8.\xfaRrj\x9c]\xd6_\xe4\xee \x107U\x8e\x80\xa0\xb2g\xc3\xce\x11yI<s}\t\xe6\xc9\x0c\xc9\r\x95o\xa1e\xb5\xb9\xb54\x1fhNE\x94]\x13I\xb7\r;\xcd\xf6=\xb8\xaa\xbf\xaa"O\'\x97\x9a\x92$MM\xb6!\xe3h\x94\xcc\xcczy\x14\x91\xad\x00\x9d\x9e\xa4\xdb\xebY\x94\x9a1\xb3x\xcc\xee\xc9\x99\xf5\xbb\xe6 \xce\tH\xbd\tc\xda\xf0\xba\xeeX\xff\\Y\x9e\xc41w\x8e\xb8>\t3\xd2J\xa4\xc2@i\xcd\xf6X(\x8e\x9ex\x9f\x8f+\xfa\xc9\x9f^Z\xabW\x95R\x8f.\xb7\xe4\xff\x10\x9bO\xa9\xf7\xe1\x89|i\xb4\x84uq\xd3\xc9\xab\xcc$\xadKWdf\xc1,0\xe6\xb2\xf6\x8e\xaf\x11\xde\x90E5\x02x\xc8N\x81\xc9\xd0\x8e\x84\xb7\x127\xec1\xec\x10+kL\xfb\xa2[$\x94\x14\xd4\xe0\xc2\x943"\x1a\x1e\xc8&\xbb\x87AZ=\x84\x03K\xd6\x1d\xd1Z\xdd\x07\x11\xc8$\xe6o\xc6\xd5d\x88\xaf\xd7Y+\xef\xdap\xa4\x07V00\xb9\xd3F\xc4\xaa\xac\xe2;^J\xe4\xaf[\xcau\x1a\xa6v\xbeF\x14\xe46\x91%xn\xf05\xdc\x8a\xa70b\xe8\xf8 \x13\xablp^\xf4\xb6Ns\x8c\xb3\x05\x1e\xbc4T\x9a\xde\x17\xf1\xce\xec2\x1f\xed$\x86y#\x91\xf9\x16\xa6\x19\x8f\x01\xffH\xbcaJ,\xba{6 g\xbe\x08t\xa5N\xa4\x10\x03\xb2\xe2\x1f\xab\xc0C\x90\xfc\xb2I @\x0b\xf64\x00\xc3\x04\xe8=\xf8\x01\x92\xd0lL\xec\xcb&\x83\xdd\x87K\x11[\x11f\xff\xd5\x12 \x14U\xd33\xec\xf6$J\x13ZtE\xf1\x16\xfc\x9a\x04"\x07^"7 O\'h^\xc2\x10\x1e=\xdf\xca\xb5\x02Faw\xaf;\xcb\xd3\xce\xef\xb5\xc1e\xa5\xa1 \xcf\xf4\xad\xc2\xab6\xd2\xf3\x10\xcc\xd5K\xc0;\xba\xee\x92\x9d7t\xa1\xf86\x95\x97|7\x93\xc8\xae\xde\x82\x01\xdf\xa6\t\x02\x85Z\xd8\xb3"\xfb\x96I\x11\xac\xc9\xfc\x95Y\xa6#\x9aj\xc6\x95\x98\xff\x9f[\x8dd\xbcI\xe4\xc8\xa6\xa3\xdd\xe1\x04\xa8^b\x7fY\xb6\xae\xa06\x88\x8c\x9d\xd9\xe4\xf5\n\x04\x05\xff\x1b\x8a~\xa10\x85~p=\n\xd8%\x88\x12\x01\x8ei,\xf4\xb3<[\xce\x90/k\x06\x1a\x9d\xe8\xfe\x1bQ:eu{ \xc75\xf8\xeen\x00\x8c"k\x03\xf0\xc0\xd7#\xca\xa9\xd1\x99\xac8-\xfba\x91\x8e\xb0@\xa1Z\xa0$\xff\xa4\xce\x0e\x11\x0e\x11\x05{\xc7]\xb6(\x18\xb5\x13\xa0\x06Tn\xcb\xf0i\xa6E\xcb{\x9dl\xb2~bU>\x8e\xd2\xab\x97 \x91uQ\x17<\xb5\xbf\xbc+\x99\x12{chZ)\x14\xf87\xfbs\x0f>\x8a\x87g\xaev\x8d\xb7\x08\xc1@8\x82\xe6\xbe\x0e\x9d\xe9$\xe3f`/U{\xd1\xe2M\xeaN9j\xb3\xf9\xa9\x9ev|K\xd1\xac\x99\x92\xeb\x81d\xd9\xb8\xbc:\rT*n\xfcK\xd0\x9e$fT\xefoM\xc4Ks{\t\xa9\x03o\x99\x17\xa3\x01\xb5\x04m\xb6\xf2t6PJ\xc8\xc75k\x97 ?rvJE\x18\x0f\xb2\xa9\x8e\x82\xe6\x9a\xb7\x80\xa8\xcf\xfd\xd9\x88\xc41\xc5\xedf\xaaV\xd2i\xc2\\w?\x81\xe2\xa4\x8a\xe7\x88\x13f\xcd64\xf2\x07R\x02\x82\x1f\xc7\x81\x89\x8b\x8b\xf8yo+"\xd2\x97\\\x8eRA\x05\xe5\x91\x8a\x05L\x05\x13J\xb1-\xa8\xff\xff--\x95)l!\xabv\x16\x8e|\tA\xd2\xc5_\xc2\xc1\xda\xd0\x05\xdf\x8d\x8af\x1e\x1fU\x0f\x0b\xc0\xdd\xd8"&\xdb\xeb\x7f~~\x90jD\x13\xab\xe1r6\xc5\x0e\xd2\xdc|p\xb9\xb0v\'\xe9W\xcf\xb6\x9b>s\xeas\xe0\xd2\x87|"\xe0\xd9\x13nXh\xda\x8es\xb8\n/\x0b\xfc\x8f\x96\xaa_\xeczES\xd8\xac\x93\xdb\x93\xab\x97<\xd6.\x0eB\xbfk\x08/U!]\x93\xbf\xef]\xc3LS\xb2\xbf\xdab$"9i\xe1\xb4\xf1\xc8\xcd<\x13\xfc\x904\x99\xf1`\x95\xd5\x0ez\x93\xbc\xafw] \x8fA\xe1\xca\x86\x12t\x03\xc8>\xc0\xd9\x1fI\xf2r%\xa2\n\xf5\x10\x86\xd2\x88\xdf\xf5\x1b\xc2\xa2\x10\xe3c(\xbc\x1cW1\xe0\xa4\xad$eM\xffpL\x8b)=\x10zoZ\x81\x9b\xd1G\r\xaa\xaf\xa7\x84 \x10\x0e@B}\x878\xb5bL\x19%\xfee\x8d\x01~ot\xb8\xd3\x1d\x9a\x05\x9e\xcd\xa1\xad\\\x8e&\xd9\x98a\xa5"\xa1\t\xc0\x86\xcfm\x13\xb3\x1c\xe7\x1b\x01\x01H\xb9\x91Z\xe3\xba\xcc%0\xf3\xcdT_\xean\xd6\xa3\xb2\xa2\x84\xb9\xd5\xde\x98d\xc0\xaa\x15;>Wj\xe6\x80\xa9]\x85\xff\xfe\x9b\x05\xd6\xf5\x88Il\xe5\x8d9\xf6\xdf\x9b/\xed\x940\x87\x00o\x033\x8bMQ\x9b|\xd5\xc0\xe4\xa1\x9a\xdc!\xd8\xbb\xc4\x8d\xa7\x96\x8cH\xf1\xbbe\xdcK\x9e\x94\xd2\xdc_\x91e\x8b\x01_\xd5\x91\x94\xb5\xd7x\xd4dcRs*\xder2\xf4\x8bD4\xa2\xc8\xed\xbf1[\xfdZ\x96P\x93\x11.\x95\x04\\\x98xR]\xee|\x1841\xcd&9:\x01\xae\xcbZ\xa9\xf3\xceU\xe0\x18\xfb\x9f\xad\xc3_\x03L\xb9 In\xdb\xdc\x10&\xd21\xeb\x0f\'\xe9\xec\r\x81\xb0=?\x02\x96\x89\x83\x1d\x18\x8c\xfd\xf16FWq\x93\xaf\x05\x06\xbf\x02a\xf0\x04E\x1cI\xd96J\x13\xbd\x9c\x84\tb\x7f#m\xdb\x86\xefr\xee\xbf\xd3\x9e9\xda\x8ef\xb2\xc0hP\x17J3\xd11aF\xf2\xe1\xbf\x85\xc7\xb0P\x08\xdf$?\xe19h\x10\x1eLg\x97\x9f\xb1\xb5\xcc\t@\x86w\xa6\x80\x87\xc3\x9fS\x93\x01\xcc\xe7\xcfU\x8aD\x06\x93f\x1a\xec\xc7\x81^\xf5;\xdd\xe7\xd6\xda\x1f\xf8:s\x9c\xf8\rR\xda\x92>\xad\t\x80\x02\x90\xb9\xa3\xbe\x9a#\xda\x8d\\\xf9|\x95\xd4\xf4]J\x88\xcc\xc5:L\xf3[\xffY\xd3\x03\x07X\xa8O\xe5\xab\xf0Z\x80zX\x1e\x1a\x1e\xa18h-\xecCF\xb7\xf8&VA\x1em\xa8\xc2\x1a,\xfa\x80\xdc\x15\xf8\xce{\xa1n~\\H\xf9\x07\x03\xd4\xa0\x8f\xdd\xd8\xdf\xd7!\xefY|\xa6\x85\xed\xbd:\r\xe9\x949\x0e\xed\xe9a\x97z\x1c\x15\x90\xbc\xcc\x94\xb7\xed\xda=\xc4\xdaY\xeb\x8a\xb2\x04\xe0\xd8n\xe7\xef\x94\xb7k\x90\x14\xd2\xe4\xf2\xbe\xb5\xd5\xae\x08S_\xc7\x97\x81y[\xbdq\xd8\x85|\xa1\x1c\xa1\xf3\xcb=\'\x85\xdd9\x0b\x89R\xdd\x88h\xb5\xbf\x8e\xa6\xbe\xc1\x16\xbe\xb3\'\x9bT\xd1*\xad^\xa5\x9e\x0b\xb1\x1c\x9d!\xe4<\xc9\xbc\xa2\x0cm\x10\xfd\x8c\x0e\x01b_%.\xe9\xad\xe4\xf5\xf3w\x98@=\x1d\xfaB\x84\\\x8c\x82g\\\x979\x03oK}\x89\x9bT>\xdf\xba\xf8\xb4\xbbV\xb3Y\x07\x97\x04;6\x0b\xc7\xc9 \xb6{\xb4\xb0e\x8d\x0cm:\xd8\xe8}U\xef\xeb[\xf2\xcdVm4\xe0\xd7\xa144Tac\x11R\r\xf0\x1f\x15mt\x7f~\x18\xd7Mf5\x9aQ.\x04\xa2H\x88\xc2\x02*\xd5\x86\xbfS\x18\xb6o\x0f\xf49l\x04?\x15u\x7f\x0f/\xf9\xd1\x92@\xa0\x95O\xec\xba@2\xd4V\xffZ\x84<`\x1d\xce\x1dN!\xa1V\x9a\xd0\x1f\xbe\x80b&\xbb\xc0+\xcd\xfbb\x81\x8e\x8a\xf7\xe5\xb3H\xf0\xf0\xd7\x1a\x92\x17r6\xe3Z\xf0\\\xf1\x90c2</U\xc9\x81k\xe0U\x8a^\xcd\xf6\xc3i\xc6S\x85\xc6N\x8a\xa5\xb5\xb7\xa5\xd5\x82\xf7k\xb8W0\xdb\xd0\xb4g\xf2MX\x9a\xd8\xbc\xcb<\x93\x00\x00\x9e;\xc8\x90\xea\xb0?X\x01f\x07;G\xf1Q,!\xb8\xb5\xba\xa0j\x17Z\xd1\x965N\xa5\xf4\xc0\xf7\x88\x15\xf4N\xa5\xda\xa7r<f\xe1Wvq\x1f\x089\xfc>"e>\xbbd\x86\x8c\xb3\\!\xe7\x81\'\xbe\x16\xa7\xfd\x94\x9f\xc1\xc3\x8b3\x8f\xb0Z\x99\x88\xd9\xd4j\xbew\x1cl0#r,\xe5\xe0\x1e$\x1c\r:\x8b2\xe6\x92\xb9\xf0\x12\x14\x9e8\xf8\x8fy\xb3\xdfX<\x02\x12\xd3\x85ba/t\xf2\xc1\xfdKVsm\xd1\x06\xab\x93\xc5Ib0\xea\x1b\xedXI2\xf0\xd9\xe6Jt\xf4\xe0\xeb1d\xe1b\xe0J\x0be\xcdyC1x\xf1\xc1\xee\x9c\x180y\x7f\xcb}\t\x11\xe7\xd7\t\xda\x9b\x7f\xfa\x16\x1a\xd8\x19\xa1\r2\x05\x90\x93\r\xf7w\xfeQz\x86\xdb\x04j=\xc4\xb3@L\xc6\xb7,\xb5\x12\x85C\xaf~\x80x\x16\x12\xec%>J\x90\x95\xea4\xae\t\x121C\x96\xda\x85A\x17\x0bE{On1\xb0.h\xf5\x0f\xf6@z\x93w\x9c\xdf\xab\xe0O\x0f\\\'\xfe\x10%\'\xadF7\xbd\xf6\x7f3\x10Y\xbd\x7f\xc5\xa9\xf6\xf2\xa4\xda\x90\xb8"m\xa8{g\x7f\xdem\x16\x0b\x1fi\x82&\xa2\xa6\xbe3\xb9s\x8a+\x8dxnX}v\xea5\n\xdeJ\xa4\xca?\xee_R\x11\xa5\xb54\xeb\x8d`%\xca\x14\xf1l\xf3\xec\x13\x7f3\x02\x08\xbf\x8c\xf3\x8a\x8b\x93W\x13af\xd0\xff\x92\x9c\xa3\xa1\xef\xcdy\xd48\x17C1(\xb2\'\x87"\xac+\xc1\x07\xd0v\xcc\x84\xb1\xe7\xe6\xe4\x87\x00~:\x0b\xcd\xf9;\xd0^\xddZ\x03(\xaa\xfcE|\xd3\x87\x01\xb5^$p\xc6 *e\xec\xc0\xfb,\xce\xfc\xad*\xcc\xd5::N\xb8vt%B\x92Jl\x8f\xe1\x89J\xcdN\x99\xd4\xaa\xbe\xb4\x0c\x10;b\xfd\x9f*\xbd\x87j\t\xf1\xb5\xacsn#K\xa06\xf6*\x9c\xeer\xd6\xbfs\x05\xe4\x89F\xc5\xe1B_\xa3S\x9c*S\xf0\x9aJ\xac6\xf7Du\xe4\x8f\xd3vm\x0f\xb1t|o2\x00\xa6\x83\x8d\xe5\xd7a\x05w\x16/&\xb6\x10\x81\x8b\x85\x82m\x1fXb:\x17]pI2\xf86EI\x08#\xc1\xcd\xa4\xf3K\xa6G>\xbc_(!\x94\x8c\xe7\xf6)3\x04\xf7\xfb\xc8$&JcP\x04\xea\xe7\xe1BR&\xb97W\xfb\xe4\x05?9\xc3\xd1\xc2\xd1\xe2$\x1e\xbd\xe73\x1bI\x8d\xd5z\xf8\x04\xc0\xa2\xc6PB\xb8\xdd\x12\x82\xfa\x9f\'\x162U\x11\xb9o\xc16\xc8\xdf\x9d\xd1\xe9^Jq\xa5\xfc%\x8e\xca\xf0\xa1x8u\xb8\x1fyj^\xcb~2\xa2Ly\xa8Sd\xeeU\x18\xcb&\xc6ye\xa5\xf4\x08\xfb\xb4M\xbe\x94\x87\x1c\x8b\xef</\xef\x9b\xdd"\xefT7\xb4u\xe9I\x99Y\xe6\x18\x10\xfc\xe7\x9e\xb47\xf8a\x86.\xb5\xa4\xe4\x08\xad\x16U\xda\xfe\xf5\x0fB|\xb8hx\x08,P\r\xc7\xc9\n\x13\xa1T%\x9a\x19I\xdbp\xfd\x95\xb2ZZ\x03\xc1\xa3\xb1<^}\xbd\xc0\x9e\xc9$\xa2\xa3\x16>A\xa7\x0b\x89x\xc8a\xd4\xc3\xf0[\x96\xec\xbe\x13\xbda\x1b\xf9\x1f\x8e\xd5Y\xc5l\x08=6#\x89\x8a/f\x00;\x02\x91\xd4\xc9S{\xac\xc8\xce\'\x17\x0b\x87J\xa8\x04\x99\x8dI\x16\r\x18.:\xf8t\xce\xb1\x9dw\xf9L\xae\xf1 \xf78BNB\xe9X\xba*\xe9F:P\xd1e\xc9\x0bO@\x86V\x98.\xe5\xa0\x12\xceW(N\x9b\x9d\x94A\x92\x9e\xf4\xdb#\x1bp\xe6\xe01\xadyk\xec6\x81\xdb\xf2Zh\xe1\x85\xda^\xb8!\x8d\xa2\x07-D\x92\xa4\xd3\r\n\xb5V\xf0M6\xac\x95\x12\xf1\x97,\xe8\xb2\xd8p\xb5s\x9a\xb6\xc9tu\xba[c~s\x83q%\x93\xda\x9e,F\xb8\xde|\xb4\xff\xd97\xf9\x8bVb\x16\x89\xb2\x01*\xa3\x89\n\xa4\xc6\x0498\xa7d\x152?\xe9\x01\xd2 \xe2\x84\xf3\xe9\x01\xdd\x08\xd5\xa4\x08k\t\xc4\xa6r\xdc\x809\x9f\xb8\x89\xbf!s\xfcT{\xe4\x8d\xe7\xecFv\xd2\xd3\xf7)(\xc5\t\xd3\xf3X\xab9\xba])\xd5\x0fA\x84~*\xea\xc5\xbe\x8d\x08"\xd8\xca\xbdo\xc0\xddAQm\xcb\xd7\x81$\xf2\xa0\xc4:\xaaK\xf1L;\xc77S\xcd(\xaa\xc4\xba\xf9\xe7]\x1e\xbas\x06\x89z\xb9l\xfc\xba~\xf4\x83\xb6\x99;G8\xf7\xaaC\x16y\xd3\x10H\xbf\'A\x15\xcdp\xdd\xee\x97\xf4\x98\xf7U\xd5\x14\xeen\x7f\xeb\xaf\xb6\x94\x1aU!\xce\xa3\x97\xa3\x9f\x02\x8d\x02\xacj\xcb,\xf6\\\xc7.\xec3\x04\x1dq\x89\xea\x01\xc7\xc7n\xb1\xa2-\x86\xae*\x9eNK\r\x9d\xce\x1c\xc3\x89\xc8\x05\xaf\x83\xac8\x11*\xc5E\x8d\x87!1:p\xbc\xc4P\xe4\x12Wv*\xf4\xfaQ\xd2p\x87|\xebk\x11\xd8\xb8\xf8\xe8}S/}\x00\xd4\xcd\x9e\x99\xbcI\xc6\'t\xefQwtg\x80[&[\x87#\xd5\x1ab\xb8pC\xb9F+\xf1\xf5\xcd\xe2\xaa\xc3\xcc\xd9\x8c>\x81\xf2\x90{N9a+\x15;\xe24\xab\xa9\x8a\xcc\xd2\x93\x04\xcd\xdb\xc2\xd8\x0e4\xd2\xbd\x99\xfa\xafQ\x8fT#jD\xb3T\xec-\xc2\x9d_\x19\xae\x02\xe2r\xd93\x84J\x02\x00,\x12\xa4L\xe3V\xf6\xe0\x18<R<\x0c$u\xa2\x87q\xca\xf4\xcb\x8bl\x9a\x9e+e6u\x06Ey\xb5i\x13\x0bcMTF\xcb\xea\x0b`\xc1\x8c48F\x9e\xfbo\x0f\x80\x18B\xb1\x02Ag=\x9eh \xe1d/4\xa7Ln4\xca\xa0\x81\x1e\x12$\xc0\xf4g\xe2\xc1\x8d\\)\x18\x80\x92}\xbc\x04\xac\xc2\xdd\xfc\xaer\xa3\x1a\xf2\x1dR\xcf\x0f\xe6~J`\xb4b\xd6\xfc8\xf5,J?\xec _\xd25\xccY%\xf5\xf6\xfe\x82Cwv\x07B\xf6Fe\xc1\x05\xaa\xe3M\x181w\x0cK\xc9\xd2Re:v\x00\x1c\x03\xe1\xf9\t\x1a\xaeFm\xf6z\x9a\x9b\x06W\xa5\x93!\xe8^\xe4\xd4\nBGo2\x9d&\xe8\x1d\x14\xb5\xca\x88\xec\xce\xa3^\xab\x00\xc3\xd1fd\x8b~~\x16\xa1\xe4\x14f"\xf9\xe5^\xe3x\xe44Z\xaf\xfd{*\x17\xe4\x16\xeb\xa5)\x03\x88B\xed\xf9\x0b3\x03\xae\t:1\xf8~\xfc\xdd>\xb25\xc86\x0cF\xcb\x99:\xf1\xe2`\xcc\xd8\xa8\xef\xb0\xe5\xdf@\xb3\x9b\x01\xb4b\x10q\xa0\x00\xf8\x8e\x92\x8a(\xaa\x9d\xaa\xe5OHs\x11A\x89\x9bE\x00\xe00\xb1{\xae*_\x06s\xf4\xb6\x87\x18\xf1\x88\xba\x83>h\x05+i`\xf2\x01\xe6\xb6\xd7i\xa3\x89\xce\x8dN\xa3}M\xe6\xb5T\xdf\xb4\x14Kx02\t\xd9\x18\x17i\xc3\x0f\xb5G\xdc\x1f\x0b\xf2\x9b\x9c\xad\xd7\xc1\x13\xe5/\x96}\xc7\x92\xeb\x07\xfe3\xfc\x95\x9exJ&\xba\xfd\xc5\x97\xd4}\xf7%\xef\xf8\xd8-d\xa5\xb3\x11a\xa8l{A\xc3\xe6\xa36J\xbb.\xaf\xe9\'\xb8:\x7f\xfb\xdc^\xec%\xa5$\xb1K\x87>\x8e\xcax#\xaf\x86\x1f\xdd\x95\xfd\xfa\x9a\xbfH~y\xf5a\xfd\xa3 \xa8\xab,\xfa\x1b\xec\xc3)\xb2\xe7\xed\xde\xc5\x1a\xb5X)\xc6S\x00o\xe9\xa4\xd5\xcc\xdc\xe9;\xe9\x8a\x01\x97Nj\xa9\xf2=\x94ez"\x94\x9ch\x16\xbf!:\x8f\x91#zN\xa4\xb1\xa0#\xb2\xea:\x86\x81%\xa2\xb9\xef\x88\xe8\x7f>R\xf5U\x12\x1c\xc6\x98\x8e\x1c\xf1\xd0\xc57o\x7f\xac\xa0\xbf\xd1\xbcJ\x8d\x92\x1ap\x1b\xba\x00#\xb3p\xda\x19\x9d\x07\xca\xd22\xe6^P$\x07\x06@{\xf9L,\x90!P\xc1\xf5\xdc\x03#L>\x19\xa3\x9e\xda\x84GEy\x7ff&\xb7\x1b!TA\x06aj\xf2\xad\xc9\x9f\x9ab\xfb\xc3<\xaa\xd2\x07\xfa\xd5\x16\xa2\xe1k\xb6@7\xa28\xe0\xa8\xc2G"\x95\x1e\x174d\x89SD\x80\x94\xd7\xba\x12\xf7d\x96\xe7\xcc\xe25F\x95\xa6\x8b\x9b\xad\x08\xabl\xeb\xa8\x0c\x0en\xb1\xd9(\xff1\\;\x0f\xa7\xcc2-\x81t\xd9\xeaV^\xf05\xf4P\x96\xd5\x14\xc4\x01\xc9*T\xb7~\xba\xdb\xc5\xe1\x99D\x00\x9a\xdc\x18\xff\xc6\x1db\x16\xacR\xecfSs\x82*\xa7\xec\xc60\x01I\xd8\x11\xc4\x1a[\x06\xdd9\xbd\xcc\xaf\x1e\xf2z\xfd\x1d\x9b\xde\xb7/SJ\xcc\x9d\xfb\x91p\xc9?\xe3<\x1b\xf0U\x83\x8a\xf5M\xd2\xa1\x16\xef\xdb\t\x13\xb1O\xc1\xd8\x8fbN\xd1\x14c.\x93~\x92\x8c\xc7\x07\xe0\xa1F\n\xe7Bx\x85k\x83\xad\x92\x9c\xeeA0\x1b}\r\x94\x01@\xfd\xc7\xa8\xd3\x98U\xf0\xb1\xf1k\xdcr7\x95\xae[\xef#\x86V}2\x8cY\xe3\xb8\x87\x0f*\xff\xc5El\x1c\x16\xa3\x8e:\x9b\x84\xbe\x89\xae8\x94z\x9e\xa6\x18\x0e[)NA?h\xd8\xe1\xe0\x9a\x1aM\xf1PFI\xc5AA\x82\x81a~~\xfa\xfd\x07\x9c-\xaeZ\xa6\xd1Tm\xd5E\xa4\xc8\xf4\xf4\xd7\xa8\x08r\xd8\x13\x02\nU\x94N\xb0\xce\'\x02\x8dT\xcc\x10\x14\x81\xb2\x97(i!{\x82\xf6\xa8\x0f\xc0\xe9\x1a\xa7\xc0<\xa2\xf0\xd85\x96o\\A\n\xafU[\xd5\x05\x16O\xef\xc5\x7fz\x8b\x8d\xa4\xfe\xfd\xd4\x87\xa3\xbe\x8bp\x94"\x9f8\x87\xe2\xcf\x99\x12\x8f&\x8b\x89N\x9e\xb3t\xc7_"*6\xe4%\xda:\xa5\x8f_>\xe1\xfdT\x16\x15{n\xd3cP\x05\xd4b\xbd\xa3\x10\xcfJ\x16\xdaQ\x13i#=(,\x1a\xdfX\r\xc3\xa7[`\xc3\xab\x06\xac\x95\xfa\x19!\xf4&\x91q)\xc5l\x99\x06\xb6\xba\xb3$>\xbd\xf3\\\xfc&\x9a\xd4gK\t\n\xb6S\x84]\xac\x7f=S,\xf5~5\x98H\xef\xf4\x1b8>\x0e-@\x1bc\x85i\xfa,\xab\r0\xcbe\xb9\xfb\xc1j\x14K8\xef\x1eb\x96\x01E\xa0\xa7R\xa5OMk\xa8l\xcc\x06`D\x9b\x7f_\x8e\xa04\x85\xf1_y^\x0c|\xf4\x0f\xaa\x8c.\xff\xf7\xf1E\x852\x9e\x9d\xa4\xfa|c;\x13\xa8\x82\xe4\xa4n/B\x8f\xdb3\xd1\xa2|%\xe7\xcd\x80\x91\xe9\x05\x18w7\xba\x9e\xa0\x174K\xa0lW\xcc\xd7\x9a\x1a~\xb7\xc0!U\x8d\x17\xb2\xe0>A\xf5\x9c\xe3~\xdcQ\xc1E\xf1KK\xf9\xb7\xe9\x9f"3\xa0$\xd2\xa7\xca\xd4L\xa6\x10\x86\xa0\x1fP\x94\xe0BHA\x8e+t\x80\x1d\rC"*l:\x16E\xfa\x9c<\xef\xe9\xee)\xaf\x8a\xfa\x1b@\x82\x13\x9fC\xceO\xf8\x9esE\x89e\xce\x07C\xe4Drc\xa7z\xc8\x0cb*\x18\xd1\xa3x\xc6P\x8d\n\x07\x8f\xa8\xd6H]\x01\x8c\xc1F;y\x12\xd8\x99k\x87" \x95\xb7\xd0\x1e\xbb\x95\x86|\xc9h\xc7\x80\xce\x97=\x9b\xba\x9c\x07J\xb1\xaa|i\xf0^\x91\xce\x89\xf6\xd2\x88ZR{.\xb7c\xa1.\xe9\x99\x1c6\xdf\xfc8~!\xcdM(\x8a\xa9\xca\x94u=T\x8c:\x19\xda7\x12&\xdf0\x15S\x95\x06=ZQh6A\x84\xfc\xa9\xa8\xfb\xa4\xc9F\xa7\x9d\x8a\x81\x8e\xbf\x05k\xef\xbc\x91\xcfHU\x11s\xad5_\xaa\xa1Hd,i\xed\x9c<\xe9f,\xe3\xa3\x08\xb5\xdas7\xdaB\x9e\xd2}\xc4\x80g"1n\xd5\x81\xc1|\xd0\xdc\xff\x87\xf1\xba\xcb\xe0\x1b\xcf\xfb\x11 H5\xee\x8c\xb0\xaf",\xd3\xbd\xa4\xcd\xd0\'\xe6\xc1\xbc\x01\x9a\x94@I\xde\xb2\xc1;\x1a\x1e\xae\x0cF\x17pKw1\xab6\x90\xb3u\xc1F\x9f\x97p\xe0\x08_\x1e\x1d-\xc1\x1co\x84\x90\x03F\x1eKq#\x17\x9b\x01n\xb4~=.H\x9fR\xcf\x97\xe6\xd8W\xed\xe1\xdb\xf5\x00\xab1\xb3\x9a\xb0\xeb\xad\x15\x01\xcf\xe7\x95\x04S\x9b*\xd56\xdd\x7f\xe4BX`pmiI\x1f\xb8MK\xa9w\xc9\xe2\x8e\xd0 jl\x9c\\BO|\x01\xc3\x98wS\xdf\xd6\xe1\xe4\x05Y\xc4\x92\x06c\xb3Bq\x0e\xd2\xa9\x8c\x9c\xfa\x1e\xdf\xb0\xd5\xc2\x00}\x08\x01\xf1\xb5\x02\x1d\xf0\xe8\x8f\xa7=\x06G\x19-\x1e\x18\xd35`8p\x19{KY?\x91;i\x02\x19\xa8\x9fW\xa9\x03\xb7\xfe\xa4\x17\x80\x8bo\x9fo\x90\xae\x13\xf6\xdb\xbd\x8c\xe2\xc6\x9d\xab\xee\xa1\xbb\xd2\xc8\xf8z\x87$h\xa9T&\xbe\x1eR\xef?A\xcf\xe7v\xd8_5KBjs\xe8\x9c\xd7\xc7\xcd\xef\xca\xb86\xf7le\xd4\xe0\xfb\xb2\t2\xbf\xad\xc5Ac#\xe1nBS\xe7\x19N\x97+\x8e\x8d\xde@\x01\x17p\x01\\\xba\xbd\x86\xb0\x19\x8fV?k\x9a\xc7\x08\xee;\x18\xff\x1f\x87\t\xdc\xc5U`h\xa1\xe7j\x1f`+s,,\x0ep8\x80u\xf9I\x98\x1f\x98\xa02\x99\xb5\x88\xf9\x950\xd2d92$\x96\x030\xe1C\x0c\x89>\xce\xe5KV\x1a\x9a\xe0"\x92\x15\xb3\x1eI)\xba\x05\xdd]^eV\xbe\xeb[12(\xa1P\xdd\xda/)7\x9a\xb5\x91\xcdAl\x12\xbc\x8d\x02\x15\xde\xa0\x9a\x92\xec\tzs\xdev\x19~\xe9\xc9\x14\x1aP\x13\x1a\x93\x84$\xf7\xf9\x1a\xf1\xc9:\x81\xc7bh\x1f\xf6\xb7\x08\xf9\x06~\xcc\xf8b\xb1zr\x8b\xc3\xb4\x18&X\xc7<\xed\xaahi\x90\xed\xc5\x97\xa5g\x97\x8fo %\xac\xa6\x0cB\x85\xa3\xc4\xd0p\x12\xee*\xb7\xc0\xbd\xcd3\x7f\xcd?\xf5\x0f\xedW\xde\xdb\\g\xb6\x00{H\xf4y\xc4i\x01>\x10\x1c\xc2zs\xc0u\x9a\xa0\xf0\x0f\xf2L\x9fx\xd0\x1a\xa2\xdb\xb2\xe3\xca\x14\x85(*\x93\x88D&R\xd2[\xd1g\t\x83\x10:\xa7\x8a\x07\xf6\xc2\x05\xace\x11\xda\x82_G\x89\xf2\xe2`\xc3\xe5~y\x15\xd5N#S}h\x18\x12[dq9\xcd\x84\x15\xaf\xdd\x8d\x96\xf7\x17\xd3\xcdMJkR\x14\x9bE\xfb\xae&\xb3\xcb>\x97q\x1e\xbe\x99\xae\xdb\xcdd\xf8\x8f\x8d\xaaA(PuX\x99\x0fYe\x91\xe9\xcb\xd4\xde\xfb#B\x8eH\xf1\xb6\xe2\xda\xf6D\xc3yj\x11\xac\xd1\x927\xb7Qa\xf95\x8d\x83\x93R/\xa7\x91x\xcdB\x95\x0f^\x06\x8f\x12D\x9e\x9ajQ-\xad\xc2HQ\xb2\xbe\xf5 \xae\x8c2Y:c\x81\xac2A\xf7\xa2}\xb7\xa2K\x8a\xb6\x1d\xe7y\xfc\xcaP\x98\x9bF\xd0\xd3\x86\x9am\xa0k/y\xd9\xca\xcd7uG\x83X\x91\x13\x02\x04\xe1\x87\x98a\xa2Zh\x89\x18]G`\x92/\x8dI\xf5\x87]4\x19\xe7\xfat\xb2\xcf\xf6\xf04R\xbe\x82\x9d\xeaK\\,\xbdKR\xee\xe6\xf8\rT\x83C_$\x9f\xaf\x9e\x99G\x07\xf4\xd0yu\xb4E\x1f\x1a&\xaeQAw\xb5\xb8{m\xb7d\xdfC\xd4\xe9+\x1bi\x1dC\x7fz\x16\xc6\x80\xd7\x91E"\x91\xf1E\xaa}\xf4\xc8\xb83\x97Cm\xc37\xc9/0\xd5\x88\x8b\x93\xffB\xe6\xafs:\xa4\xa9v&$g\n\x8a\xd2\xfe\xec\xe7\x19%r\x1aC\xd1\xe3\xd0\x8d\x8ex\xba>=0\xf6\x7f\x840\x0bEb\x87\x9c\x0b\x9fF\xd4\xc7\x90\x15\x0f\xff"\xa6,\xf7\xe4P-\x05,\x07\x85*\xdc\xab4\xf4\xb0\xd75\xef\xa6\t7\x96\xa1\x86@c\x04U\x1c\x1d\xcf\'\\7\xe6\xd93\xd3\xf0\x11\x94\x97~\x118\x90\xb0;l\x0f\xee\x92\xedH\xddqC\x1d\x8e)\xfaN\xcey\xfc\xa0\xa8\x81\xd8\x9b{-\xa81O\xccvc\xa5\x186\x8d\x1d\x9b@\x08\xb5\xb1\xf3\x19@J\x9f\xb3\x86u\xb1SoY\xa4\xb1\x88\xd2#\x07\xbb\xbb\x16h\xa3\x84C*\xd2\xdc\xec\xe8\x07D\x93Q\xd1kD\x8b\xb82+\xa7\xb7\xe6\x91\xc1e\x8f\xaay \xb6\xd3RJ\x85\xaa\x9b\x01\n\xb6\xb9>\xe7\x0cp\xf4\xfbU#K\xd5\x84\x05\xe0Z\xf9\x1e\xed\xee\x90\t\x9f \x9a\xaa\x9e-\ti\xdb\xd2\xb2\xd8\xb0\xdam\xa0\xb2\x88\xd6\x96:\xdb\r\xfc;yc\x05{hC\x90=\xf1\xfd1\xb1\xde!\x19\xd4\x0c\xbd\xb1c\xd2\x1f\xee\x9a\xfe>ir\xcfB\x98\xf8\x8d)be>r\x147f\x8a\xccG\xa5\xc2\x8cP#\xaa\\\xceR\xa4\x9aL\xde\xd9X\x90\xa0aG\xb9FR\x0e\x92|\x9bPZ\x08[xn\xbeQ3\x0fu\x16\xdfA\x93rdf\x8f\xd8\xd6\xc6~q\xe9\x91\xde\\\xd9\xc8\x96\xf4\xecF\x08\xa2\xdaT\xc1m\xd1\xb9\xe2j\x0c\xfd\xd6\xc2\xe9\x8d\xea\xc8Q\xaf\xc3\x97\xff\xc2\x90\xa6\xaa\xb7\x8a\x9f\xf8$\xa7\x9cz\xfb\x07\xaa\xfa\x80+\x8a\xf3w5j\x0f\x16\xc5\x93\x1d\xc9\xa1\xdd\xde\x16\xcf\xac\x16\xac\xb4\xe13^\xfb\xbe\x01\xe1H\xea\xa2v.\n0\xb9\x15\xe3j\xd0\'NT\xbb\xd7\xc7\xbe\xd00c?\xa0\xb5\xbf\x8c\xb7^\x15\xd0]-<\xec\xba\x13\x9ffQ\x16\xee\x8c8\xbbl7b\x03We5\xbcITH\xbdD\xae\x06\xf0`\xb9\xbc\x1e\xdf\xebd\xf3f\x1e\xe8\xb8\xfc\x06N\xa7\x0e8\xd8\xc97pe\xdb\x06k\x9fY\xdf\x04\x12?\xd3\xd20\xf8\xc98\xbe\xbf\xd2g\xd0\x86_s\x9d\xdf\xb3y\xc8#\xe6\xe81\xd8@kM\xee::?z\xe1\x16\xe1\xe2;\x02\x83\xb8\x9d\xff\xa2\xd5f\xfdi\x1ad#=\x05\xfb\x91\xe5D\xa9U\x83\xc4\xcc\x9e\x8d\xcf\xc3$\xaemo<8\xb1\x97\xc1\x02\xf3\xb6\x9b\x1e\xc1VO#|\x0fw\x82\xa4\xd3z\x042X\xf9\x02\xa0\xd9\x11\\\xc5%8\xbe\x17\xf1D\xdc\xe3Tq\xaf\xcb=\xa6c\xd5\x8d\xb8\x8d\xebX\xc1\xd5\x0e\x8b\x1fzk\xecpuM\xe6\xb4\'\xf5\xe2\x7f\xbb\x0f\xf9\x0e\x10}\xc9^Nu\x10e\x94\xf4')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask,flash,request
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+ from urllib.parse import urlparse
8
+ from .config_enum import ConfigEnum,ConfigCategory
9
+ from .config import hconfig
10
+
11
+ from sqlalchemy.orm import backref
12
+
13
+ from flask import Markup
14
+ from dateutil import relativedelta
15
+ from hiddifypanel.panel.database import db
16
+ import enum
17
+ import datetime
18
+ import uuid as uuid_mod
19
+ from enum import auto
20
+ from strenum import StrEnum
21
+
22
+ class DomainType(StrEnum):
23
+ direct = auto()
24
+ cdn = auto()
25
+ auto_cdn_ip = auto()
26
+ relay = auto()
27
+ fake = auto()
28
+
29
+ # fake_cdn = "fake_cdn"
30
+ # telegram_faketls = "telegram_faketls"
31
+ # ss_faketls = "ss_faketls"
32
+
33
+
34
+ ShowDomain = db.Table('show_domain',
35
+ db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
36
+ db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
37
+ )
38
+
39
+ class Domain(db.Model, SerializerMixin):
40
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
41
+ child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
42
+ domain = db.Column(db.String(200), nullable=False, unique=True)
43
+ alias = db.Column(db.String(200))
44
+ mode = db.Column(db.Enum(DomainType), nullable=False)
45
+ cdn_ip = db.Column(db.Text(2000), nullable=True)
46
+ # show_all=db.Column(db.Boolean, nullable=True)
47
+ show_domains = db.relationship('Domain', secondary=ShowDomain,
48
+ primaryjoin=id==ShowDomain.c.domain_id,
49
+ secondaryjoin=id==ShowDomain.c.related_id,
50
+ # backref=backref('show_domains', lazy='dynamic')
51
+ )
52
+ def __repr__(self):
53
+ return f'{self.domain}'
54
+
55
+
56
+ def hdomains(mode):
57
+ domains = Domain.query.filter(Domain.mode == mode).all()
58
+ if domains:
59
+ return [d.domain for d in domains]
60
+ return []
61
+
62
+
63
+ def hdomain(mode):
64
+ domains = hdomains(mode)
65
+ if domains:
66
+ return domains[0]
67
+ return None
68
+
69
+
70
+ def get_hdomains():
71
+ return {mode: hdomains(mode) for mode in DomainType}
72
+
73
+
74
+
75
+ def get_domain(domain):
76
+ return Domain.query.filter(Domain.domain==domain).first()
77
+
78
+ def get_panel_domains():
79
+ if hconfig(ConfigEnum.is_parent):
80
+ from hiddifypanel.commercial.parent_domain import ParentDomain
81
+ return ParentDomain.query.all()
82
+ return Domain.query.filter(Domain.mode!=DomainType.fake).all()
83
+
84
+ def get_proxy_domains(domain):
85
+ if hconfig(ConfigEnum.is_parent):
86
+ from hiddifypanel.commercial.parent_domain import ParentDomain
87
+ db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
88
+ else:
89
+ db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
90
+ return get_proxy_domains_db(db_domain)
91
+
92
+ def get_proxy_domains_db(db_domain):
93
+ if not db_domain:
94
+ domain=urlparse(request.base_url).hostname
95
+ db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
96
+ print("no domain")
97
+ flash(_("This domain does not exist in the panel!" + domain))
98
+
99
+ return db_domain.show_domains or Domain.query.all()
100
+
101
+
102
+
103
+
104
+ def get_current_proxy_domains(force_domain=None):
105
+ domain=force_domain or urlparse(request.base_url).hostname
106
+ return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
107
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,57 @@
1
- # 2023-04-08T15:11:20.498388
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xee\x0c\x00\x00\x12\t\x04\x00\xdd3\x08\xfb\xad\xddk\x84\xc85U\\\xccn!t\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x0fc\x11Y\xd0\xfdr\x1d\x06\n\xfe\xd2\xb9\xe8\xb2\xa2D[\xb70\xad\xdf\x1d\xea\x04\x17\x7f\x19Ff1[\xd1..\x17Y\x81D\xa9\xb4c 6\xb6\xab}\xd9t\xd4\xb59\xbcneS.\x04"Y9\xaa+\xc6@4\xe6\x9c\x19[\xbc9\xec\xddF<\xfa\x19\xbdW\xa48>;u?64~\x90\xf4!:\x1f\x8f\xcf!\xfe\xb5\xe9F\x87lK\x01B\x8a\x81\x94\xd1\xf6\xc7\xdc\xb6-Z&\xe7\xa8z\xa7B\xfe\xe23\x83"\xd0\xfc,\xf1g\xd7\xc8\xf6\xa8\x99J7\t\x1fA\xa1P\xfb\xc1Q\xc3\xe68fM\xc8\xa1\xfd"B>j[\xa0l~}z\xaf\xb8\xa6\x19\x8b\xeai$\xbf\xc5!l\xb9]\xb0\x04\x8b\xff\xa8\x1a\nR\xcf!\x1d\x8dk\x87~Y~:A\xa5lI\xa5~=\xef\x1f\t\xeeg\xbfA\xd6>*48\x0c\xd6\x0en\x916\x8b\xc9?0[D\xe0\xfa8\xe3$E>\xbe\x05\x05\x0e\xa3\xcb\x9c\x8d\xb2%\x8e\x9b"7\xe5:B)\xf5UW\x82h\x9d{\xd6\x01\xb9\xd3\xcd\xb6Hoz-\xdfg\xf6\xe3Vn>\x0fH\xb2\xda\xd7\xcbW\xd7hk\xf6>\xb7\\\xb1j.Z,8\xdfrhJ\xcdX\xec\x05\x08\xa8\x02\xe2\xbe\xef\xe8k9\xe1\xcd\xef\x0f\x95\x0cl\\Wo\xf3O\xe0b\x0c\xfe\'\x1e\xae9\x90\xd5\xb3-\x92~\x87\x1a\xf77-\x11\x15\x8a\x1bk\xb0\x18\xfb\xf3\xd7~\xadt\x9b#\x84fdQ\x18\xeb\xd1\xba\x7f\xce.U\x1a9\xf6\xdf\xb0\xba9\xcb\xf4?\x10\x82!\x8ad\x1b\xb5\x92\x9d\xad|\xf6)\x83B\xa3\xfc\xd2G\xe6\xfeS\xc0P\xf0Z*n\xa9\xd1\xdb\x89\x90\x81\xcc\xd0m\xab\x91\xebm\xcb.&w\x00\xe0#m\x07\xea\xa6\xab\x11\xb9\xaco\xa3\x98kU\x9b\xae\x8e\xfc\x01t\n\xee\x9fOz\x1d\x10\xd3\xf3*\xffL\xd0?\x08\xdb\xe7%\xa8X\xc1W\x10\xc8\xc6\xe8\x88\xa6\xb5\xe2\x04\xdb\xfc$\xd7\xb9\xe6o9\xf1/\t\xceK\x17A7+M\xccl\xc5\xa9\xb3\x93}p\xe0\x01u\r\x0c\x9d\xa3\xe4\xc6\xf1\x00Pv\x1a\xfc.g\xb39\xba_\x151\x92\x92\x17D\x02\xb3\xfb\x9dO\x92\xe6\xaaP}\xab\x9cW\x83\x19l`\xd0\xab\xda\xd3\xd0\xaa\x98b\x03\xd7\x0e\xcd\x94a\xa7\xa6\xd5\xc6\xf5\x8f\x1e\x9e\xdet\xcba\x83k\x97\xa0\xbf\x15_w`\x7f\x13\x80\xf6u\x93\'\x8e\x89\x8f\xd6!\xff\xbd\xaeZf\xb5s\xdf\xd1Zp\x153\xe1\xb7\x18#\xe0I\xa96#I\x9fy\xe7h\xbau+\xc5\xc7 6AB&g+\x8c\x92\x02HJ\x99\xcd\x04%\xce\xe3\xc2\xb1\xc2\xc4?\x81\xd2u2\xff\xe3Y\x1b\xec\x1d\xb4\'\x01\xceY\xeb\xaa\\K\x11p\xb0S\x91\x95+\xbb\x05\x8b\xce\xb9}\xe7\xd8\x80\xd8\xe8\xd7J\xf1\x99&{\x95}\xad\x17e8\xf8\x8f\x04\xea\xa1\xe4h\x14\xa95\xf6\xd5a\xc5\xb0k?z/o\x17\xa6t\xe5\x01\x7fH\x95\xb2\xb3\xd8*\xf1\x07\x94\xcao\x13"a[J*}O\xc1/\xbd\xec\x02p\x9a}\x8f(\xb8\xee\x8e\xd1\xafs\xfc+\xfcI[q\xdd\xca\xb4a\x14\x82H\x96\xc5\x1d\xd5\xe0\'n\x89\xac\x85\xde7\xef\xa0\xd7\x94?\xfe\x93\xf4N\x1c\xea\xfe\x85\xc0\x9e\xb2K\xa9\xb1\xe2B\xae\xe5\x84\nw+h\x91\xe7\xbbv\xc6\xd9 E\xf4\x02\xa7\x89\x8c\xb1\xaa\xff(\x95\xb3\x87\x14G\xf4 o\x1d\xb9\x0f\x80\xcd\xa3%|\xa1*,\xa5\xd6j\xaa5]:\xf1-\xad \x8fd\xec\xed*K\xbf<@`\xdc\x8f#\xb9\x9f\n\xfbZ\'\xb5\x06\xaa\xad\x0bg?S\xb1\x0e{\xdb\x07\xa3P\r\xf0\xe5 l\xeb\xc5Z\x8c\xc4\x0f\x83,\x17\xaf\x7f\x1a9\xe8L\xb7\xd6p\x88\x19\xbe\n\x81\xeb\x02\xbby\xb0\x06\x9aI\xa0\xe7e\x8c\xff\xc1!\x9d\x8e\xd8|\xca\x87\xad\x1cR\xbe\x82Z\xc0\x86\xe6\x8d\xd3\xbc\xd9\xd4\xf3X\xbf\xc2\x98\x08\x825\xd5f\x05\xceo\x7fn^\x1f,\xbd\xe7om\xe4\x87\x94\xe6+3\xba\xd9\x1e\xee\x06\xe2\x18\x00\x08\xa9\x03\x87D\xc9\x9e\xb4!\xc7L\x9bI\x11\xa0\xfd\x87\x888\xae\xcb\xba\xdb\xfe\x059E~\xcf\x87\x93\xe3\xec\xe2\xfa\x90YY\xec\xf7\x1fJM\xa4Mj\x7f=(Qz{\xec\xc4\x9c\xd4m\x8e\xdb0l\xf9\xdf\xb67\xcaM\xecf\xc1\r\xf1c;Y\xd2e9\x18x\x0blm\x81\xc6P\xca\xc7eT{\xa6\xfc\xb4$\r\xe2i\x93\xb2?\x8fvyY\xc1\xb9\xe3\tn>\xa4q\x1c\xf6\x89U\x979\x01\xd6\x9d\x86\x96N\x9661%]\x85\xe0$l\xcbb\t\x015\x0f\x92*\xde8\x97\x0cq\xa1I\x01\x9a@.y\xe7\xb7\xb5\x16\x9e\xf5\xc4]\x04\x96\xfcs1{\x0c\x9e\xd8\x97\xd2q\x83\x12\xf1\xab\x0cB\x16r\xf6\xd5V\x95\xf896\xdd\x0fg\xffB[X\xe9\xc9u\x84-\x99\xa5\xd5\xfc\xf0Cq\xab\xfd\xeaw)^\xdf\x94\x04\x16%\xee\x8e\x16H\xc3\x98\xbe\x0b\xf1\xbc\xfe\x19.\x1b\xb7R\x19\xa1\x11\xc7^\x8bVE\xb37\xc0\xf3\xdb\x9a.R\xe9\xd3\xe01\x99\x07\xf6\xf4$V\xa0L}\x08)Q0E\x97\\\x97\x92\xaf\xe5\xef`\xb3\x10\xc1\xf3<\xaeN\xa4\x16\x10/\xf0+\xefc\xb4\xd9\xc7"\x18\xb0M\xc2\xda\x8a9)\x01rZ\xb1\xec\xad\x16T\xa4n\x7f\xe5\x1b\xe35\xc8C\x1bv\xaaQ\xe3\xb3\xc6\x11\xdc\xb3\xa7Aj\x1d\xf1\xf5ZQw\xb1\xc1\xfdX@\xb0\x7f:\x7f{\x04\x95)>\x84r\x0f\xeeNF\xdbz\xde\xb6\xf5\x98\xac\x8cU)\xffr\xa5?\xbf\xf5OJ\x08\t\'\x92tv\x82&\x96t:\x12)\xe9\xdb\xff\xc5\x8a\xc5D\xce\xf0c\xeb\xfdR\x1bd\xcdq\xfc\xe5\xca\x93\x93\x1a\x82^\x84\xca\xe1H\xd1\xb6\xfa\x01\xcb\xd3\x1c\x15S\xd3\xeb1\xf3z\x0e\xa4\x99\xae}\xd5\xb0\xbbE\xa7\x14\xa1a\xb0\x9f\xc9#"\xdd\x968\x07\t\xea\x9fC\xf6\xce\xa6*\xb0\x99\xb9\x19\xbf={\xac\xb1\x7fJ?\x8c\x967\x1a\x9cY\xefH\\\x1f)@\xb6\xe6\x8e\nK\xf8"\x10[\x10.\xbf\xce\x0f\x93ek\x82\xb7-\xe2\x85)\n\xe7\xb0\xf0\xb7\xef\x88c\x8b\x11\x9e\x05\xcc\xf97\x7f\xa7I\xe3\xa2\x89>\x13o9Lc\xfd\xe3l\xed!\xfd\x16\x1f1pQ\xad,{\xd1\xb4\xb1\x7f\xfb\x80t\x9d;\xeb\x15\xdb\xa6\xc7JcF\x9a \x9c\xdc\x92\x9d\x15\x12\x8d\xda\'\xbf\xd3\\\xdfm!3\xe4\x1b~\x9aO\x04\xad\xb4\xc9\x9a\xe3\x02\xf1<=\xa6\x19\x08q\xe3ST$#y\x15\x06C\xddtz\x06\xbe\r\xf1s\xdb\xbcI\xad\xc6d\xaa\xc9\xda\x06{\xc4r\xea\xcb\xdb\x9b\xe6\x9cp9\x99\x1dc\x8d!\xd0\x93\x06]L\xf0\xbc\xf6l|\xf1\xf8V\x92p%z\x92\xc5\xc4\xd0\x8bCl9\x12\xb6\xd0Go% \xeb\x80\xd2\xf8\xa8A#n\xe8A\xc7\xc0\x13*\x9e\xae\x9b(\xd2\xbb\xe1~\xcd\xd3\x05>0\xd6d\x08\xf17\xb7\xd7\x94\x17\xa3\xd0\x9f2\x91\x18\x8c\xcd\xc6]\xe7S\xfe}\x92}\xe8m\xb7\xae\n\xd6\x92\xfc\x1b\xd1\x94m\xb4\x19\xa4\x97R\xf0n\n\x10\xbcMN\xc3\x8f\xb9\x0cYd\xeb\xdf\xc1(\x18\x9f\x1e\x99*\xa7$\xa8\x07d\x8a\x16\xba\xfb\xa6\xd5\xb9D"\xbf5j9?\xdc\xab\xefG:\xfe\x8dir\x91\xd8\xb2\x07F;\xc8\xc3xfJ\x9d\x86\x8c\xb5\xd5\xc8\xa3\xa7\xd8B\xbd\x0e<\x02/\x15\x89,h\xf9\xf8#\xb0Xpt\xce\xc8fHE\xef\xa2\x8d\xca\x04`\xea\xd1\xc7;\xcae\x8f\x9b\xe6\xa3\xc4\x97V\xfaz\x1cX\x8aJk\xd8\x1cH\x04\xe0D\xbbP\xa9\xd4\xa5"\x8f\x1e\xa80\x8c\x98^\xb9\xc9\xab\x9cu\x87\xf4\x15O\xd8\xe1\xfd[\x93\x97-\\\x1c\xb6F%|\x81a\xd0\xc5`\xbb\xcf\x11+\xb2\t\xbc{\xa4\xe6\xfd[]\xaa\x14\xa85\x989\xa2\x7f\x91T\xfa\x1bf\xad\xf9x\x81d&V\xb4\x8c\xb7\xdeR\xf4\x89N\xa1\xf3\x7f?Wq\xab=\xd6W*\x02\xe3!\xd8\x8f\xe1\xbf\xf8J\t\x00\x97\xf0\xd18\xad\x1e#\x0b6\x19\xe6\xe4\x84\xfb.\x16\xd3\x1bE\x0e\xc2\x89\xf8\xe5`\xe6\xef\xa8\x87\xde\xc6\x16\x1bK\xb2\x16\xdc\x9c\xd0\x06=\xfe\x01\x90]5\x99%\x82J\xf4\xbf\xd1\xd5,\x86c8\xcbO\x15\xc9 qE]\xac\xbb\xe7:1\xa7\xa1E(\xf0\x89\xac\x1a\xa1\x1f\x80BG3v\x9f<T\xdd\x1c\xec\xe1\x06\x96\xd2\xdf^.g\xc9E\xae\x9f\x82N\x99\xfa\xbc+\x8e\x16\x94\x9a,\x15A\x94u\r\xc2Q"_\xd0V\xc1!\xae\xc2uG"Z\x7f(i\xa3}\xa3r\xcb\x1a\xe4\xb5\xb1\x14<\xc9\xe8\xb2y\t\xa8\x1a\xac`\xfd\xf4Edv\xd6S\x94\xccp\x84\xbb\x11\xe43\x08\xdd\xeb\x9d\xfaJ\x8b\xa2h\xf6\x88\x02\x08l\xf0\xd4\xa1)a\x11\xb6&\xd3\xa5\xe5\xdf\xb7t\xf9\t[X\x1b`\xf7\xeb\xd7\x8f(\xccg/\x1d\x13G\xbbhc\xd8l}\x13ml\xb3\x83\xfe\x94\xb5T\x82\x13\xf0q\xe3V\xa9\xb6\xed\x85\xd4\xc3\x96U;\xa5\x1d\xb7\xf8\n,u\xf3\xe9\xc91\x9b\x99\x0b\xfb\x92\x04A\xf8\xd5!+\xaa\xf0\xe8\x00\xf6:Y\xd2\xf4\xf9\xdam.Q\xbe\xb8\x00\x83\x89\xf7\xb3\xbec\xa0H\x81)\xd18:\xac\xa9j`\xba\x00\xe0\x1a:\xa3\xdbh\x14\x18\x93Xx=\xb54\xd7\xb1c\xfe\x1c`!E\xc6\xbc\x94|"\x02\xca\x8c\x04\x9d-a\x10\x11\x00$g\x05?\xdb9\x1d\xfa\x13\xd7:\xb0|\tv\xeb\xd6\xaa\xf4\xc6]\xc2q\x14*Tt \xe6\x82\x820\xe5?\x90\tD\xd5\xe7\x9e?\x10V\x0fo\t\xe4\xc3\xf7\x18\xa5\x15\xd1\x15\xb7\x93+F@\xec\n8):\x882R{\x0c\x89L\xe4\n\xe5o+\xdd\xa7\n?+\x7fD\xd2\xfe\xb2\t\xee\x99\xbc\xd5|\xb0|\x0f\x19U\xe0\xee\x18\xdao+\x1am\xe6\xceNR\x8d\r2\xb9\xf7/\x9b!*\x05\x01\x96T\xce\x07\xa0\x8el\x9cj\x90\x8b\xa14\x97\xcf&eY\xb8\xb5\xce\xa5\x13\xe7$\t\xc0\xf8\x08\xdb\xcd\x16\xfc)\xf6\x04\xc0\xbd`\x80\xf4\xa2\x92\xf6qZ\xb8\xfe\xd5\x86c\xbd",\x15\xea\x19\x93\xbe\xb8\x84\x92\x0f\xf7\xe7\xf4\xaa\xa1\xc1\xef\xe8\x11\x9e\x80\xa3\xdav\xce\xb5\xc6\x9e\xa8\xe0-\x1d\xfc3\xbd0\xa8=\x11Rx\x03\xc9\xeb`2\xa0\xad*\x07q\r\xb5 \x9e\xfa[\xd5!\xd6\x03\xb7\x8f\x03x=d:\xa8\xe1\xb9\x0e\x83\xd4\x17V\xa5\xc4\xff\xe3\xb2*\xb3\xe2"\x00\xd4>\x95\xc5\x07\x9bI\xf0a\x92\xe0\xc8\xc9\xf1\xa2\xb96\xbeP{F\xc2\x93\xd5\x93\x9f6#u\x89\xda[\xb8\x80\x81W\xe54@\xb6/\xb6}\x1b\x0b\x86Y%L\x8fy\xc6T\xea\x0f(\xd9b\x1b@\x9b\x80(\x03\xf2\x0c\xf5\x0b\x17(b\xc2%\xda.\x84\xabZ\xc6\xc0\xf7\xca|Kyr\x06\x10\xb4\x82(\xfcks\xd8bu5Ax\xdc\x91?<X\xf1]3\x9b\xb3a\x14\xc7[\xdb\xec\x81twLt\xaa\xe83\xdd~M\xa1P\xaf,pp\xc8\xe2\x90&\xc3\x1bn\x97\xe3Rm\x02f\xe8\x91\xa8{e\x1b\xcb\xe3\xb2\xa9\xc8\xed\xbb\x86\xe4h0\xb0\xbeE\xfbr_D\x1a\xb3\xdf@\x9bF\x8c\xf9\x0c\\*\xcdw@4\x9b.\xd6\xfa\x9b\xe2\xd6\x87?Z2\xb3\xf5\x02g\xa7\x1aA\x9e\xe6fY\xc8\xbc~d\'\xc2\x87\xbe\xa9V\xf5\xf6_\x983\xd6\x93\x7f!\xcd\xc3c\xd3\x1eU\x14\xf50\xb8\xcf\x1a\x1a\x9c\xa1\xb3\x80\x8a\x0fs\x1f|T\x07\xbf\x90\x1c:\xffM\x92{\xbfm\xfd\x9b\xc3\xbc\x9c>\x1c\xfe\xd4L\xd2\x8b\xf5\x1d\x89.\xe0\x95<\x87\x1a\xe2\x9b\xb1k\xfc0\x10/\xc2}\xc4\x0c\xef\xf0\xb1\xb2\x81e\xfe?\xbe\xf4\x13*\x9aD&\x88.\xc0\x05H\xcb\xe9!9;\xa2\x0f\x9e\x80M\x85\x8a\xf6\xbdl\xaa\xa2\xa0\x82\xac\x94\tn\x06FJ\x8d\xec\x0fG\xc0\x16\xb2\x0c\xeb\x8f\x92\xa9\xa3\x8e\xab\x87-S\xc9\x9e\xec\xdb\xadN0i\xc7(IT\xda\xfb\xf6\xc1\x88}XTl\xa3\x84S\xf9\xd6\x80\xad\x05\xb31e\x03\xdeW\x10\xc6`\xfa\xe0eT7\xd9\x81\x1eU\xec\xd39\x9chh\x96\xb3|\xc6\x8d\x83\x94\xba\x94\xd7\xd7\xf72\xd3\x126\x08\x12e\xbd\x07K\xed\x10\xd4\x1a!\xa7)\x85\xe7\x9f\xaf_>\xca\xea\xb36dXC^e>\xa0\x87\xd7$l\xa5\xab\x99\xf2\x06s\x85\x93\x9f\xa4\x9bsq\xac\xeb$\xb5\x83\xb0\xf8\xe5\x1c9BQY\x93R\x14\tA"\xcbi1\xd7\xdfj\xab\x8a#\xd4MU+uy\xd6\xaa&\x9a\xf50\xbfJ*v@th\x7f\xa0\xaf\x9f\xfc7\x96\x84h8\xf6\x1cn\x96\x12!\x1b\xfd\x954\r\xe3\xf1n\xf1#o\xdf\xd0\x1b-\x19T\xd4\x92\x18Fn\x9e\xaf\xec6\xe0\xaf\xb5\x15\x12\x0c\x82p|\xe0K\xe8B\xee\x03\xce\xfd\\\x95Pf\x02\x9a\r\xbe\xdfm\ra},\xe5\xc0.\xe8~?t/\x82\xb6\xde\x9d\xc4\x81\x92h\x99\r\xac\x086\x9d\x0b\xd4$\x8b\xbc\x1b\xc8\xa4\xcb\xd2y&\xa9\xc8O\xd7\x95YRzHZc#"\xbc8\x817\x81\xdd(\x16\x80\xfaz!\x9f\x0f\xd1\xf7f\xa4\xa8[\x9c\xa5"@\x1f\xe8q\x06\xf5\x03wSM\x86\x9b\x0c\xa6$\xe3\xf3tF2\xa4v\xc7\xe3\x079s\xab.\x19w\x81\x9d\xf4u\xf3q\xc8.`\x19\xb2\xa8\xb9|z\xf7\xbc;l\xa5\x95\x94\xb8\xc2\xe8\xcd\xcb\xbf\xf5N\xef\xa6\x81-\xf2\x0e\xabG\xacB\x94g')
1
+ from sqlalchemy_serializer import SerializerMixin
2
+ from flask import Flask
3
+ from flask_sqlalchemy import SQLAlchemy
4
+ from flask_admin import Admin
5
+ from flask_admin.contrib.sqla import ModelView
6
+ from wtforms import SelectMultipleField
7
+
8
+ from sqlalchemy.orm import backref
9
+
10
+ from flask import Markup
11
+ from dateutil import relativedelta
12
+ from hiddifypanel.panel.database import db
13
+ import enum
14
+ import datetime
15
+ import uuid as uuid_mod
16
+ from enum import auto
17
+ from strenum import StrEnum
18
+
19
+
20
+ class ProxyTransport(StrEnum):
21
+ grpc=auto()
22
+ XTLS=auto()
23
+ faketls=auto()
24
+ shadowtls=auto()
25
+ # h1=auto()
26
+ WS=auto()
27
+ tcp=auto()
28
+
29
+ class ProxyCDN(StrEnum):
30
+ CDN=auto()
31
+ direct=auto()
32
+ Fake=auto()
33
+ class ProxyProto(StrEnum):
34
+ vless=auto()
35
+ trojan=auto()
36
+ vmess=auto()
37
+ ss=auto()
38
+ v2ray=auto()
39
+ ssr=auto()
40
+ class ProxyL3(StrEnum):
41
+ tls=auto()
42
+ tls_h2=auto()
43
+ tls_h2_h1=auto()
44
+ http=auto()
45
+ kcp=auto()
46
+
47
+ class Proxy(db.Model, SerializerMixin):
48
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
49
+ child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
50
+ name = db.Column(db.String(200), nullable=False, unique=True)
51
+ enable = db.Column(db.Boolean, nullable=False)
52
+ proto = db.Column(db.Enum(ProxyProto), nullable=False)
53
+ l3 = db.Column(db.Enum(ProxyL3), nullable=False)
54
+ transport = db.Column(db.Enum(ProxyTransport), nullable=False)
55
+ cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
4
56
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
57
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,60 @@
1
- # 2023-04-08T15:11:20.534068
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xae\t\x00\x00\x12\t\x04\x00\x97\x1b\xb5\x96Z0:\x10\x05\xc4\x0c^\x96R3\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xf8uP\xf1\x83\xcb!\xf9\x88Ip\xd3\xb1Wb\xf4\t\xd0\xe0\x90\xa7\xdd\xa9\x00\x97\x08\x1a\xb0\xda\x8b]\x98$T\xee0p.\xf8G\x83\xff\xbdCS\x0c@sH\xd8\xf7?\xebxk\xc1\x8f\x9c#"9\x01Q\x17\xc8\xaa\xdc\xa5Z\x98\x8b\xdb0KOS_\xb3\xa3\x04%(n3m\xbfEAg\x01\x1cJ\xda=\xe5 -\xe2!\xdb7I+\x88\x00l\x82\xe7\xf0{4\x9cn\x05\xcc\'+E-\xad\x82\xb2\xc5\x0b\x12I\xd7yw\xf0Jo\x9b\x05>\x1d{\xf9X#\xf4\x05\x04!\x99\x1f:\xd6\x1d\xa1yzrz\xd9GUJ\xda\x96=&ab\xfe\xea9\xbc\xcc\x04\x80\xd7k\xda\xa8[\xac>\nl\xda\xd7\xf0\x90\xa1}\xde\xb5>\x9cxb\x14\x9d\xf1\x14\x1f\xfa{\xefO\x06\xc3\xb7\xc4R\x9br\x16\xa1\xb8\xde\xc6\x12\xe5.\xe0\xcf\xb6\x0c\xd4\xf2\xce\xfcR@\x93\xb4\x8f\xc5\xbb\x97\x16\x10f9{\xf20\xe9\x91L*\xb4\xa0p+&\x1a[\xfa[\xe7\x00}o\xce&]\x9e1\xa8B\rq\xdb\xbcSu\x87\x80\xcat\xd4\xe6\x07\xf3\xfb\xf9\xa70\x88\xc1\xe4`\xfa\x12c\xb8\xad\x8cT\xd5Ym\xf8$7\xc7H\xe7\xac\x95\x19\xb3)x\x1b\xd0\x90X\x86\xab\x8fq\xea\xf2ED\x99\x05\xd1\xf6\xef\x96w\'\xaa\x10\x85h\x86}\x12S}\xf0\xb9\x03\x05\xed\xca\xce\x8e\xa4\xd8\xee\xc5\x18\xf3`\x05\xb4\xd5\x83\x98f\xa5;\xea\xb2\xbcS(\x03;\x06\xc8^\xafY*\xabW\xa8\xc1\x07\r\x92]]2\x900\xdaW\xfdL!\xb9\xcb|\xf7\xae\xf6\x8c\xf2*\x15\xd8\x0e\xc0\x94\x98\x15\xc2)\xc1\x9a8\xaa5\xfa2\x11#\xf3t\xde\xac\xb5\xff]\x06\xc7K\xa0e"Q\xbe\x00N\xea\x0eW\x94"L\xeeX\xcf\xc0\x1e\xc2\xb1e+\xb5J\xb81C;\x86\x83\x04\xe5=\x96xF\x90\x8eK\x83\x05\xcc\x9c\xa2\x06\xce*\x18R\x01\xbd\xfe_\xa0:\x1c\xc4\xd4Pf$\x10:+\xf6\xbej3\x19s\xd4\x15"("\xa2\xc8U\xe7\x10AF\xb0\xa6\x06\xb9\xe1)Y>\x98N\x0e{\xb7\x1c\xfa\x96\xeb\xdc\xd6\x9bx>c&\x82?\xd8\xa4&\xfa8\x9fK\x7f\'\xf6\xc8\xae4\xbd\'\x7fQ%\xd2\x9f\xd1\x81\xb10^B2\x04\xe5\xf1s\x8a\xf2\\\xff\xda\xae\x85\x19\x8d\x8d\xbc\xc3O\x87Z\xd1\xd5\x02\xf0\xe64\xd6\x1c\xee\x1e\xbe\xf9\xb3\xfa>\xf6\xddY\xca\x19\xf5\xc7t\x00\xa7\x13\x15\'\xa3\x8a\x88X\xc5w\xf6\xfc\xfd\x8bo\xe2`\xb0T\xd0b\x87\x91\xac\xc79\xf3\xe4\xd9\x16P\xdcQ\x0f\x93i+B\xcf\xd3`\xa6X+\xa5\x883\x86\xf0\xa1/Rzr[\x89=\x16\xe0\xcf\xcbcI\r\xa6\x1a\xf5\xff\xf7\x17\xcd\xdeF7\xc7\xe1\xec\xebz\x14\xd0\xaai44\xb8\xfc\xe0\x91\xe7\xa9\xd6\xaf\x16\xa2\xa6 \x86\nB\x89\x13_\x94\xda\r\xb6\xf1T\xed!1\x889B6\'\xf7~\xd4(\xc3 \x01+|\x1f\xfdg\xca/\xb4\x04\x88*\xfdS\x02}=D\x9e\x8b#\xef\xa1\xee\x01o\x16\xf9.>3+\xde\xc9\x02\x0c\x1c\xe5\x04\xd9\x7f\x83\xd1\xad\x1d\xac\xf4\x84\xa9\x80\x9c\x87\x8fah\x0f\x05\xb7\x13Q\xe9s9\x14V\xa3U/\x8f\xf4\xae\x12v\xd8\x7fO\xf0d\x85f\xf4\x07R\x89,\xb7/J\xc6\xafgv,l\x88\xe0i\x04\xb3\xb0\xcfE\xd8\xcc&\xa82z,\xe3\xbb\xe1\xb0F=\xa1)\\u\xd3H:\xd4\x03\xf2:\x85\x86\x90\x88\t\xdc0\x89T^\xdf\x13\xe0\xd2\xa5\x116`\x1c3p\xc3g\x7f\xe7\xe0\x07\x9d0v\x94\x9f\xb7\xaa\xa4?\x07y\x8b`_\xc5gJ\xe0\xee>8\xf8\xc6y\xc9\xceF\xc0nF \xfd\xb0\xbd\xf5O\xc7(\xe0Y\x9cvbp\xa2zv\xe5\xb1\x892\xd7/\x89Y\x84\xf9\n\xf2\x107\x90q#\xb5\xfc\x8bk*X\xa2ir\xe6\xe4j\xfbc\xc2_HZ\xf4\x80\xc8\x89 \x0e\x83$w\xcc\xa4\x8eD\xeb\x1e\x9d\x03\x92\x05\xb4\x0f\x8c\xd9\x1es\xf0\xbf\xdb\xae\xa41\xec\xcf==\xefj\'w\xf8\xedM\x05G\x11\x1f5\xa3\xae\xca\xd3\xeb\x04\xb7>[Sz0\x8c\x1dKD\xfa\xf3\xc0\xd6\xb5>\xf8^\xaf\x18\x97$l\x05]YvLy}^rN[\x9e\x91\x106\xd2\xf1}\x8d\x95H\x0b\x11\xa4\xbf\tY\x9fN(o#\xa5\xd5I\xcdy\xa8s!%\x85\x8aX-\xaa],mW\x06\xdd\x8e~\xbc\xb8cFoo\x87\x7f\x7f\x08#h\x86\xaa[\xcc@\x9dd\xf3"0|\x85/P\xee\x9aaF\x8d\x1e\x17=\x10h[\xa2>\xc6\xdbxi}\xd5u%E\xc0\xf7\x95\x84\xb4\xb5ny\xaaz\xa1\x8a\xbe\x0c\x1bO\xcb\xa7\xb7\\c\x96\xa7-\x1a\x8b7\xee\xb2\xbb\xf2H-LRV\xeci\xbd\x19Ct\xfa[\xba\x8c\xac\xff\x13\xbb7\xacp\xd6\xb9\xdeb\xcf\x7f\xcaM#\x8eS\xc2o\xae.\xbd\x86\xb2u\xa2\xf8o\x9d\xd2\xe0/\x1f\xf2\xbe\xa2\xb1\x99d"\xae\xcc\xff\x0f \x00#\x16\xceH\x106\xe5\xf6\x1f\xea\xc5\xbf\x03\xfc\xd6\x1e\xccQo:P\x9f8Sbn\x9a\xac\x03\xe0=\xc3\x87\xe8-\x08\xb8T\x15\xd6\xbe\xd5\xe9\x97\x9a\xb5\xec1e\xa4\xff\xc07\xf5=Q\x0f\xa5qR2h\xcd.1\xc3D\x94\xcd\xe7\x94n\xbdY)\xe1b\x94nO\r\x9c\xd1\xe0\x06\xe2\xc1\xcf\xfaRO#\xb2\xef\x12\x00F\xcf\xdem\x1cvS?~T\xcb\xe9\xf4\xfd:\xff,\x19\x8c\x90[\xd1\t\xae,\xfa\xf4\xdf\xee%\xcc\xedMA\xd3S\x05,\xb9\t#w\xd6|5\xf8\xf5\x8e\xe73u\xe8\x91\xebk\xfa.U5:\x0fy\xfa\x08XXxni\x9a;\x9c<(<\xab\xf7\xc0\xda\xf6\xce?\x9d\x8c?J\xeb\x98\x1br:D\x88["}\xa2\xa1\xa1\xd94G\xe9\x82\xa9T\x92\xc5g\x1d\x15\xb4\n\x91\x80\x03\x80x\xae3\xd9\xcf\xa9U\x1f\xd3\x9a^\x97\xc7\xdd\xf0\xce\x82Bs\xbc&\x9dp1n\xb1\xa7\x97\xa5B4\x95\xe5B\xf1\x04\x9fDw\x8f\xec\xa0\xf2I\xbb\xb4\x97\xf2r(w!\xcf\x14\xe4\xf0\x91\x9eB\xcdz\xe1\nl$\xdc\xfb9\x0b>q&\x19\xef\x9e\x90w6\xa8\x00\xee\xb4\xe5\x88\x7ft\xf6\xb9\x9d2\xf0,\xcdI\xbd\xc2\x9b\xf2u?\x85\xe9\xe5\xdf^\x11\xc0sD\xf1\xd6\xa9\x19k\xcdR\xb0\xc7\xf6\xe1\x1a\xea\x88Bwq!\xdc\x8c!W\x8ea\xba\x0f\xdf*3\xbc\xddZ\xef\xb3M\xe9\xd5p\xb4\xfc\x00^\xc4\xa1\xea_{\xfd\xa6\x8a}\xfe\x84f\x8f\\1\xd4!\n\xaf\xd0\xf59D\xccL+\x98\x92\xb9\xf5\xce\x03\xc4\xf8\x9f\x85\t\xad1\xed@\xb3\x92\xa9\xf3jG\xc9\x89\xd0t\x80\xd9\xb6\xaa\xd2\xc9`\x03maf\xf7\xab\xa2\xa1\xe7\xbf\xb0\x8b\x13\xe1F}:\x88]\x99o\xb0\xaes+\xbb\t6s{\xe7\xfc$Y\x898\xe7\xd0\x0c\x18\xa7\x1f{M\xec\x83\xa0\xd03\x01\xe3\x05\xf5\x15\xc3\xed\xcf\x8c\xe1\x02\xa0\ra|;\xc3\x1d\x92bjl\n\xcb\xd1\xb8dm`\xfc\x89\x98>\xf1KA\'\x89\xd1\x19\x8dz\xe9v38\xfa\xa5\xeeKVm\xc7\xea\'\x9d\x98)Y\xca\x14\x84\\\xae\x9d/\x83|U\x14\x99\x99"\x17%\xf3\xb2;?w\xa7\x00%\xf2\xcb\xfd\xaagU\xe7L\xd2\xc7Xy\xff4\xa5\xf5r\xcfA0\xb0\x80cL\xa6J\xdf4\xb2\xd39\xfe\x81`q\xcf\xb43\xcc\xd6\xc4\xa4vuD;\x11\xd1\xd9\x96[\xce\xe3\x8b\xfe\\A\'\x82O[Y\x98X\xdf<%\xde\xbdR\xef0\x1eX\xdaf\x7f\x87\xb2\xf7\x121\xabUoro\x88\xe1\xe2\'\xdf\xad\xd1R%"F\x176\xea\xa7\x05-!\x8b\x15?g2(3\x03t\xee\x94\xea\x19%k\x8c\xdb-\x0f\x05\xf2\x9b\xe6U[\xc1;\x9a\xf5uB8A\xe9x\xbb\xee\x10e\xefQ\x81%#\xa2\xff\'\xde"m([_MfnP\x82\x84J\n\xb2\xddr\xaf:\xc9.\xd1W\xc3\x13v)\xaf\xcb\xe4\x14\x06=\xf9\xc6q\x1a\xc4\xa9h\xe0#,\x91r\xff\xa5\x1e\x02map\x8a\xa4\x0e\x88\x91\x055\xbbT\x01\x83+\xba\xcc\xea/\x84\x13`\x1fsL\xd6\x89+\xa2\xe0\xf7\xd9m\x1f\x80.b\xb7\xd6\xc8:z\xf93\'\x95Vc\x01\xa0_\xc6\xdc\xee\xbd\xbd\x1e\xc8\x04\x1bG\xab<gZ\x0f\xca2\xba\xb0\xc5\xb6\xfc\xf6\xfbM\t\x1f\x831L\xd5\xb5\xcf\xf1\xc7\x95.\xa2\x82\x9b\x12\x80\xd9Xti\xd0h\x14-\xfe+Z\xa0\xc6\xa7e\x94\xccd\xfd/\xaa\x0bC\xd8,IF\x92X\xac;\x1a\xe5\xd6\x80\xd3\x8a`\x95\xa4[\xa0\xfd\xd0\xf30\x89Fy\x91\x0f<\x04\x06\r\x16&\xca\xb0K`M\x13M\x8dI;W\xdc\xf0\x8e\xea\xb7\xbe\xe8\x98\xef\xa3\x06J\x8d\x0e\x88&\x96\xfa\xccvwWj\x9b\xb4\xee\x11B\xff|\x8a\xf8v\xd5I\xca\x8dZ\x92\xc2\xe1\x82\x81\xe8!\xaa\n\xbc\x96\xc3\xf7\xb9\xe0/\x1e-S\xe3|t\xbd\xeb\xbd\x96%\x11\xdb\xf2^\x03]v\x08^\x82\xb8\xa2\x0b\x83\xd5\xc4\x1aN\xbd\xac\x99rD\xcb\xa9\xa5:\x95\x01_Uv\xf0\x1e\xd4\xf6\x07V\x977\xaa\xf3\xd8\xcdM7Y\x0b\xa1\xc0\x84\xe9\xec\xed\x10\xb4\xa6l\xad\x94\x88\xbeB\xc1\x1bw\x80\x9c\x15\xe2 \x9c\x03\xb5 \xa9\x8e\xdb\xd5\xf7\xa5D\xc1\x82V|\xa4\xf3E*\xfbk\xd5\x15\'\xa4\x82Q\x83\xd1\xe4\xdckB\xaf\xe7\xc7\xe0\x8e\xd9\t=?!\x1b\xe8\x7f\xb29\xbd\xab\x08\xbbC\xe3\xa4yP\xc7\xe9\x93c\xdb:\x05\xb7\xb9\x93\x07\x82T\xde\xc9a\xc0\x11~{2\xb4\xc2\x83\x8c\xb4\xfa7\xd4!\xe3?H\xc4\xd9Z\x86-\x12$2o`\x91+\xae\x85q\xcd\x94\xed\xc5\x01\x12\xdc\x96\xde\xd0%\xf9\x97};zVR\xa0\xf0\xb5R\x93\x1c\rmq!7K\xb5Xxe|\xbdO6X\xa3E\xd5\x1b\xe4R\x19\xa8\xff\x89\xc1Z\x8fC\xaab\x18\xd5\x85\xef\xa3\x0b\x06\x873\xed\x80\xae\xb2\xf5o\x06H\x89|~\xe3\xa0U\\k\xd4\xaa\x0f\xa6N\xe5xR')
1
+ from flask_sqlalchemy import SQLAlchemy
2
+ from sqlalchemy import func, column
3
+
4
+ import datetime
5
+ from flask import Flask
6
+ from datetime import timedelta, date
7
+ from hiddifypanel.panel.database import db
8
+ from sqlalchemy_serializer import SerializerMixin
9
+
10
+ class DailyUsage(db.Model, SerializerMixin):
11
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
12
+ date = db.Column(db.Date, default=datetime.date.today())
13
+ usage = db.Column(db.BigInteger, default=0, nullable=False)
14
+ online = db.Column(db.Integer, default=0, nullable=False)
15
+
16
+ from sqlalchemy import column
17
+
18
+ def get_daily_usage_stats():
19
+ from .user import User
20
+ # Today's usage and online count
21
+ today=date.today()
22
+ today_stats = db.session.query(
23
+ func.coalesce(func.sum(DailyUsage.usage), 0),
24
+ func.coalesce(func.sum(DailyUsage.online), 0)
25
+ ).filter(DailyUsage.date == today).first()
26
+ users_online_today = User.query.filter(User.last_online >= today).count()
27
+
28
+
29
+ # Yesterday's usage and online count
30
+ yesterday = date.today() - timedelta(days=1)
31
+ yesterday_stats = db.session.query(
32
+ func.coalesce(func.sum(DailyUsage.usage), 0),
33
+ func.coalesce(func.sum(DailyUsage.online), 0)
34
+ ).filter(DailyUsage.date == yesterday).first()
35
+ users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
36
+ # Last 30 days' usage and online count
37
+ last_30_days_start = date.today() - timedelta(days=30)
38
+ last_30_days_stats = db.session.query(
39
+ func.coalesce(func.sum(DailyUsage.usage), 0),
40
+ func.coalesce(func.sum(DailyUsage.online), 0)
41
+ ).filter(DailyUsage.date >= last_30_days_start).first()
42
+ users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
43
+
44
+ # Total usage and online count
45
+ total_stats = db.session.query(
46
+ func.coalesce(func.sum(DailyUsage.usage), 0),
47
+ func.coalesce(func.sum(DailyUsage.online), 0)
48
+ ).first()
49
+ ten_years_ago = today - timedelta(days=365*10)
50
+ users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
51
+
52
+ # Return the usage stats as a dictionary
53
+ return {
54
+ "today": {"usage": today_stats[0], "online": users_online_today},
55
+ "yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
56
+ "last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
57
+ "total": {"usage": total_stats[0], "online": users_online_last_10_years}
58
+ }
4
59
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
60
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product