pan>
+
11
+from utils.redis.connect import r
12
+from utils.user.userinfo_save import userinfo_save
13
+
14
+
15
+@transaction.atomic
16
+def oauth_redirect(request):
17
+    # Save profile or something else
18
+    user = userinfo_save(request.GET)
19
+
20
+    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
21
+
22
+    query_params = {
23
+        settings.TOKEN_CHECK_KEY: token_check_key,
24
+        'vtoken': r.token(token_check_key, ex=False, buf=False),
25
+    }
26
+
27
+    return redirect(furl(reverse('page:user_oauth')).add(request.GET).add(query_params).url)

+ 7 - 0
api/tests.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.test import TestCase
5
+
6
+
7
+# Create your tests here.

+ 14 - 0
api/urls.py

@@ -0,0 +1,14 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.urls import re_path
4
+
5
+from api import oauth_views
6
+
7
+
8
+urlpatterns = [
9
+]
10
+
11
+urlpatterns += [
12
+    re_path(r'^3rd/or$', oauth_views.oauth_redirect, name='3rd_or'),
13
+    re_path(r'^3rd/oauth_redirect$', oauth_views.oauth_redirect, name='3rd_oauth_redirect'),
14
+]

+ 4 - 0
api/views.py

@@ -0,0 +1,4 @@
1
+from django.shortcuts import render
2
+
3
+
4
+# Create your views here.

+ 9 - 0
check.sh

@@ -0,0 +1,9 @@
1
+#!/bin/bash
2
+
3
+echo '>> iSort'
4
+./isort.sh
5
+echo
6
+
7
+echo '>> PEP8'
8
+./pep8.sh
9
+echo

+ 0 - 0
commands/__init__.py


+ 4 - 0
commands/admin.py

@@ -0,0 +1,4 @@
1
+from django.contrib import admin
2
+
3
+
4
+# Register your models here.

+ 7 - 0
commands/apps.py

@@ -0,0 +1,7 @@
1
+from __future__ import unicode_literals
2
+
3
+from django.apps import AppConfig
4
+
5
+
6
+class CommandConfig(AppConfig):
7
+    name = 'commands'

+ 0 - 0
commands/management/__init__.py


+ 0 - 0
commands/management/commands/__init__.py


+ 37 - 0
commands/management/commands/cmd_bak.py

@@ -0,0 +1,37 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+
5
+from django.db import transaction
6
+from django_six import CompatibilityBaseCommand, close_old_connections
7
+
8
+from utils.redis.connect import r
9
+
10
+
11
+logger = logging.getLogger('console')
12
+
13
+
14
+class Command(CompatibilityBaseCommand):
15
+    def handle(self, *args, **options):
16
+
17
+        logger.info('Templet bak cmd is dealing')
18
+
19
+        while True:
20
+            # r.rpush('TEMPLET_CMD_KEY', '')
21
+            # kv = r.blpop('TEMPLET_CMD_KEY', 60)
22
+            # k, v = (kv[0], kv[1]) if kv else (None, None)
23
+            #
24
+            # r.rpushjson('TEMPLET_CMD_KEY', {})
25
+            k, v = r.blpopjson('TEMPLET_CMD_KEY', 60)
26
+
27
+            if not v:
28
+                continue
29
+
30
+            logger.info(v)
31
+
32
+            close_old_connections()
33
+
34
+            with transaction.atomic():
35
+                pass
36
+
37
+            close_old_connections()

+ 55 - 0
commands/management/commands/cmd_bak2.py

@@ -0,0 +1,55 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+from collections import deque
5
+
6
+from django.db import transaction
7
+from django_six import CompatibilityBaseCommand, close_old_connections
8
+
9
+from utils.redis.connect import r
10
+
11
+
12
+logger = logging.getLogger('console')
13
+
14
+
15
+class Command(CompatibilityBaseCommand):
16
+    def handle(self, *args, **options):
17
+
18
+        logger.info('Templet bak cmd is dealing')
19
+
20
+        keys = deque(['TEMPLET_CMD_KEY1', 'TEMPLET_CMD_KEY2'])
21
+
22
+        while True:
23
+            # r.rpush('TEMPLET_CMD_KEY', '')
24
+            # kv = r.blpop('TEMPLET_CMD_KEY', 60)
25
+            # k, v = (kv[0], kv[1]) if kv else (None, None)
26
+            #
27
+            # r.rpushjson('TEMPLET_CMD_KEY', {})
28
+            #
29
+            # Refer: https://redis.io/commands/blpop
30
+            # Keys are checked in the order that they are given.
31
+            # If not rotate keys.
32
+            # Some keys may not be checked at all times.
33
+            k, v = r.blpopjson(keys, 60)
34
+
35
+            keys.rotate(1)
36
+
37
+            if not v:
38
+                continue
39
+
40
+            logger.info(v)
41
+
42
+            close_old_connections()
43
+
44
+            if k == 'TEMPLET_CMD_KEY1':
45
+                with transaction.atomic():
46
+                    pass
47
+
48
+            elif k == 'TEMPLET_CMD_KEY2':
49
+                with transaction.atomic():
50
+                    pass
51
+
52
+            else:
53
+                continue
54
+
55
+            close_old_connections()

+ 24 - 0
commands/management/commands/cmd_bak3.py

@@ -0,0 +1,24 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+
5
+from django.db import transaction
6
+from django_six import CompatibilityBaseCommand, close_old_connections
7
+
8
+
9
+logger = logging.getLogger('console')
10
+
11
+
12
+class Command(CompatibilityBaseCommand):
13
+    def handle(self, *args, **options):
14
+        # Crontab
15
+        # 5 0 * * * /home/../python /home/../manage.py cmd_bak3
16
+
17
+        logger.info('Templet bak cmd is dealing')
18
+
19
+        close_old_connections()
20
+
21
+        with transaction.atomic():
22
+            pass
23
+
24
+        close_old_connections()

+ 0 - 0
commands/migrations/__init__.py


+ 6 - 0
commands/models.py

@@ -0,0 +1,6 @@
1
+from __future__ import unicode_literals
2
+
3
+from django.db import models
4
+
5
+
6
+# Create your models here.

+ 4 - 0
commands/tests.py

@@ -0,0 +1,4 @@
1
+from django.test import TestCase
2
+
3
+
4
+# Create your tests here.

+ 4 - 0
commands/views.py

@@ -0,0 +1,4 @@
1
+from django.shortcuts import render
2
+
3
+
4
+# Create your views here.

+ 0 - 0
data/__init__.py


+ 7 - 0
data/admin.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.contrib import admin
5
+
6
+
7
+# Register your models here.

+ 8 - 0
data/apps.py

@@ -0,0 +1,8 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.apps import AppConfig
5
+
6
+
7
+class DataConfig(AppConfig):
8
+    name = 'data'

+ 0 - 0
data/migrations/__init__.py


+ 7 - 0
data/models.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.db import models
5
+
6
+
7
+# Create your models here.

+ 3982 - 0
data/static/data/cn/area.json

@@ -0,0 +1,3982 @@
1
+{
2
+  "86": {
3
+    "110000": "北京市",
4
+    "120000": "天津市",
5
+    "130000": "河北省",
6
+    "140000": "山西省",
7
+    "150000": "内蒙古自治区",
8
+    "210000": "辽宁省",
9
+    "220000": "吉林省",
10
+    "230000": "黑龙江省",
11
+    "310000": "上海市",
12
+    "320000": "江苏省",
13
+    "330000": "浙江省",
14
+    "340000": "安徽省",
15
+    "350000": "福建省",
16
+    "360000": "江西省",
17
+    "370000": "山东省",
18
+    "410000": "河南省",
19
+    "420000": "湖北省",
20
+    "430000": "湖南省",
21
+    "440000": "广东省",
22
+    "450000": "广西壮族自治区",
23
+    "460000": "海南省",
24
+    "500000": "重庆市",
25
+    "510000": "四川省",
26
+    "520000": "贵州省",
27
+    "530000": "云南省",
28
+    "540000": "西藏自治区",
29
+    "610000": "陕西省",
30
+    "620000": "甘肃省",
31
+    "630000": "青海省",
32
+    "640000": "宁夏回族自治区",
33
+    "650000": "新疆维吾尔自治区",
34
+    "710000": "台湾省",
35
+    "810000": "香港特别行政区",
36
+    "820000": "澳门特别行政区"
37
+  },
38
+  "110000": {
39
+    "110100": "市辖区"
40
+  },
41
+  "110100": {
42
+    "110101": "东城区",
43
+    "110102": "西城区",
44
+    "110105": "朝阳区",
45
+    "110106": "丰台区",
46
+    "110107": "石景山区",
47
+    "110108": "海淀区",
48
+    "110109": "门头沟区",
49
+    "110111": "房山区",
50
+    "110112": "通州区",
51
+    "110113": "顺义区",
52
+    "110114": "昌平区",
53
+    "110115": "大兴区",
54
+    "110116": "怀柔区",
55
+    "110117": "平谷区",
56
+    "110118": "密云区",
57
+    "110119": "延庆区"
58
+  },
59
+  "120000": {
60
+    "120100": "市辖区"
61
+  },
62
+  "120100": {
63
+    "120101": "和平区",
64
+    "120102": "河东区",
65
+    "120103": "河西区",
66
+    "120104": "南开区",
67
+    "120105": "河北区",
68
+    "120106": "红桥区",
69
+    "120110": "东丽区",
70
+    "120111": "西青区",
71
+    "120112": "津南区",
72
+    "120113": "北辰区",
73
+    "120114": "武清区",
74
+    "120115": "宝坻区",
75
+    "120116": "滨海新区",
76
+    "120117": "宁河区",
77
+    "120118": "静海区",
78
+    "120119": "蓟州区"
79
+  },
80
+  "130000": {
81
+    "130100": "石家庄市",
82
+    "130200": "唐山市",
83
+    "130300": "秦皇岛市",
84
+    "130400": "邯郸市",
85
+    "130500": "邢台市",
86
+    "130600": "保定市",
87
+    "130700": "张家口市",
88
+    "130800": "承德市",
89
+    "130900": "沧州市",
90
+    "131000": "廊坊市",
91
+    "131100": "衡水市",
92
+    "139001": "定州市",
93
+    "139002": "辛集市"
94
+  },
95
+  "130100": {
96
+    "130102": "长安区",
97
+    "130104": "桥西区",
98
+    "130105": "新华区",
99
+    "130107": "井陉矿区",
100
+    "130108": "裕华区",
101
+    "130109": "藁城区",
102
+    "130110": "鹿泉区",
103
+    "130111": "栾城区",
104
+    "130121": "井陉县",
105
+    "130123": "正定县",
106
+    "130125": "行唐县",
107
+    "130126": "灵寿县",
108
+    "130127": "高邑县",
109
+    "130128": "深泽县",
110
+    "130129": "赞皇县",
111
+    "130130": "无极县",
112
+    "130131": "平山县",
113
+    "130132": "元氏县",
114
+    "130133": "赵县",
115
+    "130183": "晋州市",
116
+    "130184": "新乐市"
117
+  },
118
+  "130200": {
119
+    "130202": "路南区",
120
+    "130203": "路北区",
121
+    "130204": "古冶区",
122
+    "130205": "开平区",
123
+    "130207": "丰南区",
124
+    "130208": "丰润区",
125
+    "130209": "曹妃甸区",
126
+    "130223": "滦县",
127
+    "130224": "滦南县",
128
+    "130225": "乐亭县",
129
+    "130227": "迁西县",
130
+    "130229": "玉田县",
131
+    "130281": "遵化市",
132
+    "130283": "迁安市"
133
+  },
134
+  "130300": {
135
+    "130302": "海港区",
136
+    "130303": "山海关区",
137
+    "130304": "北戴河区",
138
+    "130306": "抚宁区",
139
+    "130321": "青龙满族自治县",
140
+    "130322": "昌黎县",
141
+    "130324": "卢龙县"
142
+  },
143
+  "130400": {
144
+    "130402": "邯山区",
145
+    "130403": "丛台区",
146
+    "130404": "复兴区",
147
+    "130406": "峰峰矿区",
148
+    "130421": "邯郸县",
149
+    "130423": "临漳县",
150
+    "130424": "成安县",
151
+    "130425": "大名县",
152
+    "130426": "涉县",
153
+    "130427": "磁县",
154
+    "130428": "肥乡县",
155
+    "130429": "永年县",
156
+    "130430": "邱县",
157
+    "130431": "鸡泽县",
158
+    "130432": "广平县",
159
+    "130433": "馆陶县",
160
+    "130434": "魏县",
161
+    "130435": "曲周县",
162
+    "130481": "武安市"
163
+  },
164
+  "130500": {
165
+    "130502": "桥东区",
166
+    "130503": "桥西区",
167
+    "130521": "邢台县",
168
+    "130522": "临城县",
169
+    "130523": "内丘县",
170
+    "130524": "柏乡县",
171
+    "130525": "隆尧县",
172
+    "130526": "任县",
173
+    "130527": "南和县",
174
+    "130528": "宁晋县",
175
+    "130529": "巨鹿县",
176
+    "130530": "新河县",
177
+    "130531": "广宗县",
178
+    "130532": "平乡县",
179
+    "130533": "威县",
180
+    "130534": "清河县",
181
+    "130535": "临西县",
182
+    "130581": "南宫市",
183
+    "130582": "沙河市"
184
+  },
185
+  "130600": {
186
+    "130602": "竞秀区",
187
+    "130606": "莲池区",
188
+    "130607": "满城区",
189
+    "130608": "清苑区",
190
+    "130609": "徐水区",
191
+    "130623": "涞水县",
192
+    "130624": "阜平县",
193
+    "130626": "定兴县",
194
+    "130627": "唐县",
195
+    "130628": "高阳县",
196
+    "130629": "容城县",
197
+    "130630": "涞源县",
198
+    "130631": "望都县",
199
+    "130632": "安新县",
200
+    "130633": "易县",
201
+    "130634": "曲阳县",
202
+    "130635": "蠡县",
203
+    "130636": "顺平县",
204
+    "130637": "博野县",
205
+    "130638": "雄县",
206
+    "130681": "涿州市",
207
+    "130683": "安国市",
208
+    "130684": "高碑店市"
209
+  },
210
+  "130700": {
211
+    "130702": "桥东区",
212
+    "130703": "桥西区",
213
+    "130705": "宣化区",
214
+    "130706": "下花园区",
215
+    "130708": "万全区",
216
+    "130709": "崇礼区",
217
+    "130722": "张北县",
218
+    "130723": "康保县",
219
+    "130724": "沽源县",
220
+    "130725": "尚义县",
221
+    "130726": "蔚县",
222
+    "130727": "阳原县",
223
+    "130728": "怀安县",
224
+    "130730": "怀来县",
225
+    "130731": "涿鹿县",
226
+    "130732": "赤城县"
227
+  },
228
+  "130800": {
229
+    "130802": "双桥区",
230
+    "130803": "双滦区",
231
+    "130804": "鹰手营子矿区",
232
+    "130821": "承德县",
233
+    "130822": "兴隆县",
234
+    "130823": "平泉县",
235
+    "130824": "滦平县",
236
+    "130825": "隆化县",
237
+    "130826": "丰宁满族自治县",
238
+    "130827": "宽城满族自治县",
239
+    "130828": "围场满族蒙古族自治县"
240
+  },
241
+  "130900": {
242
+    "130902": "新华区",
243
+    "130903": "运河区",
244
+    "130921": "沧县",
245
+    "130922": "青县",
246
+    "130923": "东光县",
247
+    "130924": "海兴县",
248
+    "130925": "盐山县",
249
+    "130926": "肃宁县",
250
+    "130927": "南皮县",
251
+    "130928": "吴桥县",
252
+    "130929": "献县",
253
+    "130930": "孟村回族自治县",
254
+    "130981": "泊头市",
255
+    "130982": "任丘市",
256
+    "130983": "黄骅市",
257
+    "130984": "河间市"
258
+  },
259
+  "131000": {
260
+    "131002": "安次区",
261
+    "131003": "广阳区",
262
+    "131022": "固安县",
263
+    "131023": "永清县",
264
+    "131024": "香河县",
265
+    "131025": "大城县",
266
+    "131026": "文安县",
267
+    "131028": "大厂回族自治县",
268
+    "131081": "霸州市",
269
+    "131082": "三河市"
270
+  },
271
+  "131100": {
272
+    "131102": "桃城区",
273
+    "131103": "冀州区",
274
+    "131121": "枣强县",
275
+    "131122": "武邑县",
276
+    "131123": "武强县",
277
+    "131124": "饶阳县",
278
+    "131125": "安平县",
279
+    "131126": "故城县",
280
+    "131127": "景县",
281
+    "131128": "阜城县",
282
+    "131182": "深州市"
283
+  },
284
+  "140000": {
285
+    "140100": "太原市",
286
+    "140200": "大同市",
287
+    "140300": "阳泉市",
288
+    "140400": "长治市",
289
+    "140500": "晋城市",
290
+    "140600": "朔州市",
291
+    "140700": "晋中市",
292
+    "140800": "运城市",
293
+    "140900": "忻州市",
294
+    "141000": "临汾市",
295
+    "141100": "吕梁市"
296
+  },
297
+  "140100": {
298
+    "140105": "小店区",
299
+    "140106": "迎泽区",
300
+    "140107": "杏花岭区",
301
+    "140108": "尖草坪区",
302
+    "140109": "万柏林区",
303
+    "140110": "晋源区",
304
+    "140121": "清徐县",
305
+    "140122": "阳曲县",
306
+    "140123": "娄烦县",
307
+    "140181": "古交市"
308
+  },
309
+  "140200": {
310
+    "140202": "城区",
311
+    "140203": "矿区",
312
+    "140211": "南郊区",
313
+    "140212": "新荣区",
314
+    "140221": "阳高县",
315
+    "140222": "天镇县",
316
+    "140223": "广灵县",
317
+    "140224": "灵丘县",
318
+    "140225": "浑源县",
319
+    "140226": "左云县",
320
+    "140227": "大同县"
321
+  },
322
+  "140300": {
323
+    "140302": "城区",
324
+    "140303": "矿区",
325
+    "140311": "郊区",
326
+    "140321": "平定县",
327
+    "140322": "盂县"
328
+  },
329
+  "140400": {
330
+    "140402": "城区",
331
+    "140411": "郊区",
332
+    "140421": "长治县",
333
+    "140423": "襄垣县",
334
+    "140424": "屯留县",
335
+    "140425": "平顺县",
336
+    "140426": "黎城县",
337
+    "140427": "壶关县",
338
+    "140428": "长子县",
339
+    "140429": "武乡县",
340
+    "140430": "沁县",
341
+    "140431": "沁源县",
342
+    "140481": "潞城市"
343
+  },
344
+  "140500": {
345
+    "140502": "城区",
346
+    "140521": "沁水县",
347
+    "140522": "阳城县",
348
+    "140524": "陵川县",
349
+    "140525": "泽州县",
350
+    "140581": "高平市"
351
+  },
352
+  "140600": {
353
+    "140602": "朔城区",
354
+    "140603": "平鲁区",
355
+    "140621": "山阴县",
356
+    "140622": "应县",
357
+    "140623": "右玉县",
358
+    "140624": "怀仁县"
359
+  },
360
+  "140700": {
361
+    "140702": "榆次区",
362
+    "140721": "榆社县",
363
+    "140722": "左权县",
364
+    "140723": "和顺县",
365
+    "140724": "昔阳县",
366
+    "140725": "寿阳县",
367
+    "140726": "太谷县",
368
+    "140727": "祁县",
369
+    "140728": "平遥县",
370
+    "140729": "灵石县",
371
+    "140781": "介休市"
372
+  },
373
+  "140800": {
374
+    "140802": "盐湖区",
375
+    "140821": "临猗县",
376
+    "140822": "万荣县",
377
+    "140823": "闻喜县",
378
+    "140824": "稷山县",
379
+    "140825": "新绛县",
380
+    "140826": "绛县",
381
+    "140827": "垣曲县",
382
+    "140828": "夏县",
383
+    "140829": "平陆县",
384
+    "140830": "芮城县",
385
+    "140881": "永济市",
386
+    "140882": "河津市"
387
+  },
388
+  "140900": {
389
+    "140902": "忻府区",
390
+    "140921": "定襄县",
391
+    "140922": "五台县",
392
+    "140923": "代县",
393
+    "140924": "繁峙县",
394
+    "140925": "宁武县",
395
+    "140926": "静乐县",
396
+    "140927": "神池县",
397
+    "140928": "五寨县",
398
+    "140929": "岢岚县",
399
+    "140930": "河曲县",
400
+    "140931": "保德县",
401
+    "140932": "偏关县",
402
+    "140981": "原平市"
403
+  },
404
+  "141000": {
405
+    "141002": "尧都区",
406
+    "141021": "曲沃县",
407
+    "141022": "翼城县",
408
+    "141023": "襄汾县",
409
+    "141024": "洪洞县",
410
+    "141025": "古县",
411
+    "141026": "安泽县",
412
+    "141027": "浮山县",
413
+    "141028": "吉县",
414
+    "141029": "乡宁县",
415
+    "141030": "大宁县",
416
+    "141031": "隰县",
417
+    "141032": "永和县",
418
+    "141033": "蒲县",
419
+    "141034": "汾西县",
420
+    "141081": "侯马市",
421
+    "141082": "霍州市"
422
+  },
423
+  "141100": {
424
+    "141102": "离石区",
425
+    "141121": "文水县",
426
+    "141122": "交城县",
427
+    "141123": "兴县",
428
+    "141124": "临县",
429
+    "141125": "柳林县",
430
+    "141126": "石楼县",
431
+    "141127": "岚县",
432
+    "141128": "方山县",
433
+    "141129": "中阳县",
434
+    "141130": "交口县",
435
+    "141181": "孝义市",
436
+    "141182": "汾阳市"
437
+  },
438
+  "150000": {
439
+    "150100": "呼和浩特市",
440
+    "150200": "包头市",
441
+    "150300": "乌海市",
442
+    "150400": "赤峰市",
443
+    "150500": "通辽市",
444
+    "150600": "鄂尔多斯市",
445
+    "150700": "呼伦贝尔市",
446
+    "150800": "巴彦淖尔市",
447
+    "150900": "乌兰察布市",
448
+    "152200": "兴安盟",
449
+    "152500": "锡林郭勒盟",
450
+    "152900": "阿拉善盟"
451
+  },
452
+  "150100": {
453
+    "150102": "新城区",
454
+    "150103": "回民区",
455
+    "150104": "玉泉区",
456
+    "150105": "赛罕区",
457
+    "150121": "土默特左旗",
458
+    "150122": "托克托县",
459
+    "150123": "和林格尔县",
460
+    "150124": "清水河县",
461
+    "150125": "武川县"
462
+  },
463
+  "150200": {
464
+    "150202": "东河区",
465
+    "150203": "昆都仑区",
466
+    "150204": "青山区",
467
+    "150205": "石拐区",
468
+    "150206": "白云鄂博矿区",
469
+    "150207": "九原区",
470
+    "150221": "土默特右旗",
471
+    "150222": "固阳县",
472
+    "150223": "达尔罕茂明安联合旗"
473
+  },
474
+  "150300": {
475
+    "150302": "海勃湾区",
476
+    "150303": "海南区",
477
+    "150304": "乌达区"
478
+  },
479
+  "150400": {
480
+    "150402": "红山区",
481
+    "150403": "元宝山区",
482
+    "150404": "松山区",
483
+    "150421": "阿鲁科尔沁旗",
484
+    "150422": "巴林左旗",
485
+    "150423": "巴林右旗",
486
+    "150424": "林西县",
487
+    "150425": "克什克腾旗",
488
+    "150426": "翁牛特旗",
489
+    "150428": "喀喇沁旗",
490
+    "150429": "宁城县",
491
+    "150430": "敖汉旗"
492
+  },
493
+  "150500": {
494
+    "150502": "科尔沁区",
495
+    "150521": "科尔沁左翼中旗",
496
+    "150522": "科尔沁左翼后旗",
497
+    "150523": "开鲁县",
498
+    "150524": "库伦旗",
499
+    "150525": "奈曼旗",
500
+    "150526": "扎鲁特旗",
501
+    "150581": "霍林郭勒市"
502
+  },
503
+  "150600": {
504
+    "150602": "东胜区",
505
+    "150603": "康巴什区",
506
+    "150621": "达拉特旗",
507
+    "150622": "准格尔旗",
508
+    "150623": "鄂托克前旗",
509
+    "150624": "鄂托克旗",
510
+    "150625": "杭锦旗",
511
+    "150626": "乌审旗",
512
+    "150627": "伊金霍洛旗"
513
+  },
514
+  "150700": {
515
+    "150702": "海拉尔区",
516
+    "150703": "扎赉诺尔区",
517
+    "150721": "阿荣旗",
518
+    "150722": "莫力达瓦达斡尔族自治旗",
519
+    "150723": "鄂伦春自治旗",
520
+    "150724": "鄂温克族自治旗",
521
+    "150725": "陈巴尔虎旗",
522
+    "150726": "新巴尔虎左旗",
523
+    "150727": "新巴尔虎右旗",
524
+    "150781": "满洲里市",
525
+    "150782": "牙克石市",
526
+    "150783": "扎兰屯市",
527
+    "150784": "额尔古纳市",
528
+    "150785": "根河市"
529
+  },
530
+  "150800": {
531
+    "150802": "临河区",
532
+    "150821": "五原县",
533
+    "150822": "磴口县",
534
+    "150823": "乌拉特前旗",
535
+    "150824": "乌拉特中旗",
536
+    "150825": "乌拉特后旗",
537
+    "150826": "杭锦后旗"
538
+  },
539
+  "150900": {
540
+    "150902": "集宁区",
541
+    "150921": "卓资县",
542
+    "150922": "化德县",
543
+    "150923": "商都县",
544
+    "150924": "兴和县",
545
+    "150925": "凉城县",
546
+    "150926": "察哈尔右翼前旗",
547
+    "150927": "察哈尔右翼中旗",
548
+    "150928": "察哈尔右翼后旗",
549
+    "150929": "四子王旗",
550
+    "150981": "丰镇市"
551
+  },
552
+  "152200": {
553
+    "152201": "乌兰浩特市",
554
+    "152202": "阿尔山市",
555
+    "152221": "科尔沁右翼前旗",
556
+    "152222": "科尔沁右翼中旗",
557
+    "152223": "扎赉特旗",
558
+    "152224": "突泉县"
559
+  },
560
+  "152500": {
561
+    "152501": "二连浩特市",
562
+    "152502": "锡林浩特市",
563
+    "152522": "阿巴嘎旗",
564
+    "152523": "苏尼特左旗",
565
+    "152524": "苏尼特右旗",
566
+    "152525": "东乌珠穆沁旗",
567
+    "152526": "西乌珠穆沁旗",
568
+    "152527": "太仆寺旗",
569
+    "152528": "镶黄旗",
570
+    "152529": "正镶白旗",
571
+    "152530": "正蓝旗",
572
+    "152531": "多伦县"
573
+  },
574
+  "152900": {
575
+    "152921": "阿拉善左旗",
576
+    "152922": "阿拉善右旗",
577
+    "152923": "额济纳旗"
578
+  },
579
+  "210000": {
580
+    "210100": "沈阳市",
581
+    "210200": "大连市",
582
+    "210300": "鞍山市",
583
+    "210400": "抚顺市",
584
+    "210500": "本溪市",
585
+    "210600": "丹东市",
586
+    "210700": "锦州市",
587
+    "210800": "营口市",
588
+    "210900": "阜新市",
589
+    "211000": "辽阳市",
590
+    "211100": "盘锦市",
591
+    "211200": "铁岭市",
592
+    "211300": "朝阳市",
593
+    "211400": "葫芦岛市"
594
+  },
595
+  "210100": {
596
+    "210102": "和平区",
597
+    "210103": "沈河区",
598
+    "210104": "大东区",
599
+    "210105": "皇姑区",
600
+    "210106": "铁西区",
601
+    "210111": "苏家屯区",
602
+    "210112": "浑南区",
603
+    "210113": "沈北新区",
604
+    "210114": "于洪区",
605
+    "210115": "辽中区",
606
+    "210123": "康平县",
607
+    "210124": "法库县",
608
+    "210181": "新民市"
609
+  },
610
+  "210200": {
611
+    "210202": "中山区",
612
+    "210203": "西岗区",
613
+    "210204": "沙河口区",
614
+    "210211": "甘井子区",
615
+    "210212": "旅顺口区",
616
+    "210213": "金州区",
617
+    "210214": "普兰店区",
618
+    "210224": "长海县",
619
+    "210281": "瓦房店市",
620
+    "210283": "庄河市"
621
+  },
622
+  "210300": {
623
+    "210302": "铁东区",
624
+    "210303": "铁西区",
625
+    "210304": "立山区",
626
+    "210311": "千山区",
627
+    "210321": "台安县",
628
+    "210323": "岫岩满族自治县",
629
+    "210381": "海城市"
630
+  },
631
+  "210400": {
632
+    "210402": "新抚区",
633
+    "210403": "东洲区",
634
+    "210404": "望花区",
635
+    "210411": "顺城区",
636
+    "210421": "抚顺县",
637
+    "210422": "新宾满族自治县",
638
+    "210423": "清原满族自治县"
639
+  },
640
+  "210500": {
641
+    "210502": "平山区",
642
+    "210503": "溪湖区",
643
+    "210504": "明山区",
644
+    "210505": "南芬区",
645
+    "210521": "本溪满族自治县",
646
+    "210522": "桓仁满族自治县"
647
+  },
648
+  "210600": {
649
+    "210602": "元宝区",
650
+    "210603": "振兴区",
651
+    "210604": "振安区",
652
+    "210624": "宽甸满族自治县",
653
+    "210681": "东港市",
654
+    "210682": "凤城市"
655
+  },
656
+  "210700": {
657
+    "210702": "古塔区",
658
+    "210703": "凌河区",
659
+    "210711": "太和区",
660
+    "210726": "黑山县",
661
+    "210727": "义县",
662
+    "210781": "凌海市",
663
+    "210782": "北镇市"
664
+  },
665
+  "210800": {
666
+    "210802": "站前区",
667
+    "210803": "西市区",
668
+    "210804": "鲅鱼圈区",
669
+    "210811": "老边区",
670
+    "210881": "盖州市",
671
+    "210882": "大石桥市"
672
+  },
673
+  "210900": {
674
+    "210902": "海州区",
675
+    "210903": "新邱区",
676
+    "210904": "太平区",
677
+    "210905": "清河门区",
678
+    "210911": "细河区",
679
+    "210921": "阜新蒙古族自治县",
680
+    "210922": "彰武县"
681
+  },
682
+  "211000": {
683
+    "211002": "白塔区",
684
+    "211003": "文圣区",
685
+    "211004": "宏伟区",
686
+    "211005": "弓长岭区",
687
+    "211011": "太子河区",
688
+    "211021": "辽阳县",
689
+    "211081": "灯塔市"
690
+  },
691
+  "211100": {
692
+    "211102": "双台子区",
693
+    "211103": "兴隆台区",
694
+    "211104": "大洼区",
695
+    "211122": "盘山县"
696
+  },
697
+  "211200": {
698
+    "211202": "银州区",
699
+    "211204": "清河区",
700
+    "211221": "铁岭县",
701
+    "211223": "西丰县",
702
+    "211224": "昌图县",
703
+    "211281": "调兵山市",
704
+    "211282": "开原市"
705
+  },
706
+  "211300": {
707
+    "211302": "双塔区",
708
+    "211303": "龙城区",
709
+    "211321": "朝阳县",
710
+    "211322": "建平县",
711
+    "211324": "喀喇沁左翼蒙古族自治县",
712
+    "211381": "北票市",
713
+    "211382": "凌源市"
714
+  },
715
+  "211400": {
716
+    "211402": "连山区",
717
+    "211403": "龙港区",
718
+    "211404": "南票区",
719
+    "211421": "绥中县",
720
+    "211422": "建昌县",
721
+    "211481": "兴城市"
722
+  },
723
+  "220000": {
724
+    "220100": "长春市",
725
+    "220200": "吉林市",
726
+    "220300": "四平市",
727
+    "220400": "辽源市",
728
+    "220500": "通化市",
729
+    "220600": "白山市",
730
+    "220700": "松原市",
731
+    "220800": "白城市",
732
+    "222400": "延边朝鲜族自治州"
733
+  },
734
+  "220100": {
735
+    "220102": "南关区",
736
+    "220103": "宽城区",
737
+    "220104": "朝阳区",
738
+    "220105": "二道区",
739
+    "220106": "绿园区",
740
+    "220112": "双阳区",
741
+    "220113": "九台区",
742
+    "220122": "农安县",
743
+    "220182": "榆树市",
744
+    "220183": "德惠市"
745
+  },
746
+  "220200": {
747
+    "220202": "昌邑区",
748
+    "220203": "龙潭区",
749
+    "220204": "船营区",
750
+    "220211": "丰满区",
751
+    "220221": "永吉县",
752
+    "220281": "蛟河市",
753
+    "220282": "桦甸市",
754
+    "220283": "舒兰市",
755
+    "220284": "磐石市"
756
+  },
757
+  "220300": {
758
+    "220302": "铁西区",
759
+    "220303": "铁东区",
760
+    "220322": "梨树县",
761
+    "220323": "伊通满族自治县",
762
+    "220381": "公主岭市",
763
+    "220382": "双辽市"
764
+  },
765
+  "220400": {
766
+    "220402": "龙山区",
767
+    "220403": "西安区",
768
+    "220421": "东丰县",
769
+    "220422": "东辽县"
770
+  },
771
+  "220500": {
772
+    "220502": "东昌区",
773
+    "220503": "二道江区",
774
+    "220521": "通化县",
775
+    "220523": "辉南县",
776
+    "220524": "柳河县",
777
+    "220581": "梅河口市",
778
+    "220582": "集安市"
779
+  },
780
+  "220600": {
781
+    "220602": "浑江区",
782
+    "220605": "江源区",
783
+    "220621": "抚松县",
784
+    "220622": "靖宇县",
785
+    "220623": "长白朝鲜族自治县",
786
+    "220681": "临江市"
787
+  },
788
+  "220700": {
789
+    "220702": "宁江区",
790
+    "220721": "前郭尔罗斯蒙古族自治县",
791
+    "220722": "长岭县",
792
+    "220723": "乾安县",
793
+    "220781": "扶余市"
794
+  },
795
+  "220800": {
796
+    "220802": "洮北区",
797
+    "220821": "镇赉县",
798
+    "220822": "通榆县",
799
+    "220881": "洮南市",
800
+    "220882": "大安市"
801
+  },
802
+  "222400": {
803
+    "222401": "延吉市",
804
+    "222402": "图们市",
805
+    "222403": "敦化市",
806
+    "222404": "珲春市",
807
+    "222405": "龙井市",
808
+    "222406": "和龙市",
809
+    "222424": "汪清县",
810
+    "222426": "安图县"
811
+  },
812
+  "230000": {
813
+    "230100": "哈尔滨市",
814
+    "230200": "齐齐哈尔市",
815
+    "230300": "鸡西市",
816
+    "230400": "鹤岗市",
817
+    "230500": "双鸭山市",
818
+    "230600": "大庆市",
819
+    "230700": "伊春市",
820
+    "230800": "佳木斯市",
821
+    "230900": "七台河市",
822
+    "231000": "牡丹江市",
823
+    "231100": "黑河市",
824
+    "231200": "绥化市",
825
+    "232700": "大兴安岭地区"
826
+  },
827
+  "230100": {
828
+    "230102": "道里区",
829
+    "230103": "南岗区",
830
+    "230104": "道外区",
831
+    "230108": "平房区",
832
+    "230109": "松北区",
833
+    "230110": "香坊区",
834
+    "230111": "呼兰区",
835
+    "230112": "阿城区",
836
+    "230113": "双城区",
837
+    "230123": "依兰县",
838
+    "230124": "方正县",
839
+    "230125": "宾县",
840
+    "230126": "巴彦县",
841
+    "230127": "木兰县",
842
+    "230128": "通河县",
843
+    "230129": "延寿县",
844
+    "230183": "尚志市",
845
+    "230184": "五常市"
846
+  },
847
+  "230200": {
848
+    "230202": "龙沙区",
849
+    "230203": "建华区",
850
+    "230204": "铁锋区",
851
+    "230205": "昂昂溪区",
852
+    "230206": "富拉尔基区",
853
+    "230207": "碾子山区",
854
+    "230208": "梅里斯达斡尔族区",
855
+    "230221": "龙江县",
856
+    "230223": "依安县",
857
+    "230224": "泰来县",
858
+    "230225": "甘南县",
859
+    "230227": "富裕县",
860
+    "230229": "克山县",
861
+    "230230": "克东县",
862
+    "230231": "拜泉县",
863
+    "230281": "讷河市"
864
+  },
865
+  "230300": {
866
+    "230302": "鸡冠区",
867
+    "230303": "恒山区",
868
+    "230304": "滴道区",
869
+    "230305": "梨树区",
870
+    "230306": "城子河区",
871
+    "230307": "麻山区",
872
+    "230321": "鸡东县",
873
+    "230381": "虎林市",
874
+    "230382": "密山市"
875
+  },
876
+  "230400": {
877
+    "230402": "向阳区",
878
+    "230403": "工农区",
879
+    "230404": "南山区",
880
+    "230405": "兴安区",
881
+    "230406": "东山区",
882
+    "230407": "兴山区",
883
+    "230421": "萝北县",
884
+    "230422": "绥滨县"
885
+  },
886
+  "230500": {
887
+    "230502": "尖山区",
888
+    "230503": "岭东区",
889
+    "230505": "四方台区",
890
+    "230506": "宝山区",
891
+    "230521": "集贤县",
892
+    "230522": "友谊县",
893
+    "230523": "宝清县",
894
+    "230524": "饶河县"
895
+  },
896
+  "230600": {
897
+    "230602": "萨尔图区",
898
+    "230603": "龙凤区",
899
+    "230604": "让胡路区",
900
+    "230605": "红岗区",
901
+    "230606": "大同区",
902
+    "230621": "肇州县",
903
+    "230622": "肇源县",
904
+    "230623": "林甸县",
905
+    "230624": "杜尔伯特蒙古族自治县"
906
+  },
907
+  "230700": {
908
+    "230702": "伊春区",
909
+    "230703": "南岔区",
910
+    "230704": "友好区",
911
+    "230705": "西林区",
912
+    "230706": "翠峦区",
913
+    "230707": "新青区",
914
+    "230708": "美溪区",
915
+    "230709": "金山屯区",
916
+    "230710": "五营区",
917
+    "230711": "乌马河区",
918
+    "230712": "汤旺河区",
919
+    "230713": "带岭区",
920
+    "230714": "乌伊岭区",
921
+    "230715": "红星区",
922
+    "230716": "上甘岭区",
923
+    "230722": "嘉荫县",
924
+    "230781": "铁力市"
925
+  },
926
+  "230800": {
927
+    "230803": "向阳区",
928
+    "230804": "前进区",
929
+    "230805": "东风区",
930
+    "230811": "郊区",
931
+    "230822": "桦南县",
932
+    "230826": "桦川县",
933
+    "230828": "汤原县",
934
+    "230881": "同江市",
935
+    "230882": "富锦市",
936
+    "230883": "抚远市"
937
+  },
938
+  "230900": {
939
+    "230902": "新兴区",
940
+    "230903": "桃山区",
941
+    "230904": "茄子河区",
942
+    "230921": "勃利县"
943
+  },
944
+  "231000": {
945
+    "231002": "东安区",
946
+    "231003": "阳明区",
947
+    "231004": "爱民区",
948
+    "231005": "西安区",
949
+    "231025": "林口县",
950
+    "231081": "绥芬河市",
951
+    "231083": "海林市",
952
+    "231084": "宁安市",
953
+    "231085": "穆棱市",
954
+    "231086": "东宁市"
955
+  },
956
+  "231100": {
957
+    "231102": "爱辉区",
958
+    "231121": "嫩江县",
959
+    "231123": "逊克县",
960
+    "231124": "孙吴县",
961
+    "231181": "北安市",
962
+    "231182": "五大连池市"
963
+  },
964
+  "231200": {
965
+    "231202": "北林区",
966
+    "231221": "望奎县",
967
+    "231222": "兰西县",
968
+    "231223": "青冈县",
969
+    "231224": "庆安县",
970
+    "231225": "明水县",
971
+    "231226": "绥棱县",
972
+    "231281": "安达市",
973
+    "231282": "肇东市",
974
+    "231283": "海伦市"
975
+  },
976
+  "232700": {
977
+    "232721": "呼玛县",
978
+    "232722": "塔河县",
979
+    "232723": "漠河县"
980
+  },
981
+  "310000": {
982
+    "310100": "市辖区"
983
+  },
984
+  "310100": {
985
+    "310101": "黄浦区",
986
+    "310104": "徐汇区",
987
+    "310105": "长宁区",
988
+    "310106": "静安区",
989
+    "310107": "普陀区",
990
+    "310109": "虹口区",
991
+    "310110": "杨浦区",
992
+    "310112": "闵行区",
993
+    "310113": "宝山区",
994
+    "310114": "嘉定区",
995
+    "310115": "浦东新区",
996
+    "310116": "金山区",
997
+    "310117": "松江区",
998
+    "310118": "青浦区",
999
+    "310120": "奉贤区",
1000
+    "310151": "崇明区"
1001
+  },
1002
+  "320000": {
1003
+    "320100": "南京市",
1004
+    "320200": "无锡市",
1005
+    "320300": "徐州市",
1006
+    "320400": "常州市",
1007
+    "320500": "苏州市",
1008
+    "320600": "南通市",
1009
+    "320700": "连云港市",
1010
+    "320800": "淮安市",
1011
+    "320900": "盐城市",
1012
+    "321000": "扬州市",
1013
+    "321100": "镇江市",
1014
+    "321200": "泰州市",
1015
+    "321300": "宿迁市"
1016
+  },
1017
+  "320100": {
1018
+    "320102": "玄武区",
1019
+    "320104": "秦淮区",
1020
+    "320105": "建邺区",
1021
+    "320106": "鼓楼区",
1022
+    "320111": "浦口区",
1023
+    "320113": "栖霞区",
1024
+    "320114": "雨花台区",
1025
+    "320115": "江宁区",
1026
+    "320116": "六合区",
1027
+    "320117": "溧水区",
1028
+    "320118": "高淳区"
1029
+  },
1030
+  "320200": {
1031
+    "320205": "锡山区",
1032
+    "320206": "惠山区",
1033
+    "320211": "滨湖区",
1034
+    "320213": "梁溪区",
1035
+    "320214": "新吴区",
1036
+    "320281": "江阴市",
1037
+    "320282": "宜兴市"
1038
+  },
1039
+  "320300": {
1040
+    "320302": "鼓楼区",
1041
+    "320303": "云龙区",
1042
+    "320305": "贾汪区",
1043
+    "320311": "泉山区",
1044
+    "320312": "铜山区",
1045
+    "320321": "丰县",
1046
+    "320322": "沛县",
1047
+    "320324": "睢宁县",
1048
+    "320381": "新沂市",
1049
+    "320382": "邳州市"
1050
+  },
1051
+  "320400": {
1052
+    "320402": "天宁区",
1053
+    "320404": "钟楼区",
1054
+    "320411": "新北区",
1055
+    "320412": "武进区",
1056
+    "320413": "金坛区",
1057
+    "320481": "溧阳市"
1058
+  },
1059
+  "320500": {
1060
+    "320505": "虎丘区",
1061
+    "320506": "吴中区",
1062
+    "320507": "相城区",
1063
+    "320508": "姑苏区",
1064
+    "320509": "吴江区",
1065
+    "320581": "常熟市",
1066
+    "320582": "张家港市",
1067
+    "320583": "昆山市",
1068
+    "320585": "太仓市"
1069
+  },
1070
+  "320600": {
1071
+    "320602": "崇川区",
1072
+    "320611": "港闸区",
1073
+    "320612": "通州区",
1074
+    "320621": "海安县",
1075
+    "320623": "如东县",
1076
+    "320681": "启东市",
1077
+    "320682": "如皋市",
1078
+    "320684": "海门市"
1079
+  },
1080
+  "320700": {
1081
+    "320703": "连云区",
1082
+    "320706": "海州区",
1083
+    "320707": "赣榆区",
1084
+    "320722": "东海县",
1085
+    "320723": "灌云县",
1086
+    "320724": "灌南县"
1087
+  },
1088
+  "320800": {
1089
+    "320803": "淮安区",
1090
+    "320804": "淮阴区",
1091
+    "320812": "清江浦区",
1092
+    "320813": "洪泽区",
1093
+    "320826": "涟水县",
1094
+    "320830": "盱眙县",
1095
+    "320831": "金湖县"
1096
+  },
1097
+  "320900": {
1098
+    "320902": "亭湖区",
1099
+    "320903": "盐都区",
1100
+    "320904": "大丰区",
1101
+    "320921": "响水县",
1102
+    "320922": "滨海县",
1103
+    "320923": "阜宁县",
1104
+    "320924": "射阳县",
1105
+    "320925": "建湖县",
1106
+    "320981": "东台市"
1107
+  },
1108
+  "321000": {
1109
+    "321002": "广陵区",
1110
+    "321003": "邗江区",
1111
+    "321012": "江都区",
1112
+    "321023": "宝应县",
1113
+    "321081": "仪征市",
1114
+    "321084": "高邮市"
1115
+  },
1116
+  "321100": {
1117
+    "321102": "京口区",
1118
+    "321111": "润州区",
1119
+    "321112": "丹徒区",
1120
+    "321181": "丹阳市",
1121
+    "321182": "扬中市",
1122
+    "321183": "句容市"
1123
+  },
1124
+  "321200": {
1125
+    "321202": "海陵区",
1126
+    "321203": "高港区",
1127
+    "321204": "姜堰区",
1128
+    "321281": "兴化市",
1129
+    "321282": "靖江市",
1130
+    "321283": "泰兴市"
1131
+  },
1132
+  "321300": {
1133
+    "321302": "宿城区",
1134
+    "321311": "宿豫区",
1135
+    "321322": "沭阳县",
1136
+    "321323": "泗阳县",
1137
+    "321324": "泗洪县"
1138
+  },
1139
+  "330000": {
1140
+    "330100": "杭州市",
1141
+    "330200": "宁波市",
1142
+    "330300": "温州市",
1143
+    "330400": "嘉兴市",
1144
+    "330500": "湖州市",
1145
+    "330600": "绍兴市",
1146
+    "330700": "金华市",
1147
+    "330800": "衢州市",
1148
+    "330900": "舟山市",
1149
+    "331000": "台州市",
1150
+    "331100": "丽水市"
1151
+  },
1152
+  "330100": {
1153
+    "330102": "上城区",
1154
+    "330103": "下城区",
1155
+    "330104": "江干区",
1156
+    "330105": "拱墅区",
1157
+    "330106": "西湖区",
1158
+    "330108": "滨江区",
1159
+    "330109": "萧山区",
1160
+    "330110": "余杭区",
1161
+    "330111": "富阳区",
1162
+    "330122": "桐庐县",
1163
+    "330127": "淳安县",
1164
+    "330182": "建德市",
1165
+    "330185": "临安市"
1166
+  },
1167
+  "330200": {
1168
+    "330203": "海曙区",
1169
+    "330204": "江东区",
1170
+    "330205": "江北区",
1171
+    "330206": "北仑区",
1172
+    "330211": "镇海区",
1173
+    "330212": "鄞州区",
1174
+    "330225": "象山县",
1175
+    "330226": "宁海县",
1176
+    "330281": "余姚市",
1177
+    "330282": "慈溪市",
1178
+    "330283": "奉化市"
1179
+  },
1180
+  "330300": {
1181
+    "330302": "鹿城区",
1182
+    "330303": "龙湾区",
1183
+    "330304": "瓯海区",
1184
+    "330305": "洞头区",
1185
+    "330324": "永嘉县",
1186
+    "330326": "平阳县",
1187
+    "330327": "苍南县",
1188
+    "330328": "文成县",
1189
+    "330329": "泰顺县",
1190
+    "330381": "瑞安市",
1191
+    "330382": "乐清市"
1192
+  },
1193
+  "330400": {
1194
+    "330402": "南湖区",
1195
+    "330411": "秀洲区",
1196
+    "330421": "嘉善县",
1197
+    "330424": "海盐县",
1198
+    "330481": "海宁市",
1199
+    "330482": "平湖市",
1200
+    "330483": "桐乡市"
1201
+  },
1202
+  "330500": {
1203
+    "330502": "吴兴区",
1204
+    "330503": "南浔区",
1205
+    "330521": "德清县",
1206
+    "330522": "长兴县",
1207
+    "330523": "安吉县"
1208
+  },
1209
+  "330600": {
1210
+    "330602": "越城区",
1211
+    "330603": "柯桥区",
1212
+    "330604": "上虞区",
1213
+    "330624": "新昌县",
1214
+    "330681": "诸暨市",
1215
+    "330683": "嵊州市"
1216
+  },
1217
+  "330700": {
1218
+    "330702": "婺城区",
1219
+    "330703": "金东区",
1220
+    "330723": "武义县",
1221
+    "330726": "浦江县",
1222
+    "330727": "磐安县",
1223
+    "330781": "兰溪市",
1224
+    "330782": "义乌市",
1225
+    "330783": "东阳市",
1226
+    "330784": "永康市"
1227
+  },
1228
+  "330800": {
1229
+    "330802": "柯城区",
1230
+    "330803": "衢江区",
1231
+    "330822": "常山县",
1232
+    "330824": "开化县",
1233
+    "330825": "龙游县",
1234
+    "330881": "江山市"
1235
+  },
1236
+  "330900": {
1237
+    "330902": "定海区",
1238
+    "330903": "普陀区",
1239
+    "330921": "岱山县",
1240
+    "330922": "嵊泗县"
1241
+  },
1242
+  "331000": {
1243
+    "331002": "椒江区",
1244
+    "331003": "黄岩区",
1245
+    "331004": "路桥区",
1246
+    "331021": "玉环县",
1247
+    "331022": "三门县",
1248
+    "331023": "天台县",
1249
+    "331024": "仙居县",
1250
+    "331081": "温岭市",
1251
+    "331082": "临海市"
1252
+  },
1253
+  "331100": {
1254
+    "331102": "莲都区",
1255
+    "331121": "青田县",
1256
+    "331122": "缙云县",
1257
+    "331123": "遂昌县",
1258
+    "331124": "松阳县",
1259
+    "331125": "云和县",
1260
+    "331126": "庆元县",
1261
+    "331127": "景宁畲族自治县",
1262
+    "331181": "龙泉市"
1263
+  },
1264
+  "340000": {
1265
+    "340100": "合肥市",
1266
+    "340200": "芜湖市",
1267
+    "340300": "蚌埠市",
1268
+    "340400": "淮南市",
1269
+    "340500": "马鞍山市",
1270
+    "340600": "淮北市",
1271
+    "340700": "铜陵市",
1272
+    "340800": "安庆市",
1273
+    "341000": "黄山市",
1274
+    "341100": "滁州市",
1275
+    "341200": "阜阳市",
1276
+    "341300": "宿州市",
1277
+    "341500": "六安市",
1278
+    "341600": "亳州市",
1279
+    "341700": "池州市",
1280
+    "341800": "宣城市"
1281
+  },
1282
+  "340100": {
1283
+    "340102": "瑶海区",
1284
+    "340103": "庐阳区",
1285
+    "340104": "蜀山区",
1286
+    "340111": "包河区",
1287
+    "340121": "长丰县",
1288
+    "340122": "肥东县",
1289
+    "340123": "肥西县",
1290
+    "340124": "庐江县",
1291
+    "340181": "巢湖市"
1292
+  },
1293
+  "340200": {
1294
+    "340202": "镜湖区",
1295
+    "340203": "弋江区",
1296
+    "340207": "鸠江区",
1297
+    "340208": "三山区",
1298
+    "340221": "芜湖县",
1299
+    "340222": "繁昌县",
1300
+    "340223": "南陵县",
1301
+    "340225": "无为县"
1302
+  },
1303
+  "340300": {
1304
+    "340302": "龙子湖区",
1305
+    "340303": "蚌山区",
1306
+    "340304": "禹会区",
1307
+    "340311": "淮上区",
1308
+    "340321": "怀远县",
1309
+    "340322": "五河县",
1310
+    "340323": "固镇县"
1311
+  },
1312
+  "340400": {
1313
+    "340402": "大通区",
1314
+    "340403": "田家庵区",
1315
+    "340404": "谢家集区",
1316
+    "340405": "八公山区",
1317
+    "340406": "潘集区",
1318
+    "340421": "凤台县",
1319
+    "340422": "寿县"
1320
+  },
1321
+  "340500": {
1322
+    "340503": "花山区",
1323
+    "340504": "雨山区",
1324
+    "340506": "博望区",
1325
+    "340521": "当涂县",
1326
+    "340522": "含山县",
1327
+    "340523": "和县"
1328
+  },
1329
+  "340600": {
1330
+    "340602": "杜集区",
1331
+    "340603": "相山区",
1332
+    "340604": "烈山区",
1333
+    "340621": "濉溪县"
1334
+  },
1335
+  "340700": {
1336
+    "340705": "铜官区",
1337
+    "340706": "义安区",
1338
+    "340711": "郊区",
1339
+    "340722": "枞阳县"
1340
+  },
1341
+  "340800": {
1342
+    "340802": "迎江区",
1343
+    "340803": "大观区",
1344
+    "340811": "宜秀区",
1345
+    "340822": "怀宁县",
1346
+    "340824": "潜山县",
1347
+    "340825": "太湖县",
1348
+    "340826": "宿松县",
1349
+    "340827": "望江县",
1350
+    "340828": "岳西县",
1351
+    "340881": "桐城市"
1352
+  },
1353
+  "341000": {
1354
+    "341002": "屯溪区",
1355
+    "341003": "黄山区",
1356
+    "341004": "徽州区",
1357
+    "341021": "歙县",
1358
+    "341022": "休宁县",
1359
+    "341023": "黟县",
1360
+    "341024": "祁门县"
1361
+  },
1362
+  "341100": {
1363
+    "341102": "琅琊区",
1364
+    "341103": "南谯区",
1365
+    "341122": "来安县",
1366
+    "341124": "全椒县",
1367
+    "341125": "定远县",
1368
+    "341126": "凤阳县",
1369
+    "341181": "天长市",
1370
+    "341182": "明光市"
1371
+  },
1372
+  "341200": {
1373
+    "341202": "颍州区",
1374
+    "341203": "颍东区",
1375
+    "341204": "颍泉区",
1376
+    "341221": "临泉县",
1377
+    "341222": "太和县",
1378
+    "341225": "阜南县",
1379
+    "341226": "颍上县",
1380
+    "341282": "界首市"
1381
+  },
1382
+  "341300": {
1383
+    "341302": "埇桥区",
1384
+    "341321": "砀山县",
1385
+    "341322": "萧县",
1386
+    "341323": "灵璧县",
1387
+    "341324": "泗县"
1388
+  },
1389
+  "341500": {
1390
+    "341502": "金安区",
1391
+    "341503": "裕安区",
1392
+    "341504": "叶集区",
1393
+    "341522": "霍邱县",
1394
+    "341523": "舒城县",
1395
+    "341524": "金寨县",
1396
+    "341525": "霍山县"
1397
+  },
1398
+  "341600": {
1399
+    "341602": "谯城区",
1400
+    "341621": "涡阳县",
1401
+    "341622": "蒙城县",
1402
+    "341623": "利辛县"
1403
+  },
1404
+  "341700": {
1405
+    "341702": "贵池区",
1406
+    "341721": "东至县",
1407
+    "341722": "石台县",
1408
+    "341723": "青阳县"
1409
+  },
1410
+  "341800": {
1411
+    "341802": "宣州区",
1412
+    "341821": "郎溪县",
1413
+    "341822": "广德县",
1414
+    "341823": "泾县",
1415
+    "341824": "绩溪县",
1416
+    "341825": "旌德县",
1417
+    "341881": "宁国市"
1418
+  },
1419
+  "350000": {
1420
+    "350100": "福州市",
1421
+    "350200": "厦门市",
1422
+    "350300": "莆田市",
1423
+    "350400": "三明市",
1424
+    "350500": "泉州市",
1425
+    "350600": "漳州市",
1426
+    "350700": "南平市",
1427
+    "350800": "龙岩市",
1428
+    "350900": "宁德市"
1429
+  },
1430
+  "350100": {
1431
+    "350102": "鼓楼区",
1432
+    "350103": "台江区",
1433
+    "350104": "仓山区",
1434
+    "350105": "马尾区",
1435
+    "350111": "晋安区",
1436
+    "350121": "闽侯县",
1437
+    "350122": "连江县",
1438
+    "350123": "罗源县",
1439
+    "350124": "闽清县",
1440
+    "350125": "永泰县",
1441
+    "350128": "平潭县",
1442
+    "350181": "福清市",
1443
+    "350182": "长乐市"
1444
+  },
1445
+  "350200": {
1446
+    "350203": "思明区",
1447
+    "350205": "海沧区",
1448
+    "350206": "湖里区",
1449
+    "350211": "集美区",
1450
+    "350212": "同安区",
1451
+    "350213": "翔安区"
1452
+  },
1453
+  "350300": {
1454
+    "350302": "城厢区",
1455
+    "350303": "涵江区",
1456
+    "350304": "荔城区",
1457
+    "350305": "秀屿区",
1458
+    "350322": "仙游县"
1459
+  },
1460
+  "350400": {
1461
+    "350402": "梅列区",
1462
+    "350403": "三元区",
1463
+    "350421": "明溪县",
1464
+    "350423": "清流县",
1465
+    "350424": "宁化县",
1466
+    "350425": "大田县",
1467
+    "350426": "尤溪县",
1468
+    "350427": "沙县",
1469
+    "350428": "将乐县",
1470
+    "350429": "泰宁县",
1471
+    "350430": "建宁县",
1472
+    "350481": "永安市"
1473
+  },
1474
+  "350500": {
1475
+    "350502": "鲤城区",
1476
+    "350503": "丰泽区",
1477
+    "350504": "洛江区",
1478
+    "350505": "泉港区",
1479
+    "350521": "惠安县",
1480
+    "350524": "安溪县",
1481
+    "350525": "永春县",
1482
+    "350526": "德化县",
1483
+    "350527": "金门县",
1484
+    "350581": "石狮市",
1485
+    "350582": "晋江市",
1486
+    "350583": "南安市"
1487
+  },
1488
+  "350600": {
1489
+    "350602": "芗城区",
1490
+    "350603": "龙文区",
1491
+    "350622": "云霄县",
1492
+    "350623": "漳浦县",
1493
+    "350624": "诏安县",
1494
+    "350625": "长泰县",
1495
+    "350626": "东山县",
1496
+    "350627": "南靖县",
1497
+    "350628": "平和县",
1498
+    "350629": "华安县",
1499
+    "350681": "龙海市"
1500
+  },
1501
+  "350700": {
1502
+    "350702": "延平区",
1503
+    "350703": "建阳区",
1504
+    "350721": "顺昌县",
1505
+    "350722": "浦城县",
1506
+    "350723": "光泽县",
1507
+    "350724": "松溪县",
1508
+    "350725": "政和县",
1509
+    "350781": "邵武市",
1510
+    "350782": "武夷山市",
1511
+    "350783": "建瓯市"
1512
+  },
1513
+  "350800": {
1514
+    "350802": "新罗区",
1515
+    "350803": "永定区",
1516
+    "350821": "长汀县",
1517
+    "350823": "上杭县",
1518
+    "350824": "武平县",
1519
+    "350825": "连城县",
1520
+    "350881": "漳平市"
1521
+  },
1522
+  "350900": {
1523
+    "350902": "蕉城区",
1524
+    "350921": "霞浦县",
1525
+    "350922": "古田县",
1526
+    "350923": "屏南县",
1527
+    "350924": "寿宁县",
1528
+    "350925": "周宁县",
1529
+    "350926": "柘荣县",
1530
+    "350981": "福安市",
1531
+    "350982": "福鼎市"
1532
+  },
1533
+  "360000": {
1534
+    "360100": "南昌市",
1535
+    "360200": "景德镇市",
1536
+    "360300": "萍乡市",
1537
+    "360400": "九江市",
1538
+    "360500": "新余市",
1539
+    "360600": "鹰潭市",
1540
+    "360700": "赣州市",
1541
+    "360800": "吉安市",
1542
+    "360900": "宜春市",
1543
+    "361000": "抚州市",
1544
+    "361100": "上饶市"
1545
+  },
1546
+  "360100": {
1547
+    "360102": "东湖区",
1548
+    "360103": "西湖区",
1549
+    "360104": "青云谱区",
1550
+    "360105": "湾里区",
1551
+    "360111": "青山湖区",
1552
+    "360112": "新建区",
1553
+    "360121": "南昌县",
1554
+    "360123": "安义县",
1555
+    "360124": "进贤县"
1556
+  },
1557
+  "360200": {
1558
+    "360202": "昌江区",
1559
+    "360203": "珠山区",
1560
+    "360222": "浮梁县",
1561
+    "360281": "乐平市"
1562
+  },
1563
+  "360300": {
1564
+    "360302": "安源区",
1565
+    "360313": "湘东区",
1566
+    "360321": "莲花县",
1567
+    "360322": "上栗县",
1568
+    "360323": "芦溪县"
1569
+  },
1570
+  "360400": {
1571
+    "360402": "濂溪区",
1572
+    "360403": "浔阳区",
1573
+    "360421": "九江县",
1574
+    "360423": "武宁县",
1575
+    "360424": "修水县",
1576
+    "360425": "永修县",
1577
+    "360426": "德安县",
1578
+    "360428": "都昌县",
1579
+    "360429": "湖口县",
1580
+    "360430": "彭泽县",
1581
+    "360481": "瑞昌市",
1582
+    "360482": "共青城市",
1583
+    "360483": "庐山市"
1584
+  },
1585
+  "360500": {
1586
+    "360502": "渝水区",
1587
+    "360521": "分宜县"
1588
+  },
1589
+  "360600": {
1590
+    "360602": "月湖区",
1591
+    "360622": "余江县",
1592
+    "360681": "贵溪市"
1593
+  },
1594
+  "360700": {
1595
+    "360702": "章贡区",
1596
+    "360703": "南康区",
1597
+    "360721": "赣县",
1598
+    "360722": "信丰县",
1599
+    "360723": "大余县",
1600
+    "360724": "上犹县",
1601
+    "360725": "崇义县",
1602
+    "360726": "安远县",
1603
+    "360727": "龙南县",
1604
+    "360728": "定南县",
1605
+    "360729": "全南县",
1606
+    "360730": "宁都县",
1607
+    "360731": "于都县",
1608
+    "360732": "兴国县",
1609
+    "360733": "会昌县",
1610
+    "360734": "寻乌县",
1611
+    "360735": "石城县",
1612
+    "360781": "瑞金市"
1613
+  },
1614
+  "360800": {
1615
+    "360802": "吉州区",
1616
+    "360803": "青原区",
1617
+    "360821": "吉安县",
1618
+    "360822": "吉水县",
1619
+    "360823": "峡江县",
1620
+    "360824": "新干县",
1621
+    "360825": "永丰县",
1622
+    "360826": "泰和县",
1623
+    "360827": "遂川县",
1624
+    "360828": "万安县",
1625
+    "360829": "安福县",
1626
+    "360830": "永新县",
1627
+    "360881": "井冈山市"
1628
+  },
1629
+  "360900": {
1630
+    "360902": "袁州区",
1631
+    "360921": "奉新县",
1632
+    "360922": "万载县",
1633
+    "360923": "上高县",
1634
+    "360924": "宜丰县",
1635
+    "360925": "靖安县",
1636
+    "360926": "铜鼓县",
1637
+    "360981": "丰城市",
1638
+    "360982": "樟树市",
1639
+    "360983": "高安市"
1640
+  },
1641
+  "361000": {
1642
+    "361002": "临川区",
1643
+    "361021": "南城县",
1644
+    "361022": "黎川县",
1645
+    "361023": "南丰县",
1646
+    "361024": "崇仁县",
1647
+    "361025": "乐安县",
1648
+    "361026": "宜黄县",
1649
+    "361027": "金溪县",
1650
+    "361028": "资溪县",
1651
+    "361029": "东乡县",
1652
+    "361030": "广昌县"
1653
+  },
1654
+  "361100": {
1655
+    "361102": "信州区",
1656
+    "361103": "广丰区",
1657
+    "361121": "上饶县",
1658
+    "361123": "玉山县",
1659
+    "361124": "铅山县",
1660
+    "361125": "横峰县",
1661
+    "361126": "弋阳县",
1662
+    "361127": "余干县",
1663
+    "361128": "鄱阳县",
1664
+    "361129": "万年县",
1665
+    "361130": "婺源县",
1666
+    "361181": "德兴市"
1667
+  },
1668
+  "370000": {
1669
+    "370100": "济南市",
1670
+    "370200": "青岛市",
1671
+    "370300": "淄博市",
1672
+    "370400": "枣庄市",
1673
+    "370500": "东营市",
1674
+    "370600": "烟台市",
1675
+    "370700": "潍坊市",
1676
+    "370800": "济宁市",
1677
+    "370900": "泰安市",
1678
+    "371000": "威海市",
1679
+    "371100": "日照市",
1680
+    "371200": "莱芜市",
1681
+    "371300": "临沂市",
1682
+    "371400": "德州市",
1683
+    "371500": "聊城市",
1684
+    "371600": "滨州市",
1685
+    "371700": "菏泽市"
1686
+  },
1687
+  "370100": {
1688
+    "370102": "历下区",
1689
+    "370103": "市中区",
1690
+    "370104": "槐荫区",
1691
+    "370105": "天桥区",
1692
+    "370112": "历城区",
1693
+    "370113": "长清区",
1694
+    "370124": "平阴县",
1695
+    "370125": "济阳县",
1696
+    "370126": "商河县",
1697
+    "370181": "章丘市"
1698
+  },
1699
+  "370200": {
1700
+    "370202": "市南区",
1701
+    "370203": "市北区",
1702
+    "370211": "黄岛区",
1703
+    "370212": "崂山区",
1704
+    "370213": "李沧区",
1705
+    "370214": "城阳区",
1706
+    "370281": "胶州市",
1707
+    "370282": "即墨市",
1708
+    "370283": "平度市",
1709
+    "370285": "莱西市"
1710
+  },
1711
+  "370300": {
1712
+    "370302": "淄川区",
1713
+    "370303": "张店区",
1714
+    "370304": "博山区",
1715
+    "370305": "临淄区",
1716
+    "370306": "周村区",
1717
+    "370321": "桓台县",
1718
+    "370322": "高青县",
1719
+    "370323": "沂源县"
1720
+  },
1721
+  "370400": {
1722
+    "370402": "市中区",
1723
+    "370403": "薛城区",
1724
+    "370404": "峄城区",
1725
+    "370405": "台儿庄区",
1726
+    "370406": "山亭区",
1727
+    "370481": "滕州市"
1728
+  },
1729
+  "370500": {
1730
+    "370502": "东营区",
1731
+    "370503": "河口区",
1732
+    "370505": "垦利区",
1733
+    "370522": "利津县",
1734
+    "370523": "广饶县"
1735
+  },
1736
+  "370600": {
1737
+    "370602": "芝罘区",
1738
+    "370611": "福山区",
1739
+    "370612": "牟平区",
1740
+    "370613": "莱山区",
1741
+    "370634": "长岛县",
1742
+    "370681": "龙口市",
1743
+    "370682": "莱阳市",
1744
+    "370683": "莱州市",
1745
+    "370684": "蓬莱市",
1746
+    "370685": "招远市",
1747
+    "370686": "栖霞市",
1748
+    "370687": "海阳市"
1749
+  },
1750
+  "370700": {
1751
+    "370702": "潍城区",
1752
+    "370703": "寒亭区",
1753
+    "370704": "坊子区",
1754
+    "370705": "奎文区",
1755
+    "370724": "临朐县",
1756
+    "370725": "昌乐县",
1757
+    "370781": "青州市",
1758
+    "370782": "诸城市",
1759
+    "370783": "寿光市",
1760
+    "370784": "安丘市",
1761
+    "370785": "高密市",
1762
+    "370786": "昌邑市"
1763
+  },
1764
+  "370800": {
1765
+    "370811": "任城区",
1766
+    "370812": "兖州区",
1767
+    "370826": "微山县",
1768
+    "370827": "鱼台县",
1769
+    "370828": "金乡县",
1770
+    "370829": "嘉祥县",
1771
+    "370830": "汶上县",
1772
+    "370831": "泗水县",
1773
+    "370832": "梁山县",
1774
+    "370881": "曲阜市",
1775
+    "370883": "邹城市"
1776
+  },
1777
+  "370900": {
1778
+    "370902": "泰山区",
1779
+    "370911": "岱岳区",
1780
+    "370921": "宁阳县",
1781
+    "370923": "东平县",
1782
+    "370982": "新泰市",
1783
+    "370983": "肥城市"
1784
+  },
1785
+  "371000": {
1786
+    "371002": "环翠区",
1787
+    "371003": "文登区",
1788
+    "371082": "荣成市",
1789
+    "371083": "乳山市"
1790
+  },
1791
+  "371100": {
1792
+    "371102": "东港区",
1793
+    "371103": "岚山区",
1794
+    "371121": "五莲县",
1795
+    "371122": "莒县"
1796
+  },
1797
+  "371200": {
1798
+    "371202": "莱城区",
1799
+    "371203": "钢城区"
1800
+  },
1801
+  "371300": {
1802
+    "371302": "兰山区",
1803
+    "371311": "罗庄区",
1804
+    "371312": "河东区",
1805
+    "371321": "沂南县",
1806
+    "371322": "郯城县",
1807
+    "371323": "沂水县",
1808
+    "371324": "兰陵县",
1809
+    "371325": "费县",
1810
+    "371326": "平邑县",
1811
+    "371327": "莒南县",
1812
+    "371328": "蒙阴县",
1813
+    "371329": "临沭县"
1814
+  },
1815
+  "371400": {
1816
+    "371402": "德城区",
1817
+    "371403": "陵城区",
1818
+    "371422": "宁津县",
1819
+    "371423": "庆云县",
1820
+    "371424": "临邑县",
1821
+    "371425": "齐河县",
1822
+    "371426": "平原县",
1823
+    "371427": "夏津县",
1824
+    "371428": "武城县",
1825
+    "371481": "乐陵市",
1826
+    "371482": "禹城市"
1827
+  },
1828
+  "371500": {
1829
+    "371502": "东昌府区",
1830
+    "371521": "阳谷县",
1831
+    "371522": "莘县",
1832
+    "371523": "茌平县",
1833
+    "371524": "东阿县",
1834
+    "371525": "冠县",
1835
+    "371526": "高唐县",
1836
+    "371581": "临清市"
1837
+  },
1838
+  "371600": {
1839
+    "371602": "滨城区",
1840
+    "371603": "沾化区",
1841
+    "371621": "惠民县",
1842
+    "371622": "阳信县",
1843
+    "371623": "无棣县",
1844
+    "371625": "博兴县",
1845
+    "371626": "邹平县"
1846
+  },
1847
+  "371700": {
1848
+    "371702": "牡丹区",
1849
+    "371703": "定陶区",
1850
+    "371721": "曹县",
1851
+    "371722": "单县",
1852
+    "371723": "成武县",
1853
+    "371724": "巨野县",
1854
+    "371725": "郓城县",
1855
+    "371726": "鄄城县",
1856
+    "371728": "东明县"
1857
+  },
1858
+  "410000": {
1859
+    "410100": "郑州市",
1860
+    "410200": "开封市",
1861
+    "410300": "洛阳市",
1862
+    "410400": "平顶山市",
1863
+    "410500": "安阳市",
1864
+    "410600": "鹤壁市",
1865
+    "410700": "新乡市",
1866
+    "410800": "焦作市",
1867
+    "410900": "濮阳市",
1868
+    "411000": "许昌市",
1869
+    "411100": "漯河市",
1870
+    "411200": "三门峡市",
1871
+    "411300": "南阳市",
1872
+    "411400": "商丘市",
1873
+    "411500": "信阳市",
1874
+    "411600": "周口市",
1875
+    "411700": "驻马店市",
1876
+    "419001": "济源市"
1877
+  },
1878
+  "410100": {
1879
+    "410102": "中原区",
1880
+    "410103": "二七区",
1881
+    "410104": "管城回族区",
1882
+    "410105": "金水区",
1883
+    "410106": "上街区",
1884
+    "410108": "惠济区",
1885
+    "410122": "中牟县",
1886
+    "410181": "巩义市",
1887
+    "410182": "荥阳市",
1888
+    "410183": "新密市",
1889
+    "410184": "新郑市",
1890
+    "410185": "登封市"
1891
+  },
1892
+  "410200": {
1893
+    "410202": "龙亭区",
1894
+    "410203": "顺河回族区",
1895
+    "410204": "鼓楼区",
1896
+    "410205": "禹王台区",
1897
+    "410211": "金明区",
1898
+    "410212": "祥符区",
1899
+    "410221": "杞县",
1900
+    "410222": "通许县",
1901
+    "410223": "尉氏县",
1902
+    "410225": "兰考县"
1903
+  },
1904
+  "410300": {
1905
+    "410302": "老城区",
1906
+    "410303": "西工区",
1907
+    "410304": "瀍河回族区",
1908
+    "410305": "涧西区",
1909
+    "410306": "吉利区",
1910
+    "410311": "洛龙区",
1911
+    "410322": "孟津县",
1912
+    "410323": "新安县",
1913
+    "410324": "栾川县",
1914
+    "410325": "嵩县",
1915
+    "410326": "汝阳县",
1916
+    "410327": "宜阳县",
1917
+    "410328": "洛宁县",
1918
+    "410329": "伊川县",
1919
+    "410381": "偃师市"
1920
+  },
1921
+  "410400": {
1922
+    "410402": "新华区",
1923
+    "410403": "卫东区",
1924
+    "410404": "石龙区",
1925
+    "410411": "湛河区",
1926
+    "410421": "宝丰县",
1927
+    "410422": "叶县",
1928
+    "410423": "鲁山县",
1929
+    "410425": "郏县",
1930
+    "410481": "舞钢市",
1931
+    "410482": "汝州市"
1932
+  },
1933
+  "410500": {
1934
+    "410502": "文峰区",
1935
+    "410503": "北关区",
1936
+    "410505": "殷都区",
1937
+    "410506": "龙安区",
1938
+    "410522": "安阳县",
1939
+    "410523": "汤阴县",
1940
+    "410526": "滑县",
1941
+    "410527": "内黄县",
1942
+    "410581": "林州市"
1943
+  },
1944
+  "410600": {
1945
+    "410602": "鹤山区",
1946
+    "410603": "山城区",
1947
+    "410611": "淇滨区",
1948
+    "410621": "浚县",
1949
+    "410622": "淇县"
1950
+  },
1951
+  "410700": {
1952
+    "410702": "红旗区",
1953
+    "410703": "卫滨区",
1954
+    "410704": "凤泉区",
1955
+    "410711": "牧野区",
1956
+    "410721": "新乡县",
1957
+    "410724": "获嘉县",
1958
+    "410725": "原阳县",
1959
+    "410726": "延津县",
1960
+    "410727": "封丘县",
1961
+    "410728": "长垣县",
1962
+    "410781": "卫辉市",
1963
+    "410782": "辉县市"
1964
+  },
1965
+  "410800": {
1966
+    "410802": "解放区",
1967
+    "410803": "中站区",
1968
+    "410804": "马村区",
1969
+    "410811": "山阳区",
1970
+    "410821": "修武县",
1971
+    "410822": "博爱县",
1972
+    "410823": "武陟县",
1973
+    "410825": "温县",
1974
+    "410882": "沁阳市",
1975
+    "410883": "孟州市"
1976
+  },
1977
+  "410900": {
1978
+    "410902": "华龙区",
1979
+    "410922": "清丰县",
1980
+    "410923": "南乐县",
1981
+    "410926": "范县",
1982
+    "410927": "台前县",
1983
+    "410928": "濮阳县"
1984
+  },
1985
+  "411000": {
1986
+    "411002": "魏都区",
1987
+    "411023": "许昌县",
1988
+    "411024": "鄢陵县",
1989
+    "411025": "襄城县",
1990
+    "411081": "禹州市",
1991
+    "411082": "长葛市"
1992
+  },
1993
+  "411100": {
1994
+    "411102": "源汇区",
1995
+    "411103": "郾城区",
1996
+    "411104": "召陵区",
1997
+    "411121": "舞阳县",
1998
+    "411122": "临颍县"
1999
+  },
2000
+  "411200": {
2001
+    "411202": "湖滨区",
2002
+    "411203": "陕州区",
2003
+    "411221": "渑池县",
2004
+    "411224": "卢氏县",
2005
+    "411281": "义马市",
2006
+    "411282": "灵宝市"
2007
+  },
2008
+  "411300": {
2009
+    "411302": "宛城区",
2010
+    "411303": "卧龙区",
2011
+    "411321": "南召县",
2012
+    "411322": "方城县",
2013
+    "411323": "西峡县",
2014
+    "411324": "镇平县",
2015
+    "411325": "内乡县",
2016
+    "411326": "淅川县",
2017
+    "411327": "社旗县",
2018
+    "411328": "唐河县",
2019
+    "411329": "新野县",
2020
+    "411330": "桐柏县",
2021
+    "411381": "邓州市"
2022
+  },
2023
+  "411400": {
2024
+    "411402": "梁园区",
2025
+    "411403": "睢阳区",
2026
+    "411421": "民权县",
2027
+    "411422": "睢县",
2028
+    "411423": "宁陵县",
2029
+    "411424": "柘城县",
2030
+    "411425": "虞城县",
2031
+    "411426": "夏邑县",
2032
+    "411481": "永城市"
2033
+  },
2034
+  "411500": {
2035
+    "411502": "浉河区",
2036
+    "411503": "平桥区",
2037
+    "411521": "罗山县",
2038
+    "411522": "光山县",
2039
+    "411523": "新县",
2040
+    "411524": "商城县",
2041
+    "411525": "固始县",
2042
+    "411526": "潢川县",
2043
+    "411527": "淮滨县",
2044
+    "411528": "息县"
2045
+  },
2046
+  "411600": {
2047
+    "411602": "川汇区",
2048
+    "411621": "扶沟县",
2049
+    "411622": "西华县",
2050
+    "411623": "商水县",
2051
+    "411624": "沈丘县",
2052
+    "411625": "郸城县",
2053
+    "411626": "淮阳县",
2054
+    "411627": "太康县",
2055
+    "411628": "鹿邑县",
2056
+    "411681": "项城市"
2057
+  },
2058
+  "411700": {
2059
+    "411702": "驿城区",
2060
+    "411721": "西平县",
2061
+    "411722": "上蔡县",
2062
+    "411723": "平舆县",
2063
+    "411724": "正阳县",
2064
+    "411725": "确山县",
2065
+    "411726": "泌阳县",
2066
+    "411727": "汝南县",
2067
+    "411728": "遂平县",
2068
+    "411729": "新蔡县"
2069
+  },
2070
+  "420000": {
2071
+    "420100": "武汉市",
2072
+    "420200": "黄石市",
2073
+    "420300": "十堰市",
2074
+    "420500": "宜昌市",
2075
+    "420600": "襄阳市",
2076
+    "420700": "鄂州市",
2077
+    "420800": "荆门市",
2078
+    "420900": "孝感市",
2079
+    "421000": "荆州市",
2080
+    "421100": "黄冈市",
2081
+    "421200": "咸宁市",
2082
+    "421300": "随州市",
2083
+    "422800": "恩施土家族苗族自治州",
2084
+    "429004": "仙桃市",
2085
+    "429005": "潜江市",
2086
+    "429006": "天门市",
2087
+    "429021": "神农架林区"
2088
+  },
2089
+  "420100": {
2090
+    "420102": "江岸区",
2091
+    "420103": "江汉区",
2092
+    "420104": "硚口区",
2093
+    "420105": "汉阳区",
2094
+    "420106": "武昌区",
2095
+    "420107": "青山区",
2096
+    "420111": "洪山区",
2097
+    "420112": "东西湖区",
2098
+    "420113": "汉南区",
2099
+    "420114": "蔡甸区",
2100
+    "420115": "江夏区",
2101
+    "420116": "黄陂区",
2102
+    "420117": "新洲区"
2103
+  },
2104
+  "420200": {
2105
+    "420202": "黄石港区",
2106
+    "420203": "西塞山区",
2107
+    "420204": "下陆区",
2108
+    "420205": "铁山区",
2109
+    "420222": "阳新县",
2110
+    "420281": "大冶市"
2111
+  },
2112
+  "420300": {
2113
+    "420302": "茅箭区",
2114
+    "420303": "张湾区",
2115
+    "420304": "郧阳区",
2116
+    "420322": "郧西县",
2117
+    "420323": "竹山县",
2118
+    "420324": "竹溪县",
2119
+    "420325": "房县",
2120
+    "420381": "丹江口市"
2121
+  },
2122
+  "420500": {
2123
+    "420502": "西陵区",
2124
+    "420503": "伍家岗区",
2125
+    "420504": "点军区",
2126
+    "420505": "猇亭区",
2127
+    "420506": "夷陵区",
2128
+    "420525": "远安县",
2129
+    "420526": "兴山县",
2130
+    "420527": "秭归县",
2131
+    "420528": "长阳土家族自治县",
2132
+    "420529": "五峰土家族自治县",
2133
+    "420581": "宜都市",
2134
+    "420582": "当阳市",
2135
+    "420583": "枝江市"
2136
+  },
2137
+  "420600": {
2138
+    "420602": "襄城区",
2139
+    "420606": "樊城区",
2140
+    "420607": "襄州区",
2141
+    "420624": "南漳县",
2142
+    "420625": "谷城县",
2143
+    "420626": "保康县",
2144
+    "420682": "老河口市",
2145
+    "420683": "枣阳市",
2146
+    "420684": "宜城市"
2147
+  },
2148
+  "420700": {
2149
+    "420702": "梁子湖区",
2150
+    "420703": "华容区",
2151
+    "420704": "鄂城区"
2152
+  },
2153
+  "420800": {
2154
+    "420802": "东宝区",
2155
+    "420804": "掇刀区",
2156
+    "420821": "京山县",
2157
+    "420822": "沙洋县",
2158
+    "420881": "钟祥市"
2159
+  },
2160
+  "420900": {
2161
+    "420902": "孝南区",
2162
+    "420921": "孝昌县",
2163
+    "420922": "大悟县",
2164
+    "420923": "云梦县",
2165
+    "420981": "应城市",
2166
+    "420982": "安陆市",
2167
+    "420984": "汉川市"
2168
+  },
2169
+  "421000": {
2170
+    "421002": "沙市区",
2171
+    "421003": "荆州区",
2172
+    "421022": "公安县",
2173
+    "421023": "监利县",
2174
+    "421024": "江陵县",
2175
+    "421081": "石首市",
2176
+    "421083": "洪湖市",
2177
+    "421087": "松滋市"
2178
+  },
2179
+  "421100": {
2180
+    "421102": "黄州区",
2181
+    "421121": "团风县",
2182
+    "421122": "红安县",
2183
+    "421123": "罗田县",
2184
+    "421124": "英山县",
2185
+    "421125": "浠水县",
2186
+    "421126": "蕲春县",
2187
+    "421127": "黄梅县",
2188
+    "421181": "麻城市",
2189
+    "421182": "武穴市"
2190
+  },
2191
+  "421200": {
2192
+    "421202": "咸安区",
2193
+    "421221": "嘉鱼县",
2194
+    "421222": "通城县",
2195
+    "421223": "崇阳县",
2196
+    "421224": "通山县",
2197
+    "421281": "赤壁市"
2198
+  },
2199
+  "421300": {
2200
+    "421303": "曾都区",
2201
+    "421321": "随县",
2202
+    "421381": "广水市"
2203
+  },
2204
+  "422800": {
2205
+    "422801": "恩施市",
2206
+    "422802": "利川市",
2207
+    "422822": "建始县",
2208
+    "422823": "巴东县",
2209
+    "422825": "宣恩县",
2210
+    "422826": "咸丰县",
2211
+    "422827": "来凤县",
2212
+    "422828": "鹤峰县"
2213
+  },
2214
+  "430000": {
2215
+    "430100": "长沙市",
2216
+    "430200": "株洲市",
2217
+    "430300": "湘潭市",
2218
+    "430400": "衡阳市",
2219
+    "430500": "邵阳市",
2220
+    "430600": "岳阳市",
2221
+    "430700": "常德市",
2222
+    "430800": "张家界市",
2223
+    "430900": "益阳市",
2224
+    "431000": "郴州市",
2225
+    "431100": "永州市",
2226
+    "431200": "怀化市",
2227
+    "431300": "娄底市",
2228
+    "433100": "湘西土家族苗族自治州"
2229
+  },
2230
+  "430100": {
2231
+    "430102": "芙蓉区",
2232
+    "430103": "天心区",
2233
+    "430104": "岳麓区",
2234
+    "430105": "开福区",
2235
+    "430111": "雨花区",
2236
+    "430112": "望城区",
2237
+    "430121": "长沙县",
2238
+    "430124": "宁乡县",
2239
+    "430181": "浏阳市"
2240
+  },
2241
+  "430200": {
2242
+    "430202": "荷塘区",
2243
+    "430203": "芦淞区",
2244
+    "430204": "石峰区",
2245
+    "430211": "天元区",
2246
+    "430221": "株洲县",
2247
+    "430223": "攸县",
2248
+    "430224": "茶陵县",
2249
+    "430225": "炎陵县",
2250
+    "430281": "醴陵市"
2251
+  },
2252
+  "430300": {
2253
+    "430302": "雨湖区",
2254
+    "430304": "岳塘区",
2255
+    "430321": "湘潭县",
2256
+    "430381": "湘乡市",
2257
+    "430382": "韶山市"
2258
+  },
2259
+  "430400": {
2260
+    "430405": "珠晖区",
2261
+    "430406": "雁峰区",
2262
+    "430407": "石鼓区",
2263
+    "430408": "蒸湘区",
2264
+    "430412": "南岳区",
2265
+    "430421": "衡阳县",
2266
+    "430422": "衡南县",
2267
+    "430423": "衡山县",
2268
+    "430424": "衡东县",
2269
+    "430426": "祁东县",
2270
+    "430481": "耒阳市",
2271
+    "430482": "常宁市"
2272
+  },
2273
+  "430500": {
2274
+    "430502": "双清区",
2275
+    "430503": "大祥区",
2276
+    "430511": "北塔区",
2277
+    "430521": "邵东县",
2278
+    "430522": "新邵县",
2279
+    "430523": "邵阳县",
2280
+    "430524": "隆回县",
2281
+    "430525": "洞口县",
2282
+    "430527": "绥宁县",
2283
+    "430528": "新宁县",
2284
+    "430529": "城步苗族自治县",
2285
+    "430581": "武冈市"
2286
+  },
2287
+  "430600": {
2288
+    "430602": "岳阳楼区",
2289
+    "430603": "云溪区",
2290
+    "430611": "君山区",
2291
+    "430621": "岳阳县",
2292
+    "430623": "华容县",
2293
+    "430624": "湘阴县",
2294
+    "430626": "平江县",
2295
+    "430681": "汨罗市",
2296
+    "430682": "临湘市"
2297
+  },
2298
+  "430700": {
2299
+    "430702": "武陵区",
2300
+    "430703": "鼎城区",
2301
+    "430721": "安乡县",
2302
+    "430722": "汉寿县",
2303
+    "430723": "澧县",
2304
+    "430724": "临澧县",
2305
+    "430725": "桃源县",
2306
+    "430726": "石门县",
2307
+    "430781": "津市市"
2308
+  },
2309
+  "430800": {
2310
+    "430802": "永定区",
2311
+    "430811": "武陵源区",
2312
+    "430821": "慈利县",
2313
+    "430822": "桑植县"
2314
+  },
2315
+  "430900": {
2316
+    "430902": "资阳区",
2317
+    "430903": "赫山区",
2318
+    "430921": "南县",
2319
+    "430922": "桃江县",
2320
+    "430923": "安化县",
2321
+    "430981": "沅江市"
2322
+  },
2323
+  "431000": {
2324
+    "431002": "北湖区",
2325
+    "431003": "苏仙区",
2326
+    "431021": "桂阳县",
2327
+    "431022": "宜章县",
2328
+    "431023": "永兴县",
2329
+    "431024": "嘉禾县",
2330
+    "431025": "临武县",
2331
+    "431026": "汝城县",
2332
+    "431027": "桂东县",
2333
+    "431028": "安仁县",
2334
+    "431081": "资兴市"
2335
+  },
2336
+  "431100": {
2337
+    "431102": "零陵区",
2338
+    "431103": "冷水滩区",
2339
+    "431121": "祁阳县",
2340
+    "431122": "东安县",
2341
+    "431123": "双牌县",
2342
+    "431124": "道县",
2343
+    "431125": "江永县",
2344
+    "431126": "宁远县",
2345
+    "431127": "蓝山县",
2346
+    "431128": "新田县",
2347
+    "431129": "江华瑶族自治县"
2348
+  },
2349
+  "431200": {
2350
+    "431202": "鹤城区",
2351
+    "431221": "中方县",
2352
+    "431222": "沅陵县",
2353
+    "431223": "辰溪县",
2354
+    "431224": "溆浦县",
2355
+    "431225": "会同县",
2356
+    "431226": "麻阳苗族自治县",
2357
+    "431227": "新晃侗族自治县",
2358
+    "431228": "芷江侗族自治县",
2359
+    "431229": "靖州苗族侗族自治县",
2360
+    "431230": "通道侗族自治县",
2361
+    "431281": "洪江市"
2362
+  },
2363
+  "431300": {
2364
+    "431302": "娄星区",
2365
+    "431321": "双峰县",
2366
+    "431322": "新化县",
2367
+    "431381": "冷水江市",
2368
+    "431382": "涟源市"
2369
+  },
2370
+  "433100": {
2371
+    "433101": "吉首市",
2372
+    "433122": "泸溪县",
2373
+    "433123": "凤凰县",
2374
+    "433124": "花垣县",
2375
+    "433125": "保靖县",
2376
+    "433126": "古丈县",
2377
+    "433127": "永顺县",
2378
+    "433130": "龙山县"
2379
+  },
2380
+  "440000": {
2381
+    "440100": "广州市",
2382
+    "440200": "韶关市",
2383
+    "440300": "深圳市",
2384
+    "440400": "珠海市",
2385
+    "440500": "汕头市",
2386
+    "440600": "佛山市",
2387
+    "440700": "江门市",
2388
+    "440800": "湛江市",
2389
+    "440900": "茂名市",
2390
+    "441200": "肇庆市",
2391
+    "441300": "惠州市",
2392
+    "441400": "梅州市",
2393
+    "441500": "汕尾市",
2394
+    "441600": "河源市",
2395
+    "441700": "阳江市",
2396
+    "441800": "清远市",
2397
+    "441900": "东莞市",
2398
+    "442000": "中山市",
2399
+    "445100": "潮州市",
2400
+    "445200": "揭阳市",
2401
+    "445300": "云浮市"
2402
+  },
2403
+  "440100": {
2404
+    "440103": "荔湾区",
2405
+    "440104": "越秀区",
2406
+    "440105": "海珠区",
2407
+    "440106": "天河区",
2408
+    "440111": "白云区",
2409
+    "440112": "黄埔区",
2410
+    "440113": "番禺区",
2411
+    "440114": "花都区",
2412
+    "440115": "南沙区",
2413
+    "440117": "从化区",
2414
+    "440118": "增城区"
2415
+  },
2416
+  "440200": {
2417
+    "440203": "武江区",
2418
+    "440204": "浈江区",
2419
+    "440205": "曲江区",
2420
+    "440222": "始兴县",
2421
+    "440224": "仁化县",
2422
+    "440229": "翁源县",
2423
+    "440232": "乳源瑶族自治县",
2424
+    "440233": "新丰县",
2425
+    "440281": "乐昌市",
2426
+    "440282": "南雄市"
2427
+  },
2428
+  "440300": {
2429
+    "440303": "罗湖区",
2430
+    "440304": "福田区",
2431
+    "440305": "南山区",
2432
+    "440306": "宝安区",
2433
+    "440307": "龙岗区",
2434
+    "440308": "盐田区"
2435
+  },
2436
+  "440400": {
2437
+    "440402": "香洲区",
2438
+    "440403": "斗门区",
2439
+    "440404": "金湾区"
2440
+  },
2441
+  "440500": {
2442
+    "440507": "龙湖区",
2443
+    "440511": "金平区",
2444
+    "440512": "濠江区",
2445
+    "440513": "潮阳区",
2446
+    "440514": "潮南区",
2447
+    "440515": "澄海区",
2448
+    "440523": "南澳县"
2449
+  },
2450
+  "440600": {
2451
+    "440604": "禅城区",
2452
+    "440605": "南海区",
2453
+    "440606": "顺德区",
2454
+    "440607": "三水区",
2455
+    "440608": "高明区"
2456
+  },
2457
+  "440700": {
2458
+    "440703": "蓬江区",
2459
+    "440704": "江海区",
2460
+    "440705": "新会区",
2461
+    "440781": "台山市",
2462
+    "440783": "开平市",
2463
+    "440784": "鹤山市",
2464
+    "440785": "恩平市"
2465
+  },
2466
+  "440800": {
2467
+    "440802": "赤坎区",
2468
+    "440803": "霞山区",
2469
+    "440804": "坡头区",
2470
+    "440811": "麻章区",
2471
+    "440823": "遂溪县",
2472
+    "440825": "徐闻县",
2473
+    "440881": "廉江市",
2474
+    "440882": "雷州市",
2475
+    "440883": "吴川市"
2476
+  },
2477
+  "440900": {
2478
+    "440902": "茂南区",
2479
+    "440904": "电白区",
2480
+    "440981": "高州市",
2481
+    "440982": "化州市",
2482
+    "440983": "信宜市"
2483
+  },
2484
+  "441200": {
2485
+    "441202": "端州区",
2486
+    "441203": "鼎湖区",
2487
+    "441204": "高要区",
2488
+    "441223": "广宁县",
2489
+    "441224": "怀集县",
2490
+    "441225": "封开县",
2491
+    "441226": "德庆县",
2492
+    "441284": "四会市"
2493
+  },
2494
+  "441300": {
2495
+    "441302": "惠城区",
2496
+    "441303": "惠阳区",
2497
+    "441322": "博罗县",
2498
+    "441323": "惠东县",
2499
+    "441324": "龙门县"
2500
+  },
2501
+  "441400": {
2502
+    "441402": "梅江区",
2503
+    "441403": "梅县区",
2504
+    "441422": "大埔县",
2505
+    "441423": "丰顺县",
2506
+    "441424": "五华县",
2507
+    "441426": "平远县",
2508
+    "441427": "蕉岭县",
2509
+    "441481": "兴宁市"
2510
+  },
2511
+  "441500": {
2512
+    "441502": "城区",
2513
+    "441521": "海丰县",
2514
+    "441523": "陆河县",
2515
+    "441581": "陆丰市"
2516
+  },
2517
+  "441600": {
2518
+    "441602": "源城区",
2519
+    "441621": "紫金县",
2520
+    "441622": "龙川县",
2521
+    "441623": "连平县",
2522
+    "441624": "和平县",
2523
+    "441625": "东源县"
2524
+  },
2525
+  "441700": {
2526
+    "441702": "江城区",
2527
+    "441704": "阳东区",
2528
+    "441721": "阳西县",
2529
+    "441781": "阳春市"
2530
+  },
2531
+  "441800": {
2532
+    "441802": "清城区",
2533
+    "441803": "清新区",
2534
+    "441821": "佛冈县",
2535
+    "441823": "阳山县",
2536
+    "441825": "连山壮族瑶族自治县",
2537
+    "441826": "连南瑶族自治县",
2538
+    "441881": "英德市",
2539
+    "441882": "连州市"
2540
+  },
2541
+  "445100": {
2542
+    "445102": "湘桥区",
2543
+    "445103": "潮安区",
2544
+    "445122": "饶平县"
2545
+  },
2546
+  "445200": {
2547
+    "445202": "榕城区",
2548
+    "445203": "揭东区",
2549
+    "445222": "揭西县",
2550
+    "445224": "惠来县",
2551
+    "445281": "普宁市"
2552
+  },
2553
+  "445300": {
2554
+    "445302": "云城区",
2555
+    "445303": "云安区",
2556
+    "445321": "新兴县",
2557
+    "445322": "郁南县",
2558
+    "445381": "罗定市"
2559
+  },
2560
+  "450000": {
2561
+    "450100": "南宁市",
2562
+    "450200": "柳州市",
2563
+    "450300": "桂林市",
2564
+    "450400": "梧州市",
2565
+    "450500": "北海市",
2566
+    "450600": "防城港市",
2567
+    "450700": "钦州市",
2568
+    "450800": "贵港市",
2569
+    "450900": "玉林市",
2570
+    "451000": "百色市",
2571
+    "451100": "贺州市",
2572
+    "451200": "河池市",
2573
+    "451300": "来宾市",
2574
+    "451400": "崇左市"
2575
+  },
2576
+  "450100": {
2577
+    "450102": "兴宁区",
2578
+    "450103": "青秀区",
2579
+    "450105": "江南区",
2580
+    "450107": "西乡塘区",
2581
+    "450108": "良庆区",
2582
+    "450109": "邕宁区",
2583
+    "450110": "武鸣区",
2584
+    "450123": "隆安县",
2585
+    "450124": "马山县",
2586
+    "450125": "上林县",
2587
+    "450126": "宾阳县",
2588
+    "450127": "横县"
2589
+  },
2590
+  "450200": {
2591
+    "450202": "城中区",
2592
+    "450203": "鱼峰区",
2593
+    "450204": "柳南区",
2594
+    "450205": "柳北区",
2595
+    "450206": "柳江区",
2596
+    "450222": "柳城县",
2597
+    "450223": "鹿寨县",
2598
+    "450224": "融安县",
2599
+    "450225": "融水苗族自治县",
2600
+    "450226": "三江侗族自治县"
2601
+  },
2602
+  "450300": {
2603
+    "450302": "秀峰区",
2604
+    "450303": "叠彩区",
2605
+    "450304": "象山区",
2606
+    "450305": "七星区",
2607
+    "450311": "雁山区",
2608
+    "450312": "临桂区",
2609
+    "450321": "阳朔县",
2610
+    "450323": "灵川县",
2611
+    "450324": "全州县",
2612
+    "450325": "兴安县",
2613
+    "450326": "永福县",
2614
+    "450327": "灌阳县",
2615
+    "450328": "龙胜各族自治县",
2616
+    "450329": "资源县",
2617
+    "450330": "平乐县",
2618
+    "450331": "荔浦县",
2619
+    "450332": "恭城瑶族自治县"
2620
+  },
2621
+  "450400": {
2622
+    "450403": "万秀区",
2623
+    "450405": "长洲区",
2624
+    "450406": "龙圩区",
2625
+    "450421": "苍梧县",
2626
+    "450422": "藤县",
2627
+    "450423": "蒙山县",
2628
+    "450481": "岑溪市"
2629
+  },
2630
+  "450500": {
2631
+    "450502": "海城区",
2632
+    "450503": "银海区",
2633
+    "450512": "铁山港区",
2634
+    "450521": "合浦县"
2635
+  },
2636
+  "450600": {
2637
+    "450602": "港口区",
2638
+    "450603": "防城区",
2639
+    "450621": "上思县",
2640
+    "450681": "东兴市"
2641
+  },
2642
+  "450700": {
2643
+    "450702": "钦南区",
2644
+    "450703": "钦北区",
2645
+    "450721": "灵山县",
2646
+    "450722": "浦北县"
2647
+  },
2648
+  "450800": {
2649
+    "450802": "港北区",
2650
+    "450803": "港南区",
2651
+    "450804": "覃塘区",
2652
+    "450821": "平南县",
2653
+    "450881": "桂平市"
2654
+  },
2655
+  "450900": {
2656
+    "450902": "玉州区",
2657
+    "450903": "福绵区",
2658
+    "450921": "容县",
2659
+    "450922": "陆川县",
2660
+    "450923": "博白县",
2661
+    "450924": "兴业县",
2662
+    "450981": "北流市"
2663
+  },
2664
+  "451000": {
2665
+    "451002": "右江区",
2666
+    "451021": "田阳县",
2667
+    "451022": "田东县",
2668
+    "451023": "平果县",
2669
+    "451024": "德保县",
2670
+    "451026": "那坡县",
2671
+    "451027": "凌云县",
2672
+    "451028": "乐业县",
2673
+    "451029": "田林县",
2674
+    "451030": "西林县",
2675
+    "451031": "隆林各族自治县",
2676
+    "451081": "靖西市"
2677
+  },
2678
+  "451100": {
2679
+    "451102": "八步区",
2680
+    "451103": "平桂区",
2681
+    "451121": "昭平县",
2682
+    "451122": "钟山县",
2683
+    "451123": "富川瑶族自治县"
2684
+  },
2685
+  "451200": {
2686
+    "451202": "金城江区",
2687
+    "451221": "南丹县",
2688
+    "451222": "天峨县",
2689
+    "451223": "凤山县",
2690
+    "451224": "东兰县",
2691
+    "451225": "罗城仫佬族自治县",
2692
+    "451226": "环江毛南族自治县",
2693
+    "451227": "巴马瑶族自治县",
2694
+    "451228": "都安瑶族自治县",
2695
+    "451229": "大化瑶族自治县",
2696
+    "451281": "宜州市"
2697
+  },
2698
+  "451300": {
2699
+    "451302": "兴宾区",
2700
+    "451321": "忻城县",
2701
+    "451322": "象州县",
2702
+    "451323": "武宣县",
2703
+    "451324": "金秀瑶族自治县",
2704
+    "451381": "合山市"
2705
+  },
2706
+  "451400": {
2707
+    "451402": "江州区",
2708
+    "451421": "扶绥县",
2709
+    "451422": "宁明县",
2710
+    "451423": "龙州县",
2711
+    "451424": "大新县",
2712
+    "451425": "天等县",
2713
+    "451481": "凭祥市"
2714
+  },
2715
+  "460000": {
2716
+    "460100": "海口市",
2717
+    "460200": "三亚市",
2718
+    "460300": "三沙市",
2719
+    "460400": "儋州市",
2720
+    "469001": "五指山市",
2721
+    "469002": "琼海市",
2722
+    "469005": "文昌市",
2723
+    "469006": "万宁市",
2724
+    "469007": "东方市",
2725
+    "469021": "定安县",
2726
+    "469022": "屯昌县",
2727
+    "469023": "澄迈县",
2728
+    "469024": "临高县",
2729
+    "469025": "白沙黎族自治县",
2730
+    "469026": "昌江黎族自治县",
2731
+    "469027": "乐东黎族自治县",
2732
+    "469028": "陵水黎族自治县",
2733
+    "469029": "保亭黎族苗族自治县",
2734
+    "469030": "琼中黎族苗族自治县"
2735
+  },
2736
+  "460100": {
2737
+    "460105": "秀英区",
2738
+    "460106": "龙华区",
2739
+    "460107": "琼山区",
2740
+    "460108": "美兰区"
2741
+  },
2742
+  "460200": {
2743
+    "460202": "海棠区",
2744
+    "460203": "吉阳区",
2745
+    "460204": "天涯区",
2746
+    "460205": "崖州区"
2747
+  },
2748
+  "500000": {
2749
+    "500100": "市辖区"
2750
+  },
2751
+  "500100": {
2752
+    "500101": "万州区",
2753
+    "500102": "涪陵区",
2754
+    "500103": "渝中区",
2755
+    "500104": "大渡口区",
2756
+    "500105": "江北区",
2757
+    "500106": "沙坪坝区",
2758
+    "500107": "九龙坡区",
2759
+    "500108": "南岸区",
2760
+    "500109": "北碚区",
2761
+    "500110": "綦江区",
2762
+    "500111": "大足区",
2763
+    "500112": "渝北区",
2764
+    "500113": "巴南区",
2765
+    "500114": "黔江区",
2766
+    "500115": "长寿区",
2767
+    "500116": "江津区",
2768
+    "500117": "合川区",
2769
+    "500118": "永川区",
2770
+    "500119": "南川区",
2771
+    "500120": "璧山区",
2772
+    "500151": "铜梁区",
2773
+    "500152": "潼南区",
2774
+    "500153": "荣昌区",
2775
+    "500154": "开州区",
2776
+    "500228": "梁平县",
2777
+    "500229": "城口县",
2778
+    "500230": "丰都县",
2779
+    "500231": "垫江县",
2780
+    "500232": "武隆县",
2781
+    "500233": "忠县",
2782
+    "500235": "云阳县",
2783
+    "500236": "奉节县",
2784
+    "500237": "巫山县",
2785
+    "500238": "巫溪县",
2786
+    "500240": "石柱土家族自治县",
2787
+    "500241": "秀山土家族苗族自治县",
2788
+    "500242": "酉阳土家族苗族自治县",
2789
+    "500243": "彭水苗族土家族自治县"
2790
+  },
2791
+  "510000": {
2792
+    "510100": "成都市",
2793
+    "510300": "自贡市",
2794
+    "510400": "攀枝花市",
2795
+    "510500": "泸州市",
2796
+    "510600": "德阳市",
2797
+    "510700": "绵阳市",
2798
+    "510800": "广元市",
2799
+    "510900": "遂宁市",
2800
+    "511000": "内江市",
2801
+    "511100": "乐山市",
2802
+    "511300": "南充市",
2803
+    "511400": "眉山市",
2804
+    "511500": "宜宾市",
2805
+    "511600": "广安市",
2806
+    "511700": "达州市",
2807
+    "511800": "雅安市",
2808
+    "511900": "巴中市",
2809
+    "512000": "资阳市",
2810
+    "513200": "阿坝藏族羌族自治州",
2811
+    "513300": "甘孜藏族自治州",
2812
+    "513400": "凉山彝族自治州"
2813
+  },
2814
+  "510100": {
2815
+    "510104": "锦江区",
2816
+    "510105": "青羊区",
2817
+    "510106": "金牛区",
2818
+    "510107": "武侯区",
2819
+    "510108": "成华区",
2820
+    "510112": "龙泉驿区",
2821
+    "510113": "青白江区",
2822
+    "510114": "新都区",
2823
+    "510115": "温江区",
2824
+    "510116": "双流区",
2825
+    "510121": "金堂县",
2826
+    "510124": "郫县",
2827
+    "510129": "大邑县",
2828
+    "510131": "蒲江县",
2829
+    "510132": "新津县",
2830
+    "510181": "都江堰市",
2831
+    "510182": "彭州市",
2832
+    "510183": "邛崃市",
2833
+    "510184": "崇州市",
2834
+    "510185": "简阳市"
2835
+  },
2836
+  "510300": {
2837
+    "510302": "自流井区",
2838
+    "510303": "贡井区",
2839
+    "510304": "大安区",
2840
+    "510311": "沿滩区",
2841
+    "510321": "荣县",
2842
+    "510322": "富顺县"
2843
+  },
2844
+  "510400": {
2845
+    "510402": "东区",
2846
+    "510403": "西区",
2847
+    "510411": "仁和区",
2848
+    "510421": "米易县",
2849
+    "510422": "盐边县"
2850
+  },
2851
+  "510500": {
2852
+    "510502": "江阳区",
2853
+    "510503": "纳溪区",
2854
+    "510504": "龙马潭区",
2855
+    "510521": "泸县",
2856
+    "510522": "合江县",
2857
+    "510524": "叙永县",
2858
+    "510525": "古蔺县"
2859
+  },
2860
+  "510600": {
2861
+    "510603": "旌阳区",
2862
+    "510623": "中江县",
2863
+    "510626": "罗江县",
2864
+    "510681": "广汉市",
2865
+    "510682": "什邡市",
2866
+    "510683": "绵竹市"
2867
+  },
2868
+  "510700": {
2869
+    "510703": "涪城区",
2870
+    "510704": "游仙区",
2871
+    "510705": "安州区",
2872
+    "510722": "三台县",
2873
+    "510723": "盐亭县",
2874
+    "510725": "梓潼县",
2875
+    "510726": "北川羌族自治县",
2876
+    "510727": "平武县",
2877
+    "510781": "江油市"
2878
+  },
2879
+  "510800": {
2880
+    "510802": "利州区",
2881
+    "510811": "昭化区",
2882
+    "510812": "朝天区",
2883
+    "510821": "旺苍县",
2884
+    "510822": "青川县",
2885
+    "510823": "剑阁县",
2886
+    "510824": "苍溪县"
2887
+  },
2888
+  "510900": {
2889
+    "510903": "船山区",
2890
+    "510904": "安居区",
2891
+    "510921": "蓬溪县",
2892
+    "510922": "射洪县",
2893
+    "510923": "大英县"
2894
+  },
2895
+  "511000": {
2896
+    "511002": "市中区",
2897
+    "511011": "东兴区",
2898
+    "511024": "威远县",
2899
+    "511025": "资中县",
2900
+    "511028": "隆昌县"
2901
+  },
2902
+  "511100": {
2903
+    "511102": "市中区",
2904
+    "511111": "沙湾区",
2905
+    "511112": "五通桥区",
2906
+    "511113": "金口河区",
2907
+    "511123": "犍为县",
2908
+    "511124": "井研县",
2909
+    "511126": "夹江县",
2910
+    "511129": "沐川县",
2911
+    "511132": "峨边彝族自治县",
2912
+    "511133": "马边彝族自治县",
2913
+    "511181": "峨眉山市"
2914
+  },
2915
+  "511300": {
2916
+    "511302": "顺庆区",
2917
+    "511303": "高坪区",
2918
+    "511304": "嘉陵区",
2919
+    "511321": "南部县",
2920
+    "511322": "营山县",
2921
+    "511323": "蓬安县",
2922
+    "511324": "仪陇县",
2923
+    "511325": "西充县",
2924
+    "511381": "阆中市"
2925
+  },
2926
+  "511400": {
2927
+    "511402": "东坡区",
2928
+    "511403": "彭山区",
2929
+    "511421": "仁寿县",
2930
+    "511423": "洪雅县",
2931
+    "511424": "丹棱县",
2932
+    "511425": "青神县"
2933
+  },
2934
+  "511500": {
2935
+    "511502": "翠屏区",
2936
+    "511503": "南溪区",
2937
+    "511521": "宜宾县",
2938
+    "511523": "江安县",
2939
+    "511524": "长宁县",
2940
+    "511525": "高县",
2941
+    "511526": "珙县",
2942
+    "511527": "筠连县",
2943
+    "511528": "兴文县",
2944
+    "511529": "屏山县"
2945
+  },
2946
+  "511600": {
2947
+    "511602": "广安区",
2948
+    "511603": "前锋区",
2949
+    "511621": "岳池县",
2950
+    "511622": "武胜县",
2951
+    "511623": "邻水县",
2952
+    "511681": "华蓥市"
2953
+  },
2954
+  "511700": {
2955
+    "511702": "通川区",
2956
+    "511703": "达川区",
2957
+    "511722": "宣汉县",
2958
+    "511723": "开江县",
2959
+    "511724": "大竹县",
2960
+    "511725": "渠县",
2961
+    "511781": "万源市"
2962
+  },
2963
+  "511800": {
2964
+    "511802": "雨城区",
2965
+    "511803": "名山区",
2966
+    "511822": "荥经县",
2967
+    "511823": "汉源县",
2968
+    "511824": "石棉县",
2969
+    "511825": "天全县",
2970
+    "511826": "芦山县",
2971
+    "511827": "宝兴县"
2972
+  },
2973
+  "511900": {
2974
+    "511902": "巴州区",
2975
+    "511903": "恩阳区",
2976
+    "511921": "通江县",
2977
+    "511922": "南江县",
2978
+    "511923": "平昌县"
2979
+  },
2980
+  "512000": {
2981
+    "512002": "雁江区",
2982
+    "512021": "安岳县",
2983
+    "512022": "乐至县"
2984
+  },
2985
+  "513200": {
2986
+    "513201": "马尔康市",
2987
+    "513221": "汶川县",
2988
+    "513222": "理县",
2989
+    "513223": "茂县",
2990
+    "513224": "松潘县",
2991
+    "513225": "九寨沟县",
2992
+    "513226": "金川县",
2993
+    "513227": "小金县",
2994
+    "513228": "黑水县",
2995
+    "513230": "壤塘县",
2996
+    "513231": "阿坝县",
2997
+    "513232": "若尔盖县",
2998
+    "513233": "红原县"
2999
+  },
3000
+  "513300": {
3001
+    "513301": "康定市",
3002
+    "513322": "泸定县",
3003
+    "513323": "丹巴县",
3004
+    "513324": "九龙县",
3005
+    "513325": "雅江县",
3006
+    "513326": "道孚县",
3007
+    "513327": "炉霍县",
3008
+    "513328": "甘孜县",
3009
+    "513329": "新龙县",
3010
+    "513330": "德格县",
3011
+    "513331": "白玉县",
3012
+    "513332": "石渠县",
3013
+    "513333": "色达县",
3014
+    "513334": "理塘县",
3015
+    "513335": "巴塘县",
3016
+    "513336": "乡城县",
3017
+    "513337": "稻城县",
3018
+    "513338": "得荣县"
3019
+  },
3020
+  "513400": {
3021
+    "513401": "西昌市",
3022
+    "513422": "木里藏族自治县",
3023
+    "513423": "盐源县",
3024
+    "513424": "德昌县",
3025
+    "513425": "会理县",
3026
+    "513426": "会东县",
3027
+    "513427": "宁南县",
3028
+    "513428": "普格县",
3029
+    "513429": "布拖县",
3030
+    "513430": "金阳县",
3031
+    "513431": "昭觉县",
3032
+    "513432": "喜德县",
3033
+    "513433": "冕宁县",
3034
+    "513434": "越西县",
3035
+    "513435": "甘洛县",
3036
+    "513436": "美姑县",
3037
+    "513437": "雷波县"
3038
+  },
3039
+  "520000": {
3040
+    "520100": "贵阳市",
3041
+    "520200": "六盘水市",
3042
+    "520300": "遵义市",
3043
+    "520400": "安顺市",
3044
+    "520500": "毕节市",
3045
+    "520600": "铜仁市",
3046
+    "522300": "黔西南布依族苗族自治州",
3047
+    "522600": "黔东南苗族侗族自治州",
3048
+    "522700": "黔南布依族苗族自治州"
3049
+  },
3050
+  "520100": {
3051
+    "520102": "南明区",
3052
+    "520103": "云岩区",
3053
+    "520111": "花溪区",
3054
+    "520112": "乌当区",
3055
+    "520113": "白云区",
3056
+    "520115": "观山湖区",
3057
+    "520121": "开阳县",
3058
+    "520122": "息烽县",
3059
+    "520123": "修文县",
3060
+    "520181": "清镇市"
3061
+  },
3062
+  "520200": {
3063
+    "520201": "钟山区",
3064
+    "520203": "六枝特区",
3065
+    "520221": "水城县",
3066
+    "520222": "盘县"
3067
+  },
3068
+  "520300": {
3069
+    "520302": "红花岗区",
3070
+    "520303": "汇川区",
3071
+    "520304": "播州区",
3072
+    "520322": "桐梓县",
3073
+    "520323": "绥阳县",
3074
+    "520324": "正安县",
3075
+    "520325": "道真仡佬族苗族自治县",
3076
+    "520326": "务川仡佬族苗族自治县",
3077
+    "520327": "凤冈县",
3078
+    "520328": "湄潭县",
3079
+    "520329": "余庆县",
3080
+    "520330": "习水县",
3081
+    "520381": "赤水市",
3082
+    "520382": "仁怀市"
3083
+  },
3084
+  "520400": {
3085
+    "520402": "西秀区",
3086
+    "520403": "平坝区",
3087
+    "520422": "普定县",
3088
+    "520423": "镇宁布依族苗族自治县",
3089
+    "520424": "关岭布依族苗族自治县",
3090
+    "520425": "紫云苗族布依族自治县"
3091
+  },
3092
+  "520500": {
3093
+    "520502": "七星关区",
3094
+    "520521": "大方县",
3095
+    "520522": "黔西县",
3096
+    "520523": "金沙县",
3097
+    "520524": "织金县",
3098
+    "520525": "纳雍县",
3099
+    "520526": "威宁彝族回族苗族自治县",
3100
+    "520527": "赫章县"
3101
+  },
3102
+  "520600": {
3103
+    "520602": "碧江区",
3104
+    "520603": "万山区",
3105
+    "520621": "江口县",
3106
+    "520622": "玉屏侗族自治县",
3107
+    "520623": "石阡县",
3108
+    "520624": "思南县",
3109
+    "520625": "印江土家族苗族自治县",
3110
+    "520626": "德江县",
3111
+    "520627": "沿河土家族自治县",
3112
+    "520628": "松桃苗族自治县"
3113
+  },
3114
+  "522300": {
3115
+    "522301": "兴义市",
3116
+    "522322": "兴仁县",
3117
+    "522323": "普安县",
3118
+    "522324": "晴隆县",
3119
+    "522325": "贞丰县",
3120
+    "522326": "望谟县",
3121
+    "522327": "册亨县",
3122
+    "522328": "安龙县"
3123
+  },
3124
+  "522600": {
3125
+    "522601": "凯里市",
3126
+    "522622": "黄平县",
3127
+    "522623": "施秉县",
3128
+    "522624": "三穗县",
3129
+    "522625": "镇远县",
3130
+    "522626": "岑巩县",
3131
+    "522627": "天柱县",
3132
+    "522628": "锦屏县",
3133
+    "522629": "剑河县",
3134
+    "522630": "台江县",
3135
+    "522631": "黎平县",
3136
+    "522632": "榕江县",
3137
+    "522633": "从江县",
3138
+    "522634": "雷山县",
3139
+    "522635": "麻江县",
3140
+    "522636": "丹寨县"
3141
+  },
3142
+  "522700": {
3143
+    "522701": "都匀市",
3144
+    "522702": "福泉市",
3145
+    "522722": "荔波县",
3146
+    "522723": "贵定县",
3147
+    "522725": "瓮安县",
3148
+    "522726": "独山县",
3149
+    "522727": "平塘县",
3150
+    "522728": "罗甸县",
3151
+    "522729": "长顺县",
3152
+    "522730": "龙里县",
3153
+    "522731": "惠水县",
3154
+    "522732": "三都水族自治县"
3155
+  },
3156
+  "530000": {
3157
+    "530100": "昆明市",
3158
+    "530300": "曲靖市",
3159
+    "530400": "玉溪市",
3160
+    "530500": "保山市",
3161
+    "530600": "昭通市",
3162
+    "530700": "丽江市",
3163
+    "530800": "普洱市",
3164
+    "530900": "临沧市",
3165
+    "532300": "楚雄彝族自治州",
3166
+    "532500": "红河哈尼族彝族自治州",
3167
+    "532600": "文山壮族苗族自治州",
3168
+    "532800": "西双版纳傣族自治州",
3169
+    "532900": "大理白族自治州",
3170
+    "533100": "德宏傣族景颇族自治州",
3171
+    "533300": "怒江傈僳族自治州",
3172
+    "533400": "迪庆藏族自治州"
3173
+  },
3174
+  "530100": {
3175
+    "530102": "五华区",
3176
+    "530103": "盘龙区",
3177
+    "530111": "官渡区",
3178
+    "530112": "西山区",
3179
+    "530113": "东川区",
3180
+    "530114": "呈贡区",
3181
+    "530122": "晋宁县",
3182
+    "530124": "富民县",
3183
+    "530125": "宜良县",
3184
+    "530126": "石林彝族自治县",
3185
+    "530127": "嵩明县",
3186
+    "530128": "禄劝彝族苗族自治县",
3187
+    "530129": "寻甸回族彝族自治县",
3188
+    "530181": "安宁市"
3189
+  },
3190
+  "530300": {
3191
+    "530302": "麒麟区",
3192
+    "530303": "沾益区",
3193
+    "530321": "马龙县",
3194
+    "530322": "陆良县",
3195
+    "530323": "师宗县",
3196
+    "530324": "罗平县",
3197
+    "530325": "富源县",
3198
+    "530326": "会泽县",
3199
+    "530381": "宣威市"
3200
+  },
3201
+  "530400": {
3202
+    "530402": "红塔区",
3203
+    "530403": "江川区",
3204
+    "530422": "澄江县",
3205
+    "530423": "通海县",
3206
+    "530424": "华宁县",
3207
+    "530425": "易门县",
3208
+    "530426": "峨山彝族自治县",
3209
+    "530427": "新平彝族傣族自治县",
3210
+    "530428": "元江哈尼族彝族傣族自治县"
3211
+  },
3212
+  "530500": {
3213
+    "530502": "隆阳区",
3214
+    "530521": "施甸县",
3215
+    "530523": "龙陵县",
3216
+    "530524": "昌宁县",
3217
+    "530581": "腾冲市"
3218
+  },
3219
+  "530600": {
3220
+    "530602": "昭阳区",
3221
+    "530621": "鲁甸县",
3222
+    "530622": "巧家县",
3223
+    "530623": "盐津县",
3224
+    "530624": "大关县",
3225
+    "530625": "永善县",
3226
+    "530626": "绥江县",
3227
+    "530627": "镇雄县",
3228
+    "530628": "彝良县",
3229
+    "530629": "威信县",
3230
+    "530630": "水富县"
3231
+  },
3232
+  "530700": {
3233
+    "530702": "古城区",
3234
+    "530721": "玉龙纳西族自治县",
3235
+    "530722": "永胜县",
3236
+    "530723": "华坪县",
3237
+    "530724": "宁蒗彝族自治县"
3238
+  },
3239
+  "530800": {
3240
+    "530802": "思茅区",
3241
+    "530821": "宁洱哈尼族彝族自治县",
3242
+    "530822": "墨江哈尼族自治县",
3243
+    "530823": "景东彝族自治县",
3244
+    "530824": "景谷傣族彝族自治县",
3245
+    "530825": "镇沅彝族哈尼族拉祜族自治县",
3246
+    "530826": "江城哈尼族彝族自治县",
3247
+    "530827": "孟连傣族拉祜族佤族自治县",
3248
+    "530828": "澜沧拉祜族自治县",
3249
+    "530829": "西盟佤族自治县"
3250
+  },
3251
+  "530900": {
3252
+    "530902": "临翔区",
3253
+    "530921": "凤庆县",
3254
+    "530922": "云县",
3255
+    "530923": "永德县",
3256
+    "530924": "镇康县",
3257
+    "530925": "双江拉祜族佤族布朗族傣族自治县",
3258
+    "530926": "耿马傣族佤族自治县",
3259
+    "530927": "沧源佤族自治县"
3260
+  },
3261
+  "532300": {
3262
+    "532301": "楚雄市",
3263
+    "532322": "双柏县",
3264
+    "532323": "牟定县",
3265
+    "532324": "南华县",
3266
+    "532325": "姚安县",
3267
+    "532326": "大姚县",
3268
+    "532327": "永仁县",
3269
+    "532328": "元谋县",
3270
+    "532329": "武定县",
3271
+    "532331": "禄丰县"
3272
+  },
3273
+  "532500": {
3274
+    "532501": "个旧市",
3275
+    "532502": "开远市",
3276
+    "532503": "蒙自市",
3277
+    "532504": "弥勒市",
3278
+    "532523": "屏边苗族自治县",
3279
+    "532524": "建水县",
3280
+    "532525": "石屏县",
3281
+    "532527": "泸西县",
3282
+    "532528": "元阳县",
3283
+    "532529": "红河县",
3284
+    "532530": "金平苗族瑶族傣族自治县",
3285
+    "532531": "绿春县",
3286
+    "532532": "河口瑶族自治县"
3287
+  },
3288
+  "532600": {
3289
+    "532601": "文山市",
3290
+    "532622": "砚山县",
3291
+    "532623": "西畴县",
3292
+    "532624": "麻栗坡县",
3293
+    "532625": "马关县",
3294
+    "532626": "丘北县",
3295
+    "532627": "广南县",
3296
+    "532628": "富宁县"
3297
+  },
3298
+  "532800": {
3299
+    "532801": "景洪市",
3300
+    "532822": "勐海县",
3301
+    "532823": "勐腊县"
3302
+  },
3303
+  "532900": {
3304
+    "532901": "大理市",
3305
+    "532922": "漾濞彝族自治县",
3306
+    "532923": "祥云县",
3307
+    "532924": "宾川县",
3308
+    "532925": "弥渡县",
3309
+    "532926": "南涧彝族自治县",
3310
+    "532927": "巍山彝族回族自治县",
3311
+    "532928": "永平县",
3312
+    "532929": "云龙县",
3313
+    "532930": "洱源县",
3314
+    "532931": "剑川县",
3315
+    "532932": "鹤庆县"
3316
+  },
3317
+  "533100": {
3318
+    "533102": "瑞丽市",
3319
+    "533103": "芒市",
3320
+    "533122": "梁河县",
3321
+    "533123": "盈江县",
3322
+    "533124": "陇川县"
3323
+  },
3324
+  "533300": {
3325
+    "533301": "泸水市",
3326
+    "533323": "福贡县",
3327
+    "533324": "贡山独龙族怒族自治县",
3328
+    "533325": "兰坪白族普米族自治县"
3329
+  },
3330
+  "533400": {
3331
+    "533401": "香格里拉市",
3332
+    "533422": "德钦县",
3333
+    "533423": "维西傈僳族自治县"
3334
+  },
3335
+  "540000": {
3336
+    "540100": "拉萨市",
3337
+    "540200": "日喀则市",
3338
+    "540300": "昌都市",
3339
+    "540400": "林芝市",
3340
+    "540500": "山南市",
3341
+    "542400": "那曲地区",
3342
+    "542500": "阿里地区"
3343
+  },
3344
+  "540100": {
3345
+    "540102": "城关区",
3346
+    "540103": "堆龙德庆区",
3347
+    "540121": "林周县",
3348
+    "540122": "当雄县",
3349
+    "540123": "尼木县",
3350
+    "540124": "曲水县",
3351
+    "540126": "达孜县",
3352
+    "540127": "墨竹工卡县"
3353
+  },
3354
+  "540200": {
3355
+    "540202": "桑珠孜区",
3356
+    "540221": "南木林县",
3357
+    "540222": "江孜县",
3358
+    "540223": "定日县",
3359
+    "540224": "萨迦县",
3360
+    "540225": "拉孜县",
3361
+    "540226": "昂仁县",
3362
+    "540227": "谢通门县",
3363
+    "540228": "白朗县",
3364
+    "540229": "仁布县",
3365
+    "540230": "康马县",
3366
+    "540231": "定结县",
3367
+    "540232": "仲巴县",
3368
+    "540233": "亚东县",
3369
+    "540234": "吉隆县",
3370
+    "540235": "聂拉木县",
3371
+    "540236": "萨嘎县",
3372
+    "540237": "岗巴县"
3373
+  },
3374
+  "540300": {
3375
+    "540302": "卡若区",
3376
+    "540321": "江达县",
3377
+    "540322": "贡觉县",
3378
+    "540323": "类乌齐县",
3379
+    "540324": "丁青县",
3380
+    "540325": "察雅县",
3381
+    "540326": "八宿县",
3382
+    "540327": "左贡县",
3383
+    "540328": "芒康县",
3384
+    "540329": "洛隆县",
3385
+    "540330": "边坝县"
3386
+  },
3387
+  "540400": {
3388
+    "540402": "巴宜区",
3389
+    "540421": "工布江达县",
3390
+    "540422": "米林县",
3391
+    "540423": "墨脱县",
3392
+    "540424": "波密县",
3393
+    "540425": "察隅县",
3394
+    "540426": "朗县"
3395
+  },
3396
+  "540500": {
3397
+    "540502": "乃东区",
3398
+    "540521": "扎囊县",
3399
+    "540522": "贡嘎县",
3400
+    "540523": "桑日县",
3401
+    "540524": "琼结县",
3402
+    "540525": "曲松县",
3403
+    "540526": "措美县",
3404
+    "540527": "洛扎县",
3405
+    "540528": "加查县",
3406
+    "540529": "隆子县",
3407
+    "540530": "错那县",
3408
+    "540531": "浪卡子县"
3409
+  },
3410
+  "542400": {
3411
+    "542421": "那曲县",
3412
+    "542422": "嘉黎县",
3413
+    "542423": "比如县",
3414
+    "542424": "聂荣县",
3415
+    "542425": "安多县",
3416
+    "542426": "申扎县",
3417
+    "542427": "索县",
3418
+    "542428": "班戈县",
3419
+    "542429": "巴青县",
3420
+    "542430": "尼玛县",
3421
+    "542431": "双湖县"
3422
+  },
3423
+  "542500": {
3424
+    "542521": "普兰县",
3425
+    "542522": "札达县",
3426
+    "542523": "噶尔县",
3427
+    "542524": "日土县",
3428
+    "542525": "革吉县",
3429
+    "542526": "改则县",
3430
+    "542527": "措勤县"
3431
+  },
3432
+  "610000": {
3433
+    "610100": "西安市",
3434
+    "610200": "铜川市",
3435
+    "610300": "宝鸡市",
3436
+    "610400": "咸阳市",
3437
+    "610500": "渭南市",
3438
+    "610600": "延安市",
3439
+    "610700": "汉中市",
3440
+    "610800": "榆林市",
3441
+    "610900": "安康市",
3442
+    "611000": "商洛市"
3443
+  },
3444
+  "610100": {
3445
+    "610102": "新城区",
3446
+    "610103": "碑林区",
3447
+    "610104": "莲湖区",
3448
+    "610111": "灞桥区",
3449
+    "610112": "未央区",
3450
+    "610113": "雁塔区",
3451
+    "610114": "阎良区",
3452
+    "610115": "临潼区",
3453
+    "610116": "长安区",
3454
+    "610117": "高陵区",
3455
+    "610122": "蓝田县",
3456
+    "610124": "周至县",
3457
+    "610125": "户县"
3458
+  },
3459
+  "610200": {
3460
+    "610202": "王益区",
3461
+    "610203": "印台区",
3462
+    "610204": "耀州区",
3463
+    "610222": "宜君县"
3464
+  },
3465
+  "610300": {
3466
+    "610302": "渭滨区",
3467
+    "610303": "金台区",
3468
+    "610304": "陈仓区",
3469
+    "610322": "凤翔县",
3470
+    "610323": "岐山县",
3471
+    "610324": "扶风县",
3472
+    "610326": "眉县",
3473
+    "610327": "陇县",
3474
+    "610328": "千阳县",
3475
+    "610329": "麟游县",
3476
+    "610330": "凤县",
3477
+    "610331": "太白县"
3478
+  },
3479
+  "610400": {
3480
+    "610402": "秦都区",
3481
+    "610403": "杨陵区",
3482
+    "610404": "渭城区",
3483
+    "610422": "三原县",
3484
+    "610423": "泾阳县",
3485
+    "610424": "乾县",
3486
+    "610425": "礼泉县",
3487
+    "610426": "永寿县",
3488
+    "610427": "彬县",
3489
+    "610428": "长武县",
3490
+    "610429": "旬邑县",
3491
+    "610430": "淳化县",
3492
+    "610431": "武功县",
3493
+    "610481": "兴平市"
3494
+  },
3495
+  "610500": {
3496
+    "610502": "临渭区",
3497
+    "610503": "华州区",
3498
+    "610522": "潼关县",
3499
+    "610523": "大荔县",
3500
+    "610524": "合阳县",
3501
+    "610525": "澄城县",
3502
+    "610526": "蒲城县",
3503
+    "610527": "白水县",
3504
+    "610528": "富平县",
3505
+    "610581": "韩城市",
3506
+    "610582": "华阴市"
3507
+  },
3508
+  "610600": {
3509
+    "610602": "宝塔区",
3510
+    "610603": "安塞区",
3511
+    "610621": "延长县",
3512
+    "610622": "延川县",
3513
+    "610623": "子长县",
3514
+    "610625": "志丹县",
3515
+    "610626": "吴起县",
3516
+    "610627": "甘泉县",
3517
+    "610628": "富县",
3518
+    "610629": "洛川县",
3519
+    "610630": "宜川县",
3520
+    "610631": "黄龙县",
3521
+    "610632": "黄陵县"
3522
+  },
3523
+  "610700": {
3524
+    "610702": "汉台区",
3525
+    "610721": "南郑县",
3526
+    "610722": "城固县",
3527
+    "610723": "洋县",
3528
+    "610724": "西乡县",
3529
+    "610725": "勉县",
3530
+    "610726": "宁强县",
3531
+    "610727": "略阳县",
3532
+    "610728": "镇巴县",
3533
+    "610729": "留坝县",
3534
+    "610730": "佛坪县"
3535
+  },
3536
+  "610800": {
3537
+    "610802": "榆阳区",
3538
+    "610803": "横山区",
3539
+    "610821": "神木县",
3540
+    "610822": "府谷县",
3541
+    "610824": "靖边县",
3542
+    "610825": "定边县",
3543
+    "610826": "绥德县",
3544
+    "610827": "米脂县",
3545
+    "610828": "佳县",
3546
+    "610829": "吴堡县",
3547
+    "610830": "清涧县",
3548
+    "610831": "子洲县"
3549
+  },
3550
+  "610900": {
3551
+    "610902": "汉滨区",
3552
+    "610921": "汉阴县",
3553
+    "610922": "石泉县",
3554
+    "610923": "宁陕县",
3555
+    "610924": "紫阳县",
3556
+    "610925": "岚皋县",
3557
+    "610926": "平利县",
3558
+    "610927": "镇坪县",
3559
+    "610928": "旬阳县",
3560
+    "610929": "白河县"
3561
+  },
3562
+  "611000": {
3563
+    "611002": "商州区",
3564
+    "611021": "洛南县",
3565
+    "611022": "丹凤县",
3566
+    "611023": "商南县",
3567
+    "611024": "山阳县",
3568
+    "611025": "镇安县",
3569
+    "611026": "柞水县"
3570
+  },
3571
+  "620000": {
3572
+    "620100": "兰州市",
3573
+    "620200": "嘉峪关市",
3574
+    "620300": "金昌市",
3575
+    "620400": "白银市",
3576
+    "620500": "天水市",
3577
+    "620600": "武威市",
3578
+    "620700": "张掖市",
3579
+    "620800": "平凉市",
3580
+    "620900": "酒泉市",
3581
+    "621000": "庆阳市",
3582
+    "621100": "定西市",
3583
+    "621200": "陇南市",
3584
+    "622900": "临夏回族自治州",
3585
+    "623000": "甘南藏族自治州"
3586
+  },
3587
+  "620100": {
3588
+    "620102": "城关区",
3589
+    "620103": "七里河区",
3590
+    "620104": "西固区",
3591
+    "620105": "安宁区",
3592
+    "620111": "红古区",
3593
+    "620121": "永登县",
3594
+    "620122": "皋兰县",
3595
+    "620123": "榆中县"
3596
+  },
3597
+  "620300": {
3598
+    "620302": "金川区",
3599
+    "620321": "永昌县"
3600
+  },
3601
+  "620400": {
3602
+    "620402": "白银区",
3603
+    "620403": "平川区",
3604
+    "620421": "靖远县",
3605
+    "620422": "会宁县",
3606
+    "620423": "景泰县"
3607
+  },
3608
+  "620500": {
3609
+    "620502": "秦州区",
3610
+    "620503": "麦积区",
3611
+    "620521": "清水县",
3612
+    "620522": "秦安县",
3613
+    "620523": "甘谷县",
3614
+    "620524": "武山县",
3615
+    "620525": "张家川回族自治县"
3616
+  },
3617
+  "620600": {
3618
+    "620602": "凉州区",
3619
+    "620621": "民勤县",
3620
+    "620622": "古浪县",
3621
+    "620623": "天祝藏族自治县"
3622
+  },
3623
+  "620700": {
3624
+    "620702": "甘州区",
3625
+    "620721": "肃南裕固族自治县",
3626
+    "620722": "民乐县",
3627
+    "620723": "临泽县",
3628
+    "620724": "高台县",
3629
+    "620725": "山丹县"
3630
+  },
3631
+  "620800": {
3632
+    "620802": "崆峒区",
3633
+    "620821": "泾川县",
3634
+    "620822": "灵台县",
3635
+    "620823": "崇信县",
3636
+    "620824": "华亭县",
3637
+    "620825": "庄浪县",
3638
+    "620826": "静宁县"
3639
+  },
3640
+  "620900": {
3641
+    "620902": "肃州区",
3642
+    "620921": "金塔县",
3643
+    "620922": "瓜州县",
3644
+    "620923": "肃北蒙古族自治县",
3645
+    "620924": "阿克塞哈萨克族自治县",
3646
+    "620981": "玉门市",
3647
+    "620982": "敦煌市"
3648
+  },
3649
+  "621000": {
3650
+    "621002": "西峰区",
3651
+    "621021": "庆城县",
3652
+    "621022": "环县",
3653
+    "621023": "华池县",
3654
+    "621024": "合水县",
3655
+    "621025": "正宁县",
3656
+    "621026": "宁县",
3657
+    "621027": "镇原县"
3658
+  },
3659
+  "621100": {
3660
+    "621102": "安定区",
3661
+    "621121": "通渭县",
3662
+    "621122": "陇西县",
3663
+    "621123": "渭源县",
3664
+    "621124": "临洮县",
3665
+    "621125": "漳县",
3666
+    "621126": "岷县"
3667
+  },
3668
+  "621200": {
3669
+    "621202": "武都区",
3670
+    "621221": "成县",
3671
+    "621222": "文县",
3672
+    "621223": "宕昌县",
3673
+    "621224": "康县",
3674
+    "621225": "西和县",
3675
+    "621226": "礼县",
3676
+    "621227": "徽县",
3677
+    "621228": "两当县"
3678
+  },
3679
+  "622900": {
3680
+    "622901": "临夏市",
3681
+    "622921": "临夏县",
3682
+    "622922": "康乐县",
3683
+    "622923": "永靖县",
3684
+    "622924": "广河县",
3685
+    "622925": "和政县",
3686
+    "622926": "东乡族自治县",
3687
+    "622927": "积石山保安族东乡族撒拉族自治县"
3688
+  },
3689
+  "623000": {
3690
+    "623001": "合作市",
3691
+    "623021": "临潭县",
3692
+    "623022": "卓尼县",
3693
+    "623023": "舟曲县",
3694
+    "623024": "迭部县",
3695
+    "623025": "玛曲县",
3696
+    "623026": "碌曲县",
3697
+    "623027": "夏河县"
3698
+  },
3699
+  "630000": {
3700
+    "630100": "西宁市",
3701
+    "630200": "海东市",
3702
+    "632200": "海北藏族自治州",
3703
+    "632300": "黄南藏族自治州",
3704
+    "632500": "海南藏族自治州",
3705
+    "632600": "果洛藏族自治州",
3706
+    "632700": "玉树藏族自治州",
3707
+    "632800": "海西蒙古族藏族自治州"
3708
+  },
3709
+  "630100": {
3710
+    "630102": "城东区",
3711
+    "630103": "城中区",
3712
+    "630104": "城西区",
3713
+    "630105": "城北区",
3714
+    "630121": "大通回族土族自治县",
3715
+    "630122": "湟中县",
3716
+    "630123": "湟源县"
3717
+  },
3718
+  "630200": {
3719
+    "630202": "乐都区",
3720
+    "630203": "平安区",
3721
+    "630222": "民和回族土族自治县",
3722
+    "630223": "互助土族自治县",
3723
+    "630224": "化隆回族自治县",
3724
+    "630225": "循化撒拉族自治县"
3725
+  },
3726
+  "632200": {
3727
+    "632221": "门源回族自治县",
3728
+    "632222": "祁连县",
3729
+    "632223": "海晏县",
3730
+    "632224": "刚察县"
3731
+  },
3732
+  "632300": {
3733
+    "632321": "同仁县",
3734
+    "632322": "尖扎县",
3735
+    "632323": "泽库县",
3736
+    "632324": "河南蒙古族自治县"
3737
+  },
3738
+  "632500": {
3739
+    "632521": "共和县",
3740
+    "632522": "同德县",
3741
+    "632523": "贵德县",
3742
+    "632524": "兴海县",
3743
+    "632525": "贵南县"
3744
+  },
3745
+  "632600": {
3746
+    "632621": "玛沁县",
3747
+    "632622": "班玛县",
3748
+    "632623": "甘德县",
3749
+    "632624": "达日县",
3750
+    "632625": "久治县",
3751
+    "632626": "玛多县"
3752
+  },
3753
+  "632700": {
3754
+    "632701": "玉树市",
3755
+    "632722": "杂多县",
3756
+    "632723": "称多县",
3757
+    "632724": "治多县",
3758
+    "632725": "囊谦县",
3759
+    "632726": "曲麻莱县"
3760
+  },
3761
+  "632800": {
3762
+    "632801": "格尔木市",
3763
+    "632802": "德令哈市",
3764
+    "632821": "乌兰县",
3765
+    "632822": "都兰县",
3766
+    "632823": "天峻县"
3767
+  },
3768
+  "640000": {
3769
+    "640100": "银川市",
3770
+    "640200": "石嘴山市",
3771
+    "640300": "吴忠市",
3772
+    "640400": "固原市",
3773
+    "640500": "中卫市"
3774
+  },
3775
+  "640100": {
3776
+    "640104": "兴庆区",
3777
+    "640105": "西夏区",
3778
+    "640106": "金凤区",
3779
+    "640121": "永宁县",
3780
+    "640122": "贺兰县",
3781
+    "640181": "灵武市"
3782
+  },
3783
+  "640200": {
3784
+    "640202": "大武口区",
3785
+    "640205": "惠农区",
3786
+    "640221": "平罗县"
3787
+  },
3788
+  "640300": {
3789
+    "640302": "利通区",
3790
+    "640303": "红寺堡区",
3791
+    "640323": "盐池县",
3792
+    "640324": "同心县",
3793
+    "640381": "青铜峡市"
3794
+  },
3795
+  "640400": {
3796
+    "640402": "原州区",
3797
+    "640422": "西吉县",
3798
+    "640423": "隆德县",
3799
+    "640424": "泾源县",
3800
+    "640425": "彭阳县"
3801
+  },
3802
+  "640500": {
3803
+    "640502": "沙坡头区",
3804
+    "640521": "中宁县",
3805
+    "640522": "海原县"
3806
+  },
3807
+  "650000": {
3808
+    "650100": "乌鲁木齐市",
3809
+    "650200": "克拉玛依市",
3810
+    "650400": "吐鲁番市",
3811
+    "650500": "哈密市",
3812
+    "652300": "昌吉回族自治州",
3813
+    "652700": "博尔塔拉蒙古自治州",
3814
+    "652800": "巴音郭楞蒙古自治州",
3815
+    "652900": "阿克苏地区",
3816
+    "653000": "克孜勒苏柯尔克孜自治州",
3817
+    "653100": "喀什地区",
3818
+    "653200": "和田地区",
3819
+    "654000": "伊犁哈萨克自治州",
3820
+    "654200": "塔城地区",
3821
+    "654300": "阿勒泰地区",
3822
+    "659001": "石河子市",
3823
+    "659002": "阿拉尔市",
3824
+    "659003": "图木舒克市",
3825
+    "659004": "五家渠市",
3826
+    "659006": "铁门关市"
3827
+  },
3828
+  "650100": {
3829
+    "650102": "天山区",
3830
+    "650103": "沙依巴克区",
3831
+    "650104": "新市区",
3832
+    "650105": "水磨沟区",
3833
+    "650106": "头屯河区",
3834
+    "650107": "达坂城区",
3835
+    "650109": "米东区",
3836
+    "650121": "乌鲁木齐县"
3837
+  },
3838
+  "650200": {
3839
+    "650202": "独山子区",
3840
+    "650203": "克拉玛依区",
3841
+    "650204": "白碱滩区",
3842
+    "650205": "乌尔禾区"
3843
+  },
3844
+  "650400": {
3845
+    "650402": "高昌区",
3846
+    "650421": "鄯善县",
3847
+    "650422": "托克逊县"
3848
+  },
3849
+  "650500": {
3850
+    "650502": "伊州区",
3851
+    "650521": "巴里坤哈萨克自治县",
3852
+    "650522": "伊吾县"
3853
+  },
3854
+  "652300": {
3855
+    "652301": "昌吉市",
3856
+    "652302": "阜康市",
3857
+    "652323": "呼图壁县",
3858
+    "652324": "玛纳斯县",
3859
+    "652325": "奇台县",
3860
+    "652327": "吉木萨尔县",
3861
+    "652328": "木垒哈萨克自治县"
3862
+  },
3863
+  "652700": {
3864
+    "652701": "博乐市",
3865
+    "652702": "阿拉山口市",
3866
+    "652722": "精河县",
3867
+    "652723": "温泉县"
3868
+  },
3869
+  "652800": {
3870
+    "652801": "库尔勒市",
3871
+    "652822": "轮台县",
3872
+    "652823": "尉犁县",
3873
+    "652824": "若羌县",
3874
+    "652825": "且末县",
3875
+    "652826": "焉耆回族自治县",
3876
+    "652827": "和静县",
3877
+    "652828": "和硕县",
3878
+    "652829": "博湖县"
3879
+  },
3880
+  "652900": {
3881
+    "652901": "阿克苏市",
3882
+    "652922": "温宿县",
3883
+    "652923": "库车县",
3884
+    "652924": "沙雅县",
3885
+    "652925": "新和县",
3886
+    "652926": "拜城县",
3887
+    "652927": "乌什县",
3888
+    "652928": "阿瓦提县",
3889
+    "652929": "柯坪县"
3890
+  },
3891
+  "653000": {
3892
+    "653001": "阿图什市",
3893
+    "653022": "阿克陶县",
3894
+    "653023": "阿合奇县",
3895
+    "653024": "乌恰县"
3896
+  },
3897
+  "653100": {
3898
+    "653101": "喀什市",
3899
+    "653121": "疏附县",
3900
+    "653122": "疏勒县",
3901
+    "653123": "英吉沙县",
3902
+    "653124": "泽普县",
3903
+    "653125": "莎车县",
3904
+    "653126": "叶城县",
3905
+    "653127": "麦盖提县",
3906
+    "653128": "岳普湖县",
3907
+    "653129": "伽师县",
3908
+    "653130": "巴楚县",
3909
+    "653131": "塔什库尔干塔吉克自治县"
3910
+  },
3911
+  "653200": {
3912
+    "653201": "和田市",
3913
+    "653221": "和田县",
3914
+    "653222": "墨玉县",
3915
+    "653223": "皮山县",
3916
+    "653224": "洛浦县",
3917
+    "653225": "策勒县",
3918
+    "653226": "于田县",
3919
+    "653227": "民丰县"
3920
+  },
3921
+  "654000": {
3922
+    "654002": "伊宁市",
3923
+    "654003": "奎屯市",
3924
+    "654004": "霍尔果斯市",
3925
+    "654021": "伊宁县",
3926
+    "654022": "察布查尔锡伯自治县",
3927
+    "654023": "霍城县",
3928
+    "654024": "巩留县",
3929
+    "654025": "新源县",
3930
+    "654026": "昭苏县",
3931
+    "654027": "特克斯县",
3932
+    "654028": "尼勒克县"
3933
+  },
3934
+  "654200": {
3935
+    "654201": "塔城市",
3936
+    "654202": "乌苏市",
3937
+    "654221": "额敏县",
3938
+    "654223": "沙湾县",
3939
+    "654224": "托里县",
3940
+    "654225": "裕民县",
3941
+    "654226": "和布克赛尔蒙古自治县"
3942
+  },
3943
+  "654300": {
3944
+    "654301": "阿勒泰市",
3945
+    "654321": "布尔津县",
3946
+    "654322": "富蕴县",
3947
+    "654323": "福海县",
3948
+    "654324": "哈巴河县",
3949
+    "654325": "青河县",
3950
+    "654326": "吉木乃县"
3951
+  },
3952
+  "810000": {
3953
+    "810001": "中西區",
3954
+    "810002": "灣仔區",
3955
+    "810003": "東區",
3956
+    "810004": "南區",
3957
+    "810005": "油尖旺區",
3958
+    "810006": "深水埗區",
3959
+    "810007": "九龍城區",
3960
+    "810008": "黃大仙區",
3961
+    "810009": "觀塘區",
3962
+    "810010": "荃灣區",
3963
+    "810011": "屯門區",
3964
+    "810012": "元朗區",
3965
+    "810013": "北區",
3966
+    "810014": "大埔區",
3967
+    "810015": "西貢區",
3968
+    "810016": "沙田區",
3969
+    "810017": "葵青區",
3970
+    "810018": "離島區"
3971
+  },
3972
+  "820000": {
3973
+    "820001": "花地瑪堂區",
3974
+    "820002": "花王堂區",
3975
+    "820003": "望德堂區",
3976
+    "820004": "大堂區",
3977
+    "820005": "風順堂區",
3978
+    "820006": "嘉模堂區",
3979
+    "820007": "路氹填海區",
3980
+    "820008": "聖方濟各堂區"
3981
+  }
3982
+}

+ 7 - 0
data/tests.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.test import TestCase
5
+
6
+
7
+# Create your tests here.

+ 7 - 0
data/views.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.shortcuts import render
5
+
6
+
7
+# Create your views here.

+ 0 - 0
docs/COMMANDS.md


+ 2 - 0
docs/CRONTAB.md

@@ -0,0 +1,2 @@
1
+# 定时任务
2
+# m h  dom mon dow   command

+ 3 - 0
isort.sh

@@ -0,0 +1,3 @@
1
+#!/bin/bash
2
+
3
+isort .

+ 23 - 0
manage.py

@@ -0,0 +1,23 @@
1
+#!/usr/bin/env python
2
+import os
3
+import sys
4
+
5
+
6
+if __name__ == "__main__":
7
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tiwen.settings")
8
+    try:
9
+        from django.core.management import execute_from_command_line
10
+    except ImportError:
11
+        # The above import may fail for some other reason. Ensure that the
12
+        # issue is really that Django is missing to avoid masking other
13
+        # exceptions on Python 2.
14
+        try:
15
+            import django
16
+        except ImportError:
17
+            raise ImportError(
18
+                "Couldn't import Django. Are you sure it's installed and "
19
+                "available on your PYTHONPATH environment variable? Did you "
20
+                "forget to activate a virtual environment?"
21
+            )
22
+        raise
23
+    execute_from_command_line(sys.argv)

+ 10 - 0
pep8.sh

@@ -0,0 +1,10 @@
1
+#!/bin/bash
2
+
3
+# Ignoring autogenerated files
4
+#  -- Migration directories
5
+# Ignoring error codes
6
+#  -- E128 continuation line under-indented for visual indent
7
+#  -- E402 module level import not at top of file
8
+#  -- E501 line too long
9
+
10
+pycodestyle --exclude=build,migrations,.tox --ignore=E128,E402,E501 .

+ 8 - 0
requirements.txt

@@ -0,0 +1,8 @@
1
+StatusCode==1.0.0
2
+furl==2.1.3
3
+jsonfield==3.1.0
4
+mysqlclient==2.1.1
5
+rlog==0.3
6
+-r requirements_dj.txt
7
+-r requirements_pywe.txt
8
+-r requirements_redis.txt

+ 3 - 0
requirements_deploy.txt

@@ -0,0 +1,3 @@
1
+ipdb==0.13.9
2
+ipython==7.34.0
3
+uwsgi==2.0.20

+ 2 - 0
requirements_dev.txt

@@ -0,0 +1,2 @@
1
+isort==5.10.1
2
+pycodestyle==2.8.0

+ 15 - 0
requirements_dj.txt

@@ -0,0 +1,15 @@
1
+Django==3.2.14
2
+django-admin==2.0.1
3
+django-detect==1.0.20
4
+django-file==1.0.4
5
+django-json-render==1.0.3
6
+django-json-response==1.1.5
7
+django-logit==1.1.3
8
+django-models-ext==1.1.10
9
+django-redis-connector==1.0.4
10
+django-response==1.1.1
11
+django-rlog==1.0.7
12
+django-short-url==1.1.6
13
+django-six==1.0.4
14
+django-uniapi==1.0.10
15
+django-we==1.5.6

+ 2 - 0
requirements_pywe.txt

@@ -0,0 +1,2 @@
1
+pywe-oauth==1.1.1
2
+pywe-pay==1.0.14

+ 3 - 0
requirements_redis.txt

@@ -0,0 +1,3 @@
1
+hiredis==2.0.0
2
+redis==4.3.4
3
+redis-extensions==4.0.1

+ 4 - 0
sysctl.sh

@@ -0,0 +1,4 @@
1
+#!/bin/bash
2
+
3
+sudo sysctl -w net.core.somaxconn=65535
4
+sudo sysctl -w net.core.netdev_max_backlog=65535

+ 0 - 0
tiwen/__init__.py


+ 30 - 0
tiwen/basemodels.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.db import models
4
+from django.utils.translation import gettext_lazy as _
5
+
6
+
7
+class BaseModelMixin(models.Model):
8
+    status = models.BooleanField(_('status'), default=True, help_text=_('Status'))
9
+    created_at = models.DateTimeField(_('created_at'), auto_now_add=True, editable=True, help_text=_('Create Time'))
10
+    updated_at = models.DateTimeField(_('updated_at'), auto_now=True, editable=True, help_text=_('Update Time'))
11
+
12
+    class Meta:
13
+        abstract = True
14
+
15
+
16
+class SexModelMixin(models.Model):
17
+    UNKNOWN = 0
18
+    MALE = 1
19
+    FEMALE = 2
20
+
21
+    SEX_TUPLE = (
22
+        (UNKNOWN, '未知'),
23
+        (MALE, '男'),
24
+        (FEMALE, '女'),
25
+    )
26
+
27
+    sex = models.IntegerField(_('sex'), choices=SEX_TUPLE, default=UNKNOWN, help_text=_('Sex'))
28
+
29
+    class Meta:
30
+        abstract = True

+ 93 - 0
tiwen/decorators.py

@@ -0,0 +1,93 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from functools import wraps
4
+
5
+from django.conf import settings
6
+from django.shortcuts import redirect
7
+from furl import furl
8
+from pywe_oauth import get_oauth_redirect_url
9
+from pywe_sign import check_signature
10
+
11
+from utils.error.errno_utils import SignatureStatusCode
12
+from utils.error.response_utils import response
13
+from utils.redis.connect import r
14
+
15
+
16
+def check_user_cookie(func=None, key=settings.COOKIE_USER_CHECK_KEY):
17
+    def decorator(func):
18
+        @wraps(func)
19
+        def returned_wrapper(request, *args, **kwargs):
20
+            user_id = request.get_signed_cookie(key, default='', salt=settings.COOKIE_SALT)
21
+            if not user_id:
22
+                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', request.get_full_path()))
23
+            return func(request, *args, **kwargs)
24
+        return returned_wrapper
25
+
26
+    if not func:
27
+        def foo(func):
28
+            return decorator(func)
29
+        return foo
30
+
31
+    return decorator(func)
32
+
33
+
34
+def check_token(func=None, entry=None):
35
+    def decorator(func):
36
+        @wraps(func)
37
+        def returned_wrapper(request, *args, **kwargs):
38
+            if not settings.DEBUG and request.wechat:
39
+                vtoken = request.GET.get('vtoken', '') or request.POST.get('vtoken', '')
40
+                token_check_key = request.GET.get(settings.TOKEN_CHECK_KEY, '') or request.POST.get(settings.TOKEN_CHECK_KEY, '')
41
+                if not r.token_exists(token_check_key, vtoken):
42
+                    # 3rd OAuth
43
+                    # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
44
+                    # Current OAuth
45
+                    redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
46
+                    return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
47
+            return func(request, *args, **kwargs)
48
+        return returned_wrapper
49
+
50
+    if not func:
51
+        def foo(func):
52
+            return decorator(func)
53
+        return foo
54
+
55
+    return decorator(func)
56
+
57
+
58
+def check_sign(func=None, method='POST'):
59
+    def decorator(func):
60
+        @wraps(func)
61
+        def returned_wrapper(request, *args, **kwargs):
62
+            if not settings.DEBUG and not check_signature(getattr(request, method).dict(), settings.PARAMS_SIGN_KEY):
63
+                return response(SignatureStatusCode.SIGNATURE_ERROR)
64
+            return func(request, *args, **kwargs)
65
+        return returned_wrapper
66
+
67
+    if not func:
68
+        def foo(func):
69
+            return decorator(func)
70
+        return foo
71
+
72
+    return decorator(func)
73
+
74
+
75
+def check_cookie(func=None, entry=None):
76
+    def decorator(func):
77
+        @wraps(func)
78
+        def returned_wrapper(request, *args, **kwargs):
79
+            if not settings.DEBUG and not request.COOKIES.get('user_id'):
80
+                # 3rd OAuth
81
+                # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
82
+                # Current OAuth
83
+                redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
84
+                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
85
+            return func(request, *args, **kwargs)
86
+        return returned_wrapper
87
+
88
+    if not func:
89
+        def foo(func):
90
+            return decorator(func)
91
+        return foo
92
+
93
+    return decorator(func)

+ 12 - 0
tiwen/deploy.bak/supervisor_commands/pollqueue.ini

@@ -0,0 +1,12 @@
1
+[program:pollqueue]
2
+command=/home/diors/env/bin/python /home/diors/work/tiwen/manage.py poll_queue
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_pollqueue_access.log
11
+stderr_logfile=/var/log/supervisor_pollqueue_error.log
12
+user=diors

+ 12 - 0
tiwen/deploy.bak/supervisor_commands/rlistlog.ini

@@ -0,0 +1,12 @@
1
+[program:rlistlog]
2
+command=/home/diors/env/bin/python /home/diors/work/tiwen/manage.py rlistlog --key=django:logit:tiwen --filename=/tmp/tiwen.logit.log
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_rlistlog_access.log
11
+stderr_logfile=/var/log/supervisor_rlistlog_error.log
12
+user=diors

+ 35 - 0
tiwen/deploy.bak/tiwen.ini

@@ -0,0 +1,35 @@
1
+# Refer: https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
2
+# tiwen_uwsgi.ini file
3
+[uwsgi]
4
+
5
+# Django-related settings
6
+# the base directory (full path)
7
+chdir           = /home/diors/work/tiwen
8
+# Django's wsgi file
9
+module          = tiwen.wsgi
10
+# the virtualenv (full path)
11
+# home            = /path/to/virtualenv
12
+
13
+# process-related settings
14
+# master
15
+master          = true
16
+# maximum number of worker processes
17
+processes       = 10
18
+# the socket (use the full path to be safe
19
+socket          = /home/diors/work/tiwen/tiwen/deploy/tiwen.sock
20
+# ... with appropriate permissions - may be needed
21
+chmod-socket    = 777
22
+# clear environment on exit
23
+vacuum          = true
24
+
25
+# connect() to unix:///home/xxx/xxx.sock failed (11: Resource temporarily unavailable) while connecting to upstream
26
+# Exec sysctl.sh first
27
+# #!/bin/bash
28
+# sudo sysctl -w net.core.somaxconn=65535
29
+# sudo sysctl -w net.core.netdev_max_backlog=65535
30
+reload-mercy    = 64
31
+max-requests    = 8192
32
+listen          = 8192
33
+
34
+# recv() failed (104: Connection reset by peer) while reading response header from upstream
35
+buffer-size     = 65535

+ 35 - 0
tiwen/deploy.bak/tiwen2.ini

@@ -0,0 +1,35 @@
1
+# Refer: https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
2
+# tiwen_uwsgi.ini file
3
+[uwsgi]
4
+
5
+# Django-related settings
6
+# the base directory (full path)
7
+chdir           = /home/diors/work/tiwen
8
+# Django's wsgi file
9
+module          = tiwen.wsgi
10
+# the virtualenv (full path)
11
+# home            = /path/to/virtualenv
12
+
13
+# process-related settings
14
+# master
15
+master          = true
16
+# maximum number of worker processes
17
+processes       = 10
18
+# the socket (use the full path to be safe
19
+socket          = /home/diors/work/tiwen/tiwen/deploy/tiwen2.sock
20
+# ... with appropriate permissions - may be needed
21
+chmod-socket    = 777
22
+# clear environment on exit
23
+vacuum          = true
24
+
25
+# connect() to unix:///home/xxx/xxx.sock failed (11: Resource temporarily unavailable) while connecting to upstream
26
+# Exec sysctl.sh first
27
+# #!/bin/bash
28
+# sudo sysctl -w net.core.somaxconn=65535
29
+# sudo sysctl -w net.core.netdev_max_backlog=65535
30
+reload-mercy    = 64
31
+max-requests    = 8192
32
+listen          = 8192
33
+
34
+# recv() failed (104: Connection reset by peer) while reading response header from upstream
35
+buffer-size     = 65535

+ 96 - 0
tiwen/deploy.bak/tiwen_nginx.conf

@@ -0,0 +1,96 @@
1
+# tiwen_nginx.conf
2
+
3
+# the upstream component nginx needs to connect to
4
+upstream tiwen {
5
+    # Single Server
6
+    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen.sock; # for a file socket
7
+    # Multi Server
8
+    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen.sock max_fails=0 weight=1; # for a file socket
9
+    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen2.sock max_fails=0 weight=1; # for a file socket
10
+    server 127.0.0.1:8888; # for a web port socket (we'll use this first)
11
+}
12
+
13
+# configuration of the server
14
+server {
15
+    # the port your site will be served on
16
+    listen      80;
17
+    # the domain name it will serve for
18
+    server_name .a.com; # substitute your machine's IP address or FQDN
19
+    charset     utf-8;
20
+
21
+    # access_log off;  # 设置是否存储访问日志
22
+    # access_log /var/log/nginx/tiwen_access.log;
23
+    # error_log /var/log/nginx/tiwen_error.log;
24
+
25
+    # max upload size
26
+    client_max_body_size 75M;   # adjust to taste
27
+
28
+    # JS接口安全域名 & 业务域名 验证
29
+    location /xxx.txt {
30
+        alias /home/diors/work/tiwen/docs/we/xxx.txt;
31
+    }
32
+
33
+    # Django media
34
+    location /media  {
35
+        alias /home/diors/work/tiwen/media;  # your Django project's media files - amend as required
36
+    }
37
+
38
+    location /static {
39
+        alias /home/diors/work/tiwen/collect_static; # your Django project's static files - amend as required
40
+    }
41
+
42
+    # Finally, send all non-media requests to the Django server.
43
+    location / {
44
+        # uwsgi_pass  tiwen;
45
+        proxy_pass  http://tiwen;
46
+        include     /home/diors/work/tiwen/tiwen/deploy/uwsgi_params; # the uwsgi_params file you installed
47
+    }
48
+}
49
+
50
+# configuration of the server
51
+server {
52
+    # the port your site will be served on
53
+    listen      443;
54
+    # the domain name it will serve for
55
+    server_name .a.com; # substitute your machine's IP address or FQDN
56
+    charset     utf-8;
57
+
58
+    # access_log /var/log/nginx/tiwen_ssl_access.log;
59
+    # error_log /var/log/nginx/tiwen_ssl_error.log;
60
+
61
+    ssl on;
62
+    ssl_certificate   cert/214180103970874.pem;
63
+    ssl_certificate_key  cert/214180103970874.key;
64
+    ssl_session_timeout 5m;
65
+    # worker process * exited on signal 11
66
+    # 同一台服务器部署多个 SSL 转发,Nginx 默认是开启 Session 缓存的,导致冲突,验证不通过,连接直接退出
67
+    # 解决方案:禁用 Ningx SSL Session 的缓存
68
+    ssl_session_cache none;
69
+    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
70
+    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
71
+    ssl_prefer_server_ciphers on;
72
+
73
+    # max upload size
74
+    client_max_body_size 75M;   # adjust to taste
75
+
76
+    # JS接口安全域名 & 业务域名 验证
77
+    location /xxx.txt {
78
+        alias /home/diors/work/tiwen/docs/we/xxx.txt;
79
+    }
80
+
81
+    # Django media
82
+    location /media  {
83
+        alias /home/diors/work/tiwen/media;  # your Django project's media files - amend as required
84
+    }
85
+
86
+    location /static {
87
+        alias /home/diors/work/tiwen/collect_static; # your Django project's static files - amend as required
88
+    }
89
+
90
+    # Finally, send all non-media requests to the Django server.
91
+    location / {
92
+        # uwsgi_pass  tiwen;
93
+        proxy_pass  http://tiwen;
94
+        include     /home/diors/work/tiwen/tiwen/deploy/uwsgi_params; # the uwsgi_params file you installed
95
+    }
96
+}

+ 12 - 0
tiwen/deploy.bak/tiwen_supervisor.ini

@@ -0,0 +1,12 @@
1
+[program:tiwen]
2
+command=/home/diors/env/bin/uwsgi --ini /home/diors/work/tiwen/tiwen/deploy/tiwen.ini
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_tiwen_access.log
11
+stderr_logfile=/var/log/supervisor_tiwen_error.log
12
+user=diors

+ 12 - 0
tiwen/deploy.bak/tiwen_supervisor2.ini

@@ -0,0 +1,12 @@
1
+[program:tiwen2]
2
+command=/home/diors/env/bin/uwsgi --ini /home/diors/work/tiwen/tiwen/deploy/tiwen2.ini
3
+autostart=true
4
+autorestart=true
5
+startretries=3
6
+exitcodes=0,1,2
7
+stopsignal=KILL
8
+stopasgroup=true
9
+killasgroup=true
10
+stdout_logfile=/var/log/supervisor_tiwen2_access.log
11
+stderr_logfile=/var/log/supervisor_tiwen2_error.log
12
+user=diors

+ 15 - 0
tiwen/deploy.bak/uwsgi_params

@@ -0,0 +1,15 @@
1
+uwsgi_param	QUERY_STRING		$query_string;
2
+uwsgi_param	REQUEST_METHOD		$request_method;
3
+uwsgi_param	CONTENT_TYPE		$content_type;
4
+uwsgi_param	CONTENT_LENGTH		$content_length;
5
+
6
+uwsgi_param	REQUEST_URI		$request_uri;
7
+uwsgi_param	PATH_INFO		$document_uri;
8
+uwsgi_param	DOCUMENT_ROOT		$document_root;
9
+uwsgi_param	SERVER_PROTOCOL		$server_protocol;
10
+uwsgi_param	UWSGI_SCHEME		$scheme;
11
+
12
+uwsgi_param	REMOTE_ADDR		$remote_addr;
13
+uwsgi_param	REMOTE_PORT		$remote_port;
14
+uwsgi_param	SERVER_PORT		$server_port;
15
+uwsgi_param	SERVER_NAME		$server_name;

+ 5 - 0
tiwen/django_file_callback_settings.py

@@ -0,0 +1,5 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def DJANGO_FILE_UPLOAD_CALLBACK_FUNC(request, file_path=None, file_url=None):
5
+    """ DJANGO FILE UPLOAD Callback Func """

+ 84 - 0
tiwen/django_we_callback_settings.py

@@ -0,0 +1,84 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def DJANGO_WE_CFG_FUNC(request, state=None):
5
+    """ WeChat CFG Callback Func """
6
+
7
+
8
+def DJANGO_WE_QUOTE_STATE_FUNC(request, state):
9
+    """ WeChat Quote Callback Func """
10
+    from utils.redis.connect import r
11
+    return r.quote(state, short_uuid=True)
12
+
13
+
14
+def DJANGO_WE_UNQUOTE_STATE_FUNC(request, state):
15
+    """ WeChat UnQuote Callback Func """
16
+    from utils.redis.connect import r
17
+
18
+    # If Not Buf, When Wechat Multi Request, Unquote Will Get None
19
+    # Then Once Should ReOAuth, Will Raise Error
20
+    return r.unquote(state, buf=True) or state
21
+
22
+
23
+def DJANGO_WE_BASE_FUNC(code, state, access_info=None):
24
+    """ WeChat Base Redirect Callback Func """
25
+
26
+
27
+def DJANGO_WE_BASE_COOKIE_FUNC(code, state, access_info=None):
28
+    """ WeChat Base Set Cookie Redirect Callback Func """
29
+
30
+
31
+def DJANGO_WE_USERINFO_FUNC(code, state, access_info=None, userinfo=None):
32
+    """ WeChat Userinfo Redirect Callback Func """
33
+    from django.conf import settings
34
+
35
+    from utils.redis.connect import r
36
+    from utils.user.userinfo_save import userinfo_save
37
+
38
+    # Save profile or something else
39
+    user = userinfo_save(userinfo)
40
+
41
+    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
42
+
43
+    return {
44
+        settings.TOKEN_CHECK_KEY: token_check_key,
45
+        'vtoken': r.token(token_check_key, ex=True, time=r.REDIS_EXPIRED_ONE_DAY, buf=False, short_uuid=True),
46
+    }
47
+
48
+
49
+def DJANGO_WE_USERINFO_COOKIE_FUNC(code, state, access_info=None, userinfo=None):
50
+    """ WeChat Userinfo Set Cookie Redirect Callback Func """
51
+    from django.conf import settings
52
+
53
+    from utils.user.userinfo_save import userinfo_save
54
+
55
+    # Save profile or something else
56
+    user = userinfo_save(userinfo)
57
+
58
+    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
59
+
60
+    return {}, settings.TOKEN_CHECK_KEY, token_check_key
61
+
62
+
63
+def DJANGO_WE_SHARE_FUNC(request, state=None):
64
+    """ WeChat Share Callback Func """
65
+    # from django.conf import settings
66
+    # return settings.WECHAT_OAUTH2_REDIRECT_URL
67
+
68
+
69
+def DJANGO_WE_MESSAGE_CALLBACK_FUNC(request, xmldict, decrypted):
70
+    """ WeChat Message Callback Func """
71
+
72
+
73
+def DJANGO_WE_COMPONENT_AUTH_FUNC(request, xmldict, decrypted):
74
+    """ WeChat COMPONENT Auth Func """
75
+
76
+
77
+def DJANGO_WE_COMPONENT_CALLBACK_FUNC(request, appid, xmldict, decrypted):
78
+    """ WeChat COMPONENT Callback Func """
79
+
80
+
81
+def DJANGO_WE_REDIS_OBJ_FUNC(request):
82
+    """ WeChat Redis Object Callback Func """
83
+    from utils.redis.connect import r
84
+    return r

+ 16 - 0
tiwen/func_settings.py

@@ -0,0 +1,16 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import redis_extensions as redis
4
+
5
+
6
+def redis_conf(conf):
7
+    return {
8
+        'host': conf.get('HOST', 'localhost'),
9
+        'port': conf.get('PORT', 6379),
10
+        'password': '{0}:{1}'.format(conf.get('USER', ''), conf.get('PASSWORD', '')) if conf.get('USER') else '',
11
+        'db': conf.get('db', 0),
12
+    }
13
+
14
+
15
+def redis_connect(conf):
16
+    return redis.StrictRedisExtensions(connection_pool=redis.ConnectionPool(**redis_conf(conf)))

+ 17 - 0
tiwen/local_settings_bak.py

@@ -0,0 +1,17 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# DEBUG = False
4
+
5
+ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'tiwen']
6
+
7
+# DOMAIN
8
+DOMAIN = 'http://a.com'
9
+
10
+# 邮件设置
11
+# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
12
+SERVER_EMAIL = 'error.notify@exmail.com'
13
+EMAIL_HOST_USER = 'error.notify@exmail.com'
14
+EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
15
+DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
16
+ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
17
+EMAIL_SUBJECT_PREFIX = '[Templet] '

+ 27 - 0
tiwen/local_settings_dev_bak.py

@@ -0,0 +1,27 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import os
4
+
5
+
6
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
7
+PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
8
+
9
+TEMPLATES = [
10
+    {
11
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
12
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
13
+        # 'APP_DIRS': True,
14
+        'OPTIONS': {
15
+            'context_processors': [
16
+                'django.template.context_processors.debug',
17
+                'django.template.context_processors.request',
18
+                'django.contrib.auth.context_processors.auth',
19
+                'django.contrib.messages.context_processors.messages',
20
+            ],
21
+            'loaders': [
22
+                'django.template.loaders.filesystem.Loader',
23
+                'django.template.loaders.app_directories.Loader',
24
+            ],
25
+        },
26
+    },
27
+]

+ 401 - 0
tiwen/settings.py

@@ -0,0 +1,401 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""
4
+Django settings for tiwen project.
5
+
6
+Generated by 'django-admin startproject' using Django 1.11.3.
7
+
8
+For more information on this file, see
9
+https://docs.djangoproject.com/en/1.11/topics/settings/
10
+
11
+For the full list of settings and their values, see
12
+https://docs.djangoproject.com/en/1.11/ref/settings/
13
+"""
14
+
15
+import os
16
+
17
+# try:
18
+#     from func_settings import redis_connect
19
+#     REDIS_CACHE = redis_connect(REDIS.get('default', {}))
20
+# except ImportError:
21
+#     REDIS_CACHE = None
22
+from django_redis_connector import connector
23
+
24
+
25
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
26
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
27
+PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
28
+
29
+
30
+# Quick-start development settings - unsuitable for production
31
+# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
32
+
33
+# SECURITY WARNING: keep the secret key used in production secret!
34
+SECRET_KEY = '0=hpv21&am(7(k5ab!^zjvvl=ntj)^i@7)87t47uzumt_5rq$+'
35
+
36
+# SECURITY WARNING: don't run with debug turned on in production!
37
+DEBUG = True
38
+
39
+ALLOWED_HOSTS = []
40
+
41
+
42
+# Application definition
43
+
44
+INSTALLED_APPS = [
45
+    'django.contrib.admin',
46
+    'django.contrib.auth',
47
+    'django.contrib.contenttypes',
48
+    'django.contrib.sessions',
49
+    'django.contrib.messages',
50
+    'django.contrib.staticfiles',
51
+    # 'django_file_upload',
52
+    # 'django_short_url',
53
+    'django_uniapi',
54
+    'django_admin',
55
+    # 'django_rlog',
56
+    'django_we',
57
+    'commands',
58
+    'api',
59
+]
60
+
61
+MIDDLEWARE = [
62
+    'django.middleware.security.SecurityMiddleware',
63
+    'django.contrib.sessions.middleware.SessionMiddleware',
64
+    'django.middleware.common.CommonMiddleware',
65
+    # 'django.middleware.csrf.CsrfViewMiddleware',
66
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
67
+    'django.contrib.messages.middleware.MessageMiddleware',
68
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
69
+    'detect.middleware.UserAgentDetectionMiddleware',
70
+]
71
+
72
+ROOT_URLCONF = 'tiwen.urls'
73
+
74
+TEMPLATES = [
75
+    {
76
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
77
+        'DIRS': [os.path.join(BASE_DIR, 'templates')],
78
+        # 'APP_DIRS': True,
79
+        'OPTIONS': {
80
+            'context_processors': [
81
+                'django.template.context_processors.debug',
82
+                'django.template.context_processors.request',
83
+                'django.contrib.auth.context_processors.auth',
84
+                'django.contrib.messages.context_processors.messages',
85
+            ],
86
+            'loaders': [
87
+                ('django.template.loaders.cached.Loader', [
88
+                    'django.template.loaders.filesystem.Loader',
89
+                    'django.template.loaders.app_directories.Loader',
90
+                ]),
91
+            ],
92
+        },
93
+    },
94
+]
95
+
96
+WSGI_APPLICATION = 'tiwen.wsgi.application'
97
+
98
+
99
+# Database
100
+# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
101
+
102
+DATABASES = {
103
+    # Create Database
104
+    # CREATE DATABASE tiwen DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
105
+    'default': {
106
+        'ENGINE': 'django.db.backends.mysql',
107
+        'NAME': 'tiwen',
108
+        'USER': 'root',
109
+        'PASSWORD': '',
110
+        'HOST': '127.0.0.1',
111
+        'PORT': 3306,
112
+        'CONN_MAX_AGE': 600,
113
+        'OPTIONS': {
114
+            'charset': 'utf8mb4',
115
+        },
116
+    }
117
+}
118
+
119
+
120
+# Password validation
121
+# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
122
+
123
+AUTH_PASSWORD_VALIDATORS = [
124
+    {
125
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
126
+    },
127
+    {
128
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
129
+    },
130
+    {
131
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
132
+    },
133
+    {
134
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
135
+    },
136
+]
137
+
138
+
139
+# Internationalization
140
+# https://docs.djangoproject.com/en/1.11/topics/i18n/
141
+
142
+LANGUAGE_CODE = 'zh-Hans'
143
+
144
+TIME_ZONE = 'Asia/Shanghai'
145
+
146
+USE_I18N = True
147
+
148
+USE_L10N = True
149
+
150
+USE_TZ = True
151
+
152
+
153
+# Static files (CSS, JavaScript, Images)
154
+# https://docs.djangoproject.com/en/1.11/howto/static-files/
155
+
156
+STATICFILES_DIRS = (
157
+    os.path.join(PROJ_DIR, 'static').replace('\\', '/'),
158
+)
159
+
160
+STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static').replace('\\', '/')
161
+
162
+STATIC_URL = '/static/'
163
+
164
+STATICFILES_FINDERS = (
165
+    'django.contrib.staticfiles.finders.FileSystemFinder',
166
+    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
167
+    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
168
+)
169
+
170
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
171
+
172
+MEDIA_URL = '/media/'
173
+
174
+# File 设置
175
+FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880  # InMemoryUploadedFile 文件最大值,设置为 5 MB
176
+FILE_UPLOAD_PERMISSIONS = 0o644  # TemporaryUploadedFile 文件权限设置
177
+
178
+# DOMAIN
179
+DOMAIN = 'http://a.com'
180
+
181
+# Redis 设置
182
+REDIS = {
183
+    'default': {
184
+        'HOST': '127.0.0.1',
185
+        'PORT': 6379,
186
+        'USER': '',
187
+        'PASSWORD': '',
188
+        'db': 0,
189
+        'decode_responses': True,
190
+    }
191
+}
192
+
193
+# 微信设置
194
+WECHAT = {
195
+    'JSAPI': {
196
+        'trade_type': 'JSAPI',  # JSAPI-网页支付、NATIVE-原生支付、APP-APP支付、MICROPAY-刷卡支付
197
+        'token': '5201314',
198
+        'appID': '',
199
+        'appsecret': '',
200
+        'encodingaeskey': '',
201
+        'mchID': '',
202
+        'apiKey': '',
203
+        'mch_cert': '',
204
+        'mch_key': '',
205
+        'redpack': {
206
+
207
+        }
208
+    },
209
+}
210
+
211
+WECHAT_DEFAULT_CFG = 'JSAPI'
212
+
213
+# 微信唯一标识
214
+# Choices: 'unionid' or 'openid'
215
+#
216
+# models.py
217
+#   'unique_identifier': self.unionid if settings.WECHAT_UNIQUE_IDENTIFICATION == 'unionid' else self.openid,
218
+# views.py
219
+#   unique_identifier = request.POST.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
220
+#   profile = Profile.objects.get(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
221
+#
222
+# If not bind to OpenPlat, change `WECHAT_UNIQUE_IDENTIFICATION` as `openid`
223
+WECHAT_UNIQUE_IDENTIFICATION = 'unionid'
224
+
225
+# Token 错误重授权设置
226
+TOKEN_CHECK_KEY = ''
227
+# TOKEN_CHECK_KEY = 'user_id'
228
+WECHAT_OAUTH2_REDIRECT_ENTRY = ''
229
+WECHAT_OAUTH2_REDIRECT_URL = ''
230
+
231
+# Cookie 设置
232
+DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE = 31536000  # 单位:秒,1年:365 * 24 * 60 * 60 = 31536000
233
+DJANGO_WE_COOKIE_SALT = COOKIE_SALT = 'djwe'  # Salt for ``set_signed_cookie``
234
+# Cookie 校验设置
235
+COOKIE_USER_CHECK_KEY = ''
236
+# COOKIE_USER_CHECK_KEY = 'user_id'
237
+
238
+# 邮件设置
239
+# https://docs.djangoproject.com/en/1.11/howto/error-reporting/#email-reports
240
+# When DEBUG is False, Django will email the users listed in the ADMINS setting
241
+# whenever your code raises an unhandled exception and results in an internal server error (HTTP status code 500).
242
+# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
243
+# Email address that error messages come from.
244
+SERVER_EMAIL = 'error.notify@exmail.com'
245
+# The email backend to use. For possible shortcuts see django.core.mail.
246
+# The default is to use the SMTP backend.
247
+# Third-party backends can be specified by providing a Python path
248
+# to a module that defines an EmailBackend class.
249
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
250
+# Host for sending email.
251
+EMAIL_HOST = 'smtp.exmail.qq.com'
252
+# Port for sending email.
253
+EMAIL_PORT = 25
254
+# Optional SMTP authentication information for EMAIL_HOST.
255
+EMAIL_HOST_USER = 'error.notify@exmail.com'
256
+EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
257
+EMAIL_USE_TLS = False
258
+EMAIL_USE_SSL = False
259
+EMAIL_SSL_CERTFILE = None
260
+EMAIL_SSL_KEYFILE = None
261
+# Default: None
262
+# Specifies a timeout in seconds for blocking operations like the connection attempt.
263
+# socket.error: [Errno 110] Connection timed out
264
+# 如果不设置 EMAIL_TIMEOUT,一旦 sock.connect 连接有问题 error: (110, 'Connection timed out')
265
+# 就会导致进程一直卡住,最终导致服务崩溃
266
+# EMAIL_TIMEOUT = None
267
+EMAIL_TIMEOUT = 3
268
+# Default email address to use for various automated correspondence from
269
+# the site managers.
270
+DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
271
+# People who get code error notifications.
272
+# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
273
+# Default: [], not send code error notifications.
274
+# https://github.com/django/django/blob/5fcfe5361e5b8c9738b1ee4c1e9a6f293a7dda40/django/core/mail/__init__.py#L90
275
+# ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
276
+ADMINS = []
277
+# Not-necessarily-technical managers of the site. They get broken link
278
+# notifications and other various emails.
279
+MANAGERS = ADMINS
280
+# Subject-line prefix for email messages send with django.core.mail.mail_admins
281
+# or ...mail_managers.  Make sure to include the trailing space.
282
+EMAIL_SUBJECT_PREFIX = '[Templet] '
283
+
284
+# Django-Admin Settings
285
+DJANGO_ADMIN_DISABLE_DELETE_SELECTED = False
286
+
287
+# Django-FILE-UPLOAD Settings
288
+DJANGO_FILE_UPLOAD_USE_YM = True
289
+DJANGO_FILE_UPLOAD_USE_DT = True
290
+
291
+# Django-Logit Settings
292
+DJANGO_LOGIT_ENABLED = True
293
+DJANGO_LOGIT_BODY_FLAG = False
294
+DJANGO_LOGIT_RES_FLAG = False
295
+
296
+# Django-Onerror Settings
297
+DJANGO_ONERROR_ACCEPT_REPORT = True
298
+DJANGO_ONERROR_ADMIN_SITE_REGISTER = True
299
+
300
+# Django-Short-URL Settings
301
+# Redirect url when short url not exists
302
+DJANGO_SHORT_URL_REDIRECT_URL = ''
303
+
304
+# Django-We Settings
305
+DJANGO_WE_QUOTE_OR_NOT = True
306
+DJANGO_WE_MODEL_DISPLAY_OR_NOT = True
307
+# Enable Cookie or not
308
+# DJANGO_WE_BASE_REDIRECT_SET_COOKIE = False
309
+# DJANGO_WE_USERINFO_REDIRECT_SET_COOKIE = True
310
+# Cookie Config
311
+DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE
312
+DJANGO_WE_COOKIE_SALT = COOKIE_SALT
313
+
314
+# 开发调试相关配置
315
+if DEBUG:
316
+    try:
317
+        from .local_settings_dev import *
318
+    except ImportError:
319
+        pass
320
+
321
+try:
322
+    from .local_settings import *
323
+except ImportError:
324
+    pass
325
+
326
+try:
327
+    from .django_file_callback_settings import *
328
+except ImportError:
329
+    pass
330
+
331
+try:
332
+    from .django_we_callback_settings import *
333
+except ImportError:
334
+    pass
335
+
336
+# 依赖 local_settings 中的配置
337
+# 微信授权设置
338
+# WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/oauth2?scope={{0}}&redirect_url={{1}}'.format(DOMAIN)
339
+# Shorten URL
340
+# ``o`` is short for oauth2
341
+# ``r`` is short for redirect_url
342
+WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/o?scope={{0}}&r={{1}}'.format(DOMAIN)
343
+WECHAT_OAUTH2_USERINFO_REDIRECT_URI = '{0}/we/o?r={{0}}'.format(DOMAIN)  # Scope default snsapi_userinfo
344
+WECHAT_BASE_REDIRECT_URI = '{0}/we/base_redirect'.format(DOMAIN)
345
+WECHAT_USERINFO_REDIRECT_URI = '{0}/we/userinfo_redirect'.format(DOMAIN)
346
+WECHAT_DIRECT_BASE_REDIRECT_URI = '{0}/we/direct_base_redirect'.format(DOMAIN)
347
+WECHAT_DIRECT_USERINFO_REDIRECT_URI = '{0}/we/direct_userinfo_redirect'.format(DOMAIN)
348
+
349
+# Redis 连接
350
+WECHAT_REDIS_OBJ = REDIS_CACHE = connector(REDIS.get('default', {}))
351
+
352
+# LOGGER 设置
353
+# python manage.py rlistlog --key=django:logit:tiwen --filename=/tmp/tiwen.logit.log
354
+LOGGING = {
355
+    'version': 1,
356
+    'disable_existing_loggers': False,
357
+    'formatters': {
358
+        'verbose': {
359
+            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
360
+        },
361
+        'simple': {
362
+            'format': '%(levelname)s %(message)s'
363
+        },
364
+    },
365
+    'handlers': {
366
+        'logit': {
367
+            'level': 'DEBUG',
368
+            'class': 'rlog.RedisListHandler',
369
+            'redis_client': REDIS_CACHE,
370
+            'key': 'django:logit:tiwen',
371
+            'formatter': 'verbose',
372
+        },
373
+        'console': {
374
+            'level': 'DEBUG',
375
+            'class': 'logging.StreamHandler',
376
+            'formatter': 'verbose'
377
+        },
378
+    },
379
+    'loggers': {
380
+        'logit': {
381
+            'handlers': ['logit'],
382
+            'level': 'DEBUG',
383
+            'propagate': True,
384
+        },
385
+        'console': {
386
+            'handlers': ['console'],
387
+            'level': 'DEBUG',
388
+            'propagate': True,
389
+        },
390
+    },
391
+}
392
+
393
+# MAX_BIGINT
394
+# Why Not ``sys.maxint``
395
+# n bit platform sys.maxint = 2 ** (n - 1) - 1
396
+# 64 bit 9223372036854775807, 32 bit 2147483647
397
+from django.db.models import BigIntegerField  # isort:skip
398
+MAX_BIGINT = BigIntegerField.MAX_BIGINT
399
+
400
+# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
401
+DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

+ 68 - 0
tiwen/static/tiwen/css/common.css

@@ -0,0 +1,68 @@
1
+.text-center {
2
+    text-align: center;
3
+}
4
+
5
+/*
6
+  文本溢出省略,元素需要设置定宽度
7
+  */
8
+/* 单行 */
9
+.text_ellipsis {
10
+    overflow: hidden;
11
+    white-space: nowrap;
12
+    text-overflow: ellipsis;
13
+}
14
+/* 多行 */
15
+.a {
16
+    overflow: hidden;
17
+    text-overflow: ellipsis;
18
+    display: -webkit-box;
19
+    -webkit-line-clamp: 2;
20
+    -webkit-box-orient: vertical;
21
+}
22
+
23
+/*
24
+  浮动 & 清除浮动
25
+ */
26
+.fl {
27
+    float: left;
28
+}
29
+
30
+.fr {
31
+    float: right;
32
+}
33
+
34
+.clearfix {
35
+    zoom: 1;
36
+}
37
+
38
+.clearfix:after {
39
+    content: "\200B";
40
+    display: block;
41
+    height: 0;
42
+    clear: both;
43
+}
44
+
45
+.clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; }
46
+.clearfix { *zoom:1; }
47
+
48
+/*
49
+  解决安卓微信点击图片预览问题
50
+  这个会让 img 标签的点击事件失效,如果想要点击图片就要给上面再写一层
51
+  需要长按识别二维码的时候,则再单独给该图片添加
52
+  ```css
53
+  pointer-events: auto;
54
+  ```
55
+  来恢复对应的点击事件
56
+  */
57
+img {
58
+    pointer-events: none;
59
+}
60
+
61
+.clickable {
62
+    pointer-events: auto;
63
+}
64
+
65
+/* Input 自动填充后,移除 Chrome 默认黄色 */
66
+input:-webkit-autofill {
67
+    box-shadow: 0 0 0 1000px white inset !important;
68
+}

+ 574 - 0
tiwen/static/tiwen/js/jswe.js

@@ -0,0 +1,574 @@
1
+!(function(e, t) {
2
+    var config = {
3
+        wxconfig: 'http://api.tt4it.com/wx/jsapi_signature',
4
+        callback: 'callback'
5
+    }, wxData = {
6
+        debug: false,
7
+        imgUrl: '',
8
+        link: '',
9
+        desc: '',
10
+        title: '',
11
+        timeLine: ''
12
+    }, wxConfig = {
13
+        hide: false,
14
+        baseFlag: false,
15
+        baseHide: false,
16
+        close: false,
17
+        hideMenuItems: [],
18
+        showMenuItems: []
19
+    }, jsApiList = [
20
+        'checkJsApi',
21
+        'onMenuShareTimeline',
22
+        'onMenuShareAppMessage',
23
+        'onMenuShareQQ',
24
+        'onMenuShareWeibo',
25
+        'onMenuShareQZone',
26
+        'hideMenuItems',
27
+        'showMenuItems',
28
+        'hideAllNonBaseMenuItem',
29
+        'showAllNonBaseMenuItem',
30
+        'translateVoice',
31
+        'startRecord',
32
+        'stopRecord',
33
+        'onRecordEnd',
34
+        'playVoice',
35
+        'pauseVoice',
36
+        'stopVoice',
37
+        'uploadVoice',
38
+        'downloadVoice',
39
+        'chooseImage',
40
+        'previewImage',
41
+        'uploadImage',
42
+        'downloadImage',
43
+        'getLocalImgData',
44
+        'getNetworkType',
45
+        'openLocation',
46
+        'getLocation',
47
+        'hideOptionMenu',
48
+        'showOptionMenu',
49
+        'closeWindow',
50
+        'scanQRCode',
51
+        'chooseWXPay',
52
+        'openEnterpriseRedPacket',
53
+        'openProductSpecificView',
54
+        'addCard',
55
+        'chooseCard',
56
+        'openCard'
57
+    ], wxApiFun
58
+
59
+    function isEmpty(obj) {
60
+        if (obj == null) return true
61
+        if (obj.length > 0) return false
62
+        if (obj.length === 0) return true
63
+        for (var key in obj) {
64
+            if (Object.prototype.hasOwnProperty.call(obj, key)) return false
65
+        }
66
+        return true
67
+    }
68
+
69
+    function isNotEmpty(obj) {
70
+        return !isEmpty(obj)
71
+    }
72
+
73
+    function isOpenOnPC() {  // 判断当前网页是否在 PC 浏览器中打开
74
+        var ua = navigator.userAgent
75
+        return /windows nt/i.test(ua) || /macintosh/i.test(ua) || /linux x86_64/i.test(ua)
76
+    }
77
+
78
+    function isOpenInWeixin() {  // 判断当前网页是否在微信内置浏览器中打开
79
+        return /micromessenger/i.test(navigator.userAgent)
80
+    }
81
+
82
+    function getWeixinVersion() {
83
+        var ua = navigator.userAgent,
84
+            mt = ua.match(/micromessenger\/([\d.]+)/i)
85
+        return (mt ? mt[1] : '')
86
+    }
87
+
88
+    // This function checks whether Wechat is the appointed version or not
89
+    // Cmp: http://jsperf.com/regexp-test-vs-indexof-ignore-upper-and-lower
90
+    function isWeixinVersion(version) {
91
+        // return new RegExp('micromessenger/' + version , 'i').test(navigator.userAgent)
92
+        return navigator.userAgent.toLowerCase().indexOf('micromessenger/' + version) != -1
93
+    }
94
+
95
+    function hideOptionMenu() {
96
+        wxConfig.hide = true
97
+        fixedWxData()
98
+    }
99
+
100
+    function showOptionMenu() {
101
+        wxConfig.hide = false
102
+        fixedWxData()
103
+    }
104
+
105
+    function hideMenuItems(items) {
106
+        wxConfig.hideMenuItems = items
107
+        fixedWxData()
108
+    }
109
+
110
+    function showMenuItems(items) {
111
+        wxConfig.showMenuItems = items
112
+        fixedWxData()
113
+    }
114
+
115
+    function hideAllNonBaseMenuItem() {
116
+        wxConfig.baseFlag = true
117
+        wxConfig.baseHide = true
118
+        fixedWxData()
119
+    }
120
+
121
+    function showAllNonBaseMenuItem() {
122
+        wxConfig.baseFlag = true
123
+        wxConfig.baseHide = false
124
+        fixedWxData()
125
+    }
126
+
127
+    function closeWindow() {
128
+        wxConfig.close = true
129
+        fixedWxData()
130
+    }
131
+
132
+    function wxReady(data) {
133
+        data = typeof data === 'object' ? data : JSON.parse(data)
134
+        wx.config({
135
+            debug: wxData.debug,
136
+            appId: data.appId,
137
+            timestamp: data.timestamp,
138
+            nonceStr: data.nonceStr,
139
+            signature: data.signature,
140
+            jsApiList: jsApiList
141
+        })
142
+
143
+        var callbacks = {
144
+            trigger: function (res) {
145
+                // alert('用户点击发送给朋友')
146
+                if (JSWE.wxTrigger) {JSWE.wxTrigger(res)}
147
+            },
148
+            success: function (res) {
149
+                // alert('已分享')
150
+                if (JSWE.wxSuccess) {JSWE.wxSuccess(res)}
151
+            },
152
+            cancel: function (res) {
153
+                // alert('已取消')
154
+                if (JSWE.wxCancel) {JSWE.wxCancel(res)}
155
+            },
156
+            fail: function (res) {
157
+                // alert(JSON.stringify(res))
158
+                if (JSWE.wxFail) {JSWE.wxFail(res)}
159
+            }
160
+        }, shareInfo = function(flag) {
161
+            var _share = {
162
+                title: flag ? wxData.title : (wxData.timeLine || wxData.desc),
163
+                link: wxData.link,
164
+                imgUrl: wxData.imgUrl,
165
+                trigger: callbacks.trigger,
166
+                success: callbacks.success,
167
+                cancel: callbacks.cancel,
168
+                fail: callbacks.fail
169
+            }
170
+            if (flag) _share.desc = wxData.desc
171
+            return _share
172
+        }, wxShareApi = function() {
173
+            // 2. 分享接口
174
+            // 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口
175
+            wx.onMenuShareAppMessage(shareInfo(1))
176
+            // 2.2 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
177
+            wx.onMenuShareTimeline(shareInfo(0))
178
+            // 2.3 监听“分享到QQ”按钮点击、自定义分享内容及分享结果接口
179
+            wx.onMenuShareQQ(shareInfo(1))
180
+            // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口
181
+            wx.onMenuShareWeibo(shareInfo(1))
182
+            // 2.5 监听“分享到QQ空间”按钮点击、自定义分享内容及分享结果接口
183
+            wx.onMenuShareQZone(shareInfo(1))
184
+        }, wxMenuApi = function () {
185
+            // 8. 界面操作接口
186
+            // 8.1 隐藏右上角菜单
187
+            // 8.2 显示右上角菜单
188
+            if (wxConfig.hide) {wx.hideOptionMenu()} else {wx.showOptionMenu()}
189
+            // 8.3 批量隐藏菜单项
190
+            if (isNotEmpty(wxConfig.hideMenuItems)) {
191
+                wx.hideMenuItems({
192
+                    menuList: wxConfig.hideMenuItems,
193
+                    success: function (res) {
194
+                        if (JSWE.wxHideMenuItemsSuccess) {JSWE.wxHideMenuItemsSuccess(res)}
195
+                    },
196
+                    fail: function (res) {
197
+                        if (JSWE.wxHideMenuItemsFail) {JSWE.wxHideMenuItemsFail(res)}
198
+                    }
199
+                })
200
+            }
201
+            // 8.4 批量显示菜单项
202
+            if (isNotEmpty(wxConfig.showMenuItems)) {
203
+                wx.showMenuItems({
204
+                    menuList: wxConfig.showMenuItems,
205
+                    success: function (res) {
206
+                        if (JSWE.wxShowMenuItemsSuccess) {JSWE.wxShowMenuItemsSuccess(res)}
207
+                    },
208
+                    fail: function (res) {
209
+                        if (JSWE.wxShowMenuItemsFail) {JSWE.wxShowMenuItemsFail(res)}
210
+                    }
211
+                })
212
+            }
213
+            // 8.5 隐藏所有非基本菜单项
214
+            // 8.6 显示所有被隐藏的非基本菜单项
215
+            if (wxConfig.baseFlag) {
216
+                if (wxConfig.baseHide) {wx.hideAllNonBaseMenuItem()} else {wx.showAllNonBaseMenuItem()}
217
+            }
218
+            // 8.7 关闭当前窗口
219
+            if (wxConfig.close) {wx.closeWindow()}
220
+        }, wxVoiceApi = function() {
221
+            // 4.3 监听录音自动停止
222
+            wx.onVoiceRecordEnd({
223
+                complete: function (res) {
224
+                    voice.localId = res.localId
225
+                    if (JSWE.wxVoiceRecordEnd) {JSWE.wxVoiceRecordEnd(res)}
226
+                }
227
+            })
228
+            // 4.7 监听录音播放停止
229
+            wx.onVoicePlayEnd({
230
+                complete: function (res) {
231
+                    if (JSWE.wxVoicePlayEnd) {JSWE.wxVoicePlayEnd(res)}
232
+                }
233
+            })
234
+        }, wxApi = function () {
235
+            wxShareApi()
236
+            wxMenuApi()
237
+            wxVoiceApi()
238
+        }
239
+
240
+        wx.ready(wxApi)
241
+
242
+        return wxApiFun = wxApi
243
+    }
244
+
245
+    if (isOpenInWeixin() || isOpenOnPC()) {
246
+        if ('undefined' !== typeof JSWE_CONF_UPDATE) JSWE_CONF_UPDATE(config)
247
+        $.ajax({
248
+            url: config.wxconfig,
249
+            type: 'get',
250
+            dataType: 'jsonp',
251
+            jsonpCallback: config.callback,
252
+            data: {
253
+                url: window.location.href.split('#')[0]
254
+            },
255
+            success: wxReady
256
+        })
257
+    }
258
+
259
+    function initWxData(data, flag) {
260
+        for(var d in data) {if (d in wxData) wxData[d] = data[d]}
261
+        if (flag) fixedWxData()
262
+    }
263
+
264
+    function changeWxData(key, value, flag) {
265
+        if (key in falDwxDataata) {wxData[key] = value}
266
+        if (flag) fixedWxData()
267
+    }
268
+
269
+    function fixedWxData() {
270
+        if ('undefined' !== typeof wxApiFun) wxApiFun()
271
+    }
272
+
273
+    // 3 智能接口
274
+    var voice = {
275
+        localId: '',
276
+        serverId: ''
277
+    }
278
+    // 3.1 识别音频并返回识别结果
279
+    function translateVoice() {
280
+        if (voice.localId == '') {
281
+            if (JSWE.wxTranslateVoiceEmpty) {JSWE.wxTranslateVoiceEmpty()}
282
+            return
283
+        }
284
+        wx.translateVoice({
285
+            localId: voice.localId,
286
+            complete: function (res) {
287
+                if (JSWE.wxTranslateVoiceComplete) {JSWE.wxTranslateVoiceComplete(res)}
288
+            }
289
+        })
290
+    }
291
+
292
+    // 4 音频接口
293
+    // 4.1 开始录音
294
+    function startRecord() {
295
+        wx.startRecord({
296
+            cancel: function () {
297
+                if (JSWE.wxStartRecordCancel) {JSWE.wxStartRecordCancel(res)}
298
+            }
299
+        })
300
+    }
301
+
302
+    // 4.2 停止录音
303
+    function stopRecord() {
304
+        wx.stopRecord({
305
+          success: function (res) {
306
+              voice.localId = res.localId
307
+              if (JSWE.wxStopRecordSuccess) {JSWE.wxStopRecordSuccess(res)}
308
+          },
309
+          fail: function (res) {
310
+              if (JSWE.wxStopRecordFail) {JSWE.wxStopRecordFail(res)}
311
+          }
312
+        })
313
+    }
314
+
315
+    // 4.4 播放音频
316
+    function playVoice() {
317
+        if (voice.localId == '') {
318
+            if (JSWE.wxPlayVoiceEmpty) {JSWE.wxPlayVoiceEmpty()}
319
+            return
320
+        }
321
+        wx.playVoice({
322
+            localId: voice.localId
323
+        })
324
+    }
325
+
326
+    // 4.5 暂停播放音频
327
+    function pauseVoice() {
328
+        if (voice.localId == '') {
329
+            if (JSWE.wxPauseVoiceEmpty) {JSWE.wxPauseVoiceEmpty()}
330
+            return
331
+        }
332
+        wx.pauseVoice({
333
+            localId: voice.localId
334
+        })
335
+    }
336
+
337
+    // 4.6 停止播放音频
338
+    function stopVoice() {
339
+        if (voice.localId == '') {
340
+            if (JSWE.wxStopVoiceEmpty) {JSWE.wxStopVoiceEmpty()}
341
+            return
342
+        }
343
+        wx.stopVoice({
344
+            localId: voice.localId
345
+        })
346
+    }
347
+
348
+    // 4.8 上传语音
349
+    function uploadVoice() {
350
+        var localId = voice.localId
351
+        if (localId == '') {
352
+            if (JSWE.wxUploadVoiceEmpty) {JSWE.wxUploadVoiceEmpty()}
353
+            return
354
+        }
355
+        wx.uploadVoice({
356
+            localId: localId,
357
+            success: function (res) {
358
+                voice.serverId = res.serverId
359
+                if (JSWE.wxUploadVoiceSuccess) {JSWE.wxUploadVoiceSuccess(res, localId)}
360
+            }
361
+        })
362
+    }
363
+
364
+    // 4.9 下载语音
365
+    function downloadVoice() {
366
+        var serverId = voice.serverId
367
+        if (serverId == '') {
368
+            if (JSWE.wxDownloadVoiceEmpty) {JSWE.wxDownloadVoiceEmpty()}
369
+            return
370
+        }
371
+        wx.downloadVoice({
372
+            serverId: serverId,
373
+            success: function (res) {
374
+                voice.localId = res.localId
375
+                if (JSWE.wxDownloadVoiceSuccess) {JSWE.wxDownloadVoiceSuccess(res, serverId)}
376
+            }
377
+        })
378
+    }
379
+
380
+    // 5 图片接口
381
+    var images = {
382
+        localIds: [],
383
+        serverIds: []
384
+    }
385
+    // 5.1 拍照、本地选图
386
+    function chooseImage(choose_params) {
387
+        if ('undefined' === typeof choose_params) choose_params = {}
388
+        wx.chooseImage({
389
+            count: choose_params.count || 9, // 默认9
390
+            sizeType: choose_params.sizeType || ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
391
+            sourceType: choose_params.sourceType || ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
392
+            success: function (res) {
393
+                images.localIds = res.localIds // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
394
+                // 判断是否直接上传
395
+                if (choose_params.directUpload) {setTimeout(uploadImages({localIds: images.localIds, isShowProgressTips: choose_params.isShowProgressTips || 1}), 100)}
396
+                // 拍照、本地选图成功后的回调函数
397
+                if (JSWE.wxChooseImageSuccess) {JSWE.wxChooseImageSuccess(res, choose_params.extras || {})}
398
+            }
399
+        })
400
+    }
401
+
402
+    // 5.2 图片预览
403
+    function previewImage(preview_params) {
404
+        wx.previewImage({
405
+            current: preview_params.current, // 当前显示图片的链接,不填则默认为 urls 的第一张
406
+            urls: preview_params.urls // 需要预览的图片链接列表
407
+        })
408
+    }
409
+
410
+    // 5.3 上传图片
411
+    function uploadImage(upload_params) {
412
+        // 上传图片为异步处理,重复上传同一图片,返回的serverId也是不同的
413
+        var localId = upload_params.localId
414
+        wx.uploadImage({
415
+            localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
416
+            isShowProgressTips: upload_params.isShowProgressTips || 1, // 默认为1,显示进度提示
417
+            success: function (res) {
418
+                images.serverIds.push(res.serverId) // 返回图片的服务器端ID
419
+                // 上传图片成功后的回调函数
420
+                if (JSWE.wxUploadImageSuccess) {JSWE.wxUploadImageSuccess(res, localId)}
421
+            }
422
+        })
423
+    }
424
+
425
+    function uploadImages(upload_params) {
426
+        var localIds = upload_params.localIds, isShowProgressTips = upload_params.isShowProgressTips || 1
427
+        images.serverIds = []
428
+        for (var idx in localIds) {uploadImage({localId: localIds[idx], isShowProgressTips: isShowProgressTips})}
429
+    }
430
+
431
+    // 5.4 下载图片
432
+    function downloadImage(download_params) {
433
+        var serverId = download_params.serverId
434
+        wx.downloadImage({
435
+            serverId: serverId, // 需要下载的图片的服务器端ID,由uploadImage接口获得
436
+            isShowProgressTips: download_params.isShowProgressTips || 1, // 默认为1,显示进度提示
437
+            success: function (res) {
438
+                images.localId.push(res.localId)
439
+                if (JSWE.wxDownloadImageSuccess) {JSWE.wxDownloadImageSuccess(res, serverId)}
440
+            }
441
+        })
442
+    }
443
+
444
+    function downloadImages(download_params) {
445
+        var serverIds = download_params.serverIds, isShowProgressTips = download_params.isShowProgressTips || 1
446
+        images.localIds = []
447
+        for (var idx in serverIds) {downloadImage({serverId: serverIds[idx], isShowProgressTips: isShowProgressTips})}
448
+    }
449
+
450
+    function getLocalImgData(localId) {
451
+        wx.getLocalImgData({
452
+            localId: localId, // 图片的localID
453
+            success: function (res) {
454
+                // var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
455
+                if (JSWE.wxGetLocalImgDataSuccess) {JSWE.wxGetLocalImgDataSuccess(res)}
456
+            }
457
+        })
458
+    }
459
+
460
+    // 9 微信原生接口
461
+    // 9.1.1 扫描二维码并返回结果
462
+    // 9.1.2 扫描二维码并返回结果
463
+    function scanQRCode(scan_params) {
464
+        if ('undefined' === typeof scan_params) scan_params = {}
465
+        wx.scanQRCode({
466
+            needResult: scan_params.needResult || 0,  // 默认为0,0扫描结果由微信处理,1直接返回扫描结果
467
+            scanType: scan_params.scanType || ['qrCode', 'barCode'],  // 可以指定扫二维码还是一维码,默认二者都有
468
+            success: function (res) {  // 当 needResult 为 1 时,扫码返回的结果
469
+                if (JSWE.wxScanQRCodeSuccess) {JSWE.wxScanQRCodeSuccess(res)}
470
+            }
471
+        })
472
+    }
473
+
474
+    // QRCode & BarCode is different
475
+    function parseScanQRCodeResultStr(resultStr) {
476
+        var strs = resultStr.split(',')
477
+        return strs[strs.length - 1]
478
+    }
479
+
480
+    // 10 微信支付接口
481
+    // 10.1 发起一个支付请求
482
+    function chooseWXPay(wxpay_params) {
483
+        wx.chooseWXPay({
484
+            timestamp: wxpay_params.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
485
+            nonceStr: wxpay_params.nonceStr, // 支付签名随机串,不长于 32 位
486
+            package: wxpay_params.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
487
+            signType: wxpay_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
488
+            paySign: wxpay_params.paySign, // 支付签名
489
+            success: function (res) {
490
+                // 支付成功后的回调函数
491
+                if (JSWE.wxPaySuccess) {JSWE.wxPaySuccess(res)}
492
+            }
493
+        })
494
+    }
495
+
496
+    // xx 微信原生企业红包接口
497
+    // xx.1 发起一个发送原生企业红包请求
498
+    function openEnterpriseRedPacket(wxredpack_params) {
499
+        wx.openEnterpriseRedPacket({
500
+            timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
501
+            nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位
502
+            package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***)
503
+            signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
504
+            paySign: wxredpack_params.paySign, // 红包签名
505
+            success: function (res) {
506
+                // 发送原生企业红包成功后的回调函数
507
+                if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
508
+            }
509
+        })
510
+    }
511
+
512
+    var v = {
513
+        version: '1.0.5',
514
+
515
+        // Basic Vars
516
+        config: config,
517
+        wxData: wxData,
518
+        jsApiList: jsApiList,
519
+
520
+        isEmpty: isEmpty,
521
+        isNotEmpty: isNotEmpty,
522
+
523
+        // Weixin Function
524
+        isOpenInWeixin: isOpenInWeixin,
525
+        getWeixinVersion: getWeixinVersion,
526
+        isWeixinVersion: isWeixinVersion,
527
+
528
+        // Menu Function
529
+        hideOptionMenu: hideOptionMenu,
530
+        showOptionMenu: showOptionMenu,
531
+        hideMenuItems: hideMenuItems,
532
+        showMenuItems: showMenuItems,
533
+        hideAllNonBaseMenuItem: hideAllNonBaseMenuItem,
534
+        showAllNonBaseMenuItem: showAllNonBaseMenuItem,
535
+        closeWindow: closeWindow,
536
+
537
+        // Share Function
538
+        initWxData: initWxData,
539
+        changeWxData: changeWxData,
540
+        fixedWxData: fixedWxData,
541
+
542
+        // Voice Function
543
+        voice: voice,
544
+        translateVoice: translateVoice,
545
+        startRecord: startRecord,
546
+        stopRecord: stopRecord,
547
+        playVoice: playVoice,
548
+        pauseVoice: pauseVoice,
549
+        stopVoice: stopVoice,
550
+        uploadVoice: uploadVoice,
551
+        downloadVoice: downloadVoice,
552
+
553
+        // Image Function
554
+        images: images,
555
+        chooseImage: chooseImage,
556
+        previewImage: previewImage,
557
+        uploadImage: uploadImage,
558
+        uploadImages: uploadImages,
559
+        downloadImage: downloadImage,
560
+        downloadImages: downloadImages,
561
+        getLocalImgData: getLocalImgData,
562
+
563
+        // Scan Function
564
+        scanQRCode: scanQRCode,
565
+        parseScanQRCodeResultStr: parseScanQRCodeResultStr,
566
+
567
+        // Pay Function
568
+        chooseWXPay: chooseWXPay,
569
+
570
+        // EnterpriseRedPacket Function
571
+        openEnterpriseRedPacket: openEnterpriseRedPacket
572
+    }
573
+    e.JSWE = e.V = v
574
+})(window)

+ 56 - 0
tiwen/urls.py

@@ -0,0 +1,56 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+"""tiwen URL Configuration
4
+
5
+The `urlpatterns` list routes URLs to views. For more information please see:
6
+    https://docs.djangoproject.com/en/1.11/topics/http/urls/
7
+Examples:
8
+Function views
9
+    1. Add an import:  from my_app import views
10
+    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
11
+Class-based views
12
+    1. Add an import:  from other_app.views import Home
13
+    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
14
+Including another URLconf
15
+    1. Import the include() function: from django.conf.urls import url, include
16
+    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
17
+"""
18
+from django.conf import settings
19
+from django.conf.urls.static import static
20
+from django.contrib import admin
21
+from django.urls import include, re_path
22
+
23
+
24
+urlpatterns = [
25
+    re_path(r'^admin/', admin.site.urls),
26
+]
27
+
28
+urlpatterns += [
29
+    re_path(r'^api/', include(('api.urls', 'api'), namespace='api')),
30
+    re_path(r'^uniapi/', include(('django_uniapi.urls', 'uniapi'), namespace='uniapi')),
31
+]
32
+
33
+urlpatterns += [
34
+    # url(r'^s/', include(('django_short_url.urls', 'django_short_url'), namespace='django_short_url')),
35
+]
36
+
37
+urlpatterns += [
38
+    re_path(r'^w/', include(('django_we.urls', 'shortwechat'), namespace='shortwechat')),
39
+    re_path(r'^we/', include(('django_we.urls', 'wechat'), namespace='wechat')),
40
+]
41
+
42
+urlpatterns += [
43
+    # re_path(r'^p/', include(('page.urls', 'shortpage'), namespace='shortpage')),
44
+    # re_path(r'^page/', include(('page.urls', 'page'), namespace='page')),
45
+]
46
+
47
+if settings.DEBUG:
48
+    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
49
+    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
50
+
51
+# AdminSite
52
+admin.site.site_header = 'Django administration'
53
+admin.site.site_title = 'Django site admin'
54
+# Make site_url/index_title None to hidden
55
+admin.site.site_url = '/'
56
+admin.site.index_title = 'Site administration'

+ 17 - 0
tiwen/wsgi.py

@@ -0,0 +1,17 @@
1
+"""
2
+WSGI config for tiwen project.
3
+
4
+It exposes the WSGI callable as a module-level variable named ``application``.
5
+
6
+For more information on this file, see
7
+https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
8
+"""
9
+
10
+import os
11
+
12
+from django.core.wsgi import get_wsgi_application
13
+
14
+
15
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tiwen.settings")
16
+
17
+application = get_wsgi_application()

+ 0 - 0
utils/__init__.py


+ 0 - 0
utils/error/__init__.py


+ 77 - 0
utils/error/errno_utils.py

@@ -0,0 +1,77 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from StatusCode import BaseStatusCode, StatusCodeField
4
+
5
+
6
+class ParamStatusCode(BaseStatusCode):
7
+    """ 4000xx 参数相关错误码 """
8
+    PARAM_NOT_FOUND = StatusCodeField(400000, 'Param Not Found', description='参数不存在')
9
+
10
+
11
+class ProfileStatusCode(BaseStatusCode):
12
+    """ 4001xx 用户相关错误码 """
13
+    PROFILE_NOT_FOUND = StatusCodeField(400101, 'Profile Not Found', description='用户不存在')
14
+
15
+
16
+class PhoneStatusCode(BaseStatusCode):
17
+    """ 4002xx 手机相关错误码 """
18
+    INVALID_PHONE = StatusCodeField(400200, 'Invalid Phone', description='非法手机号')
19
+    PHONE_NOT_FOUND = StatusCodeField(400201, 'Phone Not Found', description='手机号不存在')
20
+    PHONE_ALREADY_EXISTS = StatusCodeField(400202, 'Phone Already Exists', description='手机号已存在')
21
+
22
+
23
+class OrderStatusCode(BaseStatusCode):
24
+    """ 4040xx 订单/支付相关错误码 """
25
+    UNIFIED_ORDER_FAIL = StatusCodeField(404000, 'Unified Order Fail', description='统一下单失败')
26
+    ORDER_NOT_FOUND = StatusCodeField(404001, 'Order Not Found', description='订单不存在')
27
+    # 订单支付状态
28
+    ORDER_NOT_PAY = StatusCodeField(404011, 'Order Not Pay', description='订单未支付')
29
+    ORDER_PAYING = StatusCodeField(404012, 'Order Paying', description='订单支付中')
30
+    ORDER_PAY_FAIL = StatusCodeField(404013, 'Order Pay Fail', description='微信支付失败')
31
+    # 通知校验状态
32
+    SIGN_CHECK_FAIL = StatusCodeField(404090, 'Sign Check Fail', description='签名校验失败')
33
+    FEE_CHECK_FAIL = StatusCodeField(404091, 'FEE Check Fail', description='金额校验失败')
34
+
35
+
36
+class PayStatusCode(BaseStatusCode):
37
+    """ 4041xx 支付相关错误码 """
38
+
39
+
40
+class WithdrawStatusCode(BaseStatusCode):
41
+    """ 4042xx 提现相关错误码 """
42
+    BALANCE_INSUFFICIENT = StatusCodeField(404200, 'Balance Insufficient', description='提现金额不足')
43
+
44
+
45
+class TokenStatusCode(BaseStatusCode):
46
+    """ 4090xx 票据相关错误码 """
47
+    TOKEN_NOT_FOUND = StatusCodeField(409001, 'Token Not Found', description='票据不存在')
48
+
49
+
50
+class SignatureStatusCode(BaseStatusCode):
51
+    """ 4091xx 签名校验错误 """
52
+    SIGNATURE_ERROR = StatusCodeField(409101, 'Signature Error', description='签名错误')
53
+
54
+
55
+class GVCodeStatusCode(BaseStatusCode):
56
+    """ 4092xx 图形验证码相关错误码 """
57
+    GRAPHIC_VCODE_ERROR = StatusCodeField(409201, 'Graphic VCode Error', description='图形验证码错误')
58
+
59
+
60
+class SVCodeStatusCode(BaseStatusCode):
61
+    """ 4093xx 短信验证码相关错误码 """
62
+    SMS_QUOTA_LIMIT = StatusCodeField(409300, 'SMS Quota Limit', description='短信次数超限')
63
+    SMS_VCODE_ERROR = StatusCodeField(409301, 'SMS VCode Error', description='验证码错误,请稍后重试')
64
+    SMS_VCODE_HAS_SEND = StatusCodeField(409302, 'SMS VCode Has Send', description='验证码已发送,请勿重复获取')
65
+
66
+
67
+class InsufficientStatusCode(BaseStatusCode):
68
+    """ 4095xx 不足相关错误码 """
69
+    BALANCE_INSUFFICIENT = StatusCodeField(409501, 'Balance Insufficient', description='余额不足')
70
+    INTEGRAL_INSUFFICIENT = StatusCodeField(409502, 'Integral Insufficient', description='积分不足')
71
+
72
+
73
+class PermissionStatusCode(BaseStatusCode):
74
+    """ 4099xx 权限相关错误码 """
75
+    PERMISSION_DENIED = StatusCodeField(409900, 'Permission Denied', description='权限不足')
76
+    UPLOAD_PERMISSION_DENIED = StatusCodeField(409910, 'Upload Permission Denied', description='上传权限不足')
77
+    UPDATE_PERMISSION_DENIED = StatusCodeField(409930, 'Update Permission Denied', description='更新权限不足')

+ 24 - 0
utils/error/response_utils.py

@@ -0,0 +1,24 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from json_response import JsonpResponse, JsonResponse
4
+from StatusCode import StatusCodeField
5
+
6
+
7
+def response_data(status_code=200, message=None, description=None, data={}, **kwargs):
8
+    return dict({
9
+        'status': status_code,
10
+        'message': message,
11
+        'description': description,
12
+        'data': data,
13
+    }, **kwargs)
14
+
15
+
16
+def response(status_code=200, message=None, description=None, data={}, msg_args=[], msg_kwargs={}, desc_args=[], desc_kwargs={}, request=None, callback=None, **kwargs):
17
+    # Final Message and Description
18
+    message, description = (message or status_code.message, description or status_code.description) if isinstance(status_code, StatusCodeField) else (message, description)
19
+    # Final Response Data
20
+    resp_data = response_data(status_code, (message or '').format(*msg_args, **msg_kwargs), (description or '').format(*desc_args, **desc_kwargs), data, **kwargs)
21
+    # Assign Callback
22
+    callback = callback or (request and request.GET.get('callback'))
23
+    # Call JsonResponse or JsonpResponse
24
+    return JsonpResponse(callback, resp_data, safe=False) if callback else JsonResponse(resp_data, safe=False)

+ 0 - 0
utils/redis/__init__.py


+ 6 - 0
utils/redis/connect.py

@@ -0,0 +1,6 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+
5
+
6
+r = settings.REDIS_CACHE

+ 1 - 0
utils/redis/rkeys.py

@@ -0,0 +1 @@
1
+# -*- coding: utf-8 -*-

+ 0 - 0
utils/user/__init__.py


+ 18 - 0
utils/user/userinfo_save.py

@@ -0,0 +1,18 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+
4
+def userinfo_save(userinfo):
5
+    """ Save profile or something else """
6
+    # from account.models import UserInfo
7
+    # from django.conf import settings
8
+    #
9
+    # unique_identifier = userinfo.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
10
+    #
11
+    # user, created = UserInfo.objects.select_for_update().get_or_create(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
12
+    # user.unionid = userinfo.get('unionid', '')
13
+    # user.openid = userinfo.get('openid', '')
14
+    # user.nickname = userinfo.get('nickname', '')
15
+    # user.avatar = userinfo.get('headimgurl', '')
16
+    # user.save()
17
+    #
18
+    # return user

Add pc website · feebb32686 - Gogs: Go Git Service

Add pc website

Brightcells 8 年之前
父節點
當前提交
feebb32686

+ 77 - 0
website/pc/aboutus.html

@@ -0,0 +1,77 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+<meta charset="UTF-8">
5
+<title>拍爱 PAI.AI 关于我们</title>
6
+<meta name="keywords" content="摄影 图片 影像 分享 交流 社交 交友 摄影师 女性 孩子 亲子 旅行 旅游 约拍 iphone android app" />
7
+<link href="css/layout.css" rel="stylesheet" type="text/css" />
8
+<script type="text/javascript" src="js/jquery.min.js"></script>
9
+</head>
10
+
11
+<body>
12
+<div id="header">
13
+	<div class="content">
14
+	    <a href="index.html" target="_self" class="logo"></a>
15
+		<div class="navigation">
16
+			<a href="contactus.html" target="_self" >联系我们</a>
17
+			<a href="joinus.html" target="_self" >加入拍爱</a>
18
+			<a href="aboutus.html" target="_self"class="current" >关于我们</a>
19
+			<a href="index.html" target="_self" >首页</a>
20
+		</div>
21
+	</div>	
22
+</div>
23
+
24
+
25
+
26
+
27
+<div id="container" >
28
+	<div class="content aboutus">
29
+	  <div class="container_box">
30
+		   <p><strong>关于拍爱 PAI.AI </strong><br> 
31
+一起走过的路,<br>
32
+
33
+一起看过的美景,<br>
34
+
35
+一起醉过的Party,<br>
36
+
37
+……<br>
38
+
39
+回忆容易消逝,<br>
40
+
41
+一起拍,<br>
42
+
43
+照片让爱历久弥新。<br>
44
+
45
+拍爱——用心拍,分享爱<br>
46
+
47
+拍爱让您和小伙伴更便捷、更快速——几乎是一瞬间,分享拍摄的照片。<br>
48
+
49
+不论是聚会,还是旅行。<br>
50
+
51
+拍摄即分享。<br>
52
+
53
+你可以对照片点赞、评论,零距离互动。<br>
54
+
55
+不论手机丢失还是损坏,<br>
56
+
57
+照片一直在拍爱等你。
58
+	</p>
59
+
60
+	       
61
+	      	       
62
+      </div>
63
+    </div>
64
+</div>
65
+
66
+
67
+
68
+<div id="footer">
69
+	<div class="content foot">
70
+	<a href="aboutus.html" target="_self" >关于我们</a>
71
+	<span>|</span>
72
+	<a href="contactus.html" target="_self" >联系我们</a>
73
+	©2016 拍爱 PAI.AI 琼ICP备16000076号
74
+	</div>
75
+</div>
76
+</body>
77
+</html>

+ 112 - 0
website/pc/contactus.html

@@ -0,0 +1,112 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+<meta charset="UTF-8">
5
+<title>拍爱 PAI.AI 联系我们</title>
6
+<meta name="keywords" content="摄影 图片 影像 分享 交流 社交 交友 摄影师 女性 孩子 亲子 旅行 旅游 约拍 iphone android app" />
7
+<link href="css/layout.css" rel="stylesheet" type="text/css" />
8
+<script type="text/javascript" src="js/jquery.min.js"></script>
9
+<style>
10
+        
11
+        .my-map { margin: 0 auto 30px auto; width: 550px; height: 350px;float:left}
12
+        .my-map .icon { background: url(http://lbs.amap.com/console/public/show/marker.png) no-repeat; }
13
+        .my-map .icon-cir { height: 31px; width: 28px; }
14
+        .my-map .icon-cir-red { background-position: -11px -5px; }
15
+    </style>
16
+</head>
17
+
18
+<body>
19
+<div id="header">
20
+	<div class="content">
21
+	    <a href="index.html" target="_self" class="logo"></a>
22
+		<div class="navigation">
23
+			<a href="contactus.html" target="_self" class="current">联系我们</a>
24
+			<a href="joinus.html" target="_self" >加入拍爱</a>
25
+			<a href="aboutus.html" target="_self" >关于我们</a>
26
+			<a href="index.html" target="_self" >首页</a>
27
+		</div>
28
+	</div>	
29
+</div>
30
+
31
+
32
+<div id="container" ><div class="content contactus">
33
+	
34
+	
35
+	
36
+<div id="wrap" class="my-map map">
37
+        <div id="mapContainer"></div>
38
+    </div>
39
+    <script src="http://webapi.amap.com/maps?v=1.2&key=8325164e247e15eea68b59e89200988b"></script>
40
+    <script>
41
+    !function(){
42
+        var infoWindow, map, level = 16,
43
+            center = {lng: 116.284361, lat: 39.931229},
44
+            features = [{type: "Marker", name: "拍爱 PAI.AI", desc: "北京市海淀区西八里庄路玲珑商务楼", color: "red", icon: "cir", offset: {x: -9, y: -31}, lnglat: {lng: 116.28449, lat: 39.930834}}];
45
+ 
46
+        function loadFeatures(){
47
+            for(var feature, data, i = 0, len = features.length, j, jl, path; i < len; i++){
48
+                data = features[i];
49
+                switch(data.type){
50
+                    case "Marker":
51
+                        feature = new AMap.Marker({ map: map, position: new AMap.LngLat(data.lnglat.lng, data.lnglat.lat),
52
+                            zIndex: 3, extData: data, offset: new AMap.Pixel(data.offset.x, data.offset.y), title: data.name,
53
+                            content: '<div class="icon icon-' + data.icon + ' icon-'+ data.icon +'-' + data.color +'"></div>' });
54
+                        break;
55
+                    case "Polyline":
56
+                        for(j = 0, jl = data.lnglat.length, path = []; j < jl; j++){
57
+                            path.push(new AMap.LngLat(data.lnglat[j].lng, data.lnglat[j].lat));
58
+                        }
59
+                        feature = new AMap.Polyline({ map: map, path: path, extData: data, zIndex: 2,
60
+                            strokeWeight: data.strokeWeight, strokeColor: data.strokeColor, strokeOpacity: data.strokeOpacity });
61
+                        break;
62
+                    case "Polygon":
63
+                        for(j = 0, jl = data.lnglat.length, path = []; j < jl; j++){
64
+                            path.push(new AMap.LngLat(data.lnglat[j].lng, data.lnglat[j].lat));
65
+                        }
66
+                        feature = new AMap.Polygon({ map: map, path: path, extData: data, zIndex: 1,
67
+                            strokeWeight: data.strokeWeight, strokeColor: data.strokeColor, strokeOpacity: data.strokeOpacity,
68
+                            fillColor: data.fillColor, fillOpacity: data.fillOpacity });
69
+                        break;
70
+                    default: feature = null;
71
+                }
72
+                if(feature){ AMap.event.addListener(feature, "click", mapFeatureClick); }
73
+            }
74
+        }
75
+ 
76
+        function mapFeatureClick(e){
77
+            if(!infoWindow){ infoWindow = new AMap.InfoWindow({autoMove: true}); }
78
+            var extData = e.target.getExtData();
79
+            infoWindow.setContent("<h5>" + extData.name + "</h5><div>" + extData.desc + "</div>");
80
+            infoWindow.open(map, e.lnglat);
81
+        }
82
+ 
83
+        map = new AMap.Map("mapContainer", {center: new AMap.LngLat(center.lng, center.lat), level: level});
84
+         
85
+        loadFeatures();
86
+        map.plugin(["AMap.ToolBar", "AMap.OverView", "AMap.Scale"], function(){
87
+            map.addControl(new AMap.ToolBar);
88
+            map.addControl(new AMap.OverView({isOpen: true}));
89
+            map.addControl(new AMap.Scale);
90
+        });
91
+    }();
92
+    </script>	
93
+	
94
+	<p style="width:400px;float:right"><img src="img/weixin_qr.png" ><br><strong>关注拍爱 官方微信:</strong>pai_ai</p>
95
+	<p style="width:400px;float:right">
96
+		<strong>商务合作:</strong>partner@pai.ai<br>
97
+		
98
+		<strong>用户反馈及帮助:</strong>feedback@pai.ai<br>
99
+		<strong>公司地址:</strong>北京市海淀区西八里庄路玲珑商务楼
100
+	</p>
101
+	
102
+</div></div>
103
+<div id="footer">
104
+	<div class="content foot">
105
+	<a href="aboutus.html" target="_self" >关于我们</a>
106
+	<span>|</span>
107
+	<a href="contactus.html" target="_self" >联系我们</a>
108
+	©2016 拍爱 PAI.AI 琼ICP备16000076号
109
+	</div>
110
+</div>
111
+</body>
112
+</html>

+ 42 - 0
website/pc/css/layout.css

@@ -0,0 +1,42 @@
1
+@charset "UTF-8";
2
+/* CSS Document */
3
+body{font:9pt 微软雅黑,microsoft yahei,arial;color:#666;margin:0;padding:0;}
4
+div,ul,ol,li,span,p,h1,h2,h3,h4,strong,lable{margin:0;padding:0}
5
+input{margin:0;padding:0;font:9pt microsoft yahei,arial;color:#333;border:none;outline:none}
6
+ul,ol,li{list-style-type:none;}
7
+img{border:none}
8
+a{text-decoration:none}
9
+#header,#container,#footer{width:100%;float:left;padding:10px 0;}
10
+#header{background:#fff;opacity:0.95}
11
+#footer{margin:50px 0 0 0}
12
+.content_bg{background:url(../img/bg2.jpg) center -150px no-repeat;}
13
+.content,.joinus,.contactus{width:1000px;margin:0 auto;}
14
+.container_box{width:100%;height:600px;float:left;position:relative;}
15
+.navigation{width:auto;float:right;padding:10px }
16
+.navigation a{float:right;padding:10px;margin-left:30px;color:#666;font-size:12pt;line-height:34px}
17
+.navigation a:hover{color:#da6293}
18
+.navigation .current{color:#da6293}
19
+.logo{width:200px;height:70px;float:left;background:url(../img/logo.png) center center no-repeat;}
20
+.mobile{width:300px;height:530px;background: url(../img/mobile.png) center center no-repeat;position:absolute;left:170px;top: 41px;background-size:320px 520px}
21
+.mb_img{width:226px;height:399px;background:url(../img/mobile_img.png) center center no-repeat;position:absolute;left:206px;top:105px;background-size:cover}
22
+
23
+.article{font-size: 30pt;line-height: 55px;font-weight:100;color: #fff;width:400px;float:right;position:absolute;right:80px ;top: 110px;}
24
+.article span{background:url(../img/text-bg.png) center center ;float:left;padding:10px 51px;clear:both;-webkit-border-radius: 10px;moz-border-radius: 10px;border-radius: 10px;}
25
+.ios_download{width:105px;height:50px;padding:0 20px;position:absolute;left:520px;top:450px;color:#fff;font-size:11pt;line-height:50px; text-align:right;-webkit-border-radius: 5px;moz-border-radius: 5px;border-radius: 5px;background:#35c3fc url(../img/ios.png) 2px center no-repeat;background-size:45px 45px}
26
+
27
+.android_download{width:85px;height:50px;padding:0 30px;position:absolute;left:680px;top:450px;color:#fff;font-size:11pt;line-height:50px; text-align:right;-webkit-border-radius: 5px;moz-border-radius: 5px;border-radius: 5px;background:#fc6087 url(../img/android.png) 7px center no-repeat;background-size:45px 45px}
28
+
29
+
30
+
31
+.article p{width:auto;float:left;margin: 30px 0 0 0;color: #fff;font-size: 14pt;line-height:38px;font-weight: 200;text-align: left;clear:both;background:url(../img/text-bg.png) center center;display:inline-block;padding:10px 30px;-webkit-border-radius: 10px;moz-border-radius: 10px;border-radius: 10px;}
32
+
33
+
34
+
35
+.joinus p,.contactus p,.aboutus p{width:100%;margin:0 0 50px 0;line-height:25px;float:left}
36
+.joinus p{border-top:1px dotted #ddd;padding:50px 0 0 0}
37
+.aboutus p{float:left;width:100%;text-align:left;font-size:12pt;line-height:35px}
38
+.aboutus p strong{width:100%;font-size:14pt;font-weight:bold;margin:0 0 20px 0;float:left}
39
+.map{width:100%;float:left}
40
+.foot{text-align:center;line-height:30px;padding: 25px 0 50px 0}
41
+.foot a{color:#333;padding:10px;}
42
+.homefooter,.homefooter a{color:#fff}

二進制
website/pc/img/android.png


二進制
website/pc/img/android_button.png


二進制
website/pc/img/bg2.jpg


二進制
website/pc/img/ios.png


二進制
website/pc/img/logo.png


二進制
website/pc/img/mobile.png


二進制
website/pc/img/mobile_img.png


二進制
website/pc/img/text-bg.png


二進制
website/pc/img/weixin_qr.png


+ 49 - 0
website/pc/index.html

@@ -0,0 +1,49 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+<meta charset="UTF-8">
5
+<title>拍爱 PAI.AI 首页</title>
6
+<meta name="keywords" content="摄影 图片 影像 分享 交流 社交 交友 摄影师 女性 孩子 亲子 旅行 旅游 约拍 iphone android app" />
7
+<link href="css/layout.css" rel="stylesheet" type="text/css" />
8
+<script type="text/javascript" src="js/jquery.min.js"></script>
9
+</head>
10
+
11
+<body class="content_bg">
12
+<div id="header">
13
+	<div class="content">
14
+	    <a href="index.html" target="_self" class="logo"></a>
15
+		<div class="navigation">
16
+			<a href="contactus.html" target="_self" >联系我们</a>
17
+			<a href="joinus.html" target="_self" >加入拍爱</a>
18
+			<a href="aboutus.html" target="_self" >关于我们</a>
19
+			<a href="index.html" target="_self" class="current" >首页</a>
20
+		</div>
21
+	</div>	
22
+</div>
23
+
24
+
25
+<div id="container" >
26
+	<div class="content">
27
+	  <div class="container_box">
28
+	       <div class="mobile"></div>
29
+	       <div class="mb_img"></div>
30
+	       <div class="article"><span>即拍即分享</span><p>一起走过的路,<br>一起看过的美景,<br>一起醉过的Party,......<br>回忆容易消逝,<br>一起拍,照片让爱历久弥新。</p></div>
31
+	       <a href="https://itunes.apple.com/cn/app/pai-aipaiai/id1163960351?mt=8" target="_blank" class="ios_download">iPhone下载</a>
32
+           <a href="" target="_blank" class="android_download">安卓下载</a>
33
+      </div>
34
+    </div>
35
+</div>
36
+    
37
+    
38
+<div id="footer">
39
+	<div class="content foot homefooter">
40
+	<a href="aboutus.html" target="_self" >关于我们</a>
41
+	<span>|</span>
42
+	<a href="contactus.html" target="_self" >联系我们</a>
43
+ 
44
+	©2016 拍爱 PAI.AI 琼ICP备16000076号
45
+	</div>
46
+</div>
47
+	
48
+</body>
49
+</html>

+ 72 - 0
website/pc/joinus.html

@@ -0,0 +1,72 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+<meta charset="UTF-8">
5
+<title>拍爱 PAI.AI 加入拍爱</title>
6
+<meta name="keywords" content="摄影 图片 影像 分享 交流 社交 交友 摄影师 女性 孩子 亲子 旅行 旅游 约拍 iphone android app" />
7
+<link href="css/layout.css" rel="stylesheet" type="text/css" />
8
+<script type="text/javascript" src="js/jquery.min.js"></script>
9
+</head>
10
+
11
+<body>
12
+<div id="header">
13
+	<div class="content">
14
+	    <a href="index.html" target="_self" class="logo"></a>
15
+		<div class="navigation">
16
+			<a href="contactus.html" target="_self" >联系我们</a>
17
+			<a href="joinus.html" target="_self" class="current" >加入拍爱</a>
18
+			<a href="aboutus.html" target="_self" >关于我们</a>
19
+			<a href="index.html" target="_self" >首页</a>
20
+		</div>
21
+	</div>	
22
+</div>
23
+
24
+
25
+<div id="container" ><div class="content joinus">
26
+	<p>
27
+		 在我们这里,你可以参与到一个火热的创业项目,未来很有可能看到自己作品满大街的人都在使用...如果您喜欢摄影...除了会有各种相机把玩,还会有同好可以畅聊...最重要的,你还会发现......
28
+    你将成为——软件工程师中最懂摄影的人
29
+来和我们一起做一份激动人心的事业吧
30
+		
31
+	</p>	
32
+	<p>
33
+<strong>职位名称:iOS软件工程师</strong><br>
34
+<strong>岗位职责:</strong><br>
35
+     负责iOS平台下应用的开发<br>
36
+ 
37
+<strong>任职要求:</strong><br>
38
+     1、至少1年的iOS平台开发经验;<br>
39
+     2、具备扎实的数据结构、算法等技术功底;<br>
40
+     3、具备良好的编程风格与团队合作意识,可承担较大的工作压力;<br>
41
+     4、正直、优秀、有上进心,经验丰富的同时没有丧失开发NB产品的热情;<br>
42
+     5、年轻;<br>
43
+     6、期待您喜欢摄影,喜欢相机;<br>
44
+
45
+		
46
+	</p>
47
+		
48
+	<p>
49
+	<strong>职位名称:专利工程师</strong><br>
50
+<strong>岗位职责:</strong><br>
51
+1、撰写高质量的专利申请文件、答复审查意见;<br>
52
+2、专利检索咨询、专利挖掘、以及撰写专利分析报告。<br>
53
+
54
+<strong>任职要求:</strong><br>
55
+1、具有一年以上独立撰写专利文件经验,熟悉专利申请相关知识;<br>
56
+2、理工科,大学本科以上毕业,物理、数学、电子、通讯、互联网等技术专业背景之一;<br>
57
+3、有专利代理人资格证优先考虑;<br>
58
+4、期待您喜欢摄影,喜欢相机;
59
+</p>	
60
+	
61
+	
62
+</div></div>
63
+<div id="footer">
64
+	<div class="content foot">
65
+	<a href="aboutus.html" target="_self" >关于我们</a>
66
+	<span>|</span>
67
+	<a href="contactus.html" target="_self" >联系我们</a>
68
+	©2016 拍爱 PAI.AI 琼ICP备16000076号
69
+	</div>
70
+</div>
71
+</body>
72
+</html>

+ 3 - 0
website/pc/js/jquery.min.js.js

@@ -0,0 +1,3 @@
1
+(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
2
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
3
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);// JavaScript Document