allykit 1.0.0__tar.gz → 1.0.2__tar.gz

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 (28) hide show
  1. {allykit-1.0.0/src/allykit.egg-info → allykit-1.0.2}/PKG-INFO +1 -1
  2. {allykit-1.0.0 → allykit-1.0.2}/pyproject.toml +1 -2
  3. allykit-1.0.2/src/allykit/IRAN.py +460 -0
  4. allykit-1.0.2/src/allykit/Language.py +557 -0
  5. allykit-1.0.2/src/allykit/Security_kit/__init__.py +4 -0
  6. allykit-1.0.2/src/allykit/Security_kit/file_kit.py +1112 -0
  7. allykit-1.0.2/src/allykit/Security_kit/hash_kit.py +353 -0
  8. allykit-1.0.2/src/allykit/Security_kit/password_kit.py +867 -0
  9. allykit-1.0.2/src/allykit/__init__.py +95 -0
  10. allykit-1.0.2/src/allykit/country.py +1096 -0
  11. allykit-1.0.2/src/allykit/web_kit/CChrome.py +203 -0
  12. allykit-1.0.2/src/allykit/web_kit/Communications.py +255 -0
  13. allykit-1.0.2/src/allykit/web_kit/Elastic_bands.py +1661 -0
  14. allykit-1.0.2/src/allykit/web_kit/Get_Code.py +394 -0
  15. allykit-1.0.2/src/allykit/web_kit/WebAutomation.py +467 -0
  16. allykit-1.0.2/src/allykit/web_kit/Working_with_code.py +455 -0
  17. allykit-1.0.2/src/allykit/web_kit/__init__.py +250 -0
  18. {allykit-1.0.0 → allykit-1.0.2/src/allykit.egg-info}/PKG-INFO +1 -1
  19. allykit-1.0.2/src/allykit.egg-info/SOURCES.txt +24 -0
  20. allykit-1.0.2/src/allykit.egg-info/top_level.txt +1 -0
  21. allykit-1.0.0/src/allykit.egg-info/SOURCES.txt +0 -9
  22. allykit-1.0.0/src/allykit.egg-info/top_level.txt +0 -1
  23. {allykit-1.0.0 → allykit-1.0.2}/LICENSE +0 -0
  24. {allykit-1.0.0 → allykit-1.0.2}/README.md +0 -0
  25. {allykit-1.0.0 → allykit-1.0.2}/setup.cfg +0 -0
  26. {allykit-1.0.0 → allykit-1.0.2}/setup.py +0 -0
  27. {allykit-1.0.0 → allykit-1.0.2}/src/allykit.egg-info/dependency_links.txt +0 -0
  28. {allykit-1.0.0 → allykit-1.0.2}/src/allykit.egg-info/requires.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: allykit
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: A comprehensive Python toolkit for security engineering, cryptography, web scraping, filesystem auditing, DFIR, and reusable utility functions.
5
5
  Home-page: https://github.com/hosssein193m-ai/allykit
6
6
  Author: None
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "allykit"
3
- version = "1.0.0"
3
+ version = "1.0.2"
4
4
  description = "A comprehensive Python toolkit for security engineering, cryptography, web scraping, filesystem auditing, DFIR, and reusable utility functions."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -9,7 +9,6 @@ license = { text = "MIT" }
9
9
  authors = [
10
10
  { name = "allykit Developer", email = "hossein.moradian.ir@outlook.com" }
11
11
  ]
12
-
13
12
  keywords = [
14
13
  "security",
15
14
  "cryptography",
@@ -0,0 +1,460 @@
1
+ """
2
+ Module: Iran Geographic Data
3
+ Version: 2.1 (Complete Edition)
4
+ Description: Comprehensive Iranian geographical, demographic, and telecommunications data.
5
+ Includes Persian character sets, city mappings (Persian to English),
6
+ provinces, cities, populations, SIM card prefixes, phone codes, car plates,
7
+ coordinates, and utility functions.
8
+
9
+ Author: Generated Assistant
10
+ Last Updated: 2026
11
+
12
+ Main Data Structures:
13
+ - persian_letters, persian_numbers, persian_harakat: Persian character sets
14
+ - iran_cities: dict mapping Persian city names to English
15
+ - provinces_and_cities: dict mapping provinces to their cities
16
+ - iran_provinces: list of all 31 provinces
17
+ - regions: dict mapping Persian regions to province lists
18
+ - province_metadata: dict with province codes, regions, area, population
19
+ - city_coordinates: dict mapping Persian city names to (lat, lon) tuples
20
+ - city_full_data: dict with en_name, coords, province for major cities
21
+ - iran_cities_fa / iran_cities_en: complete city lists
22
+ - city_population: dict mapping Persian city names to population counts
23
+ - sim_card_prefixes: dict mapping operators to prefix lists
24
+ - sim_card_prefixes_list: flat list of all SIM prefixes
25
+ - city_phone_codes: dict mapping Persian city names to area codes
26
+ - car_plate_codes: dict mapping province names to plate number codes
27
+
28
+ Utility Functions:
29
+ - get_province_of_city(city_fa: str) -> str
30
+ - get_city_coords(city_fa: str) -> tuple
31
+ - search_city(query: str) -> dict
32
+ - get_provinces_by_region(region_fa: str) -> list
33
+ - get_city_population(city_fa: str) -> int
34
+ - get_sim_operator(prefix: str) -> str
35
+ - get_city_phone_code(city_fa: str) -> str
36
+ - get_car_plate_codes(province_fa: str) -> list
37
+
38
+ Usage Examples:
39
+ >>> from iran_geo import *
40
+ >>> get_province_of_city("اصفهان")
41
+ 'اصفهان'
42
+ >>> get_city_population("تهران")
43
+ 8846782
44
+ >>> get_sim_operator("0912")
45
+ 'همراه اول'
46
+ >>> get_city_phone_code("شیراز")
47
+ '071'
48
+ >>> get_car_plate_codes("تهران")
49
+ ['11', '12', '22', '33', '44', '55', '66', '77', '88', '99', '10', '20', '30', '40', '50']
50
+ """
51
+
52
+ # ==================== حروف و کاراکترهای فارسی ====================
53
+ persian_letters = "آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی"
54
+ persian_numbers = "۰۱۲۳۴۵۶۷۸۹"
55
+ persian_harakat = "ًٌٍَُِّْ"
56
+
57
+ # ==================== نقشه شهرها (فارسی به انگلیسی) ====================
58
+ iran_cities = {
59
+ # استان تهران و البرز
60
+ "تهران": "tehran", "ری": "ray", "اسلامشهر": "eslamshahr", "ورامین": "varamin",
61
+ "شهریار": "shahriar", "قدس": "qods", "قرچک": "qarchak", "بومهن": "bumehen",
62
+ "پردیس": "pardis", "ملارد": "malard", "فردیس": "fardis", "کرج": "karaj",
63
+ "طالقان": "taleqan", "نظرآباد": "nazarabad", "اشتهارد": "eshtehard",
64
+
65
+ # استان اصفهان
66
+ "اصفهان": "isfahan", "کاشان": "kashan", "خمینی‌شهر": "khomeynishahr",
67
+ "نجف‌آباد": "najafabad", "شاهین‌شهر": "shahinshahr", "مبارکه": "mobarakeh",
68
+ "فلاورجان": "falavarjan", "زرین‌شهر": "zarinshahr", "گلپایگان": "golpayegan",
69
+ "فریدن": "faridan", "سمیرم": "semirom", "شهرضا": "shahreza", "نائین": "nain",
70
+ "نطنز": "natanz", "اردستان": "ardestan", "خوانسار": "khansar", "دهاقان": "dehaghan",
71
+
72
+ # استان خراسان رضوی
73
+ "مشهد": "mashhad", "نیشابور": "neyshabur", "سبزوار": "sabzevar", "تربت حیدریه": "torbat heydarieh",
74
+ "تربت جام": "torbat jam", "قوچان": "ghochan", "کاشمر": "kashmar", "گناباد": "gonabad",
75
+ "چناران": "chenaran", "سرخس": "sarakhs", "فریمان": "fariman", "درگز": "dargaz",
76
+
77
+ # استان فارس
78
+ "شیراز": "shiraz", "مرودشت": "marvdasht", "جهرم": "jahrom", "فسا": "fasa",
79
+ "کازرون": "kazeroon", "لارستان": "laristan", "آباده": "abadeh", "نورآباد": "nurabad",
80
+ "اقلید": "eqlid", "داراب": "darab", "زرین‌دشت": "zarindasht", "لامرد": "lamerd",
81
+
82
+ # استان آذربایجان شرقی
83
+ "تبریز": "tabriz", "مراغه": "maragheh", "مرند": "marand", "میانه": "mianeh",
84
+ "اهر": "ahar", "بناب": "bonab", "سراب": "sarab", "آذرشهر": "azarshahr",
85
+ "هشترود": "hashtroud", "کلیبر": "kaleybar", "جلفا": "jolfa",
86
+
87
+ # استان خوزستان
88
+ "اهواز": "ahvaz", "آبادان": "abadan", "دزفول": "dezful", "اندیمشک": "andimeshk",
89
+ "خرمشهر": "khorramshahr", "بندر ماهشهر": "bandar mahshahr", "بهبهان": "behbahan",
90
+ "ایذه": "izeh", "شوشتر": "shushtar", "شوش": "shush", "مسجدسلیمان": "masjed soleyman",
91
+
92
+ # استان کرمانشاه
93
+ "کرمانشاه": "kermanshah", "اسلام‌آباد غرب": "eslamabad gharb", "سنقر": "sanghar",
94
+ "صحنه": "sahneh", "هرسین": "harsin", "کنگاور": "kangavar", "پاوه": "paveh",
95
+
96
+ # استان مازندران
97
+ "ساری": "sari", "بابل": "babol", "آمل": "amol", "قائم‌شهر": "ghaemshahr",
98
+ "بهشهر": "behshahr", "نوشهر": "nowshahr", "چالوس": "chalus", "تنکابن": "tonkabon",
99
+ "نور": "noor", "محمودآباد": "mahmoudabad", "فریدونکنار": "fereydunkenar",
100
+
101
+ # استان گیلان
102
+ "رشت": "rasht", "لاهیجان": "lahijan", "انزلی": "anzali", "رودسر": "roodsar",
103
+ "آستارا": "astara", "تالش": "talesh", "فومن": "fouman", "صومعه‌سرا": "someh sara",
104
+ "رضوانشهر": "rezvanshahr", "ماسال": "masal",
105
+
106
+ # سایر استان‌ها
107
+ "ارومیه": "urmia", "کرمان": "kerman", "همدان": "hamedan", "یزد": "yazd",
108
+ "زنجان": "zanjan", "بندرعباس": "bandar abbas", "بوشهر": "bushehr", "اراک": "arak",
109
+ "قم": "qom", "سمنان": "semnan", "شهرکرد": "shahrekord", "یاسوج": "yasuj",
110
+ "ایلام": "ilam", "بجنورد": "bojnord", "بیرجند": "birjand", "سنندج": "sanandaj",
111
+ "خرم‌آباد": "khorramabad", "گرگان": "gorgan", "اردبیل": "ardabil", "زاهدان": "zahedan",
112
+ "قزوین": "qazvin",
113
+ }
114
+
115
+ # ==================== استان‌ها و شهرهای تابعه ====================
116
+ provinces_and_cities = {
117
+ "تهران": ["تهران", "ری", "اسلامشهر", "ورامین", "شهریار", "قدس", "قرچک", "بومهن", "پردیس", "ملارد"],
118
+ "البرز": ["کرج", "فردیس", "اشتهارد", "طالقان", "نظرآباد"],
119
+ "اصفهان": ["اصفهان", "کاشان", "خمینی‌شهر", "نجف‌آباد", "شاهین‌شهر", "مبارکه", "فلاورجان", "زرین‌شهر", "گلپایگان", "فریدن", "سمیرم", "شهرضا", "نائین", "نطنز", "اردستان", "خوانسار", "دهاقان"],
120
+ "فارس": ["شیراز", "مرودشت", "جهرم", "فسا", "کازرون", "لارستان", "آباده", "نورآباد", "اقلید", "داراب", "زرین‌دشت", "لامرد"],
121
+ "خراسان رضوی": ["مشهد", "نیشابور", "سبزوار", "تربت حیدریه", "تربت جام", "قوچان", "کاشمر", "گناباد", "چناران", "سرخس", "فریمان", "درگز"],
122
+ "خراسان شمالی": ["بجنورد", "شیروان", "اسفراین", "جاجرم", "مانه و سملقان"],
123
+ "خراسان جنوبی": ["بیرجند", "قائن", "فردوس", "نهبندان", "طبس", "سربیشه"],
124
+ "آذربایجان شرقی": ["تبریز", "مراغه", "مرند", "میانه", "اهر", "بناب", "سراب", "آذرشهر", "هشترود", "کلیبر", "جلفا"],
125
+ "آذربایجان غربی": ["ارومیه", "خوی", "بوکان", "مهاباد", "سلماس", "میاندوآب", "نقده", "پیرانشهر", "تکاب", "اشنویه"],
126
+ "خوزستان": ["اهواز", "آبادان", "دزفول", "اندیمشک", "خرمشهر", "بندر ماهشهر", "بهبهان", "ایذه", "شوشتر", "شوش", "مسجدسلیمان", "رامهرمز", "باغملک"],
127
+ "کرمانشاه": ["کرمانشاه", "اسلام‌آباد غرب", "سنقر", "صحنه", "هرسین", "کنگاور", "پاوه", "سرپل ذهاب", "قصر شیرین"],
128
+ "مازندران": ["ساری", "بابل", "آمل", "قائم‌شهر", "بهشهر", "نوشهر", "چالوس", "تنکابن", "نور", "محمودآباد", "فریدونکنار", "رامسر", "جویبار"],
129
+ "گیلان": ["رشت", "لاهیجان", "انزلی", "رودسر", "آستارا", "تالش", "فومن", "صومعه‌سرا", "رضوانشهر", "ماسال", "آستانه اشرفیه"],
130
+ "گلستان": ["گرگان", "گنبد کاووس", "علی‌آباد کتول", "آق‌قلا", "بندر ترکمن", "کردکوی", "کلاله", "مینودشت", "آزادشهر"],
131
+ "کرمان": ["کرمان", "سیرجان", "رفسنجان", "جیرفت", "بم", "زرند", "بافت", "شهربابک", "کهنوج"],
132
+ "همدان": ["همدان", "ملایر", "نهاوند", "تويسركان", "اسدآباد", "رزن", "کبودرآهنگ"],
133
+ "یزد": ["یزد", "میبد", "اردکان", "بافق", "ابرکوه", "تفت", "مهریز", "اشکذر"],
134
+ "زنجان": ["زنجان", "ابهر", "خرمدره", "ماهنشان", "طارم", "ایجرود"],
135
+ "سمنان": ["سمنان", "شاهرود", "دامغان", "گرمسار", "مهدی‌شهر", "میامی"],
136
+ "لرستان": ["خرم‌آباد", "بروجرد", "دورود", "الیگودرز", "کوهدشت", "ازنا", "الشتر"],
137
+ "اردبیل": ["اردبیل", "مشگین‌شهر", "پارس‌آباد", "خلخال", "گرمی", "نمین", "بیله‌سوار"],
138
+ "هرمزگان": ["بندرعباس", "میناب", "قشم", "کیش", "بندر لنگه", "جاسک", "حاجی‌آباد", "دهبارز"],
139
+ "بوشهر": ["بوشهر", "برازجان", "گناوه", "خارک", "دیر", "کنگان", "دشتستان", "جم"],
140
+ "سیستان و بلوچستان": ["زاهدان", "زابل", "چابهار", "ایرانشهر", "سراوان", "خاش", "نیکشهر"],
141
+ "چهارمحال و بختیاری": ["شهرکرد", "بروجن", "اردل", "فارسان", "لردگان", "کوهرنگ"],
142
+ "ایلام": ["ایلام", "دهلران", "مهران", "ایوان", "آبدانان", "دره‌شهر"],
143
+ "کهگیلویه و بویراحمد": ["یاسوج", "گچساران", "دهدشت", "لیکک", "باشت"],
144
+ "قزوین": ["قزوین", "الوند", "آبیک", "بوئین‌زهرا", "تاکستان"],
145
+ "قم": ["قم", "جعفریه", "دستجرد"],
146
+ "مرکزی": ["اراک", "ساوه", "خمین", "محلات", "دلیجان", "تفرش", "شازند", "آشتیان"],
147
+ }
148
+
149
+ # ==================== لیست کامل استان‌ها ====================
150
+ iran_provinces = [
151
+ "تهران", "البرز", "اصفهان", "فارس", "خراسان رضوی", "خراسان شمالی", "خراسان جنوبی",
152
+ "آذربایجان شرقی", "آذربایجان غربی", "خوزستان", "کرمانشاه", "مازندران", "گیلان",
153
+ "گلستان", "کرمان", "همدان", "یزد", "زنجان", "سمنان", "لرستان", "اردبیل", "هرمزگان",
154
+ "بوشهر", "سیستان و بلوچستان", "چهارمحال و بختیاری", "ایلام", "کهگیلویه و بویراحمد",
155
+ "قزوین", "قم", "مرکزی"
156
+ ]
157
+
158
+ # ==================== تقسیمات منطقه‌ای ====================
159
+ regions = {
160
+ "شمال": ["گیلان", "مازندران", "گلستان"],
161
+ "جنوب": ["هرمزگان", "سیستان و بلوچستان", "بوشهر", "کهگیلویه و بویراحمد"],
162
+ "غرب": ["کردستان", "کرمانشاه", "ایلام", "آذربایجان غربی", "لرستان", "همدان"],
163
+ "شرق": ["خراسان رضوی", "خراسان شمالی", "خراسان جنوبی", "سیستان و بلوچستان", "کرمان"],
164
+ "مرکز": ["تهران", "اصفهان", "البرز", "سمنان", "یزد", "زنجان", "قم", "مرکزی", "قزوین"],
165
+ "جنوب‌غرب": ["خوزستان", "چهارمحال و بختیاری", "کهگیلویه و بویراحمد", "بوشهر"],
166
+ "شمال‌غرب": ["آذربایجان شرقی", "آذربایجان غربی", "اردبیل", "زنجان"],
167
+ }
168
+
169
+ # ==================== متادیتای استان‌ها ====================
170
+ province_metadata = {
171
+ "تهران": {"code": "01", "region": "مرکز", "area_km2": 18814, "population": 13900000},
172
+ "البرز": {"code": "30", "region": "مرکز", "area_km2": 5833, "population": 2712000},
173
+ "اصفهان": {"code": "04", "region": "مرکز", "area_km2": 107029, "population": 5120000},
174
+ "فارس": {"code": "07", "region": "جنوب", "area_km2": 122608, "population": 4851000},
175
+ "خراسان رضوی": {"code": "09", "region": "شرق", "area_km2": 118884, "population": 6434000},
176
+ "خراسان شمالی": {"code": "28", "region": "شرق", "area_km2": 28434, "population": 863000},
177
+ "خراسان جنوبی": {"code": "29", "region": "شرق", "area_km2": 151193, "population": 768000},
178
+ "آذربایجان شرقی": {"code": "03", "region": "شمال‌غرب", "area_km2": 45650, "population": 3909000},
179
+ "آذربایجان غربی": {"code": "02", "region": "شمال‌غرب", "area_km2": 37437, "population": 3265000},
180
+ "خوزستان": {"code": "06", "region": "جنوب‌غرب", "area_km2": 64055, "population": 4710000},
181
+ "مازندران": {"code": "12", "region": "شمال", "area_km2": 23842, "population": 3283000},
182
+ "گیلان": {"code": "11", "region": "شمال", "area_km2": 14042, "population": 2530000},
183
+ "گلستان": {"code": "27", "region": "شمال", "area_km2": 20367, "population": 1868000},
184
+ "کرمان": {"code": "08", "region": "شرق", "area_km2": 180726, "population": 3164000},
185
+ "همدان": {"code": "13", "region": "غرب", "area_km2": 19368, "population": 1738000},
186
+ "یزد": {"code": "21", "region": "مرکز", "area_km2": 129285, "population": 1138000},
187
+ "زنجان": {"code": "19", "region": "مرکز", "area_km2": 21773, "population": 1057000},
188
+ "سمنان": {"code": "20", "region": "مرکز", "area_km2": 97491, "population": 702000},
189
+ "لرستان": {"code": "15", "region": "غرب", "area_km2": 28294, "population": 1760000},
190
+ "اردبیل": {"code": "24", "region": "شمال‌غرب", "area_km2": 17953, "population": 1270000},
191
+ "هرمزگان": {"code": "22", "region": "جنوب", "area_km2": 70697, "population": 1776000},
192
+ "بوشهر": {"code": "18", "region": "جنوب", "area_km2": 23295, "population": 1163000},
193
+ "سیستان و بلوچستان": {"code": "11", "region": "جنوب", "area_km2": 180726, "population": 2775000},
194
+ "چهارمحال و بختیاری": {"code": "14", "region": "جنوب‌غرب", "area_km2": 16332, "population": 947000},
195
+ "ایلام": {"code": "16", "region": "غرب", "area_km2": 20133, "population": 580000},
196
+ "کهگیلویه و بویراحمد": {"code": "17", "region": "جنوب‌غرب", "area_km2": 15504, "population": 713000},
197
+ "قزوین": {"code": "26", "region": "مرکز", "area_km2": 15567, "population": 1273000},
198
+ "قم": {"code": "25", "region": "مرکز", "area_km2": 11240, "population": 1292000},
199
+ "مرکزی": {"code": "00", "region": "مرکز", "area_km2": 29127, "population": 1429000},
200
+ }
201
+
202
+ # ==================== مختصات شهرهای مهم ====================
203
+ city_coordinates = {
204
+ # استان تهران
205
+ "تهران": (35.6892, 51.3890), "ری": (35.5966, 51.4400), "اسلامشهر": (35.5525, 51.2350),
206
+ "کرج": (35.8355, 50.9391), "ورامین": (35.3242, 51.6453),
207
+
208
+ # استان اصفهان
209
+ "اصفهان": (32.6546, 51.6680), "کاشان": (33.9850, 51.4096), "نجف‌آباد": (32.6344, 51.3669),
210
+
211
+ # استان خراسان
212
+ "مشهد": (36.2972, 59.6067), "نیشابور": (36.2146, 58.7958), "سبزوار": (36.2147, 57.6777),
213
+ "بجنورد": (37.4748, 57.3292), "بیرجند": (32.8660, 59.2211),
214
+
215
+ # استان فارس
216
+ "شیراز": (29.5918, 52.5837), "مرودشت": (29.8747, 52.8042), "جهرم": (28.5034, 53.5605),
217
+
218
+ # استان آذربایجان
219
+ "تبریز": (38.0800, 46.2937), "مراغه": (37.3891, 46.2398), "ارومیه": (37.6648, 45.3750),
220
+ "اردبیل": (38.2498, 48.2933),
221
+
222
+ # استان خوزستان
223
+ "اهواز": (31.3640, 48.6733), "آبادان": (30.3399, 48.2969), "دزفول": (32.3811, 48.4050),
224
+
225
+ # استان‌های شمالی
226
+ "رشت": (37.2760, 49.5886), "ساری": (36.5633, 53.0601), "بابل": (36.5496, 52.6780),
227
+ "آمل": (36.4725, 52.3506), "گرگان": (36.8451, 54.4399),
228
+
229
+ # سایر مراکز استان
230
+ "کرمان": (30.2839, 57.0838), "همدان": (34.8100, 48.5150), "یزد": (31.8974, 54.3569),
231
+ "زنجان": (36.6736, 48.4787), "بندرعباس": (27.1832, 56.2665), "بوشهر": (28.9238, 50.8201),
232
+ "اراک": (34.0918, 49.6894), "قم": (34.6399, 50.8758), "سمنان": (35.5800, 53.3933),
233
+ "شهرکرد": (32.3256, 50.8630), "یاسوج": (30.6676, 51.6052), "ایلام": (33.6374, 46.4227),
234
+ "سنندج": (35.3095, 46.9992), "خرم‌آباد": (33.4878, 48.3558), "قزوین": (36.2688, 50.0040),
235
+ "زاهدان": (29.4963, 60.8629),
236
+ }
237
+
238
+ # ==================== داده کامل شهرها ====================
239
+ city_full_data = {
240
+ "تهران": {"en_name": "tehran", "coords": (35.6892, 51.3890), "province": "تهران"},
241
+ "اصفهان": {"en_name": "isfahan", "coords": (32.6546, 51.6680), "province": "اصفهان"},
242
+ "مشهد": {"en_name": "mashhad", "coords": (36.2972, 59.6067), "province": "خراسان رضوی"},
243
+ "شیراز": {"en_name": "shiraz", "coords": (29.5918, 52.5837), "province": "فارس"},
244
+ "تبریز": {"en_name": "tabriz", "coords": (38.0800, 46.2937), "province": "آذربایجان شرقی"},
245
+ "اهواز": {"en_name": "ahvaz", "coords": (31.3640, 48.6733), "province": "خوزستان"},
246
+ "کرج": {"en_name": "karaj", "coords": (35.8355, 50.9391), "province": "البرز"},
247
+ "کرمانشاه": {"en_name": "kermanshah", "coords": (34.6731, 46.5588), "province": "کرمانشاه"},
248
+ "قم": {"en_name": "qom", "coords": (34.6399, 50.8758), "province": "قم"},
249
+ "ارومیه": {"en_name": "urmia", "coords": (37.6648, 45.3750), "province": "آذربایجان غربی"},
250
+ "رشت": {"en_name": "rasht", "coords": (37.2760, 49.5886), "province": "گیلان"},
251
+ "زاهدان": {"en_name": "zahedan", "coords": (29.4963, 60.8629), "province": "سیستان و بلوچستان"},
252
+ "کرمان": {"en_name": "kerman", "coords": (30.2839, 57.0838), "province": "کرمان"},
253
+ "اراک": {"en_name": "arak", "coords": (34.0918, 49.6894), "province": "مرکزی"},
254
+ "همدان": {"en_name": "hamedan", "coords": (34.8100, 48.5150), "province": "همدان"},
255
+ "یزد": {"en_name": "yazd", "coords": (31.8974, 54.3569), "province": "یزد"},
256
+ "اردبیل": {"en_name": "ardabil", "coords": (38.2498, 48.2933), "province": "اردبیل"},
257
+ "بندرعباس": {"en_name": "bandar abbas", "coords": (27.1832, 56.2665), "province": "هرمزگان"},
258
+ "بوشهر": {"en_name": "bushehr", "coords": (28.9238, 50.8201), "province": "بوشهر"},
259
+ "ساری": {"en_name": "sari", "coords": (36.5633, 53.0601), "province": "مازندران"},
260
+ "سمنان": {"en_name": "semnan", "coords": (35.5800, 53.3933), "province": "سمنان"},
261
+ "سنندج": {"en_name": "sanandaj", "coords": (35.3095, 46.9992), "province": "کردستان"},
262
+ "شهرکرد": {"en_name": "shahrekord", "coords": (32.3256, 50.8630), "province": "چهارمحال و بختیاری"},
263
+ "قزوین": {"en_name": "qazvin", "coords": (36.2688, 50.0040), "province": "قزوین"},
264
+ "گرگان": {"en_name": "gorgan", "coords": (36.8451, 54.4399), "province": "گلستان"},
265
+ "خرم‌آباد": {"en_name": "khorramabad", "coords": (33.4878, 48.3558), "province": "لرستان"},
266
+ "یاسوج": {"en_name": "yasuj", "coords": (30.6676, 51.6052), "province": "کهگیلویه و بویراحمد"},
267
+ "بجنورد": {"en_name": "bojnord", "coords": (37.4748, 57.3292), "province": "خراسان شمالی"},
268
+ "بیرجند": {"en_name": "birjand", "coords": (32.8660, 59.2211), "province": "خراسان جنوبی"},
269
+ "زنجان": {"en_name": "zanjan", "coords": (36.6736, 48.4787), "province": "زنجان"},
270
+ "ایلام": {"en_name": "ilam", "coords": (33.6374, 46.4227), "province": "ایلام"},
271
+ }
272
+
273
+ # ==================== لیست کامل شهرها (فارسی) ====================
274
+ iran_cities_fa = sorted(list(set(iran_cities.keys()) | set(
275
+ [city for cities in provinces_and_cities.values() for city in cities]
276
+ )))
277
+
278
+ # ==================== لیست کامل شهرها (انگلیسی) ====================
279
+ iran_cities_en = sorted([iran_cities.get(city, city).title() for city in iran_cities_fa if city in iran_cities] + [
280
+ "Arak", "Qom", "Gorgan", "Sanandaj", "Ilam", "Yasuj", "Shahrekord", "Birjand", "Bojnord"
281
+ ])
282
+ iran_cities_en = list(set(iran_cities_en))
283
+
284
+ # ==================== جمعیت شهرها ====================
285
+ city_population = {
286
+ "تهران": 8846782, "مشهد": 3001184, "اصفهان": 1961260, "کرج": 1592492,
287
+ "شیراز": 1565572, "تبریز": 1558693, "قم": 1201158, "اهواز": 1184788,
288
+ "کرمانشاه": 946651, "ارومیه": 736224, "رشت": 679995, "زاهدان": 587730,
289
+ "همدان": 554406, "کرمان": 537718, "یزد": 529673, "اردبیل": 529374,
290
+ "بندرعباس": 526648, "اراک": 520944, "اسلامشهر": 448129, "زنجان": 430871,
291
+ "سنندج": 412767, "قزوین": 402748, "خرم‌آباد": 373416, "گرگان": 350676,
292
+ "ساری": 309820, "کاشان": 304487, "نجف‌آباد": 235281, "خمینی‌شهر": 247128,
293
+ "شاهین‌شهر": 173329, "مرودشت": 138649, "جهرم": 141634, "فسا": 110825,
294
+ "آبادان": 231476, "دزفول": 264709, "بهبهان": 122604, "بابل": 250217,
295
+ "آمل": 237528, "قائم‌شهر": 204953, "چالوس": 65354, "لاهیجان": 103687,
296
+ "گنبد کاووس": 151910, "مراغه": 175255, "میاندوآب": 134425, "بوکان": 193501,
297
+ "سقز": 165258, "رفسنجان": 161909, "سیرجان": 199704, "جیرفت": 130851,
298
+ "بم": 127396, "ملایر": 170237, "نهاوند": 76162, "بروجرد": 234997,
299
+ "الیگودرز": 89807, "شاهرود": 150129, "دامغان": 59930, "میبد": 80712,
300
+ "اردکان": 77946, "ابهر": 99450, "خوی": 200958, "مهاباد": 168393,
301
+ "سلماس": 92811, "نیشابور": 264375, "سبزوار": 243700, "تربت حیدریه": 140019,
302
+ "قوچان": 101604, "کازرون": 96683, "لارستان": 79742, "نورآباد": 65000,
303
+ "اقلید": 55372, "پارس‌آباد": 93957, "مشگین‌شهر": 74109, "خلخال": 41657,
304
+ "میناب": 80000, "قشم": 47120, "کیش": 39853, "گناوه": 64793, "برازجان": 95392,
305
+ "دهلران": 32418, "مهران": 12540, "تاکستان": 77907, "آبیک": 60927,
306
+ "ساوه": 220762, "خمین": 72882, "محلات": 43113, "فردیس": 181174,
307
+ "گلستان": 27000, "بهارستان": 88000, "قدس": 311117, "قرچک": 231075,
308
+ "ورامین": 225628, "ملارد": 333500, "پردیس": 100000, "بومهن": 79034,
309
+ }
310
+
311
+ # ==================== پیش‌شماره اپراتورهای سیم‌کارت ====================
312
+ sim_card_prefixes = {
313
+ "همراه اول": ["0910", "0911", "0912", "0913", "0914", "0915", "0916", "0917", "0918", "0919",
314
+ "0901", "0902", "0903", "0904", "0905", "0906", "0930", "0933", "0936", "0939"],
315
+ "ایرانسل": ["0921", "0922", "0923", "0935", "0937", "0938", "0941", "0900"],
316
+ "رایتل": ["0920", "0924", "0925", "0926", "0927", "0928", "0929"],
317
+ "آپتل": ["0990", "0991", "0992", "0993", "0994"],
318
+ "شاتل موبایل": ["0995", "0996"],
319
+ "اسپادان": ["0998"],
320
+ "تله‌کیش": ["0934"],
321
+ "سامانتل": ["0999"],
322
+ "لوتوس تل": ["0931"],
323
+ "واعظ": ["0922"],
324
+ "آذرتل": ["0923"],
325
+ "صبا ایده": ["0997"],
326
+ }
327
+
328
+ sim_card_prefixes_list = sorted(set([p for prefixes in sim_card_prefixes.values() for p in prefixes]))
329
+
330
+ # ==================== پیش‌شماره تلفن ثابت (کد شهرها) ====================
331
+ city_phone_codes = {
332
+ "تهران": "021", "ری": "021", "اسلامشهر": "021", "ورامین": "021", "شهریار": "021",
333
+ "کرج": "026", "فردیس": "026", "اشتهارد": "026", "طالقان": "026",
334
+ "اصفهان": "031", "کاشان": "031", "نجف‌آباد": "031", "خمینی‌شهر": "031",
335
+ "مشهد": "051", "نیشابور": "051", "سبزوار": "051", "تربت حیدریه": "051",
336
+ "شیراز": "071", "مرودشت": "071", "جهرم": "071", "فسا": "071",
337
+ "تبریز": "041", "مراغه": "041", "مرند": "041", "میانه": "041",
338
+ "اهواز": "061", "آبادان": "061", "دزفول": "061", "اندیمشک": "061",
339
+ "کرمانشاه": "083", "اسلام‌آباد غرب": "083", "سنقر": "083",
340
+ "ساری": "011", "بابل": "011", "آمل": "011", "قائم‌شهر": "011",
341
+ "رشت": "013", "لاهیجان": "013", "انزلی": "013", "رودسر": "013",
342
+ "ارومیه": "044", "خوی": "044", "بوکان": "044", "مهاباد": "044",
343
+ "کرمان": "034", "سیرجان": "034", "رفسنجان": "034", "جیرفت": "034",
344
+ "همدان": "081", "ملایر": "081", "نهاوند": "081", "تويسركان": "081",
345
+ "یزد": "035", "میبد": "035", "اردکان": "035", "بافق": "035",
346
+ "زنجان": "024", "ابهر": "024", "خرمدره": "024",
347
+ "سمنان": "023", "شاهرود": "023", "دامغان": "023",
348
+ "لرستان": "066", "بروجرد": "066", "دورود": "066", "الیگودرز": "066",
349
+ "اردبیل": "045", "مشگین‌شهر": "045", "پارس‌آباد": "045",
350
+ "بندرعباس": "076", "میناب": "076", "قشم": "076", "کیش": "076",
351
+ "بوشهر": "077", "برازجان": "077", "گناوه": "077",
352
+ "زاهدان": "054", "زابل": "054", "چابهار": "054", "ایرانشهر": "054",
353
+ "شهرکرد": "038", "بروجن": "038", "اردل": "038",
354
+ "ایلام": "084", "دهلران": "084", "مهران": "084",
355
+ "یاسوج": "074", "گچساران": "074", "دهدشت": "074",
356
+ "قزوین": "028", "الوند": "028", "آبیک": "028", "تاکستان": "028",
357
+ "قم": "025", "جعفریه": "025",
358
+ "اراک": "086", "ساوه": "086", "خمین": "086", "محلات": "086",
359
+ "گرگان": "017", "گنبد کاووس": "017", "علی‌آباد کتول": "017",
360
+ "سنندج": "087", "مریوان": "087", "سقز": "087", "بانه": "087",
361
+ "بجنورد": "058", "شیروان": "058", "اسفراین": "058",
362
+ "بیرجند": "056", "قائن": "056", "فردوس": "056", "طبس": "056",
363
+ }
364
+
365
+ # ==================== کد پلاک خودرو ====================
366
+ car_plate_codes = {
367
+ "تهران": ["11", "12", "22", "33", "44", "55", "66", "77", "88", "99", "10", "20", "30", "40", "50"],
368
+ "البرز": ["21", "81", "91"],
369
+ "اصفهان": ["43", "53", "63", "73", "83", "93"],
370
+ "فارس": ["63", "73", "83", "93"],
371
+ "خراسان رضوی": ["12", "32", "42", "52", "73", "82"],
372
+ "خراسان شمالی": ["26", "36"],
373
+ "خراسان جنوبی": ["26", "36"],
374
+ "آذربایجان شرقی": ["15", "25", "35", "45", "55", "65", "75", "85", "95"],
375
+ "آذربایجان غربی": ["17", "27", "37", "47", "57", "67", "77", "87"],
376
+ "خوزستان": ["14", "24", "34", "44", "54", "64", "74", "84", "94"],
377
+ "مازندران": ["15", "25", "35", "45", "55", "62", "72"],
378
+ "گیلان": ["16", "26", "36", "46", "56", "66", "76", "86", "96"],
379
+ "گلستان": ["26", "36", "46"],
380
+ "کرمان": ["15", "25", "35", "45", "55", "65", "75"],
381
+ "همدان": ["18", "28", "38", "48"],
382
+ "یزد": ["14", "24", "34", "44", "54"],
383
+ "زنجان": ["27", "37", "47"],
384
+ "سمنان": ["26", "36", "46", "56"],
385
+ "لرستان": ["13", "23", "33", "43"],
386
+ "اردبیل": ["13", "23", "33", "43"],
387
+ "هرمزگان": ["18", "28", "38", "48", "58"],
388
+ "بوشهر": ["18", "28", "38", "48"],
389
+ "سیستان و بلوچستان": ["15", "25", "35", "45", "55"],
390
+ "چهارمحال و بختیاری": ["31", "41", "51"],
391
+ "ایلام": ["18", "28", "38"],
392
+ "کهگیلویه و بویراحمد": ["23", "33", "43"],
393
+ "قزوین": ["18", "28", "38", "48"],
394
+ "قم": ["15", "25", "35", "45"],
395
+ "مرکزی": ["17", "27", "37", "47"],
396
+ "کردستان": ["11", "21", "31", "41"],
397
+ }
398
+
399
+ # ==================== توابع کمکی ====================
400
+ def get_province_of_city(city_fa: str) -> str:
401
+ """دریافت نام استان بر اساس نام شهر فارسی"""
402
+ for province, cities in provinces_and_cities.items():
403
+ if city_fa in cities:
404
+ return province
405
+ return None
406
+
407
+ def get_city_coords(city_fa: str) -> tuple:
408
+ """دریافت مختصات جغرافیایی شهر"""
409
+ return city_coordinates.get(city_fa, (None, None))
410
+
411
+ def search_city(query: str) -> dict:
412
+ """جستجوی شهر (به فارسی یا انگلیسی)"""
413
+ query = query.lower().strip()
414
+ results = {}
415
+ for fa, en in iran_cities.items():
416
+ if query in fa.lower() or query in en.lower():
417
+ results[fa] = {
418
+ "en": en,
419
+ "province": get_province_of_city(fa),
420
+ "coords": get_city_coords(fa),
421
+ "population": get_city_population(fa)
422
+ }
423
+ return results
424
+
425
+ def get_provinces_by_region(region_fa: str) -> list:
426
+ """دریافت استان‌های یک منطقه"""
427
+ return regions.get(region_fa, [])
428
+
429
+ def get_city_population(city_fa: str) -> int:
430
+ """دریافت جمعیت شهر"""
431
+ return city_population.get(city_fa, 0)
432
+
433
+ def get_sim_operator(prefix: str) -> str:
434
+ """دریافت نام اپراتور بر اساس پیش‌شماره (مثال: 0912 -> همراه اول)"""
435
+ if not prefix.startswith("09"):
436
+ prefix = "09" + prefix if len(prefix) == 2 else prefix
437
+ for operator, prefixes in sim_card_prefixes.items():
438
+ if prefix in prefixes:
439
+ return operator
440
+ return "ناشناس"
441
+
442
+ def get_city_phone_code(city_fa: str) -> str:
443
+ """دریافت کد تلفن ثابت شهر (مثال: تهران -> 021)"""
444
+ return city_phone_codes.get(city_fa, "نامشخص")
445
+
446
+ def get_car_plate_codes(province_fa: str) -> list:
447
+ """دریافت کدهای پلاک خودروی استان (مثال: تهران -> ['11', '12', ...])"""
448
+ return car_plate_codes.get(province_fa, [])
449
+
450
+ def get_city_full_info(city_fa: str) -> dict:
451
+ """دریافت اطلاعات کامل یک شهر"""
452
+ return {
453
+ "name_fa": city_fa,
454
+ "name_en": iran_cities.get(city_fa, "unknown"),
455
+ "province": get_province_of_city(city_fa),
456
+ "population": get_city_population(city_fa),
457
+ "coords": get_city_coords(city_fa),
458
+ "phone_code": get_city_phone_code(city_fa)
459
+ }
460
+