hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-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,278 @@
1
- # 2023-04-08T16:23:20.506303
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfe0\x00\x00\x12\t\x04\x00\xd1t\x13\xbd\xd5\x8ck0f\xdb\x17\xb7\xcf\xc9\xed\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x84/\xe92\x96\xd8\x88\xb6\xc8\xfe\xefK-\x8a\x1e:7R/\xbd\x0b\xc8.\rY\xa1S\xc0E\xf0\xf6c[\xd0\xfc\x8do\xb3\xb8\xfai=\x92\xb8\x08G\x1d\xb6>\xd1\xca<\x8as\xfb\x854\x89\xacN8\xbd\xa1S<\xb7\xceK\xfc\x9f\xb2\x0f\xda\x86\xd9JR\x85bD\xe0\x14\x93\xd3(e\x9c/v\xd2\xf0\xadd\xbb\x85\x9c\xdc\xc2_I\x87\xa9\t\xe1\x03\x83(\xa1wd\x1cl\xb3\xed\x89iJ\x97\xcc\xc1V\xc4\xd1d\xbf\x0c\x03\xee\x15\x926\xde\x7fl\xe0\x9e\xe6\x00T\x10\x01\n\xb4e)\xd6j\xd8\xfdX\xdb\x97\x9c]\x06\x83`O4\xf6\xd1\x9b\xdf\xe4\x8c\xc7\x9b\x19\x83\xb2\xb2\xcca\x93\xbb7\x1d\xa8ky/\xd2\x0cEq\x9c\x90\xc9o\x1a\xc1\xb3\xb2\xd52\xae\x1f\xd8\xc6i\x89\xe5\x00\xd7\xa3\x02\x83\xbe\xce\xa7\xce\x0c\xdd\x92\xfcM\xa8iw\rLK\x85\xc8-v\x82Gu\xd5\x128\xede\x80t\xa7f.\xfd\xeed\xb4l\x0cS\x97\x87H7A\x931[\x86\x05\x93kW\xd79\x94aU\xb2-\x93\xb5\'\xa7\tE\xfef\xb2\xb6>,\x00\xa6\x83\x94\xba\x96J\xed\xba\xc7K\x91\xe21t\xad\x92\x13\x94\xca>c\xe4bZ\xc8\xbc!i\xaa}\'\xea\xf0\xab!\xfd\xf6\xec\xafU\xc5B\xdf\xc7\xb9\x80\'\x11\xc8e\xe8\xbb`\xd6(\xfa\x85\xd9\x9c\x08\xe9cP\xa1{\xf2\xab=\xfc\n\r57\r\x01`@.\xb6G>\xc3\xf4\x11\xd5\xe2\xf7$P\xc4\xbfe\xdam\xfb\x1c\xd7\xc5g\xfe*&R\xb2\x91\x0fHXv\xad@\xfc\x1b\xafW\xbcZ\x89*3\xdd\xa9\xb59\xc8X\x0c\xc02\xd2Xj\x91\xc7y\\\xe7\xcc\xfcE,\x0bb\xd0\xf8Ha\x1a\x08\x86Q\xa6pK\xf4][&c<\x88u@?\xa5\xd7D\x9c"\xf8\xc5o\xd4`\x99K\xab\xa1\r\xbb\xcf\x91\xbf+\x02\xb2$P\x19\x91\x1f\x01\x10\x1efm\xf1\x1b)\xae:2\x06\xfb\x9dB\x0b\xa2r\xc1\xd6\xd2\xd5\xe7tm\xe0E\x86*T/\xc4\x16\xdd\x9b\xc4\xd3#\xf3\x06\xc9\x1a\x05\x9e~v\'u3\xf9XT/\xa1\n\x92\xef\xb9\x89\x99uH\x9d4\x9fWm2\x025R\x0c\x0e\x90`\xed\xfa\xd6\xa7\xe3\xfc\xb6\xec\xf1\xef\xf3\x03\x17\xa1\xdf\xa8\x81\x8b\xb6\xdf\x8e\xa4\xc5\xffN\x04\x19\x8c\'}\xc2f\xc7\xd9\x1a\x0b\xbd\xfd\x9d\xfb\xc4\xaf\x1c\x87\xe0|T\x05;p\xec\xdf*/\xf8\xad_\x1a\x9b\xbah\x82\xd4F\xb39\x1b?~M2{7RE\xbeF\xf60\xd7\x95\xb6u\x8c\xd5\xf12i\xf5\x1eC\xef2S#|4\xad\xb3v\x10[0\x81\xda\xf2\x81\xa6\xe5\xb1\x01C\xaa\xbdd\xe9\x0c\x02|\xa3Z)\xc8\xcb\x1b\x1a\xdf\x02r\xf1\xc6\x81=\xb7u\xd0 \x15\xcd\xfd\xa3\xac\xf1\xc41\xe7T5\x1c\xfc\x85]\xa0\x95\xdb\x8dbP\x81p\x9cR\x99-]\x8c\xe0g\xeb2\x1eF\xe2__;\xf3x/#\xc6)\x9d\xcb_\xb3h!\x19Sn.\xadF\x86\xa7N9#\xc4L\r\xba=\x08\xe0K\xbf\x10H\xaa\xb75\xd4\xab\xbf\xe2\x9a\xc7\x13\x9a\x89\xc2+7~\xedP\xa1\xa0\x98\xee1\xbd\xea\xc1\xdf9>\xdd\x0c\x00\xb8n\xa9\x0ec\x90\x8e\xedr\x06!\x8aeA\xe3\x1b\xa7\x8f2\n\xd2\xcc{ \xdb\xd1\xf2\nK\rz\xbb\xdf\xb8\xacmj\xbf~\xa8\xe6!\xc6{\x9cg\x1db\xa1\xa47\x17\xca\xbdZ9\xbfn\xebr\xf6\x8a\xfd\xf16\xd5\x87a\xf7\xec\xb0\xa5\xe5_\x81\x0e\xdd\x10\xf6\xc5\xdc\xa1Y\xbe2\xcb1\xcd]mV\x96\xa3\xeb\xd0\x15\x87\xab`\xf5\xd6\xd09\xa7\xc5\x0e\xb8W\x96\xa1,\x9b\xe9\x12\xfa\xd8A4_;N\xe2\xf4\xaa\xa5\xfd8\xec\xbeK\xf7\xd9\xa2f\x15\xcc\xe5k x\x9a\xacv\x8e\xb1\x96\xb1Y`\xdc\xa7\xfeLX\x01j\x19B4X\xe0\xee\x12+p\\\xd7Be\xe00\xe0\xb7yE0\x9a+`\x85\xa4\xdc\x0e7u\x8f\x93\x8d\xa0\x87\x8a\xc3c\x80\xbf\x94*GXR<\x9f\xe0!\x14\x9a\xe9\x17\x0c`L)\xa8\\];\xb5D~\x82X\x0e\xbf\x7f\x10\xbe\xd6\x8c\x1d\xd6\xf4{\xc0=\x07\xc6:)\x95<\x90\xb7\t\xb4\x94T\xf6\t\xb5\xd4\xb7\xacB\xe9\x84"Y(\xa3\xa3\xe4\x0e\xee\xf5\xd1\xf4\xe9R\n\x9f\xea\xc8O\x88j5\x1ehwo*\xbfN\xfe\x10\xabo<\xc1\xbb\x83*Ig\xe4\xb71\xcd\x08\xa8\xd9S\x15ggB\x9dJ\xd7\xe1MjN\xe9:\x1b\x13\xc8;\x9f\x19\xdd\xb5\xa2i\xc1+\xb4\xe8\x1f\xef\x0b;\xcd\xa8\x92L\xcf\x1a\x07\xa2\xdfq=c\x90\x06z\xc4\x9f\x12g\x8e\xde\x1f\xe2\xc2k\xf9\xe94\xd4w\xa6\x95\xa1v\xc6\x0f\x0e\x87\xfcCQ\x06\t\xceg\xf2 \xe0\x8aA\xec\xf9\xa4T[3\xd3\xae\x93yE\x85($g\xde\x12|\xbb|%,|B<\x9c\x10\x1c\xa4\x07\xe6ji.I\x8aK\xf2\x9d\x9293\x079\xcbA\xb3J\xeaxO-\x15\x8c\x03\'xE\xaf\xb0;q\xcb\xafw\\\x1d\x1f\x8a\n\xbb\x83\xe8\x05X\xa8\xf1!Q\xfc\xdb3\xd6\n:\x15\xe2q\x92\x9e\xc0\xc6t\xe8\x1eV\xa9\xd1\xcc\x10\xc0\xfb\xe0\xedD\x9d\x1e\xec\xd8\xe2\xd6\xadV!F\x81J4)\xc9O \xf8\x8a\x01\xfe\xceD\xa5\xe5\xcf\x1f\x1c\xca>\x8aK\xbd\xef\x07\xaa\xbe\xe1\x12t\xd0\xd4\xe9Fh\x9f&\x17\xd7\x89\x12\xa2Y\xfd\xe8uK\x7f=\xe2N|\x1c\xf30Ysf\x14\x08\x1de6\x11\xb4\xa7+\xd6\xe7^\xdb\x8b\xe3\xc0\x7fL\xe39mL\xd0?\x1b\x82\xafE\xe0^v\xcb\xf1\xcaU\xe3V\xe2\xa5\xdavay|\xd3\xfas\xc9\xeb\xf4^b5\xba\xc6u\xe2\x9a\t\x02\x1bI\x1a\x9dmO=hw\x86\xa2o\xc1O\xc9\xa9\xb2l\x01\xe8\xb1\xdfn\xfdZ!\x11\x96vX\x85\xcdj\xb8!\xa0qYL}q\xae\x02\xa0\xf4s\x9f\xc1\x9e\x81\xbb\x17\xd7\xd5%e\x8789\xb8i\x8b\xdc\xf1h\xe0\x88\xd3\x05\xc5!\xa0\x81\x8f\xe8\xbaS\xc6\xa6\x16\n\x01\xfd\x08\x99:\x10\xd8\xc0\x9aa{\xb9Re\x84\xf1\x9f\xbc\xc6\xa9#\xa5>\x0b\x96\x9ef\xf8\\\xec\xa5U\x0e\xfc\x90\xa6\nU\xc0\xc5\xb0\x84\x99\xc9d\xaa\x899\xe3^||\x81\x11\x8b\x1a\xbbj}&\xd2ev\xbf\x85\xb5\xe8\x08ccU\x13p\x0f\x8d\x08\'dT\x88\xfc\xf8\xfbz\x85\x1e`\xed\x0b\xc9\x85\xa6|\xbc\xe3^\xb1\xf2\xc9I\x05\xfd2\x1dg\xe4\x1c\xf6C\x85J\xcd\x96\xda\xd5 \x10?\xdfL\x07\x1eF9\x9cDY\xb8\x85eB\x028J\x95)\xb7CGq\xd2 \xb6T\x16V\xbe\xacn!\x01G\x98m\x9d\x91+\xe2=>8\x16Hc\xb6l\xf7\xa2\xc3\xba\x04\x8cc\x97\x9f\xfa\x9c\xb8(\x10\xbcV\x8aoE\xb5\xb4*jGk\x01\x0e\x91b\xc4\x8b\x12V\xd3\x03(\xb6\\\xafmt9X\xcdz\xef\xb6J\xacj%W\xb6\x82\xc3\x95d\xc0\xbe\x9a\t%i\x1d`\xea\xf8X\xdf\xfa\xa3\xe4\x10\xe1\x07\x03\xa6,\x9f nJ\x81)\nR\xd7l>\xda\xf8X\x94\xd0\x93\x83v\x80\xf9\xd9u\xd0\xe5\xcdAe\xcdG[MRN\x88F\xdcl\xde\xb6#\xb5\xfb\xaa\x95\x04c\xfb\xa3]\xda\x83\xda\xdemU\xce5\x83w%\x92qK\xb3CT\x1c\x82\x87K\xc0\xbe5\xff\xf1\xf2r\x06\x01\xdbj\xeb<\x05\x9b\xb1\xa5&wj1\xa5\x85%&\xcc)\xe5p\xb4\x8d\x95g/\x03\xb4\x17\xd8\xea_\x08J\x80\xcd\xd7\xdf\xa7x\x1e3h9LrL\xa4\x9b\xac\xd3\xb3\x8bS\xd6\x8f\xb2\xfb\xf0\xdf\x1d\xbdt\xd5\x19_\xee\xbe\xbf<\xa0o\xf4Y\x1dU\xf1H[\x18;fP\x0f\x80"\x1b\x9b\xdeH\xa1\x85\xe6\xd4\xdf[\x1f\xf5!\xbe\xa5@X\n\xbb@\x90\x05\xea\xec\xa79x\x19\xdeU\xfc\x8c\xe4\x01D\x019\xe9\xe4\x051\x90\x05\xc1\nd\xddj\xffX]\x05\x8a\xbd=(\x18\xdd\x1b\x88HU)\x1b\x1f1lE\xa0\x8e|\x12\x0c\xf7\xe13"\x1c\x00E\xf7\xfa8O\xbd\x1b\xd3\xd1\x9bD\x91eX\xde\xae\t\xb3\xd2]\xcaf\xcdE\x15\x98\xe1\xa4\x93[\xe3\xd8@\x03\x81]:\xe1\xe8\x9b\x1c\xab\xe96\rb\x00\x8c\xf1\xbb\xbe\xb6\xdf:\x15\xd0\x9c*\xec\xf2\xaa\x1dWU}\x19\x0e\x1f\x1a\x89\xbc\x1a\x91S\xdc?\xde:g%\xb4\x8c\x1b{l\x8a\xd7\rl(;\xfe\x7f\x0bw\xd8\x80\xc1:/7w\x14\xb6\x96\xf9;\xf0\x89\xbe\xe9\x0fy\x86&R)Y\x9bM\xfcx\xbc\xd9\xe9U\x0cQS\xf1]\x0c\xa5\x98\xd3m\xfc\xfc]\x82\x03\x1a\xb9\x10\x88\x0e\xe7\xda\xcfF?do/^\xb2\xb3\x15\xe9\xaa\xea\x8f\x0cY9=\xbcd\xc9b\r=\xa4\xa0\x8f\x1a\xddOr\x15B\n\xc4\xb6\xe4MFc\xb6-\x98\x8eN8\xd8\x9aZ*\x89\xe54M\xb9\x8e,\xe2a\x91\xcf\xa7\x1av\x01\x1aC_zk~\x1b\xd9\x85\x87\x95\x80\xa5\x07\x1e\xeb\x88=a.]~\xddQ5\xba\xf8\x8e\xfbg;\x02\x87\x8f\x97\x0f~\xaf\x1b\x1a\x96\x0f\xdb\x12\x03\xd8\xed\xd8\x9a\xed$e \xaa\xb9\xddvY\xb352\x98-\xc9\xc1\xce\x86\x80\xd1\xd4*#\x1d\xfb\xab\x90\x15\x85\xdcX(\xcc\xc1|,D*\xd6n\x94\xab\x05j\x12\x00%y`597\xdd\x86\xac\xca\xacX\xfd/\x190\x96\xa6\x8b_\xd2\\\x95\xc6\x81\x81\x9e\x97\xde\x95V\x1f+N\xc30\xe9\x01c0z\t\xae#3\xc9(wO\xe7\xb46\x1f\x9cQY\xc3\xae\xc4\xef\xa8h=\xe3\xa9\xe0\xa00\xa9\x1bW@P\xcc\xd7\xe9\x07\xfa\xee\x1e+\x81t\xeas?\xba\xbf\x96\xcal\xb8\x808Sg\xaaS`\'_\xd6\x80\xab\x99R\x96\xc3\xe2;l\x15\xdc|\xdf"A\x12\x92\x82D\xe5\xd0\xd0\xbe\'\xb3\xc3\xf9Q\x8b\'~\xcb\x95S\x80\x01Uq\xeb\x8e\x01p\xc5\xeaw?\x89\xa61\x93\xed\x08\xd5\'q\xb9\xcf\xcf\x074\xc4g\xfa_8\xe7\xb2u\xb5\xce\xe4_\x7f\x80\xa9r\x07\x89;\x01)9\x0f\x8e\xfc\rA>\xaa\xee\x16WD\x06\xb2\x82\xc3ob\x84(\xbdq\xab&\xa4N]KV"\xca\xef\xc1\x99\x17\xbb\x9d\xd03Y\xa5\xc1y\x05\xa8r\xac:X\xd4\xfe\xd9)\xf6\xd4\xbf\xb7!\x9d}38!\x18\x8d\x83\x13\x1c\x8d\xbe66!PP\x12K\xd9\xea<BY.|\xb3\x99\xeb\xa4R\r\x1dw\x02+Y\x88\x82[q\x14#\t6\xc2Il\xab\x14\xd8\xf9\x01u\x8an\xe9\x14\xee~W\x8f\x8e\x08\x95\xd4X\x98*\x87\xfe\x04\xfd\xdb\x89E]\x86\xc7g\xc0}\x99\xb0c\xe2#Jv\x1a\xc9r\x88\xd6\xea\xcf\x02\xf0\xcc<\x99y\xeb\x0f\x9a\xf7:\xd8\x88\xb9\x0e\xa8QgV\xb7P\xac\xfd]\xabp\x0b3e"r<\x89\x96Ez\xc2$rK>\xb2\xeb\xffId\xae\xdbI\xaf\xacB4A\x8dt\x0f\x14A\xee\x18\xb6\x18Q\nn\xdc\x9ex.\xb5v\x08\xe5\xfd\x03\xd7\x01\xfe\xc0\xb4\x8f\x18\'j&^\xa0m\xc9\xd6\x10]\xf4\xa6{\xbeBJ\xa0\x1c\xe0R\x8e\x00\x00\x9c\xbb\x04kb\xac/\x19W\x84\xd1\x0e\xdc\x97\x00v\x89p\xe5\xb7\\\xbbB\x01\xa1\x17"6\xc86~\x01\xb4l\x80\xbd\x8f\x01\x83\xb1Ue\xa6Q\xc0oV\xb4m\xfb\n\x08^\x82u\xd2\x1d\xd1\\gM\x1cNE\x8f\x83:i\xf9NB\x88\xc8R\xec\x00\xd0%\xe2\xbe\xd0\xc8\xc7\xf1\xa2hV\xe8\xf5B\x19\xe7R-\r\x10\xd0\xf3\x06G\x9dy3f\xf0\xde\x9b\xbf\xcehc\xb6\x8e\xd4CeV\xa5\x040\x86\x7f\xdf\n\xa9\xfc\x0c\xfe\x9b\x03\xbd\x824\x9ab\xfc\xc1S\xe9l\xdc\x04\xf0\x99\x8b\r\t\'\x17Uo^\x1e\xef\xf0.k+\xfa\r\xbd\xb0\xf4<\x13v\xec\x1f\xa8#\x0c?\r\xca\x08\xcf:\xbet\xc7?\x10\x82\xc9\x82qC\xdf{\x87\xb4\xbe\xbd\x14<I?A\xdb(\xab\xa6\xed\xcc \x13\n\xb4x\xba\x16<"`\xea\xb1\xca\x88\xf8\xd1\xd2\x98\xc7_d9\xfbM\xf4NBd\x14\xc4\xd4\x99y\xcee\n\xe2\xa5@\xfb\x1a\xe3\x9b\x88O\xe6d{\x92~\x0b\x86*\x91*x\xee\x92\x82g\t,\xb6#j\xb6]\xa6n\xe5\x95n\xd0\x82\'\xe5\x86\x15z!\xe9\xdf\xbf&!RAKrLI\xb6U\x87#W\xf7\x7f\xaf\x9f\x84\x9eU\xaei\xde\xa2\x1b\xbe\n(\\\xfa\xff\xad\xc4\x89\xdc\xdf_\x89\xd7\x18s\xcc\xa71\xc2\xc7{\x85\x83{#2\x96/xLJ>\xbbi\x9c\xca9\x1c4\xf867\xef\\\x17\xd4=\'\xb3\xa4\xac\xb5^R\x04\xdb\x0bY\xdd\xb1h\xa9b\x12\x10\x8c\x90\xfc\xd4\x14>\x0b\xcf\x1fB;Lf\x91\nx\x8f\xfd\xf5\x8b\xa8C\xa5\x824\x9f\xb9\xb7@\x0cV+G\x10=\xb5Y[\xc6\xc9M\nuj\xb4\xf1n]1\x86;\xd3\x13\x9dz\x9e9T\x9e\xc7<\x9a\xd7\x88l\x11l\xc0\xe8[\x95\xbf\x91{:@\xe6B5\xd7N50\xda\xb5\x9ft\xf9\xa4\xa6\x02e\x88\x1a\x12\x07\x066\xe3\xd9\xce\x91\xb6\xd6\xe5q\x19\xca\xdaq9\xde\x1e\xd7\xa9\xbd$F`\xfb\xe1k\x9fF\xd7L\x91cK\xeb2\x10s\xd3\x1a242D\xbe4\x85\x16\x8f#\xd2\x1f\xf5\xa84\xf0\xf3*f\xe3\xdc\xdf\xa8\xd9\x01\x97\xca\xc4E\xc5\x8c\xf6h\x08\xbf\xc1\xa4\xb5\x0b\x06[=m\x82}\xc8\x98\x8d\t\xc3,\x0b\xb8\xb6\xce\xf7\x03\x89 \xdf\xb9Ja\\3N+\xc0\xf0\xf32\xdf\xba,A\x0ft\xeak\xd7\xf3u;\x87X\xbfAG-\xe09\xad\xf2.\xb1/\x06\xc5?u\x1a\xee\xcb\xfc\x9dZ\xd8\xb8+\xf3\xa3V\x1f9Y\xa58s\x94\xd2<\xb5\n\x16\xadB\x8d\xe4\x87\x8c\xa3\xb7Z\x98E\xc6\xcd\xf2\xf4d1o\xc5\xb6sW\xef\xf3\x15\x05\x8c&_\x97\xeb\xa2\xea\xda\xa8\xe38\'\x8f\xd6\x08u\x8b\x1a\xdaB"\xf5\xba\xf6\xe4.Y\x04\x1d\xe8\xe1\xbd\x8bA\xf2\xfb\x04,\x04X\x13\xdc\xea1pg\xd9\xa8a&v\xc6\xb75\xa1\nG\x9a#\xe4\xd1&|\xec\x1cy6\x12\xd1\xa2t:\xedI\x1e<18\x1757\xe0:\xa0\xb3d\x80\\\x8b\x9d}\xa4e\x83\x13\x81kV\x0f\xbe\x86\xc5\r\xa9\x97\xb8\x87m\xec\xe0#\xac\xe7\xaf\xf88\x0e\xed-\x94Z\xc2\xb1Y#!\x86\xd06EQ4\xd0S.\nJNr\xfb\xea\xdb\xe3\xa4\xc3\xba\xe8\x02\xc7c\x82rB\xe2\x10\xb0\x8c\x93i\xcd\xf3\xec\x0be\\\xb5\xbe\xd7.\x0b\x8e\xa2\xf9\xbcn\xc6\xb3+6\xe2.\xd5m\xca;\xc4\xe40\xc1\x08\xb1\x15Ac\xf1~8\x16y\x96X\xb5\x8b.\xae\xe5\x03s\x12\n0\x88\x1e\xc3\xb9\x8fZ\xef\x04\xdcX\x12U\xa1\x11\x08\x0f\x9a#\xa9\x01\x0c\x9b\x12\xa3\xe1\xe4g\x8b\x8d\x12\xc2\xe2z\x9c\xe2a\t\xf5\xccV\xb6\xceM-W_\x8e\xcc\xb5GX4\x006/t\x13n5\xa5\x88G\xb8\xe0\xfbA\xc5\x8boRl\xfc\x1fI\r\xfa\xf6szHx\xcfx\xab\xe6\x89D\xda\x0c\xa1\x97\xb3=M\xc9\xf3\x05\x84\xf2m\xf3\xcfF\r9\xc4\xe9\x02\x85\xe2\xa5Q2\x81r\xa8\xca4\xa6 Q\x1f\xdf\xfa\xe1\x96\x98Ar\x9dE\x138\x10R\xf4\x14I\xea\xf80M\xe4\xc0\x0cC\xec\xacX\x8b1\xf3~k\x11\x88\xef_\x90\xfc"\x91\xdf\xce\xd2\xc7\x84\xf3Q\xd0\x00\x17\r\x8b\x15\xb9\xf2J\xb7\xd9I\xa6\xc9-\x1e\xe8K\xe7Zi.\xd8\xdc*\x98\xb3\xe0\xf5\x01\xe9\xfcT\xa7~\x85T\xde#\xdd\xd44*\x8f\x05\x85\xab\xd0\xb5\xc5&n`l\x18\xa1\x12O\x7f\xe0\x81s\xd0,\x0e\x1fv\x9a\x8fG\x0c\xf8f\xa9\xe1\xb1\x8e%F\x08{"\xbe\xe4\x9aM\xc7\xa8&u\xce\x8fu\xc2:!,\x0e\x03\x13J\xd3\x8b\n\xb2\x92\x12\xe5}"\xb1\xca\xad\x95\xeb1\xb8\xd4\x18\x06ab\xfd\x1b\xdd\xd5\xee\xb1}\xa6N\xd6\x8b\x0c_&\xfc\xdasG]\xa3\x83\xe0\x13\x9c\x8f\xbe\xfd\x84\xc2\xba\xe3*~\xbb|\xa0\x18\x1e\xc7\xa0\xd3\x14\xa6\x19\x85/6_\xf3~K\x9c\xef\x1b7p)A\xeb\x94z\x94\x15S\x10\x9a\xadD8\xfaz\x01or\xc1\xf7\xdcm\xad\xbb\xf7\xd0;q\x92\xd5X\xe4\xb5\xb0\x99u}\x18\xa8\xf0\t\x14\x12\x90~~\x8a]W6_\x80o\xe9;3\x93\xe6J*\xc4\xff\x99\xeb\xe9\xab\xae\x8b\x97\xa8\xa6\x195(\xbf\x1d\xd3W\x8c\xc5\xa9\x16\xcf\x8a\xb3\xd1\x95\xa1:W\xa0"t\x03D\xa4\xe0c@\xe2\xd3\xd0\x1e\x0c\x15\xe5\x0f&\x86\'\xdc\xb1\x85\xcf\x0b\x0b=7L\x1cJ\xc8E\x91e\xc7\xc6\xe4\xb3s\xdaD\t\xbes\xf0\xb5\r"\x98\xdf\x86\x1c\xa4\xeb\xe2\xedv\xdd(\xb8(\xee\x03c\x85\xa6j\xcf\xeb\x02\xe4.wu5n\xb6.\xc29 \r\'Z1\x15\xf2O\x8e\xc6\x8c\xe1o\x0f\x98\x0b_\x9d\xbe\xe3\xf6\xf3:\xd3G,\xcdA\xdf\xb7\xa3V\xf1\xaf\xa7\xd9z)\xcb\xfa7\xc9\x07\x97\x11VZ\xbf@`!\x9e\x8c\xd0\xb4\x1578\x9b\xddDb\xa36U)\x1e\xc0\xd5\xac\xce\xe4\xed)w\'u\x17\xf2]}Pki\xaa\xd23\xe5\xac\xd1\xa6SE.\xb78\x8fh\x8fi\xe5\x86u\xf9\xad\xee\x07(4\xe4\xd2\xf2\xfe\x12l\x11,\xc5Z;%\x1a-\xd1J\x84&T\xfc\x13\xdej\xaexx2\xd8*\xe46\xf1\x8d\xd6<\x97#\x0e\x84Q\\\xc4\xbc(\x88[5\nT\xc8\xb3\x13"\xa8\x11\xfb\xdc\xcb\x8e\x13\x7f\xd0\xa9;\xed\x89\xeaAN_j\xb7\x8d\xbd:\xf5aS\xcf\xcb\x99\xa8\xd3\xd8I]\xef\x9d\x82\x0cw\x06\xb7\xa1\xa4w0\x07x\xf6\xca\xad(\xe2DaM/1<\x97\xfea\xd5D\x97&q\xee]G\x02Et\x9d\xd0\xb3\xd2\xf4\xe9\xef.;D\x98\xb3c\x1d\x8b\x15C \x81\x9c\xad\x17d\xee\x9e\xa20\x032;*3\x0e\xe7\x8df@\x8a\x18\xca\x10\x04\xf6\xdb\x1b!9\x9b\xf5d\xde\xd6\xb2:\x04p\x9d)>}jZ\xcb\x022\x1az\x83\xc0\x9fc\xdf;!\x85\xf4\x0e\xda\xad\xf6\xef/\xad\xaf\xcf\x1e)\x82\xffj\xb2H=~\xdf\xf3\xb1\xd8\xe4_\x91\xd4#p\x7f\x03\xab\xc9?2\x1c\xb4\xb7\x069B\xea\x88yZ\xd9-\xce\xd8`>0\x15\xfbM\x15\x92]\xa4@(\x1d\xdd\'\x84\x1f\xd3\x89\xff"\xcfwz,\r\x8cL\xa6]+{\xcd:\xdc\xa0~\xf8\xc0\xf7\xc6\xe1\xea\x1e\xad\xba\xdb\x94\xd2\xd5\tL\xcf\x16S\xe6\xb5`UN\x8cOEy$\xc2\xd8\xd9\xa7\x90w\x12\xa2\x15-\xa4\xf0_q\x95K\xd2\x91%(\x90\xf8\xd8\xb66\x81\xac\xa5H\xe2\xb0\x94\x00\xaao``c>\x9a\x89(\xe9Z$\x86\x9a\x8d%q\x81\x93\x9e\x05\x13\x16}q\x04Cu\xbb\x83\x1c\x03\x03)\nx\xcc\x07`j\x81!\xdd\xfb\xe2\xec\xadW#[\x00]\x19"X\xf8\x110\xa5\xff\x9d\x15\x83\x99\xb8u\x87\x86\xa6\x06p@\x12\xa0f\xeb\xd2\x13t\xf4@\xa0\xbd\xa6<0py\xa4\x01>\xf0q\x98b\x9a\x0c\x99\x13\x9d\xef\xff\xf9\xb9G\x93\xdb\x84M\xbfNC\xb9&\xd8\xea\x97\xb9\x95\x1c\x06 \x16}\x81~{\xaa\'\xb0\x93\xf3\xb4bI\x92/\x19\x85\xaa\xda\xbb\xf9\xbc(\xf6\x87\n^Uj7\xd6d|\xf0Y\x95\xd1\xa4\xf9\xa8m\xe60\xef\xa5\x9cJo\xadT\xbf<+\x8eS\xc0\xd6\xc2\x90[\x84\\\xc7\xa5P|1\x94:+\xea\xe8T\xdf\xe3\xda#Y\x8c\xad.\xbfJ\xd7Ct\xc2\xce\x8f\xd6:*+\rs\xfb\x1a\x9fSfj\x9fE\xda\x13\x0f^=\x1d\xf1\x99\x10 ^\xf0\xc5\xa3\xf3\xcd\xa1H\x02\xb9\xd9p\xe2\xa2\x8c\x9bGQ\x8a\x18\xc7\x81\xbc}\x86\x1a2\xb0\x9e"\xefI\x9eT\xf1y\x00/<\x1aG\xc5;.\x01\x7fd\xa0\xa1\xa9\xdbu{:\x11\xbfH\xd9\xd1M\x92\'7Wj`H9\xf8\x98Olr\xdf\\1\xdc7\xf0#\x11\xc3\xc5\xa2\xe4]\xfc^\\t\x1f\xa3\xc4X\xc9$\x07gX\x86/\xc0!\x18\xc3\x90\x15\xab\xd3"\xcckd\x1e\xf5-\xbb\x15\xd3\x8c\xda\x9d%y\xf5,R\xa0\xf6\x82\xd8\xb8b\xec\x93\xab|\xad=\xb6x\x89\xbc\x12\xf0AT-\xa9P\x9e\rv@(\x1dK\xef\xc6\x8a\xbf\x1dD\xc2+l\x9b\'\x9fH`\xa6b\x84A\xa3\xed\x93l@\xe5\xda\x88\x13\xec(er\t\xc3\xcc\x8f\xa1\xf7\x87\xbe\xa2?\xf0<\x86\x9d7h8z#\xc4\xbf\x9f\x8apiQ\x0f\x8a\x12%\xaf\xa6\r\xa6\xb8\xfc`\x0e\xa9\xa8\xf8\x14\x1egk\xdd* \x13\x1d[s\xba!\xe8Y\xb0\xae\x8aw\xea77\x9c\xf3&!7bY\xe6\x83\r\x9b+R\xdc\xcaLC\x91\x11\x9f=\xa9/w;u\x03\xed\\\x90G\xc6\x91\xd20\xb4\xcf\xb8\xd3\xbarm\xe4[\x94a\x97\x88b\xb2"\xb3p\x1e-\x87\xdd\x0fo\xea\x91\xf1)\x82\xfa!RU\r~0q\x0c\xee\xfd\xe3\xd6\xb8R1PC\xa2\x9f\x9b\x1f\xa5\x83\xef\xde]Y\xf7\xde[x\xdc\'\xeb6\x1d.\x7f\x90\xccdlY\xa2\x9f\xa6\xfd\t\x97i*f\x1b\xa7\x8eb\xf7c-\xb1\xdc\xa5&q\x81\xa4\x1cn\x13G~3\xb3\x84\xeeX~\xc7\tT\xc5\x87\x1a\xe6\x8c\xb05[\x11\xd1\xbd\xe3\xf3f4c-#\x924\x1f\xf5C\x137\xad\x91A\x00\xb5\xa8\xa7{,I\x8e\xa2\x84\x1e\xf4\xbd\xe1@\x13\xfc\x16\xf3\x08\xeb\xed\xd6IK\xfafR\xa6k\x08n\xe1\xe4\x8d\x99\xee~\xaa\xe2o\x84V{>\x9f\xf0R\xf7\xbd\x04\xf4l\xdb\x0b\x13rrOX\xc4\xfb\x9f\xd1pT\x9c\x1ca\xb5\x0c\xc8\xdf\xf1\xe7\xd1\xcc\x8f\xeb\xe3\xbb \x1f\x9e\x06\xe7\x9e=o\xbe~\xac\x16g\xc5\x92>\xb7D\xe1\x94\x1cE\xa7\xe3\x16\x10\xd2L\xcd%M\x1e\x8e\x0eel\xac\x95\x88\xcb&G*\xe8w\xa5\xaen\x84@\x0c\x1f\xe16\xd5x"\xaa\xd5B*;\xc7\xc2C\x8b\xd8J\x1e\xca\x97\x02\xe7V<S\x9e7\xd6\xa4\xde\x84\xe0\xa1\xb5\xfaE\xddp-\xc6\x80\xe3\xb8\xac\xcc\x13i\x15q\n#L4\x922*\x8a\xe2p\x9f`\xf4jz\xe0)\xd9\xc5\xa1\x9a\xe2\x17M8\x1aQ\x8f\x90\xf2\xce\xd5\x98\xfb:\x1b\x04\x08\x03\x0c\x10\xca\xaaZ\xd8D\'\xecRA\x15\xd7\xc0\x04\nx\x0c\x0eg\x80df\x0f*GR\x95(\xbbi\xee\xb6\xad\xb7\x9dL\x05\x94#\xf5x)\xbb~\x89D\xe6\x89\xc75\x1c\x1d>\xd2\xb2\xe4\x14\xb0r\xc21\xb3\xadzyw\xd9\xff\x17y\xdc"N\xc1s\x87\xbb\x84UA\xa91\xd2p\x82:\x06\x9e\x00.\x0c\x81\xea\xae9`\x19\x14;V\xe3\xa3}\xfa\x82\xbe\x9f\xb0\xf8\xb7\x03O<#Y\xa0bS\xd1*\x06\x87\xbe2\x19\xea\xc5\x16f\xaf\xe0=\x0b\x9a\x04\xcd%m?\xa3,\xdd\xf83\xac\x1c\xe6\xe65\xf4\xc8\x80\xfa\xe8\xf3\xbaz9\x05\x05\n\x8d\xfa\xac\xe1\xe8\x92\x92\x01p\xb2\x1f{\x80\xdb0\xc1\xf4\x97\xb7r\xedt\x06\x0b\xcc\xf5\xccHch\x02\xc7\xe5\xdaa\xb4\xbe0,\xb8\xb3\xd5\xd5\xffO\x90\xd7sU+\x8e!\x93\x90\n[M\x19J\xadY\x86\xe6:\xd0x\xc5\xbd@\xa6bNlt\x0f\x0f\x8e\xdb\x17r\x9e\xc1\xb1*\xdb-\xc4\xa7\xef\xa6\'\x15\xbd\xa0H\x1a>B\x89\xb5\n\xfe\xf8Z\x13fd\x85\\\xae\xady\xdd\xf5\x88\xca\xee?\n\xa3\x99\xd8\\%Y \xd0\x93\x89\x9c/5\xef\xab7y~\xa9\xea\xdc\x1b\xd2\xab\x89\x9bH\x93\xb8S\x11\xc3\xbc\xf4\xfc\xca\x87Y\xc75\xc4M\x17\xa1L\x1ag\x02\xdai\x8a\xad\n\xda\xbe\x93\xd6\xacm\xedh\x90\x98\xf4y\xfd+\xa6Id\xd4\x03s\x04Ih\xe2\xab\x19\x90\x84MW5z\x94z\xe1\x8f\xd5\xa6\xda/\x12\x02\xec\xd2\x85\xef/\x9d\x81T\xcb\xd9\xbf\xdcm\xc68[u\xa4!e\x9e@A\xab\xe8S\x90\xf2\t\x87(\xe0\x18\xc0Q`Y\x84\x84\x9a\x02\xc9\xcb\x96\x7f\xa9\x87\xe0!L\xa1\x0c\x9aS\xe9\xd3\xc9\x12T\xf29\x19K\x1e|?w_\xda\xdc\x16N\x00\xd6\x07\x1fa\xa8_\x16\xb2wl\x07\xb2\x04\xe4\xbbb\x12\xd9\x03\x96\td\x18\xaa)\xcd\xc0\xe8\x92\t\x90i\xa7\xefC\x08\xbf\xa6\xcb\'\xfdR\xcc\x8b\xd4\xd8\xa3D\xc9\xf0\xd7+)\x82\xb6\xc1\x90\xd9(G\x1a\xf5m\x8f\xc1\xbb\xd9\xee\xb3\xf8q4\xfc\xf7mRa\x9e\x93t\x1d\xa1\xc8\xb7\x9c\xc7T\xd4\xab\xdd\x11\xfeM\xe4\xab\xf8`_\xfbX;XQx\n\xed\xed\xdc\x9b\x1d\x94\xe9\xd1Z%,\xe8\xaf\xab\xb4\xed/\xfe\xc8\xac)i\xeaYE_\x94\x97J\xb7\x8f\x82\x1b\xb7\x11\xe9\xab\x82\xf7\xc8k\x8f\xca\xdc\xb8R\xdd\xb9\xc2k\xc8\xf7\x1e\xd3\xf5\xd3TA\x87\xabV<\x15\x96\xca\xc2#\x8e;\xb6\xbeH\xed\xb8(Z\xf9\x98L\xdc\xbe!\xd0f\xdd\xff9\x8e\xee\xad\x1e\x0b\x86\x87\xc1h\x8f@\xc7X]+L\x80\xea\xa6\xc5.N\xa3E\x84\x0f\xa7}\x8a\x0e2\x19>\x04\xa5\x16\xe4\x1b>\x99\xfc;c\xb5\x80\xda\xc7\x9d\x99\xd9\x12v\x9e\xf2\xa4>\\\xa0\x0c\xe9K-^\x98\xfb\x92\xf7\x94\xa8\x14\xdfr\xfb,\xd2?\x06\x7f\xfc\x80\xa3\xf8\xa4\xe3Wh[\xf7\xfcz\x97?\x1b\xe2\xee\xc9\xeaGpe\x91K\x90\xdc\x95\x99\xd6IyV\xc8*\xc7*DJP\xc6\xce\x1e\xde\xc0#\x87X\xf9@\xf4s>\x9d\x83\x94\x17\xfdk\x1dH\xe8>(\x1a\xad#)\x10\xb7\xd8\xc98\xaa\xd5]\xb4I\x87\xcf3\xd0\xb6\xfa\xdcI\xd8\xa7Z2\x14\x95\t\xd9Y\'\xe5\x00\x98\xdfhS\td\xc4\xbb\xcf>*\x17\x84\xca\x89\xe8o&\xf6\xe0\x1fAG\xa7l\xe3 4;\xc3\x8a)\xea\xfac\x80\x86\x1co\x12 vJ8\x9c\x81e\x90\x96\xbc\xf2\xbb\xd2\xc2M\x96\xf2oM\x06\xc1\xeb\\\xd6~\xa9/\xd5{\xbdH\x9fj\xdfRqv\x9c)\x8f7\xb1\t\xc8\x84Bi\x1e\xc8D\x06\xf7\xa8\xaa\xadtH\x04\xbb\x94\xf0\xb7\xf3\xb8\x11m\x17\x869\xe2\xecJ\xa2H\xac?EX\x18\xf9\xbbs\xf8\xbb\xa0\xcd!\xafo&\xb6\x8f\x95\xfa=%Q\xa2?\xee\xb5\xe5\x00\xd7\x0f\x93\x96\xe8\x03\xc7\xe8\xe5\x91\xfc\r\xc5\x8cq\xb1N\xa3\x86C\xb2\xef\xdc\xc4\xfb<\x97U\x8e\xa4\xf19\xd3\xccR\x7f.\x85\x84\xaf\xf2L=\xea2\xec%rX\x16\xb5#\x13\xcdLkm>R\xd1(\xa9\x0b$\x14\xb4V\xe8l\x13\xfe\xa3\x0e\xb8\x15\xaeN\xbc\xec\xe0\x9f>i\x87\xb2\xb2\xa5\x99\x89\xffK\xeb^\xaf$@C\t\x07;\x1b0@\x9a\xb5\xa5\xcdy\xe7\xb1\xbb\x1adV\x9e\xde\xb0\xb1\x16\r8=\xa0u,\xbc\xbe9\xaa\xb9?\x1d\xdc\x13!Ge\xc9>u\xc2V\xd1\xa1\x9cC\x1d\x9c\xcf\xb9\xfe\xa3\xdb?\x16\xba\x07\xb1J\x15>\xef\xabU\xf8\x8c\xf7\xb0\xff\x7f\xc8$v\xeb\xb8\x85\x0f\x81-\xca\x9c\x8a\xf9\x83\xba\xb9\xf9\x8d1B\xb1\xc3\x840 \x87\xb4\xe77\xf6\xd1H\x88\xcd\x8c\xffw\x18\xef\xc4X\x10x\xbas\xdc\xecl\xb0XW\x977\xad\x98gm\xf9Mh{\xf4r\x8b\xd6<\x15F\x9c=\xd8w>\x89\xa8\xa0R[G\xa6S\x97\xe8\xd6\x0b\xbb\t\xde\xd74\xa2n\x86\x04\x01\xdd8vZ\xe7\xbe\xb9\xeb^\x14\xebb\xfc\xfd\xa1\xe0\xb2\xfb\xa7\x06$\xfee\xb9,\n\xf5\xd9\x14M\xa3\x0c\xdd-\xb24\xef\x8e\x8e\xa1\x14cx"\x1e\x03kR\xa4eUC\xc0\x0bEr\x12\xf2[\xc2qDa\xeedoi\xe4\xeb8\xce:e\xceH\xdd\ts\xf7a\xd0\xadS\xc2\xfa\xdd5\xe0G\r\xe7\x9d+\x18\xf7\x9bu\xec\x06!\xa9\x85d)\rj\xa6y\xff\x8e\xd8\xaa\xf5R\xbc\x1b_(&\xe6+\x17\xed\x92.\xe0\xfayU\xe2\x1c\xc1\x06\x9e%v\x97: \x138\xa2.p\xc7@\xa0L{\xba\x9e\xc3\xa0\xad\x17V\x17\xec\x99V\xff\xec\xf5\\\xfam`\xe9\xc2\xb8?\xabR9\xa2H1\xc8\x08\xbd\x19\xa5\xcc\xd8t\x8d\x03zo%\t\xe0.wv\xc9lP\x10\xe7h\xb9\x81\x16\xe8\xbfkU\x1b\x8e\xd8\x85\xf8\xdf\r\xcf\xb3\xc7\xad\x1d\xe6\xf25\tr\xef!\xd1~\xf0\x9a5K)\xc6r\x99+D\xd6\x99\x9a4\xb1\xc7zrN\x9f<\xf9RW\xa2\xbek\x02\xba\xf6\xc6\xe7\xb3\x0f\x1db\xe9@\xba\x96T\xffI\'\xeaxr\xe9\x8b\xe0\xe3q{\x8a\xcb\xee\xb7V\x03O>\xe4\x01\x03[\xab\xf3b\x93k#y\x8e\xe9\x19\xb4\xbb\x9b\x12%\x1eZ$\x89\xc8\\\x80\x0ck\xf1c.\xd2\x0c\x85=\x99\xc1\xca\xeb\xe1\xcd\xc3\xf7~pt!\x81\xaa9\xacw\xe4\xc3J\xc0\xaf\xe8\xc2\x9c\xdfT\x006\x8e\xbc\xa2Y\xe2\x00\xd9\x1b&\x15\x9e\x1b>\xa7\xf0\x15\x12\xa6$\xbftt\x93|\x95F\xa4R\x84\xf4.\n\xea\x97\xe8\xadR)\x05r,y\xd1,`>A\xd4\x9e\x89\xa3\x0c}\xa3S-\xa4\x1e\x88m]q)\xc5\x1a#\xc9g<\x08\x9fo\xee^\xce\x94T\xd1\xd0\xafr\x17~\xb0\xfe\xa1\x97\xba>\xc6\xd5\xe6\xb8\xbeh4:\xc9K\x1c\xfa?)\x81\xb9\xbd@\x81\xad\xe2\xda\xba,\x82\x0f\xb0|Tj\xfc\x85d\xe4\x81\xfa\xf13\xd0V\xd7_\xad\x15\xbaI\xed\x972J\x94\xee\xcdq\xaa[\xf0\xce\xb3\x18\x0c\xc2\x88q\x95{\xb1@\xbc\x04R\xe6\x1e\xf3\x05\x15\xde\xf5\xcd\x9c.O)\xae\x05)\xda\xfb\x93\x8c\x04i;u\x05\x92\t\x1a\xdfx\xcc\xd1\xb2\xa9\xce\x18\xde\xbd\x03\xed\xdd\x84\xa7v\xc3\x98\xcfG\xe4)\nAH$8\xde\xcf\xbf\xb8\x0f\x87\xe4\x8e\x1a\x1f:5UkP{U\xd7J\xc28`\x81J\x98\x12-4\xf8\x1a\xceY\xef\x90o\x8a\x86F\xf1m\t\xa2-\x1b\xe2\x87\xb0\x98\xd9\xbfr\xbf]ula\x06\xf6\xc6XS\xba\x8d\x17\xf8.\xac\xe0\x0c\x1a\xbd\x97\xf5\xf0T\xa0\xf3\xb6\xb3\x85\xcf!Bi6b\xb1\xe2\x0b<\x15<\xa0H\xda\x1e\xa3\x86\xda\xe1\x8f\xd88\xcd\xc4\x9dW\xef\x1d\xbc\x03\xf6{\xd9e\xc5i\xdc\xf7\x95\xc5I\x85\xff+\xff\xf2\x03r\x93PH\tUB\xa4\xc85\x81\xd6\x8e[R\xbe\xec\x1b\x93W\x94\xea\x93X\x0b\xef\xb4r0S\x0e\x8c\xef\xc3\x05\xc8\x1dc\x8cCw\xb8\x05\xea\xbc\xc0\xfa\xebS\x85(\x86\xa0\xb2B\x84\x96.\x10\x98Sl\'d\xd7\xae\xe3ta\x93\x990Wx\xbc\xc3H\x03_S\x01\xc0h\x84\xf4\xd3p\x06\xef\x1f\xb4\xfbH\x16\x0f\x90\xecDs\xd49\xa0\xb0\xcbr\xe9\xc7\xb9V\xa7\x95\t5\xd2\xfc\xe4\x0f\x8d\xa5\xaf\x19\xfcE\xfe\x8c\x95\xcc\x1aI\x19\xaf$<\x1fA8AT^\x03\x1d\xcat\xc7\xb9\x8d\x07\xaeo\x99\xc0\xc8\x81\xa1\x90\x03\'5\r\xc2v\x1d\xac\r|\x8d\xa9\xf4\x13\xdfk\x81\x17I\xd4\xf9\xfaG\x9fi\x88K\xdf\x97\xdbw0|\xf4\xbe\x85\xd7\x0b\xcb$\xf3\xa9\n:**c\x10\x18\x80\xf7\x1a\xbe\xef\x88{\x87S\xbc=\x14J\xdf\xc1.\xc6\xa6\xb6_pb\xe0\xc6\xaa\x91\xa713\x9eO\xacZ\xf0\xc5\xb1\xd3\x7fE\xd9&\x8c6\x9a7\x10\x95g\x9e\xa5\xe7\xc5g\xc3\xb8f\xd5\x9e\x14>\xe1\xff\xb1\xe3OUE9\xe7\xa1oXE\xb5\xfc\xdf\xa5\xbe\xf2\xf4\n\x11\xd4;\xee3\xfa\x87f\xfb\xa1\xd4\x12]\x11\xb2\xca\xf6\xeaF\x9eI\xc6q]\x1f\x9d\xf6\xbf\x86\xbf1\x95\xa2\x8b\xb7pcN\xd3\xeeWf\x03\xca\xef\xc0\xd1\xb2\xbb\xdb\x10S\x03f\t\xe3\xa2\xd1\x84\xa8>\xe3\xda\xa6 \xf8 \r\x05\x04u\xca\x07R\xaa\xdd#\xf8\xdd\x03\xac\xd1g\x95\xaa]"\xdd\xa9\xb3W\x88\xd4\x8fj\x89\xed\xdb\xfc\x80\xce\'\x9e\xaaw\xa2\x1e\x13\xe2_)\'\xc6&\xcc\x18\xae\xdep\xe7\xb4\xc8\x19=\xc1\xa9\x91\xde\x00\x98B\x01u\xbd\x9d\x114\xc9W\x16\xca\xd1\xae\x8e\xbb"\xf55\x8c\xdb\xbcw\xd74\xed\xd1n\xa0\x86\xb4Ts\xb8\x91\x8ad\x1c\xd2\xfd\x01V\nu\xe5\x00\xc957\xab\xcb\xcc\xc2\xbe\xf3\x164f\xdd\xdcx\xe9T\x83&\xec$T\x01\xd7\x95\n:\x92\x1a\x87B\x1c\xf7,\xc9,%@\xadH\x05\x9b.\x1aPx[\xa0\x01\xe4p\xdbg\xb5D\x93n\xd1\'\x1b\n\xbc\x80+Q\x1e\x15\x8d\xd8\xe9tY\xd5u\x9anG\x89Ti9\x90\x9f4\x0ef\x00\x81"1hf<\xe6\xf5\xae\x8c\xc1\x1a\xab>\x86\xd4\xca\xac\xe1Zg\xed\xdb\x9a\x91\xbdRe\x0b\x9e:\x97\x1f\xfc\r\x8a\xca\x0f\xabLvI8\xa2 \xfa\xcdK\xca\x85b\xd6)*\x03\xab\xc42e\xfeG\x17B\x8d\x1aa!\xd7\xbdY\xca\xa6\xf9\xf48\x08\x11\x89\xdb\xbd\x18l\x81\xa8UU:\xac\xd2\xb6p\xc4\\\xeeI1\xc2\xc9\xdf\xce\x81\xf1\xe9h10\x07.\x8f\xa1Ix#.Nm\xf7\xe87w77\xb1\x97\xd7\xb8\x96\xfcO\xa6)\x96\x01\xcc\xfe\x87\xb5y\x0e\xff\xf0\x9579"\xe9N\x90t\x1e\xf23\xdfM\t\x1f\x1eX\x8c4\xc5\x81\xf0\xcd/x\xf5h\r]\xd9\x0c\x080n\xf3\x91\x9c\xe6G\xbdeeY\xb0\xf6\x9bH\xc4\xec\xa2\x151!n\xbf\x03\xecd\x83#\xb5`S\x0b\xf7\\ST\xfe\x89\xad\xb1|[.\x81*\x12y\xd5x\xaaR\x04\xbc\xc2sv\x0f\xfc\x81\xf1\x93,\\\x16n\xcbGf\x17S\x14\xea\xd9\xf2\x8f\xe9\x96$Y\xc2T\t\xd6\x90]\x8e\xb3\xda\xd3,\xd2L\xc0\x8a\x80\xb2&\xdc\xe4G#\xad*3L\xac_\x07\xbe\x8co#F\xbc\xe4\xd5^\xc1=\x81\x16\x9auI}\x81\xf5\xf1`(\x00\x06\x95Q\xa9\xeff~\xf0xR`\x86\xb6\xd0\xc1\xae\xf9\xd7\xfb\xa6\x0f\xee\xbe\xe6k\x19-M\xd3\x06\\\x0b\xf5\xcf\x9d\xb7\x01\xf2v\x95\xb4\x1cU\xd0a\xbeV\xe0%j\xc6\xb7\xae\x8a\x0eU\xc3[\xe2,B$\x06\t\xe9\xc4\xdd\x0b\xb8K\x88\xd9\xd3i>E\xe9H\x86\xc0\xa5\x97\xfe\x07\xe1CR\xa7E`\xb2\xb5Fm\xf9`\xceI\x8b\x86`wE\xf2\xbb\xd6R!lO\xf5\xd1\xfb*\x8f\xb7\xedQ\x90\t\x9d\xae\xde#y\x9d%F\xf0\xad\x92\xff\xa6\x8b\xf8\xc9\x9b\xbe\x9e\xb1\xabyae\xc6x\n\xc9\xe7C*\xe2\xb2\xfbG\x8c\xee#\xdf\x1cEw9U\xfa\xf7\xd2\xf1\xcc\xe8\x03w\xb2[\x12\xeb\nF\xe3c\xf7\x1b8\xd7J\xae\x95\xf6\x17(d~]Y\xfe#\xbe\xfb"\x9a\xa4(\xd28\xbe=\xccV\xa94\xc3o\xa6\xf0`\xfbt\xe6\x9d\xc3\xc73gX\x96\x85\xd8\xee\xfd\x85\x11\xab\xb3\xa9\x98\x93\x13\x7f\xdcJ\xa6s\x12Fx\xa1{\x97/\x8b\xc9\x87v\xa4\xa5\x1aM\x92\xc7\xd5\xe1\xb4\xb3\xb0\xa1\xb5\xfa>\xc1\x07=I\xd9n\xb7\xbcxY\xcb\xe5\x7fz\xcf\xb8\n\xde\x9e\xf4CM\x7f\xfb\x01\xdfd\xf0\xea[\xf5\xe3j\xff\xbd@\xac\x1e\x14\xe4 \x14\xf22&oN\x94\xb8\x03U\x98\x03N\xadIyao\t\xe0$\xd1\xe6c\x0eO\xf5{&\x8e\x12\xe9E\x9b\xb1<Lr\xe4\xa7*\xb1\x92\xab\x1a\xf3\xca#\x1f\x96\x16\xbe\xbf\xe7\x0b\xd5\x80TV\xa0\xd9f-\x8c\xc1\xb3_\x19\xee\xb3\xf3\x89\xce_~\x94\rQ\x03\x82\xf4\xac\xdd\xb9\x90\x0eK\x01\xec\x8e\xbf\x04=\xdc\xdc\xc8\x91yl\xb5\x17\x98\xedw4b\xbf\x1a\x1c:\xac\xc1\x91\xeag\x11\xb4z.\xd6\xa9k\x92;\x19@u[\x80N+\xebo\xd2\x08\x9fpE\x86O\xf7\x0b\xcb\xa5\x80\xf0\xbd\xf7WaY|[\xce\x86E\x87\xf3\xb3{\xba\x1b\x08\x1e\x9a\x97\xads\xea}Np!\xb1\xa1\x06\'\x13R\xf4\xd5mM^\x88\x02rU\x80\x95\xe9\xfe\r\xff\xdc\x92\x16\xc0\x9a\xd8\x1c\x91\x03O\xddA\xd2k\xf2rH\xf6>\xb2>\xc9\x12\x06\xb2\x9b\x84]\xbc\x10\x02\x18y\xda\x0f\xf9\xe2{\xa6\xdf\x92 9W\x8f\'\xaf~\xeb_\x1b\xd0T\xdc\x8fz*\x12\x9fN\x91e0\xbe\x8eU\x9e}\xd1bq\x15\x1d]-c\xa6s\\My\xef\x96U[\xbek8\x92\x91*J\xbbx\x93\xb0v\xc5\xdd\x86YT\x97\xc3\x8a\x18\x94\xdcc\xa0\xb1Ei\xb0\xa2\xad\x124\x06\x0f\xa3\xa2=c\xfa\xf8\xa9\x8b\xed\xcb\xb3\t\x0fd\xcb\xee\x1ebBK6 A\xa1W\x94\x16w"Z\x8e\xbc=\xc8\x13i\x0bJ\xc4\xbd\x8en\xc8\xc1\x8d\x89\xbb\x0e9\xb3\xab\xdf/\xf2\xfd?(\xe8#:\x85\xa0\xe7\xb0C\xa2\xef\xae\x0f\xb2E\xa2|\x08/\x969\xa1u\x82!\xab\x07\x1d\x87?1\xdcF\x1c\x88\x9bJ\xd9\xb4\xda\x8c\x99\xf7\xfa\xa6K\x19\'\xe8\xbbX\rQ\x17\x13\xaf\xb1\xa3\xa4\xee\xd4\xde\x8bGmC>\x9f\xfd\xfaCi\x0b\xb0\xb8\xb3\x7fvtF328f\x0cC\x8f\xe4ivM.\xe5\xdc\xe6\n\xec\xad\x94\x8a\x02\xd7\x7f\x1fG\x9a\xdc\x08~\xbd\x17D\xd9\xaa\x05\x15D\xa2\xb3\x8f\xfbAd\xd7\xbd\xbf\xf2J\xe9\xbb\x94\xccF@\xca\x8c"*\xb7H\xf9\xba!\xe6\x90\x17\t\x9au#!`\xf7\xcd\xb2\x06\xc7F\x83\x84\x0c?\xc3\xdb\xb9\xb7"\x063\xd4km[R\xb9jVDS&\x0f\x8eu\t\x073\xcaP\xb9\\\x84\x8b\xfe\xe1\x12\xd5\x8b\xbf\x17\'\x8b\xc1lc\xc7\x0bh\xfd\x04\xc8\'\xbb\x93\xebD\xe8\xce\xf7\xca\xea6QnsE\xf6\xf9\xbf95\xf3\x7f\x9b\x0e\xe6\xef\x7f\xb8@yzc4\xd9\xc2\xfa\xd7\x8b\x88"\xa9\xde\x01\x8a\xd5\x14\xaf2\x16\x83\x89\xdeL6\xdf\xa2\xd9v\xef\xc8Ph\xa5\xe5\xc1\x1f\xab\xb3\x8f\x06$\xcc\x16"\xfa\x9d\x0e\xc3t\xed\xc4v6\x9a;7\x14\xf2\x02BT^\xb8]A1u\xec\xba\xa3\xb2c\x9dk\xd9$\xe0.Mj\xe7\xb7P\xb7\xde\xe4SW\xab\xe2?\xac\xcc3}A\x80\xcd\t\xcb\x89\xaect\x11\xf0\xf8\xf4\x12\x9f\xad\xfd{\xe4\x1c\xfd\x9a\xcf\xe1\x11=5\xe3\x0f\xf2T\xa2\x8e\x8e\xe0(lE\x17\xf9/:\xab\xff\xc5\xcf\xb2\xa9\xe5\xcf_nu\x9a\x8d_\xe1A\x83\xd6\x95~\nXX\xf3\xa76\xd2\x0e\xf2\xf0o;\x87qdQ\x0c\x92\xaf\xd9\xf84\xec\ta\x87\xe9\x9cyI\xe9\xfd\x90\xa6\x81\xc8\xf9\xcd\xce\xe1\xc7g-\xb2L/\xa0\xe0w\x80\xdd~\xeb!V?@\xbc\xa8\xa0\x8f3\x01)a\x01\x18\xa9\x9a\xa6 \xa4"\xcc\xa0\xa7\xc1\xb4\xa5\xa2\x80\xe9\xc5\xd9\x18Vdh\xfa\xc0\x0b\xdb\xa2\xd4\xd4\xa76\xa6\xde|P\t\xa6\x9cw\xd6i\xa0&\xc6\xcb_\xce\x1b9\xf4pB\x13J\xd7\xd7\xc5\xa4\xab\x8cJ\xe3\x1e\xa9czLn\xb9\xd0\xd5\xc9MQ\xc4-\x06+\xe7\xe0\r\x85\x8d\ry\xfc\xf06\xba<\xa3\xe5\x9a\xf4w0\x95\xc8\xd1\xb0\xc8\xf8\xeb\xcb\xf6\xfc\x07\x18\x89x\xb2V\x90\xea^/\x89x:\xd6\x19\x15c!\xb6\xe9\xf5+\xe3\x9c\xe9\xf4\xf4\xaadW5/\x16|\xb0vq\xd9\xc9)|w\x1ao\xf5\xb0\x17h\x80\t\x0b\xf7\x06\x0eu\xcd\x13\x1a{a@\xb4\'\xdbN\xa1z\xe27\xe8\xda\x89\x06\\\xe6\x81\x03;\xdd\x06r\xf2\xc3\xfa\xfd\x7f\x1d\xc2\xcar[\x071`\xa6\x14\x16\xc7t\x8f\xa1\xfcs\xc1\x83\x81\xcd\xbfN\xed{h\x07E\xeee\x86a9\xfd\xdc\x03\xb5$Pj1\xe9\x94\xc7\xbbq\x93\xf8\xd0\xd8\xc7\x04B\xdd\x97\xde\xfc\xcac\xc5\xf4\xb5\xfb<5\xe0a9\x1dnEk\xb5^\x91\x02EP\x0e\xab`!\x91\x07\x014\xe3\x18\x9f\xab\xb5\xba\x85\xac\x02 \xc3\x15\x19\xf9TP-\xebj~3\xfa\xb7\x91\x9a\x9f.\xc7K\xacXt\xccJ\x9c\x87m$\x8e+\xa7\xb0\x99 }\xd8\xa7\x04\xd5\xac\xf9I\xe5O\xb3\xeb\xa2\xa78>\xb7\x92\x08\xdfk\xca\xb4\x8c\xc2H\xa9`\xdc1\x13\x9a.X\xc7\xfcs\x14\xa6\xc9\x0e\xb7\xa2\x8f\x91\xfc\x97\xb8\xa8+V\x0bd4<\xbc\xda\x11\x98\x02\x95\xf5\xedHl\x8f\xbd\xb1\xa0\xf8\x12\xb4f\x8eV\xfa\xf4}\r\x8e\x07\xeeb\x899\x92\x00x\xf7\xd1\x95>\xdb(5\xc8QK\xb1\xf8\x8c\x07\xdb\xd7\x07\xb32[\xc4\x19\xb5&!\xff\xdd\x17\xee\x87\xcc\xff\x9a\x8b\x9aM7d\x92u\xbe\xd3\x8c\xe7B\xe1\xee\xf2\x1d\x9d\x81\xd4\t\xa9\xb6\x9f\xf7\xf1\x9cn\xbc\x83CLN\xd8,\x1fQ5\xbbV\xe9\x03^\x1b\xb8\x0c>\xf7\xd2\xd0)\xce8Iu\xe8\x13\xbax\xb2\xfc\x08\xd0\xd9\xf8.}\xbej\xfc[H\xad\x0b5\xad\x86\xbe\xcb\x1bx<\xf9\xaf\xf3/~\xde\x92\xf6\x9c\xd6Po\xc7\x00\x97\xf6KzT\x15`C\xc61\x8et\x1dPm~\'$`\xdfY\xdb\x03\xb8K2\x9b:\x83\x8f\xce\x00k\xef\xc2\x81\xfd.n\x06p\xcd\'\xdaU[\x83,m\xe1p\xe1F\xb2t\x0f\xb4"\x13n\x830\xd2\'i\x14\'\xc4\xdc\x18\xf8\xaf\x1f\xa4\nR\x8fC9[\xa6\x9b\xe0)\xac\xbff\x7f\xdb\xc4\x19yw\xaa\xa5\x08\xce\xaa\xe53\x1b\xbf@\x97\x17\x99\xcf\x97\xe2 X\xd8\x80\x8bH\xf7\xb9:O=|\xeb\xaf\xcc.U;\xddG]:\xf1\x1c\xdb\xd7\xcbz\xd5n^dq\x0e\x01\xdf\xf2\x02C\xa8,]\xb2\x9e\xd0\xea\xeaG\x9fQp\x8bl\x85\xe8\xad\\\xcb\xc0\xf7-\x7f1\xfc\x9a,e6mO2\xe7\x04\xf2\xa9\n\xe3N]\\E\xa0\x8ba\x9c=\x1aaSmL\x86\xce\x9f\xe1N\xbb\xe6\x94\\t\xc3SB\xa0!\xcf\nr\xe5\xefQU\xbe\x0e\x8f\xd3(\x16J3n\xa5]cyt~\x02\xe2k\x06i~5@\xd2>\xb8a\x8d\xd9\xeeP\x01\xab\r\x83}(\xca-\xc9q\xe1\xc9\xa0\xa4\xef\x05\x1a\x9a\x1d\x99\x9a\xd0\xdfd\xcb\xed:\xac\xe2\x92`\xd1\x08\x1be\xec\xcb\xdb\x0f\xda!\xd8\xac\x96\xca\x95\x94\x80\xda\x92\x81\x17\x08\x12\xc2\xed*&,\xd6\xea2\xfcu\xea\xd1\xb4TC\xfe\xa0\x04\xa9x\xfa\x1dX\x84\xa3i\x10\xfcy\xf1ov\xaf\xc62I\x0b\xe2\xfaE\xa2\xdf\xef\xe6\xcf\xdacV\x1d\x94\x911\xd5\xcb%\xa3\xdb\x02=\xd4\x1dy\xba\xb7\xfcx\xbd1\xa0P\x9eL\x13x\x1b\xf44E\t\xf1\x82\xb2\xa1\x18I\x87\x93\x0f~\x98\xdb\x92\x9aS\xd9&\x91\x1e4o\x9e\xf3"\x9c\x9d\xa1\xfc&\xb1\xaeT\xd9=\xa2"\xd6x\xfa\x8b}k\x0c!B:\xd7\x14pV\x90gRxk7\x85\x10\xb4\xe2a3\xdf\x03\x81\xed\x06\xcf\x13\xe7\x9bE\xea\xad\xbf\x81Z\xb8\xb7\xc4\xbdb\x08\x98\xc2\xb6\x8e\x98\xb7\x97\xb4Ti\'p\x17\x8aQ\x08^iF\x87\x1f\xf5f\x0b\x115\xcaj:\xb3l\xb6\xa6t\xa5\xb3\x13!F\x9a\\|\xe2\x07\xceO\xbc\xec"\x94\xc06,\xdd\x17*\x99\xa9X\xd4GM1\xee\x12\x83F\xbf\xf8\xe3\xaf\xb6\xa0\xb3\xf0\x10N.\x97\xf0\xe3##\xd6\xa2\xa5p\x0f\xfe\x8b\xcax\xfem#\x89\xe7\xc4\xa9\x1e\x15SP]\x1a\x1b \xbb\xe5\x16\xca\xddP\xd4+`\x84T5\x93\xb5\x1c{\xd26\xde\x81@\xbd\xb6\x1d\xc5\x8c\xe1\x87\xd8-\xa8\x12\xdbsr1\xbc\xcbR\xde\xa3$8s\x81{\x06A\x85\xae3U\x15\xf3})5\xf3_\x15\xf8\xef\xeb\x9c\x84\x1a\x8e\xdd\xec0`Kh\xf0\xbbBc\xc7<\xd7\x98\x0e\x18\xf0\xb1\xd3_ i\xe5DX\xddJ:.\xdaj\xb2"\xdcs\xbf\x99\x95\xff\xa8\x13\xed\x16\xdb\x16\xd2\xaf@T\x96P\x97@\xdeO[\xc1\xae\xca\xd4\x97\xefK\xb0\x8c\xf4\x00}\xf5-"G3\xa9\x084\xd9!L)^)\xd3\'e\xaf\xa4:\xda\xe7s\x1ak\x7ff~jL#\x9c\xa4\xb7\x01a\x7f\x93\x82<\xe0S\x1c\x9a\xf8\xb5\xce-L\x80\xaf\xa9\x0e-1>\x1bL\xe4\xef\xeb\t\xb8J\x90\x9c2\x90\x10\xe3\xe0\xa1\x0f]\xa4.P\x98w/f\xa6\xd1Ru\x95\xfc\xd0\x97(a\xe2"\x8d;\xb9\x10|\xa1[\xb1\xd5~\x12\xd9hw\x8aQJ\x01\x9c\xa3\x02+\xb5\x85"Z\xb6\xef)\xbf\xe4St\xea\x85&\xdb \xab\xe6|\xaa>\x7f7\xfet\xc4q\x92\x0b\xb1{Z^\xf9\xfa\xd8yS\x98\xf2p\x13>\x1c:\xa0\xfa\xcc\xc9\xb0\xffPi\xaa\x1d=SC\xb2\xeb\xcd\xac\r\xc3\xe0.\x9c\x19x\xad/\x87\xdf\xc9\xbf\x95u\x19\xecUD\xb82`\x8e\xed2\xf8\x17[\xbc+\x0e:\xd2\xf0\x84\x92\x8b\xb2\xb6\x93A\xf2\\f\xa8\xfa\xdbn\xc8\x9f.\x950\x1e\xb7\xc2\x15\xc5\xf3\x17O\xd0)b\x19\x8f\xbc\xdf\xad\x9dd\xe5\x12\xa6\xdb-\xb8\xc3\x01\xb3\x0e\x8f&W\xb0\x16\xdf\x93\x95\xe9\xa2\xfa\x15\x862\x97\xc6G]\xa5BqW*\xb9\x00;MS\xf3\xbb\xdd\xa9DFQ8\xaa\xb4\x80\x0cQB\xe57\xd0/\x80O\xf2\xa1\xe9\x1d\xfb\x91\x08U\xe5[\x1f\x96\x9c\x02\xb6\xd6Gn3\xaeY8\xf4\x143M\xf3\x1e\x01\xbeYU\xed\xd5\x05%\x9d\xf5\xc2\xc9\x039s.y9\xb3\xefz\\\xe3\xb1\xe1\xc42\x18\xc1\x8d\xe2\x10N\xfd\x96\xcd\x18Y[H\x14\xd4x\x86X\x9e\xd4\xf9\xb4}x\xb0\xf3\x10\xbb4\xd2p{\xdf44\x01\xde\xe5\xcdMb\xc9?\x93\xfc\xd8\xafw8o\xc2v\x7f\xe6h\xf6\t\xd5\xf2\xe6?\xf9\xf8\xf2\xe4\xd0\xcf~\xca\x01\x9b\xf3\xe4\xd7<LX\xcd\x9dC\x9d\x80\xe0\xf7\n\x7f\x91,f\xf34\x19\xe8h\xe9\x81\xe8\xb6g\x1dy\x0f[GI\xf9p\x13\x14\xac|\xf8|\t\x00I\xe7\xf2\xc3\xb3\xad2\xe1kM\xcc\xbe\x14\xf1\x13\xcf\x06j\xbc\xb7\xdf\xc3\x04\xf9wr\xe4\x91c\xc1\x9a{\xad\x9c\xcd\xd6\x81\xae\x82\x85\xc6i\x7f\xf9Do\x99\xfb\xa4\x83\xd3\x91z\x9b\x84I\xca|\xcb\xe7\x8d\x00QW\xc3i\x04|H\x08c.\x8b\x06(\xd2\x15\xf9Lx\xbaA\xe0@\x8ei\x94\xce\xecj?\xee\xd9\x8c\x87\xb1[\x9d\tc\x9f\xfc\xffT\x8ee\x00\x98k\x9fV\xee\xb1\xc3\x88\xbc\xfa\x04\x91\x06\xe0%\x8b\x99a\xb6\xbb9\t\x88\xee\x91\xb8\x1f\xad\x80\x82\xe1\x16\xdc4\xf8\xc9\xdb\xd9\xb0s\x80\xc7\xb0V\x8a}m\x90\xae\x80&\xfbyo\xfe;z}\x1e\x0f\x18\x0b\xca\x1c\xa9=\xf0\x02 \xca\xeb\x06[G#3u\xfc)\n\x13\xf6\xdf\x91\xaa\xe1j;\x81\xb6n\x82\x97\x1fG\xaa\xfd\xdc\x9b!w\xf5\x1e\x9c\xd81\xfa\xbb\x93\xf7\x94m4U\xacD\xadb\x95\xed\x82\xd6\xee\x97\xdf\xab\x18o\xaf\xeau\xc3{S\x0f\x8fOd\x10\xab\xb3\xc7\x1c\xef\xed\xb7\x1a]\x86\xcb\xc0G\xc5\x7f\xe5\xf9\xd7\xafft\xf1x\x96+\xe6\x02H\xf0`\x0e\xf3B\xb8a\xc9C\xfa\x86\xd9\xdfJ\x8b\xfeA\xc3\xcd\xd9uqMM\xcb\xe9\x1f\x1c\xef\xc7\x7f\xb7E/\xd4\xa4f_\xcb\x9b"VN\xb7\xe1ve\x95)\xa1\xd3\x1fH\x9c\xde`\xf6$Q\x7fy\x14$\\\xdb\xe6v\xeeC\x16\x0f\xb0\xf9s\xc1\xd0$\x8dWV\x0c1\xd2~y\x82\xbe\xdea\xc3\xd9\x83[u\xadQR\xbb\xa7\xcb\xd6ckk\x03\xe7\xf6\x9bi\xc3\x16\x184\xce\xf7v\x106\xd1\x99\xb1\xaa\xad\x7f\x9f\xf6C\xb7Z\x7fj\x12\x12XA`\x9b\x04\x8b:\x94\xd0\xc0\xc4\\\xc9\x89\xde\xe1\x88\xf9\xbe\xebj\xe2\xc0\xddH\x08/\x83*\x14\x99Av\xe5\xbf1\x1e&\x08\xd4b\xfb\x87\xf7\x96\x00te\x17t\xae`9\xb0Y\xe9\x97\xe1\xc2\xf2\xabYV\x82R\xc0\x81\x14v\x96o\xb0X\x96\xbaw\x00\x83T\xf8\xed\xf5\xef\x18\x8c\x99\x0f\xa4P\xf2<4\xbf\x01Y\x0f,\t\xfc\x86R\xe8KO\xf4Md\xcdj\xa1\x0b\xdc0\xaf\xfa}_*l\xa3\xf0@\x988\xbbc\xed\x9bG\xd4\xe8\xf0rZ\x1c\x1c\xba\xc3\x8d\xaah\xb5\xb2\xb8K~\x87\xee\xc7IU\xc4\xb4\x00\xa4*\xf8\xd7J\x87\xd4f\xcaP\xea\x95{\xfdS\xf4k,\x10\xf7?@\xcc3\x9a\xe1\xb9*r\x80\xbbC\xccb\xbd\xa6a\xf2\x8f.X\xd8\xb8D\xd9\x9b\xf2\x91\xc6g\xbb\x04\xcc\xb6K\xa8)\xd2W\x9f\xf3\xbb\x90\xd2\xcb\xb2\xaa\xd1k{\xe2\xcc\xad\x7f\xc2\xdb\xcfW6Fr\x88\xbf\x9c\x07\x0e\xd8\xa8\xe0\x84v\xeaZe\xe3\x86\xf9\xc2\xc6L\xd27o\x8b\xd4H\xc05W\x19\x9e\xde/]\x1cg>E\x1ck\x96#\x84\x1b<\xa4$\x81\x8by:\xa5\xa1k$K\x04bU\n\x8d\x06\xb2\x84t5\xf1!jp$\nk\xff+\x86\\O{C\'\xcfU\xaa:?\xe2\xb3\xe1>\xae7\xc0\xb9\xa1\xa9k\xb0<\x03\xd7a\xc3s\xa1%\xa2T\x8e4|H\x8cf\xf6/n>\x96A\xcb\xb1\xbau\xe4\x83\xe7\x03\xde\x8e\x85\x04\xb2\x87\xe9\x94\xf9[\xd3\x03\xaa/i\n>\xc0/tj%pC\x0e\xd7\x95G\x075\xefM\xe4\xdb~-r\xcej\xe0W\xb7\xb8\x02\x82{\xcb9Uc\xa8\xcc\x13\xa2\x9f\x85\xa62\xc4}\xd5P\xde\x1b>p\xcbMBm\xcew\x0f\xcb\xdf\x94\xb8n`{\x1e\xf3M\x1e~Q\xed\xc9q\xf4\xc0k\x08\xc4Z3Q\xf9P\xbc\xa3\xbbf\x96\xd6q\xf9\x04F\x07\'T\xfa\x8a\x8e\xad22r\x90\x8e\xbejO\xf2y\xb5!\xe8\x12\x881\x8b3\nv\x08I\xd8\xc1T\x82\xb9-F!\x19\xa74\xee(;X\x91\xa8H\xf2j$\x01\xec\x8b\xecl\x14-\x07=I\x11\x8c\x19\xeaQ`\x8b\x18\\c\x87\xe54v\x1e\xd5\x8c\x9f\xcf\xa8j\\\x0e\x9a\n\xd87\x879eV\xcbzH\xb2\xe9?\xa9\x91\xf68\x8fg\x87\xe9\xede#\x1c\xec\xbb\xde\xbb\xd1M_\x98\xbaH\xea\xc6\xda\xca\xb2?\n\x10\xc5\x03\xaa\x91\'\xf8\x15Gu."\x14z\xdf\xef\xedR\x05yP\x97\xba}\x12-\x89\x94\xe1H\xdc\xd9\x82Z\x05\xab\xb9\xb6c\xcc\x04u\xa8o\x13\x1bS=\xf2\x1a\xa1?\xc4F]\x8d\xac\x1e\xe4\xa9a\xfa\xc6\x1e\x8a,<\xb6\xf7\xde\xc3"\xc6\xf6|\xe6\xaf\xd5\x82P\x07\xd1\xddQ\x10\xb2\xbb5\x99\x03\xe4*\xb5sb5@\xd2u\xe3W(\xfc\xd0"ge0\xa4E\xb1\xf0nu\xd3\xc7q\xa1\x98L\xd3a\x07g\xd8\xc9\x1c\xd4\x08\xba\x08t\xc8%\x03\xb3\xcf\xd2\x08\x90\xaa\xe0\xc2q\x01\x9f\x14\xcf\x86\x0e@\x04\x14\xd3\x9bu\xdf\xae\x10\xf0Hw.\xe0_v\xf4\x15\xf5\x81"\x05\xa4eA\xaa9\xf0x\xbf|q\x80)\xdd\xa3\xbd~\xd2\xd5\xff-)\x98VM\x1d\x8a\x9a\xaf\x10\'\x9e5\xae\xeeh\t\xa9\x82#\x98\xe6u\xabj\xfb\xa0\x01:45@\x98\xebG\xf3\xdf2(\xd0b\xcbV\x18\x92T\xb6XT9v%_\xc23\x8feD\x8co\xb8\xb4\xe5\x83q\x0e.6\xf6e\x1a\xc9]l\xad\xd7\xa8D\xf6\xdb8\xcdFp\xae*)g\xd0\xef\x987\xcc\x17S\x95Y\xcegQx\x11GyC"\x92\xcdNA$\xa3k\xd8c2g&o\x01\xb1\xee\xd5(\xa0\xc5\xf0\x98\x81A\xeem\x1c\xa5\x9a\xae\xd84/a\x05-\x01\r\xcb\xdc\xecp\xdcHY|\xdf\x8d\xa9\xd0\xcdbg\x99\xc7g\x86\xc6s\x8e\xf1\x94R\xee\x90I8\xba\x8a\xa1\xc4K5\x90\xb0Q\t\xd1\x08\x9b\xe5\x18\xc5\x85f\xdemd\xa9tP\x81u\xbcA\x97\xb5\xaf\x8cM\xa8\x87\xd2\x8e:`\x1bw9A\xea\x8c\xb3&cWOjK\xfb\x081\xcd\x8bo \x1e\xff\xe2)\xa3nX\x1d^\xa6\xee4\x87C\x97\xbe\x9f\x1a\xa4{\xc7\rcT\xfb\xd3\x15')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ import datetime
4
+ from hiddifypanel.models import *
5
+ from flask import Markup,g
6
+ from wtforms.validators import Regexp,ValidationError
7
+ import re,uuid
8
+ from hiddifypanel import xray_api
9
+ from .adminlte import AdminLTEModelView
10
+ # from gettext import gettext as _
11
+ from flask_babelex import gettext as __
12
+ from flask_babelex import lazy_gettext as _
13
+
14
+
15
+
16
+ from hiddifypanel.panel import hiddify,custom_widgets
17
+ from hiddifypanel.panel.hiddify import flash
18
+ from wtforms.fields import StringField
19
+ from flask_bootstrap import SwitchField
20
+ class UserAdmin(AdminLTEModelView):
21
+ column_sortable_list=["name","current_usage_GB",'mode',"remaining_days","comment",'last_online',"uuid",'remaining_days']
22
+ column_searchable_list=[("uuid"),"name"]
23
+ column_list = ["name","UserLinks","current_usage_GB","remaining_days","comment",'last_online','mode',"uuid"]
24
+ form_extra_fields = {
25
+ 'reset_days': SwitchField(_("Reset package days")),
26
+ 'reset_usage': SwitchField(_("Reset package usage")),
27
+ 'disable_user': SwitchField(_("Disable User"))
28
+ }
29
+ list_template = 'model/user_list.html'
30
+ form_excluded_columns=['monthly','last_online','expiry_time','last_reset_time','current_usage_GB','start_date']
31
+ page_size=50
32
+ # edit_modal=True
33
+ # create_modal=True
34
+ # column_display_pk = True
35
+ # can_export = True
36
+ # form_overrides = dict(monthly=SwitchField)
37
+ form_overrides = dict(start_date=custom_widgets.DaysLeftField)
38
+
39
+ # form_overrides = dict(expiry_time=custom_widgets.DaysLeftField,last_reset_time=custom_widgets.LastResetField)
40
+ form_widget_args={
41
+ 'current_usage_GB':{'min':'0'} ,
42
+ 'usage_limit_GB':{'min':'0'} ,
43
+
44
+ }
45
+ form_args = {
46
+ 'uuid': {
47
+ 'validators': [Regexp(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',message=__("Should be a valid uuid"))]
48
+ # 'label': 'First Name',
49
+ # 'validators': [required()]
50
+ }
51
+ # ,
52
+ # 'expiry_time':{
53
+ # "":'%Y-%m-%d'
54
+ # }
55
+ }
56
+ # column_labels={'uuid':_("user.UUID")}
57
+ # column_filters=["uuid","name","usage_limit_GB",'monthly',"current_usage_GB","start_date"]
58
+
59
+ column_labels={
60
+ "Actions":_("actions"),
61
+ "name": _("user.name"),
62
+ "UserLinks":_("user.user_links"),
63
+ "usage_limit_GB":_("user.usage_limit_GB"),
64
+ "monthly":_("Reset every month"),
65
+ "mode":_("Mode"),
66
+ "current_usage_GB":_("user.current_usage_GB"),
67
+ "start_date":_("Start Date"),
68
+ "remaining_days":_("user.expiry_time"),
69
+ "last_reset_time":_("user.last_reset_time"),
70
+ "uuid":_("user.UUID"),
71
+ "comment":_("Note"),
72
+ 'last_online':_('Last Online'),
73
+ "package_days":_('Package Days'),
74
+
75
+ }
76
+ # can_set_page_size=True
77
+
78
+ def search_placeholder(self):
79
+ return f"{_('search')} {_('user.UUID')} {_('user.name')}"
80
+ # def get_column_name(self,field):
81
+ # return "x"
82
+ # return column_labels[field]
83
+ column_descriptions = dict(
84
+ # name=_'just for remembering',
85
+ # usage_limit_GB="in GB",
86
+ # current_usage_GB="in GB"
87
+ comment=_("Add some text that is only visible to you."),
88
+ mode=_("Define the user mode. Should the usage reset every month?"),
89
+ last_reset_time=_("If monthly is enabled, the usage will be reset after 30 days from this date."),
90
+ start_date=_("From when the user package will be started? Empty for start from first connection"),
91
+ package_days=_("How many days this package should be available?")
92
+ )
93
+ # column_editable_list=["usage_limit_GB","current_usage_GB","expiry_time"]
94
+ # form_extra_fields={
95
+ # 'uuid': {'label_name':"D"}
96
+
97
+ # }
98
+
99
+ # can_edit = False
100
+ # def on_model_change(self, form, model, is_created):
101
+ # model.password = generate_password_hash(model.password)
102
+
103
+
104
+ def _name_formatter(view, context, model, name):
105
+ proxy_path=hconfig(ConfigEnum.proxy_path)
106
+ if hconfig(ConfigEnum.is_parent):
107
+ from hiddifypanel.panel.commercial import ParentDomain
108
+ d=ParentDomain.query.first()
109
+ else:
110
+ d=Domain.query.filter(Domain.mode!=DomainType.fake).first()
111
+ if d:
112
+ link=f"<a target='_blank' href='https://{d.domain}/{proxy_path}/{model.uuid}/#{model.name}'>{model.name} <i class='fa-solid fa-arrow-up-right-from-square'></i></a>"
113
+ if model.is_active:
114
+ link= '<i class="fa-solid fa-circle-check text-success"></i> '+link
115
+ else:
116
+ link= '<i class="fa-solid fa-circle-xmark text-danger"></i> '+link
117
+ return Markup(link)
118
+ else:
119
+ return model.name
120
+ def _ul_formatter(view, context, model, name):
121
+ if hconfig(ConfigEnum.is_parent):
122
+ from hiddifypanel.panel.commercial import ParentDomain
123
+ domains=ParentDomain.query.all()
124
+ else:
125
+ domains=Domain.query.filter(Domain.mode!=DomainType.fake).all()
126
+ return Markup(" ".join([hiddify.get_user_link(model.uuid,d,'new',model.name) for d in domains]))
127
+
128
+ def _uuid_formatter(view, context, model, name):
129
+ return Markup(f"<span>{model.uuid}</span>")
130
+ # def _usage_formatter(view, context, model, name):
131
+ # return round(model.current_usage_GB,3)
132
+
133
+ def _usage_formatter(view, context, model, name):
134
+ u= round(model.current_usage_GB,3)
135
+ t=round(model.usage_limit_GB,3)
136
+ rate=round(u*100/(t+0.000001))
137
+ state= "danger" if u>=t else ('warning' if rate>80 else 'success')
138
+ color= "#ff7e7e" if u>=t else ('#ffc107' if rate>80 else '#9ee150')
139
+ return Markup(f"""
140
+ <div class="progress progress-lg position-relative" style="min-width: 100px;">
141
+ <div class="progress-bar progress-bar-striped" role="progressbar" style="width: {rate}%;background-color: {color};" aria-valuenow="{rate}" aria-valuemin="0" aria-valuemax="100"></div>
142
+ <span class='badge position-absolute' style="left:auto;right:auto;width: 100%;font-size:1em">{u} {_('user.home.usage.from')} {t} GB</span>
143
+
144
+ </div>
145
+ """)
146
+
147
+ def _expire_formatter(view, context, model, name):
148
+ remaining=remaining_days(model)
149
+
150
+ diff=datetime.timedelta(days=remaining)
151
+
152
+ state='success' if diff.days>7 else ('warning' if diff.days>0 else 'danger')
153
+ formated=hiddify.format_timedelta(diff)
154
+ return Markup(f"<span class='badge badge-{state}'>{'*' if not model.start_date else ''} {formated} </span>")
155
+ # return Markup(f"<span class='badge ltr badge-}'>{days}</span> "+_('days'))
156
+
157
+ def _online_formatter(view, context, model, name):
158
+ if not model.last_online:
159
+ return Markup("-")
160
+ diff=model.last_online-datetime.datetime.now()
161
+
162
+ if diff.days<-1000:
163
+ return Markup("-")
164
+
165
+ state="danger" if diff.days<-3 else ("success" if diff.days>=-1 else "warning")
166
+ return Markup(f"<span class='badge badge-{state}'>{hiddify.format_timedelta(diff,granularity='min')}</span>")
167
+
168
+
169
+ # return Markup(f"<span class='badge ltr badge-{'success' if days>7 else ('warning' if days>0 else 'danger') }'>{days}</span> "+_('days'))
170
+
171
+ column_formatters = {
172
+ 'name': _name_formatter,
173
+ 'UserLinks': _ul_formatter,
174
+ 'uuid': _uuid_formatter,
175
+ 'current_usage_GB': _usage_formatter,
176
+ "remaining_days":_expire_formatter,
177
+ 'last_online':_online_formatter
178
+ }
179
+ def on_model_delete(self, model):
180
+ if len(User.query.all())<=1:
181
+ raise ValidationError(f"at least one user should exist")
182
+ xray_api.remove_client(model.uuid)
183
+ # hiddify.flash_config_success()
184
+
185
+
186
+
187
+ # def is_accessible(self):
188
+ # return g.is_admin
189
+ def on_form_prefill(self, form, id=None):
190
+ print("================",form._obj.start_date)
191
+ if form._obj.start_date is None:
192
+ msg= _("Package not started yet.")
193
+ # form.reset['class']="d-none"
194
+ delattr(form,'reset_days')
195
+ delattr(form,'reset_usage')
196
+ # delattr(form,'disable_user')
197
+ else:
198
+ remaining=remaining_days(form._obj)
199
+ msg= _("Remaining: ")+ hiddify.format_timedelta(datetime.timedelta(days=remaining))
200
+ form.reset_days.label.text+=f" ({msg})"
201
+ usr_usage=f" ({_('user.home.usage.title')} {round(form._obj.current_usage_GB,3)}GB)"
202
+ form.reset_usage.label.text+=usr_usage
203
+ form.usage_limit_GB.label.text+=usr_usage
204
+
205
+ if form._obj.mode==UserMode.disable:
206
+ delattr(form,'disable_user')
207
+ # form.disable_user.data=form._obj.mode==UserMode.disable
208
+ form.package_days.label.text+=f" ({msg})"
209
+
210
+ def get_edit_form(self):
211
+ form = super().get_edit_form()
212
+ # print(form.__dict__)
213
+ # user=User.query.filter(User.uuid==form.uuid).first()
214
+ # if user and user.start_date:
215
+ # form.reset = SwitchField("Reset")
216
+ return form
217
+ def on_model_change(self, form, model, is_created):
218
+ if len(User.query.all())%4==0:
219
+ flash(('<div id="show-modal-donation"></div>'), ' d-none')
220
+ if not re.match("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", model.uuid):
221
+ raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
222
+
223
+ if form.reset_usage.data:
224
+ model.current_usage_GB=0
225
+ if form.disable_user.data:
226
+ model.mode=UserMode.disable
227
+ if form.reset_days.data:
228
+ model.start_date=None
229
+ model.package_days=min(model.package_days,10000)
230
+ old_user=user_by_id(model.id)
231
+ if old_user and old_user.uuid!=model.uuid:
232
+ xray_api.remove_client(old_user.uuid)
233
+
234
+ # model.expiry_time=datetime.date.today()+datetime.timedelta(days=model.expiry_time)
235
+
236
+
237
+ # if model.current_usage_GB < model.usage_limit_GB:
238
+ # xray_api.add_client(model.uuid)
239
+ # else:
240
+ # xray_api.remove_client(model.uuid)
241
+ # hiddify.flash_config_success()
242
+ # def is_accessible(self):
243
+ # return is_valid()
244
+
245
+ def after_model_change(self,form, model, is_created):
246
+ hiddify.quick_apply_users()
247
+ def after_model_delete(self,model):
248
+ xray_api.remove_client(model.uuid)
249
+ hiddify.quick_apply_users()
250
+
251
+ def get_list(self, page, sort_column, sort_desc, search, filters,*args, **kwargs):
252
+ res=None
253
+ print('aaa',args, kwargs)
254
+ if 'remaining_days' == sort_column:
255
+ query = self.session.query(self.model)
256
+ count = query.count()
257
+ data = query.all()
258
+ data=sorted(data,key=lambda p: p.remaining_days,reverse=sort_desc)
259
+ res=count,data
260
+ else:
261
+ res=super().get_list(page, sort_column, sort_desc, search, filters,*args, **kwargs)
262
+ return res
263
+
264
+ # Override the default get_list method to use the custom sort function
265
+ query = self.session.query(self.model)
266
+ if self._sortable_columns:
267
+ print("sor",self._sortable_columns['remaining_days'])
268
+ for column, direction in self._get_default_order():
269
+ # if column == 'remaining_days':
270
+ # # Use the custom sort function for 'remaining_days'
271
+ # query = query.order_by(self.model.remaining_days.asc() if direction == 'asc' else self.model.remaining_days.desc())
272
+ # else:
273
+ # Use the default sort function for other columns
274
+ query = query.order_by(getattr(self.model, column).asc() if direction == 'asc' else getattr(self.model, column).desc())
275
+ count = query.count()
276
+ data = query.all()
277
+ return count, data#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
278
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,83 @@
1
- # 2023-04-08T16:23:20.475259
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xbe\n\x00\x00\x12\t\x04\x00\xf2I.\xd7\xea\xf0\xeb\xd8Y\xccs\x88y\xe0\x8d\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x98[|\xe56R\xad\xc3\x12\xcf&\x16\xc4\xff\'\xda\x8ao\x82x&\x83A\x07\x12\xfa\xda\xd8\x92\x01Q\xd9\xf2/m\xf8L\xc0\xedb\x0c\x00\xb1\xf1G\x0fy\xf9\xf1\xa6\x1b-B\xd8n\x81\xf6\x83\x14\x97J\xc0L\xaa\x8a\xc0 \r$m\x01#\xa3\x96\x93\x86B\x84\xee\xa0\xe6\x84\x8e\xba0\x01\xfb\xf3\xb1\xae\\x\xe2\x1d\xd8T\x07\x1b\xef\x0c\xc3%\x98\x01a^\xc5z\xc9\xb1\xc4\x96\xad\x1a\x1a\x9d\x1d\xbe\x14oHI\xda\xa2J9\x83\xa4j\x03.\xfd\x1a\xb8\x8b\x8d\xc5\xdc\x9e\x0f\xd7\xa8\x9e\xfbe\x89\x1b\x90_\x94\x93f{\xaf\xbbS\xa7l\xf3\xa9C\x1d|2xP\xb2\xd4\xfb\xb8X\xf8|)?\xd1D\t\xf1\x91\x12\x1b[\xbd\xdc\xda[u\xf4%l}\xb4w\x83\xa8%\xbf\x86u\x82\x8c\xa9\x1b\x8f\x85a\x051\xbcrG*\x03y\xa3\xbf\x80\xc0\x83\xe7\xefRVz\x90\x9b\xd4p\xdc9<:\x05o\xca\xc8\x05]\x9e\xeb-\x05\xd5\x1fyS\xae\x94\x00\xdfM\xdb\x88\xb1\r\x1e\xf1\xf1\xcb\x8c\xbc\xc0rL\xf7\x91\xfa\x8aR\xaeV6\xb2\xe9,\xe1Q<\xac\xf0i\xbb&\xa01\xeb\x1b\xa2{\xbeL4\xf6\rVY\xb8\xb1oq\xa5\xcf:\xc7*\x8e\x02D#\x84@\xe6@\xe3\xc3\x02;]\x19,\xf9g2&~\x8fn\xfd\xd2\xd2U\xa5\x7fY\xd4E|\x07\xf0}3VQ]U\xe0v4g\xb1P5\xa8\xb2\xca\x1a\x00ge\xebC\xeb@\x0ba\xf7\xd8\xbdE\xac\xe3\x17p\x9d\xc5\x948\x91\x00\xd7W\xff\x05.\xc3\xee\xd0E-L\xb1R\n\xa4\xcdb-=\xea1\x99\xa1[\xd6\xbca3\x986Y\x9f\xd0q/\x1debHl!J\x98\x9bR\x15\xd6>\xff\x8bQ\xb4\xd6\xae\xc3w\xd0\x08\xba2\x9e\xb3\xb5\x86\xc5^82\xd7\xac\x14\x11\x94Ek\xd9\xf8\xf3{uJNR\xf5\xbc\xc0\xbb\x18\x12\xd5{\x12\x85\xdf\xcb\x80\xe8^w\xd3\x18e\x1cs\xb3\x9a__t\x06\xb3\xf3N\x8dJ\xc0\xe8\xda\xd2\xe1\x9f\xe3Q\xc0\x19\x06\xa2\xb1\xbe\x1aR=Y\xf9\xf2^\xc5\x8d\xb8\x07\x1d\xb2\xcc)k\x80\r\x01\xe4\xac\xcb\xed\xdfV3Y\xb4\x0b\xbb\xe4\xef2CE\xe2+\x93\x97\xef\x97\x90t\xb0GS\xabB\xb8\x8a#L\xba\x9b-\x88\x18\xf3\x12\x14\x88;68l\x1c\x08T*\xe0$\x91\xb3Z\x98;\x88J%m*\x9b\xed\xd8\xef\xae|\xec\x9f@@\x82\xbeh\xe2\x15\x01`\xa2\x9b\x9f\x1b+(NK<\xf4\xbct\xaeE\xe3\x95h\xe5\x9f\xc2t\xc7\xd9\xe3w\xf8\x7fZ]7\x849\trU\x9d<|]\xf3\x8e\x96\xf7\xa6L\xa2{\xfd$\x07\xe6\xd7\x8d\x9f]\xbd$\xb9\x140\xda\xe7!\xd4o|i\xaa\xa0\x1aY\xeak\xabT\xa2\x16\x0c\x17\xb3\xdb\xfe\xf4E 5\xad\x07\x0e\xba-X!9H\x10\xa2L\x0e\x1b\xa0(\x9crB\x97\xce\xe4\xbct2\xe9\xda3\xc4}\x0c\xc7`\xbb\x92\xa1\xd5\x1d<\x91\xc9\x1e\x0f\xabgL\xc9\x19\x83\r\xaf\xdez\xa5mj\x9ds\x9e\x1f\x17\x1a\xcc\xe8\xd6I\xea\xf0B\x02\x15\t\xec+\x91\x1b\xf7i\xa4\x11\xb3\x83\xb6\x05\x17|\xe2\xd9\x91\xb4\x8c\xc0\t\xed\x1d\xbc/\xdec]\xcc\x08c\xda\x99g\x01\xa0$7\xc5\x8a\xd5<r~\xffw\xd5\xc1e9\x99>\xae\xdf\x17\xe0sI\xe9\x90\xb8bq\xe4\x15\t`\xf2\xe1\xd0\xfd\xda\x1c\x1b\x03?\xca\x8a\xab\xdeR\x1c\xd2\x19\x89\x02E4N\x15\xa1\xc9\xd4X\xc1\xbeDH~g\x86\xeab\xfb\x98\xdev\xf4nc\xd1\xf2W\xf0\x04K3\xe2\xd0\xa5d\xb5*U7\xca\x02\xe1=\x8a\x10\xd2\xee6\xcf\xf6\xf0\'%:T:\xa5h0P\xd9\x10X\x8b\x17\x7f\x9a\x8ci\x9f\x10n*L\xbe\xc8=\xd3\xe0M\xc3\xab9S\xe7x\xed\x05\x04\xda\xca\x01<\xe0\xfd\xd8E\x9fe\xd6 q\x96)\x8f\xf2\x86 \xc8{\xac3$\x9d\xa2U\xb2\xdfi\xdcau|\x90\xe4U\x95b\t\x9f\x7f2\xcf\xaf\x80!\x95\'\xd2\xcb\x9e\rX\xb2;\xa9\xe1\xe9\xa6\x15\xdf3\xf3\x01\xce\xed\xaa\xf2\xfcgC\x93\xb4\x0f\xb5\x8c\x85\x05\x18.}\xff\xa1\xca\xed\xd85\x9d\xb5\x84rI\xcds\xc6}t\x0e\x11\xbaV\xc3yo\x9f\xe0\x9d\xe8\xe2\xd4\xe4-F\x10\\:\xc9\xdf\xe2u\'|i\xf8\x14~>\x96\x7fw\x14\x11;F\xa7\xb2K7\xfb\xaa\xb4\xe6S]\x0c>\x1d\xcd\xed"\xf0*\xa8\x9e\x11\xe6\x94\r\xf0\xb3\xd8\xfb/|\xf4\xc1\x1d\xbf\x99L22\xc2\xcfL\x1a\xf1Q\'\x9da\xfe\xe7P\xe5=j\x8a\xf5J\x03\xa4JDM\xf0\xf8\x95"8\x91\xa9\x0e\x86\x9b\x08\x19R\xb1\x80Jt\x86\xec\xe6G@Z\x9e\xd9FK\x00\x1fzTZ\xf6\xed\xd5\xb7\xc5\t\xe7c\xb08\xf5\x03\xd8p\xa5e4\x96V\x0f\xe6\xbf\xab\r\xf4\x90\xd8\xe3\xe5\x97\xabk\xe0\xfd\x0e\xad*^{\x92\xa8b\x17\x8e\xe4\xf4\xc3\xb5c\xda\x9e\xb1\xb0\x16s(\x86\x859\xc3\xf6\x9c\xbf\x1e\xa0el6v\x83\x1fz&\xf6:\xfc8\xe4j\xf7\xe7\xd3\xc5\xc7\xeav\x02H#)b_hW\xd0\x91/M\xe2\xc8\'p\xc5\xb3\xe3\xee\t\x04\x8c\x05\x81\x88\xfeZ\xe8&\x88\x7f\xdf\x83\xd05\x94\xcf\xad,,\x81\xa6*q\x8f<,\x00>\x95H\x19\x8c&\xc3T\xae=\xc3\x18\x7f\xb2I\x0b\x9e\xf6\xda\xaa\xae\xdf\xbf\xcej\xf9\xd9^\xe19w\x1a\x80u\x18vDv\xba?B0rL\xaf\x0c%9\xad\xbd|\x9eF\xa8\xc8_Ov\xe7\xd3\xf5\x11T\x80\xc5\xff)\x0b\x96\xda\\\xc5\xb0\xf4%\xcc\x85\xb4\xb3\x11?3\x97\x87b\xb6\x14O\xd76A\xca\x0c\xbak\x03Oo\xb6b\xcaR\xa7@K#/\x9a\x87a\x0bp)c\xe8\x11\xa3\xb2\xc1\xe0\xbd\xd5j\xb7|\xactNO\x14n\x9d>;\xd1\x90\xf9\x0f\xe0 \x012\xc4j#\x9d\xcb\x1dp#_t\xb4\xaa\x03\x15\xean,P\xed\x92\xd0\xf5\xd0\x82~:\xe9\xc6[\x9a\x0c\xd0\xb2F\xc3\x0c\xc6?K\xec\x00\xfd\x06f\x9c\xb3(\xdc\x0cv\x84\xe71\xf0\x02\x98\xa8\xdaE\xfff\xd2,\x9b\x93\x06\x9d)I;\xcc\x8f~\xcei\xe7\xa3&\xc0O\xa7\xb7e\\@\xbb\x14#\x9e\x8f\x9d\xcf\xefU.)\xb9\x14\xf5\xb7\xf3\x16J\x9e\xb6\xdbU\x18\xb4\x12\x1bW=\x81\xd18#\\t\x8c\n\x9a\xd02\x06\xb0\x05\xe1i\x9b\xfd\xe1\xde\xc3\x85@P\xe6\xb2\xa2\xa8k@\xfa>\xbd\xeb\xfe\xed432OT^\xce\x0e\xd5*\xd7p\xc0\xb8\xec(D\xce\xab\x10\xc80\x9d\xf3*\x1bV\x1e\x98\x9d\xe0K\x15CV\xe86\xc8p)\x9b\xe8\xfe\x8e\xdf^\xe3\x1f9\xf0\xc0\x96\'`\xd8\xdf\x93\xca\xc4\x0f\xf14J<:\xcb\xc3\x82\x95\x85J#\xb9\x8f\xde"\x1e9k@\xf3\x18\xb7B\xf7\x91\xc7\xa7\x9bD\xce\xf1\x9a\xd4\xc4N\xaf\xd6\x9b\xaa\xc6\xac\xfd\x87\xd7\x88\xaco~\x92#`\x98\xb8P\xde\x16\xae\x07Mc\x93\xce\xf5\x84R\xf6uR\xe1\xce\xb76Ou\x92\xd7\xecZ\xb9\xaa\xee\xda;\xb5\x10.P\x0f\x16\x7f\x8c\xd1\xff\x05\xff\xbd@\xf9\xb7V[L?\xf3\xaeW\x1a\xc1|\xb1\xd9\xc3\x0f\xabm\xbc\x00\x92E\x86\xa3\xfe(@\xa1w\xda\xb48Qk\xf3\x92=\xf3\xccH\xbb\x96\x93x\xe3\x81z\xe1JM\x9bj\\T\xb1p\x07\x0e.\xfbg\xe6O\xaf\xac\xfb\x89f\xec\x80\xb8\x85\xee\xdeg\x13\xc3M\x06=z\xb0\x82m_\xd6Z\xe6;ge\x82\xfb\xacI\xe22\x04\xce\xff\xad \xc1\xf4\x99\xb7\xac\xbf\x1e4\x1cOA[-4\xe4\xe1\xc3\xdf%\x19\xebh\xfc\xff#Z\x14\x05\x15\xb4$:+\\\x89\xa1\xe8hn%:Rv(\xac\xfdA\xc0\x10^u\x8c\x1e\x06$\xa8\x9av\xfeM\x98L\xc3\xaeT\xbb\x024.\'~\xc3\xcb}\xc8\xecS\x17\x97\xcd\x18k:\xcbg\xd1eq\xd7FJ\x9d\xe9f\xa3\xdac\r\xb4\xb1\xf5\x05\xba>\xe6\xda\xba\xc2\x08\xe2\xf4\x15oF\x0bha\x9b\x13\xcb&\x08L\xa9GD\x9e@\'\xd3C\xe89<{\xe1\\\xca\x13\xb5@\xfen`\xea\xac\xb1#\xbee\xee?\x1dIO\xf9\x90_\xad\t7\x8b\x1b\x95\xc2\t\xb4\tP\xc8\xf2\xfc\xe1\x8c\x9f\x99:\xc0\xb7\\\x02\xbe\x9b[\xdeF\xdd\xb4.\xbe7\xd9\xb9\x88\xb8\xfaQo\xd6\x96\x11!\xe5\xe1\xa3\x9e\x1bx\xa4\xde\xa3\x88\xc5\xbc\xd9\xf0\xc6\t\xbf\xb7\xee\x08\xd98p\xab\xe9QH\xe1MZ\xcd\xab\xd4\x19\xbd\xe9\xcas\xaf\xe0\x0b\xfd\xb6\xfa9\xd7x\x85J\xdd\xc9\xd8\xef\xe5\x7fx\xec\x8b\xc2ohp\xe3\xf4\x03\xf8\x8bx,j\x15\xe2t\x97\xdd\x80\x91.iz\xf2#Y\x96\x94M\xd4^\xc08\xff|\x071/h|\xad\xbd\xd5\x15\xed?\xfd\xd2\xb62I|\x8cO\x08\x1c\x90\x14\x1d1\x07\xf2\xa5l\x05\xfa\xb5\xab\xfc\xbd\xb1,\n\x8b\xd3\xd3\xe4M\xab\x82\x85\xae\x8b\xb3\xc8\xf1\xb9\x0b\xb16\x89\x9f\xca(\xc5\x84{\x1b\xbc_\x8d\xa6\xc2\xcd8\xb7\xa9\xad\xcc\xb9\xaf`:\xf9\xd9\x1d\xb6z~v\x07\xa3\x13&ko\xb46\x83\x00\x9f\xb8/\xe5\xc41\xc8\xbc\xd0\xd0?/4\xba\x8aIu\x95\x00\x9b\xc1\xab8\x89\x9d5\x8d\xdc\xfd\x0c8\x01)\x87Iz\xca\x8blJ\xe0\xae\xbbK\xe1\xecI\x8f\xad;\xa6\x12Rx\x8f\x85[j\xf9\x9c\xaa\xc57\xaeK\xe6\x876io#z\xd8\xeb\x98$\xf8U\x1a\x88\x16\x1b3C\x9d\x9d4\x1a\xc9jc\'s\xb6O\x04\x9f\xf0c\xe73H\xeb\xb8\x19\xa2\xdb\xbc\x04\rKQ\x8c\x1f\xd5\xec\xbe\x94\xec\xefC\x19@\xd4\xccNJ+\xc25\x87\xbf\xf3\x1b\xd9\x00|\xd7\x12:]u\xd7\x9aka\x01C\x1f\x18\x93\x13\xa2\r\xbd\xed-\xfc\x14\xf4+\x96T\x04\xc4\x9f\xbd\xee\xa4d5\xa2o\xead?B\x16\x84\x87\x84l\x9a\x1a\xd4\xce_J\xb5uq3\x92\x068\xcd%Y\x1eI\xe1\xc6\xc9\x88\xc6v\x96\x88\xafK\x0c\xca\xcau\xf0 >\xc0\xd5\xb3\xddSeqQv\xee6\xf0a\xb5\x80b\x14\x1d>\xb7\x0e;E\xf4\xa40\xa3\xab\xfa\xd7\xd1\x16\x95W\xea\x0f\x01\x01[\xddqE\xa4{\xa5\xe2\xf0\xf0\x10w\xed\x9e\x8cz\r\xf2\x07f\xbe\xc2\xcb\t\x11\xd5-\xc1\xe1\xb9z\xf7\x97\x1a\xc0zL\xb4\xa8\xa7\xb5\xe1)\x1a\x10+6\xbd^\xc7P\x8e\xf43\xc0W\xae^\x0c\x12\xd2rvV\xa2\xd2(]BqO\xdf\x13\xe8q\\.\xf3\xe2\xc6\xaf\x0f,Zn1\xc0\xea}m?\xd1\xac<\xfbS\x1a\xa41\xe2\xfc\xac\x1d6\x80\x01\xf4\xb4\x01\x12\x05:\tO)\xaf| \xc6k\xcd\x0f\xc14H{\xa7q\xbb\x0f\xc5p\xce:\xca\x8f+y\xa0K\x81\xae\xad;&\x1dZ3\x8a\xaf$\xa0[\xc1\xf8\'Z\x00\xbf\x89\xefb\x19=\xee\x96C\t\xc8\xb4\\\xaf+ZB\xf3\x04\xdc\xa6\x80Lz\xda|\xe2y\x1a\\\x94\xe0\'\xe8\'e\xa4]Y-\xdc\x86\xa3a\xa9\xc7\xe8\x05\xe2NY\x02\xc0\x1d\xcd`O\xb6\x0b${\x01XU\x82/XzY\xcf6A\x9e\xe8\x98\xb1\xb8\x93FY\x0b\xde\xb6\xbeh\xa1\xcb2\x0c+\xba\xab\x01\xb2')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask import Blueprint,url_for,request,jsonify,g,redirect
2
+ from flask_admin import Admin
3
+ from hiddifypanel import Events
4
+ # from flask_sockets import Sockets
5
+
6
+ from .SettingAdmin import SettingAdmin
7
+ from .DomainAdmin import DomainAdmin
8
+ from .ConfigAdmin import ConfigAdmin
9
+ from .commercial_info import CommercialInfo
10
+ from .ProxyAdmin import ProxyAdmin
11
+
12
+ from .Actions import Actions
13
+ from .Backup import Backup
14
+ from .QuickSetup import QuickSetup
15
+ from hiddifypanel.models import StrConfig,ConfigEnum
16
+ # from .resources import ProductItemResource, ProductResource
17
+ from hiddifypanel.panel.database import db
18
+ from hiddifypanel.models import *
19
+ from .Dashboard import Dashboard
20
+
21
+ from flask_admin.menu import MenuLink
22
+
23
+ import uuid
24
+ from flask_adminlte3 import AdminLTE3
25
+ flask_bp = Blueprint("flask", __name__, url_prefix=f"/<proxy_path>/<user_secret>/",template_folder="templates")
26
+ admin_bp = Blueprint("admin", __name__, url_prefix=f"/<proxy_path>/<user_secret>/admin/",template_folder="templates")
27
+ flaskadmin = Admin(endpoint="admin",base_template='flaskadmin-layout.html')
28
+ # from extensions import socketio
29
+
30
+
31
+ def init_app(app):
32
+
33
+ from .UserAdmin import UserAdmin
34
+ # admin_secret=StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_secret).first()
35
+ #
36
+ # return
37
+ # admin = Admin(endpoint="admin",index_view=Dashboard(),base_template='lte-master.html',static_url_path="/static/")
38
+ flaskadmin.template_mode = "bootstrap4"
39
+ flaskadmin.init_app(flask_bp)
40
+ adminlte=AdminLTE3()
41
+ adminlte.init_app(app)
42
+
43
+ Events.admin_prehook.notify(flaskadmin=flaskadmin,admin_bp=admin_bp)
44
+
45
+
46
+ @app.route('/<proxy_path>/<user_secret>/admin')
47
+ def auto_route():
48
+ return redirect(request.url.replace("http://","https://")+"/")
49
+
50
+
51
+ # flaskadmin.init_app(app)
52
+
53
+ flaskadmin.add_view(UserAdmin(User, db.session))
54
+ flaskadmin.add_view(DomainAdmin(Domain, db.session))
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+ SettingAdmin.register(admin_bp)
63
+ ProxyAdmin.register(admin_bp)
64
+ Actions.register(admin_bp)
65
+ CommercialInfo.register(admin_bp)
66
+
67
+ QuickSetup.register(admin_bp)
68
+ Backup.register(admin_bp)
69
+ Dashboard.register(admin_bp,route_base="/")
70
+
71
+
72
+ # admin_bp.add_url_rule('/admin/quicksetup/',endpoint="quicksetup",view_func=QuickSetup.index,methods=["GET"])
73
+ # admin_bp.add_url_rule('/admin/quicksetup/',endpoint="quicksetup-save", view_func=QuickSetup.save,methods=["POST"])
74
+
75
+
76
+ app.add_url_rule("/<proxy_path>/<user_secret>/admin/static/<filename>/",endpoint="admin.static")# fix bug in admin with blueprint
77
+
78
+
79
+
80
+ flask_bp.debug=True
81
+ app.register_blueprint(admin_bp)
82
+ app.register_blueprint(flask_bp)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
83
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,14 @@
1
- # 2023-04-08T16:23:20.478272
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xc2\x04\x00\x00\x12\t\x04\x00L\x04<\xdd,i\xd0\xd3\xbezu\xfe\xeaP\xf99\x00\x00\x00\x00\x00\x00\x00\x00\xb5\xd0\x93\xb0\xb7\x08Q\xd2\xadLy\x88\xe7\xe1\xb9M\xaa\to\xed\x96_\x10r\\\xe2\xe5\xb7\x13p{\r\x0eY|\xcd\xc2c\xbf\x97D\xd5^\x97\xdcI\xca@\xad\xc8\x9a\x04\x00\x87\xf1\xbc\x00\x87|\x85\x86\xb98\xb5\xda\xcb\x9d\xad7lR\xa2.}KB\xaf6\xcb DT\x04\x11\xd4s\xa3\xb22\xfe)\xca\xb8zH\xd5\xcc\xb7~A\xb3\x05\xd6\xa2\xf6\xfa\xed[\xb6u\xc0\xc5v\xa9\x83hS\x16v!\xed\xeb\x81\xcewx|\xb4\xe0\x96gTl\xd5\x0cr\x19\xf7\xfc]\xf4\x15\xed\x0b<S~\xe1\xc3\xb1\xae\xce\xd9\x8d\x01\x19\xdd\x968P\\W\xf8#C\xaa\xaaF\xdcA\x13\xa8Hk\x0e\xdd\xaa\x95\xd4#2\x17\'\x89\xff\xd5-h\xeb\xd5\xf9PRg,\x9d\xb9E$\x96\xb6\xfc\x1bv\x92\xf5\xad\x14\x94@(\xde\x87\xff2o_)\x9c\xf7\xb3\x80\xb1\xbfu\xa6\xe0v\x97\xbf\x15V\xd7D\r\x00\xe2}\xcf?\x90\xdc)\x81\x03b\xac[\xd2\xb0\x9c\x95h\xd0\x9c<\xb1o\x0c\x17\x17\xd7|\x98\xdfX\xe5n4\x03&\xbb\xaf#\xdf\xf9\x164\xa4k\xde\xda\xfbec\x15\x01\xdfd\xd6\x94#\x0c(\x88JN\'\x04Z[\xf9\rx\x11\xb5`\xf6?K#\xfcK\xe6\x11\x85\xe9q\xdb\x91uHq\x1e\xf4Tz\xc7`\xcd\xf7\xde&\x03M\x7f\xb8\x92\xed\x12R.3\x05\xe8\xb1\xb1\x11\x1a\xf8{Re)\x9fi\x8b\xab\x8f\x0b\xd4\xc57\x19[\'\xf2\x8ezv\xd0\x86\x8a\xb4y(X\xbf\x92\xce\xe9\x08\x1cZ+O\xd3\xc4\xe6"V\x83z=\xfez\xc3\xedo\xcc[\xfb\xda}\xa9\xc0\xf9\xe2\xcd9\xb7\xb4\xa5\xcd\xdde`\xe7X\xb5\xe2\xba8$8\xcc\xa2\x8aC\r\xf7\xe4 O\xcf\x87\x82\x16\xf6\x99]\x1e\x04N\xc6\x9cV\x84N\r\to\x7f\xf8gH\xcbk;\xa7\xb8(+\x809\x16\x8aLfe\xaf\x00qO\x81\x94x\xdc\xe7!Y\xac\x81P\x02S\x1e\xa8\x8c\xc6\x98\'7\xf4\x83=\xf6\xfaI\x0bU\x8a\xbcb\xb6\xd4?\xb2\xe6nt\xc2\t\x0c\xee\xd7\x1c\xab\xf1;\xe8\xb1\x91\x9c\xc21\x14\xff\x0c\xc1\xe4>)\x0cFy\x83ge\xbf\xc9\x9f\xc7\xb3\xde\x01)\x02\x12[N\x06\x11!\x12\xac\'\xd3^\xb8\xe5\xa8\xde\xf4Rk\xd0\xe28\xf7\xae0}\xe7J\xd5h+\xd4\xc3&\x07X\xa1|\xc5;\xe4\xa0\x1b\xaa\xde@Q\xb93\x8d\xa7\xeap{\xbd\xdbY\x1e)\x92B\xf0\xc4\xca\n\x0c\x15\xff\x96Hc\xe1gJ\xf3h[\xc5.\xce\r"G\x85\xe0e\xf8\xea\x0f\xf7\xef\x16\x84\xee\xa3\x1a\xd7\t3\xc7\x84\x98lD\xcb\x03\xb5\x17\x1f\xbc\x1aR\xc3\x96\x9b\x00\t\xa6\x1cH\xcd\x08\x0c\xe2a\x19j\xc82\x1f\x9e\xc5m\x12o\xda\x93W\xf0u\x89"*oR\xed~2\xa8\x84\xa8\xaa21\x9fW\xcbB\x03\xd6\xcc\xfe\xf3\xc6\xaf\xc0\'\x01\xa4#\xbf\x1bC\'K\x8bhD\x07b\x89\xcfEq\x8c\x1f<\xa4\x0eGb\x15\x9c\xae\t\x85\x11\x87\x96\xf3*u\xa1x\x9c\xbcF\x1c)\x9e\xda\x88o\x8d%\x1e\x88f\xc3\x124\x03\xfc\xfd\xeb\xdc\x8f\x8c\x9f|\xd8\xb4\x06*\x1f\xb1\xbc\xf6\xe1#\xb5\xa2h\xe2\xae\x06\x9a&\xbf\x99\xf7\xc2\xc6^P\xec\xa10-\xa0n5t\xec\x8d\xdc\xc7\xd1!\x05\xddp\xe5\x0b\xb9\xf8Z\x94?\xdb\xa3\xc9\x8b\x96\xf8\x9c\xba\xd0"\x97tj\xb6j\xfb*D\xd9%\x9d\xbe\xd9\xe4\xb6\xaf\x19\x0e\xae\xdd5\x1e\x9c\xa2Yq\x0f\x80\xa3\n\xef\x15$\xea\xe6\xb6`\xb0<\xca\xa7\xf1\xact%P\x9f\xe4\xf7\xa9\x9d-\xa9\x9a\x8fv\x9d \xeei\xdc\xcc9\xc6\x01\xe1\xa2\xa1\xf4\xe1\x0b\xef\\oz\x01\x83\xaad\xfa\x15J\xf2\x04+\xecG\xc8\x9f\xf5\x05a\xe2\x0f\xb1\xc5\xa0M\xd2D\xe8\xd7\x81w\x92\x8a\xcfj\x04\x88\xb8\xbc\x08\xda\xb3\xa7N\xe4\xc7\x97\xfd\xf0894\xed\xae\xae\xd2\n\x84Z\r\xb0\x06\xb0\xd2Z\x07\xb9\x1eX\x16\xd9\x95\x83\xa6\xb8\xfc\xa5\xfe\xbd_\xf4\x98\xee\xb0\x0c\x08p\xe3\x11\x8b\x98e\xdb\x0b\x0f\x84\x01\x80\xf2\x96\x84\xb4\x8e.\xab\x85\xc6/\nz|\x01\x9a2\x0f,#\'\xa4\xd2\x07\x7f\x80\xf4B\xde\xee\xc2\x87J\xc2\xf66A+\x84\xdeL\xf3\x17\xca\x90|R\xd8d\xd2W\x8f\x06\x11\xb0\xc4\x03\x072j\xf2\x9e\x1c\x89\xa7\xd5/\x84\x7fn\xcbU|T\xdf\xce\xc8\xf9\xf6x\xcd\xf6\xa6\xbd \xa1\xddtv\xbf\xe5\xad\xd7{\x040w\x91{rr\xe8\x8d^\xe3\xcc\xf1\xda\r\xb3E\xb2\x80\xcb\xa4\xc5Y\x16\xc4E\x9d.]\xc2\x19\x07\x03\x98C\xaf\xf1\x9c\r\x0b\xde\x84\x98I}\xc9A\x83\x92\xa2<\xa5\x9c\xe3MF\xfe\xf3\x15X\xbc\x80\xa9\xfd!\xee\xbfeg\x8a[\xe1[\x11\x11\x994\x13f\x02\x14\xa9\x1c\xa5i\x15\xb8\xc8\xfe\xcfN\x01$\x03\xbd\x81\xe9\x97\x98j\x10\xa2-+i\x13\xc9\xa1\xf1S\x04\xbd<\xe4\xa3\x1a\x82-')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib.sqla import ModelView
2
+ from flask_admin.form import SecureForm
3
+ class AdminLTEModelView(ModelView):
4
+ list_template = 'hiddify-flask-admin/list.html'
5
+ create_template = 'flask-admin/model/create.html'
6
+ edit_template = 'flask-admin/model/edit.html'
7
+ details_template = 'flask-admin/model/details.html'
8
+
9
+ create_modal_template = 'flask-admin/model/modals/create.html'
10
+ edit_modal_template = 'flask-admin/model/modals/edit.html'
11
+ details_modal_template = 'flask-admin/model/modals/details.html'
12
+
13
+ # form_base_class = SecureForm#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
14
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,25 @@
1
- # 2023-04-08T16:23:20.541266
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb2\x06\x00\x00\x12\t\x04\x004-\xdc\xaaU\x9eA\xb1Y\xe6{\xc6[\x9a\xf8\xe9\x00\x00\x00\x00\x00\x00\x00\x00n\x0c\xd4\x9f\x14o7\xae\xa9\x9c\xaf}\x8f\xe5kO\xba\x96=>\xf7|\xcd\xc1V\x99\xdb\xebZ>u5\xaa\x9b\xb9\xa6x\xcf\x08\xed7\x83\xe5\x1a\xdb\xa9#\x18:=WJ/\xc8$4\xdap\xe5\xf2i\xabO\xb7\xe3\xb6\x8f0\n\x80/]C\xbfc~\xd9;\x07\xff\x14\xb1\x1fvB\xd1\x9fo\xee\x8cU\xad^5\x11\x1eU{\xb4\xd9\x95`\r\xbbZ\x95w\xe9\xddxk\x05\x0b\xe0\xa8\xd0\xc7\xe0e\xd9\xba\x8dm\xcc\x84\xdd\xa1\x035X|\xd4:0\x9d\xf4^l\x07\xbc\xeco\x80\xd0L\x7fzX\xf1\xbfj\xe6\xd2n\x9c\xcc\xfb\xbe\xd0U\x08\xed\xa9\xa7\x17+\t\xa9x\x1a\xd1\x8d\xedL\x12&.\xd0C2\xc5^2"\xe8\xe9DI\xa5\xb2\xfa\x06W\xfa\xfe\x1dRJ@\xae?\xc2\x86d\xf3R\xcb5\xfa\xe4V\xed\x1c\x1b+\x93l\xcair\xe5\x9f\xf1\x90V\x13\xbag\x07\x18\xe13\x12\x93u\xac\xe74\x15\x7f\xc6X\xe9\x0e\xa7u\xe4\xc0\xcd5\xa8\xc9PC\xac\x1d\xa8\x1f\xd7\xf0\xdf8\xe1e\xbd\xfc\x83#[-+\x14\x9fhk\xadF\xe1\xda\x88\xb6S\xe8\x95j\x96\xbeA\xe7:jc\xc5$\xd2-z<r\x87"\xae\xe8Gg\x9a\xbbR\xf2\xaf\x1d3\x02\x9e\x1b%\xe3i\x04\xc5\xcd\xbe\xc9\xc8\xee\xf8A]\xd7\x11d\x8e,\x89bU\xb5)\xb2\xca\xcf=\x92\'W\xc9\x87\xf0!6\x1a9\xc4\xaa\t\xdd\x17\'\xb8\xe9\x07\xb6u:\xe0\xd7Y\xf1\x01\x815\xa4\x92\xd6xZ\xc6\x8a&T\x7f\xc8$\x0f[\xc4\xaa\x9a\xe5]\xfbifQ\xe2\xd7\x17\xe4f\xfb\xba\x01\x1c|\xd3\xaaM\r\xf3\x00\x80\x9c\r\xc5\xc9\xce\xd2\xa1Q\xf6\xb0\x1eF\xcb\x1e\x89N\xa5\r-z\xdfu\xb2\x1c:\xea\xb2\xeb\xf2\xdcb"\x8b\x85\xbe\x05\x12h `\xca\xd7\xdd\xd1\x8c\xcbl3E\x9b\xb0jv\x8f\xdc\xea\xa6\xeb\xb2\x12!\xe32k6\xbf<\x13\r,S\xad:h%\xc8\x1aY\xf9\x13\xa0z\xd7\xc0\xac\xae\x02m\xe6t\xda7Z\xd0_W\xf8\x11HI+\xe5_4\x82\xb8\xfb\x02\xb1\xba\xbcAPV\xc5V\xdfxL\x97\xe5{5\xd5\xe2\xa7\xe5{\xac\xaa\xed\x97\xb1\xa3\x11\xf4\xb10\xd1U\xf7\x85Zx\xdf\x14\x9f\xf0\x9e\xba\x8cc\xf5rM\xd0\x88\x81T$\x06,\xfed!\xfa\x8ey}M\x01B\xd2b#P\xca<\x06 \xb4\xccRBq\xb7\xe3(\n/\xf5\xc9\xbe\xeehoY\\`o\x93\xd3\xef\x99\xb1upd\x9cEi\x82c\x0c\xe0dA+\x7f\x94\xcf\xe7\xec:?\x98\x83\xa1\x85\x95\x9b\xf07\xe7<\x8c\xc5\xe8\xd5\xcf\xfe+*h\x05\xc8\xee}\xca\x04_\x92L\xfc\xa8\x8e\xe1E\xb0\xd0N\xae\x99c6\xe1\xde~\xe3\xfep\xe3\xc2"\x19Re\xc4e\xb7\xc4"\x96\x9bA\xd2J\xccu\xc89|)\x00\xdfd\x15[\xb0\xe1gB\\\xbf\x08z\x9e\xa05\xe7\xf3\xa7\xbc\x7f\x8d\xd0\x90\xde\x92\xb9\xce\xd0\x8d\xd5^?=1\xc8\x11\xfe]\xa4\x89\xcf\xe0 \xa9\x95\xb9\xb6\xe9\x8e\xd5\xe3\xfb=\xde0p\xb21\xec\x95\xab,=A\x8e\x92\x9b\xc2\x17)3\xa7\x80\xb0V\xb6?n\x997h=?y\n\x13\x08D5\xd5\x05\xc8\xaeFl\x16t\xf0k\x85E\xa0Sa#c\xd8\xdc\xd6\xf3K\x1cg\xef\xb3\n\xef<B]\x1d\x06\xf3\x15B\xbf\xef\x9ba\xac\n\xb6\x03\xd8aqD\xe4u\xcb8\x06=\x9aeO\xbc\x82\xe82\x83\xc0\xe3\xd9\x1fH\x01\xfa\x836D\x17\x9f\xbf\xd6\xfdaZ\x0e\xad\x18\x0e;B\x19=\x9a@\x84q\x7fK\xd6\x0b\xf39{\xc3<\x90\xe5\x88_FWH0\xe6\xa0\xf7\x04\xbe\xeamX\x18\xb2\xf1#UW\xfc\x97,\xb5*]u-\x19\xec\x83\x86\x9c\xa1\xcc\xefW\xfe\x80\xf2E\x9e\xc7\xe8\x13\x05\x81-if\xa8\x90\xc6\x1b\xea\xd7\xa4\x90\xfd\xd0\x1cX7T0Y\x04`9T\xd69\x87i\xb1\xe4)\xd6#}\xd7=\xf9,\x129H\xe8?\'\x7f\x04$\x91R\x04\x80)q\xbe4\x80\x8a\x1fw1\xcah}}\xb3Z\x14\xb5\xfb\x95\xc7\x1a\xd9\xebQ\xcf\x12\x07!\n,\xae\xdeEO\xd9\xa31\'8\x7f\xe3\xba\xc5\xe3DTj\xab\xac\x0b\x0b\xc1"\x9c^G\xa8m\xb7\xc0\xc5h\x83\xe2\xfe\xf1\xdbm\x9d\xd2\xf21\xdaC+\xe3\xd2\xbf\x8b*<l\x18\xbc\xf1\xf8\xa8\x15\x90\x8eg\x97\x80\xe29\xa7\x19U\x8f\xa8d\xac\xc1b1\x05\x142t\x10\x95\xce/\x98y\x90\xf6rh)\xe8\xe4\xa2\x1b\xb9F\x1a\x994\x96\x98\x8dc\x0e\xcc\xc2m\xe8\xd3v\x98\x94f\x90\xd5;\x9b]:\xb1q}\x13uR \xc9X\xa70S\x1c\rE\xc7\xe0\xee=\xdao\x9f\x83]\x11HxD2\x05\xa5\xca\x7f_7\xe5o\x16\x8d\x92\xcbI\xe6\xf8Q\xe4z\xd3\xa7\xc9\x92n\x8f[\x97-s@\xa2k\x7f\xbc\xd0\xf6,[\xc7\x16D`\x00m\xc1\xb8\xeb:\x7fI\xcf\xd5\x04j\x19\x03\x83\xb3\xbb\x00d"\xf1J~aaV\xec\xc4c\x90\xe1\xa6nR\xc4X\x80Hg\x86 D.0g\xa7\xe6\x80j\x8e\xbbr\xbd\xdeu\xeb7;r@E\xd5\xb9\xbf\xa7\xc3g\xd5:y\t\xe9n\x8dz\xe8\x1a\xf4:\x9cS\n\x08#\x11\xa4\xda\xdc\xc1hI\x9a\x1a\x00\xf5\xf2Yu"\xcc)i\x9a\xcd\x12\x03\x9f\x19O\xbfABS\x05\xb6\x90%\xaa\xaa\x03d\xed\t\x9d\xc0\xd8\xb0\x8c-2\x81\x83\xc4\x8e\x12s\xe1\x1f\x99\xc6S\xf6\x139I]=N*\x81v\x9a(\x05\x99\x80\xc5\x8b\xbc\xae\xf0\x9b\xdc>\x1eo\xf0Mp\xfb\x93K\xb0\xa3\x06^J\x9c\xc8I?\xd8\x00\xf6a\xef2\x8a.\xe0\x03\xea\x1a\xff\xa4\x1e\xf5B\xa9\x14^\x88\x1f\x02V\xee\xc0RL\x12\x0b\xce3\xaa(\xb8-F@\xa8;)\x15_\x1b\x16\x05\xb6\xca\x86\xcc\xbe\xb2y\x16\xee\xd6\xd0!\xbcz3`i6\x99\xd1(\x1f\xc2\x05.\x86G]!\ta \xd8\xf5\'\xce\x00\x89\xae\x07;\xdd,!\x98\xcb\x1a3\x0e\xc7\xa91\xeb\xf6=^\xde\xbd\x1e\x1e4\xfd\x03d\x01(5\x16\x1a\xb5;\x1fq\xe9O\xd6#\xf7\x8b\xd4\x16[n\x0c\xd6P\'\xb2S\xe7\n\r,\xf9\xee\xe3\xd4QR`\x08{5\x0f\xbc\x819^\xbf\xf2\xab\xf4h\xc9B\x0cU\xec\x1anC\xcc0e\x8d\xf3\r\x15\x17\x9d5\xaf2h\xea\x1c\xb6\x9d\x83\x86\xb0\xbc\xda(9\xfc\xcc\xe8\xdd\xa5\x14\xf5D*\xc9c\xa4\x90\x13\xd8*\xbat\x81\xef\x95J4w \xd2\x18\xa1B\x14\xd4\x8a+a\xc2\xcd\xce\xe1\x85lc\x880\xf2\xc5\xa4\xd55\x89y\xe4<\xc1\xe1,A\xa99\xf0\xbbf\x99t\x13!\xe4\xd5g\x12 \xbc*\xb8\xb5A\x8e\n\x83\n\x04\xea\xbdV\xac)\xddA\x14\xc4\x80}>\x04\xb1\xc3\xfc0NBv\xf2\xde\xddlc\xbb\x83&\xd2\xa2\xb1>F\xe4<Q\x08gTxs=5\xe7?GI\xa9\xb0z')
1
+ #!/usr/bin/env python3
2
+ import pprint
3
+ from flask_babelex import gettext as _
4
+ import pathlib
5
+ from hiddifypanel.models import *
6
+
7
+ from datetime import datetime,timedelta,date
8
+ import os,sys
9
+ import json
10
+ import urllib.request
11
+ import subprocess
12
+ import re
13
+ from hiddifypanel.panel import hiddify,usage
14
+ from hiddifypanel.panel import hiddify_api
15
+ from flask import current_app,render_template,request,Response,Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+
18
+ from flask_classful import FlaskView,route
19
+
20
+ class CommercialInfo(FlaskView):
21
+
22
+ def index(self):
23
+ return render_template('commercial_info.html')
4
24
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
25
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,11 @@
1
- # 2023-04-08T16:23:20.526108
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x96\x00\x00\x00\x12\t\x04\x00v\x89t\xc0\xaey\xe2\xa41"\xf75\xf3\xd8\xefw\x00\x00\x00\x00\x00\x00\x00\x00@\x88\xc8L\xa5\x97\xea\x95/\x19W\xf7\x86\x7f\xce\x0c\xc8#]\x0fOqA\xffa\xb8\x06\xb9\x1e`Y\xe9\xf9\x0b\xc1S\xe9_\xf3\xf8\xdd\x7f=N\x7f\x96\xdf\xcd\xa9\x0f\'\xacY\xf7\xc3b\xe5r\x7f\x8c\x8ct\xfb%=\xa5\xe2\x95\xc2\x16\xc9t\x06\xa3}\xed\xce\x12\x1b b<_z\x04\xb1?\xd2l\x1cY\t\x07\x90%\xd7\x90\xbbg\xd8\x13\xd4\x18\x8cNyw\xa550CHZ=\xa2\x9c\xca\x956<z\xfa\x19%/:\x1d`\x0e\x15\x9bg6qn\xc5\xc3HX2.\xd4\xe6-+\n\xa9cy*')
1
+
2
+
3
+ # from flask_socketio import SocketIO
4
+
5
+ # socketio = SocketIO()
6
+
7
+
8
+ # def __init__(app):
9
+ # socketio.__init__(app)
4
10
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
11
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,35 @@
1
- # 2023-04-08T16:23:20.036754
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\\\x07\x00\x00\x12\t\x04\x00?%\xae\xde\'d\x1e.i\x1bl\xd0\xbd$\xb3\x12\x00\x00\x00\x00\x00\x00\x00\x00\xa17\x86\x8b4z\x07@\xddE\xf9\xf0\n8y8NX\x8b\xc6R:\xc6\xb0\xdar/tV\xf5l\xe0\xf2\xc7M\xdd\xf3\xda\xb9q\x9c\xa9\x9e\xf7j=\xff\x18\xe7j\x02\xb1\x8c\x15H7YD\x18\x97\xeb\xb0\n\xc6\xd5\x00hk\xd1\xb7\x08rE*\xadQ\xb4F\xf29A\x9f\xc7Z_>\x96\xdf;\x0e\xdf`\xb8\xb6\xd1I\xdb.\xd7Zg\xa6\xb8\x14\x10\x98]\xdb\x84\xf14mG\x92\x81+\xd3~\x1f\xff\x84(Z\xfcPe\xbce\xe3p\x89a\xb1~,36\xc9\x13"*\xe3\x92*\xc0\xb3\xc1\x1a\xe0\x0c \xcc\xfd\xdf\x1e\xf5\x1b\xf2\xb6j\xa6\xa3\xf6\xc1BE-vPQ\xd0u4f(\xc5v\xf1#\xddy\xbdf\x96\x9c_\xd2\xe9\x8a1\xb6!3FF\\\xd0}\xe7\x8do\xf3\xe41\xb9KN\x08\xf0\x0f\xbb\x1c(\xe4\x15\x99\xaeh\xd8\xf8#\xea\xb5=e\xd8\xd3\xa2\xc3\xaaf\x9c\xe2\x88T\xa7cbB\x9b\xa2]\x9ef\xd1\xc2t\xed\xe5\xa1>\x0f\xd78\xa7\x94\xc3\xa7[\xed\xfa\xd2wG\xe6\xd8\xc0\xed}\xd4z\xb5G<\x96\x08z\xa2P\xc3 \xdf@\xca5L4c\x81\xb0\xcd\xe1%\x0e\xa8/]\x18\x7f\xea\x1bK\xe7\x01\xaa^\xfb\xc0\xd7\x14=\xe5\x9ck\xaeO\x92iR\xfbV;\xf8\x98\x17$\x98\xa5\x0e\xa4\xcf\x0f\xd6t\x00\xee\x8e\x1cu\xbf\x8e{\x88;Fa\xdbFDA\xb8\xb5\xf8/\x11\x03\xef\xfc?uvp\xa3S\r\x0f\x9d\xc2\xcfB\xa6\xc59/\x05\xd2G\x07jx\x18Tk>\xf5c&^\x1d\xe9fL\xa0\x8b*S\x11\xd05\x17s\xd5\xbc\xae\xea\x7f\xdd\xe0\x87\xb1\x9f\xa8\x10\xf9\xd5\x1a{\xb5\xc3\xb4Fg\x8c\x9c\x1aObO\xe2\x87\xa2f\xdb8\x91\xa0\xee\xd4?6y.\xd0\xb0\xd7v\xcc\x16\xc1:\xd6\xae\xc9X\xf4\xa4\xc0\x8b\xb1\x18ie\xf1\x80\xa5A\x96\x9e|\xf3#\xa6(\xb5:\xecIP\xb2Br\xb7*\'R=\xb9e\x03\xbc~\xb7HP\xc1c\x89\x0b\xc9]1\x97*\x90\x93\xbc\x8e\xf7\x88g\xfc\xdcB\xb4\x85\r\xe7L\xe3@\xdb\xe2\x9e\xa2i;\xda\xd0\xa9C\xc2\xcb\xba\xa1\x08\xfaR\xc3\xef\'Q#j\x96\xc2K-3\xe6\xec-y\xbbScW\xeb\x85gww\x17S\xe3\x8b\xa8\x055\xda\xdeP\x8e\xa311G\xb9\xdc;\xee\x10\xf4h\x81\x00Q\x9f\x00aa\x9a\xc3/\xa9\xb6H\xa4k\x8b\x9e9\xbcL\x16\xb0n\x87n\xb2}\xa5\x15\x02\x04\x85\xc6\xa6M\x92hh\x1b}t\x80\xa7\x12\xb8z=\xd5\x14\x92\xb2X\xb5\x17\x81\xe8\x80\x86\xbew\x86\xd2\xac\x10\xd8w\xeb\x8c\x9a\x99TT\xa6\x1c\x80\xcf\x01\xd5F[+\xc2\xb6\xd7\xcb\xaf\x85^\xc3\xf5H \x97\xe8\x91\x12\x87c\xdf!\x1c\x94\nM\xb5?\x08\xf2\x8dV\'\xbaL\xa1\xa2\xf5\xb9\xf4\x86u\xdb\x0c3\x01\xf7\xd4}\xfd4\x8c\xe2c\x829n\xe8\xdem\xe9$\xd86g\xf6\xea4=s\xf2,\xfa;)\xed\x11\xf4z\xd6\x05\xe7\xb0\xe5o\x96I\xd6J\xdbO8&\xdc]xt\x02\xeao(+y\xe5\xa2\x17A\xb7R\xdd\xd1\xa6\x93VB\x12\x8c\xe6\x8e \xf1\x97\xbc\x89\xb5\x8c\xfeY\x12\x1a\xb6\x91\x14\x18P\x12\xa6\xf1\x15\xf7\xbbC\x96a\xc5\x02\xfe~\x96\xf0\x91\xd4$\x0f\xaa\x03\x88r\x05|U\xef\x9c\xf4\xb5\xc7\xf44\xa5\x05n\xda\xaa\xf3u5\xdfF\xf6hh\xfa\xf5=0y\x8e,="\x18\xd2\x88\xe8+\xfa\xcdmZSw\xffW\'\xff\x97\x02\xe1qW\x87\xc1)+\xb4\xe84k\xf3\x1f2\x17\xc0,\x9f\x05\xfa\x1f\x91\xedC,7\xd83\x8c\xb2\xc6X\xc5\xc2\x99\xff\xae\x02\xb9,b\xba\xd7p\xbf\xa2\xfc\xe8\x8fE!\xe4\x0cV\xa2*\x01(*\xb3\xb5&yyTL\xdd\xb8\xe0\xa8\xeb\xfc\xdd\xb78G\xbaX\x18\x11\xbf\x8ek\xf1\xee6\xe4\xdeg\xef\x82\x81\xf8\xb0\x15\x86t\x8aD\x84\xb7\xa6c\x88\xbc\xa2^\xcf\x11\x05}y\x1ecm\x93\xdf\x0bq?\xe8}<\xab\\D\x1c\xd0\xed\x175\x03\xd0(\x10K\xeb/\x0f\x85\xde\xe6\x9e\xcf\xc3ylT\x96\xfdHz\x9f\xf2\xb6 g\x97\xb9\xed|\x0b_\xb9T$\xacdN\xe1*G\x83\x077\x10\x02Uq\x00H\x07\x82\x81\xddS\xa1\xfbM\xd1S\x02\xd5}>q\xb6\x85\x9d\xcc\x89\xf0\x10\x11\xcc0\x93xa9\x14\xb3\xc3\xa6V6Y*\x10\xc5?\x17x\xcb\x175y\xb1\x92\xc9y\x17\xcfS\x85G\xe6\xea\xc2l1h\x9a\xd2\x9a\x811m\xc1\xb5z\xfdb?\xe8\xc9\xb6=\x81\xd0\x8d\xce\xac\xaa\x97G\x85h\x94\n\xdc\xa9\xf4+\xf2\xdf\x0e\x92\xac\xc83^A\xf7\x86\x84\xd4\x8d&?\xeb\xb5K`\xf2P\xdf\xad\xd0\x81\x12\xd6\xcd\xc8\xee\xeb\xdc\x18c\xf7\xc8\xa7\xe9\x96\x0b\xd8\xe0r%q\x1c\xc8U\x96}a\x93\x0cS1\x00r\xc4_?\xd6BBT\xef\x0eFQ\xe2\xe2m\x8d]\xd2+\x8a\xcby\xd1\x1a\x87z\xdcB\xa45\x80G\xfb\x93k\x14A\xde\xa6}}\xc5\xe7\xf5\xbb\x0e\x8a\xf4\xd6\xd5k\xbb,\xcbt$D\x0c&\x01\x00\xd0\xd7oL\x13\x89\xdb\x9a\xca\t\xab\xb1h\x85\x87\xae=E\xb1\x86\x05R\x0f6\xfb\xb5d7\xe8&\xdb\x08\xe8\x84\t\x07\xb0M\xa6kA\xe9\xa7V\xca\x95\xd5f\x04L\x8d\xd6\x12\xc2\x95 .b2e\xa6>\xde\xb5\xbe\x11\x9e\xbeF\xcf\xa6Y\xc6\x91\x1d\xd3\xcb\xdb \xab\xe9Mc{}\xec\xc5\xc9\xc9\x98#\xe7XAY\x19yC\x8e\xc4\x8b{\x8dD\x9f\xd0\xb8NU\x7f\n\x90\xf3\xf4\xfc\xaa\xfd\xbdd\xcc\r~\xd3}xg\x96\xd8maW\xe2\x9cY\xdf\xbf\n\x94S\x8e\xef&<\xcc\xa8\x11\x95\xdbYB\xden\x91&\xbbN\xe4\x1c\x1e\xd6S\xf0 \xbe\xc1\x8cn\x18t\xa7\xc5R\x8a\xeb\xf2\x0c\xf8\x164\xb8cR\x04\x81g7\xa3?\xa4\x97\xc2H\x8f9\xbc]x\x16\xf7er\xaeS@\x14\x1dx\xe5\xf7\xe2a\xd6\xfe\x88\xf1\\\xdb\xfa\xdd\xdc\xdcc\x7f\xa3\xf8\r\x1c\x00\xe7\xa1U+\xd1\r\xd3\xdaW\x05~\x17d\x1c7/\x12\x9d\xcf\x83\x86\x1c-i\xcf\x85\\\x9f\xb4\xb8,B\xec\x88C\xc7\x08k\xe0\xd6\x8c\x1d8\xcb\xecL\xbc;\x8c\xb2(\x00{\xbfz\xf49\x90*2\xff\xe6&\x02\x18\x0c\x1d&\xee\x98\xcfhuc%\x83\xdc8\x80\x04h\xe6(P\xe4k\x11A@\x9b\xc5\xe9w\xa7\x81\xda\x89\x0c\xbc\x03\xdbB\x1d\x04\x13\x9ch\xe99\xf6aK#"\x8e7\xf0\x17;\xef\x9dkT\x1b\x99K7\x9c\xecF\x019\x15\xa0*?\x80X\x01\xe0\xdc\x86\xf9`\x99U\x93\xd5P\xc7!N9VVZG\xd0\xc6\x19\x9f\xd2\xe5\xf6\xe2;\xb3\xdf\x90\xd2\x9a\xc8h\xa9\xe6\xb8@\xdd\xcbB\x14\xc6\xeaH]\x92\xf7\'\x05\x96it\x1a\xa4\x8dt\x03v\xe0#\xaawg|\xb75]\xfd\xff3\xecy\xde\xf2\xdb\x9ew2\x8e\x90X\xcf\xabC\xe7F\xa7\xa2\xc3\x8b9\xe3d\xfb\xc2\xb1\x0c\xafo\x9b\xc2\xf40\xf4{\xe1\x84X\xd4\x16\xe2+\xb7\x11d\xbd<\xbe\xd7\x801\xb7\xd2\x13\xbc\xaf\x16\xaf\x1bq\xd51Fp\xe0\x03\x9d\x9e\x8c\xff?\x17\x0eL\x8e\xef\x8bsBW\x8a\x80m\xe9\xd3H\xbd\x03\xf4\xcfx\xe6\x9b\xf8\xf5\xec\xbcQ\xf5\xef\x93\xe9\xe1\xeeKJb\x93%o\xa9"\xeb\x92\xab\x94w"\xd0p\xb39+\xbf\xea\x96e\x99#y\n\xad\xf4\xbaF\xda\xab\x86]l{\xd7\x9a\xfb5\xdf\xd9\xdeQ\xb1\xd9\xcc\xb70u\xdf\xa2N\x1a@\x9c\t\x04\t\xda\xfb\x8c\x1c\xcc\xfe\xba\xf7N\xecI(\xed\xdf*q\xc4\xe8\x1a\x9f\x1eN')
1
+ from flask_admin import Admin
2
+ from flask_admin.base import AdminIndexView
3
+ from flask_admin.contrib import sqla
4
+ # from flask_simplelogin import login_required
5
+ from werkzeug.security import generate_password_hash
6
+
7
+ from hiddifypanel.panel.database import db
8
+ from hiddifypanel.models import User
9
+
10
+ # Proteck admin with login / Monkey Patch
11
+ # AdminIndexView._handle_view = login_required(AdminIndexView._handle_view)
12
+ # sqla.ModelView._handle_view = login_requiredsqla.ModelView._handle_view)
13
+ admin = Admin()
14
+
15
+
16
+ class UserAdmin(sqla.ModelView):
17
+ column_list = ["username"]
18
+ can_edit = False
19
+
20
+ def on_model_change(self, form, model, is_created):
21
+ model.password = generate_password_hash(model.password)
22
+
23
+
24
+ def init_app(app):
25
+ # admin.name = app.config.HIDDIFY_CONFIG_PATH
26
+ admin.template_mode = app.config.FLASK_ADMIN_TEMPLATE_MODE
27
+ admin.init_app(app)
28
+
29
+ # Add admin page for Product
30
+ # admin.add_view(sqla.ModelView(Product, db.session))
31
+
32
+ # Add admin page for User
33
+ admin.add_view(UserAdmin(User, db.session))
4
34
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
35
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,19 @@
1
- # 2023-04-08T16:23:20.131630
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xb5\x07\x00\x00\x12\t\x04\x00\x9f\xc08\xec\xfa\xfd\xc6\xdf@@\x15\xad/24\n\x00\x00\x00\x00\x00\x00\x00\x00:=\xbbU7\x0e\xf9zi\xee\x99\xec\xd2\xd9\x945J_\xd5>1d\x01\xc8\xd6[\xdf\x02\xc50\xa5\xfd&w0O\n\x9b,,\xf4\xff\xa5GELy%\x9a\xba\x12Q\xb1\xf5\xed\xb3\r\x14\xb8e\x95\xffuQo\xd1\xe2\xf2\xb6\x94\xfb_\xd4a\xc7,\x1e\xbcmIi\x8e\x9dx\x180L\xaf\xc7%\xd1=|\xa2\x8c\x80<1\x89\x11\x8a\x8fO\xbd\x1e=\xaf\x8c\x07\x10\x9b\x84\xcc\xad\x88\xcc\x14\rU$\x9a\xe6\xeeu\xcfO\xb8H0E\x8b\xca\xa0\xa7H\x84K\x10\xb9x&\xda.\x01\xb9\x19\x9b\'d\xda8\xda\xcaO&\xf6A\t\xad\x02\x8e\xe0\xe7\x961\xa8>{\xea`j\x15R\xb0\xee\x9d;\xbeF\x1f\x9c\n\xbc=\x04\\\xe8\x91m\x81q\x9f\xe8\xc6\xd2\xf0\xfe\xfb\xd2\xf1\x12\xa4\xcd\xdfxE2R\xde\xed\xed\x84P\x14\xd0\xec/C\x8d\xe0\xbfH\x83\xf1\xb2<\x13H\xb8\xa9\x07S}O#\xe7\xc9\xe0\t\x96\x98\xb8:wsQ&\xa9\x81\xe27;\x9fE\\x\xd3V\x0e"\xabW\x93k\xc8\xd3\x06\xf3\x9b\x10\x02\x9eJ\xc6\xd5M{\xb2"\xa1\x01i9G\x93\xa1\xb1\xbb\x00\xe2\xd7m\x01\xd1\xbdV\x9a\xa4\x8d\x01h\'\xb9T\x12\x8c\x99\xf16\xf2|\xd2\xd2\xec\xf8\x88\xb6#_\xcb%\xa71"\xbc"\x96Xs%|S\x95\x93\xab#\xee\xcc\x0cQ`\xb2=\xce\x17Sv6\xdb\xce\x15<\\Z\xdeC\xc1\xe8\x9e\x1aQz\xaf\xff\xed\xf4\xac\xec\x8f7\xc7^\xcc\x80\x11\x95\xba\x8b\xd1W\x88~\xad\xbc\x9e\xb6\xda}\xba%Y\xa5\xcf|\x1a\x02\xb9\x8e\x8b\xf6G|\xfb\xb4\x89\xbf^\x85\xa4\x1a\x9f\xf4\xfe#\xf2\xa2\xf9\xdbq \xfd5A\xb7\x81\xc8\x1b\xa8F\xda\xb3\xcb\x81\xa7Z\xf7\x1e\xa4\x0ea\x90\xb4]\x11\xd20\x04\xe0Zi\x8a[\x0f\xcc1\xfb\xe7\x12fG\x89\xfa\xf6\x011\x8d\x8b;R\xd8\xb8\xd4?\xcd-\x9f\xad\x15\x8co6\xd5\x8e\xd3z=\xaae\x9f\xf9\xc6D\xd4\xfcxhe\x8e+\x88\xe3.J\x93\xc7abN\x06\x8b\x90\x82w\x0b\xc2\x80B\xdfV\x99\x98Y\xb9\x8b\x95q\x94\xdaac\xd7c\xff\x13\xe8\x1d\x0c\xacQ\\\xf6\xf8K\x1a$\xb9\xfd\xfa\xbe3\xd5\xee\x8f\x902\x0c\'\x9d\x1e\x84\x80ft\xf0\xea\xed\xf2Jp"r#]\xfa2j\x1d#\xc8~\xd6\x843C\xa2\xb9\x94\xf6\x1eM\xe9\x849\xef\xea\xba\xfex\x86\xde5\xe9\x10\x8fK\xcc\x8d\xd3(+\xb6\xb2\xcb\x08u\xc4\xc1E\xdau\x14\xfau\xa4?\t\x8d%\x15D\xbc\x1c\xa0\xd8\xf2\xd1nk\xb1\x98U\x02<s\x1d7|\n&\x1c\xb2\x05\xab<\xef*\xaab\xf1<\'p\xa2\x8c\xba\x8b\x81J\xe8\xbc\x01Fhz\xe6\xa4\xa7\xa8\xdbFT\xcc%=\xb4\x08Z\xb2\x82\xd2\x92U;\x9aS\xe9\x0e\xa64\x16>\xf1\xca\xfe\xbf\x13M\xdd\xe1D\xeb\x08\xcc?n\xab@\xbac\xde\x17-,=\x06l\xf6\xd4\x07\xc7\xd8pO\xdd\xa8\xdd\x15XQq[\xd7g\x8fJ\x1c\x99C\x12w\xe2\xadu\xfbE\xccPK\xba\x07\xbbEy=_H\x1fJ\xa4\x1f@]\x8cE\xa1\xa2\x92\x91\x0b\x10jQ\x1b\xbe\x87\xb1I\xc0\x8a6\x90P\x91c2^\x88\xb2\xa2&\xc30|\xb3(\xac\xd8&\x91\xe0\x04\xff\xa0T\tQ\xc5^bR\x8f\x93\x12\x97gF\x14\x10\x98\xc2\xc3\xf7\x0b\x1e\x0f\x00\xb2\xb5-\x02\xa5]7.\xc8_\xb0\x8ezi\x98\xf3\x89\xfe\x10\xc35 \xa7\x175\xb27\xaa\xc3\x1a\x1a\xa0o?\x1a\xc6z\x9a\x04\x02o\xbdsL\xb8\xcawk\xf5\xd3r\xe4\xf2\xb20\xfb\xee\xaa\x1d\xf6\xdc\x19\xd8\xacQR\x9b\xb1e\x8e\x1a\xbctK\xca\xa1\\L9v%\xeb\xf4\xe0\x83\x88=\xfaw\x0e\xc5\x07\xcc\x13\xa5~&\xd5$8\xebT\x99\x8b\xbe\xb0\x05\x1a\x90,\x15\xffN\x923\xaf\xdf\x93\xc1\xed\'R\xa8\x13\t\xe3V\x95\xc4@\x9d2:0+\xde\xa7R\xf4\xe4\xd3\x0b\x9cQ\x91\xfa\xa1+\xefH\x13V]\xdf\xa4\'\xd8V\xc0\xd1,\x88\xed\x0f39\xfb\t\xe9\xad>v\xd7\r\x1dM>{\x84\xf2\xd6\xb5x"\xd0\xf9\t\x1d\xf4(\xbc\xe1{\xecb"T\xfc"\xc9\x12\x18\xf4/\xc9\x8e\xa8{[\xfa\xf2E\xe8\x924\xe1_\xd5i\x8b>\xf9\x8f\x1e\xf7\xbd(Y&\'\xe3qKd<\x8e\xea8\x11\x90\xf3\x03\xfd3\x95S\x9cW\x14\x92\x0b\xd8\xb1-\xd9\xa9g\x16\x91\xfcc\x8a\xc9\x9dQZt\xb7Uj^\x19\xf1\x81*\xba<\xfa}\\\'\xe4\x19\xa9\xca^\xe0\xe2\x16\xc4m\xca\xc6\x84\x88\xbc\x91\x90|\xeb0\xc57\xb9\xf0\x81\xbb\x96\xee#y\xa10\xef\xc6\xe4\xa6r\n\x9e\xbf\xf2\xad\x91\xba<\xd7\xb2n\xe1@\xd3d\xd4\x8e&\xb2.\x9b\x80\xf8\x07\xe0\x01r&\xea\x85 \xe0T\x94\x85\x0e\x1a\xaa\x8fRx\xd7\xca5b\xfa\x1d\xb3\xb5<\x13\xab\x8d\x91\xfa(\xf9\x8f\x16k\xdbvB\x9a\xed\xb1\x98\x04V\\\xbd\xe1f\xbc\xbd<\x19\xf2V)\xd0\xdf%}\x98\x9e\xd7v\x0b[\x8a\x9e\xcd\x96"\x19\xf6\xcby\xbb\x06\xb2\xcf\xda0>\xe16\x0e\xe87\xdb\x80\x87\xe3\xf8\xa1\xa9\x8b\xdf\xde7\x15\xde\x04\x86\x92`\x01\xfaE\x9d\x84\x9e\xd9\xda\xb16\xf5\x16)\x97\xbd\x95\xea:\xef\x0cq\x95\x84I\x9a\xf1\x1e\x98\xe0\x8b\xa1(\x01-kh\x97;\xa8\x82<OH\xe6\x15\xaf\x95Q\xa8\x96\x82*\xae^\x19m\xad\xbf\t\r\xa2j\xc6\xa7\x9f!X\xd0\xb9n\x8a\x7f\x8cp\x0e\xf8\xf6\xf9\n\xee\\7\x03u\xe1 }x\xf1\xaf\x0e\x0e\xfc\x8d\x92\n\xa1\x9b+\xfe\xcf\xcf[\xff:S\xd8\xd3\xfb\x16G\xe4\xf3\x91C=\xa6M\xd9R\xb8\xc7O\x84\x0fR\xb5ma\xdd\x84_PC\xad*\xea\xdeU\x89\xb4 \xf3\x11po\nS\xd0-\x17@\xb1N\x0e\x90L;V\'\xba^\xd5\xad\xdd\xf3\xb0 99\x97\xa6\x89\xb2\xb7g\x8d\xedYT o=\xed\xc0[\x0f*n\xfc\x04"\xdb\xc0\xcbM\xd0\xa1\xca\x04\x11U\xc9\x97h\xda\x05\xea\x98I\xd7s\xdbNH\xa0\x8e3\x01\xf5{Y.n\x8aH\x96\xf7\x95\xa9\x1en&\xcf\xec\x0c\xf3\xd4\xc3<\x90\x8f\xadTzE\x9c\x89\xe1\xd5\xcf\x0co\x1b\x08\xe7M2FO\x0f\x02\xae\x1d\xda\x9ei\x873/\xc1l<#CU?\xd6\xe68lT\xd3g\x04\xc5\xaf\xe4Ec\xc6PE\x12w\xb0\xbc\x04\xe9i\xd2Z\xc1\xa2\xf1\x03\x94\xc7\xa6m,sw\n\x99\x02\xe8))\xb9M\x1a5\tG\x10\x91\xda\x02&\xac\x1f\xdc\xe9v\x06\xe8\x07L\xd1\x04\xf6.G\x97a%\xa0\xd9Y}\xadhA\xde\x1d\x904e*\x1a\x07\xc4\xf9U\x114_vPh\xe0z6=\x87}\x9d\xd7m\xe6[\xa2F6\x9e\x11Z\xc3\xd8?#Y\x1b;\xeb\xd5\x01\xfcd4\xee\xb5\x94cz@OP\x18\x87\x1d\xa2V\x18\xf6,\x1e\r!n\xf5\xf5\x9c\xd7\xbe\xf8\xe0\xbfK\x8b\x80\xf6\xe3\xb0\xd6Q\x9e\xf4\x04s\xe8\x18nz\x18X\x81\x89\xfcO\xc4\t:\x12\xc5/\xf8B\x07\xa9\x05\xccT\xbf\xffU\xf76\x05b\xb2\xe3\xf8\x82"\xcc\xbf{\x05\xba\x17\xf9\xb9U\xc3\xec\x82\xe7\xddI\xfe\xf1\x01\x0c]\x1e\x0e \xfd\xba\xde\xdbUS\xbe\xcbbR\xce\x8bi\x96\xf3G\xa5`\x14}R"\x03\xdeU\xea.\xf0\x07\xce\xfe\x14\xec`\xf5\xf0\xfb3\x80\xed\xf8\xf7\x0b,\x12\xfb\xcb)\xf8Q\xfb\x14\x11OZ\xe3\x8eF\xc3\xaa\t\x99-/\xa3\xc91\xc4\r\xd8,|\x80\x991{e\x1a\x97\x90:\xee\xdb\x00\xd5V\xa4\x9fJ\x80\xd8Y\x0bwH\xd0\x91({N\x04q\x83z>\\\x96.EX+n\x9c\xc2C\xfa|)\x93\xd9$c\xd4\xe7\n\x03\x9e\xc1O\xfe/\x91\xa0p\x1b\xd0A\xc5\xbf\x87\xa0m\xa5\xd6I\xd8\x88\xa5\xa0\n\x96\x08\xa4\x12\x80\xea\x082\x9c\xe0K\xe2\x9c\xf18\xed\xe1\x18\x8f\x1b\x17\x94\xc7\xf7\x1d;\xe3=z\xe3\xcf\x8f\xff \xa9\x93e\x1d\xd9)\x1e\x1b')
1
+ from flask import g, send_from_directory, url_for
2
+
3
+
4
+ def send_static(path):
5
+ return send_from_directory('static/assets', path)
6
+
7
+
8
+ def init_app(app):
9
+ @app.url_defaults
10
+ def add_asset(endpoint, values):
11
+ def get_asset(path):
12
+ return url_for('asset', proxy_path=g.proxy_path, path=path)
13
+ g.asset_url = get_asset
14
+
15
+ app.add_url_rule('/<proxy_path>/asset/<path:path>',
16
+ 'asset', view_func=send_static)
17
+ pass
4
18
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
19
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product