hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) 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/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  58. hiddifypanel/panel/user/user.py +233 -3
  59. hiddifypanel/static/css/custom.css +6 -0
  60. hiddifypanel/templates/500.html +1 -1
  61. hiddifypanel/xray_api.py +109 -3
  62. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  63. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
  64. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  65. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  66. pyarmor_runtime_000000/__init__.py +0 -4
  67. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  68. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
1
- # 2023-04-08T16:23:31.297588
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00#\x1d\x00\x00\x12\t\x04\x00.\xa1\xc6\x8b\xac8\x957\xf2W\xd2]\x16\xa1\x8c\xf6\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x11\x9dR\xd44\xf2\xa0!\x7fI\x90}\x8d\xba\x07\xcd\x0b\xd5\x1d\xd7G\xc9\x7f\x98\xc6\xe9\xe7\xce\x8a\n\x08\xdf{\xc5\x04\xfc\x137;\xaa\x11\xd6\x03\xf2\x8bI\xee<pV\xaf\xfd\x0eQk+\x04\'\xc2\xe5e\r\x8d\xb1\x0e\x91\xe6\xac\x9e\x81^>\x96&\x8c\x0b\xcf\xe4\xa7\xe7\xd2\x8d\x99\x8c\xa5\x81\xd3d\x10\xa9\xb0\xa3\x83/a\x82\x9b\xe8\xa2\xd1\xb9\xcaaOAfX"\xec\x86\xe6\xd3 \x9cdG\xda\xdc\xd1Z{Xb\x98\xde\x0c\x15\xdd\xd9K\xad\xcdu\xf5%\x98h\xaejp%`?\x83\x0e\xe5.\x00\xb6\xf9\xf2F1\x97\x88\xae\xf3\x02\xd7f\xad>h\x96\xde"\xd7"x\xe8\xf2\x92\xeaUC\xc4[\xa85\xe0\x91\xd8\xc4\x83\x93\xcc\'\xee\x9c\xa6\x9bV\x04}\xb7\xc0"\xae_^\xeeZ\x82\x17\xb7\xbc\x18\xca\xc2\xa7\xb7zF\xdb4\x0f\x03\xaf\xb9\'h\xd8\xb8-T\xe77\xfe\xc1Ll\x89w\x84\x14\xd0\x93\x91VR\xde\r\x87\x90\x89d\xc6\xe2f\x0f\xd4\xb7u\xcf{a\x7f\x11\xb3;\xf4\x86\x19G\xbc$\xce\xc1\xc2\xd5\x16\xaeU?Pq\x87\xe0D>-\xd75N:\xe7\xc9\x14\x02\x9f\x9c/\xb0\x11x\xf6\xa4\x0e*R\x107\'\xaa|\x8bc\x02\x95\xa5b\xd4\x9a\xf3\xb4\xb9O\xcd\xc9\xc5\x7fR\xf54\x92#\x8a\xaca\x8bo\x89A78\xfe\x9a\xb5\xf4\x81\xc6\xa8J\x1dI\xf6U\xda\xd9g_\xe0S*-\xbe\x03\xb9\xd7j\xd5\x8f\x8e\x823\x7f\xf6\x93\xb6f\x8cp\xe8\xa3\x80\xc1^\xfe8!\x17=L\x8eX#\x8f\xb1\xb4\xa3\x86\x03\xc0\xee\x8fn\x82d}\\\x12\xcf.pq\\\xbe\x90\xa4\x7f\x85\xf7\xbf\x99A "\x97\x99C]\x84{\x0e{\xfb\xcd\xe2?Cd\xe5Hl\xe5\x0fF\xbc\xd09t\x81\xb11\xd6Z\x95^\xc3\x8c\xa7j&\x17\r\xe7\x9a\xd1\xc6\xd1\xed\x16\x0e9\x81\x18@@\x07\t\xeff}MU\x90$\xbe\x1d\x80L5\x18BZ\xf9m\x89\xb5\xd6\x85l\xd4\xd1\xea\t!?\x1c]\xf2\xd22\x91\x15\xfd\xa9>q\x16\xf3<.G\x82#\xc4F\x88\x12B,\xff\xa3\x95\xeb<\x93\xa3-\xcc\xa4\xd0\x88\xb6\xa9hJ}7\xc0\xa6$\x8e\x93\xb3G\xf7M\x14<\x87\ta\xc6m\x1f_(F\xfft\xdf\x18\xd5\x0c\xc3ms\x861\xb6M34\x0e\x08d\x18\xed:\xf8 Xm\xf6\xf7s\x00h\xbd\xc7\\\x9f\xa9\x84\x17\x942\xe5\x91\xbc,\xd5\x858\r\xc1\xd4=\xca;O\xe0Z\x84\x8ek\x8a\x9f\xc4\x86\xd5<`\xb3\x07r\xbe\xa6(\xb9\xe0\x00\x80\x99\xe0\xc9!v\x0bZ\x8c\x8c\xab\xfcS\xa4sM\x92\xa5\x13\xe9\x8fj\xa4\xca.(/K\x1e\xd3n\x8f\x07\x02\xe4L*\xec\xfbz*#\x90-\xf8\xb5\xe8\xb8\xbd\xdf\x9f$/.5 X\x8bKi\x83\x98H\xd4\xaf\x9bpY\xdb\x1b\xacG\xa8\xb1\xd53\xe7\xfas\x86\xf4\xf5\xbaY\x99y\xfe6c\xdei\xf7\xf7gb\xce\xf4;A\x1d~\xe7\xe7\xa7om{C\x95\x06\x94\xac\x19\xec\xa4\x8bj\xac\x14S\xc39\x93\x984\xff\x03\x11=\x15bp\x8bxJ\x02\x83\xf1&l\xfe8\x00)\xbfo\x9a\x96\x0b\xf4\x99 \x82\xd5\xd6\xfd)\x85\xeco\xba&\x81\xf5T"\xb2=b9&\xa8R\xca\xcf\x11\xebv\x9e\x18\x8d>y:\xff\x81\xde\xf3K\xe4\xc9\xfa\xcf\xef\r\xf2Q\xe5\xa4G,/\xb9?\x16\xdfh\x01=\xe3\x02t\'T\x05\x12\xces\x92\x01H\xe7\xd4\xb14g\xaaM\x13\x05\x17\x04M\x98b}a\xc0Ut"/\xe5\xb7\xb7\x8a\xc5\xbc\xd2\x1c\xca\x00\x8d\xddn_\x82!\x00\rG\xbc\x82$\xf8\x92S\x9e\x7f+@\x87\xc3GY+\xd36\xd76\xec\x06y\xb8\x1b0\xb3\x7f\x1b\x1as\x15\x19e\x13y\n#\x86\x0b\x96\xf7G\xc8e\xc2\x02\xd5 f)\x99P\x8d\xe7\xd5\xd4?O\xe0q\xd9\xe9\xd18\x0b\xb6\xf2\x0b\x87v\xd2\x8fI&F\xfb\xc2Rs`\xdbB\x8e=\xfb\x9d\xef\x131\rm\xaehr\x8b]\x1fG\x18\xb6k~\x1a\xfb9\x95\xc7\xe6\xea\r\x9a\x9e\xe4\x8asL\xec\x9f\n\xb6\xee\x81\xb8!\x88U\x80#\x08\x8c\x89\t\x83\x02?\xa2\xda\xe7i~^J"\x17\xc7e\xfc\x0e<WP,\xa8\xbc\xff\x16A\xfdY`\\\x87\xbb\xb9\xad\x01\xc39\xb6\xebrR\x96\xd9\xd9\xc7\xaf0,\'wfL\x06\xf7\x917\xac\xd5\xbey\xc1|\xe6\xef\x7f[\xf6\xac\xa1lk\xca\x85\xaa\xfe\xde\xe373\x9d\x96JsW\x02\xa37\xc4\xce^+!\xd7\xae\x8dQ:5OfK\xcb@\x19/qQ\xbe\x8ahf\xca\xf0p}qoo\xfd\xb3\x9f\xd25\x94\x92i\xc8\x83k\\O&T\xc1W\xf1\xb4\x04\xd8\t+\x95\xea\x9c\xf0\xeat\xe0\x8fn\xe9\x18\xe0\xf1\x97C\x02\xdfQ5\xd1o\xbc*GN\x1cUk)\xce\x00c\xaa.R\x91h\xbfb\xed&D\xa1\xd5\xb0\xce\xb2T"\x1b6\x8d\xeaO?qp\rd\xc13\xda\x89o%R\xddx\x9f5\x8b\x9am\xa4a&h2\x88\xe3a\xdfj3d\xdc\xac\nXar\x96\x06\xef$\xf4n\x02_\xb1\x8b^\x94sx/SL\t\xcd=\xb7\xd1\xc5\xc9\xe9\xa2\xec\xa3U\xee\x1e\xc4\xdaX\x97\x18D\x11\xde\x89=\xd8\x98\xed\x1c\xaf\xcaN\x8c\x84y1\x8dr\xfc\x19\x9c\x85\x8c\xb2\xc0\x96}\xd6\xc0\xc8\xb3\x1e\xb7\x08s~!J\x9d\x83>\xd4\xd8\xbb\xdb:\xbd\x7f\xe5\xe4\x1e\x12a](\xc3\xd2\n\x8f\xb3\xee&~\xb5\xb7%\x12B\xb1\xc6^c\x88\x15\xb43@\'wMy\xbe\xf7j\x1dN\x91\xf4\x89\xe9D\xc3\x87+1G\x81\x0bY\xc4@\xd8o\xa0\xd6\xda(I\xe7\xfe"\x9b1J\xad\xc9\xf9)\x9d\xe4\x1a\xa8\x91<4\x0f\xcf\xce\x8eT\x86\xb7\xdam\x12\x16\xe6<$\t\xbdZ\xb2\xe6)\xc0\x82_h\xc6O\xea\xedO\xc0\xd0\xe5\xa8\xe1\x14K\x85}\xf1\x9ao\xd3\xae\x89\xbeDmp\xd1W\x0cc\xd9\x9a\xbe\x02w\xe9]:\xb3\xc0\xd0\\"@Q\xe4\xf3\x1c\xc9\xf9iQ\xe3\t\x07\x9d\x0f\xe9wR>\x12\xf0\x80\x9b\x9c\x04w\xf4vZ\xba\x1d\xcf\xf2\x13\x14k4\x9f:\x96>\xfe\xa1\xba\r\xc5\xe5_m\xb1*\x1f\xf8\x88w\xfb\xb6*\xa44\xd0C\x86\r\xd3\xbcD\xf0\xef\x17\xc83I\x85)\xa9<\xe3v\x94\xc0\x8d-F^\xf2\xe0\xabX\x06\xa8\x83\x18O\xbd\x0f\xc9\xa3\x1d\xe04\xdd\xb4\x7f\x9b\xb8\'\x02\xa8j\x0b |^{\xb4\\\xde:g\x9fJx\xd8\xf2\xc3\x8b\xc0\xe4\x04\x03\x8f\xc7z\x08\xca\x9e\xad\xb9@\xd2\xc859\xfc\x194\xdb\xaa/\xa3\xaf.%\xc8\t\x95U\xbe\xa5"\x0c\xff\x06\xb1\xa5\xd5~\xc0\xa4\xe9!\xe87\x9b,;\x16\xb8"\x91W\x9dX\xca\xbc\x05\xc7\x14\x8c\xa9\xaeL#\xe8\xdc\x04\x96\x1f-\x18\x7f\xc2\x11\xe2@\n\xe1\xe9\x8f\xe2\xdeskz\xc7iR\xd6\xca\x7f\xe1\x1b\x1f\xbfaP\xc0\xca(\xbc4\x1f\x98U\xda%\xad_\xa0\x90\xb2\xef\xfb\xa77\xe9\x95\xdc\x12/\x9cle.\x02\x92\xe4I\xef\xcd\xc7)\xdcm\xf5\xa0\xf2\x9d\xd0:\x83\x04\xde.[7X%\xf8r\xc5hT;\x1e\x16u\xda]%{T\x97tU\r\xa64\xb8\xbbh$\xb3%\xba\xbd<a\x7f*`\x85\xac\xdf\xed\xc3\xb2\xa2C\xc8{\xd1\xe3\xae}[\xf2\xd1&\x9d\xed\xa3\x81\xcei\x15l\x01*\xc3\xab\xf4\xec\xdb\xa9E\xa9\xba\xd8\xac\xba1#\xbd\x01\xb6\x8d\x96\xb6>\xec\xf2\xa2\x87\xa30><\xf9o\xa5\xc9o8\x8c\x92\x07\xc5EoN*&\xd2\xd1Ln\xb2d\xf2\x12\x8a\xbe\xb0\xe9\x87\rm(\x07x\xc1\x1b\xb1tY^[\xf0Df\xa8\xc0\x1eRT\x10DS\xfb\x1et\xd0/\xeb\x12\xfaX\tL\x99\xdfL\xf4\x0f\xacI\xbb\xbc\xf7\xbbM\xd2Gv\xecT\x978)\x9dl!\xda\xef\x9f\x1b\xd8\xef[-\xd1a\xc4\nT2eR\xd8U\xcb\xa1\xc1\xef\xfcB\x0c\xbc\x9e8\x8b\x1e\xa7[6\xfa\xd5\tW\xfb\xe1\x8ff\x9c\x8b*Z\xa3\xd4{Zm\x02\xa5\x19\xf1\xd6\xe4YoR\xc1\xbd\xd3;\t\xc7\x90\x99\xba!\xee\xaa\xdb\x16\xc7+b\xc2Kp\x04\xea\xd0\x9eA\xe4S\xbe\x83\xf7\x91]\x08(&\x15#\xbb\x15\xfd\x13\xf3\xc7\x80\t\xd1\xce\xe6E\x9c\xd5\x16\xa5\xe42`\xce\x14\xc7/\xb7t\xb1\x1c\x1e\xb6\x85\xaa\x148\xde\xcd\x03\x8a\x0c\x02\xa55\xa5\x16\x04\xc8q\xe1\xff\xb0\xc5\x89\x93\x17\xe3-[\xd2\x8a\x97\xc9\xdc!\xd5r\t?\x1b\xcb)\xd5\xd2\x0c\x99N\x00\xa7Q\x8b\xf8ew\xf5\xbd\xe8\x1a?O\rL\x83%dw\x80\xff\x9cK\xa2H\x1e>\xdcT\xf1n\xae\xcfmh>\x1b\x92\xd8\xdf\x08\xb3\xc1\xd2K\x98\xc8\xbd\xd2_\x80\xc8U\x80"\xd8~9\xe9)\xaf{[QO\xfd\xd0\xc9\xfeZ-g\xe4,l\x95\xd51\x9a*\x0b\xb9\xbf\x1bX\x87\x00\xd2n`\x7f\xd1\x0f\xe7`U\xbd\xd82\xa4=\x1es\xa2W\xa8\x9e\x90k\xed\x02xqgp1\x9f\xc6\xf5{W\x80\xa1!\x92\xc1^\x0f\xa0\x13\x9f\xb0R\'\x17h\xfarUa\x03\x195u"*\x94\x15\xca\xda;yv\xa5\x8cv\xaf\x94\x174\xdfE\x83\xef\xa7\xc1E\xa8n\xbfi\x0fi.r\x12\x10\r\xaeSAl\xfc\x86\x94\n.\xdf \x1fPV\xda\xe0\xfc{\xe2N\xfb\xecQ\x9d::\xcb\x13\x08A\xb6\xf3~v\xc2w\xf5{iRE|Q)A\xa9\x88\xcd^-\xfa\x1b5\x89\r\xbc\xb4\xd6\n\xf4\x15\xce\xb8>4\x82\xc4\x98\x8e\xc4\xab\x95\x02\x1f\xa1\x0b\x05\x8e\xaf\xf0\x9e\x8a\x91\xf0\xcc\xae}\xe8\x18~\xd1>6E\xd9\xc9)Y\x1e\r\xcb"9wl0z\xaa\xee5\x07\xa5\xe1\xc0Gws\x93W\xb6C\xf7\xd7k\x00\x1a\x89\xa8\x0b\x15\x0cc\xeb\xd7\xbe\x19J\xe2WC\x8a\xb1\x93:\xf4O\xe1\xf0\xf2\x143G\x0c7\xd5o\xc8<<={\xf8\xb2\x8e\xc8n#\x97\t\xd1G&J\x92[5N\xdaO0\xd0\xa9J\xfa,F\xf5_\x8fFh\x9d\t-[,\xc9\xdf\xe3\xff\x96\xc34\r\x03\x7fU\x81\xf0\xd0P@_z^tcn\xe1\xday\x8d\xd4\xc9\x06\xc5v\x94\xd89\r\xc0JM\r\xc0\xb49L\x8cj\xb0\x93\\\x94\xc0\xcd\x92\xfdG@\xd1W\x81\xefBy\x00!\xdd\x12\x02c\xecq\xb6\x1c\xc2\x12%>\x13.:A\x877\xb5\x13Md\x03H\x05\x1f~Nf\xa6N\xc9\xa2o~\xc7CT\xdb\xc2;\xeb\xf4G\xe8t\x80\xff~\x03\x81kx\x80@\xef\xd1)\x12\xf5\xa5D\x1f\xa5\x86.y\xc2n\x93\xbf4\xcd4,A,_\xb6x\x81\xee@,\x04\xa8nb\x04\xe0-gb\xd4\xdd\xabs\x8b\x8a\xf7(:\xb3+`\x16M\xb8\xd3,\xf6\xff\xc6\x94\x1c|\xda`\xde:\xb9\xdcc\x9b\xc3}:\xa3\x08Q%\xa5\xac\xfb\xb0M\xbc6\x06\xaa\x00\xb6\x9c\x18L\xa5<0\xfc\xc8\x8b9Z\x0f\x0eh"\x15\x17\x0c\xb3\xa0\xa1!\xfd=\xc6\xbd/\x9cD4)\x13\xdf\xc7\xee\x94`\xc7\x8aa\xf1r\x0c\xb9\xcb]J\x9a\xab:R:3B\x9d-L\xd5\xd3\'\xda\\\xf4\xb4\xd24=\n93gu{d\xceIT\x0b\xe9\xd4\xa9]t\x81Qo\x17\x10\xc5\xbc\xe2\x955\xedV\xe4A*8\x83l+\x14\x1c\xf6E\xe0\x960\x90\xa5\xdf\xb7\xf0\xf1[x>\x85w\xa3s\xb0\xb3\xfd1\x9aG\xfdtBB\x0fl\xc2H\xdf\x85\x17\x10.c\x92\xb4\xa8\xf3\xed \xf5\xd2L3\x19\xdem\xa96\xeb\x8f\xc3S\x00\xd0\r\x97_\xba\xd8\xd8\xee\x005\x00\xb3\xf0\r\x99\xeb\x88!\x13\xf0\xd3V\xfe\x18\xd8\xa1\xd3\xc4\xd6/\xb5\x9f\x0b;9&x\x83\x9e\x1fN\xd0\x07\xa9\x08\xdff\x89\xfas\xa3\xd1\xec\xdd\x8a\xe5\x8fcJ7M\xd0t\xb9\xc2f\x16\xa1\xb8\xf2cZ\xc7\xcaC\x8eW\xc5\xdb\xae\x01^\x1b\x99\x01\x7f\xc2\x1feB\x0f\x1e\xef(\xae\xd6\xb9O\xaa\xbb\xac[\xa0\xc4\xe3<\xba0Y\xf7\xda1\xbd\xd6h\xfd{\xa5\xdcWy"\xd7\x7f\x8a\xb3H5\xf02Gu\xd36qX\x82\x1ai\xea\x18E\xfa\xa3L\xcf\xa6\xa9\xfb~\x16\xa3\xd1\x83)\xb9\xdd\xec\xa98\xda\x8as\t\x18\x87>\xe5BY6\xf5b(\x94!\xd1\x1bZ\xd2\xc7\x01\x1f"\xcd!\x93;~-\xddBKY\xae\x0c\xb5\x1b\x0fHT\x1c\x077\x12\xc9\xbdj\xa1\x06\xa3\xa9\x08\x05ec\xbe\x9a\xc9\xe3\x7f\xcc(%\x84H\xfd\xc4\x16\xc8\x10@\x1a\x96\xffC\xf3\xd2Q\x12\xc4\xbbx\xf7\xba\xf3\x17\xca\xaf\x10\xbb\xca\xf0q\x11\xb3\x88\x13Z\xa7,\xda\xc8\x11\xbb\xc7-\xbe\xea\x82\xe5|b\xc8\x1a\xddoI\x88\xa9\xb1\xdd\xd0C\xfc\xcb\x13o;\x98\xaa\xa1W"z\x86\xddT\x88\xe1c\xc1Z\xa4\x85\xc3\x9f\x18\x83\x82\x03i\x02E}}9\x023\x8c\x17\x0e8\xb5\x085\xc4\x8c\xd5\xe8P\x10\xc8\x9e\xf5=A\xc5\x05\x8b\xb3\xe36+Yf\xcaVU@\xcc\xc7\xeb\xd1\x80C,\xd5r,]xZ\x12bVU\xb2\xa4\x15&?\xb1\x08\xe9\xe7\xeb\xc8\xb4\x0fl\x97\xa8\x11\x18\xc1\xcclF\x8eS\x0e\xa9gM\xe6dD\xbdE\xe6\x1c\xa6\xe3?\xcbc\xfe\xca\xfcE4\xad\x83z\xac!\x941L\xbbm\xa1\xd7\xd1\xd3\x90\x0c\x13_H\x0b+\xc9\x7fG\t\xf1\xb5\xb0\xaa\xferi`\xacSCY\x1f\x8a\xdc\x91\xa5M\xcaU*\x17p\x97\xc7S/\x85e\xb7\x94\xf3\x86\xaa\x8e\xfb\x853\xeb\xbel\xa1\x99kgK\xb4f\xfd\x17`\xd2\x80\'\x8e\xf7Em\x8d\xff\x1f\x98X\xd4<\x06\xd7\x1c\xc9\x07l\xe2!\xfa\x9d\xf7\xd4\xb8$\x84\xbat\xc7\xd4\xc8d\'\xe4\xc6-HQ\xe9\x99\x07/)\xf0L\xef\x9b\xf1\x94\xf6\xe7G\x8f!\xd2\x10sz\xc0\xd3w?&\xe0\xe15\xc7\xd0\xb8\xecQ\t\x91\xba%\x82^)6\xcd\x04+\xee\x1e^\xebH\xa0.\xce\x03i\xd8P\xdc\x15\xe3\xab\xa6\xc4H7\xa2+\xb3\x18!a\x10H\xd3\xce\x84KM\rS\x8d\xe6d\xe3+\x07\xbdm[\xfc\xa6\x8c\xec\x05\x1b7\xc8\x8d\xea\xcd\x98\x10\xc6T{\x98\x95\xbeO0\xa7\xf3\xa4s\xb6pQ\x0c\xc2\'\x89n\x91S\xf1\x846G\x0e\x9e|\xe8r\xd7\\\x14\xc2hZ+8\t\xee1\x13\xe0T\x80\xe3\xb9\x06\x07\xc9\xe1\x13H\x95J\x80\x98AU\x0f6<\xb7G@s/\xdd\xbbn6\xee\xd2\x0fOk\xb5)\x1d\x07\x1e\n\xae/5\xb7\xf4C\x9bQ\xae\x8d1~8]8\x93\x95\x17G\xde5\xe9\xbdd\xc8@u+\x95\xdbn\xb9\x82\x02\'\xa6*\x18N\xba*\xd9~=\x15MX\x91\x9a\x018\xd1#\xedS\xbd\xb4\x9b\x1e\x86\xd8-\x91\xc7\x0c\xc2\xaeM\xf4A=\x9a\xd8A\xdb\x96\xb5\xed\xe7\xb0\xbd`\xa0\xc5\xf3\x0f\xce\xe5\x0fG\xb2\x17K\xfe!H\xea\x04\xf8\x97\xde\xd0\xd8\x86\xe7\xc2\x8dt\x1c\x9a\x99\x8a\xa8\x81(\xaa\xc4\xaf\xbco\xa6?\xc3\x85\xec\x0c\xde\xe9%"\xe4E\xe5\xc6\nQrb*\xdalj\xf3\xd1^\xaa1\x86\x90`{\xfa\xd1\x92\x06\xd0\xd0j\xbd\xc6\xc2\xc4}\xa5r\x05\x19t`{\xc3b\xc5\t\x02\xa1\x12\xe5q\xf2\xac\x9a\xaa\x83\x16\x07s\xdf\xc1`\x87\xb9\xaa\x07\x12+&\x90w\xf1P\xe0\x00\x0e:9\x81@\xd5\xef\x9c\x96\x84/R\xac\xc9\xd5\xcd\xdf\x11\x1b\xa6\xfbj\x91b\xef\xfa\xa7\x9aS\xdaz\x8d\xca\xb6\x91\x8a2\xa2*\x9d\xdd\x88\xa4\x01(t\x1f\xedN\xae\x00\xd2\xe8\xb0H\xae\x1b2\xac\xcb\xdeS1\x97\x91U\xcd)M\xffm\xd5\xd1\xd4\xb0\x14s\xad\x13\xbf\xa80e\xe0\x17C\xa5\x11\xb9\x13\xa4\xd8\xdc\x05a\xf4\xe0\x98>\x97\x0c5O\xa5\x03\xf2Z\xf9\xb7\x89\xb44Zm\x9f^x\x1a\x9a\x106]\n\x82\xcc\x10\xcaK\xca\x96\x84\xef\x87\xae\x82\xee\xe9\r\xb0\x93\xf3q\xbaS7\xaf\xe4E\x80\xe5\x13\xfd\xdc\xa1+1\x1bM:\xa6;\xd4&nb6\xed\xcd\xd7J\x9a\xfc\xb8hy.FU\xf5\xf0\x02\xb7k\xe2\x86\xdcB\xf2^\x82_\x00\x8b\x9b\xa2\x1e\t\x88\\l\xa4\x13\xdcq?z\xd5\xb6\x1cQ\xf8H?~\xc4m\xb2\xac\xfcr6~"\x86O\x97\x17]\x14\x0e\xc79\xe6\x0c\x10({=\xd5\xacY\xe2\xe2\x14\x00\x82\x0f\nK(\xb3t\x95\xf6\xb0Y\xbd|\xcfn2s\x11b\xe8\x92)\xf4\xee\xdc\xb3\x17\x1c/\xd5\x91\x14f\xfeS\'\x1c\xae8\xc1Tt\x8e\x86z\xe5\xdd\x90v\x06\xd2T{3&\x05[p\xe1\xa2s}[M\xc3\xa4t *\x9bw[||,5\xf6G\xf0\xe0+(F\xd9Z\xf1\r\xda\x9c\x02\x15K\xd7@\x13%\xef`l\xc4\xac\xee\x05\x849\xf4\xfa\x84\xf2\xfb\xdd\xef\'\x97\x8fR\xbd\x95\xda\xf5\x82\xa0`\x92&\xd0\x16\xa3\x03\xba\xb3\xdd~`R|\xf6\xd8\xce\x18\x1c\xb9\xe7(d\xd1<\x19\xa7\x11\x96W\x91\xb1\x95\xb1\xcdo\xaa\xb5\xe0\xe91\xcaXX\xbd\xfcc\xc16\xed\x90\x192\x02q\x00s\xd1\x97~\x89\x8bL\xacF\x96\x8a\x9dn\x83E\xb3\xf4L\xf5\xd2\xf4\xc1b\x19{\xc0\xfb\xb8=M\x90\xac\xb7\xa8\xdf\x90\x99\xc4\xc0X\x89dgf\xfb\xf9Ot(\xba\xa2\xf8\xd8l\x92E\x16\xdc4\xb7\x19\xcaz\xc9o\xa6\x01\xabz\xe9\x15\xdc\x01y\xaa\xbf_\xdbxy\xd6\x9e\x91\x97 \xc7\x07\x98/\xe2\xb3\xf8\x0b\x12\x80\x89\x95.\xa9A\xd2\x93\xddz\xba\xe6d3\xf6?\xd5\xe3\x00\xd5$\x88\x81\x7f\xa2\xe9\xf3\x16K\x98\x82+\xc1\xa0\xb0\xe6\xc3\xdc\xb4cbg=\x8a\x89\xd4\t\xb6\x15\xf2m\xd6l\xf4\xc9\xce\xb3=;\x8a\x13\x9e\xfd\xa1|\xa3\xb4\xd2\xa7\xb7B\xdb._3\xe5\xbe\xed\x9d\x17\x1d\xe4\xd0\x12n\xbe\x10s6j\xcbF\xf7m\x98\xa9R\x94\x8d\xa1\x10\xcc\x7f>\x08o\x13=\xde\x9b_\x98\xcax\xe7\x00O=\xa8N\x94t\xb5@\xe7\x1eq\xec\xefR\x0cq\xc6\xcegNPa6#\x00\\\xeb\xe4\xae\xd3\x7f\x07\xe8\x96\x17\x83\x91\xd4K\xdb\xe5T\xc0\xf9\xf90)\x92\x16\xe4\\Gq\xb6\x9d\xd0\xb5l\xa7\x86\xc3~:\xf5\x91:S\xc0\x0c\xc3\x17\x99)\xed\xa5Y\xfe\xc9\xd0i\x8b|\x04\xc3\x99/4\xce\xf9"\xff\xb4\xfbq\xddc? \x98Q\xf0\xe6\xf6\xd3`\xe8\xcb\xf0\x06A\xf8{\x9d\x84e\x9b%\x1e\xef\xd2\x98\xceakeXp\x99Mc\xc5/\x15\x1b\xe1#[r\x93\x8dPTh\xf0\x1c4\xb4\x89\xdbzt\xe7\x9a\xf7\x7fS\xe8\x92b\xadj\xc4\x15\x92\x1bM\x95\xdf\xa7f\x1c(\x83<\xec3\xc5\xf3\xa3\xc8?9\xfa\xe8\x1c8\xeaX\x85\xde\xd4\x9at\xb1\xeb\xea\x8d\x86\x16&&\xfb\xb5n\xe1\xee\x1325\xce\x91\xd6,\x88\x0cT\xf8b\xc6\xd5\xde\xce"\xc9 [tu\xdeab\x10\xf2\xcfqK\x80\xc0i\x07)\xf2\t\x02\xb0\xa9(\x08A\x82TFhx\x1f\xe1]TU\x81\x8c\xa1N\xf4\x8b\xba`\xef\x92\x05k\xfb7\xab\x02\x08\xe1\xd0h\x92\xdb\xa5\x0ff\x1d\xa5\x91\xec\x9e)C\xf8c\x9d3u\xedJ\xc0\x9b{\xa8\x8d:\xa5V\xee\xd4\x94^\x19\xa7sec\x9dR\xae\xe3\x18B>\xb8\xc9\x9d\xbf\x84gy\x90I\xfd\xc8)f\xeaD\x91)\x7f#G\x88\xcf#fk\x99\x14#y3\x03QF\xb8A<\x08Y\xa1\'8d\x1d}\xa2\'\x0c\xf2*~\x0f\x11\x1b\x13un\xfe:\x9cD`\xd7G\xe6\xda\x05?\x92~\xed\x8d\xb1\x93\t%0\x9ba\x95*et\x92\x0f\x17G%\xf2\x19\xdcu\xc5\x80\xd8z\xba\'\x01c>\x9b\x1a\x9b\xf7vi\x1fU7\xa8\xab!\xf7\xf6\xf2\xc4\x81x\x9dQ\x8a\\jQb}\x18\x82\x1d\xd6\xcb\xfaq\xfe1\x0fX\xd7\xd5\x9f\x0cVEk\x8a\xb0b6M\xdd-K\x1b\xd6w\x8e\xd3\xb7\x903\xb8w\xb9G\xb8\x1e\xdaW\x8be\x90\xa8I\x04\xb4y;\xd0\xc2\x19V\x9d=\xdfg\xe4\xe2;\xb7z=\x99i!\xfe\x17\x8c~\x8fO\xb0\xa5\x81,\xcd\xa6\xf5J\xc2Q\x01\xef\x1d\x7fa\xf0\xa0!\xdf\xdb\xf4v^\xc8\x07\x16\xd5\xdd\xf6\xa8\xcfg=\'\xac\x0c\x99o\xd1\xcb\x98\xfbH&\x96\n\xda\xf7\x01\xff\x04l\xce\xa8\xfd\xaf.f\x88f\xa7\xe7\x85\x9f\xa9\x15\xcc\',\x88y\x82c\xec\xf2VNS\x9b\x12"\xd0\xac\x88\x001\xdd\xcc\xe7\xc5\xaf\xf2DG\xc6\xa5\xc3\x84\xf0Ps\xe8\xc4\x1eT\'x\xaa@\x07]QE-"\xea\x11\xd6W\xab\xbc\x8f\xbb\xbc\x98&\xad\xcdPu\xae\xb7gk\x81\x86?\xa7\xaa\x1dp!\xffR\x0b\xb2\xc9\xd8\xccN\x8f.\xaf\x8f\xd9`c\xfc\x06\x1b\x07\xbb]z1-\xbf\xbb\xa0\xa9\x1e\x93UX\x8e\x1e\x8c\xbb\'\xf6\x91T\x8el>\xd1\xd6\xab\xff\xdb\xff\x92\r\xcd\xd0j\xd4E\x18\x04=nl\x08qz$\xb5\x10?\xddY\xfe\x90\xe5\xecc\x95\xfd@\x9f\x1d\x93\xf2X\xd8\xc3\xf6\xb0\xd3\xa5\x11\xad\x10\xb1\x85\xd1k\x1e\xfb\x9f\xc9cp\xc1qI\x0cTh$\xfa\xeaC\xaeT\xc8nT\x02g\xea5\x9d\x06\x95\xe3\x9e\x9d\xeb\x1a`z\x8d\xf15\x93m\xb5\xd1\x8do\xcc\xed>M\xd9\xa3Y\xd2\xdf\x01E(\xc1\x9d\xc5sT\xde\xfc(Z\x92\xcc\xc0\xec\xb5\xc1\xf3%\xae\x19\xc2\x0c\xd5\xf5Z\xfd\x7f\x00}\t+@r\xe6\xb1\xca\xd1\x92\xd0\xbe3\xdc\xb5<\xb7\x14[!_K\x0b\xc2u\xc5\xcd\xc7\xe0\xab\xbf\xb7\xa5*0O5j\x8c\xef}7\x83q\xf5S\xf8\x98\xfa{\xb4\x95\xa1v*e\x9c\xc9\xe2\xdcmWz\xab\x84\xc2\xe7\x8a\x85\xc4cW)\x82R\xe4\xd3\x16T\xa0\xce\xc6\x9cU\xe6ou\xab\xf0\xe4H\x81\xf4z\'\xb1\xef\xf7\xa1\x81\x93\xdd\x95\x1bZc\xd9\r\xe3\xc31%E\x04zj\xea\xb5e\xf8\xbc\xd2\xa9\x12\x8f\xd4Q\x1d\xe6%\xac\x943\xb3Em\x08\xfbST6,P\xdd[VB\x08\xcb~8(\xe6\x80\xdb\x08\x98\xf3\xe5E\xbe\xd8:\n\xc3b\x90\xda7\x85N\x87\xcc\x04\x8b\xb7\xb3=\x04\xe3\xdb\xa2\xfe\xc5\x01\x0cp\xb5\\\x11\x88\x0fLr&\x8a\x85Y\xa7\xcf\xc1*\x80\\\x8d\xbb\xba\x85\x16\x19\xae\xda\x86\x10a\xfe?w\xac\x9e\xcf35Y\xfe\xad\x7fU\xa1D\x81\xf0o\r\xde\xa2Q\xde\x1e\x91\x9f\x10a\x9d\xab\xaf\xbe#+\x0b\xb5\tx"\xdcu\x8e\x95\xc2Y\xbc-\xf0f\xe6\xbe\x0c\xe6\xd8\x8c\xd7\x95M`+a\xcbgf\x04r\x8a@@a\xe7*n\xebW\xe7;x\x83\xa9\xa4\xda\xb1\x9b\xb9\xd8F\xe6\xe0\xbc\xab\xde*\xdf\xd2H_\xd0D\xca\xd6\x90\xf4\xfa,\x06\xdb\x02\x01\xa2p\xc6\xbb\xad_\xbf\xd5i7\xa0\xc3\x8db\xf8\x9e\x9c\xefg\xc4\xac\x1e"J\x93\xb9\xbe\xc7FaMR\xf1j\xf2\x996\xaf%\xc0.?\x06+\x7fU\x99gv\x10\x925Mr]\xf4\x855\xb2\xe2\x98i\xa0x\x1a\x02<\xb3\xa6\xe8\x8b4\x9b\xfb@;9A\xac\x9av\x14\x90G\xc4\xa3!O\x01\x9e%\xd8\x12M\x1e\xc3dh\x8d\x84\x0c%\xdf\\\xe4\x01G\x93\xa6\xd7\x8b\xc1\x8f\xb3IQ\xbevY/\x041\x83\x1f\xd5\xe5\xda\xafe\xe0\x97\x9fh=\x03\xd3\xc9\xfb\x8c7iq\xfe#MU\x90OF\x0b/\xa4\xa4\xd0\xcc4\xd4x\xafw\xd9\x89\xb5\xf0\xfc\xdf\xd5L\x80|e\x99\xeegE\x98\xac\x92]\xbb5x\x05\x9c\x9du\xbf\xc2\xc06\x19\r\xff\xc0U\xa1\x07\xf1\n\x04A\xb7\x06\x8d\xa3\x0bZs\x94\xb0=\x1fC\x18\xbe\x8a\xc4\x9e\xaa\xa7\xd8\x14\x9bn\xd5"Y G\xfe\x01\xcc\x02Q\x031\x19\x1a\x8b\xcd\x0b=kg\xb2/\xf6\x90x\x8d\x82\xfb\x88g\xfdF\xb4=7\xccR\xd5\xd0\xe8\x81\xe7Q\xfc\xc5\xe9T\xe6\x17\x17\xf4\xe2eE\x10\x07\xe3B\xb8r@hC\xe6\x90\x88\x04i\n\xcc\xb4kv\x9e]\xa1\xff#w\x1d\xc0\xd22UW[\xc9\x90\x07<=\xba:\xe1y\x19\xb9\xfd?\xab\xfd\x1d\x974zt\x17O\x8e\x9a\xea:l\xcaE\x01&\xb1\xb3\x17\xcd\xdd\x89\xaak\xfck@w\xd1\xc4R\xa78\xd5\xb8\x96\x8fn\xefH\xac\x9ae\xc4\xc9\xf6\xad1\xc7\xd7\x15H\xe4\x1eO&\t\xcd.\xc23Q\xaeq\xc1\x02\x8d\x1f%\xf1\x9a\x16\x89\xf8\x98m\xcc\x85k\xc4\xaa\xf5\xa6\x10\x9c8\xe3\xcb\xa6/,\xa2\x11\xa44\xccDpJ\xddk\xc4\xa9ke\x1c\xf6\xb2\xe1\x94\x8cX\xfe\x1er\xfav{\xf6k\x9b\xe9N\x1eI]\xd3N|\xb7\x06\xb0\x9dg\xc2\xb0 y\xa3\x9b\xd5\x1d*\x81\x1f\xdc6t\x9f\x07\xb4.A\xbe,Nb\x05\xc0\xe3@\xfdT%q\xae\x17m\xb0~\xa0\xe8ikA\x94HA\xc2\x82\'\xe4\x17\xf4\xa0\xe4\x17aS\x85\xbf\xe9\x9f\xf45\xba\xb9\x1a\xb3\xa2 n\x89-\xde\xd7K*\xdc\x1c\xc7\x9f\xaf\xfe\x0fP#<R\xcb\xfb\xa3I\xe8\xf4-&\xdfzsP\xde\xcc\x13-\x1a\xa7\xbf\x18\xfdy^\xd0\xe5\xc7|\xc9i\xf5\x92\x98\xedw2c\xe4\xcd\x93\xc6\x95s\xeb\xe1=,\xbd\x1fgO\xa3A\xdbi@\x1f\'\xad\x11mC=\x03!Q^\x87\xc4\xd2\x04a*x\x04\x8c\xa7\x0b\xcfx{^ Vr\xf2\xd8\x8f\xfe\n\xe6Od_M\x9csR.\xeb@\x97\x7f\x05\xb8V\xb2\x0c\xd5ic\xb3\x0c\x80\xecu\x1e\xfb\xfd\xb3\x8c\x92\xc0\xb24\xdd\x9e\xf51\xbf\xe0A\x85k\xe4\xeb1\x03\xe1M\x8a\x1c\x10nZs\x86\xe2f\x7f\xea\xaazp\x1b\xe9\xa8\x15\xf9\xd0\xfd1\x84Z\xae\x01\x9a\xb5\xfb\xa8\x82\x86\xc9\xc2L\x1e~\x98\xbb\x18\xcdQN1\xae2`\x15"?\xc4Q\x8f\xad\x04\x08\x8f\xb4[\xb4\xef\xaa\xbd"\xcdr\xf8\x92ZC\x08\xf1pi\xe0\xea\xf5WC\xe5\x8a\xf1W\x08\xbd\x8a,\x12\xf3Uhb\xb9\x95*\x1b\x06n\xb3Ms\xfe\x01\xd4b@?\xb1\x90c\xf4\xd1q\x8d;\xeeY\x7f\x82\x88g.\x0c\xd7\xf7\xf9\xb5\xdd\x03\x9b\xcf\x1c\x13\xbb\xa8\xf8p\x93fOnK\xff\x97\xa9\x0f\xc5\x06\x0b\x1cg\xd3M\xf635\xf2+[\xf0\xdb\x06\xd5`\x13\x84\xc6\xcc\xb8D\x0f\x06\x8d\xf9\xc3>\xdd\xac|\x0f,\xc1b\xbe\x87\xf3\xe2\x9c8\x10r*\xe6\x17\x18(\xe4\xe4\x8fj\x85\xec\x9cn\xd8S\x87\x82\xbe"0\x8b)\x91\x01=\x9d\xb7\xd6n\xf6\x1b0>\xf4j!\xcd\x10\xbf\x05\xfa7\x8b\nh\x08\x14`\xea\x18\xdc\x8bE7\xf8H\xd2\x13Gi\xbe\xdc02\xf7\xe4I\xeb~\x02}g\x7f\x96\x12\x0eYW\xc7\x08K\x93\xea\xf3\xb2\x04\xda\xc6\x18`"\xe59)\xa0\xf2\x95?G%l\xc8g\xb3\x90\x02\x18;-\x00xm\xf0A-\xb7b\xe2\xed\xfc\xabJ\xbf\xd1\xfda\x8a\x19f?\x0f\x8a\xb5dl\x17\xa5\xe68\xfa\xdb\xd7\x15]|\x92!\xe78\xf3HXUm\xa4\xc0\xb4\xd8h\xbb\xbc\xe9\x95\x1ac*\x10\xba)\xff6F\xc7\xbe\x82\xc5-\x12u\x8c\xf5Z\xb5\xd4\x80S\xdaj*\xfb\xab/wU!\x1cP\x0e\xe3\xe4\x1c|\xcb\x89\x1a\xc7(\x96\x83\xd7g\x1a\x89\xc4\xb1C\xber\xd1\xab\x83#u\x92Hp\xd8S\xeefe\xff\x13\xbbt\xf7\xc7\xb6Z\xdf\xb3\xf3\xf2t\x8d\x04\\\xcdC;zs\x8a\xf8\x0e\xb0\xcf\xa2\xb7\xc2\x8a\xf2\xa6r\xeb\xae\xa6\x82&W\xf7\xb8\xb7\xf7&\xdbB$%\xd2\x9e\x02-x{\x84~>\xad\xdc\xa2\xe1\xc6\xc2\xf4\t\xed\x88f\xe8l\xe7\xb1\x86U\x9cH\x9fO\xeb[\x07\xd8~T>\xde\xeb\r \x18\x0bw\xb2\xc3\x12\x07\xe9\x88\xe2\xdb\xbc\x03\x90D\x89\x0f?\x15\xf3,\x02\x0fl\xbd\xf6Q\xab\xaa\x89\xcb\x00\x13;f\xc34\x96\x1d\xf1\xdb\xb8\xfc.Z\xc4\x08\xa7\xa8\xa5-\xa9\xdb9y\xe7\xa01\x1fM\xb0\x8a\xe0:\xeeC]`7\xe4`\x01\x92{\xcec\xdd\xc4pd\x89\xe6\xeb\xa6G\xba\xf5\xdc1}\xab\x15\xf4\xc6~\xb2j\xf8="\xd7\xeag\xb1\xbe\x0c\xebE\xa0cH\x0c\xc3\xc6Rm\xcc\x0f\xdf\xc7\xf2\x1a\xa5\x97oA\x08M\x8cr\x02\'_\xc1\x83\xa5\xd4 \x86\xf1\xcb\xd1\x855\x9c-\xe3\x8a\x91pJ\xc0\xcd\x13\xd0\x80VV\xda\xd6\x015\xe5\xdf.4\x0e\xf6\x92\xd3z\xb5\xb8\x12\xfc\x1d\xf7\xde\x99\xdf\xe7<\xe1L5@\xb1t\x9dz\x19z\xb6\xc0\x01\xfd<\xae\x05\xfa\x8f\xe4\x96C;\x94\x17\xbe\x1b \xa4\xeeI.g\x17\x7f\xdb\xa6\xc9\xa8\xa6\xa6\xb2\x98L+_\xd0.\xea~/\xf9\xda\x98\xc7\x84%\x05\xb9\xd9\xd6.\xec\\\x15^\xe8\x8d\x11\x8eH\xb9\xc5\x0fW\xdcd\xff@2\x94B\xff\xf1\xe6/\x84\xf8\xc5\xef\xf5\xaa%3$\xa0R\xba\'\xc0-\xa8C\xd4hrt\xca\x10B\xfe\xdb1\xbfY\xaf\xd9\xdd\x89]\x06\xfd\x95\xe7%6Lu\x9f)k\xc7\xbe\x9a`\x9di\x05> \x87\x13M\x15I\xbb\xac\xc1*el\xf4\x08\xc8\x02\x82\x1c\x0f\xc6:c\xe4\xc2\xfe\xc2;6L{\\(}F*\xd6\xd8\xfa\xaa~7\xff \xde\x8c\xe3\x15\xfb\x8b\xb3\x95\x94\xa9,\xee\\\xdb\xd8)v\xd5\xe2\xb4\xfa\xc7\xad\xae\x1f=\xf5\xb1u\xfcWSxy\xe5\xd9$\xd4\xcc\xd4f\x0e$\xe3\x03\xb2`\xb2\xb5X\xcdf\xec\xb2\x1a\xda\xbcG\xdfN9\xd0<8\x06\x12.z\xb4Se|a9&\xb3u\xf7\xe9\xe5\x10\xa9O{\xaa\xdb\xbe\xbau6\xb0\xb9\x80\xaaX\xce\x0b2\xa7\xa5\xf5\xd9\x94\xa9H\xcd\xa0Z\xec.&{\x0e\x81\xa2\x90\xfc\xad\xde\xdd7\x99\n\xb5\x15\x88\xa7\xe5e\x99\x03\xae\x96\x14"T\xb0\xbe\xdb\x92\xdc\xf3\xfeq\xf6?xQ\x88\x17(\xa8Kd\t\x1c\x0f\x93D\xac\xac\xff4\xf2\x8a\x8e\x02*\x1a\xbc\x938g\xf4\x98\xe7@\x9f\x06;7i\xfa\xfcG\xe66G#:\x1e\xe3\nBP\x9a\x92\xd7\xd79\xe6i\xd7\x06[; b\xe5\xe6\xaa\xb6FU\x8c\x8f\x80NzM\xd0\x15\x84\xc2\x81\xee\xfa\xed\xa9\xe8a7\x02\xa0\xd4\xda\x92\xe7b\xf9\x8bA\t\xa9\x9fz\x0fg\xca\xe4v\x97\t\xeb\x90\x91<\xcd\xe8\xda\xaf\xe4\x98\xb2\xb3\xbc\x9fQc\xa5\xf9\xa6\xd3 \xa9!G\xa1\xdb~\xdf\x06\x9e\x1cb\x1e\x8c\xee\xe5/\xc0tJ\xe8\xd7\x17"\x11\xa3R4\x9c\x13\xc7\x0f\xb1\x92\xd3\xf1\xf6\xdd\xf5\\\xbb<\xcf\x9e\x8d\xe8\xe9\xa5-\xf9c(\xd29\xb7!M\xbe\xc4%\xf1\x06\x9d')
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-08T16:23:31.259220
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x05\x1a\x00\x00\x12\t\x04\x00\x81\xf7\x03\xb8\x89<\x04\xac\x9d\xb2%\x85O\x12\xc5\x86\x00\x00\x00\x00\x00\x00\x00\x00\xcbY\xd0\x83\xd8\xaf\xfa\xe4\xe8\n\x98\xde\xe8\x87R\xd5\x03Q\x0b@\xe3\xde)c\x05\xa3\xf9\x14\xd4\xfc\xbae\x94\xb4\xd0\x14\x90\xf3\xc5\x8f\xd6\xae=\x0c\xc2\x15\xba\x1e&\x00\x0ca\x08B\x02\xea|]\xb2sTJ\x7f\xc9R\xb3.$y\x1dJU\x83\x1e\x91\xbd\xc7G\xb1x}qv\x05\xe7\xcd\xd01\x1fXJS\xaf\x0b\xd9\xd5\xbf\xe2\x17\xe3f\xbdk)t_\xcb\xb7A\xf3*sJ\xba\xea\xd6\x90\xad\xbe\x05\xfc\xbc\xe6\xf7\'\x98\x83LEH\xa6\xe5\xf4\x0bE?\xe6[\x99\xdd"j\xdd+"\xe1\xc7wy\x90\xbfg6$Zw\x01{\xf3\xcdvm\xeb\xe6\x15\xb1P\xd14\xd0\xd8\xb7\xb8\xde\x91*\xd7\xa57\xf4\t\x06K\xda#\x14\x8d5y{\x1e\xbf\xc0\xf4\xd2\xa7\xe7\xa4\x89\xd5w\x83\xdex\xb5}\xe5h\xe1P\xa2k\xaf\x1a.\x83\xfd<2J0\x90>jD\xbb\x83\x1c\x05\xa03\x0e\xbb\x11\x91?\x94\'\'4d\xc1\x98\x8c\x94#\x8dR\xa7+\xae\x8bE\xfd \x8d{\xc3[\xac\xb0\x08\xec6\xda\x8dU\x8e\xb8\x9a\xe0\x9aq\xfd\x98\xa9\x1b\x16\x05\x14\x97\xa0\xa9\x93s\xc0\xc6\xc5\x9a\xb2\xc8hw\xd4S\x06b\xa0\x1bd\x14\x9d\xc8?\x9a\xd3\x95\xbe\x9c[\x8dw\\3\xcd\xc5\x16v\x0f\xc2)\x89\xd05\x02\x8a\xa9&\x8e\xdc\x86>A\x1f\xba\xbc<\xf3\xf8\xecX\x96D\xea\x07\xc6\xf2(\xfa,p\x11X\xce\x1c\\\x04\xe8dF\xf7\xd5\x15\xb0S\x87\xd3\xf2\x02\xe0xn\xef\x95\x92\xf0\xd8\xefv\xea|\x825\xff\x16\t\x19\x1e\x97\x1f@\x05c\xcbE\x7f{O\xcc\xc7\xfc\xd6y7\xe4\x92Z\xc0v<\xeb\x84\x9b\x8b\x96\x88 \x89\x00(\xef\xf2i\xdd8\xc8\xc1\x87j\xab2\x95\x13\xe4n\xbc*X\x88\xea\xb3\x1a=\'\xa0\x05!\xaa\xcf\xb4\xb9%\xe7#H\xfd\x18\xf2\x95\xbed\x7fX\xc8\xb4\xf4\x1a\x02i\xce\xf2!E\xeb\x05Jv\x15\xa9\xe3\x80\x9d\x83-\xb5f\xecZ\xd5a\x98\xbe\x9ci[i\\Zq81\x93\x98\xf6%\xc4\xb5\x9c\x9e\xa4|\x10\xf4dS\xdd\t\\+\x8f\x06j?\xd9\x91\x98@\xab\xb2\xc7\x9d\x99\xb3\xb6\xae\xa9\x1f\xcc\xc1\x85\xd3\xea\x0e\x00\x9fTg\xf1\x03\xe4 Ks\x1fe\xab\xb5\x1b+Y\n\xe3\xe1\xc6\x87\x1e\xa8\x91\xe8\xfc\xfc\xccgc\x01\xfb\x9d\xe6\xfe\x16\x02\xfe\x10\xcaq\x92&\x0e\xd9yYJ\xe8_\xa8x\xc1_\xb4\xdc\xa2rH@\x0f\xd8\x92\x86\xac\xc5\xa0\x8d7\x89zUH\x1f\x16<o\x9f\x03B\x82P3l@\xec\xa4\x93\x88\x9e\x90":\x8e=\xdaY$\x9e\xff\xfa\x9e\xc7\xb1\xc7\x0c\xf7j1\xba\x10\xc8\xf4f_F\x93,7\x11\x83\x89^\xd9\xcf+\xa0#Z\xeb\x96\xa7\xef\xf1%}C\x9d\xe6\\\n\nUfa\xb3+\xc6\x06\xdc\xe2DP\xa9shQ\xab\x10\xf3=Q\xc7\x03`\xf1\xa1\xd1?qK3\x8d\xc9\xd1I\r\xab\xe7\xb4"m\xfcQ\xdd\xefk\x82\xd1\xab\xdc\x9eh\xc9\xd3\xb8Y\x00\xe12\xcd\xe0\xbdF\xf2\xec\xe0?\xa4\r\x03\x87\x1b1\xbe\x18\xabh=\x12\xf9\xd0\xc2\xa3\xcd\xa3uE\xcc\xb4\xa98U\xdd~\xea\xc3\xdd1\xe3IH\x06\r\x07\xd1cCT\x19\xf3\xe8\xb9hpk\x9dz\xaf\xea\x159\xa4Pv\xf8\xda\xaem\xe0\xee\xda?\xc6\x93\x9f&\x0e\x7f;\xc3u\xc6\x17=\x12\xd4\x0f\xcfJ\xa3\xa3\xbb\xdf\x91Y\x80\xa9\x95\xd4$k\x84\xe6\xcb\xebP\xc9|\x01\x16\x11\x81W\x10\xa1\xf6OQVj\x0e\x1e$\xf7\xa6\xaf"\xfa\x94\x84\x02M\x01\xeb\xca\xa5\x13\xae\x82.\xf9h\xff\x80l\xb4e\x17\xd3b\x94\x85sGY\x80\x1a\x8fl\xd5\xa38\x84\x8e2b\x87A\r:\xbe\x9e\x10\x96\x87\xd5{m\xcd%\x8b^\x9c\x94\xd7\xc138\xa4>\x075j+\xafx\x10\xde\\\xdd\x8b\xa8$=\xee\x96\x91R\xf5?5:\xda\x9a\xa4\xa3\x00\'E\x17\x00`\x82x+\x95:\x97(\xc0\xcd\xef)|8lD\ty\t\xd3PL\x12M\x1a\xc4??em\\,N\xb4\x9a\xa2\xc0\x93\xa1\xd4\x0e\x06>\x0e\xd6\x87\xd5\x0cl\xc3\xea\xa5\x96\x9cq\xe2\xe63\xd1\x96\x0f\xe3\xb2\xbaB,jprN\xf5a#\x01\xa2\xd3\xcf\x17#\x91\xd7\x86\xb8\x89q\xb7\xb4\x9a\xdfq:\\U\xf2\xe9\xce\xfb1GnV\xcc-Vo\x93\x8bx\xb57\x96\xa0\x1d\xa9.\xe5k2$\xd2w\xdea\x8e(F\x0f\r\n\xa2\xce\x11\xd7\x07\xfcL!\xe1\x9d\xa5\x11cv]\x96\x1aU:\xfb\x19\xe9]{B\xb2\x06\xdb\xcd\x8b\xf5\xf7\xd8;\xf8J\xc4TY\x08fB\xfd\x90\xf3\xfa\x0e\x0c\x9fU\xa0w6\x98(\xeex.\xbe\\\x91\x188\xdd\xebH\xf1,]X\x82\xf5\x1d\x00\xb4\xac;\x15\'j\x9e\xf4\xf2\xdd\xac\x13\x9b\xe0\xf3\xee\xbb\xe3-nM\x9e\xf7\xcc\xc0\xf6\x1d\xce\xadi\x1a7\x06<\x87\'\xa1\xc8\xe6\x90\x1d\xc6\x08\xa1\xb9\x82\x88\x0e\x9cFJ<\x08\xe0\xbb\x15\xddo\xf96\xf2\x87\xda\x85M\xf9\xc8r\xcef\xff\xdb\xa9="m\xecK\x01\xe4\n+{`\xae\xf9\xe3\xb2\xac\xc7U\x18\x88\xedP\x07\xe3\xc4\x8f\xed\x88Y\xd4\xb1V\xf1\xabk\xbcJw?\xb4Z8^\xf2\x89\nM\x17\x06mE\xc9\xb7\xee\xc9y)\x83\xca!@\xbf\xc1\x12}\xaa\xe9`,\xb3\x97uXu\xfc\xfcc\xd19\x05\x91`\xd1\xc0=\xf5\x9fJnv\xe94H\xb4=\xfa\x889\x86h.\xe3\xce*\x81:S\xed\x00\xb1\xdbd\xceZ\xac\x86\xbf*\x96"\xdb\x8f\x0c\x8a\x97\xf3B\n\xb4V\xe0\xd6Qg\xa1\xdf\xe3\xbc\xe7$Q\x01\xd1n)\x16*\x12\xc5/$I\x16V\x82.\x817\xe2\xc3^V\xce\xa8<\xc0\xcc\xf3\xf7\xaf\xb6\x91X\x10\xdd\xa8\xd6K\x9e-s\x10,\xe6y\xe2@\xf4\xa1\xa0\xf7\x0e=\x94\xe7\xf3oJ\xect\xdc\x82_\xef\xb0\xd4\x11)\xa1?v\x1d\xf3\xb6\x07Z\xf5Y\x15"\xa6\x01\xaf\x92\x86\x1f\x1ay\n\x1b\xc8]2\xd9\x7f\\h\x82A\xeb\x96\x0c\xb0\x07\n\x13\xa2\xb4/\x0f\xf1\xa1\xae\x17\x82X\xa9\xfe\x89&\x1e\xfe\x03"\x83"\xa2\xb2\x19J\xf29\x8de\xd4\xca\xc5\xca\xe9\x87\x87\xdbaz\xd0\x1b\xf3\x0c\xeb\xe2\x92\xc6\xe9\xb5sGwB4\x87j;\xcc\x13\\\xcb\xb5(\x02K=\x00\x9a\xd0\xcf\xd3{6\xdbO\x80\x8fE\xc8\xd7_U\xca\t\xfb\xef\x05\xbb\xae\xac\xc1\xca\xf3\x17ig\xb0\xccd\xac\xec\xd9\x9da37\xf1^\xfa\x82\x94f$\xea\xa6d;D(\xd0t\xeb\xaf\x943\xf1\x03\x19jD\x02\x0f\xbcE\x91D\xc1[B\x83K\xd3\xadJ%\x14\xab\xc1\x9c\x1c\x0e\xe3I\xe2\x07\xb5\'\xd8\xef>\x9e\x08p\xab\x04\xfa-\xe2lB\xe9\x91\xdf\x07\xbfJ\x860:\x822\xd6\x83\x9e\xf6\x83\xd2\x8f\x81%c6\x97j2v[\xf4\xebi\x92\xc3\x9c\xe3\xdd\x17\xe48\xea\xab\xe7S\xde#GU\xb9\xc0)"v<[h\x8d[\xc1\xc3\x9e`\xd3\xee\x998\xdf\xd1W\x07E;\xf8\xe8\x8e\x82R\x81\xfe{\xbd\xe2H\xdanF]o\xa6t7<\xd6\x8c\x02oHV\xadM\xea\xad\x14\xf3\xe05\xb7\xbf\x8e\x90\xfc2\x08\xdfo\x06\x95\xe1\xac=\xd3\x15n\t\x00*\xb4\x92x)\xce\x8d\xb4C}\x8bu\xb9\xb1i\xa6dMx\x12c\xef\x04q\xf2%\rzk\xfa\xc6~\x85\xf2l\xe3\xdb\x16\x02\xc2\x98\xcf\xfd\xaa\xe8\xb7\x12\xed\xae-P\xb0\xcdBf\x1fT\x17\xa8\x08\xc9\x04\x164\xea{\xf6>K\xe3|\xa1w\xc1\x99\x17\'\xce\xee\xe7\xf4A\x85\xfbE^\xdf\xdf\xda\x90g\xaeU@\x01\x81\xc5\xf6/D\xb5E}\x92"\xbbYc\xe9Og:p\x8b\xcf,Wp*\x8fU\x9a\xb5\xe3uoh\xe1\x9ab\xa7M\xa8\xa9\xc4\xb5BJo\x9e_\xda\x8a\xf0\xe7x\xae\x89P\x1fn\xfc\xdf\xe4\xe6\xef\xab\xd6U\xe4\xf5\xaf\xa8\x0fk\x94,NI\x0eC\xd23\xb4T|\xed\xd5W\xb0\xf8\xa2\xd1\x1a\xb6a\xceq\xcd\xa4\x83\xbcZ\xa8\xe7\x91\xa1L|\xb7$\x1ap\xc9\x07\x06\xe4\x10\xfc`\xde\xe9\x10\xa5v9\x80W\xb3\x8a\x8f\xc0\xee\xbb\xd1\x1fjS\xd1I\xe4\xf0\x1d\xe4\xcd\xab\xdd\xcaq\x83\xba\xf7\x95\xd0\'5\\\xc3EX\x7fG\x97fb\x01U?>1^m(fu\x06*A\xb2\x83\xa6ml\xeca\xafl\x83 \xdehc\x12\xbd\x13zR\xcdD\xad\x0e*\xbf\x96\x1b\xec\x1b\xa1\xd3\xbb\x18 OY\xa4\xc9\xa7\xfc;\x96_\x074\r\xddf\xb4\x87)\xb8\xb8\x87\x82_\xa3\xb6\xfc.\x16|\xafb5\xd4\x1fV\xfd\xf8KIL\x9bT\x95\x7f\x87\x08\xbc\x0b\xa9\x9d5\x05\x05\xe9k\xb2hb\x9d\xd4\xac5\x1aN\x9fzhC\xae\xa8r\xed\xef$_\xcd\xf8O+Jr-z\xd0^,\xcb\xdf\xd2)\xae\xb4Yw(\xb6b \xdb\xa9\x02\xb31\xbb\x0b\x920x\x0e\x98\xec\xebK\xcc%\xd5\xc5\xf5!a\x0e\xafD.\xf7\xb1\x80C\x18\xd0\x86q\x14\xddB=\xe7F\x08\xfd\xb1\x8b\xd3\xbbnQ\xe3\x9c\x07\xd8\xc9\xaa\xd8\xaf\x97\xed\xb2\x97+#w\xb3\x00\t\xa5\x9d\xdb\xe4\xa2\xf5\n\xda\x15h\xca\xb5b\xa2?\x9by\x17\xdf\xe4\xdc(1\'\xd7\xfc\r\x9f\xa7p\xb0\x8f"\x16/#\x18\xccg\xe5\x15\x05zj\x00y\xc3\x80\x85\xee\xf6\x8c\xf9\xcd\xa9\xfcS1|g\x03\x92rYM\xa7;\x04e\xd5\xd4\x13\xf2Qa\x8c\xad\xc0J\x9c\xc2\r\xd41V\xdd\xff\xdd!\x19\x89\x88\xbcD\x86\xc4\x04P\x0b/\xa2\xc6\x067\xea\x87\x00\xa6\xab*\x01\xabc\xe0\x1d2zz\xa2\xd0i!\x10\x93.\x7f<\xec\xaaZ\x9d\xdb\xcd\x800\xe7^\x19`(\xe7\x8et\x96\xfa\xdb\x00\xa4*\xac\x02\xecrw\xa0(\xac)A\x05n\x0f\x10\x1dU+K\x86\x18\x06.\x017\xb3\xb7T+\x17\xd0\x81\xe0)\xc0\xe16\xf2\x11\x95\xa7\t\xa1\x87\x98E\xea\xfd\xce\xe7\x08T\xd4y\xf0\xd4\x01o"\xa3\x8b~$C\xa9\xb2\xc8\x8d\x95E\xb2\xae\xdbt|\xf0\x169f\xe1\xaf;0x|n%\x95\xdb9\xc5\xbe\xbf\xa5\xf1\xe3\xd9h\x94q\n\x00\xeeC<\xfc\x06\xf9\xbf\xc8\x00MYU\xb38\xda]\ns\xda\\OSw\x12\xa9*\xbdU\xb0\x1c\x87{\xb8Z\xd7\x1a\x96K\x19\xec\xc7\xc4\x01\x82\xa9\x0c\x80\x91\x0el\xa8\xa4/\xc4v\xfc\xbbK}2\xbe\xcb\x884\x1bx*v^\\WZ=\x0e\xf3\x9b\xda\xbb\x18t\x0f~_\x98[\xe9\xe0\xa8r\x08\xe5;\xbd\xea\x0f\x0f\xb4U\xa9t\xeaV\x85\xcc6\xcb\xcb\xed\x14\x7f\xca6\xc9\xe2E\x92e\xe2\xa7\xf0\xcdk\xb3f_W\xd6\xba,2\xf6\x80E.\x95\xe9\x9f\x8e(\xf2\x05\x10\xa2\xe2\x16Q\xf2\x89\x93g\x9b\x91\xbdrv\xcb\xdc\xaa&\xcbZXo\xbc)\x8b\x99\x88/\xa1\xf5\xee\xec\x05A\xeaq{\xfb\xcbQ~!q\x19\x85\xb4\xed\x12\x03\xa1X\x93\xe1\xc1\xea|4\xd5\n2\xf9\x8c\xa5\xf3\n\xd3\\\x1a{|\xc4\xa3\xf38G\x0eB\xb4]*(d\x1e9sU1\xa9\xec\x96^\xd2\x9b@\x8a,6O\x04\x1c\x15\xb2\x0e>Zsn\xfb\xea\xda\xb6\xb1H\x03D\xe8\x9e\x9a\x8bJ\x9f\r4v\xb4\xec>\x98\x92 \x1f}\xb1\x96\xc3l\xc4\xd9z\x95\x12\xab\xf3nT\xe9\xee\xd4\xe2\xf5j>4\xbc\x97Ev~\xcb\xf2I\x93\x80+\x94.5\xc5\xf5\x17l|\xe3R\xc9\x7f\xa8\x14\xd4\x1a\xdf\x99\xc9\x82\x88I !$\xc2\r\x86\x99\x80#\xd6\x9b\xe4\x03\x82\x18P\xb1c>LY\x12\\\xdf*\x8c\xd2P*\xb9\xae\xba\xd2]\x9eHwM\x02\xf72\x85\xa3\xd6 \xc2\xaea\xeb@k \x8d\xd9wU\x9a\xb4\xc0\x99g\xb2\xc1\x8fe\xe5=\xfa\xaa\xa0\x19\xaf\xff\x9bV\xbe\x0f\xf4\xc8\xa6\xc9\xcd)\x0cW\xd2\x8c\xd9\x81\x05\xaeC\x08\x13\x1b\x95\xfcl\x8f\x12\xb3t\xb2\x9b!\xafV\xa2\xb4\xf7=\xf8s#\xe6\xe9\xb1E\x9485\xcb\xae\xeb\xd3\xe1\'\r\xa2\xc8\x80\xf2a\x99%"\xf5\x06\x1d\xccx\xff\xe4\x82x\x05\'\xd6d\x12\xc3\xb3(\xde\x03\xf3M\xbf\x03\\F\x8a\xb1\xec\x07\xc3b\x17\xcc\xcc\xf7\xc6\x94\xf4j<\r\x980\xa9\xf2\xa8\xbd\xdd\xe3\x9b\xac#v\xd6?e[\'\x9a\x99\xefB\x9f\xd1\xad\xe1-\x8a\xc6\x8cb\xf6\xb9\x1a\xac\x82\r\x86\xfa\xa9\xb4I7\x16~_z:y\xdc\x7f\x15\xf6\x9eAl\xae\x9f\x7f\xbd\x0b\xc2wd\xcd\\\xc54=Q\xa19\xd3\x10eU]\xc8hPu\xb6\x14^=\xeaS\xea\xc0\xb9\xb5\xef\x0f\r\xf7\xb7h\x11l\x12\xaa\xb23\xe3]&\xc0\x01\x97\xae\xa5\xe9\xf2N\x89\xae\x18\xa8 \x05~\x95\xaep\x9e\xc9OI\xa8\x91\xfa7\xb0\xbd\x86\xbd.\x81\xea\xbb\x08\xaeys\xd2H\x15\x1a\x9fq;]\x9d\xa6\xc6Z\xad_n\x8ej\xee\xd2<\xc0\xf9\xe8Hz\xa8C\x029\xea\xd2\xe2\xf4\xbf\xa5\xd4h\xcd}\xaf(\x83\xe4F2\xb5\xfa\xce\xd2\x8dOD:\xa9\xe8k\x98I>\xc3\x08\x02\xbc\x94\x91\x02\xb3\xc6\xbe\xf2\xcb\xf5ye:\xe0\xb3}\x0c+\x11<}S\x87\x07\xba-\x85n~Io\x9fY\x9f\xac\xd2\xdc\x06N\x9d(9y\x92\x06\xc4\x8c\x075\xedk)\xd0V0\x195\x83=Y\x9b\x03\x80sE%\xa2\r\x93\xceq\xb8(My\xfaU\x03\xa0\x0bf$\xe2Y\x15\xdf\xb6\xff-\x18f\x03\x87\xbf\x93fB\xfd&\xbc3\xff:\x13O\x1d\xd7)\xa8^\x82\\\xb5\xcd\x04\xc5#\x7f\xce!\xdf\xdf#\xc89g%\xd4\x97\xcf\xacX-\x99\x00D|$p\x8f>\xed\x96\xd4\xdb+\x02\x9e\n:\x9bJ\x1e\xa87\x9d\xd8\x0fX\xa3F\xab\xf1\xc0\xf4\xe6\xd1\xaa`\x85F\xb2\xc7.(,v^\xb7]}\xb2:b\xff\xab\xeb\x05\x92\x8f\xdf\x9c6\xd2M%fA;v\x96\x9b\x19\xc7\x102\x0b\xb6V\xf0\xa6s8\xde\r\xedE\x9c\'gI\x12\xd9\xf7,\x01\xc9{2\xeb\xba7\xf6\xe1\xda\x8c\x121\x08"\x166xq\x1f\x85\xdbA\xbf\x7f\x0c\x1f\xddGc\xb4\xbb\\&\xad\x8b\x81\x96PwlG\\\xcd.\x11\x7f\t\xc9\t\x9a)Qg\xd7\xfd\xde\xeb\xc3\xf1\\\xdfm\xc2PG r\xa6\x0b\xb0\x92\xd9\xd1\xfd*\xf9\xcb+\xc0\x86\xee\xcc\x1a\xe2\xe3\x91\x8c\xc3\x98\xfeFW\xb0\xb4cz2\x88\x8d\xfbG\xca\x96\xa5\xbc\x86\x95\x7f\xe3\x80\xbf~\xb5\x86\x08\xc7\xa9\x06:e!d\x12\xc5\xb2[\x0f\xf4\xa4\xd1\x12\x0e\xb8s\xed]\x8e\x93\xee\xfc\x90\xf1\xcc8T\x1f\xa9\x1eA\xb3\x0fA\x90\xae#\xe9[\xd0\xf95\xa1\xf1\xdeZ(+-\xa4W\x8eB\xc8\xd2IIY(<:\xda\xc1\xbdf\xf5\x05T\x1a\xe1\xacF\xb3%%\xa2\x87G0\xf4I\xdd[\xdfe\xef\x08\xc3\xdf\x9f\x00\x0fQ\x1e\xf1\xb5\xa0\xc68\xf2\xcf\xf9<d\xd8\xc9\x9e\x92\xf8uc\xee>\xc6\xc7\xaa\x90\xb4\x1d\x88\x01\rN\xb1\xed\xd2\xaf\xba\xd3\xa0\xf9ZY\xd8?u >rb#O\x0e/\xd2n\x9d\xaf\xfe\x11\xe1\xaa\xf3y\x84C\xde\x9f\x8b\x12C]u\x86\x85\x7f\x8fP\xad\xe0c\x86\xbe6\x03\xde\xcd\xa5\x8c.#o\xafmk\xb0\xd8\xd3\xd4:\xf2\xae\xe3\x1d\x18\x81\xbe\xe7\xb80\xae\x19\xdf\x1c\xae\xa6\x9c\xaby\xa3+E\xae{8\x13\x93\x1e\xa8\x11\x9f\xa7\x87ytmx\xb8w+[v>\x18[\xb1\xeaD\x90\xd1\xa2\x82\x91l^pw\xd5yW\xb5 \xa8O\xfb\x00i<G\xe2\x19z\x03\xb6\xae\xdd\x0f\xc1\xdd\xa0"\x07d\xdb\x99F\x0b\'""\xffkw\xc5\xe8%\x94s\xcdm>\xba\x80\x1a:X\xf0\xcc`\x10\x1a\x8d\x02\xcd\xaf#\x08\x93\x91K{\x8f\x11\xe8\x95\xc3n1\xf3\x0f_7\xa5\x1f\xfc\xb7\xd8\xc9\x08\x90}\xc3\xa0\x826\x95!\x97p\xb2|\xf4*q\x0e\xc2\xe2\xdd\xe4\xbdSU\xbf\x80\xf0{\x8d\xe7^\xe1m\x19\xc1\x8aq\xe3<\xec\t\xa6\xcf\xaa6Q\xa3CO\xc3\xbd\x88\xb040\xd8\\\xa6\xd3\xfc\xf6\xbd\x93\x85vW=\xac\x18x\xd4\\\xbd\xf4\xd48i\xfd-\xc1\xc2\x9d\x18\x13\xf9`\x07v\xb9^\x8f\xdd\xf4\xa0{\xd77_`\x95\x9b\x17M\xbe\x07\x1bI.\xa9\xb2\xfd\x15\xec\xb9\xd3\x92z@e\xdfs5\xf3\xe33\xaa1n\r\xaaNX\x88S\xbb\xdes\xbeK\x11\xfc\xb6\xed)!T\xa1\xf5\x9d\xae7\xcf\x83\x0e%\xbf\xf0CF\xfc\x8c\xae\xce\xe1\xa8\x99\xc8\xe8a\x94\xc4\x83Y\xb9\xb3\xf9\x90\x9a1d\xb7E\x08\x1fq\x8b\xe4\xb2HX\x8f\x96\'\xc7?\xdf1f\xdf\xd7Y\x18\x03\xecEsE1\x7f\xcd\xf5")\xc6\x92\xb64 o\xc7jc\x14\xab\x91\xf9\x19C\x06\x0cS\x0c\xe5\x9a\xe0w@q\xae+\xc4\x98@\xf3\x9d9d\x0e\x93\x9eWdf\x80\xc8\x8av\x8f; IE\xdbDJ\x89\xb6\xe1]\x17\xb9&+\x89k[\xe0E>\x97\x0c\xbe\xa6FD\xee\xe6\rj\x8e\xd7Su\x8d\xad}o\x92s9]q\xac\xbe\xcb\xe6N<\x06\x82\xd7\x9d\xc95\x94=&q\x97bQ\xb3s\x02\x8ak\x18\xf5\x8a"y\xa3x\x95\xd4hIA\x00\xeb\xe3}O\x00\x92\x90\x15_\xe8z{O\xa0\xebj\xa9-I\xede\x17\x0bI\xda\xb8E\xcb\x98\xa6\x9d\x8c\x16U\x8f0\x9d\x9c\'j*\x80Yd\xac\x91\xee\xa6!\xb2t\x94\xb9-M\xe28\xfe\x00kv\x87M6D\xca\xeeE\xdc\x939\x18\xb1\x86"J\xacTZ\xd4Y\xa4\\{\x082K\xd1\xad\xfb:Q\xd9\x8b\x18\x04\xc0\x94\x03e\xd2B3\x18\xbc:D\xc8\x88\x80\xaf\xed\x14\xfbfd\xce\x19\x9b*E\x81z\x19\x00\x0f\xcf\xa5\xbb-h\xacb\x01\x89\xe1\xe9K\xc4\x8fj\xef\xe4\xc9[\xd7p\xdd\x8d\xff\x99\xd0\xee\xa0\x82\x82\xa6+]u\x08\xe3\xc08z\xa3\x98D][S\xa4\xde\x8c~\x8cf\xbcxW\x92\xac\x18B\xd4\xa4\x88`Q\xa0j8\x08\x8b\xfd\xa6\xd92\xa8=\x1f\x0e|\x9bM\xb65KV\xd4S\xc5x\x9c\xbfe\xc6\xa0\xf0;YTz\x825-#\xe9Pp\x84z\x92\xd9\x1b)8X%/\x10"&\xf1\xb0\x0b\x00\xa8\xe1l\xd9\xd0\x80Z\t\xf1\xd0H\t\x10_\xf3\xa8\x9fxh\xf0\x0f\x17 \xc47\x8c\x12\x82\xb3\xf0\x1c\xd8\xac\xaa\x04\x14\x88\xab\x96g \xa9\xba\xc9\xbe\xfex\x12vT\xed\x9a\x8a\xbaHO\x8dqk;\xb9m\x92\x08\x9c\xc5\xff\xaf\xaf\xebPD\x98\xd5Uw\xf1\xa2\x01\xfcX\xfdA\xf1S\xe9-\xe2i\xd5\x073E\x1bY\xb4\xe2\xd4\xa7;\xd3\x95m\xe8\x83\xd3\x18\xf7U\xd2\xf2\x1b\x01\xe2\xb7\xa3si\x8b\xcc\xac4O"\xf8rHr\xc6\xca\x82\xbaWN\xc09\x19AMV<5\xc5sk\x06\x07\xe4{\xf5P\xe9\xe07\x95\xe4\xe2?\x7fe\x06\x13o\xa5\x97\x98f\xe9wM\x1f!\xd6MV\xd6\x0b\xf2\x1d2\x84\xa6\xe0V\xec\xeb:\xe7N\x97\xd4\xbc-\xaa\xda\xd3\xc4\xa6G4\x17\x81~\xa5\xbd{+~`\xd5\xa7\xf83\x05\xdf\xac\x14&\xd1\x9c8Q~\xe7t\xc8[\xbc&J/G\x1a\x05\xa9\xa0\xb9\xc4\xbf\x11\x17t!\x9cB\xd2\xba4\xdd\x11\x9c#52\xfbF\x97"M\x0f\xbe\xd8+j\x96\xfd\xf8\x1eR\x96\x00Z(\xb3\x84X\xb1\x8f\xbb\xcdh\x9e\xc2\x9a\xf4a[\xc5\xd8\\\x8d\xde\xb4\xd1oR\x18\xcd\xaa\xd4z\xf1E\xf2\xc2\xec\x07\xdc\xc5\x93"|\xca\x04%7J\xf1<Q\x1e?\x0c\xd6\x98\xecB\xd8\t\x98\xbf\xc0l\xd0\x1b\xb6\xc0I\xe3\x88\xb8\x98\xbb\x88\xf4$\x8d\xcf\xde\x9b=\xd0F]\'\x9a\xc1\xf3%~\x19}\x17\xa4p\xb9\x17\xb8\xef3\x916\xc3\xf0(KT\x8b\xb2\xe1\xa7h\x18\xd0,\xfe\xd7I7k/\x16\x0c\x18\xe0\xc6\xc23\xe5\xaa\x0c\x8e\xfeIK\x87joV\xe1M\xb3";\x89\xdf\xd810\xc7\xd4\xa7e\xb2hU\x00N\x19\x8a\xeex\xa4\xe9XsY\xe8>Ig2\x8f\xf0\x9e1P\xc1\x15\xd1\x17Q\xf1\xadmp;\xb4\xff\x01?\x1e\xfa\xfd-z\x9aK\x19\x0e(\x9f\xd1\xac:~\xb8\xa4\'\xe3\xe2\xc1\x18{\xc5j\xda\x0f\xe9\xe0\xb0\xd5\xc7a1,\x8d\xf9b\xc7\xc3zg\x85\xd9[\x85\x9fb\xffL\xe2c\'\xbe\xad\xe3?Q\xda\t`&\xaey\x0b\xc8/\xbd#\x00\x7f\x9f\xe2\xff\xf0\xc2\xe0?\x16Z\xc7\x972(\xc3|\xe55UfG\xa7\x9e\x1cX\x9c\xf6\xbf[\xe5\xb0$\xcbV[-.\xe9\xbc>\xde6\xf3\xd7\xf8\x17\x81\xaf\xab,\xf3\xa9\x17\xe8\x8at\xb3[\xfa\xf3,pC,\xc8\xf6)I,M\x96\x18\xbd\xb3\t\xa3\x9a\xee(}\xb9.\xd8\xde\xc8Zk\xbb\xd0t\x1a\xa6\xff\xf8\x12$&z\x12>\xb1<\x03\xa7\x7ff\xfb\x12(\xb7\xd2\x02vHs6gEOK\x98\xdc\xce\xaf9.\x01\r\x92\x15\x14\xa0*6\x1c4\x82b\x9b+>\xa4g\xde\x85\xca\xb1\x02\xa5\xd9\xeay\xb5U\x10Q\x08\x7fb,\x84lD\xec\x01.\x8d v\x0eG\xc2\x96\x85\x81\xe9!\xb7\xfb\xca\xcf\x97.\x0fj\x05B9\xc9p~\xe0\xe6\xcbq^\x89)w]\xddS\xb2/d1A\x11^\x88\xe6\xed\x8b9\x14\x9a\xf7vv 8\x99(;I\xb6\x11\x83\xbf!+^|\xc8\x19\xf7\xeb\xbd:\xb3[\xd8K\xfb\x97\x13\x9fT\x04\xdb\xdc\xa2\x96;\x7f\xbd\x07qT1\xda\x82\xd4\xcdvo`\xdc\xcb"\xb1rI\x10&\x0f\xc2\xa4\x82:\xfd\x80aS\xd0\xe3\x98\xc3\xe2\x96\x9d\xbb.\x02\x94\xad\xe7\x98\xafP\x1a\xb5w\x9eO@o\xa1\xc6\xfb)q\x05M\xdf6V\x89\x84\xb7?\xf0\x18\x13?\xc4q\xe1Y\xd4\xf3\x8b\x9aE\x0b\x05b\xe8\xb41t\x8fJ*\xfa\x92\x18v\xa2\x97M\xe4S\xb2^\x8a *\x1ds\x03qC\x18(\xc7:\xcf\x91\xd2\x97,bJ\xc7\xce\xa0\xfb\x02\x04\x9e\x1cw\xc6,\x98\x14\xf5\t\xebt>\xb0\xfe\xcdQ\xba+\x03[\x03\xc3\x03b\x9a\x80Ub\x14\xdfN1\x82\xfa \xf8\x19\x8f?3j\xc1\x88\xea9\x87_\xc16<\x8b\x1f\xa13\x7fq7\x99\xf5\xd0\xed\x8a\xd2\xfa2Y\x0f\xd6\xd3\xa1\xad\x19\x1b@\xc6\xc1\xdf%\xdbd\xe2\xd3O\xb7\xfd\x9b\xef\xabT\xf3J]^*\xecj%\xef(\xad\xa7\xd0a\xc5LJ\xc0[\xba~K\x86B\x8by\xbd\xed\x98\xf2G\x98\xf7\xd8\xbb\x15\xcc\x11OS\x1as\xe5ZN\x1bZ\x94\x10\xb9\xdfo\xdf=\'\x1a\x8aYz\xc1r\xe4\x06\x17\x1f\xe3\xe63\xdf\xcd\x0caJ\xc9\x1a=J\x81"\x96A\xdf\xb5^\x06\x05teL\x02\xd12\x9618U\x0cT\xf7\xef\xde\x99\xe1$2\xb0\xc0a5j\x00Qs\xc5\xcd_\xe1k\x9ay^\xf3\r4\x12\x8f\x92\x8e^6\xcf\x84\x1bK\xec\x9f\xb8\x80Y\xb3\xb6\xde\x9b\x0b\xa4\xe7\xc4\xfe\xc6U\xf3\xe8\xbd2\xbd2\\E\x9b\xda\xbc/\xe1\x0bt\xf5\xb7}\x12\xbbU\x8a\xa3\xdc\xf4\x93\xfe\xc9\xf3-\xd1\xe6U\xdd\xe5\xe8\x1e\x9c\xbb\x90\xf5xIp\xd6\xa1\xd7\xb0J\xe1\x95"\xc3\x0f\xb5\xec\xdb=y\xa3\xbf\xec*\xa1H\xa6\xfe.z\xc69\x9a\x84nn\xc13\xf4\xe3\x92\xc3\xde\x9a\xef\x8f\x1c\xcd\x10K\xc7(\xf6\xe0\xdd\x99\x89r\xbf\x9f\x9e/\xc8\xae\x02\\\x93\x98\xb1&\xb2\xe0jh\x94[]j%\x1f\xf2\xb0\xa3\xe7\x1a:eN\x94\xca\xf6\x17mM\x8e\xdb\x1d\xe7v`\x07\x01M\x1e\xa4y\x8fv\x92I\xc4\x08\x98F67\\\x10\xb9)\xdd\xe9\xbe\x0c\xcf1\x02T\x8a\x9d\xed\xec`\xc3\'\x7fq\x80\xd1\xbf\x8fZ \xa8\xf6\xdcw%\xedA\x9di\x9ba\xb1\x89\xcdUOc\x10\xc8\x85\xfey\x04l\xd3:\x95\xe4\x00H!\xe4\xad*\xd8\xfb\x03\x01C\x9f\xa4\'\x0b8\xc3\x10h1\x0c\xb8\x05%\xb6\xe8.s\xa0\x05<\xc0Q\xa2\x14\xaf]\x97(:\x19\xd1\xe3\x1b7\xa1\x140\xc5\xc7D\xb7Z\xa36\x92\x9bU\x013HA9\x94\xae\xf7\x1f\xc3\x97\xb7~\x91\x01\x87\x84>md\xef[\xd8_|6\x1a[%\xe5~\xc9?\x95\xa6\x94\xbc/\xe8\x0b\x0bNT \x8dl.\\\xfd\xcc\xe3\x83\xd0CFs\x16t\xdc\x99o_\x98\xc9\xd3\xbae\x7f\xa4\xf1\x11h\x86\xf8\xa1\xf8C\x1b\x0e~$o\xf3\xcfp\x12\x9b\x15r\x05\xeam\x8f8\xfd\xe3;,\xdf\x92\xb9\xdb\xcd\xa5\xa6\xd7\xf5~6\xa6\x8cR&\xc5(\xdc\x89\xea\xbe\x08\xbb\xfa%\xf9\xf8];\xa4\xc7\xfdi\x9a/\xaaT\xcd\xff\xe2\xa5\xc7\x11KYe\x1e\x89uS\x17!\x07\xdd\xe7\xfb\x0f\x8aP\x13\x02!\xdc\xb6\x15\xaaS\xd5\xcd\xc3D\xe5\xab\x1d\x08\xb2k\xc9\xd6\x86q\xe6\x88H\xae=\xce\xeco \xffY<\xc0i\xf5s\x17\xf13/9\xdbP\xce\xca\x10!}\xd4T\x93F%\xa04\xf9\xb5\\\xc8B\x843\xf8\x82\xe7LG\n5\x9foF&\xbdc\x1ea\xdd \xf8\x95\x00b("\xae\xb1\x93fp\x17\'\xbe9\x11!\x8b>\x85\x04<\n\x9b\xb9\x8a\xe0\x08\xff\x19\x0f\x8a\xd0\xf1V\t\xbf\x9a\xf7%\xdewh\xe5\xb9/\x90\x18\xa5:\xd7\x04\x14!\xe3\xb2\x0b\xed\xc6\xe3\xefZ]\xf3\xf8\x87)\xb4o&<6\xad\xa3\xc5\xeb\xf4\xe6\x8c2\xffs\x14\x1f\x86\x92\xc3^\x83\xff\xc7\xfd\xd2\x97\x9d\x94c&\x12M\xb7\xdfBM\xb1\x1d(\xe2\x01\xf2C\xcc\x00\x0e@\xaa\xbc\x95\xe4/\xd9\xb7\x0c\xbf \x07\x7f\x93lWx-\x9e\xfb\x9f9pi?i"\xcd7\xd0o\'U\xce\xff\x92C\x1a9\xd5\xec\xf6\xaf\x97M\xc4\x11\x1d\xbb\x0e\x18\xd6y*p\xcb\xc2\x00\xc0\xe0?\xce\x95\x81%-k}X@\xd1\xc6\x1a\xe2;\xe5\xc8K\xf3\x1dU.\xc7\x14\x87\x15\xa1\xb9\xd8\xc4\xb7i\x90\x8c\xf0\xa6\xdcs\xe2\xd4-\xa3y-c\xbb\xd5\x94\xe5\x9d\xd9\xaf\xa5c\x87\x90p\xf4\xf8?\xa6[)\xb1\xc47#\xb2\x93\xc0$\x13M\xbfUg\x9b<y\x1fc\xd7\x07\xfc,0\x14\xa3O\xc5;0\x89\x05N\xc0L\xeb\x8b\xdbo\xbcj\x02\xfc\x81\xf3\x18"<|Y\xbd9\xab\xd03\x1aK\x05I\xe1V\xa3\x1a\xb0\xf8\xd9\xead\xe4\xba(5\xb2\xba\x9arT\x98\x8c\xdcw\x92gc\x17z\x022\x91\xa6ps\xf7\xc2\xbc\x1a\xd7kb\xb1+\xe0\x141\xcf+\xd8"\xad\xdd\x92Q\x92@\x12\xc4\x90\xa1\xe6]\xfb\xc9\x91\xb15\x9c\x92\xec|3(\xa02w\xed\xf14\xc6?\xb3\xdd\n\xf5\x82.\x12c\xebg\x99V\xd4\x9a\xf6\x9e0\xb2B\x93M\x91\x81\x18\r!\xcby[>\xfb\xa1\xb7*C0\xbex\x88<ZN.E\xdc\xfd\x88d\x92\xcf\x96\x0fx\x0b\xa7\x89e\xc7\x85\xdf\xe6oh\x90\x1f!\x10\xbe\x80\xb8\x95\x03\xb8\xda\x98\xceyc\x94\xe5c\xdd"`I\xc3\xba[\xef~(gj\x91S\x1f=\xa0\x141\xd5\xa1\xca2\x89\xcc\xa97z\xbe\xferu\x80s\x07Y_\xb2\x1a\xb2\xd3\x92~,(\xe2j@r\xc6&\xcbts\xf8t\xf4\xcd\xa7\xfe\xce\x012\xfc\x9a\xb6y\xfb\x14U\xd0\xcf\x12\xbb\xd7\xe4\xd6N\xc7Re\x90\x86\xe0s\xb4\x06')
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-08T16:23:31.309825
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfe\x0c\x00\x00\x12\t\x04\x00\xb9R|X\xf09]\xa2{\x13\xedh\x82\xa3\xf7;\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xf4\xec\xf2SI\t\xf7t\xb3m\xa9m\x9b\x03%\xab\xbe\xce`\xddx1.\xf7\x973+\xcb\x1d4\xe6E\xc7\xdb\xf9\x90\xfb#*\x0f1\xd9\xd9DK7\x01\x8d\xc4?\xbb\xf1\xa7\xac\x06\xe5aL\xbd\x86X"\x8b\x92W\xfe\'\x0bR\xc2\x1c\xd8\xd3S\xa1\xd3\xcf\xdd\xc1M^\xf3\xde9\x0c\x8d\xe6\xf4\x9a\xe4\x9b\xfa\x861\xce1\xc2\x17\x10>D/\xf4.\xdcD\xee;\xfa<\x99\x87\xd2\x95\xfe\xbc\xc9\xbcC\xf7U\x10!m\xba\x05\xe6\xb05\xeb\xe8Cu\x82\xf7,&\xb6~9|\x9d\xd0\xcd\x93eN/\xaa\tV\xd0\x1c\x95*a\x05DH:E\x85\x07\xb4\x8a\x05\xfe\x9c\xe02\xf6\x03\xbai\x1drW\xb4\xc4^G\x90\xaa\tm\xc5\xf9\x0e\xa7\xd9\xb6\x85Qt\xea\x01\xea?\r<k\xafX\xdc\x8e\xed\r?\xbfy\x8a\x8eZ\x05v\x8d#\xd5\xa2\xeey:\x02\xab\x98\xe0S\xeco1\x1b\'g -};\xd3d\xce_\xfe\xe8\x12\xaa\xf8_g/(\xacN\xa8\xc5\xcb\xb7\x1b\xaa\xbd\xc0&\xe0\xf55b\xcb\xa9\x03\x8b\x1c\xb1@\x1fpO{\xc4\xef\xf6\x02\xce\xbbT\xed\xb3hl\xf4\x1f\x06u\x9d\xa5\xb6\x17\xd3t\x86^\xcd\xee\x8a\xae^\xb2@\x10 \xb3\xe6\x92\x06O\x96\xd3\x92\xab\xb7^\x9d\x98\x0c\xed\x1cK\xf2=\xc0,z\xc8?\xb1\x8e\xdf\xb7\x07\xed\xa4\xf0\xc0lU}t\x0e\xa0\xd6\xa5\xc3\t46\x98%hYBnp\x90\xa6f"\xdc\xb8-\xa0\r\x9b\xcf\xd6\x1f801\xac+#)\xa3\xe3c\xe1\xafZ\x913\t8\xbf\x8e\xe1\x9cq#\x0c\xf2\xeec\x9d\xcbT_\xb7,N\x02%\x1a\xb3\xf94f}\x8a>\x9d}4op\xe6hj\xc1,\xba\x1d\xbf^\x8eu\xab\xd1\\\xfbh\xd1\xe2\x95\xe5\xf0\xdf\x9cn\xdc\x11\x91A\xa2\xeb\xb5\xfd\x9e\x0c\xfb\xbb\xad\xe9\xd0\xa0\x1e\xa5\xfa\x9f#\xa7\xe6\xda\xb4LkO\xbf\xe8\x7fR\xa1\x90\x89h\xad+\x87\x00(\x98\xae\xfd\x0c\x9d\xc6Ur\xf6\x92!\x85\n\xb5E\x84\xbd\x02\xf1ls\xcb#\x8eAwHS\xba\x1a\xd4t\xc8\xc6\xaaL,\xd4}\xa5\xc8O\xcd\x97\xe1\xb8O\x99G\xa3e0\x9d\xcf\x0b(\xfb\x92\x98\xff5v\x17\xcc{\x9b\x9e\x96\'\xf1\xfdF>\xf5\x80\xe6\xbb\xf7w\x16i>t\x00\x9c\x88\xceBN{\x1b\xd7y\x9f\x82\xe1\x17\x11*7^\xd0\xb2\x8f\xb6\xeb\x12b\xdc\xdc\xd3&\x17\x12\xef\x07\xf4\xb3`\xe3\xedg\x91\xb4|)\xfa\xc1\xfa\xbd\xed\xb4\x177\x95\xde\x0cF\xd56\nZ\xb1\x8e\x88/ \xa9\xd0J$`p\x1eg\xabVF\xe1\x82\x9c\x05[7?\xe8\xc2\xe2\xc9\x04\xc2\xc4\x91\xf8\xb3\xe3\x9a\xb6\xfb\xa7\xfan\xd7 P\x9b8a\xad \xe4\xd6\xea\xeb\xc2\xa3\xd5\xcc{\x1f\xb0b+-l\xc8wX\xc7\xa0d\r!\x02\xec\xad\xb4\xcc"~_0\x11\xfcx\x80\xa4C\xed\x99\xab/\xda\xaf\xc0\xf2"\x99\xec3f\xda\t\x11\x85\xcc\x19IL\xe7\xcd\xf0\x86\x1d\x12\xdb\xc8\xcd,\xdc\xc2\xa9\x8f\x9b\x18\xc1g\x91\xc1w\xda\x8f}\xaa\x0f\xf3\x06\xd6\xe4\xfb\xc2U~[\xc7:b\xa1\xf7SE\xb6\xf15\xae}Y\xb6V\xf5\xcek\xb1\xeb1dZ\n\x0b\xd5\xd4\xb8b\x18\x17\xf8\xb8\xff\x12\x0f~\x89\x8b\x13K\xa9\xf8\xb3\x8f\x18\xed\xf2\x97i\xef\xb9\xee.\xd8\x88+Z\xc2)\x97\\H%<.\x89/\x89a\xf6\xb7\x1a\xeb\x0fW\x1f \x83\x82\x02\x97\x8e\x87\x02\'\xa0\xe6M\xf1\xa3\x04wz\xc6\xa0g6\xb7\xd7\xe5\xf4\x82\xcaI\x1dt\xd2\xec+\x1f|\x00\xa5\xc1\xe2\xde\xf8\x8a\x03>\x04>nE\x18\x93gHQz\xb5\xd0\xddQ\x18dK\xf2\x1e\x95^\x0f\x11\xdc,\xfcv\x1eHR\xe8\xec\xf0O\xcf\xe5\\Ev\x15\xb5\xb0B?\xeb\xb9=\xbbR\xcf\xad)\xfc\xf5\x0f\'\x06"HA\x94\x05\xc1\xfbA)\xdf\xa6\x80\xb0\xd6\x92\xd53\x82\xdf\xde\x82\xbf8\x8f\xd2\xae]N\xe7#I\x99fSW\x7f8k3]\xb2~\x97\xd1\x07\xc96\xdb\xf3\xc7\xcd~\x96:\xc0}\xaa\x96/b,\xe8:h\xea\x07\xf7\xf5\xb9\xf4g*\x06\xa6\x1f\x12DE=KK\xec_\x9d\xecY\xa54\'\xe8\x9aI\xc3\xa3V\x1a\xd9\xf8bk5\xa5\x15N\xa7\tGd\x81\xcc9\xa6piH\xe1e\xee)\xb7\x90\x93\x13\xdc(\xc0\xdezy\xd7\x05\x88\xb8v{L*7\xacw\xbf\xc4\x958\xbc\xb1\xb5\x8e\xe6!\xac\x13\xd8{^\x81\xf0\xf2\xc5\xa6e\x83\x9f\x02\x83Z\xeb[/\x9eZ\x18+\x82\xb8\xd1i \xa0Y?\xb5\xc5\xd1\xa0e\xb3[Qa\x94\x84">\x9c\xb6\x15\x8b{\xd3\x80\xf7\xba\x1f\x90\x182\x92\x9d5F\x7fLW\xfb\xb6\xe5S\xa3\xbc\xa0zY\xd7Jk%\n\xc6\xe2\xc2\x85\xf9\xfa+\xce\x1d\xd0\xc0>\x98\x89=p\xe1\x12\x08\x8fQ\xc9X$\xcc/Y\xbb\x14\xf34t\xfe:\x08\xca\xe0\xa3E\x93\xb1\xea\xc5p\xaa\xeabu=\x0f5X\x9f\xe4\x08T\xb8\xa0>\xa2\xad\xca\xa3\x1da\x1f\x8e\xbb\xfdE\x07\xa9}\xd4\xc5\xff#4\xadGlk\x178C\x81\xa8\x93.\xbc\xe7\xf2\x12H;\x14\xd5b%K\xa4eNe\x9b\n\xc8}\xdd\x8d\xa1x\x99\xfd\xc3\x90\x9d\x0bHY=\xb5\x0f\xc5\xc7\xecc\x90\xccFz\xdb#\xb7\xdd\xd6)\xaf\xe04hX\xfb\x9b\xc5*\x98-\xd3\xed\xa8H\x94o\xb9M\xc6\x8d\xd4\xb8\xd7\xf8\xfeH\x9e+\x82\xcdIf\xa3A\x93\x04\xc40\xdd\xa5\x0e{\x8d#\xdc\xc4\x17\x11\x8c\xb6L\xfer,M3FZ\xb8_V\xa4\xa9\x1c+\xa9\xaaL\xfaV\xf8:\xe4\x14L\x99\x01%\t&\x0c\xf0A\xa3a\x18z(I\xa0d\x92\x08\xe0Vg\xd2_>\xbepb\xed\xa2\x8d#\x86x\xe0\x15 f\x08\x90\x9d\xea\x1cXW\xac\x8a\xbd\xbd\xe0\x0e\x94\xcb\x1a\x8e\xc2\xdbb\xa3\tV\x9cb\x00M\x17\x98\x0c;>g\xd5\xb8\xaa\r\xb2\xcd~\xcf\x82\xab\x02E\x17\x12\xd6j\x82\xb6 I\xd3G\xe1\xe2\xa5\x95\t\x15}\xd6\xb4o#\xfb\xc8\xa4\x96\xef\x86\x110\x93\xf5\xedag\x1f\xb7\x05\x00\xdd\x18\x91\x936\x98\xe4I\x8c\xc6\xe4\xb1\xd0B\xf5\x13fI9\'\xff\xacS\xe4\x93\xca>\xed\xd7\xf7\x97\xa5\xf6U\x04\xbd\xd0$\xd6\xc8\xe7\xef\xf4\x8d^,vJ\xdd\x0eg\xbd\x11N\x15\xf8\x91[;\xc1!M)\x12\xb9\x81\x17d\x17\xcby\x08^\x80p\x9a\x05\x1a\xa7\'\x1f99\xfbtp:\xb5 V\'\x1c\xb8\xaf1ZL\xfb\x83l\x0c\xa1\x01\x0en\xa98C\xc9\xec\xbe\x1e\xfb\xd1(\x91\xad\x0c\xd7\xc7\xb3C\x0c7\xcd\xc0\xf8\xd2\xff\xe6R\x9d00\xfeP(\xa9U\x96\xdf\x99\x136Z!\xeb\xb3\xa5!\x8c\xb8\xac\x9e(LD\xe9\xca&\xd08\x07H\xd3o\x87\xaa\x1aB\x11\x9c\x87\xf8\x01a\t\xca\x00m\x9f\rI\xd8\xaf\xb3\xd65uzj\xd4-\x19\xf4\xe8\xd6\xe3\x8c\x84J\x98X\xd5\xa5\xfbi\xf33\xb3\x05e\xb3\xa6\x80^\x08\xe4\xe1\x8fC\x82\x11\xaa\x8e\x058\x98\xba2\xee\xdd\xfbJ1*\xc9n\xb7N\xa9\xb6[\xd3\x9d\xa72\xb6\xe8\xae\xa5\xaf?\x98\xfe\xe0]\xa8\xef\xf4\x9fT\xd6\xc6Bu\x95\x19\xbaAY\x85\x9e\x96\xbd@\tG\x88r8\x0f\xa4\xccB\xeb\xddG"\xae\xe2n\x8c r\xd9\x1b\xc4\\&\xea6\xf3\xb3\x05\'\xfa\x9c\x11\x84\xcf\x85$\x8aD\xda\xa9\xb4\xa7\xcf \xd2W\x03*\x1d\x88*\xc7Q$\x03i\x133\x89\xbf5\x0bZ\xbd\xc4\xf3CdD\x7f\x86c\x82\xac\x0b\xed\xcd*8\xc5S_P\xb1\xaeKe\x87\xa3g\xf4\x19\xa5\x0fm\xa7?#\xddB(\xc0\x82\xec$?]L\xafH~\xc6\x95\xedR\xf8sI\x0fR\x8d\x16\xcd\xd1\xed\x9e\x17-*\xcb7\x1b\x9e\xa7\x9d\x17A\xac\x83\x97\xf7\x99\xc6\x14\xe5Ul\xcc\x03\x1f\x8c\xbc\xdc1h\xeaVM\xf6\xe0T\xd6I\x93jx\x9e\xe6\xec\xa0\xa309v\xa7{\x87\xc7\x98V\x9bS\x8er\xd2\xf6\xd6\xb0\xf2\xe3_S#\x8c\xba\xaa\xec\xa8\xa1[\x15\x91>\r\x03\xb4\xb7\x02\xc4|d\xb5^K6~%k\xba\xf8K\x12[\x1b\x910ez\x13\xdc\xc3I\x1d\x95"V\xc6\x1a\x1f\xc7\xd3/\x1b\xec"\xc6\xd6\x121\xd0C\xa7\xf9\xd6\x10<\xafP\xa7;h\xd1\x83\xae\\v\xe6\n\xe2\xc7\xe8\x84!E\xc2r\x86=)\xd8d\x97\xd7\x1c\x1b\x17\x03N\xfb\xe40\t]\x17\x1d\xcaFf\x1aEN\x85\xfdD_\x1e\xcd\x89\x04\xda(\x9b\xc2\x93\x89"\xd0\x80\xe6\xb2\xc1%*)+\xc7\x16?=\x9b\x9a\x18\x82\xf2\x17\xf65p\xb8\xbd\xe8\xa7\xbf%\x10\xe8\xd5\xdbz\xfb\xcd\x14\x1d\x06\x149\xfbY\x19\x08%~\xae=\xae\xeepz\x00\xcb\x18\xaf-\x10\xed\xebb\xf3qr\xee]\xf5.\xee\xb3h\xb1\x03\x1aP\x97\xe3_ y\x10s\xf6\xfa\xde\xb9\xdc\xf8`Z\x03\xa1\xf5\xb9\xbcq\x93\x04\xd2lH\xc7\xba\xd9t\xdb\xca=\x0c\x16\xb3\x96\xe1\x01Pu/=\xbe$-\xec\xae\x93\x99Vc\xb7\xbd\xd7;\x86\xf0\x00\xdd\xfc\xd9\xc8\xf3\xb6p\x9c\xd9\t\x90\xc2\xc06L\x10\x05\x89\nA\x82_\xf8R\x02\x7f\x0f\x9f\xaf\xc8\xeb?\xed\xcddx\xfb\xd1\x89\x82\x00[\xd5\x0c[X\x88`4(/{\x05\xabc\x98D4\x95\x95\x81\x7f\xd0d\xf2\xdd\x9fKi\xc0\xc9+r\xb9\xed\xd5\x14\x9f\xc8\xf5\x93\xf8b`\xa5\xc8\xcbH\xebw\x8d\xbb]A\xe0\x8a\x12z\xde+\xaf\xe3\xf0\xe1|\xf9\x9c\x9c\xee\xee\xfb\x82\xaa\xa7\x00)n\xaf9\xf5\xb9K\t\r*\x03\x9d\xf9Y\x8f\xd3\xb6@R\xce9,\xd5\x8fLUA\xc1C\xfas\xa2f\x94\xe4v\xd5\xc4\x80\x89\x86Vwj\x7f\xd6\x8b\xb3N^\xe0\x9d\xd0\xc0\x08\xc1\xb2=x\x05<x\xf1\x08\xfdX\x0c\xc0\x85!\x18\x12\x0c\x8ev\xc6\x81\xb8^\x88g1\xc4\t\x89sr\x95\xdf\x03Z\x88x\x16\xa9\xf9N\x8fV+\\\xc4|\xf29\x1f\xbbA\x83\x13\xfd\t\x1c\x80\xf3\x8c\xb2\xe7\x99\x1c\xd6\r3L\x80\xad\xacnJ\xd9\xd2\xb1\xbb\x93_U=tr9F1Mlt\xc6\xa08\xee\tH{\xa9\x8bq\x04\xf9\xe8>=\x9a\xb4\xfe\x1d\xa6\xa9\xfc\xf5\xee\x00\xd5N\xe4\x97\xb6\x840\xb3u4.\xaf\xe2\x9a\x81-\x1e\x04O\xd5!YD\x80\x8f\xd4c\x9c:\xcc\\+@h\x02id\xcd\xe1\x1e\xc8\x90\xe9\x13\x8a\xe1y\x94/\xc9\xea\xb6\x18\xc4p\xbf\xa8\xc2\xda:\xd1\xe1a\x8e\xd50\xa7\xd3\x1a{\xc4\x91\xa3C~-\x7f\x8c\xb1\x18(3\xc2\x84ve\xea\xa2\x08#\x08N\x1bJ\xf6g\x00\x00\xff\x8f\xcf\xd6#\x12T\xca\x17\xb5\xdd`\x19l\x94R\x81\xc2\xa3_2\xe7m\x19\x1b%\xbd\x13\x16\xebfik{\x02E\xb7wb\x17\xb7\x8f\x83\x81\xe5b:5\xb7\xf7\xa3\r6\xf6aQ\xa72\xc4\xc8\xef\x9e>Ws:\x91]\xcd\x83\xd1\xb1\xfa]\xacbm\x02\xc7\x8a4Da\xe7 \x83\x15\xf4t\xeee\xa6"\x10\xce\x15\xbe\xdc1\x87j\xc1%\xa5s\xdb`Q+\x7fv\xedp\xffk\xe3\xfb\xa8\xb5o\xddV\xbe\x054\x8c\xa6\xa0\x12\xbf\xb3!\x81\x01Z\x16[\x98\xbb\x0f\x19\x8e\xa6$\xbe\xf6\xd0i\x19\x12 \x0f\x0c\xbe\xff\xf3\xa7@\x865\xfa\xebZ"\x9f1\xa2\xb9L\x90e*\xd4\xd8z\xcb=\x91\x87\xdeOi\x0c2^"\x99\xc6]a\xe4\xb6\x90^\xc0T2\xa7\x8a\xf1\x9d,-\x19\xa4\xba\xd3\x86:\x8d\x1a\xffw\xbf\x00Q]X8\xe7\x13\x13`\x13\xb8\xcf3<\x81\xbd\xc6>?6\xf6\xaf\x02\xa5\x82s\x87\xe6\x94\xfdqK:\xce\x9e\x01l\x01d\x89\xc2\x04\x90\x9a\xff L\x10\xf4\x1d\x17\xd4\xe0\x99\xaf\xdf#\xe3!\xfbG\x02\xeehu\x15\xb0]\x13\x1f\xcc6\x91\t\xc7\xd0\x93K\xc0\x9d\xbe\x8e\xf5W\xc2\x18\x04b\nd\x15`\x9c\xad\xa1)\xfd\xfb\xc0,z\xb3\x8a\x84\xc8\xce\x01$\xc2\xeb\x97\xfdbx,\xc00\xeb\xcf\xfd\x84W_JLmZ\xea\x8e&\xaa\xc5\xc1V\xd0*\x89(\x85C+\x13\xeb\xb7\xc8\x0e\xa9k0\xb4u\xcc\xe16"b\xeb\xf5\x0c\xcc#\x18\r[;\x94\xe2\xe5\x08R\ro\x8f\x92\xb3\xa92B@2?\xe0\xa0\xabc@\xe44~"\xf1\xd0\x89l\x8aQb.\x03D^A\xd7r\xd0J\x1a\xf7\xf2\xfa\xeb\x03Vs\xac\xa5\x87\xea\xe1r\xe4\xaf\x99\x95>f\x9b\x0b\x16R\xa2\x0c\xcab\xccu\xeb+\xe3WS3\xba\x02\xbcBx\xedh\xa1bWg\xd5\x08\x84\xfd\x1b\xd6\xb1\xbe\x877\x85\xc79\xd5\xfdv\x9e\x141\xc0\xca\x96\xf2\xc3\x16\xbc\xf2}T\xab\x89\x0c\x9f\xe0"2\x82\xc5(\xdb\xce\xc2\x06tAi\x15\xd6\x99\x16n\x9f\xab\xef\xb0\xc7\xd8\x11F=\x90\xe7\x9b\x02r\x06H\xf2\xd1\x93\xb7\x1e/4\xf6\xaa\x84\xf3\xc2\xce\xffO\xddD\x83\xda\x17V,\xc8:T\xfd\xf6\x02\n\xb0=\x1c\xbfM\x05C\x03\xe1"\n(\xca\xb1\x15\xb2\x1b\xffJI\x1f\xb1\xa2\x01`\xdc5b;I)\x8e}\xfc\xf9y\xb8b\x0b\xb4\xdf\x88\x9a\xa3\xe5~\xd0\xdaL2\xf1\x89\xa5\x1b\xe5\xf2\x13\xc7zi\x9c\xca\xd0\xd3\xab\xfd9\xbbAr\xf7\xec\x86\xcb\xd5:\x92\x02\xd1i\x87\xb4z)b\x7f\x87D\x95r3\xaf\xb0\x15\xf7X\xed\xdc\n.\xc1o3\xa6\xecQx\xfa\xef\xa6/^\xa3\xab\x08E\x9b\x97Ee\x95\x89\xe6\x17\xf2\xf5\x06\xa1s\xf8\x0cFS[\xfd\xe4\x8ce]\xcd\xd2\xf3')
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-08T16:23:31.342461
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb7\t\x00\x00\x12\t\x04\x000L\xe69$N\xfe\xf0\xb59T\xa5EVM\x92\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xe9\xa1\xe1.\x00\x1b9\xb9F\xd0\xf9\x7fr\x15`\xf36\xb1\xcdx\xc28\xd5\xf7\xa3h\xa7\xc9\xef1U\x16z\xb0V\x995\x94\x8a6t\xd8\xdf\xf7\xe89~)0\xf6\\N\xb8\xd7\x94\xc9\x89\xac\xa0\x8cE\xafo\xf8\x7f\xf8\xab\xfaTt\x04\xd1\xc1\\\x8f\x1e\x93E\xef7\x86\x93f\t&l\xd1\x05\xdc\x1bt2\xd6W\xf1R:\xe8CY\xb7\xce\xc2R\xa8\xe1\xd5\x86\r\xc7\xc1\x08[\xaaE\r"\x07\x94\x18\x16\x96+\xbb:\x1eg\x99\xe6t\x9e\x00\xfa\x87\\1tl\xde\xa1\xfca\x1b\x01\xd87M\xd1\xa6\xf8\xe4\x7f:l\xa6tp y\xe1\x8ff"\x88\x05\x8a5\x97^;aAL\xe0\xb1\x99\x8e+\x01\xc5\x9a\xb9\x94p\x14K}\xe1\xd1q\x8b\xcf\xdc\x8c\xbb\xdf\xe6&\x14\xd9\xaa\xf3\xf2Yh\x8fe\x93\x04:;\x0b\xeb\xd0\x93\x166?:\xfb\xbd\xd1\x8d\xf7\xf30\xcd\xb4\xcb\x0cF\xa3\xb8~~Z\xca^\x1b\xc8\x06\x93\x9b\xbdtA\x05\x13\xef\x841\xe4\x07\xbb\x17\x9c\xba\x94\xc8e(/\xf9\xbe\x1dtCR\x9c\xe1H\xdf\x17\x9d6\xc3\x1c\xc7\x93\x1e\x98\xb8\xc4/\xce"\xd5\xcf#\xba\xf7\x15D\x10\x02\x1f\xea\xea\xa6\x92\xad1\xa0\x8f\xe52\\\xf8\xce\xcc\x01\x9a\x1e\r\x9e\x98\x0c\xf3\x80\xa2%\x9d#\x06E~\xa2@\x009)&\x9b\x99\ta\xe78\x07\xba\xc6\x93\xd8wH\x87I\xd0\x80Y\xbc\xf7\xfa\x84\xdb\ne\x93\x8c\xf4\xa2:s\xf7L\xeb\x82y\x7f\xfb\x941\x8c\x0f\xfbA\x15\xc9\xba\x87\xeb\x02v\x0c\xa7^\xdb\xb9\xa0(k\x83\xd9\xa4!\xccWkL$\x0b\xa8JPB\xe2-\t.\xb3q%\x9fT\x8ez\xec*\xeeiM\x1cF\x1ff\xd0\xc0M\x9b\x9e\xf5>a\xc8\xa7\xb4^\x8cZ\x02\x89\x99\xf1\x89\xeb\x06\x1fd\xa8\xe6\xb3\xb7\x97\xcfg\x9a\'N\xd3\x13\xd9}\x81\x0f\xc1\x9c\xf1J\xfa+\x81\x89`\x97f\x1b\x8f\xcaL]KC\xc9\x84`\xbe\x83\xe1\x1b\xc6\xdb\xd0,\xe2\x1dX\x0f\xb8\x85\xd9\x9f\x91a\xa5KG\x93)e^w(mp\xc9\x19\xebExC\xd8\xe6\nP\x88\xd40\xedm\x8d"\xb5\x16T!\xd6\x91\x87\xe3\x89\x0c\x01\xd0j\xb0\x9cwd\xa4\xd1\xa1\x8c#\xf7\xe7\xfe\x03T\xda\xd28@\x81\x08 h\xa1pcp\x80#L\xe6\xcd.\'9\x1f\x87\xfek\xf0\xb8\xd4I\xecv\\\x92.\xbb\xa5\x7f\xac\xe6\x16\x0e\x99\xd8\x06\xebR`\xe6wV\xea\x93\x922\x14\xa0\xbd\xd9r\x81\xf9\xf2\x97Qc\xa9\x0b\xa1\xda1\xea~b\x7f\x05RT\x95]<0\x9fu\xd9\xe0\xfc\x1e\x0e3\xd7\xe6w\x03+\xc5\xfa-$MA\xe6U7\x8c\x11=u\x0f+\x07\xe0\xe6\x08\x0e\xa6z\xb8\xab+\xe6\xf7\x01\x1a_;\xce\xbbL\xfe\xe4\x89\xc5\xee\xc3\x00\\&\x04\x99X\x13\x04\xe0\x89\xa0\x85\xdd<\x97\xa3\xe1\xc0\x84>\x89\x80\x18\x8aW]6{\xa2\xf8I\x98\xfcH\x01-~\x1f\xb1V\xe5\x1f\xe6\xf2\xc9\x9c\xce\xe7A\xc9y\xc1\xd3\x17\xb28\x19Q\x99w:Q\x1a\xc5\xc5:R\xac\\X\x9b\xc3\xe2\x10\xca[i3\x97\xfe~\xd4h\xca\x195nRT\x8c[\x7f\xb0i>U\x80\x1b\xb3\xb6\xad"\xfe\xf5\xa5I\xb4\xacL:\xd9\x9a\xa3\xf6\x86\x9c\x9e\r\xc7I\xaf\x9b\x95\xd3\xa3v\x93\x84\x02M\x17X3\xdf\xb9`\xd1]\xb0<_I\xd9\xd7wt\xd0\x91\xa8-\x08\xcb\xfcE\x01\xcab\x02\xc9\x18|(-\xad9\xc7\xc5\x87\xf0B\xc7\xec\x12\xc6\t{\xd2\xc6\x80\x87\x83\r4\xaa\xe9\x13`i\x99@\xd5\xe8\xd5\xd8s\xf36\x0e]\xa6\x88\xb7\xc4p0\x8cr\x84\xb4\xee\x16(:\xa28\xee\r#\xacD-\x80\xfe\xf8A\x83\xd4\x1e?\x81\x85\xa3\xfd\xd8\xe7{\r3\x7f141KX\x83\xd5`A\xc1O\xe2\xc6Gn\x89a\xee3\xb8\xb1\xd0\xca\xe9\xbb\x12\xa3.\xe5\xcd\xa7\x9a\xf6c&\xab\xeaZm\x94\x8bM\xd6|G\xe7\xea\xf9\x8c\xf6!|\x8b\xc5Q\x9f\x95\xd2\xa6\x93>\xb2\xc8\xbc\xf61\x9e\xf14\n\xb5\x8c\xdcC*t\xe9|X\x8es\x8c\x92\x08X\x90C\xb8nfk=\x9c/&\x8a\x9b\x958\xa2\x11\x8c\x82\x84\x8f)\x8979\x16\x95\xf1\x16\xfa\tC)\x97\xbaQ\xf9i\xf7\xae\x19!}\xbb\xdat\xd2\x97\xaa\x08s\xddE\xe6\x11\x16_\xb2\xebj\xd3~\xea}{\xc4]ZQ\xce\xeb\xc4@\x04#\xa1\x07\xd4?3\xb6\xbc\xfd\xc7\x0b\x19\xfc\xf1\xb9*,\x023*\xf1\x9bsfp%\xb4\x9a\x96,\xde?\xben|%\xfeUP\xd3\x8c\x16$)\x06\x04\xee\x97\x8d\x88C-\xac4\xdb\x1c&\xe5\xcc\x91\xad\x93"\x02\xf3\xe1\xd9\xd4"\xbcVZ \x02R\x81\xceqP\x8c0\x0e`\xe3/|\x1e\xe2\x01\xd3\xd8\rpa}!\x0e\xc4\xd9k6B\xddT\xacTk\xd1\x17\xc7D\xc7\xddA\x027j\xb6x\r(!KRE\x94\x1aGS\xad\x8fa<\xef\x96\xde||\xdc\xb6\xd5\x87t\x9epH\x04-\t\x19B\xfdS@\x9a\x08!\x1f\xdb\xa6n`\xc5\xa2\x7f\xa9\xa7#d\x04X\x9b\x87\x1a\x8ayCb\xac \x11i\xa6\x06\xbb\xc7\x9a\xbc\x06:(t\x95h\x0f(\x9bo[\xa6\xe0\xe5\xe9\xec\x89<GI\xf4\x88\x0b\xe3\xd9Z;\xfaO[\xa1\x9b}\xd3HuQ\x1c\x82vI$U4\xffrN\xc8\xa9\xf8\xf6\xe4\xe0\xe1e\x18\xdbum)"\xb9\'\xf4J/So\x0bI\x9b\xb2W|g\x96\xc2\xca\xdda\xe3gF\x99\xaa\x08tc Hh7)\xb3&\x13\x17\xf2\xd2\x18\xe0\x80\xf2\xa7d\xfd\x07\x9fU\xe7\x15\xc1mB\xe8q\xd6f[/\x87\xc8\x12\x94\xf6\x9b\xcd\xc1\x1c\x05\xbb\xce\x89\x07$\xb4wm\xac\xac?Es\xf0\x0f\x8d\x07w\xe2\xfa\xf3\xee\xb6\x1e\xd9\xf5\x13F\x9c\\\xf3\xba\xba\xfaYl\xb4\xbbc\x98k\x7f\x91\xdb\x04\xae l[*\xc0\xb5\xe2U\xb6\x00R\xc7W*\xa7\xce\x1f\x9c\xa3\xa7\xd9R\x12\xd7\xdc\xcc\x97\x82\xdf\xb5\xb7`J\xa2JoR\x89"\r\xa9)E?\xe0\xba9K\xbc<\xb8K\xcc$\xafV\x10\x11\xfa\xd8\xaa\xf9\x08(\x03{\xae`\x8cn\xef\x03\xfb\xb8\x89\x00\x16\x96\xa5\xda\xfd\x12\x95\xc9\x8cD\x0bg\xfe\x9b\xf9\xd4!.T\xab\xbb[\xd7\x85\xbb\r\xbbGBL\xca\xe3\x8a(\x91\x10\x04\xf1\xb79\xce\xff\x08\x7f\x15\xf4\x97\xfc\xd9|\xbd\xa8Z\n\n\xd3\x13\xc8\xba\xc4\x0f~r\xf6O$>\x05hL\xe6\xa4F\xe6\xd2\x8b\xaf5\xee\xe4\xfa\xf4\xd6{\xea\xb9`\x1cb=\xd5\x8a\xec-\x9ahz"GW\x9f\xf1un\x84\xb6\xef\x9bx\x80\xbb\x1b\xcb\xbePc\x8f\x98\xafp7\x99\xe3\xfd\xecrv\xc3So\xc8Y\xa5\x9aE?\xac\x00F\x9e\xa5\xcbn\x87\t-\xab\xb9\x03\x1d[\x06\xb3\x88\x0c\xfb;\xf18zG\x18\x1am\xa4\x16\xeeC\x04A\xc8\xa9\xa6\x06\xc8P\xa9\xaaTr\xf5(f\xc3\x19\x13\xd3\xdc#\x89\xd1\xffiIz\xac\x11\xf5\xd0\xc7\xf1\x99\x08c\x0b\x08j\xb1[\x0b\xe2R\x85\\\xd3\x02\xf9\x13W;\x8b*\xf5`\xbb\r}\n\xa0\x91\xe9\x9a \x82n:\xdd\x07?\xd6K\x1cX@\x11\r\xe2\x1f\xc5\x06\xf9E\x93\xee\x0cG\xd4\xfb\x81\x92\xa1\x0c\xa3\xc2\xe9e\xfb\xa9G\xe9n6;\x96\x05\xfd\xff\xd8\x92]$s\xb4jL\x9ftD\xdc<\x04I\xe5\xab\xbf5\x80\x04\x11:b4\xb2\xef\xd2\xf56\x0e\xd1\xff\x81\x1f\xbb\xb9b\xde\x89\xb0uj\xa4\x8d>\xb4#si\xc2p\x89#ub\xbbU\x89-\xf0\xc3$\xac\xea\x02R4C\x99\xed[\x88\xf4\xa8\x02I\x00\x07g\xfd\xf5\xfa\'\x92\t\xc8w\x16\xd7\x07E\xf4\xb3z\xaa\x99\xd0\xd8\x1c1r\xcf\x92\x10\xdc\x8a\xff\xe9D\xc3\xb5\xd2\xbc\xc7iI\x94%\x9f`\x02\x8c\x97\xda\xba\xb3z\xd4==\xdc\x0fm\x82\'\xa5F\x1a\x99\xf1\xd4\x96?\xe7\xcf\x11\xe8\x80K\x15\xcb\x86\x17\x05G\xe9\x9cA\xf7\x14\x86\xbe\xac\xc5m;\x9a4\xe9\\\xe1\xa9\xf8\xd6\xcf&"W&\xff\xc8\xc4_\xcf\xef\xa81\x12r\xca:\xeb|m^\x0c\x1c%.\x18\x10\xe7\x07\xd9\xd4\xab\xae\xee\xaa\xa9\xd5\xad\x98\x99\xac\'\x89\x00\xe0\x8e\x7f\xda\xa4\x80\xcc\x916\xeb]0\xa1\xeel\x8cm|\x96\x18\r\xc3\x87CpF\xe3\x05O\xedL@*\xacEn2\xb5\xd1\xbf8w\x89R\xdb1\x1a\xab\x16\x90\x86\xff\xd96\x1f\t\x82"\x83\xec p?\x87\x81\xefU\xb9\x92P\x04G,\xc03\xc8\xeb\x8a\xbb\x14\xa0\x94\xf7:\xc6\xd2C\x08\x86\xb3\xbb\xd9\x18N\x8c\x1a\xca\xd5U\xba[\xcaI\x13\x9d\xf1\xad\xf6\x8f\xf2\xc9\x85o\xd6\x0c\xec3\x9f\xfe~\xfb<K\x1a\xf4\xc1\x1amix:E\xff\xa6\xe0\'\x02\x1b\x88;\x9eB\x80:j\xc0}m\xf2\xd3\xdf\x01\xeb\x85"\xdd\xbb\xdbG\xd2\'\x9e\xe0\x08=\xc2T\x100w$\x0c#\x99@A\x91]\xefD\xeb(\x870\x11\xa3Q\x9d{\xbc9\x93v%K\xbf\xd9\x12<\xf2\x8b\xbf\xc2\xa6\x9fePsK\x18G\x85m0L\xdf\xb4\x93vtoS\xa9O3\x9dm\xf3\x7f,9\x86\x91\x05K\xe3\xc1\xd6\x0b\x85(mR\x03\x9c\xc8\xd7M\x165F\x99n\x83s\x13\xbd(\xeb\xd8%\x9e\xb7C\x84\x10\xde\x162\x93\xd0 \x15tZN\xbcYR\x10\xefYk\x04,X\xd0[\xae\xdd\x06\xdd\xb6%\x7f\xc8\x05\'}a\xa1\x9d\x85\x1ej\x9cJ\x90\xc8\xffz\xf3\x98`\xee\xac\xf6\xcd\xdf\xd7\x86\t\xebw+\x1b3\xeeM\x90\xe8\xa2p_\x94\x16\x94\xa9Z\'\xd6\xe2\xf3\xf8\xb1\xd5\x12\x85q&(\xc8\xfcJ\xb4\x1b\xca\xf4\xc1\x92\x0f\xcbdN\xd0J\xf3\xda2\x88m\xcf\t|\xdex`_\x82\x03\xeer\xb5\x1di\xec\xed,F\xd8s\xc3|H5\xab\'*\xcb\xcch%\xf6t\x05f\xd5^A\x06\x1a*\xf6\xe7\x12\x82l)FG\x91a\x1d\x7f\x9a\xf8tw\x8e\xc1\x12\xe7\xd1\xa9\xf8\xfa&\xd8\xf4\xdb\x94\x08w\x1e6\xec@\xcf\xe4\x1e$\xbb\xb8\x0f\xbbp\x1d\xa9E\xbbf\xaa')
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