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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) 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/clash_config.yml +1 -0
  58. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  59. hiddifypanel/panel/user/user.py +233 -3
  60. hiddifypanel/static/css/custom.css +6 -0
  61. hiddifypanel/templates/500.html +1 -1
  62. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
  64. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
  66. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  67. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
  68. hiddifypanel/xray_api.py +109 -3
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
  71. hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
  72. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  73. pyarmor_runtime_000000/__init__.py +0 -4
  74. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  75. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
  76. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
  77. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,36 @@
1
- # 2023-04-08T16:23:31.404900
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\x11\t\x00\x00\x12\t\x04\x00\xfe\x02\x96\xbao\xbe\x9d\x0b|\xdb\xf7wV\xd2\x9b!\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x167\xd36\x9d\xeeU\x92\x9bP\x06\x15\xde\x97\xa1\x97Yb!\xa8H2\xad\xd2\x98Kb\'\xa3\x91_\x0b\x10\xb1\xde\x1c\x02Q7\x82/E\x7f\x8d\xda9S]\x11\xd3\xbe>\xad;MX7J\x122\xbf\xe6\x06\x04Y7m]v=5w\x8a0\xa5^WQ\xdf8\xb0^\xe3~\xb0\xbc\xb0\xcbZy\xd74\x9a|\x03\x02\xa1\xb3\xd1\x8b\x9f\xb9\x8c{H\x00\xe3\xae@\xc8\x17\xe2@\x1ek\x94\x96\xaax`Z?w\r\x84\x16MPKq,\xc7\x88_r\xd6\xcb\x98\xeem\xcb\xc3\xa5\xea\x10\x80n\x7f\xe3Wr\x15\xd9\xae\x07@\xdb\x1b\xac_\x0cp\xbdvT\xb0\xb2\xd5\xa4`q\xa3Gl{\xa8\xe3\x0bu\xd0\x80\xa2X!\x1a\xef\xbd\xc4@@w\x15N\xcc?H\xd1\xb92}\xd0SQ`\x86 \\\x90XC2\xdf\xb4>(Q\x87M\xf1Wv\\]+\xd8b\xc4l\x02\t\x81\xc3\x00\xd7f\xaf|(\xe6R\xb5l\xee\xf6\x89\xfe\x93\xe6<\x07\x8eM\x96\x97\x01\xdc\xb5\x9d\xea*\x8beP\xc9\xc6\x1c\x9bv\xb0\x94\xb7m\xb6r\xe8dL\x98\xd5\xc3\xec\x8bn\xd9\xcaV\x9f\xdf?\x06\x17\xdd\xc6\xecqR%\x0f;\x1b2ZyG\xa5Z\\\xbd\x87\xc4\x1aym,L\x0c\xe9[u\xc8\xed\xedt\xeb\xbe\x92\xa1\x10\x9e\x05l~\x8al(\xa2@\x8d\xbeS\xcf\x96e\xf3\xb0\x13$\xbeM[\xff1\xad2\xb4\x9dh\\+\xe1fD\x0c\x85\x10)n\xcb\x8a\xb9\x95~%\xfcg\x8d\x11\xd7FB\x10\xe1`d\xbfdc\xf0\xc1_\xa3\x00\x8e\xc9\xc3\x86a\x0c9\\JO|\x06\xe2\x8eI\xca\xbf\xfa\xfd3,\xc5_\xeb2\x8c8J\x05\x9eZoG\x03\x8cT\xf9\xd2\x8f\xcf\x9a\xfc#J7*\xd5\xd2<\xf42d\xb87\xa6+\x9c&\x81` ^\xa8\x04SF\xf2\xc8\x02\xec\xec\x8e@H\xb2^\xcesv\x859\xdf\t\xcd\xca\x16\xca\xf6Cg\x9e\xfe\xe6\xe3w\xcd\xae*\xb5\xbdw\n\'m\r\x86a6i\xe6\xd7V\xc5\xe9\x1aqe\x00\xd2k\xf5l\tRtc\xaa\xd9H\xb8Er\x81c\x8a1\xd36\xbb\xb3\xb9\xd8\t\xc5RN\xdd\xa7\x99\xc3\xadb\xef\xa3\xe3\xc6\x92\x90\x9e{\x06<N\x18J\x1e\x00B\xb4F\xd4\xcc\x19<(\xca\xb1\x88T\xdc \xdf\xbc\xd6?\xfc\xa6\x87\xe9\x1e2zrw\x99\x07\xf0\xfbIw\xfaW.\xd4\xec\xa4\xa8\r\xc0\xdd\xdcD[5\xcd\xfa\x81\xb4<\xa5\xec\xd66\xde*2\xe5P\xb7\x8c1\xdbS\x1c|> \xd5\x93\xb0;\n]\xe4\xa10j\xe6]\x17\xcd\xc8\xc9\xcf\x8d\x9b\xe1\n\x14\x14<\xac\xb9\xe3$\xa2^\xba#u\xefwz>J7\x8c\x91\x9b\xba\xc4\x1f\xf5\x0e)Y\xc5\x13^\x11q\xde\xde\x07\'N\x8cG?\xe8\xd6\r\x15a\xfcRk\x14;\xf1E\x11\xc6\x7f\xa6\xe5\x9fRk\xc3z\xd6\xa0\x93\xa4\x9am\x03E\x1e\xa7\xed\xc8\x01h\xb0:*\x12\x12\x93\xde\x1d_\xd3-&\xf7\x83\xb5(\xb4\xbe\xad\xb0\xa1\xf2\xe6\x06yc\xbaBI\xb5\xac\xb6fuJ\x85w\x0f\xfdF\x90}N:\xab\x15]\xba$w\xb0B\x7f\xec\xc0\x06\xf8\x9bm@Vc\xefQF\xf5\xc1\xe6\x8bz\xe88\xb966\xa6\xc2m\x1932C\x18UZ>\xd8\xab\xaeP5\xc1\x85\xbe\xf8G-0\x1cDFV\xb9\xa5\xcc\x19"\x88\x9cT\xda\xbdX\x06\x1b\x019\xf6z\x9d\x8d d\x0e\\\xa0\x9af\x1f\x8bm\x046\n\xcb\t\xc3\xbb\xfdI\xeb\xdc\x18\xa3\x843\xedP|\x94`\xad>\xa5\x9cXT\xcb| N-\x17\xbf\xd5I@\xd1!\xd8M^jV\x83\xa3/~G\x06\xcao)\xec\x8bM=\tM\x10$\x9f8g\xf2\xc7\xa2U\xb57^\xdeAD?\xd0\xb1\x19\xd7\x1e\x0e\x97\xb9\x82\x9c\x9d\x89\xf4 L(\xd15|s\xf8\x0e]p\xbf\xb1\x80v\xa3\xe6\xac5\x80\x80\xa5\t\xd7=_{6;\x1a\x10\xef\x04\xa9\xdfb\xf4\xe9\x02U\xbb\x8ao\x98|?\xe0?\xda\xc0g1\xfe\x06\x8e/\x9d\xa7{\x95\x96\xf2\xaeC\x9f\x84\x87\xe5\x9d};Gi\xbe_Ct\x9c%]@\xae\x8a\xec\xdb\x81\xc0\xcd\xa1W&\x17(L\xd2\xb8\xc5\x13\xabM\x81\x97\x84\xdae\xda\xf1\xac\xf9\xbd\xb2\xb2\x18\x97\xb0\nG\xceb\xa3\x0c\x9e\xf3rx$m\x9bl\xebp\xb2q\xf0% \xc7>2\tvU\x02\xed3\x1e\x03\x17\x13\x90\xc3\x99\x0e\xd3l\x11\xd5\x15\xab\xf7\x1f;\x030re;\r\xf6\xcf\xfc\x97\xd4B\x00\xa9\xe3\x88\xb1R\x82[V\x90+S\xe0\xe6\x12*H\x13V\xa1\x18?e\xf9E\x88/\x07G\x82\x95v8\xdb\xc2\x193\x8b\xe06\x92\x82L\xe6c\x8f\x87\xf5$\xbat$o\xa3\xc1\x99\x8dT\xbc\xc3\xe0\xab\xd5\r\x8f/x^X\x91y\x01\xb5v\x8aO9\xe5O\xbc\x1e@\xc6\x08\xc2\t\x17\xba\xfa4\xfd\xcd\xb4\xe1\xedG`\xc4J?\xb2\xcf/\x13\xf7_\xb9K\x17\xd7\xc4D\xaf>\x00\xba\xf3X\x8e\n\x8ce\x02\xfb\xa6>,O\xe2\x88\xb78\xdd[\xd3\xe0\x02\x16\x17\xdf\xfd}\x08\xa6\xbd\xeb\'N\xa6\xba\xd6\x85\x15]\x8f\xa6\xa3\xf82\xc5\xa6y\xa6Q\x80K\xbb\xd7\xe3\x84\xf3\xd0czK&\xe9\xb4\xd5\n\xa3\xd1\x802j\xb1\xcd\x8bh\x9f\x16>\x01h\'\xb3j\x84\xd7\x1f;F\x93\xbfK\xf7\x0e\x97\xb4x&\x8fr\xa8\xce\x0eK\xa3?\tp\x04\xf9\x95cZw\xf6\x91\xe2\x13\xf6\xb3\xd8\xd9\xb1y\xa1Y(\xc7\x97\',b\xbc\x02\xc9\xfa@\x05=KH\xc9\xfb\xc5\x0c\xa3M\x83\xc6\xc7\x00d\x7fB\x8fK\xf9,\xea\x1d\xd4\x93D\xe7\xb7K\x9eC\x0e\x17\xbc\x1b\xd4\xb0\xa7Q\x918\xf0\xec\xcd\xc0\x80\x0c$\xf0\x02\xb9\xe3&M\xb9\xccOV\xd4A\xab\x7f/\xfe\xfd\x1f\x04d\x98\xb4\xb9"w\x87\x9e\xcf#\xa09~-r\xf5P\xeaj\xc7\xe5\x82\xf5\xd9\x90I\xf4{\xbbC\xae\x8c\xd0\x8e\xe2\xb9\xc6\x95bc(I\xa1F\x8b\rK\xf5\xa2\xe8\xb4\xf2\xday\xcf#E@\xbe+\x8aC\xd0\xe5\'\xb2\xad8\x1eL\xe11]\xa3;y\x01Y)\xa0\xb0F9&\xe8\xf0\x0b\xbdL\x15\x1aQ\xd9[_f\xb53\x8a\x97#j\x07\xd1\xbc&\xcbW:\xe9\xab\xb5\xe7j\xf3\xf4|\x90\xf6I\x0b\xc8\xab\x8ea\x93:A!\x80\xd9\xb09\xaa\xbc\xfbq\xb7\xb7\xceAfk>\xb5Ou?\xf5\xc4\x90\xb0\xebo\xde\xdd\xedU\xc5\xe6\xb3l\x0c\xb2\xd2\x96,c#A1C0P\xa2\xfd\xf5\x06\x19\xe7v\x91,N\xf2c\xc4q\xc8?\xcd\xc9A5\xf2@\x0b_\x80+\x12G#W\x1f\xbe_h\xc9A\x14\xac\x0b-\x049\x1fu|\xc2\xa5\xeb\xf6\x8a-\xfd\xb1Y\x8e\x92\xb5I\xc1\xf6\x9f\xef\xb4>NgE\x9c\x81x\xa59G.\xf5\t\xfb\xa6\xfc\x97\x19\xfdR\x86|V\x0b4j\x0b\x99#V\x85!\xdaP8zM\t\xb9\x11\xees\xbbh\xe57{ECes\xe4go\xaf\x89 \xffT\xe9\x9aq\xd2\n[\x1e3m\xca\xbbj\xdaw\xabe\xc6\xa2s\\o+\xb06-\t$5\xacK\xc38\x90\x0b\xde)\x9et!#\x01[\x03\x9f\x0f\xbcA#"\xee\xea\x14s\x87\xbde$\xb5\xd9Z"3So\x9cc\x10r\xe6\x0b\xf7\tN\x13\r-8\x0f$t\xbc\x13\xbaDm\t\xaef\x96\x1ausD\xac\'\x93E\xc5\xe9i\r=!(\xf8\x1a\xe7\xceZ\xe0\xfa)\x9b\xaf\xf8^\x10\x81\xa2"\xe4\xb4OfX\x13\xcf\xc2\xc2\x94\xbf&\xcee\x9e82\x83\x0e\\\xf8Z\x1c\r=\xfd&\x1b\xc7O`\xe2\xab\xfa\xd5\x8d\xcf9e\x87\xcf;\xb3\xd9d\xb4\xbb\xd1\xe1\xf2\xc1B\xff*\xe28+\x04\xd1z*L\rw\xd5\xe2-\xc4}ZX\xc0\x02Bj\xe1\xb10^\xac\xad\xd0\x1b\x14"\xad\xfe\xc6\x9b\xd4+\xdc\xd3\xd8\xfcPb\xbc\x13\x0b\'k\x03\xff\xcd\x9c\xaf\xff\xc7\xf1\xff\xbb\x83\xa6\x93\xfc\xbc\x05Tk\x84AS\xab\xa6\x1cz\xd5*\tB\x1e\xef\xf4|\x0bd4\xaf\xd8\x9a\xfd\xe9\xf8g\xc9\x8bZ\xa4\x17C\x93\xa0[aS\xde$y\xfe&\xa8\x05Qe\xe7X\xb2$\xd5\xf06\xf0\'\x8e\xc3F\xa6P\xcd\xe1\xec\xbf\x87\xbc\xeeu\x15\xc4d#\x96\xa5\x0c\xfb\xa9p&\xcb*\xd9\x18\x13\x92\xd5\xc7\xfam\x1d\xf3Q\x82T\xa3S\x80\x91\x06\x1eK+X\xd3\xbb<\xb5\x1f\x01\x03h\xaf \x03\xdcZ\x96]b\xe8tGsG\x15\xcb\xcbd\x88z\xe0\x15\xc9<\xcbm6\x99\x99\x92d\x18 >\x92\x9a,\xeft\x94\x0b\nT\x89\x0b\xd3/qq\xcd\xc1\xcb\xc0\xf1dJ[N\xc4\x9d\x05\xe8)\xc3-\xf9\x01\xab\xe6\'\x7fV\xe2\xce\x8a\r\x98\xd1kA>\xe3\xcb\xb6\x9ci\x10\x00\t/\x8fAF\xad\x9d\xde\xd9\x1a\xc4\xb9\x0cK\x88i\xf9\xf3\xa5a\x16e\x93NgvfC\xee\xc1\x14\x8b\xc5\xa4\xed\x02\x90\x91\'\xd4\xe3\x02\xe9\xe6\\\xac\xec\xaa\xc9\xd8\x8e\xfc<\xdd\xa9\xd3\xa5\xf5`\x1a\xb3s\xdak\xf6,\x03\xff\xc7\x8dO+\x89\x9a\xac\\\xaf\xd5\xe9,\xfay!g\x92\x98\x12\x8eC\x8e$@\xdc\x0c\xff[\xc1uU ^\x87nB\xdd\x1b\n\x01\xfdn\xfd\x13C\xa9\x11\xf6"gg\xa83\x99\x8e\xe8&\x1eVk\xafg\xa3\xcf\n\xe2\x16\xe9\xed\x8d\x9e\x98\x18\xb3\x8e\xcd\x80J\x8c\xa9\xd5\xe7\x96')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from hiddifypanel.models import *
2
+ import CloudFlare
3
+
4
+
5
+ def add_or_update_domain(domain,ip,dns_type="A",proxied=True):
6
+ res=False
7
+ if hconfig(ConfigEnum.cloudflare):
8
+ cf=CloudFlare.CloudFlare(token=hconfig(ConfigEnum.cloudflare))
9
+ zone=get_zone(cf, domain)
10
+ if zone:
11
+ dns=get_dns(cf,zone,domain)
12
+ data={'name':domain[:-len(zone['name'])], 'type':dns_type, 'content':ip,'proxied':proxied}
13
+ if dns:
14
+ cf.zones.dns_records.put(zone['id'],dns['id'],data=data)
15
+ else:
16
+ cf.zones.dns_records.post(zone['id'],data=data)
17
+ res= True
18
+ return res
19
+
20
+ def get_zone(cf,domain):
21
+ zones= cf.zones.get();
22
+ res=""
23
+ if zones:
24
+ related_zone=[z for z in zones if z['name'] in domain]
25
+ if len(related_zone):
26
+ res= related_zone[0]
27
+ return res
28
+
29
+ def get_dns(cf,zone,domain):
30
+ dns_rec=cf.zones.dns_records(zone['id'])
31
+ rel_dns=[d for d in dns_rec if d['name']==domain]
32
+ res=""
33
+ if len(rel_dns):
34
+ res=rel_dns[0]
35
+ return res#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
36
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,127 @@
1
- # 2023-04-08T16:23:31.571037
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\xf1\x15\x00\x00\x12\t\x04\x00\x85tHa\x0b\x96)76\xbf\x12(G\xb7=v\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x98\xeajQ\xbf\x8b,]$\xb6N\xe1J&\xf4\xc26awxS\xdc\xa5V\x81\xd6\xf2\xbb\xb4\xbc\x0c\xc0/\xfc*EyX#(OK\x9ck\xe6\x94\xee \x86\x8c\x9e\xc9\xd2\xb9?\x12\x18=\xe7-|S\x1f\x0c_\'\x02\x89\x0eZ\xf14\x81\x1cuw\x8b\xb6{\xac\x8a\xd0<\x1f\x8f\xe6<\x80\xac\xf4\xaf\x0cu77\xa2\xc3B\xf6\x81\x97\x04USR7\xb4\x7fL\xff\xb3\xa9-\xb7\x00D\xe2Y\xbd\xa1\xb64\x9f\xd2\xf2\x15\xee\xf6\xa7\xe7]\xfe\x7fZ\xd5\xb1\x08\xfeu\x9d<U\xb2\xf2\xdf\x05X\x007Rx^\x19\xde\xf947\xceq\xea\xde\n\xea\x92\xc4\xcc\xd0n\xbc;*\x82\xc36\xfc\xb7\xca*\xdc\x0f\x95\x8c\xfd\xce<\xcb\xd1\xe7u\xc1\x9c\x0f\xf4\x18hY\x81\xcb\xc8\xc9\xd0xL5R\xbd\x1a\xad\x86\xb7\x05\x1e&j\xb9\x8b\xe2 \x14\xb3\xd3\x86K\xe1y\xae\xf5w\x82\x16}\xdd\x90`\xc9~\x18Znp\x1a#\xb9\x10\xda\xddF\x10\x03\xbeUS\xb8\xb8b\x9cJ\x17\xbdsE\xd5\xc1\xf6\xb5v\xb7(\t\xd1\x13:\xd7:x)H}\x85\x04\x11\x08\x06Z\xf5\x01\xd2\x1b\x93\xbf\xe9\x1c\t2\xb9\x17\x08\x14\x98\xf2\x9a\x82\xa7X\x80\xf1\xd7\xdf[sN\xae\r\x1eOy\x91l\xe1g)^\xc7%\xab\xe9\xd9x(\xf0\xde\xb17:\xb1XhSYan\xf5(\xa0\xbfh\xcbO\x19\xf8o\xc1\xb9\xa4\xad $\xf6\xb6\x0f/\xc5\xd3<\xd6\xe9\x8c\xd9\xd336\xd8\x84\xe6)\xb4\xab\x04O\x9a\xdb\xafm\xb3otcK\xc1\xcbQ\xde\xc7\xfa\xce4\xf0\x97\xc93<#\x02\x93\xcb&65\x81+kY\x80\x08\xd0\x87N\xfe$\xe6\xe0\xb6:\x04\x18!\xf9K\xa8\xec\x853\xa2\x8a!\x19\x82\x9a\xfe!\xae\xe4\xbd\xf2PI\xc5\xd8\xf4c\x86\xf0o\x16\x81\xd6\xb1\xd0El\xc4\x9dP\xb8\xf7\xc4b\x06\x1er\x15\xbes\x04\x99\x13\x1c\x86G\xff\x93\xcf\x81\xf8\xe5\x04&_\xa4p&&[7\x11\xf5w\xf9)\xaeg\xa3\xa7\xb7jAx>\xea\x15\xe1\x91\x07\xfe\xd8\xa5Ua\x0c$2ID\xf8]\x91\xf4\xf1%\xc6\xb1\x1c\xf6;\x0bW\x92\xf7\x8b\xa9w\xe0$\x80\x02xP\x81\xa7W\xc8w2\x96\xbc\x8b\x11\x1cc\x8e*\xbfb\x18^ \xeb\xaf\x1f\xaf\xfacMO\xdcQ"\xa1\xa5\x0eC\xb3=\xf5\x0f\x01\x97@\xf3\xc8\xfe\x93\x8e<\x19\x0f\x80\xb0\x1b\x9c8\xf9\xc5\xe2\x08\x9c\xe4}0\x81\xe4\xe2^c\xe5bunL]\x99\xfa\xd3\xcd\xee/\x80"\x8d"?\xc6@\xb1\xb5\xe8~\x7f@\xf2i\xdbPS\x9a]\x8ak\xf2\x9a.\x07\x81\xe6\xfd\x9f\x83\xa7y(Q\x11\xe9\x80\xe9Q1\t@^\xf9\xb1\x11\xd8\x14\x9d\x83)\x90\x1d\xf4\xef;\xff\xe2\x03\x13\x93\x88\xb1\xf5\x9d\x89OX|\x08\x8e`\xa1r\x9al\xd07\x9c\xa3l\x92k]\xa3\xa7(s~1\x14+!\xffr\xf5\x8dM&\x12/\x8e\xb3I\x0f<4n\x9b\xc7\rJWT\\\xea\xbaw\x8b\xefn}\x99\x10\\#\x8a\x07\xb8\x8d#\x13/\t\x88&\xf8\xd97af;\xc9\x17\xa9?^n6\x7f\xf2\x9d\xb0\xfax\xf1\xa33\xd6\xcd\x87C\xa0\x9f^\x1f\x11#\xe5>\xf5\xb1\x0bn\x91<N\x9cchDk\xfd\x02\xb8tht\xb4\x01\xa44\xa4\xc6\xf2~\x08N\xac\xf5\xf6\x19\x15"\x1e+\xf7\x94\x13\xca\xe4I\xaaK\xc3\xd0\x93\x01~]\x07\x1fuJ\x9f*Z\xbc\x05)n\xc1kj\x04(\xb2Qg\xb8\xc5W\xa9\x81\xd2\x80\x96\xccNf\xf9;\xad.\x00\x8d\xf9\x80J,\xe9 \xef\xd3\xef\xdb\x07\xd6\xca\x90p\xd8\xd8\x03\xdaJ;\xba\x8b\x0e\xc2B\x8c\x04%\xd6\xdd\xe7p\x17\xc27\xde`\x8a)6\x87\xf5\x00bN\xe6\xd7\xbe\x12B\xb0b[T\x93\x0f\xd0p\r\xa8\xb5\xdd\xc7i\xe5\xcd\x1b\xf7A%\xf6\xa6\xff\xa9\x0e\xe2\x7f\xea\xa2W\'z\xfc\x18\xf1\x1e\xea\xf8\xfc\xeeX\x90\xc5\xb9]\xa7\xbe\x0bI\xcfq\xa0\x8a\x0c\xcb\x1a\xc8P\xfc\xf1\xf7\xc6\'\xda\x9b\xed\xc0\xb3\xf9=\xd1\n\x8e\xbdG\xc5\xc7" B\x8a\x92\xa6\xae\xb9\xd5\'\x88\x97\xa8\xd6P\x1cw\x06\xf7\xaa\xd9\xb2^\x07+\nf\xa9\x1b\x80\xee\xcbV[\x1f\x84\xaf\x89b\x83\xe4\xbdsAk*\xae\xdf\xb3\xd5\xce\x9fy0\x02\'0n\xa9j\xe2\x08\xa2-\x85Z\x14\xca!Q:_B\x1b\x88\xd1\x8ex\xf6\x11\x81\x1f\xf6\xc33\xafH\x18XU\t\xcd\x18j\x9a;ev\x1e9S\x98\xb4\xe3\xac\x8c\xbc\x83\x80.\xfc\xa8tj\xfa\xa6,\xfd\x04_\xcfp0\x1e\xb6E\x177\xb5l\xfb\xd2\x18\x94\xe9\x1a\xae\x8f\xcc\xad\xd6\xea8\xee\x8a\x90\xf6\xf1\x88\x9c\x1c1\x7f4\x84\x9eO\xc8b\xb1\xf8\xfe0=n\xde\x99\xfc\x0f\xc0v\x04V\x9f\xe8\x90\x14\xc0\x89\xd8\x81\xdcM\xbe9\x9f\xc5\x7f\xb7\xcf\xb3\x02\xff\xe6ix\x1c\x8a\xce,q\x81rn\xf6\x99As(/W%\xcc\xbcN\x99\xcd\x82gV-L1T\xe5|\xc7\x9d^{D\x055f\x05\x98\xf1\x7flq[\x94\x8dt>\xb9\x9ct\xba[\xa5;\xb5\xc0s\x85\xb8\x19Kk\x19\x03\x14[\xd8\xf7\xef\xce\x8c\'\x07&\xb5\xd2\xb3Q\r\xf2Z\xa8~\xae5\xf3\xcc\x97\n\x90\x7f\\\xf6c\xbak\xc96%\xe8\x9f\xad\xba/\x9b\x89\x07\x01\xcbB^G\xb7\xc4\xb7\xdf\xd5\x81\x81{\x17\xdf\x13\xd8\x9a\xcd\xc0\x1f\x94\xa0#\x03\x0c\x8cH\x1eZJ\xc73\x01\xd8{2\xe4\xb7\xf3\xceM\xa8\x84`\xd9R\x0c\xc3g<\xed\x0eg1\x8eM\\:Q\xfc\xe9\x86\x1e\xfbv\xab\xdf\xf7\xf4Z"\xec\x05\x9f5\x97\\J%\xec\x84\x11\xf4\xb0]\x8d=J\xa5\xd8\xb1G\xd2\x86\x96\xed9\x10\xa8\xdbg\x83fbd\xbca\xdc\x02:\xc81 "\xce\x04\xe2\x98\xf4\xc1\xaaA\xf1\xc9Q\x83\xba]\xda\xb0\xb1\x81\x9f\x91\xef#e\x07\x7f\xd2\xdfV9fD\x92\x0f\xbb\x8cs\xb0d\xc1\xc8Z\xcf_hk\x13\x94Tp\x89 m\xf6\xa6\xc0vY\xe8{\x0b\xd5H\x9f\xf0\x800\x8c\xb1\xdf\xc9q\x99\xc5l\x1fl-\xcbVD\xd4\x1a\x06\xdb\xec\x9e\x1cHY\x97swZ#$\x12\x92\xc2\xa6\xbd\x8c\x99\xb0g\xfc\xbd\xf3\xc3\xef\xce=\x10)\xe0\xc0\x8eb\xc2\xee\xc5Q\x05~\xa8\xc0\xe2\x98\xed\x95-~\x1a\xfdr\x93)\xb0>_\xec[\x9d\x06\xaby\x8bq\x12z\xd9\x9e\x99\xe8\x99\xcelt\x960\x14}X\xe7P\x17\x81\xb2<\r2\xaf\xca\xc9\x18\x91}\xc4\x85(\xae\xab\xe9\x1a4\x19A\xa2\x1b\xf3Y\xe2k\x97\xb7\xd6x\x92*\xf9QQ-\xb5\x15V\xb6P\xd6tco\x8c\x115=P|\x80\x90\xc6K\xecB\xc2Q\xcbT\x0e\xb6\xaf\xcd_\xd3\xf5\xd2D\xe4m\x9f|5\x83\xdfb@\xb9\x08B\x94:)8\xf3\n\x85\x93\xd7f\xdfB(`\x0e\xa8\x01\xcd\x92+\x9d\xa7n\r,\\N\x9a\xb7\xd5T\x96\xe2\xe9\xcb\x87\xe8u\x12*\xc3j\xac|\x04\x08>E<\x99{\xd0\x88\xa1\xd8M\'\x1e\xbc\x89\r~\x9e\x11+%\x17F-"\x02\xca$\x1c\xdfc\xd6YnQfvh\xf3kxk\xeb\x197>\xa9\x0c\x9a\xeb/\xd6\xb2\x15\t\x888 }\xeb\x93\xc6\x08\xde#K\xb5\xda\x82l\xfe\x8fx\xb6\xad\xc4\x10\xb47#s%Pp\xa6"\xd8\xb7\xd2^\x92\xbc\x94\xa7\xe5}\xd3\xa2?\xa5r\xd3v\xff\x06\xc3|\x99V\x8c\r\xde\xc766T\xa9\x0b\x05\xed\xec\xf1\xa4\x10\xf3\x14\x92\xa0\x86\xd7\x9aY\xa1s\xf5lU\xbb`\x91\xf1\xed\x1e\xc0\xafV\xa0\x9f\xb7\xd3@\xbb\xcd\x81\xcaa\x7f\xb9C$QP:YgD\x83\xb9\xe9W\xb6S\xdb\xab\xcb\xf2\xd7\xa4b%\xe6\xac\xe3\xe3\x88\x1dj?S-\xf2\xcb\x86\x8f\xca"\x06\xf0y\x00Zp\xf9\xf5mg\xd1--\xb0\x93\xe0\x9c\x94:\xf44=V\xf8\xc1~\xedB~e}\n`cz\xa2\xc9\xb0\xbefL\xd0D\x8b\x04\xf4\xe4\x06/\x01F\xcch=\xad\xbc*\x8b)\xa3\xd6,\x87Ki\xf3\x99\xccA~\t\x8aB\x89\xbe\xaei\xa8\x91\x8a\x91\xcam\x95\x15\x8c\x0c\xf1?\xccz\xcaG\xcb\x88\x04\xc5\xcf\xc5\x0f\x93\xad\xb2\xd2\x071H\xbe\xcd\xe1\x96T\x88y"\xbar\xe3\x02F\xf6}\xe9\xec\xf5\xf0\xcfE\xc1\xc9\x99\xe6u\xe4\x19\t\xc9\x1c\xf6\xe3\x0cV\xa4\xba\x0bf\xfd\x0bh\x92d \x8c\xb21nJ\x8e\xa6\xa5\xc0c<E\x8e\x97\xc6\xee\x0c\x12\x9b\x14\xb7cR\x126-\x12\xd7|\xbc5F$\x14\x8e\xb1\xecg\x9b\xeb\xe6\xef`\x04|`!\xf3:\x89\x82J\xde`\xa0\x93\xbfzA#vH\xc9~\x84dG\x84.\xc6\x9f\xe0\x9e{\xcabd)\x86\x93E+}\xf7\xd2\xdf\xc3\x84\xd3\xdc\xff\xdfR\xd5\xcbN:\x1aq\xfaHc\xbd\xab]\x00\x08\xccI:\xd64\xe8\xfa\x8d\x17X\xb2{a#)U\xc9\xba(K\xa3\x90%/\xa1\t\x19\xf4<HJp)+\x97O\xbc\x11qs\x01\xda2\x85\x17N\xe3i\xc0C\xeeg\xad\xa9\xcev\xacb\xc4,5\xef\x94\xe8\xec\x8c\x1c\x15\x1a\xf6*.\xc6\xbb\xfd\x9a\xfa\x1c\xcc\xbc\xfc\xc5\xb3\x9d\xed\x05\xde\xfe\xa3A\x18\x08\xffH\xdfU\x94\x88\xad\xd0\xdc\x1cM\x05t\x8c5-\xb5\xb8-\xdb\x95\xc1\xa0\x83\x04\x803\x87[\x1c\xc8\x05T\xc0\xf3\x1e7PIR\x00\xc5P?n\xca\x18\xc3\x11\x98\xb0p\xc2\x85\x88_\xa3\x1do\xfe\xa0\x14\x98H\rp\xa6hUC\xc9\xe7)\xb5\x99\x8b\x95s\x89\xf7\x05HT\xa6\xd7\xac\xb0\xaa=\x83\xe2\x1b\xecE\xa9t,\xecp\x18\xdfv\xcb\xb0+\xf6 3\x10\xf2\xf9\xf8uX\x04\xa9Ib\xf4\x1c\xfb\xdc\x11&\xe9\x1e \xf9^\xc2\xd2\xa7\x8eKpNR\xc3-\xd1A\xedr\xae\xa9/\xb1\xaa\xd4\xa0\xb5\'\xe8\x9b\x91\xe5\x93\xcf\x9frn\x10:[\x17\xed\xf8\xb5\xf40\x107\x90J\xc9\xfa\x85\x17\xc1\x15{\x01c\xf9v\xf4\xb7\xa2W\x14\xffY\xb7]b\xc39\x19F\rp/e|M\xa7\x8c\xb5h\x8dR\x7fN\xf9)\x7f\xff\x15\xdc\xd0|xD\xed,\xea\n\x98\x0c\\\xa5\x1b\x84\xa3\xe2\xa1\xac\xd6\x84|\x9a\x00r\xe7\xa7\xc1YA\x886h?\xe6\xa2\xb8,\xbbd\x05G\x00\x89\xa9o/\x08lI\x95\xdf\x14\xeb\xdb\xd1\x95\xd6\xfd\xfcE\xef\xdbc\x154\xe8}\xfa\ng\xb2[k4\x96\xbdZ\x05\x8a\xfaX"<\xf9\x92\xd9w\xdaoli\x08\xe3dt4\xbe+\xce\x82\x84_\xcc\x7f57\xaa7\xc4\xb5c\xcd\x03\x9c\xec\xfe\xe4\x04D\tPB\xeb\xdc\xb0U\x15|\xc7\xdeU \xf2\xaf\xbe\x98\xb4\xc0\xc2\xe53"\xaf\xda_\x01\x0fo\x99=\\\xb4 \x9b\xd4\x0f\xf66\xf5m\xb1e4cyI7i0\xccS\xee\x9f\xd0\x86\x02\xb1%\xc5\xd7\xe5\xb2\xdc\x9b\xee\x16\xf5\xdc\x98_\xc9\xc9\x1e\x9dN\x94\xf2(&\x16Z\xc1v\x85\xae\xd8\xb0\xde\x96\x05\x9a\xe7\xc9\xc1\x9d\xc6VK\xef\x8bJ\xf5z)N\xaf{$`\x902\xad\xd2\xea\xd3\xcc\xeb\xb7\x1f\xa9\x9fE>)\xb90,R4E\xdf\xd1\xb5@\xb1\xc60\xc0\xa7\'\xd1iA/R\x08-U\x95\\\xd24*\xaaF\xde\xb3z(\x8d\xdc\x05\xb6^\x85\xd9\xd3V\x05Si\xc2\xb7\xd5\xfa\xad(\xe4\xe7\r\x0e\xaa\t\xe9|\xf9\xa2\xa3\xfbE\x18\xc05\xcc\xd5\xdbYE\x9eJW\x89y\x00\xd7\xa2\xaca\x1a\xd8\xf0PL\x86}\x19\xe5J\x8e\x8b\x95\t\xaa\xe2\xf5w b\xf1\xff\x84\xed\xd6tc\x02\xefi\xe4\xe5\xe1~\x97\x0b\x17\x88V\xcb*\xecP\xf4\x04a\x9b\x8cz45\x8a\x82\x1b~\xf4\xb0\xf5\xc9\x11`\xb1\xa9\xf1\xe1{\xdf\xbf\xac\x93\x08\x0e\x02\xc3\xcb\xa6\xc3\xe4*\x80\'}\xe2\xbf\xb7\x9d\xc5_u\xd6?U5\x1f\x16\x1doY\xbb\xe3\x8c\xb6\xd6v\xd1T\x1f\x7f\x95<\xb2\x9aM\tfu\xb4$\x96A\xff\x19\xeez\xc6L\xdbc\xe7.5\xbe\xbe\xf6\xfd/aq\tEgRcf\x7f\t\x0c\x08c\xac\xbf\t\x1aW\xca\xa2\xd4\xe2\x9d\x15\x03\x9a\xfcM\xfc\xa0\x1c\xd1\xd5Ft<\x11.\xa8-6<%h\x02\xdc4\x10\xa3.iG\xfa\xaa\xba\xb1\xef\x19\x03\xd9VQ\x8f\xa5\x0f\tE\x1c;,\x0f\xa4\x07TlRx\x81\x0c\xce?\xa6\x06\xd9;B\x16\xc1\x81\xb6\xf3z\x89)\xf0Y\x1f\xd35\x07\xdc\xa7\x9b9\xfe\xd4\\\xd6/\xc1\xb1\xd9\xfc\x10\x9eq\x08\xf7\xb0\xa7+I\xe5\xfa\x00\xfc\xb8\x05W~{)\xda6J\xb9\xbb\xf3\xc7\x1c\xfcB\x883\xb3=\x9dz\xa7\x00\xd5"\xe3\xdf\xf6\xda\x04V\xef\xcb\x86={\xd6F0\x9cKD\\\xf8\xf1\x8c{\x87\x1f\xf4\xdaU\xae\xe6_\x1e\x02\x01y\x97\xb0dpb\xfa\xf3(!\x11\xfe\xd9\n\xe50\xd3U\xf6\xcb\x17\x87D\x16p\xceB\xf5\xd1G\x88\'\xdf]\x9ci\x1d\xbev?|aq\xc3\x18\x96\xfb"\x11\xaebG\xac3\xaaYk\x03\x85Tlq-F\xca\n\x03\xad\x17w\x8ag\xa16c\xae\x85\x95\x93\xcaM-\xe4(*Yf\xfaT\xec+\xbd\xd5-\x8c\xc2\x15+\xf7@\xaa\xb9\x0c\x8d\xdaVol?\x17\xdet\xa9{.\xec\x06\xec\x99\x0e\x87F\t\x06\xe7(\x9d\x04\xa0]\xb9\xc2\x10kH\x9df\xa4\xd0z\xdf3\xbf\xf2\xeaC8\x9a\xe2.\x13@\xbeU\xa6y\xae\xb0\xab^\xe5\x9a\xa9v\xdb\xdc\x8c\xb0\xa5\xc7W\x9a\x8c\xde\xf6\xc6I\x1c\x86\x1cB\xb4\x97x\x92\t\xb59\xd7y\'\x9fm\xc3\x01}s\xb1-\xacY\x18Q\x15\xf1\xd9\xe7dL\xa5\x17*\xcf\xc8pt8\xc8X\x1f\x14\x87\r$\xb1]k\xfb?[\x8e\xd4\xa1\x00(\xa7\x16\nm\x9e\xa8\x99\x93\x992W\xcd\xd3\xe2\x91\ns\x9d\xf0\x8b\xbb\xb2\xf4^\xbc\xfb$\x14\xdd\xd6\xc5W\x9f\xac%\xd6\xd3c\x9d\xa1x\xa4B\x93:\x97\xa6\xc0`\x8d-+\xdd\x1d\x05e\xbcpre\xc9\xf9\xa0X \xe8\x10y\xc0\xfb\xc6\x89\xf7\x7f\xe5b\xbb*\xda( ]\xf3\x06\\\x81]\'\x11\x1e\x96\x9d\x9dZ\xb0\xec\xd2\xc7IPQ\x18\xd0\xe0\xe5B\x02\xab\x88\xc8?\xf7/\xab\xb1\xc5\x14G\x0e\xecd\x80\xf7\xa3\x10Bwb\x88j|cI\xa54\x0ckn\xe8G\x0e\xe7\xa5\xe0\x959\x92\xb8\x1f\xabz\x04\xf0V\x14\'\x0c\x01}\xe8\xcb\x8b\xaa\xc2\xaa\xcf\x03\x82\xfa-\xa3\xc9\x9b70\xc5x\x0b\x95\x93\xea|\x06O<[\xc9\x1c5\x998\xb3o\x12\xf83_\xd2\x00\xabV\xc7\x12}\xeah\x06c\xf6\x956(p\xc4_\x99{\x14\xb7\xe6\r_\xe7z\xd2\xf7\x049\x0f\x17\x87\xed\x07\xeaz\xe7\xc9\xaa+lg\xa0\xe1u\xf3\x08\x9c\x9a\xf9C\x1a]A3/\xab6W\x98J\xcdF#e\x04\xab1\xb7\xbe\xebj4[Aui\x99\xbbDa\xcaMn\xa6+5\x89\na\xfaKd\xac\xe0\x8e\xdf\xc4_5\x13\xf3\xb7\x13g\xfb\xdb\xf3\xd3\x84D\x8a\x8b|\x02\xee\xf9\xad\xe3h\t\x97\x1e\xd0\xf42\x9c9\x13\xe2\xd5\xed\xe2\x83\x89\xfeV\xbf\xdd\xaf\x18D\x15O0\x92\x80\xdc\x9d\x10\xf6\xcc\xde\xb8\x99\xd6\xdf:\x93\xa1\x9b\xfa\xb3\xcf6\xa8\xa4IX\x05\x1c\xef\x8aPs\xc6\x9c\x9ea\xb2\xf4\x19\xfc\xbf\xad\xcdC)F/\xd58J\xc5[\x9e\xff\x85\x84\x81)\xe8\xfe\xf5\x81\x0b\x14uQ\xb1\x0cp\xbc*+\x80G\xc2\xf9\x17*\x8d)\x1bH\x17\xf2\xb4\xa2C\xee\xe0\x15\xa8b*g\xed\xe6\xf2^\x9c\xeb\x86\x95\xb6\xab\x8f@\xb1\x90~\x85\xcb\xe9Is\xbb\xb0\xfc\xce\xbf\x18\xadQ\xaa\x1e\xa7\xed/\x99\xf6\xecS\xe4\xbd\xf5C\xe3\xf8c\xcd\x98\xe6\xd4=\xca\xfe\xc5\x98JjY\xf4\xf5\x19\x88\x01*Uq\x84Y`iI@\xf22\xa0j\xcd\xf1S\xf6\xa0\x9e\xd8(@\xbf^\xf9a\xdcM\x86\xef\xba\xc2\x15\xc1L\'\xe5\xb7\xc2G\x1a\x84\x06U\x02\x81\x05i\x95\x14\x98\x11\x9fY\xf9\x8f\xfc\x83\x9e\x1f\x8d>M\xdb\x048x\x9d0\x8b\x8fUJ7\x18\xb5>\x98$\xcb1\x8b-\x1f\x008\x12\xac\xaa%I\xe0\x90\x10\x96\xb6\xf9\x18,\x9ao\xf4Z\xbd\xc5\xe9C\x82%\x80\xbd\x11H\x13\xdb\xb3`\xf4\xdf\x0b$\xd5.\xe4\xb5e\x1c\xc2\xb06G\xbd\xad\x15\xe7\xf5\xf5J\x97N\x9e%\'\x90O\xfa\xeb[\x9ah\xa0\x7fv\xc3\x8a\x9fg\xca]d\x9a\xddQ\xa0\xf2\x04\x95 \xc8\x90\xc1R\x9e\xc8:\xf1\xfd\x14\xba\x04\n\xdcPM\xeb\x063>\x06\xca\x92[\x95\xe9\x1b\xc3\xbaB"K\x1f\xc9\x9b\xc9?\xf8\xf7\x83\xf7Ei\x18PE&\xa2\xd6\xbfM9K\x9d\xbbW\x94Ec}/`\xc8\xf8\x19\x9d}\xd30Y\xadmt(\xe2\x8a\x1f{\x12\xfb\xc6\xc3Q\xbb\xc5\xe4S\xe4\xaf\x80\x17\t\xf1\xd9\xf9MTd(\xc4\xd8b;\t\x8c9\xb6\xb3\x1b \x12XB\xcaI\x1c\x8a\'\x9d+i\xb7rL\t\xda;\xbe\xa2ia\x9d\x02A\x9e\xb76iO\n\xacX\xb7\xf3\xe0\xa7\x0e\x8b\xcco\xaa$dVb\xa5\xe8\xa2\xf9\xcem\xd1P\xae\xe7y\x1c\xfbq\x9a \xd15O\x94GF"\xb6X8(Em\xcf\xcf0\xb3DK\x01\xbe\r)\xca\x1f\x16\x1f\xd4\xc0\x90\t\x1c\xd3\xf9\x10 \xde\xf4\xc7\x06K\xa3\xe6W\xb9,\xa9\xe2\x80Mv\x1f]D\x8d\xdd\xdc\x90\x0fu\xfeRf\x046g2<\xb2f\xf36\xfb]\xf2\xcd\x9d8Ej&\r\xed\x1a4\x8emZd\xe7\xf9H\xbd\xed\xf4rO\x16\x9b\xf5\t\x05\x8e\xebZs\xa4\xad\xce\xafOF\xc4\x8f\xe1\x1d\xad\xfd\xf7Q`\x8a\x12O\xb7]\x83$a\xcb\xb9\x0f\x10\rl\x106\xac\xf0Y\x1d\xa2\xb3G\x1b\xc1*T\xfa;\xf7N\xa7\xd7S\xe04\xac\xda\x19\xa9c\xf7\x89E\x8d4\xaaQ\xb6#\xaa\xf0\xa9J\x1d\xd9$\x1c\xd4\x05U\xa4+\xc0\x9e}W\xd1\xa4\x99_\x99<\x9a\xa8\xc8\xc2G#"\x97.\xafh\xeb\xac(\x98\xc2\x97\xea\xaf5\xc21d]qS\x97\xe6\x04\xa2\x9bQ/B\xd3a\xcefP\xec\xdb\xcd+Doe\xe5\x98:\x84\x8f\x86\xe7{\xd5G,\xa8\x92\xf1Z\xb6\rZ\xaa\x17\xd8\n\xb2\x12vDUK\xcdk\xd4\xf3\xe4\xa2IO\xde\xfd\xbb\xd1x! guZ\x9d\xef\xefN\x0f46\xd0\xa5T\x8cC\x91\x08w\xff\x80\xd0\xf5r2\x06\x88\xe23\x94\xf5\xfc\xcb\xf1\xb1\no\xc9\xcc\xe3Nn7\x18\x97\xc0\xba\xef>\x1eZ\xe4\xb5\xc3\xf2id\x9e\xd0\xb6K\x92\x9a\xccf\x9a\xf1c\x9c\xe3\xa1\x03\x95\xac3j\x14Dy\x88h\xdbQ\x95\x83\x9bH"?j\x1b!n\xa5\xe8\xca\xa4\x8f+\x0b8\xadK\xf2\xb3\xac\xc9C\x9c\x1br\x84\xe4\xf3\xf7\x0b\x10\xda\xb7\xfd`M9\r\xb9t\x85\xac\xec\xab\x1f\xbf\xa2V^Q\x1eF=\xbb\xb2\x96skY\x12]\x8a\x84hg\x93v\xba\xb8\x8c\x97\xd9\x89<\xde\xadpvB^[\xd7\xd9\xd4x[\xcc\xec\\\xd2U.\x047\x07\x08\x19\xf7\xc8|\xf79\x03\n\xe4r4\xd5\xaf\x82\\\xc4\x0c\xe7\xc0\xbc\xa2\xd4\xc6\xef3\xc5\xd0_}Yo\xb6\xc5\xaeo\xcf\x00\xafoM0\x84\x1e9\xb4\xbd\x90BI\xfe\'\xc2\xc3\x84G\xc3%\xa6\nd"xa%K\xec>\xf2:\xc2K\xcbFR\xb7S\x96E\x0f\x07\xbb"\xa7\\\xdfj\xa3\x84\x1cN\xd3/\xc5\xfc\xeby\xd1\'\xb7\x13\xbdk\\/!\xa4\xd195\xde_{\x01\xd7\x8c\x1b\xd9\x92\x1c\x9fJ\xfe\x91\x9c\xab\x99F\x0cs\x04\xde\xeeL;\xe5Qo\x824\xa5\xd7\xda2\xcf7\x8e\xbd\xf2\xbdk\xae\xdcd\x18\xc8% \xb5\xb9\xa9\xc157\x88\x10!n\x1f\x06$-\xf7Xl\xb5\xcd\xd3\x80\xd7\x00"\xfa=t\xa0\x7fM\x1dR\xd8|C \xda\x89xj\xaa\xf70(kf\x8e\x17\xf3\x97\xb1\x87\xba\x96\xb4\x1f"\x9c\xdb\x9cH{\x91u\x9b!|(\xbd\xf1O\xae<\xd9\x8a\xb0Y\xbd\xf5\x92V\x1a/\xc7\x17\x00\xfe\x07\xe1\x8ceB\xf8$T\xd6o{\xbc=\xf0\xba\xa8\xb9P{$vxw\x16\x9c\xce\xe3\x1fQ\xe5\xd3DB\xf6\xd0\xb7\xbd\xe6\xec@\x1eF\x91\xc3\x1b\x06\xe3\xa8\x11\xe8X6\x9a\xf6{\x1a\xfdQ\xc6\x16T~\x16n\x95qd\x98\x8bT\x1e0#\xe2\x18\'A\x16\xdeLW\n\x16\x9fT\x9b\x95J\x83\x92\x1d@\x80\xac\xf6{ Vx>\xceR|\x89\xf2\xf0\xf6eo\xe7\xc9\xfa8^\xa3\xfb\x8a\xa2|\xd9\x9e\xf1NP\xd4\x07\x96\x85\x9c\xd4\'t\x84\x0e\xe7\xe5U\x01\xbc\xa9\xe3<\x92?\xdf\xc9\x1aV\x9bDY&O\xc8\xbf\xba\xc3~\x98\xc9\xdb\xb2\x1c\x0b\x93\xda\x9fG\t\x89\x14\xf59\xaf\\u\xcf\xb0\xf7\x98seK\xb3:R\x9c\x07\xfb\x9c\xcc\x88NG\x8a\x0c\xedi\xfe\xf6\xb8N}\xfb\xaa\x1ef\x10\xa7nQ\xc5y\x04\x07a\x98Y\x1c\xe9\x1f\xb1\xe2}K`\x8b\xd4\xd7+\xabz+\x0fe9\x92\xe47M)\x9eW[\x1b9\xf1\x87\xe3\xb8\x9d\xb6\x02\x9c\x84P\xbd\xb2|^\x95\x12w\x97_\xee\x92\xc4\xaect\x8aN\x9cS\x1b\xd2\xa0\xe7m\x8eu#\xae\xea\xcc|\xb7\xe0o\x07\xec\x8b1n\xf2\x07}\xee\x7f\xdau\x8b>q\xdb\x1f\xcb\xec\xdf\xd7\x1f\xca\'\xb2\xb5\x9e\xa2\x1f0_\xa0\x8e0\x9d<{8^\xa9b\x06\x16\xd6\xbb\xab\x81\x82o\xa8\xf2V3\xcf\x198iB\xdb\xb1\x8f\x86\xd5\x00a\xf6\xee(\x98\x08\x81\x0c\x1eR\xe1\xa9\xefa\xd4\xc8N\x83\xce\x8d\xc9,}2\nM\xec]\xe1\xcf\xddh<s\x99\x12+\x0e\xa0"2\x80Z\x0eT\xee\x91\xde]\x88,\xe1\xc0\x84\x04\xeaW\xdf\xe92\x84S\xfbP\xf1\xdeW\x95\x93E10\xe2\xdf<\x07\xec\x94\x9a\xec\x86\x11l/\xd6\xa9\x9b\xf0\xdb\x80\xb2CI\xabv\xff\xa3\x97+\\\x9fz\xa3\xc6\x94N\x88\x16N\xd7\xd9\xfb\x9fDIP\xed\x8a]\x8cz,\xe3}\xe9\x9d\xc1w\x9f$./\xb6e\xe9\xc2q\xf3c\xe16\x14\x83\xf0\xba\xd2\x05t\x80\xcc\xc4[\x9d\x0ew\xeb>\xa5\x1a\x05\xf0\x84\x8a\xf0\x01\x9e\x96\xed!\xaf\x96%\xb95\\r\xe9y\xad\x92\xbfI\x026\x05\xb8\x80\x045q\x998\xf9M\x89\xd7$u\x85\x1c\xa6\x1d\'\xd1\xfczZyuc\xb0)\xcd<\xaa\x89\xd3,W\xcf\xbe/\x07\xfc\x84\xef-\r7\xb6\x80\xee\xf1\xed\xa3A\xb4DY\xc4\\\xa6\xb2^\x00{\x8aQ\xe9\xab\xa4\x8a\xbd/E\x10\xf2\xfbm<\x86\xf7_z\x06\x85pG\x85\xd7qX>\xc7\x93K+4{\xe6\xcaBH\xc0\xb9\xdeW\x7f\xeb\xcb\xebF\x9e\x9e\x01\x11\x01\xaf\x0f\xf6g*\xe3\xcd\xff6\xe0\x12(\xff\x98\xd3\xa9_\xea\x88\x90\x89\xb7\x84\xcf\xc3\xd5\x0e\xeb]\xc2D\x01\xb6\xe7\xb5\xfe\x14;9\xb5\'\x0c6 \xd7\x16Y')
1
+ from hiddifypanel.models import *
2
+ from flask_babelex import gettext as _
3
+ default_ips="""
4
+ mcix.ircf.space MCI
5
+ mci.ircf.space MCI
6
+ mtn.ircf.space MTN
7
+ mtnx.ircf.space MTN
8
+ rtl.ircf.space RTL
9
+ mkh.ircf.space MKH
10
+ hwb.ircf.space HWB
11
+ ast.ircf.space AST
12
+ sht.ircf.space SHT
13
+ prs.ircf.space PRS
14
+ mbt.ircf.space MBT
15
+ ask.ircf.space ASK
16
+ rsp.ircf.space RSP
17
+ afn.ircf.space AFN
18
+ ztl.ircf.space ZTL
19
+ psm.ircf.space PSM
20
+ """
21
+ from flask import request,flash
22
+ import maxminddb
23
+ import os
24
+ import re
25
+ import random
26
+
27
+ try:
28
+ ipasn = maxminddb.open_database('GeoLite2-ASN.mmdb') if os.path.exists('GeoLite2-ASN.mmdb') else {}
29
+ ipcountry = maxminddb.open_database('GeoLite2-Country.mmdb') if os.path.exists('GeoLite2-Country.mmdb') else {}
30
+ except Exception as e:
31
+ print("Error can not load maxminddb")
32
+
33
+
34
+ asn_map={
35
+ '58224':'MKH',
36
+ '197207':'MCI',
37
+ '12880':'ITC',
38
+ '44244':'MTN',
39
+ '57218':'RTL',
40
+ '16322':'PRS',
41
+ '56402':'HWB',
42
+ '41689':'AST',
43
+ '43754':'AST',
44
+ '31549':'SHT',
45
+ '205647':'SHT',
46
+ '50810':'MBT',
47
+ '39308':'ASK',
48
+ '205207':'RSP',
49
+ '25184':'AFR',
50
+ '394510':'ZTL',
51
+ '206065':'ZTL',
52
+ '49100':'PSM'
53
+ }
54
+
55
+ def get_asn_short_name(user_ip=None):
56
+ user_ip=user_ip or get_real_user_ip()
57
+ asnres = ipasn.get(user_ip) if ipasn else {'autonomous_system_number':'unknown'}
58
+ asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
59
+ return asn_map.get(asn,"unknown")
60
+ def get_country(user_ip=None):
61
+ user_ip=user_ip or get_real_user_ip()
62
+ return (ipcountry.get(user_ip) or {}).get('country',{}).get('iso_code','unknown')
63
+ def get_real_user_ip_debug(user_ip=None):
64
+ user_ip=user_ip or get_real_user_ip()
65
+ asnres = ipasn.get(user_ip) or {}
66
+ asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
67
+ asn_dscr = f"{asnres.get('autonomous_system_organization','unknown')}" if asnres else "unknown"
68
+ asn_short=get_asn_short_name(user_ip)
69
+ country=get_country(user_ip)
70
+ default=get_host_base_on_asn(default_ips,asn_short).replace(".ircf.space","")
71
+ return f'{user_ip} {country} {asn} {asn_short} {"ERROR" if asn_short=="unknown" else ""} fullname={asn_dscr} default:{default}'
72
+
73
+ def get_real_user_ip():
74
+ user_ip=request.remote_addr
75
+ for header in ['CF-Connecting-IP','ar-real-ip','X-Forwarded-For']:
76
+ if header in request.headers:
77
+ user_ip= request.headers.get(header)
78
+ break
79
+
80
+ return user_ip
81
+
82
+ def get_host_base_on_asn(ips,asn_short):
83
+ if type(ips)==str:
84
+ ips=re.split('[ \t\r\n;,]+',ips.strip())
85
+ valid_hosts=[ip for ip in ips if len(ip)>5]
86
+
87
+ if len(ips)%2 !=0 or len(valid_hosts)==0:
88
+ flash(_("Error! auto cdn ip can not be find, please contact admin."))
89
+ if len(valid_hosts)==0:return
90
+
91
+ all_hosts=[]
92
+ for i in range(0,len(ips),2):
93
+ if asn_short == ips[i+1]:
94
+ print("selected ",ips[i],ips[i+1])
95
+ all_hosts.append(ips[i])
96
+
97
+ selected= random.sample(valid_hosts,1)[0]
98
+ if len(all_hosts):
99
+ selected= random.sample(all_hosts, 1)[0]
100
+
101
+ return selected
102
+
103
+ def get_clean_ip(ips,resolve=False,default_asn=None):
104
+ if not ips:
105
+ ips=default_ips
106
+
107
+ ips=re.split('[ \t\r\n;,]+',ips.strip())
108
+ user_ip=get_real_user_ip()
109
+ asn_short = get_asn_short_name(user_ip)
110
+ country=get_country(user_ip)
111
+ print("Real user ip",get_real_user_ip_debug(), user_ip,asn_short,country)
112
+ is_morteza_format=any([format for format in asn_map.values() if format in ips])
113
+ print("IPs",ips)
114
+ if is_morteza_format:
115
+ if country.lower()!=hconfig(ConfigEnum.country) and default_asn:
116
+ asn_short=default_asn
117
+ selected_server=get_host_base_on_asn(ips, asn_short)
118
+ else:
119
+ selected_server=random.sample(ips, 1)[0]
120
+ print("selected_server",selected_server)
121
+ if resolve:
122
+ from hiddifypanel.panel import hiddify
123
+ selected_server=hiddify.get_domain_ip(selected_server) or selected_server
124
+ return selected_server
125
+
4
126
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
127
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
hiddifypanel/panel/cli.py CHANGED
@@ -1,5 +1,174 @@
1
- # 2023-04-08T16:23:31.526638
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\xdf"\x00\x00\x12\t\x04\x00\xdc\xecE&E\x8a\x13\x89\x19\xc9Vn;~r2\x00\x00\x00\x00\x00\x00\x00\x00\xff\xb1gj\xbe\xb9\xfc\xea\xc5]\xe2Y\xad\x14\xe3\xc7\xba\xb1\xbaP\xd6\xf5\xfb\x06\xb1;m\xb2:f\xa87<\xbd\xce\xae\xd7\x8e\x01\xe4\x15\xa3\x9c\xb15)\xd0@\xcevBn\x9c6]n\x81KJ\xad_\x99\x8d[U6M\x87\xe9\xfb\x18\xbc\x86\x90\xdfc\xc2\x91\xb8\x08C\xa3\x0c\xe3\x94\x15g\xcb\xfd\r0\x98\\QG\x96Xc\x89F\x12\xd0\x90)n\xa4\xa7\xd1\xb5`\x08\xd0\xb2\x18\xf8\x19\xdf;\x8f\x0f\xd7\x9b3\xf2\xb3\x99\r\x944\x0c\xd7\xff\x8cAa\xfa\x08\xc0\xae\x94\xad\x00\xec\xf9Y\x9e\xfcAr\x02\\\xe2\xc7y\r\x0e\xba\xea"\xa3\xa7\xda\xe6J\x0b\x08#`\x81l\x8f3\xab\x0c6\x9b\xa1\xeb\xfc\xf6\xa3\xe6\x9f\xfcf\t~\xb8\x9b\x9f\xc6\xff\xf2\xba\xdea\x8c\xb3\xce\xa6Z\xd3N\x15\xca\xbe\xdbZ\x02\xe3$\xe2t\xdd\n\x07\x1f\x84\x86\xc6r[\xd5\xca\x11a\xe3;\x85SL\xf99&\xac\x89\xb6T\xbd\x16B*\xe8T\x07\xf4\r+"C\nj\xff\xd7\xc3\xc3\x9f\xae\xc9\x81\x19\xd2\xf0\xf7s\xa2\xf2\x11\x11r\xfb\xc7\xcaJUO\xfe\xaf\xf2\xc8:n\xff@\x9e\xd8\xf4\xc7V@a/\xe7\xd5\xde\xfd0nVP\x0c\x1f\x807\xdd\xb2zQ&\xbf\xce\xe5\xd5\xa8f\x90\x94t\x87\xc3\xb7\xfd^|\x05\xae\x9456\xbb\xc2\x86\xd8\x84\xd7\xcd\xd4\x07\xb2Kg\x83\xe7":\xdf\xca\xf9\x967[\xb6\xde\x0f\xa7\x81F\xeaq+\x91\x8d\x15\xf9C\xb6{+x\x02\x90(\xbd\xb9\xf1s\xa4\xa2\xae\xe1z\x1dnB\x9b\xfc\xda\xc3|\xb1\xe0\xc2\x9d2\xa7\xf7\x91E\xc37\xe4\x82"\x89\xd5\x95\x8e\x99J\xc2\xaa\xc0W^\xda"\x03\x98I\x8dG\x8d\xc3\xeaY\xb2\xfd j\xde\x81\xce\xda\xaf\x16#\xebR\xc4\x04\x01b\x9d)oN\xbb\x08Y\xf4>?4n\x19P\x81b\xbaw\x18\xfb3\x073\xa2p\t\xc0O\xad\xd0L\xc4\xfa/!\xec\xb60\xcbPJ\x824\xedY<\x17\x7f\x0e8t\xd2\x9f\x04\xed\xa0\x94\x1a\xd9\x1a\x95\xe3\x18\xb8\xdcsw\x90\xbd\xcb\xfe\xa5x\xdb"\x88SQ\xf6X\xaf\x0cP\xeb\xa7Ma\xd3\x19\x06\x1e\x1b"\x0e]5\xe7\xef\x8b\xe0\xb8\xd2\x95\xe5\xc2\xdf\xaa<\xd9\x11\xb8<\xedF\xd2\xcd)t\x073/\xda\xa5\xe0\xc5+w\x93\x04\x7f\x10\t\x1e]bx8j\xe4\xc0\x91_z&\x038\xc0\xe8*\xbd\x0b4\xf06\xefV\x1a\xc2\x07\xc9J\xe9\x0e\x93\xbf[\xf0\x90\xc1\x80K\x03\x11\xf4\xb8E\xb1\xbf\x18v\xba\xd6\xd9\xf3\xb1Wf\x16\x1a;\xa4I\xcd\xbe\x18L0\x87\xebM\xb4c\xc1\x13\x91\xd3?\xc9\xd1/g2\xf9\xc6\xce\xfakr\xd8\xa8\xc5^D3X2F0\xa1\xdf\x97f\xa4\x05\x82\xb3+\xc9}+\x96\xe1\x7f\xd1\x86\xed-+\xbe\x88\x03\xe3\xbeC\x7f;=\x04\x16V\xfc\xab\x1dk)\xe3\x04\x9a*@6QV\x99h\x14\xef\xadg\x009\xd6\xaf\xce#-\xae\x0eF\x8fn\xc5\x9a;\x86t\x85yUR6\xfba\xa5\xbd\xba\xd9\xce\x17\xb2\x12\xa0Z\xcbB\xb5\x04\xc1\xbfa\xe1\xbb\x01\x9e\x9b\xd4\xc9\x1d&t\tf\x8fZ\rA=\xd58\xc6\x90\xd7\xfb\x13\x7fr\xb1\xd2\xb8\n\xe7\x0e%\x15@\x10Q\xae\xee\xb0\xc9%\xc3.a\x15\x03\xfb\xe7\x11\xb5\xd8\xfcC^S\xb9\xf0\x8d\xd1\xc7b\x07\x11"0\xce4\xc2\xca\xe9BV\xec<o\xf8\x98\xb3\xf9\x99\t(4b\xc2\x0e\xcew\xb8iN\x84Q\x9bT\xaf\x9ey\xa6$&\xe5\xc2\x19\xb3B\xf2\x9f\xb0\xf1w=\xb5_\x0c\t\xb3\xb9-1\xd5\x96p@\xcc\xcf\x12\xe8\xda\x06\xa3P\x1a\x0c\xb2@\x02\xf3rFv\xd7\xcf1*\x8b\xa6\xec\xf3\xbdv\xf1fJO*\x0f?\x054=*\xd0H\xb1\xdd(\r,\xba\x14\x94\xc7\x9d|\x92\x88\x18\x14O.\x99"\xb5\xd4\xa4\xca\xa9\xf2\x7f\xba\'q\x0c\x95Yc\x8f\xa3\x80\x0e\xb7D\xce\xf3\xdc\xcd\xa1\x12H\xc3\xf6\x90}:@\x1a\xccS\x99\n\xbfo\x1ek\xae\x17\x1b\xdc\xf9\x98\x05\xe2U\xfeX\x95b\xdf"\x90\x8b\xae|\x81\x17+\xdej\xddL\xae\xbfx\xc2^\x84|\xb9\x01\xb6j\x93\x9b1\xaf\x86\xb4`e"e\xa7z\x7f"\xbc\xb0(G\xc8\xa6\x12\xfd\xd8\r\x86C\xb0\x1b\xa5\xe3\\4\x1c\xe0\xec\xcdA\xcalE"Y\x9c\xd5\xdd\x8d\x9f\xf9\x99\x0c\x04?\xed\x9b;\xe6\xaa\x86\\\xe5\xb0\x9fV\xeeh\x8f&\xe2A\x165\x96!\xc9\x94\xb9\xfd\xb8E\xc9\xdcF\xe3\xdd\x96:\x829X\xb5{\x93\xca\x88\xfe\xeb\xc3\x06\xb1\xa1M\x1a1\xa3\xb7\xc1G\xd9\xb1\xe4Q(e \x0f\\\xfb\xec\xf7\xb2\xda\xae\xa5r\xa3d\xf5\xae\xf1\x90\xbeQ\xd25\x19\x96\xfe\x0f\xae*V\x0b\x83h\xb2(r\x0b\xf8\xda#\xb8Op\x98\x05\xe2\xef\xc4$\xb2\x9b:\xa9\xbfp\xfbY\x0c\xccjZ-\xd6\x16\x02\xbd5\xc6\x14z>\x97\xcd\xd7\x00c$w]\xe5\x1bc\xe5\xef\xd5\xf9\xe6\xa5\x93\xaf/\x0f\xffe\xbd\x14\xbf\xfbg\x1b\xa6\xd1\x19ut8\xb4E\xf7\x96Y|`\x98n\xf2\xdcb?S[\xb0\x9e\xfc\xa9\x83wH\xacAx\xdes\x89\x7f\x11#3\xf7\xb7\xa7\xa0\xe11\xa9\xe9,\xb6VR\xc1\xf6E\xb7\x00\x04\xa9\x80KH\xd1\xd6\xd2\x81\xd2C\t\xdf[\xfbS_\x8c\x9e]\x94\x91XZ<?X^\t\xc7z\xef\xdb\n\x0b\xd9mY\xab.i\x18\xb9\xe2\x16T[f?\xc9{\xb5W\xb5\xb0V\xb3\xc8\x9d\x90![% \xa6\xd1}U\x91\xcd\xf7o}\x06\xb2\x84\xce\xebE\x11\x14\x0f\x8a\xad\xbb\xf3\xf6i\xf8\x9ei\xaa\xe7a\xbe\x18;\t\x86R\xf3\x836t\xdap\x91\xa7\xd4\xd5\r\xbc\xccu\x1a\xe5\xe9:\x9c\xe4\xf8f\x05\xfb\xc5= e\x83\xce\xad\xcb\xb2]8r\x1e\x0b\x15\xb7\xd4\xa9\xa6#\xd8./\'\xfcEW\xb6)\xbaG\xba\xbd\xbc&m\xf6\xa9\x13bfj\x95\x90~?ML\xbc\x9aW\xd7|\xf74\xe2\xe9\\\x16\xcc\xeb@\xf7\x1a5\x11\xd1\x98\x8d\x81\xa1\xc5W\xdfn\xbc\xfb\x10\xc8\x9c\xa2\'\x06\x1f }\xd2>r\xc3\xdb\xf3:\x89\xca\xf3\'vRY8\xb6\x1e\x1d\x1cZ\x91wU&\xafp\xcc\x1a\xeet\xb3\x91\xe6\xec\xf2\x8d4\xdd\x18\xac\xb1\xb1\xf6t\x11U\xc8\xfc\xfc\xf0\xd0\x0e]}\xb6\xae\xe1l/t)\\7(\xac\x0bE>\x9a\x11Q\xe4P\x00\x0b*\xbf\xafq\xcfX\xcbX@\xd2\xa1\x0c\x03\xfc\xda\xee\x8e\xbc|6\xc8\x10fU\xe9\xd8\xa9.:\xa7\xb3_:\x90*2w\xc2\xe3\xe0\xa5\x82\x99\xa1e\x8a\xd8{~C\xd6Vv\x17\x18\x1a\x9c\xb8\xbaSY\x03\xaf\xb2\'\x0bE\xd8{\x9bzg3\xfa\xd4\xa8\xcal\x8f,Z\xed\xc8\x8d\xb9\xba\x9f\x84\x11.\xd7\x1c\xd256\xad\xfeF\xfa\x03\xb5\'f-%n\xb7\xee\xb5\xb8\x8dSR\\0\xd8(A\x82\xe0\x87\xf4\xe3\t\x96\xca\xc0TD\xd3\xe4^\xf1.q \x19\x0e\x96\x93\x90\x15\x1du\xd1\x99\xd3^\x1fK\xe9X*b\xa60\xcc\xff\xf0\x8c\r\xa1\xbf\x81%\x94\x1f+\x9c-\xda\xf9\xc2V\x8f(\x87w\xe0H\xba\xd7$\xfb\xad\xd0Qh\x92\xd7~"\x00\x04\xc2\xb9\xc3\xa1P\x0f\xa2\x9a\xe4\x0f5\\\xdd\x9fw\x00N\\\xc7\x12W\xa8\xcc\xd2Ss\x9d\xa0%\xd5\x05DW06\x01C\xbf\x8cF\x9e\x0c\\U\xfa9\xd7\xe5\r*\x10v\xdd\':\xa3\x0c\xcfH\x96\xee\xa0\x875\xbf\xbb\xa6\xd8LfV\xac\x0c\xcb\xbf\x0f\x1e\xfe\xef_\xfb\xb2\xb1/\r\xcac\x9ck>Mh|f.\x93\x87B\x13\x90^\x96\x1e.\x98\xe0\xd3O\x8c\xe6{\xdb\xe1\x8d\r_#\xf7\x84\xda\xee\xbb\x93o\xeb\x9f\xc7\x8c\xff\xac\xaab\xfe\r\x16\x05\xa3{\xfa=!+\xd5\x80\xbb\xe7\x8fV\xeb\xe3\xc8\xfb\xc0\xc4\xbaT\xd9\x87@\x1d\xc62\xcf\x1c+\x93e\xff\x0b\x87\xb7LW$E\xd0v\xcc\x9b3\xc7\xceI\x8d\x82\xe8\x8bW\x1ce\xfb\xff\x9cm^\xc7\xd5\xf1\xac\x08\xce\x19\x1f\xe2\xf6\xc2\x0e\xf9\x94\x94q\x8e\x00\xa4)-\x19\x1b\x8b\x10\xf3\xb7\'\xdc\x81\xe8au\xbd\x8c\x9a\x99\xd4F\xe0\x86;\xbd\x1eM\xdd\xa4q\x84\x96\xf1[\xa2D1\x0e\xb5)77h6Q\'\xbdk\x7f\x06@X\x19v(\x13"\xac<e\xb7\xe8r\x13\x08\xf0\x9d\x89\x8d,\xa6Ox\xbaq\x96\xc3\x85\xe5\xea\xd6p\x86\x0e\xb2\xdb\xad+\xaf4\x00\xf6Y)\x04\x00.(N\xa7l\x94\x84\xc8M\xd2T\xf2\xb3\xfe\xdc\xb2\xe0\xf3y\xc9L4\x88\xaaBUa\x18}\xa0+%W\xfa\x9chP\x98\xf2\xc1\x07\x05e\xcd\xaa;0F\xd6\xbc\x82\xba\xea \xfbSA//\xfe\xa5\x95\r0\xa5\x0b\x7f\xaa+f\xe56\x1d\x16\t\xeb!\x98\xfaM3-\xd8\xd8\xc5Fp\xebi\x14\xba\xbco\xb9 \xedF\xa1\x14&\x0c\xae\xc1\x06\xa9\xfb\x99\xe7g.d\xd7\xa2\x83S\xcb\xd2>-\x1eU:\xf4\xa8\xc8\xa6\x94g\x8f\x8bA\x9a\xdc\xe9w\x98\x95\x08$T^\xb9\xfaBy\x81!5x\xfc\xb1\xe3]\xb8\xbdfDrI\x14K\xcd}\xfa\x04\xaf\xcbAm\x1bF\xc504\x88\x01\x16\xa7\xc3Hu\xe2\xea\xe7R\x18\xb5;\xd7:}\x9b\xebS\xbd\x1c\xb6\xeb\xf4\x84\xf7\x80G\x04\xb01\x83G\xa4\x8b\x19\xf2+\x87r\xa3\xb57o;M\xd2\xfc&~\x1b\x0fZ\xf4\xa7 \x050w\xd3\x07\xfc\x10\xe1m\x84\xb9\xb9\x04\xd80\x05k7\x14\x92\xab\x8c&T79\x17\xd8\x1aty\xefL\t\x83s\x92\xbej\nmn\\\x12\xc8X\xd4/\xb1i\xad\xb5\x19X7\xdc\xca\xe5SH\xba\xffa9\x0e\xf2\xc0\xb4]5)\xea\x92@\xd9;\x04\xd3\xed!\x12\xa7*\xcdJ\x80\x10\xfb\x96\x14\x0b\xfb\xd4~\xc8L\xfb\x16F\xb4\xa2-E\x06\xe1f\xf1]\xc41?\x893\xe5O\xe3\x02\xfb\xb7kF_K"pp\x88\x8e\xdb\xbb\xc3\xdd\xdf%\xa8\x0f\x16\tL\xec0\xf8\xb0W\x0c\x88\\\t\x82\xdc\x9d\x8a\xc3\x99\n\xcbo\xde\xd2\';FA\x8a>a\xc4\t\xafbV r8\xe2\xa5\xebt#x\xcbjDECye\xb1\xdc\xc2\xe9\x18v8\x813.\x9c\xa0\x1ex\xca\x9c\xcf&\x11\x00\t:\xc7\xc3n^M\x14%\xc8\xd9\x9a\x9d\xab%\xb7\x90f\xe7\x9c\xf3\xe5\xfb\n\xcf&\xa2\x8b\xfcO\xd1\x88\x82\xb7>\xf5/\x11Q\x07\xba\x1b\xbe\xe5i%\x8a5\x19\xc2y\x80\x92z.\xde)$N{\xb4H\xa0B\xa8\xf4*\xdb*\x9e\xf3\xad\x0c\\\xec#H\xccE\xd9\x99s\xe1\xe52\x17\xc8\xeb\xa1\x0e\t*\xa7%\xa1\xf1\xd0\x9b\xc8\xa1\xef\x11X3;\xeb81o\xd1\xdc:V\x8e\x9fO\xcfZ\x0f\xdcw\x06\xff\xcc\x1a\xae\xd7\xca\xef\x12ku\x82\xe2%\x9ej\xd6\xc6\xab\x01m|\xfb\xd5\x9b.\xc4\x9a\x04\xfa\x99\x86vC\x1f\x80?L\x94\xf6\x1d\x00^:\x986*I3\xa5.%\xcc\x9b\xd0\xadj\xd45\xee\xa1\xee\xbe\x12\x8e\xb7a\x12\x1d\xd4\xfd\x03\xf1t@\n\xb9\\\xcf\x847\xca\x1cr\x00\xc0\xd3\x86\x8d\xe4\xcb\x7f\xd0\xa12\x82\xe1\xf0IA\x90\xab%2\x17\xa6\xbf\xeal>\x01.\x81T\x88\xd4\xd2YT\t\xad\xf9Ly\x97\x9d\xa2a+\xad6\xd2\x89\xb0~\\\x05\x04\xe5WU\x1ceZ(v6\x1c\xf3\x9bg\xf2\x01w\xd5\xc5a\xf2\xe8\xb7\xa2\xd6Jw\x0bA:\xc7,4\xbb\xf2\x0b\xd0\x02a\xfc\xedf\xa1-\xe7\xa3\x0f\xd7\xcd+,\x0b.\xa8g\x02@\xdfbe\xd6C\xf5O\xa4\xd0\n\xbb\xb8^\x97\xc9ZQ\x07)}\xea\x83\xc2{8\xb4\xa35\xa7\t\x808B\xd9\xeb-6[\x9d#\x83\xce\xe6\xfb\x94\xbe\x13\xc2\xeb\xf6(.MY\xb3\xae\xfd\xf4\x03u \t\xc4\xac\xb8\xb9\x98\xb0\xec\x91\x0e*{_\x9f\xd4\xa0\x1f\x8a\xfd\xf2\xc4\x1a\xdc\xd1\x92\xb8\x187\xc2\xdd\x9b\xdd\x8bV^\xf9\xe7\xcf\xc6\xa9\xab!m\xacq<\xe4O\x97\x93)w\xc8\x87\xe7\x13\xa0\xed\t\x1fTF\x8f\x1d\xday\xc3\x15n\x10\x88\xa9\x112\xcb:\xf4\x0fe\xdd\xfd\x9f[\xbbj\x92\xfe\x81\xce\xdc\t\xd8f\xf7\x9a\x15qsMbL\x17J3E/\xd0!\xae\xd3S\x1b\t(x\x0fV\x1f\xb6\xb9\xec\\~}\xd0\x98f\xe6\xcf\x0e\x857\xc0%\x13@\xea\xce=\xef\x87\xee\xa6&\xe0>\xb2mT\x08\x11\xba\xca\xa4P\xe24\xb8\xc3\x81\xac\xbf\xa9\xaeB\x9c\x86I\x9f\xc5\xf0\xc9\xc6O\xc68\xa0\x83\xa4F\xb2\x12\x0f0\xa2\xf6\xf2\x92\xd4l5\xe9\xf4M\xd5\xf5Xi\x18\x05g\x83\x0f\xe6\xd2\xf2\xb5\xc3\x01\xf89A\xc0YW\xa1\xa0\xca\xfe\x14jK<\xfc\x91\x86v\x14a\x10\x06\x88\r\xb4h: \xd7\xe9\xceR\xdf\xb2\xf9\x1d\xe9bt\xb3\xbe\xf1\xc8\x82\xb4G\x9aZ\xbf\x14\x89\xf2\xf5f\xb7\xb0\xa8g\x86q\xc73~\xfdR\xfc%c\xfc[\xcc\xbc\xd45@\xc1\x00\x16\x81\xe4\xfb\xe1\x80\xf9\x8f\xd1\x84A\x81\x13\x07\xdf\xbf\xaeRs\x94\xbb\xb2L(9\xeeJ\x8f\xe0u\x02\xad\x8d\x7f\x951\xda\xe3\xa9\xc0(+\xc4B\xcbM\x133\xfd\xb2\xa4\xc4\xfc\x16v\x0cg\x1b\xd3HA4R\xd9\x8ax\x9f\xede\xbd\xd1ZF\xb1Q\xb988\x17\xcb\x98\x86\xb7:\x8c%\x11\x96\xf5q0\xb7\x02Ru\x93>\xa6\x86.%-\xd5>\x98\xd7"7\x8ak\xf1\x90\x1f9\x1f\x86XA\xa7a\xcb\x8c\x92\n\x1f\xf0S\xb5\xac}\x18vc\xab\xdert\xb5\xdf(\x8b\x83\xdda\x9e{\xb5\x99\x06\x1e\xa2\x12\x85\x06"\x18\x17\xee\xd3\x8a\x9a2@X\x02\xfb\xa6\xdb\xad\xe7\x8e\xb2T(\x16\xa8\x9b\xa0\x0c}<?\xb9c\x8d2\xec\xaag\xbeQ\xe4\xc3\xf8p\xdd\xaf\xdfU\x16B\x99u8\x8d\x8fe\xc3EMh\xc6\x0e\n\xa6E\xe4\x12\x06\x08\x0es\x01\x1er\xfb\x81\x8e\xee\xc3\xb9\xe4\x06m,\xd3}U\x84CKv\xc0\xd4!\xdf\x91*\xab\xc5\x7f\x0c"Hl\xe2\x1dC\x83\r>\x0f\x04l\x04\xbe\xa5#A\xfa\x03:\x9d(3\x8b\x1b\x97\x07\xe6\xe8!<\xf7\x02\xba\x14\x8bV\xe6\xae|\xff\' \x9f\xe9r\xbc\x00t\xac|t\x0f\x11\x11\tWV5\x962\xce\xbf\xfe4\xfb\x9b\x08\x91p\\FD\xce`\xa9\x05?\xc09\xf1IB\x1bb\xfb\x1f\xd5\x06\xefz<\x95J\xaf\xfc\xfd2\xce\xca\xfe\xe6\xef\xa4\x94\xaf\xbe\xbe\x0e\x91\xab\xc4\x86u/R\xff\x98\'\x96\x97\n\xc3\x1b%\xc4\xfd\xc8f\xce\x8b\xa9d\xcb8\x1dx\x0eqG}p\xcf\x9c\xc4\x82\xf4\xc8\x8aqY\xe7\xe7LF\xbd+\x8e\x05\x07\x01\\\xc1\x1f\xe6\xba\x90\xfa\xa2\xc2\xb9\xb8O9\xb8\xa8k\x82.\x83\xedq\x01\x16v\xdb+\xd5W\xf0%\x1c\xbd\n\x0c\x94J\x98\x94\x8c\xe2\xa4{\xe8\x9e\xec\te\xa9\xb1\xd9@\xcd:\x12\xcdQ\xee0\x11j\x05\x87;]ku\x18v\xb6\xcaNj\xceA\x9b\x9b\xec\xb9\xd9I\xa1\xf1\\\xaf\xe7\xa3\x91\x95_J\xbd\xd7bb:\xa0\x18\x9dR\xc1\xc1$\xad=\xbc\x9cI\xd1\xb9\xc3\x0b\xd1{\x1c\xe0\xf1\x1f\xdbO~\xfe\xb7E^\x08\xec\xfb[\x86+\xd1\xf4\xc9$\xfa\x12\xa3\xd65b\xbe\xe0\xe0[y\xcbx\xa9\x1f\xa2\x14{!\xeb\xa9\xd5se\xbf\x07\xca\x04c\x1a\x9f\xff\x8f\xabl\xd3\x1eB{\xc5\x17\x95\'\x1c\x07L\xa3/;Vz\xad\x0b-c\xe7\x13s\xdd\xe8\xb4\x01\xd2en?9\xe6@\xc1\xff\xd7\x0f\xce\xd3\xce\xc3\x0f\xd1e\x11\xe3\x95\xff\xcfP1S\t\xde\x92\xcal\x17\xb6\x9c\xbf\x83\xc5\xb6(i}yQV\x9a\xa0\x82\xf9Z\xf2\xca\xca\x9d[\x1e\xa7\xeaGx\xc0E\xa9\xe3U\xd5gz\x85\xd2Js\xdd\\cAB\xa0\x08\x99\xe5\xfda+\x9eA\xb7\xc7;t[\x91\xe2\xf6\x8b\xe0\xbc\xf7\xdd<S/^h#\xb8\x18\x01\n\x07g\xab%|\x9br\xb4h\xb6\xcf\x9c\r\xff\xc8\xb2\x90\x9bOd\x83&\xe4T\x1cT\xd9\xe6"vI\xf9{\xac\\\x9acTt3\xa8\xa2\xca\x9d\x9c\x01)\xa7\xe6\xec\xf9%\xcd\xa6B\xd1nSBhT\xe3\xa9\xa8[g\xbcA\n2\xd6\x96_\xd3P\x19\xd4\x99\xe5\xf7\x95\x10\xec}\x92\x97\xa0e\x93\xe7 [\xd3\x83\xed\x8ea\xe7\t]x\x93v\xf8Ti\x1c6\xc7\xb6\xe3\xb1\x89j\xe3\xb2\xba\xd2\xc4\xdf\x08"\t\x0c\x97-k\x1b7\xf6\x81\xea\xaeg\xd7\xa9\xab\xc1\xb74HT\xe6\x1b\x1d\x92$b\xda\x1ex\xdc\xa1\xe6GGi.)\x82\x1b\x8eM\xad\xbaf\x0e,^\xff\xbf\xd5\xeb\xa3\x7f\xaa|\x08\xf5\x13y\x9e\xf1\xc8R\xe9\xdf#f,\xd0\xc8\xc6\xac\xaf\x04\xee\x9e\xf6R\x11D\x85\x08\x88/C\x1d RS*\x1f\xd8\xc5\x1cL\x11| \xdb\x88_\x0b\xa4y\xf7\xbf\x99=Y\x15\x18\xf1\xea]z\\\xc8\xec\xdb\xc4\x0bA\x8bf\x06\x06@\xb5\xd5R=\xa9\x82\xa0\x04oz\xa8F\xe2\x0e\xbb\xbe\xda\xb0e\xa3e\xb9\x99\xday\xdd\xf6\t\xe6\xe2\x95\x04\x84\xb4\xa4\x07\xb5>k\xa7z\xfd?\x84\xb6\xa8\xd5\xc2\x9c\xa9\x0e9\xa2\xab\xd2f\xce\xce\xab\x1f1\xd1\x12;%Os\xfc\xa6\x9a\x90\x1ef\xe9\x1aw3\x95\xda\x81\xf2y\xd5\x97\x9c2)D\xfa\xdc\x8b\xc2\x0b>\xee\xa2\xd8\xef\x9e\xcb\x7f\xf4\x91\x13`\x15\x0b\xe3\x05\xf9\xba\x81\x8e\xc6M\x8f\x8fe~\xb5K\xd5\xdaI\x1c\x81\x90>M\xa0\xb45\x14\xceo)\x9c\xbeG\x1b}\xfa\xb0\x8e8\x99k\x90\xdb\xe9o\x05\x0cMC8\xb3\xc2\xc9=y\xc7(E\xd6\xc7\xedt\xc2\xc1\xbc\xf4\xa4\xbe~2\x07{\xbb\xc0~g\xe3cI4c\x15\x02!\x16\xe4\xc0\xd4F)=\xbb\xbe\xb1<0\x1b\xc2\xbb\x88\xc1(\xe8B=Ol\xfa\x10\xe9\xfa\x86u\x82Z.\xe6\xce \xb2\'\xfb\xb02\x18\xb6F!a\x89-\x16k\xa5\x07w7\x1f\xbf\x1d\xf7\x81!\xf6<\x8d\xd0>\xdfw\xc7%\x05;\xce\xccT\xcf\xd0\x0e3d*\xf6d\x0b\xfe\xf8\xccb\x7f}\xedF\xc5O\x01rJ\xf6{\xd1\xfb\x11\xdc\xfc\x009I\xae\xe0\x9e\x1bh\xd6\xf1+i\x95\xbes\x9b?\xf1a\xb1\xa9v/=/\xc5\x15%\x96EY4\xdf\xd5\xbe\x81v\x9d\x97\x9f\x8dW-\xc9U\xec\x82)\xcf\t4\xf6~\x81\xe4\xe3\xeb[lH?P7\xb4\xb5\x1bQp\xab^\x1c\xe6\x0f\x9d\x05A\x8f0\xf6\x81\xff\xb5\x85X\x01\xc3\x94\x8d\xbd\xf2z\xff.\x1c\x1b\x1fHk\x0e\xd2x.N\xf5\xc19\x86\xb4\xd8\x14\x99\xdfO\xbc\xa4w\xe7\xb2X\x80\xe3x\x0c\xed\x07\xd5\x82\xc6J\x98\xa4\xf1\xac\xa5\x1d\xe7\x95\xdf\x10~\x94\xd7\xaa\xb0\x01q\xc7\xd8\x88S<\xbf\xd7\x18\xe0\xad\x82\xb5\x1c%\xb1]>\xa0\xfe\xc2\xa5l\xffDNT\xe5\xb6X\xc0\n\xdd\xa9cH\x9b\x18\xdfG\xabw\xe4t\x05D\xa1\xa0\xe2\xffC\\v\xd5\x98N6\xbc\x00\xc4#K~g\xa4}\x85\xd6\xed\xa8P\xbc{\xab\xd4\x18P\xe5\x06\xa2\x91\xfe\xd2m\xf6\xef\xab\xd9\xbb\xdae:\x96\x99\xeb\x14+\x83\x9d\xc4\xc43\xf9\xf5\r\xd3\x90\x1fxA\xdd\xfe\xc89\xe8\xf2\x8e\x84\xfd\xd3F\xe0\x18\xa5=%\xd67\xf9\x8cG\x14Q\xfd|\xd03\xd9\x8dTp\xce\xf7\xb7\xb3\x93" r\x9a\x80C\xc8"\xe0\xd6M\x1d\x7fu\x95S\xce <\xe1\xbf\xf5\x8f\x9f\xa3\x0c\xffh\x84\xc3\x14\x92\xf3\xb7\x9f\xb1\xbe\xb6\xffW\xeb\xef\x9c\x1b\xfe\xfdA,2\x14I\xaf\xaa48,U(J\xb055\xcab\x8d\xbf\xe7&1\x8dxI\x99\x81\x06\xfc\x04G*|\xba\xbd\xe4\x16\x9f\x97E\xf4\\s\x82\xf0\xf3\xca\xb1\x92\xb8\xb8v\x15\xf9\xce\x15w\xa8\xe9\xe9\xe8\xbd\xd1z\xb2K\xca\xf7\x9b\xd5\x8e\x1f\x94\xc9\xd3\\\x92\xdd2\xf3\x0c\x85\xd5\x15\x9a3KU\xaf\xf77e9T;\x04\xb8\x06\x8c\x86Y\x863S\x1b\x9a\xfa+\xb3\xd9\x0b\xb6\x12\xd5\x1a4\x83\xfde\xf0\xc7$\x91A\x88\x03\x0b\x12\x92\xacP\x97\xa07u\x0e\x95\xc9&\xd9\xd0\xb5#$b\x91\xac\x96\xdb\xc6C\x88\x1d]<;!\x8b\xdcf\x83o\t\xc2n\x8d7\xab\x06\xb2\xea~H\x18\x92BCY\x88\x1f\xa2\xfc\xcb\xfa`5\x84\xd3F]|.\x99?\xc9\xe2B\xcc\xad\x9caJSu\t\xf3\x0c.\xc5\x11\xcd\x9b\x9b\x02\xffM\xea!\xca5\x82\xc0\xd7\'@gJ\xbe\xa84\xbb\xc1\x90!\x9a)5}\xbci\x97\xbd\xbc\xd1\xbd\x00\xda\xa8\xfcl\xe7\xc1\xfa\xd1\xa1\xdc\xeb\xd3pkX\xab\xf91\xdeg\xaf\x81\xf3G\x88_\x89s;\xbdF\x0bW\x04[\xd2o\xd2\x0c|2\xbdg\xfa\xf0\xc0\x8b>\xd6\x9e\x7f\xdf\xd7>x\\\xb1\x9a\x16*\x16\x86S\x0b\xd4\xffg\xf3\xd0\xb6\xc4\xb1\xc2S,\x83\x12`\xcfX\xd4@\xf8y\xba\xee I\xad\x80\x06\xd5\xc3k\xa4\xcb\xbd\x03d\xae\x15-\xd6\x82\x1a\xd1B9z\xb8\xb9TC\x862\xcc\x8e=$Q4\xfe\xf3c\xfe\xfc\xce}\xaaW\xce\x00\x89N\xc3w\x1b\xe3\xa08\xa0p%\xbc/\x90\xc1\xab\xe4\xe66\n\x97\xd7\x1e\xf5X\xe0\x17\x80T\xe8C\xf7\xef\x0cd\xbd\x90\xc1\xe3f\xfc\x14\xa0\xb3\x0e9\x9b7\xd9\xe6\x8b6\x11%\xa0\x110\xc2U\xa9\x18\x17\xc1!\xb4\x1dk\x92FI\x10Q[\xc1h\x92\xfc\xfdH\xaa\xa1z\xd8#\x1eq\x028\xda\x10:\xe2F\xa0g\xa8>\x8f\x99\xe7\x8dR\xc0q\xe5WE\xe6\xed\x92\x05\x07\xb8\x858\x1b.\xd9v\x01e\x8bi\xd9."\x9a\x86\xdc\x98\xd1\x86\xe5\xe2\x05N}\t\x1f\x01\xcf5\xd0\x8f\xdbd\xab\x92\xb7\xb5\x1f\xa6z\x83r\x8ag\xae\x0b\x9c\x0b\xfd&\xcc\xeb9qq{~/\xd8\xdd+;W\x07\x9d\xaf\x19y\x7fm\x0c{\xaa\x82\xd0[\xe7\x1d;:\xa3_g\x96\x98\x00\xbc3\xe4\x83Z6C\xe72\x18\xb1\xe7\x84T,\x1e\x1eM3oPL\xa8\x05@\x92\x96\xf6u\x97qD2\xd5J\x82\xeb7N\xa8S\x08\xe2\x18Q\xdd\x02e\x9a\x92_G\xce\x0cU/\xbb\xc9\x01\xf9\xf2\xdf\xe1\x81\x1f\x07\x0ea\x9eU\x1e\x92pm\x7f\x9e\xc0\xf8O\xc1\x07\xbc\xe1Q[\xf6\xab\xd1\xacJ\x137\x08\xc3\xa0\x0b\x81\xab\x95\xfe\xbd\xcf\xed3\xcd\x82\xfc|\x94vhe\xfc\xa4\xe7hr\x8c\xeb\xcc\x19\x83M}#U\xde,\x98Zp\xfc_L\xa79\x87\xf9\x99\xa0\xd8\x03\x93D\x96\xd7\xe6\xbe o[\xe8\n\xce\x06R\x1eD\xef\x8c\xdc\x97\xdb\xd8JO\xeeq\xa5\xca_\xe7\xb7\x9d\xf19|\xf8r\x88\xd1\x1e\xee\xf7\x8a\xa4\xaes\x03\xd7@\x0c\'j\xb8\xfe_Q6\x17=\xf8\x12\x96\xb8\xd6\x8ch\x0b\x86b\xac!\xca\x8f\xfb\xce\xa6D[\xb6N\xc3\xa1\xd2\x0e\x1b\xa1\xc6\x9f\xed$\x9b\x95\xab\x8d\xa2\xe4|$\xcdq\x07D\xa7\x96E\'>\xd7u\xaf\x1b&\xc7\x0c\xd7\xb9\xfdRN\xf7\x9b\xb4\x15i\t\x00!\x165\x89/\x89u\xa5_b\xdc\xef9{G\x02 \xda\x91`-.7\x83\x88\xa9:\xf1\x86\xb3\xec\xb2M\x02\xc7\x8cuY\x82\x05\xbd\xe2f\xce\x93\xbe\x13\x1a\x80\x1d\x7f\xfe\xef\x8f#y\xed\xf1\x96I\xc3\xd10\x10\xd48\xf5=\xca\x83\x91\xb2!>M,\x84H\xafIr\xc8\x11\x89\x9bS\x8dzL\x15\xd7\xb1/m\x19K\x93\x1f\x9a\n\xd24\xc8~C\xf9\xaf\xbd\xe2@"\x99#\xb0\x068\x85\xa0\x8ee(\xb8\x02\xcadU}/~\xb26\x7f\x96\xfe%\xfd\x1d\xe6\x8b;\x9d\xe6\xa88\xc0W;\xa0\xd3\r\x0e8\x1b\x14q\xa1\x8b\xa8\xd5\x98\x01\x88\xa4vaq\xf6\x18\x95\x7f)\xe8l-\xd6\x90\x9f\xf8c65\xd7\xb84\x8e)\xb7\xd1\x7f\x90\xfd\x1c\xd5_\'\xa2\x1f\xaeq"\x99\x90\x0e\xde\xc3\x85x\x8e?\xdf\xa7\x0b;\nZ#\xcdA\x89K\xbb\t\x17%\x9d-\x90h\xd4\xfcT\xb5h+\xa1\xf0q\xc0\xc1\xed\x08\xd47\xb3\xd4\x07\x14\x82\xe1a\xf0\xe0O!\xe4\x15@\xf7\xd0\xc5\xa3k6<M\xab}\xdd\x00\n\x92\xc9\xa7\xc82MF\xca\xbeM\xc2\xea\xa6u2\x06\xbe\x82VbG\xa9Sn\xd1\x18\x9c.\xbd\xa2\x9a\xab\xa4\x11\xc0\xce.t\x03\xa7\xc4\xa1\xd4\xc9vD\xf2d\x8d\xc8\x84\x93\xea\xec\xf2\xed\xe9\x18g\xbd\x00\xe7\x1c(y\xd4B\x9bD,\x05\x83\xf6\xfc.\xc8s\xe9~\xfd\x85\xcc\x95\xd8\x07 \xf7>y\x9f\xb3\xbe\xc3\xe7\xb1\xa1~\xa0\xae\x00\x0c-\x19\xb7\xbc\xcd\xa7\xf1\xbe\xd5Y\x07\xe7[\xd6\xae\r%{\x9f;\x08\x11\xe0\x15n\x12\xbf\xef\xb8}\ry}\xccr%\xb6\xb1\x1a8\x0e&\x8e\xcd\x00\xd4|\xcdiF\x95\x0c\x00%\x8e\x1a\xd3\xf7\xeag\xc8f\xb3xL\xd2\xaa\x18\x878\xa4=\xba\xf3\x86\xff\x93\x05Z\xe7)\x03j\xe2\x16r\x1bc\xf8\xba-.\xe0\x04\xba\x1c\x1f\xd1Mf\x0c\xcb-\x89\x9e\x8e\xb0P$:\xb2y\xd5$\xeat\xafD\xd7oh\xd4 \x81C\xf0\x9d]\xd2v}\xbb\xa1\xe4FS\xec@.\x88\xd4\x82\x80>\xde\x1bM^\x10\xe0\x08\xf4nT\xc8w~\xbb,\x08\xad,~\xc2{8]\xb0q\xa9c\xb8"\xf4\x8d#?G\xd3t\xdfDh\xc9\xc4~U\xb4,\xee4Z\xcft@nF\x01\x8b\xc7f/\xfd\xf71\x0bbV\xd6Z\x1a^\xea\xfb:ln\xf8\xa5*\xbc:\x802\xd4:\xbb\x93k\x1b\xcf\x97:\x08S\x14\xf7\x8e\x02\x14%\xc8\xf9\x15]\xca\xc0\xf6=2\xe9)\xfan\xd1\xaf\x08\xe3\xb9\x00\xc0\xb5\xab\x80\xef\xb9s"Q\xfbTCk\x9ez\xa8\t\xf1G!$)\x95\xc6\xae\xbc/D\xd2\x7f\x10J^\xb7\xc6\xf0\x18]\xfb3\xec-M\x95zva>B\xce\t\x87 \x19\x1a\xd7!\xc8O*n,?\xc7%J\x0f|v \xdb\xd4\xf7\x9cy\n\xf9\x1e`$\xac\xf8\xdd\xcen\xdc\\\xb7H\xf5\xaf:MD[\xe6w[\x06\x0e\xa3]u\xfc\x9a[\x99\xbf\x10\xbd\xc5\t*\n\xb5o\xb5C0P\xe1\xd4\xc5\xfau\xde\x1d1\x8b\xb2d\xb2\xd1x\xf2\xb8W#\xf1.\x9f\xa4\xbe\xfb)\x03=\xf4\xaa\xa9\x87\xb9\xde\xd9\xa9U6\xb8\xba\xf1u}\x18W\xe3\xc9/on2\xd2\x904\x1b+\xc2\xfb\x98oP_\xc4\x84B\xa1\x8d#Z\x12\xf2\x84\x8f*VB#z\xd0\xad-\x1b&S\xeb\x04\xb5K=\x9e\x13\xde\xe6na\xb3\xa4\xab\xec\xe3w\x18,\xd1\x18Q\xb9^G\xef\xbb\x10Qcp\xa7\x80\xeb\xd1\xebX\x9c\xf6_\xdbl\x9e$\x84\xddB\xefd\xe6\xc8\x9d\x8f\x7f\xab\xc2o\xc2\xc2c!\t\x90\x01\xed\x07\xb2:\xcc\x03\x81\x97\xc2\x9eG\xc6\xb7\n\x8a\x14\xb6\x81\t\x0c\x1b~\x02\x05\xb2\xb2T\xbeZ\xfb\x86\x06\x0eO\xfe:@\xc8\xb8\xd5\xdc\xb4F\xfak\xc4u\x04\x81,\xe0\x01C\xff\x8eH\x12\xb1\x92\x02r\xe4~\xe9\xd7u\x0e\x9c:\x08/e\xfdbp\xf9M\x7f&\x10\xbd\x1f\xcbYv\xd2)96[\x036]\xeb\xcb\xbd/\xa9]\xd7\xfa\x81-\xa7\x9c\xb4\x06f\xf4\xee\x98eCR\x1c\xbd,\xcc\x9c\xda+\x10\x13q\'\xd8\x01A%\xb7\tH\x19\xc9Z\xcd0\xe0v\x17\xc6\xec\xfds\x17`\r\xd0.t\x83?@U\xa8+\x19SA\x97\x92\x8e"\x0f\xc3t\xae\xf3\x81\xc4\xc2\xd3\xc8\xbf7Q\xaaZ\x80u\x01\xf7\xab\r\x8a\xab\xc3V J\x04E\x18t\xbc\xec\x10\xafw%\x8fv\x00go\xf9?\xc5\x95\xd1\xc7Z$x\x9f\xabx\x1c\xe6\xa3\x82j\xa7|q\xda\xe42\xf3V\xad\x94U\xbb\x00t;\xa5nm\x88Q\x8f\xeb8\xfc%`\xa7\xfc\x8f\x0c\xf3\x0c\xa7\x9dC$\xecd\xfa>U\xc0\xc7\x00\xdeZ\x01\xbbG\xbf>]\xea\x1c\xa6\xd9\xa8\xb4\xaa\xa1x\xacr\xa2M\xd6 ,\x07\x10\x90cd\x1d\x81\xaf\x88U\xda\xa9*\x12\xa9\x08+X\x12M\x9bh<5C\x0e\x03x\xf6\xbc\xf4\x00\xc3q\x04\xe1\xe0\x93{y@\xf3\xb2i^^,X\xd6\xf3)\x88\xc7\xb9\xd3\xfb\xf4\xd0\xdb\x1bo{\x17!~\xea\x00`\x88<[T\x8d9\xefQ>\xc6\xf1\x9f@\xd3r\x9e\xe8\xea\x86\x86\x1f\xad\x06\xd2\x7f}\xbb\x0bWqn\xe7~\xbc"\xf5~` R\xa1\x1fl\xc4\x8aTV\x14\xff\xfa\xa4\xfc\xf9\xc6\xeeJ\x80w^\xe2\x95(DF\xc5\xc2\xe9\xf9p\r\x94#9\x89\x7fG\xabD\xfc\xc5\xc0\x93q\xb8\x07\'Hc\xecPo\x02\xd4\xa0\xb4I\x19\x15$V\\D\x99\xbc\x96T\xceN\xf2\x8b<\r\x92\x8a\xc9\xd2\xb9\x9a\xec\x1c\xbe\x93\xde\x08\xa1\xf6\xe6\'\xab\xc4/U\x94\xdetv\xce\x92\xa2E\xc1|\tL\x0b\xab\xa9\xcdf\xaf-;a\x87:e\xe93]YR\xe2\x80\x9a\xdb,\xaf\xd4\xe6\x8a\xa5\x8e\xb8\x16\xd6\xfdaDn\xfe\xc1\x8c\xe8`2V\xce\xe7\xee\x8b\xee\xc7\xfc}yn\x83\x7fP\xac\x16\xe77\xba*E\xa4\xe4H\x08|fB\x1f\x0f\xe4\xd4@G\x04@\x14\xb93n\x81\xd7\xc1\x1b\x04\x7f\xba\xa0Og\xc2\x9en\xa0\xe3j\xf1\xab\x08\xda\x00\xf6\xfe\x99wP\x87,\x80}\x15\xf3y\x1d|<$\x0b~8Q\xec\xe1\x1d`\xf1\x01P\x8c\x1dc\xbcBMk\x12\x9d\r\xd7\x8e\x8c\x95\x17O\xc7#\xad\xe4\xbfbE\xca\x88\xe6%\x02/\xb4q\xa8\x189\x85\xa3\x13\\]\x90\x07P\xaaa(\x81\x80\xb2\xf8\xe1y\xd6.wo\xe4\x9c,wm\x9do\xd2AP\x80\xf5g\x9b\x8eo\xf2\xc9M\x1cWS\xec#\xad}k"\xb2|\x80\xc0J\x0f\\\xe0s\xbc\x7fJ\x1fF\x13\x07\xc6x\x9b\xb6\x82D}!\xfa%\x18\xed?\xb5\xd1\xfc\x08\xb1\x1aI\x89\x9b\xd8\x01w\xa4^\'\x11\xf0\xa7\xa8\xccq\xe8\x92l6\xf2\n\x81@\xacK\xcc\xc2l\xce\xdb1\x13\x90oR\xef\n\xf6\xd2\xbf\xc6\xc3\x8f\r\x95q\x91\x1d.\x8a\tz\xb30\r\x97,!5\n\xb0\\rb5\xed\xc7m\xe2\x0e\x13\xc9u$\xc0\xe7\xd85\xfc\x10\x82=\xfb\xc1\xf6\xc0t\x12\xaa\xa1\xe0\x163D\x1aR\x94BH\xf4\xfbVx\x10\x9c\x1cha\xc8x#\xd4f!=\xab5`<\xb0\xffPzD\x04\xcb7}a\xc2\x86\xdd\x8e?N\xe7wJ\x10g\xc71\t\xa1\x1e\xae\xb2\x9bVY\x1eK\xf1\x81c\x94\xf4\xb0&m\xc0\x02\xae\rl\xd7\xbd\xfe\xb4\x0e<\x1ax\xe0\xeb\x8d\xb0k?\x98^\x01k\xc8\x03\x90<\x84(a\x93\x01\xfd\xdf\x12X\x04\xact\xbe\xef\x88o$\xceX\xb8P\xb0\xc3\xa0\x0cRA\xdf\x94S mC\xf1;\x0e\xcf\xe2g\xd4\xc5\x13\\k#\rv_\xb9\x8e\x19\xf6)^Nz?\xc54C\xb5u\xdd~\x7f\x06m9\xee62\x9b\xed\xee\x88nq\x8d\xc7\xa9\xe0\x90`\xe3O;\xb4\xc8\x12\xddy\xc9s\xaa\x8b\xd6K!A}y\x12(\x89\xde\xf9W\x10\x8a\xdf\xa3\x9b\xa1\xef\xa9JK\x8e\xabPS\xd6\xad<\xd1\xc6%\x82\xff\x18/\xd9\xc8\xb8\xcb\x1b\xa5\xb3Eh\xd8\xe9j\xef\xcf\x9e\xc2\xed\xbd\x8e\xe8\xc9\xab!\xa6\r-\xac^^\x8a;\xd7o\xb5\xf2\x9b/\xfe\xf2d\x82\xa2t\x86\xd6\xd7\'\xd4b*\x91\xbc\xf8\x13\xaa\x041\x0b\xc7\xeb\x8cn8Ny5\x85\xc5\x9d\xebk%E\xed\x8alc\xbdj\xd3\xbc\xa6y\x00\x0eW\n\xb6}\xe9bmL\xc9\xf5\x9ftF"\xfb\xdb\xe19\x8f\x01\xcf=\xf2\xf3\x00h\xefU\xebqy!OV\xc5\x90\x9d\xfc\x94\x87\xfa\x0e\x7f\x9ara\xbe;\xd0x\xeb\xf4\x87\xf3\xd7\xaeb\xe4#4\x96A\xf4Di&\xa4\xd4\xed*\x13y,G\x93\x14m\x13H\x9e{\xaf\xee\x82b\xeb\x8d\xc2\xf0\x19x\x81:#\xba6\xf6\x93\xb1E\xa3\xb7%z}Z\x9b\xef\xc7\x0e\xfa\xe6\x99)\x82\xb6\xe2$\x8e\x13f\xb6e\x00\x13g\x9e\xd8!\x15p\xdc\xa3\x94\xdck\xebH\xfddR\xc4\x0c\x12S\xafG\xc0\x9c6\xc5&~\xf7\xe3Ag\xb68U\xc6Ha\xac2\xd6&C\xa9O\xf9\x85\xd8\xa8B\xa1\x91y\xbd\xa9\xc7\x98\x8a\xed\x91\xed\xe2\x9d\x9fy5d\xf64/tJ\x97\xb3A\xbeB.\x06\xd6:\xb1\t5!\x08\xa9O:\xd6\xecy\xaf\xa0Uj\xa8\xab\xf5&5\xe8\x1a\x99\x0b\xe9 \xd7\xc0\x01\x1a\x15w\xd2\x8auyai\xccSDc\x8e\x1a\xb3\xbc\xae$XI\xd7.\xc0\x18\xc5{\xf3\xac\xe7\xff\x92\x01M^\x96\xd5\xbf@{\xa7\xd3\xc9\x8e\xf3\x8d\xf9\x85V\xa1\xe39p\x10e^\x08\xea\xfcL\xa9U/\x90\tl(\x15\x95K\xe9\xf4\xaa\xc7`\xdc\xa5\x84\'\xa6m>\xba&z$\xdfu\xf2\xe1@\xe4\xa9\x8f>\x85\x9f\xc3\x1dI%ef\x9e(\xee\xa4b\xb9\xc3\xb6\x87HD\x17\xde\xe7}\xa6>7\xad\xc3\xfaR\x83\x01\xb6\x12\xb98L\xfd\x84\xc3\xa8\xea\xb0\xb0\xe1\x868\xda\x0c\xc0\xda\xf2\x01\x06\x9aa\'\x95\xed\x97\x91\\$\xef\xa8R\xbf\x86\xf6\\&\x96G\xa6 F[\xca\x87\xb2\x0cO\x7fS\xa5\xbc+`:\x95m\x152\xf7\xec\x02\t(\xfd\xcb\xe1%\xac\x98\xc8\xf53\xd1\xfe\x98N\x03=s\x17\xc7\x05\x98\xd8D%\x9dk2wnu\xdfa\x1b\xb8\x17\xb1/\x83\xd7\x84\xe2\xc8\x87\xb1\x8c\x8b\x92h\xd8\x01\x1d?\xe0\x13\x82\xc5\xbf\xed\xb7-\xaeV<\x86\xa3\xc0|\xcb"\x84\xac\xa2\xaf\x81Pj\x7f\xca*C\x0e\xf7\xa6(\xf1@\x9d\x88;\xaf\xe7?\xaf\x92\xd7\x07d|:\r\xd0?\x81&5\x1e\xbf4)64\xc9\x1e8M\xd5\x15\x17"N\xf1"\xc9\xd5]\x99\xf6\xedb>\x04]\x8b\x88\x0f\x8b\xa2nrGy&P\rz\xbfVc!\xa0i.\xa8\xbd\xc7\xea\xda;g-\xaa\xb9z0\x08U_u\x04\xdf|\xa6\x0e\x81{\xc3\x02G\xb7\xd0\xe8\xc94i\xbe\x87l9nj^\xd0\x1e3\x81\xeedC\xa8;%\xc1\x8a\x0f\xd30*\xa3\xdc\xb8]\x8bK\xd9i\x9b[\x18\xe2\xe3\x0c@\x8b\xc2\x97\x8d\xb0\xa1\x00R_\xaf|}\x8fQ\x19nE\x12\x9b\xd4s\xd5,\xb2b\x9c\xae\xe6\xf5\xfd\x17\x89\xcbaVk\xb3\x96\x1b\x8bk\xa3\xc3-|\xa7dQ\xfe*\xc5A\xd2\xd4\xe5Z#\xe3D\xefGR\x17Z\xee\x8d\xb1h\x18j#s\xdb\x9e\xd7~\x18\x19,x\xb7$)\x8e\x1b\xb1\x98\xfa\x11\xc0\xda"\xa53\xd1\x12K8\xc5\t\xcc\xba\x03\xebZH\xb7\xe8\xfa\xd4\xb0\x88\xb7\x07\x08\x8e/A\xa5V\x0c\xc5v\x81\x19\xe3\xf3JF\x9eS\x17\x93\xc1\x9a\xce\xd09\xffk\xa3Yt\xfd\x8d\x88\xb4\xe6!\x1e\xcfj\xb4\xdbq\xd8\x83\xb9\xa0\xce\xad,\x8cy\xd1\xbb%A\xeed\x95\xb6\x84\xad\xf2\xe6\xa8\x90\xfb\xee\xc3\xee\xb9c\xc9\xde,\x1d\xde\xd2\rpv\xb7\x9eWRN\x07\x7f\xe53\xbb\x1d\xfc]\xe1\xd1\x7f\x18/>\\\x06\x040\xbb+\x97\xaf\xd4\xc8\x81!\xffwzQA\xa9\xfc\xa2\x7f\xff\x14Fr\xea\x83{\x04\xb6\x10\x1c\xd87d\xe6\xf2\x97\r\xa9\xc4:<22\xa85\xd7\xc4\x8d\x82\x0c\xceb\x19\xfe;P\x87\x15x\xc3\x00c\xa6(\xa8W\x88\x0fZ\xca\x92B\x9d\xdc\xc8\xf8<\xd9\xa7t\xba\x87{l"\xd2\x95\x9b;!\xb8k\x14\xae\xc2I\xa7\xe4,\x96\x93\x14<\xe7\xce\xc5:\xcb\x171\x01\xe9\n\x92\r\x0e\xca\x19z\x994\xbaY\xda\xf0\xa2\xc4<^\x87\xd1\x92\xd9@o\xaa\xbe\x99a\x85C?\xb3\x05\x9f\xd4T\x85\xa9\xf1h\xac\x93\x9bM\x9a\xccU\x0e\xaa<!.\xf9W\x056\xce\x08\tqv\xb5\xb4t\xf7F\xed@n\xcc\x93\xfe\xbe \xb0\xac\xec\xb3\xfe\x99\x11\x8a\x1fI\xf5H4K\x83\x16\xa2\xdc\xfc\xe3\xa8\xe4}\x08\xcem\xc0\xf5\xc2\xa0\x1c8%?K8T\xcd\xff\x1bM\x1fo\xcd\xa9\xa89U\xfdqf\xaa\xaf\xa1\x90\xe4#\xa1\xd6Q\xd2\xf9:h\x1a\xa6 ~\xf1\xdf!\xba\xd6\xc6k\x9c\x98f"\x8f\xd5\xb2\x00\x99\xce\xe5\xee%c\x0b\xda\x97\xd3s\x82\xd6\xb4\xaaLp\x10\x81\x11\xd9\x07\xfeA~c\x11+\x93[%\xf48.;\xcf\x8c\xca\x80&sI\xd4\xe7\xf8\xfe\xfb2j\x18`\xb1\xda\xa3\xf7?x\xe0\xb7x\xcb?\xbc\'\x04\xd7\xb4v/\xa8\x84\x89n;\x99\xddO\xf3\x14\xfby@\xee\xec\xf6\xaf\xe0\xec<\x0b\xbc\xb2\x15\'o,\\\x11\x9f9~\xd3\x1b\x05\x0f\xfa5GRL\xcd\x87\x7f\x9e*|?\xa8\xe2\x97\xa3\xdf\x8a\x130b')
1
+ import click
2
+
3
+
4
+ from hiddifypanel.panel.database import db
5
+ from hiddifypanel.panel.init_db import init_db
6
+ from hiddifypanel.models import *
7
+
8
+ from hiddifypanel.panel import hiddify,usage
9
+ import random
10
+ import uuid
11
+ import urllib
12
+ import string
13
+ from dateutil import relativedelta
14
+ import datetime
15
+
16
+ def drop_db():
17
+ """Cleans database"""
18
+ db.drop_all()
19
+
20
+
21
+
22
+
23
+ def backup():
24
+ dbdict=hiddify.dump_db_to_dict()
25
+ import json,os
26
+ os.makedirs('backup',exist_ok=True)
27
+ with open(f'backup/{datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")}.json','w') as fp:
28
+ json.dump(dbdict, fp,indent=4, sort_keys=True, default=str)
29
+
30
+
31
+
32
+ def all_configs():
33
+ import json
34
+ valid_users=[u.to_dict() for u in User.query.filter((User.usage_limit_GB>User.current_usage_GB)).all() if is_user_active(u)]
35
+
36
+ configs={
37
+ "users": valid_users,
38
+ "domains": [hiddify.domain_dict(u) for u in Domain.query.all() if "*" not in u.domain],
39
+ # "parent_domains": [hiddify.parent_domain_dict(u) for u in ParentDomain.query.all()],
40
+ "hconfigs": get_hconfigs()
41
+ }
42
+ for d in configs['domains']:
43
+ d['domain']=d['domain'].lower()
44
+ # del d['domain']['show_domains']
45
+
46
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
47
+ domains=Domain.query.all()
48
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
49
+
50
+ configs['hconfigs']['first_setup']=def_user !=None and len(sslip_domains)>0
51
+ # configs
52
+
53
+ print(json.dumps(configs))
54
+
55
+ def update_usage():
56
+ print(usage.update_local_usage())
57
+
58
+ def test():
59
+ print(ConfigEnum("auto_update1"))
60
+
61
+ def admin_links():
62
+ proxy_path=hconfig(ConfigEnum.proxy_path)
63
+ admin_secret=hconfig(ConfigEnum.admin_secret)
64
+ server_ip=hiddify.get_ip(4)
65
+ admin_links=f"Not Secure:\n http://{server_ip}/{proxy_path}/{admin_secret}/admin/\n"
66
+ domains=get_panel_domains()
67
+ admin_links+=f"Secure:\n"
68
+ # domains=[*domains,f'{server_ip}.sslip.io']
69
+ for d in domains:
70
+ admin_links+=f" https://{d.domain}/{proxy_path}/{admin_secret}/admin/\n"
71
+
72
+ print(admin_links)
73
+ def admin_path():
74
+ proxy_path=hconfig(ConfigEnum.proxy_path)
75
+ admin_secret=hconfig(ConfigEnum.admin_secret)
76
+ print(f"/{proxy_path}/{admin_secret}/admin/")
77
+
78
+ def init_app(app):
79
+ # add multiple commands in a bulk
80
+ #print(app.config['SQLALCHEMY_DATABASE_URI'] )
81
+ for command in [init_db, drop_db, all_configs,update_usage,test,admin_links,admin_path,backup]:
82
+ app.cli.add_command(app.cli.command()(command))
83
+
84
+ @app.cli.command()
85
+ @click.option("--domain", "-d")
86
+ def add_domain(domain):
87
+ table= ParentDomain if hconfig(ConfigEnum.is_parent) else Domain
88
+
89
+ if table.query.filter(table.domain==domain).first():
90
+ return "Domain already exist."
91
+ d=table(domain=domain)
92
+ if not hconfig(ConfigEnum.is_parent):
93
+ d.mode=DomainType.direct
94
+ db.session.add(d)
95
+ db.session.commit()
96
+ return "success"
97
+
98
+ @app.cli.command()
99
+ @click.option("--admin_secret", "-a")
100
+ def set_admin_secret(admin_secret):
101
+ StrConfig.query.filter(StrConfig.key == ConfigEnum.admin_secret).update({'value': admin_secret})
102
+ db.session.commit()
103
+ return "success"
104
+
105
+ @app.cli.command()
106
+ @click.option("--key", "-k")
107
+ @click.option("--val", "-v")
108
+ def set_setting(key,val):
109
+ old_hconfigs=get_hconfigs()
110
+ hiddify.add_or_update_config(key=key,value=val)
111
+
112
+ return "success"
113
+
114
+ @app.cli.command()
115
+ @click.option("--config", "-c")
116
+ def import_config(config):
117
+ next10year = datetime.date.today() + relativedelta.relativedelta(years=10)
118
+ data=[]
119
+ if "USER_SECRET" in config:
120
+ secrets=config["USER_SECRET"].split(";")
121
+ for i,s in enumerate(secrets):
122
+ data.append(User(name=f"default {i}",uuid=uuid.UUID(s),usage_limit_GB=9000,package_days=3650))
123
+
124
+ if "MAIN_DOMAIN" in config:
125
+ domains=config["MAIN_DOMAIN"].split(";")
126
+ for i,d in enumerate(domains):
127
+ if not Domain.query.filter(Domain.domain==d).first():
128
+ data.append(Domain(domain=d,mode=DomainType.direct),)
129
+
130
+ strmap={
131
+ "TELEGRAM_FAKE_TLS_DOMAIN": ConfigEnum.telegram_fakedomain,
132
+ "TELEGRAM_SECRET":ConfigEnum.shared_secret,
133
+ "SS_FAKE_TLS_DOMAIN":ConfigEnum.ssfaketls_fakedomain,
134
+ "FAKE_CDN_DOMAIN":ConfigEnum.domain_fronting_domain,
135
+ "BASE_PROXY_PATH":ConfigEnum.proxy_path,
136
+ "ADMIN_SECRET":ConfigEnum.admin_secret,
137
+ "TELEGRAM_AD_TAG":ConfigEnum.telegram_adtag
138
+ }
139
+ boolmap={
140
+ "ENABLE_SS":ConfigEnum.ssfaketls_enable,
141
+ "ENABLE_TELEGRAM":ConfigEnum.telegram_enable,
142
+ "ENABLE_VMESS":ConfigEnum.vmess_enable,
143
+ # "ENABLE_MONITORING":ConfigEnum.ssfaketls_enable,
144
+ "ENABLE_FIREWALL":ConfigEnum.firewall,
145
+ "ENABLE_NETDATA":ConfigEnum.netdata,
146
+ "ENABLE_HTTP_PROXY":ConfigEnum.http_proxy_enable,
147
+ "ALLOW_ALL_SNI_TO_USE_PROXY":ConfigEnum.allow_invalid_sni,
148
+ "ENABLE_AUTO_UPDATE":ConfigEnum.auto_update,
149
+ "ENABLE_SPEED_TEST":ConfigEnum.speed_test,
150
+ "BLOCK_IR_SITES":ConfigEnum.block_iran_sites,
151
+ "ONLY_IPV4":ConfigEnum.only_ipv4
152
+ }
153
+
154
+ for k in config:
155
+ if k in strmap:
156
+ if hconfig(strmap[k]) is None:
157
+ data.append(StrConfig(key=strmap[k],value=config[k]))
158
+ else:
159
+ StrConfig.query.filter(StrConfig.key==strmap[k]).update({
160
+ 'value':config[k]
161
+ })
162
+ if k in boolmap:
163
+ if hconfig(boolmap[k]) is None:
164
+ data.append(BoolConfig(key=boolmap[k],value=config[k]))
165
+ else:
166
+ BoolConfig.query.filter(BoolConfig.key==strmap[k]).update({
167
+ 'value':config[k]
168
+ })
169
+ if len(data):
170
+ db.session.bulk_save_objects(data)
171
+ db.session.commit()
172
+
4
173
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
174
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,60 @@
1
- # 2023-04-08T16:23:31.863240
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\xb6\n\x00\x00\x12\t\x04\x00\x85!\xc3\xc3D\x0f\xbfl\xadh|K\x8f\xe3\xa7\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x99\xb4\xb8\x863\x1f\xf1E-\xbb`J!\xc8V\xb3\x12I\xa8\\\xf8&\xd5\xe0E%a\x86\x0b\xa8\xf4\xfe\x90\x1d`\xbe\x05\xb4)E^O\xc5\x82\xfe\xca_\x10\xb8\x8f,\x1b\x82\xa8\xa3.\x17L\xfc\xc2\xf9\xdbY/\x8d\xdc\x12\xcd\x0b\x8d\xae\xde\xc6\x8c[\xf9\xa9\xf0#\xe2\xe3o3\x82\x0f\xd6\x83S*VK\x1c\xd4\x01\x1bb\xd6\xc9\x0e\xd8U\x96w\xbf\xcf\x98\x045\xb8\x88\x08\x9b\xef\xaeD\x1e\xb5\x87\xa7/\xaa\x95\x0e\xb56\xa4\xbd$\xd6t\x1b\xf6\x04>#\xa2\xa1\x8e\xc7\xa9\x95x\xd8a\xeb\xac\x07\x8b\x8c\xa2N\xde\xff\xad:\xfc(O\xcd\xe6f\xeb\x8a\xedi\xde\x1bV\xf7%\xc1Mtm\xe2j\xabS\xe6\x92\xc1\x93Q\x05\xd7\x08z\xbb(t(\xbe\xe7\xe7\xb4n\x92\xa7\xbaF\xdf\x0cXkg\xf0\xd4s\xe5\xbc\x92\xb9W\xe6n\x9bT$\x01[Z{O\xe1\x03\xcf\x97>\xa2/\\$\xff\xed7\x00\x18<\xaf\xdbD\\[\x19LDL\xc5\xd9\xc3\xb78\xc0\xc4,2\x8f\xf5\x8fr\xfa;\xd7.\xecSa\xa5\xdb\xb6\xe1uJY\xecc\x0f\'%\x9eb\xe4g;\xe8\xe9(\x8bV\ng7\x07@}a^8U\x9a7,\x8e}>7\x1bo\x04+kM\xeb-%=z\xee\x8d:A\xe2\xfa6\xb7!G\xae\xe7w\xc4\t\xfb\xe2\xdd\xbb\xbb<\x0e\xec\x9c\x92i\xa6X\xf5\xbf|g#\xd4\xaa\x84\xff\xe0\xf2\x96\xe0$\xd9\x0c\x83\x04O\xdauK\xa5\x13\xdf\xe3\x96\xcc(\xb8G\xbf\x94L\x81F\xa5\xe1\x1bP\t\x1e\xae\x80)a9\xb4\x05.v\xed\x15N\xf8U5\xcfb\xe7\xbf\xd1<l@\x8d! \xf2\xba\xa4)"\x07T\xe3E\x9d\x14\xbe\xfd\xb8.\xdc\x19\xdd\xf6$\xe4\xf3\xb4\x87\xf2/\x97\xccKz4\xbd\xdd\xbb6\x0b\x87pA\x952_{%\xed~\x84M\x19\x12,!\xfdz\x1a\xd5%\xd8\r:\x82\xcd\xef\xdf\xac/\xcbT@\xee\xa4\x1c\xe5\xc9t\x12\xe3\xe0\xd9T\xf7!}\x89wO\xa8\x92\x16\xa1oq\xb6\xad\xfe\x12\xb5\xa7\xb0\x1ex\x18c\xd9\xb0\xd9\xd6\x9a\xc0\xee]\xbc\x91Z&\x0e\xab\x18\xed5\xbf\x96\xcf\xbb\x08\xbc\xc73V\xa2\x97\x9e!&\x0f\xf9A\xe0\xd9\xbc\xa8\xcb\xb0\xf2K\xdeI\x93\r$\xaaV\'|\xe8E$X\n|\xabh\xeb{\x98\x83\x8b\xc1\xe2\xf8\xf8\'\xfaE$\xca\x84D\xf6\x99\x1b<\x8c\x10k7O\xbb\xa2\xd3O\x15\xcd}.\xbb\x9c`\xdf}\xea~\x97\x95r$\xa2\xe3{M\xfd\xda\xb2\xcf\xf8\xa7\xec\xefy\x84.-\x01:\xe8\x08LG\xb9\x83$Y\xa5\x0e\xf0m\x16\x0f1_\xf2^\x07aW\xa4\x7f\x16\x01\t|J\xc9\xb4\x1a\x97\x9b\xa8\xa0\x9b\xf3\x12\xaa\xa2\xd3\x96\x90F\xb9\x9b\x06\xe7\xf7\xa9(\xab\x0c.\t\xfcg\x8a\xbf\xf0\x04\xcb\x8bPO\xe4]X\xf6\xbf\xa1\xa5\x1b!\x1e\x9czXu3[\x80\xc5|qy\xbd&as\xdb\x80p\x172\xc9\xde\xdf!\x9a\xb21r\xde\x95^\x06\xf6\x9a\xc1>\xba\xa5\x99\xc6~\x19\xf7\xac5\xc6\xf6S\xe6\xf9\x0b\xf0\x9b\xa1\x1a\x12\x12\xd1I\x85\xe9U{\x91\x96\xcf\x923\xa4\x19\xb5\xb5\xd6f\xaa\x93\xfd\xc0akjc\x01\xf8q\xce\xc3\xf1\xaa\xbe\x1fc\xed\x01i\x8b\nKZE\xa1%e\xa7\xd2%"\x99D0\x93\xbc\x9c\xbc\x02\xd4\n\xb3\x03\xf3L\xf6\xb3\xc6\xd04\xa9\xa1\xc3`\x87\xf5\x94u\xd6\x9a9\x89\xde\xb2\xe4\xba\xf8P\xdd\x9e\x1e\x1c\'?8\x8a\xf9buF\\\xdd\xe92\xbf\xf4.\x0b\xaa$\xd3fe\xb2\xcd(\xf56S/\xb6x\xd2\xe4\xef\xd94<\x96\x8f\x1bS\x0b^\x88\xa0\xbf1\xbd\xe0\'\x89v\xe7\t\xf7\xf0\x14\xc4D\xc9M7(p\x9d\xcd\xfa\x834m\xb3\xb6\xe17t\xdd\x8b\xd6\x9a\xdbAhw\xaf\xda\xb1\xa6\xc0G\xf5\x1a\xff^I\x14\x01CP\x00Z;\xf1\xbf\xce\xfb\x13\x10\x90\xa36\xab\xb0\x83/\xd3}\x8d4\xc4\xb9\xdf\xab\x82jW\xf3q\xec\xc9\x9a\xe0\xb6\xbf*S\xf5v\xd69\xcc\xa3]Tf*)`b\x8a_5,\xbe\xfaC\xf9\xb4\xf6\xf7\xff\xdd.\xa7\xf0\xcaS\x885B3\x02oB\xe9\xac\xfc\xb71{I:\x84\xce9\x94\xc5_\x05\x10\xb9\x9e\xf8-VI\xf4\x04\xae\xfc\xb7z\x7f)\xd5$\xef\x93-\x0b# ni\xb9\x9f\xdc`\xaei0\xd0\xa1c7\x06\r\x08h\x9f\xa6w\x81\x0e\x90I\xee\x96\xd0p\x82\xfci\x93*\x08\x13\xdc\x18\xd2\x7fi\x0f\xe7A\xd4\x9f\xb8]\xdev\xe4\xbf\x11\x86\xcd\xf2l\xbb?\xf4\xd75O\xb7%{Ef\xe1g]o\xbf}20\x91-mK\x97\xf2jSj\xe6\xce\x7f\'G1\x11JV\xe3f9\xbd\xa9\xd6=\x13f\xc6\x14>\xf8G\xc1\x1aC\x02\x98n5\xb0\'\x99\xc3\xfb?&\x8b\x02\xaf\x87\x03\xc3H/6\xb7M\xec\x8a\xe6\x81\xda\xb3J\xff8\xfb\xa9eA{[\x9a\xb0\xaev\xd9\x1b\x99\xbc+"\x97\x80\xae\xdb\x94\xfb\xab\xc3\x86\x16G\xea\xc7\x1a\xfd~\xf43z\xd1#\x1aY#\xb3\xb6Td>c\xa2.X\xbc,]\xfaq\xe6m\x16\x08Y;e\x87\xeb\xb5\xd0&\x1c\x81\x15T#}\xa5\xffr>s\xf4Y\xfeu\xe2\xf3@\x0f\xfd%\xbdv\x85\xe0\xe4O\xb7\xb0(O\xed\xc0\xa6\xa60\xf8\x92\x0b\x8fS\xe4\xd5\xd7\xc1~vQ[#\xf6\x94\x8e\xeb\xed\xb1n\xd7\x03\x94_@\xe5\x99\x98\x07\x95@\x13:k\xcd\xf0J\x9b+\xd6\xb8\xed5,e\xe6\xb9DEA\xd0\xeb\x04u\x0e\xcf\xe9\x82\x83\x06\x04\xf8<\xda\xc5c\x9e\x01S\x991\xdd\xcb\x98\x92\xa2\x06\xfc\xa8\x7f\x00\xf2\xf4l\x86$\x19\xe9\xcf\x1e\xc8\x90\xd9=s\x882\x0e\xaa\x83p\x1e\xd8\xaf\x91v\x9b\xa75>\x1b\x16s\xcd:w\xf9W\xa7(6\x99\xf0;s\x01\xdc\x1d\xe3\xf1\xbcD\xb8\xf1\xbd\xba\x92\x0b9\xaf<K\xc1\xa1\x15\xedt<b\x8ck\x14~Q\x12=d\x0f7\xd4\xe7\xab\xe8\xa4\x80\x19.\x06 \xcbH[\xdf\x9d;\'C\x0b\xa3E\xa7@\xbbxO\xd2\xe0a\xa1\x8e\xf1\x8a\n"S\xa7\n9\x83\xca\x8aN\x82m\xa9\x87\x15\x969p#\xe3\xdf*0\x9a\x08\xbd\xe6\x86\xbf\xb5U\xf3Zh\x14{\x14\x1e\xde\'g\x05\xb4\x93\xe2jd\x19\xbeR\xbe\xb56n\xdf!m(\x11\x19\xee\x04\xa0>\xf4\xa5n\xb7\x91|ws\xa0Z\xb0(!o\xc3P\x95\xfapz\x16\x81X\x8b\xa2\xc5:\xed\x17m\x8f:\xb0\xf8@y\xa6\rk\xb7,\xea,\xf5"r\x8a\xf8~\xd9~\x13\x19\xd6\x86\x89\xc4\x13:\xcc\xae\xd6\tU\xfa\xbb\x0c4\xea\xadWR\x8a\t\x19\xfa\x1cg&&\xb4\x7fAzw\xb9aSy\x0f\xd0u$\xb6k\x93\x10[BR\xe8\x0f\xa0\x1b\xfd\xb2\rO\xdcLo\x13\xea\xa1\x16.1\xf4\xfa\x11\xfe\xae\x91\xf1\x10\xd3\x81I\x105\x18\\TA=\xbb`b\xcb\xbf\x9eh{7\xc4\x1e7\x10\xbc\xa1D*\xb7\xf1\xd2\xafS\xb5\x9dVf\x043\x0f\xe6\xa2\xb20\x1d\x15\xd3\xb6\xf0M\x86\x81\xde\xe9Ai?\xc0\xfd\xa9hiP\x97\xc5\x90\xf2^\xfb\xa4~\xae\x01\xd3) \x88\xf2P\xe3\xab\x9bnb\x90\xe8[\xe0Y\xd7?\x13\xed\x04\xffJv\\\xd3\xb6\xec6j\xe7\x89\xd3\xbc\x9c\x06a\x93\xac\xef\xd3\x07DtM\xebpA\x0f:$\xc3t\xe1a\xc7\xcf\xb1\xab\x8d\xe98?\xb8\x8c\x89\xdc1\x9eH\x7f\xf4\x94\x17\xd1\xe3\xfc\x18\xb9\x8a\x1d\xd5\xf6\x82\x1c\xb5\x0e\x1b\xdc\xc3\xaf\xa7\xa4\xa4L\xa0\xe8\xc2\xec\x14(\xf8\x9du\xc0\x12\xdf\x06\xd6[\xe0L)r<]\xa9\xe1]K\xec\xf0\xacN\x93\xa5\x8e\xa6\xd7\x03\xb8\xf1\xf9_\x04s!\xe8\xa8\x97\xe8Z|\x93W\x93\x00\x85\xebM\r\xfd.\xec\\\xa1B]\x05\x91$\xce\xa0\xf4\xf3\'\xae\xba&\xc1v\x9b\xf2\\\x14\xcbcu:\xb9\xfa\x16\xf1\xa96e\x04+<\xc0\xe2O\x91\x86\xeeG\x19?\x1d\x1a&8lN\xb9\xa3Vy\x1e\t\xf9\xa0\x93K\x81b\xf9QU\x1e\x80\xe66`\xcf=\xd4\x1c\xfcs\xac\x87\xa6\xbd\xeduK\x84\x90\xe7\xde\xff\x1d\xd7\xa5q\xe9rV\xb0\xdc8\xb63\xda% M\x0c\xfa\xa6\xe7\n5\xbcA\xa5U\x9aN\xda\xca.M\xee\tb\xcc1<{$\xc3\rP\x1a\x15K\x07\x02\r\x89S\x1b.`\x06b\r\x13\xe5\xd1\x83\xe8\xa8\x95\xfa\x9fw\xe6G\xc5\x10\xdd\xef\x89\xbb\xeb\xc33\xa0\xc5dC\xdfk\x1fr\xf6\x9a\xb3\x07\xffDe\xc8\x1d\xc5\xd5\x94\xe5\x80O\xa7,\x95\x06U\xe9Q-\xb9\xf3\x8a"\xb8\xba#w\xa2\x05v\x1ax\x14 \xa5\x02a,v\xdc\x0f\n\x15\xc1\xd3O\xb09\xc0\xbd\xaa?\x95\xa7@[d\xc3&.n\xa6\xbb\x9cqx\xc3\xbe\xc5sN\xe1\xce`\x81z\xd4D?\xfcs\x94O)\x9c\x0c\xa2(k\x04\xa1n\x18i\x7f5\x19\xfc\xf4\xeb\xb7\x1c\xc3 \xb6\xe2#P\x8e*\x95+\xe9\x84\xdc\x9e+\x16*P\xd3U\xe4\xf4_\xc1\x11\x7f\xaf\x8b\x9f\x92G\x9cP\xa5\x8fbg\xe7!\xfa\x00\xf2\xdeM\x15W$\x8fGI\x11\xf1\x9c\xc6j%\xcc\xe8\xf2\x08\xddk\xf4\xc6\xb2+\x9b8)\xd6\xb7R\xff\x93\xb8&\x0b^\xaf\xc7\xc8!-\xbc\xa9kZI\x19lP\x81\xf4\xd5\xcd\xae\xbd\xde4\xbd\x05\x95J\xa3\xcf\xfc\xee\x99\xc3\x15\x12}\xdeh.\xb7>\x8d1]\x18;\x04\xd7\xa5\xfa\xe0\xc7S\x88\xb87[>db\x8f1\xe60\x84\xb34T\x9cj\xbb\n&\xc04B\xdd\xcc\xfba\xa1&\x84\xa9T\xf59\xfd\xbf\xae\xbdLK\x17\x18\xb00\xc8\x8f\x91\xb9\x19Oi{~)_8I\xf7\xaa[=>\x12\xf2}\x8eS\xe2`I\xc7\t\xab\xcd\x07\x8d\xc7E6Z\xe3K \x00>\x03\xe5\xe7J\xb0}*oN>]5\x96\xa5\xc6$#\x90\x9c\x9e\xcbsjo\x1aoU2>\x19.\xd7\xfa\xa04H~\x13\x9d\x92a2\xb5\xc0\x1d7\xa3\x87\xddJ\x8aF\x82\xe3\xff\x17]\xd0\xd1\x19\x84\xfe\xb7\xdd\xf4\x9fS\t\x8fz\xc5;\x1e\x98\x8d\xad\xc6]\x00\xf8\xa3w\xf0:v\xf5n\xad\xd3R\xe5\xc40p\xe4!=@\x0c8\xd3.\xac\xd1\x1d\xbb\xfbT\x07.\xf8\x82\x18gk\xd4\x8e\x8c\x16i\x1cB\xab\x10\xb3 \x83lh\x0c8u\xd8A\x87\xff\x8f\x18\xe6S^\xc7\xd1\xd3\xbf\xea\x1d\xdf\xf2\x19l\x07\x1duS\xda}\xaf\x1eOG\xc2\xe2\xf7sD\xf11O\x88\x96\x97:o\xaaa\x98\xc45p\x01e4\x8a\xbf5\x1f\xaa\xb3\x1e\xe8\x19\xe8\xe7+v#\xf6\xaa\xb2^\x12\xde\x08n\x19\\?z\x0f\x01wxv\xfdR\xf86i\xe7\x8e\x8d\xc8I\xfer7U,E-,M\xa2\x0c-\xa0\xd0\x91\xe0i\x04\xe5\xf3\x9f\x0f<2@6\xc4\xc8N\xc5. \x95\xdc\xe8i\x0f\x8c\xca\xb7G\x19\xcb)e\xb9\x8c\x93c-\xc0\xcb\xeb\xf5\x11\xfd\x1f\xc5\xabS\xcc\x15\x8d[ \xd7x\x8ah|\x9b_\x11o\xe7\xaa\x1a\x1b2-\xdc\x90\x91\x01\x87E\xae\x1e\x98L\x14\xbe\xcf\x03\xdb\xcas3A\xf5\x10\x18')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.base import AdminIndexView,expose
2
+ from hiddifypanel.panel.hiddify import admin
3
+ from flask import render_template,url_for,Markup,request
4
+ from flask_babelex import lazy_gettext as _
5
+ from hiddifypanel.panel import hiddify
6
+ import datetime
7
+ from flask_classful import FlaskView,route
8
+ from hiddifypanel.models import *
9
+ from hiddifypanel.panel.database import db
10
+ from hiddifypanel.panel.hiddify import flash
11
+ class CommercialDashboard(FlaskView):
12
+ def index(self):
13
+ return ""
14
+ bot=None
15
+ # if hconfig(ConfigEnum.license):
16
+ from hiddifypanel.panel.telegrambot import bot
17
+
18
+ if hconfig(ConfigEnum.is_parent):
19
+ childs=Child.query.filter(Child.id!=0).all()
20
+ for c in childs:
21
+ c.is_active=False
22
+ for d in c.domains:
23
+ if d.mode==DomainType.fake:continue
24
+ remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
25
+ d.is_active= hiddify.check_connection_to_remote(remote)
26
+ if d.is_active:
27
+ c.is_active=True
28
+
29
+ return render_template('parent_dash.html',childs=childs,bot=bot)
30
+ # try:
31
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
32
+ domains=get_panel_domains()
33
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
34
+
35
+ if def_user and sslip_domains:
36
+ quick_setup=url_for("admin.QuickSetup:index")
37
+ flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
38
+ elif len(sslip_domains):
39
+ flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
40
+ elif def_user:
41
+ d=domains[0]
42
+ u=def_user.uuid
43
+ flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
44
+
45
+ # except:
46
+ # flash((_('Error!!!')),'info')
47
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
48
+ onlines=User.query.filter(User.last_online>h24).count()
49
+ total=User.query.count()
50
+ return render_template('index.html',onlines=onlines,total_users=total,bot=bot)
51
+
52
+ @route('remove_child', methods=['POST'])
53
+ def remove_child(self):
54
+ child_id=request.form['child_id']
55
+ child=Child.query.filter(Child.id==child_id).first()
56
+ db.session.delete(child)
57
+ db.session.commit()
58
+ flash(_("child has been removed!"), "success")
59
+ return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
60
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product