aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorne (Richard Coles) <torne@google.com>2014-06-20 14:52:47 +0100
committerTorne (Richard Coles) <torne@google.com>2014-06-20 14:52:47 +0100
commitb8347ad8ead685b8afe0ff329ae047f17c7b817c (patch)
tree6b0965940e7059bb96891e00e9fe8da7a8383c33
parentbe7edd6e608768a423c246f9f13c632349a31c5f (diff)
parentd56141c71497da3224256e3d007f4ab1b8bf4ed4 (diff)
downloadsrc-b8347ad8ead685b8afe0ff329ae047f17c7b817c.tar.gz
Merge from Chromium at DEPS revision 278205
This commit was generated by merge_to_master.py. Change-Id: I54dfe87045260dd68161b9e69e4e6d099ec06849
-rw-r--r--codereview.settings4
-rw-r--r--cpp/LICENSE.chromium27
-rw-r--r--cpp/README88
-rw-r--r--cpp/grit.gyp55
-rw-r--r--cpp/gtest.gyp58
-rw-r--r--cpp/include/libaddressinput/address_data.h92
-rw-r--r--cpp/include/libaddressinput/address_field.h46
-rw-r--r--cpp/include/libaddressinput/address_formatter.h51
-rw-r--r--cpp/include/libaddressinput/address_input_helper.h67
-rw-r--r--cpp/include/libaddressinput/address_metadata.h36
-rw-r--r--cpp/include/libaddressinput/address_normalizer.h49
-rw-r--r--cpp/include/libaddressinput/address_problem.h68
-rw-r--r--cpp/include/libaddressinput/address_ui.h48
-rw-r--r--cpp/include/libaddressinput/address_ui_component.h49
-rw-r--r--cpp/include/libaddressinput/address_validator.h111
-rw-r--r--cpp/include/libaddressinput/callback.h95
-rw-r--r--cpp/include/libaddressinput/downloader.h55
-rw-r--r--cpp/include/libaddressinput/localization.h101
-rw-r--r--cpp/include/libaddressinput/null_storage.h48
-rw-r--r--cpp/include/libaddressinput/ondemand_supplier.h72
-rw-r--r--cpp/include/libaddressinput/preload_supplier.h101
-rw-r--r--cpp/include/libaddressinput/region_data.h77
-rw-r--r--cpp/include/libaddressinput/region_data_builder.h80
-rw-r--r--cpp/include/libaddressinput/storage.h64
-rw-r--r--cpp/include/libaddressinput/supplier.h55
-rw-r--r--cpp/include/libaddressinput/util/basictypes.h214
-rw-r--r--cpp/include/libaddressinput/util/scoped_ptr.h445
-rw-r--r--cpp/include/libaddressinput/util/template_util.h111
-rw-r--r--cpp/libaddressinput.gyp82
-rw-r--r--cpp/libaddressinput.gypi95
-rw-r--r--cpp/rapidjson.gyp29
-rw-r--r--cpp/re2.gyp33
-rw-r--r--cpp/res/messages.grd34
-rw-r--r--cpp/res/messages.grdp244
-rw-r--r--cpp/src/address_data.cc150
-rw-r--r--cpp/src/address_field.cc46
-rw-r--r--cpp/src/address_field_util.cc112
-rw-r--r--cpp/src/address_field_util.h44
-rw-r--r--cpp/src/address_formatter.cc197
-rw-r--r--cpp/src/address_input_helper.cc180
-rw-r--r--cpp/src/address_metadata.cc62
-rw-r--r--cpp/src/address_normalizer.cc88
-rw-r--r--cpp/src/address_problem.cc44
-rw-r--r--cpp/src/address_ui.cc138
-rw-r--r--cpp/src/address_validator.cc46
-rw-r--r--cpp/src/format_element.cc52
-rw-r--r--cpp/src/format_element.h70
-rw-r--r--cpp/src/grit.h36
-rw-r--r--cpp/src/language.cc102
-rw-r--r--cpp/src/language.h49
-rw-r--r--cpp/src/localization.cc206
-rw-r--r--cpp/src/lookup_key.cc158
-rw-r--r--cpp/src/lookup_key.h75
-rw-r--r--cpp/src/lookup_key_util.cc46
-rw-r--r--cpp/src/lookup_key_util.h59
-rw-r--r--cpp/src/null_storage.cc41
-rw-r--r--cpp/src/ondemand_supplier.cc72
-rw-r--r--cpp/src/ondemand_supply_task.cc141
-rw-r--r--cpp/src/ondemand_supply_task.h72
-rw-r--r--cpp/src/post_box_matchers.cc132
-rw-r--r--cpp/src/post_box_matchers.h38
-rw-r--r--cpp/src/preload_supplier.cc238
-rw-r--r--cpp/src/region_data.cc51
-rw-r--r--cpp/src/region_data_builder.cc147
-rw-r--r--cpp/src/region_data_constants.cc1467
-rw-r--r--cpp/src/region_data_constants.h37
-rw-r--r--cpp/src/retriever.cc125
-rw-r--r--cpp/src/retriever.h74
-rw-r--r--cpp/src/rule.cc270
-rw-r--r--cpp/src/rule.h156
-rw-r--r--cpp/src/rule_retriever.cc80
-rw-r--r--cpp/src/rule_retriever.h59
-rw-r--r--cpp/src/util/json.cc196
-rw-r--r--cpp/src/util/json.h76
-rw-r--r--cpp/src/util/md5.cc299
-rw-r--r--cpp/src/util/md5.h73
-rw-r--r--cpp/src/util/re2ptr.h46
-rw-r--r--cpp/src/util/string_compare.cc56
-rw-r--r--cpp/src/util/string_compare.h46
-rw-r--r--cpp/src/util/string_split.cc37
-rw-r--r--cpp/src/util/string_split.h34
-rw-r--r--cpp/src/util/string_util.cc69
-rw-r--r--cpp/src/util/string_util.h28
-rw-r--r--cpp/src/validating_storage.cc97
-rw-r--r--cpp/src/validating_storage.h64
-rw-r--r--cpp/src/validating_util.cc141
-rw-r--r--cpp/src/validating_util.h55
-rw-r--r--cpp/src/validation_task.cc264
-rw-r--r--cpp/src/validation_task.h102
-rw-r--r--cpp/test/address_data_test.cc205
-rw-r--r--cpp/test/address_field_test.cc38
-rw-r--r--cpp/test/address_field_util_test.cc94
-rw-r--r--cpp/test/address_formatter_test.cc201
-rw-r--r--cpp/test/address_input_helper_test.cc359
-rw-r--r--cpp/test/address_metadata_test.cc68
-rw-r--r--cpp/test/address_normalizer_test.cc113
-rw-r--r--cpp/test/address_problem_test.cc38
-rw-r--r--cpp/test/address_ui_test.cc232
-rw-r--r--cpp/test/address_validator_test.cc335
-rw-r--r--cpp/test/fake_downloader.cc178
-rw-r--r--cpp/test/fake_downloader.h75
-rw-r--r--cpp/test/fake_downloader_test.cc208
-rw-r--r--cpp/test/fake_storage.cc54
-rw-r--r--cpp/test/fake_storage.h74
-rw-r--r--cpp/test/fake_storage_test.cc94
-rw-r--r--cpp/test/format_element_test.cc56
-rw-r--r--cpp/test/language_test.cc62
-rw-r--r--cpp/test/localization_test.cc483
-rw-r--r--cpp/test/lookup_key_test.cc172
-rw-r--r--cpp/test/lookup_key_util_test.cc53
-rw-r--r--cpp/test/mock_downloader.cc49
-rw-r--r--cpp/test/mock_downloader.h80
-rw-r--r--cpp/test/null_storage_test.cc78
-rw-r--r--cpp/test/ondemand_supply_task_test.cc235
-rw-r--r--cpp/test/post_box_matchers_test.cc87
-rw-r--r--cpp/test/preload_supplier_test.cc124
-rw-r--r--cpp/test/region_data_builder_test.cc124
-rw-r--r--cpp/test/region_data_constants_test.cc84
-rw-r--r--cpp/test/region_data_test.cc46
-rw-r--r--cpp/test/retriever_test.cc193
-rw-r--r--cpp/test/rule_retriever_test.cc93
-rw-r--r--cpp/test/rule_test.cc371
-rw-r--r--cpp/test/supplier_test.cc314
-rw-r--r--cpp/test/util/json_test.cc141
-rw-r--r--cpp/test/util/md5_unittest.cc218
-rw-r--r--cpp/test/util/scoped_ptr_unittest.cc100
-rw-r--r--cpp/test/util/string_compare_test.cc60
-rw-r--r--cpp/test/util/string_split_unittest.cc89
-rw-r--r--cpp/test/util/string_util_test.cc74
-rw-r--r--cpp/test/validating_storage_test.cc136
-rw-r--r--cpp/test/validating_util_test.cc156
-rw-r--r--cpp/test/validation_task_test.cc472
-rw-r--r--java/android.jarbin0 -> 3241948 bytes
-rw-r--r--java/build.gradle25
-rw-r--r--java/build.xml93
-rw-r--r--java/res/layout/address_edittext.xml25
-rw-r--r--java/res/layout/address_layout.xml25
-rw-r--r--java/res/layout/address_spinner.xml24
-rw-r--r--java/res/layout/address_textview.xml25
-rw-r--r--java/res/values/address_strings.xml158
-rw-r--r--java/settings.gradle1
-rw-r--r--java/src/AndroidManifest.xml10
-rw-r--r--java/src/com/android/i18n/addressinput/AddressData.java394
-rw-r--r--java/src/com/android/i18n/addressinput/AddressDataKey.java114
-rw-r--r--java/src/com/android/i18n/addressinput/AddressField.java105
-rw-r--r--java/src/com/android/i18n/addressinput/AddressProblemType.java70
-rw-r--r--java/src/com/android/i18n/addressinput/AddressProblems.java67
-rw-r--r--java/src/com/android/i18n/addressinput/AddressUiComponent.java156
-rw-r--r--java/src/com/android/i18n/addressinput/AddressVerificationData.java157
-rw-r--r--java/src/com/android/i18n/addressinput/AddressVerificationNodeData.java55
-rw-r--r--java/src/com/android/i18n/addressinput/AddressWidget.java754
-rw-r--r--java/src/com/android/i18n/addressinput/AddressWidgetUiComponentProvider.java99
-rw-r--r--java/src/com/android/i18n/addressinput/CacheData.java418
-rw-r--r--java/src/com/android/i18n/addressinput/ClientCacheManager.java29
-rw-r--r--java/src/com/android/i18n/addressinput/ClientData.java300
-rw-r--r--java/src/com/android/i18n/addressinput/DataLoadListener.java26
-rw-r--r--java/src/com/android/i18n/addressinput/DataSource.java25
-rw-r--r--java/src/com/android/i18n/addressinput/FieldVerifier.java358
-rw-r--r--java/src/com/android/i18n/addressinput/FormController.java334
-rw-r--r--java/src/com/android/i18n/addressinput/FormOptions.java287
-rw-r--r--java/src/com/android/i18n/addressinput/FormatInterpreter.java280
-rw-r--r--java/src/com/android/i18n/addressinput/JsoMap.java284
-rw-r--r--java/src/com/android/i18n/addressinput/JsonpRequestBuilder.java130
-rw-r--r--java/src/com/android/i18n/addressinput/LookupKey.java436
-rw-r--r--java/src/com/android/i18n/addressinput/NotifyingListener.java53
-rw-r--r--java/src/com/android/i18n/addressinput/RegionData.java107
-rw-r--r--java/src/com/android/i18n/addressinput/RegionDataConstants.java1310
-rw-r--r--java/src/com/android/i18n/addressinput/SimpleClientCacheManager.java39
-rw-r--r--java/src/com/android/i18n/addressinput/StandardAddressVerifier.java238
-rw-r--r--java/src/com/android/i18n/addressinput/StandardChecks.java67
-rw-r--r--java/src/com/android/i18n/addressinput/Util.java226
-rw-r--r--java/src/com/android/i18n/addressinput/testing/AddressDataMapLoader.java56
-rw-r--r--java/src/com/android/i18n/addressinput/testing/AsyncTestCase.java75
-rw-r--r--java/src/com/android/i18n/addressinput/testing/TestActivity.java21
-rw-r--r--java/test/AndroidManifest.xml24
-rw-r--r--java/test/android/util/Log.java38
-rw-r--r--java/test/build.gradle21
-rw-r--r--java/test/com/android/i18n/addressinput/AddressDataTest.java66
-rw-r--r--java/test/com/android/i18n/addressinput/AddressFieldTest.java37
-rw-r--r--java/test/com/android/i18n/addressinput/AddressProblemsTest.java37
-rw-r--r--java/test/com/android/i18n/addressinput/AddressVerificationDataTest.java104
-rw-r--r--java/test/com/android/i18n/addressinput/AddressWidgetUiComponentProviderTest.java153
-rw-r--r--java/test/com/android/i18n/addressinput/AsyncTestCaseTest.java95
-rw-r--r--java/test/com/android/i18n/addressinput/CacheDataTest.java326
-rw-r--r--java/test/com/android/i18n/addressinput/ClientDataTest.java83
-rw-r--r--java/test/com/android/i18n/addressinput/FieldVerifierTest.java271
-rw-r--r--java/test/com/android/i18n/addressinput/FormControllerTest.java151
-rw-r--r--java/test/com/android/i18n/addressinput/FormOptionsTest.java44
-rw-r--r--java/test/com/android/i18n/addressinput/FormatInterpreterTest.java192
-rw-r--r--java/test/com/android/i18n/addressinput/JsoMapTest.java247
-rw-r--r--java/test/com/android/i18n/addressinput/JsonpRequestBuilderTest.java157
-rw-r--r--java/test/com/android/i18n/addressinput/LookupKeyTest.java237
-rw-r--r--java/test/com/android/i18n/addressinput/RegionDataConstantsTest.java44
-rw-r--r--java/test/com/android/i18n/addressinput/RegionDataTest.java49
-rw-r--r--java/test/com/android/i18n/addressinput/StandardAddressVerifierTest.java257
-rw-r--r--java/test/com/android/i18n/addressinput/UtilTest.java154
-rw-r--r--java/testlibs/commons-logging-1.1.1.jarbin0 -> 60686 bytes
-rw-r--r--java/testlibs/httpclient-4.1.1.jarbin0 -> 351132 bytes
-rw-r--r--java/testlibs/httpcore-4.1.jarbin0 -> 181041 bytes
-rw-r--r--java/testlibs/json-20090211.jarbin0 -> 45944 bytes
-rw-r--r--testdata/countryinfo.txt11563
201 files changed, 38049 insertions, 0 deletions
diff --git a/codereview.settings b/codereview.settings
new file mode 100644
index 0000000..efe4f4e
--- /dev/null
+++ b/codereview.settings
@@ -0,0 +1,4 @@
+# This file is used by gcl to get repository specific information.
+CODE_REVIEW_SERVER: codereview.appspot.com
+TRY_ON_UPLOAD: False
+VIEW_VC: http://code.google.com/p/libaddressinput/source/detail?r=
diff --git a/cpp/LICENSE.chromium b/cpp/LICENSE.chromium
new file mode 100644
index 0000000..3d0f7d3
--- /dev/null
+++ b/cpp/LICENSE.chromium
@@ -0,0 +1,27 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/cpp/README b/cpp/README
new file mode 100644
index 0000000..4dc96fe
--- /dev/null
+++ b/cpp/README
@@ -0,0 +1,88 @@
+Intro
+=====
+
+The C++ version of libaddressinput library provides UI layout information and
+validation for address input forms.
+
+The library does not provide a UI. The user of the library must provide the user
+interface that uses libaddressinput. The user of the library must also provide a
+way to store data on disk and download data from the internet.
+
+The first client of the library is Chrome web browser. This motivates not
+providing UI or networking capabilities. Chrome will provide those.
+
+When including the library in your project, you can override the dependencies
+and include directories in libaddressinput.gypi to link with your own
+third-party libraries.
+
+Dependencies
+============
+
+The library depends on these tools and libraries:
+
+GYP: Generates the build files.
+Ninja: Executes the build files.
+GTest: Used for unit tests.
+Python: Used by GRIT, which generates localization files.
+RE2: Used for validating postal code format.
+
+Most of these packages are available on Debian-like distributions. You can
+install them with this command:
+
+$ sudo apt-get install gyp ninja-build libgtest-dev python libre2-dev
+
+Make sure that your version of GYP is at least 0.1~svn1395. Older versions of
+GYP do not generate the Ninja build files correctly. You can download a
+new-enough version from http://packages.ubuntu.com/saucy/gyp.
+
+Make sure that your version of RE2 is at least 20140111+dfsg-1. Older versions
+of RE2 don't support set_never_capture() and the packages don't provide shared
+libraries.
+
+If your distribution does not include the binary packages for the dependencies,
+you can download them from these locations:
+
+http://packages.ubuntu.com/saucy/gyp
+http://packages.ubuntu.com/saucy/ninja-build
+http://packages.ubuntu.com/saucy/libgtest-dev
+http://packages.ubuntu.com/saucy/python
+http://packages.ubuntu.com/utopic/libre2-1
+http://packages.ubuntu.com/utopic/libre2-dev
+
+Alternatively, you can download, build, and install these tools and libraries
+from source code. Their home pages contain information on how to accomplish
+that.
+
+https://code.google.com/p/gyp/
+http://martine.github.io/ninja/
+https://code.google.com/p/googletest/
+http://python.org/
+https://code.google.com/p/re2/
+
+Build
+=====
+
+Building the library involves generating an out/Default/build.ninja file and
+running ninja:
+
+$ export GYP_GENERATORS='ninja'
+$ gyp --depth .
+$ ninja -C out/Default
+
+Overriding paths defined in the *.gyp files can be done by setting the
+GYP_DEFINES environment variable before running gyp:
+
+$ export GYP_DEFINES="gtest_dir='/xxx/include' gtest_src_dir='/xxx'"
+
+Test
+====
+
+This command will execute the unit tests for the library:
+
+$ out/Default/unit_tests
+
+Discussion
+==========
+
+Do you need help with libaddressinput?
+https://groups.google.com/forum/#!forum/libaddressinput-discuss
diff --git a/cpp/grit.gyp b/cpp/grit.gyp
new file mode 100644
index 0000000..b849e41
--- /dev/null
+++ b/cpp/grit.gyp
@@ -0,0 +1,55 @@
+# Copyright (C) 2013 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ 'grit_dir%': '<(DEPTH)/../externals/grit',
+ },
+ 'targets': [
+ {
+ 'target_name': 'generated_messages',
+ 'type': 'none',
+ 'sources': [
+ 'res/messages.grd',
+ ],
+ 'actions': [
+ {
+ 'action_name': 'generate_messages',
+ 'inputs': [
+ '<(grit_dir)/grit.py',
+ 'res/messages.grd',
+ 'res/messages.grdp',
+ ],
+ 'outputs': [
+ '<(SHARED_INTERMEDIATE_DIR)/en_messages.cc',
+ '<(SHARED_INTERMEDIATE_DIR)/messages.h',
+ ],
+ 'action': [
+ 'python',
+ '<(grit_dir)/grit.py',
+ '-i',
+ 'res/messages.grd',
+ 'build',
+ '-o',
+ '<(SHARED_INTERMEDIATE_DIR)',
+ ],
+ },
+ ],
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '<(SHARED_INTERMEDIATE_DIR)',
+ ],
+ },
+ },
+ ],
+}
diff --git a/cpp/gtest.gyp b/cpp/gtest.gyp
new file mode 100644
index 0000000..19977b2
--- /dev/null
+++ b/cpp/gtest.gyp
@@ -0,0 +1,58 @@
+# Copyright (C) 2013 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ # Default include directories. Override with your system's include paths or
+ # paths to your own implementations.
+ 'gtest_dir%': '/usr/include',
+ 'gtest_src_dir%': '/usr/src/gtest',
+ },
+ 'targets': [
+ {
+ 'target_name': 'main',
+ 'type': 'static_library',
+ 'sources': [
+ '<(SHARED_INTERMEDIATE_DIR)/src/gtest-all.cc',
+ ],
+ 'include_dirs': [
+ '<(gtest_dir)',
+ '<(gtest_src_dir)',
+ ],
+ 'copies': [
+ {
+ 'destination': '<(SHARED_INTERMEDIATE_DIR)/src',
+ 'files': [
+ '<(gtest_src_dir)/src/gtest-all.cc',
+ '<(gtest_src_dir)/src/gtest_main.cc',
+ ],
+ },
+ ],
+ 'direct_dependent_settings': {
+ 'sources': [
+ '<(SHARED_INTERMEDIATE_DIR)/src/gtest_main.cc',
+ ],
+ 'include_dirs': [
+ '<(gtest_dir)',
+ ],
+ 'conditions': [
+ ['OS == "linux"', {
+ 'ldflags': [
+ '-pthread', # GTest needs to link to pthread on Linux.
+ ],
+ }],
+ ],
+ },
+ },
+ ],
+}
diff --git a/cpp/include/libaddressinput/address_data.h b/cpp/include/libaddressinput/address_data.h
new file mode 100644
index 0000000..e2d057a
--- /dev/null
+++ b/cpp/include/libaddressinput/address_data.h
@@ -0,0 +1,92 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A struct for storing address data: country code, administrative area,
+// locality, etc. The field names correspond to the OASIS xAL standard:
+// https://www.oasis-open.org/committees/ciq/download.shtml
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_DATA_H_
+#define I18N_ADDRESSINPUT_ADDRESS_DATA_H_
+
+#include <libaddressinput/address_field.h>
+
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+struct AddressData {
+ // CLDR (Common Locale Data Repository) region code.
+ std::string region_code;
+
+ // The address lines represent the most specific part of any address.
+ std::vector<std::string> address_line;
+
+ // Top-level administrative subdivision of this country.
+ std::string administrative_area;
+
+ // Generally refers to the city/town portion of an address.
+ std::string locality;
+
+ // Dependent locality or sublocality. Used for UK dependent localities, or
+ // neighborhoods or boroughs in other locations.
+ std::string dependent_locality;
+
+ // Values are frequently alphanumeric.
+ std::string postal_code;
+
+ // This corresponds to the SortingCode sub-element of the xAL
+ // PostalServiceElements element. Use is very country-specific.
+ std::string sorting_code;
+
+ // Language code of the address. Should be in BCP-47 format.
+ std::string language_code;
+
+ // Name of recipient or contact person. Not present in xAL.
+ std::string recipient;
+
+ // Returns whether the |field| is empty.
+ bool IsFieldEmpty(AddressField field) const;
+
+ // Returns the value of the |field|. The parameter must not be STREET_ADDRESS,
+ // which comprises multiple fields (will crash otherwise).
+ const std::string& GetFieldValue(AddressField field) const;
+
+ // Copies |value| into the |field|. The parameter must not be STREET_ADDRESS,
+ // which comprises multiple fields (will crash otherwise).
+ void SetFieldValue(AddressField field, const std::string& value);
+
+ // Returns the value of the |field|. The parameter must be STREET_ADDRESS,
+ // which comprises multiple fields (will crash otherwise).
+ const std::vector<std::string>& GetRepeatedFieldValue(
+ AddressField field) const;
+
+ bool operator==(const AddressData& other) const;
+
+ // Returns true if the parameter comprises multiple fields, false otherwise.
+ // Use it to determine whether to call |GetFieldValue| or
+ // |GetRepeatedFieldValue|.
+ static bool IsRepeatedFieldValue(AddressField field);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+// Produces human-readable output in logging, for example in unit tests.
+std::ostream& operator<<(std::ostream& o,
+ const i18n::addressinput::AddressData& address);
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_DATA_H_
diff --git a/cpp/include/libaddressinput/address_field.h b/cpp/include/libaddressinput/address_field.h
new file mode 100644
index 0000000..1adc97b
--- /dev/null
+++ b/cpp/include/libaddressinput/address_field.h
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_FIELD_H_
+#define I18N_ADDRESSINPUT_ADDRESS_FIELD_H_
+
+#include <iosfwd>
+
+namespace i18n {
+namespace addressinput {
+
+// Address field types, ordered by size, from largest to smallest.
+enum AddressField {
+ COUNTRY, // Country code.
+ ADMIN_AREA, // Administrative area such as a state, province,
+ // island, etc.
+ LOCALITY, // City or locality.
+ DEPENDENT_LOCALITY, // Dependent locality (may be an inner-city district or
+ // a suburb).
+ SORTING_CODE, // Sorting code.
+ POSTAL_CODE, // Zip or postal code.
+ STREET_ADDRESS, // Street address lines.
+ RECIPIENT // Name.
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+// Produces human-readable output in logging, for example in unit tests. Prints
+// what you would expect for valid fields, e.g. "COUNTRY" for COUNTRY. For
+// invalid values, prints "[INVALID ENUM VALUE x]".
+std::ostream& operator<<(std::ostream& o,
+ i18n::addressinput::AddressField field);
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_FIELD_H_
diff --git a/cpp/include/libaddressinput/address_formatter.h b/cpp/include/libaddressinput/address_formatter.h
new file mode 100644
index 0000000..e267884
--- /dev/null
+++ b/cpp/include/libaddressinput/address_formatter.h
@@ -0,0 +1,51 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Utility functions for formatting the addresses represented as AddressData.
+//
+// Note these work best if the address has a language code specified - this can
+// be obtained when building the UI components (calling BuildComponents on
+// address_ui.h).
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_FORMATTER_H_
+#define I18N_ADDRESSINPUT_ADDRESS_FORMATTER_H_
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+struct AddressData;
+
+// Formats the address onto multiple lines. This formats the address in national
+// format; without the country.
+void GetFormattedNationalAddress(
+ const AddressData& address_data, std::vector<std::string>* lines);
+
+// Formats the address as a single line. This formats the address in national
+// format; without the country.
+void GetFormattedNationalAddressLine(
+ const AddressData& address_data, std::string* line);
+
+// Formats the street-level part of an address as a single line. For example,
+// two lines of "Apt 1", "10 Red St." will be concatenated in a
+// language-appropriate way, to give something like "Apt 1, 10 Red St".
+void GetStreetAddressLinesAsSingleLine(
+ const AddressData& address_data, std::string* line);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_FORMATTER_H_
diff --git a/cpp/include/libaddressinput/address_input_helper.h b/cpp/include/libaddressinput/address_input_helper.h
new file mode 100644
index 0000000..ce52cf9
--- /dev/null
+++ b/cpp/include/libaddressinput/address_input_helper.h
@@ -0,0 +1,67 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_INPUT_HELPER_H_
+#define I18N_ADDRESSINPUT_ADDRESS_INPUT_HELPER_H_
+
+#include <vector>
+
+#include <libaddressinput/util/basictypes.h>
+
+namespace i18n {
+namespace addressinput {
+
+class LookupKey;
+class Node;
+class PreloadSupplier;
+struct AddressData;
+
+class AddressInputHelper {
+ public:
+ // Creates an input helper that uses the supplier provided to get metadata to
+ // help a user complete or fix an address. Doesn't take ownership of
+ // |supplier|. Since latency is important for these kinds of tasks, we expect
+ // the supplier to have the data already.
+ AddressInputHelper(PreloadSupplier* supplier);
+
+ ~AddressInputHelper();
+
+ // Fill in missing components of an address as best as we can based on
+ // existing data. For example, for some countries only one postal code is
+ // valid; this would enter that one. For others, the postal code indicates
+ // what state should be selected. Existing data will never be overwritten.
+ //
+ // Note that the preload supplier must have had the rules for the country
+ // represented by this address loaded before this method is called - otherwise
+ // an assertion failure will result.
+ //
+ // The address should have the best language tag as returned from
+ // BuildComponents().
+ void FillAddress(AddressData* address) const;
+
+ private:
+ void CheckChildrenForPostCodeMatches(
+ const AddressData& address, const LookupKey& lookup_key,
+ const Node* parent, std::vector<Node>* hierarchy) const;
+
+ // We don't own the supplier_.
+ PreloadSupplier* const supplier_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressInputHelper);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_INPUT_HELPER_H_
diff --git a/cpp/include/libaddressinput/address_metadata.h b/cpp/include/libaddressinput/address_metadata.h
new file mode 100644
index 0000000..269f982
--- /dev/null
+++ b/cpp/include/libaddressinput/address_metadata.h
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_METADATA_H_
+#define I18N_ADDRESSINPUT_ADDRESS_METADATA_H_
+
+#include <libaddressinput/address_field.h>
+
+namespace i18n {
+namespace addressinput {
+
+// Checks whether |field| is a required field for |region_code|. Returns false
+// also if no data could be found for region_code. Note: COUNTRY is always
+// required.
+bool IsFieldRequired(AddressField field, const std::string& region_code);
+
+// Checks whether |field| is a field that is used for |region_code|. Returns
+// false also if no data could be found for region_code. Note: COUNTRY is always
+// used.
+bool IsFieldUsed(AddressField field, const std::string& region_code);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_METADATA_H_
diff --git a/cpp/include/libaddressinput/address_normalizer.h b/cpp/include/libaddressinput/address_normalizer.h
new file mode 100644
index 0000000..6bd3366
--- /dev/null
+++ b/cpp/include/libaddressinput/address_normalizer.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_NORMALIZER_H_
+#define I18N_ADDRESSINPUT_ADDRESS_NORMALIZER_H_
+
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+namespace i18n {
+namespace addressinput {
+
+class AddressData;
+class PreloadSupplier;
+class StringCompare;
+
+class AddressNormalizer {
+ public:
+ // Does not take ownership of |supplier|.
+ explicit AddressNormalizer(const PreloadSupplier* supplier);
+ ~AddressNormalizer();
+
+ // Converts the names of different fields in the address into their canonical
+ // form. Should be called only when supplier->IsLoaded() returns true for
+ // the region code of the |address|.
+ void Normalize(AddressData* address) const;
+
+ private:
+ const PreloadSupplier* const supplier_; // Not owned.
+ const scoped_ptr<const StringCompare> compare_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressNormalizer);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_NORMALIZER_H_
diff --git a/cpp/include/libaddressinput/address_problem.h b/cpp/include/libaddressinput/address_problem.h
new file mode 100644
index 0000000..743b9e8
--- /dev/null
+++ b/cpp/include/libaddressinput/address_problem.h
@@ -0,0 +1,68 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_PROBLEM_H_
+#define I18N_ADDRESSINPUT_ADDRESS_PROBLEM_H_
+
+#include <iosfwd>
+
+namespace i18n {
+namespace addressinput {
+
+// Address problem types, in no particular order.
+enum AddressProblem {
+ // The field is not null and not whitespace, and the field should not be used
+ // by addresses in this country. For example, in the U.S. the SORTING_CODE
+ // field is unused, so its presence is an error.
+ UNEXPECTED_FIELD,
+
+ // The field is null or whitespace, and the field is required. For example,
+ // in the U.S. ADMIN_AREA is a required field.
+ MISSING_REQUIRED_FIELD,
+
+ // A list of values for the field is defined and the value does not occur in
+ // the list. Applies to hierarchical elements like REGION, ADMIN_AREA,
+ // LOCALITY, and DEPENDENT_LOCALITY. For example, in the US, the values for
+ // ADMIN_AREA include "CA" but not "XX".
+ UNKNOWN_VALUE,
+
+ // A format for the field is defined and the value does not match. This is
+ // used to match POSTAL_CODE against the the format pattern generally. Formats
+ // indicate how many digits/letters should be present, and what punctuation is
+ // allowed. For example, in the U.S. postal codes are five digits with an
+ // optional hyphen followed by four digits.
+ INVALID_FORMAT,
+
+ // A specific pattern for the field is defined based on a specific sub-region
+ // (an ADMIN_AREA for example) and the value does not match. This is used to
+ // match POSTAL_CODE against a regular expression. For example, in the U.S.
+ // postal codes in the state of California start with '9'.
+ MISMATCHING_VALUE,
+
+ // The value contains a P.O. box and the widget options have acceptPostal set
+ // to false. For example, a street address line that contained "P.O. Box 3456"
+ // would fire this error.
+ USES_P_O_BOX
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+// Produces human-readable output in logging, for example in unit tests. Prints
+// what you would expect for valid values, e.g. "UNEXPECTED_FIELD" for
+// UNEXPECTED_FIELD. For invalid values, prints "[INVALID ENUM VALUE x]".
+std::ostream& operator<<(std::ostream& o,
+ i18n::addressinput::AddressProblem problem);
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_PROBLEM_H_
diff --git a/cpp/include/libaddressinput/address_ui.h b/cpp/include/libaddressinput/address_ui.h
new file mode 100644
index 0000000..8939501
--- /dev/null
+++ b/cpp/include/libaddressinput/address_ui.h
@@ -0,0 +1,48 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_UI_H_
+#define I18N_ADDRESSINPUT_ADDRESS_UI_H_
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+class Localization;
+struct AddressUiComponent;
+
+// Returns the list of supported CLDR region codes.
+const std::vector<std::string>& GetRegionCodes();
+
+// Returns the UI components for the CLDR |region_code|. Uses the strings from
+// |localization|. The components can be in default or Latin order, depending on
+// the language of |localization|.
+//
+// Sets the |best_address_language_tag| to the BCP 47 language tag that should
+// be saved with this address. This language will be used to get drop-downs to
+// help users fill in their address, and to format the address that the user
+// entered. The parameter should not be NULL.
+//
+// Returns an empty vector on error.
+std::vector<AddressUiComponent> BuildComponents(
+ const std::string& region_code,
+ const Localization& localization,
+ std::string* best_address_language_tag);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_UI_H_
diff --git a/cpp/include/libaddressinput/address_ui_component.h b/cpp/include/libaddressinput/address_ui_component.h
new file mode 100644
index 0000000..5982a29
--- /dev/null
+++ b/cpp/include/libaddressinput/address_ui_component.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_UI_COMPONENT_H_
+#define I18N_ADDRESSINPUT_ADDRESS_UI_COMPONENT_H_
+
+#include <libaddressinput/address_field.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// A description of an input field in an address form. The user of the library
+// will use a list of these elements to layout the address form input fields.
+struct AddressUiComponent {
+ // The types of hints for how large the field should be in a multiline address
+ // form.
+ enum LengthHint {
+ HINT_LONG, // The field should take up the whole line.
+ HINT_SHORT // The field does not need to take up the whole line.
+ };
+
+ // The address field type for this UI component, for example LOCALITY.
+ AddressField field;
+
+ // The name of the field, for example "City".
+ std::string name;
+
+ // The hint for how large the input field should be in a multiline address
+ // form.
+ LengthHint length_hint;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_UI_COMPONENT_H_
diff --git a/cpp/include/libaddressinput/address_validator.h b/cpp/include/libaddressinput/address_validator.h
new file mode 100644
index 0000000..d3a09f3
--- /dev/null
+++ b/cpp/include/libaddressinput/address_validator.h
@@ -0,0 +1,111 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// The public interface to the address validation features of libaddressinput.
+// The AddressValidator will examine an AddressData struct and return a map of
+// the problems found with the different fields of this struct.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
+#define I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <map>
+
+namespace i18n {
+namespace addressinput {
+
+class Supplier;
+struct AddressData;
+
+typedef std::multimap<AddressField, AddressProblem> FieldProblemMap;
+
+// Validates an AddressData struct. Sample usage:
+// class MyClass {
+// public:
+// MyClass()
+// : validator_(kMyServerUrl, new MyDownloader, new MyStorage),
+// validated_(BuildCallback(this, &MyClass::Validated)) {}
+//
+// virtual ~MyClass() {}
+//
+// void ValidateAddress() const {
+// address_.region_code = "US";
+// address_.administrative_area = "CA";
+// validator_.Validate(address_, filter_, &problems_, *validated_);
+// }
+//
+// void Validated(bool success,
+// const AddressData& address,
+// const FieldProblemMap& problems) {
+// if (success && problems.empty()) {
+// ...
+// }
+// }
+//
+// private:
+// AddressData address_;
+// FieldProblemMap filter_;
+// FieldProblemMap problems_;
+// const AddressValidator validator_;
+// const scoped_ptr<const AddressValidator::Callback> validated_;
+// };
+class AddressValidator {
+ public:
+ typedef i18n::addressinput::Callback<const AddressData&,
+ const FieldProblemMap&> Callback;
+
+ // Does not take ownership of |supplier|.
+ AddressValidator(Supplier* supplier);
+
+ ~AddressValidator();
+
+ // Validates the |address| and populates |problems| with the validation
+ // problems, filtered according to the |filter| parameter.
+ //
+ // Set |allow_postal| to allow postal addresses, rather than only addresses
+ // describing physical locations.
+ //
+ // Set |require_name| if recipient should be considered a required field.
+ //
+ // If the |filter| is NULL or empty, then all discovered validation problems
+ // are returned. If the |filter| contains problem elements, then only those
+ // field-problem pairs present in the |filter| will be returned.
+ //
+ // Calls the |validated| callback when validation is done. All objects passed
+ // as parameters must be kept available until the callback has been called.
+ //
+ // The |success| parameter of the callback indicates whether it was possible
+ // to perform validation. If |success| is true, then |problems| will contain
+ // information about any problems found with the |address|.
+ void Validate(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const Callback& validated) const;
+
+ private:
+ Supplier* const supplier_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressValidator);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
diff --git a/cpp/include/libaddressinput/callback.h b/cpp/include/libaddressinput/callback.h
new file mode 100644
index 0000000..d8c4ea6
--- /dev/null
+++ b/cpp/include/libaddressinput/callback.h
@@ -0,0 +1,95 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object to store a pointer to a method in an object with the following
+// signature:
+//
+// void Observer::ObserveEvent(bool success, Key key, Data data);
+
+#ifndef I18N_ADDRESSINPUT_CALLBACK_H_
+#define I18N_ADDRESSINPUT_CALLBACK_H_
+
+#include <cassert>
+#include <cstddef>
+
+namespace i18n {
+namespace addressinput {
+
+// Stores a pointer to a method in an object. Sample usage:
+// class MyClass {
+// public:
+// typedef Callback<const MyType&, const MyDataType&> MyCallback;
+//
+// void GetDataAsynchronously() {
+// scoped_ptr<MyCallback> callback(BuildCallback(
+// this, &MyClass::OnDataReady));
+// bool success = ...
+// MyKeyType key = ...
+// MyDataType data = ...
+// (*callback)(success, key, data);
+// }
+//
+// void OnDataReady(bool success,
+// const MyKeyType& key,
+// const MyDataType& data) {
+// ...
+// }
+// };
+template <typename Key, typename Data>
+class Callback {
+ public:
+ virtual ~Callback() {}
+ virtual void operator()(bool success, Key key, Data data) const = 0;
+};
+
+namespace {
+
+template <typename Observer, typename Key, typename Data>
+class CallbackImpl : public Callback<Key, Data> {
+ public:
+ typedef void (Observer::*ObserveEvent)(bool, Key, Data);
+
+ CallbackImpl(Observer* observer, ObserveEvent observe_event)
+ : observer_(observer),
+ observe_event_(observe_event) {
+ assert(observer_ != NULL);
+ assert(observe_event_ != NULL);
+ }
+
+ virtual ~CallbackImpl() {}
+
+ virtual void operator()(bool success, Key key, Data data) const {
+ (observer_->*observe_event_)(success, key, data);
+ }
+
+ private:
+ Observer* observer_;
+ ObserveEvent observe_event_;
+};
+
+} // namespace
+
+// Returns a callback to |observer->observe_event| method. The caller owns the
+// result.
+template <typename Observer, typename Key, typename Data>
+Callback<Key, Data>* BuildCallback(
+ Observer* observer,
+ void (Observer::*observe_event)(bool, Key, Data)) {
+ return new CallbackImpl<Observer, Key, Data>(observer, observe_event);
+}
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_CALLBACK_H_
diff --git a/cpp/include/libaddressinput/downloader.h b/cpp/include/libaddressinput/downloader.h
new file mode 100644
index 0000000..0da4e1f
--- /dev/null
+++ b/cpp/include/libaddressinput/downloader.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// The interface to be implemented by the user of the library to enable
+// downloading validation rules from a server.
+
+#ifndef I18N_ADDRESSINPUT_DOWNLOADER_H_
+#define I18N_ADDRESSINPUT_DOWNLOADER_H_
+
+#include <libaddressinput/callback.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Downloads validation rules from the server. The downloaded data must be
+// allocated on the heap, passing ownership to the callback. Sample usage:
+//
+// class MyDownloader : public Downloader {
+// public:
+// virtual void Download(const std::string& url,
+// const Callback& downloaded) const {
+// bool success = ...
+// std::string* data = new ...
+// downloaded(success, url, data);
+// }
+// };
+class Downloader {
+ public:
+ typedef i18n::addressinput::Callback<const std::string&,
+ std::string*> Callback;
+
+ virtual ~Downloader() {}
+
+ // Downloads |url| and invokes the |downloaded| callback.
+ virtual void Download(const std::string& url,
+ const Callback& downloaded) const = 0;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_DOWNLOADER_H_
diff --git a/cpp/include/libaddressinput/localization.h b/cpp/include/libaddressinput/localization.h
new file mode 100644
index 0000000..08b5964
--- /dev/null
+++ b/cpp/include/libaddressinput/localization.h
@@ -0,0 +1,101 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_LOCALIZATION_H_
+#define I18N_ADDRESSINPUT_LOCALIZATION_H_
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+struct AddressData;
+
+// The object to retrieve localized strings based on message IDs. Sample usage:
+// Localization localization;
+// localization.SetLanguage("en");
+// std::string best_language_tag;
+// Process(BuildComponents("CA", localization, &best_language_tag));
+//
+// Alternative usage:
+// Localization localization;
+// localization.SetGetter(&MyStringGetter, "fr");
+// std::string best_language_tag;
+// Process(BuildComponents("CA", localization, &best_language_tag));
+class Localization {
+ public:
+ // Initializes with English messages by default.
+ Localization();
+ ~Localization();
+
+ // Returns the localized string for |message_id|. Returns an empty string if
+ // there's no message with this identifier.
+ std::string GetString(int message_id) const;
+
+ // Returns the error message. If |enable_examples| is false, then the error
+ // message will not contain examples of valid input. If |enable_links| is
+ // false, then the error message will not contain HTML links. (Some error
+ // messages contain postal code examples or link to post office websites to
+ // look up the postal code for an address). Vector field values (e.g. for
+ // street address) should not be empty if problem is UNKNOWN_VALUE. The
+ // POSTAL_CODE field should only be used with MISSING_REQUIRED_FIELD,
+ // INVALID_FORMAT, and MISMATCHING_VALUE problem codes. All other fields
+ // should only be used with MISSING_REQUIRED_FIELD, UNKNOWN_VALUE, and
+ // USES_P_O_BOX problem codes.
+ std::string GetErrorMessage(const AddressData& address,
+ AddressField field,
+ AddressProblem problem,
+ bool enable_examples,
+ bool enable_links) const;
+
+ // Sets the language for the strings. The only supported language is "en"
+ // until we have translations.
+ void SetLanguage(const std::string& language_tag);
+
+ // Sets the string getter that takes a message identifier and returns the
+ // corresponding localized string. The |language_tag| parameter is used only
+ // for information purposes here.
+ void SetGetter(std::string (*getter)(int), const std::string& language_tag);
+
+ // Returns the current language tag.
+ const std::string& GetLanguage() const { return language_tag_; }
+
+ private:
+ // Returns the error message where the address field is a postal code. Helper
+ // to |GetErrorMessage|. If |postal_code_example| is empty, then the error
+ // message will not contain examples of valid postal codes. If
+ // |post_service_url| is empty, then the error message will not contain a post
+ // service URL. The problem should only be one of MISSING_REQUIRED_FIELD,
+ // INVALID_FORMAT, or MISMATCHING_VALUE.
+ std::string GetErrorMessageForPostalCode(const AddressData& address,
+ AddressProblem problem,
+ bool uses_postal_code_as_label,
+ std::string postal_code_example,
+ std::string post_service_url) const;
+
+ // The string getter.
+ std::string (*get_string_)(int);
+
+ // The current language tag.
+ std::string language_tag_;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_LOCALIZATION_H_
diff --git a/cpp/include/libaddressinput/null_storage.h b/cpp/include/libaddressinput/null_storage.h
new file mode 100644
index 0000000..66d9ab5
--- /dev/null
+++ b/cpp/include/libaddressinput/null_storage.h
@@ -0,0 +1,48 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// It is not always desirable to cache libaddressinput data. Sometimes it might
+// give better performance characteristics to not cache. This implementation of
+// the Storage interface therefore doesn't actually store anything.
+
+#ifndef I18N_ADDRESSINPUT_NULL_STORAGE_H_
+#define I18N_ADDRESSINPUT_NULL_STORAGE_H_
+
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class NullStorage : public Storage {
+ public:
+ NullStorage();
+ virtual ~NullStorage();
+
+ // No-op.
+ virtual void Put(const std::string& key, std::string* data);
+
+ // Always calls the |data_ready| callback function signalling failure.
+ virtual void Get(const std::string& key, const Callback& data_ready) const;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(NullStorage);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_NULL_STORAGE_H_
diff --git a/cpp/include/libaddressinput/ondemand_supplier.h b/cpp/include/libaddressinput/ondemand_supplier.h
new file mode 100644
index 0000000..0fe33f8
--- /dev/null
+++ b/cpp/include/libaddressinput/ondemand_supplier.h
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ONDEMAND_SUPPLIER_H_
+#define I18N_ADDRESSINPUT_ONDEMAND_SUPPLIER_H_
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <map>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class Downloader;
+class LookupKey;
+class Retriever;
+class Rule;
+class Storage;
+
+// An implementation of the Supplier interface that owns a Retriever object,
+// through which it loads address metadata as needed, creating Rule objects and
+// caching these.
+//
+// When using an OndemandSupplier, address validation will benefit from address
+// metadata server synonym resolution, because the server will be contacted for
+// every new LookupKey (ie. every LookupKey that isn't on canonical form and
+// isn't already cached).
+//
+// The maximum size of this cache is naturally limited to the amount of data
+// available from the data server. (Currently this is less than 12,000 items of
+// in total less than 2 MB of JSON data.)
+class OndemandSupplier : public Supplier {
+ public:
+ // Takes ownership of |downloader| and |storage|. The |validation_data_url|
+ // should be a URL to an address data server that |downloader| can access.
+ //
+ // (See the documentation for the Downloader implementation used for
+ // information about what URLs are useable with that Downloader.)
+ OndemandSupplier(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage);
+ virtual ~OndemandSupplier();
+
+ // Loads the metadata needed for |lookup_key|, then calls |supplied|.
+ virtual void Supply(const LookupKey& lookup_key, const Callback& supplied);
+
+ private:
+ const scoped_ptr<const Retriever> retriever_;
+ std::map<std::string, const Rule*> rule_cache_;
+
+ DISALLOW_COPY_AND_ASSIGN(OndemandSupplier);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ONDEMAND_SUPPLIER_H_
diff --git a/cpp/include/libaddressinput/preload_supplier.h b/cpp/include/libaddressinput/preload_supplier.h
new file mode 100644
index 0000000..f7654ab
--- /dev/null
+++ b/cpp/include/libaddressinput/preload_supplier.h
@@ -0,0 +1,101 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_PRELOAD_SUPPLIER_H_
+#define I18N_ADDRESSINPUT_PRELOAD_SUPPLIER_H_
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <map>
+#include <set>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class Downloader;
+class LookupKey;
+class Retriever;
+class Rule;
+class Storage;
+
+// An implementation of the Supplier interface that owns a Retriever object,
+// through which it can load aggregated address metadata for a region when
+// instructed to, creating Rule objects and caching these. It also provides
+// methods to check whether metadata for a particular region is already loaded
+// or in progress of being loaded.
+//
+// When using a PreloadSupplier, it becomes possible to do synchronous address
+// validation using an asynchronous Downloader, and to have full control over
+// when network access is being done.
+//
+// The maximum size of this cache is naturally limited to the amount of data
+// available from the data server. (Currently this is less than 12,000 items of
+// in total less than 2 MB of JSON data.)
+class PreloadSupplier : public Supplier {
+ public:
+ typedef i18n::addressinput::Callback<const std::string&, int> Callback;
+
+ // Takes ownership of |downloader| and |storage|. The |validation_data_url|
+ // should be a URL to a service that returns address metadata aggregated per
+ // region, and which |downloader| can access.
+ //
+ // (See the documentation for the Downloader implementation used for
+ // information about what URLs are useable with that Downloader.)
+ PreloadSupplier(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage);
+ virtual ~PreloadSupplier();
+
+ // Collects the metadata needed for |lookup_key| from the cache, then calls
+ // |supplied|. If the metadata needed isn't found in the cache, it will call
+ // the callback with status false.
+ virtual void Supply(const LookupKey& lookup_key,
+ const Supplier::Callback& supplied);
+
+ // Should be called only when IsLoaded() returns true for the region code of
+ // the |lookup_key|. Can return NULL if the |lookup_key| does not correspond
+ // to any rule data. The caller does not own the result.
+ const Rule* GetRule(const LookupKey& lookup_key) const;
+
+ // Loads all address metadata available for |region_code|. (A typical data
+ // size is 10 kB. The largest is 250 kB.)
+ //
+ // If the rules are already in progress of being loaded, it does nothing.
+ // Calls |loaded| when the loading has finished.
+ void LoadRules(const std::string& region_code, const Callback& loaded);
+
+ bool IsLoaded(const std::string& region_code) const;
+ bool IsPending(const std::string& region_code) const;
+
+ private:
+ bool GetRuleHierarchy(const LookupKey& lookup_key,
+ RuleHierarchy* hierarchy) const;
+ bool IsLoadedKey(const std::string& key) const;
+ bool IsPendingKey(const std::string& key) const;
+
+ const scoped_ptr<const Retriever> retriever_;
+ std::set<std::string> pending_;
+ std::map<std::string, const Rule*> rule_cache_;
+
+ DISALLOW_COPY_AND_ASSIGN(PreloadSupplier);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_PRELOAD_SUPPLIER_H_
diff --git a/cpp/include/libaddressinput/region_data.h b/cpp/include/libaddressinput/region_data.h
new file mode 100644
index 0000000..92438dc
--- /dev/null
+++ b/cpp/include/libaddressinput/region_data.h
@@ -0,0 +1,77 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_REGION_DATA_H_
+#define I18N_ADDRESSINPUT_REGION_DATA_H_
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+// The key and name of a region that can be used as one of the items in a
+// dropdown UI element.
+class RegionData {
+ public:
+ // Creates a top-level RegionData object. Use AddSubRegion() to add data below
+ // it. Does not make a copy of data in |region_code|.
+ explicit RegionData(const std::string& region_code);
+
+ ~RegionData();
+
+ // Creates a sub-level RegionData object, with this object as its parent and
+ // owner. Does not make copies of the data in |key| or |name|.
+ RegionData* AddSubRegion(const std::string& key, const std::string& name);
+
+ const std::string& key() const { return key_; }
+
+ const std::string& name() const { return name_; }
+
+ bool has_parent() const { return parent_ != NULL; }
+
+ // Should be called only if has_parent() returns true.
+ const RegionData& parent() const {
+ assert(parent_ != NULL);
+ return *parent_;
+ }
+
+ // The caller does not own the results. The results are not NULL and have a
+ // parent.
+ const std::vector<const RegionData*>& sub_regions() const {
+ return sub_regions_;
+ }
+
+ private:
+ // Private constructor used by AddSubRegion().
+ RegionData(const std::string& key,
+ const std::string& name,
+ RegionData* parent);
+
+ const std::string& key_;
+ const std::string& name_;
+ const RegionData* const parent_; // Not owned.
+ std::vector<const RegionData*> sub_regions_; // Owned.
+
+ DISALLOW_COPY_AND_ASSIGN(RegionData);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_REGION_DATA_H_
diff --git a/cpp/include/libaddressinput/region_data_builder.h b/cpp/include/libaddressinput/region_data_builder.h
new file mode 100644
index 0000000..906ca36
--- /dev/null
+++ b/cpp/include/libaddressinput/region_data_builder.h
@@ -0,0 +1,80 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
+#define I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <map>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class PreloadSupplier;
+class RegionData;
+
+class RegionDataBuilder {
+ public:
+ // Does not take ownership of |supplier|, which should not be NULL.
+ explicit RegionDataBuilder(PreloadSupplier* supplier);
+ ~RegionDataBuilder();
+
+ // Returns a tree of administrative subdivisions for the |region_code|.
+ // Examples:
+ // US with en-US UI language.
+ // |______________________
+ // | | |
+ // v v v
+ // AL:Alabama AK:Alaska AS:American Samoa ...
+ //
+ // KR with ko-Latn UI language.
+ // |______________________________________
+ // | | |
+ // v v v
+ // 강원도:Gangwon 경기도:Gyeonggi 경상남도:Gyeongnam ...
+ //
+ // KR with ko-KR UI language.
+ // |_______________________________
+ // | | |
+ // v v v
+ // 강원도:강원 경기도:경기 경상남도:경남 ...
+ //
+ // The BCP 47 |ui_language_tag| is used to choose the best supported language
+ // tag for this region (assigned to |best_region_tree_language_tag|). For
+ // example, Canada has both English and French names for its administrative
+ // subdivisions. If the UI language is French, then the French names are used.
+ // The |best_region_tree_language_tag| value may be an empty string.
+ //
+ // Should be called only if supplier->IsLoaded(region_code) returns true. The
+ // |best_region_tree_language_tag| parameter should not be NULL.
+ const RegionData& Build(const std::string& region_code,
+ const std::string& ui_language_tag,
+ std::string* best_region_tree_language_tag);
+
+ private:
+ typedef std::map<std::string, const RegionData*> LanguageRegionMap;
+ typedef std::map<std::string, LanguageRegionMap*> RegionCodeDataMap;
+
+ PreloadSupplier* const supplier_; // Not owned.
+ RegionCodeDataMap cache_;
+
+ DISALLOW_COPY_AND_ASSIGN(RegionDataBuilder);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_REGION_DATA_BUILDER_H_
diff --git a/cpp/include/libaddressinput/storage.h b/cpp/include/libaddressinput/storage.h
new file mode 100644
index 0000000..38fb887
--- /dev/null
+++ b/cpp/include/libaddressinput/storage.h
@@ -0,0 +1,64 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// The interface to be implemented by the user of the library to enable storing
+// the downloaded validation rules (e.g. on disk).
+
+#ifndef I18N_ADDRESSINPUT_STORAGE_H_
+#define I18N_ADDRESSINPUT_STORAGE_H_
+
+#include <libaddressinput/callback.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Stores downloaded validation rules. The data must be allocated on the heap,
+// passing ownership to the called function. Sample usage:
+//
+// class MyStorage : public Storage {
+// public:
+// virtual void Put(const std::string& key, std::string* data) {
+// ...
+// delete data;
+// }
+//
+// virtual void Get(const std::string& key,
+// const Callback& data_ready) const {
+// bool success = ...
+// std::string* data = new ...
+// data_ready(success, key, data);
+// }
+// };
+class Storage {
+ public:
+ typedef i18n::addressinput::Callback<const std::string&,
+ std::string*> Callback;
+
+ virtual ~Storage() {}
+
+ // Stores |data| for |key|, where |data| is an object allocated on the heap,
+ // which Storage takes ownership of.
+ virtual void Put(const std::string& key, std::string* data) = 0;
+
+ // Retrieves the data for |key| and invokes the |data_ready| callback.
+ virtual void Get(const std::string& key,
+ const Callback& data_ready) const = 0;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_STORAGE_H_
diff --git a/cpp/include/libaddressinput/supplier.h b/cpp/include/libaddressinput/supplier.h
new file mode 100644
index 0000000..fcd64ad
--- /dev/null
+++ b/cpp/include/libaddressinput/supplier.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_SUPPLIER_H_
+#define I18N_ADDRESSINPUT_SUPPLIER_H_
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/util/basictypes.h>
+
+namespace i18n {
+namespace addressinput {
+
+class LookupKey;
+class Rule;
+
+// Interface for objects that are able to supply the AddressValidator with the
+// metadata needed to validate an address, as described by a LookupKey.
+class Supplier {
+ public:
+ struct RuleHierarchy;
+ typedef i18n::addressinput::Callback<const LookupKey&,
+ const RuleHierarchy&> Callback;
+
+ virtual ~Supplier() {}
+
+ // Aggregates the metadata needed for |lookup_key| into a RuleHierarchy
+ // object, then calls |supplied|. Implementations of this interface may
+ // either load the necessary data on demand, or fail if the necessary data
+ // hasn't already been loaded.
+ virtual void Supply(const LookupKey& lookup_key,
+ const Callback& supplied) = 0;
+
+ // A RuleHierarchy object encapsulates the hierarchical list of Rule objects
+ // that corresponds to a particular LookupKey.
+ struct RuleHierarchy {
+ RuleHierarchy() : rule() {}
+ const Rule* rule[4]; // Cf. LookupKey::kHierarchy.
+ };
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_SUPPLIER_H_
diff --git a/cpp/include/libaddressinput/util/basictypes.h b/cpp/include/libaddressinput/util/basictypes.h
new file mode 100644
index 0000000..763b179
--- /dev/null
+++ b/cpp/include/libaddressinput/util/basictypes.h
@@ -0,0 +1,214 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// https://code.google.com/p/libphonenumber/source/browse/trunk/cpp/src/phonenumbers/base/basictypes.h?r=621
+
+#if I18N_ADDRESSINPUT_USE_BASICTYPES_OVERRIDE
+
+// If building libaddressinput in an environment where there already is another
+// implementation of the basictypes.h header file (like in Chromium), then pass
+// the command line flag -DI18N_ADDRESSINPUT_USE_BASICTYPES_OVERRIDE=1 to the
+// compiler and provide a file named basictypes_override.h, in a location where
+// the compiler will look for it, which provides the desired implementation.
+
+#include "basictypes_override.h"
+
+#else
+
+#ifndef I18N_ADDRESSINPUT_UTIL_BASICTYPES_H_
+#define I18N_ADDRESSINPUT_UTIL_BASICTYPES_H_
+
+#include <limits.h> // So we can set the bounds of our types
+#include <stddef.h> // For size_t
+#include <string.h> // for memcpy
+
+#if !defined(_WIN32)
+// stdint.h is part of C99 but MSVC doesn't have it.
+#include <stdint.h> // For intptr_t.
+#endif
+
+#ifdef INT64_MAX
+
+// INT64_MAX is defined if C99 stdint.h is included; use the
+// native types if available.
+typedef int8_t int8;
+typedef int16_t int16;
+typedef int32_t int32;
+typedef int64_t int64;
+typedef uint8_t uint8;
+typedef uint16_t uint16;
+typedef uint32_t uint32;
+typedef uint64_t uint64;
+
+const uint8 kuint8max = UINT8_MAX;
+const uint16 kuint16max = UINT16_MAX;
+const uint32 kuint32max = UINT32_MAX;
+const uint64 kuint64max = UINT64_MAX;
+const int8 kint8min = INT8_MIN;
+const int8 kint8max = INT8_MAX;
+const int16 kint16min = INT16_MIN;
+const int16 kint16max = INT16_MAX;
+const int32 kint32min = INT32_MIN;
+const int32 kint32max = INT32_MAX;
+const int64 kint64min = INT64_MIN;
+const int64 kint64max = INT64_MAX;
+
+#else // !INT64_MAX
+
+typedef signed char int8;
+typedef short int16;
+// TODO: Remove these type guards. These are to avoid conflicts with
+// obsolete/protypes.h in the Gecko SDK.
+#ifndef _INT32
+#define _INT32
+typedef int int32;
+#endif
+
+// The NSPR system headers define 64-bit as |long| when possible. In order to
+// not have typedef mismatches, we do the same on LP64.
+#if __LP64__
+typedef long int64;
+#else
+typedef long long int64;
+#endif
+
+// NOTE: unsigned types are DANGEROUS in loops and other arithmetical
+// places. Use the signed types unless your variable represents a bit
+// pattern (eg a hash value) or you really need the extra bit. Do NOT
+// use 'unsigned' to express "this value should always be positive";
+// use assertions for this.
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+// TODO: Remove these type guards. These are to avoid conflicts with
+// obsolete/protypes.h in the Gecko SDK.
+#ifndef _UINT32
+#define _UINT32
+typedef unsigned int uint32;
+#endif
+
+// See the comment above about NSPR and 64-bit.
+#if __LP64__
+typedef unsigned long uint64;
+#else
+typedef unsigned long long uint64;
+#endif
+
+#endif // !INT64_MAX
+
+typedef signed char schar;
+
+// A type to represent a Unicode code-point value. As of Unicode 4.0,
+// such values require up to 21 bits.
+// (For type-checking on pointers, make this explicitly signed,
+// and it should always be the signed version of whatever int32 is.)
+typedef signed int char32;
+
+// A macro to disallow the copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#if !defined(DISALLOW_COPY_AND_ASSIGN)
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&); \
+ void operator=(const TypeName&)
+#endif
+
+// The arraysize(arr) macro returns the # of elements in an array arr.
+// The expression is a compile-time constant, and therefore can be
+// used in defining new arrays, for example. If you use arraysize on
+// a pointer by mistake, you will get a compile-time error.
+//
+// One caveat is that arraysize() doesn't accept any array of an
+// anonymous type or a type defined inside a function. In these rare
+// cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is
+// due to a limitation in C++'s template system. The limitation might
+// eventually be removed, but it hasn't happened yet.
+
+// This template function declaration is used in defining arraysize.
+// Note that the function doesn't need an implementation, as we only
+// use its type.
+template <typename T, size_t N>
+char (&ArraySizeHelper(T (&array)[N]))[N];
+
+// That gcc wants both of these prototypes seems mysterious. VC, for
+// its part, can't decide which to use (another mystery). Matching of
+// template overloads: the final frontier.
+#ifndef _MSC_VER
+template <typename T, size_t N>
+char (&ArraySizeHelper(const T (&array)[N]))[N];
+#endif
+
+#if !defined(arraysize)
+#define arraysize(array) (sizeof(ArraySizeHelper(array)))
+#endif
+
+// ARRAYSIZE_UNSAFE performs essentially the same calculation as arraysize,
+// but can be used on anonymous types or types defined inside
+// functions. It's less safe than arraysize as it accepts some
+// (although not all) pointers. Therefore, you should use arraysize
+// whenever possible.
+//
+// The expression ARRAYSIZE_UNSAFE(a) is a compile-time constant of type
+// size_t.
+//
+// ARRAYSIZE_UNSAFE catches a few type errors. If you see a compiler error
+//
+// "warning: division by zero in ..."
+//
+// when using ARRAYSIZE_UNSAFE, you are (wrongfully) giving it a pointer.
+// You should only use ARRAYSIZE_UNSAFE on statically allocated arrays.
+//
+// The following comments are on the implementation details, and can
+// be ignored by the users.
+//
+// ARRAYSIZE_UNSAFE(arr) works by inspecting sizeof(arr) (the # of bytes in
+// the array) and sizeof(*(arr)) (the # of bytes in one array
+// element). If the former is divisible by the latter, perhaps arr is
+// indeed an array, in which case the division result is the # of
+// elements in the array. Otherwise, arr cannot possibly be an array,
+// and we generate a compiler error to prevent the code from
+// compiling.
+//
+// Since the size of bool is implementation-defined, we need to cast
+// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
+// result has type size_t.
+//
+// This macro is not perfect as it wrongfully accepts certain
+// pointers, namely where the pointer size is divisible by the pointee
+// size. Since all our code has to go through a 32-bit compiler,
+// where a pointer is 4 bytes, this means all pointers to a type whose
+// size is 3 or greater than 4 will be (righteously) rejected.
+
+#if !defined(ARRAYSIZE_UNSAFE)
+#define ARRAYSIZE_UNSAFE(a) \
+ ((sizeof(a) / sizeof(*(a))) / \
+ static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
+#endif
+
+// The COMPILE_ASSERT macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+// COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES,
+// content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#if !defined(COMPILE_ASSERT)
+#define COMPILE_ASSERT(expr, msg) \
+ typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
+#endif
+
+#endif // I18N_ADDRESSINPUT_UTIL_BASICTYPES_H_
+#endif // I18N_ADDRESSINPUT_USE_BASICTYPES_OVERRIDE
diff --git a/cpp/include/libaddressinput/util/scoped_ptr.h b/cpp/include/libaddressinput/util/scoped_ptr.h
new file mode 100644
index 0000000..fe15fca
--- /dev/null
+++ b/cpp/include/libaddressinput/util/scoped_ptr.h
@@ -0,0 +1,445 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// https://code.google.com/p/libphonenumber/source/browse/trunk/cpp/src/phonenumbers/base/memory/scoped_ptr.h?r=621
+
+#ifndef I18N_ADDRESSINPUT_UTIL_SCOPED_PTR_H_
+#define I18N_ADDRESSINPUT_UTIL_SCOPED_PTR_H_
+
+// This is an implementation designed to match the anticipated future TR2
+// implementation of the scoped_ptr class and scoped_ptr_malloc (deprecated).
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+#include <algorithm> // For std::swap().
+
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/template_util.h>
+
+namespace i18n {
+namespace addressinput {
+
+// Function object which deletes its parameter, which must be a pointer.
+// If C is an array type, invokes 'delete[]' on the parameter; otherwise,
+// invokes 'delete'. The default deleter for scoped_ptr<T>.
+template <class T>
+struct DefaultDeleter {
+ DefaultDeleter() {}
+ template <typename U> DefaultDeleter(const DefaultDeleter<U>& other) {
+ // IMPLEMENTATION NOTE: C++11 20.7.1.1.2p2 only provides this constructor
+ // if U* is implicitly convertible to T* and U is not an array type.
+ //
+ // Correct implementation should use SFINAE to disable this
+ // constructor. However, since there are no other 1-argument constructors,
+ // using a COMPILE_ASSERT() based on is_convertible<> and requiring
+ // complete types is simpler and will cause compile failures for equivalent
+ // misuses.
+ //
+ // Note, the is_convertible<U*, T*> check also ensures that U is not an
+ // array. T is guaranteed to be a non-array, so any U* where U is an array
+ // cannot convert to T*.
+ enum { T_must_be_complete = sizeof(T) };
+ enum { U_must_be_complete = sizeof(U) };
+ COMPILE_ASSERT((is_convertible<U*, T*>::value),
+ U_ptr_must_implicitly_convert_to_T_ptr);
+ }
+ inline void operator()(T* ptr) const {
+ enum { type_must_be_complete = sizeof(T) };
+ delete ptr;
+ }
+};
+
+// Specialization of DefaultDeleter for array types.
+template <class T>
+struct DefaultDeleter<T[]> {
+ inline void operator()(T* ptr) const {
+ enum { type_must_be_complete = sizeof(T) };
+ delete[] ptr;
+ }
+
+ private:
+ // Disable this operator for any U != T because it is undefined to execute
+ // an array delete when the static type of the array mismatches the dynamic
+ // type.
+ //
+ // References:
+ // C++98 [expr.delete]p3
+ // http://cplusplus.github.com/LWG/lwg-defects.html#938
+ template <typename U> void operator()(U* array) const;
+};
+
+template <class T, int n>
+struct DefaultDeleter<T[n]> {
+ // Never allow someone to declare something like scoped_ptr<int[10]>.
+ COMPILE_ASSERT(sizeof(T) == -1, do_not_use_array_with_size_as_type);
+};
+
+// Function object which invokes 'free' on its parameter, which must be
+// a pointer. Can be used to store malloc-allocated pointers in scoped_ptr:
+//
+// scoped_ptr<int, base::FreeDeleter> foo_ptr(
+// static_cast<int*>(malloc(sizeof(int))));
+struct FreeDeleter {
+ inline void operator()(void* ptr) const {
+ free(ptr);
+ }
+};
+
+// Minimal implementation of the core logic of scoped_ptr, suitable for
+// reuse in both scoped_ptr and its specializations.
+template <class T, class D>
+class scoped_ptr_impl {
+ public:
+ explicit scoped_ptr_impl(T* p) : data_(p) { }
+
+ // Initializer for deleters that have data parameters.
+ scoped_ptr_impl(T* p, const D& d) : data_(p, d) {}
+
+ // Templated constructor that destructively takes the value from another
+ // scoped_ptr_impl.
+ template <typename U, typename V>
+ scoped_ptr_impl(scoped_ptr_impl<U, V>* other)
+ : data_(other->release(), other->get_deleter()) {
+ // We do not support move-only deleters. We could modify our move
+ // emulation to have base::subtle::move() and base::subtle::forward()
+ // functions that are imperfect emulations of their C++11 equivalents,
+ // but until there's a requirement, just assume deleters are copyable.
+ }
+
+ template <typename U, typename V>
+ void TakeState(scoped_ptr_impl<U, V>* other) {
+ // See comment in templated constructor above regarding lack of support
+ // for move-only deleters.
+ reset(other->release());
+ get_deleter() = other->get_deleter();
+ }
+
+ ~scoped_ptr_impl() {
+ if (data_.ptr != NULL) {
+ // Not using get_deleter() saves one function call in non-optimized
+ // builds.
+ static_cast<D&>(data_)(data_.ptr);
+ }
+ }
+
+ void reset(T* p) {
+ // This is a self-reset, which is no longer allowed: http://crbug.com/162971
+ if (p != NULL && p == data_.ptr)
+ abort();
+
+ // Note that running data_.ptr = p can lead to undefined behavior if
+ // get_deleter()(get()) deletes this. In order to pevent this, reset()
+ // should update the stored pointer before deleting its old value.
+ //
+ // However, changing reset() to use that behavior may cause current code to
+ // break in unexpected ways. If the destruction of the owned object
+ // dereferences the scoped_ptr when it is destroyed by a call to reset(),
+ // then it will incorrectly dispatch calls to |p| rather than the original
+ // value of |data_.ptr|.
+ //
+ // During the transition period, set the stored pointer to NULL while
+ // deleting the object. Eventually, this safety check will be removed to
+ // prevent the scenario initially described from occuring and
+ // http://crbug.com/176091 can be closed.
+ T* old = data_.ptr;
+ data_.ptr = NULL;
+ if (old != NULL)
+ static_cast<D&>(data_)(old);
+ data_.ptr = p;
+ }
+
+ T* get() const { return data_.ptr; }
+
+ D& get_deleter() { return data_; }
+ const D& get_deleter() const { return data_; }
+
+ void swap(scoped_ptr_impl& p2) {
+ // Standard swap idiom: 'using std::swap' ensures that std::swap is
+ // present in the overload set, but we call swap unqualified so that
+ // any more-specific overloads can be used, if available.
+ using std::swap;
+ swap(static_cast<D&>(data_), static_cast<D&>(p2.data_));
+ swap(data_.ptr, p2.data_.ptr);
+ }
+
+ T* release() {
+ T* old_ptr = data_.ptr;
+ data_.ptr = NULL;
+ return old_ptr;
+ }
+
+ private:
+ // Needed to allow type-converting constructor.
+ template <typename U, typename V> friend class scoped_ptr_impl;
+
+ // Use the empty base class optimization to allow us to have a D
+ // member, while avoiding any space overhead for it when D is an
+ // empty class. See e.g. http://www.cantrip.org/emptyopt.html for a good
+ // discussion of this technique.
+ struct Data : public D {
+ explicit Data(T* ptr_in) : ptr(ptr_in) {}
+ Data(T* ptr_in, const D& other) : D(other), ptr(ptr_in) {}
+ T* ptr;
+ };
+
+ Data data_;
+
+ DISALLOW_COPY_AND_ASSIGN(scoped_ptr_impl);
+};
+
+// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
+// automatically deletes the pointer it holds (if any).
+// That is, scoped_ptr<T> owns the T object that it points to.
+// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
+// Also like T*, scoped_ptr<T> is thread-compatible, and once you
+// dereference it, you get the thread safety guarantees of T.
+//
+// The size of scoped_ptr is small. On most compilers, when using the
+// DefaultDeleter, sizeof(scoped_ptr<T>) == sizeof(T*). Custom deleters will
+// increase the size proportional to whatever state they need to have. See
+// comments inside scoped_ptr_impl<> for details.
+//
+// Current implementation targets having a strict subset of C++11's
+// unique_ptr<> features. Known deficiencies include not supporting move-only
+// deleteres, function pointers as deleters, and deleters with reference
+// types.
+template <class T, class D = DefaultDeleter<T> >
+class scoped_ptr {
+ public:
+ // The element and deleter types.
+ typedef T element_type;
+ typedef D deleter_type;
+
+ // Constructor. Defaults to initializing with NULL.
+ scoped_ptr() : impl_(NULL) { }
+
+ // Constructor. Takes ownership of p.
+ explicit scoped_ptr(element_type* p) : impl_(p) { }
+
+ // Constructor. Allows initialization of a stateful deleter.
+ scoped_ptr(element_type* p, const D& d) : impl_(p, d) { }
+
+ // Constructor. Allows construction from a scoped_ptr rvalue for a
+ // convertible type and deleter.
+ //
+ // IMPLEMENTATION NOTE: C++11 unique_ptr<> keeps this constructor distinct
+ // from the normal move constructor. By C++11 20.7.1.2.1.21, this constructor
+ // has different post-conditions if D is a reference type. Since this
+ // implementation does not support deleters with reference type,
+ // we do not need a separate move constructor allowing us to avoid one
+ // use of SFINAE. You only need to care about this if you modify the
+ // implementation of scoped_ptr.
+ template <typename U, typename V>
+ scoped_ptr(scoped_ptr<U, V> other) : impl_(&other.impl_) {
+ COMPILE_ASSERT(!is_array<U>::value, U_cannot_be_an_array);
+ }
+
+ // operator=. Allows assignment from a scoped_ptr rvalue for a convertible
+ // type and deleter.
+ //
+ // IMPLEMENTATION NOTE: C++11 unique_ptr<> keeps this operator= distinct from
+ // the normal move assignment operator. By C++11 20.7.1.2.3.4, this templated
+ // form has different requirements on for move-only Deleters. Since this
+ // implementation does not support move-only Deleters, we do not need a
+ // separate move assignment operator allowing us to avoid one use of SFINAE.
+ // You only need to care about this if you modify the implementation of
+ // scoped_ptr.
+ template <typename U, typename V>
+ scoped_ptr& operator=(scoped_ptr<U, V> rhs) {
+ COMPILE_ASSERT(!is_array<U>::value, U_cannot_be_an_array);
+ impl_.TakeState(&rhs.impl_);
+ return *this;
+ }
+
+ // Reset. Deletes the currently owned object, if any.
+ // Then takes ownership of a new object, if given.
+ void reset(element_type* p = NULL) { impl_.reset(p); }
+
+ // Accessors to get the owned object.
+ // operator* and operator-> will assert() if there is no current object.
+ element_type& operator*() const {
+ assert(impl_.get() != NULL);
+ return *impl_.get();
+ }
+ element_type* operator->() const {
+ assert(impl_.get() != NULL);
+ return impl_.get();
+ }
+ element_type* get() const { return impl_.get(); }
+
+ // Access to the deleter.
+ deleter_type& get_deleter() { return impl_.get_deleter(); }
+ const deleter_type& get_deleter() const { return impl_.get_deleter(); }
+
+ // Allow scoped_ptr<element_type> to be used in boolean expressions, but not
+ // implicitly convertible to a real bool (which is dangerous).
+ private:
+ typedef scoped_ptr_impl<element_type, deleter_type> scoped_ptr::*Testable;
+
+ public:
+ operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; }
+
+ // Comparison operators.
+ // These return whether two scoped_ptr refer to the same object, not just to
+ // two different but equal objects.
+ bool operator==(const element_type* p) const { return impl_.get() == p; }
+ bool operator!=(const element_type* p) const { return impl_.get() != p; }
+
+ // Swap two scoped pointers.
+ void swap(scoped_ptr& p2) {
+ impl_.swap(p2.impl_);
+ }
+
+ // Release a pointer.
+ // The return value is the current pointer held by this object.
+ // If this object holds a NULL pointer, the return value is NULL.
+ // After this operation, this object will hold a NULL pointer,
+ // and will not own the object any more.
+ element_type* release() {
+ return impl_.release();
+ }
+
+ private:
+ // Needed to reach into |impl_| in the constructor.
+ template <typename U, typename V> friend class scoped_ptr;
+ scoped_ptr_impl<element_type, deleter_type> impl_;
+
+ // Forbid comparison of scoped_ptr types. If U != T, it totally
+ // doesn't make sense, and if U == T, it still doesn't make sense
+ // because you should never have the same object owned by two different
+ // scoped_ptrs.
+ template <class U> bool operator==(scoped_ptr<U> const& p2) const;
+ template <class U> bool operator!=(scoped_ptr<U> const& p2) const;
+};
+
+template <class T, class D>
+class scoped_ptr<T[], D> {
+ public:
+ // The element and deleter types.
+ typedef T element_type;
+ typedef D deleter_type;
+
+ // Constructor. Defaults to initializing with NULL.
+ scoped_ptr() : impl_(NULL) { }
+
+ // Constructor. Stores the given array. Note that the argument's type
+ // must exactly match T*. In particular:
+ // - it cannot be a pointer to a type derived from T, because it is
+ // inherently unsafe in the general case to access an array through a
+ // pointer whose dynamic type does not match its static type (eg., if
+ // T and the derived types had different sizes access would be
+ // incorrectly calculated). Deletion is also always undefined
+ // (C++98 [expr.delete]p3). If you're doing this, fix your code.
+ // - it cannot be NULL, because NULL is an integral expression, not a
+ // pointer to T. Use the no-argument version instead of explicitly
+ // passing NULL.
+ // - it cannot be const-qualified differently from T per unique_ptr spec
+ // (http://cplusplus.github.com/LWG/lwg-active.html#2118). Users wanting
+ // to work around this may use implicit_cast<const T*>().
+ // However, because of the first bullet in this comment, users MUST
+ // NOT use implicit_cast<Base*>() to upcast the static type of the array.
+ explicit scoped_ptr(element_type* array) : impl_(array) { }
+
+ // Reset. Deletes the currently owned array, if any.
+ // Then takes ownership of a new object, if given.
+ void reset(element_type* array = NULL) { impl_.reset(array); }
+
+ // Accessors to get the owned array.
+ element_type& operator[](size_t i) const {
+ assert(impl_.get() != NULL);
+ return impl_.get()[i];
+ }
+ element_type* get() const { return impl_.get(); }
+
+ // Access to the deleter.
+ deleter_type& get_deleter() { return impl_.get_deleter(); }
+ const deleter_type& get_deleter() const { return impl_.get_deleter(); }
+
+ // Allow scoped_ptr<element_type> to be used in boolean expressions, but not
+ // implicitly convertible to a real bool (which is dangerous).
+ private:
+ typedef scoped_ptr_impl<element_type, deleter_type> scoped_ptr::*Testable;
+
+ public:
+ operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; }
+
+ // Comparison operators.
+ // These return whether two scoped_ptr refer to the same object, not just to
+ // two different but equal objects.
+ bool operator==(element_type* array) const { return impl_.get() == array; }
+ bool operator!=(element_type* array) const { return impl_.get() != array; }
+
+ // Swap two scoped pointers.
+ void swap(scoped_ptr& p2) {
+ impl_.swap(p2.impl_);
+ }
+
+ // Release a pointer.
+ // The return value is the current pointer held by this object.
+ // If this object holds a NULL pointer, the return value is NULL.
+ // After this operation, this object will hold a NULL pointer,
+ // and will not own the object any more.
+ element_type* release() {
+ return impl_.release();
+ }
+
+ private:
+ // Force element_type to be a complete type.
+ enum { type_must_be_complete = sizeof(element_type) };
+
+ // Actually hold the data.
+ scoped_ptr_impl<element_type, deleter_type> impl_;
+
+ // Disable initialization from any type other than element_type*, by
+ // providing a constructor that matches such an initialization, but is
+ // private and has no definition. This is disabled because it is not safe to
+ // call delete[] on an array whose static type does not match its dynamic
+ // type.
+ template <typename U> explicit scoped_ptr(U* array);
+ explicit scoped_ptr(int disallow_construction_from_null);
+
+ // Disable reset() from any type other than element_type*, for the same
+ // reasons as the constructor above.
+ template <typename U> void reset(U* array);
+ void reset(int disallow_reset_from_null);
+
+ // Forbid comparison of scoped_ptr types. If U != T, it totally
+ // doesn't make sense, and if U == T, it still doesn't make sense
+ // because you should never have the same object owned by two different
+ // scoped_ptrs.
+ template <class U> bool operator==(scoped_ptr<U> const& p2) const;
+ template <class U> bool operator!=(scoped_ptr<U> const& p2) const;
+};
+
+// Free functions
+template <class T, class D>
+void swap(scoped_ptr<T, D>& p1, scoped_ptr<T, D>& p2) {
+ p1.swap(p2);
+}
+
+template <class T, class D>
+bool operator==(T* p1, const scoped_ptr<T, D>& p2) {
+ return p1 == p2.get();
+}
+
+template <class T, class D>
+bool operator!=(T* p1, const scoped_ptr<T, D>& p2) {
+ return p1 != p2.get();
+}
+
+// A function to convert T* into scoped_ptr<T>
+// Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+scoped_ptr<T> make_scoped_ptr(T* ptr) {
+ return scoped_ptr<T>(ptr);
+}
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_SCOPED_PTR_H_
diff --git a/cpp/include/libaddressinput/util/template_util.h b/cpp/include/libaddressinput/util/template_util.h
new file mode 100644
index 0000000..35125e1
--- /dev/null
+++ b/cpp/include/libaddressinput/util/template_util.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// https://code.google.com/p/libphonenumber/source/browse/trunk/cpp/src/phonenumbers/base/template_util.h?r=621
+
+#ifndef I18N_ADDRESSINPUT_UTIL_TEMPLATE_UTIL_H_
+#define I18N_ADDRESSINPUT_UTIL_TEMPLATE_UTIL_H_
+
+#include <cstddef> // For size_t.
+
+namespace i18n {
+namespace addressinput {
+
+// template definitions from tr1
+
+template<class T, T v>
+struct integral_constant {
+ static const T value = v;
+ typedef T value_type;
+ typedef integral_constant<T, v> type;
+};
+
+template <class T, T v> const T integral_constant<T, v>::value;
+
+typedef integral_constant<bool, true> true_type;
+typedef integral_constant<bool, false> false_type;
+
+template <class T> struct is_pointer : false_type {};
+template <class T> struct is_pointer<T*> : true_type {};
+
+template <class T, class U> struct is_same : public false_type {};
+template <class T> struct is_same<T,T> : true_type {};
+
+template<class> struct is_array : public false_type {};
+template<class T, size_t n> struct is_array<T[n]> : public true_type {};
+template<class T> struct is_array<T[]> : public true_type {};
+
+template <class T> struct is_non_const_reference : false_type {};
+template <class T> struct is_non_const_reference<T&> : true_type {};
+template <class T> struct is_non_const_reference<const T&> : false_type {};
+
+template <class T> struct is_void : false_type {};
+template <> struct is_void<void> : true_type {};
+
+namespace internal {
+
+// Types YesType and NoType are guaranteed such that sizeof(YesType) <
+// sizeof(NoType).
+typedef char YesType;
+
+struct NoType {
+ YesType dummy[2];
+};
+
+// This class is an implementation detail for is_convertible, and you
+// don't need to know how it works to use is_convertible. For those
+// who care: we declare two different functions, one whose argument is
+// of type To and one with a variadic argument list. We give them
+// return types of different size, so we can use sizeof to trick the
+// compiler into telling us which function it would have chosen if we
+// had called it with an argument of type From. See Alexandrescu's
+// _Modern C++ Design_ for more details on this sort of trick.
+
+struct ConvertHelper {
+ template <typename To>
+ static YesType Test(To);
+
+ template <typename To>
+ static NoType Test(...);
+
+ template <typename From>
+ static From& Create();
+};
+
+// Used to determine if a type is a struct/union/class. Inspired by Boost's
+// is_class type_trait implementation.
+struct IsClassHelper {
+ template <typename C>
+ static YesType Test(void(C::*)(void));
+
+ template <typename C>
+ static NoType Test(...);
+};
+
+} // namespace internal
+
+// Inherits from true_type if From is convertible to To, false_type otherwise.
+//
+// Note that if the type is convertible, this will be a true_type REGARDLESS
+// of whether or not the conversion would emit a warning.
+template <typename From, typename To>
+struct is_convertible
+ : integral_constant<bool,
+ sizeof(internal::ConvertHelper::Test<To>(
+ internal::ConvertHelper::Create<From>())) ==
+ sizeof(internal::YesType)> {
+};
+
+template <typename T>
+struct is_class
+ : integral_constant<bool,
+ sizeof(internal::IsClassHelper::Test<T>(0)) ==
+ sizeof(internal::YesType)> {
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_TEMPLATE_UTIL_H_
diff --git a/cpp/libaddressinput.gyp b/cpp/libaddressinput.gyp
new file mode 100644
index 0000000..63923c9
--- /dev/null
+++ b/cpp/libaddressinput.gyp
@@ -0,0 +1,82 @@
+# Copyright (C) 2013 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ 'component%': 'shared_library',
+ },
+ 'includes': ['libaddressinput.gypi'],
+ 'target_defaults': {
+ 'include_dirs': [
+ 'include',
+ ],
+ },
+ 'targets': [
+ {
+ 'target_name': 'libaddressinput',
+ 'type': '<(component)',
+ 'sources': [
+ '<@(libaddressinput_files)',
+ ],
+ 'dependencies': [
+ 'grit.gyp:generated_messages',
+ 'rapidjson.gyp:rapidjson',
+ 're2.gyp:re2',
+ ],
+ 'conditions': [
+ ['OS == "linux" and _type == "shared_library"', {
+ # https://code.google.com/p/gyp/issues/detail?id=374
+ 'cflags': ['-fPIC'],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'unit_tests',
+ 'type': 'executable',
+ 'sources': [
+ '<@(libaddressinput_test_files)',
+ ],
+ 'defines': [
+ 'TEST_DATA_DIR="../testdata"',
+ ],
+ 'include_dirs': [
+ 'src',
+ ],
+ 'dependencies': [
+ 'libaddressinput',
+ 'gtest.gyp:main',
+ ],
+ 'conditions': [
+ [ 'OS == "mac"', {
+ 'postbuilds': [
+ {
+ # To make it possible to execute the unit tests directly from the
+ # build directory, without first installing the library, the path
+ # to the library is set to be relative to the unit test executable
+ # (so that also the library will be loaded directly from the build
+ # directory).
+ 'postbuild_name': 'Make dylib path relative to executable',
+ 'action': [
+ 'install_name_tool',
+ '-change',
+ '/usr/local/lib/libaddressinput.dylib',
+ '@executable_path/libaddressinput.dylib',
+ '${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}'
+ ],
+ },
+ ],
+ }],
+ ],
+ },
+ ],
+}
diff --git a/cpp/libaddressinput.gypi b/cpp/libaddressinput.gypi
new file mode 100644
index 0000000..8d9030f
--- /dev/null
+++ b/cpp/libaddressinput.gypi
@@ -0,0 +1,95 @@
+# Copyright (C) 2014 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ 'libaddressinput_files': [
+ 'src/address_data.cc',
+ 'src/address_field.cc',
+ 'src/address_field_util.cc',
+ 'src/address_formatter.cc',
+ 'src/address_input_helper.cc',
+ 'src/address_metadata.cc',
+ 'src/address_normalizer.cc',
+ 'src/address_problem.cc',
+ 'src/address_ui.cc',
+ 'src/address_validator.cc',
+ 'src/format_element.cc',
+ 'src/language.cc',
+ 'src/localization.cc',
+ 'src/lookup_key.cc',
+ 'src/lookup_key_util.cc',
+ 'src/null_storage.cc',
+ 'src/ondemand_supplier.cc',
+ 'src/ondemand_supply_task.cc',
+ 'src/post_box_matchers.cc',
+ 'src/preload_supplier.cc',
+ 'src/region_data.cc',
+ 'src/region_data_builder.cc',
+ 'src/region_data_constants.cc',
+ 'src/retriever.cc',
+ 'src/rule.cc',
+ 'src/rule_retriever.cc',
+ 'src/util/json.cc',
+ 'src/util/md5.cc',
+ 'src/util/string_compare.cc',
+ 'src/util/string_split.cc',
+ 'src/util/string_util.cc',
+ 'src/validating_storage.cc',
+ 'src/validating_util.cc',
+ 'src/validation_task.cc',
+ ],
+ 'libaddressinput_test_files': [
+ 'test/address_data_test.cc',
+ 'test/address_field_test.cc',
+ 'test/address_field_util_test.cc',
+ 'test/address_formatter_test.cc',
+ 'test/address_input_helper_test.cc',
+ 'test/address_metadata_test.cc',
+ 'test/address_normalizer_test.cc',
+ 'test/address_problem_test.cc',
+ 'test/address_ui_test.cc',
+ 'test/address_validator_test.cc',
+ 'test/fake_downloader.cc',
+ 'test/fake_downloader_test.cc',
+ 'test/fake_storage.cc',
+ 'test/fake_storage_test.cc',
+ 'test/format_element_test.cc',
+ 'test/language_test.cc',
+ 'test/localization_test.cc',
+ 'test/lookup_key_test.cc',
+ 'test/lookup_key_util_test.cc',
+ 'test/mock_downloader.cc',
+ 'test/null_storage_test.cc',
+ 'test/ondemand_supply_task_test.cc',
+ 'test/post_box_matchers_test.cc',
+ 'test/preload_supplier_test.cc',
+ 'test/region_data_builder_test.cc',
+ 'test/region_data_constants_test.cc',
+ 'test/region_data_test.cc',
+ 'test/retriever_test.cc',
+ 'test/rule_retriever_test.cc',
+ 'test/rule_test.cc',
+ 'test/supplier_test.cc',
+ 'test/util/json_test.cc',
+ 'test/util/md5_unittest.cc',
+ 'test/util/scoped_ptr_unittest.cc',
+ 'test/util/string_compare_test.cc',
+ 'test/util/string_split_unittest.cc',
+ 'test/util/string_util_test.cc',
+ 'test/validating_storage_test.cc',
+ 'test/validating_util_test.cc',
+ 'test/validation_task_test.cc',
+ ],
+ },
+}
diff --git a/cpp/rapidjson.gyp b/cpp/rapidjson.gyp
new file mode 100644
index 0000000..65c6608
--- /dev/null
+++ b/cpp/rapidjson.gyp
@@ -0,0 +1,29 @@
+# Copyright (C) 2013 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ 'rapidjson_dir%': '<(DEPTH)/../externals/rapidjson/include',
+ },
+ 'targets': [
+ {
+ 'target_name': 'rapidjson',
+ 'type': 'none',
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '<(rapidjson_dir)',
+ ],
+ },
+ },
+ ],
+}
diff --git a/cpp/re2.gyp b/cpp/re2.gyp
new file mode 100644
index 0000000..4ac1da1
--- /dev/null
+++ b/cpp/re2.gyp
@@ -0,0 +1,33 @@
+# Copyright (C) 2013 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+{
+ 'variables': {
+ 're2_dir%': '/usr/include',
+ 're2_lib%': '-lre2',
+ },
+ 'targets': [
+ {
+ 'target_name': 're2',
+ 'type': 'none',
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '<(re2_dir)',
+ ],
+ 'libraries': [
+ '<(re2_lib)',
+ ],
+ },
+ },
+ ],
+}
diff --git a/cpp/res/messages.grd b/cpp/res/messages.grd
new file mode 100644
index 0000000..dd3aa64
--- /dev/null
+++ b/cpp/res/messages.grd
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2013 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<grit base_dir="." latest_public_release="0" current_release="1"
+ source_lang_id="en" enc_check="möl">
+ <outputs>
+ <output filename="messages.h" type="rc_header" lang="en">
+ <emit>
+ <!-- If the emit element is not specified, then the generated
+ messages.h includes an atlres.h file from Windows Template
+ Library (WTL). -->
+ </emit>
+ </output>
+ <output filename="en_messages.cc" lang="en" type="c_format" />
+ </outputs>
+ <release seq="1" allow_pseudo="false">
+ <messages fallback_to_english="true">
+ <part file="messages.grdp" />
+ </messages>
+ </release>
+</grit>
diff --git a/cpp/res/messages.grdp b/cpp/res/messages.grdp
new file mode 100644
index 0000000..1e1bcf2
--- /dev/null
+++ b/cpp/res/messages.grdp
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2013 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<grit-part>
+ <message
+ name="IDS_LIBADDRESSINPUT_COUNTRY_OR_REGION_LABEL"
+ desc="A country or a political region (Countries like the United States or
+ regions like Hong Kong or Macao, or places like Taiwan, where
+ whether it is a country or not is a politically sensitive
+ question).">
+ Country / Region
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_LOCALITY_LABEL"
+ desc="E.g., New York City.">
+ City
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_ADDRESS_LINE_1_LABEL"
+ desc="E.g., 18th Street, Unit 3.">
+ Street address
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL"
+ desc="Postal Code. Values are frequently alphanumeric. Used in countries
+ such as Switzerland.">
+ Postal code
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL"
+ desc="ZIP code. Values are frequently alphanumeric. Used in countries such
+ as the US.">
+ ZIP code
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_AREA"
+ desc="Administrative Area for Hong Kong (e.g., Kowloon).">
+ Area
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_COUNTY"
+ desc="Administrative Area for United Kingdoms (e.g. York) or for the
+ United States (e.g. Orange County).">
+ County
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_DEPARTMENT"
+ desc="Administrative Area for Nicaragua (e.g., Boaco) or France.">
+ Department
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_DISTRICT"
+ desc="Administrative Area for Nauru Central Pacific (e.g., Aiwo district),
+ or area of a town (a neighbourhood/suburb) used for addresses in
+ Korea and China.">
+ District
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_DO_SI"
+ desc="Administrative Area for Korea (e.g., Gyeonggi-do or Busan-si).">
+ Do/Si
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_EMIRATE"
+ desc="Administrative Area for United Arab Emirates (e.g., Abu Dhabi).">
+ Emirate
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_ISLAND"
+ desc="Administrative Area for certain countries (e.g., Bahama's Cat
+ Island).">
+ Island
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_PARISH"
+ desc="Administrative Area for certain countries (e.g., Andorra's
+ Canillo).">
+ Parish
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_PREFECTURE"
+ desc="Administrative Area for Japan (e.g., Hokkaido).">
+ Prefecture
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_PROVINCE"
+ desc="Administrative Area for certain countries (e.g., France's
+ Champagne).">
+ Province
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_STATE"
+ desc="Administrative Area for certain countries (e.g., US' California).">
+ State
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_RECIPIENT_LABEL"
+ desc="Label for the field for a person's name in an address.">
+ Name
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD"
+ desc="Error message shown with a UI field when it is a required field and
+ the user has not filled it out.">
+ You can't leave this empty.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE_AND_URL"
+ desc="Error message shown with the postal code field when it is a required
+ field and the user has not filled it out, providing an example
+ postal code and a link to this country's postal service that a user
+ can use to look up their postal code.">
+ You must provide a postal code, for example <ph name="EXAMPLE">$1<ex>90291</ex></ph>. Don't know your postal code? Find it out <ph name="BEGIN_LINK">$2</ph>here<ph name="END_LINK">$3</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE"
+ desc="Error message shown with the postal code field when it is a required
+ field and the user has not filled it out, providing an example
+ postal code.">
+ You must provide a postal code, for example <ph name="EXAMPLE">$1<ex>90291</ex></ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE_AND_URL"
+ desc="Error message shown with the ZIP code field when it is a required
+ field and the user has not filled it out, providing an example ZIP
+ code and a link to this country's postal service that a user can use
+ to look up their ZIP code. This is specifically for countries using
+ ZIP codes instead of Postal codes, such as America.">
+ You must provide a ZIP code, for example <ph name="EXAMPLE">$1<ex>90291</ex></ph>. Don't know your ZIP code? Find it out <ph name="BEGIN_LINK">$2</ph>here<ph name="END_LINK">$3</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE"
+ desc="Error message shown with the ZIP code field when it is a required
+ field and the user has not filled it out, providing an example ZIP
+ code.">
+ You must provide a ZIP code, for example <ph name="EXAMPLE">$1<ex>90291</ex></ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNKNOWN_VALUE"
+ desc="Occurs when the user fills out the wrong value for an address field.
+ For example, this would be shown when putting 'Cupertino' in United
+ States' State field.">
+ <ph name="FIELD_VALUE">$1<ex>Cupertino</ex></ph> is not recognized as a known value for this field.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE_AND_URL"
+ desc="Occurs when the user fills out a postal code that does not conform
+ to the country's postal code format. For example, this would be
+ shown when using '80' as a Swiss postal code, which is normally 4
+ digits long. Provides an example postal code and a link to this
+ country's postal service that a user can use to look up their postal
+ code.">
+ This postal code format is not recognized. Example of a valid postal code: <ph name="EXAMPLE">$1<ex>90291</ex></ph>. Don't know your postal code? Find it out <ph name="BEGIN_LINK">$2</ph>here<ph name="END_LINK">$3</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE"
+ desc="Occurs when the user fills out a postal code that does not conform
+ to the country's postal code format. For example, this would be
+ shown when using '80' as a Swiss postal code, which is normally 4
+ digits long. Provides an example postal code.">
+ This postal code format is not recognized. Example of a valid postal code: <ph name="EXAMPLE">$1<ex>90291</ex></ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE"
+ desc="Occurs when the user fills out a postal code that does not conform
+ to the country's postal code format. For example, this would be
+ shown when using '80' as a Swiss postal code, which is normally 4
+ digits long.">
+ This postal code format is not recognized.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE_AND_URL"
+ desc="Occurs when the user fills out a ZIP code that does not conform to
+ the country's ZIP code format. For example, this would be shown when
+ using '901' as a ZIP code for the United States. Provides an example
+ ZIP code and a link to this country's postal service that a user can
+ use to look up their ZIP code.">
+ This ZIP code format is not recognized. Example of a valid ZIP code: <ph name="EXAMPLE">$1<ex>90291</ex></ph>. Don't know your ZIP code? Find it out <ph name="BEGIN_LINK">$2</ph>here<ph name="END_LINK">$3</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE"
+ desc="Occurs when the user fills out a ZIP code that does not conform to
+ the country's ZIP code format. For example, this would be shown when
+ using '901' as a ZIP code for the United States. Provides an example
+ ZIP code.">
+ This ZIP code format is not recognized. Example of a valid ZIP code: <ph name="EXAMPLE">$1<ex>90291</ex></ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP"
+ desc="Occurs when the user fills out a ZIP code that does not conform to
+ the country's ZIP code format. For example, this would be shown when
+ using '901' as a ZIP code for the United States.">
+ This ZIP code format is not recognized.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE_URL"
+ desc="Occurs when the user fills out the wrong postal code for a certain
+ location. For example, this would be shown when using Z3Z 2Y7 for
+ Alberta, Canada. Provides a link to this country's postal service
+ that a user can use to look up their postal code.">
+ This postal code does not appear to match the rest of this address. Don't know your postal code? Find it out <ph name="BEGIN_LINK">$1</ph>here<ph name="END_LINK">$2</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE"
+ desc="Occurs when the user fills out the wrong postal code for a certain
+ location. For example, this would be shown when using Z3Z 2Y7 for
+ Alberta, Canada.">
+ This postal code does not appear to match the rest of this address.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP_URL"
+ desc="Occurs when the user fills out the wrong ZIP code for a certain
+ location. For example, this would be shown when using 10001 for
+ Arizona state. Provides a link to this country's postal service that
+ a user can use to look up their ZIP code.">
+ This ZIP code does not appear to match the rest of this address. Don't know your ZIP code? Find it out <ph name="BEGIN_LINK">$1</ph>here<ph name="END_LINK">$2</ph>.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP"
+ desc="Occurs when the user fills out the wrong ZIP code for a certain
+ location. For example, this would be shown when using 10001 for
+ Arizona state.">
+ This ZIP code does not appear to match the rest of this address.
+ </message>
+ <message
+ name="IDS_LIBADDRESSINPUT_PO_BOX_FORBIDDEN_VALUE"
+ desc="Occurs when the user fills out a P.O. box as part of a physical
+ address.">
+ This address line appears to contain a post office box. Please use a street or building address.
+ </message>
+</grit-part>
diff --git a/cpp/src/address_data.cc b/cpp/src/address_data.cc
new file mode 100644
index 0000000..a3549ed
--- /dev/null
+++ b/cpp/src/address_data.cc
@@ -0,0 +1,150 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_data.h>
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <functional>
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include <re2/re2.h>
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+// Mapping from AddressField value to pointer to AddressData member.
+std::string AddressData::*kStringField[] = {
+ &AddressData::region_code,
+ &AddressData::administrative_area,
+ &AddressData::locality,
+ &AddressData::dependent_locality,
+ &AddressData::sorting_code,
+ &AddressData::postal_code,
+ NULL,
+ &AddressData::recipient
+};
+
+// Mapping from AddressField value to pointer to AddressData member.
+const std::vector<std::string> AddressData::*kVectorStringField[] = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ &AddressData::address_line,
+ NULL
+};
+
+COMPILE_ASSERT(arraysize(kStringField) == arraysize(kVectorStringField),
+ field_mapping_array_size_mismatch);
+
+// A string is considered to be "empty" not only if it actually is empty, but
+// also if it contains nothing but whitespace.
+bool IsStringEmpty(const std::string& str) {
+ static const RE2 kMatcher("\\S");
+ return str.empty() || !RE2::PartialMatch(str, kMatcher);
+}
+
+} // namespace
+
+bool AddressData::IsFieldEmpty(AddressField field) const {
+ assert(field >= 0);
+ assert(static_cast<size_t>(field) < arraysize(kStringField));
+ if (kStringField[field] != NULL) {
+ const std::string& value = GetFieldValue(field);
+ return IsStringEmpty(value);
+ } else {
+ const std::vector<std::string>& value = GetRepeatedFieldValue(field);
+ return std::find_if(value.begin(), value.end(),
+ std::not1(std::ptr_fun(&IsStringEmpty))) ==
+ value.end();
+ }
+}
+
+const std::string& AddressData::GetFieldValue(
+ AddressField field) const {
+ assert(field >= 0);
+ assert(static_cast<size_t>(field) < arraysize(kStringField));
+ assert(kStringField[field] != NULL);
+ return this->*kStringField[field];
+}
+
+void AddressData::SetFieldValue(AddressField field, const std::string& value) {
+ assert(field >= 0);
+ assert(static_cast<size_t>(field) < arraysize(kStringField));
+ assert(kStringField[field] != NULL);
+ (this->*kStringField[field]).assign(value);
+}
+
+const std::vector<std::string>& AddressData::GetRepeatedFieldValue(
+ AddressField field) const {
+ assert(IsRepeatedFieldValue(field));
+ return this->*kVectorStringField[field];
+}
+
+bool AddressData::operator==(const AddressData& other) const {
+ return
+ region_code == other.region_code &&
+ address_line == other.address_line &&
+ administrative_area == other.administrative_area &&
+ locality == other.locality &&
+ dependent_locality == other.dependent_locality &&
+ postal_code == other.postal_code &&
+ sorting_code == other.sorting_code &&
+ language_code == other.language_code &&
+ recipient == other.recipient;
+}
+
+// static
+bool AddressData::IsRepeatedFieldValue(AddressField field) {
+ assert(field >= 0);
+ assert(static_cast<size_t>(field) < arraysize(kVectorStringField));
+ return kVectorStringField[field] != NULL;
+}
+
+} // namespace addressinput
+} // namespace i18n
+
+std::ostream& operator<<(std::ostream& o,
+ const i18n::addressinput::AddressData& address) {
+ o << "region_code: \"" << address.region_code << "\"\n"
+ "administrative_area: \"" << address.administrative_area << "\"\n"
+ "locality: \"" << address.locality << "\"\n"
+ "dependent_locality: \"" << address.dependent_locality << "\"\n"
+ "postal_code: \"" << address.postal_code << "\"\n"
+ "sorting_code: \"" << address.sorting_code << "\"\n";
+
+ // TODO: Update the field order in the .h file to match the order they are
+ // printed out here, for consistency.
+ for (std::vector<std::string>::const_iterator it =
+ address.address_line.begin();
+ it != address.address_line.end(); ++it) {
+ o << "address_line: \"" << *it << "\"\n";
+ }
+
+ o << "language_code: \"" << address.language_code << "\"\n"
+ "recipient: \"" << address.recipient << "\"\n";
+
+ return o;
+}
diff --git a/cpp/src/address_field.cc b/cpp/src/address_field.cc
new file mode 100644
index 0000000..9831479
--- /dev/null
+++ b/cpp/src/address_field.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_field.h>
+
+#include <cstddef>
+#include <ostream>
+
+#include <libaddressinput/util/basictypes.h>
+
+using i18n::addressinput::AddressField;
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::RECIPIENT;
+
+std::ostream& operator<<(std::ostream& o, AddressField field) {
+ static const char* const kFieldNames[] = {
+ "COUNTRY",
+ "ADMIN_AREA",
+ "LOCALITY",
+ "DEPENDENT_LOCALITY",
+ "SORTING_CODE",
+ "POSTAL_CODE",
+ "STREET_ADDRESS",
+ "RECIPIENT"
+ };
+ COMPILE_ASSERT(COUNTRY == 0, bad_base);
+ COMPILE_ASSERT(RECIPIENT == arraysize(kFieldNames) - 1, bad_length);
+
+ if (field < 0 || static_cast<size_t>(field) >= arraysize(kFieldNames)) {
+ o << "[INVALID ENUM VALUE " << static_cast<int>(field) << "]";
+ } else {
+ o << kFieldNames[field];
+ }
+ return o;
+}
diff --git a/cpp/src/address_field_util.cc b/cpp/src/address_field_util.cc
new file mode 100644
index 0000000..1cac289
--- /dev/null
+++ b/cpp/src/address_field_util.cc
@@ -0,0 +1,112 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "address_field_util.h"
+
+#include <libaddressinput/address_field.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "format_element.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+std::map<char, AddressField> InitFields() {
+ std::map<char, AddressField> fields;
+ fields.insert(std::make_pair('R', COUNTRY));
+ fields.insert(std::make_pair('S', ADMIN_AREA));
+ fields.insert(std::make_pair('C', LOCALITY));
+ fields.insert(std::make_pair('D', DEPENDENT_LOCALITY));
+ fields.insert(std::make_pair('X', SORTING_CODE));
+ fields.insert(std::make_pair('Z', POSTAL_CODE));
+ fields.insert(std::make_pair('A', STREET_ADDRESS));
+ fields.insert(std::make_pair('N', RECIPIENT));
+ return fields;
+}
+
+const std::map<char, AddressField>& GetFields() {
+ static const std::map<char, AddressField> kFields(InitFields());
+ return kFields;
+}
+
+bool IsFieldToken(char c) {
+ return GetFields().find(c) != GetFields().end();
+}
+
+AddressField ParseFieldToken(char c) {
+ std::map<char, AddressField>::const_iterator it = GetFields().find(c);
+ assert(it != GetFields().end());
+ return it->second;
+}
+
+} // namespace
+
+void ParseFormatRule(const std::string& format,
+ std::vector<FormatElement>* elements) {
+ assert(elements != NULL);
+ elements->clear();
+
+ std::string::const_iterator prev = format.begin();
+ for (std::string::const_iterator next = format.begin();
+ next != format.end(); prev = ++next) {
+ // Find the next field element or newline (indicated by %<TOKEN>).
+ if ((next = std::find(next, format.end(), '%')) == format.end()) {
+ // No more tokens in the format string.
+ break;
+ }
+ if (prev < next) {
+ // Push back preceding literal.
+ elements->push_back(FormatElement(std::string(prev, next)));
+ }
+ if ((prev = ++next) == format.end()) {
+ // Move forward and check we haven't reached the end of the string
+ // (unlikely, it shouldn't end with %).
+ break;
+ }
+ // Process the token after the %.
+ if (*next == 'n') {
+ elements->push_back(FormatElement());
+ } else if (IsFieldToken(*next)) {
+ elements->push_back(FormatElement(ParseFieldToken(*next)));
+ } // Else it's an unknown token, we ignore it.
+ }
+ // Push back any trailing literal.
+ if (prev != format.end()) {
+ elements->push_back(FormatElement(std::string(prev, format.end())));
+ }
+}
+
+void ParseAddressFieldsRequired(const std::string& required,
+ std::vector<AddressField>* fields) {
+ assert(fields != NULL);
+ fields->clear();
+ for (std::string::const_iterator it = required.begin();
+ it != required.end(); ++it) {
+ if (IsFieldToken(*it)) {
+ fields->push_back(ParseFieldToken(*it));
+ }
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_field_util.h b/cpp/src/address_field_util.h
new file mode 100644
index 0000000..62a6b7e
--- /dev/null
+++ b/cpp/src/address_field_util.h
@@ -0,0 +1,44 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ADDRESS_FIELD_UTIL_H_
+#define I18N_ADDRESSINPUT_ADDRESS_FIELD_UTIL_H_
+
+#include <libaddressinput/address_field.h>
+
+#include <string>
+#include <vector>
+
+#include "format_element.h"
+
+namespace i18n {
+namespace addressinput {
+
+// Clears |fields|, parses |format|, and adds the format address fields to
+// |fields|. The |fields| may also contain NEWLINE elements. For example, parses
+// "%S%C%n%D%X" into {ADMIN_AREA, LOCALITY, NEWLINE, DEPENDENT_LOCALITY,
+// SORTING_CODE}.
+void ParseFormatRule(const std::string& format,
+ std::vector<FormatElement>* fields);
+
+// Clears |fields|, parses |required|, and adds the required fields to |fields|.
+// For example, parses "SCDX" into {ADMIN_AREA, LOCALITY, DEPENDENT_LOCALITY,
+// SORTING_CODE}.
+void ParseAddressFieldsRequired(const std::string& required,
+ std::vector<AddressField>* fields);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ADDRESS_FIELD_UTIL_H_
diff --git a/cpp/src/address_formatter.cc b/cpp/src/address_formatter.cc
new file mode 100644
index 0000000..29f3486
--- /dev/null
+++ b/cpp/src/address_formatter.cc
@@ -0,0 +1,197 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_formatter.h>
+
+#include <strings.h>
+
+#include <algorithm>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+
+#include "format_element.h"
+#include "language.h"
+#include "region_data_constants.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+const char kCommaSeparator[] = ", ";
+const char kSpaceSeparator[] = " ";
+const char kArabicCommaSeparator[] = "\xD8\x8C" " "; /* "، " */
+
+const char* kLanguagesThatUseSpace[] = {
+ "th",
+ "ko"
+};
+
+const char* kLanguagesThatHaveNoSeparator[] = {
+ "ja",
+ "zh" // All Chinese variants.
+};
+
+// This data is based on CLDR, for languages that are in official use in some
+// country, where Arabic is the most likely script tag.
+// TODO: Consider supporting variants such as tr-Arab by detecting the script
+// code.
+const char* kLanguagesThatUseAnArabicComma[] = {
+ "ar",
+ "az",
+ "fa",
+ "kk",
+ "ku",
+ "ky",
+ "ps",
+ "tg",
+ "tk",
+ "ur",
+ "uz"
+};
+
+// Case insensitive matcher for language tags.
+struct LanguageMatcher {
+ LanguageMatcher(const std::string& tag) : tag(tag) {}
+ std::string tag;
+ bool operator() (const std::string& s) {
+ return strcasecmp(tag.c_str(), s.c_str()) == 0;
+ }
+};
+
+std::string GetLineSeparatorForLanguage(const std::string& language_tag) {
+ Language address_language(language_tag);
+
+ // First deal with explicit script tags.
+ if (address_language.has_latin_script) {
+ return kCommaSeparator;
+ }
+
+ // Now guess something appropriate based on the base language.
+ const std::string& base_language = address_language.base;
+ if (std::find_if(kLanguagesThatUseSpace,
+ kLanguagesThatUseSpace + arraysize(kLanguagesThatUseSpace),
+ LanguageMatcher(base_language)) !=
+ kLanguagesThatUseSpace + arraysize(kLanguagesThatUseSpace)) {
+ return kSpaceSeparator;
+ } else if (std::find_if(kLanguagesThatHaveNoSeparator,
+ kLanguagesThatHaveNoSeparator +
+ arraysize(kLanguagesThatHaveNoSeparator),
+ LanguageMatcher(base_language)) !=
+ kLanguagesThatHaveNoSeparator +
+ arraysize(kLanguagesThatHaveNoSeparator)) {
+ return "";
+ } else if (std::find_if(kLanguagesThatUseAnArabicComma,
+ kLanguagesThatUseAnArabicComma +
+ arraysize(kLanguagesThatUseAnArabicComma),
+ LanguageMatcher(base_language)) !=
+ kLanguagesThatUseAnArabicComma +
+ arraysize(kLanguagesThatUseAnArabicComma)) {
+ return kArabicCommaSeparator;
+ }
+ // Either the language is a latin-script language, or no language was
+ // specified. In the latter case we still return ", " as the most common
+ // separator in use. In countries that don't use this, e.g. Thailand,
+ // addresses are often written in latin script where this would still be
+ // appropriate, so this is a reasonable default in the absence of information.
+ return kCommaSeparator;
+}
+
+void CombineLinesForLanguage(
+ const std::vector<std::string>& lines, const std::string& language_tag,
+ std::string *line) {
+ if (lines.size() > 0) {
+ line->assign(lines[0]);
+ }
+ std::string separator = GetLineSeparatorForLanguage(language_tag);
+ for (std::vector<std::string>::const_iterator it = lines.begin() + 1;
+ it < lines.end(); ++it) {
+ line->append(separator);
+ line->append(*it);
+ }
+}
+
+} // namespace
+
+void GetFormattedNationalAddress(
+ const AddressData& address_data, std::vector<std::string>* lines) {
+ assert(lines != NULL);
+ lines->clear();
+
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ // TODO: Eventually, we should get the best rule for this country and
+ // language, rather than just for the country.
+ rule.ParseSerializedRule(RegionDataConstants::GetRegionData(
+ address_data.region_code));
+
+ Language language(address_data.language_code);
+
+ // If latinized rules are available and the |language_code| of this address is
+ // explicitly tagged as being Latin, then use the latinized formatting rules.
+ const std::vector<FormatElement>& format =
+ language.has_latin_script && !rule.GetLatinFormat().empty()
+ ? rule.GetLatinFormat() : rule.GetFormat();
+
+ std::string line;
+ for (size_t i = 0; i < format.size(); ++i) {
+ FormatElement element = format[i];
+ if (element.IsNewline()) {
+ if (!line.empty()) {
+ lines->push_back(line);
+ line.clear();
+ }
+ } else if (element.IsField()) {
+ AddressField field = element.GetField();
+ if (field == STREET_ADDRESS) {
+ // The field "street address" represents the street address lines of an
+ // address, so there can be multiple values.
+ if (!line.empty()) {
+ lines->push_back(line);
+ line.clear();
+ }
+ lines->insert(lines->end(), address_data.address_line.begin(),
+ address_data.address_line.end());
+ } else {
+ line.append(address_data.GetFieldValue(field));
+ }
+ } else {
+ line.append(element.GetLiteral());
+ }
+ }
+ if (!line.empty()) {
+ lines->push_back(line);
+ }
+}
+
+void GetFormattedNationalAddressLine(
+ const AddressData& address_data, std::string* line) {
+ std::vector<std::string> address_lines;
+ GetFormattedNationalAddress(address_data, &address_lines);
+ CombineLinesForLanguage(address_lines, address_data.language_code, line);
+}
+
+void GetStreetAddressLinesAsSingleLine(
+ const AddressData& address_data, std::string* line) {
+ CombineLinesForLanguage(
+ address_data.address_line, address_data.language_code, line);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_input_helper.cc b/cpp/src/address_input_helper.cc
new file mode 100644
index 0000000..a8ce92f
--- /dev/null
+++ b/cpp/src/address_input_helper.cc
@@ -0,0 +1,180 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_input_helper.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include "language.h"
+#include "lookup_key.h"
+#include "region_data_constants.h"
+#include "rule.h"
+#include "util/re2ptr.h"
+
+namespace i18n {
+namespace addressinput {
+
+// Used for building a hierarchy of rules, each one connected to its parent.
+struct Node {
+ const Node* parent;
+ const Rule* rule;
+};
+
+namespace {
+
+const char kLookupKeySeparator = '/';
+
+const size_t kHierarchyDepth = arraysize(LookupKey::kHierarchy);
+
+// Gets the best name for the entity represented by the current rule, using the
+// language provided. The language is currently used to distinguish whether a
+// Latin-script name should be fetched; if it is not explicitly Latin-script, we
+// prefer IDs over names (so return CA instead of California for an English
+// user.) If there is no Latin-script name, we fall back to the ID.
+std::string GetBestName(const Language& language, const Rule& rule) {
+ if (language.has_latin_script) {
+ const std::string& name = rule.GetLatinName();
+ if (!name.empty()) {
+ return name;
+ }
+ }
+ // The ID is stored as data/US/CA for "CA", for example, and we only want the
+ // last part.
+ const std::string& id = rule.GetId();
+ std::string::size_type pos = id.rfind(kLookupKeySeparator);
+ assert(pos != std::string::npos);
+ return id.substr(pos + 1);
+}
+
+void FillAddressFromMatchedRules(
+ const std::vector<Node>* hierarchy,
+ AddressData* address) {
+ assert(hierarchy != NULL);
+ assert(address != NULL);
+ // We skip region code, because we never try and fill that in if it isn't
+ // already set.
+ Language language(address->language_code);
+ for (size_t depth = kHierarchyDepth - 1; depth > 0; --depth) {
+ // If there is only one match at this depth, then we should populate the
+ // address, using this rule and its parents.
+ if (hierarchy[depth].size() == 1) {
+ for (const Node* node = &hierarchy[depth].front();
+ node != NULL; node = node->parent, --depth) {
+ const Rule* rule = node->rule;
+ assert(rule != NULL);
+
+ AddressField field = LookupKey::kHierarchy[depth];
+ // Note only empty fields are permitted to be overwritten.
+ if (address->IsFieldEmpty(field)) {
+ address->SetFieldValue(field, GetBestName(language, *rule));
+ }
+ }
+ break;
+ }
+ }
+}
+
+} // namespace;
+
+AddressInputHelper::AddressInputHelper(PreloadSupplier* supplier)
+ : supplier_(supplier) {
+ assert(supplier_ != NULL);
+}
+
+AddressInputHelper::~AddressInputHelper() {
+}
+
+void AddressInputHelper::FillAddress(AddressData* address) const {
+ assert(address != NULL);
+ const std::string& region_code = address->region_code;
+ if (!RegionDataConstants::IsSupported(region_code)) {
+ // If we don't have a region code, we can't do anything reliably to fill
+ // this address.
+ return;
+ }
+
+ AddressData lookup_key_address;
+ lookup_key_address.region_code = region_code;
+ // First try and fill in the postal code if it is missing.
+ LookupKey lookup_key;
+ lookup_key.FromAddress(lookup_key_address);
+ const Rule* region_rule = supplier_->GetRule(lookup_key);
+ // We have already checked that the region is supported; and users of this
+ // method must have called LoadRules() first, so we check this here.
+ assert(region_rule != NULL);
+
+ const RE2ptr* postal_code_reg_exp = region_rule->GetPostalCodeMatcher();
+ if (postal_code_reg_exp != NULL) {
+ if (address->postal_code.empty()) {
+ address->postal_code = region_rule->GetSolePostalCode();
+ }
+
+ // If we have a valid postal code, try and work out the most specific
+ // hierarchy that matches the postal code. Note that the postal code might
+ // have been added in the previous check.
+ if (!address->postal_code.empty() &&
+ RE2::FullMatch(address->postal_code, *postal_code_reg_exp->ptr)) {
+
+ // This hierarchy is used to store rules that represent possible matches
+ // at each level of the hierarchy.
+ std::vector<Node> hierarchy[kHierarchyDepth];
+ CheckChildrenForPostCodeMatches(*address, lookup_key, NULL, hierarchy);
+
+ FillAddressFromMatchedRules(hierarchy, address);
+ }
+ }
+
+ // TODO: When we have the data, we should fill in the state for countries with
+ // state required and only one possible value, e.g. American Samoa.
+}
+
+void AddressInputHelper::CheckChildrenForPostCodeMatches(
+ const AddressData& address,
+ const LookupKey& lookup_key,
+ const Node* parent,
+ // An array of vectors.
+ std::vector<Node>* hierarchy) const {
+ const Rule* rule = supplier_->GetRule(lookup_key);
+ assert(rule != NULL);
+
+ const RE2ptr* postal_code_prefix = rule->GetPostalCodeMatcher();
+ if (postal_code_prefix == NULL ||
+ RE2::PartialMatch(address.postal_code, *postal_code_prefix->ptr)) {
+ // This was a match, so store it and its parent in the hierarchy.
+ hierarchy[lookup_key.GetDepth()].push_back(Node());
+ Node* node = &hierarchy[lookup_key.GetDepth()].back();
+ node->parent = parent;
+ node->rule = rule;
+
+ // If there are children, check them too.
+ for (std::vector<std::string>::const_iterator child_it =
+ rule->GetSubKeys().begin();
+ child_it != rule->GetSubKeys().end(); ++child_it) {
+ LookupKey child_key;
+ child_key.FromLookupKey(lookup_key, *child_it);
+ CheckChildrenForPostCodeMatches(address, child_key, node, hierarchy);
+ }
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_metadata.cc b/cpp/src/address_metadata.cc
new file mode 100644
index 0000000..59030ef
--- /dev/null
+++ b/cpp/src/address_metadata.cc
@@ -0,0 +1,62 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_metadata.h>
+
+#include <libaddressinput/address_field.h>
+
+#include <algorithm>
+
+#include "region_data_constants.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+bool IsFieldRequired(AddressField field, const std::string& region_code) {
+ if (field == COUNTRY) {
+ return true;
+ }
+
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ if (!rule.ParseSerializedRule(
+ RegionDataConstants::GetRegionData(region_code))) {
+ return false;
+ }
+
+ return std::find(rule.GetRequired().begin(),
+ rule.GetRequired().end(),
+ field) != rule.GetRequired().end();
+}
+
+bool IsFieldUsed(AddressField field, const std::string& region_code) {
+ if (field == COUNTRY) {
+ return true;
+ }
+
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ if (!rule.ParseSerializedRule(
+ RegionDataConstants::GetRegionData(region_code))) {
+ return false;
+ }
+
+ return std::find(rule.GetFormat().begin(),
+ rule.GetFormat().end(),
+ FormatElement(field)) != rule.GetFormat().end();
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_normalizer.cc b/cpp/src/address_normalizer.cc
new file mode 100644
index 0000000..e80489d
--- /dev/null
+++ b/cpp/src/address_normalizer.cc
@@ -0,0 +1,88 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_normalizer.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/preload_supplier.h>
+
+#include <cassert>
+#include <cstddef>
+
+#include "lookup_key.h"
+#include "region_data_constants.h"
+#include "rule.h"
+#include "util/string_compare.h"
+
+namespace i18n {
+namespace addressinput {
+
+AddressNormalizer::AddressNormalizer(const PreloadSupplier* supplier)
+ : supplier_(supplier),
+ compare_(new StringCompare) {
+ assert(supplier_ != NULL);
+}
+
+AddressNormalizer::~AddressNormalizer() {}
+
+void AddressNormalizer::Normalize(AddressData* address) const {
+ assert(address != NULL);
+ assert(supplier_->IsLoaded(address->region_code));
+
+ AddressData region_address;
+ region_address.region_code = address->region_code;
+ LookupKey parent_key;
+ parent_key.FromAddress(region_address);
+ const Rule* parent_rule = supplier_->GetRule(parent_key);
+ assert(parent_rule != NULL);
+
+ LookupKey lookup_key;
+ for (size_t depth = 1; depth < arraysize(LookupKey::kHierarchy); ++depth) {
+ AddressField field = LookupKey::kHierarchy[depth];
+ if (address->IsFieldEmpty(field)) {
+ return;
+ }
+ const std::string& field_value = address->GetFieldValue(field);
+ bool no_match_found_yet = true;
+ for (std::vector<std::string>::const_iterator
+ key_it = parent_rule->GetSubKeys().begin();
+ key_it != parent_rule->GetSubKeys().end(); ++key_it) {
+ lookup_key.FromLookupKey(parent_key, *key_it);
+ const Rule* rule = supplier_->GetRule(lookup_key);
+ assert(rule != NULL);
+
+ bool matches_latin_name =
+ compare_->NaturalEquals(field_value, rule->GetLatinName());
+ bool matches_local_name_id =
+ compare_->NaturalEquals(field_value, *key_it) ||
+ compare_->NaturalEquals(field_value, rule->GetName());
+ if (matches_latin_name || matches_local_name_id) {
+ address->SetFieldValue(
+ field, matches_latin_name ? rule->GetLatinName() : *key_it);
+ no_match_found_yet = false;
+ parent_key.FromLookupKey(parent_key, *key_it);
+ parent_rule = supplier_->GetRule(parent_key);
+ assert(parent_rule != NULL);
+ break;
+ }
+ }
+ if (no_match_found_yet) {
+ return; // Abort search.
+ }
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_problem.cc b/cpp/src/address_problem.cc
new file mode 100644
index 0000000..e6cf446
--- /dev/null
+++ b/cpp/src/address_problem.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_problem.h>
+
+#include <cstddef>
+#include <ostream>
+
+#include <libaddressinput/util/basictypes.h>
+
+using i18n::addressinput::AddressProblem;
+using i18n::addressinput::UNEXPECTED_FIELD;
+using i18n::addressinput::USES_P_O_BOX;
+
+std::ostream& operator<<(std::ostream& o, AddressProblem problem) {
+ static const char* const kProblemNames[] = {
+ "UNEXPECTED_FIELD",
+ "MISSING_REQUIRED_FIELD",
+ "UNKNOWN_VALUE",
+ "INVALID_FORMAT",
+ "MISMATCHING_VALUE",
+ "USES_P_O_BOX"
+ };
+ COMPILE_ASSERT(UNEXPECTED_FIELD == 0, bad_base);
+ COMPILE_ASSERT(USES_P_O_BOX == arraysize(kProblemNames) - 1, bad_length);
+
+ if (problem < 0 || static_cast<size_t>(problem) >= arraysize(kProblemNames)) {
+ o << "[INVALID ENUM VALUE " << static_cast<int>(problem) << "]";
+ } else {
+ o << kProblemNames[problem];
+ }
+ return o;
+}
diff --git a/cpp/src/address_ui.cc b/cpp/src/address_ui.cc
new file mode 100644
index 0000000..d515765
--- /dev/null
+++ b/cpp/src/address_ui.cc
@@ -0,0 +1,138 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_ui.h>
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_ui_component.h>
+#include <libaddressinput/localization.h>
+
+#include <cassert>
+#include <cstddef>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "address_field_util.h"
+#include "format_element.h"
+#include "grit.h"
+#include "language.h"
+#include "messages.h"
+#include "region_data_constants.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+std::string GetLabelForField(const Localization& localization,
+ AddressField field,
+ int admin_area_name_message_id,
+ int postal_code_name_message_id) {
+ int messageId;
+ switch (field) {
+ case SORTING_CODE:
+ // This needs no translation as it's used only in one locale.
+ return "CEDEX";
+ case COUNTRY:
+ messageId = IDS_LIBADDRESSINPUT_COUNTRY_OR_REGION_LABEL;
+ break;
+ case ADMIN_AREA:
+ messageId = admin_area_name_message_id;
+ break;
+ case LOCALITY:
+ messageId = IDS_LIBADDRESSINPUT_LOCALITY_LABEL;
+ break;
+ case DEPENDENT_LOCALITY:
+ messageId = IDS_LIBADDRESSINPUT_DISTRICT;
+ break;
+ case POSTAL_CODE:
+ messageId = postal_code_name_message_id;
+ break;
+ case STREET_ADDRESS:
+ messageId = IDS_LIBADDRESSINPUT_ADDRESS_LINE_1_LABEL;
+ break;
+ case RECIPIENT:
+ messageId = IDS_LIBADDRESSINPUT_RECIPIENT_LABEL;
+ break;
+ default:
+ messageId = INVALID_MESSAGE_ID;
+ }
+ return localization.GetString(messageId);
+}
+
+} // namespace
+
+const std::vector<std::string>& GetRegionCodes() {
+ return RegionDataConstants::GetRegionCodes();
+}
+
+std::vector<AddressUiComponent> BuildComponents(
+ const std::string& region_code,
+ const Localization& localization,
+ std::string* best_address_language_tag) {
+ assert(best_address_language_tag != NULL);
+ std::vector<AddressUiComponent> result;
+
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ if (!rule.ParseSerializedRule(
+ RegionDataConstants::GetRegionData(region_code))) {
+ return result;
+ }
+
+ const Language& best_address_language = ChooseBestAddressLanguage(
+ rule, Language(localization.GetLanguage()));
+ *best_address_language_tag = best_address_language.tag;
+
+ const std::vector<FormatElement>& format =
+ !rule.GetLatinFormat().empty() &&
+ best_address_language.has_latin_script
+ ? rule.GetLatinFormat() : rule.GetFormat();
+
+ // For avoiding showing an input field twice, when the field is displayed
+ // twice on an envelope.
+ std::set<AddressField> fields;
+
+ bool preceded_by_newline = true;
+ bool followed_by_newline = true;
+ for (std::vector<FormatElement>::const_iterator format_it = format.begin();
+ format_it != format.end(); ++format_it) {
+ if (format_it->IsNewline()) {
+ preceded_by_newline = true;
+ continue;
+ } else if (!format_it->IsField() ||
+ !fields.insert(format_it->GetField()).second) {
+ continue;
+ }
+ AddressUiComponent component;
+ std::vector<FormatElement>::const_iterator next_format_it = format_it + 1;
+ followed_by_newline =
+ next_format_it == format.end() || next_format_it->IsNewline();
+ component.length_hint = preceded_by_newline && followed_by_newline
+ ? AddressUiComponent::HINT_LONG
+ : AddressUiComponent::HINT_SHORT;
+ preceded_by_newline = false;
+ component.field = format_it->GetField();
+ component.name = GetLabelForField(localization, format_it->GetField(),
+ rule.GetAdminAreaNameMessageId(), rule.GetPostalCodeNameMessageId());
+ result.push_back(component);
+ }
+
+ return result;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/address_validator.cc b/cpp/src/address_validator.cc
new file mode 100644
index 0000000..b3e4aae
--- /dev/null
+++ b/cpp/src/address_validator.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_validator.h>
+
+#include "validation_task.h"
+
+namespace i18n {
+namespace addressinput {
+
+AddressValidator::AddressValidator(Supplier* supplier) : supplier_(supplier) {
+ assert(supplier_ != NULL);
+}
+
+AddressValidator::~AddressValidator() {
+}
+
+void AddressValidator::Validate(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const Callback& validated) const {
+ // The ValidationTask object will delete itself after Run() has finished.
+ (new ValidationTask(
+ address,
+ allow_postal,
+ require_name,
+ filter,
+ problems,
+ validated))->Run(supplier_);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/format_element.cc b/cpp/src/format_element.cc
new file mode 100644
index 0000000..8f9669c
--- /dev/null
+++ b/cpp/src/format_element.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "format_element.h"
+
+#include <libaddressinput/address_field.h>
+
+#include <cassert>
+#include <ostream>
+
+namespace i18n {
+namespace addressinput {
+
+FormatElement::FormatElement(AddressField field) : field_(field), literal_() {}
+
+FormatElement::FormatElement(const std::string& literal)
+ : field_(static_cast<AddressField>(-1)), literal_(literal) {
+ assert(!literal.empty());
+}
+
+FormatElement::FormatElement()
+ : field_(static_cast<AddressField>(-1)), literal_("\n") {}
+
+bool FormatElement::operator==(const FormatElement& other) const {
+ return field_ == other.field_ && literal_ == other.literal_;
+}
+
+} // namespace addressinput
+} // namespace i18n
+
+std::ostream& operator<<(std::ostream& o,
+ const i18n::addressinput::FormatElement& element) {
+ if (element.IsField()) {
+ o << "Field: " << element.GetField();
+ } else if (element.IsNewline()) {
+ o << "Newline";
+ } else {
+ o << "Literal: " << element.GetLiteral();
+ }
+ return o;
+}
diff --git a/cpp/src/format_element.h b/cpp/src/format_element.h
new file mode 100644
index 0000000..e37a188
--- /dev/null
+++ b/cpp/src/format_element.h
@@ -0,0 +1,70 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object representing a token in a formatting string. This may be a
+// placeholder for a field in the address data such as ADMIN_AREA, a literal
+// string such as " ", or a newline.
+
+#ifndef I18N_ADDRESSINPUT_FORMAT_ELEMENT_H_
+#define I18N_ADDRESSINPUT_FORMAT_ELEMENT_H_
+
+#include <libaddressinput/address_field.h>
+
+#include <iosfwd>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class FormatElement {
+ public:
+ // Builds a format element to represent |field|.
+ explicit FormatElement(AddressField field);
+
+ // Builds an element representing a literal string |literal|.
+ explicit FormatElement(const std::string& literal);
+
+ // Builds a newline element.
+ FormatElement();
+
+ // Returns true if this element represents a field element.
+ bool IsField() const { return literal_.empty(); }
+
+ // Returns true if this element represents a new line.
+ bool IsNewline() const { return literal_ == "\n"; }
+
+ AddressField GetField() const { return field_; }
+ const std::string& GetLiteral() const { return literal_; }
+
+ bool operator==(const FormatElement& other) const;
+
+ private:
+ // The field this element represents. Should only be used if |literal| is an
+ // empty string.
+ AddressField field_;
+
+ // The literal string for this element. This will be "\n" if this is a
+ // newline - but IsNewline() is preferred to determine this. If empty, then
+ // this FormatElement represents an address field.
+ std::string literal_;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+// Produces human-readable output in logging, for example in unit tests.
+std::ostream& operator<<(std::ostream& o,
+ const i18n::addressinput::FormatElement& field);
+
+#endif // I18N_ADDRESSINPUT_FORMAT_ELEMENT_H_
diff --git a/cpp/src/grit.h b/cpp/src/grit.h
new file mode 100644
index 0000000..c4c23f3
--- /dev/null
+++ b/cpp/src/grit.h
@@ -0,0 +1,36 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_GRIT_H_
+#define I18N_ADDRESSINPUT_GRIT_H_
+
+namespace i18n {
+namespace addressinput {
+
+// A message identifier that is guaranteed to not clash with any
+// IDS_ADDRESSINPUT_I18N_* identifiers that are generated by GRIT. GRIT
+// generates messages in the range from decimal 101 to 0x7FFF in order to work
+// with Windows.
+// https://code.google.com/p/grit-i18n/source/browse/trunk/grit/format/rc_header.py?r=94#169
+// http://msdn.microsoft.com/en-us/library/t2zechd4(VS.71).aspx
+//
+// The enum must be named to enable using it in gtest templates, e.g.
+// EXPECT_EQ(INVALID_MESSAGE_ID, my_id) will not compile on some platforms when
+// the enum is unnamed.
+enum MessageIdentifier { INVALID_MESSAGE_ID = 0 };
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_GRIT_H_
diff --git a/cpp/src/language.cc b/cpp/src/language.cc
new file mode 100644
index 0000000..9e456f0
--- /dev/null
+++ b/cpp/src/language.cc
@@ -0,0 +1,102 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "language.h"
+
+#include <algorithm>
+#include <cctype>
+#include <string>
+#include <vector>
+
+#include "rule.h"
+#include "util/string_split.h"
+
+namespace i18n {
+namespace addressinput {
+
+Language::Language(const std::string& language_tag) : tag(language_tag),
+ base(),
+ has_latin_script(false) {
+ // Character '-' is the separator for subtags in the BCP 47. However, some
+ // legacy code generates tags with '_' instead of '-'.
+ static const char kSubtagsSeparator = '-';
+ static const char kAlternativeSubtagsSeparator = '_';
+ std::replace(tag.begin(), tag.end(), kAlternativeSubtagsSeparator,
+ kSubtagsSeparator);
+
+ // OK to use 'tolower' because BCP 47 tags are always in ASCII.
+ std::string lowercase = tag;
+ std::transform(lowercase.begin(), lowercase.end(), lowercase.begin(),
+ tolower);
+
+ base = lowercase.substr(0, lowercase.find(kSubtagsSeparator));
+
+ // The lowercase BCP 47 subtag for Latin script.
+ static const char kLowercaseLatinScript[] = "latn";
+ std::vector<std::string> subtags;
+ SplitString(lowercase, kSubtagsSeparator, &subtags);
+
+ // Support only the second and third position for the script.
+ has_latin_script =
+ (subtags.size() > 1 && subtags[1] == kLowercaseLatinScript) ||
+ (subtags.size() > 2 && subtags[2] == kLowercaseLatinScript);
+}
+
+Language::~Language() {}
+
+Language ChooseBestAddressLanguage(const Rule& address_region_rule,
+ const Language& ui_language) {
+ if (address_region_rule.GetLanguages().empty()) {
+ return ui_language;
+ }
+
+ std::vector<Language> available_languages;
+ for (std::vector<std::string>::const_iterator
+ language_tag_it = address_region_rule.GetLanguages().begin();
+ language_tag_it != address_region_rule.GetLanguages().end();
+ ++language_tag_it) {
+ available_languages.push_back(Language(*language_tag_it));
+ }
+
+ if (ui_language.tag.empty()) {
+ return available_languages.front();
+ }
+
+ bool has_latin_format = !address_region_rule.GetLatinFormat().empty();
+
+ // The conventionally formatted BCP 47 Latin script with a preceding subtag
+ // separator.
+ static const char kLatinScriptSuffix[] = "-Latn";
+ Language latin_script_language(
+ available_languages.front().base + kLatinScriptSuffix);
+ if (has_latin_format && ui_language.has_latin_script) {
+ return latin_script_language;
+ }
+
+ for (std::vector<Language>::const_iterator
+ available_lang_it = available_languages.begin();
+ available_lang_it != available_languages.end(); ++available_lang_it) {
+ // Base language comparison works because no region supports the same base
+ // language with different scripts, for now. For example, no region supports
+ // "zh-Hant" and "zh-Hans" at the same time.
+ if (ui_language.base == available_lang_it->base) {
+ return *available_lang_it;
+ }
+ }
+
+ return has_latin_format ? latin_script_language : available_languages.front();
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/language.h b/cpp/src/language.h
new file mode 100644
index 0000000..561c79f
--- /dev/null
+++ b/cpp/src/language.h
@@ -0,0 +1,49 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_LANGUAGE_H_
+#define I18N_ADDRESSINPUT_LANGUAGE_H_
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class Rule;
+
+// Helper for working with a BCP 47 language tag.
+// http://tools.ietf.org/html/bcp47
+struct Language {
+ explicit Language(const std::string& language_tag);
+ ~Language();
+
+ // The language tag (with '_' replaced with '-'), for example "zh-Latn-CN".
+ std::string tag;
+
+ // The base language, for example "zh". Always lowercase.
+ std::string base;
+
+ // True if the language tag explicitly has a Latin script. For example, this
+ // is true for "zh-Latn", but false for "zh". Only the second and third subtag
+ // positions are supported for script.
+ bool has_latin_script;
+};
+
+Language ChooseBestAddressLanguage(const Rule& address_region_rule,
+ const Language& ui_language);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_LANGUAGE_H_
diff --git a/cpp/src/localization.cc b/cpp/src/localization.cc
new file mode 100644
index 0000000..951f1a7
--- /dev/null
+++ b/cpp/src/localization.cc
@@ -0,0 +1,206 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/localization.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+
+#include "grit.h"
+#include "region_data_constants.h"
+#include "rule.h"
+#include "util/string_util.h"
+
+namespace {
+
+void PushBackUrl(std::vector<std::string>& parameters, const std::string url) {
+ // TODO: HTML-escape the "url".
+ parameters.push_back("<a href=\"" + url + "\">");
+ parameters.push_back("</a>");
+}
+
+} // namespace
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+static const char kDefaultLanguage[] = "en";
+
+// For each language XX with translations:
+// (1) Add a namespace XX here with an include of "XX_messages.cc".
+// (2) Add a wrapper that converts the char pointer to std::string. (GRIT
+// generated functions return char pointers.)
+// (2) Use the XX::GetStdString in the SetLanguage() method below.
+namespace en {
+
+#include "en_messages.cc"
+
+std::string GetStdString(int message_id) {
+ const char* str = GetString(message_id);
+ return str != NULL ? std::string(str) : std::string();
+}
+
+} // namespace en
+
+} // namespace
+
+Localization::Localization() : get_string_(&en::GetStdString),
+ language_tag_(kDefaultLanguage) {}
+
+Localization::~Localization() {}
+
+std::string Localization::GetString(int message_id) const {
+ return get_string_(message_id);
+}
+
+std::string Localization::GetErrorMessage(const AddressData& address,
+ AddressField field,
+ AddressProblem problem,
+ bool enable_examples,
+ bool enable_links) const {
+ if (field == POSTAL_CODE) {
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ std::string postal_code_example, post_service_url;
+ if (rule.ParseSerializedRule(
+ RegionDataConstants::GetRegionData(address.region_code))) {
+ if (enable_examples) {
+ postal_code_example = rule.GetPostalCodeExample();
+ }
+ if (enable_links) {
+ post_service_url = rule.GetPostServiceUrl();
+ }
+ } else {
+ assert(false);
+ }
+ // If we can't parse the serialized rule |uses_postal_code_as_label| will be
+ // determined from the default rule.
+ bool uses_postal_code_as_label =
+ rule.GetPostalCodeNameMessageId() ==
+ IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL;
+ return GetErrorMessageForPostalCode(address, problem,
+ uses_postal_code_as_label,
+ postal_code_example, post_service_url);
+ } else {
+ if (problem == MISSING_REQUIRED_FIELD) {
+ return get_string_(IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD);
+ } else if (problem == UNKNOWN_VALUE) {
+ std::vector<std::string> parameters;
+ if (AddressData::IsRepeatedFieldValue(field)) {
+ std::vector<std::string> values = address.GetRepeatedFieldValue(field);
+ assert(!values.empty());
+ parameters.push_back(values.front());
+ } else {
+ parameters.push_back(address.GetFieldValue(field));
+ }
+ return DoReplaceStringPlaceholders(
+ get_string_(IDS_LIBADDRESSINPUT_UNKNOWN_VALUE), parameters);
+ } else if (problem == USES_P_O_BOX) {
+ return get_string_(IDS_LIBADDRESSINPUT_PO_BOX_FORBIDDEN_VALUE);
+ } else {
+ // Keep the default under "else" so the compiler helps us check that all
+ // handled cases return and don't fall through.
+ assert(false);
+ return "";
+ }
+ }
+}
+
+void Localization::SetLanguage(const std::string& language_tag) {
+ if (language_tag == kDefaultLanguage) {
+ get_string_ = &en::GetStdString;
+ } else {
+ assert(false);
+ }
+ language_tag_ = language_tag;
+}
+
+void Localization::SetGetter(std::string (*getter)(int),
+ const std::string& language_tag) {
+ assert(getter != NULL);
+ get_string_ = getter;
+ language_tag_ = language_tag;
+}
+
+std::string Localization::GetErrorMessageForPostalCode(
+ const AddressData& address,
+ AddressProblem problem,
+ bool uses_postal_code_as_label,
+ std::string postal_code_example,
+ std::string post_service_url) const {
+ int message_id;
+ std::vector<std::string> parameters;
+ if (problem == MISSING_REQUIRED_FIELD) {
+ if (!postal_code_example.empty() && !post_service_url.empty()) {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE_AND_URL :
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE_AND_URL;
+ parameters.push_back(postal_code_example);
+ PushBackUrl(parameters, post_service_url);
+ } else if (!postal_code_example.empty()) {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE :
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE ;
+ parameters.push_back(postal_code_example);
+ } else {
+ message_id = IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD;
+ }
+ return DoReplaceStringPlaceholders(get_string_(message_id), parameters);
+ } else if (problem == INVALID_FORMAT) {
+ if (!postal_code_example.empty() && !post_service_url.empty()) {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE_AND_URL :
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE_AND_URL;
+ parameters.push_back(postal_code_example);
+ PushBackUrl(parameters, post_service_url);
+ } else if (!postal_code_example.empty()) {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE :
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE;
+ parameters.push_back(postal_code_example);
+ } else {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE :
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP;
+ }
+ return DoReplaceStringPlaceholders(get_string_(message_id), parameters);
+ } else if (problem == MISMATCHING_VALUE) {
+ if (!post_service_url.empty()) {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE_URL :
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP_URL;
+ PushBackUrl(parameters, post_service_url);
+ } else {
+ message_id = uses_postal_code_as_label ?
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE :
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP;
+ }
+ return DoReplaceStringPlaceholders(get_string_(message_id), parameters);
+ } else {
+ // Keep the default under "else" so the compiler helps us check that all
+ // handled cases return and don't fall through.
+ assert(false);
+ return "";
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/lookup_key.cc b/cpp/src/lookup_key.cc
new file mode 100644
index 0000000..b6f73fc
--- /dev/null
+++ b/cpp/src/lookup_key.cc
@@ -0,0 +1,158 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "lookup_key.h"
+
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include "language.h"
+#include "region_data_constants.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+const char kSlashDelim[] = "/";
+const char kDashDelim[] = "--";
+const char kData[] = "data";
+const char kUnknown[] = "ZZ";
+
+// Case insensitive matcher for language tags.
+struct LanguageMatcher {
+ LanguageMatcher(const std::string& tag) : tag(tag) { }
+ std::string tag;
+ bool operator() (const std::string& s) {
+ return strcasecmp(tag.c_str(), s.c_str()) == 0;
+ }
+};
+
+// Assume the language_tag has had "Latn" script removed when this is called.
+bool ShouldSetLanguageForKey(const std::string& language_tag,
+ const std::string& region_code) {
+ // We only need a language in the key if there is subregion data at all.
+ if (RegionDataConstants::GetMaxLookupKeyDepth(region_code) == 0) {
+ return false;
+ }
+ Rule rule;
+ rule.CopyFrom(Rule::GetDefault());
+ // TODO: Pre-parse the rules and have a map from region code to rule.
+ if (!rule.ParseSerializedRule(
+ RegionDataConstants::GetRegionData(region_code))) {
+ return false;
+ }
+ const std::vector<std::string>& languages = rule.GetLanguages();
+ // Do not add the default language (we want "data/US", not "data/US--en").
+ // (empty should not happen here because we have some sub-region data).
+ if (languages.empty() || languages[0] == language_tag) {
+ return false;
+ }
+ // Finally, only return true if the language is one of the remaining ones.
+ return std::find_if(languages.begin() + 1,
+ languages.end(),
+ LanguageMatcher(language_tag))
+ != languages.end();
+}
+
+} // namespace
+
+const AddressField LookupKey::kHierarchy[] = {
+ COUNTRY,
+ ADMIN_AREA,
+ LOCALITY,
+ DEPENDENT_LOCALITY
+};
+
+LookupKey::LookupKey() {
+}
+
+LookupKey::~LookupKey() {
+}
+
+void LookupKey::FromAddress(const AddressData& address) {
+ nodes_.clear();
+ if (address.region_code.empty()) {
+ nodes_.insert(std::make_pair(COUNTRY, kUnknown));
+ } else {
+ for (size_t i = 0; i < arraysize(kHierarchy); ++i) {
+ AddressField field = kHierarchy[i];
+ const std::string& value = address.GetFieldValue(field);
+ if (value.empty()) {
+ break;
+ }
+ nodes_.insert(std::make_pair(field, value));
+ }
+ }
+ Language address_language(address.language_code);
+ std::string language_tag_no_latn = address_language.has_latin_script ?
+ address_language.base : address_language.tag;
+ if (ShouldSetLanguageForKey(language_tag_no_latn, address.region_code)) {
+ language_ = language_tag_no_latn;
+ }
+}
+
+void LookupKey::FromLookupKey(const LookupKey& parent,
+ const std::string& child_node) {
+ assert(parent.nodes_.size() < arraysize(kHierarchy));
+ assert(!child_node.empty());
+
+ nodes_ = parent.nodes_;
+ AddressField child_field = kHierarchy[nodes_.size()];
+ nodes_.insert(std::make_pair(child_field, child_node));
+}
+
+std::string LookupKey::ToKeyString(size_t max_depth) const {
+ assert(max_depth < arraysize(kHierarchy));
+ std::string key_string(kData);
+
+ for (size_t i = 0; i <= max_depth; ++i) {
+ AddressField field = kHierarchy[i];
+ std::map<AddressField, std::string>::const_iterator it = nodes_.find(field);
+ if (it == nodes_.end()) {
+ break;
+ }
+ key_string.append(kSlashDelim);
+ key_string.append(it->second);
+ }
+ if (!language_.empty()) {
+ key_string.append(kDashDelim);
+ key_string.append(language_);
+ }
+ return key_string;
+}
+
+const std::string& LookupKey::GetRegionCode() const {
+ std::map<AddressField, std::string>::const_iterator it = nodes_.find(COUNTRY);
+ assert(it != nodes_.end());
+ return it->second;
+}
+
+size_t LookupKey::GetDepth() const {
+ size_t depth = nodes_.size() - 1;
+ assert(depth < arraysize(kHierarchy));
+ return depth;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/lookup_key.h b/cpp/src/lookup_key.h
new file mode 100644
index 0000000..0b74cd3
--- /dev/null
+++ b/cpp/src/lookup_key.h
@@ -0,0 +1,75 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_LOOKUP_KEY_H_
+#define I18N_ADDRESSINPUT_LOOKUP_KEY_H_
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <cstddef>
+#include <map>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+struct AddressData;
+
+// A LookupKey maps between an AddressData struct and the key string used to
+// request address data from an address data server.
+class LookupKey {
+ public:
+ // The array length is explicitly specified here, to make it possible to get
+ // the length through arraysize(LookupKey::kHierarchy).
+ static const AddressField kHierarchy[4];
+
+ LookupKey();
+ ~LookupKey();
+
+ // Initializes this object by parsing |address|.
+ void FromAddress(const AddressData& address);
+
+ // Initializes this object to be a copy of |parent| key that's one level
+ // deeper with the next level node being |child_node|.
+ //
+ // For example, if |parent| is "data/US" and |child_node| is "CA", then this
+ // key becomes "data/US/CA".
+ //
+ // The |parent| can be at most LOCALITY level. The |child_node| cannot be
+ // empty.
+ void FromLookupKey(const LookupKey& parent, const std::string& child_node);
+
+ // Returns the lookup key string (of |max_depth|).
+ std::string ToKeyString(size_t max_depth) const;
+
+ // Returns the region code. Must not be called on an empty object.
+ const std::string& GetRegionCode() const;
+
+ // Returns the depth. Must not be called on an empty object.
+ size_t GetDepth() const;
+
+ private:
+ std::map<AddressField, std::string> nodes_;
+ // The language of the key, obtained from the address (empty for default
+ // language).
+ std::string language_;
+
+ DISALLOW_COPY_AND_ASSIGN(LookupKey);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_LOOKUP_KEY_H_
diff --git a/cpp/src/lookup_key_util.cc b/cpp/src/lookup_key_util.cc
new file mode 100644
index 0000000..e63e9a5
--- /dev/null
+++ b/cpp/src/lookup_key_util.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "lookup_key_util.h"
+
+#include <cassert>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+LookupKeyUtil::LookupKeyUtil(const std::string& validation_data_url)
+ : validation_data_url_(validation_data_url) {
+ assert(validation_data_url_.length() > 0);
+ assert(validation_data_url_[validation_data_url_.length() - 1] == '/');
+}
+
+LookupKeyUtil::~LookupKeyUtil() {}
+
+std::string LookupKeyUtil::GetUrlForKey(const std::string& key) const {
+ return validation_data_url_ + key;
+}
+
+std::string LookupKeyUtil::GetKeyForUrl(const std::string& url) const {
+ return IsValidationDataUrl(url) ? url.substr(validation_data_url_.length())
+ : std::string();
+}
+
+bool LookupKeyUtil::IsValidationDataUrl(const std::string& url) const {
+ return
+ url.compare(0, validation_data_url_.length(), validation_data_url_) == 0;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/lookup_key_util.h b/cpp/src/lookup_key_util.h
new file mode 100644
index 0000000..4996c1c
--- /dev/null
+++ b/cpp/src/lookup_key_util.h
@@ -0,0 +1,59 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Functions for working with lookup keys. The lookup keys are strings that
+// identify serialized validation rules.
+
+#ifndef I18N_ADDRESSINPUT_LOOKUP_KEY_UTIL_H_
+#define I18N_ADDRESSINPUT_LOOKUP_KEY_UTIL_H_
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Utility functions for lookup keys. Sample usage:
+// LookupKeyUtil lookup_keys("https://i18napis.appspot.com/ssl-address/");
+// Download(lookup_keys.GetUrlForKey("data/US"));
+class LookupKeyUtil {
+ public:
+ // Builds a lookup key utility for the |validation_data_url| parameter. The
+ // parameter must end with a '/'.
+ explicit LookupKeyUtil(const std::string& validation_data_url);
+ ~LookupKeyUtil();
+
+ // Returns the URL where the |key| can be retrieved. For example, returns
+ // "https://i18napis.appspot.com/ssl-address/data/US" for input "data/US".
+ // Assumes that the input string is a valid URL segment.
+ std::string GetUrlForKey(const std::string& key) const;
+
+ // Returns the key for the |url|. For example, returns "data/US" for
+ // "https://i18napis.appspot.com/ssl-address/data/US". If the |url| does not
+ // start with |validation_data_url| that was passed to the constructor, then
+ // returns an empty string. (This can happen if the user of the library
+ // returns a bad URL in their Downloader implementation.)
+ std::string GetKeyForUrl(const std::string& url) const;
+
+ // Returns true if the |url| starts with |validation_data_url| that was passed
+ // to the constructor.
+ bool IsValidationDataUrl(const std::string& url) const;
+
+ private:
+ const std::string validation_data_url_;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_LOOKUP_KEY_UTIL_H_
diff --git a/cpp/src/null_storage.cc b/cpp/src/null_storage.cc
new file mode 100644
index 0000000..7786a0d
--- /dev/null
+++ b/cpp/src/null_storage.cc
@@ -0,0 +1,41 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/null_storage.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+NullStorage::NullStorage() {
+}
+
+NullStorage::~NullStorage() {
+}
+
+void NullStorage::Put(const std::string& key, std::string* data) {
+ assert(data != NULL); // Sanity check.
+ delete data;
+}
+
+void NullStorage::Get(const std::string& key,
+ const Callback& data_ready) const {
+ data_ready(false, key, NULL);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/ondemand_supplier.cc b/cpp/src/ondemand_supplier.cc
new file mode 100644
index 0000000..9228570
--- /dev/null
+++ b/cpp/src/ondemand_supplier.cc
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/ondemand_supplier.h>
+
+#include <algorithm>
+#include <cstddef>
+#include <map>
+#include <string>
+
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include "lookup_key.h"
+#include "ondemand_supply_task.h"
+#include "region_data_constants.h"
+#include "retriever.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+OndemandSupplier::OndemandSupplier(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage)
+ : retriever_(new Retriever(validation_data_url, downloader, storage)) {
+}
+
+OndemandSupplier::~OndemandSupplier() {
+ for (std::map<std::string, const Rule*>::const_iterator
+ it = rule_cache_.begin(); it != rule_cache_.end(); ++it) {
+ delete it->second;
+ }
+}
+
+void OndemandSupplier::Supply(const LookupKey& lookup_key,
+ const Callback& supplied) {
+ OndemandSupplyTask* task =
+ new OndemandSupplyTask(lookup_key, &rule_cache_, supplied);
+
+ if (RegionDataConstants::IsSupported(lookup_key.GetRegionCode())) {
+ size_t max_depth = std::min(
+ lookup_key.GetDepth(),
+ RegionDataConstants::GetMaxLookupKeyDepth(lookup_key.GetRegionCode()));
+
+ for (size_t depth = 0; depth <= max_depth; ++depth) {
+ const std::string& key = lookup_key.ToKeyString(depth);
+ std::map<std::string, const Rule*>::const_iterator it =
+ rule_cache_.find(key);
+ if (it != rule_cache_.end()) {
+ task->hierarchy_.rule[depth] = it->second;
+ } else {
+ task->Queue(key); // If not in the cache, it needs to be loaded.
+ }
+ }
+ }
+
+ task->Retrieve(*retriever_);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/ondemand_supply_task.cc b/cpp/src/ondemand_supply_task.cc
new file mode 100644
index 0000000..ab92746
--- /dev/null
+++ b/cpp/src/ondemand_supply_task.cc
@@ -0,0 +1,141 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "ondemand_supply_task.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include "lookup_key.h"
+#include "retriever.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+OndemandSupplyTask::OndemandSupplyTask(
+ const LookupKey& lookup_key,
+ std::map<std::string, const Rule*>* rules,
+ const Supplier::Callback& supplied)
+ : hierarchy_(),
+ pending_(),
+ lookup_key_(lookup_key),
+ rule_cache_(rules),
+ supplied_(supplied),
+ retrieved_(BuildCallback(this, &OndemandSupplyTask::Load)),
+ success_(true) {
+ assert(rule_cache_ != NULL);
+ assert(retrieved_ != NULL);
+}
+
+OndemandSupplyTask::~OndemandSupplyTask() {
+}
+
+void OndemandSupplyTask::Queue(const std::string& key) {
+ assert(pending_.find(key) == pending_.end());
+ pending_.insert(key);
+}
+
+void OndemandSupplyTask::Retrieve(const Retriever& retriever) {
+ if (pending_.empty()) {
+ Loaded();
+ } else {
+ // When the final pending rule has been retrieved, the retrieved_ callback,
+ // implemented by Load(), will finish by calling Loaded(), which will finish
+ // by delete'ing this RuleHierarchy object. So after the final call to
+ // retriever.Retrieve() no attributes of this object can be accessed (as the
+ // object then no longer will exist, if the final callback has finished by
+ // then), and the condition statement of the loop must therefore not use the
+ // otherwise obvious it != pending_.end() but instead test a local variable
+ // that isn't affected by the object being deleted.
+ bool done = false;
+ for (std::set<std::string>::const_iterator it = pending_.begin(); !done; ) {
+ const std::string& key = *it++;
+ done = it == pending_.end();
+ retriever.Retrieve(key, *retrieved_);
+ }
+ }
+}
+
+void OndemandSupplyTask::Load(bool success,
+ const std::string& key,
+ const std::string& data) {
+ // Sanity check: This key should be present in the set of pending requests.
+ size_t status = pending_.erase(key);
+ assert(status == 1); // There will always be one item erased from the set.
+ (void)status; // Prevent unused variable if assert() is optimized away.
+
+ size_t depth = std::count(key.begin(), key.end(), '/') - 1;
+ assert(depth < arraysize(LookupKey::kHierarchy));
+ AddressField field = LookupKey::kHierarchy[depth];
+
+ if (success) {
+ // The address metadata server will return the empty JSON "{}" when it
+ // successfully performed a lookup, but didn't find any data for that key.
+ if (data != "{}") {
+ Rule* rule = new Rule;
+ if (field == COUNTRY) {
+ // All rules on the COUNTRY level inherit from the default rule.
+ rule->CopyFrom(Rule::GetDefault());
+ }
+ if (rule->ParseSerializedRule(data)) {
+ // Try inserting the Rule object into the rule_cache_ map, or else find
+ // the already existing Rule object with the same ID already in the map.
+ // It is possible that a key was queued even though the corresponding
+ // Rule object is already in the cache, as the data server is free to do
+ // advanced normalization and aliasing so that the ID of the data
+ // returned is different from the key requested. (It would be possible
+ // to cache such aliases, to increase performance in the case where a
+ // certain alias is requested repeatedly, but such a cache would then
+ // have to be kept to some limited size to not grow indefinitely with
+ // every possible permutation of a name recognized by the data server.)
+ std::pair<std::map<std::string, const Rule*>::iterator, bool> result =
+ rule_cache_->insert(std::make_pair(rule->GetId(), rule));
+ if (!result.second) { // There was already an entry with this ID.
+ delete rule;
+ }
+ // Pointer to object in the map.
+ hierarchy_.rule[depth] = result.first->second;
+ } else {
+ delete rule;
+ success_ = false;
+ }
+ }
+ } else {
+ success_ = false;
+ }
+
+ if (pending_.empty()) {
+ Loaded();
+ }
+}
+
+void OndemandSupplyTask::Loaded() {
+ supplied_(success_, lookup_key_, hierarchy_);
+ delete this;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/ondemand_supply_task.h b/cpp/src/ondemand_supply_task.h
new file mode 100644
index 0000000..61e3567
--- /dev/null
+++ b/cpp/src/ondemand_supply_task.h
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_ONDEMAND_SUPPLY_TASK_H_
+#define I18N_ADDRESSINPUT_ONDEMAND_SUPPLY_TASK_H_
+
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <map>
+#include <set>
+#include <string>
+
+#include "retriever.h"
+
+namespace i18n {
+namespace addressinput {
+
+class LookupKey;
+class Retriever;
+class Rule;
+
+// An OndemandSupplyTask object encapsulates the information necessary to
+// retrieve the set of Rule objects corresponding to a LookupKey and call a
+// callback when that has been done. Calling the Retrieve() method will load
+// required metadata, then call the callback and delete the OndemandSupplyTask
+// object itself.
+class OndemandSupplyTask {
+ public:
+ OndemandSupplyTask(const LookupKey& lookup_key,
+ std::map<std::string, const Rule*>* rules,
+ const Supplier::Callback& supplied);
+ ~OndemandSupplyTask();
+
+ // Adds lookup key string |key| to the queue of data to be retrieved.
+ void Queue(const std::string& key);
+
+ // Retrieves and parses data for all queued keys, then calls |supplied_|.
+ void Retrieve(const Retriever& retriever);
+
+ Supplier::RuleHierarchy hierarchy_;
+
+ private:
+ void Load(bool success, const std::string& key, const std::string& data);
+ void Loaded();
+
+ std::set<std::string> pending_;
+ const LookupKey& lookup_key_;
+ std::map<std::string, const Rule*>* const rule_cache_;
+ const Supplier::Callback& supplied_;
+ const scoped_ptr<const Retriever::Callback> retrieved_;
+ bool success_;
+
+ DISALLOW_COPY_AND_ASSIGN(OndemandSupplyTask);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_ONDEMAND_SUPPLY_TASK_H_
diff --git a/cpp/src/post_box_matchers.cc b/cpp/src/post_box_matchers.cc
new file mode 100644
index 0000000..1edd8b3
--- /dev/null
+++ b/cpp/src/post_box_matchers.cc
@@ -0,0 +1,132 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "post_box_matchers.h"
+
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "language.h"
+#include "rule.h"
+#include "util/re2ptr.h"
+
+#include <re2/re2.h>
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+std::map<std::string, const RE2ptr*> InitMatchers() {
+ static const struct {
+ const char* const language;
+ const RE2ptr ptr;
+ } kMatchers[] = {
+ { "ar",
+ /* "صندوق بريد|ص[-. ]ب" */
+ new RE2("\xD8\xB5\xD9\x86\xD8\xAF\xD9\x88\xD9\x82 "
+ "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF|\xD8\xB5[-. ]\xD8\xA8") },
+
+ { "cs", new RE2("(?i)p\\.? ?p\\.? \\d") },
+ { "da", new RE2("(?i)Postboks") },
+ { "de", new RE2("(?i)Postfach") },
+
+ { "el",
+ /* "T\\.? ?Θ\\.? \\d{2}" */
+ new RE2("(?i)T\\.? ?\xCE\x98\\.? \\d{2}") },
+
+ { "en", new RE2("Private Bag|Post(?:al)? Box") },
+ { "es", new RE2("(?i)(?:Apartado|Casillas) de correos?") },
+ { "fi", new RE2("(?i)Postilokero|P\\.?L\\.? \\d") },
+ { "hr", new RE2("(?i)p\\.? ?p\\.? \\d") },
+
+ { "hu",
+ /* "Postafi(?:[oó]|ó)k|Pf\\.? \\d" */
+ new RE2("(?i)Postafi(?:[o\xC3\xB3]|o\xCC\x81)k|Pf\\.? \\d") },
+
+ { "fr",
+ /* "Bo(?:[iî]|î)te Postale|BP \\d|CEDEX \\d" */
+ new RE2("(?i)Bo(?:[i\xC3\xAE]|i\xCC\x82)te Postale|BP \\d|CEDEX \\d") },
+
+ { "ja",
+ /* "私書箱\\d{1,5}号" */
+ new RE2("(?i)\xE7\xA7\x81\xE6\x9B\xB8\xE7\xAE\xB1\\d{1,5}\xE5\x8F\xB7") },
+
+ { "nl", new RE2("(?i)Postbus") },
+ { "no", new RE2("(?i)Postboks") },
+ { "pl", new RE2("(?i)Skr(?:\\.?|ytka) poczt(?:\\.?|owa)") },
+ { "pt", new RE2("(?i)Apartado") },
+
+ { "ru",
+ /* "абонентский ящик|[аa]\\\" */
+ new RE2("(?i)\xD0\xB0\xD0\xB1\xD0\xBE\xD0\xBD\xD0\xB5\xD0\xBD\xD1\x82\xD1"
+ "\x81\xD0\xBA\xD0\xB8\xD0\xB9 \xD1\x8F\xD1\x89\xD0\xB8\xD0\xBA|"
+ "[\xD0\xB0""a]\\\"\xD1\x8F (?:(?:\xE2\x84\x96|#|N) ?)?\\d") },
+
+ { "sv", new RE2("(?i)Box \\d") },
+
+ { "zh",
+ /* "郵政信箱.{1,5}號|郵局第.{1,10}號信箱" */
+ new RE2("(?i)\xE9\x83\xB5\xE6\x94\xBF\xE4\xBF\xA1\xE7\xAE\xB1.{1,5}"
+ "\xE8\x99\x9F|\xE9\x83\xB5\xE5\xB1\x80\xE7\xAC\xAC.{1,10}"
+ "\xE8\x99\x9F\xE4\xBF\xA1\xE7\xAE\xB1") },
+
+ { "und", new RE2("P\\.? ?O\\.? Box") }
+ };
+
+ std::map<std::string, const RE2ptr*> matchers;
+
+ for (size_t i = 0; i < sizeof kMatchers / sizeof *kMatchers; ++i) {
+ matchers.insert(std::make_pair(kMatchers[i].language, &kMatchers[i].ptr));
+ }
+
+ return matchers;
+}
+
+} // namespace
+
+// static
+std::vector<const RE2ptr*> PostBoxMatchers::GetMatchers(
+ const Rule& country_rule) {
+ static const std::map<std::string, const RE2ptr*> kMatchers(InitMatchers());
+
+ // Always add any expressions defined for "und" (English-like defaults).
+ std::vector<std::string> languages(1, "und");
+ for (std::vector<std::string>::const_iterator
+ it = country_rule.GetLanguages().begin();
+ it != country_rule.GetLanguages().end(); ++it) {
+ Language language(*it);
+ languages.push_back(language.base);
+ }
+
+ std::vector<const RE2ptr*> result;
+
+ for (std::vector<std::string>::const_iterator
+ it = languages.begin();
+ it != languages.end(); ++it) {
+ std::map<std::string, const RE2ptr*>::const_iterator
+ jt = kMatchers.find(*it);
+ if (jt != kMatchers.end()) {
+ result.push_back(jt->second);
+ }
+ }
+
+ return result;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/post_box_matchers.h b/cpp/src/post_box_matchers.h
new file mode 100644
index 0000000..8f9f44b
--- /dev/null
+++ b/cpp/src/post_box_matchers.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Post office box regular expressions.
+
+#ifndef I18N_ADDRESSINPUT_POST_BOX_MATCHERS_H_
+#define I18N_ADDRESSINPUT_POST_BOX_MATCHERS_H_
+
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+class RE2ptr;
+class Rule;
+
+class PostBoxMatchers {
+ public:
+ // Returns pointers to RE2 regular expression objects to test address lines
+ // for those languages that are relevant for |country_rule|.
+ static std::vector<const RE2ptr*> GetMatchers(const Rule& country_rule);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_POST_BOX_MATCHERS_H_
diff --git a/cpp/src/preload_supplier.cc b/cpp/src/preload_supplier.cc
new file mode 100644
index 0000000..5219e9a
--- /dev/null
+++ b/cpp/src/preload_supplier.cc
@@ -0,0 +1,238 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/preload_supplier.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "language.h"
+#include "lookup_key.h"
+#include "region_data_constants.h"
+#include "retriever.h"
+#include "rule.h"
+#include "util/json.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+class Helper {
+ public:
+ // Does not take ownership of its parameters.
+ Helper(const std::string& region_code,
+ const std::string& key,
+ const PreloadSupplier::Callback& loaded,
+ const Retriever& retriever,
+ std::set<std::string>* pending,
+ std::map<std::string, const Rule*>* rule_cache)
+ : region_code_(region_code),
+ loaded_(loaded),
+ pending_(pending),
+ rule_cache_(rule_cache),
+ retrieved_(BuildCallback(this, &Helper::OnRetrieved)) {
+ assert(pending_ != NULL);
+ assert(rule_cache_ != NULL);
+ assert(retrieved_ != NULL);
+ pending_->insert(key);
+ retriever.Retrieve(key, *retrieved_);
+ }
+
+ private:
+ ~Helper() {}
+
+ void OnRetrieved(bool success,
+ const std::string& key,
+ const std::string& data) {
+ int rule_count = 0;
+
+ size_t status = pending_->erase(key);
+ assert(status == 1); // There will always be one item erased from the set.
+ (void)status; // Prevent unused variable if assert() is optimized away.
+
+ Json json;
+
+ if (!success) {
+ goto callback;
+ }
+
+ if (!json.ParseObject(data)) {
+ success = false;
+ goto callback;
+ }
+
+ for (std::vector<std::string>::const_iterator
+ it = json.GetKeys().begin(); it != json.GetKeys().end(); ++it) {
+ if (!json.HasDictionaryValueForKey(*it)) {
+ success = false;
+ goto callback;
+ }
+ const Json& value = json.GetDictionaryValueForKey(*it);
+
+ if (!value.HasStringValueForKey("id")) {
+ success = false;
+ goto callback;
+ }
+ const std::string& id = value.GetStringValueForKey("id");
+ assert(*it == id); // Sanity check.
+
+ size_t depth = std::count(id.begin(), id.end(), '/') - 1;
+ assert(depth < arraysize(LookupKey::kHierarchy));
+ AddressField field = LookupKey::kHierarchy[depth];
+
+ Rule* rule = new Rule;
+ if (field == COUNTRY) {
+ // All rules on the COUNTRY level inherit from the default rule.
+ rule->CopyFrom(Rule::GetDefault());
+ }
+ rule->ParseJsonRule(value);
+ assert(id == rule->GetId()); // Sanity check.
+
+ std::pair<std::map<std::string, const Rule*>::iterator, bool> result =
+ rule_cache_->insert(std::make_pair(rule->GetId(), rule));
+ assert(result.second);
+ (void)result; // Prevent unused variable if assert() is optimized away.
+ ++rule_count;
+ }
+
+ callback:
+ loaded_(success, region_code_, rule_count);
+ delete this;
+ }
+
+ const std::string region_code_;
+ const PreloadSupplier::Callback& loaded_;
+ std::set<std::string>* const pending_;
+ std::map<std::string, const Rule*>* const rule_cache_;
+ const scoped_ptr<const Retriever::Callback> retrieved_;
+
+ DISALLOW_COPY_AND_ASSIGN(Helper);
+};
+
+std::string KeyFromRegionCode(const std::string& region_code) {
+ AddressData address;
+ address.region_code = region_code;
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ return lookup_key.ToKeyString(0); // Zero depth = COUNTRY level.
+}
+
+} // namespace
+
+PreloadSupplier::PreloadSupplier(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage)
+ : retriever_(new Retriever(validation_data_url, downloader, storage)),
+ pending_(),
+ rule_cache_() {}
+
+PreloadSupplier::~PreloadSupplier() {
+ for (std::map<std::string, const Rule*>::const_iterator
+ it = rule_cache_.begin(); it != rule_cache_.end(); ++it) {
+ delete it->second;
+ }
+}
+
+void PreloadSupplier::Supply(const LookupKey& lookup_key,
+ const Supplier::Callback& supplied) {
+ Supplier::RuleHierarchy hierarchy;
+ bool success = GetRuleHierarchy(lookup_key, &hierarchy);
+ supplied(success, lookup_key, hierarchy);
+}
+
+const Rule* PreloadSupplier::GetRule(const LookupKey& lookup_key) const {
+ assert(IsLoaded(lookup_key.GetRegionCode()));
+ Supplier::RuleHierarchy hierarchy;
+ if (!GetRuleHierarchy(lookup_key, &hierarchy)) {
+ return NULL;
+ }
+ return hierarchy.rule[lookup_key.GetDepth()];
+}
+
+void PreloadSupplier::LoadRules(const std::string& region_code,
+ const Callback& loaded) {
+ const std::string& key = KeyFromRegionCode(region_code);
+
+ if (IsLoadedKey(key)) {
+ loaded(true, region_code, 0);
+ return;
+ }
+
+ if (IsPendingKey(key)) {
+ return;
+ }
+
+ new Helper(
+ region_code,
+ key,
+ loaded,
+ *retriever_,
+ &pending_,
+ &rule_cache_);
+}
+
+bool PreloadSupplier::IsLoaded(const std::string& region_code) const {
+ return IsLoadedKey(KeyFromRegionCode(region_code));
+}
+
+bool PreloadSupplier::IsPending(const std::string& region_code) const {
+ return IsPendingKey(KeyFromRegionCode(region_code));
+}
+
+bool PreloadSupplier::GetRuleHierarchy(const LookupKey& lookup_key,
+ RuleHierarchy* hierarchy) const {
+ assert(hierarchy != NULL);
+
+ if (RegionDataConstants::IsSupported(lookup_key.GetRegionCode())) {
+ size_t max_depth = std::min(
+ lookup_key.GetDepth(),
+ RegionDataConstants::GetMaxLookupKeyDepth(lookup_key.GetRegionCode()));
+
+ for (size_t depth = 0; depth <= max_depth; ++depth) {
+ const std::string& key = lookup_key.ToKeyString(depth);
+ std::map<std::string, const Rule*>::const_iterator it =
+ rule_cache_.find(key);
+ if (it == rule_cache_.end()) {
+ return depth > 0; // No data on COUNTRY level is failure.
+ }
+ hierarchy->rule[depth] = it->second;
+ }
+ }
+
+ return true;
+}
+
+bool PreloadSupplier::IsLoadedKey(const std::string& key) const {
+ return rule_cache_.find(key) != rule_cache_.end();
+}
+
+bool PreloadSupplier::IsPendingKey(const std::string& key) const {
+ return pending_.find(key) != pending_.end();
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/region_data.cc b/cpp/src/region_data.cc
new file mode 100644
index 0000000..f5f0275
--- /dev/null
+++ b/cpp/src/region_data.cc
@@ -0,0 +1,51 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/region_data.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+RegionData::RegionData(const std::string& region_code)
+ : key_(region_code),
+ name_(region_code),
+ parent_(NULL),
+ sub_regions_() {}
+
+RegionData::~RegionData() {
+ for (std::vector<const RegionData*>::const_iterator it = sub_regions_.begin();
+ it != sub_regions_.end(); ++it) {
+ delete *it;
+ }
+}
+
+RegionData* RegionData::AddSubRegion(const std::string& key,
+ const std::string& name) {
+ RegionData* sub_region = new RegionData(key, name, this);
+ sub_regions_.push_back(sub_region);
+ return sub_region;
+}
+
+RegionData::RegionData(const std::string& key,
+ const std::string& name,
+ RegionData* parent)
+ : key_(key), name_(name), parent_(parent), sub_regions_() {}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/region_data_builder.cc b/cpp/src/region_data_builder.cc
new file mode 100644
index 0000000..82d223c
--- /dev/null
+++ b/cpp/src/region_data_builder.cc
@@ -0,0 +1,147 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/region_data_builder.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/region_data.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "language.h"
+#include "lookup_key.h"
+#include "region_data_constants.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+// Does not take ownership of |supplier| or |parent_region|, neither of which is
+// allowed to be NULL.
+void BuildRegionTreeRecursively(PreloadSupplier* supplier,
+ const LookupKey& parent_key,
+ RegionData* parent_region,
+ const std::vector<std::string>& keys,
+ bool prefer_latin_name) {
+ assert(supplier != NULL);
+ assert(parent_region != NULL);
+
+ LookupKey lookup_key;
+ for (std::vector<std::string>::const_iterator key_it = keys.begin();
+ key_it != keys.end(); ++key_it) {
+ lookup_key.FromLookupKey(parent_key, *key_it);
+ const Rule* rule = supplier->GetRule(lookup_key);
+ if (rule == NULL) {
+ return;
+ }
+ const std::string& local_name = rule->GetName().empty()
+ ? *key_it : rule->GetName();
+ const std::string& name =
+ prefer_latin_name && !rule->GetLatinName().empty()
+ ? rule->GetLatinName() : local_name;
+ RegionData* region = parent_region->AddSubRegion(*key_it, name);
+ if (!rule->GetSubKeys().empty()) {
+ BuildRegionTreeRecursively(supplier, lookup_key, region,
+ rule->GetSubKeys(), prefer_latin_name);
+ }
+ }
+}
+
+// Does not take ownership of |supplier|, which cannot be NULL. The caller owns
+// the result.
+RegionData* BuildRegion(PreloadSupplier* supplier,
+ const std::string& region_code,
+ const Language& language) {
+ assert(supplier != NULL);
+
+ AddressData address;
+ address.region_code = region_code;
+
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+
+ const Rule* const rule = supplier->GetRule(lookup_key);
+ assert(rule != NULL);
+
+ RegionData* region = new RegionData(region_code);
+ BuildRegionTreeRecursively(supplier, lookup_key, region,
+ rule->GetSubKeys(), language.has_latin_script);
+
+ return region;
+}
+
+} // namespace
+
+RegionDataBuilder::RegionDataBuilder(PreloadSupplier* supplier)
+ : supplier_(supplier),
+ cache_() {
+ assert(supplier_ != NULL);
+}
+
+RegionDataBuilder::~RegionDataBuilder() {
+ for (RegionCodeDataMap::const_iterator region_it = cache_.begin();
+ region_it != cache_.end(); ++region_it) {
+ for (LanguageRegionMap::const_iterator
+ language_it = region_it->second->begin();
+ language_it != region_it->second->end(); ++language_it) {
+ delete language_it->second;
+ }
+ delete region_it->second;
+ }
+}
+
+const RegionData& RegionDataBuilder::Build(
+ const std::string& region_code,
+ const std::string& ui_language_tag,
+ std::string* best_region_tree_language_tag) {
+ assert(supplier_->IsLoaded(region_code));
+ assert(best_region_tree_language_tag != NULL);
+
+ // Look up the region tree in cache first before building it.
+ RegionCodeDataMap::const_iterator region_it = cache_.find(region_code);
+ if (region_it == cache_.end()) {
+ region_it =
+ cache_.insert(std::make_pair(region_code, new LanguageRegionMap)).first;
+ }
+
+ // No need to copy from default rule first, because only languages and Latin
+ // format are going to be used, which do not exist in the default rule.
+ Rule rule;
+ rule.ParseSerializedRule(RegionDataConstants::GetRegionData(region_code));
+ static const Language kUndefinedLanguage("und");
+ const Language& best_language = rule.GetLanguages().empty()
+ ? kUndefinedLanguage
+ : ChooseBestAddressLanguage(rule, Language(ui_language_tag));
+ *best_region_tree_language_tag = best_language.tag;
+
+ LanguageRegionMap::const_iterator language_it =
+ region_it->second->find(best_language.tag);
+ if (language_it == region_it->second->end()) {
+ language_it = region_it->second->insert(std::make_pair(
+ best_language.tag,
+ BuildRegion(supplier_, region_code, best_language))).first;
+ }
+
+ return *language_it->second;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/region_data_constants.cc b/cpp/src/region_data_constants.cc
new file mode 100644
index 0000000..f3d9c3c
--- /dev/null
+++ b/cpp/src/region_data_constants.cc
@@ -0,0 +1,1467 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// The data in this file will be automatically generated. For now, the data
+// comes from:
+//
+// https://code.google.com/p/libaddressinput/source/browse/trunk/java/src/com/android/i18n/addressinput/RegionDataConstants.java?r=137
+
+#include "region_data_constants.h"
+
+#include <algorithm>
+#include <cstddef>
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include "address_field_util.h"
+#include "lookup_key.h"
+
+namespace i18n {
+namespace addressinput {
+
+// ---- BEGIN AUTOGENERATED CODE ----
+namespace {
+
+std::map<std::string, std::string> InitRegionData() {
+ std::map<std::string, std::string> region_data;
+ region_data.insert(std::make_pair("AC", "{"
+ "\"zipex\":\"ASCN 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("AD", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %S\","
+ "\"require\":\"AS\","
+ "\"state_name_type\":\"parish\","
+ "\"zipex\":\"AD100,AD501,AD700\","
+ "\"posturl\":\"http://www.correos.es/comun/CodigosPostales/1010_s-CodPostal.asp\?Provincia=\","
+ "\"languages\":\"ca\""
+ "}"));
+ region_data.insert(std::make_pair("AE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C\","
+ "\"require\":\"AC\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("AF", "{"
+ "\"zipex\":\"1001,2601,3801\","
+ "\"posturl\":\"http://afghanpost.gov.af/Postal%20Code/\","
+ "\"languages\":\"fa~ps\""
+ "}"));
+ region_data.insert(std::make_pair("AG", "{"
+ "\"require\":\"A\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("AI", "{"
+ "\"zipex\":\"2640\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("AL", "{"
+ "\"zipex\":\"1001,1017,3501\","
+ "\"languages\":\"sq\""
+ "}"));
+ region_data.insert(std::make_pair("AM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z%n%C%n%S\","
+ "\"lfmt\":\"%N%n%O%n%A%n%Z%n%C%n%S\","
+ "\"zipex\":\"375010,0002,0010\","
+ "\"languages\":\"hy\""
+ "}"));
+ region_data.insert(std::make_pair("AO", "{"
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("AQ", "{"
+ "\"languages\":\"\""
+ "}"));
+ region_data.insert(std::make_pair("AR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"C1070AAM,C1000WAM,B1000TBU,X5187XAB\","
+ "\"posturl\":\"http://www.correoargentino.com.ar/formularios/cpa\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("AS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96799\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"sm~en\""
+ "}"));
+ region_data.insert(std::make_pair("AT", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"1010,3741\","
+ "\"posturl\":\"http://www.post.at/post_subsite_postleitzahlfinder.php\","
+ "\"languages\":\"de\""
+ "}"));
+ region_data.insert(std::make_pair("AU", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"2060,3171,6430,4000,4006,3001\","
+ "\"posturl\":\"http://www1.auspost.com.au/postcodes/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("AW", "{"
+ "\"languages\":\"nl~pap\""
+ "}"));
+ region_data.insert(std::make_pair("AX", "{"
+ "\"fmt\":\"%O%n%N%n%A%nAX-%Z %C%n\u00c5LAND\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"22150,22550,22240,22710,22270,22730,22430\","
+ "\"posturl\":\"http://www.posten.ax/department.con\?iPage=123\","
+ "\"languages\":\"sv\""
+ "}"));
+ region_data.insert(std::make_pair("AZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%nAZ %Z %C\","
+ "\"zipex\":\"1000\","
+ "\"languages\":\"az-Latn~az-Cyrl\""
+ "}"));
+ region_data.insert(std::make_pair("BA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"71000\","
+ "\"posturl\":\"http://www.post.ba/postanski_brojevi.php\","
+ "\"languages\":\"bs-Cyrl~bs-Latn~hr~sr-Cyrl~sr-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("BB", "{"
+ "\"state_name_type\":\"parish\","
+ "\"zipex\":\"BB23026,BB22025\","
+ "\"posturl\":\"http://barbadospostal.com/zipcodes.html\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("BD", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C - %Z\","
+ "\"zipex\":\"1340,1000\","
+ "\"posturl\":\"http://www.bangladeshpost.gov.bd/PostCode.asp\","
+ "\"languages\":\"bn\""
+ "}"));
+ region_data.insert(std::make_pair("BE", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"4000,1000\","
+ "\"posturl\":\"http://www.post.be/site/nl/residential/customerservice/search/postal_codes.html\","
+ "\"languages\":\"nl~fr~de\""
+ "}"));
+ region_data.insert(std::make_pair("BF", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %X\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("BG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1000,1700\","
+ "\"posturl\":\"http://www.bgpost.bg/\?cid=5\","
+ "\"languages\":\"bg\""
+ "}"));
+ region_data.insert(std::make_pair("BH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"317\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("BI", "{"
+ "\"languages\":\"rn~fr\""
+ "}"));
+ region_data.insert(std::make_pair("BJ", "{"
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("BL", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97100\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("BM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"FL 07,HM GX,HM 12\","
+ "\"posturl\":\"http://www.landvaluation.bm/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("BN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"BT2328,KA1131,BA1511\","
+ "\"posturl\":\"http://www.post.gov.bn/index.php/extensions/postcode-guide\","
+ "\"languages\":\"ms-Latn~ms-Arab\""
+ "}"));
+ region_data.insert(std::make_pair("BO", "{"
+ "\"languages\":\"es~qu~ay\""
+ "}"));
+ region_data.insert(std::make_pair("BR", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C-%S%n%Z\","
+ "\"require\":\"ASCZ\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"40301-110,70002-900\","
+ "\"posturl\":\"http://www.correios.com.br/servicos/cep/cep_default.cfm\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("BS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %S\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("BT", "{"
+ "\"zipex\":\"11001,31101,35003\","
+ "\"posturl\":\"http://www.bhutanpost.com.bt/postcode/postcode.php\","
+ "\"languages\":\"dz\""
+ "}"));
+ region_data.insert(std::make_pair("BV", "{"
+ "\"languages\":\"\""
+ "}"));
+ region_data.insert(std::make_pair("BW", "{"
+ "\"languages\":\"en~tn\""
+ "}"));
+ region_data.insert(std::make_pair("BY", "{"
+ "\"fmt\":\"%S%n%Z %C %X%n%A%n%O%n%N\","
+ "\"zipex\":\"20050,223016,225860,220050\","
+ "\"posturl\":\"http://zip.belpost.by\","
+ "\"languages\":\"be~ru\""
+ "}"));
+ region_data.insert(std::make_pair("BZ", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("CA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zipex\":\"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1\","
+ "\"posturl\":\"http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity\?execution=e2s1\","
+ "\"languages\":\"en~fr\""
+ "}"));
+ region_data.insert(std::make_pair("CC", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("CD", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %X\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("CF", "{"
+ "\"languages\":\"fr~sg\""
+ "}"));
+ region_data.insert(std::make_pair("CG", "{"
+ "\"languages\":\"fr~ln\""
+ "}"));
+ region_data.insert(std::make_pair("CH", "{"
+ "\"fmt\":\"%O%n%N%n%A%nCH-%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"2544,1211,1556,3030\","
+ "\"posturl\":\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\","
+ "\"languages\":\"de~fr~it\""
+ "}"));
+ region_data.insert(std::make_pair("CI", "{"
+ "\"fmt\":\"%N%n%O%n%X %A %C %X\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("CK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("CL", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"8340457,8720019,1230000,8329100\","
+ "\"posturl\":\"http://www.correos.cl/SitePages/home.aspx\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("CM", "{"
+ "\"languages\":\"fr~en\""
+ "}"));
+ region_data.insert(std::make_pair("CN", "{"
+ "\"fmt\":\"%Z%n%S%C%D%n%A%n%O%n%N\","
+ "\"lfmt\":\"%N%n%O%n%A%n%D%n%C%n%S, %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zipex\":\"266033,317204,100096,100808\","
+ "\"posturl\":\"http://www.cpdc.com.cn/postcdQueryAction.do\?reqCode=gotoQueryPostAddr\","
+ "\"languages\":\"zh-Hans\""
+ "}"));
+ region_data.insert(std::make_pair("CO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %S\","
+ "\"zipex\":\"111221,130001,760011\","
+ "\"posturl\":\"http://www.codigopostal4-72.com.co/codigosPostales/\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("CR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1000,2010,1001\","
+ "\"posturl\":\"https://www.correos.go.cr/nosotros/codigopostal/busqueda.html\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("CV", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\","
+ "\"state_name_type\":\"island\","
+ "\"zipex\":\"7600\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("CX", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("CY", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"2008,3304,1900\","
+ "\"languages\":\"el~tr\""
+ "}"));
+ region_data.insert(std::make_pair("CZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"100 00,251 66,530 87,110 00,225 99\","
+ "\"posturl\":\"http://psc.ceskaposta.cz/CleanForm.action\","
+ "\"languages\":\"cs\""
+ "}"));
+ region_data.insert(std::make_pair("DE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"26133,53225\","
+ "\"posturl\":\"http://www.postdirekt.de/plzserver/\","
+ "\"languages\":\"de\""
+ "}"));
+ region_data.insert(std::make_pair("DJ", "{"
+ "\"languages\":\"ar~fr\""
+ "}"));
+ region_data.insert(std::make_pair("DK", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"8660,1566\","
+ "\"posturl\":\"http://www.postdanmark.dk/da/Privat/Kundeservice/postnummerkort/Sider/Find-postnummer.aspx\","
+ "\"languages\":\"da\""
+ "}"));
+ region_data.insert(std::make_pair("DM", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("DO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"11903,10101\","
+ "\"posturl\":\"http://inposdom.gob.do/servicios/codigo-postal.html#buscar_codigo\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("DZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"40304,16027\","
+ "\"languages\":\"ar~fr\""
+ "}"));
+ region_data.insert(std::make_pair("EC", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z%n%C\","
+ "\"zipex\":\"EC090112,090105,H0103C,P0133B,P0133A,P0133V\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("EE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"69501,11212,1001\","
+ "\"posturl\":\"http://www.post.ee/\?op=sihtnumbriotsing\","
+ "\"languages\":\"et\""
+ "}"));
+ region_data.insert(std::make_pair("EG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\","
+ "\"lfmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\","
+ "\"zipex\":\"12411,11599\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("EH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"70000,72000\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("ER", "{"
+ "\"languages\":\"ti~en~ar\""
+ "}"));
+ region_data.insert(std::make_pair("ES", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C %S\","
+ "\"require\":\"ACSZ\","
+ "\"zipex\":\"28039,28300,28070\","
+ "\"posturl\":\"http://www.correos.es/contenido/13-MenuRec2/04-MenuRec24/1010_s-CodPostal.asp\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("ET", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1000\","
+ "\"languages\":\"am\""
+ "}"));
+ region_data.insert(std::make_pair("FI", "{"
+ "\"fmt\":\"%O%n%N%n%A%nFI-%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"00550,00011\","
+ "\"posturl\":\"http://www.verkkoposti.com/e3/postinumeroluettelo\","
+ "\"languages\":\"fi~sv\""
+ "}"));
+ region_data.insert(std::make_pair("FJ", "{"
+ "\"languages\":\"en~fj\""
+ "}"));
+ region_data.insert(std::make_pair("FK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"FIQQ 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("FM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96941,96944\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"chk~pon~kos~yap~en~uli\""
+ "}"));
+ region_data.insert(std::make_pair("FO", "{"
+ "\"fmt\":\"%N%n%O%n%A%nFO%Z %C\","
+ "\"zipex\":\"100\","
+ "\"posturl\":\"http://www.postur.fo/\","
+ "\"languages\":\"fo\""
+ "}"));
+ region_data.insert(std::make_pair("FR", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"33380,34092,33506\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("GA", "{"
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("GB", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"state_name_type\":\"county\","
+ "\"zipex\":\"EC1Y 8SY,GIR 0AA,M2 5BQ,M34 4AB,CR0 2YR,DN16 9AA,W1A 4ZZ,EC1A 1HQ,OX14 4PG,BS18 8HF,NR25 7HG,RH6 OHP,BH23 6AA,B6 5BA,RH6 0HP,SO23 9AP,PO1 3AX,BFPO 61\","
+ "\"posturl\":\"http://www.royalmail.com/postcode-finder\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GD", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"0101\","
+ "\"posturl\":\"http://www.georgianpost.ge/index.php\?page=10\","
+ "\"languages\":\"ka\""
+ "}"));
+ region_data.insert(std::make_pair("GF", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97300\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("GG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%nGUERNSEY%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"GY1 1AA,GY2 2BT\","
+ "\"posturl\":\"http://www.guernseypost.com/postcode_finder/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GH", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GI", "{"
+ "\"fmt\":\"%N%n%O%n%A\","
+ "\"require\":\"A\","
+ "\"zipex\":\"GX11 1AA\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GL", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"3900,3950,3911\","
+ "\"languages\":\"kl~da\""
+ "}"));
+ region_data.insert(std::make_pair("GM", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("GN", "{"
+ "\"fmt\":\"%N%n%O%n%Z %A %C\","
+ "\"zipex\":\"001,200,100\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("GP", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97100\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("GQ", "{"
+ "\"languages\":\"es~fr\""
+ "}"));
+ region_data.insert(std::make_pair("GR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"151 24,151 10,101 88\","
+ "\"posturl\":\"http://www.elta.gr/findapostcode.aspx\","
+ "\"languages\":\"el\""
+ "}"));
+ region_data.insert(std::make_pair("GS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"SIQQ 1ZZ\","
+ "\"languages\":\"\""
+ "}"));
+ region_data.insert(std::make_pair("GT", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z- %C\","
+ "\"zipex\":\"09001,01501\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("GU", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96910,96931\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"en~ch\""
+ "}"));
+ region_data.insert(std::make_pair("GW", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1000,1011\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("GY", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("HK", "{"
+ "\"fmt\":\"%S%n%A%n%O%n%N\","
+ "\"lfmt\":\"%N%n%O%n%A%n%S\","
+ "\"require\":\"AS\","
+ "\"state_name_type\":\"area\","
+ "\"languages\":\"zh-Hant~en\""
+ "}"));
+ region_data.insert(std::make_pair("HM", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\","
+ "\"languages\":\"\""
+ "}"));
+ region_data.insert(std::make_pair("HN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %S%n%Z\","
+ "\"require\":\"ACS\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("HR", "{"
+ "\"fmt\":\"%N%n%O%n%A%nHR-%Z %C\","
+ "\"zipex\":\"10000,21001,10002\","
+ "\"posturl\":\"http://www.posta.hr/default.aspx\?pretpum\","
+ "\"languages\":\"hr\""
+ "}"));
+ region_data.insert(std::make_pair("HT", "{"
+ "\"fmt\":\"%N%n%O%n%A%nHT%Z %C %X\","
+ "\"zipex\":\"6120,5310,6110,8510\","
+ "\"languages\":\"ht~fr\""
+ "}"));
+ region_data.insert(std::make_pair("HU", "{"
+ "\"fmt\":\"%N%n%O%n%C%n%A%n%Z\","
+ "\"zipex\":\"1037,2380,1540\","
+ "\"posturl\":\"http://posta.hu/ugyfelszolgalat/iranyitoszam_kereso\","
+ "\"languages\":\"hu\""
+ "}"));
+ region_data.insert(std::make_pair("ID", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S %Z\","
+ "\"state_name_type\":\"district\","
+ "\"zipex\":\"40115\","
+ "\"languages\":\"id\""
+ "}"));
+ region_data.insert(std::make_pair("IE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S\","
+ "\"state_name_type\":\"county\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("IL", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"9614303\","
+ "\"posturl\":\"http://www.israelpost.co.il/zipcode.nsf/demozip\?openform\","
+ "\"languages\":\"iw~ar\""
+ "}"));
+ region_data.insert(std::make_pair("IM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"IM2 1AA,IM99 1PS\","
+ "\"posturl\":\"http://www.gov.im/post/postal/fr_main.asp\","
+ "\"languages\":\"en~gv\""
+ "}"));
+ region_data.insert(std::make_pair("IN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z%n%S\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"110034,110001\","
+ "\"posturl\":\"http://www.indiapost.gov.in/pin/pinsearch.aspx\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("IO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"BBND 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("IQ", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C, %S%n%Z\","
+ "\"require\":\"ACS\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("IS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"320,121,220,110\","
+ "\"posturl\":\"http://www.postur.is/cgi-bin/hsrun.exe/Distributed/vefur/vefur.htx;start=HS_landakort_postnumer\","
+ "\"languages\":\"is\""
+ "}"));
+ region_data.insert(std::make_pair("IT", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C %S\","
+ "\"require\":\"ACSZ\","
+ "\"zipex\":\"00144,47037,39049\","
+ "\"posturl\":\"http://www.poste.it/online/cercacap/\","
+ "\"languages\":\"it\""
+ "}"));
+ region_data.insert(std::make_pair("JE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%nJERSEY%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"JE1 1AA,JE2 2BT\","
+ "\"posturl\":\"http://www.jerseypost.com/tools/postcode-address-finder/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("JM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S %X\","
+ "\"require\":\"ACS\","
+ "\"state_name_type\":\"parish\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("JO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"11937,11190\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("JP", "{"
+ "\"fmt\":\"\u3012%Z%n%S%C%n%A%n%O%n%N\","
+ "\"lfmt\":\"%N%n%O%n%A%n%C, %S%n%Z\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"prefecture\","
+ "\"zipex\":\"154-0023,350-1106,951-8073,112-0001,208-0032,231-0012\","
+ "\"posturl\":\"http://search.post.japanpost.jp/zipcode/\","
+ "\"languages\":\"ja\""
+ "}"));
+ region_data.insert(std::make_pair("KE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\","
+ "\"zipex\":\"20100,00100\","
+ "\"languages\":\"en~sw\""
+ "}"));
+ region_data.insert(std::make_pair("KG", "{"
+ "\"fmt\":\"%Z %C %X%n%A%n%O%n%N\","
+ "\"zipex\":\"720001\","
+ "\"languages\":\"ky-Cyrl~ru\""
+ "}"));
+ region_data.insert(std::make_pair("KH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"12203,14206,12000\","
+ "\"languages\":\"km\""
+ "}"));
+ region_data.insert(std::make_pair("KI", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%S%n%C\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"en~gil\""
+ "}"));
+ region_data.insert(std::make_pair("KM", "{"
+ "\"languages\":\"ar~fr~zdj\""
+ "}"));
+ region_data.insert(std::make_pair("KN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %S\","
+ "\"require\":\"ACS\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("KR", "{"
+ "\"fmt\":\"%S %C%D%n%A%n%O%n%N%n%Z\","
+ "\"lfmt\":\"%N%n%O%n%A%n%D%n%C%n%S%n%Z\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"do_si\","
+ "\"zipex\":\"110-110,699-800\","
+ "\"posturl\":\"http://www.epost.go.kr/search/zipcode/search5.jsp\","
+ "\"languages\":\"ko\""
+ "}"));
+ region_data.insert(std::make_pair("KW", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"54541,54551,54404,13009\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("KY", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%S\","
+ "\"require\":\"AS\","
+ "\"state_name_type\":\"island\","
+ "\"zipex\":\"KY1-1100,KY1-1702,KY2-2101\","
+ "\"posturl\":\"http://www.caymanpost.gov.ky/portal/page\?_pageid=3561,1&_dad=portal&_schema=PORTAL\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("KZ", "{"
+ "\"fmt\":\"%Z%n%S%n%C%n%A%n%O%n%N\","
+ "\"zipex\":\"040900,050012\","
+ "\"languages\":\"ru~kk-Cyrl\""
+ "}"));
+ region_data.insert(std::make_pair("LA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"01160,01000\","
+ "\"languages\":\"lo\""
+ "}"));
+ region_data.insert(std::make_pair("LB", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"2038 3054,1107 2810,1000\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("LC", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("LI", "{"
+ "\"fmt\":\"%O%n%N%n%A%nFL-%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"9496,9491,9490,9485\","
+ "\"posturl\":\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\","
+ "\"languages\":\"de~gsw\""
+ "}"));
+ region_data.insert(std::make_pair("LK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\","
+ "\"zipex\":\"20000,00100\","
+ "\"posturl\":\"http://www.slpost.gov.lk/\","
+ "\"languages\":\"si~ta\""
+ "}"));
+ region_data.insert(std::make_pair("LR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C %X\","
+ "\"zipex\":\"1000\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("LS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"100\","
+ "\"languages\":\"st~en\""
+ "}"));
+ region_data.insert(std::make_pair("LT", "{"
+ "\"fmt\":\"%O%n%N%n%A%nLT-%Z %C\","
+ "\"zipex\":\"04340,03500\","
+ "\"posturl\":\"http://www.post.lt/lt/\?id=316\","
+ "\"languages\":\"lt\""
+ "}"));
+ region_data.insert(std::make_pair("LU", "{"
+ "\"fmt\":\"%O%n%N%n%A%nL-%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"4750,2998\","
+ "\"posturl\":\"http://www.pt.lu/portal/services_en_ligne/recherche_codes_postaux\","
+ "\"languages\":\"fr~lb~de\""
+ "}"));
+ region_data.insert(std::make_pair("LV", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %Z\","
+ "\"zipex\":\"LV-1073,LV-1000\","
+ "\"posturl\":\"http://www.pasts.lv/lv/uzzinas/nodalas/\","
+ "\"languages\":\"lv\""
+ "}"));
+ region_data.insert(std::make_pair("LY", "{"
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("MA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"53000,10000,20050,16052\","
+ "\"languages\":\"ar~fr~tzm-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("MC", "{"
+ "\"fmt\":\"%N%n%O%n%A%nMC-%Z %C %X\","
+ "\"zipex\":\"98000,98020,98011,98001\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("MD", "{"
+ "\"fmt\":\"%N%n%O%n%A%nMD-%Z %C\","
+ "\"zipex\":\"2012,2019\","
+ "\"languages\":\"ro\""
+ "}"));
+ region_data.insert(std::make_pair("ME", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"81257,81258,81217,84314,85366\","
+ "\"languages\":\"sr-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("MF", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97100\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("MG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"501,101\","
+ "\"languages\":\"mg~fr~en\""
+ "}"));
+ region_data.insert(std::make_pair("MH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96960,96970\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"en~mh\""
+ "}"));
+ region_data.insert(std::make_pair("MK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1314,1321,1443,1062\","
+ "\"languages\":\"mk~sq\""
+ "}"));
+ region_data.insert(std::make_pair("ML", "{"
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("MN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%S %C-%X%n%Z\","
+ "\"zipex\":\"65030,65270\","
+ "\"posturl\":\"http://www.zipcode.mn/\","
+ "\"languages\":\"mn-Cyrl\""
+ "}"));
+ region_data.insert(std::make_pair("MO", "{"
+ "\"fmt\":\"%A%n%O%n%N\","
+ "\"lfmt\":\"%N%n%O%n%A\","
+ "\"require\":\"A\","
+ "\"languages\":\"zh-Hant~pt\""
+ "}"));
+ region_data.insert(std::make_pair("MP", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96950,96951,96952\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("MQ", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97220\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("MR", "{"
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("MS", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("MT", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"NXR 01,ZTN 05,GPO 01,BZN 1130,SPB 6031,VCT 1753\","
+ "\"posturl\":\"http://postcodes.maltapost.com/\","
+ "\"languages\":\"mt~en\""
+ "}"));
+ region_data.insert(std::make_pair("MU", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z%n%C\","
+ "\"zipex\":\"742CU001\","
+ "\"languages\":\"en~fr\""
+ "}"));
+ region_data.insert(std::make_pair("MV", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"20026\","
+ "\"posturl\":\"http://www.maldivespost.com/\?lid=10\","
+ "\"languages\":\"dv\""
+ "}"));
+ region_data.insert(std::make_pair("MW", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %X\","
+ "\"languages\":\"en~ny\""
+ "}"));
+ region_data.insert(std::make_pair("MX", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%D%n%Z %C, %S\","
+ "\"require\":\"ACZ\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"02860,77520,06082\","
+ "\"posturl\":\"http://www.correosdemexico.gob.mx/ServiciosLinea/Paginas/ccpostales.aspx\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("MY", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C, %S\","
+ "\"require\":\"ACZ\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"43000,50754,88990,50670\","
+ "\"posturl\":\"http://www.pos.com.my/pos/homepage.aspx\","
+ "\"languages\":\"ms\""
+ "}"));
+ region_data.insert(std::make_pair("MZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C\","
+ "\"zipex\":\"1102,1119,3212\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("NA", "{"
+ "\"languages\":\"af~en\""
+ "}"));
+ region_data.insert(std::make_pair("NC", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"98814,98800,98810\","
+ "\"posturl\":\"http://poste.opt.nc/index.php\?option=com_content&view=article&id=80&Itemid=131\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("NE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"8001\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("NF", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%C %S %Z\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("NG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z%n%S\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"930283,300001,931104\","
+ "\"posturl\":\"http://www.nigeriapostcodes.com/views/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("NI", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z%n%C, %S\","
+ "\"state_name_type\":\"department\","
+ "\"zipex\":\"52000\","
+ "\"posturl\":\"http://www.correos.gob.ni/index.php/codigo-postal-2\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("NL", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"1234 AB,2490 AA\","
+ "\"posturl\":\"http://www.postnl.nl/voorthuis/\","
+ "\"languages\":\"nl\""
+ "}"));
+ region_data.insert(std::make_pair("NO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"0025,0107,6631\","
+ "\"posturl\":\"http://adressesok.posten.no/nb/postal_codes/search\","
+ "\"languages\":\"no~nn\""
+ "}"));
+ region_data.insert(std::make_pair("NP", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"44601\","
+ "\"posturl\":\"http://www.gpo.gov.np/postalcode.aspx\","
+ "\"languages\":\"ne\""
+ "}"));
+ region_data.insert(std::make_pair("NR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%S\","
+ "\"require\":\"AS\","
+ "\"state_name_type\":\"district\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("NU", "{"
+ "\"languages\":\"en~niu\""
+ "}"));
+ region_data.insert(std::make_pair("NZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"6001,6015,6332,8252,1030\","
+ "\"posturl\":\"http://www.nzpost.co.nz/Cultures/en-NZ/OnlineTools/PostCodeFinder/\","
+ "\"languages\":\"en~mi\""
+ "}"));
+ region_data.insert(std::make_pair("OM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z%n%C\","
+ "\"zipex\":\"133,112,111\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("PA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("PE", "{"
+ "\"zipex\":\"LIMA 23,LIMA 42,CALLAO 2,02001\","
+ "\"posturl\":\"http://www.serpost.com.pe/cpostal/codigo\","
+ "\"languages\":\"es~qu\""
+ "}"));
+ region_data.insert(std::make_pair("PF", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C %S\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"fr~ty\""
+ "}"));
+ region_data.insert(std::make_pair("PG", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z %S\","
+ "\"require\":\"ACS\","
+ "\"zipex\":\"111\","
+ "\"languages\":\"tpi~en~ho\""
+ "}"));
+ region_data.insert(std::make_pair("PH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\","
+ "\"zipex\":\"1008,1050,1135,1207,2000,1000\","
+ "\"posturl\":\"http://www.philpost.gov.ph/\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("PK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C-%Z\","
+ "\"zipex\":\"44000\","
+ "\"posturl\":\"http://www.pakpost.gov.pk/postcode/postcode.html\","
+ "\"languages\":\"ur~en\""
+ "}"));
+ region_data.insert(std::make_pair("PL", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"00-950,05-470,48-300,32-015,00-940\","
+ "\"posturl\":\"http://www.poczta-polska.pl/kody.php\","
+ "\"languages\":\"pl\""
+ "}"));
+ region_data.insert(std::make_pair("PM", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97500\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("PN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"PCRN 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("PR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C PR %Z\","
+ "\"require\":\"ACZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"zipex\":\"00930\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"es~en\""
+ "}"));
+ region_data.insert(std::make_pair("PS", "{"
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("PT", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"2725-079,1250-096,1201-950,2860-571,1208-148\","
+ "\"posturl\":\"http://www.ctt.pt/feapl_2/app/open/tools.jspx\?tool=1\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("PW", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96940\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"pau~en\""
+ "}"));
+ region_data.insert(std::make_pair("PY", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1536,1538,1209\","
+ "\"languages\":\"gn~es\""
+ "}"));
+ region_data.insert(std::make_pair("QA", "{"
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("RE", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97400\","
+ "\"posturl\":\"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("RO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"060274,061357,200716\","
+ "\"posturl\":\"http://www.posta-romana.ro/zip_codes\","
+ "\"languages\":\"ro\""
+ "}"));
+ region_data.insert(std::make_pair("RS", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"106314\","
+ "\"posturl\":\"http://www.posta.rs/struktura/lat/aplikacije/pronadji/nadji-postu.asp\","
+ "\"languages\":\"sr-Cyrl~sr-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("RU", "{"
+ "\"fmt\":\"%Z %C %n%A%n%O%n%N\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"125075,247112,103375\","
+ "\"posturl\":\"http://info.russianpost.ru/servlet/department\","
+ "\"languages\":\"ru\""
+ "}"));
+ region_data.insert(std::make_pair("RW", "{"
+ "\"languages\":\"rw~fr~en\""
+ "}"));
+ region_data.insert(std::make_pair("SA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z\","
+ "\"zipex\":\"11564,11187,11142\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("SB", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("SC", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"fr~en\""
+ "}"));
+ region_data.insert(std::make_pair("SE", "{"
+ "\"fmt\":\"%O%n%N%n%A%nSE-%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"11455,12345,10500\","
+ "\"posturl\":\"http://www.posten.se/sv/Kundservice/Sidor/Sok-postnummer-resultat.aspx\","
+ "\"languages\":\"sv\""
+ "}"));
+ region_data.insert(std::make_pair("SG", "{"
+ "\"fmt\":\"%N%n%O%n%A%nSINGAPORE %Z\","
+ "\"require\":\"AZ\","
+ "\"zipex\":\"546080,308125,408600\","
+ "\"posturl\":\"http://www.singpost.com.sg/quick_services/index.htm\","
+ "\"languages\":\"en~zh-Hans~ms-Latn~ta\""
+ "}"));
+ region_data.insert(std::make_pair("SH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"STHL 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("SI", "{"
+ "\"fmt\":\"%N%n%O%n%A%nSI- %Z %C\","
+ "\"zipex\":\"4000,1001,2500\","
+ "\"languages\":\"sl\""
+ "}"));
+ region_data.insert(std::make_pair("SJ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"9170\","
+ "\"posturl\":\"http://epab.posten.no/\","
+ "\"languages\":\"no\""
+ "}"));
+ region_data.insert(std::make_pair("SK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"010 01,023 14,972 48,921 01,975 99\","
+ "\"posturl\":\"http://psc.posta.sk\","
+ "\"languages\":\"sk\""
+ "}"));
+ region_data.insert(std::make_pair("SL", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("SM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"AZ\","
+ "\"zipex\":\"47890,47891,47895,47899\","
+ "\"posturl\":\"http://www.poste.it/online/cercacap/\","
+ "\"languages\":\"it\""
+ "}"));
+ region_data.insert(std::make_pair("SN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"12500,46024,16556,10000\","
+ "\"languages\":\"fr~wo\""
+ "}"));
+ region_data.insert(std::make_pair("SO", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C, %S %Z\","
+ "\"require\":\"ACS\","
+ "\"zipex\":\"09010,11010\","
+ "\"languages\":\"so\""
+ "}"));
+ region_data.insert(std::make_pair("SR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %X%n%S\","
+ "\"languages\":\"nl\""
+ "}"));
+ region_data.insert(std::make_pair("ST", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %X\","
+ "\"languages\":\"pt\""
+ "}"));
+ region_data.insert(std::make_pair("SV", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z-%C%n%S\","
+ "\"require\":\"ACS\","
+ "\"zipex\":\"CP 1101\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("SZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\","
+ "\"zipex\":\"H100\","
+ "\"posturl\":\"http://www.sptc.co.sz/swazipost/codes.php\","
+ "\"languages\":\"en~ss\""
+ "}"));
+ region_data.insert(std::make_pair("TA", "{"
+ "\"zipex\":\"TDCU 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("TC", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"TKCA 1ZZ\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("TD", "{"
+ "\"languages\":\"fr~ar\""
+ "}"));
+ region_data.insert(std::make_pair("TF", "{"
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("TG", "{"
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("TH", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%D %C%n%S %Z\","
+ "\"lfmt\":\"%N%n%O%n%A%n%D, %C%n%S %Z\","
+ "\"zipex\":\"10150,10210\","
+ "\"languages\":\"th\""
+ "}"));
+ region_data.insert(std::make_pair("TJ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"735450,734025\","
+ "\"languages\":\"tg-Cyrl\""
+ "}"));
+ region_data.insert(std::make_pair("TK", "{"
+ "\"languages\":\"en~tkl\""
+ "}"));
+ region_data.insert(std::make_pair("TL", "{"
+ "\"languages\":\"pt~tet\""
+ "}"));
+ region_data.insert(std::make_pair("TM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"744000\","
+ "\"languages\":\"tk-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("TN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"1002,8129,3100,1030\","
+ "\"posturl\":\"http://www.poste.tn/codes.php\","
+ "\"languages\":\"ar~fr\""
+ "}"));
+ region_data.insert(std::make_pair("TO", "{"
+ "\"languages\":\"to~en\""
+ "}"));
+ region_data.insert(std::make_pair("TR", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C/%S\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"01960,06101\","
+ "\"posturl\":\"http://postakodu.ptt.gov.tr/\","
+ "\"languages\":\"tr\""
+ "}"));
+ region_data.insert(std::make_pair("TT", "{"
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("TV", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%X%n%C%n%S\","
+ "\"state_name_type\":\"island\","
+ "\"languages\":\"tyv\""
+ "}"));
+ region_data.insert(std::make_pair("TW", "{"
+ "\"fmt\":\"%Z%n%S%C%n%A%n%O%n%N\","
+ "\"lfmt\":\"%N%n%O%n%A%n%C, %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"state_name_type\":\"county\","
+ "\"zipex\":\"104,106,10603,40867\","
+ "\"posturl\":\"http://www.post.gov.tw/post/internet/f_searchzone/index.jsp\?ID=190102\","
+ "\"languages\":\"zh-Hant\""
+ "}"));
+ region_data.insert(std::make_pair("TZ", "{"
+ "\"zipex\":\"6090\","
+ "\"languages\":\"sw~en\""
+ "}"));
+ region_data.insert(std::make_pair("UA", "{"
+ "\"fmt\":\"%Z %C%n%A%n%O%n%N\","
+ "\"zipex\":\"15432,01055,01001\","
+ "\"posturl\":\"http://services.ukrposhta.com/postindex_new/\","
+ "\"languages\":\"uk~ru\""
+ "}"));
+ region_data.insert(std::make_pair("UG", "{"
+ "\"languages\":\"sw~en\""
+ "}"));
+ region_data.insert(std::make_pair("UM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACS\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"96898\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("US", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"95014,22162-1010\","
+ "\"posturl\":\"https://tools.usps.com/go/ZipLookupAction!input.action\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("UY", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C %S\","
+ "\"zipex\":\"11600\","
+ "\"posturl\":\"http://www.correo.com.uy/index.asp\?codPag=codPost&switchMapa=codPost\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("UZ", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C%n%S\","
+ "\"zipex\":\"702100,700000\","
+ "\"posturl\":\"http://www.pochta.uz/index.php/uz/pochta-indekslari/9\","
+ "\"languages\":\"uz-Latn~uz-Cyrl\""
+ "}"));
+ region_data.insert(std::make_pair("VA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"00120\","
+ "\"languages\":\"la\""
+ "}"));
+ region_data.insert(std::make_pair("VC", "{"
+ "\"zipex\":\"VC0100,VC0110,VC0400\","
+ "\"posturl\":\"http://www.svgpost.gov.vc/\?option=com_content&view=article&id=3&Itemid=16\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("VE", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %Z, %S\","
+ "\"require\":\"ACS\","
+ "\"zipex\":\"1010,3001,8011,1020\","
+ "\"posturl\":\"http://www.ipostel.gob.ve/nlinea/codigo_postal.php\","
+ "\"languages\":\"es\""
+ "}"));
+ region_data.insert(std::make_pair("VG", "{"
+ "\"require\":\"A\","
+ "\"zipex\":\"VG1110,VG1150,VG1160\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("VI", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C %S %Z\","
+ "\"require\":\"ACSZ\","
+ "\"zip_name_type\":\"zip\","
+ "\"state_name_type\":\"state\","
+ "\"zipex\":\"00802-1222,00850-9802\","
+ "\"posturl\":\"http://zip4.usps.com/zip4/welcome.jsp\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("VN", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%S\","
+ "\"lfmt\":\"%N%n%O%n%A%n%C%n%S\","
+ "\"require\":\"AC\","
+ "\"zipex\":\"119415,136065,720344\","
+ "\"posturl\":\"http://postcode.vnpost.vn/services/search.aspx\","
+ "\"languages\":\"vi\""
+ "}"));
+ region_data.insert(std::make_pair("VU", "{"
+ "\"languages\":\"bi~en~fr\""
+ "}"));
+ region_data.insert(std::make_pair("WF", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"98600\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("WS", "{"
+ "\"languages\":\"sm~en\""
+ "}"));
+ region_data.insert(std::make_pair("XK", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"zipex\":\"10000\","
+ "\"languages\":\"sq~sr-Cyrl~sr-Latn\""
+ "}"));
+ region_data.insert(std::make_pair("YE", "{"
+ "\"require\":\"AC\","
+ "\"languages\":\"ar\""
+ "}"));
+ region_data.insert(std::make_pair("YT", "{"
+ "\"fmt\":\"%O%n%N%n%A%n%Z %C %X\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"97600\","
+ "\"languages\":\"fr\""
+ "}"));
+ region_data.insert(std::make_pair("ZA", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C%n%Z\","
+ "\"require\":\"ACZ\","
+ "\"zipex\":\"0083,1451,0001\","
+ "\"posturl\":\"http://www.postoffice.co.za/tools/postalcode.html\","
+ "\"languages\":\"en~zu~xh~af~nso~tn~st~ts~ss~ve~nr\""
+ "}"));
+ region_data.insert(std::make_pair("ZM", "{"
+ "\"fmt\":\"%N%n%O%n%A%n%Z %C\","
+ "\"require\":\"AC\","
+ "\"zipex\":\"50100,50101\","
+ "\"languages\":\"en\""
+ "}"));
+ region_data.insert(std::make_pair("ZW", "{"
+ "\"languages\":\"en~sn~nd\""
+ "}"));
+ return region_data;
+}
+
+} // namespace
+
+// static
+const std::string& RegionDataConstants::GetDefaultRegionData() {
+ static const std::string kDefaultRegionData(
+ "{"
+ "\"fmt\":\"%N%n%O%n%A%n%C\","
+ "\"require\":\"AC\","
+ "\"zip_name_type\":\"postal\","
+ "\"state_name_type\":\"province\""
+ "}");
+ return kDefaultRegionData;
+}
+// ---- END AUTOGENERATED CODE ----
+
+namespace {
+
+const std::map<std::string, std::string>& GetAllRegionData() {
+ static const std::map<std::string, std::string> kRegionData(InitRegionData());
+ return kRegionData;
+}
+
+struct SelectFirst {
+ template <typename Pair>
+ const typename Pair::first_type& operator()(const Pair& pair) const {
+ return pair.first;
+ }
+};
+
+std::vector<std::string> InitRegionCodes() {
+ std::vector<std::string> region_codes(GetAllRegionData().size());
+ std::transform(GetAllRegionData().begin(), GetAllRegionData().end(),
+ region_codes.begin(), SelectFirst());
+ return region_codes;
+}
+
+const std::map<std::string, size_t> InitMaxLookupKeyDepth() {
+ std::map<std::string, size_t> max_depth;
+ for (std::map<std::string, std::string>::const_iterator
+ it = GetAllRegionData().begin(); it != GetAllRegionData().end(); ++it) {
+ std::vector<FormatElement> fields;
+ // Here it->second actually contains the entire JSON blob for this region,
+ // and not only the format field, but it doesn't really matter when just
+ // checking whether a particular formatting code (eg. "%C") is present, as
+ // there isn't anything else in the JSON that erroneously could match a
+ // formatting code.
+ ParseFormatRule(it->second, &fields);
+ size_t depth = 1;
+ for (; depth < arraysize(LookupKey::kHierarchy); ++depth) {
+ AddressField field = LookupKey::kHierarchy[depth];
+ // Check to see if a particular field in the hierarchy is used by
+ // addresses in this country. If not, the maximum depth has been reached.
+ if (std::find(fields.begin(), fields.end(), FormatElement(field)) ==
+ fields.end()) {
+ break;
+ }
+ }
+ max_depth.insert(std::make_pair(it->first, depth - 1));
+ }
+ return max_depth;
+}
+
+} // namespace
+
+// static
+const bool RegionDataConstants::IsSupported(const std::string& region_code) {
+ static const std::set<std::string> kRegionCodes(GetRegionCodes().begin(),
+ GetRegionCodes().end());
+ return kRegionCodes.find(region_code) != kRegionCodes.end();
+}
+
+// static
+const std::vector<std::string>& RegionDataConstants::GetRegionCodes() {
+ static const std::vector<std::string> kRegionCodes(InitRegionCodes());
+ return kRegionCodes;
+}
+
+// static
+const std::string& RegionDataConstants::GetRegionData(
+ const std::string& region_code) {
+ static const std::string kEmptyString;
+ std::map<std::string, std::string>::const_iterator it =
+ GetAllRegionData().find(region_code);
+ return it != GetAllRegionData().end() ? it->second : kEmptyString;
+}
+
+// static
+size_t RegionDataConstants::GetMaxLookupKeyDepth(
+ const std::string& region_code) {
+ static const std::map<std::string, size_t> kMaxDepth(InitMaxLookupKeyDepth());
+ std::map<std::string, size_t>::const_iterator it =
+ kMaxDepth.find(region_code);
+ return it != kMaxDepth.end() ? it->second : 0;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/region_data_constants.h b/cpp/src/region_data_constants.h
new file mode 100644
index 0000000..7a2c133
--- /dev/null
+++ b/cpp/src/region_data_constants.h
@@ -0,0 +1,37 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_REGION_DATA_CONSTANTS_H_
+#define I18N_ADDRESSINPUT_REGION_DATA_CONSTANTS_H_
+
+#include <cstddef>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+class RegionDataConstants {
+ public:
+ static const bool IsSupported(const std::string& region_code);
+ static const std::vector<std::string>& GetRegionCodes();
+ static const std::string& GetRegionData(const std::string& region_code);
+ static const std::string& GetDefaultRegionData();
+ static size_t GetMaxLookupKeyDepth(const std::string& region_code);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_REGION_DATA_CONSTANTS_H_
diff --git a/cpp/src/retriever.cc b/cpp/src/retriever.cc
new file mode 100644
index 0000000..8fa76b7
--- /dev/null
+++ b/cpp/src/retriever.cc
@@ -0,0 +1,125 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "retriever.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/downloader.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+
+#include "lookup_key_util.h"
+#include "validating_storage.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+class Helper {
+ public:
+ // Does not take ownership of its parameters.
+ Helper(const std::string& key,
+ const Retriever::Callback& retrieved,
+ const LookupKeyUtil& lookup_key_util,
+ const Downloader& downloader,
+ ValidatingStorage* storage)
+ : retrieved_(retrieved),
+ lookup_key_util_(lookup_key_util),
+ downloader_(downloader),
+ storage_(storage),
+ downloaded_(BuildCallback(this, &Helper::OnDownloaded)),
+ validated_data_ready_(
+ BuildCallback(this, &Helper::OnValidatedDataReady)),
+ stale_data_() {
+ assert(storage_ != NULL);
+ storage_->Get(key, *validated_data_ready_);
+ }
+
+ private:
+ ~Helper() {}
+
+ void OnValidatedDataReady(bool success,
+ const std::string& key,
+ std::string* data) {
+ if (success) {
+ assert(data != NULL);
+ retrieved_(success, key, *data);
+ delete this;
+ } else {
+ // Validating storage returns (false, key, stale-data) for valid but stale
+ // data. If |data| is empty, however, then it's either missing or invalid.
+ if (data != NULL && !data->empty()) {
+ stale_data_ = *data;
+ }
+ downloader_.Download(lookup_key_util_.GetUrlForKey(key), *downloaded_);
+ }
+ delete data;
+ }
+
+ void OnDownloaded(bool success, const std::string& url, std::string* data) {
+ const std::string& key = lookup_key_util_.GetKeyForUrl(url);
+ if (success) {
+ assert(data != NULL);
+ retrieved_(true, key, *data);
+ storage_->Put(key, data);
+ data = NULL; // Deleted by Storage::Put().
+ } else if (!stale_data_.empty()) {
+ // Reuse the stale data if a download fails. It's better to have slightly
+ // outdated validation rules than to suddenly lose validation ability.
+ retrieved_(true, key, stale_data_);
+ } else {
+ retrieved_(false, key, std::string());
+ }
+ delete data;
+ delete this;
+ }
+
+ const Retriever::Callback& retrieved_;
+ const LookupKeyUtil& lookup_key_util_;
+ const Downloader& downloader_;
+ ValidatingStorage* storage_;
+ scoped_ptr<Downloader::Callback> downloaded_;
+ scoped_ptr<Storage::Callback> validated_data_ready_;
+ std::string stale_data_;
+
+ DISALLOW_COPY_AND_ASSIGN(Helper);
+};
+
+} // namespace
+
+Retriever::Retriever(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage)
+ : lookup_key_util_(validation_data_url),
+ downloader_(downloader),
+ storage_(new ValidatingStorage(storage)) {
+ assert(storage_ != NULL);
+ assert(downloader_ != NULL);
+}
+
+Retriever::~Retriever() {}
+
+void Retriever::Retrieve(const std::string& key,
+ const Callback& retrieved) const {
+ new Helper(key, retrieved, lookup_key_util_, *downloader_, storage_.get());
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/retriever.h b/cpp/src/retriever.h
new file mode 100644
index 0000000..17d17ec
--- /dev/null
+++ b/cpp/src/retriever.h
@@ -0,0 +1,74 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object to retrieve data.
+
+#ifndef I18N_ADDRESSINPUT_RETRIEVER_H_
+#define I18N_ADDRESSINPUT_RETRIEVER_H_
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+
+#include "lookup_key_util.h"
+
+namespace i18n {
+namespace addressinput {
+
+class Downloader;
+class Storage;
+class ValidatingStorage;
+
+// Retrieves data. Sample usage:
+// Storage* storage = ...;
+// Downloader* downloader = ...;
+// Retriever retriever("https://i18napis.appspot.com/ssl-address/",
+// downloader, storage);
+// scoped_ptr<Retriever::Callback> retrieved(BuildCallback(
+// this, &MyClass::OnDataRetrieved));
+// retriever.Retrieve("data/CA/AB--fr", *retrieved);
+class Retriever {
+ public:
+ typedef i18n::addressinput::Callback<const std::string&,
+ const std::string&> Callback;
+
+ // Takes ownership of |downloader| and |storage|.
+ Retriever(const std::string& validation_data_url,
+ const Downloader* downloader,
+ Storage* storage);
+ ~Retriever();
+
+ // Retrieves the data for |key| and invokes the |retrieved| callback. Checks
+ // for the data in storage first. If storage does not have the data for |key|,
+ // then downloads the data and places it in storage. If the data in storage is
+ // corrupted, then it's discarded and redownloaded. If the data is stale, then
+ // it's redownloaded. If the download fails, then stale data will be returned
+ // this one time. The next call to Retrieve() will attempt to download fresh
+ // data again.
+ void Retrieve(const std::string& key, const Callback& retrieved) const;
+
+ private:
+ const LookupKeyUtil lookup_key_util_;
+ scoped_ptr<const Downloader> downloader_;
+ scoped_ptr<ValidatingStorage> storage_;
+
+ DISALLOW_COPY_AND_ASSIGN(Retriever);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_RETRIEVER_H_
diff --git a/cpp/src/rule.cc b/cpp/src/rule.cc
new file mode 100644
index 0000000..e25142f
--- /dev/null
+++ b/cpp/src/rule.cc
@@ -0,0 +1,270 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "rule.h"
+
+#include <libaddressinput/address_field.h>
+
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+
+#include "address_field_util.h"
+#include "grit.h"
+#include "messages.h"
+#include "region_data_constants.h"
+#include "util/json.h"
+#include "util/re2ptr.h"
+#include "util/string_split.h"
+
+#include <re2/re2.h>
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+typedef std::map<std::string, int> NameMessageIdMap;
+
+const char kAdminAreaNameTypeKey[] = "state_name_type";
+const char kFormatKey[] = "fmt";
+const char kIdKey[] = "id";
+const char kLanguagesKey[] = "languages";
+const char kLatinFormatKey[] = "lfmt";
+const char kLatinNameKey[] = "lname";
+const char kNameKey[] = "name";
+const char kPostalCodeNameTypeKey[] = "zip_name_type";
+const char kRequireKey[] = "require";
+const char kSubKeysKey[] = "sub_keys";
+const char kZipKey[] = "zip";
+const char kPostalCodeExampleKey[] = "zipex";
+const char kPostServiceUrlKey[] = "posturl";
+
+// Used as a separator in a list of items. For example, the list of supported
+// languages can be "de~fr~it".
+const char kSeparator = '~';
+
+NameMessageIdMap InitAdminAreaMessageIds() {
+ NameMessageIdMap message_ids;
+ message_ids.insert(std::make_pair(
+ "area", IDS_LIBADDRESSINPUT_AREA));
+ message_ids.insert(std::make_pair(
+ "county", IDS_LIBADDRESSINPUT_COUNTY));
+ message_ids.insert(std::make_pair(
+ "department", IDS_LIBADDRESSINPUT_DEPARTMENT));
+ message_ids.insert(std::make_pair(
+ "district", IDS_LIBADDRESSINPUT_DISTRICT));
+ message_ids.insert(std::make_pair(
+ "do_si", IDS_LIBADDRESSINPUT_DO_SI));
+ message_ids.insert(std::make_pair(
+ "emirate", IDS_LIBADDRESSINPUT_EMIRATE));
+ message_ids.insert(std::make_pair(
+ "island", IDS_LIBADDRESSINPUT_ISLAND));
+ message_ids.insert(std::make_pair(
+ "parish", IDS_LIBADDRESSINPUT_PARISH));
+ message_ids.insert(std::make_pair(
+ "prefecture", IDS_LIBADDRESSINPUT_PREFECTURE));
+ message_ids.insert(std::make_pair(
+ "province", IDS_LIBADDRESSINPUT_PROVINCE));
+ message_ids.insert(std::make_pair(
+ "state", IDS_LIBADDRESSINPUT_STATE));
+ return message_ids;
+}
+
+const NameMessageIdMap& GetAdminAreaMessageIds() {
+ static const NameMessageIdMap kAdminAreaMessageIds(InitAdminAreaMessageIds());
+ return kAdminAreaMessageIds;
+}
+
+NameMessageIdMap InitPostalCodeMessageIds() {
+ NameMessageIdMap message_ids;
+ message_ids.insert(std::make_pair(
+ "postal", IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL));
+ message_ids.insert(std::make_pair(
+ "zip", IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL));
+ return message_ids;
+}
+
+const NameMessageIdMap& GetPostalCodeMessageIds() {
+ static const NameMessageIdMap kPostalCodeMessageIds(
+ InitPostalCodeMessageIds());
+ return kPostalCodeMessageIds;
+}
+
+int GetMessageIdFromName(const std::string& name,
+ const NameMessageIdMap& message_ids) {
+ NameMessageIdMap::const_iterator it = message_ids.find(name);
+ return it != message_ids.end() ? it->second : INVALID_MESSAGE_ID;
+}
+
+// Determines whether a given string is a reg-exp or a string. We consider a
+// string to be anything that doesn't contain characters with special meanings
+// in regular expressions - (, [, \, {, ?. These special characters are all the
+// ones that appear in the postal code regular expressions.
+bool ContainsRegExSpecialCharacters(const std::string& input) {
+ return input.find_first_of("([\\{?") != std::string::npos;
+}
+
+} // namespace
+
+Rule::Rule()
+ : id_(),
+ format_(),
+ latin_format_(),
+ required_(),
+ sub_keys_(),
+ languages_(),
+ postal_code_matcher_(NULL),
+ sole_postal_code_(),
+ admin_area_name_message_id_(INVALID_MESSAGE_ID),
+ postal_code_name_message_id_(INVALID_MESSAGE_ID),
+ name_(),
+ latin_name_(),
+ postal_code_example_(),
+ post_service_url_() {}
+
+Rule::~Rule() {}
+
+// static
+const Rule& Rule::GetDefault() {
+ // Allocated once and leaked on shutdown.
+ static Rule* default_rule = NULL;
+ if (default_rule == NULL) {
+ default_rule = new Rule;
+ default_rule->ParseSerializedRule(
+ RegionDataConstants::GetDefaultRegionData());
+ }
+ return *default_rule;
+}
+
+void Rule::CopyFrom(const Rule& rule) {
+ id_ = rule.id_;
+ format_ = rule.format_;
+ latin_format_ = rule.latin_format_;
+ required_ = rule.required_;
+ sub_keys_ = rule.sub_keys_;
+ languages_ = rule.languages_;
+ postal_code_matcher_.reset(
+ rule.postal_code_matcher_ == NULL
+ ? NULL
+ : new RE2ptr(new RE2(rule.postal_code_matcher_->ptr->pattern(),
+ rule.postal_code_matcher_->ptr->options())));
+ sole_postal_code_ = rule.sole_postal_code_;
+ admin_area_name_message_id_ = rule.admin_area_name_message_id_;
+ postal_code_name_message_id_ = rule.postal_code_name_message_id_;
+ name_ = rule.name_;
+ latin_name_ = rule.latin_name_;
+ postal_code_example_ = rule.postal_code_example_;
+ post_service_url_ = rule.post_service_url_;
+}
+
+bool Rule::ParseSerializedRule(const std::string& serialized_rule) {
+ Json json;
+ if (!json.ParseObject(serialized_rule)) {
+ return false;
+ }
+ ParseJsonRule(json);
+ return true;
+}
+
+void Rule::ParseJsonRule(const Json& json) {
+ if (json.HasStringValueForKey(kIdKey)) {
+ id_ = json.GetStringValueForKey(kIdKey);
+ }
+
+ if (json.HasStringValueForKey(kFormatKey)) {
+ ParseFormatRule(json.GetStringValueForKey(kFormatKey), &format_);
+ }
+
+ if (json.HasStringValueForKey(kLatinFormatKey)) {
+ ParseFormatRule(json.GetStringValueForKey(kLatinFormatKey), &latin_format_);
+ }
+
+ if (json.HasStringValueForKey(kRequireKey)) {
+ ParseAddressFieldsRequired(
+ json.GetStringValueForKey(kRequireKey), &required_);
+ }
+
+ if (json.HasStringValueForKey(kSubKeysKey)) {
+ SplitString(
+ json.GetStringValueForKey(kSubKeysKey), kSeparator, &sub_keys_);
+ }
+
+ if (json.HasStringValueForKey(kLanguagesKey)) {
+ SplitString(
+ json.GetStringValueForKey(kLanguagesKey), kSeparator, &languages_);
+ }
+
+ sole_postal_code_.clear();
+ if (json.HasStringValueForKey(kZipKey)) {
+ const std::string& zip = json.GetStringValueForKey(kZipKey);
+ // The "zip" field in the JSON data is used in two different ways to
+ // validate the postal code. At the country level, the "zip" field indicates
+ // a Java compatible regular expression corresponding to all postal codes in
+ // the country. At other levels, the regular expression indicates the postal
+ // code prefix expected for addresses in that region.
+ //
+ // In order to make the RE2 object created from the "zip" field useable for
+ // both these purposes, the pattern string is here prefixed with "^" to
+ // anchor it at the beginning of the string so that it can be used with
+ // RE2::PartialMatch() to perform prefix matching or else with
+ // RE2::FullMatch() to perform matching against the entire string.
+ RE2::Options options;
+ options.set_never_capture(true);
+ RE2* matcher = new RE2("^(" + zip + ")", options);
+ if (matcher->ok()) {
+ postal_code_matcher_.reset(new RE2ptr(matcher));
+ } else {
+ postal_code_matcher_.reset(NULL);
+ delete matcher;
+ }
+ // If the "zip" field is not a regular expression, then it is the sole
+ // postal code for this rule.
+ if (!ContainsRegExSpecialCharacters(zip)) {
+ sole_postal_code_ = zip;
+ }
+ }
+
+ if (json.HasStringValueForKey(kAdminAreaNameTypeKey)) {
+ admin_area_name_message_id_ =
+ GetMessageIdFromName(json.GetStringValueForKey(kAdminAreaNameTypeKey),
+ GetAdminAreaMessageIds());
+ }
+
+ if (json.HasStringValueForKey(kPostalCodeNameTypeKey)) {
+ postal_code_name_message_id_ =
+ GetMessageIdFromName(json.GetStringValueForKey(kPostalCodeNameTypeKey),
+ GetPostalCodeMessageIds());
+ }
+
+ if (json.HasStringValueForKey(kNameKey)) {
+ name_ = json.GetStringValueForKey(kNameKey);
+ }
+
+ if (json.HasStringValueForKey(kLatinNameKey)) {
+ latin_name_ = json.GetStringValueForKey(kLatinNameKey);
+ }
+
+ if (json.HasStringValueForKey(kPostalCodeExampleKey)) {
+ postal_code_example_ = json.GetStringValueForKey(kPostalCodeExampleKey);
+ }
+
+ if (json.HasStringValueForKey(kPostServiceUrlKey)) {
+ post_service_url_ = json.GetStringValueForKey(kPostServiceUrlKey);
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/rule.h b/cpp/src/rule.h
new file mode 100644
index 0000000..c722932
--- /dev/null
+++ b/cpp/src/rule.h
@@ -0,0 +1,156 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object to store address metadata, describing the addressing rules for
+// regions and sub-regions. The address metadata format is documented here:
+//
+// https://code.google.com/p/libaddressinput/wiki/AddressValidationMetadata
+
+#ifndef I18N_ADDRESSINPUT_RULE_H_
+#define I18N_ADDRESSINPUT_RULE_H_
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+#include <vector>
+
+#include "format_element.h"
+
+namespace i18n {
+namespace addressinput {
+
+class Json;
+class RE2ptr;
+
+// Stores address metadata addressing rules, to be used for determining the
+// layout of an address input widget or for address validation. Sample usage:
+// Rule rule;
+// if (rule.ParseSerializedRule("{\"fmt\": \"%A%n%C%S %Z\"}")) {
+// Process(rule.GetFormat());
+// }
+class Rule {
+ public:
+ Rule();
+ ~Rule();
+
+ // Returns the default rule at a country level. If a country does not specify
+ // address format, for example, then the format from this rule should be used
+ // instead.
+ static const Rule& GetDefault();
+
+ // Copies all data from |rule|.
+ void CopyFrom(const Rule& rule);
+
+ // Parses |serialized_rule|. Returns |true| if the |serialized_rule| has valid
+ // format (JSON dictionary).
+ bool ParseSerializedRule(const std::string& serialized_rule);
+
+ // Reads data from |json|, which must already have parsed a serialized rule.
+ void ParseJsonRule(const Json& json);
+
+ // Returns the ID string for this rule.
+ const std::string& GetId() const { return id_; }
+
+ // Returns the format elements for this rule. The format can include the
+ // relevant address fields, but also strings used for formatting, or newline
+ // information.
+ const std::vector<FormatElement>& GetFormat() const { return format_; }
+
+ // Returns the approximate address format with the Latin order of fields. The
+ // format can include the relevant address fields, but also strings used for
+ // formatting, or newline information.
+ const std::vector<FormatElement>& GetLatinFormat() const {
+ return latin_format_;
+ }
+
+ // Returns the required fields for this rule.
+ const std::vector<AddressField>& GetRequired() const { return required_; }
+
+ // Returns the sub-keys for this rule, which are the administrative areas of a
+ // country, the localities of an administrative area, or the dependent
+ // localities of a locality. For example, the rules for "US" have sub-keys of
+ // "CA", "NY", "TX", etc.
+ const std::vector<std::string>& GetSubKeys() const { return sub_keys_; }
+
+ // Returns all of the language tags supported by this rule, for example ["de",
+ // "fr", "it"].
+ const std::vector<std::string>& GetLanguages() const { return languages_; }
+
+ // Returns a pointer to a RE2 regular expression object created from the
+ // postal code format string, if specified, or NULL otherwise. The regular
+ // expression is anchored to the beginning of the string so that it can be
+ // used either with RE2::PartialMatch() to perform prefix matching or else
+ // with RE2::FullMatch() to perform matching against the entire string.
+ const RE2ptr* GetPostalCodeMatcher() const {
+ return postal_code_matcher_.get();
+ }
+
+ // Returns the sole postal code for this rule, if there is one.
+ const std::string& GetSolePostalCode() const {
+ return sole_postal_code_;
+ }
+
+ // The message string identifier for admin area name. If not set, then
+ // INVALID_MESSAGE_ID.
+ int GetAdminAreaNameMessageId() const { return admin_area_name_message_id_; }
+
+ // The message string identifier for postal code name. If not set, then
+ // INVALID_MESSAGE_ID.
+ int GetPostalCodeNameMessageId() const {
+ return postal_code_name_message_id_;
+ }
+
+ // Returns the name for the most specific place described by this rule, if
+ // there is one. This is typically set when it differs from the key.
+ const std::string& GetName() const { return name_; }
+
+ // Returns the Latin-script name for the most specific place described by this
+ // rule, if there is one.
+ const std::string& GetLatinName() const { return latin_name_; }
+
+ // Returns the postal code example string for this rule.
+ const std::string& GetPostalCodeExample() const {
+ return postal_code_example_;
+ }
+
+ // Returns the post service URL string for this rule.
+ const std::string& GetPostServiceUrl() const {
+ return post_service_url_;
+ }
+
+ private:
+ std::string id_;
+ std::vector<FormatElement> format_;
+ std::vector<FormatElement> latin_format_;
+ std::vector<AddressField> required_;
+ std::vector<std::string> sub_keys_;
+ std::vector<std::string> languages_;
+ scoped_ptr<const RE2ptr> postal_code_matcher_;
+ std::string sole_postal_code_;
+ int admin_area_name_message_id_;
+ int postal_code_name_message_id_;
+ std::string name_;
+ std::string latin_name_;
+ std::string postal_code_example_;
+ std::string post_service_url_;
+
+ DISALLOW_COPY_AND_ASSIGN(Rule);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_RULE_H_
diff --git a/cpp/src/rule_retriever.cc b/cpp/src/rule_retriever.cc
new file mode 100644
index 0000000..a77c93a
--- /dev/null
+++ b/cpp/src/rule_retriever.cc
@@ -0,0 +1,80 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "rule_retriever.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+
+#include "retriever.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+class Helper {
+ public:
+ Helper(const std::string& key,
+ const RuleRetriever::Callback& rule_ready,
+ const Retriever& data_retriever)
+ : rule_ready_(rule_ready),
+ data_retrieved_(BuildCallback(this, &Helper::OnDataRetrieved)) {
+ data_retriever.Retrieve(key, *data_retrieved_);
+ }
+
+ private:
+ ~Helper() {}
+
+ void OnDataRetrieved(bool success,
+ const std::string& key,
+ const std::string& data) {
+ Rule rule;
+ if (!success) {
+ rule_ready_(false, key, rule);
+ } else {
+ success = rule.ParseSerializedRule(data);
+ rule_ready_(success, key, rule);
+ }
+ delete this;
+ }
+
+ const RuleRetriever::Callback& rule_ready_;
+ scoped_ptr<Retriever::Callback> data_retrieved_;
+
+ DISALLOW_COPY_AND_ASSIGN(Helper);
+};
+
+} // namespace
+
+RuleRetriever::RuleRetriever(const Retriever* retriever)
+ : data_retriever_(retriever) {
+ assert(data_retriever_ != NULL);
+}
+
+RuleRetriever::~RuleRetriever() {}
+
+void RuleRetriever::RetrieveRule(const std::string& key,
+ const Callback& rule_ready) const {
+ new Helper(key, rule_ready, *data_retriever_);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/rule_retriever.h b/cpp/src/rule_retriever.h
new file mode 100644
index 0000000..ba3b4c7
--- /dev/null
+++ b/cpp/src/rule_retriever.h
@@ -0,0 +1,59 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object to retrieve validation rules.
+
+#ifndef I18N_ADDRESSINPUT_RULE_RETRIEVER_H_
+#define I18N_ADDRESSINPUT_RULE_RETRIEVER_H_
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class Retriever;
+class Rule;
+
+// Retrieves validation rules. Sample usage:
+// const Retriever* retriever = ...
+// RuleRetriever rules(retriever);
+// scoped_ptr<RuleRetriever::Callback> rule_ready(BuildCallback(
+// this, &MyClass::OnRuleReady));
+// rules.RetrieveRule("data/CA/AB--fr", *rule_ready);
+class RuleRetriever {
+ public:
+ typedef i18n::addressinput::Callback<const std::string&,
+ const Rule&> Callback;
+
+ // Takes ownership of |retriever|.
+ explicit RuleRetriever(const Retriever* retriever);
+ ~RuleRetriever();
+
+ // Retrieves the rule for |key| and invokes the |rule_ready| callback.
+ void RetrieveRule(const std::string& key, const Callback& rule_ready) const;
+
+ private:
+ scoped_ptr<const Retriever> data_retriever_;
+
+ DISALLOW_COPY_AND_ASSIGN(RuleRetriever);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_RULE_RETRIEVER_H_
diff --git a/cpp/src/util/json.cc b/cpp/src/util/json.cc
new file mode 100644
index 0000000..d819bb2
--- /dev/null
+++ b/cpp/src/util/json.cc
@@ -0,0 +1,196 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "json.h"
+
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <rapidjson/document.h>
+#include <rapidjson/reader.h>
+
+namespace i18n {
+namespace addressinput {
+
+using rapidjson::Document;
+using rapidjson::kParseValidateEncodingFlag;
+using rapidjson::Value;
+
+class Json::JsonImpl {
+ public:
+ // Takes ownership of |document|.
+ explicit JsonImpl(const Document* document)
+ : document_(document), value_(document), dictionaries_() {
+ assert(value_ != NULL);
+ assert(value_->IsObject());
+ BuildKeyList();
+ }
+
+ // Does not take ownership of |value|.
+ explicit JsonImpl(const Value* value)
+ : document_(), value_(value), dictionaries_() {
+ assert(value_ != NULL);
+ assert(value_->IsObject());
+ BuildKeyList();
+ }
+
+ ~JsonImpl() {
+ for (std::map<std::string, const Json*>::const_iterator
+ it = dictionaries_.begin();
+ it != dictionaries_.end(); ++it) {
+ delete it->second;
+ }
+ }
+
+ // The caller does not own the result.
+ const Value::Member* FindMember(const std::string& key) {
+ return value_->FindMember(key.c_str());
+ }
+
+ // The caller does not own the result. The result can be NULL if there's no
+ // dictionary for |key|.
+ const Json* FindDictionary(const std::string& key) const {
+ std::map<std::string, const Json*>::const_iterator it =
+ dictionaries_.find(key);
+ return it != dictionaries_.end() ? it->second : NULL;
+ }
+
+ // Takes ownership of |dictionary|. Should be called only once per |key| and
+ // per |dictionary|.
+ void AddDictionary(const std::string& key, const Json* dictionary) {
+ bool inserted =
+ dictionaries_.insert(std::make_pair(key, dictionary)).second;
+ // Cannot do work inside of assert(), because the compiler can optimize it
+ // away.
+ assert(inserted);
+ // Avoid unused variable warning when assert() is optimized away.
+ (void)inserted;
+ }
+
+ const std::vector<std::string>& GetKeys() const {
+ return keys_;
+ }
+
+ private:
+ void BuildKeyList() {
+ assert(keys_.empty());
+ for (Value::ConstMemberIterator it = value_->MemberBegin();
+ it != value_->MemberEnd(); ++it) {
+ keys_.push_back(it->name.GetString());
+ }
+ }
+
+ // An owned JSON document. Can be NULL if the JSON document is not owned.
+ //
+ // When a JsonImpl object is constructed using a Document object, then
+ // JsonImpl is supposed to take ownership of that object, making sure to
+ // delete it in its own destructor. But when a JsonImpl object is constructed
+ // using a Value object, then that object is owned by a Member object which is
+ // owned by a Document object, and should therefore not be deleted by
+ // JsonImpl.
+ const scoped_ptr<const Document> document_;
+
+ // A JSON document that is not owned. Cannot be NULL. Can point to document_.
+ const Value* const value_;
+
+ // Owned JSON objects.
+ std::map<std::string, const Json*> dictionaries_;
+
+ std::vector<std::string> keys_;
+
+ DISALLOW_COPY_AND_ASSIGN(JsonImpl);
+};
+
+Json::Json() {}
+
+Json::~Json() {}
+
+bool Json::ParseObject(const std::string& json) {
+ assert(impl_ == NULL);
+ scoped_ptr<Document> document(new Document);
+ document->Parse<kParseValidateEncodingFlag>(json.c_str());
+ bool valid = !document->HasParseError() && document->IsObject();
+ if (valid) {
+ impl_.reset(new JsonImpl(document.release()));
+ }
+ return valid;
+}
+
+const std::vector<std::string>& Json::GetKeys() const {
+ assert(impl_ != NULL);
+ return impl_->GetKeys();
+}
+
+bool Json::HasStringValueForKey(const std::string& key) const {
+ assert(impl_ != NULL);
+
+ // Member is owned by impl_.
+ const Value::Member* member = impl_->FindMember(key);
+ return member != NULL && member->value.IsString();
+}
+
+std::string Json::GetStringValueForKey(const std::string& key) const {
+ assert(impl_ != NULL);
+
+ // Member is owned by impl_.
+ const Value::Member* member = impl_->FindMember(key.c_str());
+ assert(member != NULL);
+ assert(member->value.IsString());
+ return std::string(member->value.GetString(),
+ member->value.GetStringLength());
+}
+
+bool Json::HasDictionaryValueForKey(const std::string& key) const {
+ assert(impl_ != NULL);
+
+ // The value returned by FindDictionary() is owned by impl_.
+ if (impl_->FindDictionary(key) != NULL) {
+ return true;
+ }
+
+ // Member is owned by impl_.
+ const Value::Member* member = impl_->FindMember(key);
+ return member != NULL && member->value.IsObject();
+}
+
+const Json& Json::GetDictionaryValueForKey(const std::string& key) const {
+ assert(impl_ != NULL);
+
+ // Existing_dictionary is owned by impl_.
+ const Json* existing_dictionary = impl_->FindDictionary(key);
+ if (existing_dictionary != NULL) {
+ return *existing_dictionary;
+ }
+
+ // Member is owned by impl_.
+ const Value::Member* member = impl_->FindMember(key);
+ assert(member != NULL);
+ assert(member->value.IsObject());
+
+ // Dictionary is owned by impl_.
+ Json* dictionary = new Json;
+ dictionary->impl_.reset(new JsonImpl(&member->value));
+ impl_->AddDictionary(key, dictionary);
+ return *dictionary;
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/util/json.h b/cpp/src/util/json.h
new file mode 100644
index 0000000..1fbf500
--- /dev/null
+++ b/cpp/src/util/json.h
@@ -0,0 +1,76 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_UTIL_JSON_H_
+#define I18N_ADDRESSINPUT_UTIL_JSON_H_
+
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+// Parses a JSON dictionary of strings. Sample usage:
+// Json json;
+// if (json.ParseObject("{'key1':'value1', 'key2':'value2'}") &&
+// json.HasStringKey("key1")) {
+// Process(json.GetStringValueForKey("key1"));
+// }
+class Json {
+ public:
+ Json();
+ ~Json();
+
+ // Parses the |json| string and returns true if |json| is valid and it is an
+ // object.
+ bool ParseObject(const std::string& json);
+
+ // Returns the list of keys in the parsed JSON. The JSON object must be parsed
+ // successfully in ParseObject() before invoking this method.
+ const std::vector<std::string>& GetKeys() const;
+
+ // Returns true if the parsed JSON contains a string value for |key|. The JSON
+ // object must be parsed successfully in ParseObject() before invoking this
+ // method.
+ bool HasStringValueForKey(const std::string& key) const;
+
+ // Returns the string value for the |key|. The |key| must be present and its
+ // value must be of string type, i.e., HasStringValueForKey(key) must return
+ // true before invoking this method.
+ std::string GetStringValueForKey(const std::string& key) const;
+
+ // Returns true if the parsed JSON contains a dictionary value for |key|. The
+ // JSON object must be parsed successfully in ParseObject() before invoking
+ // this method.
+ bool HasDictionaryValueForKey(const std::string& key) const;
+
+ // Returns the dictionary value for the |key|. The |key| must be present and
+ // its value must be of the dictionary type, i.e., HasDictionaryValueForKey()
+ // must return true before invoking this method.
+ const Json& GetDictionaryValueForKey(const std::string& key) const;
+
+ private:
+ class JsonImpl;
+ scoped_ptr<JsonImpl> impl_;
+
+ DISALLOW_COPY_AND_ASSIGN(Json);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_JSON_H_
diff --git a/cpp/src/util/md5.cc b/cpp/src/util/md5.cc
new file mode 100644
index 0000000..4a629d0
--- /dev/null
+++ b/cpp/src/util/md5.cc
@@ -0,0 +1,299 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/md5.cc?revision=94203
+
+// The original file was copied from sqlite, and was in the public domain.
+
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to MD5Init, call MD5Update as
+ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+#include "md5.h"
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <string>
+
+namespace {
+
+struct Context {
+ uint32 buf[4];
+ uint32 bits[2];
+ unsigned char in[64];
+};
+
+/*
+ * Note: this code is harmless on little-endian machines.
+ */
+void byteReverse(unsigned char *buf, unsigned longs) {
+ uint32 t;
+ do {
+ t = (uint32)((unsigned)buf[3]<<8 | buf[2]) << 16 |
+ ((unsigned)buf[1]<<8 | buf[0]);
+ *(uint32 *)buf = t;
+ buf += 4;
+ } while (--longs);
+}
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+void MD5Transform(uint32 buf[4], const uint32 in[16]) {
+ register uint32 a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ MD5STEP(F1, a, b, c, d, in[ 0]+0xd76aa478, 7);
+ MD5STEP(F1, d, a, b, c, in[ 1]+0xe8c7b756, 12);
+ MD5STEP(F1, c, d, a, b, in[ 2]+0x242070db, 17);
+ MD5STEP(F1, b, c, d, a, in[ 3]+0xc1bdceee, 22);
+ MD5STEP(F1, a, b, c, d, in[ 4]+0xf57c0faf, 7);
+ MD5STEP(F1, d, a, b, c, in[ 5]+0x4787c62a, 12);
+ MD5STEP(F1, c, d, a, b, in[ 6]+0xa8304613, 17);
+ MD5STEP(F1, b, c, d, a, in[ 7]+0xfd469501, 22);
+ MD5STEP(F1, a, b, c, d, in[ 8]+0x698098d8, 7);
+ MD5STEP(F1, d, a, b, c, in[ 9]+0x8b44f7af, 12);
+ MD5STEP(F1, c, d, a, b, in[10]+0xffff5bb1, 17);
+ MD5STEP(F1, b, c, d, a, in[11]+0x895cd7be, 22);
+ MD5STEP(F1, a, b, c, d, in[12]+0x6b901122, 7);
+ MD5STEP(F1, d, a, b, c, in[13]+0xfd987193, 12);
+ MD5STEP(F1, c, d, a, b, in[14]+0xa679438e, 17);
+ MD5STEP(F1, b, c, d, a, in[15]+0x49b40821, 22);
+
+ MD5STEP(F2, a, b, c, d, in[ 1]+0xf61e2562, 5);
+ MD5STEP(F2, d, a, b, c, in[ 6]+0xc040b340, 9);
+ MD5STEP(F2, c, d, a, b, in[11]+0x265e5a51, 14);
+ MD5STEP(F2, b, c, d, a, in[ 0]+0xe9b6c7aa, 20);
+ MD5STEP(F2, a, b, c, d, in[ 5]+0xd62f105d, 5);
+ MD5STEP(F2, d, a, b, c, in[10]+0x02441453, 9);
+ MD5STEP(F2, c, d, a, b, in[15]+0xd8a1e681, 14);
+ MD5STEP(F2, b, c, d, a, in[ 4]+0xe7d3fbc8, 20);
+ MD5STEP(F2, a, b, c, d, in[ 9]+0x21e1cde6, 5);
+ MD5STEP(F2, d, a, b, c, in[14]+0xc33707d6, 9);
+ MD5STEP(F2, c, d, a, b, in[ 3]+0xf4d50d87, 14);
+ MD5STEP(F2, b, c, d, a, in[ 8]+0x455a14ed, 20);
+ MD5STEP(F2, a, b, c, d, in[13]+0xa9e3e905, 5);
+ MD5STEP(F2, d, a, b, c, in[ 2]+0xfcefa3f8, 9);
+ MD5STEP(F2, c, d, a, b, in[ 7]+0x676f02d9, 14);
+ MD5STEP(F2, b, c, d, a, in[12]+0x8d2a4c8a, 20);
+
+ MD5STEP(F3, a, b, c, d, in[ 5]+0xfffa3942, 4);
+ MD5STEP(F3, d, a, b, c, in[ 8]+0x8771f681, 11);
+ MD5STEP(F3, c, d, a, b, in[11]+0x6d9d6122, 16);
+ MD5STEP(F3, b, c, d, a, in[14]+0xfde5380c, 23);
+ MD5STEP(F3, a, b, c, d, in[ 1]+0xa4beea44, 4);
+ MD5STEP(F3, d, a, b, c, in[ 4]+0x4bdecfa9, 11);
+ MD5STEP(F3, c, d, a, b, in[ 7]+0xf6bb4b60, 16);
+ MD5STEP(F3, b, c, d, a, in[10]+0xbebfbc70, 23);
+ MD5STEP(F3, a, b, c, d, in[13]+0x289b7ec6, 4);
+ MD5STEP(F3, d, a, b, c, in[ 0]+0xeaa127fa, 11);
+ MD5STEP(F3, c, d, a, b, in[ 3]+0xd4ef3085, 16);
+ MD5STEP(F3, b, c, d, a, in[ 6]+0x04881d05, 23);
+ MD5STEP(F3, a, b, c, d, in[ 9]+0xd9d4d039, 4);
+ MD5STEP(F3, d, a, b, c, in[12]+0xe6db99e5, 11);
+ MD5STEP(F3, c, d, a, b, in[15]+0x1fa27cf8, 16);
+ MD5STEP(F3, b, c, d, a, in[ 2]+0xc4ac5665, 23);
+
+ MD5STEP(F4, a, b, c, d, in[ 0]+0xf4292244, 6);
+ MD5STEP(F4, d, a, b, c, in[ 7]+0x432aff97, 10);
+ MD5STEP(F4, c, d, a, b, in[14]+0xab9423a7, 15);
+ MD5STEP(F4, b, c, d, a, in[ 5]+0xfc93a039, 21);
+ MD5STEP(F4, a, b, c, d, in[12]+0x655b59c3, 6);
+ MD5STEP(F4, d, a, b, c, in[ 3]+0x8f0ccc92, 10);
+ MD5STEP(F4, c, d, a, b, in[10]+0xffeff47d, 15);
+ MD5STEP(F4, b, c, d, a, in[ 1]+0x85845dd1, 21);
+ MD5STEP(F4, a, b, c, d, in[ 8]+0x6fa87e4f, 6);
+ MD5STEP(F4, d, a, b, c, in[15]+0xfe2ce6e0, 10);
+ MD5STEP(F4, c, d, a, b, in[ 6]+0xa3014314, 15);
+ MD5STEP(F4, b, c, d, a, in[13]+0x4e0811a1, 21);
+ MD5STEP(F4, a, b, c, d, in[ 4]+0xf7537e82, 6);
+ MD5STEP(F4, d, a, b, c, in[11]+0xbd3af235, 10);
+ MD5STEP(F4, c, d, a, b, in[ 2]+0x2ad7d2bb, 15);
+ MD5STEP(F4, b, c, d, a, in[ 9]+0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+} // namespace
+
+namespace i18n {
+namespace addressinput {
+
+/*
+ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
+ * initialization constants.
+ */
+void MD5Init(MD5Context* context) {
+ struct Context *ctx = (struct Context *)context;
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void MD5Update(MD5Context* context, const std::string& data) {
+ const unsigned char* inbuf = (const unsigned char*)data.data();
+ size_t len = data.size();
+ struct Context *ctx = (struct Context *)context;
+ const unsigned char* buf = (const unsigned char*)inbuf;
+ uint32 t;
+
+ /* Update bitcount */
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + ((uint32)len << 3)) < t)
+ ctx->bits[1]++; /* Carry from low to high */
+ ctx->bits[1] += static_cast<uint32>(len >> 29);
+
+ t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
+
+ /* Handle any leading odd-sized chunks */
+
+ if (t) {
+ unsigned char *p = (unsigned char *)ctx->in + t;
+
+ t = 64-t;
+ if (len < t) {
+ memcpy(p, buf, len);
+ return;
+ }
+ memcpy(p, buf, t);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *)ctx->in);
+ buf += t;
+ len -= t;
+ }
+
+ /* Process data in 64-byte chunks */
+
+ while (len >= 64) {
+ memcpy(ctx->in, buf, 64);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *)ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ /* Handle any remaining bytes of data. */
+
+ memcpy(ctx->in, buf, len);
+}
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+void MD5Final(MD5Digest* digest, MD5Context* context) {
+ struct Context *ctx = (struct Context *)context;
+ unsigned count;
+ unsigned char *p;
+
+ /* Compute number of bytes mod 64 */
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ /* Set the first char of padding to 0x80. This is safe since there is
+ always at least one byte free */
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ /* Bytes of padding needed to make 64 bytes */
+ count = 64 - 1 - count;
+
+ /* Pad out to 56 mod 64 */
+ if (count < 8) {
+ /* Two lots of padding: Pad the first block to 64 bytes */
+ memset(p, 0, count);
+ byteReverse(ctx->in, 16);
+ MD5Transform(ctx->buf, (uint32 *)ctx->in);
+
+ /* Now fill the next block with 56 bytes */
+ memset(ctx->in, 0, 56);
+ } else {
+ /* Pad block to 56 bytes */
+ memset(p, 0, count-8);
+ }
+ byteReverse(ctx->in, 14);
+
+ /* Append length in bits and transform */
+ ((uint32 *)ctx->in)[ 14 ] = ctx->bits[0];
+ ((uint32 *)ctx->in)[ 15 ] = ctx->bits[1];
+
+ MD5Transform(ctx->buf, (uint32 *)ctx->in);
+ byteReverse((unsigned char *)ctx->buf, 4);
+ memcpy(digest->a, ctx->buf, 16);
+ memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
+}
+
+std::string MD5DigestToBase16(const MD5Digest& digest) {
+ static char const zEncode[] = "0123456789abcdef";
+
+ std::string ret;
+ ret.resize(32);
+
+ int j = 0;
+ for (int i = 0; i < 16; i ++) {
+ int a = digest.a[i];
+ ret[j++] = zEncode[(a>>4)&0xf];
+ ret[j++] = zEncode[a & 0xf];
+ }
+ return ret;
+}
+
+void MD5Sum(const void* data, size_t length, MD5Digest* digest) {
+ MD5Context ctx;
+ MD5Init(&ctx);
+ MD5Update(&ctx,
+ std::string(reinterpret_cast<const char*>(data), length));
+ MD5Final(digest, &ctx);
+}
+
+std::string MD5String(const std::string& str) {
+ MD5Digest digest;
+ MD5Sum(str.data(), str.length(), &digest);
+ return MD5DigestToBase16(digest);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/util/md5.h b/cpp/src/util/md5.h
new file mode 100644
index 0000000..8d05301
--- /dev/null
+++ b/cpp/src/util/md5.h
@@ -0,0 +1,73 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/md5.h?revision=94203
+
+#ifndef I18N_ADDRESSINPUT_UTIL_MD5_H_
+#define I18N_ADDRESSINPUT_UTIL_MD5_H_
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// MD5 stands for Message Digest algorithm 5.
+// MD5 is a robust hash function, designed for cyptography, but often used
+// for file checksums. The code is complex and slow, but has few
+// collisions.
+// See Also:
+// http://en.wikipedia.org/wiki/MD5
+
+// These functions perform MD5 operations. The simplest call is MD5Sum() to
+// generate the MD5 sum of the given data.
+//
+// You can also compute the MD5 sum of data incrementally by making multiple
+// calls to MD5Update():
+// MD5Context ctx; // intermediate MD5 data: do not use
+// MD5Init(&ctx);
+// MD5Update(&ctx, data1, length1);
+// MD5Update(&ctx, data2, length2);
+// ...
+//
+// MD5Digest digest; // the result of the computation
+// MD5Final(&digest, &ctx);
+//
+// You can call MD5DigestToBase16() to generate a string of the digest.
+
+// The output of an MD5 operation.
+struct MD5Digest {
+ unsigned char a[16];
+};
+
+// Used for storing intermediate data during an MD5 computation. Callers
+// should not access the data.
+typedef char MD5Context[88];
+
+// Computes the MD5 sum of the given data buffer with the given length.
+// The given 'digest' structure will be filled with the result data.
+void MD5Sum(const void* data, size_t length, MD5Digest* digest);
+
+// Initializes the given MD5 context structure for subsequent calls to
+// MD5Update().
+void MD5Init(MD5Context* context);
+
+// For the given buffer of |data| as a StringPiece, updates the given MD5
+// context with the sum of the data. You can call this any number of times
+// during the computation, except that MD5Init() must have been called first.
+void MD5Update(MD5Context* context, const std::string& data);
+
+// Finalizes the MD5 operation and fills the buffer with the digest.
+void MD5Final(MD5Digest* digest, MD5Context* context);
+
+// Converts a digest into human-readable hexadecimal.
+std::string MD5DigestToBase16(const MD5Digest& digest);
+
+// Returns the MD5 (in hexadecimal) of a string.
+std::string MD5String(const std::string& str);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_MD5_H_
diff --git a/cpp/src/util/re2ptr.h b/cpp/src/util/re2ptr.h
new file mode 100644
index 0000000..e04bcfd
--- /dev/null
+++ b/cpp/src/util/re2ptr.h
@@ -0,0 +1,46 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Work-around for problems with the RE2 library. Must be the first #include
+// statement in the compilation unit. Do not #include in other header files.
+
+#ifndef I18N_ADDRESSINPUT_UTIL_RE2PTR_H_
+#define I18N_ADDRESSINPUT_UTIL_RE2PTR_H_
+
+// RE2 will, in some environments, define class RE2 inside namespace re2 and
+// then have a public "using re2::RE2;" statement to bring that definition into
+// the root namespace, while in other environments it will define class RE2
+// directly in the root namespace.
+//
+// Because of that, it's impossible to write a portable forward declaration of
+// class RE2.
+//
+// The work-around in this file works by wrapping pointers to RE2 object in the
+// simple struct RE2ptr, which is trivial to forward declare.
+
+#include <re2/re2.h>
+
+namespace i18n {
+namespace addressinput {
+
+struct RE2ptr {
+ RE2ptr(RE2* init_ptr) : ptr(init_ptr) {}
+ ~RE2ptr() { delete ptr; }
+ RE2* const ptr;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_RE2PTR_H_
diff --git a/cpp/src/util/string_compare.cc b/cpp/src/util/string_compare.cc
new file mode 100644
index 0000000..c63b138
--- /dev/null
+++ b/cpp/src/util/string_compare.cc
@@ -0,0 +1,56 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "re2ptr.h" // Must be the first #include statement!
+
+#include "string_compare.h"
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class StringCompare::Impl {
+ public:
+ Impl() {
+ options_.set_literal(true);
+ options_.set_case_sensitive(false);
+ }
+
+ ~Impl() {}
+
+ bool NaturalEquals(const std::string& a, const std::string& b) const {
+ RE2 matcher(b, options_);
+ return RE2::FullMatch(a, matcher);
+ }
+
+ private:
+ RE2::Options options_;
+
+ DISALLOW_COPY_AND_ASSIGN(Impl);
+};
+
+StringCompare::StringCompare() : impl_(new Impl) {}
+
+StringCompare::~StringCompare() {}
+
+bool StringCompare::NaturalEquals(const std::string& a,
+ const std::string& b) const {
+ return impl_->NaturalEquals(a, b);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/util/string_compare.h b/cpp/src/util/string_compare.h
new file mode 100644
index 0000000..9d530fa
--- /dev/null
+++ b/cpp/src/util/string_compare.h
@@ -0,0 +1,46 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_UTIL_STRING_COMPARE_H_
+#define I18N_ADDRESSINPUT_UTIL_STRING_COMPARE_H_
+
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+class StringCompare {
+ public:
+ StringCompare();
+ ~StringCompare();
+
+ // Returns true if a human reader would consider |a| and |b| to be "the same".
+ // Libaddressinput itself isn't really concerned about how this is done. This
+ // default implementation just does case insensitive string matching.
+ bool NaturalEquals(const std::string& a, const std::string& b) const;
+
+ private:
+ class Impl;
+ scoped_ptr<Impl> impl_;
+
+ DISALLOW_COPY_AND_ASSIGN(StringCompare);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_STRING_COMPARE_H_
diff --git a/cpp/src/util/string_split.cc b/cpp/src/util/string_split.cc
new file mode 100644
index 0000000..114cd92
--- /dev/null
+++ b/cpp/src/util/string_split.cc
@@ -0,0 +1,37 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/strings/string_split.cc?revision=216633
+
+#include "string_split.h"
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+void SplitString(const std::string& str, char s, std::vector<std::string>* r) {
+ assert(r != NULL);
+ r->clear();
+ size_t last = 0;
+ size_t c = str.size();
+ for (size_t i = 0; i <= c; ++i) {
+ if (i == c || str[i] == s) {
+ std::string tmp(str, last, i - last);
+ // Avoid converting an empty or all-whitespace source string into a vector
+ // of one empty string.
+ if (i != c || !r->empty() || !tmp.empty()) {
+ r->push_back(tmp);
+ }
+ last = i + 1;
+ }
+ }
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/util/string_split.h b/cpp/src/util/string_split.h
new file mode 100644
index 0000000..6809296
--- /dev/null
+++ b/cpp/src/util/string_split.h
@@ -0,0 +1,34 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/strings/string_split.h?revision=236210
+//
+// Modifications from original:
+// 1) Supports only std::string type.
+// 2) Does not trim whitespace.
+
+#ifndef I18N_ADDRESSINPUT_UTIL_STRING_SPLIT_H_
+#define I18N_ADDRESSINPUT_UTIL_STRING_SPLIT_H_
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+// Splits |str| into a vector of strings delimited by |c|, placing the results
+// in |r|. If several instances of |c| are contiguous, or if |str| begins with
+// or ends with |c|, then an empty string is inserted.
+//
+// |str| should not be in a multi-byte encoding like Shift-JIS or GBK in which
+// the trailing byte of a multi-byte character can be in the ASCII range.
+// UTF-8, and other single/multi-byte ASCII-compatible encodings are OK.
+// Note: |c| must be in the ASCII range.
+void SplitString(const std::string& str, char c, std::vector<std::string>* r);
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_STRING_SPLIT_H_
diff --git a/cpp/src/util/string_util.cc b/cpp/src/util/string_util.cc
new file mode 100644
index 0000000..18d0a87
--- /dev/null
+++ b/cpp/src/util/string_util.cc
@@ -0,0 +1,69 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/strings/string_util.cc?revision=268754
+//
+// Modified to contain only the DoReplaceStringPlaceholders() that works with
+// std::string. Replaced DCHECK() with assert() and removed offsets.
+
+#include "string_util.h"
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <algorithm>
+#include <cassert>
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+std::string DoReplaceStringPlaceholders(const std::string& format_string,
+ const std::vector<std::string>& subst) {
+ size_t substitutions = subst.size();
+
+ size_t sub_length = 0;
+ for (std::vector<std::string>::const_iterator iter = subst.begin();
+ iter != subst.end(); ++iter) {
+ sub_length += iter->length();
+ }
+
+ std::string formatted;
+ formatted.reserve(format_string.length() + sub_length);
+
+ for (std::string::const_iterator i = format_string.begin();
+ i != format_string.end(); ++i) {
+ if ('$' == *i) {
+ if (i + 1 != format_string.end()) {
+ ++i;
+ assert('$' == *i || '1' <= *i);
+ if ('$' == *i) {
+ while (i != format_string.end() && '$' == *i) {
+ formatted.push_back('$');
+ ++i;
+ }
+ --i;
+ } else {
+ uintptr_t index = 0;
+ while (i != format_string.end() && '0' <= *i && *i <= '9') {
+ index *= 10;
+ index += *i - '0';
+ ++i;
+ }
+ --i;
+ index -= 1;
+ if (index < substitutions)
+ formatted.append(subst.at(index));
+ }
+ }
+ } else {
+ formatted.push_back(*i);
+ }
+ }
+ return formatted;
+}
+
+} // addressinput
+} // i18n
diff --git a/cpp/src/util/string_util.h b/cpp/src/util/string_util.h
new file mode 100644
index 0000000..4266347
--- /dev/null
+++ b/cpp/src/util/string_util.h
@@ -0,0 +1,28 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// This file defines utility functions for working with strings.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/strings/string_util.h?revision=268754
+//
+// Modified to contain only DoReplaceStringPlaceholders() that works only with
+// std::string.
+
+#ifndef I18N_ADDRESSINPUT_UTIL_STRING_UTIL_H_
+#define I18N_ADDRESSINPUT_UTIL_STRING_UTIL_H_
+
+#include <string>
+#include <vector>
+
+namespace i18n {
+namespace addressinput {
+
+std::string DoReplaceStringPlaceholders(const std::string& format_string,
+ const std::vector<std::string>& subst);
+
+} // addressinput
+} // i18n
+
+#endif // I18N_ADDRESSINPUT_UTIL_STRING_UTIL_H_
diff --git a/cpp/src/validating_storage.cc b/cpp/src/validating_storage.cc
new file mode 100644
index 0000000..7dc231c
--- /dev/null
+++ b/cpp/src/validating_storage.cc
@@ -0,0 +1,97 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// ValidatingStorage saves data with checksum and timestamp using
+// ValidatingUtil.
+
+#include "validating_storage.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cassert>
+#include <cstddef>
+#include <ctime>
+#include <string>
+
+#include "validating_util.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+class Helper {
+ public:
+ Helper(const std::string& key,
+ const ValidatingStorage::Callback& data_ready,
+ const Storage& wrapped_storage)
+ : data_ready_(data_ready),
+ wrapped_data_ready_(BuildCallback(this, &Helper::OnWrappedDataReady)) {
+ wrapped_storage.Get(key, *wrapped_data_ready_);
+ }
+
+ private:
+ ~Helper() {}
+
+ void OnWrappedDataReady(bool success,
+ const std::string& key,
+ std::string* data) {
+ if (success) {
+ assert(data != NULL);
+ bool is_stale = !ValidatingUtil::UnwrapTimestamp(data, time(NULL));
+ bool is_corrupted = !ValidatingUtil::UnwrapChecksum(data);
+ success = !is_corrupted && !is_stale;
+ if (is_corrupted) {
+ delete data;
+ data = NULL;
+ }
+ } else {
+ delete data;
+ data = NULL;
+ }
+ data_ready_(success, key, data);
+ delete this;
+ }
+
+ const Storage::Callback& data_ready_;
+ scoped_ptr<Storage::Callback> wrapped_data_ready_;
+
+ DISALLOW_COPY_AND_ASSIGN(Helper);
+};
+
+} // namespace
+
+ValidatingStorage::ValidatingStorage(Storage* storage)
+ : wrapped_storage_(storage) {
+ assert(wrapped_storage_ != NULL);
+}
+
+ValidatingStorage::~ValidatingStorage() {}
+
+void ValidatingStorage::Put(const std::string& key, std::string* data) {
+ assert(data != NULL);
+ ValidatingUtil::Wrap(time(NULL), data);
+ wrapped_storage_->Put(key, data);
+}
+
+void ValidatingStorage::Get(const std::string& key,
+ const Callback& data_ready) const {
+ new Helper(key, data_ready, *wrapped_storage_);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/validating_storage.h b/cpp/src/validating_storage.h
new file mode 100644
index 0000000..11e74cd
--- /dev/null
+++ b/cpp/src/validating_storage.h
@@ -0,0 +1,64 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A wrapper object for Storage that stores data with a checksum and a
+// timestamp. The existence of checksum and timestamp fields is transparent to
+// the user of the object.
+
+#ifndef I18N_ADDRESSINPUT_VALIDATING_STORAGE_H_
+#define I18N_ADDRESSINPUT_VALIDATING_STORAGE_H_
+
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Wraps Storage to add checksum and timestamp to stored data. Sample usage:
+// scoped_ptr<Storage> file_storage = ...;
+// ValidatingStorage storage(file_storage));
+// storage.Put("key", new std::string("data"));
+// scoped_ptr<ValidatingStorage::Callback> data_ready(BuildCallback(
+// this, &MyClass::OnDataReady));
+// storage.Get("key", *data_ready);
+class ValidatingStorage : public Storage {
+ public:
+ // Takes ownership of |storage|.
+ explicit ValidatingStorage(Storage* storage);
+ virtual ~ValidatingStorage();
+
+ // Storage implementation.
+ virtual void Put(const std::string& key, std::string* data);
+
+ // Storage implementation.
+ // If the data is invalid, then |data_ready| will be called with (false, key,
+ // empty-string). If the data is valid, but stale, then |data_ready| will be
+ // called with (false, key, stale-data). If the data is valid and fresh, then
+ // |data_ready| will be called with (true, key, fresh-data).
+ virtual void Get(const std::string& key, const Callback& data_ready) const;
+
+ private:
+ // The storage being wrapped.
+ scoped_ptr<Storage> wrapped_storage_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValidatingStorage);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_VALIDATING_STORAGE_H_
diff --git a/cpp/src/validating_util.cc b/cpp/src/validating_util.cc
new file mode 100644
index 0000000..6b52e8b
--- /dev/null
+++ b/cpp/src/validating_util.cc
@@ -0,0 +1,141 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// ValidatingUtil wraps data with checksum and timestamp. Format:
+//
+// timestamp=<timestamp>
+// checksum=<checksum>
+// <data>
+//
+// The timestamp is the time_t that was returned from time() function. The
+// timestamp does not need to be portable because it is written and read only by
+// ValidatingUtil. The value is somewhat human-readable: it is the number of
+// seconds since the epoch.
+//
+// The checksum is the 32-character hexadecimal MD5 checksum of <data>. It is
+// meant to protect from random file changes on disk.
+
+#include "validating_util.h"
+
+#include <cassert>
+#include <cstddef>
+#include <cstdio>
+#include <cstdlib>
+#include <ctime>
+#include <string>
+
+#include "util/md5.h"
+
+namespace i18n {
+namespace addressinput {
+
+namespace {
+
+const char kTimestampPrefix[] = "timestamp=";
+const size_t kTimestampPrefixLength = sizeof kTimestampPrefix - 1;
+
+const char kChecksumPrefix[] = "checksum=";
+const size_t kChecksumPrefixLength = sizeof kChecksumPrefix - 1;
+
+const char kSeparator = '\n';
+
+// Places the header value into |header_value| parameter and erases the header
+// from |data|. Returns |true| if the header format is valid.
+bool UnwrapHeader(const char* header_prefix,
+ size_t header_prefix_length,
+ std::string* data,
+ std::string* header_value) {
+ assert(header_prefix != NULL);
+ assert(data != NULL);
+ assert(header_value != NULL);
+
+ if (data->compare(
+ 0, header_prefix_length, header_prefix, header_prefix_length) != 0) {
+ return false;
+ }
+
+ std::string::size_type separator_position =
+ data->find(kSeparator, header_prefix_length);
+ if (separator_position == std::string::npos) {
+ return false;
+ }
+
+ header_value->assign(
+ *data, header_prefix_length, separator_position - header_prefix_length);
+ data->erase(0, separator_position + 1);
+
+ return true;
+}
+
+} // namespace
+
+// static
+void ValidatingUtil::Wrap(time_t timestamp, std::string* data) {
+ assert(data != NULL);
+ char timestamp_string[2 + 3 * sizeof timestamp];
+ snprintf(timestamp_string, sizeof timestamp_string, "%ld", timestamp);
+
+ std::string header;
+ header.append(kTimestampPrefix, kTimestampPrefixLength);
+ header.append(timestamp_string);
+ header.push_back(kSeparator);
+
+ header.append(kChecksumPrefix, kChecksumPrefixLength);
+ header.append(MD5String(*data));
+ header.push_back(kSeparator);
+
+ data->reserve(header.size() + data->size());
+ data->insert(0, header);
+}
+
+// static
+bool ValidatingUtil::UnwrapTimestamp(std::string* data, time_t now) {
+ assert(data != NULL);
+ if (now < 0) {
+ return false;
+ }
+
+ std::string timestamp_string;
+ if (!UnwrapHeader(
+ kTimestampPrefix, kTimestampPrefixLength, data, &timestamp_string)) {
+ return false;
+ }
+
+ time_t timestamp = atol(timestamp_string.c_str());
+ if (timestamp < 0) {
+ return false;
+ }
+
+ // One month contains:
+ // 30 days *
+ // 24 hours per day *
+ // 60 minutes per hour *
+ // 60 seconds per minute.
+ static const double kOneMonthInSeconds = 30.0 * 24.0 * 60.0 * 60.0;
+ double age_in_seconds = difftime(now, timestamp);
+ return !(age_in_seconds < 0.0) && age_in_seconds < kOneMonthInSeconds;
+}
+
+// static
+bool ValidatingUtil::UnwrapChecksum(std::string* data) {
+ assert(data != NULL);
+ std::string checksum;
+ if (!UnwrapHeader(kChecksumPrefix, kChecksumPrefixLength, data, &checksum)) {
+ return false;
+ }
+ return checksum == MD5String(*data);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/validating_util.h b/cpp/src/validating_util.h
new file mode 100644
index 0000000..1357651
--- /dev/null
+++ b/cpp/src/validating_util.h
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// An object to wrap data with a checksum and a timestamp. These fields are used
+// to verify that the data is not stale or corrupted. Staleness threshold is 1
+// month.
+
+#ifndef I18N_ADDRESSINPUT_VALIDATING_UTIL_H_
+#define I18N_ADDRESSINPUT_VALIDATING_UTIL_H_
+
+#include <ctime>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Wraps data with a checksum and a timestamp. Sample usage:
+// std::string data = ...
+// ValidatingUtil::Wrap(time(NULL), &data);
+// Process(data);
+//
+// std::string unwrapped = wrapped;
+// if (ValidatingUtil::UnwrapTimestamp(&unwrapped, time(NULL)) &&
+// ValidatingUtil::UnwrapChecksum(&unwrapped)) {
+// Process(unwrapped);
+// }
+class ValidatingUtil {
+ public:
+ // Adds checksum and given |timestamp| to |data|.
+ static void Wrap(time_t timestamp, std::string* data);
+
+ // Strips out the timestamp from |data|. Returns |true| if the timestamp is
+ // present, formatted correctly, valid, and recent with respect to |now|.
+ static bool UnwrapTimestamp(std::string* data, time_t now);
+
+ // Strips out the checksum from |data|. Returns |true| if the checksum is
+ // present, formatted correctly, and valid for this data.
+ static bool UnwrapChecksum(std::string* data);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_VALIDATING_UTIL_H_
diff --git a/cpp/src/validation_task.cc b/cpp/src/validation_task.cc
new file mode 100644
index 0000000..e5beb1a
--- /dev/null
+++ b/cpp/src/validation_task.cc
@@ -0,0 +1,264 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "validation_task.h"
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_metadata.h>
+#include <libaddressinput/address_problem.h>
+#include <libaddressinput/address_validator.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <algorithm>
+#include <cassert>
+#include <cstddef>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "lookup_key.h"
+#include "post_box_matchers.h"
+#include "rule.h"
+#include "util/re2ptr.h"
+
+#include <re2/re2.h>
+
+namespace i18n {
+namespace addressinput {
+
+ValidationTask::ValidationTask(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const AddressValidator::Callback& validated)
+ : address_(address),
+ allow_postal_(allow_postal),
+ require_name_(require_name),
+ filter_(filter),
+ problems_(problems),
+ validated_(validated),
+ supplied_(BuildCallback(this, &ValidationTask::Validate)),
+ lookup_key_(new LookupKey) {
+ assert(problems_ != NULL);
+ assert(supplied_ != NULL);
+ assert(lookup_key_ != NULL);
+}
+
+ValidationTask::~ValidationTask() {
+}
+
+void ValidationTask::Run(Supplier* supplier) const {
+ assert(supplier != NULL);
+ problems_->clear();
+ lookup_key_->FromAddress(address_);
+ supplier->Supply(*lookup_key_, *supplied_);
+}
+
+void ValidationTask::Validate(bool success,
+ const LookupKey& lookup_key,
+ const Supplier::RuleHierarchy& hierarchy) {
+ assert(&lookup_key == lookup_key_.get()); // Sanity check.
+
+ if (success) {
+ if (address_.IsFieldEmpty(COUNTRY)) {
+ ReportProblemMaybe(COUNTRY, MISSING_REQUIRED_FIELD);
+ } else if (hierarchy.rule[0] == NULL) {
+ ReportProblemMaybe(COUNTRY, UNKNOWN_VALUE);
+ } else {
+ // Checks which use statically linked metadata.
+ const std::string& region_code = address_.region_code;
+ CheckUnexpectedField(region_code);
+ CheckMissingRequiredField(region_code);
+
+ // Checks which use data from the metadata server. Note that
+ // CheckPostalCodeFormatAndValue assumes CheckUnexpectedField has already
+ // been called.
+ CheckUnknownValue(hierarchy);
+ CheckPostalCodeFormatAndValue(hierarchy);
+ CheckUsesPoBox(hierarchy);
+ }
+ }
+
+ validated_(success, address_, *problems_);
+ delete this;
+}
+
+// A field will return an UNEXPECTED_FIELD problem type if the current value of
+// that field is not empty and the field should not be used by that region.
+void ValidationTask::CheckUnexpectedField(
+ const std::string& region_code) const {
+ static const AddressField kFields[] = {
+ // COUNTRY is never unexpected.
+ ADMIN_AREA,
+ LOCALITY,
+ DEPENDENT_LOCALITY,
+ SORTING_CODE,
+ POSTAL_CODE,
+ STREET_ADDRESS,
+ RECIPIENT
+ };
+
+ for (size_t i = 0; i < arraysize(kFields); ++i) {
+ AddressField field = kFields[i];
+ if (!address_.IsFieldEmpty(field) && !IsFieldUsed(field, region_code)) {
+ ReportProblemMaybe(field, UNEXPECTED_FIELD);
+ }
+ }
+}
+
+// A field will return an MISSING_REQUIRED_FIELD problem type if the current
+// value of that field is empty and the field is required by that region.
+void ValidationTask::CheckMissingRequiredField(
+ const std::string& region_code) const {
+ static const AddressField kFields[] = {
+ // COUNTRY is assumed to have already been checked.
+ ADMIN_AREA,
+ LOCALITY,
+ DEPENDENT_LOCALITY,
+ SORTING_CODE,
+ POSTAL_CODE,
+ STREET_ADDRESS,
+ // RECIPIENT is handled separately.
+ };
+
+ for (size_t i = 0; i < arraysize(kFields); ++i) {
+ AddressField field = kFields[i];
+ if (address_.IsFieldEmpty(field) && IsFieldRequired(field, region_code)) {
+ ReportProblemMaybe(field, MISSING_REQUIRED_FIELD);
+ }
+ }
+
+ if (require_name_ && address_.IsFieldEmpty(RECIPIENT)) {
+ ReportProblemMaybe(RECIPIENT, MISSING_REQUIRED_FIELD);
+ }
+}
+
+// A field is UNKNOWN_VALUE if the metadata contains a list of possible values
+// for the field and the address data server could not match the current value
+// of that field to one of those possible values, therefore returning NULL.
+void ValidationTask::CheckUnknownValue(
+ const Supplier::RuleHierarchy& hierarchy) const {
+ for (size_t depth = 1; depth < arraysize(LookupKey::kHierarchy); ++depth) {
+ AddressField field = LookupKey::kHierarchy[depth];
+ if (!(address_.IsFieldEmpty(field) ||
+ hierarchy.rule[depth - 1] == NULL ||
+ hierarchy.rule[depth - 1]->GetSubKeys().empty() ||
+ hierarchy.rule[depth] != NULL)) {
+ ReportProblemMaybe(field, UNKNOWN_VALUE);
+ }
+ }
+}
+
+// Note that it is assumed that CheckUnexpectedField has already been called.
+void ValidationTask::CheckPostalCodeFormatAndValue(
+ const Supplier::RuleHierarchy& hierarchy) const {
+ assert(hierarchy.rule[0] != NULL);
+ const Rule& country_rule = *hierarchy.rule[0];
+
+ if (!(ShouldReport(POSTAL_CODE, INVALID_FORMAT) ||
+ ShouldReport(POSTAL_CODE, MISMATCHING_VALUE))) {
+ return;
+ }
+
+ if (address_.IsFieldEmpty(POSTAL_CODE)) {
+ return;
+ } else if (std::find(problems_->begin(), problems_->end(),
+ FieldProblemMap::value_type(POSTAL_CODE,
+ UNEXPECTED_FIELD))
+ != problems_->end()) {
+ return; // Problem already reported.
+ }
+
+ // Validate general postal code format. A country-level rule specifies the
+ // regular expression for the whole postal code.
+ const RE2ptr* format_ptr = country_rule.GetPostalCodeMatcher();
+ if (format_ptr != NULL &&
+ !RE2::FullMatch(address_.postal_code, *format_ptr->ptr) &&
+ ShouldReport(POSTAL_CODE, INVALID_FORMAT)) {
+ ReportProblem(POSTAL_CODE, INVALID_FORMAT);
+ return;
+ }
+
+ if (!ShouldReport(POSTAL_CODE, MISMATCHING_VALUE)) {
+ return;
+ }
+
+ for (size_t depth = arraysize(LookupKey::kHierarchy) - 1;
+ depth > 0; --depth) {
+ if (hierarchy.rule[depth] != NULL) {
+ // Validate sub-region specific postal code format. A sub-region specifies
+ // the regular expression for a prefix of the postal code.
+ const RE2ptr* prefix_ptr = hierarchy.rule[depth]->GetPostalCodeMatcher();
+ if (prefix_ptr != NULL) {
+ if (!RE2::PartialMatch(address_.postal_code, *prefix_ptr->ptr)) {
+ ReportProblem(POSTAL_CODE, MISMATCHING_VALUE);
+ }
+ return;
+ }
+ }
+ }
+}
+
+void ValidationTask::CheckUsesPoBox(
+ const Supplier::RuleHierarchy& hierarchy) const {
+ assert(hierarchy.rule[0] != NULL);
+ const Rule& country_rule = *hierarchy.rule[0];
+
+ if (allow_postal_ ||
+ !ShouldReport(STREET_ADDRESS, USES_P_O_BOX) ||
+ address_.IsFieldEmpty(STREET_ADDRESS)) {
+ return;
+ }
+
+ std::vector<const RE2ptr*> matchers =
+ PostBoxMatchers::GetMatchers(country_rule);
+ for (std::vector<std::string>::const_iterator
+ line = address_.address_line.begin();
+ line != address_.address_line.end(); ++line) {
+ for (std::vector<const RE2ptr*>::const_iterator
+ matcher = matchers.begin();
+ matcher != matchers.end(); ++matcher) {
+ if (RE2::PartialMatch(*line, *(*matcher)->ptr)) {
+ ReportProblem(STREET_ADDRESS, USES_P_O_BOX);
+ return;
+ }
+ }
+ }
+}
+
+void ValidationTask::ReportProblem(AddressField field,
+ AddressProblem problem) const {
+ problems_->insert(std::make_pair(field, problem));
+}
+
+void ValidationTask::ReportProblemMaybe(AddressField field,
+ AddressProblem problem) const {
+ if (ShouldReport(field, problem)) {
+ ReportProblem(field, problem);
+ }
+}
+
+bool ValidationTask::ShouldReport(AddressField field,
+ AddressProblem problem) const {
+ return filter_ == NULL || filter_->empty() ||
+ std::find(filter_->begin(), filter_->end(),
+ FieldProblemMap::value_type(field, problem)) !=
+ filter_->end();
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/src/validation_task.h b/cpp/src/validation_task.h
new file mode 100644
index 0000000..f0895f3
--- /dev/null
+++ b/cpp/src/validation_task.h
@@ -0,0 +1,102 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef I18N_ADDRESSINPUT_VALIDATION_TASK_H_
+#define I18N_ADDRESSINPUT_VALIDATION_TASK_H_
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+#include <libaddressinput/address_validator.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+namespace i18n {
+namespace addressinput {
+
+class LookupKey;
+class Rule;
+struct AddressData;
+
+// A ValidationTask object encapsulates the information necessary to perform
+// validation of one particular address and call a callback when that has been
+// done. Calling the Run() method will load required metadata, then perform
+// validation, call the callback and delete the ValidationTask object itself.
+class ValidationTask {
+ public:
+ ValidationTask(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const AddressValidator::Callback& validated);
+
+ ~ValidationTask();
+
+ // Calls supplier->Load(), with Validate() as callback.
+ void Run(Supplier* supplier) const;
+
+ private:
+ friend class ValidationTaskTest;
+
+ // Uses the address metadata of |hierarchy| to validate |address_|, writing
+ // problems found into |problems_|, then calls the |validated_| callback and
+ // deletes this ValidationTask object.
+ void Validate(bool success,
+ const LookupKey& lookup_key,
+ const Supplier::RuleHierarchy& hierarchy);
+
+ // Checks all fields for UNEXPECTED_FIELD problems.
+ void CheckUnexpectedField(const std::string& region_code) const;
+
+ // Checks all fields for MISSING_REQUIRED_FIELD problems.
+ void CheckMissingRequiredField(const std::string& region_code) const;
+
+ // Checks the hierarchical fields for UNKNOWN_VALUE problems.
+ void CheckUnknownValue(
+ const Supplier::RuleHierarchy& hierarchy) const;
+
+ // Checks the POSTAL_CODE field for problems.
+ void CheckPostalCodeFormatAndValue(
+ const Supplier::RuleHierarchy& hierarchy) const;
+
+ // Checks the STREET_ADDRESS field for USES_P_O_BOX problems.
+ void CheckUsesPoBox(
+ const Supplier::RuleHierarchy& hierarchy) const;
+
+ // Writes (|field|,|problem|) to |problems_|.
+ void ReportProblem(AddressField field, AddressProblem problem) const;
+
+ // Writes (|field|,|problem|) to |problems_|, if this pair should be reported.
+ void ReportProblemMaybe(AddressField field, AddressProblem problem) const;
+
+ // Returns whether (|field|,|problem|) should be reported.
+ bool ShouldReport(AddressField field, AddressProblem problem) const;
+
+ const AddressData& address_;
+ const bool allow_postal_;
+ const bool require_name_;
+ const FieldProblemMap* filter_;
+ FieldProblemMap* const problems_;
+ const AddressValidator::Callback& validated_;
+ const scoped_ptr<const Supplier::Callback> supplied_;
+ const scoped_ptr<LookupKey> lookup_key_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValidationTask);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_VALIDATION_TASK_H_
diff --git a/cpp/test/address_data_test.cc b/cpp/test/address_data_test.cc
new file mode 100644
index 0000000..8ba0f4b
--- /dev/null
+++ b/cpp/test/address_data_test.cc
@@ -0,0 +1,205 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_data.h>
+
+#include <libaddressinput/address_field.h>
+
+#include <sstream>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::AddressField;
+
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::LOCALITY;
+using i18n::addressinput::DEPENDENT_LOCALITY;
+using i18n::addressinput::SORTING_CODE;
+using i18n::addressinput::POSTAL_CODE;
+using i18n::addressinput::STREET_ADDRESS;
+using i18n::addressinput::RECIPIENT;
+
+TEST(AddressDataTest, GetFieldValue) {
+ AddressData address;
+ address.region_code = "rrr";
+ address.administrative_area = "sss";
+ address.locality = "ccc";
+ address.dependent_locality = "ddd";
+ address.sorting_code = "xxx";
+ address.postal_code = "zzz";
+ address.recipient = "nnn";
+
+ EXPECT_EQ(address.region_code,
+ address.GetFieldValue(COUNTRY));
+ EXPECT_EQ(address.administrative_area,
+ address.GetFieldValue(ADMIN_AREA));
+ EXPECT_EQ(address.locality,
+ address.GetFieldValue(LOCALITY));
+ EXPECT_EQ(address.dependent_locality,
+ address.GetFieldValue(DEPENDENT_LOCALITY));
+ EXPECT_EQ(address.sorting_code,
+ address.GetFieldValue(SORTING_CODE));
+ EXPECT_EQ(address.postal_code,
+ address.GetFieldValue(POSTAL_CODE));
+ EXPECT_EQ(address.recipient,
+ address.GetFieldValue(RECIPIENT));
+}
+
+TEST(AddressDataTest, GetRepeatedFieldValue) {
+ AddressData address;
+ address.address_line.push_back("aaa");
+ address.address_line.push_back("222");
+ EXPECT_EQ(address.address_line,
+ address.GetRepeatedFieldValue(STREET_ADDRESS));
+}
+
+TEST(AddressDataTest, IsFieldEmpty) {
+ AddressData address;
+
+ EXPECT_TRUE(address.IsFieldEmpty(COUNTRY));
+ EXPECT_TRUE(address.IsFieldEmpty(ADMIN_AREA));
+ EXPECT_TRUE(address.IsFieldEmpty(LOCALITY));
+ EXPECT_TRUE(address.IsFieldEmpty(DEPENDENT_LOCALITY));
+ EXPECT_TRUE(address.IsFieldEmpty(SORTING_CODE));
+ EXPECT_TRUE(address.IsFieldEmpty(POSTAL_CODE));
+ EXPECT_TRUE(address.IsFieldEmpty(STREET_ADDRESS));
+ EXPECT_TRUE(address.IsFieldEmpty(RECIPIENT));
+
+ address.region_code = "rrr";
+ address.administrative_area = "sss";
+ address.locality = "ccc";
+ address.dependent_locality = "ddd";
+ address.sorting_code = "xxx";
+ address.postal_code = "zzz";
+ address.address_line.push_back("aaa");
+ address.recipient = "nnn";
+
+ EXPECT_FALSE(address.IsFieldEmpty(COUNTRY));
+ EXPECT_FALSE(address.IsFieldEmpty(ADMIN_AREA));
+ EXPECT_FALSE(address.IsFieldEmpty(LOCALITY));
+ EXPECT_FALSE(address.IsFieldEmpty(DEPENDENT_LOCALITY));
+ EXPECT_FALSE(address.IsFieldEmpty(SORTING_CODE));
+ EXPECT_FALSE(address.IsFieldEmpty(POSTAL_CODE));
+ EXPECT_FALSE(address.IsFieldEmpty(STREET_ADDRESS));
+ EXPECT_FALSE(address.IsFieldEmpty(RECIPIENT));
+}
+
+TEST(AddressDataTest, IsFieldEmptyWhitespace) {
+ AddressData address;
+ address.recipient = " ";
+ EXPECT_TRUE(address.IsFieldEmpty(RECIPIENT));
+ address.recipient = "abc";
+ EXPECT_FALSE(address.IsFieldEmpty(RECIPIENT));
+ address.recipient = " b ";
+ EXPECT_FALSE(address.IsFieldEmpty(RECIPIENT));
+}
+
+TEST(AddressDataTest, IsFieldEmptyVector) {
+ AddressData address;
+ EXPECT_TRUE(address.IsFieldEmpty(STREET_ADDRESS));
+ address.address_line.push_back("");
+ EXPECT_TRUE(address.IsFieldEmpty(STREET_ADDRESS));
+ address.address_line.push_back("aaa");
+ EXPECT_FALSE(address.IsFieldEmpty(STREET_ADDRESS));
+ address.address_line.push_back("");
+ EXPECT_FALSE(address.IsFieldEmpty(STREET_ADDRESS));
+}
+
+TEST(AddressDataTest, IsFieldEmptyVectorWhitespace) {
+ AddressData address;
+ address.address_line.push_back(" ");
+ address.address_line.push_back(" ");
+ address.address_line.push_back(" ");
+ EXPECT_TRUE(address.IsFieldEmpty(STREET_ADDRESS));
+ address.address_line.clear();
+ address.address_line.push_back("abc");
+ EXPECT_FALSE(address.IsFieldEmpty(STREET_ADDRESS));
+ address.address_line.clear();
+ address.address_line.push_back(" ");
+ address.address_line.push_back(" b ");
+ address.address_line.push_back(" ");
+ EXPECT_FALSE(address.IsFieldEmpty(STREET_ADDRESS));
+}
+
+TEST(AddressDataTest, StreamFunction) {
+ std::ostringstream oss;
+ AddressData address;
+ address.address_line.push_back("Line 1");
+ address.address_line.push_back("Line 2");
+ address.recipient = "N";
+ address.region_code = "R";
+ address.postal_code = "Z";
+ address.administrative_area = "S";
+ address.locality = "C";
+ address.dependent_locality = "D";
+ address.sorting_code = "X";
+ address.language_code = "zh-Hant";
+ oss << address;
+ EXPECT_EQ("region_code: \"R\"\n"
+ "administrative_area: \"S\"\n"
+ "locality: \"C\"\n"
+ "dependent_locality: \"D\"\n"
+ "postal_code: \"Z\"\n"
+ "sorting_code: \"X\"\n"
+ "address_line: \"Line 1\"\n"
+ "address_line: \"Line 2\"\n"
+ "language_code: \"zh-Hant\"\n"
+ "recipient: \"N\"\n", oss.str());
+}
+
+TEST(AddressDataTest, TestEquals) {
+ AddressData address;
+ address.address_line.push_back("Line 1");
+ address.address_line.push_back("Line 2");
+ address.recipient = "N";
+ address.region_code = "R";
+ address.postal_code = "Z";
+ address.administrative_area = "S";
+ address.locality = "C";
+ address.dependent_locality = "D";
+ address.sorting_code = "X";
+ address.language_code = "zh-Hant";
+
+ AddressData clone = address;
+
+ EXPECT_EQ(address, clone);
+ clone.language_code.clear();
+ EXPECT_FALSE(address == clone);
+}
+
+#ifndef NDEBUG
+
+TEST(AddressDataTest, GetFieldValueInvalid) {
+ AddressData address;
+ ASSERT_DEATH(address.GetFieldValue(STREET_ADDRESS), "ssertion.*failed");
+}
+
+TEST(AddressDataTest, GetVectorFieldValueInvalid) {
+ AddressData address;
+ ASSERT_DEATH(address.GetRepeatedFieldValue(COUNTRY), "ssertion.*failed");
+}
+
+TEST(AddressDataTest, IsFieldEmptyInvalid) {
+ static const AddressField invalid_field = static_cast<AddressField>(-1);
+ AddressData address;
+ ASSERT_DEATH(address.IsFieldEmpty(invalid_field), "ssertion.*failed");
+}
+
+#endif // NDEBUG
+
+} // namespace
diff --git a/cpp/test/address_field_test.cc b/cpp/test/address_field_test.cc
new file mode 100644
index 0000000..0de9202
--- /dev/null
+++ b/cpp/test/address_field_test.cc
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_field.h>
+
+#include <sstream>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressField;
+using i18n::addressinput::SORTING_CODE;
+
+TEST(AddressFieldTest, ValidEnumValue) {
+ std::ostringstream oss;
+ oss << SORTING_CODE;
+ EXPECT_EQ("SORTING_CODE", oss.str());
+}
+
+TEST(AddressFieldTest, InvalidEnumValue) {
+ std::ostringstream oss;
+ oss << static_cast<AddressField>(-42);
+ EXPECT_EQ("[INVALID ENUM VALUE -42]", oss.str());
+}
+
+} // namespace
diff --git a/cpp/test/address_field_util_test.cc b/cpp/test/address_field_util_test.cc
new file mode 100644
index 0000000..4a1d7a2
--- /dev/null
+++ b/cpp/test/address_field_util_test.cc
@@ -0,0 +1,94 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "address_field_util.h"
+
+#include <libaddressinput/address_field.h>
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "format_element.h"
+
+namespace {
+
+using i18n::addressinput::AddressField;
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::LOCALITY;
+using i18n::addressinput::FormatElement;
+using i18n::addressinput::ParseFormatRule;
+using i18n::addressinput::POSTAL_CODE;
+using i18n::addressinput::RECIPIENT;
+using i18n::addressinput::STREET_ADDRESS;
+
+TEST(AddressFieldUtilTest, FormatParseNewline) {
+ std::vector<FormatElement> actual;
+ ParseFormatRule("%O%n%N%n%A%nAX-%Z %C%nÅLAND", &actual);
+
+ std::vector<FormatElement> expected;
+ // Organization is skipped.
+ expected.push_back(FormatElement());
+ expected.push_back(FormatElement(RECIPIENT));
+ expected.push_back(FormatElement());
+ expected.push_back(FormatElement(STREET_ADDRESS));
+ expected.push_back(FormatElement());
+ expected.push_back(FormatElement("AX-"));
+ expected.push_back(FormatElement(POSTAL_CODE));
+ expected.push_back(FormatElement(" "));
+ expected.push_back(FormatElement(LOCALITY));
+ expected.push_back(FormatElement());
+ expected.push_back(FormatElement("ÅLAND"));
+
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(AddressFieldUtilTest, FormatUnknownTokenIsIgnored) {
+ std::vector<FormatElement> actual;
+ ParseFormatRule("%1%R", &actual); // %1 is not supported.
+ std::vector<FormatElement> expected(1, FormatElement(COUNTRY));
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(AddressFieldUtilTest, FormatPrefixWithoutTokenIsIgnored) {
+ std::vector<FormatElement> actual;
+ ParseFormatRule("%", &actual);
+ EXPECT_TRUE(actual.empty());
+}
+
+TEST(AddressFieldUtilTest, FormatEmptyString) {
+ std::vector<FormatElement> fields;
+ ParseFormatRule(std::string(), &fields);
+ EXPECT_TRUE(fields.empty());
+}
+
+TEST(AddressFieldUtilTest, RequiredParseDefault) {
+ std::vector<AddressField> actual;
+ ParseAddressFieldsRequired("AC", &actual);
+
+ std::vector<AddressField> expected;
+ expected.push_back(STREET_ADDRESS);
+ expected.push_back(LOCALITY);
+
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(AddressFieldUtilTest, RequiredEmptyString) {
+ std::vector<AddressField> fields;
+ ParseAddressFieldsRequired(std::string(), &fields);
+ EXPECT_TRUE(fields.empty());
+}
+
+} // namespace
diff --git a/cpp/test/address_formatter_test.cc b/cpp/test/address_formatter_test.cc
new file mode 100644
index 0000000..ca94a32
--- /dev/null
+++ b/cpp/test/address_formatter_test.cc
@@ -0,0 +1,201 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language_code governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_formatter.h>
+
+#include <libaddressinput/address_data.h>
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::GetFormattedNationalAddress;
+using i18n::addressinput::GetFormattedNationalAddressLine;
+using i18n::addressinput::GetStreetAddressLinesAsSingleLine;
+
+TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_1Line) {
+ AddressData address;
+ address.region_code = "US"; // Not used.
+ address.address_line.push_back("Line 1");
+
+ std::string result;
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1", result);
+
+ // Setting the language_code, with one line, shouldn't affect anything.
+ address.language_code = "en";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1", result);
+
+ address.language_code = "zh-Hans";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1", result);
+}
+
+TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_2Lines) {
+ AddressData address;
+ address.region_code = "US"; // Not used.
+ address.address_line.push_back("Line 1");
+ address.address_line.push_back("Line 2");
+
+ std::string result;
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ // Default separator if no language_code specified: ", "
+ EXPECT_EQ("Line 1, Line 2", result);
+
+ address.language_code = "en";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1, Line 2", result);
+
+ address.language_code = "zh-Hans";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ // Chinese has no separator.
+ EXPECT_EQ("Line 1Line 2", result);
+
+ address.language_code = "ko";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1 Line 2", result);
+
+ address.language_code = "ar";
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ("Line 1\xD8\x8C" " Line 2", result); // Arabic comma.
+}
+
+TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_5Lines) {
+ AddressData address;
+ address.region_code = "US"; // Not used.
+ address.address_line.push_back("Line 1");
+ address.address_line.push_back("Line 2");
+ address.address_line.push_back("Line 3");
+ address.address_line.push_back("Line 4");
+ address.address_line.push_back("Line 5");
+ address.language_code = "fr";
+
+ std::string result;
+ GetStreetAddressLinesAsSingleLine(address, &result);
+ EXPECT_EQ(result, "Line 1, Line 2, Line 3, Line 4, Line 5");
+}
+
+TEST(AddressFormatterTest, GetFormattedNationalAddressLocalLanguage) {
+ AddressData address;
+ address.region_code = "NZ";
+ address.address_line.push_back("Rotopapa");
+ address.address_line.push_back("Irwell 3RD");
+ address.postal_code = "8704";
+ address.locality = "Leeston";
+
+ std::vector<std::string> expected;
+ expected.push_back("Rotopapa");
+ expected.push_back("Irwell 3RD");
+ expected.push_back("Leeston 8704");
+
+ std::vector<std::string> lines;
+ GetFormattedNationalAddress(address, &lines);
+ EXPECT_EQ(expected, lines);
+
+ // Should be the same result no matter what the language_code is. We choose an
+ // unlikely language_code code to illustrate this.
+ address.language_code = "en-Latn-CN";
+
+ lines.clear();
+ GetFormattedNationalAddress(address, &lines);
+ EXPECT_EQ(expected, lines);
+
+ std::string one_line;
+ GetFormattedNationalAddressLine(address, &one_line);
+ EXPECT_EQ("Rotopapa, Irwell 3RD, Leeston 8704", one_line);
+}
+
+TEST(AddressFormatterTest, GetFormattedNationalAddressLatinFormat) {
+ /* 大安區 */
+ static const char kTaiwanCity[] = "\xE5\xA4\xA7\xE5\xAE\x89\xE5\x8D\x80";
+ /* 台北市 */
+ static const char kTaiwanAdmin[] = "\xE5\x8F\xB0\xE5\x8C\x97\xE5\xB8\x82";
+ /* 台灣信義路三段33號 */
+ static const char kTaiwanStreetLine[]= "\xE5\x8F\xB0\xE7\x81\xA3\xE4\xBF\xA1"
+ "\xE7\xBE\xA9\xE8\xB7\xAF\xE4\xB8\x89\xE6\xAE\xB5" "33" "\xE8\x99\x9F";
+ static const char kPostalCode[] = "106";
+
+ AddressData address;
+ address.region_code = "TW";
+ address.address_line.push_back(kTaiwanStreetLine);
+ address.postal_code = kPostalCode;
+ address.locality = kTaiwanCity;
+ address.administrative_area = kTaiwanAdmin;
+ address.language_code = "zh-Hant";
+
+ std::vector<std::string> expected;
+ expected.push_back(kPostalCode);
+ expected.push_back(std::string(kTaiwanAdmin).append(kTaiwanCity));
+ expected.push_back(kTaiwanStreetLine);
+
+ std::vector<std::string> lines;
+ GetFormattedNationalAddress(address, &lines);
+ EXPECT_EQ(expected, lines);
+
+ std::string one_line;
+ GetFormattedNationalAddressLine(address, &one_line);
+ // No separators expected for Chinese.
+ EXPECT_EQ(std::string(kPostalCode).append(kTaiwanAdmin).append(kTaiwanCity)
+ .append(kTaiwanStreetLine),
+ one_line);
+
+ // Changing to the latin variant will change the output.
+ AddressData latin_address;
+ latin_address.region_code = "TW";
+ latin_address.address_line.push_back("No. 33, Section 3 Xinyi Rd");
+ latin_address.postal_code = kPostalCode;
+ latin_address.locality = "Da-an District";
+ latin_address.administrative_area = "Taipei City";
+ latin_address.language_code = "zh-Latn";
+
+ std::vector<std::string> expected_latin;
+ expected_latin.push_back("No. 33, Section 3 Xinyi Rd");
+ expected_latin.push_back("Da-an District, Taipei City 106");
+
+ lines.clear();
+ GetFormattedNationalAddress(latin_address, &lines);
+ EXPECT_EQ(expected_latin, lines);
+
+ GetFormattedNationalAddressLine(latin_address, &one_line);
+ // We expect ", " as the new-line replacements for zh-Latn.
+ EXPECT_EQ("No. 33, Section 3 Xinyi Rd, Da-an District, Taipei City 106",
+ one_line);
+}
+
+TEST(AddressFormatterTest, GetFormattedNationalAddressMultilingualCountry) {
+ AddressData address;
+ address.region_code = "CA";
+ address.address_line.push_back("5 Rue du Tresor");
+ address.address_line.push_back("Apt. 4");
+ address.administrative_area = "QC";
+ address.postal_code = "G1R 123";
+ address.locality = "Montmagny";
+ address.language_code = "fr";
+
+ std::vector<std::string> expected;
+ expected.push_back("5 Rue du Tresor");
+ expected.push_back("Apt. 4");
+ expected.push_back("Montmagny QC G1R 123");
+
+ std::vector<std::string> lines;
+ GetFormattedNationalAddress(address, &lines);
+ EXPECT_EQ(expected, lines);
+}
+
+} // namespace
diff --git a/cpp/test/address_input_helper_test.cc b/cpp/test/address_input_helper_test.cc
new file mode 100644
index 0000000..84a2286
--- /dev/null
+++ b/cpp/test/address_input_helper_test.cc
@@ -0,0 +1,359 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_input_helper.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+#include <utility>
+
+#include <gtest/gtest.h>
+
+#include "fake_downloader.h"
+#include "mock_downloader.h"
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::AddressInputHelper;
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::Callback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::MockDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::scoped_ptr;
+
+class AddressInputHelperTest : public testing::Test {
+ protected:
+ AddressInputHelperTest()
+ // Our PreloadSupplier loads all data for a country at a time.
+ : supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ address_input_helper_(&supplier_),
+ loaded_(BuildCallback(this, &AddressInputHelperTest::Loaded)) {}
+
+ ~AddressInputHelperTest() {}
+
+ // Helper method to test FillAddress that ensures the PreloadSupplier has the
+ // necessary data preloaded.
+ void FillAddress(AddressData* address) {
+ const std::string& region_code = address->region_code;
+ if (!region_code.empty()) {
+ supplier_.LoadRules(region_code, *loaded_);
+ }
+ address_input_helper_.FillAddress(address);
+ }
+
+ private:
+ // Used to preload data that we need.
+ void Loaded(bool success, const std::string&, int) {
+ ASSERT_TRUE(success);
+ }
+
+ PreloadSupplier supplier_;
+ const AddressInputHelper address_input_helper_;
+ const scoped_ptr<const PreloadSupplier::Callback> loaded_;
+ DISALLOW_COPY_AND_ASSIGN(AddressInputHelperTest);
+};
+
+TEST_F(AddressInputHelperTest, AddressWithMissingPostalCode) {
+ AddressData address;
+ address.region_code = "CX";
+ address.administrative_area = "WA";
+
+ // There is only one postal code for Christmas Island
+ AddressData expected = address;
+ expected.postal_code = "6798";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingAdmin) {
+ AddressData address;
+ address.region_code = "US";
+ address.postal_code = "58098";
+ // Other data should be left alone.
+ address.address_line.push_back("10 High St");
+
+ // North Dakota has post codes starting with 58.
+ AddressData expected = address;
+ expected.administrative_area = "ND";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+
+ address.administrative_area = "CA"; // Override the admin area.
+ // Now, since the admin area was already filled in, we don't fix it, even
+ // though it was correct.
+ expected.administrative_area = "CA";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingLowerLevel) {
+ AddressData address;
+ address.region_code = "TW";
+ address.postal_code = "53012";
+
+ /* This matches 二水鄉 - Ershuei Township. */
+ AddressData expected = address;
+ /* This locality is in 彰化縣 - Changhua County. */
+ expected.administrative_area = "\xE5\xBD\xB0\xE5\x8C\x96\xE7\xB8\xA3";
+ expected.locality = "\xE4\xBA\x8C\xE6\xB0\xB4\xE9\x84\x89";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+
+ // Override the admin area.
+ address.administrative_area = "Already filled in";
+ expected.administrative_area = "Already filled in";
+ address.locality = "";
+ // However, the locality will still be filled in.
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingLowerLevelLatin) {
+ AddressData address;
+ address.region_code = "TW";
+ address.postal_code = "53012";
+ address.language_code = "zh-Latn";
+
+ /* This matches 二水鄉 - Ershuei Township. */
+ AddressData expected = address;
+ /* This locality is in 彰化縣 - Changhua County. */
+ expected.locality = "Ershuei Township";
+ expected.administrative_area = "Changhua County";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+
+ // Override the admin area.
+ address.administrative_area = "Already filled in";
+ expected.administrative_area = "Already filled in";
+ address.locality = "";
+ // However, the locality will still be filled in.
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingDependentLocality) {
+ AddressData address;
+ address.region_code = "KR";
+ // This matches Danwon-gu district.
+ address.postal_code = "425-111";
+
+ AddressData expected = address;
+ /* The province is Gyeonggi - 경기도. */
+ expected.administrative_area = "\xEA\xB2\xBD\xEA\xB8\xB0\xEB\x8F\x84";
+ /* The city is Ansan-si - 안산시. */
+ expected.locality = "\xEC\x95\x88\xEC\x82\xB0\xEC\x8B\x9C";
+ /* The district is Danwon-gu - 단원구 */
+ expected.dependent_locality = "\xEB\x8B\xA8\xEC\x9B\x90\xEA\xB5\xAC";
+
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+
+ AddressData address_ko_latn;
+ address_ko_latn.region_code = "KR";
+ address_ko_latn.postal_code = "425-111";
+ address_ko_latn.language_code = "ko-latn";
+
+ expected = address_ko_latn;
+ /* The province is Gyeonggi - 경기도. */
+ expected.administrative_area = "Gyeonggi";
+ /* The city is Ansan-si - 안산시. */
+ expected.locality = "Ansan-si";
+ /* The district is Danwon-gu - 단원구 */
+ expected.dependent_locality = "Danwon-gu";
+
+ FillAddress(&address_ko_latn);
+ EXPECT_EQ(expected, address_ko_latn);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingMultipleValues) {
+ AddressData address;
+ address.region_code = "KR";
+ // This matches Wando-gun and Ganjin-gun, both in Jeonnam province.
+ address.postal_code = "527-111";
+
+ AddressData expected = address;
+ /* The province, Jeonnam - 전라남도 - is known, but we have several locality
+ * matches so none of them are populated. */
+ expected.administrative_area =
+ "\xEC\xA0\x84\xEB\x9D\xBC\xEB\x82\xA8\xEB\x8F\x84";
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithInvalidPostalCode) {
+ AddressData address;
+ address.postal_code = "970";
+ address.region_code = "US";
+
+ // We don't expect any changes, since the postal code couldn't be determined
+ // as valid.
+ AddressData expected = address;
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithNoPostalCodeValidation) {
+ AddressData address;
+ address.postal_code = "123";
+ address.region_code = "GA";
+
+ // We don't expect any changes, since the postal code couldn't be determined
+ // as valid - we have no information about postal codes in Gabon (or even that
+ // they are in use).
+ AddressData expected = address;
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperTest, AddressWithInvalidOrMissingRegionCode) {
+ AddressData address;
+ address.postal_code = "XXX";
+ address.administrative_area = "YYY";
+
+ // We don't expect any changes, since there was no region code.
+ AddressData expected = address;
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+
+ address.region_code = "XXXX";
+ expected.region_code = "XXXX";
+ // Again, nothing should change.
+ FillAddress(&address);
+ EXPECT_EQ(expected, address);
+}
+
+class AddressInputHelperMockDataTest : public testing::Test {
+ protected:
+ AddressInputHelperMockDataTest()
+ : downloader_(new MockDownloader),
+ // Our PreloadSupplier loads all data for a country at a time.
+ supplier_(MockDownloader::kMockDataUrl,
+ downloader_,
+ new NullStorage),
+ address_input_helper_(&supplier_),
+ loaded_(BuildCallback(this, &AddressInputHelperMockDataTest::Loaded)) {}
+
+ ~AddressInputHelperMockDataTest() {}
+
+ // Helper method to test FillAddress that ensures the PreloadSupplier has the
+ // necessary data preloaded.
+ void FillAddress(AddressData* address) {
+ const std::string& region_code = address->region_code;
+ if (!region_code.empty()) {
+ supplier_.LoadRules(region_code, *loaded_);
+ }
+ address_input_helper_.FillAddress(address);
+ }
+
+ MockDownloader* const downloader_;
+
+ private:
+ // Our mock downloader we assume will always succeed.
+ void Loaded(bool success, const std::string&, int) {
+ ASSERT_TRUE(success);
+ }
+
+ PreloadSupplier supplier_;
+ const AddressInputHelper address_input_helper_;
+ const scoped_ptr<const PreloadSupplier::Callback> loaded_;
+ DISALLOW_COPY_AND_ASSIGN(AddressInputHelperMockDataTest);
+};
+
+TEST_F(AddressInputHelperMockDataTest,
+ PostalCodeSharedAcrossDifferentHierarchies) {
+ // Note that this data is in the format of data that would be returned from
+ // the aggregate server.
+ downloader_->data_.insert(std::make_pair(
+ // We use KR since we need a country where we format all fields down to
+ // dependent locality, or the hierarchy won't be loaded.
+ "data/KR",
+ "{\"data/KR\": "
+ // The top-level ZIP expression must be present for sub-key matches to be
+ // evaluated.
+ "{\"id\":\"data/KR\", \"sub_keys\":\"A~B\", \"zip\":\"\\\\d{5}\"}, "
+ "\"data/KR/A\": "
+ "{\"id\":\"data/KR/A\", \"sub_keys\":\"A1\"}, "
+ "\"data/KR/A/A1\": "
+ "{\"id\":\"data/KR/A/A1\", \"zip\":\"1\"}, "
+ "\"data/KR/B\": "
+ "{\"id\":\"data/KR/B\", \"sub_keys\":\"B1\"}, "
+ "\"data/KR/B/B1\": "
+ "{\"id\":\"data/KR/B/B1\", \"zip\":\"12\"}}"));
+
+ AddressData address;
+ address.region_code = "KR";
+ address.postal_code = "12345";
+ address.administrative_area = "";
+
+ AddressData expected = address;
+ FillAddress(&address);
+ // Nothing should have changed, since the ZIP code matches both of the cities,
+ // and they aren't even in the same state.
+ EXPECT_EQ(expected, address);
+}
+
+TEST_F(AddressInputHelperMockDataTest,
+ PostalCodeSharedAcrossDifferentHierarchiesSameState) {
+ // Create data where one state matches the ZIP code, but the other doesn't:
+ // within the state which does, multiple cities and sub-cities match. The only
+ // thing we can be certain of is therefore the state.
+ downloader_->data_.insert(std::make_pair(
+ // We use KR since we need a country where we format all fields down to
+ // dependent locality, or the hierarchy won't be loaded.
+ "data/KR",
+ "{\"data/KR\": "
+ // The top-level ZIP expression must be present for sub-key matches to be
+ // evaluated.
+ "{\"id\":\"data/KR\", \"sub_keys\":\"A~B\", \"zip\":\"\\\\d\{5}\"}, "
+ "\"data/KR/A\": "
+ "{\"id\":\"data/KR/A\", \"sub_keys\":\"A1~A2\"}, "
+ "\"data/KR/A/A1\": "
+ "{\"id\":\"data/KR/A/A1\", \"sub_keys\":\"A1a\", \"zip\":\"1\"}, "
+ // This key matches the ZIP code.
+ "\"data/KR/A/A1/A1a\": "
+ "{\"id\":\"data/KR/A/A1/A1a\", \"zip\":\"12\"}, "
+ "\"data/KR/A/A2\": "
+ "{\"id\":\"data/KR/A/A2\", \"sub_keys\":\"A2a\", \"zip\":\"1\"}, "
+ // This key, also in state A, but in city A2, matches the ZIP code.
+ "\"data/KR/A/A2/A2a\": "
+ "{\"id\":\"data/KR/A/A2/A2a\", \"zip\":\"123\"}, "
+ // This key, in state B, does not match the ZIP code.
+ "\"data/KR/B\": "
+ "{\"id\":\"data/KR/B\", \"zip\":\"2\"}}"));
+
+ AddressData address;
+ address.region_code = "KR";
+ address.postal_code = "12345";
+ address.administrative_area = "";
+
+ AddressData expected = address;
+ expected.administrative_area = "A";
+ FillAddress(&address);
+ // The ZIP code matches multiple city districts and cities; but only one
+ // state, so we fill this in.
+ EXPECT_EQ(expected, address);
+}
+
+} // namespace
diff --git a/cpp/test/address_metadata_test.cc b/cpp/test/address_metadata_test.cc
new file mode 100644
index 0000000..e1959cd
--- /dev/null
+++ b/cpp/test/address_metadata_test.cc
@@ -0,0 +1,68 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_metadata.h>
+
+#include <libaddressinput/address_field.h>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::DEPENDENT_LOCALITY;
+
+using i18n::addressinput::IsFieldRequired;
+using i18n::addressinput::IsFieldUsed;
+
+TEST(AddressMetadataTest, IsFieldRequiredCountry) {
+ EXPECT_TRUE(IsFieldRequired(COUNTRY, "US"));
+ EXPECT_TRUE(IsFieldRequired(COUNTRY, "CH"));
+ EXPECT_TRUE(IsFieldRequired(COUNTRY, "rrr"));
+}
+
+TEST(AddressMetadataTest, IsUsedRequiredCountry) {
+ EXPECT_TRUE(IsFieldUsed(COUNTRY, "US"));
+ EXPECT_TRUE(IsFieldUsed(COUNTRY, "CH"));
+ EXPECT_TRUE(IsFieldUsed(COUNTRY, "rrr"));
+}
+
+TEST(AddressMetadataTest, IsFieldRequiredAdminAreaUS) {
+ EXPECT_TRUE(IsFieldRequired(ADMIN_AREA, "US"));
+}
+
+TEST(AddressMetadataTest, IsFieldRequiredAdminAreaAT) {
+ EXPECT_FALSE(IsFieldRequired(ADMIN_AREA, "AT"));
+}
+
+TEST(AddressMetadataTest, IsFieldRequiredAdminAreaSU) {
+ // Unsupported region.
+ EXPECT_FALSE(IsFieldRequired(ADMIN_AREA, "SU"));
+}
+
+TEST(AddressMetadataTest, IsFieldUsedDependentLocalityUS) {
+ EXPECT_FALSE(IsFieldUsed(DEPENDENT_LOCALITY, "US"));
+}
+
+TEST(AddressMetadataTest, IsFieldUsedDependentLocalityCN) {
+ EXPECT_TRUE(IsFieldUsed(DEPENDENT_LOCALITY, "CN"));
+}
+
+TEST(AddressMetadataTest, IsFieldUsedDependentLocalitySU) {
+ // Unsupported region.
+ EXPECT_FALSE(IsFieldUsed(DEPENDENT_LOCALITY, "SU"));
+}
+
+} // namespace
diff --git a/cpp/test/address_normalizer_test.cc b/cpp/test/address_normalizer_test.cc
new file mode 100644
index 0000000..6f2d9f4
--- /dev/null
+++ b/cpp/test/address_normalizer_test.cc
@@ -0,0 +1,113 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_normalizer.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include "fake_downloader.h"
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::AddressNormalizer;
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::scoped_ptr;
+
+class AddressNormalizerTest : public testing::Test {
+ protected:
+ AddressNormalizerTest()
+ : supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ loaded_(BuildCallback(this, &AddressNormalizerTest::OnLoaded)),
+ normalizer_(&supplier_) {}
+
+ virtual ~AddressNormalizerTest() {}
+
+ PreloadSupplier supplier_;
+ const scoped_ptr<const PreloadSupplier::Callback> loaded_;
+ const AddressNormalizer normalizer_;
+
+ private:
+ void OnLoaded(bool success, const std::string& region_code, int num_rules) {
+ ASSERT_TRUE(success);
+ ASSERT_FALSE(region_code.empty());
+ ASSERT_LT(0, num_rules);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(AddressNormalizerTest);
+};
+
+TEST_F(AddressNormalizerTest, CaliforniaShortNameCa) {
+ supplier_.LoadRules("US", *loaded_);
+ AddressData address;
+ address.language_code = "en-US";
+ address.region_code = "US";
+ address.administrative_area = "California";
+ address.locality = "Mountain View";
+ normalizer_.Normalize(&address);
+ EXPECT_EQ("CA", address.administrative_area);
+}
+
+TEST_F(AddressNormalizerTest, GangwonLatinNameStaysUnchanged) {
+ supplier_.LoadRules("KR", *loaded_);
+ AddressData address;
+ address.language_code = "ko-Latn";
+ address.region_code = "KR";
+ address.administrative_area = "Gangwon";
+ normalizer_.Normalize(&address);
+ EXPECT_EQ("Gangwon", address.administrative_area);
+}
+
+TEST_F(AddressNormalizerTest, GangwonKoreanName) {
+ supplier_.LoadRules("KR", *loaded_);
+ AddressData address;
+ address.language_code = "ko-KR";
+ address.region_code = "KR";
+ address.administrative_area = "강원";
+ normalizer_.Normalize(&address);
+ EXPECT_EQ("강원도", address.administrative_area);
+}
+
+
+TEST_F(AddressNormalizerTest, DontSwitchLatinScriptForUnknownLanguage) {
+ supplier_.LoadRules("KR", *loaded_);
+ AddressData address;
+ address.region_code = "KR";
+ address.administrative_area = "Gangwon";
+ normalizer_.Normalize(&address);
+ EXPECT_EQ("Gangwon", address.administrative_area);
+}
+
+TEST_F(AddressNormalizerTest, DontSwitchLocalScriptForUnknownLanguage) {
+ supplier_.LoadRules("KR", *loaded_);
+ AddressData address;
+ address.region_code = "KR";
+ address.administrative_area = "강원";
+ normalizer_.Normalize(&address);
+ EXPECT_EQ("강원도", address.administrative_area);
+}
+
+} // namespace
diff --git a/cpp/test/address_problem_test.cc b/cpp/test/address_problem_test.cc
new file mode 100644
index 0000000..29532da
--- /dev/null
+++ b/cpp/test/address_problem_test.cc
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_problem.h>
+
+#include <sstream>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressProblem;
+using i18n::addressinput::UNKNOWN_VALUE;
+
+TEST(AddressProblemTest, ValidEnumValue) {
+ std::ostringstream oss;
+ oss << UNKNOWN_VALUE;
+ EXPECT_EQ("UNKNOWN_VALUE", oss.str());
+}
+
+TEST(AddressProblemTest, InvalidEnumValue) {
+ std::ostringstream oss;
+ oss << static_cast<AddressProblem>(-42);
+ EXPECT_EQ("[INVALID ENUM VALUE -42]", oss.str());
+}
+
+} // namespace
diff --git a/cpp/test/address_ui_test.cc b/cpp/test/address_ui_test.cc
new file mode 100644
index 0000000..b36ea8c
--- /dev/null
+++ b/cpp/test/address_ui_test.cc
@@ -0,0 +1,232 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_ui.h>
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_ui_component.h>
+#include <libaddressinput/localization.h>
+
+#include <set>
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::AddressField;
+using i18n::addressinput::AddressUiComponent;
+using i18n::addressinput::BuildComponents;
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::GetRegionCodes;
+using i18n::addressinput::Localization;
+using i18n::addressinput::POSTAL_CODE;
+using i18n::addressinput::RECIPIENT;
+using i18n::addressinput::STREET_ADDRESS;
+
+// Returns testing::AssertionSuccess if the |components| are valid. Uses
+// |region_code| in test failure messages.
+testing::AssertionResult ComponentsAreValid(
+ const std::vector<AddressUiComponent>& components) {
+ if (components.empty()) {
+ return testing::AssertionFailure() << "no components";
+ }
+
+ for (std::vector<AddressUiComponent>::const_iterator
+ component_it = components.begin();
+ component_it != components.end(); ++component_it) {
+ static const AddressField kMinAddressField = COUNTRY;
+ static const AddressField kMaxAddressField = RECIPIENT;
+ if (component_it->field < kMinAddressField ||
+ component_it->field > kMaxAddressField) {
+ return testing::AssertionFailure() << "unexpected field "
+ << component_it->field;
+ }
+
+ if (component_it->name.empty()) {
+ return testing::AssertionFailure() << "empty field name for field "
+ << component_it->field;
+ }
+ }
+
+ return testing::AssertionSuccess();
+}
+
+// Tests for address UI functions.
+class AddressUiTest : public testing::TestWithParam<std::string> {
+ protected:
+ Localization localization_;
+ std::string best_address_language_tag_;
+};
+
+// Verifies that a region code consists of two characters, for example "TW".
+TEST_P(AddressUiTest, RegionCodeHasTwoCharacters) {
+ EXPECT_EQ(2, GetParam().size());
+}
+
+// Verifies that BuildComponents() returns valid UI components for a region
+// code.
+TEST_P(AddressUiTest, ComponentsAreValid) {
+ EXPECT_TRUE(ComponentsAreValid(BuildComponents(
+ GetParam(), localization_, &best_address_language_tag_)));
+}
+
+// Verifies that BuildComponents() returns at most one input field of each type.
+TEST_P(AddressUiTest, UniqueFieldTypes) {
+ std::set<AddressField> fields;
+ const std::vector<AddressUiComponent>& components =
+ BuildComponents(GetParam(), localization_, &best_address_language_tag_);
+ for (std::vector<AddressUiComponent>::const_iterator it = components.begin();
+ it != components.end(); ++it) {
+ EXPECT_TRUE(fields.insert(it->field).second);
+ }
+}
+
+// Test all regions codes.
+INSTANTIATE_TEST_CASE_P(
+ AllRegions, AddressUiTest,
+ testing::ValuesIn(GetRegionCodes()));
+
+// Verifies that BuildComponents() returns an empty vector for an invalid region
+// code.
+TEST_F(AddressUiTest, InvalidRegionCodeReturnsEmptyVector) {
+ EXPECT_TRUE(BuildComponents("INVALID-REGION-CODE", localization_,
+ &best_address_language_tag_).empty());
+}
+
+// Test data for determining the best language tag and whether the right format
+// pattern was used (fmt vs lfmt).
+struct LanguageTestCase {
+ LanguageTestCase(const std::string& region_code,
+ const std::string& ui_language_tag,
+ const std::string& expected_best_address_language_tag,
+ AddressField expected_first_field)
+ : region_code(region_code),
+ ui_language_tag(ui_language_tag),
+ expected_best_address_language_tag(expected_best_address_language_tag),
+ expected_first_field(expected_first_field) {}
+
+ ~LanguageTestCase() {}
+
+ // The CLDR region code to test.
+ const std::string region_code;
+
+ // The BCP 47 language tag to test.
+ const std::string ui_language_tag;
+
+ // The expected value for the best language tag returned by BuildComponents().
+ const std::string expected_best_address_language_tag;
+
+ // The first field expected to be returned from BuildComponents(). Useful for
+ // determining whether the returned format is in Latin or default order.
+ const AddressField expected_first_field;
+};
+
+class BestAddressLanguageTagTest
+ : public testing::TestWithParam<LanguageTestCase> {
+ protected:
+ Localization localization_;
+ std::string best_address_language_tag_;
+};
+
+std::string GetterStub(int) { return std::string(); }
+
+TEST_P(BestAddressLanguageTagTest, CorrectBestAddressLanguageTag) {
+ localization_.SetGetter(&GetterStub, GetParam().ui_language_tag);
+ const std::vector<AddressUiComponent>& components = BuildComponents(
+ GetParam().region_code, localization_, &best_address_language_tag_);
+ EXPECT_EQ(GetParam().expected_best_address_language_tag,
+ best_address_language_tag_);
+ ASSERT_FALSE(components.empty());
+ EXPECT_EQ(GetParam().expected_first_field, components.front().field);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ LanguageTestCases, BestAddressLanguageTagTest,
+ testing::Values(
+ // Armenia supports hy and has a Latin format.
+ LanguageTestCase("AM", "", "hy", RECIPIENT),
+ LanguageTestCase("AM", "hy", "hy", RECIPIENT),
+ LanguageTestCase("AM", "en", "hy-Latn", RECIPIENT),
+
+ // P.R. China supports zh-Hans and has a Latin format.
+ LanguageTestCase("CN", "zh-hans", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "zh-hant", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "zh-hans-CN", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "zh", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "ZH_HANS", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "zh-cmn-Hans-CN", "zh-Hans", POSTAL_CODE),
+ LanguageTestCase("CN", "zh-Latn", "zh-Latn", RECIPIENT),
+ LanguageTestCase("CN", "zh-latn-CN", "zh-Latn", RECIPIENT),
+ LanguageTestCase("CN", "en", "zh-Latn", RECIPIENT),
+ LanguageTestCase("CN", "ja", "zh-Latn", RECIPIENT),
+ LanguageTestCase("CN", "ko", "zh-Latn", RECIPIENT),
+ LanguageTestCase("CN", "ZH_LATN", "zh-Latn", RECIPIENT),
+ // Libaddressinput does not have information about extended language
+ // subtags, so it uses the zh-Latn language tag for all base languages
+ // that are not zh, even if it's effectively the same language.
+ // Mandarin Chinese, Simplified script, as used in China:
+ LanguageTestCase("CN", "cmn-Hans-CN", "zh-Latn", RECIPIENT),
+
+ // Hong Kong supports zh-Hant and en. It has a Latin format.
+ LanguageTestCase("HK", "zh", "zh-Hant", ADMIN_AREA),
+ LanguageTestCase("HK", "zh-hans", "zh-Hant", ADMIN_AREA),
+ LanguageTestCase("HK", "zh-hant", "zh-Hant", ADMIN_AREA),
+ LanguageTestCase("HK", "zh-yue-HK", "zh-Hant", ADMIN_AREA),
+ LanguageTestCase("HK", "en", "en", ADMIN_AREA),
+ LanguageTestCase("HK", "zh-latn", "zh-Latn", RECIPIENT),
+ LanguageTestCase("HK", "fr", "zh-Latn", RECIPIENT),
+ LanguageTestCase("HK", "ja", "zh-Latn", RECIPIENT),
+ LanguageTestCase("HK", "ko", "zh-Latn", RECIPIENT),
+ // Libaddressinput does not have information about extended language
+ // subtags, so it uses the zh-Latn language tag for all base languages
+ // that are not zh or en, even if it's effectively the same language.
+ // Cantonese Chinese, as used in Hong Kong:
+ LanguageTestCase("HK", "yue-HK", "zh-Latn", RECIPIENT),
+
+ // Macao supports zh-Hant and pt. It has a Latin format.
+ LanguageTestCase("MO", "zh", "zh-Hant", STREET_ADDRESS),
+ LanguageTestCase("MO", "zh-Hant", "zh-Hant", STREET_ADDRESS),
+ LanguageTestCase("MO", "pt", "pt", STREET_ADDRESS),
+ LanguageTestCase("MO", "zh-Latn", "zh-Latn", RECIPIENT),
+ LanguageTestCase("MO", "en", "zh-Latn", RECIPIENT),
+
+ // Switzerland supports de, fr, and it.
+ LanguageTestCase("CH", "de", "de", RECIPIENT),
+ LanguageTestCase("CH", "de-DE", "de", RECIPIENT),
+ LanguageTestCase("CH", "de-Latn-DE", "de", RECIPIENT),
+ LanguageTestCase("CH", "fr", "fr", RECIPIENT),
+ LanguageTestCase("CH", "it", "it", RECIPIENT),
+ LanguageTestCase("CH", "en", "de", RECIPIENT),
+
+ // Antarctica does not have language information.
+ LanguageTestCase("AQ", "en", "en", RECIPIENT),
+ LanguageTestCase("AQ", "fr", "fr", RECIPIENT),
+ LanguageTestCase("AQ", "es", "es", RECIPIENT),
+ LanguageTestCase("AQ", "zh-Hans", "zh-Hans", RECIPIENT),
+
+ // Egypt supports ar and has a Latin format.
+ LanguageTestCase("EG", "ar", "ar", RECIPIENT),
+ LanguageTestCase("EG", "ar-Arab", "ar", RECIPIENT),
+ LanguageTestCase("EG", "ar-Latn", "ar-Latn", RECIPIENT),
+ LanguageTestCase("EG", "fr", "ar-Latn", RECIPIENT),
+ LanguageTestCase("EG", "fa", "ar-Latn", RECIPIENT),
+ // Libaddressinput does not have language-to-script mapping, so it uses
+ // the ar-Latn language tag for all base languages that are not ar, even
+ // if the script is the same.
+ LanguageTestCase("EG", "fa-Arab", "ar-Latn", RECIPIENT)));
+
+} // namespace
diff --git a/cpp/test/address_validator_test.cc b/cpp/test/address_validator_test.cc
new file mode 100644
index 0000000..5250502
--- /dev/null
+++ b/cpp/test/address_validator_test.cc
@@ -0,0 +1,335 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/address_validator.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_problem.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/ondemand_supplier.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <utility>
+
+#include <gtest/gtest.h>
+
+#include "fake_downloader.h"
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::AddressValidator;
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::FieldProblemMap;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::OndemandSupplier;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::scoped_ptr;
+
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::LOCALITY;
+using i18n::addressinput::DEPENDENT_LOCALITY;
+using i18n::addressinput::POSTAL_CODE;
+using i18n::addressinput::STREET_ADDRESS;
+
+using i18n::addressinput::UNEXPECTED_FIELD;
+using i18n::addressinput::MISSING_REQUIRED_FIELD;
+using i18n::addressinput::UNKNOWN_VALUE;
+using i18n::addressinput::INVALID_FORMAT;
+using i18n::addressinput::MISMATCHING_VALUE;
+
+class ValidatorWrapper {
+ public:
+ virtual ~ValidatorWrapper() {}
+ virtual void Validate(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const AddressValidator::Callback& validated) = 0;
+};
+
+class OndemandValidatorWrapper : public ValidatorWrapper {
+ public:
+ static ValidatorWrapper* Build() { return new OndemandValidatorWrapper; }
+
+ virtual ~OndemandValidatorWrapper() {}
+
+ virtual void Validate(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const AddressValidator::Callback& validated) {
+ validator_.Validate(
+ address,
+ allow_postal,
+ require_name,
+ filter,
+ problems,
+ validated);
+ }
+
+ private:
+ OndemandValidatorWrapper()
+ : supplier_(FakeDownloader::kFakeDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ validator_(&supplier_) {}
+
+ OndemandSupplier supplier_;
+ const AddressValidator validator_;
+ DISALLOW_COPY_AND_ASSIGN(OndemandValidatorWrapper);
+};
+
+class PreloadValidatorWrapper : public ValidatorWrapper {
+ public:
+ static ValidatorWrapper* Build() { return new PreloadValidatorWrapper; }
+
+ virtual ~PreloadValidatorWrapper() {}
+
+ virtual void Validate(const AddressData& address,
+ bool allow_postal,
+ bool require_name,
+ const FieldProblemMap* filter,
+ FieldProblemMap* problems,
+ const AddressValidator::Callback& validated) {
+ const std::string& region_code = address.region_code;
+ if (!region_code.empty() && !supplier_.IsLoaded(region_code)) {
+ supplier_.LoadRules(region_code, *loaded_);
+ }
+ validator_.Validate(
+ address,
+ allow_postal,
+ require_name,
+ filter,
+ problems,
+ validated);
+ }
+
+ private:
+ PreloadValidatorWrapper()
+ : supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ validator_(&supplier_),
+ loaded_(BuildCallback(this, &PreloadValidatorWrapper::Loaded)) {}
+
+ void Loaded(bool success, const std::string&, int) {
+ ASSERT_TRUE(success);
+ }
+
+ PreloadSupplier supplier_;
+ const AddressValidator validator_;
+ const scoped_ptr<const PreloadSupplier::Callback> loaded_;
+ DISALLOW_COPY_AND_ASSIGN(PreloadValidatorWrapper);
+};
+
+class AddressValidatorTest
+ : public testing::TestWithParam<ValidatorWrapper* (*)()> {
+ protected:
+ AddressValidatorTest()
+ : address_(),
+ allow_postal_(false),
+ require_name_(false),
+ filter_(),
+ problems_(),
+ expected_(),
+ called_(false),
+ validator_wrapper_((*GetParam())()),
+ validated_(BuildCallback(this, &AddressValidatorTest::Validated)) {}
+
+ virtual ~AddressValidatorTest() {}
+
+ void Validate() {
+ validator_wrapper_->Validate(
+ address_,
+ allow_postal_,
+ require_name_,
+ &filter_,
+ &problems_,
+ *validated_);
+ }
+
+ AddressData address_;
+ bool allow_postal_;
+ bool require_name_;
+ FieldProblemMap filter_;
+ FieldProblemMap problems_;
+ FieldProblemMap expected_;
+ bool called_;
+
+ private:
+ void Validated(bool success,
+ const AddressData& address,
+ const FieldProblemMap& problems) {
+ ASSERT_TRUE(success);
+ ASSERT_EQ(&address_, &address);
+ ASSERT_EQ(&problems_, &problems);
+ called_ = true;
+ }
+
+ const scoped_ptr<ValidatorWrapper> validator_wrapper_;
+ const scoped_ptr<const AddressValidator::Callback> validated_;
+
+ DISALLOW_COPY_AND_ASSIGN(AddressValidatorTest);
+};
+
+INSTANTIATE_TEST_CASE_P(OndemandSupplier,
+ AddressValidatorTest,
+ testing::Values(&OndemandValidatorWrapper::Build));
+
+INSTANTIATE_TEST_CASE_P(PreloadSupplier,
+ AddressValidatorTest,
+ testing::Values(&PreloadValidatorWrapper::Build));
+
+TEST_P(AddressValidatorTest, EmptyAddress) {
+ expected_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, InvalidCountry) {
+ address_.region_code = "QZ";
+
+ expected_.insert(std::make_pair(COUNTRY, UNKNOWN_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, ValidAddressUS) {
+ address_.region_code = "US";
+ address_.administrative_area = "CA"; // California
+ address_.locality = "Mountain View";
+ address_.postal_code = "94043";
+ address_.address_line.push_back("1600 Amphitheatre Parkway");
+ address_.language_code = "en";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, InvalidAddressUS) {
+ address_.region_code = "US";
+ address_.postal_code = "123";
+
+ expected_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, ValidAddressCH) {
+ address_.region_code = "CH";
+ address_.locality = "ZH"; /* Zürich */
+ address_.postal_code = "8002";
+ address_.address_line.push_back("Brandschenkestrasse 110");
+ address_.language_code = "de";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, InvalidAddressCH) {
+ address_.region_code = "CH";
+ address_.postal_code = "123";
+
+ expected_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+ expected_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, ValidPostalCodeMX) {
+ address_.region_code = "MX";
+ address_.locality = "Villahermosa";
+ address_.administrative_area = "TAB"; // Tabasco
+ address_.postal_code = "86070";
+ address_.address_line.push_back(
+ /* Av Gregorio Méndez Magaña 1400 */
+ "Av Gregorio M\xC3\xA9ndez Maga\xC3\xB1""a 1400");
+ address_.language_code = "es";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, MismatchingPostalCodeMX) {
+ address_.region_code = "MX";
+ address_.locality = "Villahermosa";
+ address_.administrative_area = "TAB"; // Tabasco
+ address_.postal_code = "80000";
+ address_.address_line.push_back(
+ /* Av Gregorio Méndez Magaña 1400 */
+ "Av Gregorio M\xC3\xA9ndez Maga\xC3\xB1""a 1400");
+ address_.language_code = "es";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, ValidateFilter) {
+ address_.region_code = "CH";
+ address_.postal_code = "123";
+
+ filter_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_P(AddressValidatorTest, ValidateClearsProblems) {
+ address_.region_code = "CH";
+ address_.locality = "ZH"; /* Zürich */
+ address_.postal_code = "123";
+ address_.address_line.push_back("Brandschenkestrasse 110");
+ address_.language_code = "de";
+
+ problems_.insert(std::make_pair(LOCALITY, UNEXPECTED_FIELD));
+ problems_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+ problems_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+} // namespace
diff --git a/cpp/test/fake_downloader.cc b/cpp/test/fake_downloader.cc
new file mode 100644
index 0000000..0f3f8f1
--- /dev/null
+++ b/cpp/test/fake_downloader.cc
@@ -0,0 +1,178 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fake_downloader.h"
+
+#include <cassert>
+#include <fstream>
+#include <map>
+#include <string>
+#include <utility>
+
+#include "lookup_key_util.h"
+
+namespace i18n {
+namespace addressinput {
+
+// static
+const char FakeDownloader::kFakeDataUrl[] = "test:///plain/";
+
+// static
+const char FakeDownloader::kFakeAggregateDataUrl[] = "test:///aggregate/";
+
+namespace {
+
+// The name of the test data file.
+const char kDataFileName[] = TEST_DATA_DIR "/countryinfo.txt";
+
+// The number of characters in the fake data URL prefix.
+const size_t kFakeDataUrlLength = sizeof FakeDownloader::kFakeDataUrl - 1;
+
+// The number of characters in the fake aggregate data URL prefix.
+const size_t kFakeAggregateDataUrlLength =
+ sizeof FakeDownloader::kFakeAggregateDataUrl - 1;
+
+// Each data key begins with this string. Example of a data key:
+// data/CH/AG
+const char kDataKeyPrefix[] = "data/";
+
+// The number of characters in the data key prefix.
+const size_t kDataKeyPrefixLength = sizeof kDataKeyPrefix - 1;
+
+// The number of characters in a CLDR region code, e.g. 'CH'.
+const size_t kCldrRegionCodeLength = 2;
+
+// The number of characters in an aggregate data key, e.g. 'data/CH'.
+const size_t kAggregateDataKeyLength =
+ kDataKeyPrefixLength + kCldrRegionCodeLength;
+
+const LookupKeyUtil& GetLookupKeyUtil() {
+ static const LookupKeyUtil kLookupKeyUtil(FakeDownloader::kFakeDataUrl);
+ return kLookupKeyUtil;
+}
+
+const LookupKeyUtil& GetAggregateLookupKeyUtil() {
+ static const LookupKeyUtil kLookupKeyUtil(
+ FakeDownloader::kFakeAggregateDataUrl);
+ return kLookupKeyUtil;
+}
+
+std::map<std::string, std::string> InitData() {
+ std::map<std::string, std::string> data;
+ std::ifstream file(kDataFileName);
+ assert(file.is_open());
+
+ std::string line;
+ while (file.good()) {
+ // Example line from countryinfo.txt:
+ // data/CH/AG={"name": "Aargau"}
+ std::getline(file, line);
+
+ std::string::size_type divider = line.find('=');
+ if (divider != std::string::npos) {
+ // Example key:
+ // data/CH/AG
+ const std::string& key = line.substr(0, divider);
+
+ // Example value:
+ // {"name": "Aargau"}
+ const std::string& value = line.substr(divider + 1);
+
+ // For example, map 'test:///plain/data/CH/AG' to '{"name": "Aargau"}'.
+ data.insert(std::make_pair(GetLookupKeyUtil().GetUrlForKey(key), value));
+
+ // Aggregate keys that begin with 'data/'. We don't aggregate keys that
+ // begin with 'example/' because example data is not used anywhere.
+ if (key.compare(0,
+ kDataKeyPrefixLength,
+ kDataKeyPrefix,
+ kDataKeyPrefixLength) == 0) {
+ // Example aggregate URL:
+ // test:///aggregate/data/CH
+ const std::string& aggregate_url = GetAggregateLookupKeyUtil()
+ .GetUrlForKey(key.substr(0, kAggregateDataKeyLength));
+
+ std::map<std::string, std::string>::iterator aggregate_data_it =
+ data.find(aggregate_url);
+ if (aggregate_data_it != data.end()) {
+ // Append more data to the aggregate string, for example:
+ // , "data/CH/AG": {"name": "Aargau"}
+ aggregate_data_it->second.append(", \"" + key + "\": " + value);
+ } else {
+ // Begin a new aggregate string, for example:
+ // {"data/CH/AG": {"name": "Aargau"}
+ data.insert(
+ std::make_pair(aggregate_url, "{\"" + key + "\": " + value));
+ }
+ }
+ }
+ }
+ file.close();
+
+ // Make the aggregate data strings valid. For example, this incomplete JSON
+ // data:
+ // {"data/CH/AG": {"name": "Aargau"},
+ // "data/CH": {"name": "SWITZERLAND"}
+ //
+ // becomes valid JSON data like so:
+ //
+ // {"data/CH/AG": {"name": "Aargau"},
+ // "data/CH": {"name": "SWITZERLAND"}}
+ for (std::map<std::string, std::string>::iterator data_it = data.begin();
+ data_it != data.end(); ++data_it) {
+ if (data_it->first.compare(0,
+ kFakeAggregateDataUrlLength,
+ FakeDownloader::kFakeAggregateDataUrl,
+ kFakeAggregateDataUrlLength) == 0) {
+ data_it->second.append("}");
+ }
+ }
+
+ return data;
+}
+
+const std::map<std::string, std::string>& GetData() {
+ static const std::map<std::string, std::string> kData(InitData());
+ return kData;
+}
+
+} // namespace
+
+FakeDownloader::FakeDownloader() {}
+
+FakeDownloader::~FakeDownloader() {}
+
+void FakeDownloader::Download(const std::string& url,
+ const Callback& downloaded) const {
+ std::map<std::string, std::string>::const_iterator data_it =
+ GetData().find(url);
+ bool success = data_it != GetData().end();
+ std::string* data = NULL;
+ if (success) {
+ data = new std::string(data_it->second);
+ } else if (GetLookupKeyUtil().IsValidationDataUrl(url) ||
+ GetAggregateLookupKeyUtil().IsValidationDataUrl(url)) {
+ // URLs that start with "https://i18napis.appspot.com/ssl-address/" or
+ // "https://i18napis.appspot.com/ssl-aggregate-address/" prefix, but do not
+ // have associated data will always return "{}" with status code 200.
+ // FakeDownloader imitates this behavior for URLs that start with
+ // "test://address/" and "test://aggregate-address/" prefixes.
+ success = true;
+ data = new std::string("{}");
+ }
+ downloaded(success, url, data);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/test/fake_downloader.h b/cpp/test/fake_downloader.h
new file mode 100644
index 0000000..111ce7a
--- /dev/null
+++ b/cpp/test/fake_downloader.h
@@ -0,0 +1,75 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A fake downloader object to use in tests. Reads data from a file instead of
+// downloading it from a server.
+
+#ifndef I18N_ADDRESSINPUT_TEST_FAKE_DOWNLOADER_H_
+#define I18N_ADDRESSINPUT_TEST_FAKE_DOWNLOADER_H_
+
+#include <libaddressinput/downloader.h>
+
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// "Downloads" serialized validation rules from a test data file. Sample usage:
+// class MyClass {
+// public:
+// MyClass() : downloader_(),
+// callback_(BuildCallback(this, &MyClass::OnDownloaded)) {}
+//
+// ~MyClass() {}
+//
+// void GetData(const std::string& key) {
+// downloader_.Download(std::string(FakeDownloader::kFakeDataUrl) + key,
+// *callback_);
+// }
+//
+// private:
+// void OnDownloaded(bool success,
+// const std::string& url,
+// std::string* data) {
+// ...
+// delete data;
+// }
+//
+// FakeDownloader downloader_;
+// scoped_ptr<Downloader::Callback> callback_;
+//
+// DISALLOW_COPY_AND_ASSIGN(MyClass);
+// };
+class FakeDownloader : public Downloader {
+ public:
+ // The fake data URL to be used in tests for retrieving one key at a time.
+ static const char kFakeDataUrl[];
+
+ // The fake data URL to be used in tests for retrieving aggregate data, which
+ // is a JSON dictionary that maps from keys to dictionaries of what you would
+ // normally get from kFakeDataUrl.
+ static const char kFakeAggregateDataUrl[];
+
+ FakeDownloader();
+ virtual ~FakeDownloader();
+
+ // Downloader implementation.
+ virtual void Download(const std::string& url,
+ const Callback& downloaded) const;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_TEST_FAKE_DOWNLOADER_H_
diff --git a/cpp/test/fake_downloader_test.cc b/cpp/test/fake_downloader_test.cc
new file mode 100644
index 0000000..2d88acc
--- /dev/null
+++ b/cpp/test/fake_downloader_test.cc
@@ -0,0 +1,208 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fake_downloader.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/downloader.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "region_data_constants.h"
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::Downloader;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::RegionDataConstants;
+using i18n::addressinput::scoped_ptr;
+
+// Tests for FakeDownloader object.
+class FakeDownloaderTest : public testing::TestWithParam<std::string> {
+ protected:
+ FakeDownloaderTest() : downloader_(), success_(false), url_(), data_() {}
+ virtual ~FakeDownloaderTest() {}
+
+ Downloader::Callback* BuildCallback() {
+ return ::BuildCallback(this, &FakeDownloaderTest::OnDownloaded);
+ }
+
+ FakeDownloader downloader_;
+ bool success_;
+ std::string url_;
+ std::string data_;
+
+ private:
+ void OnDownloaded(bool success, const std::string& url, std::string* data) {
+ ASSERT_FALSE(success && data == NULL);
+ success_ = success;
+ url_ = url;
+ if (data != NULL) {
+ data_ = *data;
+ delete data;
+ }
+ }
+};
+
+// Returns testing::AssertionSuccess if |data| is valid downloaded data for
+// |key|.
+testing::AssertionResult DataIsValid(const std::string& data,
+ const std::string& key) {
+ if (data.empty()) {
+ return testing::AssertionFailure() << "empty data";
+ }
+
+ std::string expected_data_begin = "{\"id\":\"" + key + "\"";
+ if (data.compare(0, expected_data_begin.length(), expected_data_begin) != 0) {
+ return testing::AssertionFailure() << data << " does not begin with "
+ << expected_data_begin;
+ }
+
+ // Verify that the data ends on "}.
+ static const char kDataEnd[] = "\"}";
+ static const size_t kDataEndLength = sizeof kDataEnd - 1;
+ if (data.compare(data.length() - kDataEndLength,
+ kDataEndLength,
+ kDataEnd,
+ kDataEndLength) != 0) {
+ return testing::AssertionFailure() << data << " does not end with "
+ << kDataEnd;
+ }
+
+ return testing::AssertionSuccess();
+}
+
+// Verifies that FakeDownloader downloads valid data for a region code.
+TEST_P(FakeDownloaderTest, FakeDownloaderHasValidDataForRegion) {
+ std::string key = "data/" + GetParam();
+ std::string url = std::string(FakeDownloader::kFakeDataUrl) + key;
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(url, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(url, url_);
+ EXPECT_TRUE(DataIsValid(data_, key));
+};
+
+// Returns testing::AssertionSuccess if |data| is valid aggregated downloaded
+// data for |key|.
+testing::AssertionResult AggregateDataIsValid(const std::string& data,
+ const std::string& key) {
+ if (data.empty()) {
+ return testing::AssertionFailure() << "empty data";
+ }
+
+ std::string expected_data_begin = "{\"" + key;
+ if (data.compare(0, expected_data_begin.length(), expected_data_begin) != 0) {
+ return testing::AssertionFailure() << data << " does not begin with "
+ << expected_data_begin;
+ }
+
+ // Verify that the data ends on "}}.
+ static const char kDataEnd[] = "\"}}";
+ static const size_t kDataEndLength = sizeof kDataEnd - 1;
+ if (data.compare(data.length() - kDataEndLength,
+ kDataEndLength,
+ kDataEnd,
+ kDataEndLength) != 0) {
+ return testing::AssertionFailure() << data << " does not end with "
+ << kDataEnd;
+ }
+
+ return testing::AssertionSuccess();
+}
+
+// Verifies that FakeDownloader downloads valid aggregated data for a region
+// code.
+TEST_P(FakeDownloaderTest, FakeDownloaderHasValidAggregatedDataForRegion) {
+ std::string key = "data/" + GetParam();
+ std::string url = std::string(FakeDownloader::kFakeAggregateDataUrl) + key;
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(url, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(url, url_);
+ EXPECT_TRUE(AggregateDataIsValid(data_, key));
+};
+
+// Test all region codes.
+INSTANTIATE_TEST_CASE_P(
+ AllRegions, FakeDownloaderTest,
+ testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
+
+// Verifies that the key "data" also contains valid data.
+TEST_F(FakeDownloaderTest, DownloadExistingData) {
+ static const std::string kKey = "data";
+ static const std::string kUrl =
+ std::string(FakeDownloader::kFakeDataUrl) + kKey;
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(kUrl, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kUrl, url_);
+ EXPECT_TRUE(DataIsValid(data_, kKey));
+}
+
+// Verifies that downloading a missing key will return "{}".
+TEST_F(FakeDownloaderTest, DownloadMissingKeyReturnsEmptyDictionary) {
+ static const std::string kJunkUrl =
+ std::string(FakeDownloader::kFakeDataUrl) + "junk";
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(kJunkUrl, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kJunkUrl, url_);
+ EXPECT_EQ("{}", data_);
+}
+
+// Verifies that aggregate downloading of a missing key will also return "{}".
+TEST_F(FakeDownloaderTest, AggregateDownloadMissingKeyReturnsEmptyDictionary) {
+ static const std::string kJunkUrl =
+ std::string(FakeDownloader::kFakeAggregateDataUrl) + "junk";
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(kJunkUrl, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kJunkUrl, url_);
+ EXPECT_EQ("{}", data_);
+}
+
+// Verifies that downloading an empty key will return "{}".
+TEST_F(FakeDownloaderTest, DownloadEmptyKeyReturnsEmptyDictionary) {
+ static const std::string kPrefixOnlyUrl = FakeDownloader::kFakeDataUrl;
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(kPrefixOnlyUrl, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kPrefixOnlyUrl, url_);
+ EXPECT_EQ("{}", data_);
+}
+
+// Verifies that downloading a real URL fails.
+TEST_F(FakeDownloaderTest, DownloadRealUrlFals) {
+ static const std::string kRealUrl = "http://www.google.com/";
+ scoped_ptr<Downloader::Callback> callback(BuildCallback());
+ downloader_.Download(kRealUrl, *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kRealUrl, url_);
+ EXPECT_TRUE(data_.empty());
+}
+
+} // namespace
diff --git a/cpp/test/fake_storage.cc b/cpp/test/fake_storage.cc
new file mode 100644
index 0000000..7ba96c8
--- /dev/null
+++ b/cpp/test/fake_storage.cc
@@ -0,0 +1,54 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fake_storage.h"
+
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <string>
+#include <utility>
+
+namespace i18n {
+namespace addressinput {
+
+FakeStorage::FakeStorage() {}
+
+FakeStorage::~FakeStorage() {
+ for (std::map<std::string, std::string*>::const_iterator
+ it = data_.begin(); it != data_.end(); ++it) {
+ delete it->second;
+ }
+}
+
+void FakeStorage::Put(const std::string& key, std::string* data) {
+ assert(data != NULL);
+ std::pair<std::map<std::string, std::string*>::iterator, bool> result =
+ data_.insert(std::make_pair(key, data));
+ if (!result.second) {
+ // Replace data in existing entry for this key.
+ delete result.first->second;
+ result.first->second = data;
+ }
+}
+
+void FakeStorage::Get(const std::string& key,
+ const Callback& data_ready) const {
+ std::map<std::string, std::string*>::const_iterator data_it = data_.find(key);
+ bool success = data_it != data_.end();
+ data_ready(success, key, success ? new std::string(*data_it->second) : NULL);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/test/fake_storage.h b/cpp/test/fake_storage.h
new file mode 100644
index 0000000..5e07cb0
--- /dev/null
+++ b/cpp/test/fake_storage.h
@@ -0,0 +1,74 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A fake storage object to use in tests. Stores data in memory instead of
+// writing it to disk. All operations are synchronous.
+
+#ifndef I18N_ADDRESSINPUT_FAKE_STORAGE_H_
+#define I18N_ADDRESSINPUT_FAKE_STORAGE_H_
+
+#include <libaddressinput/storage.h>
+
+#include <map>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// Stores data in memory. Sample usage:
+// class MyClass {
+// public:
+// MyClass() : storage_(),
+// callback(BuildCallback(this, &MyClass::OnDataReady)) {}
+//
+// ~MyClass() {}
+//
+// void Write() {
+// storage_.Put("key", "value");
+// }
+//
+// void Read() {
+// storage_.Get("key", *callback_);
+// }
+//
+// private:
+// void OnDataReady(bool success,
+// const std::string& key,
+// std::string* data) {
+// ...
+// delete data;
+// }
+//
+// FakeStorage storage_;
+// scoped_ptr<Storage::Callback> callback_;
+//
+// DISALLOW_COPY_AND_ASSIGN(MyClass);
+// };
+class FakeStorage : public Storage {
+ public:
+ FakeStorage();
+ virtual ~FakeStorage();
+
+ // Storage implementation.
+ virtual void Put(const std::string& key, std::string* data);
+ virtual void Get(const std::string& key, const Callback& data_ready) const;
+
+ private:
+ std::map<std::string, std::string*> data_;
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_FAKE_STORAGE_H_
diff --git a/cpp/test/fake_storage_test.cc b/cpp/test/fake_storage_test.cc
new file mode 100644
index 0000000..49663ca
--- /dev/null
+++ b/cpp/test/fake_storage_test.cc
@@ -0,0 +1,94 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fake_storage.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeStorage;
+using i18n::addressinput::scoped_ptr;
+using i18n::addressinput::Storage;
+
+// Tests for FakeStorage object.
+class FakeStorageTest : public testing::Test {
+ protected:
+ FakeStorageTest() : storage_(), success_(false), key_(), data_() {}
+ virtual ~FakeStorageTest() {}
+
+ Storage::Callback* BuildCallback() {
+ return ::BuildCallback(this, &FakeStorageTest::OnDataReady);
+ }
+
+ FakeStorage storage_;
+ bool success_;
+ std::string key_;
+ std::string data_;
+
+ private:
+ void OnDataReady(bool success,
+ const std::string& key,
+ std::string* data) {
+ ASSERT_FALSE(success && data == NULL);
+ success_ = success;
+ key_ = key;
+ if (data != NULL) {
+ data_ = *data;
+ delete data;
+ }
+ }
+};
+
+TEST_F(FakeStorageTest, GetWithoutPutReturnsEmptyData) {
+ scoped_ptr<Storage::Callback> callback(BuildCallback());
+ storage_.Get("key", *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ("key", key_);
+ EXPECT_TRUE(data_.empty());
+}
+
+TEST_F(FakeStorageTest, GetReturnsWhatWasPut) {
+ storage_.Put("key", new std::string("value"));
+
+ scoped_ptr<Storage::Callback> callback(BuildCallback());
+ storage_.Get("key", *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ("key", key_);
+ EXPECT_EQ("value", data_);
+}
+
+TEST_F(FakeStorageTest, SecondPutOverwritesData) {
+ storage_.Put("key", new std::string("bad-value"));
+ storage_.Put("key", new std::string("good-value"));
+
+ scoped_ptr<Storage::Callback> callback(BuildCallback());
+ storage_.Get("key", *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ("key", key_);
+ EXPECT_EQ("good-value", data_);
+}
+
+} // namespace
diff --git a/cpp/test/format_element_test.cc b/cpp/test/format_element_test.cc
new file mode 100644
index 0000000..f4b8ae5
--- /dev/null
+++ b/cpp/test/format_element_test.cc
@@ -0,0 +1,56 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "format_element.h"
+
+#include <sstream>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::FormatElement;
+using i18n::addressinput::SORTING_CODE;
+
+TEST(FormatElementTest, StreamFunctionNewline) {
+ std::ostringstream oss;
+ oss << FormatElement();
+ EXPECT_EQ("Newline", oss.str());
+}
+
+TEST(FormatElementTest, StreamFunctionLiteral) {
+ std::ostringstream oss;
+ oss << FormatElement("Text");
+ EXPECT_EQ("Literal: Text", oss.str());
+}
+
+TEST(FormatElementTest, StreamFunctionField) {
+ std::ostringstream oss;
+ oss << FormatElement(SORTING_CODE);
+ EXPECT_EQ("Field: SORTING_CODE", oss.str());
+}
+
+TEST(FormatElementTest, IsNewline) {
+ EXPECT_TRUE(FormatElement().IsNewline());
+ EXPECT_FALSE(FormatElement(" ").IsNewline());
+ EXPECT_FALSE(FormatElement(SORTING_CODE).IsNewline());
+}
+
+TEST(FormatElementTest, IsField) {
+ EXPECT_FALSE(FormatElement().IsField());
+ EXPECT_FALSE(FormatElement(" ").IsField());
+ EXPECT_TRUE(FormatElement(SORTING_CODE).IsField());
+}
+
+} // namespace
diff --git a/cpp/test/language_test.cc b/cpp/test/language_test.cc
new file mode 100644
index 0000000..197459e
--- /dev/null
+++ b/cpp/test/language_test.cc
@@ -0,0 +1,62 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "language.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::Language;
+
+struct LanguageTestCase {
+ LanguageTestCase(const std::string& input_language_tag,
+ const std::string& expected_language_tag,
+ const std::string& expected_base_language,
+ bool expected_has_latin_script)
+ : input_language_tag(input_language_tag),
+ expected_language_tag(expected_language_tag),
+ expected_base_language(expected_base_language),
+ expected_has_latin_script(expected_has_latin_script) {}
+
+ ~LanguageTestCase() {}
+
+ const std::string input_language_tag;
+ const std::string expected_language_tag;
+ const std::string expected_base_language;
+ const bool expected_has_latin_script;
+};
+
+class LanguageTest : public testing::TestWithParam<LanguageTestCase> {};
+
+TEST_P(LanguageTest, ExtractedDataIsCorrect) {
+ Language language(GetParam().input_language_tag);
+ EXPECT_EQ(GetParam().expected_language_tag, language.tag);
+ EXPECT_EQ(GetParam().expected_base_language, language.base);
+ EXPECT_EQ(GetParam().expected_has_latin_script, language.has_latin_script);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ LanguageTestCases, LanguageTest,
+ testing::Values(
+ LanguageTestCase("", "", "", false),
+ LanguageTestCase("en", "en", "en", false),
+ LanguageTestCase("zh-Latn-CN", "zh-Latn-CN", "zh", true),
+ LanguageTestCase("zh-cmn-Latn-CN", "zh-cmn-Latn-CN", "zh", true),
+ LanguageTestCase("zh-Hans", "zh-Hans", "zh", false),
+ LanguageTestCase("en_GB", "en-GB", "en", false)));
+
+} // namespace
diff --git a/cpp/test/localization_test.cc b/cpp/test/localization_test.cc
new file mode 100644
index 0000000..d1c4a9d
--- /dev/null
+++ b/cpp/test/localization_test.cc
@@ -0,0 +1,483 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/localization.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "grit.h"
+#include "messages.h"
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::AddressField;
+using i18n::addressinput::AddressProblem;
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::COUNTRY;
+using i18n::addressinput::DEPENDENT_LOCALITY;
+using i18n::addressinput::INVALID_FORMAT;
+using i18n::addressinput::INVALID_MESSAGE_ID;
+using i18n::addressinput::LOCALITY;
+using i18n::addressinput::Localization;
+using i18n::addressinput::MISMATCHING_VALUE;
+using i18n::addressinput::MISSING_REQUIRED_FIELD;
+using i18n::addressinput::POSTAL_CODE;
+using i18n::addressinput::RECIPIENT;
+using i18n::addressinput::SORTING_CODE;
+using i18n::addressinput::STREET_ADDRESS;
+using i18n::addressinput::UNKNOWN_VALUE;
+using i18n::addressinput::USES_P_O_BOX;
+
+// Tests for Localization object.
+class LocalizationTest : public testing::TestWithParam<int> {
+ protected:
+ Localization localization_;
+};
+
+// Verifies that a custom message getter can be used.
+static const char kValidMessage[] = "Data";
+static const char kValidLanguageTag[] = "tlh";
+std::string GetValidMessage(int message_id) { return kValidMessage; }
+TEST_P(LocalizationTest, ValidStringGetterCanBeUsed) {
+ localization_.SetGetter(&GetValidMessage, kValidLanguageTag);
+ EXPECT_EQ(kValidMessage, localization_.GetString(GetParam()));
+ EXPECT_EQ(kValidLanguageTag, localization_.GetLanguage());
+}
+
+// Verifies that the default language for messages does not have empty strings.
+TEST_P(LocalizationTest, DefaultStringIsNotEmpty) {
+ EXPECT_FALSE(localization_.GetString(GetParam()).empty());
+}
+
+// Verifies that the messages do not have newlines.
+TEST_P(LocalizationTest, NoNewline) {
+ EXPECT_EQ(std::string::npos, localization_.GetString(GetParam()).find('\n'));
+}
+
+// Verifies that the messages do not have double spaces.
+TEST_P(LocalizationTest, NoDoubleSpace) {
+ EXPECT_EQ(std::string::npos,
+ localization_.GetString(GetParam()).find(std::string(2U, ' ')));
+}
+
+// Verifies that the default string is English.
+TEST_P(LocalizationTest, DefaultStringIsEnglish) {
+ std::string default_string = localization_.GetString(GetParam());
+ localization_.SetLanguage("en");
+ EXPECT_EQ(default_string, localization_.GetString(GetParam()));
+}
+
+// Tests all message identifiers.
+INSTANTIATE_TEST_CASE_P(
+ AllMessages, LocalizationTest,
+ testing::Values(
+ IDS_LIBADDRESSINPUT_COUNTRY_OR_REGION_LABEL,
+ IDS_LIBADDRESSINPUT_LOCALITY_LABEL,
+ IDS_LIBADDRESSINPUT_ADDRESS_LINE_1_LABEL,
+ IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL,
+ IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL,
+ IDS_LIBADDRESSINPUT_AREA,
+ IDS_LIBADDRESSINPUT_COUNTY,
+ IDS_LIBADDRESSINPUT_DEPARTMENT,
+ IDS_LIBADDRESSINPUT_DISTRICT,
+ IDS_LIBADDRESSINPUT_DO_SI,
+ IDS_LIBADDRESSINPUT_EMIRATE,
+ IDS_LIBADDRESSINPUT_ISLAND,
+ IDS_LIBADDRESSINPUT_PARISH,
+ IDS_LIBADDRESSINPUT_PREFECTURE,
+ IDS_LIBADDRESSINPUT_PROVINCE,
+ IDS_LIBADDRESSINPUT_STATE,
+ IDS_LIBADDRESSINPUT_RECIPIENT_LABEL,
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_FIELD,
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE_AND_URL,
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_POSTAL_CODE_EXAMPLE,
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE_AND_URL,
+ IDS_LIBADDRESSINPUT_MISSING_REQUIRED_ZIP_CODE_EXAMPLE,
+ IDS_LIBADDRESSINPUT_UNKNOWN_VALUE,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE_AND_URL,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE_EXAMPLE,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_POSTAL_CODE,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE_AND_URL,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP_CODE_EXAMPLE,
+ IDS_LIBADDRESSINPUT_UNRECOGNIZED_FORMAT_ZIP,
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE_URL,
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_POSTAL_CODE,
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP_URL,
+ IDS_LIBADDRESSINPUT_MISMATCHING_VALUE_ZIP,
+ IDS_LIBADDRESSINPUT_PO_BOX_FORBIDDEN_VALUE));
+
+// Verifies that an invalid message identifier results in an empty string in the
+// default configuration.
+TEST_F(LocalizationTest, InvalidMessageIsEmptyString) {
+ EXPECT_TRUE(localization_.GetString(INVALID_MESSAGE_ID).empty());
+}
+
+// Verifies that the default language is English.
+TEST_F(LocalizationTest, DefaultLanguageIsEnglish) {
+ EXPECT_EQ("en", localization_.GetLanguage());
+}
+
+TEST(LocalizationGetErrorMessageTest, MissingRequiredPostalCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "CH";
+ EXPECT_EQ(std::string("You must provide a postal code, for example") +
+ " 2544,1211,1556,3030." +
+ " Don't know your postal code? Find it out" +
+ " <a href=\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\">" +
+ "here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, true, true));
+ EXPECT_EQ(std::string("You must provide a postal code, for example") +
+ " 2544,1211,1556,3030.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, true, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, false, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, MissingRequiredZipCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ EXPECT_EQ(std::string("You must provide a ZIP code, for example") +
+ " 95014,22162-1010." +
+ " Don't know your ZIP code? Find it out" +
+ " <a href=\"https://tools.usps.com/go/ZipLookupAction!" +
+ "input.action\">here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, true, true));
+ EXPECT_EQ(std::string("You must provide a ZIP code, for example") +
+ " 95014,22162-1010.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, true, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, false, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISSING_REQUIRED_FIELD, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, MissingRequiredOtherFields) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ std::vector<AddressField> other_fields;
+ other_fields.push_back(COUNTRY);
+ other_fields.push_back(ADMIN_AREA);
+ other_fields.push_back(LOCALITY);
+ other_fields.push_back(DEPENDENT_LOCALITY);
+ other_fields.push_back(SORTING_CODE);
+ other_fields.push_back(STREET_ADDRESS);
+ other_fields.push_back(RECIPIENT);
+ for (std::vector<AddressField>::iterator it = other_fields.begin();
+ it != other_fields.end(); it++) {
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(
+ address, *it, MISSING_REQUIRED_FIELD, true, true));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(
+ address, *it, MISSING_REQUIRED_FIELD, true, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(
+ address, *it, MISSING_REQUIRED_FIELD, false, false));
+ EXPECT_EQ("You can't leave this empty.",
+ localization.GetErrorMessage(
+ address, *it, MISSING_REQUIRED_FIELD, false, true));
+ }
+}
+
+TEST(LocalizationGetErrorMessageTest, UnknownValueOtherFields) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ address.administrative_area = "bad admin area";
+ address.locality = "bad locality";
+ address.dependent_locality = "bad dependent locality";
+ address.sorting_code = "bad sorting code";
+ std::vector<std::string> address_line;
+ address_line.push_back("bad address line 1");
+ address_line.push_back("bad address line 2");
+ address.address_line = address_line;
+ address.recipient = "bad recipient";
+ EXPECT_EQ(std::string("US ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, COUNTRY, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("US ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, COUNTRY, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("US ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, COUNTRY, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("US ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, COUNTRY, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad admin area ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, ADMIN_AREA, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad admin area ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, ADMIN_AREA, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad admin area ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, ADMIN_AREA, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad admin area ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, ADMIN_AREA, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, LOCALITY, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, LOCALITY, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, LOCALITY, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, LOCALITY, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad dependent locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, DEPENDENT_LOCALITY, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad dependent locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, DEPENDENT_LOCALITY, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad dependent locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, DEPENDENT_LOCALITY, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad dependent locality ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, DEPENDENT_LOCALITY, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad sorting code ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, SORTING_CODE, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad sorting code ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, SORTING_CODE, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad sorting code ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, SORTING_CODE, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad sorting code ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, SORTING_CODE, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad address line 1 ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, STREET_ADDRESS, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad address line 1 ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, STREET_ADDRESS, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad address line 1 ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, STREET_ADDRESS, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad address line 1 ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, STREET_ADDRESS, UNKNOWN_VALUE, false, true));
+ EXPECT_EQ(std::string("bad recipient ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, RECIPIENT, UNKNOWN_VALUE, true, true));
+ EXPECT_EQ(std::string("bad recipient ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, RECIPIENT, UNKNOWN_VALUE, true, false));
+ EXPECT_EQ(std::string("bad recipient ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, RECIPIENT, UNKNOWN_VALUE, false, false));
+ EXPECT_EQ(std::string("bad recipient ") +
+ "is not recognized as a known value for this field.",
+ localization.GetErrorMessage(
+ address, RECIPIENT, UNKNOWN_VALUE, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, InvalidFormatPostalCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "CH";
+ EXPECT_EQ(std::string("This postal code format is not recognized. Example ") +
+ "of a valid postal code:" +
+ " 2544,1211,1556,3030." +
+ " Don't know your postal code? Find it out" +
+ " <a href=\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\">" +
+ "here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, true, true));
+ EXPECT_EQ(std::string("This postal code format is not recognized. Example ") +
+ "of a valid postal code:" +
+ " 2544,1211,1556,3030.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, true, false));
+ EXPECT_EQ("This postal code format is not recognized.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, false, false));
+ EXPECT_EQ("This postal code format is not recognized.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, InvalidFormatZipCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ EXPECT_EQ(std::string("This ZIP code format is not recognized. Example of ") +
+ "a valid ZIP code:" +
+ " 95014,22162-1010." +
+ " Don't know your ZIP code? Find it out" +
+ " <a href=\"https://tools.usps.com/go/ZipLookupAction!" +
+ "input.action\">here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, true, true));
+ EXPECT_EQ(std::string("This ZIP code format is not recognized. Example of ") +
+ "a valid ZIP code:" +
+ " 95014,22162-1010.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, true, false));
+ EXPECT_EQ("This ZIP code format is not recognized.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, false, false));
+ EXPECT_EQ("This ZIP code format is not recognized.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ INVALID_FORMAT, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, MismatchingValuePostalCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "CH";
+ EXPECT_EQ(std::string("This postal code does not appear to match the rest ") +
+ "of this address." +
+ " Don't know your postal code? Find it out" +
+ " <a href=\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\">" +
+ "here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, true, true));
+ EXPECT_EQ(std::string("This postal code does not appear to match the rest ") +
+ "of this address.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, true, false));
+ EXPECT_EQ(std::string("This postal code does not appear to match the rest ") +
+ "of this address.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, false, false));
+ EXPECT_EQ(std::string("This postal code does not appear to match the rest ") +
+ "of this address." +
+ " Don't know your postal code? Find it out" +
+ " <a href=\"http://www.post.ch/db/owa/pv_plz_pack/pr_main\">" +
+ "here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, MismatchingValueZipCode) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ EXPECT_EQ(std::string("This ZIP code does not appear to match the rest of ") +
+ "this address." +
+ " Don't know your ZIP code? Find it out" +
+ " <a href=\"https://tools.usps.com/go/ZipLookupAction!" +
+ "input.action\">here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, true, true));
+ EXPECT_EQ(std::string("This ZIP code does not appear to match the rest of ") +
+ "this address.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, true, false));
+ EXPECT_EQ(std::string("This ZIP code does not appear to match the rest of ") +
+ "this address.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, false, false));
+ EXPECT_EQ(std::string("This ZIP code does not appear to match the rest of ") +
+ "this address." +
+ " Don't know your ZIP code? Find it out" +
+ " <a href=\"https://tools.usps.com/go/ZipLookupAction!" +
+ "input.action\">here</a>.",
+ localization.GetErrorMessage(address, POSTAL_CODE,
+ MISMATCHING_VALUE, false, true));
+}
+
+TEST(LocalizationGetErrorMessageTest, UsesPOBoxOtherFields) {
+ Localization localization;
+ AddressData address;
+ address.region_code = "US";
+ std::vector<AddressField> other_fields;
+ other_fields.push_back(COUNTRY);
+ other_fields.push_back(ADMIN_AREA);
+ other_fields.push_back(LOCALITY);
+ other_fields.push_back(DEPENDENT_LOCALITY);
+ other_fields.push_back(SORTING_CODE);
+ other_fields.push_back(STREET_ADDRESS);
+ other_fields.push_back(RECIPIENT);
+ for (std::vector<AddressField>::iterator it = other_fields.begin();
+ it != other_fields.end(); it++) {
+ EXPECT_EQ(std::string("This address line appears to contain a post ") +
+ "office box. Please use a street" +
+ " or building address.",
+ localization.GetErrorMessage(
+ address, *it, USES_P_O_BOX, true, true));
+ EXPECT_EQ(std::string("This address line appears to contain a post ") +
+ "office box. Please use a street" +
+ " or building address.",
+ localization.GetErrorMessage(
+ address, *it, USES_P_O_BOX, true, false));
+ EXPECT_EQ(std::string("This address line appears to contain a post ") +
+ "office box. Please use a street" +
+ " or building address.",
+ localization.GetErrorMessage(
+ address, *it, USES_P_O_BOX, false, false));
+ EXPECT_EQ(std::string("This address line appears to contain a post ") +
+ "office box. Please use a street" +
+ " or building address.",
+ localization.GetErrorMessage(
+ address, *it, USES_P_O_BOX, false, true));
+ }
+}
+
+} // namespace
diff --git a/cpp/test/lookup_key_test.cc b/cpp/test/lookup_key_test.cc
new file mode 100644
index 0000000..18668f8
--- /dev/null
+++ b/cpp/test/lookup_key_test.cc
@@ -0,0 +1,172 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "lookup_key.h"
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/util/basictypes.h>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::LookupKey;
+
+const size_t kMaxDepth = arraysize(LookupKey::kHierarchy) - 1;
+
+TEST(LookupKeyTest, Empty) {
+ AddressData address;
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/ZZ", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, AddressDepth1) {
+ AddressData address;
+ address.region_code = "111";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(0, lookup_key.GetDepth());
+ EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, AddressDepth2) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(1, lookup_key.GetDepth());
+ EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, AddressDepth3) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ address.locality = "333";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(2, lookup_key.GetDepth());
+ EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, AddressDepth4) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ address.locality = "333";
+ address.dependent_locality = "444";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(3, lookup_key.GetDepth());
+ EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, AddressDepthNonContiguous) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ // No LOCALITY specified.
+ address.dependent_locality = "444";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(1, lookup_key.GetDepth());
+ EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
+}
+
+TEST(LookupKeyTest, RequestDepth) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ address.locality = "333";
+ address.dependent_locality = "444";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/111", lookup_key.ToKeyString(0));
+ EXPECT_EQ("data/111/222", lookup_key.ToKeyString(1));
+ EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(2));
+ EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(3));
+}
+
+TEST(LookupKeyTest, WithLanguageCodeDefaultLanguage) {
+ AddressData address;
+ // Use real data here as the choice of adding a language requires metadata.
+ address.region_code = "CA";
+ address.administrative_area = "ON";
+ address.language_code = "en";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
+ EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
+}
+
+TEST(LookupKeyTest, WithLanguageCodeAlternateLanguage) {
+ AddressData address;
+ // Use real data here as the choice of adding a language requires metadata.
+ address.region_code = "CA";
+ address.administrative_area = "ON";
+ address.language_code = "fr";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/CA--fr", lookup_key.ToKeyString(0));
+ EXPECT_EQ("data/CA/ON--fr", lookup_key.ToKeyString(1));
+}
+
+TEST(LookupKeyTest, WithLanguageCodeInvalidLanguage) {
+ AddressData address;
+ // Use real data here as the choice of adding a language requires metadata.
+ address.region_code = "CA";
+ address.administrative_area = "ON";
+ address.language_code = "de";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
+ EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
+}
+
+TEST(LookupKeyTest, WithLanguageCodeAlternateLanguageNoState) {
+ AddressData address;
+ // Use real data here as the choice of adding a language requires metadata.
+ // Afgahnistan has multiple languages (including Pashto as an alternative)
+ // but no subregions.
+ address.region_code = "AF";
+ address.language_code = "ps";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/AF", lookup_key.ToKeyString(0));
+}
+
+TEST(LookupKeyTest, GetRegionCode) {
+ AddressData address;
+ address.region_code = "rrr";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ(address.region_code, lookup_key.GetRegionCode());
+}
+
+TEST(LookupKeyTest, FromAddressClearsExistingNodes) {
+ AddressData address;
+ address.region_code = "111";
+ address.administrative_area = "222";
+ LookupKey lookup_key;
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
+ address.administrative_area.clear();
+ lookup_key.FromAddress(address);
+ EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
+}
+
+} // namespace
diff --git a/cpp/test/lookup_key_util_test.cc b/cpp/test/lookup_key_util_test.cc
new file mode 100644
index 0000000..a210bd5
--- /dev/null
+++ b/cpp/test/lookup_key_util_test.cc
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "lookup_key_util.h"
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::LookupKeyUtil;
+
+TEST(LookupKeyUtilTest, GetUrlForKey) {
+ const LookupKeyUtil util("test:///");
+ EXPECT_EQ("test:///", util.GetUrlForKey(""));
+ EXPECT_EQ("test:///data", util.GetUrlForKey("data"));
+ EXPECT_EQ("test:///data/US", util.GetUrlForKey("data/US"));
+ EXPECT_EQ("test:///data/CA--fr", util.GetUrlForKey("data/CA--fr"));
+}
+
+TEST(LookupKeyUtilTest, GetKeyForUrl) {
+ const LookupKeyUtil util("test:///");
+ EXPECT_EQ("", util.GetKeyForUrl("test://"));
+ EXPECT_EQ("", util.GetKeyForUrl("http://www.google.com/"));
+ EXPECT_EQ("", util.GetKeyForUrl(""));
+ EXPECT_EQ("", util.GetKeyForUrl("test:///"));
+ EXPECT_EQ("data", util.GetKeyForUrl("test:///data"));
+ EXPECT_EQ("data/US", util.GetKeyForUrl("test:///data/US"));
+ EXPECT_EQ("data/CA--fr", util.GetKeyForUrl("test:///data/CA--fr"));
+}
+
+TEST(LookupKeyUtilTest, IsValidationDataUrl) {
+ const LookupKeyUtil util("test:///");
+ EXPECT_FALSE(util.IsValidationDataUrl("test://"));
+ EXPECT_FALSE(util.IsValidationDataUrl("http://www.google.com/"));
+ EXPECT_FALSE(util.IsValidationDataUrl(""));
+ EXPECT_TRUE(util.IsValidationDataUrl("test:///"));
+ EXPECT_TRUE(util.IsValidationDataUrl("test:///data"));
+ EXPECT_TRUE(util.IsValidationDataUrl("test:///data/US"));
+ EXPECT_TRUE(util.IsValidationDataUrl("test:///data/CA--fr"));
+}
+
+} // namespace
diff --git a/cpp/test/mock_downloader.cc b/cpp/test/mock_downloader.cc
new file mode 100644
index 0000000..71256aa
--- /dev/null
+++ b/cpp/test/mock_downloader.cc
@@ -0,0 +1,49 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "mock_downloader.h"
+
+#include <cassert>
+#include <cstddef>
+#include <map>
+#include <string>
+
+namespace i18n {
+namespace addressinput {
+
+// static
+const char MockDownloader::kMockDataUrl[] = "mock:///";
+
+namespace {
+
+// The number of characters in the mock data URL prefix.
+const size_t kMockDataUrlLength = sizeof MockDownloader::kMockDataUrl - 1;
+
+} // namespace
+
+MockDownloader::MockDownloader() {}
+
+MockDownloader::~MockDownloader() {}
+
+void MockDownloader::Download(const std::string& url,
+ const Callback& downloaded) const {
+ assert(url.compare(0, kMockDataUrlLength, kMockDataUrl) == 0);
+ std::string key(url, kMockDataUrlLength);
+ std::map<std::string, std::string>::const_iterator it = data_.find(key);
+ bool success = it != data_.end();
+ downloaded(success, url, success ? new std::string(it->second) : NULL);
+}
+
+} // namespace addressinput
+} // namespace i18n
diff --git a/cpp/test/mock_downloader.h b/cpp/test/mock_downloader.h
new file mode 100644
index 0000000..b423660
--- /dev/null
+++ b/cpp/test/mock_downloader.h
@@ -0,0 +1,80 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A mock downloader object to use in tests.
+
+#ifndef I18N_ADDRESSINPUT_TEST_MOCK_DOWNLOADER_H_
+#define I18N_ADDRESSINPUT_TEST_MOCK_DOWNLOADER_H_
+
+#include <libaddressinput/downloader.h>
+
+#include <map>
+#include <string>
+
+#include <libaddressinput/util/basictypes.h>
+
+namespace i18n {
+namespace addressinput {
+
+// "Downloads" serialized validation rules from a key-value map. Sample usage:
+// class MyClass {
+// public:
+// MyClass() : downloader_(),
+// callback_(BuildCallback(this, &MyClass::OnDownloaded)) {
+// downloader_.data_.insert(
+// std::make_pair("data/XA", "{\"id\":\"data/XA\"}"));
+// }
+//
+// ~MyClass() {}
+//
+// void GetData(const std::string& key) {
+// downloader_.Download(std::string(MockDownloader::kMockDataUrl) + key,
+// *callback_);
+// }
+//
+// private:
+// void OnDownloaded(bool success,
+// const std::string& url,
+// std::string* data) {
+// ...
+// delete data;
+// }
+//
+// MockDownloader downloader_;
+// const scoped_ptr<const Downloader::Callback> callback_;
+//
+// DISALLOW_COPY_AND_ASSIGN(MyClass);
+// };
+class MockDownloader : public Downloader {
+ public:
+ // The mock data URL to be used in tests.
+ static const char kMockDataUrl[];
+
+ MockDownloader();
+ virtual ~MockDownloader();
+
+ // Downloader implementation.
+ virtual void Download(const std::string& url,
+ const Callback& downloaded) const;
+
+ std::map<std::string, std::string> data_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockDownloader);
+};
+
+} // namespace addressinput
+} // namespace i18n
+
+#endif // I18N_ADDRESSINPUT_TEST_MOCK_DOWNLOADER_H_
diff --git a/cpp/test/null_storage_test.cc b/cpp/test/null_storage_test.cc
new file mode 100644
index 0000000..dca0803
--- /dev/null
+++ b/cpp/test/null_storage_test.cc
@@ -0,0 +1,78 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::scoped_ptr;
+using i18n::addressinput::Storage;
+
+class NullStorageTest : public testing::Test {
+ protected:
+ NullStorageTest() {}
+
+ Storage::Callback* BuildCallback() {
+ return ::BuildCallback(this, &NullStorageTest::OnDataReady);
+ }
+
+ NullStorage storage_;
+ bool success_;
+ std::string key_;
+ std::string data_;
+
+ static const char kKey[];
+
+ private:
+ void OnDataReady(bool success, const std::string& key, std::string* data) {
+ ASSERT_FALSE(success && data == NULL);
+ success_ = success;
+ key_ = key;
+ if (data != NULL) {
+ data_ = *data;
+ delete data;
+ }
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(NullStorageTest);
+};
+
+const char NullStorageTest::kKey[] = "foo";
+
+TEST_F(NullStorageTest, Put) {
+ // The Put() method should not do anything, so this test only tests that the
+ // code compiles and that the call doesn't crash.
+ storage_.Put(kKey, new std::string("bar"));
+}
+
+TEST_F(NullStorageTest, Get) {
+ const scoped_ptr<const Storage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_TRUE(data_.empty());
+}
+
+} // namespace
diff --git a/cpp/test/ondemand_supply_task_test.cc b/cpp/test/ondemand_supply_task_test.cc
new file mode 100644
index 0000000..84b2f65
--- /dev/null
+++ b/cpp/test/ondemand_supply_task_test.cc
@@ -0,0 +1,235 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "ondemand_supply_task.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <cstring>
+#include <map>
+#include <string>
+#include <utility>
+
+#include <gtest/gtest.h>
+
+#include "lookup_key.h"
+#include "mock_downloader.h"
+#include "retriever.h"
+#include "rule.h"
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::LookupKey;
+using i18n::addressinput::MockDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::OndemandSupplyTask;
+using i18n::addressinput::Retriever;
+using i18n::addressinput::Rule;
+using i18n::addressinput::scoped_ptr;
+using i18n::addressinput::Supplier;
+
+class OndemandSupplyTaskTest : public testing::Test {
+ protected:
+ OndemandSupplyTaskTest()
+ : success_(true),
+ lookup_key_(),
+ rule_(),
+ called_(false),
+ downloader_(new MockDownloader),
+ rule_cache_(),
+ retriever_(
+ new Retriever(
+ MockDownloader::kMockDataUrl, downloader_, new NullStorage)),
+ supplied_(BuildCallback(this, &OndemandSupplyTaskTest::Supplied)),
+ task_(new OndemandSupplyTask(lookup_key_, &rule_cache_, *supplied_)) {}
+
+ virtual ~OndemandSupplyTaskTest() {
+ for (std::map<std::string, const Rule*>::const_iterator
+ it = rule_cache_.begin(); it != rule_cache_.end(); ++it) {
+ delete it->second;
+ }
+ }
+
+ void Queue(const std::string& key) {
+ task_->Queue(key);
+ }
+
+ void Retrieve() {
+ task_->Retrieve(*retriever_);
+ }
+
+ bool success_; // Expected status from MockDownloader.
+ LookupKey lookup_key_; // Stub.
+ const Rule* rule_[arraysize(LookupKey::kHierarchy)];
+ bool called_;
+ MockDownloader* const downloader_;
+
+ private:
+ void Supplied(bool success,
+ const LookupKey& lookup_key,
+ const Supplier::RuleHierarchy& hierarchy) {
+ ASSERT_EQ(success_, success);
+ ASSERT_EQ(&lookup_key_, &lookup_key);
+ ASSERT_EQ(&task_->hierarchy_, &hierarchy);
+ std::memcpy(rule_, hierarchy.rule, sizeof rule_);
+ called_ = true;
+ }
+
+ std::map<std::string, const Rule*> rule_cache_;
+ const scoped_ptr<Retriever> retriever_;
+ const scoped_ptr<const Supplier::Callback> supplied_;
+ OndemandSupplyTask* const task_;
+
+ DISALLOW_COPY_AND_ASSIGN(OndemandSupplyTaskTest);
+};
+
+TEST_F(OndemandSupplyTaskTest, Empty) {
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] == NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_F(OndemandSupplyTaskTest, Invalid) {
+ Queue("data/XA");
+
+ success_ = false;
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+}
+
+TEST_F(OndemandSupplyTaskTest, Valid) {
+ downloader_->data_.insert(std::make_pair("data/XA", "{\"id\":\"data/XA\"}"));
+
+ Queue("data/XA");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+
+ EXPECT_EQ("data/XA", rule_[0]->GetId());
+
+ // All rules on the COUNTRY level inherit from the default rule.
+ EXPECT_FALSE(rule_[0]->GetFormat().empty());
+ EXPECT_FALSE(rule_[0]->GetRequired().empty());
+ EXPECT_TRUE(rule_[0]->GetPostalCodeMatcher() == NULL);
+}
+
+TEST_F(OndemandSupplyTaskTest, ValidHierarchy) {
+ downloader_->data_.insert(
+ std::make_pair("data/XA", "{\"id\":\"data/XA\"}"));
+ downloader_->data_.insert(
+ std::make_pair("data/XA/aa", "{\"id\":\"data/XA/aa\"}"));
+ downloader_->data_.insert(
+ std::make_pair("data/XA/aa/bb", "{\"id\":\"data/XA/aa/bb\"}"));
+ downloader_->data_.insert(
+ std::make_pair("data/XA/aa/bb/cc", "{\"id\":\"data/XA/aa/bb/cc\"}"));
+
+ Queue("data/XA");
+ Queue("data/XA/aa");
+ Queue("data/XA/aa/bb");
+ Queue("data/XA/aa/bb/cc");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] != NULL);
+ EXPECT_TRUE(rule_[3] != NULL);
+
+ EXPECT_EQ("data/XA", rule_[0]->GetId());
+ EXPECT_EQ("data/XA/aa", rule_[1]->GetId());
+ EXPECT_EQ("data/XA/aa/bb", rule_[2]->GetId());
+ EXPECT_EQ("data/XA/aa/bb/cc", rule_[3]->GetId());
+
+ // All rules on the COUNTRY level inherit from the default rule.
+ EXPECT_FALSE(rule_[0]->GetFormat().empty());
+ EXPECT_FALSE(rule_[0]->GetRequired().empty());
+
+ // Only rules on the COUNTRY level inherit from the default rule.
+ EXPECT_TRUE(rule_[1]->GetFormat().empty());
+ EXPECT_TRUE(rule_[1]->GetRequired().empty());
+ EXPECT_TRUE(rule_[2]->GetFormat().empty());
+ EXPECT_TRUE(rule_[2]->GetRequired().empty());
+ EXPECT_TRUE(rule_[3]->GetFormat().empty());
+ EXPECT_TRUE(rule_[3]->GetRequired().empty());
+}
+
+TEST_F(OndemandSupplyTaskTest, InvalidJson1) {
+ downloader_->data_.insert(std::make_pair("data/XA", ":"));
+
+ success_ = false;
+
+ Queue("data/XA");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+}
+
+TEST_F(OndemandSupplyTaskTest, InvalidJson2) {
+ downloader_->data_.insert(std::make_pair("data/XA", "{\"id\":\"data/XA\"}"));
+ downloader_->data_.insert(std::make_pair("data/XA/aa", ":"));
+
+ success_ = false;
+
+ Queue("data/XA");
+ Queue("data/XA/aa");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+}
+
+TEST_F(OndemandSupplyTaskTest, EmptyJsonJustMeansServerKnowsNothingAboutKey) {
+ downloader_->data_.insert(std::make_pair("data/XA", "{\"id\":\"data/XA\"}"));
+ downloader_->data_.insert(std::make_pair("data/XA/aa", "{}"));
+
+ Queue("data/XA");
+ Queue("data/XA/aa");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+
+ EXPECT_EQ("data/XA", rule_[0]->GetId());
+}
+
+TEST_F(OndemandSupplyTaskTest, IfCountryFailsAllFails) {
+ downloader_->data_.insert(
+ std::make_pair("data/XA/aa", "{\"id\":\"data/XA/aa\"}"));
+
+ success_ = false;
+
+ Queue("data/XA");
+ Queue("data/XA/aa");
+
+ ASSERT_NO_FATAL_FAILURE(Retrieve());
+ ASSERT_TRUE(called_);
+}
+
+} // namespace
diff --git a/cpp/test/post_box_matchers_test.cc b/cpp/test/post_box_matchers_test.cc
new file mode 100644
index 0000000..d89ee0b
--- /dev/null
+++ b/cpp/test/post_box_matchers_test.cc
@@ -0,0 +1,87 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "post_box_matchers.h"
+
+#include <cstddef>
+#include <vector>
+
+#include "rule.h"
+
+#include <gtest/gtest.h>
+
+namespace i18n {
+namespace addressinput {
+class RE2ptr;
+} // namespace addressinput
+} // namespace i18n
+
+namespace {
+
+using i18n::addressinput::PostBoxMatchers;
+using i18n::addressinput::RE2ptr;
+using i18n::addressinput::Rule;
+
+TEST(PostBoxMatchersTest, AlwaysGetMatcherForLanguageUnd) {
+ Rule rule;
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(1, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+}
+
+TEST(PostBoxMatchersTest, NoMatcherForInvalidLanguage) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"xx\"}"));
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(1, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+}
+
+TEST(PostBoxMatchersTest, HasMatcherForValidLanguage) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"sv\"}"));
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(2, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+ EXPECT_TRUE(matchers[1] != NULL);
+}
+
+TEST(PostBoxMatchersTest, MixValidAndInvalidLanguage) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"xx~sv\"}"));
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(2, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+ EXPECT_TRUE(matchers[1] != NULL);
+}
+
+TEST(PostBoxMatchersTest, UseBaseLanguageForMatching) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"sv-SE\"}"));
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(2, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+ EXPECT_TRUE(matchers[1] != NULL);
+}
+
+TEST(PostBoxMatchersTest, LenientLanguageTagParsing) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"SV_SE\"}"));
+ std::vector<const RE2ptr*> matchers = PostBoxMatchers::GetMatchers(rule);
+ EXPECT_EQ(2, matchers.size());
+ EXPECT_TRUE(matchers[0] != NULL);
+ EXPECT_TRUE(matchers[1] != NULL);
+}
+
+} // namespace
diff --git a/cpp/test/preload_supplier_test.cc b/cpp/test/preload_supplier_test.cc
new file mode 100644
index 0000000..ab787d8
--- /dev/null
+++ b/cpp/test/preload_supplier_test.cc
@@ -0,0 +1,124 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/preload_supplier.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include "fake_downloader.h"
+#include "lookup_key.h"
+#include "rule.h"
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::LookupKey;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::Rule;
+using i18n::addressinput::scoped_ptr;
+
+class PreloadSupplierTest : public testing::Test {
+ protected:
+ PreloadSupplierTest()
+ : supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ loaded_callback_(BuildCallback(this, &PreloadSupplierTest::OnLoaded)) {}
+
+ virtual ~PreloadSupplierTest() {}
+
+ PreloadSupplier supplier_;
+ scoped_ptr<PreloadSupplier::Callback> loaded_callback_;
+
+ private:
+ void OnLoaded(bool success, const std::string& region_code, int num_rules) {
+ ASSERT_TRUE(success);
+ ASSERT_FALSE(region_code.empty());
+ ASSERT_LT(0, num_rules);
+ ASSERT_TRUE(supplier_.IsLoaded(region_code));
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(PreloadSupplierTest);
+};
+
+TEST_F(PreloadSupplierTest, GetUsRule) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ LookupKey us_key;
+ AddressData us_address;
+ us_address.region_code = "US";
+ us_key.FromAddress(us_address);
+ const Rule* rule = supplier_.GetRule(us_key);
+ ASSERT_TRUE(rule != NULL);
+ EXPECT_EQ("data/US", rule->GetId());
+}
+
+TEST_F(PreloadSupplierTest, GetUsCaRule) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ LookupKey ca_key;
+ AddressData ca_address;
+ ca_address.region_code = "US";
+ ca_address.administrative_area = "CA";
+ ca_key.FromAddress(ca_address);
+ const Rule* rule = supplier_.GetRule(ca_key);
+ ASSERT_TRUE(rule != NULL);
+ EXPECT_EQ("data/US/CA", rule->GetId());
+}
+
+TEST_F(PreloadSupplierTest, GetZwRule) {
+ supplier_.LoadRules("ZW", *loaded_callback_);
+ LookupKey zw_key;
+ AddressData zw_address;
+ zw_address.region_code = "ZW";
+ zw_key.FromAddress(zw_address);
+ const Rule* rule = supplier_.GetRule(zw_key);
+ ASSERT_TRUE(rule != NULL);
+ EXPECT_EQ("data/ZW", rule->GetId());
+}
+
+TEST_F(PreloadSupplierTest, GetUnknownRule) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ LookupKey unknown_key;
+ AddressData unknown_address;
+ unknown_address.region_code = "US";
+ unknown_address.administrative_area = "ZZ";
+ unknown_key.FromAddress(unknown_address);
+ const Rule* rule = supplier_.GetRule(unknown_key);
+ EXPECT_TRUE(rule == NULL);
+}
+
+TEST_F(PreloadSupplierTest, GetTooPreciseRule) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ LookupKey precise_key;
+ AddressData precise_address;
+ precise_address.region_code = "US";
+ precise_address.administrative_area = "CA";
+ precise_address.locality = "Mountain View";
+ precise_key.FromAddress(precise_address);
+ const Rule* rule = supplier_.GetRule(precise_key);
+ EXPECT_TRUE(rule == NULL);
+}
+
+} // namespace
diff --git a/cpp/test/region_data_builder_test.cc b/cpp/test/region_data_builder_test.cc
new file mode 100644
index 0000000..03b0981
--- /dev/null
+++ b/cpp/test/region_data_builder_test.cc
@@ -0,0 +1,124 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/region_data_builder.h>
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/region_data.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include "fake_downloader.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::RegionData;
+using i18n::addressinput::RegionDataBuilder;
+using i18n::addressinput::scoped_ptr;
+
+class RegionDataBuilderTest : public testing::Test {
+ protected:
+ RegionDataBuilderTest()
+ : supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ builder_(&supplier_),
+ loaded_callback_(BuildCallback(this, &RegionDataBuilderTest::OnLoaded)),
+ best_language_() {}
+
+ virtual ~RegionDataBuilderTest() {}
+
+ PreloadSupplier supplier_;
+ RegionDataBuilder builder_;
+ scoped_ptr<PreloadSupplier::Callback> loaded_callback_;
+ std::string best_language_;
+
+ private:
+ void OnLoaded(bool success, const std::string& region_code, int num_rules) {
+ ASSERT_TRUE(success);
+ ASSERT_FALSE(region_code.empty());
+ ASSERT_LT(0, num_rules);
+ ASSERT_TRUE(supplier_.IsLoaded(region_code));
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(RegionDataBuilderTest);
+};
+
+TEST_F(RegionDataBuilderTest, BuildUsRegionTree) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ const RegionData& tree = builder_.Build("US", "en-US", &best_language_);
+ EXPECT_FALSE(tree.sub_regions().empty());
+}
+
+TEST_F(RegionDataBuilderTest, BuildCnRegionTree) {
+ supplier_.LoadRules("CN", *loaded_callback_);
+ const RegionData& tree = builder_.Build("CN", "zh-Hans", &best_language_);
+ ASSERT_FALSE(tree.sub_regions().empty());
+ EXPECT_FALSE(tree.sub_regions().front()->sub_regions().empty());
+}
+
+TEST_F(RegionDataBuilderTest, BuildChRegionTree) {
+ supplier_.LoadRules("CH", *loaded_callback_);
+ const RegionData& tree = builder_.Build("CH", "de-CH", &best_language_);
+ // Although "CH" has information for its administrative divisions, the
+ // administrative area field is not used, which results in an empty tree of
+ // sub-regions.
+ EXPECT_TRUE(tree.sub_regions().empty());
+}
+
+TEST_F(RegionDataBuilderTest, BuildZwRegionTree) {
+ supplier_.LoadRules("ZW", *loaded_callback_);
+ const RegionData& tree = builder_.Build("ZW", "en-ZW", &best_language_);
+ EXPECT_TRUE(tree.sub_regions().empty());
+}
+
+TEST_F(RegionDataBuilderTest, UsTreeHasStateAbbreviationsAndNames) {
+ supplier_.LoadRules("US", *loaded_callback_);
+ const RegionData& tree = builder_.Build("US", "en-US", &best_language_);
+ EXPECT_EQ("en", best_language_);
+ ASSERT_FALSE(tree.sub_regions().empty());
+ EXPECT_EQ("AL", tree.sub_regions().front()->key());
+ EXPECT_EQ("Alabama", tree.sub_regions().front()->name());
+}
+
+TEST_F(RegionDataBuilderTest,
+ KrWithKoLatnLanguageHasKoreanKeysAndLatinScriptNames) {
+ supplier_.LoadRules("KR", *loaded_callback_);
+ const RegionData& tree = builder_.Build("KR", "ko-Latn", &best_language_);
+ EXPECT_EQ("ko-Latn", best_language_);
+ ASSERT_FALSE(tree.sub_regions().empty());
+ EXPECT_EQ("강원도", tree.sub_regions().front()->key());
+ EXPECT_EQ("Gangwon", tree.sub_regions().front()->name());
+}
+
+TEST_F(RegionDataBuilderTest, KrWithKoKrLanguageHasKoreanKeysAndNames) {
+ supplier_.LoadRules("KR", *loaded_callback_);
+ const RegionData& tree = builder_.Build("KR", "ko-KR", &best_language_);
+ EXPECT_EQ("ko", best_language_);
+ ASSERT_FALSE(tree.sub_regions().empty());
+ EXPECT_EQ("강원도", tree.sub_regions().front()->key());
+ EXPECT_EQ("강원", tree.sub_regions().front()->name());
+}
+
+} // namespace
diff --git a/cpp/test/region_data_constants_test.cc b/cpp/test/region_data_constants_test.cc
new file mode 100644
index 0000000..b407374
--- /dev/null
+++ b/cpp/test/region_data_constants_test.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "region_data_constants.h"
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::RegionDataConstants;
+
+// Tests for region codes, for example "ZA".
+class RegionCodeTest : public testing::TestWithParam<std::string> {};
+
+// Verifies that a region code consists of two characters, for example "ZA".
+TEST_P(RegionCodeTest, RegionCodeHasTwoCharacters) {
+ EXPECT_EQ(2, GetParam().length());
+}
+
+// Test all region codes.
+INSTANTIATE_TEST_CASE_P(
+ AllRegionCodes, RegionCodeTest,
+ testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
+
+// Returns AssertionSuccess if |data| begins with '{' and ends with '}'.
+testing::AssertionResult HasCurlyBraces(const std::string& data) {
+ if (data.empty()) {
+ return testing::AssertionFailure() << "data is empty";
+ }
+ if (data[0] != '{') {
+ return testing::AssertionFailure() << data << " does not start with '{'";
+ }
+ if (data[data.length() - 1] != '}') {
+ return testing::AssertionFailure() << data << " does not end with '}'";
+ }
+ return testing::AssertionSuccess();
+}
+
+// Verifies that the default region data begins with '{' and ends with '}'.
+TEST(DefaultRegionDataTest, DefaultRegionHasCurlyBraces) {
+ EXPECT_TRUE(HasCurlyBraces(RegionDataConstants::GetDefaultRegionData()));
+}
+
+// Tests for region data, for example "{\"fmt\":\"%C%S\"}".
+class RegionDataTest : public testing::TestWithParam<std::string> {
+ protected:
+ const std::string& GetData() const {
+ return RegionDataConstants::GetRegionData(GetParam());
+ }
+};
+
+// Verifies that a region data value begins with '{' and end with '}', for
+// example "{\"fmt\":\"%C%S\"}".
+TEST_P(RegionDataTest, RegionDataHasCurlyBraces) {
+ EXPECT_TRUE(HasCurlyBraces(GetData()));
+}
+
+// Test all region data.
+INSTANTIATE_TEST_CASE_P(
+ AllRegionData, RegionDataTest,
+ testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
+
+TEST(RegionDataConstantsTest, GetMaxLookupKeyDepth) {
+ EXPECT_EQ(0, RegionDataConstants::GetMaxLookupKeyDepth("NZ"));
+ EXPECT_EQ(1, RegionDataConstants::GetMaxLookupKeyDepth("HK"));
+ EXPECT_EQ(2, RegionDataConstants::GetMaxLookupKeyDepth("US"));
+ EXPECT_EQ(3, RegionDataConstants::GetMaxLookupKeyDepth("CN"));
+}
+
+} // namespace
diff --git a/cpp/test/region_data_test.cc b/cpp/test/region_data_test.cc
new file mode 100644
index 0000000..66d06c6
--- /dev/null
+++ b/cpp/test/region_data_test.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/region_data.h>
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::RegionData;
+
+TEST(RegionDataTest, NoParentByDefault) {
+ static const std::string kEmpty;
+ RegionData region(kEmpty);
+ EXPECT_FALSE(region.has_parent());
+}
+
+TEST(RegionDataTest, NoSubRegionsByDefault) {
+ static const std::string kEmpty;
+ RegionData region(kEmpty);
+ EXPECT_TRUE(region.sub_regions().empty());
+}
+
+TEST(RegionDataTest, SubRegionGetsParent) {
+ static const std::string kEmpty;
+ RegionData region(kEmpty);
+ region.AddSubRegion(kEmpty, kEmpty);
+ ASSERT_EQ(1U, region.sub_regions().size());
+ ASSERT_TRUE(region.sub_regions()[0] != NULL);
+ EXPECT_EQ(&region, &region.sub_regions()[0]->parent());
+}
+
+} // namespace
diff --git a/cpp/test/retriever_test.cc b/cpp/test/retriever_test.cc
new file mode 100644
index 0000000..aff418c
--- /dev/null
+++ b/cpp/test/retriever_test.cc
@@ -0,0 +1,193 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "retriever.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "fake_downloader.h"
+#include "mock_downloader.h"
+
+#define CHECKSUM "dd63dafcbd4d5b28badfcaf86fb6fcdb"
+#define DATA "{'foo': 'bar'}"
+#define OLD_TIMESTAMP "0"
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::MockDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::Retriever;
+using i18n::addressinput::Storage;
+using i18n::addressinput::scoped_ptr;
+
+const char kKey[] = "data/CA/AB--fr";
+
+// Empty data that the downloader can return.
+const char kEmptyData[] = "{}";
+
+// The value of the data that the stale storage returns.
+const char kStaleData[] = DATA;
+
+// The actual data that the stale storage returns.
+const char kStaleWrappedData[] = "timestamp=" OLD_TIMESTAMP "\n"
+ "checksum=" CHECKSUM "\n"
+ DATA;
+
+// Tests for Retriever object.
+class RetrieverTest : public testing::Test {
+ protected:
+ RetrieverTest()
+ : retriever_(FakeDownloader::kFakeDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ success_(false),
+ key_(),
+ data_() {}
+
+ virtual ~RetrieverTest() {}
+
+ Retriever::Callback* BuildCallback() {
+ return ::BuildCallback(this, &RetrieverTest::OnDataReady);
+ }
+
+ Retriever retriever_;
+ bool success_;
+ std::string key_;
+ std::string data_;
+
+ private:
+ void OnDataReady(bool success,
+ const std::string& key,
+ const std::string& data) {
+ success_ = success;
+ key_ = key;
+ data_ = data;
+ }
+};
+
+TEST_F(RetrieverTest, RetrieveData) {
+ scoped_ptr<Retriever::Callback> callback(BuildCallback());
+ retriever_.Retrieve(kKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_FALSE(data_.empty());
+ EXPECT_NE(kEmptyData, data_);
+}
+
+TEST_F(RetrieverTest, ReadDataFromStorage) {
+ scoped_ptr<Retriever::Callback> callback1(BuildCallback());
+ retriever_.Retrieve(kKey, *callback1);
+
+ scoped_ptr<Retriever::Callback> callback2(BuildCallback());
+ retriever_.Retrieve(kKey, *callback2);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_FALSE(data_.empty());
+ EXPECT_NE(kEmptyData, data_);
+}
+
+TEST_F(RetrieverTest, MissingKeyReturnsEmptyData) {
+ static const char kMissingKey[] = "junk";
+
+ scoped_ptr<Retriever::Callback> callback(BuildCallback());
+ retriever_.Retrieve(kMissingKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kMissingKey, key_);
+ EXPECT_EQ(kEmptyData, data_);
+}
+
+TEST_F(RetrieverTest, FaultyDownloader) {
+ // An empty MockDownloader will fail for any request.
+ Retriever bad_retriever(MockDownloader::kMockDataUrl,
+ new MockDownloader,
+ new NullStorage);
+
+ scoped_ptr<Retriever::Callback> callback(BuildCallback());
+ bad_retriever.Retrieve(kKey, *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_TRUE(data_.empty());
+}
+
+// The storage that always returns stale data.
+class StaleStorage : public Storage {
+ public:
+ StaleStorage() : data_updated_(false) {}
+ virtual ~StaleStorage() {}
+
+ // Storage implementation.
+ virtual void Get(const std::string& key, const Callback& data_ready) const {
+ data_ready(true, key, new std::string(kStaleWrappedData));
+ }
+
+ virtual void Put(const std::string& key, std::string* value) {
+ ASSERT_TRUE(value != NULL);
+ data_updated_ = true;
+ delete value;
+ }
+
+ bool data_updated_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(StaleStorage);
+};
+
+TEST_F(RetrieverTest, UseStaleDataWhenDownloaderFails) {
+ // Owned by |resilient_retriver|.
+ StaleStorage* stale_storage = new StaleStorage;
+ // An empty MockDownloader will fail for any request.
+ Retriever resilient_retriever(
+ MockDownloader::kMockDataUrl, new MockDownloader, stale_storage);
+
+ scoped_ptr<Retriever::Callback> callback(BuildCallback());
+ resilient_retriever.Retrieve(kKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_EQ(kStaleData, data_);
+ EXPECT_FALSE(stale_storage->data_updated_);
+}
+
+TEST_F(RetrieverTest, DoNotUseStaleDataWhenDownloaderSucceeds) {
+ // Owned by |resilient_retriver|.
+ StaleStorage* stale_storage = new StaleStorage;
+ Retriever resilient_retriever(
+ FakeDownloader::kFakeDataUrl, new FakeDownloader, stale_storage);
+
+ scoped_ptr<Retriever::Callback> callback(BuildCallback());
+ resilient_retriever.Retrieve(kKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_FALSE(data_.empty());
+ EXPECT_NE(kEmptyData, data_);
+ EXPECT_NE(kStaleData, data_);
+ EXPECT_TRUE(stale_storage->data_updated_);
+}
+
+} // namespace
diff --git a/cpp/test/rule_retriever_test.cc b/cpp/test/rule_retriever_test.cc
new file mode 100644
index 0000000..ecfb0c8
--- /dev/null
+++ b/cpp/test/rule_retriever_test.cc
@@ -0,0 +1,93 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "rule_retriever.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "fake_downloader.h"
+#include "retriever.h"
+#include "rule.h"
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::Retriever;
+using i18n::addressinput::Rule;
+using i18n::addressinput::RuleRetriever;
+using i18n::addressinput::scoped_ptr;
+
+// Tests for RuleRetriever object.
+class RuleRetrieverTest : public testing::Test {
+ protected:
+ RuleRetrieverTest()
+ : rule_retriever_(new Retriever(FakeDownloader::kFakeDataUrl,
+ new FakeDownloader,
+ new NullStorage)),
+ success_(false),
+ key_(),
+ rule_() {}
+
+ virtual ~RuleRetrieverTest() {}
+
+ RuleRetriever::Callback* BuildCallback() {
+ return ::BuildCallback(this, &RuleRetrieverTest::OnRuleReady);
+ }
+
+ RuleRetriever rule_retriever_;
+ bool success_;
+ std::string key_;
+ Rule rule_;
+
+ private:
+ void OnRuleReady(bool success,
+ const std::string& key,
+ const Rule& rule) {
+ success_ = success;
+ key_ = key;
+ rule_.CopyFrom(rule);
+ }
+};
+
+TEST_F(RuleRetrieverTest, ExistingRule) {
+ static const char kExistingKey[] = "data/CA";
+
+ scoped_ptr<RuleRetriever::Callback> callback(BuildCallback());
+ rule_retriever_.RetrieveRule(kExistingKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kExistingKey, key_);
+ EXPECT_FALSE(rule_.GetFormat().empty());
+}
+
+TEST_F(RuleRetrieverTest, MissingRule) {
+ static const char kMissingKey[] = "junk";
+
+ scoped_ptr<RuleRetriever::Callback> callback(BuildCallback());
+ rule_retriever_.RetrieveRule(kMissingKey, *callback);
+
+ EXPECT_TRUE(success_); // The server returns "{}" for bad keys.
+ EXPECT_EQ(kMissingKey, key_);
+ EXPECT_TRUE(rule_.GetFormat().empty());
+}
+
+} // namespace
diff --git a/cpp/test/rule_test.cc b/cpp/test/rule_test.cc
new file mode 100644
index 0000000..25426a2
--- /dev/null
+++ b/cpp/test/rule_test.cc
@@ -0,0 +1,371 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "rule.h"
+
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/localization.h>
+
+#include <cstddef>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "address_field_util.h"
+#include "format_element.h"
+#include "grit.h"
+#include "messages.h"
+#include "region_data_constants.h"
+#include "util/json.h"
+
+namespace {
+
+using i18n::addressinput::AddressField;
+using i18n::addressinput::ADMIN_AREA;
+using i18n::addressinput::FormatElement;
+using i18n::addressinput::INVALID_MESSAGE_ID;
+using i18n::addressinput::Json;
+using i18n::addressinput::LOCALITY;
+using i18n::addressinput::Localization;
+using i18n::addressinput::RegionDataConstants;
+using i18n::addressinput::Rule;
+using i18n::addressinput::STREET_ADDRESS;
+
+TEST(RuleTest, CopyOverwritesRule) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{"
+ "\"fmt\":\"%S%Z\","
+ "\"lfmt\":\"%Z%S\","
+ "\"id\":\"data/XA\","
+ "\"name\":\"Le Test\","
+ "\"lname\":\"Testistan\","
+ "\"require\":\"AC\","
+ "\"sub_keys\":\"aa~bb~cc\","
+ "\"languages\":\"en~fr\","
+ "\"zip\":\"\\\\d{3}\","
+ "\"state_name_type\":\"area\","
+ "\"zip_name_type\":\"postal\","
+ "\"zipex\":\"1234\","
+ "\"posturl\":\"http://www.testpost.com\""
+ "}"));
+
+ Rule copy;
+ EXPECT_NE(rule.GetFormat(), copy.GetFormat());
+ EXPECT_NE(rule.GetLatinFormat(), copy.GetLatinFormat());
+ EXPECT_NE(rule.GetId(), copy.GetId());
+ EXPECT_NE(rule.GetRequired(), copy.GetRequired());
+ EXPECT_NE(rule.GetSubKeys(), copy.GetSubKeys());
+ EXPECT_NE(rule.GetLanguages(), copy.GetLanguages());
+ EXPECT_NE(rule.GetAdminAreaNameMessageId(),
+ copy.GetAdminAreaNameMessageId());
+ EXPECT_NE(rule.GetPostalCodeNameMessageId(),
+ copy.GetPostalCodeNameMessageId());
+ EXPECT_NE(rule.GetName(), copy.GetName());
+ EXPECT_NE(rule.GetLatinName(), copy.GetLatinName());
+ EXPECT_NE(rule.GetPostalCodeExample(), copy.GetPostalCodeExample());
+ EXPECT_NE(rule.GetPostServiceUrl(), copy.GetPostServiceUrl());
+
+ EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
+ EXPECT_TRUE(copy.GetPostalCodeMatcher() == NULL);
+
+ copy.CopyFrom(rule);
+ EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
+ EXPECT_EQ(rule.GetLatinFormat(), copy.GetLatinFormat());
+ EXPECT_EQ(rule.GetId(), copy.GetId());
+ EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
+ EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
+ EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
+ EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
+ copy.GetAdminAreaNameMessageId());
+ EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
+ copy.GetPostalCodeNameMessageId());
+ EXPECT_EQ(rule.GetName(), copy.GetName());
+ EXPECT_EQ(rule.GetLatinName(), copy.GetLatinName());
+ EXPECT_EQ(rule.GetPostalCodeExample(), copy.GetPostalCodeExample());
+ EXPECT_EQ(rule.GetPostServiceUrl(), copy.GetPostServiceUrl());
+
+ EXPECT_TRUE(copy.GetPostalCodeMatcher() != NULL);
+}
+
+TEST(RuleTest, ParseOverwritesRule) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{"
+ "\"fmt\":\"%S%Z\","
+ "\"state_name_type\":\"area\","
+ "\"zip\":\"1234\","
+ "\"zip_name_type\":\"postal\","
+ "\"zipex\":\"1234\","
+ "\"posturl\":\"http://www.testpost.com\""
+ "}"));
+ EXPECT_FALSE(rule.GetFormat().empty());
+ EXPECT_EQ(IDS_LIBADDRESSINPUT_AREA,
+ rule.GetAdminAreaNameMessageId());
+ EXPECT_EQ(IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL,
+ rule.GetPostalCodeNameMessageId());
+ EXPECT_EQ("1234", rule.GetSolePostalCode());
+ EXPECT_EQ("1234", rule.GetPostalCodeExample());
+ EXPECT_EQ("http://www.testpost.com", rule.GetPostServiceUrl());
+
+ ASSERT_TRUE(rule.ParseSerializedRule("{"
+ "\"fmt\":\"\","
+ "\"state_name_type\":\"do_si\","
+ "\"zip_name_type\":\"zip\","
+ "\"zipex\":\"5678\","
+ "\"posturl\":\"http://www.fakepost.com\""
+ "}"));
+ EXPECT_TRUE(rule.GetFormat().empty());
+ EXPECT_EQ(IDS_LIBADDRESSINPUT_DO_SI,
+ rule.GetAdminAreaNameMessageId());
+ EXPECT_EQ(IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL,
+ rule.GetPostalCodeNameMessageId());
+ EXPECT_TRUE(rule.GetSolePostalCode().empty());
+ EXPECT_EQ("5678", rule.GetPostalCodeExample());
+ EXPECT_EQ("http://www.fakepost.com", rule.GetPostServiceUrl());
+}
+
+TEST(RuleTest, ParsesFormatCorrectly) {
+ std::vector<FormatElement> expected;
+ expected.push_back(FormatElement(ADMIN_AREA));
+ expected.push_back(FormatElement(LOCALITY));
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%S%C\"}"));
+ EXPECT_EQ(expected, rule.GetFormat());
+}
+
+TEST(RuleTest, ParsesNameCorrectly) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"name\":\"Le Test\"}"));
+ EXPECT_EQ("Le Test", rule.GetName());
+}
+
+TEST(RuleTest, ParsesLatinNameCorrectly) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"lname\":\"Testistan\"}"));
+ EXPECT_EQ("Testistan", rule.GetLatinName());
+}
+
+TEST(RuleTest, ParsesLatinFormatCorrectly) {
+ std::vector<FormatElement> expected;
+ expected.push_back(FormatElement(LOCALITY));
+ expected.push_back(FormatElement(ADMIN_AREA));
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"lfmt\":\"%C%S\"}"));
+ EXPECT_EQ(expected, rule.GetLatinFormat());
+}
+
+TEST(RuleTest, ParsesRequiredCorrectly) {
+ std::vector<AddressField> expected;
+ expected.push_back(STREET_ADDRESS);
+ expected.push_back(LOCALITY);
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"AC\"}"));
+ EXPECT_EQ(expected, rule.GetRequired());
+}
+
+TEST(RuleTest, ParsesSubKeysCorrectly) {
+ std::vector<std::string> expected;
+ expected.push_back("aa");
+ expected.push_back("bb");
+ expected.push_back("cc");
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"sub_keys\":\"aa~bb~cc\"}"));
+ EXPECT_EQ(expected, rule.GetSubKeys());
+}
+
+TEST(RuleTest, ParsesLanguagesCorrectly) {
+ std::vector<std::string> expected;
+ expected.push_back("de");
+ expected.push_back("fr");
+ expected.push_back("it");
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"de~fr~it\"}"));
+ EXPECT_EQ(expected, rule.GetLanguages());
+}
+
+TEST(RuleTest, ParsesPostalCodeExampleCorrectly) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"zipex\":\"1234,12345-6789\"}"));
+ EXPECT_EQ("1234,12345-6789", rule.GetPostalCodeExample());
+}
+
+TEST(RuleTest, ParsesPostServiceUrlCorrectly) {
+ Rule rule;
+ ASSERT_TRUE(
+ rule.ParseSerializedRule("{\"posturl\":\"http://www.testpost.com\"}"));
+ EXPECT_EQ("http://www.testpost.com", rule.GetPostServiceUrl());
+}
+
+TEST(RuleTest, PostalCodeMatcher) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"\\\\d{3}\"}"));
+ EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
+}
+
+TEST(RuleTest, PostalCodeMatcherInvalidRegExp) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"(\"}"));
+ EXPECT_TRUE(rule.GetPostalCodeMatcher() == NULL);
+}
+
+TEST(RuleTest, ParsesJsonRuleCorrectly) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"zip\":\"\\\\d{3}\"}"));
+ Rule rule;
+ rule.ParseJsonRule(json);
+ EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
+}
+
+TEST(RuleTest, EmptyStringIsNotValid) {
+ Rule rule;
+ EXPECT_FALSE(rule.ParseSerializedRule(std::string()));
+}
+
+TEST(RuleTest, EmptyDictionaryIsValid) {
+ Rule rule;
+ EXPECT_TRUE(rule.ParseSerializedRule("{}"));
+}
+
+// Tests for parsing the postal code name.
+class PostalCodeNameParseTest
+ : public testing::TestWithParam<std::pair<std::string, int> > {
+ protected:
+ Rule rule_;
+};
+
+// Verifies that a postal code name is parsed correctly.
+TEST_P(PostalCodeNameParseTest, ParsedCorrectly) {
+ ASSERT_TRUE(rule_.ParseSerializedRule(GetParam().first));
+ EXPECT_EQ(GetParam().second, rule_.GetPostalCodeNameMessageId());
+}
+
+// Test parsing all postal code names.
+INSTANTIATE_TEST_CASE_P(
+ AllPostalCodeNames, PostalCodeNameParseTest,
+ testing::Values(
+ std::make_pair("{\"zip_name_type\":\"postal\"}",
+ IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL),
+ std::make_pair("{\"zip_name_type\":\"zip\"}",
+ IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL)));
+
+// Tests for parsing the administrative area name.
+class AdminAreaNameParseTest
+ : public testing::TestWithParam<std::pair<std::string, int> > {
+ protected:
+ Rule rule_;
+};
+
+// Verifies that an administrative area name is parsed correctly.
+TEST_P(AdminAreaNameParseTest, ParsedCorrectly) {
+ ASSERT_TRUE(rule_.ParseSerializedRule(GetParam().first));
+ EXPECT_EQ(GetParam().second, rule_.GetAdminAreaNameMessageId());
+}
+
+// Test parsing all administrative area names.
+INSTANTIATE_TEST_CASE_P(
+ AllAdminAreaNames, AdminAreaNameParseTest,
+ testing::Values(
+ std::make_pair("{\"state_name_type\":\"area\"}",
+ IDS_LIBADDRESSINPUT_AREA),
+ std::make_pair("{\"state_name_type\":\"county\"}",
+ IDS_LIBADDRESSINPUT_COUNTY),
+ std::make_pair("{\"state_name_type\":\"department\"}",
+ IDS_LIBADDRESSINPUT_DEPARTMENT),
+ std::make_pair("{\"state_name_type\":\"district\"}",
+ IDS_LIBADDRESSINPUT_DISTRICT),
+ std::make_pair("{\"state_name_type\":\"do_si\"}",
+ IDS_LIBADDRESSINPUT_DO_SI),
+ std::make_pair("{\"state_name_type\":\"emirate\"}",
+ IDS_LIBADDRESSINPUT_EMIRATE),
+ std::make_pair("{\"state_name_type\":\"island\"}",
+ IDS_LIBADDRESSINPUT_ISLAND),
+ std::make_pair("{\"state_name_type\":\"parish\"}",
+ IDS_LIBADDRESSINPUT_PARISH),
+ std::make_pair("{\"state_name_type\":\"prefecture\"}",
+ IDS_LIBADDRESSINPUT_PREFECTURE),
+ std::make_pair("{\"state_name_type\":\"province\"}",
+ IDS_LIBADDRESSINPUT_PROVINCE),
+ std::make_pair("{\"state_name_type\":\"state\"}",
+ IDS_LIBADDRESSINPUT_STATE)));
+
+// Tests for rule parsing.
+class RuleParseTest : public testing::TestWithParam<std::string> {
+ protected:
+ const std::string& GetRegionData() const {
+ // GetParam() is either a region code or the region data itself.
+ // RegionDataContants::GetRegionData() returns an empty string for anything
+ // that's not a region code.
+ const std::string& data = RegionDataConstants::GetRegionData(GetParam());
+ return !data.empty() ? data : GetParam();
+ }
+
+ Rule rule_;
+ Localization localization_;
+};
+
+// Verifies that a region data can be parsed successfully.
+TEST_P(RuleParseTest, RegionDataParsedSuccessfully) {
+ EXPECT_TRUE(rule_.ParseSerializedRule(GetRegionData()));
+}
+
+// Verifies that the admin area name type corresponds to a UI string.
+TEST_P(RuleParseTest, AdminAreaNameTypeHasUiString) {
+ const std::string& region_data = GetRegionData();
+ rule_.ParseSerializedRule(region_data);
+ if (region_data.find("state_name_type") != std::string::npos) {
+ EXPECT_NE(INVALID_MESSAGE_ID, rule_.GetAdminAreaNameMessageId());
+ EXPECT_FALSE(
+ localization_.GetString(rule_.GetAdminAreaNameMessageId()).empty());
+ }
+}
+
+// Verifies that the postal code name type corresponds to a UI string.
+TEST_P(RuleParseTest, PostalCodeNameTypeHasUiString) {
+ const std::string& region_data = GetRegionData();
+ rule_.ParseSerializedRule(region_data);
+ if (region_data.find("zip_name_type") != std::string::npos) {
+ EXPECT_NE(INVALID_MESSAGE_ID, rule_.GetPostalCodeNameMessageId());
+ EXPECT_FALSE(
+ localization_.GetString(rule_.GetPostalCodeNameMessageId()).empty());
+ }
+}
+
+// Verifies that the sole postal code is correctly recognised and copied.
+TEST_P(RuleParseTest, SolePostalCode) {
+ Rule rule;
+ ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"1234\"}"));
+ EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
+ EXPECT_TRUE(rule.GetSolePostalCode() == "1234");
+
+ Rule copy;
+ EXPECT_TRUE(copy.GetPostalCodeMatcher() == NULL);
+ EXPECT_TRUE(copy.GetSolePostalCode().empty());
+
+ copy.CopyFrom(rule);
+ EXPECT_TRUE(copy.GetPostalCodeMatcher() != NULL);
+ EXPECT_EQ(rule.GetSolePostalCode(), copy.GetSolePostalCode());
+}
+
+// Test parsing all region data.
+INSTANTIATE_TEST_CASE_P(
+ AllRulesTest, RuleParseTest,
+ testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
+
+// Test parsing the default rule.
+INSTANTIATE_TEST_CASE_P(
+ DefaultRuleTest, RuleParseTest,
+ testing::Values(RegionDataConstants::GetDefaultRegionData()));
+
+} // namespace
diff --git a/cpp/test/supplier_test.cc b/cpp/test/supplier_test.cc
new file mode 100644
index 0000000..13913c3
--- /dev/null
+++ b/cpp/test/supplier_test.cc
@@ -0,0 +1,314 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libaddressinput/supplier.h>
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/downloader.h>
+#include <libaddressinput/null_storage.h>
+#include <libaddressinput/ondemand_supplier.h>
+#include <libaddressinput/preload_supplier.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <cstring>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "fake_downloader.h"
+#include "lookup_key.h"
+#include "rule.h"
+
+namespace {
+
+// For compatibility with legacy compilers, that can't handle UTF-8 string
+// literals in source code (please let them disappear from common use soon),
+// Chinese strings required in the test code are here provided as string
+// constants in hex escaped UTF-8 encoding.
+
+/* "九龍" */
+const char kKowloon[] = "\xE4\xB9\x9D\xE9\xBE\x8D";
+
+/* "新疆" */
+const char kXinJiang[] = "\xE6\x96\xB0\xE7\x96\x86";
+
+/* "喀什地区" */
+const char kKashiDiqu[] = "\xE5\x96\x80\xE4\xBB\x80\xE5\x9C\xB0\xE5\x8C\xBA";
+
+/* "喀什市" */
+const char kKashiShi[] = "\xE5\x96\x80\xE4\xBB\x80\xE5\xB8\x82";
+
+using i18n::addressinput::AddressData;
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::Downloader;
+using i18n::addressinput::FakeDownloader;
+using i18n::addressinput::LookupKey;
+using i18n::addressinput::NullStorage;
+using i18n::addressinput::OndemandSupplier;
+using i18n::addressinput::PreloadSupplier;
+using i18n::addressinput::Rule;
+using i18n::addressinput::scoped_ptr;
+using i18n::addressinput::Storage;
+using i18n::addressinput::Supplier;
+
+class SupplierWrapper {
+ public:
+ virtual ~SupplierWrapper() {}
+ virtual void Supply(const LookupKey& lookup_key,
+ const Supplier::Callback& supplied) = 0;
+};
+
+class OndemandSupplierWrapper : public SupplierWrapper {
+ public:
+ static SupplierWrapper* Build() { return new OndemandSupplierWrapper; }
+
+ virtual ~OndemandSupplierWrapper() {}
+
+ virtual void Supply(const LookupKey& lookup_key,
+ const Supplier::Callback& supplied) {
+ ondemand_supplier_.Supply(lookup_key, supplied);
+ }
+
+ private:
+ OndemandSupplierWrapper()
+ : ondemand_supplier_(FakeDownloader::kFakeDataUrl,
+ new FakeDownloader,
+ new NullStorage) {}
+
+ OndemandSupplier ondemand_supplier_;
+ DISALLOW_COPY_AND_ASSIGN(OndemandSupplierWrapper);
+};
+
+class PreloadSupplierWrapper : public SupplierWrapper {
+ public:
+ static SupplierWrapper* Build() { return new PreloadSupplierWrapper; }
+
+ virtual ~PreloadSupplierWrapper() {}
+
+ virtual void Supply(const LookupKey& lookup_key,
+ const Supplier::Callback& supplied) {
+ const std::string& region_code = lookup_key.GetRegionCode();
+ if (!region_code.empty() && !preload_supplier_.IsLoaded(region_code)) {
+ preload_supplier_.LoadRules(region_code, *loaded_);
+ }
+ preload_supplier_.Supply(lookup_key, supplied);
+ }
+
+ private:
+ PreloadSupplierWrapper()
+ : preload_supplier_(FakeDownloader::kFakeAggregateDataUrl,
+ new FakeDownloader,
+ new NullStorage),
+ loaded_(BuildCallback(this, &PreloadSupplierWrapper::Loaded)) {}
+
+ void Loaded(bool success, const std::string&, int) {
+ ASSERT_TRUE(success);
+ }
+
+ PreloadSupplier preload_supplier_;
+ const scoped_ptr<const PreloadSupplier::Callback> loaded_;
+ DISALLOW_COPY_AND_ASSIGN(PreloadSupplierWrapper);
+};
+
+class SupplierTest : public testing::TestWithParam<SupplierWrapper* (*)()> {
+ protected:
+ SupplierTest()
+ : address_(),
+ rule_(),
+ called_(false),
+ lookup_key_(),
+ supplier_wrapper_((*GetParam())()),
+ supplied_(BuildCallback(this, &SupplierTest::Supplied)) {}
+
+ virtual ~SupplierTest() {}
+
+ void Supply() {
+ lookup_key_.FromAddress(address_);
+ supplier_wrapper_->Supply(lookup_key_, *supplied_);
+ }
+
+ AddressData address_;
+ const Rule* rule_[arraysize(LookupKey::kHierarchy)];
+ bool called_;
+
+ private:
+ void Supplied(bool success,
+ const LookupKey& lookup_key,
+ const Supplier::RuleHierarchy& hierarchy) {
+ ASSERT_TRUE(success);
+ ASSERT_EQ(&lookup_key_, &lookup_key);
+ std::memcpy(rule_, hierarchy.rule, sizeof rule_);
+ called_ = true;
+ }
+
+ LookupKey lookup_key_;
+ const scoped_ptr<SupplierWrapper> supplier_wrapper_;
+ const scoped_ptr<const Supplier::Callback> supplied_;
+
+ DISALLOW_COPY_AND_ASSIGN(SupplierTest);
+};
+
+INSTANTIATE_TEST_CASE_P(OndemandSupplier,
+ SupplierTest,
+ testing::Values(&OndemandSupplierWrapper::Build));
+
+INSTANTIATE_TEST_CASE_P(PreloadSupplier,
+ SupplierTest,
+ testing::Values(&PreloadSupplierWrapper::Build));
+
+TEST_P(SupplierTest, Invalid) {
+ address_.region_code = "QZ";
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] == NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, Valid) {
+ address_.region_code = "SE";
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+ EXPECT_EQ("data/SE", rule_[0]->GetId());
+ EXPECT_FALSE(rule_[0]->GetRequired().empty());
+ EXPECT_FALSE(rule_[0]->GetFormat().empty());
+ EXPECT_TRUE(rule_[0]->GetPostalCodeMatcher() != NULL);
+}
+
+TEST_P(SupplierTest, KeyDepthEqualsMaxDepth) {
+ address_.region_code = "HK";
+ address_.administrative_area = kKowloon;
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepthLargerThanMaxDepth) {
+ address_.region_code = "HK";
+ address_.administrative_area = kKowloon;
+ address_.locality = "bbb"; // Ignored!
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepthSmallerThanMaxDepth) {
+ address_.region_code = "HK";
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepth0) {
+ address_.region_code = "CN";
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] == NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepth1) {
+ address_.region_code = "CN";
+ address_.administrative_area = kXinJiang;
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepth2) {
+ address_.region_code = "CN";
+ address_.administrative_area = kXinJiang;
+ address_.locality = kKashiDiqu;
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] != NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+}
+
+TEST_P(SupplierTest, KeyDepth3) {
+ address_.region_code = "CN";
+ address_.administrative_area = kXinJiang;
+ address_.locality = kKashiDiqu;
+ address_.dependent_locality = kKashiShi;
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] != NULL);
+ EXPECT_TRUE(rule_[3] != NULL);
+}
+
+TEST_P(SupplierTest, RuleCache) {
+ address_.region_code = "US";
+ address_.administrative_area = "CA";
+
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_TRUE(rule_[0] != NULL);
+ EXPECT_TRUE(rule_[1] != NULL);
+ EXPECT_TRUE(rule_[2] == NULL);
+ EXPECT_TRUE(rule_[3] == NULL);
+
+ // Make a copy of the currently returned pointers to the Rule objects (stored
+ // in the OndemandSupplier cache) and verify that calling Supply() again with
+ // the same LookupKey returns the same pointers again (and doesn't create any
+ // new Rule objects instead).
+
+ const Rule* rule[arraysize(LookupKey::kHierarchy)];
+ std::memcpy(rule, rule_, sizeof rule);
+
+ called_ = false;
+ ASSERT_NO_FATAL_FAILURE(Supply());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(rule[0], rule_[0]);
+ EXPECT_EQ(rule[1], rule_[1]);
+ EXPECT_EQ(rule[2], rule_[2]);
+ EXPECT_EQ(rule[3], rule_[3]);
+}
+
+} // namespace
diff --git a/cpp/test/util/json_test.cc b/cpp/test/util/json_test.cc
new file mode 100644
index 0000000..f6eb389
--- /dev/null
+++ b/cpp/test/util/json_test.cc
@@ -0,0 +1,141 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "util/json.h"
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::Json;
+using i18n::addressinput::scoped_ptr;
+
+TEST(JsonTest, EmptyStringIsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject(std::string()));
+}
+
+TEST(JsonTest, EmptyDictionaryContainsNoKeys) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{}"));
+ EXPECT_FALSE(json.HasStringValueForKey("key"));
+ EXPECT_FALSE(json.HasStringValueForKey(std::string()));
+}
+
+TEST(JsonTest, InvalidJsonIsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject("{"));
+}
+
+TEST(JsonTest, OneKeyIsValid) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
+ ASSERT_TRUE(json.HasStringValueForKey("key"));
+ EXPECT_EQ("value", json.GetStringValueForKey("key"));
+}
+
+TEST(JsonTest, EmptyStringKeyIsNotInObject) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
+ EXPECT_FALSE(json.HasStringValueForKey(std::string()));
+}
+
+TEST(JsonTest, EmptyKeyIsValid) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"\": \"value\"}"));
+ ASSERT_TRUE(json.HasStringValueForKey(std::string()));
+ EXPECT_EQ("value", json.GetStringValueForKey(std::string()));
+}
+
+TEST(JsonTest, EmptyValueIsValid) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\": \"\"}"));
+ ASSERT_TRUE(json.HasStringValueForKey("key"));
+ EXPECT_TRUE(json.GetStringValueForKey("key").empty());
+}
+
+TEST(JsonTest, Utf8EncodingIsValid) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\": \"Ü\"}"));
+ ASSERT_TRUE(json.HasStringValueForKey("key"));
+ EXPECT_EQ("Ü", json.GetStringValueForKey("key"));
+}
+
+TEST(JsonTest, InvalidUtf8IsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject("{\"key\": \"\xC3\x28\"}"));
+}
+
+TEST(JsonTest, NullInMiddleIsNotValid) {
+ Json json;
+ static const char kJson[] = "{\"key\": \"val\0ue\"}";
+ EXPECT_FALSE(json.ParseObject(std::string(kJson, sizeof kJson - 1)));
+}
+
+TEST(JsonTest, TwoKeysAreValid) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key1\": \"value1\", \"key2\": \"value2\"}"));
+ ASSERT_TRUE(json.HasStringValueForKey("key1"));
+ EXPECT_EQ("value1", json.GetStringValueForKey("key1"));
+
+ ASSERT_TRUE(json.HasStringValueForKey("key2"));
+ EXPECT_EQ("value2", json.GetStringValueForKey("key2"));
+}
+
+TEST(JsonTest, ListIsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject("[]"));
+}
+
+TEST(JsonTest, StringIsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject("\"value\""));
+}
+
+TEST(JsonTest, NumberIsNotValid) {
+ Json json;
+ EXPECT_FALSE(json.ParseObject("3"));
+}
+
+TEST(JsonTest, NoDictionaryFound) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\":\"value\"}"));
+ EXPECT_FALSE(json.HasDictionaryValueForKey("key"));
+}
+
+TEST(JsonTest, DictionaryFound) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\":{\"inner_key\":\"value\"}}"));
+ ASSERT_TRUE(json.HasDictionaryValueForKey("key"));
+ const Json& sub_json = json.GetDictionaryValueForKey("key");
+ ASSERT_TRUE(sub_json.HasStringValueForKey("inner_key"));
+ EXPECT_EQ("value", sub_json.GetStringValueForKey("inner_key"));
+}
+
+TEST(JsonTest, DictionariesHaveKeys) {
+ Json json;
+ ASSERT_TRUE(json.ParseObject("{\"key\":{\"inner_key\":\"value\"}}"));
+ std::vector<std::string> expected_keys(1, "key");
+ EXPECT_EQ(expected_keys, json.GetKeys());
+
+ ASSERT_TRUE(json.HasDictionaryValueForKey("key"));
+ const Json& sub_json = json.GetDictionaryValueForKey("key");
+ std::vector<std::string> expected_sub_keys(1, "inner_key");
+ EXPECT_EQ(expected_sub_keys, sub_json.GetKeys());
+}
+
+} // namespace
diff --git a/cpp/test/util/md5_unittest.cc b/cpp/test/util/md5_unittest.cc
new file mode 100644
index 0000000..f0ce82a
--- /dev/null
+++ b/cpp/test/util/md5_unittest.cc
@@ -0,0 +1,218 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/md5_unittest.cc?revision=94203
+
+#include "util/md5.h"
+
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstring>
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::MD5Context;
+using i18n::addressinput::MD5Digest;
+using i18n::addressinput::MD5Init;
+using i18n::addressinput::MD5String;
+using i18n::addressinput::MD5Update;
+using i18n::addressinput::scoped_ptr;
+
+TEST(MD5, DigestToBase16) {
+ MD5Digest digest;
+
+ int data[] = {
+ 0xd4, 0x1d, 0x8c, 0xd9,
+ 0x8f, 0x00, 0xb2, 0x04,
+ 0xe9, 0x80, 0x09, 0x98,
+ 0xec, 0xf8, 0x42, 0x7e
+ };
+
+ for (int i = 0; i < 16; ++i)
+ digest.a[i] = data[i] & 0xff;
+
+ std::string actual = MD5DigestToBase16(digest);
+ std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
+
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5SumEmtpyData) {
+ MD5Digest digest;
+ const char* data = "";
+
+ MD5Sum(data, strlen(data), &digest);
+
+ int expected[] = {
+ 0xd4, 0x1d, 0x8c, 0xd9,
+ 0x8f, 0x00, 0xb2, 0x04,
+ 0xe9, 0x80, 0x09, 0x98,
+ 0xec, 0xf8, 0x42, 0x7e
+ };
+
+ for (int i = 0; i < 16; ++i)
+ EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
+}
+
+TEST(MD5, MD5SumOneByteData) {
+ MD5Digest digest;
+ const char* data = "a";
+
+ MD5Sum(data, strlen(data), &digest);
+
+ int expected[] = {
+ 0x0c, 0xc1, 0x75, 0xb9,
+ 0xc0, 0xf1, 0xb6, 0xa8,
+ 0x31, 0xc3, 0x99, 0xe2,
+ 0x69, 0x77, 0x26, 0x61
+ };
+
+ for (int i = 0; i < 16; ++i)
+ EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
+}
+
+TEST(MD5, MD5SumLongData) {
+ const int length = 10 * 1024 * 1024 + 1;
+ scoped_ptr<char[]> data(new char[length]);
+
+ for (int i = 0; i < length; ++i)
+ data[i] = i & 0xFF;
+
+ MD5Digest digest;
+ MD5Sum(data.get(), length, &digest);
+
+ int expected[] = {
+ 0x90, 0xbd, 0x6a, 0xd9,
+ 0x0a, 0xce, 0xf5, 0xad,
+ 0xaa, 0x92, 0x20, 0x3e,
+ 0x21, 0xc7, 0xa1, 0x3e
+ };
+
+ for (int i = 0; i < 16; ++i)
+ EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
+}
+
+TEST(MD5, ContextWithEmptyData) {
+ MD5Context ctx;
+ MD5Init(&ctx);
+
+ MD5Digest digest;
+ MD5Final(&digest, &ctx);
+
+ int expected[] = {
+ 0xd4, 0x1d, 0x8c, 0xd9,
+ 0x8f, 0x00, 0xb2, 0x04,
+ 0xe9, 0x80, 0x09, 0x98,
+ 0xec, 0xf8, 0x42, 0x7e
+ };
+
+ for (int i = 0; i < 16; ++i)
+ EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
+}
+
+TEST(MD5, ContextWithLongData) {
+ MD5Context ctx;
+ MD5Init(&ctx);
+
+ const int length = 10 * 1024 * 1024 + 1;
+ scoped_ptr<char[]> data(new char[length]);
+
+ for (int i = 0; i < length; ++i)
+ data[i] = i & 0xFF;
+
+ int total = 0;
+ while (total < length) {
+ int len = 4097; // intentionally not 2^k.
+ if (len > length - total)
+ len = length - total;
+
+ MD5Update(&ctx,
+ std::string(reinterpret_cast<char*>(data.get() + total), len));
+ total += len;
+ }
+
+ EXPECT_EQ(length, total);
+
+ MD5Digest digest;
+ MD5Final(&digest, &ctx);
+
+ int expected[] = {
+ 0x90, 0xbd, 0x6a, 0xd9,
+ 0x0a, 0xce, 0xf5, 0xad,
+ 0xaa, 0x92, 0x20, 0x3e,
+ 0x21, 0xc7, 0xa1, 0x3e
+ };
+
+ for (int i = 0; i < 16; ++i)
+ EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
+}
+
+// Example data from http://www.ietf.org/rfc/rfc1321.txt A.5 Test Suite
+TEST(MD5, MD5StringTestSuite1) {
+ std::string actual = MD5String("");
+ std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite2) {
+ std::string actual = MD5String("a");
+ std::string expected = "0cc175b9c0f1b6a831c399e269772661";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite3) {
+ std::string actual = MD5String("abc");
+ std::string expected = "900150983cd24fb0d6963f7d28e17f72";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite4) {
+ std::string actual = MD5String("message digest");
+ std::string expected = "f96b697d7cb7938d525a2f31aaf161d0";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite5) {
+ std::string actual = MD5String("abcdefghijklmnopqrstuvwxyz");
+ std::string expected = "c3fcd3d76192e4007dfb496cca67e13b";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite6) {
+ std::string actual = MD5String("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789");
+ std::string expected = "d174ab98d277d9f5a5611c2c9f419d9f";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, MD5StringTestSuite7) {
+ std::string actual = MD5String("12345678901234567890"
+ "12345678901234567890"
+ "12345678901234567890"
+ "12345678901234567890");
+ std::string expected = "57edf4a22be3c955ac49da2e2107b67a";
+ EXPECT_EQ(expected, actual);
+}
+
+TEST(MD5, ContextWithStringData) {
+ MD5Context ctx;
+ MD5Init(&ctx);
+
+ MD5Update(&ctx, "abc");
+
+ MD5Digest digest;
+ MD5Final(&digest, &ctx);
+
+ std::string actual = MD5DigestToBase16(digest);
+ std::string expected = "900150983cd24fb0d6963f7d28e17f72";
+
+ EXPECT_EQ(expected, actual);
+}
+
+} // namespace
diff --git a/cpp/test/util/scoped_ptr_unittest.cc b/cpp/test/util/scoped_ptr_unittest.cc
new file mode 100644
index 0000000..250ffca
--- /dev/null
+++ b/cpp/test/util/scoped_ptr_unittest.cc
@@ -0,0 +1,100 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr_unittest.cc?revision=79524
+
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <libaddressinput/util/basictypes.h>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::scoped_ptr;
+
+class ConDecLogger {
+ public:
+ ConDecLogger() : ptr_(NULL) { }
+ explicit ConDecLogger(int* ptr) { set_ptr(ptr); }
+ ~ConDecLogger() { --*ptr_; }
+
+ void set_ptr(int* ptr) { ptr_ = ptr; ++*ptr_; }
+
+ int SomeMeth(int x) { return x; }
+
+ private:
+ int* ptr_;
+ DISALLOW_COPY_AND_ASSIGN(ConDecLogger);
+};
+
+TEST(ScopedPtrTest, ScopedPtr) {
+ int constructed = 0;
+
+ {
+ scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed));
+ EXPECT_EQ(1, constructed);
+ EXPECT_TRUE(scoper.get());
+
+ EXPECT_EQ(10, scoper->SomeMeth(10));
+ EXPECT_EQ(10, scoper.get()->SomeMeth(10));
+ EXPECT_EQ(10, (*scoper).SomeMeth(10));
+ }
+ EXPECT_EQ(0, constructed);
+
+ // Test reset() and release()
+ {
+ scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed));
+ EXPECT_EQ(1, constructed);
+ EXPECT_TRUE(scoper.get());
+
+ scoper.reset(new ConDecLogger(&constructed));
+ EXPECT_EQ(1, constructed);
+ EXPECT_TRUE(scoper.get());
+
+ scoper.reset();
+ EXPECT_EQ(0, constructed);
+ EXPECT_FALSE(scoper.get());
+
+ scoper.reset(new ConDecLogger(&constructed));
+ EXPECT_EQ(1, constructed);
+ EXPECT_TRUE(scoper.get());
+
+ ConDecLogger* take = scoper.release();
+ EXPECT_EQ(1, constructed);
+ EXPECT_FALSE(scoper.get());
+ delete take;
+ EXPECT_EQ(0, constructed);
+
+ scoper.reset(new ConDecLogger(&constructed));
+ EXPECT_EQ(1, constructed);
+ EXPECT_TRUE(scoper.get());
+ }
+ EXPECT_EQ(0, constructed);
+
+ // Test swap(), == and !=
+ {
+ scoped_ptr<ConDecLogger> scoper1;
+ scoped_ptr<ConDecLogger> scoper2;
+ EXPECT_TRUE(scoper1 == scoper2.get());
+ EXPECT_FALSE(scoper1 != scoper2.get());
+
+ ConDecLogger* logger = new ConDecLogger(&constructed);
+ scoper1.reset(logger);
+ EXPECT_EQ(logger, scoper1.get());
+ EXPECT_FALSE(scoper2.get());
+ EXPECT_FALSE(scoper1 == scoper2.get());
+ EXPECT_TRUE(scoper1 != scoper2.get());
+
+ scoper2.swap(scoper1);
+ EXPECT_EQ(logger, scoper2.get());
+ EXPECT_FALSE(scoper1.get());
+ EXPECT_FALSE(scoper1 == scoper2.get());
+ EXPECT_TRUE(scoper1 != scoper2.get());
+ }
+ EXPECT_EQ(0, constructed);
+}
+
+} // namespace
diff --git a/cpp/test/util/string_compare_test.cc b/cpp/test/util/string_compare_test.cc
new file mode 100644
index 0000000..d5990d9
--- /dev/null
+++ b/cpp/test/util/string_compare_test.cc
@@ -0,0 +1,60 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "util/string_compare.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::StringCompare;
+
+struct TestCase {
+ TestCase(const std::string& left,
+ const std::string& right,
+ bool should_be_equal)
+ : left(left), right(right), should_be_equal(should_be_equal) {}
+
+ ~TestCase() {}
+
+ std::string left;
+ std::string right;
+ bool should_be_equal;
+};
+
+class StringCompareTest : public testing::TestWithParam<TestCase> {
+ protected:
+ StringCompare compare_;
+};
+
+TEST_P(StringCompareTest, CorrectComparison) {
+ if (GetParam().should_be_equal) {
+ EXPECT_TRUE(compare_.NaturalEquals(GetParam().left, GetParam().right));
+ } else {
+ EXPECT_FALSE(compare_.NaturalEquals(GetParam().left, GetParam().right));
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(
+ Comparisons, StringCompareTest,
+ testing::Values(TestCase("foo", "foo", true),
+ TestCase("foo", "FOO", true),
+ TestCase("bar", "foo", false),
+ TestCase("강원도", "강원도", true),
+ TestCase("강원도", "대구광역시", false),
+ TestCase("ZÜRICH", "zürich", true)));
+
+} // namespace
diff --git a/cpp/test/util/string_split_unittest.cc b/cpp/test/util/string_split_unittest.cc
new file mode 100644
index 0000000..73ca595
--- /dev/null
+++ b/cpp/test/util/string_split_unittest.cc
@@ -0,0 +1,89 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The original source code is from:
+// http://src.chromium.org/viewvc/chrome/trunk/src/base/strings/string_split_unittest.cc?revision=216633
+
+#include "util/string_split.h"
+
+#include <string>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::SplitString;
+
+TEST(StringSplitTest, SplitString) {
+ std::vector<std::string> r;
+
+ SplitString(std::string(), ',', &r);
+ EXPECT_EQ(0U, r.size());
+
+ SplitString("a,b,c", ',', &r);
+ ASSERT_EQ(3U, r.size());
+ EXPECT_EQ(r[0], "a");
+ EXPECT_EQ(r[1], "b");
+ EXPECT_EQ(r[2], "c");
+
+ SplitString("a, b, c", ',', &r);
+ ASSERT_EQ(3U, r.size());
+ EXPECT_EQ(r[0], "a");
+ EXPECT_EQ(r[1], " b");
+ EXPECT_EQ(r[2], " c");
+
+ SplitString("a,,c", ',', &r);
+ ASSERT_EQ(3U, r.size());
+ EXPECT_EQ(r[0], "a");
+ EXPECT_EQ(r[1], "");
+ EXPECT_EQ(r[2], "c");
+
+ SplitString(" ", '*', &r);
+ EXPECT_EQ(1U, r.size());
+
+ SplitString("foo", '*', &r);
+ ASSERT_EQ(1U, r.size());
+ EXPECT_EQ(r[0], "foo");
+
+ SplitString("foo ,", ',', &r);
+ ASSERT_EQ(2U, r.size());
+ EXPECT_EQ(r[0], "foo ");
+ EXPECT_EQ(r[1], "");
+
+ SplitString(",", ',', &r);
+ ASSERT_EQ(2U, r.size());
+ EXPECT_EQ(r[0], "");
+ EXPECT_EQ(r[1], "");
+
+ SplitString("\t\ta\t", '\t', &r);
+ ASSERT_EQ(4U, r.size());
+ EXPECT_EQ(r[0], "");
+ EXPECT_EQ(r[1], "");
+ EXPECT_EQ(r[2], "a");
+ EXPECT_EQ(r[3], "");
+
+ SplitString("\ta\t\nb\tcc", '\n', &r);
+ ASSERT_EQ(2U, r.size());
+ EXPECT_EQ(r[0], "\ta\t");
+ EXPECT_EQ(r[1], "b\tcc");
+
+ SplitString(" ", '*', &r);
+ ASSERT_EQ(1U, r.size());
+ EXPECT_EQ(r[0], " ");
+
+ SplitString("\t \ta\t ", '\t', &r);
+ ASSERT_EQ(4U, r.size());
+ EXPECT_EQ(r[0], "");
+ EXPECT_EQ(r[1], " ");
+ EXPECT_EQ(r[2], "a");
+ EXPECT_EQ(r[3], " ");
+
+ SplitString("\ta\t\nb\tcc", '\n', &r);
+ ASSERT_EQ(2U, r.size());
+ EXPECT_EQ(r[0], "\ta\t");
+ EXPECT_EQ(r[1], "b\tcc");
+}
+
+} // namespace
diff --git a/cpp/test/util/string_util_test.cc b/cpp/test/util/string_util_test.cc
new file mode 100644
index 0000000..9933b31
--- /dev/null
+++ b/cpp/test/util/string_util_test.cc
@@ -0,0 +1,74 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include "util/string_util.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+namespace {
+
+using i18n::addressinput::DoReplaceStringPlaceholders;
+
+TEST(StringUtilTest, Ok) {
+ std::vector<std::string> subst;
+ subst.push_back("A");
+ subst.push_back("B");
+ subst.push_back("C");
+
+ EXPECT_EQ("aA,bB,cC",
+ DoReplaceStringPlaceholders("a$1,b$2,c$3", subst));
+}
+
+TEST(StringUtilTest, FewParameters) {
+ std::vector<std::string> subst;
+ subst.push_back("A");
+ subst.push_back("B");
+ subst.push_back("C");
+
+ EXPECT_EQ("aA,bB,cC,d,aA",
+ DoReplaceStringPlaceholders("a$1,b$2,c$3,d$4,a$1", subst));
+}
+
+TEST(StringUtilTest, MoreThan9Parameters) {
+ std::vector<std::string> subst;
+ subst.push_back("A");
+ subst.push_back("B");
+ subst.push_back("C");
+ subst.push_back("D");
+ subst.push_back("E");
+ subst.push_back("F");
+ subst.push_back("G");
+ subst.push_back("H");
+ subst.push_back("I");
+ subst.push_back("J");
+ subst.push_back("K");
+
+ EXPECT_EQ("aA,bB,cC,dD,eE,fF,gG,hH,iI,jJ,kK,aA",
+ DoReplaceStringPlaceholders("a$1,b$2,c$3,d$4,e$5,f$6,g$7,h$8,i$9,"
+ "j$10,k$11,a$1", subst));
+}
+
+TEST(StringUtilTest, ConsecutiveDollarSigns) {
+ std::vector<std::string> subst;
+ subst.push_back("A");
+ subst.push_back("B");
+ subst.push_back("C");
+
+ EXPECT_EQ("$1 $$2 $$$3",
+ DoReplaceStringPlaceholders("$$1 $$$2 $$$$3", subst));
+}
+
+} // namespace
diff --git a/cpp/test/validating_storage_test.cc b/cpp/test/validating_storage_test.cc
new file mode 100644
index 0000000..ced22dc
--- /dev/null
+++ b/cpp/test/validating_storage_test.cc
@@ -0,0 +1,136 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "validating_storage.h"
+
+#include <libaddressinput/callback.h>
+#include <libaddressinput/storage.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "fake_storage.h"
+
+#define CHECKSUM "dd63dafcbd4d5b28badfcaf86fb6fcdb"
+#define DATA "{'foo': 'bar'}"
+#define OLD_TIMESTAMP "0"
+
+namespace {
+
+using i18n::addressinput::BuildCallback;
+using i18n::addressinput::FakeStorage;
+using i18n::addressinput::scoped_ptr;
+using i18n::addressinput::Storage;
+using i18n::addressinput::ValidatingStorage;
+
+const char kKey[] = "key";
+const char kValidatedData[] = DATA;
+const char kStaleWrappedData[] = "timestamp=" OLD_TIMESTAMP "\n"
+ "checksum=" CHECKSUM "\n"
+ DATA;
+const char kEmptyData[] = "";
+
+// Tests for ValidatingStorage object.
+class ValidatingStorageTest : public testing::Test {
+ protected:
+ ValidatingStorageTest()
+ : wrapped_storage_(new FakeStorage),
+ storage_(wrapped_storage_),
+ success_(false),
+ key_(),
+ data_() {}
+
+ virtual ~ValidatingStorageTest() {}
+
+ ValidatingStorage::Callback* BuildCallback() {
+ return ::BuildCallback(this, &ValidatingStorageTest::OnDataReady);
+ }
+
+ Storage* const wrapped_storage_; // Owned by |storage_|.
+ ValidatingStorage storage_;
+ bool success_;
+ std::string key_;
+ std::string data_;
+
+ private:
+ void OnDataReady(bool success, const std::string& key, std::string* data) {
+ ASSERT_FALSE(success && data == NULL);
+ success_ = success;
+ key_ = key;
+ if (data != NULL) {
+ data_ = *data;
+ delete data;
+ }
+ }
+};
+
+TEST_F(ValidatingStorageTest, GoodData) {
+ storage_.Put(kKey, new std::string(kValidatedData));
+
+ scoped_ptr<ValidatingStorage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_EQ(kValidatedData, data_);
+}
+
+TEST_F(ValidatingStorageTest, EmptyData) {
+ storage_.Put(kKey, new std::string(kEmptyData));
+
+ scoped_ptr<ValidatingStorage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+
+ EXPECT_TRUE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_EQ(kEmptyData, data_);
+}
+
+TEST_F(ValidatingStorageTest, MissingKey) {
+ scoped_ptr<ValidatingStorage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_TRUE(data_.empty());
+}
+
+TEST_F(ValidatingStorageTest, GarbageData) {
+ storage_.Put(kKey, new std::string(kValidatedData));
+ wrapped_storage_->Put(kKey, new std::string("garbage"));
+
+ scoped_ptr<ValidatingStorage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_TRUE(data_.empty());
+}
+
+TEST_F(ValidatingStorageTest, StaleData) {
+ storage_.Put(kKey, new std::string(kValidatedData));
+ wrapped_storage_->Put(kKey, new std::string(kStaleWrappedData));
+
+ scoped_ptr<ValidatingStorage::Callback> callback(BuildCallback());
+ storage_.Get(kKey, *callback);
+
+ EXPECT_FALSE(success_);
+ EXPECT_EQ(kKey, key_);
+ EXPECT_EQ(kValidatedData, data_);
+}
+
+} // namespace
diff --git a/cpp/test/validating_util_test.cc b/cpp/test/validating_util_test.cc
new file mode 100644
index 0000000..b7038d5
--- /dev/null
+++ b/cpp/test/validating_util_test.cc
@@ -0,0 +1,156 @@
+// Copyright (C) 2013 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "validating_util.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+#define ITOA_HELPER(i) #i
+#define ITOA(i) ITOA_HELPER(i)
+
+#define DATA "{'foo': 'bar'}"
+#define TIMESTAMP 1388001600
+#define TIMESTAMP_HALF_MONTH_AGO 1386705600
+#define TIMESTAMP_TWO_MONTHS_AGO 1382817600
+#define CHECKSUM "dd63dafcbd4d5b28badfcaf86fb6fcdb"
+
+namespace {
+
+using i18n::addressinput::ValidatingUtil;
+
+// The data being wrapped.
+const char kUnwrappedData[] = DATA;
+
+// The timestamp for the wrapped data.
+const time_t kTimestamp = TIMESTAMP;
+
+// The checksum and data together.
+const char kChecksummedData[] = "checksum=" CHECKSUM "\n"
+ DATA;
+
+// "Randomly" corrupted checksummed data. The "m" in "checksum" is capitalized.
+const char kCorruptedChecksummedData[] = "checksuM=" CHECKSUM "\n"
+ DATA;
+
+// The checksum in the middle of data.
+const char kChecksumInMiddle[] = DATA "\n"
+ "checksum=" CHECKSUM "\n"
+ DATA;
+
+// The file as it is stored on disk.
+const char kWrappedData[] = "timestamp=" ITOA(TIMESTAMP) "\n"
+ "checksum=" CHECKSUM "\n"
+ DATA;
+
+// "Randomly" corrupted file. The "p" in "timestamp" is capitalized.
+const char kCorruptedWrappedData[] = "timestamP=" ITOA(TIMESTAMP) "\n"
+ "checksum=" CHECKSUM "\n"
+ DATA;
+
+// The timestamp in the middle of data.
+const char kTimestampInMiddle[] = DATA "\n"
+ "timestamp=" ITOA(TIMESTAMP) "\n"
+ DATA;
+
+// A recent timestamp and data together.
+const char kTimestampHalfMonthAgo[] =
+ "timestamp=" ITOA(TIMESTAMP_HALF_MONTH_AGO) "\n"
+ DATA;
+
+// A stale timestamp and data together.
+const char kTimestampTwoMonthsAgo[] =
+ "timestamp=" ITOA(TIMESTAMP_TWO_MONTHS_AGO) "\n"
+ DATA;
+
+TEST(ValidatingUtilTest, UnwrapChecksum_CorruptedData) {
+ std::string data(kCorruptedChecksummedData);
+ EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
+}
+
+TEST(ValidatingUtilTest, UnwrapChecksum_EmptyString) {
+ std::string data;
+ EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
+}
+
+TEST(ValidatingUtilTest, UnwrapChecksum_GarbageData) {
+ std::string data("garbage");
+ EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
+}
+
+TEST(ValidatingUtilTest, UnwrapChecksum_InMiddle) {
+ std::string data(kChecksumInMiddle);
+ EXPECT_FALSE(ValidatingUtil::UnwrapChecksum(&data));
+}
+
+TEST(ValidatingUtilTest, UnwrapChecksum) {
+ std::string data(kChecksummedData);
+ EXPECT_TRUE(ValidatingUtil::UnwrapChecksum(&data));
+ EXPECT_EQ(kUnwrappedData, data);
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_CorruptedData) {
+ std::string data(kCorruptedWrappedData);
+ EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_EmptyString) {
+ std::string data;
+ EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_GarbageData) {
+ std::string data("garbage");
+ EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_InMiddle) {
+ std::string data(kTimestampInMiddle);
+ EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_Recent) {
+ std::string data(kTimestampHalfMonthAgo);
+ EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+ EXPECT_EQ(kUnwrappedData, data);
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp_Stale) {
+ std::string data(kTimestampTwoMonthsAgo);
+ EXPECT_FALSE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+}
+
+TEST(ValidatingUtilTest, UnwrapTimestamp) {
+ std::string data(kWrappedData);
+ EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+ EXPECT_EQ(kChecksummedData, data);
+}
+
+TEST(ValidatingUtilTest, Wrap) {
+ std::string data = kUnwrappedData;
+ ValidatingUtil::Wrap(kTimestamp, &data);
+ EXPECT_EQ(kWrappedData, data);
+}
+
+TEST(ValidatingUtilTest, WrapUnwrapIt) {
+ std::string data = kUnwrappedData;
+ ValidatingUtil::Wrap(kTimestamp, &data);
+ EXPECT_TRUE(ValidatingUtil::UnwrapTimestamp(&data, kTimestamp));
+ EXPECT_EQ(kChecksummedData, data);
+ EXPECT_TRUE(ValidatingUtil::UnwrapChecksum(&data));
+ EXPECT_EQ(kUnwrappedData, data);
+}
+
+} // namespace
diff --git a/cpp/test/validation_task_test.cc b/cpp/test/validation_task_test.cc
new file mode 100644
index 0000000..e8136f3
--- /dev/null
+++ b/cpp/test/validation_task_test.cc
@@ -0,0 +1,472 @@
+// Copyright (C) 2014 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "validation_task.h"
+
+#include <libaddressinput/address_data.h>
+#include <libaddressinput/address_field.h>
+#include <libaddressinput/address_problem.h>
+#include <libaddressinput/address_validator.h>
+#include <libaddressinput/callback.h>
+#include <libaddressinput/supplier.h>
+#include <libaddressinput/util/basictypes.h>
+#include <libaddressinput/util/scoped_ptr.h>
+
+#include <cstddef>
+#include <utility>
+
+#include <gtest/gtest.h>
+
+#include "lookup_key.h"
+#include "rule.h"
+
+namespace i18n {
+namespace addressinput {
+
+class LookupKey;
+
+class ValidationTaskTest : public testing::Test {
+ protected:
+ ValidationTaskTest()
+ : json_(),
+ success_(true),
+ address_(),
+ allow_postal_(false),
+ require_name_(false),
+ filter_(),
+ problems_(),
+ expected_(),
+ called_(false),
+ validated_(BuildCallback(this, &ValidationTaskTest::Validated)) {
+ // Add all problems to the filter except those affected by the metadata
+ // in region_data_constants.cc.
+ static const AddressField kFields[] = {
+ COUNTRY,
+ ADMIN_AREA,
+ LOCALITY,
+ DEPENDENT_LOCALITY,
+ SORTING_CODE,
+ POSTAL_CODE,
+ STREET_ADDRESS,
+ RECIPIENT
+ };
+
+ static const AddressProblem kProblems[] = {
+ // UNEXPECTED_FIELD is validated using IsFieldUsed().
+ // MISSING_REQUIRED_FIELD is validated using IsFieldRequired().
+ UNKNOWN_VALUE,
+ INVALID_FORMAT,
+ MISMATCHING_VALUE,
+ USES_P_O_BOX
+ };
+
+ for (size_t i = 0; i < arraysize(kFields); ++i) {
+ AddressField field = kFields[i];
+ for (size_t j = 0; j < arraysize(kProblems); ++j) {
+ AddressProblem problem = kProblems[j];
+ filter_.insert(std::make_pair(field, problem));
+ }
+ }
+
+ filter_.insert(std::make_pair(COUNTRY, UNEXPECTED_FIELD));
+ filter_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(RECIPIENT, UNEXPECTED_FIELD));
+ filter_.insert(std::make_pair(RECIPIENT, MISSING_REQUIRED_FIELD));
+ }
+
+ virtual ~ValidationTaskTest() {}
+
+ void Validate() {
+ Rule rule[arraysize(json_)];
+
+ ValidationTask* task = new ValidationTask(
+ address_,
+ allow_postal_,
+ require_name_,
+ &filter_,
+ &problems_,
+ *validated_);
+
+ Supplier::RuleHierarchy* hierarchy = new Supplier::RuleHierarchy();
+
+ for (size_t i = 0; i < arraysize(json_) && json_[i] != NULL; ++i) {
+ ASSERT_TRUE(rule[i].ParseSerializedRule(json_[i]));
+ hierarchy->rule[i] = &rule[i];
+ }
+
+ (*task->supplied_)(success_, *task->lookup_key_, *hierarchy);
+ }
+
+ const char* json_[arraysize(LookupKey::kHierarchy)];
+ bool success_;
+ AddressData address_;
+ bool allow_postal_;
+ bool require_name_;
+ FieldProblemMap filter_;
+ FieldProblemMap problems_;
+ FieldProblemMap expected_;
+ bool called_;
+
+ private:
+ void Validated(bool success,
+ const AddressData& address,
+ const FieldProblemMap& problems) {
+ ASSERT_EQ(success_, success);
+ ASSERT_EQ(&address_, &address);
+ ASSERT_EQ(&problems_, &problems);
+ called_ = true;
+ }
+
+ const scoped_ptr<const AddressValidator::Callback> validated_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValidationTaskTest);
+};
+
+namespace {
+
+TEST_F(ValidationTaskTest, FailureCountryRuleNull) {
+ success_ = false;
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, FailureCountryRuleEmpty) {
+ json_[0] = "{}";
+ success_ = false;
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, SuccessCountryRuleNullNameEmpty) {
+ expected_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, SuccessCountryRuleNullNameNotEmpty) {
+ address_.region_code = "rrr";
+
+ expected_.insert(std::make_pair(COUNTRY, UNKNOWN_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, SuccessCountryRuleEmptyNameEmpty) {
+ json_[0] = "{}";
+
+ expected_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, SuccessCountryRuleEmptyNameNotEmpty) {
+ json_[0] = "{}";
+
+ address_.region_code = "rrr";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, MissingRequiredFieldsUS) {
+ json_[0] = "{}";
+
+ address_.region_code = "US";
+
+ filter_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
+ expected_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, MissingNoRequiredFieldsUS) {
+ json_[0] = "{}";
+
+ address_.region_code = "US";
+ address_.administrative_area = "sss";
+ address_.locality = "ccc";
+ address_.postal_code = "zzz";
+ address_.address_line.push_back("aaa");
+ address_.recipient = "nnn";
+
+ filter_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
+ filter_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UnexpectedFieldUS) {
+ json_[0] = "{}";
+
+ address_.region_code = "US";
+ address_.dependent_locality = "ddd";
+
+ filter_.insert(std::make_pair(DEPENDENT_LOCALITY, UNEXPECTED_FIELD));
+ expected_.insert(std::make_pair(DEPENDENT_LOCALITY, UNEXPECTED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, MissingRequiredFieldRequireName) {
+ json_[0] = "{}";
+
+ address_.region_code = "rrr";
+
+ require_name_ = true;
+
+ expected_.insert(std::make_pair(RECIPIENT, MISSING_REQUIRED_FIELD));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UnknownValueRuleNull) {
+ json_[0] = "{\"fmt\":\"%R%S\",\"require\":\"RS\",\"sub_keys\":\"aa~bb\"}";
+
+ address_.region_code = "rrr";
+ address_.administrative_area = "sss";
+
+ expected_.insert(std::make_pair(ADMIN_AREA, UNKNOWN_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, NoUnknownValueRuleNotNull) {
+ json_[0] = "{\"fmt\":\"%R%S\",\"require\":\"RS\",\"sub_keys\":\"aa~bb\"}";
+ json_[1] = "{}";
+
+ address_.region_code = "rrr";
+ address_.administrative_area = "sss";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeUnrecognizedFormatTooShort) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "12";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeUnrecognizedFormatTooLong) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "1234";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeRecognizedFormat) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "123";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeMismatchingValue1) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+ json_[1] = "{\"zip\":\"1\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "000";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeMismatchingValue2) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+ json_[1] = "{\"zip\":\"1\"}";
+ json_[2] = "{\"zip\":\"12\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "100";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeMismatchingValue3) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+ json_[1] = "{\"zip\":\"1\"}";
+ json_[2] = "{\"zip\":\"12\"}";
+ json_[3] = "{\"zip\":\"123\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "120";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeMatchingValue) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
+ json_[1] = "{\"zip\":\"1\"}";
+ json_[2] = "{\"zip\":\"12\"}";
+ json_[3] = "{\"zip\":\"123\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "123";
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodePrefixMismatchingValue) {
+ json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{5}\"}";
+ json_[1] = "{\"zip\":\"9[0-5]|96[01]\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "10960";
+
+ expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, PostalCodeFilterIgnoresMismatching) {
+ json_[0] = "{\"zip\":\"\\\\d{3}\"}";
+ json_[1] = "{\"zip\":\"1\"}";
+
+ address_.region_code = "rrr";
+ address_.postal_code = "000";
+
+ filter_.erase(POSTAL_CODE);
+ filter_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
+
+ // (POSTAL_CODE, MISMATCHING_VALUE) should not be reported.
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UsesPoBoxLanguageUnd) {
+ json_[0] = "{\"fmt\":\"%A\"}";
+
+ address_.region_code = "rrr";
+ address_.address_line.push_back("aaa");
+ address_.address_line.push_back("P.O. Box");
+ address_.address_line.push_back("aaa");
+
+ expected_.insert(std::make_pair(STREET_ADDRESS, USES_P_O_BOX));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UsesPoBoxLanguageDa) {
+ json_[0] = "{\"fmt\":\"%A\",\"languages\":\"da\"}";
+
+ address_.region_code = "rrr";
+ address_.address_line.push_back("aaa");
+ address_.address_line.push_back("Postboks");
+ address_.address_line.push_back("aaa");
+
+ expected_.insert(std::make_pair(STREET_ADDRESS, USES_P_O_BOX));
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UsesPoBoxLanguageDaNotMatchDe) {
+ json_[0] = "{\"fmt\":\"%A\",\"languages\":\"da\"}";
+
+ address_.region_code = "rrr";
+ address_.address_line.push_back("aaa");
+ address_.address_line.push_back("Postfach");
+ address_.address_line.push_back("aaa");
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+TEST_F(ValidationTaskTest, UsesPoBoxAllowPostal) {
+ json_[0] = "{\"fmt\":\"%A\"}";
+
+ address_.region_code = "rrr";
+ address_.address_line.push_back("aaa");
+ address_.address_line.push_back("P.O. Box");
+ address_.address_line.push_back("aaa");
+
+ allow_postal_ = true;
+
+ ASSERT_NO_FATAL_FAILURE(Validate());
+ ASSERT_TRUE(called_);
+ EXPECT_EQ(expected_, problems_);
+}
+
+} // namespace
+} // namespace addressinput
+} // namespace i18n
diff --git a/java/android.jar b/java/android.jar
new file mode 100644
index 0000000..8bf318d
--- /dev/null
+++ b/java/android.jar
Binary files differ
diff --git a/java/build.gradle b/java/build.gradle
new file mode 100644
index 0000000..b7ac52a
--- /dev/null
+++ b/java/build.gradle
@@ -0,0 +1,25 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ mavenLocal()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:0.8.+'
+ }
+}
+
+apply plugin: 'android-library'
+
+android {
+ compileSdkVersion 19
+ buildToolsVersion '19.1.0'
+
+ sourceSets {
+ main {
+ manifest.srcFile 'src/AndroidManifest.xml'
+ java.srcDirs = ['src']
+ res.srcDirs = ['res']
+ }
+ }
+}
diff --git a/java/build.xml b/java/build.xml
new file mode 100644
index 0000000..3c36334
--- /dev/null
+++ b/java/build.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" ?>
+
+<project name="libaddressinput" default="compile">
+ <property name="src.dir" value="src"/>
+ <property name="test.dir" value="test"/>
+ <property name="build.dir" value="build"/>
+ <property name="classes.dir" value="${build.dir}/classes"/>
+ <property name="jar.dir" value="${build.dir}/jar"/>
+ <property name="testdata.dir" value="../testdata"/>
+ <property name="testlibs.dir" value="testlibs"/>
+ <property name="report.dir" value="${build.dir}/junitreport"/>
+
+ <path id="classpath">
+ <fileset dir="${src.dir}" includes="src/com/android/i18n/**"/>
+ <pathelement location="android.jar"/>
+ </path>
+ <path id="test.classpath">
+ <pathelement location="${classes.dir}"/>
+ <pathelement location="${jar.dir}/${ant.project.name}-test.jar"/>
+ <fileset dir="${testlibs.dir}" includes="**/*.jar"/>
+ </path>
+
+ <target name="compile" description="Compile Java source.">
+ <mkdir dir="${classes.dir}"/>
+ <!-- AddressWidget*.java must be excluded, as they depend on R.class, which
+ would be generated by the Android resource compiler. -->
+ <javac srcdir="${src.dir}/"
+ encoding="utf-8"
+ includes="com/android/i18n/**"
+ excludes="com/android/i18n/addressinput/AddressWidget*.java"
+ destdir="${classes.dir}"
+ classpathref="classpath"
+ includeantruntime="false"
+ debug="on">
+ <compilerarg value="-Xlint"/>
+ </javac>
+ <javac srcdir="${test.dir}"
+ excludes="com/android/i18n/addressinput/AddressWidget*.java"
+ destdir="${classes.dir}"
+ classpathref="test.classpath"
+ encoding="utf-8"
+ includeantruntime="true"
+ debug="on"/>
+ </target>
+
+ <target name="jar" depends="compile">
+ <mkdir dir="${jar.dir}"/>
+ <jar destfile="${jar.dir}/${ant.project.name}.jar">
+ <fileset dir="${classes.dir}">
+ <include name="**/*.class"/>
+ <exclude name="**/*Test*"/>
+ </fileset>
+ </jar>
+ </target>
+
+ <target name="test-jar" depends="compile">
+ <mkdir dir="${jar.dir}"/>
+ <jar destfile="${jar.dir}/${ant.project.name}-test.jar">
+ <fileset dir="${classes.dir}">
+ <include name="**/*.class"/>
+ <exclude name="**/*Test*"/>
+ </fileset>
+ <fileset dir="${testdata.dir}" />
+ </jar>
+ </target>
+
+ <target name="junit" depends="test-jar">
+ <mkdir dir="${report.dir}"/>
+ <junit printsummary="yes">
+ <classpath refid="test.classpath"/>
+ <formatter type="xml"/>
+ <batchtest fork="no" todir="${report.dir}">
+ <fileset dir="${test.dir}">
+ <include name="**/*Test*"/>
+ <exclude name="**/AddressWidget*"/>
+ </fileset>
+ </batchtest>
+ </junit>
+ </target>
+
+ <target name="junitreport">
+ <junitreport todir="${report.dir}">
+ <fileset dir="${report.dir}" includes="TEST-*.xml"/>
+ <report todir="${report.dir}"/>
+ </junitreport>
+ </target>
+
+ <target name="clean" description="Remove generated files.">
+ <delete dir="${build.dir}"/>
+ </target>
+
+ <target name="clean-build" depends="clean,jar"/>
+</project>
diff --git a/java/res/layout/address_edittext.xml b/java/res/layout/address_edittext.xml
new file mode 100644
index 0000000..e36c330
--- /dev/null
+++ b/java/res/layout/address_edittext.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<EditText
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/address_edit_text"
+ android:singleLine="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:inputType = "textPostalAddress|textCapWords" />
diff --git a/java/res/layout/address_layout.xml b/java/res/layout/address_layout.xml
new file mode 100644
index 0000000..1256968
--- /dev/null
+++ b/java/res/layout/address_layout.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/address_layout"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
diff --git a/java/res/layout/address_spinner.xml b/java/res/layout/address_spinner.xml
new file mode 100644
index 0000000..9f2bf30
--- /dev/null
+++ b/java/res/layout/address_spinner.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<Spinner
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/address_spinner"
+ android:drawSelectorOnTop="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
diff --git a/java/res/layout/address_textview.xml b/java/res/layout/address_textview.xml
new file mode 100644
index 0000000..669eb64
--- /dev/null
+++ b/java/res/layout/address_textview.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/address_text_view"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dip"
+ android:layout_marginLeft="3dip"
+ android:textColor="?android:attr/textColorPrimary" />
diff --git a/java/res/values/address_strings.xml b/java/res/values/address_strings.xml
new file mode 100644
index 0000000..57b34c4
--- /dev/null
+++ b/java/res/values/address_strings.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Strings used in the AddressInput widget. The first section contains strings
+ * that may need to be changed for consistency with the client application, the
+ * second section contains widget-specific labels and error messages.
+ */
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- The first section of strings are for strings that may need to be changed
+ to be consistent with other parts of the client application. -->
+
+ <!-- Message displayed to the user when data is being loaded from the
+ server. The u2026 is the unicode character for the ellipses (...) -->
+ <string name="address_data_loading">Loading\u2026</string>
+
+ <!-- Strings below this point are address-specific and relate either to
+ labels for input fields or to error messages that the widget may report. -->
+
+ <!-- A country or a political region (countries like the United States or
+ regions like Hong Kong) [CHAR LIMIT=30] -->
+ <string name="i18n_country_label">Country</string>
+
+ <!-- A city or town, such as New York City [CHAR LIMIT=30] -->
+ <string name="i18n_locality_label">City</string>
+
+ <!-- Area of a town (a neighbourhood/suburb) used for addresses in Korea and
+ China, or a district of a country such as Nauru [CHAR LIMIT=30] -->
+ <string name="i18n_dependent_locality_label">District</string>
+
+ <!-- Company/Organization of the address [CHAR LIMIT=30] -->
+ <string name="i18n_organization_label">Company</string>
+
+ <!-- Label indicating the person to be contacted as part of this address, to
+ be used for example as "Contact Name: John Doe".[CHAR LIMIT=30] -->
+ <string name="i18n_recipient_label">Contact Name</string>
+
+ <!-- Street-level part of an address, e.g., 18th Street, Unit 3 [CHAR LIMIT=30] -->
+ <string name="i18n_address_line1_label">Street Address</string>
+
+ <!-- Postal Code. Values are frequently alphanumeric. [CHAR LIMIT=30] -->
+ <string name="i18n_postal_code_label">Postal Code</string>
+
+ <!-- Label to represent ZIP codes, used in countries like the US. [CHAR LIMIT=30] -->
+ <string name="i18n_zip_code_label">ZIP Code</string>
+
+ <!-- Administrative Area for Hong Kong (e.g., Kowloon) [CHAR LIMIT=30] -->
+ <string name="i18n_area">Area</string>
+
+ <!-- Administrative Area for the United Kingdom (e.g., Yorkshire) [CHAR LIMIT=30] -->
+ <string name="i18n_county_label">County</string>
+
+ <!-- Administrative Area, as used for countries like Nicaragua (e.g., Boaco)
+ [CHAR LIMIT=30] -->
+ <string name="i18n_department">Department</string>
+
+ <!-- Administrative Area for Korea (e.g., Gyeonggi-do or Busan-si) [CHAR LIMIT=30] -->
+ <string name="i18n_do_si">Do</string>
+
+ <!-- Administrative Area for United Arab Emirates (e.g., Abu Dhabi) [CHAR LIMIT=30] -->
+ <string name="i18n_emirate">Emirate</string>
+
+ <!-- Administrative Area for certain countries (e.g., Bahama's Cat Island) [CHAR LIMIT=30] -->
+ <string name="i18n_island">Island</string>
+
+ <!-- Administrative Area for certain countries (e.g., Andorra's Canillo) [CHAR LIMIT=30] -->
+ <string name="i18n_parish">Parish</string>
+
+ <!-- Administrative Area for Japan (e.g., Hokkaido) [CHAR LIMIT=30] -->
+ <string name="i18n_prefecture">Prefecture</string>
+
+ <!-- Administrative Area for certain countries (e.g., France's Champagne) [CHAR LIMIT=30] -->
+ <string name="i18n_province">Province</string>
+
+ <!-- Administrative Area for certain countries (e.g., US' California) [CHAR LIMIT=30] -->
+ <string name="i18n_state_label">State</string>
+
+ <!-- Message to be shown when a required field is empty [CHAR LIMIT=30] -->
+ <string name="i18n_missing_required_field">Required</string>
+
+ <!-- Message to be shown when the value entered by the user in a given field is invalid
+ [CHAR LIMIT=30] -->
+ <string name="invalid_entry">Invalid entry</string>
+
+ <!-- Message to be shown when a city or town entered by the user, such as
+ New York City, is invalid. [CHAR LIMIT=30] -->
+ <string name="invalid_locality_label">Invalid city</string>
+
+ <!-- Message to be shown when an area of a city which is entered by the user (a
+ neighbourhood/suburb), is invalid. Used for addresses in Korea and
+ China, or for districts of a country such as Nauru [CHAR LIMIT=30] -->
+ <string name="invalid_dependent_locality_label">Invalid district</string>
+
+ <!-- Message to be shown when an incorrect postal code is entered by the user. Postal codes
+ are used in countries like New Zealand. [CHAR LIMIT=30] -->
+ <string name="invalid_postal_code_label">Invalid postal code</string>
+
+ <!-- Message to be shown when an incorrect ZIP code is entered by the user.
+ ZIP codes are used in countries like the US. [CHAR LIMIT=30] -->
+ <string name="invalid_zip_code_label">Invalid ZIP code</string>
+
+ <!-- Message to be shown when the administrative area for Hong Kong (e.g., Kowloon)
+ is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_area">Invalid area</string>
+
+ <!-- Message to be shown when the administrative area (county) for the United Kingdom
+ is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_county_label">Invalid county</string>
+
+ <!-- Message to be shown when the administrative area (department) used for countries like
+ Nicaragua (e.g., Boaco) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_department">Invalid department</string>
+
+ <!-- Message to be shown when the administrative area for Korea (e.g., Gyeonggi-do or Busan-si)
+ is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_do_si">Invalid do</string>
+
+ <!-- Message to be shown when the administrative area (emirate) for United Arab Emirates
+ (e.g., Abu Dhabi) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_emirate">Invalid emirate</string>
+
+ <!-- Message to be shown when the administrative area (island) for certain countries
+ (e.g., Bahama) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_island">Invalid island</string>
+
+ <!-- Message to be shown when the administrative area (parish) for certain countries
+ (e.g., Andorra) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_parish">Invalid parish</string>
+
+ <!-- Message to be shown when the administrative area (prefecture) for Japan (e.g., Hokkaido)
+ is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_prefecture">Invalid prefecture</string>
+
+ <!-- Message to be shown when the administrative area (province) for certain countries
+ (e.g., France's Champagne) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_province">Invalid province</string>
+
+ <!-- Message to be shown when the administrative area (state) for certain countries
+ (e.g., the USA) is entered incorrectly by the user [CHAR LIMIT=30] -->
+ <string name="invalid_state_label">Invalid state</string>
+</resources>
diff --git a/java/settings.gradle b/java/settings.gradle
new file mode 100644
index 0000000..d6f0002
--- /dev/null
+++ b/java/settings.gradle
@@ -0,0 +1 @@
+include ':test'
diff --git a/java/src/AndroidManifest.xml b/java/src/AndroidManifest.xml
new file mode 100644
index 0000000..c3d022e
--- /dev/null
+++ b/java/src/AndroidManifest.xml
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.i18n.addressinput"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="8"
+ android:targetSdkVersion="19" />
+
+</manifest>
diff --git a/java/src/com/android/i18n/addressinput/AddressData.java b/java/src/com/android/i18n/addressinput/AddressData.java
new file mode 100644
index 0000000..fc039a2
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressData.java
@@ -0,0 +1,394 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A simple data structure for international postal addresses.
+ *
+ * Addresses may seem simple, but even within the US there are many quirks (hyphenated street
+ * addresses, etc.), and internationally addresses vary a great deal. The most sane and complete in
+ * many ways is the OASIS "extensible Address Language", xAL, which is a published and documented
+ * XML schema:
+ *
+ * http://www.oasis-open.org/committees/ciq/download.shtml
+ *
+ * We have not represented all the fields, but the intent is that if you need to add something, you
+ * should follow the OASIS standard.
+ *
+ * An example address:
+ * <p>postalCountry: US</p>
+ * <p>addressLine1: 1098 Alta Ave</p>
+ * <p>addressLine2:</p>
+ * <p>adminstrativeArea: CA</p>
+ * <p>locality: Mountain View</p>
+ * <p>dependentLocality:</p>
+ * <p>postalCode: 94043</p>
+ * <p>sortingCode:</p>
+ * <p>organization: Google</p>
+ * <p>recipient: Chen-Kang Yang</p>
+ * <p>language code: en</p>
+ *
+ * Note that sub-administrative area is NOT used in Address Widget. Sub-administrative Area is
+ * second-level administrative subdivision of this country. For examples: US county, IT province, UK
+ * county. This level of geo information is not required to fill out address form, therefore is
+ * neglected.
+ *
+ * All values stored in this class are trimmed. Also, if you try to set a field with an empty string
+ * or a string consists of only spaces, it will not be set.
+ */
+public class AddressData {
+ // CLDR (Common Locale Data Repository) country code.
+ // For example, "US" for United States.
+ // (Note: Use "GB", not "UK", for Great Britain)
+ private final String mPostalCountry;
+
+ // street street, line 1
+ private final String mAddressLine1;
+
+ // street street, line 2
+ private final String mAddressLine2;
+
+ // Top-level administrative subdivision of this country.
+ // Examples: US state, IT region, UK constituent nation, JP prefecture.
+ private final String mAdministrativeArea;
+
+ // Locality. A fuzzy term, but it generally refers to
+ // the city/town portion of an address. In regions of the world where
+ // localities are not well defined or do not fit into this structure well
+ // (for example, Japan and China), leave locality empty and use
+ // addressLine1.
+ // Examples: US city, IT comune, UK post town.
+ private final String mLocality;
+
+ // Dependent locality or sublocality. Used for UK dependent localities,
+ // or neighborhoods or boroughs in other locations. If trying to
+ // represent a UK double-dependent locality, include both the
+ // double-dependent locality and the dependent locality in this field,
+ // e.g. "Whaley, Langwith".
+ private final String mDependentLocality;
+
+ // Postal Code. values are frequently alphanumeric.
+ // Examples: "94043", "94043-1351", "SW1W", "SW1W 9TQ".
+ private final String mPostalCode;
+
+ // Sorting code - use is very country-specific.
+ // This corresponds to the SortingCode sub-element of the xAL
+ // PostalServiceElements element.
+ // Examples: FR CEDEX.
+ private final String mSortingCode;
+
+ // The firm or organization. This goes at a finer granularity than
+ // address lines in the address. Omit if not needed.
+ private final String mOrganization;
+
+ // The recipient. This goes at a finer granularity than address lines
+ // in the address. Not present in xAL. Omit if not needed.
+ private final String mRecipient;
+
+ // Language code of the address. Can be set to null. See its getter and setter
+ // for more information.
+ private final String mLanguageCode;
+
+ /**
+ * Use {@link Builder} to create instances.
+ */
+ private AddressData(Builder builder) {
+ mPostalCountry = builder.mValues.get(AddressField.COUNTRY);
+ mAdministrativeArea = builder.mValues.get(AddressField.ADMIN_AREA);
+ mLocality = builder.mValues.get(AddressField.LOCALITY);
+ mDependentLocality = builder.mValues.get(AddressField.DEPENDENT_LOCALITY);
+ mPostalCode = builder.mValues.get(AddressField.POSTAL_CODE);
+ mSortingCode = builder.mValues.get(AddressField.SORTING_CODE);
+ mOrganization = builder.mValues.get(AddressField.ORGANIZATION);
+ mRecipient = builder.mValues.get(AddressField.RECIPIENT);
+ mAddressLine1 = builder.mValues.get(AddressField.ADDRESS_LINE_1);
+ mAddressLine2 = builder.mValues.get(AddressField.ADDRESS_LINE_2);
+ mLanguageCode = builder.mLanguage;
+ }
+
+ /**
+ * Returns the postal country.
+ *
+ * <p>The returned value is not user-presentable. For example, {@code getPostalCountry()} may
+ * return {@code "GB"}, while addresses in Great Britain should be displayed using "UK".
+ */
+ public String getPostalCountry() {
+ return mPostalCountry;
+ }
+
+ public String getAddressLine1() {
+ return mAddressLine1;
+ }
+
+ public String getAddressLine2() {
+ return mAddressLine2;
+ }
+
+ /**
+ * Returns the top-level administrative subdivision of this country. Different postal countries
+ * use different names to refer to their administrative areas. For example, this is called
+ * "state" in the United States, "region" in Italy, "constituent nation" in Great Britain, or
+ * "prefecture" in Japan.
+ */
+ public String getAdministrativeArea() {
+ return mAdministrativeArea;
+ }
+
+ /**
+ * Returns the locality. The usage of this field varies by region, but it generally refers to
+ * the "city" or "town" of the address. Some regions do not use this field; their address lines
+ * are sufficient to locate an address within a sub-administrative area. For example, this is
+ * called "city" in the United States, "comune" in Italy, or "post town" in Great Britain.
+ */
+ public String getLocality() {
+ return mLocality;
+ }
+
+ /**
+ * Returns the dependent locality.
+ *
+ * <p>This is used for Great Britain dependent localities, or neighborhoods or boroughs in other
+ * locations.
+ *
+ * <p>In cases such as Great Britain, this field may contain a double-dependent locality, such
+ * as "Whaley, Langwith".
+ */
+ public String getDependentLocality() {
+ return mDependentLocality;
+ }
+
+ /**
+ * Returns the firm or organization.
+ */
+ public String getOrganization() {
+ return mOrganization;
+ }
+
+ /**
+ * Returns the recipient. Examples: "Jesse Wilson" or "Jesse Wilson c/o Apurva Mathad".
+ */
+ public String getRecipient() {
+ return mRecipient;
+ }
+
+ /**
+ * Returns the country-specific postal code. Examples: "94043", "94043-1351", "SW1W",
+ * "SW1W 9TQ".
+ */
+ public String getPostalCode() {
+ return mPostalCode;
+ }
+
+ /**
+ * Returns the country-specific sorting code. For example, the
+ * <a href="http://en.wikipedia.org/wiki/List_of_postal_codes_in_France"> French CEDEX</a>
+ */
+ public String getSortingCode() {
+ return mSortingCode;
+ }
+
+ public String getFieldValue(AddressField field) {
+ switch (field) {
+ case COUNTRY:
+ return mPostalCountry;
+ case ADMIN_AREA:
+ return mAdministrativeArea;
+ case LOCALITY:
+ return mLocality;
+ case DEPENDENT_LOCALITY:
+ return mDependentLocality;
+ case POSTAL_CODE:
+ return mPostalCode;
+ case SORTING_CODE:
+ return mSortingCode;
+ case ADDRESS_LINE_1:
+ return mAddressLine1;
+ case ADDRESS_LINE_2:
+ return mAddressLine2;
+ case ORGANIZATION:
+ return mOrganization;
+ case RECIPIENT:
+ return mRecipient;
+ default:
+ throw new IllegalArgumentException("unrecognized key: " + field);
+ }
+ }
+
+ /**
+ * Returns the language of the text of this address. Languages are used to guide how the address
+ * is <a href="http://en.wikipedia.org/wiki/Mailing_address_format_by_country"> formatted for
+ * display</a>. The same address may have different {@link AddressData} representations in
+ * different languages. For example, the French name of "New Mexico" is "Nouveau-Mexique".
+ */
+ public String getLanguageCode() {
+ return mLanguageCode;
+ }
+
+ /**
+ * Builder for AddressData
+ */
+ public static class Builder {
+
+ private final Map<AddressField, String> mValues;
+
+ private String mLanguage = null;
+
+ public Builder() {
+ mValues = new HashMap<AddressField, String>();
+ }
+
+ /**
+ * A constructor that sets address field with input data. Street fields will be normalized
+ * in the process. I.e., after copy, there will not be any empty street line in front of
+ * non-empty ones. For example, if input data's street line 1 is null but street line 2
+ * has a value, this method will copy street line 2's value and set it to street line 1.
+ */
+ public Builder(AddressData addr) {
+ mValues = new HashMap<AddressField, String>();
+ set(addr);
+ }
+
+ public Builder setCountry(String value) {
+ return set(AddressField.COUNTRY, value);
+ }
+
+ public Builder setAdminArea(String value) {
+ return set(AddressField.ADMIN_AREA, value);
+ }
+
+ public Builder setLocality(String value) {
+ return set(AddressField.LOCALITY, value);
+ }
+
+ public Builder setDependentLocality(String value) {
+ return set(AddressField.DEPENDENT_LOCALITY, value);
+ }
+
+ public Builder setPostalCode(String value) {
+ return set(AddressField.POSTAL_CODE, value);
+ }
+
+ public Builder setSortingCode(String value) {
+ return set(AddressField.SORTING_CODE, value);
+ }
+
+ /**
+ * Sets the language code.
+ *
+ * @param languageCode the language to use, or {@code null} for no specified language.
+ */
+ public Builder setLanguageCode(String languageCode) {
+ this.mLanguage = languageCode;
+ return this;
+ }
+
+ /**
+ * Sets address lines 1 and 2 (if necessary) from a string that may contain multiple lines.
+ *
+ * <p> Example: Input " \n \n1600 Amphitheatre Ave\n\nRoom 122" will set the following
+ * values:<br/> line 1: 1600 Amphitheatre Ave<br/> line 2: Room 122<br/> </p>
+ *
+ * @param value a street string
+ */
+ public Builder setAddress(String value) {
+ setAddressLine1(value);
+ return this;
+ }
+
+ /**
+ * Sets address by copying from input address data. Street fields will be normalized in the
+ * process. I.e., after copy, there will not be any empty street lines in front of non-empty
+ * ones. For example, if input data's street line 1 is null but street line 2 has a value,
+ * this method will copy street line 2's value and set it to street line 1.
+ */
+ public Builder set(AddressData data) {
+ mValues.clear();
+ for (AddressField addressField : AddressField.values()) {
+ if (addressField == AddressField.STREET_ADDRESS) {
+ continue; // Do nothing.
+ } else {
+ set(addressField, data.getFieldValue(addressField));
+ }
+ }
+ normalizeAddresses();
+ setLanguageCode(data.getLanguageCode());
+ return this;
+ }
+
+ public Builder setAddressLine1(String value) {
+ return set(AddressField.ADDRESS_LINE_1, value);
+ }
+
+ public Builder setAddressLine2(String value) {
+ return set(AddressField.ADDRESS_LINE_2, value);
+ }
+
+ public Builder setOrganization(String value) {
+ return set(AddressField.ORGANIZATION, value);
+ }
+
+ public Builder setRecipient(String value) {
+ return set(AddressField.RECIPIENT, value);
+ }
+
+ /**
+ * Sets an address field with the specified value. If the value is empty (a null string,
+ * empty string, or a string that contains only spaces), the original value associated with
+ * the field will be removed.
+ */
+ public Builder set(AddressField field, String value) {
+ if (value == null || value.length() == 0) {
+ mValues.remove(field);
+ } else {
+ mValues.put(field, value.trim());
+ }
+ normalizeAddresses();
+ return this;
+ }
+
+ public AddressData build() {
+ return new AddressData(this);
+ }
+
+ /**
+ * Parses content of address line fields.
+ * If address_line_1 is empty, address_line_2 will be used to populate address_line_1 if
+ * possible. If address_line_1 contains a new line, content after the new line will be
+ * saved in address_line_2.
+ */
+ private void normalizeAddresses() {
+ String address1 = mValues.get(AddressField.ADDRESS_LINE_1);
+ String address2 = mValues.get(AddressField.ADDRESS_LINE_2);
+ if (address1 == null || address1.trim().length() == 0) {
+ address1 = address2;
+ address2 = null;
+ }
+ if (address1 != null) {
+ String[] addressLines = address1.split("\n");
+ if (addressLines.length > 1) {
+ address1 = addressLines[0];
+ address2 = addressLines[1];
+ }
+ }
+ mValues.put(AddressField.ADDRESS_LINE_1, address1);
+ mValues.put(AddressField.ADDRESS_LINE_2, address2);
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressDataKey.java b/java/src/com/android/i18n/addressinput/AddressDataKey.java
new file mode 100644
index 0000000..33ffd74
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressDataKey.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Enumerates all the data fields found in the JSON-format address property data that are used by
+ * the Android Address Input Widget.
+ */
+enum AddressDataKey {
+ /**
+ * Identifies the countries for which data is provided.
+ */
+ COUNTRIES,
+ /**
+ * The standard format string. This identifies which fields can be used in the address, along
+ * with their order. This also carries additional information for use in formatting the fields
+ * into multiple lines. This is also used to indicate which fields should _not_ be used for an
+ * address.
+ */
+ FMT,
+ /**
+ * The unique ID of the region, in the form of a path from parent IDs to the key.
+ */
+ ID,
+ /**
+ * The key of the region, unique to its parent. If there is an accepted abbreviation for this
+ * region, then the key will be set to this and name will be set to the local name for this
+ * region. If there is no accepted abbreviation, then this key will be the local name and there
+ * will be no local name specified. This value must be present.
+ */
+ KEY,
+ /**
+ * The language of this data, if known.
+ */
+ LANG,
+ /**
+ * The latin format string {@link #FMT} used when a country defines an alternative format for
+ * use with the latin script, such as in China.
+ */
+ LFMT,
+ /**
+ * Indicates which fields must be present in a valid address.
+ */
+ REQUIRE,
+ /**
+ * Indicates the name used for the admin areas for a particular region.
+ */
+ STATE_NAME_TYPE,
+ /**
+ * Encodes the {@link #KEY} value of all the children of this region.
+ */
+ SUB_KEYS,
+ /**
+ * Encodes the transliterated latin name value of all the children of this region, if the local
+ * names are not in latin script already.
+ */
+ SUB_LNAMES,
+ /**
+ * Indicates, for each child of this region, whether that child has additional children.
+ */
+ SUB_MORES,
+ /**
+ * Encodes the local name value of all the children of this region.
+ */
+ SUB_NAMES,
+ /**
+ * Encodes the {@link #ZIP} value for the subtree beneath this region.
+ */
+ XZIP,
+ /**
+ * Encodes the postal code pattern if at the country level, and the postal code prefix if at a
+ * level below country.
+ */
+ ZIP,
+ /**
+ * Indicates the name used for the postal code for a particular region.
+ */
+ ZIP_NAME_TYPE;
+
+ /**
+ * Returns a field based on its keyname (value in the JSON-format file), or null if no field
+ * matches.
+ */
+ static AddressDataKey get(String keyname) {
+ return ADDRESS_KEY_NAME_MAP.get(keyname.toLowerCase());
+ }
+
+ private static final Map<String, AddressDataKey> ADDRESS_KEY_NAME_MAP =
+ new HashMap<String, AddressDataKey>();
+
+ static {
+ // Populates the map of enums against their lower-cased string values for easy look-up.
+ for (AddressDataKey field : values()) {
+ ADDRESS_KEY_NAME_MAP.put(field.toString().toLowerCase(), field);
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressField.java b/java/src/com/android/i18n/addressinput/AddressField.java
new file mode 100644
index 0000000..b951021
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressField.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Defines the character codes used in the metadata to specify the types of fields used in address
+ * formatting. Note that the metadata also has a character for newlines, which is not defined here.
+ */
+public enum AddressField {
+ ADMIN_AREA('S', "state"),
+ LOCALITY('C', "city"),
+ RECIPIENT('N', "name"),
+ ORGANIZATION('O', "organization"),
+ // Deprecated - use A instead.
+ ADDRESS_LINE_1('1', "street1"),
+ // Deprecated - use A instead.
+ ADDRESS_LINE_2('2', "street2"),
+ DEPENDENT_LOCALITY('D'),
+ POSTAL_CODE('Z'),
+ SORTING_CODE('X'),
+ STREET_ADDRESS('A'),
+
+ COUNTRY('R');
+
+ /**
+ * Enum for width types of address input fields.
+ */
+ public enum WidthType {
+ LONG,
+ SHORT;
+ }
+
+ private static final Map<Character, AddressField> FIELD_MAPPING
+ = new HashMap<Character, AddressField>();
+
+ static {
+ for (AddressField value : values()) {
+ FIELD_MAPPING.put(value.getChar(), value);
+ }
+ }
+
+ private final char mField;
+
+ private final String mAttributeName;
+
+ private AddressField(char field, String attributeName) {
+ mField = field;
+ mAttributeName = attributeName;
+ }
+
+ private AddressField(char field) {
+ this(field, null);
+ }
+
+ /**
+ * Gets the corresponding AddressField for the character code. Returns null if the character is
+ * not recognized.
+ */
+ static AddressField of(char field) {
+ return FIELD_MAPPING.get(field);
+ }
+
+ /**
+ * Gets attribute name. Attribute names are used as keys to JSON address data returned from the
+ * server. Returns null if the field does not have a corresponding attribute name.
+ *
+ * Note: Not all address fields have attribute names. Fields like postal code, country, sorting
+ * code, or street address do not have attribute names.
+ */
+ String getAttributeName() {
+ return mAttributeName;
+ }
+
+ /**
+ * Gets the field's identification character, as used in the metadata.
+ *
+ * @return identification char.
+ */
+ char getChar() {
+ return mField;
+ }
+
+ /** Returns default width type of the address field. */
+ WidthType getDefaulWidthType() {
+ return this.equals(POSTAL_CODE) || this.equals(SORTING_CODE)
+ ? WidthType.SHORT : WidthType.LONG;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressProblemType.java b/java/src/com/android/i18n/addressinput/AddressProblemType.java
new file mode 100644
index 0000000..4cab705
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressProblemType.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * Enumerates problems that default address verification can report.
+ */
+public enum AddressProblemType {
+
+ /**
+ * The field is not null and not whitespace, and the field should not be used for this country.
+ *
+ * <p>For example, in the U.S. the SORTING_CODE field is unused, so its presence is an error.
+ */
+ USING_UNUSED_FIELD,
+
+ /**
+ * The field is null or whitespace, and the field is required.
+ *
+ * <p>For example, in the U.S. ADMIN_AREA is a required field.
+ */
+ MISSING_REQUIRED_FIELD,
+
+ /**
+ * A list of values for the field is defined and the value does not occur in the list. Applies
+ * to hierarchical elements like REGION, ADMIN_AREA, LOCALITY, and DEPENDENT_LOCALITY.
+ *
+ * <p>For example, in the U.S. the only valid values for ADMIN_AREA are the two-letter state
+ * codes.
+ */
+ UNKNOWN_VALUE,
+
+ /**
+ * A format for the field is defined and the value does not match. This is used to match
+ * POSTAL_CODE against the the format pattern generally.
+ *
+ * <p>For example, in the U.S. postal codes are five digits with an optional hyphen followed by
+ * four digits.
+ */
+ UNRECOGNIZED_FORMAT,
+
+ /**
+ * A pattern for the field is defined and the value does not match. This is used to match
+ * POSTAL_CODE against a regular expression.
+ *
+ * <p>For example, in the U.S. postal codes in the state of California start with '9'.
+ */
+ MISMATCHING_VALUE;
+
+ /**
+ * Returns a unique string identifying this problem (for use in a message catalog).
+ */
+ public String keyname() {
+ return name().toLowerCase();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressProblems.java b/java/src/com/android/i18n/addressinput/AddressProblems.java
new file mode 100644
index 0000000..9371140
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressProblems.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This structure keeps track of any errors found when validating the AddressData.
+ */
+public class AddressProblems {
+
+ private Map<AddressField, AddressProblemType> mProblems =
+ new HashMap<AddressField, AddressProblemType>();
+
+ /**
+ * Only one address problem type is saved per addressField. Address field as used here refers to
+ * the different data parts in the AddressData class.
+ */
+ void add(AddressField addressField, AddressProblemType problem) {
+ mProblems.put(addressField, problem);
+ }
+
+ /**
+ * Returns true if no problems have been added.
+ */
+ public boolean isEmpty() {
+ return mProblems.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ return mProblems.toString();
+ }
+
+ public void clear() {
+ mProblems.clear();
+ }
+
+ /**
+ * Returns null if no problems exists.
+ */
+ public AddressProblemType getProblem(AddressField addressField) {
+ return mProblems.get(addressField);
+ }
+
+ /**
+ * This will return an empty map if there are no problems.
+ */
+ public Map<AddressField, AddressProblemType> getProblems() {
+ return mProblems;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressUiComponent.java b/java/src/com/android/i18n/addressinput/AddressUiComponent.java
new file mode 100644
index 0000000..3c2e937
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressUiComponent.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import android.view.View;
+import android.widget.EditText;
+import android.widget.Spinner;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a component in the address widget UI. It could be either a text box (when there is no
+ * candidate) or a spinner.
+ */
+class AddressUiComponent {
+ // The label for the UI component
+ private String mFieldName;
+
+ // The type of the UI component
+ private UiComponent mUiType;
+
+ // The list of elements in the UI component
+ private List<RegionData> mCandidatesList = new ArrayList<RegionData>();
+
+ // The id of this UI component
+ private AddressField mId;
+
+ // The id of the parent UI component. When the parent UI component is updated, this UI
+ // component should be updated.
+ private AddressField mParentId;
+
+ // The View representing the UI component
+ private View mView;
+
+ /**
+ * Type of UI component. There are only EDIT (text-box) and SPINNER (drop-down) components.
+ */
+ enum UiComponent {
+ EDIT, SPINNER,
+ }
+
+ AddressUiComponent(AddressField id) {
+ mId = id;
+ // By default, an AddressUiComponent doesn't depend on anything else.
+ mParentId = null;
+ mUiType = UiComponent.EDIT;
+ }
+
+ /**
+ * Initializes the candidatesList, and set the uiType and parentId.
+ * @param candidatesList
+ */
+ void initializeCandidatesList(List<RegionData> candidatesList) {
+ mCandidatesList = candidatesList;
+ if (candidatesList.size() > 1) {
+ mUiType = UiComponent.SPINNER;
+ switch (mId) {
+ case DEPENDENT_LOCALITY:
+ mParentId = AddressField.LOCALITY;
+ break;
+ case LOCALITY:
+ mParentId = AddressField.ADMIN_AREA;
+ break;
+ case ADMIN_AREA:
+ mParentId = AddressField.COUNTRY;
+ break;
+ default:
+ // Ignore.
+ }
+ }
+ }
+
+ /**
+ * Gets the value entered in the UI component.
+ */
+ String getValue() {
+ if (mView == null) {
+ return (mCandidatesList.size() == 0) ? "" : mCandidatesList.get(0).getDisplayName();
+ }
+ switch (mUiType) {
+ case SPINNER:
+ Object selectedItem = ((Spinner) mView).getSelectedItem();
+ if (selectedItem == null) {
+ return "";
+ }
+ return selectedItem.toString();
+ case EDIT:
+ return ((EditText) mView).getText().toString();
+ default:
+ return "";
+ }
+ }
+
+ String getFieldName() {
+ return mFieldName;
+ }
+
+ void setFieldName(String fieldName) {
+ mFieldName = fieldName;
+ }
+
+ UiComponent getUiType() {
+ return mUiType;
+ }
+
+ void setUiType(UiComponent uiType) {
+ mUiType = uiType;
+ }
+
+ List<RegionData> getCandidatesList() {
+ return mCandidatesList;
+ }
+
+ void setCandidatesList(List<RegionData> candidatesList) {
+ mCandidatesList = candidatesList;
+ }
+
+ AddressField getId() {
+ return mId;
+ }
+
+ void setId(AddressField id) {
+ mId = id;
+ }
+
+ AddressField getParentId() {
+ return mParentId;
+ }
+
+ void setParentId(AddressField parentId) {
+ mParentId = parentId;
+ }
+
+ void setView(View view) {
+ mView = view;
+ }
+
+ View getView() {
+ return mView;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressVerificationData.java b/java/src/com/android/i18n/addressinput/AddressVerificationData.java
new file mode 100644
index 0000000..58f4366
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressVerificationData.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Wraps a Map of address property data to provide the AddressVerificationData API.
+ */
+class AddressVerificationData implements DataSource {
+
+ private final Map<String, String> mPropertiesMap;
+
+ private static final Pattern KEY_VALUES_PATTERN = Pattern.compile("\"([^\"]+)\":\"([^\"]*)\"");
+
+ private static final Pattern SEPARATOR_PATTERN = Pattern.compile("\",\"");
+
+ /**
+ * Constructs from a map of address property data. This keeps a reference to the map. This
+ * does not mutate the map. The map should not be mutated subsequent to this call.
+ */
+ AddressVerificationData(Map<String, String> propertiesMap) {
+ mPropertiesMap = propertiesMap;
+ }
+
+ @Override
+ public AddressVerificationNodeData get(String key) {
+ String json = mPropertiesMap.get(key);
+ if (json != null && isValidKey(key)) {
+ return createNodeData(json);
+ }
+ return null;
+ }
+
+ /**
+ * Returns a set of the keys for which verification data is provided. The returned set is
+ * immutable.
+ */
+ Set<String> keys() {
+ Set<String> result = new HashSet<String>();
+ for (String key : mPropertiesMap.keySet()) {
+ if (isValidKey(key)) {
+ result.add(key);
+ }
+ }
+ return Collections.unmodifiableSet(result);
+ }
+
+ /**
+ * We can be initialized with the full set of address information, but validation only uses
+ * info prefixed with "data" (in particular, no info prefixed with "examples").
+ */
+ private boolean isValidKey(String key) {
+ return key.startsWith("data");
+ }
+
+ /**
+ * Returns the contents of the JSON-format string as a map.
+ */
+ AddressVerificationNodeData createNodeData(String json) {
+ // Remove leading and trailing { and }.
+ json = json.substring(1, json.length() - 1);
+ Map<AddressDataKey, String> map =
+ new EnumMap<AddressDataKey, String>(AddressDataKey.class);
+
+ // our objects are very simple so we parse manually
+ // - no double quotes within strings
+ // - no extra spaces
+ // can't use split "," since some data has commas in it.
+ Matcher sm = SEPARATOR_PATTERN.matcher(json);
+ int pos = 0;
+ while (pos < json.length()) {
+ String pair;
+ if (sm.find()) {
+ pair = json.substring(pos, sm.start() + 1);
+ pos = sm.start() + 2;
+ } else {
+ pair = json.substring(pos);
+ pos = json.length();
+ }
+
+ Matcher m = KEY_VALUES_PATTERN.matcher(pair);
+ if (m.matches()) {
+ String value = m.group(2);
+
+ // Remove escaped backslashes.
+ // Java regex doesn't handle a replacement String consisting of
+ // a single backslash, and treats a replacement String consisting of
+ // two backslashes as two backslashes instead of one. So there's
+ // no way to use regex to replace a match with a single backslash,
+ // apparently.
+ if (value.length() > 0) {
+ char[] linechars = m.group(2).toCharArray();
+ int w = 1;
+ for (int r = w; r < linechars.length; ++r) {
+ char c = linechars[r];
+ if (c == '\\' && linechars[w - 1] == '\\') {
+ // don't increment w;
+ continue;
+ }
+ linechars[w++] = c;
+ }
+ value = new String(linechars, 0, w);
+ }
+
+ AddressDataKey df = AddressDataKey.get(m.group(1));
+ if (df == null) {
+ // Skip this data - it isn't used in the Android version.
+ } else {
+ map.put(df, value);
+ }
+ } else {
+ // This is a runtime data sanity check. The data should be
+ // checked when the data is built. The JSON data string should
+ // be parsable into string pairs using SEP_PAT.
+ throw new RuntimeException("could not match '" + pair + "' in '" + json + "'");
+ }
+ }
+
+ return new AddressVerificationNodeData(map);
+ }
+
+ @Override
+ public AddressVerificationNodeData getDefaultData(String key) {
+ // gets country key
+ if (key.split("/").length > 1) {
+ String[] parts = key.split("/");
+ key = parts[0] + "/" + parts[1];
+ }
+
+ AddressVerificationNodeData data = get(key);
+ if (data == null) {
+ throw new RuntimeException("failed to get default data with key " + key);
+ }
+ return data;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressVerificationNodeData.java b/java/src/com/android/i18n/addressinput/AddressVerificationNodeData.java
new file mode 100644
index 0000000..bb291d9
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressVerificationNodeData.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * A map of {@link AddressDataKey}s to JSON strings. Provides data for a single node in the address
+ * data hierarchy (for example, "data/US/CA"). Key is an AddressDataKey and the value is the raw
+ * string representing that data. This is either a single string, or an array of strings represented
+ * as a single string using '~' to separate the elements of the array, depending on the
+ * AddressDataKey.
+ */
+public class AddressVerificationNodeData {
+
+ private final Map<AddressDataKey, String> mMap;
+
+ public AddressVerificationNodeData(Map<AddressDataKey, String> map) {
+ Util.checkNotNull("Cannot construct StandardNodeData with null map");
+ mMap = map;
+ }
+
+ /**
+ * Iterates through the map.
+ */
+ public Iterator<AddressDataKey> iterator() {
+ return mMap.keySet().iterator();
+ }
+
+ public boolean containsKey(AddressDataKey key) {
+ return mMap.containsKey(key);
+ }
+
+ /**
+ * Gets the value for a particular key in the map.
+ */
+ public String get(AddressDataKey key) {
+ return mMap.get(key);
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressWidget.java b/java/src/com/android/i18n/addressinput/AddressWidget.java
new file mode 100644
index 0000000..2ebfeef
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressWidget.java
@@ -0,0 +1,754 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.os.Handler;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.android.i18n.addressinput.AddressField.WidthType;
+import com.android.i18n.addressinput.AddressUiComponent.UiComponent;
+import com.android.i18n.addressinput.LookupKey.KeyType;
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Address widget that lays out address fields, validate and format addresses according to local
+ * customs.
+ */
+public class AddressWidget implements AdapterView.OnItemSelectedListener {
+ private Context mContext;
+
+ private ViewGroup mRootView;
+
+ private LayoutInflater mInflater;
+
+ private CacheData mCacheData;
+
+ // A map for all address fields except for country.
+ private final EnumMap<AddressField, AddressUiComponent> mInputWidgets =
+ new EnumMap<AddressField, AddressUiComponent>(AddressField.class);
+
+ private FormController mFormController;
+
+ private FormatInterpreter mFormatInterpreter;
+
+ private FormOptions mFormOptions;
+
+ private StandardAddressVerifier mVerifier;
+
+ private ProgressDialog mProgressDialog;
+
+ private String mCurrentRegion;
+
+ // The current language the widget use in BCP47 format. It differs from the default locale of
+ // the phone in that it contains information on the script to use.
+ private String mWidgetLocale;
+
+ private ScriptType mScript;
+
+ // The appropriate label that should be applied to the admin area field of the current country.
+ // Examples include "state", "province", "emirate", etc.
+ private String mAdminLabel;
+
+ private static final Map<String, Integer> ADMIN_LABELS;
+ private static final Map<String, Integer> ADMIN_ERROR_MESSAGES;
+
+ private static final FormOptions SHOW_ALL_FIELDS = new FormOptions.Builder().build();
+
+ // The appropriate label that should be applied to the zip code field of the current country.
+ private enum ZipLabel {
+ ZIP,
+ POSTAL
+ }
+
+ private ZipLabel mZipLabel;
+
+ static {
+ Map<String, Integer> adminLabelMap = new HashMap<String, Integer>(15);
+ adminLabelMap.put("area", R.string.i18n_area);
+ adminLabelMap.put("county", R.string.i18n_county_label);
+ adminLabelMap.put("department", R.string.i18n_department);
+ adminLabelMap.put("district", R.string.i18n_dependent_locality_label);
+ adminLabelMap.put("do_si", R.string.i18n_do_si);
+ adminLabelMap.put("emirate", R.string.i18n_emirate);
+ adminLabelMap.put("island", R.string.i18n_island);
+ adminLabelMap.put("parish", R.string.i18n_parish);
+ adminLabelMap.put("prefecture", R.string.i18n_prefecture);
+ adminLabelMap.put("province", R.string.i18n_province);
+ adminLabelMap.put("state", R.string.i18n_state_label);
+ ADMIN_LABELS = Collections.unmodifiableMap(adminLabelMap);
+
+ Map<String, Integer> adminErrorMap = new HashMap<String, Integer>(15);
+ adminErrorMap.put("area", R.string.invalid_area);
+ adminErrorMap.put("county", R.string.invalid_county_label);
+ adminErrorMap.put("department", R.string.invalid_department);
+ adminErrorMap.put("district", R.string.invalid_dependent_locality_label);
+ adminErrorMap.put("do_si", R.string.invalid_do_si);
+ adminErrorMap.put("emirate", R.string.invalid_emirate);
+ adminErrorMap.put("island", R.string.invalid_island);
+ adminErrorMap.put("parish", R.string.invalid_parish);
+ adminErrorMap.put("prefecture", R.string.invalid_prefecture);
+ adminErrorMap.put("province", R.string.invalid_province);
+ adminErrorMap.put("state", R.string.invalid_state_label);
+ ADMIN_ERROR_MESSAGES = Collections.unmodifiableMap(adminErrorMap);
+ }
+
+ // Need handler for callbacks to the UI thread
+ final Handler mHandler = new Handler();
+
+ final Runnable mUpdateMultipleFields = new Runnable() {
+ @Override
+ public void run() {
+ updateFields();
+ }
+ };
+
+ private class UpdateRunnable implements Runnable {
+ private AddressField myId;
+
+ public UpdateRunnable(AddressField id) {
+ myId = id;
+ }
+
+ @Override
+ public void run() {
+ updateInputWidget(myId);
+ }
+ }
+
+ private static class AddressSpinnerInfo {
+ private Spinner mView;
+
+ private AddressField mId;
+
+ private AddressField mParentId;
+
+ private ArrayAdapter<String> mAdapter;
+
+ private List<RegionData> mCurrentRegions;
+
+ @SuppressWarnings("unchecked")
+ public AddressSpinnerInfo(Spinner view, AddressField id, AddressField parentId) {
+ mView = view;
+ mId = id;
+ mParentId = parentId;
+ mAdapter = (ArrayAdapter<String>) view.getAdapter();
+ }
+
+ public void setSpinnerList(List<RegionData> list, String defaultKey) {
+ mCurrentRegions = list;
+ mAdapter.clear();
+ for (RegionData item : list) {
+ mAdapter.add(item.getDisplayName());
+ }
+ mAdapter.sort(Collator.getInstance(Locale.getDefault()));
+ if (defaultKey.length() == 0) {
+ mView.setSelection(0);
+ } else {
+ int position = mAdapter.getPosition(defaultKey);
+ mView.setSelection(position);
+ }
+ }
+
+ // Returns the region key of the currently selected region in the Spinner.
+ public String getRegionCode(int position) {
+ if (mAdapter.getCount() <= position) {
+ return "";
+ }
+ String value = mAdapter.getItem(position);
+ return getRegionDataKeyForValue(value);
+ }
+
+ // Returns the region key for the region value.
+ public String getRegionDataKeyForValue(String value) {
+ for (RegionData data : mCurrentRegions) {
+ if (data.getDisplayName().endsWith(value)) {
+ return data.getKey();
+ }
+ }
+ return "";
+ }
+ }
+
+ private final ArrayList<AddressSpinnerInfo> mSpinners = new ArrayList<AddressSpinnerInfo>();
+
+ private AddressWidgetUiComponentProvider mComponentProvider;
+
+ /** TODO: Add region-dependent width types for address fields. */
+ private WidthType getFieldWidthType(AddressUiComponent field) {
+ return field.getId().getDefaulWidthType();
+ }
+
+ private void createView(ViewGroup rootView, AddressUiComponent field, String defaultKey,
+ boolean readOnly) {
+ @SuppressWarnings("deprecation") // FILL_PARENT renamed MATCH_PARENT in API Level 8.
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
+ LayoutParams.WRAP_CONTENT);
+ String fieldText = field.getFieldName();
+ WidthType widthType = getFieldWidthType(field);
+
+ if (fieldText.length() > 0) {
+ TextView textView = mComponentProvider.createUiLabel(fieldText, widthType);
+ rootView.addView(textView, lp);
+ }
+ if (field.getUiType().equals(UiComponent.EDIT)) {
+ EditText editText = mComponentProvider.createUiTextField(widthType);
+ field.setView(editText);
+ editText.setEnabled(!readOnly);
+ rootView.addView(editText, lp);
+ } else if (field.getUiType().equals(UiComponent.SPINNER)) {
+ ArrayAdapter<String> adapter = mComponentProvider.createUiPickerAdapter(widthType);
+ Spinner spinner = mComponentProvider.createUiPickerSpinner(widthType);
+
+ field.setView(spinner);
+ rootView.addView(spinner, lp);
+ spinner.setAdapter(adapter);
+ AddressSpinnerInfo spinnerInfo =
+ new AddressSpinnerInfo(spinner, field.getId(), field.getParentId());
+ spinnerInfo.setSpinnerList(field.getCandidatesList(), defaultKey);
+
+ if (fieldText.length() > 0) {
+ spinner.setPrompt(fieldText);
+ }
+ spinner.setOnItemSelectedListener(this);
+ mSpinners.add(spinnerInfo);
+ }
+ }
+
+ /**
+ * Associates each field with its corresponding AddressUiComponent.
+ */
+ private void buildFieldWidgets() {
+ AddressData data = new AddressData.Builder().setCountry(mCurrentRegion).build();
+ LookupKey key = new LookupKey.Builder(LookupKey.KeyType.DATA).setAddressData(data).build();
+ AddressVerificationNodeData countryNode =
+ (new ClientData(mCacheData)).getDefaultData(key.toString());
+
+ // Set up AddressField.ADMIN_AREA
+ AddressUiComponent adminAreaUi = new AddressUiComponent(AddressField.ADMIN_AREA);
+ adminAreaUi.setFieldName(getAdminAreaFieldName(countryNode));
+ mInputWidgets.put(AddressField.ADMIN_AREA, adminAreaUi);
+
+ // Set up AddressField.LOCALITY
+ AddressUiComponent localityUi = new AddressUiComponent(AddressField.LOCALITY);
+ localityUi.setFieldName(mContext.getString(R.string.i18n_locality_label));
+ mInputWidgets.put(AddressField.LOCALITY, localityUi);
+
+ // Set up AddressField.DEPENDENT_LOCALITY
+ AddressUiComponent subLocalityUi = new AddressUiComponent(AddressField.DEPENDENT_LOCALITY);
+ subLocalityUi.setFieldName(mContext.getString(R.string.i18n_dependent_locality_label));
+ mInputWidgets.put(AddressField.DEPENDENT_LOCALITY, subLocalityUi);
+
+ // Set up AddressField.ADDRESS_LINE_1
+ AddressUiComponent addressLine1Ui = new AddressUiComponent(AddressField.ADDRESS_LINE_1);
+ addressLine1Ui.setFieldName(mContext.getString(R.string.i18n_address_line1_label));
+ mInputWidgets.put(AddressField.ADDRESS_LINE_1, addressLine1Ui);
+
+ // Set up AddressField.ADDRESS_LINE_2
+ AddressUiComponent addressLine2Ui = new AddressUiComponent(AddressField.ADDRESS_LINE_2);
+ addressLine2Ui.setFieldName("");
+ mInputWidgets.put(AddressField.ADDRESS_LINE_2, addressLine2Ui);
+
+ // Set up AddressField.ORGANIZATION
+ AddressUiComponent organizationUi = new AddressUiComponent(AddressField.ORGANIZATION);
+ organizationUi.setFieldName(mContext.getString(R.string.i18n_organization_label));
+ mInputWidgets.put(AddressField.ORGANIZATION, organizationUi);
+
+ // Set up AddressField.RECIPIENT
+ AddressUiComponent recipientUi = new AddressUiComponent(AddressField.RECIPIENT);
+ recipientUi.setFieldName(mContext.getString(R.string.i18n_recipient_label));
+ mInputWidgets.put(AddressField.RECIPIENT, recipientUi);
+
+ // Set up AddressField.POSTAL_CODE
+ AddressUiComponent postalCodeUi = new AddressUiComponent(AddressField.POSTAL_CODE);
+ postalCodeUi.setFieldName(getZipFieldName(countryNode));
+ mInputWidgets.put(AddressField.POSTAL_CODE, postalCodeUi);
+
+ // Set up AddressField.SORTING_CODE
+ AddressUiComponent sortingCodeUi = new AddressUiComponent(AddressField.SORTING_CODE);
+ sortingCodeUi.setFieldName("CEDEX");
+ mInputWidgets.put(AddressField.SORTING_CODE, sortingCodeUi);
+ }
+
+ private void initializeDropDowns() {
+ AddressUiComponent adminAreaUi = mInputWidgets.get(AddressField.ADMIN_AREA);
+ List<RegionData> adminAreaList = getRegionData(AddressField.COUNTRY);
+ adminAreaUi.initializeCandidatesList(adminAreaList);
+
+ AddressUiComponent localityUi = mInputWidgets.get(AddressField.LOCALITY);
+ List<RegionData> localityList = getRegionData(AddressField.ADMIN_AREA);
+ localityUi.initializeCandidatesList(localityList);
+ }
+
+ // Zip code is called postal code in some countries. This method returns the appropriate name
+ // for the given countryNode.
+ private String getZipFieldName(AddressVerificationNodeData countryNode) {
+ String zipName;
+ String zipType = countryNode.get(AddressDataKey.ZIP_NAME_TYPE);
+ if (zipType == null) {
+ mZipLabel = ZipLabel.POSTAL;
+ zipName = mContext.getString(R.string.i18n_postal_code_label);
+ } else {
+ mZipLabel = ZipLabel.ZIP;
+ zipName = mContext.getString(R.string.i18n_zip_code_label);
+ }
+ return zipName;
+ }
+
+ private String getAdminAreaFieldName(AddressVerificationNodeData countryNode) {
+ String adminLabelType = countryNode.get(AddressDataKey.STATE_NAME_TYPE);
+ mAdminLabel = adminLabelType;
+ Integer result = ADMIN_LABELS.get(adminLabelType);
+ if (result == null) {
+ // Fallback to province.
+ result = R.string.i18n_province;
+ }
+ return mContext.getString(result);
+ }
+
+ private void buildCountryListBox() {
+ // Set up AddressField.COUNTRY
+ AddressUiComponent countryUi = new AddressUiComponent(AddressField.COUNTRY);
+ countryUi.setFieldName(mContext.getString(R.string.i18n_country_label));
+ ArrayList<RegionData> countries = new ArrayList<RegionData>();
+ for (RegionData regionData : mFormController.getRegionData(new LookupKey.Builder(
+ KeyType.DATA).build())) {
+ String regionKey = regionData.getKey();
+ // ZZ represents an unknown region code.
+ if (!regionKey.equals("ZZ")) {
+ String localCountryName = getLocalCountryName(regionKey);
+ RegionData country = new RegionData.Builder().setKey(regionKey).setName(
+ localCountryName).build();
+ countries.add(country);
+ }
+ }
+ countryUi.initializeCandidatesList(countries);
+ mInputWidgets.put(AddressField.COUNTRY, countryUi);
+ }
+
+ private String getLocalCountryName(String regionCode) {
+ return (new Locale("", regionCode)).getDisplayCountry(Locale.getDefault());
+ }
+
+ private AddressSpinnerInfo findSpinnerByView(View view) {
+ for (AddressSpinnerInfo spinnerInfo : mSpinners) {
+ if (spinnerInfo.mView == view) {
+ return spinnerInfo;
+ }
+ }
+ return null;
+ }
+
+ private void updateFields() {
+ removePreviousViews();
+ buildFieldWidgets();
+ initializeDropDowns();
+ layoutAddressFields();
+ }
+
+ private void removePreviousViews() {
+ if (mRootView == null) {
+ return;
+ }
+ int childCount = mRootView.getChildCount();
+ if (mFormOptions.isHidden(AddressField.COUNTRY)) {
+ if (childCount > 0) {
+ mRootView.removeAllViews();
+ }
+ } else if (childCount > 2) {
+ // Keep the TextView and Spinner for Country and remove everything else.
+ mRootView.removeViews(2, mRootView.getChildCount() - 2);
+ }
+ }
+
+ private void layoutAddressFields() {
+ for (AddressField field : mFormatInterpreter.getAddressFieldOrder(mScript,
+ mCurrentRegion)) {
+ if (!mFormOptions.isHidden(field)) {
+ createView(mRootView, mInputWidgets.get(field), "", mFormOptions.isReadonly(field));
+ }
+ }
+ }
+
+ private void updateChildNodes(AdapterView<?> parent, int position) {
+ AddressSpinnerInfo spinnerInfo = findSpinnerByView(parent);
+ if (spinnerInfo == null) {
+ return;
+ }
+
+ // Find all the child spinners, if any, that depend on this one.
+ final AddressField myId = spinnerInfo.mId;
+ if (myId != AddressField.COUNTRY && myId != AddressField.ADMIN_AREA
+ && myId != AddressField.LOCALITY) {
+ // Only a change in the three AddressFields above will trigger a change in other
+ // AddressFields. Therefore, for all other AddressFields, we return immediately.
+ return;
+ }
+
+ String regionCode = spinnerInfo.getRegionCode(position);
+ if (myId == AddressField.COUNTRY) {
+ updateWidgetOnCountryChange(regionCode);
+ return;
+ }
+
+ mFormController.requestDataForAddress(getAddressData(), new DataLoadListener() {
+ @Override
+ public void dataLoadingBegin(){
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ Runnable updateChild = new UpdateRunnable(myId);
+ mHandler.post(updateChild);
+ }
+ });
+ }
+
+ public void updateWidgetOnCountryChange(String regionCode) {
+ if (mCurrentRegion.equalsIgnoreCase(regionCode)) {
+ return;
+ }
+ mCurrentRegion = regionCode;
+ mFormController.setCurrentCountry(mCurrentRegion);
+ renderForm();
+ }
+
+ private void updateInputWidget(AddressField myId) {
+ for (AddressSpinnerInfo child : mSpinners) {
+ if (child.mParentId == myId) {
+ List<RegionData> candidates = getRegionData(child.mParentId);
+ child.setSpinnerList(candidates, "");
+ }
+ }
+ }
+
+ public void renderForm() {
+ setWidgetLocaleAndScript();
+ AddressData data = new AddressData.Builder().setCountry(mCurrentRegion)
+ .setLanguageCode(mWidgetLocale).build();
+ mFormController.requestDataForAddress(data, new DataLoadListener() {
+ @Override
+ public void dataLoadingBegin() {
+ mProgressDialog = mComponentProvider.getUiActivityIndicatorView();
+ mProgressDialog.setMessage(mContext.getString(R.string.address_data_loading));
+ Log.d(this.toString(), "Progress dialog started.");
+ }
+ @Override
+ public void dataLoadingEnd() {
+ Log.d(this.toString(), "Data loading completed.");
+ mProgressDialog.dismiss();
+ Log.d(this.toString(), "Progress dialog stopped.");
+ mHandler.post(mUpdateMultipleFields);
+ }
+ });
+ }
+
+ private void setWidgetLocaleAndScript() {
+ mWidgetLocale = Util.getWidgetCompatibleLanguageCode(Locale.getDefault(), mCurrentRegion);
+ mFormController.setLanguageCode(mWidgetLocale);
+ mScript = Util.isExplicitLatinScript(mWidgetLocale)
+ ? ScriptType.LATIN
+ : ScriptType.LOCAL;
+ }
+
+ private List<RegionData> getRegionData(AddressField parentField) {
+ AddressData address = getAddressData();
+
+ // Removes language code from address if it is default. This address is used to build
+ // lookup key, which neglects default language. For example, instead of "data/US--en/CA",
+ // the right lookup key is "data/US/CA".
+ if (mFormController.isDefaultLanguage(address.getLanguageCode())) {
+ address = new AddressData.Builder(address).setLanguageCode(null).build();
+ }
+
+ LookupKey parentKey = mFormController.getDataKeyFor(address).getKeyForUpperLevelField(
+ parentField);
+ List<RegionData> candidates;
+ // Can't build a key with parent field, quit.
+ if (parentKey == null) {
+ Log.w(this.toString(), "Can't build key with parent field " + parentField + ". One of"
+ + " the ancestor fields might be empty");
+
+ // Removes candidates that exist from previous settings. For example, data/US has a
+ // list of candidates AB, BC, CA, etc, that list should be cleaned up when user updates
+ // the address by changing country to Channel Islands.
+ candidates = new ArrayList<RegionData>(1);
+ } else {
+ candidates = mFormController.getRegionData(parentKey);
+ }
+ return candidates;
+ }
+
+ /**
+ * Creates an AddressWidget to be attached to rootView for the specific context using the
+ * default UI component provider.
+ */
+ public AddressWidget(Context context, ViewGroup rootView, FormOptions formOptions,
+ ClientCacheManager cacheManager) {
+ this(context, rootView, formOptions, cacheManager,
+ new AddressWidgetUiComponentProvider(context));
+ }
+
+ /**
+ * Creates an AddressWidget to be attached to rootView for the specific context using UI
+ * component provided by the provider.
+ */
+ public AddressWidget(Context context, ViewGroup rootView, FormOptions formOptions,
+ ClientCacheManager cacheManager, AddressWidgetUiComponentProvider provider) {
+ mComponentProvider = provider;
+ mCurrentRegion =
+ ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE))
+ .getSimCountryIso().toUpperCase(Locale.US);
+ if (mCurrentRegion.length() == 0) {
+ mCurrentRegion = "US";
+ }
+ init(context, rootView, formOptions, cacheManager);
+ renderForm();
+ }
+
+ /**
+ * Creates an AddressWidget to be attached to rootView for the specific context using the
+ * default UI component provider, and fill out the address form with savedAddress.
+ */
+ public AddressWidget(Context context, ViewGroup rootView, FormOptions formOptions,
+ ClientCacheManager cacheManager, AddressData savedAddress) {
+ this(context, rootView, formOptions, cacheManager, savedAddress,
+ new AddressWidgetUiComponentProvider(context));
+ }
+
+ /**
+ * Creates an AddressWidget to be attached to rootView for the specific context using UI
+ * component provided by the provider, and fill out the address form with savedAddress.
+ */
+ public AddressWidget(Context context, ViewGroup rootView, FormOptions formOptions,
+ ClientCacheManager cacheManager, AddressData savedAddress,
+ AddressWidgetUiComponentProvider provider) {
+ mComponentProvider = provider;
+ mCurrentRegion = savedAddress.getPostalCountry();
+ // Postal country must be 2 letter country code. Otherwise default to US.
+ if (mCurrentRegion == null || mCurrentRegion.length() != 2) {
+ mCurrentRegion = "US";
+ }
+ init(context, rootView, formOptions, cacheManager);
+ renderFormWithSavedAddress(savedAddress);
+ }
+
+ public void renderFormWithSavedAddress(AddressData savedAddress) {
+ setWidgetLocaleAndScript();
+ removePreviousViews();
+ buildFieldWidgets();
+ layoutAddressFields();
+ initializeFieldsWithAddress(savedAddress);
+ }
+
+ private void initializeFieldsWithAddress(AddressData savedAddress) {
+ for (AddressField field : mFormatInterpreter.getAddressFieldOrder(mScript,
+ mCurrentRegion)) {
+ String value = savedAddress.getFieldValue(field);
+ if (value == null) {
+ value = "";
+ }
+ AddressUiComponent uiComponent = mInputWidgets.get(field);
+ EditText view = (EditText) uiComponent.getView();
+ if (view != null) {
+ view.setText(value);
+ }
+ }
+ }
+
+ private void init(Context context, ViewGroup rootView, FormOptions formOptions,
+ ClientCacheManager cacheManager) {
+ mContext = context;
+ mRootView = rootView;
+ mFormOptions = formOptions;
+ mCacheData = new CacheData(cacheManager);
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mFormController =
+ new FormController(new ClientData(mCacheData),
+ mWidgetLocale, mCurrentRegion);
+ mFormatInterpreter = new FormatInterpreter(mFormOptions);
+ mVerifier = new StandardAddressVerifier(
+ new FieldVerifier(new ClientData(mCacheData)));
+ if (!formOptions.isHidden(AddressField.COUNTRY)) {
+ buildCountryListBox();
+ createView(mRootView, mInputWidgets.get(AddressField.COUNTRY),
+ getLocalCountryName(mCurrentRegion),
+ formOptions.isReadonly(AddressField.COUNTRY));
+ }
+ }
+
+ /**
+ * Sets address data server URL. Input URL cannot be null.
+ *
+ * @param url The service URL.
+ */
+ public void setUrl(String url) {
+ mCacheData.setUrl(url);
+ }
+
+ /**
+ * Gets user input address in AddressData format.
+ */
+ public AddressData getAddressData() {
+ AddressData.Builder builder = new AddressData.Builder();
+ builder.setCountry(mCurrentRegion);
+ for (AddressField field : mFormatInterpreter.getAddressFieldOrder(mScript,
+ mCurrentRegion)) {
+ AddressUiComponent addressUiComponent = mInputWidgets.get(field);
+ if (addressUiComponent != null) {
+ String value = addressUiComponent.getValue();
+ if (addressUiComponent.getUiType() == UiComponent.SPINNER) {
+ // For drop-downs, return the key of the region selected instead of the value.
+ View view = getViewForField(field);
+ AddressSpinnerInfo spinnerInfo = findSpinnerByView(view);
+ if (spinnerInfo != null) {
+ value = spinnerInfo.getRegionDataKeyForValue(value);
+ }
+ }
+ builder.set(field, value);
+ }
+ }
+ builder.setLanguageCode(mWidgetLocale);
+ return builder.build();
+ }
+
+ /**
+ * Gets the formatted address.
+ *
+ * This method does not validate addresses. Also, it will "normalize" the result strings by
+ * removing redundant spaces and empty lines.
+ *
+ * @return the formatted address
+ */
+ public List<String> getEnvelopeAddress() {
+ return mFormatInterpreter.getEnvelopeAddress(getAddressData());
+ }
+
+ /**
+ * Gets the formatted address based on the AddressData passed in.
+ */
+ public List<String> getEnvelopeAddress(AddressData address) {
+ return mFormatInterpreter.getEnvelopeAddress(address);
+ }
+
+ /**
+ * Gets the formatted address based on the AddressData passed in with none of the relevant
+ * fields hidden.
+ */
+ public static List<String> getFullEnvelopeAddress(AddressData address) {
+ return new FormatInterpreter(SHOW_ALL_FIELDS).getEnvelopeAddress(address);
+ }
+
+ /**
+ * Get problems found in the address data entered by the user.
+ */
+ public AddressProblems getAddressProblems() {
+ AddressProblems problems = new AddressProblems();
+ AddressData addressData = getAddressData();
+ mVerifier.verify(addressData, problems);
+ return problems;
+ }
+
+ /**
+ * Displays an appropriate error message when the AddressField contains an invalid entry.
+ *
+ * @return the View object representing the AddressField.
+ */
+ public View displayErrorMessageForInvalidEntryIn(AddressField field) {
+ Log.d(this.toString(), "Display error message for the field: " + field.toString());
+ AddressUiComponent addressUiComponent = mInputWidgets.get(field);
+ if (addressUiComponent != null && addressUiComponent.getUiType() == UiComponent.EDIT) {
+ int errorMessageId = getErrorMessageIdForInvalidEntryIn(field);
+ EditText view = (EditText) addressUiComponent.getView();
+ view.setError(mContext.getString(errorMessageId));
+ return view;
+ }
+ return null;
+ }
+
+ private int getErrorMessageIdForInvalidEntryIn(AddressField field) {
+ switch (field) {
+ case ADMIN_AREA:
+ return ADMIN_ERROR_MESSAGES.get(mAdminLabel);
+ case LOCALITY:
+ return R.string.invalid_locality_label;
+ case DEPENDENT_LOCALITY:
+ return R.string.invalid_dependent_locality_label;
+ case POSTAL_CODE:
+ return (mZipLabel == ZipLabel.POSTAL
+ ? R.string.invalid_postal_code_label
+ : R.string.invalid_zip_code_label);
+ default:
+ return R.string.invalid_entry;
+ }
+ }
+
+ /**
+ * Clears all error messages in the UI.
+ */
+ public void clearErrorMessage() {
+ for (AddressField field : mFormatInterpreter.getAddressFieldOrder(mScript,
+ mCurrentRegion)) {
+ AddressUiComponent addressUiComponent = mInputWidgets.get(field);
+
+ if (addressUiComponent != null && addressUiComponent.getUiType() == UiComponent.EDIT) {
+ EditText view = (EditText) addressUiComponent.getView();
+ if (view != null) {
+ view.setError(null);
+ }
+ }
+ }
+ }
+
+ public View getViewForField(AddressField field) {
+ AddressUiComponent component = mInputWidgets.get(field);
+ if (component == null) {
+ return null;
+ }
+ return component.getView();
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> arg0) {
+ }
+
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ updateChildNodes(parent, position);
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/AddressWidgetUiComponentProvider.java b/java/src/com/android/i18n/addressinput/AddressWidgetUiComponentProvider.java
new file mode 100644
index 0000000..9f5a350
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/AddressWidgetUiComponentProvider.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.widget.ArrayAdapter;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.android.i18n.addressinput.AddressField.WidthType;
+
+/**
+ * Base class for customizing widgets for address input.
+ *
+ * <p>
+ * Clients can optionally override this class and use
+ * {@link AddressWidget#setUiComponentProvider(AddressWidgetUiComponentProvider)} to set the the
+ * componentProvider field of the address widget, which will be invoked by the widget to create UI
+ * components that provide consistent look-and-feel with other UI components clients might use
+ * alongside the address widget.
+ */
+public class AddressWidgetUiComponentProvider {
+ protected Context mContext;
+ protected LayoutInflater mInflater;
+
+ public AddressWidgetUiComponentProvider(Context context) {
+ mContext = context;
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ /**
+ * Creates a label, e.g. "State", for an address input field.
+ *
+ * @param label the label of the address input field
+ * @param widthType {@link WidthType} of the field
+ * @return a custom {@link TextView} created for the field
+ */
+ protected TextView createUiLabel(CharSequence label, WidthType widthType) {
+ TextView textView = (TextView) mInflater.inflate(R.layout.address_textview, null, false);
+ textView.setText(label);
+ return textView;
+ }
+
+ /**
+ * Creates a text input view for an address input field.
+ *
+ * @param widthType {@link WidthType} of the field
+ * @return a custom {@link EditText} created for the field
+ */
+ protected EditText createUiTextField(WidthType widthType) {
+ return (EditText) mInflater.inflate(R.layout.address_edittext, null, false);
+ }
+
+ /**
+ * Creates a {@link Spinner} for a input field that uses UI picker.
+ *
+ * @param widthType {@link WidthType} of the field
+ * @return a custom {@link Spinner} created for the field
+ */
+ protected Spinner createUiPickerSpinner(WidthType widthType) {
+ return (Spinner) mInflater.inflate(R.layout.address_spinner, null, false);
+ }
+
+ /**
+ * Creates an {@link ArrayAdapter} to work with the custom {@link Spinner} of a input field that
+ * uses UI picker.
+ *
+ * @param widthType {@link WidthType} of the field
+ * @return a custom {@link ArrayAdapter} for the field
+ */
+ protected ArrayAdapter<String> createUiPickerAdapter(WidthType widthType) {
+ ArrayAdapter<String> adapter =
+ new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item);
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ return adapter;
+ }
+
+ /** Gets an activity indicator to show that a task is in progress. */
+ protected ProgressDialog getUiActivityIndicatorView() {
+ return new ProgressDialog(mContext);
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/CacheData.java b/java/src/com/android/i18n/addressinput/CacheData.java
new file mode 100644
index 0000000..4f98e6f
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/CacheData.java
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import static com.android.i18n.addressinput.Util.checkNotNull;
+
+import com.android.i18n.addressinput.JsonpRequestBuilder.AsyncCallback;
+
+import android.util.Log;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.HashSet;
+
+/**
+ * Cache for dynamic address data.
+ */
+public final class CacheData {
+
+ /**
+ * Used to identify the source of a log message.
+ */
+ private static final String TAG = "CacheData";
+
+ /**
+ * Time out value for the server to respond in millisecond.
+ */
+ private static final int TIMEOUT = 5000;
+
+ /**
+ * URL to get address data. You can also reset it by calling {@link #setUrl(String)}.
+ */
+ private String mServiceUrl;
+
+ /**
+ * Storage for all dynamically retrieved data.
+ */
+ private final JsoMap mCache;
+
+ /**
+ * CacheManager that handles caching that is needed by the client of the Address Widget.
+ */
+ private final ClientCacheManager mClientCacheManager;
+
+ /**
+ * All requests that have been sent.
+ */
+ private final HashSet<String> mRequestedKeys = new HashSet<String>();
+
+ /**
+ * All invalid requested keys. For example, if we request a random string "asdfsdf9o", and the
+ * server responds by saying this key is invalid, it will be stored here.
+ */
+ private final HashSet<String> mBadKeys = new HashSet<String>();
+
+ /**
+ * Temporary store for {@code CacheListener}s. When a key is requested and still waiting for
+ * server's response, the listeners for the same key will be temporary stored here. When the
+ * server responded, these listeners will be triggered and then removed.
+ */
+ private final HashMap<LookupKey, HashSet<CacheListener>> mTemporaryListenerStore =
+ new HashMap<LookupKey, HashSet<CacheListener>>();
+
+ /**
+ * Creates an instance of CacheData with an empty cache, and uses no caching that is external
+ * to the AddressWidget.
+ */
+ public CacheData() {
+ this(new SimpleClientCacheManager());
+ }
+
+ /**
+ * Creates an instance of CacheData with an empty cache, and uses additional caching (external
+ * to the AddressWidget) specified by clientCacheManager.
+ */
+ public CacheData(ClientCacheManager clientCacheManager) {
+ mClientCacheManager = clientCacheManager;
+ setUrl(mClientCacheManager.getAddressServerUrl());
+ mCache = JsoMap.createEmptyJsoMap();
+ }
+
+ /**
+ * This constructor is meant to be used together with external caching.
+ *
+ * Use case:
+ *
+ * After having finished using the address widget:
+ * String allCachedData = getJsonString();
+ * Cache (save) allCachedData wherever makes sense for your service / activity
+ *
+ * Before using it next time:
+ * Get the saved allCachedData string
+ * new ClientData(new CacheData(allCachedData))
+ *
+ * If you don't have any saved data you can either just pass an empty string to
+ * this constructor or use the other constructor.
+ *
+ * @param jsonString cached data from last time the class was used
+ */
+ public CacheData(String jsonString) {
+ mClientCacheManager = new SimpleClientCacheManager();
+ setUrl(mClientCacheManager.getAddressServerUrl());
+ JsoMap tempMap = null;
+ try {
+ tempMap = JsoMap.buildJsoMap(jsonString);
+ } catch (JSONException jsonE) {
+ // If parsing the JSON string throws an exception, default to
+ // starting with an empty cache.
+ Log.w(TAG, "Could not parse json string, creating empty cache instead.");
+ tempMap = JsoMap.createEmptyJsoMap();
+ } finally {
+ mCache = tempMap;
+ }
+ }
+
+ /**
+ * Interface for all listeners to {@link CacheData} change. This is only used when multiple
+ * requests of the same key is dispatched and server has not responded yet.
+ */
+ private static interface CacheListener extends EventListener {
+
+ /**
+ * The function that will be called when valid data is about to be put in the cache.
+ *
+ * @param key the key for newly arrived data.
+ */
+ void onAdd(String key);
+ }
+
+ /**
+ * Class to handle JSON response.
+ */
+ private class JsonHandler {
+
+ /**
+ * Key for the requested data.
+ */
+ private final String mKey;
+
+ /**
+ * Pre-existing data for the requested key. Null is allowed.
+ */
+ private final JSONObject mExistingJso;
+
+ private final DataLoadListener mListener;
+
+ /**
+ * Constructs a JsonHandler instance.
+ *
+ * @param key The key for requested data.
+ * @param oldJso Pre-existing data for this key or null.
+ */
+ private JsonHandler(String key, JSONObject oldJso, DataLoadListener listener) {
+ checkNotNull(key);
+ mKey = key;
+ mExistingJso = oldJso;
+ mListener = listener;
+ }
+
+ /**
+ * Saves valid responded data to the cache once data arrives, or if the key is invalid,
+ * saves it in the invalid cache. If there is pre-existing data for the key, it will merge
+ * the new data will the old one. It also triggers {@link DataLoadListener#dataLoadingEnd()}
+ * method before it returns (even when the key is invalid, or input jso is null). This is
+ * called from a background thread.
+ *
+ * @param map The received JSON data as a map.
+ */
+ private void handleJson(JsoMap map) {
+ // Can this ever happen?
+ if (map == null) {
+ Log.w(TAG, "server returns null for key:" + mKey);
+ mBadKeys.add(mKey);
+ notifyListenersAfterJobDone(mKey);
+ triggerDataLoadingEndIfNotNull(mListener);
+ return;
+ }
+
+ JSONObject json = map;
+ String idKey = AddressDataKey.ID.name().toLowerCase();
+ if (!json.has(idKey)) {
+ Log.w(TAG, "invalid or empty data returned for key: " + mKey);
+ mBadKeys.add(mKey);
+ notifyListenersAfterJobDone(mKey);
+ triggerDataLoadingEndIfNotNull(mListener);
+ return;
+ }
+
+ if (mExistingJso != null) {
+ map.mergeData((JsoMap) mExistingJso);
+ }
+
+ mCache.putObj(mKey, map);
+ notifyListenersAfterJobDone(mKey);
+ triggerDataLoadingEndIfNotNull(mListener);
+ }
+ }
+
+ /**
+ * Sets address data server URL. Input URL cannot be null.
+ *
+ * @param url The service URL.
+ */
+ public void setUrl(String url) {
+ checkNotNull(url, "Cannot set URL of address data server to null.");
+ mServiceUrl = url;
+ }
+
+ /**
+ * Gets address data server URL.
+ */
+ public String getUrl() {
+ return mServiceUrl;
+ }
+
+ /**
+ * Returns a JSON string representing the data currently stored in this cache. It can be used
+ * to later create a new CacheData object containing the same cached data.
+ *
+ * @return a JSON string representing the data stored in this cache
+ */
+ public String getJsonString() {
+ return mCache.toString();
+ }
+
+ /**
+ * Checks if key and its value is cached (Note that only valid ones are cached).
+ */
+ public boolean containsKey(String key) {
+ return mCache.containsKey(key);
+ }
+
+ // This method is called from a background thread.
+ private void triggerDataLoadingEndIfNotNull(DataLoadListener listener) {
+ if (listener != null) {
+ listener.dataLoadingEnd();
+ }
+ }
+
+ /**
+ * Fetches data from server, or returns if the data is already cached. If the fetched data is
+ * valid, it will be added to the cache. This method also triggers {@link
+ * DataLoadListener#dataLoadingEnd()} method before it returns.
+ *
+ * @param existingJso Pre-existing data for this key or null if none.
+ * @param listener An optional listener to call when done.
+ */
+ void fetchDynamicData(final LookupKey key, JSONObject existingJso,
+ final DataLoadListener listener) {
+ checkNotNull(key, "null key not allowed.");
+
+ if (listener != null) {
+ listener.dataLoadingBegin();
+ }
+
+ // Key is valid and cached.
+ if (mCache.containsKey(key.toString())) {
+ triggerDataLoadingEndIfNotNull(listener);
+ return;
+ }
+
+ // Key is invalid and cached.
+ if (mBadKeys.contains(key.toString())) {
+ triggerDataLoadingEndIfNotNull(listener);
+ return;
+ }
+
+ // Already requested the key, and is still waiting for server's response.
+ if (!mRequestedKeys.add(key.toString())) {
+ Log.d(TAG, "data for key " + key + " requested but not cached yet");
+ addListenerToTempStore(key, new CacheListener() {
+ @Override
+ public void onAdd(String myKey) {
+ triggerDataLoadingEndIfNotNull(listener);
+ }
+ });
+ return;
+ }
+
+ // Key is in the cache maintained by the client of the AddressWidget.
+ String dataFromClientCache = mClientCacheManager.get(key.toString());
+ if (dataFromClientCache != null && dataFromClientCache.length() > 0) {
+ final JsonHandler handler = new JsonHandler(key.toString(),
+ existingJso, listener);
+ try {
+ handler.handleJson(JsoMap.buildJsoMap(dataFromClientCache));
+ return;
+ } catch (JSONException e) {
+ Log.w(TAG, "Data from client's cache is in the wrong format: "
+ + dataFromClientCache);
+ }
+ }
+
+ // Key is not cached yet, now sending the request to the server.
+ JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
+ jsonp.setTimeout(TIMEOUT);
+ final JsonHandler handler = new JsonHandler(key.toString(),
+ existingJso, listener);
+ jsonp.requestObject(mServiceUrl + "/" + key.toString(),
+ new AsyncCallback<JsoMap>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.w(TAG, "Request for key " + key + " failed");
+ mRequestedKeys.remove(key.toString());
+ notifyListenersAfterJobDone(key.toString());
+ triggerDataLoadingEndIfNotNull(listener);
+ }
+
+ @Override
+ public void onSuccess(JsoMap result) {
+ handler.handleJson(result);
+ // Put metadata into the cache maintained by the client of the
+ // AddressWidget.
+ String dataRetrieved = result.toString();
+ mClientCacheManager.put(key.toString(), dataRetrieved);
+ }
+ });
+ }
+
+ /**
+ * Gets region data from our compiled-in java file and stores it in the
+ * cache. This is only called when data cannot be obtained from the server,
+ * so there will be no pre-existing data for this key.
+ */
+ void getFromRegionDataConstants(final LookupKey key) {
+ checkNotNull(key, "null key not allowed.");
+ String data = RegionDataConstants.getCountryFormatMap().get(
+ key.getValueForUpperLevelField(AddressField.COUNTRY));
+ if (data != null) {
+ try {
+ mCache.putObj(key.toString(), JsoMap.buildJsoMap(data));
+ } catch (JSONException e) {
+ Log.w(TAG, "Failed to parse data for key " + key +
+ " from RegionDataConstants");
+ }
+ }
+ }
+
+ /**
+ * Retrieves string data identified by key.
+ *
+ * @param key Non-null key. E.g., "data/US/CA".
+ * @return String value for specified key.
+ */
+ public String get(String key) {
+ checkNotNull(key, "null key not allowed");
+ return mCache.get(key);
+ }
+
+ /**
+ * Retrieves JsoMap data identified by key.
+ *
+ * @param key Non-null key. E.g., "data/US/CA".
+ * @return String value for specified key.
+ */
+ public JsoMap getObj(String key) {
+ checkNotNull(key, "null key not allowed");
+ return mCache.getObj(key);
+ }
+
+ private void notifyListenersAfterJobDone(String key) {
+ LookupKey lookupKey = new LookupKey.Builder(key).build();
+ HashSet<CacheListener> listeners = mTemporaryListenerStore.get(lookupKey);
+ if (listeners != null) {
+ for (CacheListener listener : listeners) {
+ listener.onAdd(key.toString());
+ }
+ listeners.clear();
+ }
+ }
+
+ private void addListenerToTempStore(LookupKey key, CacheListener listener) {
+ checkNotNull(key);
+ checkNotNull(listener);
+ HashSet<CacheListener> listeners = mTemporaryListenerStore.get(key);
+ if (listeners == null) {
+ listeners = new HashSet<CacheListener>();
+ mTemporaryListenerStore.put(key, listeners);
+ }
+ listeners.add(listener);
+ }
+
+ /**
+ * Added for testing purposes.
+ * Adds a new object into the cache.
+ * @param id string of the format "data/country/.." ie. "data/US/CA"
+ * @param object The JSONObject to be put into cache.
+ */
+ void addToJsoMap(String id, JSONObject object) {
+ mCache.putObj(id, object);
+ }
+
+ /**
+ * Added for testing purposes.
+ * Checks to see if the cache is empty,
+ * @return true if the internal cache is empty
+ */
+ boolean isEmpty() {
+ return mCache.length() == 0;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/ClientCacheManager.java b/java/src/com/android/i18n/addressinput/ClientCacheManager.java
new file mode 100644
index 0000000..0ee1816
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/ClientCacheManager.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * Used by AddressWidget to handle caching in client-specific ways.
+ */
+public interface ClientCacheManager {
+ /** Get the data that is cached for the given key. */
+ public String get(String key);
+ /** Put the data for the given key into the cache. */
+ public void put(String key, String data);
+ /** Get the Url of the server that serves address metadata. */
+ public String getAddressServerUrl();
+}
diff --git a/java/src/com/android/i18n/addressinput/ClientData.java b/java/src/com/android/i18n/addressinput/ClientData.java
new file mode 100644
index 0000000..72be34f
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/ClientData.java
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.KeyType;
+
+import android.util.Log;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Access point for the cached address verification data. The data contained here will mainly be
+ * used to build {@link FieldVerifier}'s. This class is implemented as a singleton.
+ */
+public class ClientData implements DataSource {
+
+ private static final String TAG = "ClientData";
+
+ /**
+ * Data to bootstrap the process. The data are all regional (country level)
+ * data. Keys are like "data/US/CA"
+ */
+ private final Map<String, JsoMap> mBootstrapMap = new HashMap<String, JsoMap>();
+
+ private CacheData mCacheData;
+
+ public ClientData(CacheData cacheData) {
+ this.mCacheData = cacheData;
+ buildRegionalData();
+ }
+
+ @Override
+ public AddressVerificationNodeData get(String key) {
+ JsoMap jso = mCacheData.getObj(key);
+ if (jso == null) { // Not cached.
+ fetchDataIfNotAvailable(key);
+ jso = mCacheData.getObj(key);
+ }
+ if (jso != null && isValidDataKey(key)) {
+ return createNodeData(jso);
+ }
+ return null;
+ }
+
+ @Override
+ public AddressVerificationNodeData getDefaultData(String key) {
+ // root data
+ if (key.split("/").length == 1) {
+ JsoMap jso = mBootstrapMap.get(key);
+ if (jso == null || !isValidDataKey(key)) {
+ throw new RuntimeException("key " + key + " does not have bootstrap data");
+ }
+ return createNodeData(jso);
+ }
+
+ key = getCountryKey(key);
+ JsoMap jso = mBootstrapMap.get(key);
+ if (jso == null || !isValidDataKey(key)) {
+ throw new RuntimeException("key " + key + " does not have bootstrap data");
+ }
+ return createNodeData(jso);
+ }
+
+ private String getCountryKey(String hierarchyKey) {
+ if (hierarchyKey.split("/").length <= 1) {
+ throw new RuntimeException("Cannot get country key with key '" + hierarchyKey + "'");
+ }
+ if (isCountryKey(hierarchyKey)) {
+ return hierarchyKey;
+ }
+
+ String[] parts = hierarchyKey.split("/");
+
+ return new StringBuilder().append(parts[0])
+ .append("/")
+ .append(parts[1])
+ .toString();
+ }
+
+ private boolean isCountryKey(String hierarchyKey) {
+ Util.checkNotNull(hierarchyKey, "Cannot use null as a key");
+ return hierarchyKey.split("/").length == 2;
+ }
+
+
+ /**
+ * Returns the contents of the JSON-format string as a map.
+ */
+ protected AddressVerificationNodeData createNodeData(JsoMap jso) {
+ Map<AddressDataKey, String> map =
+ new EnumMap<AddressDataKey, String>(AddressDataKey.class);
+
+ JSONArray arr = jso.getKeys();
+ for (int i = 0; i < arr.length(); i++) {
+ try {
+ AddressDataKey key = AddressDataKey.get(arr.getString(i));
+
+ if (key == null) {
+ // Not all keys are supported by Android, so we continue if we encounter one
+ // that is not used.
+ continue;
+ }
+
+ String value = jso.get(key.toString().toLowerCase());
+ map.put(key, value);
+ } catch (JSONException e) {
+ // This should not happen - we should not be fetching a key from outside the bounds
+ // of the array.
+ }
+ }
+
+ return new AddressVerificationNodeData(map);
+ }
+
+ /**
+ * We can be initialized with the full set of address information, but validation only uses info
+ * prefixed with "data" (in particular, no info prefixed with "examples").
+ */
+ private boolean isValidDataKey(String key) {
+ return key.startsWith("data");
+ }
+
+ /**
+ * Initializes regionalData structure based on property file.
+ */
+ private void buildRegionalData() {
+ StringBuilder countries = new StringBuilder();
+
+ for (String countryCode : RegionDataConstants.getCountryFormatMap().keySet()) {
+ countries.append(countryCode + "~");
+ String json = RegionDataConstants.getCountryFormatMap().get(countryCode);
+ JsoMap jso = null;
+ try {
+ jso = JsoMap.buildJsoMap(json);
+ } catch (JSONException e) {
+ // Ignore.
+ }
+
+ AddressData data = new AddressData.Builder().setCountry(countryCode).build();
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).setAddressData(data).build();
+ mBootstrapMap.put(key.toString(), jso);
+ }
+ countries.setLength(countries.length() - 1);
+
+ // TODO: this is messy. do we have better ways to do it?
+ /* Creates verification data for key="data". This will be used for the
+ * root FieldVerifier.
+ */
+ String str = "{\"id\":\"data\",\"" +
+ AddressDataKey.COUNTRIES.toString().toLowerCase() +
+ "\": \"" + countries.toString() + "\"}";
+ JsoMap jsoData = null;
+ try {
+ jsoData = JsoMap.buildJsoMap(str);
+ } catch (JSONException e) {
+ // Ignore.
+ }
+ mBootstrapMap.put("data", jsoData);
+ }
+
+ /**
+ * Fetches data from remote server if it is not cached yet.
+ *
+ * @param key The key for data that being requested. Key can be either a data key (starts with
+ * "data") or example key (starts with "examples")
+ */
+ private void fetchDataIfNotAvailable(String key) {
+ JsoMap jso = mCacheData.getObj(key);
+ if (jso == null) {
+ // If there is bootstrap data for the key, pass the data to fetchDynamicData
+ JsoMap regionalData = mBootstrapMap.get(key);
+ NotifyingListener listener = new NotifyingListener(this);
+ // If the key was invalid, we don't want to attempt to fetch it.
+ if (LookupKey.hasValidKeyPrefix(key)) {
+ LookupKey lookupKey = new LookupKey.Builder(key).build();
+ mCacheData.fetchDynamicData(lookupKey, regionalData, listener);
+ try {
+ listener.waitLoadingEnd();
+ // Check to see if there is data for this key now.
+ if (mCacheData.getObj(key) == null && isCountryKey(key)) {
+ // If not, see if there is data in RegionDataConstants.
+ Log.i(TAG, "Server failure: looking up key in region data constants.");
+ mCacheData.getFromRegionDataConstants(lookupKey);
+ }
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ public void requestData(LookupKey key, DataLoadListener listener) {
+ Util.checkNotNull(key, "Null lookup key not allowed");
+ JsoMap regionalData = mBootstrapMap.get(key.toString());
+ mCacheData.fetchDynamicData(key, regionalData, listener);
+ }
+
+ /**
+ * Fetches all data for the specified country from the remote server.
+ */
+ public void prefetchCountry(String country, DataLoadListener listener) {
+ String key = "data/" + country;
+ Set<RecursiveLoader> loaders = new HashSet<RecursiveLoader>();
+ listener.dataLoadingBegin();
+ mCacheData.fetchDynamicData(
+ new LookupKey.Builder(key).build(),
+ null,
+ new RecursiveLoader(key, loaders, listener));
+ }
+
+ /**
+ * A helper class to recursively load all sub keys using fetchDynamicData().
+ */
+ private class RecursiveLoader implements DataLoadListener {
+
+ private final String key;
+
+ private final Set<RecursiveLoader> loaders;
+
+ private final DataLoadListener listener;
+
+ public RecursiveLoader(String key, Set<RecursiveLoader> loaders,
+ DataLoadListener listener) {
+ this.key = key;
+ this.loaders = loaders;
+ this.listener = listener;
+
+ synchronized (loaders) {
+ loaders.add(this);
+ }
+ }
+
+ @Override
+ public void dataLoadingBegin() {
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ final String subKeys = AddressDataKey.SUB_KEYS.name().toLowerCase();
+ final String subMores = AddressDataKey.SUB_MORES.name().toLowerCase();
+
+ JsoMap map = mCacheData.getObj(key);
+
+ if (map.containsKey(subMores)) {
+ // This key could have sub keys.
+ String[] mores = {};
+ String[] keys = {};
+
+ mores = map.get(subMores).split("~");
+
+ if (map.containsKey(subKeys)) {
+ keys = map.get(subKeys).split("~");
+ }
+
+ if (mores.length != keys.length) { // This should never happen.
+ throw new IndexOutOfBoundsException("mores.length != keys.length");
+ }
+
+ for (int i = 0; i < mores.length; i++) {
+ if (mores[i].equalsIgnoreCase("true")) {
+ // This key should have sub keys.
+ String subKey = key + "/" + keys[i];
+ mCacheData.fetchDynamicData(
+ new LookupKey.Builder(subKey).build(),
+ null,
+ new RecursiveLoader(subKey, loaders, listener));
+ }
+ }
+ }
+
+ synchronized (loaders) {
+ loaders.remove(this);
+ if (loaders.isEmpty()) {
+ listener.dataLoadingEnd();
+ }
+ }
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/DataLoadListener.java b/java/src/com/android/i18n/addressinput/DataLoadListener.java
new file mode 100644
index 0000000..fc7782c
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/DataLoadListener.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * Invoked when the data is fetched from the server or the cache.
+ */
+public interface DataLoadListener {
+ // These callbacks are invoked from a background thread.
+ void dataLoadingBegin();
+ void dataLoadingEnd();
+}
diff --git a/java/src/com/android/i18n/addressinput/DataSource.java b/java/src/com/android/i18n/addressinput/DataSource.java
new file mode 100644
index 0000000..d77f27f
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/DataSource.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+// TODO: This interface and AddressVerificationData will be
+// removed when we have created code for static loading of data without using the
+// AddressVerificationData class.
+public interface DataSource {
+ AddressVerificationNodeData getDefaultData(String key);
+ AddressVerificationNodeData get(String key);
+}
diff --git a/java/src/com/android/i18n/addressinput/FieldVerifier.java b/java/src/com/android/i18n/addressinput/FieldVerifier.java
new file mode 100644
index 0000000..bd9c5e5
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/FieldVerifier.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * Accesses address verification data used to verify components of an address.
+ * <p> Not all fields require all types of validation, although this could be done. In particular,
+ * the current implementation only provides known value verification for the hierarchical fields,
+ * and only provides format and match verification for the postal code field.
+ */
+public class FieldVerifier {
+ // Node data values are delimited by this symbol.
+ private static final String DATA_DELIMITER = "~";
+ // Keys are built up using this delimiter: eg data/US, data/US/CA.
+ private static final String KEY_DELIMITER = "/";
+
+ private String mId;
+ private DataSource mDataSource;
+
+ private Set<AddressField> mPossibleFields;
+ private Set<AddressField> mRequired;
+ // Known values. Can be either a key, a name in Latin, or a name in native script.
+ private Map<String, String> mCandidateValues;
+
+ // Keys for the subnodes of this verifier. For example, a key for the US would be CA, since
+ // there is a sub-verifier with the ID "data/US/CA". Keys may be the local names of the
+ // locations in the next level of the hierarchy, or the abbreviations if suitable abbreviations
+ // exist.
+ private String[] mKeys;
+ // Names in Latin. These are only populated if the native/local names are in a script other than
+ // latin.
+ private String[] mLatinNames;
+ // Names in native script.
+ private String[] mLocalNames;
+
+ // Pattern representing the format of a postal code number.
+ private Pattern mFormat;
+ // Defines the valid range of a postal code number.
+ private Pattern mMatch;
+
+ /**
+ * Creates the root field verifier for a particular data source.
+ */
+ public FieldVerifier(DataSource dataSource) {
+ mDataSource = dataSource;
+ populateRootVerifier();
+ }
+
+ /**
+ * Creates a field verifier based on its parent and on the new data for this node supplied by
+ * nodeData (which may be null).
+ */
+ private FieldVerifier(FieldVerifier parent, AddressVerificationNodeData nodeData) {
+ // Most information is inherited from the parent.
+ mPossibleFields = parent.mPossibleFields;
+ mRequired = parent.mRequired;
+ mDataSource = parent.mDataSource;
+ mFormat = parent.mFormat;
+ mMatch = parent.mMatch;
+ // Here we add in any overrides from this particular node as well as information such as
+ // localNames, latinNames and keys.
+ populate(nodeData);
+ // candidateValues should never be inherited from the parent, but built up from the
+ // localNames in this node.
+ mCandidateValues = Util.buildNameToKeyMap(mKeys, mLocalNames, mLatinNames);
+ }
+
+ /**
+ * Sets possibleFieldsUsed, required, keys and candidateValues for the root field verifier. This
+ * is a little messy at the moment since not all the appropriate information is actually under
+ * the root "data" node in the metadata. For example, "possibleFields" and "required" are not
+ * present there.
+ */
+ private void populateRootVerifier() {
+ mId = "data";
+ // Keys come from the countries under "data".
+ AddressVerificationNodeData rootNode = mDataSource.getDefaultData("data");
+ if (rootNode.containsKey(AddressDataKey.COUNTRIES)) {
+ mKeys = rootNode.get(AddressDataKey.COUNTRIES).split(DATA_DELIMITER);
+ }
+ // candidateValues is just the set of keys.
+ mCandidateValues = Util.buildNameToKeyMap(mKeys, null, null);
+
+ // Copy "possibleFieldsUsed" and "required" from the defaults here for bootstrapping.
+ // TODO: Investigate a cleaner way of doing this - maybe we should populate "data" with this
+ // information instead.
+ AddressVerificationNodeData defaultZZ = mDataSource.getDefaultData("data/ZZ");
+ mPossibleFields = new HashSet<AddressField>();
+ if (defaultZZ.containsKey(AddressDataKey.FMT)) {
+ mPossibleFields = parseAddressFields(defaultZZ.get(AddressDataKey.FMT));
+ }
+ mRequired = new HashSet<AddressField>();
+ if (defaultZZ.containsKey(AddressDataKey.REQUIRE)) {
+ mRequired = parseRequireString(defaultZZ.get(AddressDataKey.REQUIRE));
+ }
+ }
+
+ /**
+ * Populates this verifier with data from the node data passed in. This may be null.
+ */
+ private void populate(AddressVerificationNodeData nodeData) {
+ if (nodeData == null) {
+ return;
+ }
+ if (nodeData.containsKey(AddressDataKey.ID)) {
+ mId = nodeData.get(AddressDataKey.ID);
+ }
+ if (nodeData.containsKey(AddressDataKey.SUB_KEYS)) {
+ mKeys = nodeData.get(AddressDataKey.SUB_KEYS).split(DATA_DELIMITER);
+ }
+ if (nodeData.containsKey(AddressDataKey.SUB_LNAMES)) {
+ mLatinNames = nodeData.get(AddressDataKey.SUB_LNAMES).split(DATA_DELIMITER);
+ }
+ if (nodeData.containsKey(AddressDataKey.SUB_NAMES)) {
+ mLocalNames = nodeData.get(AddressDataKey.SUB_NAMES).split(DATA_DELIMITER);
+ }
+ if (nodeData.containsKey(AddressDataKey.FMT)) {
+ mPossibleFields = parseAddressFields(nodeData.get(AddressDataKey.FMT));
+ }
+ if (nodeData.containsKey(AddressDataKey.REQUIRE)) {
+ mRequired = parseRequireString(nodeData.get(AddressDataKey.REQUIRE));
+ }
+ if (nodeData.containsKey(AddressDataKey.XZIP)) {
+ mFormat = Pattern.compile(nodeData.get(AddressDataKey.XZIP), Pattern.CASE_INSENSITIVE);
+ }
+ if (nodeData.containsKey(AddressDataKey.ZIP)) {
+ // This key has two different meanings, depending on whether this is a country-level key
+ // or not.
+ if (isCountryKey()) {
+ mFormat = Pattern.compile(nodeData.get(AddressDataKey.ZIP),
+ Pattern.CASE_INSENSITIVE);
+ } else {
+ mMatch = Pattern.compile(nodeData.get(AddressDataKey.ZIP),
+ Pattern.CASE_INSENSITIVE);
+ }
+ }
+ // If there are latin names but no local names, and there are the same number of latin names
+ // as there are keys, then we assume the local names are the same as the keys.
+ if (mKeys != null && mLocalNames == null && mLatinNames != null &&
+ mKeys.length == mLatinNames.length) {
+ mLocalNames = mKeys;
+ }
+ }
+
+ FieldVerifier refineVerifier(String sublevel) {
+ if (Util.trimToNull(sublevel) == null) {
+ return new FieldVerifier(this, null);
+ }
+ // If the parent node didn't exist, then the subLevelName will start with "null".
+ String subLevelName = mId + KEY_DELIMITER + sublevel;
+ // For names with no Latin equivalent, we can look up the sublevel name directly.
+ AddressVerificationNodeData nodeData = mDataSource.get(subLevelName);
+ if (nodeData != null) {
+ return new FieldVerifier(this, nodeData);
+ }
+ // If that failed, then we try to look up the local name equivalent of this latin name.
+ // First check these exist.
+ if (mLatinNames == null) {
+ return new FieldVerifier(this, null);
+ }
+ for (int n = 0; n < mLatinNames.length; n++) {
+ if (mLatinNames[n].equalsIgnoreCase(sublevel)) {
+ // We found a match - we should try looking up a key with the local name at the same
+ // index.
+ subLevelName = mId + KEY_DELIMITER + mLocalNames[n];
+ nodeData = mDataSource.get(subLevelName);
+ if (nodeData != null) {
+ return new FieldVerifier(this, nodeData);
+ }
+ }
+ }
+ // No sub-verifiers were found.
+ return new FieldVerifier(this, null);
+ }
+
+ /**
+ * Returns the ID of this verifier.
+ */
+ @Override
+ public String toString() {
+ return mId;
+ }
+
+ /**
+ * Checks a value in a particular script for a particular field to see if it causes the problem
+ * specified. If so, this problem is added to the AddressProblems collection passed in. Returns
+ * true if no problem was found.
+ */
+ protected boolean check(ScriptType script, AddressProblemType problem, AddressField field,
+ String value, AddressProblems problems) {
+ boolean problemFound = false;
+
+ String trimmedValue = Util.trimToNull(value);
+ switch (problem) {
+ case USING_UNUSED_FIELD:
+ if (trimmedValue != null && !mPossibleFields.contains(field)) {
+ problemFound = true;
+ }
+ break;
+ case MISSING_REQUIRED_FIELD:
+ if (mRequired.contains(field) && trimmedValue == null) {
+ problemFound = true;
+ }
+ break;
+ case UNKNOWN_VALUE:
+ // An empty string will never be an UNKNOWN_VALUE. It is invalid
+ // only when it appears in a required field (In that case it will
+ // be reported as MISSING_REQUIRED_FIELD).
+ if (trimmedValue == null) {
+ break;
+ }
+ problemFound = !isKnownInScript(script, trimmedValue);
+ break;
+ case UNRECOGNIZED_FORMAT:
+ if (trimmedValue != null && mFormat != null &&
+ !mFormat.matcher(trimmedValue).matches()) {
+ problemFound = true;
+ }
+ break;
+ case MISMATCHING_VALUE:
+ if (trimmedValue != null && mMatch != null &&
+ !mMatch.matcher(trimmedValue).lookingAt()) {
+ problemFound = true;
+ }
+ break;
+ default:
+ throw new RuntimeException("Unknown problem: " + problem);
+ }
+ if (problemFound) {
+ problems.add(field, problem);
+ }
+ return !problemFound;
+ }
+
+ /**
+ * Checks the value of a particular field in a particular script against the known values for
+ * this field. If script is null, it checks both the local and the latin values. Otherwise it
+ * checks only the values in the script specified.
+ */
+ private boolean isKnownInScript(ScriptType script, String value) {
+ String trimmedValue = Util.trimToNull(value);
+ Util.checkNotNull(trimmedValue);
+ if (script == null) {
+ return (mCandidateValues == null ||
+ mCandidateValues.containsKey(trimmedValue.toLowerCase()));
+ }
+ // Otherwise, if we know the script, we want to restrict the candidates to only names in
+ // that script.
+ String[] namesToConsider = (script == ScriptType.LATIN) ? mLatinNames : mLocalNames;
+ Set<String> candidates = new HashSet<String>();
+ if (namesToConsider != null) {
+ for (String name : namesToConsider) {
+ candidates.add(name.toLowerCase());
+ }
+ }
+ if (mKeys != null) {
+ for (String name : mKeys) {
+ candidates.add(name.toLowerCase());
+ }
+ }
+
+ if (candidates.size() == 0 || trimmedValue == null) {
+ return true;
+ }
+
+ return candidates.contains(value.toLowerCase());
+ }
+
+ /**
+ * Parses the value of the "fmt" key in the data to see which fields are used for a particular
+ * country. Returns a list of all fields found. Country is always assumed to be present. Skips
+ * characters that indicate new-lines in the format information, as well as any characters not
+ * escaped with "%".
+ */
+ private static Set<AddressField> parseAddressFields(String value) {
+ EnumSet<AddressField> result = EnumSet.of(AddressField.COUNTRY);
+ boolean escaped = false;
+ for (char c : value.toCharArray()) {
+ if (escaped) {
+ escaped = false;
+ if (c == 'n') {
+ continue;
+ }
+ AddressField f = AddressField.of(c);
+ if (f == null) {
+ throw new RuntimeException(
+ "Unrecognized character '" + c + "' in format pattern: " + value);
+ }
+ result.add(f);
+ } else if (c == '%') {
+ escaped = true;
+ }
+ }
+ // These fields are not mentioned in the metadata at the moment since there is an effort to
+ // move away from STREET_ADDRESS and use these fields instead. This means they have to be
+ // removed here.
+ result.remove(AddressField.ADDRESS_LINE_1);
+ result.remove(AddressField.ADDRESS_LINE_2);
+
+ return result;
+ }
+
+ /**
+ * Parses the value of the "required" key in the data. Adds country as well as any other field
+ * mentioned in the string.
+ */
+ private static Set<AddressField> parseRequireString(String value) {
+ // Country is always required
+ EnumSet<AddressField> result = EnumSet.of(AddressField.COUNTRY);
+
+ for (char c : value.toCharArray()) {
+ AddressField f = AddressField.of(c);
+ if (f == null) {
+ throw new RuntimeException("Unrecognized character '" + c + "' in require pattern: "
+ + value);
+ }
+ result.add(f);
+ }
+ // These fields are not mentioned in the metadata at the moment since there is an effort to
+ // move away from STREET_ADDRESS and use these fields instead. This means they have to be
+ // removed here.
+ result.remove(AddressField.ADDRESS_LINE_1);
+ result.remove(AddressField.ADDRESS_LINE_2);
+
+ return result;
+ }
+
+ /**
+ * Returns true if this key represents a country. We assume all keys with only one delimiter are
+ * at the country level (such as "data/US").
+ */
+ private boolean isCountryKey() {
+ Util.checkNotNull(mId, "Cannot use null as key");
+ return mId.split(KEY_DELIMITER).length == 2;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/FormController.java b/java/src/com/android/i18n/addressinput/FormController.java
new file mode 100644
index 0000000..c8c5953
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/FormController.java
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.KeyType;
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * Responsible for looking up data for address fields. This fetches possible
+ * values for the next level down in the address hierarchy, if these are known.
+ */
+class FormController {
+ // For address hierarchy in lookup key.
+ private static final String SLASH_DELIM = "/";
+ // For joined values.
+ private static final String TILDE_DELIM = "~";
+ // For language code info in lookup key (E.g., data/CA--fr).
+ private static final String DASH_DELIM = "--";
+ private static final LookupKey ROOT_KEY = FormController.getDataKeyForRoot();
+ private static final String DEFAULT_REGION_CODE = "ZZ";
+ private static final AddressField[] ADDRESS_HIERARCHY = {
+ AddressField.COUNTRY,
+ AddressField.ADMIN_AREA,
+ AddressField.LOCALITY,
+ AddressField.DEPENDENT_LOCALITY
+ };
+
+ // Current user language.
+ private String mLanguageCode;
+ private ClientData mIntegratedData;
+ private String mCurrentCountry;
+
+ /**
+ * Constructor that populates this with data. languageCode should be a BCP language code (such
+ * as "en" or "zh-Hant") and currentCountry should be an ISO 2-letter region code (such as "GB"
+ * or "US").
+ */
+ FormController(ClientData integratedData, String languageCode, String currentCountry) {
+ Util.checkNotNull(integratedData, "null data not allowed");
+ mLanguageCode = languageCode;
+ this.mCurrentCountry = currentCountry;
+
+ AddressData address = new AddressData.Builder().setCountry(DEFAULT_REGION_CODE).build();
+ LookupKey defaultCountryKey = getDataKeyFor(address);
+
+ AddressVerificationNodeData defaultCountryData =
+ integratedData.getDefaultData(defaultCountryKey.toString());
+ Util.checkNotNull(defaultCountryData,
+ "require data for default country key: " + defaultCountryKey);
+ this.mIntegratedData = integratedData;
+ }
+
+ void setLanguageCode(String languageCode) {
+ mLanguageCode = languageCode;
+ }
+
+ void setCurrentCountry(String currentCountry) {
+ mCurrentCountry = currentCountry;
+ }
+
+ private ScriptType getScriptType() {
+ if (mLanguageCode != null && Util.isExplicitLatinScript(mLanguageCode)) {
+ return ScriptType.LATIN;
+ }
+ return ScriptType.LOCAL;
+ }
+
+ private static LookupKey getDataKeyForRoot() {
+ AddressData address = new AddressData.Builder().build();
+ return new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+ }
+
+ LookupKey getDataKeyFor(AddressData address) {
+ return new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+ }
+
+ /**
+ * Requests data for the input address. This method chains multiple requests together. For
+ * example, an address for Mt View, California needs data from "data/US", "data/US/CA", and
+ * "data/US/CA/Mt View" to support it. This method will request them one by one (from top level
+ * key down to the most granular) and evokes {@link DataLoadListener#dataLoadingEnd} method when
+ * all data is collected. If the address is invalid, it will request the first valid child key
+ * instead. For example, a request for "data/US/Foo" will end up requesting data for "data/US",
+ * "data/US/AL".
+ *
+ * @param address the current address.
+ * @param listener triggered when requested data for the address is returned.
+ */
+ void requestDataForAddress(AddressData address, DataLoadListener listener) {
+ Util.checkNotNull(address.getPostalCountry(), "null country not allowed");
+
+ // Gets the key for deepest available node.
+ Queue<String> subkeys = new LinkedList<String>();
+
+ for (AddressField field : ADDRESS_HIERARCHY) {
+ String value = address.getFieldValue(field);
+ if (value == null) {
+ break;
+ }
+ subkeys.add(value);
+ }
+ if (subkeys.size() == 0) {
+ throw new RuntimeException("Need at least country level info");
+ }
+
+ if (listener != null) {
+ listener.dataLoadingBegin();
+ }
+ requestDataRecursively(ROOT_KEY, subkeys, listener);
+ }
+
+ private void requestDataRecursively(final LookupKey key,
+ final Queue<String> subkeys, final DataLoadListener listener) {
+ Util.checkNotNull(key, "Null key not allowed");
+ Util.checkNotNull(subkeys, "Null subkeys not allowed");
+
+ mIntegratedData.requestData(key, new DataLoadListener() {
+ @Override
+ public void dataLoadingBegin() {
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ List<RegionData> subregions = getRegionData(key);
+ if (subregions.isEmpty()) {
+ if (listener != null) {
+ listener.dataLoadingEnd();
+ }
+ // TODO: Should update the selectors here.
+ return;
+ } else if (subkeys.size() > 0) {
+ String subkey = subkeys.remove();
+ for (RegionData subregion : subregions) {
+ if (subregion.isValidName(subkey)) {
+ LookupKey nextKey = buildDataLookupKey(key, subregion.getKey());
+ requestDataRecursively(nextKey, subkeys, listener);
+ return;
+ }
+ }
+ }
+
+ // Current value in the field is not valid, use the first valid subkey
+ // to request more data instead.
+ String firstSubkey = subregions.get(0).getKey();
+ LookupKey nextKey = buildDataLookupKey(key, firstSubkey);
+ Queue<String> emptyList = new LinkedList<String>();
+ requestDataRecursively(nextKey, emptyList, listener);
+ }
+ });
+ }
+
+ private LookupKey buildDataLookupKey(LookupKey lookupKey, String subKey) {
+ String[] subKeys = lookupKey.toString().split(SLASH_DELIM);
+ String languageCodeSubTag =
+ (mLanguageCode == null) ? null : Util.getLanguageSubtag(mLanguageCode);
+ String key = lookupKey.toString() + SLASH_DELIM + subKey;
+
+ // Country level key
+ if (subKeys.length == 1 &&
+ languageCodeSubTag != null && !isDefaultLanguage(languageCodeSubTag)) {
+ key += DASH_DELIM + languageCodeSubTag.toString();
+ }
+ return new LookupKey.Builder(key).build();
+ }
+
+ /**
+ * Compares the language subtags of input {@code languageCode} and default language code. For
+ * example, "zh-Hant" and "zh" are viewed as identical.
+ */
+ boolean isDefaultLanguage(String languageCode) {
+ if (languageCode == null) {
+ return true;
+ }
+ AddressData addr = new AddressData.Builder().setCountry(mCurrentCountry).build();
+ LookupKey lookupKey = getDataKeyFor(addr);
+ AddressVerificationNodeData data =
+ mIntegratedData.getDefaultData(lookupKey.toString());
+ String defaultLanguage = data.get(AddressDataKey.LANG);
+
+ // Current language is not the default language for the country.
+ if (Util.trimToNull(defaultLanguage) != null &&
+ !Util.getLanguageSubtag(languageCode).equals(Util.getLanguageSubtag(languageCode))) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Gets a list of {@link RegionData} for sub-regions for a given key. For example, sub regions
+ * for "data/US" are AL/Alabama, AK/Alaska, etc.
+ *
+ * <p> TODO: It seems more straight forward to return a list of pairs instead of RegionData.
+ * Actually, we can remove RegionData since it does not contain anything more than key/value
+ * pairs now.
+ *
+ * @return A list of sub-regions, each sub-region represented by a {@link RegionData}.
+ */
+ List<RegionData> getRegionData(LookupKey key) {
+ if (key.getKeyType() == KeyType.EXAMPLES) {
+ throw new RuntimeException("example key not allowed for getting region data");
+ }
+ Util.checkNotNull(key, "null regionKey not allowed");
+ LookupKey normalizedKey = normalizeLookupKey(key);
+ List<RegionData> results = new ArrayList<RegionData>();
+
+ // Root key.
+ if (normalizedKey.equals(ROOT_KEY)) {
+ AddressVerificationNodeData data =
+ mIntegratedData.getDefaultData(normalizedKey.toString());
+ String[] countries = splitData(data.get(AddressDataKey.COUNTRIES));
+ for (int i = 0; i < countries.length; i++) {
+ RegionData rd = new RegionData.Builder()
+ .setKey(countries[i])
+ .setName(countries[i])
+ .build();
+ results.add(rd);
+ }
+ return results;
+ }
+
+ AddressVerificationNodeData data =
+ mIntegratedData.get(normalizedKey.toString());
+ if (data != null) {
+ String[] keys = splitData(data.get(AddressDataKey.SUB_KEYS));
+ String[] names = (getScriptType() == ScriptType.LOCAL)
+ ? splitData(data.get(AddressDataKey.SUB_NAMES))
+ : splitData(data.get(AddressDataKey.SUB_LNAMES));
+
+ for (int i = 0; i < keys.length; i++) {
+ RegionData rd =
+ new RegionData.Builder()
+ .setKey(keys[i])
+ .setName((i < names.length) ? names[i] : keys[i])
+ .build();
+ results.add(rd);
+ }
+ }
+ return results;
+ }
+
+ /**
+ * Split a '~' delimited string into an array of strings. This method is null tolerant and
+ * considers an empty string to contain no elements.
+ *
+ * @param raw The data to split
+ * @return an array of strings
+ */
+ private String[] splitData(String raw) {
+ if (raw == null || raw.length() == 0) {
+ return new String[]{};
+ }
+ return raw.split(TILDE_DELIM);
+ }
+
+ private String getSubKey(LookupKey parentKey, String name) {
+ for (RegionData subRegion : getRegionData(parentKey)) {
+ if (subRegion.isValidName(name)) {
+ return subRegion.getKey();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Normalizes {@code key} by replacing field values with sub-keys. For example, California is
+ * replaced with CA. The normalization goes from top (country) to bottom (dependent locality)
+ * and if any field value is empty, unknown, or invalid, it will stop and return whatever it
+ * gets. For example, a key "data/US/California/foobar/kar" will be normalized into
+ * "data/US/CA/foobar/kar" since "foobar" is unknown. This method supports only key of
+ * {@link KeyType#DATA} type.
+ *
+ * @return normalized {@link LookupKey}.
+ */
+ private LookupKey normalizeLookupKey(LookupKey key) {
+ Util.checkNotNull(key);
+ if (key.getKeyType() != KeyType.DATA) {
+ throw new RuntimeException("Only DATA keyType is supported");
+ }
+
+ String subStr[] = key.toString().split(SLASH_DELIM);
+
+ // Root key does not need to be normalized.
+ if (subStr.length < 2) {
+ return key;
+ }
+
+ StringBuilder sb = new StringBuilder(subStr[0]);
+ for (int i = 1; i < subStr.length; ++i) {
+ // Strips the language code if contained.
+ String languageCode = null;
+ if (i == 1 && subStr[i].contains(DASH_DELIM)) {
+ String[] s = subStr[i].split(DASH_DELIM);
+ subStr[i] = s[0];
+ languageCode = s[1];
+ }
+
+ String normalizedSubKey = getSubKey(new LookupKey.Builder(sb.toString()).build(),
+ subStr[i]);
+
+ // Can't find normalized sub-key; assembles the lookup key with the
+ // remaining sub-keys and returns it.
+ if (normalizedSubKey == null) {
+ for (; i < subStr.length; ++i) {
+ sb.append(SLASH_DELIM).append(subStr[i]);
+ }
+ break;
+ }
+ sb.append(SLASH_DELIM).append(normalizedSubKey);
+ if (languageCode != null) {
+ sb.append(DASH_DELIM).append(languageCode);
+ }
+ }
+ return new LookupKey.Builder(sb.toString()).build();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/FormOptions.java b/java/src/com/android/i18n/addressinput/FormOptions.java
new file mode 100644
index 0000000..07bc38e
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/FormOptions.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+/**
+ * Configuration Options that can be used by Address Display components for things like show/hide
+ * fields or make them readonly. By default, all the fields are visible and editable.
+ *
+ * <p>Also, provides the ability to add additional required fields, for e.g. {@link
+ * AddressField#RECIPIENT}.
+ */
+public class FormOptions {
+
+ private final String mBaseId;
+
+ private final EnumSet<AddressField> mHiddenFields;
+
+ private final EnumSet<AddressField> mReadonlyFields;
+
+ private final EnumSet<AddressField> mRequiredFields;
+
+ private final EnumMap<AddressField, String> mCustomLabels =
+ new EnumMap<AddressField, String>(AddressField.class);
+
+ private final Map<String, AddressField[]> mOverrideFieldOrder =
+ new HashMap<String, AddressField[]>();
+
+ private final EnumMap<AddressField, Integer> mMaxLengths =
+ new EnumMap<AddressField, Integer>(AddressField.class);
+
+ private final String mServerUrl;
+
+ private FormOptions(Builder builder) {
+ // copy values from builder
+ mBaseId = builder.mBaseId;
+ mHiddenFields = EnumSet.copyOf(builder.mHiddenFields);
+ mReadonlyFields = EnumSet.copyOf(builder.mReadonlyFields);
+ mRequiredFields = EnumSet.copyOf(builder.mRequiredFields);
+ mCustomLabels.putAll(builder.mCustomLabels);
+ mOverrideFieldOrder.putAll(builder.mOverrideFieldOrder);
+ mMaxLengths.putAll(builder.mMaxLengths);
+ mServerUrl = builder.mServerUrl;
+ }
+
+ /**
+ * Gets base ID of the address form. Default is "addressform".
+ */
+ String getBaseId() {
+ return mBaseId;
+ }
+
+ boolean isHidden(AddressField field) {
+ return mHiddenFields.contains(field);
+ }
+
+ boolean isReadonly(AddressField field) {
+ return mReadonlyFields.contains(field);
+ }
+
+ boolean isRequired(AddressField field) {
+ return mRequiredFields.contains(field);
+ }
+
+ EnumSet<AddressField> getRequiredFields() {
+ return mRequiredFields;
+ }
+
+ /**
+ * Gets the customized label for the {@code field}, or returns null if none.
+ */
+ String getCustomLabel(AddressField field) {
+ return mCustomLabels.get(field);
+ }
+
+ /**
+ * Gets the URL of the Address Data Server.
+ */
+ String getUrl() {
+ return mServerUrl;
+ }
+
+ /**
+ * Gets the overridden field orders with their corresponding region code. Returns null if field
+ * orders for {@code regionCode} is not specified.
+ */
+ AddressField[] getCustomFieldOrder(String regionCode) {
+ if (regionCode == null) {
+ throw new RuntimeException("regionCode cannot be null.");
+ }
+ return mOverrideFieldOrder.get(regionCode);
+ }
+
+ /**
+ * Gets the customized max length for the {@code field}, or null if none.
+ */
+ Integer getCustomMaxLength(AddressField field) {
+ return mMaxLengths.get(field);
+ }
+
+ /**
+ * Class to build the form, specifying the attributes for each field.
+ */
+ public static class Builder {
+
+ private String mBaseId = "addressform";
+
+ private final EnumSet<AddressField> mRequiredFields =
+ EnumSet.noneOf(AddressField.class);
+
+ private final EnumSet<AddressField> mHiddenFields =
+ EnumSet.noneOf(AddressField.class);
+
+ private final EnumSet<AddressField> mReadonlyFields =
+ EnumSet.noneOf(AddressField.class);
+
+ private final EnumMap<AddressField, String> mCustomLabels =
+ new EnumMap<AddressField, String>(AddressField.class);
+
+ private final Map<String, AddressField[]> mOverrideFieldOrder =
+ new HashMap<String, AddressField[]>();
+
+ private final EnumMap<AddressField, Integer> mMaxLengths =
+ new EnumMap<AddressField, Integer>(AddressField.class);
+
+ /**
+ * Uses the default server URL from CacheData.
+ */
+ private String mServerUrl = new CacheData().getUrl();
+
+ /**
+ * Sets the base ID of the address form.
+ */
+ public Builder baseId(String baseId) {
+ if (baseId == null) {
+ throw new RuntimeException("baseId cannot be null.");
+ }
+ mBaseId = baseId;
+ return this;
+ }
+
+ public Builder hide(AddressField field) {
+ if (field == null) {
+ throw new RuntimeException("AddressField field cannot be null.");
+ }
+ mHiddenFields.add(field);
+ return this;
+ }
+
+ /**
+ * Make a field read-only.
+ */
+ public Builder readonly(AddressField field) {
+ if (field == null) {
+ throw new RuntimeException("AddressField field cannot be null.");
+ }
+ mReadonlyFields.add(field);
+ return this;
+ }
+
+ /**
+ * Make a field required.
+ */
+ public Builder required(AddressField field) {
+ if (field == null) {
+ throw new RuntimeException("AddressField field cannot be null.");
+ }
+ mRequiredFields.add(field);
+ return this;
+ }
+
+ /**
+ * Customizes label for an {@code AddressField}.
+ */
+ public Builder customizeLabel(AddressField field, String label) {
+ if (field == null) {
+ throw new RuntimeException("AddressField field cannot be null.");
+ }
+ if (label == null) {
+ throw new RuntimeException("Label cannot be null.");
+ }
+ mCustomLabels.put(field, label);
+ return this;
+ }
+
+ /**
+ * Sets the field order for a region code. The order you set here will override the
+ * predefined one. For example, you can set field order for US to be first {@code
+ * AddressField#ORGANIZATION} then {@code AddressField#RECIPIENT}. Repeated address fields
+ * in {@code fields} are not allowed. Size of {@code fields} has to be larger than one.
+ * Input {@code fields} can be partial or even contain field not needed in the specified
+ * {@code regionCode}. For example, German addresses contain the following fields
+ * (in order):<br/>
+ {@link AddressField#RECIPIENT}, {@link AddressField#ORGANIZATION}, {@link
+ * AddressField#STREET_ADDRESS}, {@link AddressField#POSTAL_CODE}, {@link
+ * AddressField#LOCALITY}. <br/>
+ *
+ * <p>With the following call: <br/>
+ *
+ * customizeFieldOrder("DE", AddressField.ORGANIZATION, AddressField.RECIPIENT,
+ * AddressField.ADMIN_AREA);
+ *
+ * <p>Field order for Germany will become: <br/> {@link AddressField#ORGANIZATION}, {@link
+ * AddressField#RECIPIENT}, {@link AddressField#STREET_ADDRESS}, {@link
+ * AddressField#POSTAL_CODE}, {@link AddressField#LOCALITY}. </p>
+ *
+ * <p>Notice that:<br/> <ol> <li>{@link AddressField#ORGANIZATION} comes before {@link
+ * AddressField#RECIPIENT} after reordering.</li>
+ * <li>Fields not specified stays the same.</li>
+ * <li>{@link AddressField#ADMIN_AREA} is specified but since it is not in German address
+ * format, it is simpled neglected.</li> </ol>
+ *
+ * @param fields the overridden field order.
+ */
+ public Builder customizeFieldOrder(String regionCode, AddressField... fields) {
+ if (regionCode == null) {
+ throw new RuntimeException("regionCode cannot be null.");
+ }
+ if (fields == null) {
+ throw new RuntimeException("Fields cannot be null.");
+ }
+ if (fields.length <= 1) {
+ throw new RuntimeException("There must be more than one field.");
+ }
+ HashSet<AddressField> checkList = new HashSet<AddressField>();
+ AddressField[] f = new AddressField[fields.length];
+ int i = 0;
+ for (AddressField field : fields) {
+ // Can't contain repeated address fields.
+ if (checkList.contains(field)) {
+ throw new RuntimeException("Address fields cannot be repeated.");
+ }
+ checkList.add(field);
+ f[i] = field;
+ i++;
+ }
+ mOverrideFieldOrder.put(regionCode, f);
+ return this;
+ }
+
+ /**
+ * Sets the URL of address data server. {@code url} cannot be null. This url will override
+ * the default address server url.
+ */
+ public Builder setUrl(String url) {
+ if (url == null) {
+ throw new RuntimeException("Can't set address server URL to null.");
+ }
+ mServerUrl = url;
+ return this;
+ }
+
+ /**
+ * Customizes max length for a {@code AddressField}.
+ */
+ public Builder customizeMaxLength(AddressField field, int maxLength) {
+ if (field == null) {
+ throw new RuntimeException("AddressField field cannot be null.");
+ }
+ mMaxLengths.put(field, maxLength);
+ return this;
+ }
+
+ public FormOptions build() {
+ return new FormOptions(this);
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/FormatInterpreter.java b/java/src/com/android/i18n/addressinput/FormatInterpreter.java
new file mode 100644
index 0000000..ffd19b1
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/FormatInterpreter.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Address format interpreter. A utility to find address format related info.
+ */
+class FormatInterpreter {
+
+ private static final String NEW_LINE = "%n";
+
+ private final String mDefaultFormat;
+
+ private final FormOptions mFormOptions;
+
+ /**
+ * Creates a new instance of {@link FormatInterpreter}.
+ */
+ FormatInterpreter(FormOptions options) {
+ Util.checkNotNull(RegionDataConstants.getCountryFormatMap(),
+ "null country name map not allowed");
+ Util.checkNotNull(options);
+ mFormOptions = options;
+ mDefaultFormat = getJsonValue("ZZ", AddressDataKey.FMT);
+ Util.checkNotNull(mDefaultFormat, "null default format not allowed");
+ }
+
+ /**
+ * Returns a list of address fields based on the format of {@code regionCode}. Script type is
+ * needed because some countries uses different address formats for local/Latin scripts.
+ *
+ * @param scriptType if {@link ScriptType#LOCAL}, use local format; else use Latin format.
+ */
+ List<AddressField> getAddressFieldOrder(ScriptType scriptType, String regionCode) {
+ Util.checkNotNull(scriptType);
+ Util.checkNotNull(regionCode);
+ List<AddressField> fieldOrder = new ArrayList<AddressField>();
+ for (String substring : getFormatSubStrings(scriptType, regionCode)) {
+ // Skips un-escaped characters and new lines.
+ if (!substring.matches("%.") || substring.equals(NEW_LINE)) {
+ continue;
+ }
+
+ AddressField field = AddressField.of(substring.charAt(1));
+ fieldOrder.add(field);
+ }
+
+ overrideFieldOrder(regionCode, fieldOrder);
+
+ // Uses two address lines instead of street address.
+ List<AddressField> finalFieldOrder = new ArrayList<AddressField>();
+ for (AddressField field : fieldOrder) {
+ if (field == AddressField.STREET_ADDRESS) {
+ finalFieldOrder.add(AddressField.ADDRESS_LINE_1);
+ finalFieldOrder.add(AddressField.ADDRESS_LINE_2);
+ } else {
+ finalFieldOrder.add(field);
+ }
+ }
+ return finalFieldOrder;
+ }
+
+ /**
+ * Returns a list of address fields based on the format of {@code regionCode} -- assuming script
+ * type is {@link ScriptType#LOCAL}.
+ */
+ List<AddressField> getAddressFieldOrder(String regionCode) {
+ Util.checkNotNull(regionCode);
+ return getAddressFieldOrder(ScriptType.LOCAL, regionCode);
+ }
+
+ private void overrideFieldOrder(String regionCode, List<AddressField> fieldOrder) {
+ if (mFormOptions.getCustomFieldOrder(regionCode) == null) {
+ return;
+ }
+
+ // Constructs a hash for overridden field order.
+ final Map<AddressField, Integer> fieldPriority = new HashMap<AddressField, Integer>();
+ int i = 0;
+ for (AddressField field : mFormOptions.getCustomFieldOrder(regionCode)) {
+ fieldPriority.put(field, i);
+ i++;
+ }
+
+ // Finds union of input fields and priority list.
+ List<AddressField> union = new ArrayList<AddressField>();
+ List<Integer> slots = new ArrayList<Integer>();
+ i = 0;
+ for (AddressField field : fieldOrder) {
+ if (fieldPriority.containsKey(field)) {
+ union.add(field);
+ slots.add(i);
+ }
+ i++;
+ }
+
+ // Overrides field order with priority list.
+ Collections.sort(union, new Comparator<AddressField>() {
+ @Override
+ public int compare(AddressField o1, AddressField o2) {
+ return fieldPriority.get(o1) - fieldPriority.get(o2);
+ }
+ });
+
+ // Puts reordered fields in slots.
+ for (int j = 0; j < union.size(); ++j) {
+ fieldOrder.set(slots.get(j), union.get(j));
+ }
+ }
+
+ /**
+ * Gets formatted address. For example,
+ *
+ * <p> John Doe<br> Dnar Corp<br> 5th St<br> Santa Monica CA 90123 </p>
+ *
+ * This method does not validate addresses. Also, it will "normalize" the result strings by
+ * removing redundant spaces and empty lines.
+ */
+ List<String> getEnvelopeAddress(AddressData address) {
+ Util.checkNotNull(address, "null input address not allowed");
+ String regionCode = address.getPostalCountry();
+
+ String lc = address.getLanguageCode();
+ ScriptType scriptType = ScriptType.LOCAL;
+ if (lc != null) {
+ scriptType = Util.isExplicitLatinScript(lc) ? ScriptType.LATIN : ScriptType.LOCAL;
+ }
+
+ List<String> lines = new ArrayList<String>();
+ StringBuilder currentLine = new StringBuilder();
+ for (String substr : getFormatSubStrings(scriptType, regionCode)) {
+ if (substr.equals(NEW_LINE)) {
+ String normalizedStr = removeAllRedundantSpaces(currentLine.toString());
+ if (normalizedStr.length() > 0) {
+ lines.add(normalizedStr);
+ currentLine.setLength(0);
+ }
+ } else if (substr.startsWith("%")) {
+ char c = substr.charAt(1);
+ AddressField field = AddressField.of(c);
+ Util.checkNotNull(field, "null address field for character " + c);
+
+ String value = null;
+ switch (field) {
+ case STREET_ADDRESS:
+ value = Util.joinAndSkipNulls("\n",
+ address.getAddressLine1(),
+ address.getAddressLine2());
+ break;
+ case COUNTRY:
+ // Country name is treated separately.
+ break;
+ case ADMIN_AREA:
+ value = address.getAdministrativeArea();
+ break;
+ case LOCALITY:
+ value = address.getLocality();
+ break;
+ case DEPENDENT_LOCALITY:
+ value = address.getDependentLocality();
+ break;
+ case RECIPIENT:
+ value = address.getRecipient();
+ break;
+ case ORGANIZATION:
+ value = address.getOrganization();
+ break;
+ case POSTAL_CODE:
+ value = address.getPostalCode();
+ break;
+ default:
+ break;
+ }
+
+ if (value != null) {
+ currentLine.append(value);
+ }
+ } else {
+ currentLine.append(substr);
+ }
+ }
+ String normalizedStr = removeAllRedundantSpaces(currentLine.toString());
+ if (normalizedStr.length() > 0) {
+ lines.add(normalizedStr);
+ }
+ return lines;
+ }
+
+ /**
+ * Tokenizes the format string and returns the token string list. "%" is treated as an escape
+ * character. So for example "%n%a%nxyz" will be split into "%n", "%a", "%n", "x", "y", and "z".
+ * Escaped tokens correspond to either new line or address fields.
+ */
+ private List<String> getFormatSubStrings(ScriptType scriptType, String regionCode) {
+ String formatString = getFormatString(scriptType, regionCode);
+ List<String> parts = new ArrayList<String>();
+
+ boolean escaped = false;
+ for (char c : formatString.toCharArray()) {
+ if (escaped) {
+ escaped = false;
+ if (NEW_LINE.equals("%" + c)) {
+ parts.add(NEW_LINE);
+ } else {
+ Util.checkNotNull(AddressField.of(c), "Unrecognized character '" + c
+ + "' in format pattern: " + formatString);
+ parts.add("%" + c);
+ }
+ } else if (c == '%') {
+ escaped = true;
+ } else {
+ parts.add(c + "");
+ }
+ }
+ return parts;
+ }
+
+ private String removeAllRedundantSpaces(String str) {
+ str = str.trim();
+ str = str.replaceAll(" +", " ");
+ return str;
+ }
+
+ private String getFormatString(ScriptType scriptType, String regionCode) {
+ String format = (scriptType == ScriptType.LOCAL)
+ ? getJsonValue(regionCode, AddressDataKey.FMT)
+ : getJsonValue(regionCode, AddressDataKey.LFMT);
+ if (format == null) {
+ format = getJsonValue("ZZ", AddressDataKey.FMT);
+ }
+ return format;
+ }
+
+ private String getJsonValue(String regionCode, AddressDataKey key) {
+ Util.checkNotNull(regionCode);
+ String jsonString = RegionDataConstants.getCountryFormatMap().get(regionCode);
+ Util.checkNotNull(jsonString, "no json data for region code " + regionCode);
+
+ try {
+ JSONObject jsonObj = new JSONObject(new JSONTokener(jsonString));
+ if (!jsonObj.has(key.name().toLowerCase())) {
+ // Key not found. Return null.
+ return null;
+ }
+ // Gets the string for this key.
+ String parsedJsonString = jsonObj.getString(key.name().toLowerCase());
+ return parsedJsonString;
+ } catch (JSONException e) {
+ throw new RuntimeException("Invalid json for region code " + regionCode
+ + ": " + jsonString);
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/JsoMap.java b/java/src/com/android/i18n/addressinput/JsoMap.java
new file mode 100644
index 0000000..fc5d16b
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/JsoMap.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Compatibility methods on top of the JSON data.
+ */
+class JsoMap extends JSONObject {
+
+ /**
+ * Construct a JsoMap object given some json text. This method directly evaluates the String
+ * that you pass in; no error or safety checking is performed, so be very careful about the
+ * source of your data.
+ *
+ * @param json JSON text describing an address format
+ * @return a JsoMap object made from the supplied JSON.
+ */
+ static JsoMap buildJsoMap(String json) throws JSONException {
+ return new JsoMap(new JSONTokener(json));
+ }
+
+ /**
+ * Construct an empty JsoMap.
+ *
+ * @return the empty object.
+ */
+ static JsoMap createEmptyJsoMap() {
+ return new JsoMap();
+ }
+
+ /**
+ * constructor.
+ */
+ protected JsoMap() {
+ }
+
+ private JsoMap(JSONTokener readFrom) throws JSONException {
+ super(readFrom);
+ }
+
+ private JsoMap(JSONObject copyFrom, String[] names) throws JSONException {
+ super(copyFrom, names);
+ }
+
+ /**
+ * Remove the specified key.
+ *
+ * @param key key name.
+ */
+ void delKey(String key) {
+ super.remove(key);
+ }
+
+ /**
+ * Retrieve the string value for specified key.
+ *
+ * @param key key name.
+ * @return string value.
+ * @throws ClassCastException, IllegalArgumentException.
+ */
+ @Override
+ public String get(String key) { // throws ClassCastException, IllegalArgumentException
+ try {
+ Object o = super.get(key);
+ if (o instanceof String) {
+ return (String) o;
+ } else if (o instanceof Integer) {
+ throw new IllegalArgumentException();
+ } else {
+ throw new ClassCastException();
+ }
+ } catch (JSONException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Access JSONObject.get(String) which is shadowed by JsoMap.get(String).
+ *
+ * @param name A key string.
+ * @return The object associated with the key.
+ * @throws JSONException if the key is not found.
+ */
+ private Object getObject(String name) throws JSONException {
+ return super.get(name);
+ }
+
+ /**
+ * Retrieves the integer value for specified key.
+ *
+ * @return integer value or -1 if value is undefined.
+ */
+ @Override
+ public int getInt(String key) {
+ try {
+ Object o = super.get(key);
+ if (o instanceof Integer) {
+ return ((Integer) o).intValue();
+ } else {
+ throw new RuntimeException("Something other than an int was returned");
+ }
+ } catch (JSONException e) {
+ return -1;
+ }
+ }
+
+ /**
+ * Collect all the keys and return as a JSONArray.
+ *
+ * @return A JSONArray that contains all the keys.
+ */
+ JSONArray getKeys() {
+ return super.names();
+ }
+
+ /**
+ * Retrieve the JsoMap object for specified key.
+ *
+ * @param key key name.
+ * @return JsoMap object.
+ * @throws ClassCastException, IllegalArgumentException.
+ */
+ @SuppressWarnings("unchecked")
+ // JSONObject.keys() has no type information.
+ JsoMap getObj(String key)
+ throws ClassCastException, IllegalArgumentException {
+ try {
+ Object o = super.get(key);
+ if (o instanceof JSONObject) {
+ JSONObject value = (JSONObject) o;
+ ArrayList<String> keys = new ArrayList<String>(value.length());
+ for (Iterator<String> it = value.keys(); it.hasNext();) {
+ keys.add(it.next());
+ }
+ String[] names = new String[keys.size()];
+ return new JsoMap(value, keys.toArray(names));
+ } else if (o instanceof Integer) {
+ throw new IllegalArgumentException();
+ } else {
+ throw new ClassCastException();
+ }
+ } catch (JSONException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Check if the object has specified key.
+ *
+ * @param key The key name to be checked.
+ * @return true if key can be found.
+ */
+ boolean containsKey(String key) {
+ return super.has(key);
+ }
+
+ /**
+ * Merge those keys not found in this object from specified object.
+ *
+ * @param obj The other object to be merged.
+ */
+ void mergeData(JsoMap obj) {
+ if (obj == null) {
+ return;
+ }
+
+ JSONArray names = obj.names();
+ if (names == null) {
+ return;
+ }
+
+ for (int i = 0; i < names.length(); i++) {
+ try {
+ String name = names.getString(i);
+ try {
+ if (!super.has(name)) {
+ super.put(name, obj.getObject(name));
+ }
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ } catch (JSONException e) {
+ // Ignored.
+ }
+ }
+ }
+
+ /**
+ * Save a string to string mapping into this map.
+ *
+ * @param key the string key.
+ * @param value the String value.
+ */
+ void put(String key, String value) {
+ try {
+ super.put(key, value);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Save a string to integer mapping into this map.
+ *
+ * @param key the string key.
+ * @param value the integer value.
+ */
+ void putInt(String key, int value) {
+ try {
+ super.put(key, value);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Save a string to JSONObject mapping into this map.
+ *
+ * @param key the string key.
+ * @param value a JSONObject as value.
+ */
+ void putObj(String key, JSONObject value) {
+ try {
+ super.put(key, value);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ String string() throws ClassCastException, IllegalArgumentException {
+ StringBuilder sb = new StringBuilder("JsoMap[\n");
+ JSONArray keys = getKeys();
+ for (int i = 0; i < keys.length(); i++) {
+ String key;
+ try {
+ key = keys.getString(i);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ sb.append('(').append(key).append(':').append(get(key)).append(')').append('\n');
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+
+ String map() throws ClassCastException, IllegalArgumentException {
+ StringBuilder sb = new StringBuilder("JsoMap[\n");
+ JSONArray keys = getKeys();
+ for (int i = 0; i < keys.length(); i++) {
+ String key;
+ try {
+ key = keys.getString(i);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ sb.append('(').append(key).append(':').append(getObj(key).string()).append(')')
+ .append('\n');
+ }
+ sb.append(']');
+ return sb.toString();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/JsonpRequestBuilder.java b/java/src/com/android/i18n/addressinput/JsonpRequestBuilder.java
new file mode 100644
index 0000000..0f40f15
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/JsonpRequestBuilder.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * Android implementation of those parts of the com.google.gwt.jsonp.client.JsonpRequestBuilder
+ * class that the CacheData class uses.
+ */
+class JsonpRequestBuilder {
+
+ /**
+ * Re-implementation of the com.google.gwt.user.client.rpc.AsyncCallback interface.
+ */
+ interface AsyncCallback<T> {
+
+ public void onFailure(Throwable caught);
+
+ public void onSuccess(T result);
+ }
+
+ /**
+ * @param timeout The expected timeout (ms) for this request.
+ */
+ void setTimeout(int timeout) {
+ HttpParams params = AsyncHttp.CLIENT.getParams();
+ HttpConnectionParams.setConnectionTimeout(params, timeout);
+ HttpConnectionParams.setSoTimeout(params, timeout);
+ }
+
+ /**
+ * Sends a JSONP request and expects a JsoMap object as a result.
+ */
+ void requestObject(String url, AsyncCallback<JsoMap> callback) {
+ HttpUriRequest request = new HttpGet(encodeUrl(url));
+ (new AsyncHttp(request, callback)).start();
+ }
+
+ /**
+ * Simple implementation of asynchronous HTTP GET.
+ */
+ private static class AsyncHttp extends Thread {
+
+ private static final HttpClient CLIENT = new DefaultHttpClient();
+
+ private HttpUriRequest mRequest;
+
+ private AsyncCallback<JsoMap> mCallback;
+
+ protected AsyncHttp(HttpUriRequest request, AsyncCallback<JsoMap> callback) {
+ mRequest = request;
+ mCallback = callback;
+ }
+
+ @Override
+ public void run() {
+ try {
+ final String response;
+ synchronized (CLIENT) {
+ response = CLIENT.execute(mRequest, new BasicResponseHandler());
+ }
+ mCallback.onSuccess(JsoMap.buildJsoMap(response));
+ } catch (Exception e) {
+ mCallback.onFailure(e);
+ }
+ }
+ }
+
+ /**
+ * A quick hack to transform a string into an RFC 3986 compliant URL.
+ *
+ * TODO: Refactor the code to stop passing URLs around as strings, to eliminate the need for
+ * this hack.
+ */
+ private static String encodeUrl(String url) {
+ int length = url.length();
+ StringBuilder tmp = new StringBuilder(length);
+
+ try {
+ for (int i = 0; i < length; i++) {
+ int j = i;
+ char c = '\0';
+ for (; j < length; j++) {
+ c = url.charAt(j);
+ if (c == ':' || c == '/') {
+ break;
+ }
+ }
+ if (j == length) {
+ tmp.append(URLEncoder.encode(url.substring(i), "UTF-8"));
+ break;
+ } else if (j > i) {
+ tmp.append(URLEncoder.encode(url.substring(i, j), "UTF-8"));
+ tmp.append(c);
+ i = j;
+ } else {
+ tmp.append(c);
+ }
+ }
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e); // Impossible.
+ }
+
+ return tmp.toString();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/LookupKey.java b/java/src/com/android/i18n/addressinput/LookupKey.java
new file mode 100644
index 0000000..35aad1d
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/LookupKey.java
@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+/**
+ * A builder for creating keys that are used to lookup data in the local cache and fetch data from
+ * the server. There are two key types: {@code KeyType#DATA} or {@code KeyType#EXAMPLES}.
+ *
+ * <p> The {@code KeyType#DATA} key is built based on a universal Address hierarchy, which is:<br>
+ *
+ * {@code AddressField#Country} -> {@code AddressField#ADMIN_AREA} -> {@code AddressField#Locality}
+ * -> {@code AddressField#DEPENDENT_LOCALITY} </p>
+ *
+ * <p> The {@code KeyType#EXAMPLES} key is built with the following format:<br>
+ *
+ * {@code AddressField#Country} -> {@code ScriptType} -> language. </p>
+ */
+final class LookupKey {
+
+ /**
+ * Key types. Address Widget organizes address info based on key types. For example, if you want
+ * to know how to verify or format an US address, you need to use {@link KeyType#DATA} to get
+ * that info; if you want to get an example address, you use {@link KeyType#EXAMPLES} instead.
+ */
+ enum KeyType {
+
+ /**
+ * Key type for getting address data.
+ */
+ DATA,
+ /**
+ * Key type for getting examples.
+ */
+ EXAMPLES
+ }
+
+ /**
+ * Script types. This is used for countries that do not use Latin script, but accept it for
+ * transcribing their addresses. For example, you can write a Japanese address in Latin script
+ * instead of Japanese:
+ *
+ * <p> 7-2, Marunouchi 2-Chome, Chiyoda-ku, Tokyo 100-8799 </p>
+ *
+ * Notice that {@link ScriptType} is based on country/region, not language.
+ */
+ enum ScriptType {
+
+ /**
+ * The script that uses Roman characters like ABC (as opposed to scripts like Cyrillic or
+ * Arabic).
+ */
+ LATIN,
+
+ /**
+ * Local scripts. For Japan, it's Japanese (including Hiragana, Katagana, and Kanji); For
+ * Saudi Arabia, it's Arabic. Notice that for US, the local script is actually Latin script
+ * (The same goes for other countries that use Latin script). For these countries, we do not
+ * provide two set of data (Latin and local) since they use only Latin script. You have to
+ * specify the {@link ScriptType} as local instead Latin.
+ */
+ LOCAL
+ }
+
+ /**
+ * The universal address hierarchy. Notice that sub-administrative area is neglected here since
+ * it is not required to fill out address form.
+ */
+ private static final AddressField[] HIERARCHY = {
+ AddressField.COUNTRY,
+ AddressField.ADMIN_AREA,
+ AddressField.LOCALITY,
+ AddressField.DEPENDENT_LOCALITY};
+
+ private static final String SLASH_DELIM = "/";
+
+ private static final String DASH_DELIM = "--";
+
+ private static final String DEFAULT_LANGUAGE = "_default";
+
+ private final KeyType mKeyType;
+
+ private final ScriptType mScriptType;
+
+ // Values for hierarchy address fields.
+ private final Map<AddressField, String> mNodes;
+
+ private final String mKeyString;
+
+ private final String mLanguageCode;
+
+ private LookupKey(Builder builder) {
+ this.mKeyType = builder.keyType;
+ this.mScriptType = builder.script;
+ this.mNodes = builder.nodes;
+ this.mLanguageCode = builder.languageCode;
+ this.mKeyString = getKeyString();
+ }
+
+ /**
+ * Gets lookup key for the input address field. This method does not allow key with key type of
+ * {@link KeyType#EXAMPLES}.
+ *
+ * @param field a field in the address hierarchy.
+ * @return key of the specified address field. If address field is not in the hierarchy, or is
+ * more granular than the current key has, returns null. For example, if your current
+ * key is "data/US" (down to country level), and you want to get the key for Locality
+ * (more granular than country), it will return null.
+ */
+ LookupKey getKeyForUpperLevelField(AddressField field) {
+ if (mKeyType != KeyType.DATA) {
+ // We only support getting the parent key for the data key type.
+ throw new RuntimeException("Only support getting parent keys for the data key type.");
+ }
+ Builder newKeyBuilder = new Builder(this);
+
+ boolean removeNode = false;
+ boolean fieldInHierarchy = false;
+ for (AddressField hierarchyField : HIERARCHY) {
+ if (removeNode) {
+ if (newKeyBuilder.nodes.containsKey(hierarchyField)) {
+ newKeyBuilder.nodes.remove(hierarchyField);
+ }
+ }
+ if (hierarchyField == field) {
+ if (!newKeyBuilder.nodes.containsKey(hierarchyField)) {
+ return null;
+ }
+ removeNode = true;
+ fieldInHierarchy = true;
+ }
+ }
+
+ if (!fieldInHierarchy) {
+ return null;
+ }
+
+ newKeyBuilder.languageCode = mLanguageCode;
+ newKeyBuilder.script = mScriptType;
+
+ return newKeyBuilder.build();
+ }
+
+ /**
+ * Returns the string value of a field in a key for a particular
+ * AddressField. For example, for the key "data/US/CA" and the address
+ * field AddressField.COUNTRY, "US" would be returned. Returns an empty
+ * string if the key does not have this field in it.
+ */
+ String getValueForUpperLevelField(AddressField field) {
+ // First, get the key for this field.
+ LookupKey key = getKeyForUpperLevelField(field);
+ // Now we know the last value in the string is the value for this field.
+ if (key != null) {
+ String keyString = key.toString();
+ int lastSlashPosition = keyString.lastIndexOf(SLASH_DELIM);
+ if (lastSlashPosition > 0 && lastSlashPosition != keyString.length()) {
+ return keyString.substring(lastSlashPosition + 1);
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Gets parent key for data key. For example, parent key for "data/US/CA" is "data/US". This
+ * method does not allow key with key type of {@link KeyType#EXAMPLES}.
+ */
+ LookupKey getParentKey() {
+ if (mKeyType != KeyType.DATA) {
+ throw new RuntimeException("Only support getting parent keys for the data key type.");
+ }
+ // Root key's parent should be null.
+ if (!mNodes.containsKey(AddressField.COUNTRY)) {
+ return null;
+ }
+
+ Builder parentKeyBuilder = new Builder(this);
+ AddressField mostGranularField = AddressField.COUNTRY;
+
+ for (AddressField hierarchyField : HIERARCHY) {
+ if (!mNodes.containsKey(hierarchyField)) {
+ break;
+ }
+ mostGranularField = hierarchyField;
+ }
+ parentKeyBuilder.nodes.remove(mostGranularField);
+ return parentKeyBuilder.build();
+ }
+
+ KeyType getKeyType() {
+ return mKeyType;
+ }
+
+ /**
+ * Gets a key in string format. E.g., "data/US/CA".
+ */
+ private String getKeyString() {
+ StringBuilder keyBuilder = new StringBuilder(mKeyType.name().toLowerCase());
+
+ if (mKeyType == KeyType.DATA) {
+ for (AddressField field : HIERARCHY) {
+ if (!mNodes.containsKey(field)) {
+ break;
+ }
+ if (field == AddressField.COUNTRY && mLanguageCode != null) {
+ keyBuilder.append(SLASH_DELIM)
+ .append(mNodes.get(field)).append(DASH_DELIM)
+ .append(mLanguageCode);
+ } else {
+ keyBuilder.append(SLASH_DELIM).append(mNodes.get(field));
+ }
+ }
+ } else {
+ if (mNodes.containsKey(AddressField.COUNTRY)) {
+ // Example key. E.g., "examples/TW/local/_default".
+ keyBuilder.append(SLASH_DELIM).append(mNodes.get(AddressField.COUNTRY))
+ .append(SLASH_DELIM).append(mScriptType.name().toLowerCase())
+ .append(SLASH_DELIM).append(DEFAULT_LANGUAGE);
+ }
+ }
+
+ return keyBuilder.toString();
+ }
+
+ /**
+ * Gets a lookup key as a plain text string., e.g., "data/US/CA".
+ */
+ @Override
+ public String toString() {
+ return mKeyString;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if ((obj == null) || (obj.getClass() != this.getClass())) {
+ return false;
+ }
+
+ return ((LookupKey) obj).toString().equals(mKeyString);
+ }
+
+ @Override
+ public int hashCode() {
+ return mKeyString.hashCode();
+ }
+
+ static boolean hasValidKeyPrefix(String key) {
+ for (KeyType type : KeyType.values()) {
+ if (key.startsWith(type.name().toLowerCase())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Builds lookup keys.
+ */
+ static class Builder {
+
+ private KeyType keyType;
+
+ // Default to LOCAL script.
+
+ private ScriptType script = ScriptType.LOCAL;
+
+ private Map<AddressField, String> nodes = new EnumMap<AddressField, String>(
+ AddressField.class);
+
+ private String languageCode;
+
+ /**
+ * Creates a new builder for the specified key type. keyType cannot be null.
+ */
+ Builder(KeyType keyType) {
+ this.keyType = keyType;
+ }
+
+ /**
+ * Creates a new builder for the specified key. oldKey cannot be null.
+ */
+ Builder(LookupKey oldKey) {
+ this.keyType = oldKey.mKeyType;
+ this.script = oldKey.mScriptType;
+ this.languageCode = oldKey.mLanguageCode;
+ for (AddressField field : HIERARCHY) {
+ if (!oldKey.mNodes.containsKey(field)) {
+ break;
+ }
+ this.nodes.put(field, oldKey.mNodes.get(field));
+ }
+ }
+
+ /**
+ * Builds the {@link LookupKey} with the input key string. Input string has to represent
+ * either a {@link KeyType#DATA} key or a {@link KeyType#EXAMPLES} key. Also, key hierarchy
+ * deeper than {@link AddressField#DEPENDENT_LOCALITY} is not allowed. Notice that if any
+ * node in the hierarchy is empty, all the descendant nodes' values will be neglected. For
+ * example, input string "data/US//Mt View" will become "data/US".
+ *
+ * @param keyString e.g., "data/US/CA"
+ */
+ Builder(String keyString) {
+ String[] parts = keyString.split(SLASH_DELIM);
+ // Check some pre-conditions.
+ if (!parts[0].equals(KeyType.DATA.name().toLowerCase()) &&
+ !parts[0].equals(KeyType.EXAMPLES.name().toLowerCase())) {
+ throw new RuntimeException("Wrong key type: " + parts[0]);
+ }
+ if (parts.length > HIERARCHY.length + 1) {
+ throw new RuntimeException(
+ "input key '" + keyString + "' deeper than supported hierarchy");
+ }
+ if (parts[0].equals("data")) {
+ keyType = KeyType.DATA;
+
+ // Parses country and language info.
+ if (parts.length > 1) {
+ String substr = Util.trimToNull(parts[1]);
+ if (substr.contains(DASH_DELIM)) {
+ String[] s = substr.split(DASH_DELIM);
+ if (s.length != 2) {
+ throw new RuntimeException(
+ "Wrong format: Substring should be country "
+ + "code--language code");
+ }
+ substr = s[0];
+ languageCode = s[1];
+ }
+ this.nodes.put(HIERARCHY[0], substr);
+ }
+
+ // Parses sub-country info.
+ if (parts.length > 2) {
+ for (int i = 2; i < parts.length; ++i) {
+ String substr = Util.trimToNull(parts[i]);
+ if (substr == null) {
+ break;
+ }
+ this.nodes.put(HIERARCHY[i - 1], substr);
+ }
+ }
+ } else if (parts[0].equals("examples")) {
+ keyType = KeyType.EXAMPLES;
+
+ // Parses country info.
+ if (parts.length > 1) {
+ this.nodes.put(AddressField.COUNTRY, parts[1]);
+ }
+
+ // Parses script types.
+ if (parts.length > 2) {
+ String scriptStr = parts[2];
+ if (scriptStr.equals("local")) {
+ this.script = ScriptType.LOCAL;
+ } else if (scriptStr.equals("latin")) {
+ this.script = ScriptType.LATIN;
+ } else {
+ throw new RuntimeException("Script type has to be either latin or local.");
+ }
+ }
+
+ // Parses language code. Example: "zh_Hant" in
+ // "examples/TW/local/zH_Hant".
+ if (parts.length > 3 && !parts[3].equals(DEFAULT_LANGUAGE)) {
+ languageCode = parts[3];
+ }
+ }
+ }
+
+ Builder setLanguageCode(String languageCode) {
+ this.languageCode = languageCode;
+ return this;
+ }
+
+ /**
+ * Sets key using {@link AddressData}. Notice that if any node in the hierarchy is empty,
+ * all the descendant nodes' values will be neglected. For example, the following address
+ * misses {@link AddressField#ADMIN_AREA}, thus its data key will be "data/US".
+ *
+ * <p> country: US<br> administrative area: null<br> locality: Mt. View </p>
+ */
+ Builder setAddressData(AddressData data) {
+ languageCode = data.getLanguageCode();
+ if (languageCode != null) {
+ if (Util.isExplicitLatinScript(languageCode)) {
+ script = ScriptType.LATIN;
+ }
+ }
+
+ if (data.getPostalCountry() == null) {
+ return this;
+ }
+ this.nodes.put(AddressField.COUNTRY, data.getPostalCountry());
+
+ if (data.getAdministrativeArea() == null) {
+ return this;
+ }
+ this.nodes.put(AddressField.ADMIN_AREA, data.getAdministrativeArea());
+
+ if (data.getLocality() == null) {
+ return this;
+ }
+ this.nodes.put(AddressField.LOCALITY, data.getLocality());
+
+ if (data.getDependentLocality() == null) {
+ return this;
+ }
+ this.nodes.put(AddressField.DEPENDENT_LOCALITY, data.getDependentLocality());
+ return this;
+ }
+
+ LookupKey build() {
+ return new LookupKey(this);
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/NotifyingListener.java b/java/src/com/android/i18n/addressinput/NotifyingListener.java
new file mode 100644
index 0000000..60a5f74
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/NotifyingListener.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * A helper class to let the calling thread wait until loading has finished.
+ */
+public class NotifyingListener implements DataLoadListener {
+ private Object mSleeper;
+ private boolean mDone;
+
+ NotifyingListener(Object sleeper) {
+ mSleeper = sleeper;
+ mDone = false;
+ }
+
+ @Override
+ public void dataLoadingBegin() {
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ synchronized (this) {
+ mDone = true;
+ }
+ synchronized (mSleeper) {
+ mSleeper.notify();
+ }
+ }
+
+ void waitLoadingEnd() throws InterruptedException {
+ synchronized (this) {
+ if (mDone) return;
+ }
+ synchronized (mSleeper) {
+ mSleeper.wait();
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/RegionData.java b/java/src/com/android/i18n/addressinput/RegionData.java
new file mode 100644
index 0000000..2b82c0a
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/RegionData.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * A simple class to hold region data. Instances of this class are immutable.
+ */
+class RegionData {
+
+ private String mKey;
+ private String mName;
+
+ /**
+ * Create a new RegionData object.
+ */
+ private RegionData() {
+ }
+
+ /**
+ * Copy constructor. data should not be null.
+ *
+ * @param data A populated instance of RegionData
+ */
+ private RegionData(RegionData data) {
+ Util.checkNotNull(data);
+ mKey = data.mKey;
+ mName = data.mName;
+ }
+
+ /**
+ * Gets the key of the region. For example, California's key is "CA".
+ */
+ String getKey() {
+ return mKey;
+ }
+
+ /**
+ * Gets the name. Returns null if not specified.
+ */
+ String getName() {
+ return mName;
+ }
+
+ /**
+ * Gets the best display name. Returns the name if this is not null, otherwise the key.
+ */
+ public String getDisplayName() {
+ return (mName != null) ? mName : mKey;
+ }
+
+ /**
+ * Checks if the input subkey is the name (in Latin or local script) of the region. Returns
+ * false if subkey is not a valid name for the region, or the input subkey is null.
+ *
+ * @param subkey a string that refers to the name of a geo location. Like "California", "CA", or
+ * "Mountain View". Names in the local script are also supported.
+ */
+ boolean isValidName(String subkey) {
+ if (subkey == null) {
+ return false;
+ }
+ if (subkey.equalsIgnoreCase(mKey) || subkey.equalsIgnoreCase(mName)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * A builder class to facilitate the creation of RegionData objects.
+ */
+ static class Builder {
+ RegionData mData = new RegionData();
+
+ RegionData build() {
+ return new RegionData(mData);
+ }
+
+ Builder setKey(String key) {
+ Util.checkNotNull(key, "Key should not be null.");
+ mData.mKey = key;
+ return this;
+ }
+
+ /**
+ * Sets name of the region. For example, "California". If the name is an empty string, sets
+ * it to null.
+ */
+ Builder setName(String name) {
+ mData.mName = Util.trimToNull(name);
+ return this;
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/RegionDataConstants.java b/java/src/com/android/i18n/addressinput/RegionDataConstants.java
new file mode 100644
index 0000000..48affab
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/RegionDataConstants.java
@@ -0,0 +1,1310 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Initial data in JSON format for regions. This has some formatting information for some countries,
+ * and a list of all the regions that the widget can support. Data has been sorted below for ease of
+ * editing.
+ */
+class RegionDataConstants {
+
+ private static final Map<String, String> COUNTRY_FORMAT_MAP =
+ new HashMap<String, String>();
+
+ private enum RegionDataEnum {
+
+ AC(new String[]{
+ "name", "ASCENSION ISLAND",
+ }),
+ AD(new String[]{
+ "name", "ANDORRA",
+ "lang", "ca",
+ "languages", "ca",
+ "fmt", "%N%n%O%n%A%n%Z %S",
+ "require", "AS",
+ "upper", "S",
+ "state_name_type", "parish",
+ }),
+ AE(new String[]{
+ "name", "UNITED ARAB EMIRATES",
+ "fmt", "%N%n%O%n%A%n%C",
+ "require", "AC",
+ }),
+ AF(new String[]{
+ "name", "AFGHANISTAN",
+ }),
+ AG(new String[]{
+ "name", "ANTIGUA AND BARBUDA",
+ "require", "A",
+ }),
+ AI(new String[]{
+ "name", "ANGUILLA",
+ }),
+ AL(new String[]{
+ "name", "ALBANIA",
+ }),
+ AM(new String[]{
+ "name", "ARMENIA",
+ "lang", "hy",
+ "languages", "hy",
+ "fmt", "%N%n%O%n%A%n%Z%n%C%n%S",
+ "lfmt", "%N%n%O%n%A%n%Z%n%C%n%S",
+ }),
+ AN(new String[]{
+ "name", "NETHERLANDS ANTILLES",
+ }),
+ AO(new String[]{
+ "name", "ANGOLA",
+ }),
+ AQ(new String[]{
+ "name", "ANTARCTICA",
+ }),
+ AR(new String[]{
+ "name", "ARGENTINA",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z %C%n%S",
+ "upper", "ACZ",
+ "state_name_type", "state",
+ }),
+ AS(new String[]{
+ "name", "AMERICAN SAMOA",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ AT(new String[]{
+ "name", "AUSTRIA",
+ "fmt", "%O%n%N%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ AU(new String[]{
+ "name", "AUSTRALIA",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%O%n%N%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "CS",
+ "state_name_type", "state",
+ }),
+ AW(new String[]{
+ "name", "ARUBA",
+ }),
+ AX(new String[]{
+ "name", "FINLAND",
+ "fmt", "%O%n%N%n%A%nAX-%Z %C%n\u00C5LAND",
+ "require", "ACZ",
+ "postprefix", "AX-",
+ }),
+ AZ(new String[]{
+ "name", "AZERBAIJAN",
+ "fmt", "%N%n%O%n%A%nAZ %Z %C",
+ "postprefix", "AZ ",
+ }),
+ BA(new String[]{
+ "name", "BOSNIA AND HERZEGOVINA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ BB(new String[]{
+ "name", "BARBADOS",
+ "state_name_type", "parish",
+ }),
+ BD(new String[]{
+ "name", "BANGLADESH",
+ "fmt", "%N%n%O%n%A%n%C - %Z",
+ }),
+ BE(new String[]{
+ "name", "BELGIUM",
+ "fmt", "%O%n%N%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ BF(new String[]{
+ "name", "BURKINA FASO",
+ "fmt", "%N%n%O%n%A%n%C %X",
+ }),
+ BG(new String[]{
+ "name", "BULGARIA (REP.)",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ BH(new String[]{
+ "name", "BAHRAIN",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ BI(new String[]{
+ "name", "BURUNDI",
+ }),
+ BJ(new String[]{
+ "name", "BENIN",
+ "upper", "AC",
+ }),
+ BL(new String[]{
+ "name", "SAINT BARTHELEMY",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "upper", "ACX",
+ "require", "ACZ",
+ }),
+ BM(new String[]{
+ "name", "BERMUDA",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ BN(new String[]{
+ "name", "BRUNEI DARUSSALAM",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ BO(new String[]{
+ "name", "BOLIVIA",
+ "upper", "AC",
+ }),
+ BR(new String[]{
+ "name", "BRAZIL",
+ "lang", "pt",
+ "languages", "pt",
+ "fmt", "%O%n%N%n%A%n%C-%S%n%Z",
+ "require", "ASCZ",
+ "upper", "CS",
+ "state_name_type", "state",
+ }),
+ BS(new String[]{
+ "name", "BAHAMAS",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C, %S",
+ "state_name_type", "island",
+ }),
+ BT(new String[]{
+ "name", "BHUTAN",
+ }),
+ BV(new String[]{
+ "name", "BOUVET ISLAND",
+ }),
+ BW(new String[]{
+ "name", "BOTSWANA",
+ }),
+ BY(new String[]{
+ "name", "BELARUS",
+ "fmt", "%S%n%Z %C %X%n%A%n%O%n%N",
+ }),
+ BZ(new String[]{
+ "name", "BELIZE",
+ }),
+ CA(new String[]{
+ "name", "CANADA",
+ "lang", "en",
+ "languages", "en~fr",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOSZ",
+ }),
+ CC(new String[]{
+ "name", "COCOS (KEELING) ISLANDS",
+ "fmt", "%O%n%N%n%A%n%C %S %Z",
+ "upper", "CS",
+ }),
+ CD(new String[]{
+ "name", "CONGO (DEM. REP.)",
+ "fmt", "%N%n%O%n%A%n%C %X",
+ }),
+ CF(new String[]{
+ "name", "CENTRAL AFRICAN REPUBLIC",
+ }),
+ CG(new String[]{
+ "name", "CONGO (REP.)",
+ }),
+ CH(new String[]{
+ "name", "SWITZERLAND",
+ "lang", "de",
+ "languages", "de~fr~it",
+ "fmt", "%O%n%N%n%A%nCH-%Z %C",
+ "require", "ACZ",
+ "upper", "",
+ "postprefix", "CH-",
+ }),
+ CI(new String[]{
+ "name", "COTE D'IVOIRE",
+ "fmt", "%N%n%O%n%X %A %C %X",
+ }),
+ CK(new String[]{
+ "name", "COOK ISLANDS",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ CL(new String[]{
+ "name", "CHILE",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z %C%n%S",
+ "state_name_type", "state",
+ }),
+ CM(new String[]{
+ "name", "CAMEROON",
+ }),
+ CN(new String[]{
+ "name", "P.R. CHINA",
+ "lang", "zh-hans",
+ "languages", "zh-hans",
+ "fmt", "%Z%n%S%C%D%n%A%n%O%n%N",
+ "lfmt", "%N%n%O%n%A%n%D%n%C%n%S, %Z",
+ "require", "ACSZ",
+ "upper", "S",
+ }),
+ CO(new String[]{
+ "name", "COLOMBIA",
+ "fmt", "%N%n%O%n%A%n%C, %S",
+ }),
+ CR(new String[]{
+ "name", "COSTA RICA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ CS(new String[]{
+ "name", "SERBIA AND MONTENEGRO",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ CV(new String[]{
+ "name", "CAPE VERDE",
+ "lang", "pt",
+ "languages", "pt",
+ "fmt", "%N%n%O%n%A%n%Z %C%n%S",
+ "state_name_type", "island",
+ }),
+ CX(new String[]{
+ "name", "CHRISTMAS ISLAND",
+ "fmt", "%O%n%N%n%A%n%C %S %Z",
+ "upper", "CS",
+ }),
+ CY(new String[]{
+ "name", "CYPRUS",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ CZ(new String[]{
+ "name", "CZECH REP.",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ DE(new String[]{
+ "name", "GERMANY",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ DJ(new String[]{
+ "name", "DJIBOUTI",
+ }),
+ DK(new String[]{
+ "name", "DENMARK",
+ "fmt", "%O%n%N%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ DM(new String[]{
+ "name", "DOMINICA",
+ }),
+ DO(new String[]{
+ "name", "DOMINICAN REP.",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ DZ(new String[]{
+ "name", "ALGERIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ EC(new String[]{
+ "name", "ECUADOR",
+ "fmt", "%N%n%O%n%A%n%Z%n%C",
+ "upper", "CZ",
+ }),
+ EE(new String[]{
+ "name", "ESTONIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ EG(new String[]{
+ "name", "EGYPT",
+ "fmt", "%N%n%O%n%A%n%C%n%S%n%Z",
+ "lfmt", "%N%n%O%n%A%n%C%n%S%n%Z",
+ }),
+ EH(new String[]{
+ "name", "WESTERN SAHARA",
+ }),
+ ER(new String[]{
+ "name", "ERITREA",
+ }),
+ ES(new String[]{
+ "name", "SPAIN",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z %C %S",
+ "require", "ACSZ",
+ "upper", "CS",
+ }),
+ ET(new String[]{
+ "name", "ETHIOPIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ FI(new String[]{
+ "name", "FINLAND",
+ "fmt", "%O%n%N%n%A%nFI-%Z %C",
+ "require", "ACZ",
+ "postprefix", "FI-",
+ }),
+ FJ(new String[]{
+ "name", "FIJI",
+ }),
+ FK(new String[]{
+ "name", "FALKLAND ISLANDS (MALVINAS)",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ FM(new String[]{
+ "name", "MICRONESIA (Federated State of)",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ FO(new String[]{
+ "name", "FAROE ISLANDS",
+ "fmt", "%N%n%O%n%A%nFO%Z %C",
+ "postprefix", "FO",
+ }),
+ FR(new String[]{
+ "name", "FRANCE",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "CX",
+ }),
+ GA(new String[]{
+ "name", "GABON",
+ }),
+ GB(new String[]{
+ "name", "UNITED KINGDOM",
+ "fmt", "%N%n%O%n%A%n%C%n%S%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ "state_name_type", "county",
+ }),
+ GD(new String[]{
+ "name", "GRENADA (WEST INDIES)",
+ }),
+ GE(new String[]{
+ "name", "GEORGIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ GF(new String[]{
+ "name", "FRENCH GUIANA",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ GG(new String[]{
+ "name", "CHANNEL ISLANDS",
+ "fmt", "%N%n%O%n%A%n%X%n%C%nGUERNSEY%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ GH(new String[]{
+ "name", "GHANA",
+ }),
+ GI(new String[]{
+ "name", "GIBRALTAR",
+ "fmt", "%N%n%O%n%A",
+ "require", "A",
+ }),
+ GL(new String[]{
+ "name", "GREENLAND",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ GM(new String[]{
+ "name", "GAMBIA",
+ }),
+ GN(new String[]{
+ "name", "GUINEA",
+ "fmt", "%N%n%O%n%Z %A %C",
+ }),
+ GP(new String[]{
+ "name", "GUADELOUPE",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ GQ(new String[]{
+ "name", "EQUATORIAL GUINEA",
+ }),
+ GR(new String[]{
+ "name", "GREECE",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ GS(new String[]{
+ "name", "SOUTH GEORGIA",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ GT(new String[]{
+ "name", "GUATEMALA",
+ "fmt", "%N%n%O%n%A%n%Z- %C",
+ }),
+ GU(new String[]{
+ "name", "GUAM",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ GW(new String[]{
+ "name", "GUINEA-BISSAU",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ GY(new String[]{
+ "name", "GUYANA",
+ }),
+ HK(new String[]{
+ "name", "HONG KONG",
+ "lang", "zh",
+ "languages", "zh",
+ "fmt", "%S%n%A%n%O%n%N",
+ "lfmt", "%N%n%O%n%A%n%S",
+ "require", "AS",
+ "upper", "S",
+ "state_name_type", "area",
+ }),
+ HM(new String[]{
+ "name", "HEARD AND MCDONALD ISLANDS",
+ "fmt", "%O%n%N%n%A%n%C %S %Z",
+ "upper", "CS",
+ }),
+ HN(new String[]{
+ "name", "HONDURAS",
+ "fmt", "%N%n%O%n%A%n%C, %S%n%Z",
+ "require", "ACS",
+ }),
+ HR(new String[]{
+ "name", "CROATIA",
+ "fmt", "%N%n%O%n%A%nHR-%Z %C",
+ "postprefix", "HR-",
+ }),
+ HT(new String[]{
+ "name", "HAITI",
+ "fmt", "%N%n%O%n%A%nHT%Z %C %X",
+ "postprefix", "HT",
+ }),
+ HU(new String[]{
+ "name", "HUNGARY (Rep.)",
+ "fmt", "%N%n%O%n%C%n%A%n%Z",
+ "upper", "ACNO",
+ }),
+ ID(new String[]{
+ "name", "INDONESIA",
+ "fmt", "%N%n%O%n%A%n%C %Z%n%S",
+ }),
+ IE(new String[]{
+ "name", "IRELAND",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C%n%S",
+ "state_name_type", "county",
+ }),
+ IL(new String[]{
+ "name", "ISRAEL",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ IM(new String[]{
+ "name", "ISLE OF MAN",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ IN(new String[]{
+ "name", "INDIA",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C %Z%n%S",
+ "require", "ACSZ",
+ "state_name_type", "state",
+ }),
+ IO(new String[]{
+ "name", "BRITISH INDIAN OCEAN TERRITORY",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ IQ(new String[]{
+ "name", "IRAQ",
+ "fmt", "%O%n%N%n%A%n%C, %S%n%Z",
+ "require", "ACS",
+ "upper", "CS",
+ }),
+ IS(new String[]{
+ "name", "ICELAND",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ IT(new String[]{
+ "name", "ITALY",
+ "lang", "it",
+ "languages", "it",
+ "fmt", "%N%n%O%n%A%n%Z %C %S",
+ "require", "ACSZ",
+ "upper", "CS",
+ }),
+ JE(new String[]{
+ "name", "CHANNEL ISLANDS",
+ "fmt", "%N%n%O%n%A%n%X%n%C%nJERSEY%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ JM(new String[]{
+ "name", "JAMAICA",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C%n%S %X",
+ "require", "ACS",
+ "state_name_type", "parish",
+ }),
+ JO(new String[]{
+ "name", "JORDAN",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ JP(new String[]{
+ "name", "JAPAN",
+ "lang", "ja",
+ "languages", "ja",
+ "fmt", "\u3012%Z%n%S%C%n%A%n%O%n%N",
+ "lfmt", "%N%n%O%n%A%n%C, %S%n%Z",
+ "require", "ACSZ",
+ "upper", "S",
+ "state_name_type", "prefecture",
+ }),
+ KE(new String[]{
+ "name", "KENYA",
+ "fmt", "%N%n%O%n%A%n%C%n%Z",
+ }),
+ KG(new String[]{
+ "name", "KYRGYZSTAN",
+ "fmt", "%Z %C %X%n%A%n%O%n%N",
+ }),
+ KH(new String[]{
+ "name", "CAMBODIA",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ KI(new String[]{
+ "name", "KIRIBATI",
+ "fmt", "%N%n%O%n%A%n%S%n%C",
+ "upper", "ACNOS",
+ "state_name_type", "island",
+ }),
+ KM(new String[]{
+ "name", "COMOROS",
+ "upper", "AC",
+ }),
+ KN(new String[]{
+ "name", "SAINT KITTS AND NEVIS",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C, %S",
+ "require", "ACS",
+ "state_name_type", "island",
+ }),
+ KR(new String[]{
+ "name", "KOREA (REP.)",
+ "lang", "ko",
+ "languages", "ko",
+ "fmt", "%S %C%D%n%A%n%O%n%N%nSEOUL %Z",
+ "lfmt", "%N%n%O%n%A%n%D%n%C%n%S%nSEOUL %Z",
+ "require", "ACSZ",
+ "upper", "Z",
+ "state_name_type", "do_si",
+ }),
+ KW(new String[]{
+ "name", "KUWAIT",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ KY(new String[]{
+ "name", "CAYMAN ISLANDS",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%S",
+ "require", "AS",
+ "state_name_type", "island",
+ }),
+ KZ(new String[]{
+ "name", "KAZAKHSTAN",
+ "fmt", "%Z%n%S%n%C%n%A%n%O%n%N",
+ }),
+ LA(new String[]{
+ "name", "LAO (PEOPLE'S DEM. REP.)",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ LB(new String[]{
+ "name", "LEBANON",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ LC(new String[]{
+ "name", "SAINT LUCIA",
+ }),
+ LI(new String[]{
+ "name", "LIECHTENSTEIN",
+ "fmt", "%O%n%N%n%A%nFL-%Z %C",
+ "require", "ACZ",
+ "postprefix", "FL-",
+ }),
+ LK(new String[]{
+ "name", "SRI LANKA",
+ "fmt", "%N%n%O%n%A%n%C%n%Z",
+ }),
+ LR(new String[]{
+ "name", "LIBERIA",
+ "fmt", "%N%n%O%n%A%n%Z %C %X",
+ }),
+ LS(new String[]{
+ "name", "LESOTHO",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ LT(new String[]{
+ "name", "LITHUANIA",
+ "fmt", "%O%n%N%n%A%nLT-%Z %C",
+ "postprefix", "LT-",
+ }),
+ LU(new String[]{
+ "name", "LUXEMBOURG",
+ "fmt", "%O%n%N%n%A%nL-%Z %C",
+ "require", "ACZ",
+ "postprefix", "L-",
+ }),
+ LV(new String[]{
+ "name", "LATVIA",
+ "fmt", "%N%n%O%n%A%n%C, %Z",
+ }),
+ LY(new String[]{
+ "name", "LIBYA",
+ }),
+ MA(new String[]{
+ "name", "MOROCCO",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ MC(new String[]{
+ "name", "MONACO",
+ "fmt", "%N%n%O%n%A%nMC-%Z %C %X",
+ "postprefix", "MC-",
+ }),
+ MD(new String[]{
+ "name", "Rep. MOLDOVA",
+ "fmt", "%N%n%O%n%A%nMD-%Z %C",
+ "postprefix", "MD-",
+ }),
+ ME(new String[]{
+ "name", "MONTENEGRO",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ MF(new String[]{
+ "name", "SAINT MARTIN",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "upper", "ACX",
+ "require", "ACZ",
+ }),
+ MG(new String[]{
+ "name", "MADAGASCAR",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ MH(new String[]{
+ "name", "MARSHALL ISLANDS",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ MK(new String[]{
+ "name", "MACEDONIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ ML(new String[]{
+ "name", "MALI",
+ }),
+ MN(new String[]{
+ "name", "MONGOLIA",
+ "fmt", "%N%n%O%n%A%n%S %C-%X%n%Z",
+ }),
+ MO(new String[]{
+ "name", "MACAO",
+ "lang", "zh-hant",
+ "languages", "zh-hant",
+ "fmt", "%A%n%O%n%N",
+ "lfmt", "%N%n%O%n%A",
+ "require", "A",
+ }),
+ MP(new String[]{
+ "name", "NORTHERN MARIANA ISLANDS",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ MQ(new String[]{
+ "name", "MARTINIQUE",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ MR(new String[]{
+ "name", "MAURITANIA",
+ "upper", "AC",
+ }),
+ MS(new String[]{
+ "name", "MONTSERRAT",
+ }),
+ MT(new String[]{
+ "name", "MALTA",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ "upper", "CZ",
+ }),
+ MU(new String[]{
+ "name", "MAURITIUS",
+ "fmt", "%N%n%O%n%A%n%Z%n%C",
+ "upper", "CZ",
+ }),
+ MV(new String[]{
+ "name", "MALDIVES",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ MW(new String[]{
+ "name", "MALAWI",
+ "fmt", "%N%n%O%n%A%n%C %X",
+ }),
+ MX(new String[]{
+ "name", "MEXICO",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z %C, %S",
+ "require", "ACZ",
+ "upper", "CSZ",
+ "state_name_type", "state",
+ }),
+ MY(new String[]{
+ "name", "MALAYSIA",
+ "lang", "ms",
+ "languages", "ms",
+ "fmt", "%N%n%O%n%A%n%Z %C, %S",
+ "require", "ACZ",
+ "upper", "CS",
+ "state_name_type", "state",
+ }),
+ MZ(new String[]{
+ "name", "MOZAMBIQUE",
+ "fmt", "%N%n%O%n%A%n%C",
+ }),
+ NA(new String[]{
+ "name", "NAMIBIA",
+ }),
+ NC(new String[]{
+ "name", "NEW CALEDONIA",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ NE(new String[]{
+ "name", "NIGER",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ NF(new String[]{
+ "name", "NORFOLK ISLAND",
+ "fmt", "%O%n%N%n%A%n%C %S %Z",
+ "upper", "CS",
+ }),
+ NG(new String[]{
+ "name", "NIGERIA",
+ "lang", "fr",
+ "languages", "fr",
+ "fmt", "%N%n%O%n%A%n%C %Z%n%S",
+ "upper", "CS",
+ "state_name_type", "state",
+ }),
+ NI(new String[]{
+ "name", "NICARAGUA",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z%n%C, %S",
+ "upper", "CS",
+ "state_name_type", "department",
+ }),
+ NL(new String[]{
+ "name", "NETHERLANDS",
+ "fmt", "%O%n%N%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ NO(new String[]{
+ "name", "NORWAY",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ NP(new String[]{
+ "name", "NEPAL",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ NR(new String[]{
+ "name", "NAURU CENTRAL PACIFIC",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%S",
+ "require", "AS",
+ "state_name_type", "district",
+ }),
+ NU(new String[]{
+ "name", "NIUE",
+ }),
+ NZ(new String[]{
+ "name", "NEW ZEALAND",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ "require", "ACZ",
+ }),
+ OM(new String[]{
+ "name", "OMAN",
+ "fmt", "%N%n%O%n%A%n%Z%n%C",
+ }),
+ PA(new String[]{
+ "name", "PANAMA (REP.)",
+ "fmt", "%N%n%O%n%A%n%C%n%S",
+ "upper", "CS",
+ }),
+ PE(new String[]{
+ "name", "PERU",
+ }),
+ PF(new String[]{
+ "name", "FRENCH POLYNESIA",
+ "fmt", "%N%n%O%n%A%n%Z %C %S",
+ "require", "ACSZ",
+ "upper", "CS",
+ "state_name_type", "island",
+ }),
+ PG(new String[]{
+ "name", "PAPUA NEW GUINEA",
+ "fmt", "%N%n%O%n%A%n%C %Z %S",
+ "require", "ACS",
+ }),
+ PH(new String[]{
+ "name", "PHILIPPINES",
+ "fmt", "%N%n%O%n%A%n%Z %C%n%S",
+ "require", "AC",
+ }),
+ PK(new String[]{
+ "name", "PAKISTAN",
+ "fmt", "%N%n%O%n%A%n%C-%Z",
+ }),
+ PL(new String[]{
+ "name", "POLAND",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ PM(new String[]{
+ "name", "ST. PIERRE AND MIQUELON",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ PN(new String[]{
+ "name", "PITCAIRN",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ PR(new String[]{
+ "name", "PUERTO RICO",
+ "fmt", "%N%n%O%n%A%n%C PR %Z",
+ "require", "ACZ",
+ "upper", "ACNO",
+ "zip_name_type", "zip",
+ "postprefix", "PR",
+ }),
+ PS(new String[]{
+ "name", "PALESTINIAN TERRITORY",
+ }),
+ PT(new String[]{
+ "name", "PORTUGAL",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ PW(new String[]{
+ "name", "PALAU",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ PY(new String[]{
+ "name", "PARAGUAY",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ QA(new String[]{
+ "name", "QATAR",
+ "upper", "AC",
+ }),
+ RE(new String[]{
+ "name", "REUNION",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ RO(new String[]{
+ "name", "ROMANIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "upper", "AC",
+ }),
+ RS(new String[]{
+ "name", "REPUBLIC OF SERBIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ RU(new String[]{
+ "name", "RUSSIAN FEDERATION",
+ "fmt", "%Z %C %n%A%n%O%n%N",
+ "require", "ACZ",
+ "upper", "AC",
+ }),
+ RW(new String[]{
+ "name", "RWANDA",
+ "upper", "AC",
+ }),
+ SA(new String[]{
+ "name", "SAUDI ARABIA",
+ "fmt", "%N%n%O%n%A%n%C %Z",
+ }),
+ SB(new String[]{
+ "name", "SOLOMON ISLANDS",
+ }),
+ SC(new String[]{
+ "name", "SEYCHELLES",
+ "fmt", "%N%n%O%n%A%n%C%n%S",
+ "upper", "S",
+ "state_name_type", "island",
+ }),
+ SE(new String[]{
+ "name", "SWEDEN",
+ "fmt", "%O%n%N%n%A%nSE-%Z %C",
+ "require", "ACZ",
+ "postprefix", "SE-",
+ }),
+ SG(new String[]{
+ "name", "REP. OF SINGAPORE",
+ "fmt", "%N%n%O%n%A%nSINGAPORE %Z",
+ "require", "AZ",
+ }),
+ SH(new String[]{
+ "name", "SAINT HELENA",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ SI(new String[]{
+ "name", "SLOVENIA",
+ "fmt", "%N%n%O%n%A%nSI- %Z %C",
+ "postprefix", "SI-",
+ }),
+ SJ(new String[]{
+ "name", "SVALBARD AND JAN MAYEN ISLANDS",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "ACZ",
+ }),
+ SK(new String[]{
+ "name", "SLOVAKIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ SL(new String[]{
+ "name", "SIERRA LEONE",
+ }),
+ SM(new String[]{
+ "name", "SAN MARINO",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "AZ",
+ }),
+ SN(new String[]{
+ "name", "SENEGAL",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ SO(new String[]{
+ "name", "SOMALIA",
+ "lang", "so",
+ "languages", "so",
+ "fmt", "%N%n%O%n%A%n%C, %S %Z",
+ "require", "ACS",
+ "upper", "ACS",
+ }),
+ SR(new String[]{
+ "name", "SURINAME",
+ "lang", "nl",
+ "languages", "nl",
+ "fmt", "%N%n%O%n%A%n%C %X%n%S",
+ "upper", "AS",
+ }),
+ ST(new String[]{
+ "name", "SAO TOME AND PRINCIPE",
+ "fmt", "%N%n%O%n%A%n%C %X",
+ }),
+ SV(new String[]{
+ "name", "EL SALVADOR",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z-%C%n%S",
+ "require", "ACS",
+ "upper", "CSZ",
+ }),
+ SZ(new String[]{
+ "name", "SWAZILAND",
+ "fmt", "%N%n%O%n%A%n%C%n%Z",
+ "upper", "ACZ",
+ }),
+ TA(new String[]{
+ "name", "TRISTAN DA CUNHA",
+ }),
+ TC(new String[]{
+ "name", "TURKS AND CAICOS ISLANDS",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
+ "require", "ACZ",
+ "upper", "CZ",
+ }),
+ TD(new String[]{
+ "name", "CHAD",
+ }),
+ TF(new String[]{
+ "name", "FRENCH SOUTHERN TERRITORIES",
+ }),
+ TG(new String[]{
+ "name", "TOGO",
+ }),
+ TH(new String[]{
+ "name", "THAILAND",
+ "lang", "th",
+ "languages", "th",
+ "fmt", "%N%n%O%n%A%n%D %C%n%S %Z",
+ "lfmt", "%N%n%O%n%A%n%D, %C%n%S %Z",
+ "upper", "S",
+ }),
+ TJ(new String[]{
+ "name", "TAJIKISTAN",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ TK(new String[]{
+ "name", "TOKELAU",
+ }),
+ TL(new String[]{
+ "name", "TIMOR-LESTE",
+ }),
+ TM(new String[]{
+ "name", "TURKMENISTAN",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ TN(new String[]{
+ "name", "TUNISIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ TO(new String[]{
+ "name", "TONGA",
+ }),
+ TR(new String[]{
+ "name", "TURKEY",
+ "fmt", "%N%n%O%n%A%n%Z %C/%S",
+ "require", "ACZ",
+ }),
+ TT(new String[]{
+ "name", "TRINIDAD AND TOBAGO",
+ }),
+ TV(new String[]{
+ "name", "TUVALU",
+ "lang", "tyv",
+ "languages", "tyv",
+ "fmt", "%N%n%O%n%A%n%X%n%C%n%S",
+ "upper", "ACS",
+ "state_name_type", "island",
+ }),
+ TW(new String[]{
+ "name", "TAIWAN",
+ "lang", "zh-hant",
+ "languages", "zh-hant",
+ "fmt", "%Z%n%S%C%n%A%n%O%n%N",
+ "lfmt", "%N%n%O%n%A%n%C, %S %Z",
+ "require", "ACSZ",
+ "state_name_type", "county",
+ }),
+ TZ(new String[]{
+ "name", "TANZANIA (UNITED REP.)",
+ }),
+ UA(new String[]{
+ "name", "UKRAINE",
+ "fmt", "%Z %C%n%A%n%O%n%N",
+ }),
+ UG(new String[]{
+ "name", "UGANDA",
+ }),
+ UM(new String[]{
+ "name", "UNITED STATES MINOR OUTLYING ISLANDS",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACS",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ US(new String[]{
+ "name", "UNITED STATES",
+ "lang", "en",
+ "languages", "en",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "CS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ UY(new String[]{
+ "name", "URUGUAY",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%Z %C %S",
+ "upper", "CS",
+ }),
+ UZ(new String[]{
+ "name", "UZBEKISTAN",
+ "fmt", "%N%n%O%n%A%n%Z %C%n%S",
+ "upper", "CS",
+ }),
+ VA(new String[]{
+ "name", "VATICAN",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ VC(new String[]{
+ "name", "SAINT VINCENT AND THE GRENADINES (ANTILLES)",
+ }),
+ VE(new String[]{
+ "name", "VENEZUELA",
+ "lang", "es",
+ "languages", "es",
+ "fmt", "%N%n%O%n%A%n%C %Z, %S",
+ "require", "ACS",
+ "upper", "CS",
+ }),
+ VG(new String[]{
+ "name", "VIRGIN ISLANDS (BRITISH)",
+ "require", "A",
+ }),
+ VI(new String[]{
+ "name", "VIRGIN ISLANDS (U.S.)",
+ "fmt", "%N%n%O%n%A%n%C %S %Z",
+ "require", "ACSZ",
+ "upper", "ACNOS",
+ "zip_name_type", "zip",
+ "state_name_type", "state",
+ }),
+ VN(new String[]{
+ "name", "VIET NAM",
+ "lang", "vi",
+ "languages", "vi",
+ "fmt", "%N%n%O%n%A%n%C%n%S",
+ "lfmt", "%N%n%O%n%A%n%C%n%S",
+ "require", "AC",
+ }),
+ VU(new String[]{
+ "name", "VANUATU",
+ }),
+ WF(new String[]{
+ "name", "WALLIS AND FUTUNA ISLANDS",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ WS(new String[]{
+ "name", "SAMOA",
+ }),
+ XK(new String[]{
+ "name", "KOSOVO",
+ "fmt", "%N%n%O%n%A%n%Z %C"
+ }),
+ YE(new String[]{
+ "name", "YEMEN",
+ "require", "AC",
+ }),
+ YT(new String[]{
+ "name", "MAYOTTE",
+ "fmt", "%O%n%N%n%A%n%Z %C %X",
+ "require", "ACZ",
+ "upper", "ACX",
+ }),
+ YU(new String[]{
+ "name", "SERBIA AND MONTENEGRO",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ }),
+ ZA(new String[]{
+ "name", "SOUTH AFRICA",
+ "fmt", "%N%n%O%n%A%n%C%n%Z",
+ "require", "ACZ",
+ }),
+ ZM(new String[]{
+ "name", "ZAMBIA",
+ "fmt", "%N%n%O%n%A%n%Z %C",
+ "require", "AC",
+ }),
+ ZW(new String[]{
+ "name", "ZIMBABWE",
+ }),
+ ZZ(new String[]{
+ "fmt", "%N%n%O%n%A%n%C",
+ "require", "AC",
+ "upper", "C",
+ "zip_name_type", "postal",
+ "state_name_type", "province",
+ });
+
+ private String jsonString;
+
+ private RegionDataEnum(String[] inputArray) {
+ jsonString = convertArrayToJsonString(inputArray);
+ }
+
+ String getJsonString() {
+ return jsonString;
+ }
+ }
+
+ static {
+ for (RegionDataEnum region : RegionDataEnum.values()) {
+ COUNTRY_FORMAT_MAP.put(region.toString(), region.getJsonString());
+ }
+ }
+
+ static Map<String, String> getCountryFormatMap() {
+ return COUNTRY_FORMAT_MAP;
+ }
+
+ /**
+ * Assumes the array is a well-formed array - i.e., there are no unmatched keys in the input.
+ * Package-private so it can be accessed by tests.
+ */
+ static String convertArrayToJsonString(String[] input) {
+ JSONObject object = new JSONObject();
+ for (int i = 0; i < input.length; i += 2) {
+ try {
+ object.put(input[i], input[i + 1]);
+ } catch (JSONException e) {
+ // Ignore for now.
+ }
+ }
+ return object.toString();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/SimpleClientCacheManager.java b/java/src/com/android/i18n/addressinput/SimpleClientCacheManager.java
new file mode 100644
index 0000000..c8943ea
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/SimpleClientCacheManager.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+/**
+ * A simple implementation of ClientCacheManager which doesn't do any caching on its own.
+ */
+public class SimpleClientCacheManager implements ClientCacheManager {
+ // URL to get public address data.
+ private static final String PUBLIC_ADDRESS_SERVER = "http://i18napis.appspot.com/address";
+
+ @Override
+ public String get(String key) {
+ return "";
+ }
+
+ @Override
+ public void put(String key, String data) {
+ }
+
+ @Override
+ public String getAddressServerUrl() {
+ return PUBLIC_ADDRESS_SERVER;
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/StandardAddressVerifier.java b/java/src/com/android/i18n/addressinput/StandardAddressVerifier.java
new file mode 100644
index 0000000..fccb24b
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/StandardAddressVerifier.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import static com.android.i18n.addressinput.AddressField.ADMIN_AREA;
+import static com.android.i18n.addressinput.AddressField.COUNTRY;
+import static com.android.i18n.addressinput.AddressField.DEPENDENT_LOCALITY;
+import static com.android.i18n.addressinput.AddressField.LOCALITY;
+import static com.android.i18n.addressinput.AddressField.ORGANIZATION;
+import static com.android.i18n.addressinput.AddressField.POSTAL_CODE;
+import static com.android.i18n.addressinput.AddressField.RECIPIENT;
+import static com.android.i18n.addressinput.AddressField.SORTING_CODE;
+import static com.android.i18n.addressinput.AddressField.STREET_ADDRESS;
+
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Performs various consistency checks on an AddressData. This uses a {@link FieldVerifier} to check
+ * each field in the address.
+ */
+public class StandardAddressVerifier {
+
+ protected final FieldVerifier mRootVerifier;
+
+ protected final VerifierRefiner mRefiner;
+
+ protected final Map<AddressField, List<AddressProblemType>> mProblemMap;
+
+ /**
+ * Uses the rootVerifier and {@link #DEFAULT_REFINER} to perform the standard checks on the
+ * address fields, as defined in {@link StandardChecks}.
+ */
+ public StandardAddressVerifier(FieldVerifier rootVerifier) {
+ this(rootVerifier, DEFAULT_REFINER, StandardChecks.PROBLEM_MAP);
+ }
+
+ /**
+ * Uses the rootVerifier and the refiner to perform the standard checks on the address fields,
+ * as defined in {@link StandardChecks}.
+ */
+ public StandardAddressVerifier(FieldVerifier rootVerifier, VerifierRefiner refiner) {
+ this(rootVerifier, refiner, StandardChecks.PROBLEM_MAP);
+ }
+
+ /**
+ * Uses the rootVerifier and {@link #DEFAULT_REFINER} to perform the given checks on the address
+ * fields. A reference to problemMap is maintained. It is not modified by this class, and should
+ * not be modified subsequent to this call.
+ */
+ public StandardAddressVerifier(FieldVerifier rootVerifier,
+ Map<AddressField, List<AddressProblemType>> problemMap) {
+ this(rootVerifier, DEFAULT_REFINER, problemMap);
+ }
+
+ /**
+ * Uses the rootVerifier and the refiner to perform the given checks on the address fields. A
+ * reference to problemMap is maintained. It is not modified by this class, and should not be
+ * modified subsequent to this call.
+ */
+ public StandardAddressVerifier(FieldVerifier rootVerifier, VerifierRefiner refiner,
+ Map<AddressField, List<AddressProblemType>> problemMap) {
+ mRootVerifier = rootVerifier;
+ mRefiner = refiner;
+ mProblemMap = StandardChecks.PROBLEM_MAP;
+ }
+
+ public void verify(AddressData address, AddressProblems problems) {
+ NotifyingListener listener = new NotifyingListener(this);
+ verifyAsync(address, problems, listener);
+ try {
+ listener.waitLoadingEnd();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void verifyAsync(AddressData address, AddressProblems problems,
+ DataLoadListener listener) {
+ Thread verifier = new Thread(new Verifier(address, problems, listener));
+ verifier.start();
+ }
+
+ private class Verifier implements Runnable {
+ private AddressData mAddress;
+ private AddressProblems mProblems;
+ private DataLoadListener mListener;
+
+ Verifier(AddressData address, AddressProblems problems, DataLoadListener listener) {
+ mAddress = address;
+ mProblems = problems;
+ mListener = listener;
+ }
+
+ @Override
+ public void run() {
+ mListener.dataLoadingBegin();
+
+ FieldVerifier v = mRootVerifier;
+
+ ScriptType script = null;
+ if (mAddress.getLanguageCode() != null) {
+ if (Util.isExplicitLatinScript(mAddress.getLanguageCode())) {
+ script = ScriptType.LATIN;
+ } else {
+ script = ScriptType.LOCAL;
+ }
+ }
+
+ // The first four calls refine the verifier, so must come first, and in this
+ // order.
+ verifyField(script, v, COUNTRY, mAddress.getPostalCountry(), mProblems);
+ if (mProblems.isEmpty()) {
+ v = v.refineVerifier(mAddress.getPostalCountry());
+ verifyField(script, v, ADMIN_AREA, mAddress.getAdministrativeArea(), mProblems);
+ if (mProblems.isEmpty()) {
+ v = v.refineVerifier(mAddress.getAdministrativeArea());
+ verifyField(script, v, LOCALITY, mAddress.getLocality(), mProblems);
+ if (mProblems.isEmpty()) {
+ v = v.refineVerifier(mAddress.getLocality());
+ verifyField(script, v, DEPENDENT_LOCALITY,
+ mAddress.getDependentLocality(), mProblems);
+ if (mProblems.isEmpty()) {
+ v = v.refineVerifier(mAddress.getDependentLocality());
+ }
+ }
+ }
+ }
+
+ String street = Util.joinAndSkipNulls("\n", mAddress.getAddressLine1(),
+ mAddress.getAddressLine2());
+
+ // remaining calls don't change the field verifier
+ verifyField(script, v, POSTAL_CODE, mAddress.getPostalCode(), mProblems);
+ verifyField(script, v, STREET_ADDRESS, street, mProblems);
+ verifyField(script, v, SORTING_CODE, mAddress.getSortingCode(), mProblems);
+ verifyField(script, v, ORGANIZATION, mAddress.getOrganization(), mProblems);
+ verifyField(script, v, RECIPIENT, mAddress.getRecipient(), mProblems);
+
+ postVerify(v, mAddress, mProblems);
+
+ mListener.dataLoadingEnd();
+ }
+ }
+
+ /**
+ * Hook to perform any final processing using the final verifier. Default does no additional
+ * verification.
+ */
+ protected void postVerify(FieldVerifier verifier, AddressData address,
+ AddressProblems problems) {
+ }
+
+ /**
+ * Hook called by verify with each verifiable field, in order. Override to provide pre- or
+ * post-checks for all fields.
+ */
+ protected boolean verifyField(LookupKey.ScriptType script,
+ FieldVerifier verifier, AddressField field, String value,
+ AddressProblems problems) {
+ Iterator<AddressProblemType> iter = getProblemIterator(field);
+ while (iter.hasNext()) {
+ AddressProblemType prob = iter.next();
+ if (!verifyProblemField(script, verifier, prob, field, value, problems)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Hook for on-the-fly modification of the problem list. Override to change the problems to
+ * check for a particular field. Generally, changing the problemMap passed to the constructor
+ * is a better approach.
+ */
+ protected Iterator<AddressProblemType> getProblemIterator(AddressField field) {
+ List<AddressProblemType> list = mProblemMap.get(field);
+ if (list == null) {
+ list = Collections.emptyList();
+ }
+ return list.iterator();
+ }
+
+ /**
+ * Hook for adding special checks for particular problems and/or fields.
+ */
+ protected boolean verifyProblemField(LookupKey.ScriptType script,
+ FieldVerifier verifier, AddressProblemType problem, AddressField field,
+ String datum, AddressProblems problems) {
+ return verifier.check(script, problem, field, datum, problems);
+ }
+
+ /**
+ * This gets called with the hierarchical fields COUNTRY, ADMIN_AREA, LOCALITY,
+ * DEPENDENT_LOCALITY in order, returning the refined verifier at each step.
+ *
+ * <p>The default implementation is stateless, and delegates to the verifier to do the
+ * refinement.
+ */
+ public static class VerifierRefiner {
+
+ /**
+ * Refines the verifier. This delegates to the verifier to perform the refinement.
+ */
+ public FieldVerifier refineVerifier(FieldVerifier v, AddressField field,
+ String subkey) {
+ return v.refineVerifier(subkey);
+ }
+
+ /**
+ * Returns a clean version of the refiner. Since this implementation is stateless, returns
+ * this.
+ */
+ public VerifierRefiner newInstance() {
+ return this;
+ }
+ }
+
+ private static final VerifierRefiner DEFAULT_REFINER = new VerifierRefiner();
+}
diff --git a/java/src/com/android/i18n/addressinput/StandardChecks.java b/java/src/com/android/i18n/addressinput/StandardChecks.java
new file mode 100644
index 0000000..f243afd
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/StandardChecks.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Loader for a map defining the standard checks to perform on AddressFields.
+ */
+public class StandardChecks {
+
+ private StandardChecks() {
+ }
+
+ public static final Map<AddressField, List<AddressProblemType>> PROBLEM_MAP;
+
+ static {
+ Map<AddressField, List<AddressProblemType>> map =
+ new HashMap<AddressField, List<AddressProblemType>>();
+
+ addToMap(map, AddressField.COUNTRY, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD, AddressProblemType.UNKNOWN_VALUE);
+ addToMap(map, AddressField.ADMIN_AREA, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD, AddressProblemType.UNKNOWN_VALUE);
+ addToMap(map, AddressField.LOCALITY, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD, AddressProblemType.UNKNOWN_VALUE);
+ addToMap(map, AddressField.DEPENDENT_LOCALITY, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD, AddressProblemType.UNKNOWN_VALUE);
+ addToMap(map, AddressField.POSTAL_CODE, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD, AddressProblemType.UNRECOGNIZED_FORMAT,
+ AddressProblemType.MISMATCHING_VALUE);
+ addToMap(map, AddressField.STREET_ADDRESS, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD);
+ addToMap(map, AddressField.SORTING_CODE, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD);
+ addToMap(map, AddressField.ORGANIZATION, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD);
+ addToMap(map, AddressField.RECIPIENT, AddressProblemType.USING_UNUSED_FIELD,
+ AddressProblemType.MISSING_REQUIRED_FIELD);
+
+ PROBLEM_MAP = Collections.unmodifiableMap(map);
+ }
+
+ private static void addToMap(Map<AddressField, List<AddressProblemType>> map,
+ AddressField field,
+ AddressProblemType... problems) {
+ map.put(field, Collections.unmodifiableList(Arrays.asList(problems)));
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/Util.java b/java/src/com/android/i18n/addressinput/Util.java
new file mode 100644
index 0000000..0547543
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/Util.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utility functions used by the address widget.
+ */
+class Util {
+ /**
+ * This variable is in upper-case, since we convert the language code to upper case before doing
+ * string comparison.
+ */
+ private static final String LATIN_SCRIPT = "LATN";
+
+ /**
+ * Map of countries that have non-latin local names, with the language that their local names
+ * are in. We only list a country here if we have the appropriate data. Only language sub-tags
+ * are listed.
+ */
+ private static final Map<String, String> nonLatinLocalLanguageCountries =
+ new HashMap<String, String>();
+ static {
+ nonLatinLocalLanguageCountries.put("AM", "hy");
+ nonLatinLocalLanguageCountries.put("CN", "zh");
+ nonLatinLocalLanguageCountries.put("HK", "zh");
+ nonLatinLocalLanguageCountries.put("JP", "ja");
+ nonLatinLocalLanguageCountries.put("KP", "ko");
+ nonLatinLocalLanguageCountries.put("KR", "ko");
+ nonLatinLocalLanguageCountries.put("MO", "zh");
+ nonLatinLocalLanguageCountries.put("TH", "th");
+ nonLatinLocalLanguageCountries.put("TW", "zh");
+ nonLatinLocalLanguageCountries.put("VN", "vi");
+ }
+
+ /**
+ * Cannot instantiate this class - private constructor.
+ */
+ private Util() {
+ }
+
+ /**
+ * Returns true if the language code is explicitly marked to be in the latin script. For
+ * example, "zh-Latn" would return true, but "zh-TW", "en" and "zh" would all return false.
+ */
+ static boolean isExplicitLatinScript(String languageCode) {
+ // Convert to upper-case for easier comparison.
+ languageCode = languageCode.toUpperCase();
+ // Check to see if the language code contains a script modifier.
+ final Pattern languageCodePattern = Pattern.compile("\\w{2,3}[-_](\\w{4})");
+ Matcher m = languageCodePattern.matcher(languageCode);
+ if (m.lookingAt()) {
+ String script = m.group(1);
+ if (script.equals(LATIN_SCRIPT)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the language subtag of a language code. For example, returns "zh" if given "zh-Hans",
+ * "zh-CN" or other "zh" variants. If no language subtag can be found or the language tag is
+ * malformed, returns "und".
+ */
+ static String getLanguageSubtag(String languageCode) {
+ final Pattern languageCodePattern = Pattern
+ .compile("(\\w{2,3})(?:[-_]\\w{4})?(?:[-_]\\w{2})?");
+ Matcher m = languageCodePattern.matcher(languageCode);
+ if (m.matches()) {
+ return m.group(1).toLowerCase();
+ }
+ return "und";
+ }
+
+ /**
+ * Trims the string. If the field is empty after trimming, returns null instead. Note that this
+ * only trims ASCII white-space.
+ */
+ static String trimToNull(String originalStr) {
+ if (originalStr == null) {
+ return null;
+ }
+ String trimmedString = originalStr.trim();
+ return (trimmedString.length() == 0) ? null : trimmedString;
+ }
+
+ /**
+ * Throws an exception if the object is null, with a generic error message.
+ */
+ static void checkNotNull(Object o) throws NullPointerException {
+ checkNotNull(o, "This object should not be null.");
+ }
+
+ /**
+ * Throws an exception if the object is null, with the error message supplied.
+ */
+ static void checkNotNull(Object o, String message) throws NullPointerException {
+ if (o == null) {
+ throw new NullPointerException(message);
+ }
+ }
+
+ /**
+ * Joins input string with the given separator. If an input string is null, it will be skipped.
+ */
+ static String joinAndSkipNulls(String separator, String... strings) {
+ StringBuilder sb = null;
+ for (String s : strings) {
+ if (s != null) {
+ s = s.trim();
+ if (s.length() > 0) {
+ if (sb == null) {
+ sb = new StringBuilder(s);
+ } else {
+ sb.append(separator).append(s);
+ }
+ }
+ }
+ }
+ return sb == null ? null : sb.toString();
+ }
+
+ /**
+ * Builds a map of the lower-cased values of the keys, names and local names provided. Each name
+ * and local name is mapped to its respective key in the map.
+ *
+ * @throws IllegalStateException if the names or lnames array is greater than the keys array.
+ */
+ static Map<String, String> buildNameToKeyMap(String[] keys, String[] names, String[] lnames) {
+ if (keys == null) {
+ return null;
+ }
+
+ Map<String, String> nameToKeyMap = new HashMap<String, String>();
+
+ int keyLength = keys.length;
+ for (String k : keys) {
+ nameToKeyMap.put(k.toLowerCase(), k);
+ }
+ if (names != null) {
+ if (names.length > keyLength) {
+ throw new IllegalStateException(
+ "names length (" + names.length + ") is greater than keys length (" +
+ keys.length + ")");
+ }
+ for (int i = 0; i < keyLength; i++) {
+ // If we have less names than keys, we ignore all missing names. This happens
+ // generally because reg-ex splitting methods on different platforms (java, js etc)
+ // behave differently in the default case. Since missing names are fine, we opt to
+ // be more robust here.
+ if (i < names.length && names[i].length() > 0) {
+ nameToKeyMap.put(names[i].toLowerCase(), keys[i]);
+ }
+ }
+ }
+ if (lnames != null) {
+ if (lnames.length > keyLength) {
+ throw new IllegalStateException(
+ "lnames length (" + lnames.length + ") is greater than keys length (" +
+ keys.length + ")");
+ }
+ for (int i = 0; i < keyLength; i++) {
+ if (i < lnames.length && lnames[i].length() > 0) {
+ nameToKeyMap.put(lnames[i].toLowerCase(), keys[i]);
+ }
+ }
+ }
+ return nameToKeyMap;
+ }
+
+ /**
+ * Returns a language code that the widget can use when fetching data, based on a {@link
+ * java.util.Locale} language and the current selected country in the address widget. This
+ * method is necessary since we have to determine later whether a language is "local" or "latin"
+ * for certain countries.
+ *
+ * @param language the current user language
+ * @param currentCountry the current selected country
+ * @return a language code string in BCP-47 format (e.g. "en", "zh-Latn", "zh-Hans" or
+ * "en-US").
+ */
+ static String getWidgetCompatibleLanguageCode(Locale language, String currentCountry) {
+ String country = currentCountry.toUpperCase();
+ // Only do something if the country is one of those where we have names in the local
+ // language as well as in latin script.
+ if (nonLatinLocalLanguageCountries.containsKey(country)) {
+ String languageTag = language.getLanguage();
+ // Only do something if the language tag is _not_ the local language.
+ if (!languageTag.equals(nonLatinLocalLanguageCountries.get(country))) {
+ // Build up the language tag with the country and language specified, and add in the
+ // script-tag of "Latn" explicitly, since this is _not_ a local language. This means
+ // that we might create a language tag of "th-Latn", which is not what the actual
+ // language being used is, but it indicates that we prefer "Latn" names to whatever
+ // the local alternative was.
+ StringBuilder languageTagBuilder = new StringBuilder(languageTag);
+ languageTagBuilder.append("_latn");
+ if (language.getCountry().length() > 0) {
+ languageTagBuilder.append("_");
+ languageTagBuilder.append(language.getCountry());
+ }
+ return languageTagBuilder.toString();
+ }
+ }
+ return language.toString();
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/testing/AddressDataMapLoader.java b/java/src/com/android/i18n/addressinput/testing/AddressDataMapLoader.java
new file mode 100644
index 0000000..3310ea4
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/testing/AddressDataMapLoader.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput.testing;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Helper class to load JSON data for testing.
+ */
+public class AddressDataMapLoader {
+
+ private static final String DATA_PATH = "/countryinfo.txt";
+
+ private AddressDataMapLoader() {
+ }
+
+ public static final Map<String, String> DATA;
+
+ static {
+ DATA = new HashMap<String, String>();
+ try {
+ BufferedReader br = new BufferedReader(
+ new InputStreamReader(AddressDataMapLoader.class.getResourceAsStream(DATA_PATH),
+ "utf-8"));
+ String line = null;
+ while (null != (line = br.readLine())) {
+ line = line.trim();
+ if (line.length() == 0 || line.charAt(0) == '#') {
+ continue;
+ }
+ int x = line.indexOf('=');
+ DATA.put(line.substring(0, x), line.substring(x + 1));
+ }
+ } catch (IOException e) {
+ System.err.println("unable to create map: " + e.getMessage());
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/testing/AsyncTestCase.java b/java/src/com/android/i18n/addressinput/testing/AsyncTestCase.java
new file mode 100644
index 0000000..69c3020
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/testing/AsyncTestCase.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput.testing;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * An extension of TestCase that provides delayTestFinish() and finishTest() methods that behave
+ * like the corresponding methods in GWTTestCase for testing asynchronous code.
+ */
+public abstract class AsyncTestCase extends TestCase {
+ /**
+ * Tracks whether this test is completely done.
+ */
+ private boolean mTestIsFinished;
+
+ /**
+ * The system time in milliseconds when the test should time out.
+ */
+ private long mTestTimeoutMillis;
+
+ /**
+ * Puts the current test in asynchronous mode.
+ *
+ * @param timeoutMillis time to wait before failing the test for timing out
+ */
+ protected void delayTestFinish(int timeoutMillis) {
+ mTestTimeoutMillis = System.currentTimeMillis() + timeoutMillis;
+ }
+
+ /**
+ * Causes this test to succeed during asynchronous mode.
+ */
+ protected void finishTest() {
+ mTestIsFinished = true;
+ synchronized (this) {
+ notify();
+ }
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ mTestIsFinished = false;
+ mTestTimeoutMillis = 0;
+ super.runTest();
+
+ if (mTestTimeoutMillis > 0) {
+ long timeoutMillis = mTestTimeoutMillis - System.currentTimeMillis();
+ if (timeoutMillis > 0) {
+ synchronized (this) {
+ wait(timeoutMillis);
+ }
+ }
+ if (!mTestIsFinished) {
+ throw new TimeoutException("Waited " + timeoutMillis + " ms!");
+ }
+ }
+ }
+}
diff --git a/java/src/com/android/i18n/addressinput/testing/TestActivity.java b/java/src/com/android/i18n/addressinput/testing/TestActivity.java
new file mode 100644
index 0000000..4e6779e
--- /dev/null
+++ b/java/src/com/android/i18n/addressinput/testing/TestActivity.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput.testing;
+
+import android.app.Activity;
+
+public class TestActivity extends Activity {}
diff --git a/java/test/AndroidManifest.xml b/java/test/AndroidManifest.xml
new file mode 100644
index 0000000..f56a012
--- /dev/null
+++ b/java/test/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.i18n.addressinput"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="8"
+ android:targetSdkVersion="19" />
+
+ <instrumentation
+ android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="com.android.i18n.addressinput" />
+
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <application
+ android:allowBackup="false"
+ android:icon="@android:drawable/sym_def_app_icon" >
+ <uses-library android:name="android.test.runner" />
+ <activity android:name=".testing.TestActivity" />
+ </application>
+
+</manifest>
diff --git a/java/test/android/util/Log.java b/java/test/android/util/Log.java
new file mode 100644
index 0000000..71b3e91
--- /dev/null
+++ b/java/test/android/util/Log.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.util;
+
+/**
+ * Simple mock of Android logger class.
+ */
+public final class Log {
+ public static int v(String tag, String msg) { return 0; }
+ public static int v(String tag, String msg, Throwable tr) { return 0; }
+ public static int d(String tag, String msg) { return 0; }
+ public static int d(String tag, String msg, Throwable tr) { return 0; }
+ public static int i(String tag, String msg) { return 0; }
+ public static int i(String tag, String msg, Throwable tr) { return 0; }
+ public static int w(String tag, String msg) { return 0; }
+ public static int w(String tag, String msg, Throwable tr) { return 0; }
+ public static boolean isLoggable(String tag, int level) { return false; }
+ public static int w(String tag, Throwable tr) { return 0; }
+ public static int e(String tag, String msg) { return 0; }
+ public static int e(String tag, String msg, Throwable tr) { return 0; }
+ public static int wtf(String tag, String msg) { return 0; }
+ public static int wtf(String tag, Throwable tr) { return 0; }
+ public static int wtf(String tag, String msg, Throwable tr) { return 0; }
+}
diff --git a/java/test/build.gradle b/java/test/build.gradle
new file mode 100644
index 0000000..8d3c2f0
--- /dev/null
+++ b/java/test/build.gradle
@@ -0,0 +1,21 @@
+apply plugin: 'android-library'
+
+dependencies {
+ compile parent
+}
+
+android {
+ compileSdkVersion 19
+ buildToolsVersion '19.1.0'
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java {
+ srcDir '.'
+ exclude 'android/**'
+ }
+ resources.srcDirs = ['../../testdata']
+ }
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/AddressDataTest.java b/java/test/com/android/i18n/addressinput/AddressDataTest.java
new file mode 100644
index 0000000..7b211b4
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AddressDataTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the AddressData class.
+ */
+public class AddressDataTest extends TestCase {
+ private static final String ADDRESS_LINE = "First address line";
+
+ public void testSetAddressLine() {
+ AddressData.Builder builder = new AddressData.Builder();
+ builder = builder.setAddress("\n " + ADDRESS_LINE);
+ AddressData ad = builder.build();
+ assertEquals(ADDRESS_LINE, ad.getAddressLine1());
+ assertEquals(null, ad.getAddressLine2());
+ }
+
+ public void testAddressLineNormalisation() {
+ AddressData address = new AddressData.Builder().setAddressLine1(null)
+ .setAddressLine2(ADDRESS_LINE).build();
+ AddressData copiedAddress = new AddressData.Builder(address).build();
+ assertEquals(ADDRESS_LINE, copiedAddress.getAddressLine1());
+ assertEquals(null, copiedAddress.getAddressLine2());
+ }
+
+ public void testAddressLineNormalisationWithNewLineCharacters() {
+ AddressData address =
+ new AddressData.Builder().setAddressLine1(ADDRESS_LINE + "\n" + ADDRESS_LINE).build();
+ AddressData copiedAddress = new AddressData.Builder(address).build();
+ assertEquals(ADDRESS_LINE, copiedAddress.getAddressLine1());
+ assertEquals(ADDRESS_LINE, copiedAddress.getAddressLine2());
+ }
+
+ public void testNoAdminArea() {
+ AddressData address = new AddressData.Builder().build();
+ assertEquals(null, address.getAdministrativeArea());
+ }
+
+ public void testSetLanguageCode() throws Exception {
+ AddressData address = new AddressData.Builder().setCountry("TW")
+ // Taipei City
+ .setAdminArea("\u53F0\u5317\u5E02")
+ // Da-an District
+ .setLocality("\u5927\u5B89\u5340")
+ .build();
+ address = new AddressData.Builder(address).setLanguageCode("zh-latn").build();
+ assertEquals("zh-latn", address.getLanguageCode());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/AddressFieldTest.java b/java/test/com/android/i18n/addressinput/AddressFieldTest.java
new file mode 100644
index 0000000..3419097
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AddressFieldTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the AddressField enum.
+ */
+public class AddressFieldTest extends TestCase {
+
+ public void testOf() throws Exception {
+ assertEquals(AddressField.COUNTRY, AddressField.of('R'));
+ }
+
+ public void testGetChar() throws Exception {
+ assertEquals('R', AddressField.COUNTRY.getChar());
+ }
+
+ public void testGetAttributeName() throws Exception {
+ assertEquals("name", AddressField.RECIPIENT.getAttributeName());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/AddressProblemsTest.java b/java/test/com/android/i18n/addressinput/AddressProblemsTest.java
new file mode 100644
index 0000000..14cef05
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AddressProblemsTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the AddressProblems class.
+ */
+public class AddressProblemsTest extends TestCase {
+ public void testAddError() {
+ AddressProblems ap = new AddressProblems();
+ ap.add(AddressField.POSTAL_CODE, AddressProblemType.MISSING_REQUIRED_FIELD);
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ ap.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ public void testEmptyErrorList() {
+ AddressProblems ap = new AddressProblems();
+ assertNull(ap.getProblem(AddressField.POSTAL_CODE));
+ assertTrue(ap.isEmpty());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/AddressVerificationDataTest.java b/java/test/com/android/i18n/addressinput/AddressVerificationDataTest.java
new file mode 100644
index 0000000..b57955a
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AddressVerificationDataTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.AddressDataMapLoader;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests to ensure that {@code AddressVerificationData} can parse all the default data.
+ */
+public class AddressVerificationDataTest extends TestCase {
+
+ private static final AddressVerificationData ADDRESS_DATA =
+ new AddressVerificationData(AddressDataMapLoader.DATA);
+
+ public void testParseAllData() {
+ for (String key : ADDRESS_DATA.keys()) {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get(key);
+ assertNotNull(key + " maps to null value.", nodeData);
+ assertNotNull("Id is required", nodeData.get(AddressDataKey.ID));
+ }
+ }
+
+ public void testLoadingCountries() {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get("data");
+ String[] countries = nodeData.get(AddressDataKey.COUNTRIES).split("~");
+ assertTrue(countries.length > 0);
+ }
+
+ public void testUsData() {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get("data/US");
+ assertEquals("data/US", nodeData.get(AddressDataKey.ID));
+ assertNotNull(nodeData.get(AddressDataKey.SUB_KEYS));
+ assertNotNull(nodeData.get(AddressDataKey.SUB_NAMES));
+ assertEquals("en", nodeData.get(AddressDataKey.LANG));
+ }
+
+ public void testCaData() {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get("data/CA");
+ String names = nodeData.get(AddressDataKey.SUB_NAMES);
+ String keys = nodeData.get(AddressDataKey.SUB_KEYS);
+
+ assertEquals("data/CA", nodeData.get(AddressDataKey.ID));
+ assertEquals("en", nodeData.get(AddressDataKey.LANG));
+
+ assertEquals("AB~BC~MB~NB~NL~NT~NS~NU~ON~PE~QC~SK~YT", keys);
+ assertEquals("Alberta~British Columbia~Manitoba~New Brunswick" +
+ "~Newfoundland and Labrador~Northwest Territories~Nova Scotia~Nunavut" +
+ "~Ontario~Prince Edward Island~Quebec~Saskatchewan~Yukon",
+ names);
+ }
+
+ public void testCaFrenchData() {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get("data/CA--fr");
+ String names = nodeData.get(AddressDataKey.SUB_NAMES);
+ String keys = nodeData.get(AddressDataKey.SUB_KEYS);
+
+ assertEquals("data/CA--fr", nodeData.get(AddressDataKey.ID));
+ assertEquals("fr", nodeData.get(AddressDataKey.LANG));
+ assertEquals("AB~BC~PE~MB~NB~NS~NU~ON~QC~SK~NL~NT~YT", keys);
+ assertTrue(names.contains("Colombie"));
+ }
+
+ public void testBackSlashUnEscaped() {
+ for (String lookupKey : ADDRESS_DATA.keys()) {
+ AddressVerificationNodeData nodeData = ADDRESS_DATA.get(lookupKey);
+ for (AddressDataKey dataKey : AddressDataKey.values()) {
+ String val = nodeData.get(dataKey);
+ if (val != null) {
+ assertFalse("Backslashes need to be unescaped: " + val, val.contains("\\\\"));
+ }
+ }
+ }
+
+ // Spot check.
+ assertEquals("Kazhakstan's postal code pattern mismatched", "\\d{6}",
+ ADDRESS_DATA.get("data/KZ").get(AddressDataKey.ZIP));
+ }
+
+ public void testExampleData() {
+ assertNotNull("Expects example data.", AddressDataMapLoader.DATA.get("examples"));
+ assertNotNull("Expects example US address.",
+ AddressDataMapLoader.DATA.get("examples/US/local/en"));
+ assertEquals("'examples/TW/local/zh_Hant' and 'examples/TW/local/_default' should " +
+ "return same value.",
+ AddressDataMapLoader.DATA.get("examples/TW/local/zh_Hant"),
+ AddressDataMapLoader.DATA.get("examples/TW/local/_default"));
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/AddressWidgetUiComponentProviderTest.java b/java/test/com/android/i18n/addressinput/AddressWidgetUiComponentProviderTest.java
new file mode 100644
index 0000000..b9c08bd
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AddressWidgetUiComponentProviderTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.TestActivity;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import junit.framework.Assert;
+
+/**
+ * Test class for {@link AddressWidgetUiComponentProvider}.
+ */
+public class AddressWidgetUiComponentProviderTest
+ extends ActivityInstrumentationTestCase2<TestActivity> {
+ private AddressWidget widget;
+ private AddressWidgetUiComponentProvider componentProvider;
+ private LinearLayout container;
+ private AddressData address;
+ private Context context;
+ private int customTextViewCounter;
+ private int customProgressDialogCounter;
+
+ public AddressWidgetUiComponentProviderTest() {
+ super(TestActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ AddressData.Builder builder = new AddressData.Builder()
+ .setCountry("US")
+ .setLanguageCode("en")
+ .setAddressLine1("1098 Alta Ave")
+ .setAdminArea("CA");
+ address = builder.build();
+ context = getActivity();
+ container = new LinearLayout(context);
+ }
+
+ public void testCustomWidgets() {
+ customTextViewCounter = 0;
+ customProgressDialogCounter = 0;
+ componentProvider = new TestComponentProvider(context);
+ widget = new AddressWidget(context, container, new FormOptions.Builder().build(),
+ new SimpleClientCacheManager(), componentProvider);
+ widget.renderFormWithSavedAddress(address);
+
+ for (AddressField field : AddressField.values()) {
+ if (field.equals(AddressField.COUNTRY)) {
+ continue;
+ }
+
+ View view = widget.getViewForField(field);
+ if (view instanceof EditText) {
+ assertTrue("Field " + field + " does not use customized edit text widget.",
+ view instanceof CustomEditText);
+ } else if (view instanceof Spinner) {
+ assertTrue("Field " + field + " does not use customized spinner widget.",
+ view instanceof CustomSpinner);
+ assertTrue("Field " + field + " does not use customized ArrayAdapter.",
+ ((Spinner) view).getAdapter() instanceof CustomArrayAdapter);
+ }
+ }
+
+ assertTrue("Custom TextView label not used.", customTextViewCounter > 0);
+ assertTrue("Custom ProgressDialog not used.", customProgressDialogCounter > 0);
+ }
+
+ private void increaseTextViewCounter() {
+ customTextViewCounter++;
+ }
+
+ private void increaseProgressDialogCounter() {
+ customProgressDialogCounter++;
+ }
+
+ private class CustomEditText extends EditText {
+ CustomEditText(Context context) {
+ super(context);
+ }
+ }
+
+ private class CustomSpinner extends Spinner {
+ CustomSpinner(Context context) {
+ super(context);
+ }
+ }
+
+ private class CustomArrayAdapter<String> extends ArrayAdapter {
+ CustomArrayAdapter(Context context, int id) {
+ super(context, id);
+ }
+ }
+
+ private class TestComponentProvider extends AddressWidgetUiComponentProvider {
+ TestComponentProvider(Context context) {
+ super(context);
+ }
+
+ protected TextView createUiLabel(CharSequence label, AddressField.WidthType widthType) {
+ TextView result = new TextView(mContext);
+ result.setText(label);
+ AddressWidgetUiComponentProviderTest.this.increaseTextViewCounter();
+ return result;
+ }
+
+ protected EditText createUiTextField(AddressField.WidthType widthType) {
+ return new CustomEditText(mContext);
+ }
+
+ protected Spinner createUiPickerSpinner(AddressField.WidthType widthType) {
+ return new CustomSpinner(mContext);
+ }
+
+ protected ArrayAdapter<String> createUiPickerAdapter(AddressField.WidthType widthType) {
+ ArrayAdapter<String> result =
+ new CustomArrayAdapter<String>(
+ mContext, android.R.layout.simple_spinner_item);
+ result.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ return result;
+ }
+
+ protected ProgressDialog getUiActivityIndicatorView() {
+ AddressWidgetUiComponentProviderTest.this.increaseProgressDialogCounter();
+ return super.getUiActivityIndicatorView();
+ }
+ }
+}
+ \ No newline at end of file
diff --git a/java/test/com/android/i18n/addressinput/AsyncTestCaseTest.java b/java/test/com/android/i18n/addressinput/AsyncTestCaseTest.java
new file mode 100644
index 0000000..23fad88
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/AsyncTestCaseTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.AsyncTestCase;
+
+import junit.framework.AssertionFailedError;
+
+import java.util.concurrent.TimeoutException;
+
+public class AsyncTestCaseTest extends AsyncTestCase {
+
+ public void testSuccess() {
+ delayTestFinish(1000);
+ AsyncCallback.execute(500, new Runnable() {
+ @Override
+ public void run() {
+ finishTest();
+ }
+ });
+ }
+
+ public void testFailure() {
+ expectTimeout = true;
+ delayTestFinish(1000);
+ AsyncCallback.execute(1500, new Runnable() {
+ @Override
+ public void run() {
+ finishTest();
+ }
+ });
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ expectTimeout = false;
+ try {
+ super.runTest();
+ } catch (TimeoutException e) {
+ if (expectTimeout) {
+ return;
+ } else {
+ throw e;
+ }
+ }
+ if (expectTimeout) {
+ throw new AssertionFailedError("Test case did not time out.");
+ }
+ }
+
+ private boolean expectTimeout;
+
+ /**
+ * Helper class to perform an asynchronous callback after a specified delay.
+ */
+ private static class AsyncCallback extends Thread {
+ public static void execute(long waitMillis, Runnable callback) {
+ (new AsyncCallback(waitMillis, callback)).start();
+ }
+
+ @Override
+ public void run() {
+ try {
+ synchronized (this) {
+ wait(mWaitMillis);
+ }
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ mCallback.run();
+ }
+
+ private AsyncCallback(long waitMillis, Runnable callback) {
+ this.mWaitMillis = waitMillis;
+ this.mCallback = callback;
+ }
+
+ private long mWaitMillis;
+ private Runnable mCallback;
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/CacheDataTest.java b/java/test/com/android/i18n/addressinput/CacheDataTest.java
new file mode 100644
index 0000000..c346882
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/CacheDataTest.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.AddressDataMapLoader;
+import com.android.i18n.addressinput.testing.AsyncTestCase;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class CacheDataTest extends AsyncTestCase {
+ private CacheData cache;
+
+ private static final String DELIM = "~";
+
+ private static final String CANADA_KEY = "data/CA";
+
+ private static final String US_KEY = "data/US";
+
+ private static final String CALIFORNIA_KEY = "data/US/CA";
+
+ private static final String RANDOM_COUNTRY_KEY = "data/asIOSDxcowW";
+
+ private static final String EXAMPLE_LOCAL_US_KEY = "examples/US/local/_default";
+
+ // Data key for Da-an District, Taipei Taiwan
+ private static final String TW_KEY = "data/TW/\u53F0\u5317\u5E02/\u5927\u5B89\u5340";
+
+ private static final String FRANCE_KEY = "data/FR";
+
+ private static Integer listenerInvokeCount = 0;
+
+ private static boolean reachedMaxCount = false;
+
+ @Override
+ public void setUp() {
+ cache = new CacheData();
+ }
+
+ public void testJsonConstructor() {
+ // Creating cache with content.
+ String id = "data/CA";
+ JSONObject jsonObject = null;
+ try {
+ jsonObject = new JSONObject(AddressDataMapLoader.DATA.get(id));
+ } catch (JSONException jsonException) {
+ // If this throws an exception the test fails.
+ fail("Can't parse json object");
+ }
+ cache.addToJsoMap(id, jsonObject);
+ String toBackup = cache.getJsonString();
+
+ // Creating cache from saved data.
+ cache = new CacheData(toBackup);
+ assertTrue(cache.containsKey(id));
+ }
+
+ public void testJsonConstructorTruncatedProperString() {
+ // Creating cache with content.
+ String id = "data/CA";
+ try {
+ JSONObject jsonObject = new JSONObject(AddressDataMapLoader.DATA.get(id));
+ String jsonString = jsonObject.toString();
+ jsonString = jsonString.substring(0, jsonString.length() / 2);
+
+ cache = new CacheData(jsonString);
+ assertTrue(cache.toString(), cache.isEmpty());
+ } catch (JSONException jsonException) {
+ // If this throws an exception the test fails.
+ fail("Can't parse json object");
+ }
+ }
+
+ public void testSimpleFetching() {
+ final LookupKey key = new LookupKey.Builder(CANADA_KEY).build();
+
+ delayTestFinish(10000);
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+ JsoMap map = cache.getObj(CANADA_KEY);
+
+ assertTrue(map.containsKey(AddressDataKey.ID.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.LANG.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.ZIP.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.FMT.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.SUB_KEYS.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.SUB_NAMES.name().toLowerCase()));
+ assertFalse(map.containsKey(AddressDataKey.SUB_LNAMES.name().toLowerCase()));
+
+ int namesSize =
+ map.get(AddressDataKey.SUB_NAMES.name().toLowerCase()).split(DELIM).length;
+ int keysSize =
+ map.get(AddressDataKey.SUB_KEYS.name().toLowerCase()).split(DELIM).length;
+
+ assertEquals("Expect 13 states in Canada.", 13, namesSize);
+ assertEquals(namesSize, keysSize);
+ finishTest();
+ }
+ });
+ }
+
+ public void testFetchingTaiwanData() {
+ final LookupKey key = new LookupKey.Builder(TW_KEY).build();
+
+ delayTestFinish(10000);
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+
+ JsoMap map = cache.getObj(TW_KEY);
+
+ assertTrue(map.containsKey(AddressDataKey.ID.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.KEY.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.LANG.name().toLowerCase()));
+ assertTrue(map.containsKey(AddressDataKey.ZIP.name().toLowerCase()));
+ assertFalse(map.containsKey(AddressDataKey.FMT.name().toLowerCase()));
+ assertFalse(map.containsKey(AddressDataKey.SUB_KEYS.name().toLowerCase()));
+ assertFalse(map.containsKey(AddressDataKey.SUB_NAMES.name().toLowerCase()));
+ assertFalse(map.containsKey(AddressDataKey.SUB_LNAMES.name().toLowerCase()));
+
+ // Da-an district.
+ assertEquals("\u5927\u5B89\u5340",
+ map.get(AddressDataKey.KEY.name().toLowerCase()));
+
+ assertEquals("zh-hant", map.get(AddressDataKey.LANG.name().toLowerCase()));
+
+ finishTest();
+ }
+ });
+ }
+
+ public void testFetchingExamples() {
+ final LookupKey key = new LookupKey.Builder(EXAMPLE_LOCAL_US_KEY).build();
+
+ delayTestFinish(10000);
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+
+ JsoMap map = cache.getObj(EXAMPLE_LOCAL_US_KEY);
+ assertTrue(map.containsKey("name"));
+ finishTest();
+ }
+ });
+ }
+
+ public void testFetchingOneKeyManyTimes() {
+ final LookupKey key = new LookupKey.Builder(CALIFORNIA_KEY).build();
+ final int maxCount = 10;
+
+ class CounterListener implements DataLoadListener {
+ @Override
+ public void dataLoadingBegin() {
+ listenerInvokeCount++;
+ if (listenerInvokeCount == maxCount) {
+ reachedMaxCount = true;
+ }
+ assertTrue("CounterListener's dataLoadingBegin should not be invoked for more " +
+ "than " + maxCount + " times",
+ listenerInvokeCount <= maxCount);
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ listenerInvokeCount--;
+ assertTrue(listenerInvokeCount >= 0);
+ if (listenerInvokeCount == 0) {
+ assertTrue("Expect to see key " + key + " cached when CounterListener's " +
+ " dataLoadingEnd is invoked",
+ cache.containsKey(key.toString()));
+ assertTrue("Expect CounterListener's dataLoadingEnd to be triggered " +
+ maxCount + " times in total", reachedMaxCount);
+ finishTest();
+ }
+ }
+ }
+
+ delayTestFinish(10000);
+
+ for (int i = 0; i < maxCount; ++i) {
+ cache.fetchDynamicData(key, null, new CounterListener());
+ }
+
+ // Null listeners should not affect results.
+ cache.fetchDynamicData(key, null, null);
+ cache.fetchDynamicData(key, null, null);
+ cache.fetchDynamicData(key, null, null);
+ }
+
+ public void testFetchAgainRightAfterOneFetchStart() {
+ final LookupKey key = new LookupKey.Builder(US_KEY).build();
+
+ delayTestFinish(10000);
+
+ cache.fetchDynamicData(key, null, null);
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ assertFalse("data for key " + key + " should not be fetched yet",
+ cache.containsKey(key.toString()));
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+
+ assertTrue(cache.containsKey(key.toString()));
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled2 = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled2 = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled2);
+
+ assertTrue(cache.containsKey(key.toString()));
+ finishTest();
+ }
+ });
+ }
+ });
+ }
+
+ public void testInvalidKey() {
+ final LookupKey key = new LookupKey.Builder(RANDOM_COUNTRY_KEY).build();
+
+ delayTestFinish(15000);
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+ assertFalse(cache.containsKey(key.toString()));
+
+ finishTest();
+ }
+ });
+ }
+
+ public void testSetUrl() {
+ final LookupKey key = new LookupKey.Builder(FRANCE_KEY).build();
+ final String originalUrl = cache.getUrl();
+
+ assertFalse(FRANCE_KEY + " should not be in the cache. Do you request it before this test?",
+ cache.containsKey(key.toString()));
+
+ delayTestFinish(10000);
+ // Something that is not an URL.
+ cache.setUrl("FDSSfdfdsfasdfadsf");
+
+ cache.fetchDynamicData(key, null, new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+ assertFalse(cache.containsKey(key.toString()));
+ cache.setUrl(originalUrl);
+ finishTest();
+ }
+ });
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/ClientDataTest.java b/java/test/com/android/i18n/addressinput/ClientDataTest.java
new file mode 100644
index 0000000..570434e
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/ClientDataTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.AsyncTestCase;
+
+/**
+ * Tests for the ClientData class, to ensure it uses the cache data to correctly fetch data from the
+ * server and recovers if no data is present.
+ */
+public class ClientDataTest extends AsyncTestCase {
+ private ClientData client;
+
+ @Override
+ public void setUp() {
+ client = new ClientData(new CacheData());
+ }
+
+ public void testGet() {
+ AddressVerificationNodeData data = client.get("data");
+ assertNotNull(data);
+ }
+
+ public void testGet2() {
+ AddressVerificationNodeData data;
+
+ data = client.get("data");
+ assertNotNull(data);
+
+ data = client.get("data");
+ assertNotNull(data);
+ }
+
+ public void testPrefetchCountry() {
+ delayTestFinish(60000);
+
+ client.prefetchCountry("TW", new DataLoadListener() {
+ boolean beginCalled = false;
+
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called", beginCalled);
+ // Currently this test only tests that the execution doesn't crash and eventually
+ // terminates. TODO: Write test cases to verify that correct data is loaded.
+ finishTest();
+ }
+ });
+ }
+
+ public void testFetchDataWithBadServer() {
+ CacheData badCache = new CacheData();
+ badCache.setUrl("http://www.google.com");
+ ClientData badServerClient = new ClientData(badCache);
+
+ AddressVerificationNodeData data = badServerClient.get("data/US");
+
+ // No data was available on the server or in the cache - it should check
+ // that there is nothing in region data constants, and should return the
+ // data from there.
+ assertNotNull(data);
+ String unitedStatesFormatInfo = data.get(AddressDataKey.FMT);
+ assertEquals("%N%n%O%n%A%n%C %S %Z", unitedStatesFormatInfo);
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/FieldVerifierTest.java b/java/test/com/android/i18n/addressinput/FieldVerifierTest.java
new file mode 100644
index 0000000..6521a5a
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/FieldVerifierTest.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.testing.AddressDataMapLoader;
+
+import junit.framework.TestCase;
+
+/**
+ * Spot check the standard data set for various cases of interest. This is not an exhaustive test.
+ */
+public class FieldVerifierTest extends TestCase {
+
+ private static final StandardAddressVerifier VERIFIER =
+ new StandardAddressVerifier(new FieldVerifier(
+ new AddressVerificationData(AddressDataMapLoader.DATA)));
+
+ private AddressProblems problems = new AddressProblems();
+
+ @Override
+ protected void setUp() {
+ problems.clear();
+ }
+
+ public void testUnitedStatesOk() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setAddress("1234 Somewhere")
+ .setPostalCode("94025").build();
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty()); // no mismatch
+ }
+
+ public void testUnitedStatesZipMismatch() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setPostalCode("12345").build();
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISMATCHING_VALUE,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ public void testUnitedStatesNotOk() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality(null)
+ .setDependentLocality("Foo Bar")
+ .setPostalCode("12345").build();
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISMATCHING_VALUE,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.LOCALITY));
+ }
+
+ public void testChinaOk() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Beijing Shi")
+ .setLocality("Xicheng Qu")
+ .setAddress("Yitiao Lu")
+ .setPostalCode("123456").build();
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.isEmpty());
+ }
+
+ public void testGermanAddress() {
+ AddressData addr = new AddressData.Builder().setCountry("DE")
+ .setLocality("Berlin")
+ .setAddress("Huttenstr. 50")
+ .setPostalCode("10553")
+ .setOrganization("BMW AG Niederkassung Berlin")
+ .setRecipient("Herr Diefendorf").build();
+
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.isEmpty());
+
+ // Clones address but leave city empty.
+ addr = new AddressData.Builder().set(addr).setLocality(null).build();
+
+ VERIFIER.verify(addr, problems);
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.LOCALITY));
+ }
+
+ public void testIrishAddress() {
+ AddressData addr = new AddressData.Builder().setCountry("IE")
+ .setLocality("Dublin")
+ .setAdminArea("Co. Dublin")
+ .setAddress("7424 118 Avenue NW")
+ .setRecipient("Conan O'Brien").build();
+
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+
+ // Clones address but leave county empty. This address should be valid
+ // since county is not required.
+ addr = new AddressData.Builder().set(addr).setAdminArea(null).build();
+
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testChinaPostalCodeBadFormat() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Beijing Shi")
+ .setLocality("Xicheng Qu")
+ .setPostalCode("12345").build();
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ /**
+ * If there is a postal code pattern for a certain country, and the input postal code is empty,
+ * it should not be reported as bad postal code format. Whether empty postal code is ok should
+ * be determined by checks for required fields.
+ */
+ public void testEmptyPostalCodeReportedAsGoodFormat() {
+ // Chilean address has a postal code format pattern, but does not require
+ // postal code. The following address is valid.
+ AddressData addr = new AddressData.Builder().setCountry("CL")
+ .setAddressLine1("GUSTAVO LE PAIGE ST #159")
+ .setAdminArea("Atacama")
+ .setLocality("San Pedro")
+ .setPostalCode("")
+ .build();
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+
+ problems.clear();
+
+ // Now check for US addresses, which require a postal code. The following
+ // address's postal code is wrong because it is missing a required field, not
+ // because it doesn't match the expected postal code pattern.
+ addr = new AddressData.Builder().setCountry("US").setPostalCode("").build();
+ problems.clear();
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ public void testChinaTaiwanOk() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Taiwan")
+ .setLocality("Taichung City")
+ .setDependentLocality("Situn District")
+ .setAddress("12345 Yitiao Lu")
+ .setPostalCode("407").build();
+ VERIFIER.verify(addr, problems);
+ assertTrue(problems.isEmpty());
+ }
+
+ public void testChinaTaiwanUnknownDistrict() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Taiwan")
+ .setLocality("Taichung City")
+ .setDependentLocality("Foo Bar")
+ .setPostalCode("400").build();
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.UNKNOWN_VALUE,
+ problems.getProblem(AddressField.DEPENDENT_LOCALITY));
+ }
+
+ public void testStreetVerification() {
+ // Missing street address
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setPostalCode("94025").build();
+
+ assertNull(addr.getAddressLine1());
+ assertNull(addr.getAddressLine2());
+
+ VERIFIER.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.STREET_ADDRESS));
+ }
+
+ // Tests The Bahamas' address
+ public void failingtestBahamas() {
+ final AddressData address =
+ new AddressData.Builder().setAddress("Abaco Beach Resort & Boat Habour")
+ .setLocality("Treasure Cay")
+ .setAdminArea("Abaco")
+ .setCountry("BS").build();
+ VERIFIER.verify(address, problems);
+ assertTrue(problems.isEmpty());
+ }
+
+ public void testJapan() {
+ // Added AdminArea since address verification can't infer it from Kyoto City
+ // Commented out dependent locality since we don't have the data for this and in fact say
+ // that it shouldn't be used for Japan.
+ // TODO: support inference of higher levels from lower ones
+ final AddressData address = new AddressData.Builder()
+ .setRecipient("\u5BAE\u672C \u8302") // SHIGERU_MIYAMOTO
+ .setAddress("\u4E0A\u9CE5\u7FBD\u927E\u7ACB\u753A11\u756A\u5730")
+ .setAdminArea("\u4eac\u90fd\u5e9c") // Kyoto prefecture, added
+ .setLocality("\u4EAC\u90FD\u5E02") // Kyoto city
+ // .setDependentLocality("\u5357\u533A")
+ .setCountry("JP")
+ .setPostalCode("601-8501").build();
+ VERIFIER.verify(address, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testJapanLatin() {
+ // added AdminArea since address verification can't infer it from Kyoto City
+ // commented out dependent locality since address verification doesn't use it
+ final AddressData address = new AddressData.Builder()
+ .setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH
+ .setAddress("11-1 Kamitoba-hokotate-cho")
+ .setAdminArea("KYOTO") // added
+ .setLocality("Kyoto")
+ // .setDependentLocality("Minami-ku")
+ .setLanguageCode("ja_Latn")
+ .setCountry("JP")
+ .setPostalCode("601-8501").build();
+ VERIFIER.verify(address, problems);
+ assertTrue(problems.isEmpty());
+ }
+
+ public void testJapanLatinInvalidAdmin() {
+ final AddressData address = new AddressData.Builder()
+ .setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH
+ .setAddress("11-1 Kamitoba-hokotate-cho")
+ .setAdminArea("Fake Admin")
+ .setLocality("Kyoto")
+ .setLanguageCode("ja_Latn")
+ .setCountry("JP")
+ .setPostalCode("601-8501").build();
+ VERIFIER.verify(address, problems);
+ assertFalse(problems.isEmpty());
+ assertEquals(AddressProblemType.UNKNOWN_VALUE,
+ problems.getProblem(AddressField.ADMIN_AREA));
+ }
+
+ public void testCanadaMixedCasePostcode() {
+ final AddressData address = new AddressData.Builder()
+ .setRecipient("Joe Bloggs")
+ .setAddress("11 East St")
+ .setLocality("Montreal")
+ .setAdminArea("Quebec")
+ .setCountry("CA")
+ .setPostalCode("H2b 2y5").build();
+ VERIFIER.verify(address, problems);
+ assertTrue(problems.isEmpty());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/FormControllerTest.java b/java/test/com/android/i18n/addressinput/FormControllerTest.java
new file mode 100644
index 0000000..23b798f
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/FormControllerTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.KeyType;
+import com.android.i18n.addressinput.testing.AsyncTestCase;
+
+import java.util.List;
+
+/**
+ * Basic Tests for {@link FormController}.
+ */
+public class FormControllerTest extends AsyncTestCase {
+
+ private static final AddressData US_CA_ADDRESS;
+ private static final AddressData US_ADDRESS;
+ private ClientData clientData;
+
+ static {
+ US_CA_ADDRESS = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mt View")
+ .setAddressLine1("1098 Alta Ave")
+ .setPostalCode("94043")
+ .build();
+ US_ADDRESS = new AddressData.Builder().setCountry("US").build();
+ }
+
+ @Override
+ public void setUp() {
+ clientData = new ClientData(new CacheData());
+ }
+
+ public void testRequestDataForAddress() {
+ final FormController controller = new FormController(clientData, "en", "US");
+
+ delayTestFinish(15000);
+
+ controller.requestDataForAddress(US_CA_ADDRESS, new DataLoadListener() {
+ boolean beginCalled = false;
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called before dataLoadingEnd",
+ beginCalled);
+ LookupKey usCaMtvKey = new LookupKey.Builder(KeyType.DATA)
+ .setAddressData(US_CA_ADDRESS).build();
+ LookupKey usKey = usCaMtvKey.getKeyForUpperLevelField(
+ AddressField.COUNTRY);
+ LookupKey usCaKey = usCaMtvKey.getKeyForUpperLevelField(
+ AddressField.ADMIN_AREA);
+ assertNotNull("key should be data/US/CA", usCaKey);
+ assertNotNull("key should be data/US/CA/Mt View", usCaMtvKey);
+ assertNotNull(clientData.get(usKey.toString()));
+ assertNotNull(clientData.get(usCaKey.toString()));
+ assertNull(clientData.get(usCaMtvKey.toString()));
+ finishTest();
+ }
+ });
+ }
+
+ public void testRequestDataForBadAddress() {
+ final AddressData address = new AddressData.Builder(US_CA_ADDRESS)
+ .setAdminArea("FOOBAR")
+ .setLocality("KarKar")
+ .build();
+
+ final FormController controller = new FormController(clientData, "en", "US");
+
+ delayTestFinish(15000);
+
+ controller.requestDataForAddress(address, new DataLoadListener() {
+ boolean beginCalled = false;
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called before dataLoadingEnd",
+ beginCalled);
+ LookupKey badKey = new LookupKey.Builder(KeyType.DATA)
+ .setAddressData(address).build();
+ LookupKey usKey = badKey.getKeyForUpperLevelField(AddressField.COUNTRY);
+
+ List<RegionData> rdata = controller.getRegionData(usKey);
+ assertTrue(rdata.size() > 0);
+ String subkey = rdata.get(0).getKey();
+ assertNotNull("Should be the first US state", subkey);
+ LookupKey usFirstStateKey =
+ new LookupKey.Builder(usKey.toString() + "/" + subkey).build();
+
+ assertNotNull(clientData.get(usKey.toString()));
+ assertNotNull(clientData.get(usFirstStateKey.toString()));
+ assertNull(clientData.get(badKey.toString()));
+ finishTest();
+ }
+ });
+ }
+
+ public void testRequestDataForCountry() {
+ final FormController controller = new FormController(clientData, "en", "US");
+
+ delayTestFinish(15000);
+
+ controller.requestDataForAddress(US_ADDRESS, new DataLoadListener() {
+ boolean beginCalled = false;
+ @Override
+ public void dataLoadingBegin() {
+ beginCalled = true;
+ }
+
+ @Override
+ public void dataLoadingEnd() {
+ assertTrue("dataLoadingBegin should be called before dataLoadingEnd",
+ beginCalled);
+ LookupKey usKey = new LookupKey.Builder(KeyType.DATA)
+ .setAddressData(US_ADDRESS).build();
+ assertNotNull("key should be data/US", usKey);
+ List<RegionData> rdata = controller.getRegionData(usKey);
+ assertTrue(rdata.size() > 0);
+ String subkey = rdata.get(0).getKey();
+ assertNotNull("Should be the first US state", subkey);
+ LookupKey usFirstStateKey =
+ new LookupKey.Builder(usKey.toString() + "/" + subkey).build();
+ assertNotNull(clientData.get(usKey.toString()));
+ assertNotNull(clientData.get(usFirstStateKey.toString()));
+ finishTest();
+ }
+ });
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/FormOptionsTest.java b/java/test/com/android/i18n/addressinput/FormOptionsTest.java
new file mode 100644
index 0000000..5f8e8c3
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/FormOptionsTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for building form options.
+ */
+public class FormOptionsTest extends TestCase {
+ public void testRequiredField() throws Exception {
+ FormOptions options = new FormOptions.Builder().required(AddressField.COUNTRY).build();
+ assertTrue(options.isRequired(AddressField.COUNTRY));
+ assertFalse(options.isRequired(AddressField.LOCALITY));
+ assertTrue(options.getRequiredFields().contains(AddressField.COUNTRY));
+ assertFalse(options.getRequiredFields().contains(AddressField.LOCALITY));
+ }
+
+ public void testReadonlyField() throws Exception {
+ FormOptions options = new FormOptions.Builder().readonly(AddressField.COUNTRY).build();
+ assertTrue(options.isReadonly(AddressField.COUNTRY));
+ assertFalse(options.isReadonly(AddressField.LOCALITY));
+ }
+
+ public void testHiddenField() throws Exception {
+ FormOptions options = new FormOptions.Builder().hide(AddressField.COUNTRY).build();
+ assertTrue(options.isHidden(AddressField.COUNTRY));
+ assertFalse(options.isHidden(AddressField.LOCALITY));
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java b/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java
new file mode 100644
index 0000000..50372ed
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/FormatInterpreterTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.ScriptType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the FormatInterpreter class.
+ */
+public class FormatInterpreterTest extends TestCase {
+ private static final AddressData US_CA_ADDRESS;
+ private static final AddressData TW_ADDRESS;
+
+ private FormatInterpreter formatInterpreter;
+
+ static {
+ US_CA_ADDRESS = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mt View")
+ .setAddressLine1("1098 Alta Ave")
+ .setPostalCode("94043")
+ .build();
+
+ TW_ADDRESS = new AddressData.Builder().setCountry("TW")
+ .setAdminArea("\u53F0\u5317\u5E02") // Taipei city
+ .setLocality("\u5927\u5B89\u5340") // Da-an district
+ .setAddressLine1("Sec. 3 Hsin-yi Rd.")
+ .setPostalCode("106")
+ .setOrganization("Giant Bike Store")
+ .setRecipient("Mr. Liu")
+ .build();
+ }
+
+ @Override
+ public void setUp() {
+ formatInterpreter = new FormatInterpreter(new FormOptions.Builder().build());
+ }
+
+ public void testIterateUsAddressFields() {
+ AddressField[] format = {
+ AddressField.RECIPIENT,
+ AddressField.ORGANIZATION,
+ AddressField.ADDRESS_LINE_1,
+ AddressField.ADDRESS_LINE_2,
+ AddressField.LOCALITY,
+ AddressField.ADMIN_AREA,
+ AddressField.POSTAL_CODE
+ };
+
+ int currIndex = 0;
+ for (AddressField field : formatInterpreter.getAddressFieldOrder(ScriptType.LOCAL, "US")) {
+ assertEquals("index " + currIndex + " should have matched",
+ format[currIndex].getChar(), field.getChar());
+ currIndex++;
+ }
+ }
+
+ /**
+ * Tests that this works for the case of Vanuatu, since we have no country-specific formatting
+ * data for that country. Should fall back to the default region.
+ */
+ public void testIterateVuAddressFields() {
+ AddressField[] format = {
+ AddressField.RECIPIENT,
+ AddressField.ORGANIZATION,
+ AddressField.ADDRESS_LINE_1,
+ AddressField.ADDRESS_LINE_2,
+ AddressField.LOCALITY,
+ };
+
+ int currIndex = 0;
+ for (AddressField field : formatInterpreter.getAddressFieldOrder(ScriptType.LOCAL, "VU")) {
+ assertEquals("index " + currIndex + " should have matched",
+ format[currIndex].getChar(), field.getChar());
+ currIndex++;
+ }
+ }
+
+ public void testOverrideFieldOrder() {
+ AddressField[] expectedOrder = {
+ AddressField.ADMIN_AREA,
+ AddressField.ORGANIZATION,
+ AddressField.ADDRESS_LINE_1,
+ AddressField.ADDRESS_LINE_2,
+ AddressField.LOCALITY,
+ AddressField.RECIPIENT,
+ AddressField.POSTAL_CODE
+ };
+
+ FormatInterpreter myInterpreter = new FormatInterpreter(
+ new FormOptions.Builder().customizeFieldOrder("US",
+ AddressField.ADMIN_AREA,
+ AddressField.RECIPIENT,
+ AddressField.SORTING_CODE,
+ AddressField.POSTAL_CODE).build());
+
+ int currIndex = 0;
+ for (AddressField field : myInterpreter.getAddressFieldOrder(ScriptType.LOCAL, "US")) {
+ assertEquals("Wrong field order for US on index " + currIndex + " of address fields.",
+ expectedOrder[currIndex], field);
+
+ // Sorting code (CEDEX) is not in US address format and should be
+ // neglected even if it is specified in customizeFieldOrder().
+ assertNotSame(AddressField.SORTING_CODE, field);
+ currIndex++;
+ }
+ }
+
+ public void testIterateTwLatinAddressFields() {
+ AddressField[] format = {
+ AddressField.RECIPIENT,
+ AddressField.ORGANIZATION,
+ AddressField.ADDRESS_LINE_1,
+ AddressField.ADDRESS_LINE_2,
+ AddressField.LOCALITY,
+ AddressField.ADMIN_AREA,
+ AddressField.POSTAL_CODE
+ };
+
+ int currIndex = 0;
+ for (AddressField field : formatInterpreter.getAddressFieldOrder(ScriptType.LATIN, "TW")) {
+ assertEquals("Unexpected field order -- mismatched on index " + currIndex,
+ format[currIndex].getChar(), field.getChar());
+ currIndex++;
+ }
+ }
+
+ public void testUsEnvelopeAddress() {
+ List<String> expected = new ArrayList<String>();
+ expected.add("1098 Alta Ave");
+ expected.add("Mt View CA 94043");
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(US_CA_ADDRESS);
+
+ assertEquals(expected, real);
+ }
+
+ public void testTwEnvelopeAddress() {
+ // To be in this order, the whole address should really be in Traditional Chinese - for
+ // readability, only the neighbourhood and city are.
+ List<String> expected = new ArrayList<String>();
+ expected.add("106");
+ expected.add("\u53F0\u5317\u5E02\u5927\u5B89\u5340"); // Taipei city, Da-an district
+ expected.add("Sec. 3 Hsin-yi Rd.");
+ expected.add("Giant Bike Store");
+ expected.add("Mr. Liu");
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(TW_ADDRESS);
+
+ assertEquals(expected, real);
+ }
+
+ public void testEnvelopeAddressIncompleteAddress() {
+ List<String> expected = new ArrayList<String>();
+ expected.add("1098 Alta Ave");
+ expected.add("CA 94043");
+
+ AddressData address = new AddressData.Builder().set(US_CA_ADDRESS)
+ .set(AddressField.LOCALITY, null).build();
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(address);
+
+ assertEquals(expected, real);
+ }
+
+ public void testEnvelopeAddressEmptyAddress() {
+ List<String> expected = new ArrayList<String>();
+ AddressData address = new AddressData.Builder().setCountry("US").build();
+
+ List<String> real = formatInterpreter.getEnvelopeAddress(address);
+ assertEquals(expected, real);
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/JsoMapTest.java b/java/test/com/android/i18n/addressinput/JsoMapTest.java
new file mode 100644
index 0000000..76bcbed
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/JsoMapTest.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Unit test for {@link JsoMap}.
+ */
+public class JsoMapTest extends TestCase {
+
+ private static final String VALID_JSON = "{\"a\":\"b\",\"c\":1,\"d\":{\"e\":\"f\"}}";
+ private static final String INVALID_JSON = "!";
+
+ public void testBuildJsoMap() throws Exception {
+ assertNotNull(JsoMap.buildJsoMap(VALID_JSON));
+
+ try {
+ JsoMap.buildJsoMap(INVALID_JSON);
+ fail("Expected JSONException.");
+ } catch (JSONException e) {
+ // Expected.
+ }
+ }
+
+ public void testCreateEmptyJsoMap() throws Exception {
+ assertNotNull(JsoMap.createEmptyJsoMap());
+ }
+
+ public void testDelKey() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+
+ assertEquals("b", map.get("a"));
+ map.delKey("a");
+ assertNull(map.get("a"));
+
+ map.delKey("b");
+ map.delKey("c");
+ map.delKey("d");
+ }
+
+ public void testGet() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+ assertEquals("b", map.get("a"));
+ assertNull(map.get("b"));
+
+ try {
+ map.get("c");
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ }
+
+ try {
+ map.get("d");
+ fail("Expected ClassCastException.");
+ } catch (ClassCastException e) {
+ // Expected.
+ }
+ }
+
+ public void testGetInt() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+
+ try {
+ map.getInt("a");
+ fail("Expected RuntimeException.");
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+
+ assertEquals(-1, map.getInt("b"));
+ assertEquals(1, map.getInt("c"));
+
+ try {
+ map.getInt("d");
+ fail("Expected RuntimeException.");
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+ }
+
+ public void testGetKeys() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+ JSONArray keys = map.getKeys();
+ assertNotNull(keys);
+ assertEquals(3, keys.length());
+ Set<String> keySet = new HashSet<String>(keys.length());
+ for (int i = 0; i < keys.length(); i++) {
+ keySet.add(keys.getString(i));
+ }
+ assertEquals(new HashSet<String>(Arrays.asList("a", "c", "d")), keySet);
+ }
+
+ public void testGetObj() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+
+ try {
+ map.getObj("a");
+ fail("Expected ClassCastException.");
+ } catch (ClassCastException e) {
+ // Expected.
+ }
+
+ assertNull(map.getObj("b"));
+
+ try {
+ map.getObj("c");
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ }
+
+ JsoMap obj = map.getObj("d");
+ assertNotNull(obj);
+ assertEquals("f", obj.get("e"));
+ }
+
+ public void testContainsKey() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+ assertTrue(map.containsKey("a"));
+ assertFalse(map.containsKey("b"));
+ assertTrue(map.containsKey("c"));
+ assertTrue(map.containsKey("d"));
+ }
+
+ public void testMergeData() throws Exception {
+ JsoMap mapA = JsoMap.createEmptyJsoMap();
+ JsoMap mapB = JsoMap.createEmptyJsoMap();
+
+ mapA.putInt("a", 1);
+ mapA.putInt("b", 2);
+
+ mapB.putInt("b", 3);
+ mapB.putInt("c", 4);
+
+ mapA.mergeData(mapB);
+ assertEquals(1, mapA.getInt("a"));
+ assertEquals(2, mapA.getInt("b"));
+ assertEquals(4, mapA.getInt("c"));
+ }
+
+ public void testPut() throws Exception {
+ JsoMap map = JsoMap.createEmptyJsoMap();
+
+ map.put("a", "b");
+ assertEquals("b", map.get("a"));
+
+ map.put("a", "c");
+ assertEquals("c", map.get("a"));
+ }
+
+ public void testPutInt() throws Exception {
+ JsoMap map = JsoMap.createEmptyJsoMap();
+
+ map.putInt("a", 1);
+ assertEquals(1, map.getInt("a"));
+
+ map.putInt("a", 2);
+ assertEquals(2, map.getInt("a"));
+ }
+
+ public void testPutObj() throws Exception {
+ JsoMap map = JsoMap.createEmptyJsoMap();
+ JsoMap obj = JsoMap.createEmptyJsoMap();
+
+ obj.putInt("a", 1);
+ map.putObj("b", obj);
+ assertEquals(obj.toString(), map.getObj("b").toString());
+
+ obj.putInt("a", 2);
+ map.putObj("b", obj);
+ assertEquals(obj.toString(), map.getObj("b").toString());
+ }
+
+ public void testString() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+
+ try {
+ // This should fail on the integer "c" or the map "d".
+ map.string();
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ } catch (ClassCastException e) {
+ // Expected.
+ }
+
+ map.delKey("c");
+ try {
+ // This should fail on the object "d".
+ map.string();
+ fail("Expected ClassCastException.");
+ } catch (ClassCastException e) {
+ // Expected.
+ }
+
+ map.delKey("d");
+ assertEquals("JsoMap[\n(a:b)\n]", map.string());
+ }
+
+ public void testMap() throws Exception {
+ JsoMap map = JsoMap.buildJsoMap(VALID_JSON);
+ try {
+ // This should fail on the string "a" or the integer "c".
+ map.map();
+ fail("Expected ClassCastException.");
+ } catch (ClassCastException e) {
+ // Expected.
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ }
+
+ map.delKey("a");
+ try {
+ // This should fail on the integer "c".
+ map.map();
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ }
+
+ map.delKey("c");
+ assertEquals("JsoMap[\n(d:JsoMap[\n(e:f)\n])\n]", map.map());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/JsonpRequestBuilderTest.java b/java/test/com/android/i18n/addressinput/JsonpRequestBuilderTest.java
new file mode 100644
index 0000000..392a68e
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/JsonpRequestBuilderTest.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.JsonpRequestBuilder.AsyncCallback;
+import com.android.i18n.addressinput.testing.AsyncTestCase;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+
+public class JsonpRequestBuilderTest extends AsyncTestCase {
+ private JsonpRequestBuilder builder;
+
+ @Override
+ public void setUp() {
+ builder = new JsonpRequestBuilder();
+ }
+
+ public void testRequestObject() throws Exception {
+ delayTestFinish(4000);
+ builder.setTimeout(2000);
+
+ String url = HttpServer.execute(1000, "{\"id\": \"data\"}");
+
+ builder.requestObject(url, new AsyncCallback<JsoMap>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ fail(caught.toString());
+ }
+
+ @Override
+ public void onSuccess(JsoMap result) {
+ assertNotNull(result);
+ assertEquals("data", result.get("id"));
+ finishTest();
+ }
+ });
+ }
+
+ public void testSetTimeout() throws Exception {
+ delayTestFinish(4000);
+ builder.setTimeout(1000);
+
+ String url = HttpServer.execute(2000, "Fubar");
+
+ builder.requestObject(url, new AsyncCallback<JsoMap>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ assertNotNull(caught);
+ assertTrue(caught instanceof SocketTimeoutException);
+ finishTest();
+ }
+
+ @Override
+ public void onSuccess(JsoMap result) {
+ fail("The request should have timed out.");
+ }
+ });
+ }
+
+ public void testUrlEncoding() throws Exception {
+ delayTestFinish(4000);
+ builder.setTimeout(2000);
+
+ String urlBase = HttpServer.execute(1000, "{\"id\": \"data\"}");
+ String url = urlBase + "address/data/VN/B\u1EAFc K\u1EA1n";
+
+ builder.requestObject(url, new AsyncCallback<JsoMap>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ fail(caught.toString());
+ }
+
+ @Override
+ public void onSuccess(JsoMap result) {
+ assertNotNull(result);
+ assertEquals("data", result.get("id"));
+ finishTest();
+ }
+ });
+ }
+
+ /**
+ * Simple implementation of an HTTP server.
+ */
+ private static class HttpServer extends Thread {
+ /**
+ * Start an HTTP server that will serve one request and then terminate.
+ *
+ * @param timeoutMillis
+ * Wait this long before answering a request.
+ * @param response
+ * Reply to any request with this response.
+ * @return The URL to the server.
+ * @throws IOException
+ */
+ public static String execute(long timeoutMillis, String response) throws IOException {
+ HttpServer server = new HttpServer(timeoutMillis, response);
+ server.start();
+ return "http://localhost:" + server.serverSocket.getLocalPort() + "/";
+ }
+
+ @Override
+ public void run() {
+ try {
+ Socket clientSocket = serverSocket.accept();
+ try {
+ synchronized (this) {
+ wait(waitMillis);
+ }
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ InputStream inputStream = clientSocket.getInputStream();
+ inputStream.read(new byte[1024]); // Discard input.
+ OutputStream outputStream = clientSocket.getOutputStream();
+ outputStream.write(response);
+ outputStream.close();
+ inputStream.close();
+ clientSocket.close();
+ serverSocket.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private HttpServer(long waitMillis, String response) throws IOException {
+ this.waitMillis = waitMillis;
+ this.response = (header + response).getBytes();
+ serverSocket = new ServerSocket(0);
+ }
+
+ private long waitMillis;
+ private byte[] response;
+ private ServerSocket serverSocket;
+
+ private static final String header = "HTTP/1.0 200 OK\nContent-Type: text/plain\n\n";
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/LookupKeyTest.java b/java/test/com/android/i18n/addressinput/LookupKeyTest.java
new file mode 100644
index 0000000..608e076
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/LookupKeyTest.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import com.android.i18n.addressinput.LookupKey.KeyType;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for the LookupKey class.
+ */
+public class LookupKeyTest extends TestCase {
+ private static final String ROOT_KEY = "data";
+ private static final String ROOT_EXAMPLE_KEY = "examples";
+ private static final String US_KEY = "data/US";
+ private static final String CALIFORNIA_KEY = "data/US/CA";
+ private static final String EXAMPLE_LOCAL_US_KEY = "examples/US/local/_default";
+
+ // Data key for Da-an District, Taipei Taiwan
+ private static final String TW_KEY = "data/TW/\u53F0\u5317\u5E02/\u5927\u5B89\u5340";
+
+ // Example key for TW's address (local script)
+ private static final String TW_EXAMPLE_LOCAL_KEY = "examples/TW/local/_default";
+
+ // Example key for TW's address (latin script)
+ private static final String TW_EXAMPLE_LATIN_KEY = "examples/TW/latin/_default";
+
+ private static final String RANDOM_KEY = "sdfIisooIFOOBAR";
+ private static final String RANDOM_COUNTRY_KEY = "data/asIOSDxcowW";
+
+ public void testRootKey() {
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).build();
+ assertEquals(ROOT_KEY, key.toString());
+
+ LookupKey key2 = new LookupKey.Builder(key.toString()).build();
+ assertEquals(ROOT_KEY, key2.toString());
+ }
+
+ public void testDataKeys() {
+ LookupKey key = new LookupKey.Builder(US_KEY).build();
+ assertEquals(US_KEY, key.toString());
+
+ LookupKey key2 = new LookupKey.Builder(CALIFORNIA_KEY).build();
+ assertEquals(CALIFORNIA_KEY, key2.toString());
+ }
+
+ public void testExampleRootKeys() {
+ LookupKey key = new LookupKey.Builder(KeyType.EXAMPLES).build();
+ assertEquals(ROOT_EXAMPLE_KEY, key.toString());
+ }
+
+ public void testExampleKeys() {
+ AddressData address = new AddressData.Builder().setCountry("US")
+ .setLanguageCode("en")
+ .build();
+
+ LookupKey key = new LookupKey.Builder(KeyType.EXAMPLES).setAddressData(address).build();
+ assertEquals(EXAMPLE_LOCAL_US_KEY, key.toString());
+
+ key = new LookupKey.Builder(EXAMPLE_LOCAL_US_KEY).build();
+ assertEquals(EXAMPLE_LOCAL_US_KEY, key.toString());
+ }
+
+ public void testKeyWithWrongScriptType() {
+ String wrongScript = "examples/US/asdfasdfasdf/_default";
+ try {
+ new LookupKey.Builder(wrongScript).build();
+ fail("should fail since the script type is wrong");
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+ }
+
+ public void testFallbackToCountry() {
+ // Admin Area is missing.
+ AddressData address = new AddressData.Builder().setCountry("US")
+ .setLocality("Mt View")
+ .build();
+
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+
+ assertEquals("locality should be omitted since admin area is not specified", US_KEY,
+ key.toString());
+
+ // Tries key string with the same problem (missing Admin Area).
+ key = new LookupKey.Builder("data/US//Mt View").build();
+
+ assertEquals("locality should be omitted since admin area is not specified", US_KEY,
+ key.toString());
+ }
+
+ public void testNonUsAddress() {
+ AddressData address = new AddressData.Builder().setCountry("TW")
+ // Taipei City
+ .setAdminArea("\u53F0\u5317\u5E02")
+ // Da-an District
+ .setLocality("\u5927\u5B89\u5340")
+ .build();
+
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+ assertEquals(TW_KEY, key.toString());
+
+ key = new LookupKey.Builder(KeyType.EXAMPLES).setAddressData(address).build();
+ assertEquals(TW_EXAMPLE_LOCAL_KEY, key.toString());
+
+ address = new AddressData.Builder(address).setLanguageCode("zh-latn").build();
+ key = new LookupKey.Builder(KeyType.EXAMPLES).setAddressData(address).build();
+ assertEquals(TW_EXAMPLE_LATIN_KEY, key.toString());
+ }
+
+ public void testGetKeyForUpperLevelFieldWithDataKey() {
+ AddressData address = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mt View")
+ .build();
+
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+ LookupKey newKey = key.getKeyForUpperLevelField(AddressField.COUNTRY);
+ assertNotNull("failed to get key for " + AddressField.COUNTRY, newKey);
+ assertEquals("data/US", newKey.toString());
+
+ newKey = key.getKeyForUpperLevelField(AddressField.ADMIN_AREA);
+ assertNotNull("failed to get key for " + AddressField.ADMIN_AREA, newKey);
+ assertEquals("data/US/CA", newKey.toString());
+ assertEquals("original key should not be changed", "data/US/CA/Mt View", key.toString());
+
+ newKey = key.getKeyForUpperLevelField(AddressField.LOCALITY);
+ assertNotNull("failed to get key for " + AddressField.LOCALITY, newKey);
+ assertEquals("data/US/CA/Mt View", newKey.toString());
+
+ newKey = key.getKeyForUpperLevelField(AddressField.DEPENDENT_LOCALITY);
+ assertNull("should return null for field not contained in current key", newKey);
+
+ newKey = key.getKeyForUpperLevelField(AddressField.RECIPIENT);
+ assertNull("should return null since field '" + AddressField.RECIPIENT +
+ "' is not in address hierarchy", newKey);
+ }
+
+ public void testGetKeyForUpperLevelFieldWithExampleKey() {
+ LookupKey key = new LookupKey.Builder("examples/US/latin/_default").build();
+
+ try {
+ key.getKeyForUpperLevelField(AddressField.COUNTRY);
+ fail("should fail if you try to get parent key for an example key.");
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+ }
+
+ public void testGetParentKey() {
+ AddressData address = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mt View")
+ .setDependentLocality("El Camino")
+ .build();
+
+ LookupKey key = new LookupKey.Builder(KeyType.DATA).setAddressData(address).build();
+ assertEquals("data/US/CA/Mt View/El Camino", key.toString());
+
+ key = key.getParentKey();
+ assertEquals("data/US/CA/Mt View", key.toString());
+
+ key = key.getParentKey();
+ assertEquals("data/US/CA", key.toString());
+
+ key = key.getParentKey();
+ assertEquals("data/US", key.toString());
+
+ key = key.getParentKey();
+ assertEquals("data", key.toString());
+
+ key = key.getParentKey();
+ assertNull("root key's parent should be null", key);
+ }
+
+ public void testInvalidKeyTypeWillFail() {
+ try {
+ new LookupKey.Builder(RANDOM_KEY).build();
+ fail("Should fail if key string does not start with a valid key type");
+ } catch (RuntimeException e) {
+ // Expected.
+ }
+ }
+
+ /**
+ * Ensures that even when the input key string is random, we still create a key. (We do not
+ * verify if the key maps to an real world entity like a city or country).
+ */
+ public void testWeDontVerifyKeyName() {
+ LookupKey key = new LookupKey.Builder(RANDOM_COUNTRY_KEY).build();
+ assertEquals(RANDOM_COUNTRY_KEY, key.toString());
+ }
+
+ public void testHash() {
+ String keys[] = { ROOT_KEY, ROOT_EXAMPLE_KEY, US_KEY, CALIFORNIA_KEY };
+ Map<LookupKey, String> map = new HashMap<LookupKey, String>();
+
+ for (String key : keys) {
+ map.put(new LookupKey.Builder(key).build(), key);
+ }
+
+ for (String key : keys) {
+ assertTrue(map.containsKey(new LookupKey.Builder(key).build()));
+ assertEquals(key, map.get(new LookupKey.Builder(key).build()));
+ }
+ assertFalse(map.containsKey(new LookupKey.Builder(RANDOM_COUNTRY_KEY).build()));
+ }
+
+ public void testGetValueForUpperLevelField() {
+ LookupKey key = new LookupKey.Builder("data/US/CA").build();
+ assertEquals("US", key.getValueForUpperLevelField(AddressField.COUNTRY));
+ }
+
+ public void testGetValueForUpperLevelFieldInvalid() {
+ LookupKey key = new LookupKey.Builder("data").build();
+ assertEquals("", key.getValueForUpperLevelField(AddressField.COUNTRY));
+ LookupKey key2 = new LookupKey.Builder("data/").build();
+ assertEquals("", key2.getValueForUpperLevelField(AddressField.COUNTRY));
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/RegionDataConstantsTest.java b/java/test/com/android/i18n/addressinput/RegionDataConstantsTest.java
new file mode 100644
index 0000000..f623146
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/RegionDataConstantsTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the region data constants to check they are populated and that the data can be read in
+ * and converted into the appropriate format.
+ */
+public class RegionDataConstantsTest extends TestCase {
+ public void testDataLoad() throws Exception {
+ assertFalse("The list of countries should not be empty",
+ RegionDataConstants.getCountryFormatMap().isEmpty());
+ }
+
+ public void testZZRegion() throws Exception {
+ assertNotNull("Data for 'ZZ' is missing (needed for default region info.)",
+ RegionDataConstants.getCountryFormatMap().get("ZZ"));
+ }
+
+ public void testStringsAreConvertedIntoJson() throws Exception {
+ String[] input = { "key", "value", "key2", "value2" };
+ // Input order is not maintained, since we build this using JSON objects. This is
+ // unimportant, so long as the key-value mappings are maintained.
+ String expectedOutput = "{\"key2\":\"value2\",\"key\":\"value\"}";
+ String actualOutput = RegionDataConstants.convertArrayToJsonString(input);
+ assertEquals(expectedOutput, actualOutput);
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/RegionDataTest.java b/java/test/com/android/i18n/addressinput/RegionDataTest.java
new file mode 100644
index 0000000..547f934
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/RegionDataTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Small unit tests for the RegionData class.
+ */
+public class RegionDataTest extends TestCase {
+ public void testBuilder() throws Exception {
+ RegionData data = new RegionData.Builder().setKey("CA").setName("California").build();
+ assertEquals("CA", data.getKey());
+ assertEquals("California", data.getName());
+ assertTrue(data.isValidName("CA"));
+ // Should match either the key or the name.
+ assertTrue(data.isValidName("California"));
+ // Matching should be case-insensitive.
+ assertTrue(data.isValidName("ca"));
+ assertFalse(data.isValidName("Cat"));
+ }
+
+ public void testBuilderNoName() throws Exception {
+ RegionData data = new RegionData.Builder().setKey("CA").build();
+ assertEquals("CA", data.getKey());
+ assertEquals(null, data.getName());
+ }
+
+ public void testBuilderWhitespaceName() throws Exception {
+ RegionData data = new RegionData.Builder().setKey("CA").setName(" ").build();
+ assertEquals("CA", data.getKey());
+ assertEquals(null, data.getName());
+ assertEquals("CA", data.getDisplayName());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/StandardAddressVerifierTest.java b/java/test/com/android/i18n/addressinput/StandardAddressVerifierTest.java
new file mode 100644
index 0000000..f2c86f6
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/StandardAddressVerifierTest.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+/**
+ * Spot check the standard data set for various cases of interest. This is not an exhaustive test.
+ */
+public class StandardAddressVerifierTest extends TestCase {
+
+ private AddressProblems problems = new AddressProblems();
+ private StandardAddressVerifier verifier;
+
+ @Override
+ protected void setUp() {
+ problems.clear();
+ verifier = new StandardAddressVerifier(new FieldVerifier(new ClientData(new CacheData())),
+ StandardChecks.PROBLEM_MAP);
+ }
+
+ public void testUnitedStatesOk() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setAddress("1234 Somewhere")
+ .setPostalCode("94025")
+ .build();
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty()); // no mismatch
+ }
+
+ public void testUnitedStatesZipMismatch() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setPostalCode("12345")
+ .build();
+ verifier.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISMATCHING_VALUE,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ public void testUnitedStatesNotOk() {
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality(null)
+ .setDependentLocality("Foo Bar")
+ .setPostalCode("12345")
+ .build();
+ verifier.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISMATCHING_VALUE,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.LOCALITY));
+ }
+
+ public void testChinaOk() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Beijing Shi")
+ .setLocality("Xicheng Qu")
+ .setAddress("Yitiao Lu")
+ .setPostalCode("123456")
+ .build();
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testGermanAddress() {
+ AddressData addr = new AddressData.Builder().setCountry("DE")
+ .setLocality("Berlin")
+ .setAddress("Huttenstr. 50")
+ .setPostalCode("10553")
+ .setOrganization("BMW AG Niederkassung Berlin")
+ .setRecipient("Herr Diefendorf")
+ .build();
+
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+
+ // Clones address but leave city empty.
+ addr = new AddressData.Builder().set(addr).setLocality(null).build();
+
+ verifier.verify(addr, problems);
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.LOCALITY));
+ }
+
+ public void testIrishAddress() {
+ AddressData addr = new AddressData.Builder().setCountry("IE")
+ .setLocality("Dublin")
+ .setAdminArea("Co. Dublin")
+ .setAddress("7424 118 Avenue NW")
+ .setRecipient("Conan O'Brien")
+ .build();
+
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+
+ // Clones address but leave county empty. This address should be valid
+ // since county is not required.
+ addr = new AddressData.Builder().set(addr).setAdminArea(null).build();
+
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testChinaPostalCodeBadFormat() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Beijing Shi")
+ .setLocality("Xicheng Qu")
+ .setPostalCode("12345")
+ .build();
+ verifier.verify(addr, problems);
+
+ // ensure problem is unrecognized format and problem is in POSTAL_CODE
+ assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ /**
+ * If there is a postal code pattern for a certain country, and the input postal code is empty,
+ * it should not be reported as bad postal code format. Whether empty postal code is ok should
+ * be determined by checks for required fields.
+ */
+ public void testEmptyPostalCodeReportedAsGoodFormat() {
+ // Chilean address has a postal code format pattern, but does not require
+ // postal code. The following address is valid.
+ AddressData addr = new AddressData.Builder().setCountry("CL")
+ .setAddressLine1("GUSTAVO LE PAIGE ST #159")
+ .setAdminArea("Atacama")
+ .setLocality("San Pedro")
+ .setPostalCode("")
+ .build();
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+
+ problems.clear();
+
+ // Now checks for US addresses, which requires postal code. The following
+ // address's postal code is wrong because it misses required field, not
+ // because it mismatches expected postal code pattern.
+ addr = new AddressData.Builder().setCountry("US").setPostalCode("").build();
+ problems.clear();
+ verifier.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.POSTAL_CODE));
+ }
+
+ public void testChinaTaiwanOk() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Taiwan")
+ .setLocality("Taichung City")
+ .setDependentLocality("Situn District")
+ .setAddress("12345 Yitiao Lu")
+ .setPostalCode("407")
+ .build();
+ verifier.verify(addr, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testChinaTaiwanUnknownDistrict() {
+ AddressData addr = new AddressData.Builder().setCountry("CN")
+ .setAdminArea("Taiwan")
+ .setLocality("Taichung City")
+ .setDependentLocality("Foo Bar")
+ .setPostalCode("400")
+ .build();
+ verifier.verify(addr, problems);
+
+ assertEquals(AddressProblemType.UNKNOWN_VALUE,
+ problems.getProblem(AddressField.DEPENDENT_LOCALITY));
+ }
+
+ public void testStreetVerification() {
+ // missing street address
+ AddressData addr = new AddressData.Builder().setCountry("US")
+ .setAdminArea("CA")
+ .setLocality("Mountain View")
+ .setPostalCode("94025")
+ .build();
+
+ assertNull(addr.getAddressLine1());
+ assertNull(addr.getAddressLine2());
+
+ verifier.verify(addr, problems);
+
+ assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
+ problems.getProblem(AddressField.STREET_ADDRESS));
+ }
+
+ // Tests The Bahamas' address
+ public void failingtestBahamas() {
+ final AddressData address =
+ new AddressData.Builder().setAddress("Abaco Beach Resort & Boat Habour")
+ .setLocality("Treasure Cay")
+ .setAdminArea("Abaco")
+ .setCountry("BS")
+ .build();
+ verifier.verify(address, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testJapan() {
+ // added AdminArea since address verification can't infer it from Kyoto City
+ // commented out dependent locality since address verification doesn't use it
+ // TODO: support inference of higher levels from lower ones
+ // TODO: add dependent locality support for japan addresses
+ final AddressData address =
+ new AddressData.Builder()
+ .setRecipient("\u5BAE\u672C \u8302") // SHIGERU_MIYAMOTO
+ .setAddress("\u4E0A\u9CE5\u7FBD\u927E\u7ACB\u753A11\u756A\u5730")
+ .setAdminArea("\u4eac\u90fd\u5e9c") // Kyoto prefecture, added
+ .setLocality("\u4EAC\u90FD\u5E02") // Kyoto city
+ // .setDependentLocality("\u5357\u533A")
+ .setCountry("JP")
+ .setPostalCode("601-8501")
+ .build();
+ verifier.verify(address, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+
+ public void testJapanLatin() {
+ // added AdminArea since address verification can't infer it from Kyoto City
+ // commented out dependent locality since address verification doesn't use it
+ final AddressData address =
+ new AddressData.Builder()
+ .setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH
+ .setAddress("11-1 Kamitoba-hokotate-cho")
+ .setAdminArea("KYOTO") // Kyoto prefecture, added
+ .setLocality("Kyoto") // Kyoto city
+ // .setDependentLocality("Minami-ku")
+ .setLanguageCode("ja_Latn")
+ .setCountry("JP")
+ .setPostalCode("601-8501")
+ .build();
+ verifier.verify(address, problems);
+ assertTrue(problems.toString(), problems.isEmpty());
+ }
+}
diff --git a/java/test/com/android/i18n/addressinput/UtilTest.java b/java/test/com/android/i18n/addressinput/UtilTest.java
new file mode 100644
index 0000000..d552062
--- /dev/null
+++ b/java/test/com/android/i18n/addressinput/UtilTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.addressinput;
+
+import junit.framework.TestCase;
+
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Tests for util functions.
+ */
+public class UtilTest extends TestCase {
+
+ public void testIsExplicitLatinScript() throws Exception {
+ // Should recognise Latin script in a variety of forms.
+ assertTrue(Util.isExplicitLatinScript("zh-Latn"));
+ assertTrue(Util.isExplicitLatinScript("ja_LATN"));
+ assertTrue(Util.isExplicitLatinScript("und_LATN"));
+ assertTrue(Util.isExplicitLatinScript("ja_LATN-JP"));
+ assertTrue(Util.isExplicitLatinScript("ko-latn_JP"));
+ }
+
+ public void testIsExplicitLatinScriptNonLatin() throws Exception {
+ assertFalse(Util.isExplicitLatinScript("ko"));
+ assertFalse(Util.isExplicitLatinScript("KO"));
+ assertFalse(Util.isExplicitLatinScript("ja"));
+ assertFalse(Util.isExplicitLatinScript("ja-JP"));
+ assertFalse(Util.isExplicitLatinScript("zh-Hans"));
+ assertFalse(Util.isExplicitLatinScript("zh-Hans-CN"));
+ assertFalse(Util.isExplicitLatinScript("zh-Hant"));
+ assertFalse(Util.isExplicitLatinScript("zh-TW"));
+ assertFalse(Util.isExplicitLatinScript("zh_TW"));
+ assertFalse(Util.isExplicitLatinScript("ko"));
+ assertFalse(Util.isExplicitLatinScript("ko_KR"));
+ assertFalse(Util.isExplicitLatinScript("en"));
+ assertFalse(Util.isExplicitLatinScript("EN"));
+ assertFalse(Util.isExplicitLatinScript("ru"));
+ }
+
+ public void testGetLanguageSubtag() throws Exception {
+ assertEquals("zh", Util.getLanguageSubtag("zh-Latn"));
+ assertEquals("ja", Util.getLanguageSubtag("ja_LATN"));
+ assertEquals("und", Util.getLanguageSubtag("und_LATN"));
+ assertEquals("ja", Util.getLanguageSubtag("ja_LATN-JP"));
+ assertEquals("ko", Util.getLanguageSubtag("ko"));
+ assertEquals("ko", Util.getLanguageSubtag("KO"));
+ assertEquals("ko", Util.getLanguageSubtag("ko-KR"));
+ assertEquals("ko", Util.getLanguageSubtag("ko_kr"));
+ assertEquals("und", Util.getLanguageSubtag("Not a language"));
+ }
+
+ public void testTrimToNull() throws Exception {
+ assertEquals("Trimmed String", Util.trimToNull(" Trimmed String "));
+ assertEquals("Trimmed String", Util.trimToNull(" Trimmed String"));
+ assertEquals("Trimmed String", Util.trimToNull("Trimmed String"));
+ assertEquals(null, Util.trimToNull(" "));
+ assertEquals(null, Util.trimToNull(null));
+ }
+
+ public void testJoinAndSkipNulls() throws Exception {
+ String first = "String 1";
+ String second = "String 2";
+ String expectedString = "String 1-String 2";
+ String nullString = null;
+ assertEquals(expectedString, Util.joinAndSkipNulls("-", first, second));
+ assertEquals(expectedString, Util.joinAndSkipNulls("-", first, second, nullString));
+ assertEquals(expectedString, Util.joinAndSkipNulls("-", first, nullString, second));
+ assertEquals(expectedString, Util.joinAndSkipNulls("-", first, nullString, " ", second));
+ assertEquals(first, Util.joinAndSkipNulls("-", first, nullString));
+ assertEquals(first, Util.joinAndSkipNulls("-", nullString, first));
+
+ assertEquals(null, Util.joinAndSkipNulls("-", nullString));
+ assertEquals(null, Util.joinAndSkipNulls("-", nullString, nullString));
+ assertEquals(null, Util.joinAndSkipNulls("-", nullString, "", nullString));
+ }
+
+ public void testGetWidgetCompatibleLanguageCodeCjkCountry() throws Exception {
+ Locale canadianFrench = new Locale("fr", "CA");
+ // Latin language, CJK country. Need explicit Latin tag, and country should be retained.
+ assertEquals("fr_latn_CA", Util.getWidgetCompatibleLanguageCode(canadianFrench, "CN"));
+ Locale canadianFrenchUpper = new Locale("FR", "CA");
+ // Test that the locale returns the same language code, regardless of the case of the
+ // initial input.
+ assertEquals("fr_latn_CA", Util.getWidgetCompatibleLanguageCode(canadianFrenchUpper, "CN"));
+ // No country in the Locale language.
+ assertEquals("fr_latn", Util.getWidgetCompatibleLanguageCode(Locale.FRENCH, "CN"));
+ // CJK language - but wrong country.
+ assertEquals("ko_latn",
+ Util.getWidgetCompatibleLanguageCode(Locale.KOREAN, "CN"));
+ Locale chineseChina = new Locale("zh", "CN");
+ assertEquals("zh_CN", Util.getWidgetCompatibleLanguageCode(chineseChina, "CN"));
+ }
+
+ public void testGetWidgetCompatibleLanguageCodeThailand() throws Exception {
+ Locale thai = new Locale("th", "TH");
+ assertEquals("th_TH", Util.getWidgetCompatibleLanguageCode(thai, "TH"));
+ // However, we assume Thai users prefer Latin names for China.
+ assertEquals("th_latn_TH", Util.getWidgetCompatibleLanguageCode(thai, "CN"));
+ }
+
+ public void testGetWidgetCompatibleLanguageCodeNonCjkCountry() throws Exception {
+ // Nothing should be changed for non-CJK countries, since their form layout is the same
+ // regardless of language.
+ Locale canadianFrench = new Locale("fr", "CA");
+ assertEquals("fr_CA", Util.getWidgetCompatibleLanguageCode(canadianFrench, "US"));
+ // No country in the Locale language.
+ assertEquals(Locale.FRENCH.toString(),
+ Util.getWidgetCompatibleLanguageCode(Locale.FRENCH, "US"));
+ // CJK language - should be unaltered too.
+ assertEquals(Locale.KOREAN.toString(),
+ Util.getWidgetCompatibleLanguageCode(Locale.KOREAN, "US"));
+ }
+
+ public void testBuildNameToKeyMap() throws Exception {
+ String names[] = {"", "", "", "", "NEW PROVIDENCE" };
+ // We have one more key than name here.
+ String keys[] = {"AB", "AC", "AD", "AE", "NP", "XX"};
+ Map<String, String> result = Util.buildNameToKeyMap(keys, names, null);
+ // We should have the six keys, and the one name, in the end result. No empty-string names
+ // should be present.
+ assertEquals(keys.length + 1, result.size());
+ // The empty string should not be present.
+ assertFalse(result.containsKey(""));
+
+ // Try with Latin names instead.
+ Map<String, String> resultWithLatin = Util.buildNameToKeyMap(keys, null, names);
+ // We should have the six keys and the one Latin-script name in the end result.
+ assertEquals(keys.length + 1, resultWithLatin.size());
+ String lnames[] = { "Other name" };
+ resultWithLatin = Util.buildNameToKeyMap(keys, names, lnames);
+ // We should have the keys, plus the names in lnames and names.
+ assertEquals(keys.length + 2, resultWithLatin.size());
+ assertTrue(resultWithLatin.containsKey("other name"));
+ assertTrue(resultWithLatin.containsKey("new providence"));
+ assertTrue(resultWithLatin.containsKey("xx"));
+ // The empty string should not be present.
+ assertFalse(resultWithLatin.containsKey(""));
+ }
+}
diff --git a/java/testlibs/commons-logging-1.1.1.jar b/java/testlibs/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
--- /dev/null
+++ b/java/testlibs/commons-logging-1.1.1.jar
Binary files differ
diff --git a/java/testlibs/httpclient-4.1.1.jar b/java/testlibs/httpclient-4.1.1.jar
new file mode 100644
index 0000000..74121b7
--- /dev/null
+++ b/java/testlibs/httpclient-4.1.1.jar
Binary files differ
diff --git a/java/testlibs/httpcore-4.1.jar b/java/testlibs/httpcore-4.1.jar
new file mode 100644
index 0000000..a357c07
--- /dev/null
+++ b/java/testlibs/httpcore-4.1.jar
Binary files differ
diff --git a/java/testlibs/json-20090211.jar b/java/testlibs/json-20090211.jar
new file mode 100644
index 0000000..ef29094
--- /dev/null
+++ b/java/testlibs/json-20090211.jar
Binary files differ
diff --git a/testdata/countryinfo.txt b/testdata/countryinfo.txt
new file mode 100644
index 0000000..4513ffa
--- /dev/null
+++ b/testdata/countryinfo.txt
@@ -0,0 +1,11563 @@
+data={"id":"data","countries":"AC~AD~AE~AF~AG~AI~AL~AM~AN~AO~AQ~AR~AS~AT~AU~AW~AX~AZ~BA~BB~BD~BE~BF~BG~BH~BI~BJ~BL~BM~BN~BO~BR~BS~BT~BV~BW~BY~BZ~CA~CC~CD~CF~CG~CH~CI~CK~CL~CM~CN~CO~CR~CS~CV~CX~CY~CZ~DE~DJ~DK~DM~DO~DZ~EC~EE~EG~EH~ER~ES~ET~FI~FJ~FK~FM~FO~FR~GA~GB~GD~GE~GF~GG~GH~GI~GL~GM~GN~GP~GQ~GR~GS~GT~GU~GW~GY~HK~HM~HN~HR~HT~HU~ID~IE~IL~IM~IN~IO~IQ~IS~IT~JE~JM~JO~JP~KE~KG~KH~KI~KM~KN~KR~KW~KY~KZ~LA~LB~LC~LI~LK~LR~LS~LT~LU~LV~LY~MA~MC~MD~ME~MF~MG~MH~MK~ML~MN~MO~MP~MQ~MR~MS~MT~MU~MV~MW~MX~MY~MZ~NA~NC~NE~NF~NG~NI~NL~NO~NP~NR~NU~NZ~OM~PA~PE~PF~PG~PH~PK~PL~PM~PN~PR~PS~PT~PW~PY~QA~RE~RO~RS~RU~RW~SA~SB~SC~SE~SG~SH~SI~SJ~SK~SL~SM~SN~SO~SR~ST~SV~SZ~TA~TC~TD~TF~TG~TH~TJ~TK~TL~TM~TN~TO~TR~TT~TV~TW~TZ~UA~UG~UM~US~UY~UZ~VA~VC~VE~VG~VI~VN~VU~WF~WS~XK~YE~YT~ZA~ZM~ZW"}
+data/AC={"id":"data/AC","key":"AC","name":"ASCENSION ISLAND","zip":"ASCN 1ZZ","zipex":"ASCN 1ZZ"}
+data/AD={"id":"data/AD","key":"AD","name":"ANDORRA","lang":"ca","languages":"ca","fmt":"%N%n%O%n%A%n%Z %S","require":"AS","upper":"S","zip":"AD[1-7]0\\d","zipex":"AD100,AD501,AD700","posturl":"http://www.correos.es/comun/CodigosPostales/1010_s-CodPostal.asp?Provincia=","state_name_type":"parish","sub_keys":"ANDORRA LA VELLA~CANILLO~ENCAMP~ESCALDES ENGORDANY~LAMASSANA~ORDINO~SANT JULIA DE LORIA","sub_names":"Andorra la Vella~Canillo~Encamp~Escaldes Engordany~Lamassana~Ordino~Sant Julia de Loria","sub_zips":"AD50[01]~AD10[01]~AD20[01]~AD70[01]~AD40[01]~AD30[01]~AD60[01]","sub_zipexs":"AD500~AD100~AD200~AD700~AD400~AD300~AD600","sub_isoids":"07~02~03~08~04~05~06"}
+data/AD/ANDORRA LA VELLA={"id":"data/AD/ANDORRA LA VELLA","key":"ANDORRA LA VELLA","name":"Andorra la Vella","lang":"ca","zip":"AD50[01]","zipex":"AD500","isoid":"07"}
+data/AD/CANILLO={"id":"data/AD/CANILLO","key":"CANILLO","name":"Canillo","lang":"ca","zip":"AD10[01]","zipex":"AD100","isoid":"02"}
+data/AD/ENCAMP={"id":"data/AD/ENCAMP","key":"ENCAMP","name":"Encamp","lang":"ca","zip":"AD20[01]","zipex":"AD200","isoid":"03"}
+data/AD/ESCALDES ENGORDANY={"id":"data/AD/ESCALDES ENGORDANY","key":"ESCALDES ENGORDANY","name":"Escaldes Engordany","lang":"ca","zip":"AD70[01]","zipex":"AD700","isoid":"08"}
+data/AD/LAMASSANA={"id":"data/AD/LAMASSANA","key":"LAMASSANA","name":"Lamassana","lang":"ca","zip":"AD40[01]","zipex":"AD400","isoid":"04"}
+data/AD/ORDINO={"id":"data/AD/ORDINO","key":"ORDINO","name":"Ordino","lang":"ca","zip":"AD30[01]","zipex":"AD300","isoid":"05"}
+data/AD/SANT JULIA DE LORIA={"id":"data/AD/SANT JULIA DE LORIA","key":"SANT JULIA DE LORIA","name":"Sant Julia de Loria","lang":"ca","zip":"AD60[01]","zipex":"AD600","isoid":"06"}
+data/AE={"id":"data/AE","key":"AE","name":"UNITED ARAB EMIRATES","fmt":"%N%n%O%n%A%n%C","require":"AC"}
+data/AF={"id":"data/AF","key":"AF","name":"AFGHANISTAN","zip":"\\d{4}","zipex":"1001,2601,3801","posturl":"http://afghanpost.gov.af/Postal%20Code/"}
+data/AG={"id":"data/AG","key":"AG","name":"ANTIGUA AND BARBUDA","require":"A"}
+data/AI={"id":"data/AI","key":"AI","name":"ANGUILLA","zip":"2640","zipex":"2640"}
+data/AL={"id":"data/AL","key":"AL","name":"ALBANIA","zip":"\\d{4}","zipex":"1001,1017,3501"}
+data/AM={"id":"data/AM","key":"AM","name":"ARMENIA","lang":"hy","languages":"hy","fmt":"%N%n%O%n%A%n%Z%n%C%n%S","lfmt":"%N%n%O%n%A%n%Z%n%C%n%S","zip":"(37)?\\d{4}","zipex":"375010,0002,0010","sub_keys":"Արագածոտն~Արարատ~Արմավիր~Գեղարքունիք~Երևան~Լոռի~Կոտայք~Շիրակ~Սյունիք~Վայոց ձոր~Տավուշ","sub_lnames":"Aragatsotn~Ararat~Armavir~Gegharkunik~Yerevan~Lori~Kotayk~Shirak~Syunik~Vayots Dzor~Tavush","sub_zips":"0[2-5]~0[6-8]~09|1[01]~1[2-6]~00~1[7-9]|2[01]~2[2-5]~2[6-9]|3[01]~3[2-5]~3[6-8]~39|4[0-2]","sub_zipexs":"0201,0514~0601,0823~0901,1149~1201,1626~0000,0099~1701,2117~2201,2506~2601,3126~3201,3519~3601,3810~3901,4216","sub_isoids":"AG~AR~AV~GR~ER~LO~KT~SH~SU~VD~TV"}
+data/AM/Արագածոտն={"id":"data/AM/Արագածոտն","key":"Արագածոտն","lang":"hy","lname":"Aragatsotn","zip":"0[2-5]","zipex":"0201,0514","isoid":"AG"}
+data/AM/Արարատ={"id":"data/AM/Արարատ","key":"Արարատ","lang":"hy","lname":"Ararat","zip":"0[6-8]","zipex":"0601,0823","isoid":"AR"}
+data/AM/Արմավիր={"id":"data/AM/Արմավիր","key":"Արմավիր","lang":"hy","lname":"Armavir","zip":"09|1[01]","zipex":"0901,1149","isoid":"AV"}
+data/AM/Գեղարքունիք={"id":"data/AM/Գեղարքունիք","key":"Գեղարքունիք","lang":"hy","lname":"Gegharkunik","zip":"1[2-6]","zipex":"1201,1626","isoid":"GR"}
+data/AM/Երևան={"id":"data/AM/Երևան","key":"Երևան","lang":"hy","lname":"Yerevan","zip":"00","zipex":"0000,0099","isoid":"ER"}
+data/AM/Լոռի={"id":"data/AM/Լոռի","key":"Լոռի","lang":"hy","lname":"Lori","zip":"1[7-9]|2[01]","zipex":"1701,2117","isoid":"LO"}
+data/AM/Կոտայք={"id":"data/AM/Կոտայք","key":"Կոտայք","lang":"hy","lname":"Kotayk","zip":"2[2-5]","zipex":"2201,2506","isoid":"KT"}
+data/AM/Շիրակ={"id":"data/AM/Շիրակ","key":"Շիրակ","lang":"hy","lname":"Shirak","zip":"2[6-9]|3[01]","zipex":"2601,3126","isoid":"SH"}
+data/AM/Սյունիք={"id":"data/AM/Սյունիք","key":"Սյունիք","lang":"hy","lname":"Syunik","zip":"3[2-5]","zipex":"3201,3519","isoid":"SU"}
+data/AM/Վայոց ձոր={"id":"data/AM/Վայոց ձոր","key":"Վայոց ձոր","lang":"hy","lname":"Vayots Dzor","zip":"3[6-8]","zipex":"3601,3810","isoid":"VD"}
+data/AM/Տավուշ={"id":"data/AM/Տավուշ","key":"Տավուշ","lang":"hy","lname":"Tavush","zip":"39|4[0-2]","zipex":"3901,4216","isoid":"TV"}
+data/AN={"id":"data/AN","key":"AN","name":"NETHERLANDS ANTILLES"}
+data/AO={"id":"data/AO","key":"AO","name":"ANGOLA"}
+data/AQ={"id":"data/AQ","key":"AQ","name":"ANTARCTICA"}
+data/AR={"id":"data/AR","key":"AR","name":"ARGENTINA","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z %C%n%S","upper":"ACZ","zip":"([A-HJ-NP-Z])?\\d{4}([A-Z]{3})?","zipex":"C1070AAM,C1000WAM,B1000TBU,X5187XAB","posturl":"http://www.correoargentino.com.ar/cpa","state_name_type":"state","sub_keys":"Buenos Aires~Capital Federal~Catamarca~Chaco~Chubut~Córdoba~Corrientes~Entre Ríos~Formosa~Jujuy~La Pampa~La Rioja~Mendoza~Misiones~Neuquén~Río Negro~Salta~San Juan~San Luis~Santa Cruz~Santa Fe~Santiago del Estero~Tierra del Fuego~Tucumán","sub_names":"Buenos Aires~Capital Federal~Catamarca~Chaco~Chubut~Córdoba~Corrientes~Entre Ríos~Formosa~Jujuy~La Pampa~La Rioja~Mendoza~Misiones~Neuquén~Río Negro~Salta~San Juan~San Luis~Santa Cruz~Santa Fe~Santiago del Estero~Tierra del Fuego~Tucumán","sub_zips":"B?[1-36-8]~C?1~K?[45]~H?3~U?[89]~X?[235-8]~W?3~E?[1-3]~P?[37]~Y?4~L?[3568]~F?5~M?[56]~N?3~Q?[38]~R?[89]~A?[34]~J?5~D?[4-6]~Z?[89]~S?[2368]~G?[2-5]~V?9~T?[45]","sub_isoids":"B~C~K~H~U~X~W~E~P~Y~L~F~M~N~Q~R~A~J~D~Z~S~G~V~T"}
+data/AR/Buenos Aires={"id":"data/AR/Buenos Aires","key":"Buenos Aires","name":"Buenos Aires","lang":"es","zip":"B?[1-36-8]","isoid":"B"}
+data/AR/Capital Federal={"id":"data/AR/Capital Federal","key":"Capital Federal","name":"Capital Federal","lang":"es","zip":"C?1","isoid":"C"}
+data/AR/Catamarca={"id":"data/AR/Catamarca","key":"Catamarca","name":"Catamarca","lang":"es","zip":"K?[45]","isoid":"K"}
+data/AR/Chaco={"id":"data/AR/Chaco","key":"Chaco","name":"Chaco","lang":"es","zip":"H?3","isoid":"H"}
+data/AR/Chubut={"id":"data/AR/Chubut","key":"Chubut","name":"Chubut","lang":"es","zip":"U?[89]","isoid":"U"}
+data/AR/Corrientes={"id":"data/AR/Corrientes","key":"Corrientes","name":"Corrientes","lang":"es","zip":"W?3","isoid":"W"}
+data/AR/Córdoba={"id":"data/AR/Córdoba","key":"Córdoba","name":"Córdoba","lang":"es","zip":"X?[235-8]","isoid":"X"}
+data/AR/Entre Ríos={"id":"data/AR/Entre Ríos","key":"Entre Ríos","name":"Entre Ríos","lang":"es","zip":"E?[1-3]","isoid":"E"}
+data/AR/Formosa={"id":"data/AR/Formosa","key":"Formosa","name":"Formosa","lang":"es","zip":"P?[37]","isoid":"P"}
+data/AR/Jujuy={"id":"data/AR/Jujuy","key":"Jujuy","name":"Jujuy","lang":"es","zip":"Y?4","isoid":"Y"}
+data/AR/La Pampa={"id":"data/AR/La Pampa","key":"La Pampa","name":"La Pampa","lang":"es","zip":"L?[3568]","isoid":"L"}
+data/AR/La Rioja={"id":"data/AR/La Rioja","key":"La Rioja","name":"La Rioja","lang":"es","zip":"F?5","isoid":"F"}
+data/AR/Mendoza={"id":"data/AR/Mendoza","key":"Mendoza","name":"Mendoza","lang":"es","zip":"M?[56]","isoid":"M"}
+data/AR/Misiones={"id":"data/AR/Misiones","key":"Misiones","name":"Misiones","lang":"es","zip":"N?3","isoid":"N"}
+data/AR/Neuquén={"id":"data/AR/Neuquén","key":"Neuquén","name":"Neuquén","lang":"es","zip":"Q?[38]","isoid":"Q"}
+data/AR/Río Negro={"id":"data/AR/Río Negro","key":"Río Negro","name":"Río Negro","lang":"es","zip":"R?[89]","isoid":"R"}
+data/AR/Salta={"id":"data/AR/Salta","key":"Salta","name":"Salta","lang":"es","zip":"A?[34]","isoid":"A"}
+data/AR/San Juan={"id":"data/AR/San Juan","key":"San Juan","name":"San Juan","lang":"es","zip":"J?5","isoid":"J"}
+data/AR/San Luis={"id":"data/AR/San Luis","key":"San Luis","name":"San Luis","lang":"es","zip":"D?[4-6]","isoid":"D"}
+data/AR/Santa Cruz={"id":"data/AR/Santa Cruz","key":"Santa Cruz","name":"Santa Cruz","lang":"es","zip":"Z?[89]","isoid":"Z"}
+data/AR/Santa Fe={"id":"data/AR/Santa Fe","key":"Santa Fe","name":"Santa Fe","lang":"es","zip":"S?[2368]","isoid":"S"}
+data/AR/Santiago del Estero={"id":"data/AR/Santiago del Estero","key":"Santiago del Estero","name":"Santiago del Estero","lang":"es","zip":"G?[2-5]","isoid":"G"}
+data/AR/Tierra del Fuego={"id":"data/AR/Tierra del Fuego","key":"Tierra del Fuego","name":"Tierra del Fuego","lang":"es","zip":"V?9","isoid":"V"}
+data/AR/Tucumán={"id":"data/AR/Tucumán","key":"Tucumán","name":"Tucumán","lang":"es","zip":"T?[45]","isoid":"T"}
+data/AS={"id":"data/AS","key":"AS","name":"AMERICAN SAMOA","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"96799","zipex":"96799","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/AT={"id":"data/AT","key":"AT","name":"AUSTRIA","fmt":"%O%n%N%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"1010,3741","posturl":"http://www.post.at/post_subsite_postleitzahlfinder.php"}
+data/AU={"id":"data/AU","key":"AU","name":"AUSTRALIA","lang":"en","languages":"en","fmt":"%O%n%N%n%A%n%C %S %Z","require":"ACSZ","upper":"CS","zip":"\\d{4}","zipex":"2060,3171,6430,4000,4006,3001","posturl":"http://www1.auspost.com.au/postcodes/","state_name_type":"state","sub_keys":"ACT~NSW~NT~QLD~SA~TAS~VIC~WA","sub_names":"Australian Capital Territory~New South Wales~Northern Territory~Queensland~South Australia~Tasmania~Victoria~Western Australia","sub_zips":"29|2540|260|261[0-8]|02|2620~1|2[0-57-8]|26[2-9]|261[189]|3500|3585|3586|3644|3707~0[89]~[49]~5|0872~7~[38]~6|0872","sub_zipexs":"0200,0299:2540:2600,2618:2620:2900,2999~1000,1999:2000,2999:3500:3585:3586:3644:3707~0800,0999~4000,4999:9000,9999~5000,5999:0872~7000,7999~3000,3999:8000,8999~6000,6999:0872"}
+data/AU/ACT={"id":"data/AU/ACT","key":"ACT","name":"Australian Capital Territory","lang":"en","zip":"29|2540|260|261[0-8]|02|2620","zipex":"0200,0299:2540:2600,2618:2620:2900,2999"}
+data/AU/NSW={"id":"data/AU/NSW","key":"NSW","name":"New South Wales","lang":"en","zip":"1|2[0-57-8]|26[2-9]|261[189]|3500|3585|3586|3644|3707","zipex":"1000,1999:2000,2999:3500:3585:3586:3644:3707"}
+data/AU/NT={"id":"data/AU/NT","key":"NT","name":"Northern Territory","lang":"en","zip":"0[89]","zipex":"0800,0999"}
+data/AU/QLD={"id":"data/AU/QLD","key":"QLD","name":"Queensland","lang":"en","zip":"[49]","zipex":"4000,4999:9000,9999"}
+data/AU/SA={"id":"data/AU/SA","key":"SA","name":"South Australia","lang":"en","zip":"5|0872","zipex":"5000,5999:0872"}
+data/AU/TAS={"id":"data/AU/TAS","key":"TAS","name":"Tasmania","lang":"en","zip":"7","zipex":"7000,7999"}
+data/AU/VIC={"id":"data/AU/VIC","key":"VIC","name":"Victoria","lang":"en","zip":"[38]","zipex":"3000,3999:8000,8999"}
+data/AU/WA={"id":"data/AU/WA","key":"WA","name":"Western Australia","lang":"en","zip":"6|0872","zipex":"6000,6999:0872"}
+data/AW={"id":"data/AW","key":"AW","name":"ARUBA"}
+data/AX={"id":"data/AX","key":"AX","name":"FINLAND","fmt":"%O%n%N%n%A%nAX-%Z %C%nÅLAND","require":"ACZ","zip":"22\\d{3}","zipex":"22150,22550,22240,22710,22270,22730,22430","posturl":"http://www.posten.ax/department.con?iPage=123","postprefix":"AX-"}
+data/AZ={"id":"data/AZ","key":"AZ","name":"AZERBAIJAN","fmt":"%N%n%O%n%A%nAZ %Z %C","zip":"\\d{4}","zipex":"1000","postprefix":"AZ "}
+data/BA={"id":"data/BA","key":"BA","name":"BOSNIA AND HERZEGOVINA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"71000","posturl":"http://www.post.ba/postanski_brojevi.php"}
+data/BB={"id":"data/BB","key":"BB","name":"BARBADOS","zip":"(BB\\d{5})?","zipex":"BB23026,BB22025","posturl":"http://barbadospostal.com/zipcodes.html","state_name_type":"parish"}
+data/BD={"id":"data/BD","key":"BD","name":"BANGLADESH","fmt":"%N%n%O%n%A%n%C - %Z","zip":"\\d{4}","zipex":"1340,1000","posturl":"http://www.bangladeshpost.gov.bd/PostCode.asp"}
+data/BE={"id":"data/BE","key":"BE","name":"BELGIUM","fmt":"%O%n%N%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"4000,1000","posturl":"http://www.post.be/site/nl/residential/customerservice/search/postal_codes.html"}
+data/BF={"id":"data/BF","key":"BF","name":"BURKINA FASO","fmt":"%N%n%O%n%A%n%C %X"}
+data/BG={"id":"data/BG","key":"BG","name":"BULGARIA (REP.)","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1000,1700","posturl":"http://www.bgpost.bg/?cid=5"}
+data/BH={"id":"data/BH","key":"BH","name":"BAHRAIN","fmt":"%N%n%O%n%A%n%C %Z","zip":"((\\d|1[0-2])\\d{2})?","zipex":"317"}
+data/BI={"id":"data/BI","key":"BI","name":"BURUNDI"}
+data/BJ={"id":"data/BJ","key":"BJ","name":"BENIN","upper":"AC"}
+data/BL={"id":"data/BL","key":"BL","name":"SAINT BARTHELEMY","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78][01]\\d{2}","zipex":"97100","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/BM={"id":"data/BM","key":"BM","name":"BERMUDA","fmt":"%N%n%O%n%A%n%C %Z","zip":"[A-Z]{2}[ ]?[A-Z0-9]{2}","zipex":"FL 07,HM GX,HM 12","posturl":"http://www.landvaluation.bm/"}
+data/BN={"id":"data/BN","key":"BN","name":"BRUNEI DARUSSALAM","fmt":"%N%n%O%n%A%n%C %Z","zip":"[A-Z]{2}[ ]?\\d{4}","zipex":"BT2328,KA1131,BA1511","posturl":"http://www.post.gov.bn/index.php/extensions/postcode-guide"}
+data/BO={"id":"data/BO","key":"BO","name":"BOLIVIA","upper":"AC"}
+data/BR={"id":"data/BR","key":"BR","name":"BRAZIL","lang":"pt","languages":"pt","fmt":"%O%n%N%n%A%n%C-%S%n%Z","require":"ASCZ","upper":"CS","zip":"\\d{5}[\\-]?\\d{3}","zipex":"40301-110,70002-900","posturl":"http://www.correios.com.br/servicos/cep/cep_default.cfm","state_name_type":"state","sub_keys":"AC~AL~AP~AM~BA~CE~DF~ES~GO~MA~MT~MS~MG~PA~PB~PR~PE~PI~RJ~RN~RS~RO~RR~SC~SP~SE~TO","sub_names":"Acre~Alagoas~Amapá~Amazonas~Bahia~Ceará~Distrito Federal~Espírito Santo~Goiás~Maranhão~Mato Grosso~Mato Grosso do Sul~Minas Gerais~Pará~Paraíba~Paraná~Pernambuco~Piauí~Rio de Janeiro~Rio Grande do Norte~Rio Grande do Sul~Rondônia~Roraima~Santa Catarina~São Paulo~Sergipe~Tocantins","sub_zips":"699~57~689~69[0-24-8]~4[0-8]~6[0-3]~7[0-1]|72[0-7]|73[0-6]~29~72[89]|73[7-9]|7[4-6]~65~78[0-8]~79~3~6[6-7]|68[0-8]~58~8[0-7]~5[0-6]~64~2[0-8]~59~9~76[89]|789~693~8[89]~[01][1-9]~49~77","sub_zipexs":"69900-000,69999-999~57000-000,57999-999~68900-000,68999-999~69000-000,69299-999:69400-000,69899-999~40000-000,48999-999~60000-000,63999-999~70000-000,72799-999:73000-000,73699-999~29000-000,29999-999~72800-000,72999-999:73700-000,76999-999~65000-000,65999-999~78000-000,78899-999~79000-000,79999-999~30000-000,39999-999~66000-000,68899-999~58000-000,58999-999~80000-000,87999-999~50000-000,56999-999~64000-000,64999-999~20000-000,28999-999~59000-000,59999-999~90000-000,99999-999~76800-000,78900-000,78999-999~69300-000,69399-999~88000-000,89999-999~01000-000,09999-999:11000-000,19999-999~49000-000,49999-999~77000-000,77999-999","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/BR/AC={"id":"data/BR/AC","key":"AC","name":"Acre","lang":"pt","zip":"699","zipex":"69900-000,69999-999","sub_keys":"Acrelândia~Assis Brasil~Brasiléia~Bujari~Capixaba~Cruzeiro do Sul~Epitaciolândia~Feijó~Jordão~Mâncio Lima~Manoel Urbano~Marechal Thaumaturgo~Plácido de Castro~Porto Acre~Porto Walter~Rio Branco~Rodrigues Alves~Santa Rosa do Purus~Sena Madureira~Senador Guiomard~Tarauacá~Xapuri"}
+data/BR/AC/Acrelândia={"id":"data/BR/AC/Acrelândia","key":"Acrelândia","lang":"pt"}
+data/BR/AC/Assis Brasil={"id":"data/BR/AC/Assis Brasil","key":"Assis Brasil","lang":"pt"}
+data/BR/AC/Brasiléia={"id":"data/BR/AC/Brasiléia","key":"Brasiléia","lang":"pt"}
+data/BR/AC/Bujari={"id":"data/BR/AC/Bujari","key":"Bujari","lang":"pt"}
+data/BR/AC/Capixaba={"id":"data/BR/AC/Capixaba","key":"Capixaba","lang":"pt"}
+data/BR/AC/Cruzeiro do Sul={"id":"data/BR/AC/Cruzeiro do Sul","key":"Cruzeiro do Sul","lang":"pt"}
+data/BR/AC/Epitaciolândia={"id":"data/BR/AC/Epitaciolândia","key":"Epitaciolândia","lang":"pt"}
+data/BR/AC/Feijó={"id":"data/BR/AC/Feijó","key":"Feijó","lang":"pt"}
+data/BR/AC/Jordão={"id":"data/BR/AC/Jordão","key":"Jordão","lang":"pt"}
+data/BR/AC/Manoel Urbano={"id":"data/BR/AC/Manoel Urbano","key":"Manoel Urbano","lang":"pt"}
+data/BR/AC/Marechal Thaumaturgo={"id":"data/BR/AC/Marechal Thaumaturgo","key":"Marechal Thaumaturgo","lang":"pt"}
+data/BR/AC/Mâncio Lima={"id":"data/BR/AC/Mâncio Lima","key":"Mâncio Lima","lang":"pt"}
+data/BR/AC/Plácido de Castro={"id":"data/BR/AC/Plácido de Castro","key":"Plácido de Castro","lang":"pt"}
+data/BR/AC/Porto Acre={"id":"data/BR/AC/Porto Acre","key":"Porto Acre","lang":"pt"}
+data/BR/AC/Porto Walter={"id":"data/BR/AC/Porto Walter","key":"Porto Walter","lang":"pt"}
+data/BR/AC/Rio Branco={"id":"data/BR/AC/Rio Branco","key":"Rio Branco","lang":"pt"}
+data/BR/AC/Rodrigues Alves={"id":"data/BR/AC/Rodrigues Alves","key":"Rodrigues Alves","lang":"pt"}
+data/BR/AC/Santa Rosa do Purus={"id":"data/BR/AC/Santa Rosa do Purus","key":"Santa Rosa do Purus","lang":"pt"}
+data/BR/AC/Sena Madureira={"id":"data/BR/AC/Sena Madureira","key":"Sena Madureira","lang":"pt"}
+data/BR/AC/Senador Guiomard={"id":"data/BR/AC/Senador Guiomard","key":"Senador Guiomard","lang":"pt"}
+data/BR/AC/Tarauacá={"id":"data/BR/AC/Tarauacá","key":"Tarauacá","lang":"pt"}
+data/BR/AC/Xapuri={"id":"data/BR/AC/Xapuri","key":"Xapuri","lang":"pt"}
+data/BR/AL={"id":"data/BR/AL","key":"AL","name":"Alagoas","lang":"pt","zip":"57","zipex":"57000-000,57999-999","sub_keys":"Água Branca~Anadia~Arapiraca~Atalaia~Barra de Santo Antônio~Barra de São Miguel~Batalha~Belém~Belo Monte~Boca da Mata~Branquinha~Cacimbinhas~Cajueiro~Campestre~Campo Alegre~Campo Grande~Canapi~Capela~Carneiros~Chã Preta~Coité do Nóia~Colônia Leopoldina~Coqueiro Seco~Coruripe~Craíbas~Delmiro Gouveia~Dois Riachos~Estrela de Alagoas~Feira Grande~Feliz Deserto~Flexeiras~Girau do Ponciano~Ibateguara~Igaci~Igreja Nova~Inhapi~Jacaré dos Homens~Jacuípe~Japaratinga~Jaramataia~Jequiá da Praia~Joaquim Gomes~Jundiá~Junqueiro~Lagoa da Canoa~Limoeiro de Anadia~Maceió~Major Isidoro~Mar Vermelho~Maragogi~Maravilha~Marechal Deodoro~Maribondo~Mata Grande~Matriz de Camaragibe~Messias~Minador do Negrão~Monteirópolis~Murici~Novo Lino~Olho d'Água das Flores~Olho d'Água do Casado~Olho d'Água Grande~Olivença~Ouro Branco~Palestina~Palmeira dos Índios~Pão de Açúcar~Pariconha~Paripueira~Passo de Camaragibe~Paulo Jacinto~Penedo~Piaçabuçu~Pilar~Pindoba~Piranhas~Poço das Trincheiras~Porto Calvo~Porto de Pedras~Porto Real do Colégio~Quebrangulo~Rio Largo~Roteiro~Santa Luzia do Norte~Santana do Ipanema~Santana do Mundaú~São Brás~São José da Laje~São José da Tapera~São Luís do Quitunde~São Miguel dos Campos~São Miguel dos Milagres~São Sebastião~Satuba~Senador Rui Palmeira~Tanque d'Arca~Taquarana~Teotônio Vilela~Traipu~União dos Palmares~Viçosa"}
+data/BR/AL/Anadia={"id":"data/BR/AL/Anadia","key":"Anadia","lang":"pt"}
+data/BR/AL/Arapiraca={"id":"data/BR/AL/Arapiraca","key":"Arapiraca","lang":"pt"}
+data/BR/AL/Atalaia={"id":"data/BR/AL/Atalaia","key":"Atalaia","lang":"pt"}
+data/BR/AL/Barra de Santo Antônio={"id":"data/BR/AL/Barra de Santo Antônio","key":"Barra de Santo Antônio","lang":"pt"}
+data/BR/AL/Barra de São Miguel={"id":"data/BR/AL/Barra de São Miguel","key":"Barra de São Miguel","lang":"pt"}
+data/BR/AL/Batalha={"id":"data/BR/AL/Batalha","key":"Batalha","lang":"pt"}
+data/BR/AL/Belo Monte={"id":"data/BR/AL/Belo Monte","key":"Belo Monte","lang":"pt"}
+data/BR/AL/Belém={"id":"data/BR/AL/Belém","key":"Belém","lang":"pt"}
+data/BR/AL/Boca da Mata={"id":"data/BR/AL/Boca da Mata","key":"Boca da Mata","lang":"pt"}
+data/BR/AL/Branquinha={"id":"data/BR/AL/Branquinha","key":"Branquinha","lang":"pt"}
+data/BR/AL/Cacimbinhas={"id":"data/BR/AL/Cacimbinhas","key":"Cacimbinhas","lang":"pt"}
+data/BR/AL/Cajueiro={"id":"data/BR/AL/Cajueiro","key":"Cajueiro","lang":"pt"}
+data/BR/AL/Campestre={"id":"data/BR/AL/Campestre","key":"Campestre","lang":"pt"}
+data/BR/AL/Campo Alegre={"id":"data/BR/AL/Campo Alegre","key":"Campo Alegre","lang":"pt"}
+data/BR/AL/Campo Grande={"id":"data/BR/AL/Campo Grande","key":"Campo Grande","lang":"pt"}
+data/BR/AL/Canapi={"id":"data/BR/AL/Canapi","key":"Canapi","lang":"pt"}
+data/BR/AL/Capela={"id":"data/BR/AL/Capela","key":"Capela","lang":"pt"}
+data/BR/AL/Carneiros={"id":"data/BR/AL/Carneiros","key":"Carneiros","lang":"pt"}
+data/BR/AL/Chã Preta={"id":"data/BR/AL/Chã Preta","key":"Chã Preta","lang":"pt"}
+data/BR/AL/Coité do Nóia={"id":"data/BR/AL/Coité do Nóia","key":"Coité do Nóia","lang":"pt"}
+data/BR/AL/Colônia Leopoldina={"id":"data/BR/AL/Colônia Leopoldina","key":"Colônia Leopoldina","lang":"pt"}
+data/BR/AL/Coqueiro Seco={"id":"data/BR/AL/Coqueiro Seco","key":"Coqueiro Seco","lang":"pt"}
+data/BR/AL/Coruripe={"id":"data/BR/AL/Coruripe","key":"Coruripe","lang":"pt"}
+data/BR/AL/Craíbas={"id":"data/BR/AL/Craíbas","key":"Craíbas","lang":"pt"}
+data/BR/AL/Delmiro Gouveia={"id":"data/BR/AL/Delmiro Gouveia","key":"Delmiro Gouveia","lang":"pt"}
+data/BR/AL/Dois Riachos={"id":"data/BR/AL/Dois Riachos","key":"Dois Riachos","lang":"pt"}
+data/BR/AL/Estrela de Alagoas={"id":"data/BR/AL/Estrela de Alagoas","key":"Estrela de Alagoas","lang":"pt"}
+data/BR/AL/Feira Grande={"id":"data/BR/AL/Feira Grande","key":"Feira Grande","lang":"pt"}
+data/BR/AL/Feliz Deserto={"id":"data/BR/AL/Feliz Deserto","key":"Feliz Deserto","lang":"pt"}
+data/BR/AL/Flexeiras={"id":"data/BR/AL/Flexeiras","key":"Flexeiras","lang":"pt"}
+data/BR/AL/Girau do Ponciano={"id":"data/BR/AL/Girau do Ponciano","key":"Girau do Ponciano","lang":"pt"}
+data/BR/AL/Ibateguara={"id":"data/BR/AL/Ibateguara","key":"Ibateguara","lang":"pt"}
+data/BR/AL/Igaci={"id":"data/BR/AL/Igaci","key":"Igaci","lang":"pt"}
+data/BR/AL/Igreja Nova={"id":"data/BR/AL/Igreja Nova","key":"Igreja Nova","lang":"pt"}
+data/BR/AL/Inhapi={"id":"data/BR/AL/Inhapi","key":"Inhapi","lang":"pt"}
+data/BR/AL/Jacaré dos Homens={"id":"data/BR/AL/Jacaré dos Homens","key":"Jacaré dos Homens","lang":"pt"}
+data/BR/AL/Jacuípe={"id":"data/BR/AL/Jacuípe","key":"Jacuípe","lang":"pt"}
+data/BR/AL/Japaratinga={"id":"data/BR/AL/Japaratinga","key":"Japaratinga","lang":"pt"}
+data/BR/AL/Jaramataia={"id":"data/BR/AL/Jaramataia","key":"Jaramataia","lang":"pt"}
+data/BR/AL/Jequiá da Praia={"id":"data/BR/AL/Jequiá da Praia","key":"Jequiá da Praia","lang":"pt"}
+data/BR/AL/Joaquim Gomes={"id":"data/BR/AL/Joaquim Gomes","key":"Joaquim Gomes","lang":"pt"}
+data/BR/AL/Jundiá={"id":"data/BR/AL/Jundiá","key":"Jundiá","lang":"pt"}
+data/BR/AL/Junqueiro={"id":"data/BR/AL/Junqueiro","key":"Junqueiro","lang":"pt"}
+data/BR/AL/Lagoa da Canoa={"id":"data/BR/AL/Lagoa da Canoa","key":"Lagoa da Canoa","lang":"pt"}
+data/BR/AL/Limoeiro de Anadia={"id":"data/BR/AL/Limoeiro de Anadia","key":"Limoeiro de Anadia","lang":"pt"}
+data/BR/AL/Maceió={"id":"data/BR/AL/Maceió","key":"Maceió","lang":"pt"}
+data/BR/AL/Major Isidoro={"id":"data/BR/AL/Major Isidoro","key":"Major Isidoro","lang":"pt"}
+data/BR/AL/Mar Vermelho={"id":"data/BR/AL/Mar Vermelho","key":"Mar Vermelho","lang":"pt"}
+data/BR/AL/Maragogi={"id":"data/BR/AL/Maragogi","key":"Maragogi","lang":"pt"}
+data/BR/AL/Maravilha={"id":"data/BR/AL/Maravilha","key":"Maravilha","lang":"pt"}
+data/BR/AL/Marechal Deodoro={"id":"data/BR/AL/Marechal Deodoro","key":"Marechal Deodoro","lang":"pt"}
+data/BR/AL/Maribondo={"id":"data/BR/AL/Maribondo","key":"Maribondo","lang":"pt"}
+data/BR/AL/Mata Grande={"id":"data/BR/AL/Mata Grande","key":"Mata Grande","lang":"pt"}
+data/BR/AL/Matriz de Camaragibe={"id":"data/BR/AL/Matriz de Camaragibe","key":"Matriz de Camaragibe","lang":"pt"}
+data/BR/AL/Messias={"id":"data/BR/AL/Messias","key":"Messias","lang":"pt"}
+data/BR/AL/Minador do Negrão={"id":"data/BR/AL/Minador do Negrão","key":"Minador do Negrão","lang":"pt"}
+data/BR/AL/Monteirópolis={"id":"data/BR/AL/Monteirópolis","key":"Monteirópolis","lang":"pt"}
+data/BR/AL/Murici={"id":"data/BR/AL/Murici","key":"Murici","lang":"pt"}
+data/BR/AL/Novo Lino={"id":"data/BR/AL/Novo Lino","key":"Novo Lino","lang":"pt"}
+data/BR/AL/Olho d'Água Grande={"id":"data/BR/AL/Olho d'Água Grande","key":"Olho d'Água Grande","lang":"pt"}
+data/BR/AL/Olho d'Água das Flores={"id":"data/BR/AL/Olho d'Água das Flores","key":"Olho d'Água das Flores","lang":"pt"}
+data/BR/AL/Olho d'Água do Casado={"id":"data/BR/AL/Olho d'Água do Casado","key":"Olho d'Água do Casado","lang":"pt"}
+data/BR/AL/Olivença={"id":"data/BR/AL/Olivença","key":"Olivença","lang":"pt"}
+data/BR/AL/Ouro Branco={"id":"data/BR/AL/Ouro Branco","key":"Ouro Branco","lang":"pt"}
+data/BR/AL/Palestina={"id":"data/BR/AL/Palestina","key":"Palestina","lang":"pt"}
+data/BR/AL/Palmeira dos Índios={"id":"data/BR/AL/Palmeira dos Índios","key":"Palmeira dos Índios","lang":"pt"}
+data/BR/AL/Pariconha={"id":"data/BR/AL/Pariconha","key":"Pariconha","lang":"pt"}
+data/BR/AL/Paripueira={"id":"data/BR/AL/Paripueira","key":"Paripueira","lang":"pt"}
+data/BR/AL/Passo de Camaragibe={"id":"data/BR/AL/Passo de Camaragibe","key":"Passo de Camaragibe","lang":"pt"}
+data/BR/AL/Paulo Jacinto={"id":"data/BR/AL/Paulo Jacinto","key":"Paulo Jacinto","lang":"pt"}
+data/BR/AL/Penedo={"id":"data/BR/AL/Penedo","key":"Penedo","lang":"pt"}
+data/BR/AL/Piaçabuçu={"id":"data/BR/AL/Piaçabuçu","key":"Piaçabuçu","lang":"pt"}
+data/BR/AL/Pilar={"id":"data/BR/AL/Pilar","key":"Pilar","lang":"pt"}
+data/BR/AL/Pindoba={"id":"data/BR/AL/Pindoba","key":"Pindoba","lang":"pt"}
+data/BR/AL/Piranhas={"id":"data/BR/AL/Piranhas","key":"Piranhas","lang":"pt"}
+data/BR/AL/Porto Calvo={"id":"data/BR/AL/Porto Calvo","key":"Porto Calvo","lang":"pt"}
+data/BR/AL/Porto Real do Colégio={"id":"data/BR/AL/Porto Real do Colégio","key":"Porto Real do Colégio","lang":"pt"}
+data/BR/AL/Porto de Pedras={"id":"data/BR/AL/Porto de Pedras","key":"Porto de Pedras","lang":"pt"}
+data/BR/AL/Poço das Trincheiras={"id":"data/BR/AL/Poço das Trincheiras","key":"Poço das Trincheiras","lang":"pt"}
+data/BR/AL/Pão de Açúcar={"id":"data/BR/AL/Pão de Açúcar","key":"Pão de Açúcar","lang":"pt"}
+data/BR/AL/Quebrangulo={"id":"data/BR/AL/Quebrangulo","key":"Quebrangulo","lang":"pt"}
+data/BR/AL/Rio Largo={"id":"data/BR/AL/Rio Largo","key":"Rio Largo","lang":"pt"}
+data/BR/AL/Roteiro={"id":"data/BR/AL/Roteiro","key":"Roteiro","lang":"pt"}
+data/BR/AL/Santa Luzia do Norte={"id":"data/BR/AL/Santa Luzia do Norte","key":"Santa Luzia do Norte","lang":"pt"}
+data/BR/AL/Santana do Ipanema={"id":"data/BR/AL/Santana do Ipanema","key":"Santana do Ipanema","lang":"pt"}
+data/BR/AL/Santana do Mundaú={"id":"data/BR/AL/Santana do Mundaú","key":"Santana do Mundaú","lang":"pt"}
+data/BR/AL/Satuba={"id":"data/BR/AL/Satuba","key":"Satuba","lang":"pt"}
+data/BR/AL/Senador Rui Palmeira={"id":"data/BR/AL/Senador Rui Palmeira","key":"Senador Rui Palmeira","lang":"pt"}
+data/BR/AL/São Brás={"id":"data/BR/AL/São Brás","key":"São Brás","lang":"pt"}
+data/BR/AL/São José da Laje={"id":"data/BR/AL/São José da Laje","key":"São José da Laje","lang":"pt"}
+data/BR/AL/São José da Tapera={"id":"data/BR/AL/São José da Tapera","key":"São José da Tapera","lang":"pt"}
+data/BR/AL/São Luís do Quitunde={"id":"data/BR/AL/São Luís do Quitunde","key":"São Luís do Quitunde","lang":"pt"}
+data/BR/AL/São Miguel dos Campos={"id":"data/BR/AL/São Miguel dos Campos","key":"São Miguel dos Campos","lang":"pt"}
+data/BR/AL/São Miguel dos Milagres={"id":"data/BR/AL/São Miguel dos Milagres","key":"São Miguel dos Milagres","lang":"pt"}
+data/BR/AL/São Sebastião={"id":"data/BR/AL/São Sebastião","key":"São Sebastião","lang":"pt"}
+data/BR/AL/Tanque d'Arca={"id":"data/BR/AL/Tanque d'Arca","key":"Tanque d'Arca","lang":"pt"}
+data/BR/AL/Taquarana={"id":"data/BR/AL/Taquarana","key":"Taquarana","lang":"pt"}
+data/BR/AL/Teotônio Vilela={"id":"data/BR/AL/Teotônio Vilela","key":"Teotônio Vilela","lang":"pt"}
+data/BR/AL/Traipu={"id":"data/BR/AL/Traipu","key":"Traipu","lang":"pt"}
+data/BR/AL/União dos Palmares={"id":"data/BR/AL/União dos Palmares","key":"União dos Palmares","lang":"pt"}
+data/BR/AL/Viçosa={"id":"data/BR/AL/Viçosa","key":"Viçosa","lang":"pt"}
+data/BR/AL/Água Branca={"id":"data/BR/AL/Água Branca","key":"Água Branca","lang":"pt"}
+data/BR/AM={"id":"data/BR/AM","key":"AM","name":"Amazonas","lang":"pt","zip":"69[0-24-8]","zipex":"69000-000,69299-999:69400-000,69899-999","sub_keys":"Alvarães~Amaturá~Anamã~Anorí~Apuí~Atalaia do Norte~Autazes~Barcelos~Barreirinha~Benjamin Constant~Beruri~Boa Vista do Ramos~Boca do Acre~Borba~Caapiranga~Canutama~Carauari~Careiro~Careiro da Várzea~Coari~Codajás~Eirunepé~Envira~Fonte Boa~Guajará~Humaitá~Ipixuna~Iranduba~Itacoatiara~Itamarati~Itapiranga~Japurá~Jurua~Jutaí~Lábrea~Manacapuru~Manaquiri~Manaus~Manicoré~Maraã~Maués~Nhamundá~Nova Olinda do Norte~Novo Airão~Novo Aripuanã~Parintins~Pauini~Presidente Figueiredo~Rio Preto da Eva~Santa Isabel do Rio Negro~Santo Antônio do Içá~São Gabriel da Cachoeira~São Paulo de Olivença~São Sebastião do Uatumã~Silves~Tabatinga~Tapauá~Tefé~Tonantins~Uarini~Urucará~Urucurituba"}
+data/BR/AM/Alvarães={"id":"data/BR/AM/Alvarães","key":"Alvarães","lang":"pt"}
+data/BR/AM/Amaturá={"id":"data/BR/AM/Amaturá","key":"Amaturá","lang":"pt"}
+data/BR/AM/Anamã={"id":"data/BR/AM/Anamã","key":"Anamã","lang":"pt"}
+data/BR/AM/Anorí={"id":"data/BR/AM/Anorí","key":"Anorí","lang":"pt"}
+data/BR/AM/Apuí={"id":"data/BR/AM/Apuí","key":"Apuí","lang":"pt"}
+data/BR/AM/Atalaia do Norte={"id":"data/BR/AM/Atalaia do Norte","key":"Atalaia do Norte","lang":"pt"}
+data/BR/AM/Autazes={"id":"data/BR/AM/Autazes","key":"Autazes","lang":"pt"}
+data/BR/AM/Barcelos={"id":"data/BR/AM/Barcelos","key":"Barcelos","lang":"pt"}
+data/BR/AM/Barreirinha={"id":"data/BR/AM/Barreirinha","key":"Barreirinha","lang":"pt"}
+data/BR/AM/Benjamin Constant={"id":"data/BR/AM/Benjamin Constant","key":"Benjamin Constant","lang":"pt"}
+data/BR/AM/Beruri={"id":"data/BR/AM/Beruri","key":"Beruri","lang":"pt"}
+data/BR/AM/Boa Vista do Ramos={"id":"data/BR/AM/Boa Vista do Ramos","key":"Boa Vista do Ramos","lang":"pt"}
+data/BR/AM/Boca do Acre={"id":"data/BR/AM/Boca do Acre","key":"Boca do Acre","lang":"pt"}
+data/BR/AM/Borba={"id":"data/BR/AM/Borba","key":"Borba","lang":"pt"}
+data/BR/AM/Caapiranga={"id":"data/BR/AM/Caapiranga","key":"Caapiranga","lang":"pt"}
+data/BR/AM/Canutama={"id":"data/BR/AM/Canutama","key":"Canutama","lang":"pt"}
+data/BR/AM/Carauari={"id":"data/BR/AM/Carauari","key":"Carauari","lang":"pt"}
+data/BR/AM/Careiro={"id":"data/BR/AM/Careiro","key":"Careiro","lang":"pt"}
+data/BR/AM/Careiro da Várzea={"id":"data/BR/AM/Careiro da Várzea","key":"Careiro da Várzea","lang":"pt"}
+data/BR/AM/Coari={"id":"data/BR/AM/Coari","key":"Coari","lang":"pt"}
+data/BR/AM/Codajás={"id":"data/BR/AM/Codajás","key":"Codajás","lang":"pt"}
+data/BR/AM/Eirunepé={"id":"data/BR/AM/Eirunepé","key":"Eirunepé","lang":"pt"}
+data/BR/AM/Envira={"id":"data/BR/AM/Envira","key":"Envira","lang":"pt"}
+data/BR/AM/Fonte Boa={"id":"data/BR/AM/Fonte Boa","key":"Fonte Boa","lang":"pt"}
+data/BR/AM/Guajará={"id":"data/BR/AM/Guajará","key":"Guajará","lang":"pt"}
+data/BR/AM/Humaitá={"id":"data/BR/AM/Humaitá","key":"Humaitá","lang":"pt"}
+data/BR/AM/Ipixuna={"id":"data/BR/AM/Ipixuna","key":"Ipixuna","lang":"pt"}
+data/BR/AM/Iranduba={"id":"data/BR/AM/Iranduba","key":"Iranduba","lang":"pt"}
+data/BR/AM/Itacoatiara={"id":"data/BR/AM/Itacoatiara","key":"Itacoatiara","lang":"pt"}
+data/BR/AM/Itamarati={"id":"data/BR/AM/Itamarati","key":"Itamarati","lang":"pt"}
+data/BR/AM/Itapiranga={"id":"data/BR/AM/Itapiranga","key":"Itapiranga","lang":"pt"}
+data/BR/AM/Japurá={"id":"data/BR/AM/Japurá","key":"Japurá","lang":"pt"}
+data/BR/AM/Jurua={"id":"data/BR/AM/Jurua","key":"Jurua","lang":"pt"}
+data/BR/AM/Jutaí={"id":"data/BR/AM/Jutaí","key":"Jutaí","lang":"pt"}
+data/BR/AM/Lábrea={"id":"data/BR/AM/Lábrea","key":"Lábrea","lang":"pt"}
+data/BR/AM/Manacapuru={"id":"data/BR/AM/Manacapuru","key":"Manacapuru","lang":"pt"}
+data/BR/AM/Manaquiri={"id":"data/BR/AM/Manaquiri","key":"Manaquiri","lang":"pt"}
+data/BR/AM/Manaus={"id":"data/BR/AM/Manaus","key":"Manaus","lang":"pt"}
+data/BR/AM/Manicoré={"id":"data/BR/AM/Manicoré","key":"Manicoré","lang":"pt"}
+data/BR/AM/Maraã={"id":"data/BR/AM/Maraã","key":"Maraã","lang":"pt"}
+data/BR/AM/Maués={"id":"data/BR/AM/Maués","key":"Maués","lang":"pt"}
+data/BR/AM/Nhamundá={"id":"data/BR/AM/Nhamundá","key":"Nhamundá","lang":"pt"}
+data/BR/AM/Nova Olinda do Norte={"id":"data/BR/AM/Nova Olinda do Norte","key":"Nova Olinda do Norte","lang":"pt"}
+data/BR/AM/Novo Airão={"id":"data/BR/AM/Novo Airão","key":"Novo Airão","lang":"pt"}
+data/BR/AM/Novo Aripuanã={"id":"data/BR/AM/Novo Aripuanã","key":"Novo Aripuanã","lang":"pt"}
+data/BR/AM/Parintins={"id":"data/BR/AM/Parintins","key":"Parintins","lang":"pt"}
+data/BR/AM/Pauini={"id":"data/BR/AM/Pauini","key":"Pauini","lang":"pt"}
+data/BR/AM/Presidente Figueiredo={"id":"data/BR/AM/Presidente Figueiredo","key":"Presidente Figueiredo","lang":"pt"}
+data/BR/AM/Rio Preto da Eva={"id":"data/BR/AM/Rio Preto da Eva","key":"Rio Preto da Eva","lang":"pt"}
+data/BR/AM/Santa Isabel do Rio Negro={"id":"data/BR/AM/Santa Isabel do Rio Negro","key":"Santa Isabel do Rio Negro","lang":"pt"}
+data/BR/AM/Santo Antônio do Içá={"id":"data/BR/AM/Santo Antônio do Içá","key":"Santo Antônio do Içá","lang":"pt"}
+data/BR/AM/Silves={"id":"data/BR/AM/Silves","key":"Silves","lang":"pt"}
+data/BR/AM/São Gabriel da Cachoeira={"id":"data/BR/AM/São Gabriel da Cachoeira","key":"São Gabriel da Cachoeira","lang":"pt"}
+data/BR/AM/São Paulo de Olivença={"id":"data/BR/AM/São Paulo de Olivença","key":"São Paulo de Olivença","lang":"pt"}
+data/BR/AM/São Sebastião do Uatumã={"id":"data/BR/AM/São Sebastião do Uatumã","key":"São Sebastião do Uatumã","lang":"pt"}
+data/BR/AM/Tabatinga={"id":"data/BR/AM/Tabatinga","key":"Tabatinga","lang":"pt"}
+data/BR/AM/Tapauá={"id":"data/BR/AM/Tapauá","key":"Tapauá","lang":"pt"}
+data/BR/AM/Tefé={"id":"data/BR/AM/Tefé","key":"Tefé","lang":"pt"}
+data/BR/AM/Tonantins={"id":"data/BR/AM/Tonantins","key":"Tonantins","lang":"pt"}
+data/BR/AM/Uarini={"id":"data/BR/AM/Uarini","key":"Uarini","lang":"pt"}
+data/BR/AM/Urucará={"id":"data/BR/AM/Urucará","key":"Urucará","lang":"pt"}
+data/BR/AM/Urucurituba={"id":"data/BR/AM/Urucurituba","key":"Urucurituba","lang":"pt"}
+data/BR/AP={"id":"data/BR/AP","key":"AP","name":"Amapá","lang":"pt","zip":"689","zipex":"68900-000,68999-999","sub_keys":"Amapá~Calçoene~Cutias~Ferreira Gomes~Itaubal~Laranjal do Jari~Macapá~Mazagão~Oiapoque~Pedra Branca do Amapari~Porto Grande~Pracuúba~Santana~Serra do Navio~Tartarugalzinho~Vitória do Jari"}
+data/BR/AP/Amapá={"id":"data/BR/AP/Amapá","key":"Amapá","lang":"pt"}
+data/BR/AP/Calçoene={"id":"data/BR/AP/Calçoene","key":"Calçoene","lang":"pt"}
+data/BR/AP/Cutias={"id":"data/BR/AP/Cutias","key":"Cutias","lang":"pt"}
+data/BR/AP/Ferreira Gomes={"id":"data/BR/AP/Ferreira Gomes","key":"Ferreira Gomes","lang":"pt"}
+data/BR/AP/Itaubal={"id":"data/BR/AP/Itaubal","key":"Itaubal","lang":"pt"}
+data/BR/AP/Laranjal do Jari={"id":"data/BR/AP/Laranjal do Jari","key":"Laranjal do Jari","lang":"pt"}
+data/BR/AP/Macapá={"id":"data/BR/AP/Macapá","key":"Macapá","lang":"pt"}
+data/BR/AP/Mazagão={"id":"data/BR/AP/Mazagão","key":"Mazagão","lang":"pt"}
+data/BR/AP/Oiapoque={"id":"data/BR/AP/Oiapoque","key":"Oiapoque","lang":"pt"}
+data/BR/AP/Pedra Branca do Amapari={"id":"data/BR/AP/Pedra Branca do Amapari","key":"Pedra Branca do Amapari","lang":"pt"}
+data/BR/AP/Porto Grande={"id":"data/BR/AP/Porto Grande","key":"Porto Grande","lang":"pt"}
+data/BR/AP/Pracuúba={"id":"data/BR/AP/Pracuúba","key":"Pracuúba","lang":"pt"}
+data/BR/AP/Santana={"id":"data/BR/AP/Santana","key":"Santana","lang":"pt"}
+data/BR/AP/Serra do Navio={"id":"data/BR/AP/Serra do Navio","key":"Serra do Navio","lang":"pt"}
+data/BR/AP/Tartarugalzinho={"id":"data/BR/AP/Tartarugalzinho","key":"Tartarugalzinho","lang":"pt"}
+data/BR/AP/Vitória do Jari={"id":"data/BR/AP/Vitória do Jari","key":"Vitória do Jari","lang":"pt"}
+data/BR/BA={"id":"data/BR/BA","key":"BA","name":"Bahia","lang":"pt","zip":"4[0-8]","zipex":"40000-000,48999-999","sub_keys":"Abaíra~Abaré~Acajutiba~Adustina~Água Fria~Aiquara~Alagoinhas~Alcobaça~Almadina~Amargosa~Amélia Rodrigues~América Dourada~Anagé~Andaraí~Andorinha~Angical~Anguera~Antas~Antônio Cardoso~Antônio Gonçalves~Aporá~Apuarema~Araças~Aracatu~Araci~Aramari~Arataca~Aratuípe~Aurelino Leal~Baianópolis~Baixa Grande~Banzaê~Barra~Barra da Estiva~Barra do Choça~Barra do Mendes~Barra do Rocha~Barreiras~Barro Alto~Barro Preto~Barrocas~Belmonte~Belo Campo~Biritinga~Boa Nova~Boa Vista do Tupim~Bom Jesus da Lapa~Bom Jesus da Serra~Boninal~Bonito~Boquira~Botuporã~Brejões~Brejolândia~Brotas de Macaúbas~Brumado~Buerarema~Buritirama~Caatiba~Cabaceiras do Paraguaçu~Cachoeira~Caculé~Caém~Caetanos~Caetité~Cafarnaum~Cairu~Caldeirão Grande~Camacan~Camaçari~Camamu~Campo Alegre de Lourdes~Campo Formoso~Canápolis~Canarana~Canavieiras~CanDeal~Candeias~Candiba~Cândido Sales~Cansanção~Canudos~Capela do Alto Alegre~Capim Grosso~Caraíbas~Caravelas~Cardeal da Silva~Carinhanha~Casa Nova~Castro Alves~Catolândia~Catu~Caturama~Central~Chorrochó~Cícero Dantas~Cipó~Coaraci~Cocos~Conceição da Feira~Conceição do Almeida~Conceição do Coité~Conceição do Jacuípe~Conde~Condeúba~Contendas do Sincorá~Coração de Maria~Cordeiros~Coribe~Coronel João Sá~Correntina~Cotegipe~Cravolândia~Crisópolis~Cristópolis~Cruz das Almas~Curaçá~Dário Meira~Dias d'Ávila~Dom Basílio~Dom Macedo Costa~Elísio Medrado~Encruzilhada~Entre Rios~Érico Cardoso~Esplanada~Euclides da Cunha~Eunápolis~Fatima~Feira da Mata~Feira de Santana~Filadelfia~Firmino Alves~Floresta Azul~Formosa do Rio Preto~Gandu~Gavião~Gentio do Ouro~Glória~Gongogi~Governador Mangabeira~Guajeru~Guanambi~Guaratinga~Heliopolis~Iaçu~Ibiassucê~Ibicaraí~Ibicoara~Ibicuí~Ibipeba~Ibipitanga~Ibiquera~Ibirapitanga~Ibirapuã~Ibirataia~Ibitiara~Ibititá~Ibotirama~Ichu~Igaporã~Igrapiúna~Iguaí~Ilhéus~Inhambupe~Ipecaetá~Ipiaú~Ipirá~Ipupiara~Irajuba~Iramaia~Iraquara~Irará~Irecê~Itabela~Itaberaba~Itabuna~Itacare~Itaeté~Itagi~Itagibá~Itagimirim~Itaguaçu da Bahia~Itaju do Colônia~Itajuípe~Itamaraju~Itamari~Itambé~Itanagra~Itanhém~Itaparica~Itapé~Itapebi~Itapetinga~Itapicuru~Itapitanga~Itaquara~Itarantim~Itatim~Itiruçu~Itiúba~Itororó~Ituaçu~Ituberá~Iuiú~Jaborandi~Jacaraci~Jacobina~Jaguaquara~Jaguarari~Jaguaripe~Jandaíra~Jequié~Jeremoabo~Jiquiriçá~Jitaúna~João Dourado~Juazeiro~Jucuruçu~Jussara~Jussari~Jussiape~Lafaiete Coutinho~Lagoa Real~Laje~Lajedão~Lajedinho~Lajedo do Tabocal~Lamarão~Lapão~Lauro de Freitas~Lençóis~Licínio de Almeida~Livramento de Nossa Senhora~Luís Eduardo Magalhães~Macajuba~Macarani~Macaúbas~Macururé~Madre de Deus~Maetinga~Maiquinique~Mairi~Malhada~Malhada de Pedras~Manoel Vitorino~Mansidão~Maracas~Maragogipe~Marau~Marcionílio Souza~Mascote~Mata de São João~Matina~Medeiros Neto~Miguel Calmon~Milagres~Mirangaba~Mirante~Monte Santo~Morpará~Morro do Chapéu~Mortugaba~Mucugê~Mucuri~Mulungu do Morro~Mundo Novo~Muniz Ferreira~Muquém de São Francisco~Muritiba~Mutuípe~Nazaré~Nilo Peçanha~Nordestina~Nova Canaã~Nova Fátima~Nova Ibiá~Nova Itarana~Nova Redenção~Nova Soure~Nova Viçosa~Novo Horizonte~Novo Triunfo~Olindina~Oliveira dos Brejinhos~Ouriçangas~Ourolândia~Palmas de Monte Alto~Palmeiras~Paramirim~Paratinga~Paripiranga~Pau Brasil~Paulo Afonso~Pé de Serra~Pedrão~Pedro Alexandre~Piatã~Pilão Arcado~Pindaí~Pindobaçu~Pintadas~Piraí do Norte~Piripá~Piritiba~Planaltino~Planalto~Poções~Pojuca~Ponto Novo~Porto Seguro~Potiraguá~Prado~Presidente Dutra~Presidente Jânio Quadros~Presidente Tancredo Neves~Queimadas~Quijingue~Quixabeira~Rafael Jambeiro~Remanso~Retirolândia~Riachão das Neves~Riachão do Jacuípe~Riacho de Santana~Ribeira do Amparo~Ribeira do Pombal~Ribeirão do Largo~Rio de Contas~Rio do Antônio~Rio do Pires~Rio Real~Rodelas~Ruy Barbosa~Salinas da Margarida~Salvador~Santa Bárbara~Santa Brigida~Santa Cruz Cabrália~Santa Cruz da Vitória~Santa Inês~Santa Luzia~Santa Maria da Vitória~Santa Rita de Cássia~Santa Teresinha~Santaluz~Santana~Santanópolis~Santo Amaro~Santo Antônio de Jesus~Santo Estêvão~São Desidério~São Domingos~São Felipe~São Félix~São Félix do Coribe~São Francisco do Conde~São Gabriel~São Gonçalo dos Campos~São José da Vitória~São José do Jacuípe~São Miguel das Matas~São Sebastião do Passé~Sapeaçu~Sátiro Dias~Saubara~Saúde~Seabra~Sebastião Laranjeiras~Senhor do Bonfim~Sento Sé~Serra do Ramalho~Serra Dourada~Serra preta~Serrinha~Serrolândia~Simões Filho~Sítio do Mato~Sítio do Quinto~Sobradinho~Souto Soares~Tabocas do Brejo Velho~Tanhaçu~Tanque Novo~Tanquinho~Taperoá~Tapiramutá~Teixeira de Freitas~Teodoro Sampaio~Teofilândia~Teolândia~Terra Nova~Tremedal~Tucano~Uauá~Ubaíra~Ubaitaba~Ubatã~Uibaí~Umburanas~Una~Urandi~Uruçuca~Utinga~Valença~Valente~Várzea da Roça~Várzea do Poço~Várzea Nova~Varzedo~Vera Cruz~Vereda~Vitória da Conquista~Wagner~Wanderley~Wenceslau Guimarães~Xique-Xique"}
+data/BR/BA/Abaré={"id":"data/BR/BA/Abaré","key":"Abaré","lang":"pt"}
+data/BR/BA/Abaíra={"id":"data/BR/BA/Abaíra","key":"Abaíra","lang":"pt"}
+data/BR/BA/Acajutiba={"id":"data/BR/BA/Acajutiba","key":"Acajutiba","lang":"pt"}
+data/BR/BA/Adustina={"id":"data/BR/BA/Adustina","key":"Adustina","lang":"pt"}
+data/BR/BA/Aiquara={"id":"data/BR/BA/Aiquara","key":"Aiquara","lang":"pt"}
+data/BR/BA/Alagoinhas={"id":"data/BR/BA/Alagoinhas","key":"Alagoinhas","lang":"pt"}
+data/BR/BA/Alcobaça={"id":"data/BR/BA/Alcobaça","key":"Alcobaça","lang":"pt"}
+data/BR/BA/Almadina={"id":"data/BR/BA/Almadina","key":"Almadina","lang":"pt"}
+data/BR/BA/Amargosa={"id":"data/BR/BA/Amargosa","key":"Amargosa","lang":"pt"}
+data/BR/BA/Amélia Rodrigues={"id":"data/BR/BA/Amélia Rodrigues","key":"Amélia Rodrigues","lang":"pt"}
+data/BR/BA/América Dourada={"id":"data/BR/BA/América Dourada","key":"América Dourada","lang":"pt"}
+data/BR/BA/Anagé={"id":"data/BR/BA/Anagé","key":"Anagé","lang":"pt"}
+data/BR/BA/Andaraí={"id":"data/BR/BA/Andaraí","key":"Andaraí","lang":"pt"}
+data/BR/BA/Andorinha={"id":"data/BR/BA/Andorinha","key":"Andorinha","lang":"pt"}
+data/BR/BA/Angical={"id":"data/BR/BA/Angical","key":"Angical","lang":"pt"}
+data/BR/BA/Anguera={"id":"data/BR/BA/Anguera","key":"Anguera","lang":"pt"}
+data/BR/BA/Antas={"id":"data/BR/BA/Antas","key":"Antas","lang":"pt"}
+data/BR/BA/Antônio Cardoso={"id":"data/BR/BA/Antônio Cardoso","key":"Antônio Cardoso","lang":"pt"}
+data/BR/BA/Antônio Gonçalves={"id":"data/BR/BA/Antônio Gonçalves","key":"Antônio Gonçalves","lang":"pt"}
+data/BR/BA/Aporá={"id":"data/BR/BA/Aporá","key":"Aporá","lang":"pt"}
+data/BR/BA/Apuarema={"id":"data/BR/BA/Apuarema","key":"Apuarema","lang":"pt"}
+data/BR/BA/Aracatu={"id":"data/BR/BA/Aracatu","key":"Aracatu","lang":"pt"}
+data/BR/BA/Araci={"id":"data/BR/BA/Araci","key":"Araci","lang":"pt"}
+data/BR/BA/Aramari={"id":"data/BR/BA/Aramari","key":"Aramari","lang":"pt"}
+data/BR/BA/Arataca={"id":"data/BR/BA/Arataca","key":"Arataca","lang":"pt"}
+data/BR/BA/Aratuípe={"id":"data/BR/BA/Aratuípe","key":"Aratuípe","lang":"pt"}
+data/BR/BA/Araças={"id":"data/BR/BA/Araças","key":"Araças","lang":"pt"}
+data/BR/BA/Aurelino Leal={"id":"data/BR/BA/Aurelino Leal","key":"Aurelino Leal","lang":"pt"}
+data/BR/BA/Baianópolis={"id":"data/BR/BA/Baianópolis","key":"Baianópolis","lang":"pt"}
+data/BR/BA/Baixa Grande={"id":"data/BR/BA/Baixa Grande","key":"Baixa Grande","lang":"pt"}
+data/BR/BA/Banzaê={"id":"data/BR/BA/Banzaê","key":"Banzaê","lang":"pt"}
+data/BR/BA/Barra={"id":"data/BR/BA/Barra","key":"Barra","lang":"pt"}
+data/BR/BA/Barra da Estiva={"id":"data/BR/BA/Barra da Estiva","key":"Barra da Estiva","lang":"pt"}
+data/BR/BA/Barra do Choça={"id":"data/BR/BA/Barra do Choça","key":"Barra do Choça","lang":"pt"}
+data/BR/BA/Barra do Mendes={"id":"data/BR/BA/Barra do Mendes","key":"Barra do Mendes","lang":"pt"}
+data/BR/BA/Barra do Rocha={"id":"data/BR/BA/Barra do Rocha","key":"Barra do Rocha","lang":"pt"}
+data/BR/BA/Barreiras={"id":"data/BR/BA/Barreiras","key":"Barreiras","lang":"pt"}
+data/BR/BA/Barro Alto={"id":"data/BR/BA/Barro Alto","key":"Barro Alto","lang":"pt"}
+data/BR/BA/Barro Preto={"id":"data/BR/BA/Barro Preto","key":"Barro Preto","lang":"pt"}
+data/BR/BA/Barrocas={"id":"data/BR/BA/Barrocas","key":"Barrocas","lang":"pt"}
+data/BR/BA/Belmonte={"id":"data/BR/BA/Belmonte","key":"Belmonte","lang":"pt"}
+data/BR/BA/Belo Campo={"id":"data/BR/BA/Belo Campo","key":"Belo Campo","lang":"pt"}
+data/BR/BA/Biritinga={"id":"data/BR/BA/Biritinga","key":"Biritinga","lang":"pt"}
+data/BR/BA/Boa Nova={"id":"data/BR/BA/Boa Nova","key":"Boa Nova","lang":"pt"}
+data/BR/BA/Boa Vista do Tupim={"id":"data/BR/BA/Boa Vista do Tupim","key":"Boa Vista do Tupim","lang":"pt"}
+data/BR/BA/Bom Jesus da Lapa={"id":"data/BR/BA/Bom Jesus da Lapa","key":"Bom Jesus da Lapa","lang":"pt"}
+data/BR/BA/Bom Jesus da Serra={"id":"data/BR/BA/Bom Jesus da Serra","key":"Bom Jesus da Serra","lang":"pt"}
+data/BR/BA/Boninal={"id":"data/BR/BA/Boninal","key":"Boninal","lang":"pt"}
+data/BR/BA/Bonito={"id":"data/BR/BA/Bonito","key":"Bonito","lang":"pt"}
+data/BR/BA/Boquira={"id":"data/BR/BA/Boquira","key":"Boquira","lang":"pt"}
+data/BR/BA/Botuporã={"id":"data/BR/BA/Botuporã","key":"Botuporã","lang":"pt"}
+data/BR/BA/Brejolândia={"id":"data/BR/BA/Brejolândia","key":"Brejolândia","lang":"pt"}
+data/BR/BA/Brejões={"id":"data/BR/BA/Brejões","key":"Brejões","lang":"pt"}
+data/BR/BA/Brotas de Macaúbas={"id":"data/BR/BA/Brotas de Macaúbas","key":"Brotas de Macaúbas","lang":"pt"}
+data/BR/BA/Brumado={"id":"data/BR/BA/Brumado","key":"Brumado","lang":"pt"}
+data/BR/BA/Buerarema={"id":"data/BR/BA/Buerarema","key":"Buerarema","lang":"pt"}
+data/BR/BA/Buritirama={"id":"data/BR/BA/Buritirama","key":"Buritirama","lang":"pt"}
+data/BR/BA/Caatiba={"id":"data/BR/BA/Caatiba","key":"Caatiba","lang":"pt"}
+data/BR/BA/Cabaceiras do Paraguaçu={"id":"data/BR/BA/Cabaceiras do Paraguaçu","key":"Cabaceiras do Paraguaçu","lang":"pt"}
+data/BR/BA/Cachoeira={"id":"data/BR/BA/Cachoeira","key":"Cachoeira","lang":"pt"}
+data/BR/BA/Caculé={"id":"data/BR/BA/Caculé","key":"Caculé","lang":"pt"}
+data/BR/BA/Caetanos={"id":"data/BR/BA/Caetanos","key":"Caetanos","lang":"pt"}
+data/BR/BA/Caetité={"id":"data/BR/BA/Caetité","key":"Caetité","lang":"pt"}
+data/BR/BA/Cafarnaum={"id":"data/BR/BA/Cafarnaum","key":"Cafarnaum","lang":"pt"}
+data/BR/BA/Cairu={"id":"data/BR/BA/Cairu","key":"Cairu","lang":"pt"}
+data/BR/BA/Caldeirão Grande={"id":"data/BR/BA/Caldeirão Grande","key":"Caldeirão Grande","lang":"pt"}
+data/BR/BA/Camacan={"id":"data/BR/BA/Camacan","key":"Camacan","lang":"pt"}
+data/BR/BA/Camamu={"id":"data/BR/BA/Camamu","key":"Camamu","lang":"pt"}
+data/BR/BA/Camaçari={"id":"data/BR/BA/Camaçari","key":"Camaçari","lang":"pt"}
+data/BR/BA/Campo Alegre de Lourdes={"id":"data/BR/BA/Campo Alegre de Lourdes","key":"Campo Alegre de Lourdes","lang":"pt"}
+data/BR/BA/Campo Formoso={"id":"data/BR/BA/Campo Formoso","key":"Campo Formoso","lang":"pt"}
+data/BR/BA/CanDeal={"id":"data/BR/BA/CanDeal","key":"CanDeal","lang":"pt"}
+data/BR/BA/Canarana={"id":"data/BR/BA/Canarana","key":"Canarana","lang":"pt"}
+data/BR/BA/Canavieiras={"id":"data/BR/BA/Canavieiras","key":"Canavieiras","lang":"pt"}
+data/BR/BA/Candeias={"id":"data/BR/BA/Candeias","key":"Candeias","lang":"pt"}
+data/BR/BA/Candiba={"id":"data/BR/BA/Candiba","key":"Candiba","lang":"pt"}
+data/BR/BA/Cansanção={"id":"data/BR/BA/Cansanção","key":"Cansanção","lang":"pt"}
+data/BR/BA/Canudos={"id":"data/BR/BA/Canudos","key":"Canudos","lang":"pt"}
+data/BR/BA/Canápolis={"id":"data/BR/BA/Canápolis","key":"Canápolis","lang":"pt"}
+data/BR/BA/Capela do Alto Alegre={"id":"data/BR/BA/Capela do Alto Alegre","key":"Capela do Alto Alegre","lang":"pt"}
+data/BR/BA/Capim Grosso={"id":"data/BR/BA/Capim Grosso","key":"Capim Grosso","lang":"pt"}
+data/BR/BA/Caravelas={"id":"data/BR/BA/Caravelas","key":"Caravelas","lang":"pt"}
+data/BR/BA/Caraíbas={"id":"data/BR/BA/Caraíbas","key":"Caraíbas","lang":"pt"}
+data/BR/BA/Cardeal da Silva={"id":"data/BR/BA/Cardeal da Silva","key":"Cardeal da Silva","lang":"pt"}
+data/BR/BA/Carinhanha={"id":"data/BR/BA/Carinhanha","key":"Carinhanha","lang":"pt"}
+data/BR/BA/Casa Nova={"id":"data/BR/BA/Casa Nova","key":"Casa Nova","lang":"pt"}
+data/BR/BA/Castro Alves={"id":"data/BR/BA/Castro Alves","key":"Castro Alves","lang":"pt"}
+data/BR/BA/Catolândia={"id":"data/BR/BA/Catolândia","key":"Catolândia","lang":"pt"}
+data/BR/BA/Catu={"id":"data/BR/BA/Catu","key":"Catu","lang":"pt"}
+data/BR/BA/Caturama={"id":"data/BR/BA/Caturama","key":"Caturama","lang":"pt"}
+data/BR/BA/Caém={"id":"data/BR/BA/Caém","key":"Caém","lang":"pt"}
+data/BR/BA/Central={"id":"data/BR/BA/Central","key":"Central","lang":"pt"}
+data/BR/BA/Chorrochó={"id":"data/BR/BA/Chorrochó","key":"Chorrochó","lang":"pt"}
+data/BR/BA/Cipó={"id":"data/BR/BA/Cipó","key":"Cipó","lang":"pt"}
+data/BR/BA/Coaraci={"id":"data/BR/BA/Coaraci","key":"Coaraci","lang":"pt"}
+data/BR/BA/Cocos={"id":"data/BR/BA/Cocos","key":"Cocos","lang":"pt"}
+data/BR/BA/Conceição da Feira={"id":"data/BR/BA/Conceição da Feira","key":"Conceição da Feira","lang":"pt"}
+data/BR/BA/Conceição do Almeida={"id":"data/BR/BA/Conceição do Almeida","key":"Conceição do Almeida","lang":"pt"}
+data/BR/BA/Conceição do Coité={"id":"data/BR/BA/Conceição do Coité","key":"Conceição do Coité","lang":"pt"}
+data/BR/BA/Conceição do Jacuípe={"id":"data/BR/BA/Conceição do Jacuípe","key":"Conceição do Jacuípe","lang":"pt"}
+data/BR/BA/Conde={"id":"data/BR/BA/Conde","key":"Conde","lang":"pt"}
+data/BR/BA/Condeúba={"id":"data/BR/BA/Condeúba","key":"Condeúba","lang":"pt"}
+data/BR/BA/Contendas do Sincorá={"id":"data/BR/BA/Contendas do Sincorá","key":"Contendas do Sincorá","lang":"pt"}
+data/BR/BA/Coração de Maria={"id":"data/BR/BA/Coração de Maria","key":"Coração de Maria","lang":"pt"}
+data/BR/BA/Cordeiros={"id":"data/BR/BA/Cordeiros","key":"Cordeiros","lang":"pt"}
+data/BR/BA/Coribe={"id":"data/BR/BA/Coribe","key":"Coribe","lang":"pt"}
+data/BR/BA/Coronel João Sá={"id":"data/BR/BA/Coronel João Sá","key":"Coronel João Sá","lang":"pt"}
+data/BR/BA/Correntina={"id":"data/BR/BA/Correntina","key":"Correntina","lang":"pt"}
+data/BR/BA/Cotegipe={"id":"data/BR/BA/Cotegipe","key":"Cotegipe","lang":"pt"}
+data/BR/BA/Cravolândia={"id":"data/BR/BA/Cravolândia","key":"Cravolândia","lang":"pt"}
+data/BR/BA/Cristópolis={"id":"data/BR/BA/Cristópolis","key":"Cristópolis","lang":"pt"}
+data/BR/BA/Crisópolis={"id":"data/BR/BA/Crisópolis","key":"Crisópolis","lang":"pt"}
+data/BR/BA/Cruz das Almas={"id":"data/BR/BA/Cruz das Almas","key":"Cruz das Almas","lang":"pt"}
+data/BR/BA/Curaçá={"id":"data/BR/BA/Curaçá","key":"Curaçá","lang":"pt"}
+data/BR/BA/Cândido Sales={"id":"data/BR/BA/Cândido Sales","key":"Cândido Sales","lang":"pt"}
+data/BR/BA/Cícero Dantas={"id":"data/BR/BA/Cícero Dantas","key":"Cícero Dantas","lang":"pt"}
+data/BR/BA/Dias d'Ávila={"id":"data/BR/BA/Dias d'Ávila","key":"Dias d'Ávila","lang":"pt"}
+data/BR/BA/Dom Basílio={"id":"data/BR/BA/Dom Basílio","key":"Dom Basílio","lang":"pt"}
+data/BR/BA/Dom Macedo Costa={"id":"data/BR/BA/Dom Macedo Costa","key":"Dom Macedo Costa","lang":"pt"}
+data/BR/BA/Dário Meira={"id":"data/BR/BA/Dário Meira","key":"Dário Meira","lang":"pt"}
+data/BR/BA/Elísio Medrado={"id":"data/BR/BA/Elísio Medrado","key":"Elísio Medrado","lang":"pt"}
+data/BR/BA/Encruzilhada={"id":"data/BR/BA/Encruzilhada","key":"Encruzilhada","lang":"pt"}
+data/BR/BA/Entre Rios={"id":"data/BR/BA/Entre Rios","key":"Entre Rios","lang":"pt"}
+data/BR/BA/Esplanada={"id":"data/BR/BA/Esplanada","key":"Esplanada","lang":"pt"}
+data/BR/BA/Euclides da Cunha={"id":"data/BR/BA/Euclides da Cunha","key":"Euclides da Cunha","lang":"pt"}
+data/BR/BA/Eunápolis={"id":"data/BR/BA/Eunápolis","key":"Eunápolis","lang":"pt"}
+data/BR/BA/Fatima={"id":"data/BR/BA/Fatima","key":"Fatima","lang":"pt"}
+data/BR/BA/Feira da Mata={"id":"data/BR/BA/Feira da Mata","key":"Feira da Mata","lang":"pt"}
+data/BR/BA/Feira de Santana={"id":"data/BR/BA/Feira de Santana","key":"Feira de Santana","lang":"pt"}
+data/BR/BA/Filadelfia={"id":"data/BR/BA/Filadelfia","key":"Filadelfia","lang":"pt"}
+data/BR/BA/Firmino Alves={"id":"data/BR/BA/Firmino Alves","key":"Firmino Alves","lang":"pt"}
+data/BR/BA/Floresta Azul={"id":"data/BR/BA/Floresta Azul","key":"Floresta Azul","lang":"pt"}
+data/BR/BA/Formosa do Rio Preto={"id":"data/BR/BA/Formosa do Rio Preto","key":"Formosa do Rio Preto","lang":"pt"}
+data/BR/BA/Gandu={"id":"data/BR/BA/Gandu","key":"Gandu","lang":"pt"}
+data/BR/BA/Gavião={"id":"data/BR/BA/Gavião","key":"Gavião","lang":"pt"}
+data/BR/BA/Gentio do Ouro={"id":"data/BR/BA/Gentio do Ouro","key":"Gentio do Ouro","lang":"pt"}
+data/BR/BA/Glória={"id":"data/BR/BA/Glória","key":"Glória","lang":"pt"}
+data/BR/BA/Gongogi={"id":"data/BR/BA/Gongogi","key":"Gongogi","lang":"pt"}
+data/BR/BA/Governador Mangabeira={"id":"data/BR/BA/Governador Mangabeira","key":"Governador Mangabeira","lang":"pt"}
+data/BR/BA/Guajeru={"id":"data/BR/BA/Guajeru","key":"Guajeru","lang":"pt"}
+data/BR/BA/Guanambi={"id":"data/BR/BA/Guanambi","key":"Guanambi","lang":"pt"}
+data/BR/BA/Guaratinga={"id":"data/BR/BA/Guaratinga","key":"Guaratinga","lang":"pt"}
+data/BR/BA/Heliopolis={"id":"data/BR/BA/Heliopolis","key":"Heliopolis","lang":"pt"}
+data/BR/BA/Iaçu={"id":"data/BR/BA/Iaçu","key":"Iaçu","lang":"pt"}
+data/BR/BA/Ibiassucê={"id":"data/BR/BA/Ibiassucê","key":"Ibiassucê","lang":"pt"}
+data/BR/BA/Ibicaraí={"id":"data/BR/BA/Ibicaraí","key":"Ibicaraí","lang":"pt"}
+data/BR/BA/Ibicoara={"id":"data/BR/BA/Ibicoara","key":"Ibicoara","lang":"pt"}
+data/BR/BA/Ibicuí={"id":"data/BR/BA/Ibicuí","key":"Ibicuí","lang":"pt"}
+data/BR/BA/Ibipeba={"id":"data/BR/BA/Ibipeba","key":"Ibipeba","lang":"pt"}
+data/BR/BA/Ibipitanga={"id":"data/BR/BA/Ibipitanga","key":"Ibipitanga","lang":"pt"}
+data/BR/BA/Ibiquera={"id":"data/BR/BA/Ibiquera","key":"Ibiquera","lang":"pt"}
+data/BR/BA/Ibirapitanga={"id":"data/BR/BA/Ibirapitanga","key":"Ibirapitanga","lang":"pt"}
+data/BR/BA/Ibirapuã={"id":"data/BR/BA/Ibirapuã","key":"Ibirapuã","lang":"pt"}
+data/BR/BA/Ibirataia={"id":"data/BR/BA/Ibirataia","key":"Ibirataia","lang":"pt"}
+data/BR/BA/Ibitiara={"id":"data/BR/BA/Ibitiara","key":"Ibitiara","lang":"pt"}
+data/BR/BA/Ibititá={"id":"data/BR/BA/Ibititá","key":"Ibititá","lang":"pt"}
+data/BR/BA/Ibotirama={"id":"data/BR/BA/Ibotirama","key":"Ibotirama","lang":"pt"}
+data/BR/BA/Ichu={"id":"data/BR/BA/Ichu","key":"Ichu","lang":"pt"}
+data/BR/BA/Igaporã={"id":"data/BR/BA/Igaporã","key":"Igaporã","lang":"pt"}
+data/BR/BA/Igrapiúna={"id":"data/BR/BA/Igrapiúna","key":"Igrapiúna","lang":"pt"}
+data/BR/BA/Iguaí={"id":"data/BR/BA/Iguaí","key":"Iguaí","lang":"pt"}
+data/BR/BA/Ilhéus={"id":"data/BR/BA/Ilhéus","key":"Ilhéus","lang":"pt"}
+data/BR/BA/Inhambupe={"id":"data/BR/BA/Inhambupe","key":"Inhambupe","lang":"pt"}
+data/BR/BA/Ipecaetá={"id":"data/BR/BA/Ipecaetá","key":"Ipecaetá","lang":"pt"}
+data/BR/BA/Ipiaú={"id":"data/BR/BA/Ipiaú","key":"Ipiaú","lang":"pt"}
+data/BR/BA/Ipirá={"id":"data/BR/BA/Ipirá","key":"Ipirá","lang":"pt"}
+data/BR/BA/Ipupiara={"id":"data/BR/BA/Ipupiara","key":"Ipupiara","lang":"pt"}
+data/BR/BA/Irajuba={"id":"data/BR/BA/Irajuba","key":"Irajuba","lang":"pt"}
+data/BR/BA/Iramaia={"id":"data/BR/BA/Iramaia","key":"Iramaia","lang":"pt"}
+data/BR/BA/Iraquara={"id":"data/BR/BA/Iraquara","key":"Iraquara","lang":"pt"}
+data/BR/BA/Irará={"id":"data/BR/BA/Irará","key":"Irará","lang":"pt"}
+data/BR/BA/Irecê={"id":"data/BR/BA/Irecê","key":"Irecê","lang":"pt"}
+data/BR/BA/Itabela={"id":"data/BR/BA/Itabela","key":"Itabela","lang":"pt"}
+data/BR/BA/Itaberaba={"id":"data/BR/BA/Itaberaba","key":"Itaberaba","lang":"pt"}
+data/BR/BA/Itabuna={"id":"data/BR/BA/Itabuna","key":"Itabuna","lang":"pt"}
+data/BR/BA/Itacare={"id":"data/BR/BA/Itacare","key":"Itacare","lang":"pt"}
+data/BR/BA/Itaeté={"id":"data/BR/BA/Itaeté","key":"Itaeté","lang":"pt"}
+data/BR/BA/Itagi={"id":"data/BR/BA/Itagi","key":"Itagi","lang":"pt"}
+data/BR/BA/Itagibá={"id":"data/BR/BA/Itagibá","key":"Itagibá","lang":"pt"}
+data/BR/BA/Itagimirim={"id":"data/BR/BA/Itagimirim","key":"Itagimirim","lang":"pt"}
+data/BR/BA/Itaguaçu da Bahia={"id":"data/BR/BA/Itaguaçu da Bahia","key":"Itaguaçu da Bahia","lang":"pt"}
+data/BR/BA/Itaju do Colônia={"id":"data/BR/BA/Itaju do Colônia","key":"Itaju do Colônia","lang":"pt"}
+data/BR/BA/Itajuípe={"id":"data/BR/BA/Itajuípe","key":"Itajuípe","lang":"pt"}
+data/BR/BA/Itamaraju={"id":"data/BR/BA/Itamaraju","key":"Itamaraju","lang":"pt"}
+data/BR/BA/Itamari={"id":"data/BR/BA/Itamari","key":"Itamari","lang":"pt"}
+data/BR/BA/Itambé={"id":"data/BR/BA/Itambé","key":"Itambé","lang":"pt"}
+data/BR/BA/Itanagra={"id":"data/BR/BA/Itanagra","key":"Itanagra","lang":"pt"}
+data/BR/BA/Itanhém={"id":"data/BR/BA/Itanhém","key":"Itanhém","lang":"pt"}
+data/BR/BA/Itaparica={"id":"data/BR/BA/Itaparica","key":"Itaparica","lang":"pt"}
+data/BR/BA/Itapebi={"id":"data/BR/BA/Itapebi","key":"Itapebi","lang":"pt"}
+data/BR/BA/Itapetinga={"id":"data/BR/BA/Itapetinga","key":"Itapetinga","lang":"pt"}
+data/BR/BA/Itapicuru={"id":"data/BR/BA/Itapicuru","key":"Itapicuru","lang":"pt"}
+data/BR/BA/Itapitanga={"id":"data/BR/BA/Itapitanga","key":"Itapitanga","lang":"pt"}
+data/BR/BA/Itapé={"id":"data/BR/BA/Itapé","key":"Itapé","lang":"pt"}
+data/BR/BA/Itaquara={"id":"data/BR/BA/Itaquara","key":"Itaquara","lang":"pt"}
+data/BR/BA/Itarantim={"id":"data/BR/BA/Itarantim","key":"Itarantim","lang":"pt"}
+data/BR/BA/Itatim={"id":"data/BR/BA/Itatim","key":"Itatim","lang":"pt"}
+data/BR/BA/Itiruçu={"id":"data/BR/BA/Itiruçu","key":"Itiruçu","lang":"pt"}
+data/BR/BA/Itiúba={"id":"data/BR/BA/Itiúba","key":"Itiúba","lang":"pt"}
+data/BR/BA/Itororó={"id":"data/BR/BA/Itororó","key":"Itororó","lang":"pt"}
+data/BR/BA/Ituaçu={"id":"data/BR/BA/Ituaçu","key":"Ituaçu","lang":"pt"}
+data/BR/BA/Ituberá={"id":"data/BR/BA/Ituberá","key":"Ituberá","lang":"pt"}
+data/BR/BA/Iuiú={"id":"data/BR/BA/Iuiú","key":"Iuiú","lang":"pt"}
+data/BR/BA/Jaborandi={"id":"data/BR/BA/Jaborandi","key":"Jaborandi","lang":"pt"}
+data/BR/BA/Jacaraci={"id":"data/BR/BA/Jacaraci","key":"Jacaraci","lang":"pt"}
+data/BR/BA/Jacobina={"id":"data/BR/BA/Jacobina","key":"Jacobina","lang":"pt"}
+data/BR/BA/Jaguaquara={"id":"data/BR/BA/Jaguaquara","key":"Jaguaquara","lang":"pt"}
+data/BR/BA/Jaguarari={"id":"data/BR/BA/Jaguarari","key":"Jaguarari","lang":"pt"}
+data/BR/BA/Jaguaripe={"id":"data/BR/BA/Jaguaripe","key":"Jaguaripe","lang":"pt"}
+data/BR/BA/Jandaíra={"id":"data/BR/BA/Jandaíra","key":"Jandaíra","lang":"pt"}
+data/BR/BA/Jequié={"id":"data/BR/BA/Jequié","key":"Jequié","lang":"pt"}
+data/BR/BA/Jeremoabo={"id":"data/BR/BA/Jeremoabo","key":"Jeremoabo","lang":"pt"}
+data/BR/BA/Jiquiriçá={"id":"data/BR/BA/Jiquiriçá","key":"Jiquiriçá","lang":"pt"}
+data/BR/BA/Jitaúna={"id":"data/BR/BA/Jitaúna","key":"Jitaúna","lang":"pt"}
+data/BR/BA/João Dourado={"id":"data/BR/BA/João Dourado","key":"João Dourado","lang":"pt"}
+data/BR/BA/Juazeiro={"id":"data/BR/BA/Juazeiro","key":"Juazeiro","lang":"pt"}
+data/BR/BA/Jucuruçu={"id":"data/BR/BA/Jucuruçu","key":"Jucuruçu","lang":"pt"}
+data/BR/BA/Jussara={"id":"data/BR/BA/Jussara","key":"Jussara","lang":"pt"}
+data/BR/BA/Jussari={"id":"data/BR/BA/Jussari","key":"Jussari","lang":"pt"}
+data/BR/BA/Jussiape={"id":"data/BR/BA/Jussiape","key":"Jussiape","lang":"pt"}
+data/BR/BA/Lafaiete Coutinho={"id":"data/BR/BA/Lafaiete Coutinho","key":"Lafaiete Coutinho","lang":"pt"}
+data/BR/BA/Lagoa Real={"id":"data/BR/BA/Lagoa Real","key":"Lagoa Real","lang":"pt"}
+data/BR/BA/Laje={"id":"data/BR/BA/Laje","key":"Laje","lang":"pt"}
+data/BR/BA/Lajedinho={"id":"data/BR/BA/Lajedinho","key":"Lajedinho","lang":"pt"}
+data/BR/BA/Lajedo do Tabocal={"id":"data/BR/BA/Lajedo do Tabocal","key":"Lajedo do Tabocal","lang":"pt"}
+data/BR/BA/Lajedão={"id":"data/BR/BA/Lajedão","key":"Lajedão","lang":"pt"}
+data/BR/BA/Lamarão={"id":"data/BR/BA/Lamarão","key":"Lamarão","lang":"pt"}
+data/BR/BA/Lapão={"id":"data/BR/BA/Lapão","key":"Lapão","lang":"pt"}
+data/BR/BA/Lauro de Freitas={"id":"data/BR/BA/Lauro de Freitas","key":"Lauro de Freitas","lang":"pt"}
+data/BR/BA/Lençóis={"id":"data/BR/BA/Lençóis","key":"Lençóis","lang":"pt"}
+data/BR/BA/Licínio de Almeida={"id":"data/BR/BA/Licínio de Almeida","key":"Licínio de Almeida","lang":"pt"}
+data/BR/BA/Livramento de Nossa Senhora={"id":"data/BR/BA/Livramento de Nossa Senhora","key":"Livramento de Nossa Senhora","lang":"pt"}
+data/BR/BA/Luís Eduardo Magalhães={"id":"data/BR/BA/Luís Eduardo Magalhães","key":"Luís Eduardo Magalhães","lang":"pt"}
+data/BR/BA/Macajuba={"id":"data/BR/BA/Macajuba","key":"Macajuba","lang":"pt"}
+data/BR/BA/Macarani={"id":"data/BR/BA/Macarani","key":"Macarani","lang":"pt"}
+data/BR/BA/Macaúbas={"id":"data/BR/BA/Macaúbas","key":"Macaúbas","lang":"pt"}
+data/BR/BA/Macururé={"id":"data/BR/BA/Macururé","key":"Macururé","lang":"pt"}
+data/BR/BA/Madre de Deus={"id":"data/BR/BA/Madre de Deus","key":"Madre de Deus","lang":"pt"}
+data/BR/BA/Maetinga={"id":"data/BR/BA/Maetinga","key":"Maetinga","lang":"pt"}
+data/BR/BA/Maiquinique={"id":"data/BR/BA/Maiquinique","key":"Maiquinique","lang":"pt"}
+data/BR/BA/Mairi={"id":"data/BR/BA/Mairi","key":"Mairi","lang":"pt"}
+data/BR/BA/Malhada={"id":"data/BR/BA/Malhada","key":"Malhada","lang":"pt"}
+data/BR/BA/Malhada de Pedras={"id":"data/BR/BA/Malhada de Pedras","key":"Malhada de Pedras","lang":"pt"}
+data/BR/BA/Manoel Vitorino={"id":"data/BR/BA/Manoel Vitorino","key":"Manoel Vitorino","lang":"pt"}
+data/BR/BA/Mansidão={"id":"data/BR/BA/Mansidão","key":"Mansidão","lang":"pt"}
+data/BR/BA/Maracas={"id":"data/BR/BA/Maracas","key":"Maracas","lang":"pt"}
+data/BR/BA/Maragogipe={"id":"data/BR/BA/Maragogipe","key":"Maragogipe","lang":"pt"}
+data/BR/BA/Marau={"id":"data/BR/BA/Marau","key":"Marau","lang":"pt"}
+data/BR/BA/Marcionílio Souza={"id":"data/BR/BA/Marcionílio Souza","key":"Marcionílio Souza","lang":"pt"}
+data/BR/BA/Mascote={"id":"data/BR/BA/Mascote","key":"Mascote","lang":"pt"}
+data/BR/BA/Mata de São João={"id":"data/BR/BA/Mata de São João","key":"Mata de São João","lang":"pt"}
+data/BR/BA/Matina={"id":"data/BR/BA/Matina","key":"Matina","lang":"pt"}
+data/BR/BA/Medeiros Neto={"id":"data/BR/BA/Medeiros Neto","key":"Medeiros Neto","lang":"pt"}
+data/BR/BA/Miguel Calmon={"id":"data/BR/BA/Miguel Calmon","key":"Miguel Calmon","lang":"pt"}
+data/BR/BA/Milagres={"id":"data/BR/BA/Milagres","key":"Milagres","lang":"pt"}
+data/BR/BA/Mirangaba={"id":"data/BR/BA/Mirangaba","key":"Mirangaba","lang":"pt"}
+data/BR/BA/Mirante={"id":"data/BR/BA/Mirante","key":"Mirante","lang":"pt"}
+data/BR/BA/Monte Santo={"id":"data/BR/BA/Monte Santo","key":"Monte Santo","lang":"pt"}
+data/BR/BA/Morpará={"id":"data/BR/BA/Morpará","key":"Morpará","lang":"pt"}
+data/BR/BA/Morro do Chapéu={"id":"data/BR/BA/Morro do Chapéu","key":"Morro do Chapéu","lang":"pt"}
+data/BR/BA/Mortugaba={"id":"data/BR/BA/Mortugaba","key":"Mortugaba","lang":"pt"}
+data/BR/BA/Mucugê={"id":"data/BR/BA/Mucugê","key":"Mucugê","lang":"pt"}
+data/BR/BA/Mucuri={"id":"data/BR/BA/Mucuri","key":"Mucuri","lang":"pt"}
+data/BR/BA/Mulungu do Morro={"id":"data/BR/BA/Mulungu do Morro","key":"Mulungu do Morro","lang":"pt"}
+data/BR/BA/Mundo Novo={"id":"data/BR/BA/Mundo Novo","key":"Mundo Novo","lang":"pt"}
+data/BR/BA/Muniz Ferreira={"id":"data/BR/BA/Muniz Ferreira","key":"Muniz Ferreira","lang":"pt"}
+data/BR/BA/Muquém de São Francisco={"id":"data/BR/BA/Muquém de São Francisco","key":"Muquém de São Francisco","lang":"pt"}
+data/BR/BA/Muritiba={"id":"data/BR/BA/Muritiba","key":"Muritiba","lang":"pt"}
+data/BR/BA/Mutuípe={"id":"data/BR/BA/Mutuípe","key":"Mutuípe","lang":"pt"}
+data/BR/BA/Nazaré={"id":"data/BR/BA/Nazaré","key":"Nazaré","lang":"pt"}
+data/BR/BA/Nilo Peçanha={"id":"data/BR/BA/Nilo Peçanha","key":"Nilo Peçanha","lang":"pt"}
+data/BR/BA/Nordestina={"id":"data/BR/BA/Nordestina","key":"Nordestina","lang":"pt"}
+data/BR/BA/Nova Canaã={"id":"data/BR/BA/Nova Canaã","key":"Nova Canaã","lang":"pt"}
+data/BR/BA/Nova Fátima={"id":"data/BR/BA/Nova Fátima","key":"Nova Fátima","lang":"pt"}
+data/BR/BA/Nova Ibiá={"id":"data/BR/BA/Nova Ibiá","key":"Nova Ibiá","lang":"pt"}
+data/BR/BA/Nova Itarana={"id":"data/BR/BA/Nova Itarana","key":"Nova Itarana","lang":"pt"}
+data/BR/BA/Nova Redenção={"id":"data/BR/BA/Nova Redenção","key":"Nova Redenção","lang":"pt"}
+data/BR/BA/Nova Soure={"id":"data/BR/BA/Nova Soure","key":"Nova Soure","lang":"pt"}
+data/BR/BA/Nova Viçosa={"id":"data/BR/BA/Nova Viçosa","key":"Nova Viçosa","lang":"pt"}
+data/BR/BA/Novo Horizonte={"id":"data/BR/BA/Novo Horizonte","key":"Novo Horizonte","lang":"pt"}
+data/BR/BA/Novo Triunfo={"id":"data/BR/BA/Novo Triunfo","key":"Novo Triunfo","lang":"pt"}
+data/BR/BA/Olindina={"id":"data/BR/BA/Olindina","key":"Olindina","lang":"pt"}
+data/BR/BA/Oliveira dos Brejinhos={"id":"data/BR/BA/Oliveira dos Brejinhos","key":"Oliveira dos Brejinhos","lang":"pt"}
+data/BR/BA/Ouriçangas={"id":"data/BR/BA/Ouriçangas","key":"Ouriçangas","lang":"pt"}
+data/BR/BA/Ourolândia={"id":"data/BR/BA/Ourolândia","key":"Ourolândia","lang":"pt"}
+data/BR/BA/Palmas de Monte Alto={"id":"data/BR/BA/Palmas de Monte Alto","key":"Palmas de Monte Alto","lang":"pt"}
+data/BR/BA/Palmeiras={"id":"data/BR/BA/Palmeiras","key":"Palmeiras","lang":"pt"}
+data/BR/BA/Paramirim={"id":"data/BR/BA/Paramirim","key":"Paramirim","lang":"pt"}
+data/BR/BA/Paratinga={"id":"data/BR/BA/Paratinga","key":"Paratinga","lang":"pt"}
+data/BR/BA/Paripiranga={"id":"data/BR/BA/Paripiranga","key":"Paripiranga","lang":"pt"}
+data/BR/BA/Pau Brasil={"id":"data/BR/BA/Pau Brasil","key":"Pau Brasil","lang":"pt"}
+data/BR/BA/Paulo Afonso={"id":"data/BR/BA/Paulo Afonso","key":"Paulo Afonso","lang":"pt"}
+data/BR/BA/Pedro Alexandre={"id":"data/BR/BA/Pedro Alexandre","key":"Pedro Alexandre","lang":"pt"}
+data/BR/BA/Pedrão={"id":"data/BR/BA/Pedrão","key":"Pedrão","lang":"pt"}
+data/BR/BA/Piatã={"id":"data/BR/BA/Piatã","key":"Piatã","lang":"pt"}
+data/BR/BA/Pilão Arcado={"id":"data/BR/BA/Pilão Arcado","key":"Pilão Arcado","lang":"pt"}
+data/BR/BA/Pindaí={"id":"data/BR/BA/Pindaí","key":"Pindaí","lang":"pt"}
+data/BR/BA/Pindobaçu={"id":"data/BR/BA/Pindobaçu","key":"Pindobaçu","lang":"pt"}
+data/BR/BA/Pintadas={"id":"data/BR/BA/Pintadas","key":"Pintadas","lang":"pt"}
+data/BR/BA/Piraí do Norte={"id":"data/BR/BA/Piraí do Norte","key":"Piraí do Norte","lang":"pt"}
+data/BR/BA/Piripá={"id":"data/BR/BA/Piripá","key":"Piripá","lang":"pt"}
+data/BR/BA/Piritiba={"id":"data/BR/BA/Piritiba","key":"Piritiba","lang":"pt"}
+data/BR/BA/Planaltino={"id":"data/BR/BA/Planaltino","key":"Planaltino","lang":"pt"}
+data/BR/BA/Planalto={"id":"data/BR/BA/Planalto","key":"Planalto","lang":"pt"}
+data/BR/BA/Pojuca={"id":"data/BR/BA/Pojuca","key":"Pojuca","lang":"pt"}
+data/BR/BA/Ponto Novo={"id":"data/BR/BA/Ponto Novo","key":"Ponto Novo","lang":"pt"}
+data/BR/BA/Porto Seguro={"id":"data/BR/BA/Porto Seguro","key":"Porto Seguro","lang":"pt"}
+data/BR/BA/Potiraguá={"id":"data/BR/BA/Potiraguá","key":"Potiraguá","lang":"pt"}
+data/BR/BA/Poções={"id":"data/BR/BA/Poções","key":"Poções","lang":"pt"}
+data/BR/BA/Prado={"id":"data/BR/BA/Prado","key":"Prado","lang":"pt"}
+data/BR/BA/Presidente Dutra={"id":"data/BR/BA/Presidente Dutra","key":"Presidente Dutra","lang":"pt"}
+data/BR/BA/Presidente Jânio Quadros={"id":"data/BR/BA/Presidente Jânio Quadros","key":"Presidente Jânio Quadros","lang":"pt"}
+data/BR/BA/Presidente Tancredo Neves={"id":"data/BR/BA/Presidente Tancredo Neves","key":"Presidente Tancredo Neves","lang":"pt"}
+data/BR/BA/Pé de Serra={"id":"data/BR/BA/Pé de Serra","key":"Pé de Serra","lang":"pt"}
+data/BR/BA/Queimadas={"id":"data/BR/BA/Queimadas","key":"Queimadas","lang":"pt"}
+data/BR/BA/Quijingue={"id":"data/BR/BA/Quijingue","key":"Quijingue","lang":"pt"}
+data/BR/BA/Quixabeira={"id":"data/BR/BA/Quixabeira","key":"Quixabeira","lang":"pt"}
+data/BR/BA/Rafael Jambeiro={"id":"data/BR/BA/Rafael Jambeiro","key":"Rafael Jambeiro","lang":"pt"}
+data/BR/BA/Remanso={"id":"data/BR/BA/Remanso","key":"Remanso","lang":"pt"}
+data/BR/BA/Retirolândia={"id":"data/BR/BA/Retirolândia","key":"Retirolândia","lang":"pt"}
+data/BR/BA/Riacho de Santana={"id":"data/BR/BA/Riacho de Santana","key":"Riacho de Santana","lang":"pt"}
+data/BR/BA/Riachão das Neves={"id":"data/BR/BA/Riachão das Neves","key":"Riachão das Neves","lang":"pt"}
+data/BR/BA/Riachão do Jacuípe={"id":"data/BR/BA/Riachão do Jacuípe","key":"Riachão do Jacuípe","lang":"pt"}
+data/BR/BA/Ribeira do Amparo={"id":"data/BR/BA/Ribeira do Amparo","key":"Ribeira do Amparo","lang":"pt"}
+data/BR/BA/Ribeira do Pombal={"id":"data/BR/BA/Ribeira do Pombal","key":"Ribeira do Pombal","lang":"pt"}
+data/BR/BA/Ribeirão do Largo={"id":"data/BR/BA/Ribeirão do Largo","key":"Ribeirão do Largo","lang":"pt"}
+data/BR/BA/Rio Real={"id":"data/BR/BA/Rio Real","key":"Rio Real","lang":"pt"}
+data/BR/BA/Rio de Contas={"id":"data/BR/BA/Rio de Contas","key":"Rio de Contas","lang":"pt"}
+data/BR/BA/Rio do Antônio={"id":"data/BR/BA/Rio do Antônio","key":"Rio do Antônio","lang":"pt"}
+data/BR/BA/Rio do Pires={"id":"data/BR/BA/Rio do Pires","key":"Rio do Pires","lang":"pt"}
+data/BR/BA/Rodelas={"id":"data/BR/BA/Rodelas","key":"Rodelas","lang":"pt"}
+data/BR/BA/Ruy Barbosa={"id":"data/BR/BA/Ruy Barbosa","key":"Ruy Barbosa","lang":"pt"}
+data/BR/BA/Salinas da Margarida={"id":"data/BR/BA/Salinas da Margarida","key":"Salinas da Margarida","lang":"pt"}
+data/BR/BA/Salvador={"id":"data/BR/BA/Salvador","key":"Salvador","lang":"pt"}
+data/BR/BA/Santa Brigida={"id":"data/BR/BA/Santa Brigida","key":"Santa Brigida","lang":"pt"}
+data/BR/BA/Santa Bárbara={"id":"data/BR/BA/Santa Bárbara","key":"Santa Bárbara","lang":"pt"}
+data/BR/BA/Santa Cruz Cabrália={"id":"data/BR/BA/Santa Cruz Cabrália","key":"Santa Cruz Cabrália","lang":"pt"}
+data/BR/BA/Santa Cruz da Vitória={"id":"data/BR/BA/Santa Cruz da Vitória","key":"Santa Cruz da Vitória","lang":"pt"}
+data/BR/BA/Santa Inês={"id":"data/BR/BA/Santa Inês","key":"Santa Inês","lang":"pt"}
+data/BR/BA/Santa Luzia={"id":"data/BR/BA/Santa Luzia","key":"Santa Luzia","lang":"pt"}
+data/BR/BA/Santa Maria da Vitória={"id":"data/BR/BA/Santa Maria da Vitória","key":"Santa Maria da Vitória","lang":"pt"}
+data/BR/BA/Santa Rita de Cássia={"id":"data/BR/BA/Santa Rita de Cássia","key":"Santa Rita de Cássia","lang":"pt"}
+data/BR/BA/Santa Teresinha={"id":"data/BR/BA/Santa Teresinha","key":"Santa Teresinha","lang":"pt"}
+data/BR/BA/Santaluz={"id":"data/BR/BA/Santaluz","key":"Santaluz","lang":"pt"}
+data/BR/BA/Santana={"id":"data/BR/BA/Santana","key":"Santana","lang":"pt"}
+data/BR/BA/Santanópolis={"id":"data/BR/BA/Santanópolis","key":"Santanópolis","lang":"pt"}
+data/BR/BA/Santo Amaro={"id":"data/BR/BA/Santo Amaro","key":"Santo Amaro","lang":"pt"}
+data/BR/BA/Santo Antônio de Jesus={"id":"data/BR/BA/Santo Antônio de Jesus","key":"Santo Antônio de Jesus","lang":"pt"}
+data/BR/BA/Santo Estêvão={"id":"data/BR/BA/Santo Estêvão","key":"Santo Estêvão","lang":"pt"}
+data/BR/BA/Sapeaçu={"id":"data/BR/BA/Sapeaçu","key":"Sapeaçu","lang":"pt"}
+data/BR/BA/Saubara={"id":"data/BR/BA/Saubara","key":"Saubara","lang":"pt"}
+data/BR/BA/Saúde={"id":"data/BR/BA/Saúde","key":"Saúde","lang":"pt"}
+data/BR/BA/Seabra={"id":"data/BR/BA/Seabra","key":"Seabra","lang":"pt"}
+data/BR/BA/Sebastião Laranjeiras={"id":"data/BR/BA/Sebastião Laranjeiras","key":"Sebastião Laranjeiras","lang":"pt"}
+data/BR/BA/Senhor do Bonfim={"id":"data/BR/BA/Senhor do Bonfim","key":"Senhor do Bonfim","lang":"pt"}
+data/BR/BA/Sento Sé={"id":"data/BR/BA/Sento Sé","key":"Sento Sé","lang":"pt"}
+data/BR/BA/Serra Dourada={"id":"data/BR/BA/Serra Dourada","key":"Serra Dourada","lang":"pt"}
+data/BR/BA/Serra do Ramalho={"id":"data/BR/BA/Serra do Ramalho","key":"Serra do Ramalho","lang":"pt"}
+data/BR/BA/Serra preta={"id":"data/BR/BA/Serra preta","key":"Serra preta","lang":"pt"}
+data/BR/BA/Serrinha={"id":"data/BR/BA/Serrinha","key":"Serrinha","lang":"pt"}
+data/BR/BA/Serrolândia={"id":"data/BR/BA/Serrolândia","key":"Serrolândia","lang":"pt"}
+data/BR/BA/Simões Filho={"id":"data/BR/BA/Simões Filho","key":"Simões Filho","lang":"pt"}
+data/BR/BA/Sobradinho={"id":"data/BR/BA/Sobradinho","key":"Sobradinho","lang":"pt"}
+data/BR/BA/Souto Soares={"id":"data/BR/BA/Souto Soares","key":"Souto Soares","lang":"pt"}
+data/BR/BA/Sátiro Dias={"id":"data/BR/BA/Sátiro Dias","key":"Sátiro Dias","lang":"pt"}
+data/BR/BA/São Desidério={"id":"data/BR/BA/São Desidério","key":"São Desidério","lang":"pt"}
+data/BR/BA/São Domingos={"id":"data/BR/BA/São Domingos","key":"São Domingos","lang":"pt"}
+data/BR/BA/São Felipe={"id":"data/BR/BA/São Felipe","key":"São Felipe","lang":"pt"}
+data/BR/BA/São Francisco do Conde={"id":"data/BR/BA/São Francisco do Conde","key":"São Francisco do Conde","lang":"pt"}
+data/BR/BA/São Félix={"id":"data/BR/BA/São Félix","key":"São Félix","lang":"pt"}
+data/BR/BA/São Félix do Coribe={"id":"data/BR/BA/São Félix do Coribe","key":"São Félix do Coribe","lang":"pt"}
+data/BR/BA/São Gabriel={"id":"data/BR/BA/São Gabriel","key":"São Gabriel","lang":"pt"}
+data/BR/BA/São Gonçalo dos Campos={"id":"data/BR/BA/São Gonçalo dos Campos","key":"São Gonçalo dos Campos","lang":"pt"}
+data/BR/BA/São José da Vitória={"id":"data/BR/BA/São José da Vitória","key":"São José da Vitória","lang":"pt"}
+data/BR/BA/São José do Jacuípe={"id":"data/BR/BA/São José do Jacuípe","key":"São José do Jacuípe","lang":"pt"}
+data/BR/BA/São Miguel das Matas={"id":"data/BR/BA/São Miguel das Matas","key":"São Miguel das Matas","lang":"pt"}
+data/BR/BA/São Sebastião do Passé={"id":"data/BR/BA/São Sebastião do Passé","key":"São Sebastião do Passé","lang":"pt"}
+data/BR/BA/Sítio do Mato={"id":"data/BR/BA/Sítio do Mato","key":"Sítio do Mato","lang":"pt"}
+data/BR/BA/Sítio do Quinto={"id":"data/BR/BA/Sítio do Quinto","key":"Sítio do Quinto","lang":"pt"}
+data/BR/BA/Tabocas do Brejo Velho={"id":"data/BR/BA/Tabocas do Brejo Velho","key":"Tabocas do Brejo Velho","lang":"pt"}
+data/BR/BA/Tanhaçu={"id":"data/BR/BA/Tanhaçu","key":"Tanhaçu","lang":"pt"}
+data/BR/BA/Tanque Novo={"id":"data/BR/BA/Tanque Novo","key":"Tanque Novo","lang":"pt"}
+data/BR/BA/Tanquinho={"id":"data/BR/BA/Tanquinho","key":"Tanquinho","lang":"pt"}
+data/BR/BA/Taperoá={"id":"data/BR/BA/Taperoá","key":"Taperoá","lang":"pt"}
+data/BR/BA/Tapiramutá={"id":"data/BR/BA/Tapiramutá","key":"Tapiramutá","lang":"pt"}
+data/BR/BA/Teixeira de Freitas={"id":"data/BR/BA/Teixeira de Freitas","key":"Teixeira de Freitas","lang":"pt"}
+data/BR/BA/Teodoro Sampaio={"id":"data/BR/BA/Teodoro Sampaio","key":"Teodoro Sampaio","lang":"pt"}
+data/BR/BA/Teofilândia={"id":"data/BR/BA/Teofilândia","key":"Teofilândia","lang":"pt"}
+data/BR/BA/Teolândia={"id":"data/BR/BA/Teolândia","key":"Teolândia","lang":"pt"}
+data/BR/BA/Terra Nova={"id":"data/BR/BA/Terra Nova","key":"Terra Nova","lang":"pt"}
+data/BR/BA/Tremedal={"id":"data/BR/BA/Tremedal","key":"Tremedal","lang":"pt"}
+data/BR/BA/Tucano={"id":"data/BR/BA/Tucano","key":"Tucano","lang":"pt"}
+data/BR/BA/Uauá={"id":"data/BR/BA/Uauá","key":"Uauá","lang":"pt"}
+data/BR/BA/Ubaitaba={"id":"data/BR/BA/Ubaitaba","key":"Ubaitaba","lang":"pt"}
+data/BR/BA/Ubatã={"id":"data/BR/BA/Ubatã","key":"Ubatã","lang":"pt"}
+data/BR/BA/Ubaíra={"id":"data/BR/BA/Ubaíra","key":"Ubaíra","lang":"pt"}
+data/BR/BA/Uibaí={"id":"data/BR/BA/Uibaí","key":"Uibaí","lang":"pt"}
+data/BR/BA/Umburanas={"id":"data/BR/BA/Umburanas","key":"Umburanas","lang":"pt"}
+data/BR/BA/Una={"id":"data/BR/BA/Una","key":"Una","lang":"pt"}
+data/BR/BA/Urandi={"id":"data/BR/BA/Urandi","key":"Urandi","lang":"pt"}
+data/BR/BA/Uruçuca={"id":"data/BR/BA/Uruçuca","key":"Uruçuca","lang":"pt"}
+data/BR/BA/Utinga={"id":"data/BR/BA/Utinga","key":"Utinga","lang":"pt"}
+data/BR/BA/Valente={"id":"data/BR/BA/Valente","key":"Valente","lang":"pt"}
+data/BR/BA/Valença={"id":"data/BR/BA/Valença","key":"Valença","lang":"pt"}
+data/BR/BA/Varzedo={"id":"data/BR/BA/Varzedo","key":"Varzedo","lang":"pt"}
+data/BR/BA/Vera Cruz={"id":"data/BR/BA/Vera Cruz","key":"Vera Cruz","lang":"pt"}
+data/BR/BA/Vereda={"id":"data/BR/BA/Vereda","key":"Vereda","lang":"pt"}
+data/BR/BA/Vitória da Conquista={"id":"data/BR/BA/Vitória da Conquista","key":"Vitória da Conquista","lang":"pt"}
+data/BR/BA/Várzea Nova={"id":"data/BR/BA/Várzea Nova","key":"Várzea Nova","lang":"pt"}
+data/BR/BA/Várzea da Roça={"id":"data/BR/BA/Várzea da Roça","key":"Várzea da Roça","lang":"pt"}
+data/BR/BA/Várzea do Poço={"id":"data/BR/BA/Várzea do Poço","key":"Várzea do Poço","lang":"pt"}
+data/BR/BA/Wagner={"id":"data/BR/BA/Wagner","key":"Wagner","lang":"pt"}
+data/BR/BA/Wanderley={"id":"data/BR/BA/Wanderley","key":"Wanderley","lang":"pt"}
+data/BR/BA/Wenceslau Guimarães={"id":"data/BR/BA/Wenceslau Guimarães","key":"Wenceslau Guimarães","lang":"pt"}
+data/BR/BA/Xique-Xique={"id":"data/BR/BA/Xique-Xique","key":"Xique-Xique","lang":"pt"}
+data/BR/BA/Água Fria={"id":"data/BR/BA/Água Fria","key":"Água Fria","lang":"pt"}
+data/BR/BA/Érico Cardoso={"id":"data/BR/BA/Érico Cardoso","key":"Érico Cardoso","lang":"pt"}
+data/BR/CE={"id":"data/BR/CE","key":"CE","name":"Ceará","lang":"pt","zip":"6[0-3]","zipex":"60000-000,63999-999","sub_keys":"Abaiara~Acarape~Acaraú~Acopiara~Aiuaba~Alcântaras~Altaneira~Alto Santo~Amontada~Antonina do Norte~Apuiarés~Aquiraz~Aracati~Aracoiaba~Ararendá~Araripe~Aratuba~Arneiroz~Assaré~Aurora~Baixio~Banabuiú~Barbalha~Barreira~Barro~Barroquinha~Baturité~Beberibe~Bela Cruz~Boa Viagem~Brejo Santo~Camocim~Campos Sales~Canindé~Capistrano~Caridade~Cariré~Caririaçú~Cariús~Carnaubal~Cascavel~Catarina~Catunda~Caucaia~Cedro~Chaval~Choro~Chorozinho~Coreaú~Crateús~Crato~Croatá~Cruz~Deputado Irapuan Pinheiro~Ererê~Eusébio~Farias Brito~Forquilha~Fortaleza~Fortim~Frecheirinha~General Sampaio~Graça~Granja~Granjeiro~Groaíras~Guaiúba~Guaraciaba do Norte~Guaramiranga~Hidrolândia~Horizonte~Ibaretama~Ibiapina~Ibicuitinga~Icapuí~Ico~Iguatu~Independencia~Ipaporanga~Ipaumirim~Ipú~Ipueiras~Iracema~Irauçuba~Itaiçaba~Itaitinga~Itapagé~Itapipoca~Itapiúna~Itarema~Itatira~Jaguaretama~Jaguaribara~Jaguaribe~Jaguaruana~Jardim~Jāti~Jijoca de Jericoacoara~Juazeiro do Norte~Jucás~Lavras da Mangabeira~Limoeiro do Norte~Madalena~Maracanaú~Maranguape~Marco~Martinópole~Massapê~Mauriti~Meruoca~Milagres~Milhã~Miraíma~Missão Velha~Mombaça~Monsenhor Tabosa~Morada Nova~Moraújo~Morrinhos~Mucambo~Mulungú~Nova Olinda~Nova Russas~Novo Oriente~Ocara~Orós~Pacajús~Pacatuba~Pacoti~Pacujá~Palhano~Palmácia~Paracuru~Paraipaba~Parambu~Paramoti~Pedra Branca~Penaforte~Pentecoste~Pereiro~Pindoretama~Piquet Carneiro~Pires Ferreira~Poranga~Porteiras~Potengi~Potiretama~Quiterianópolis~Quixadá~Quixelô~Quixeramobim~Quixeré~Redenção~Reriutaba~Russas~Saboeiro~Salitre~Santa Quitéria~Santana do Acaraú~Santana do Cariri~São Benedito~São Gonçalo do Amarante~São João do Jaguaribe~São Luís do Curu~Senador Pompeu~Senador Sá~Sobral~Solonópole~Tabuleiro do Norte~Tamboril~Tarrafas~Tauá~Tejuçuoca~Tianguá~Trairi~Tururu~Ubajara~Umari~Umirim~Uruburetama~Uruoca~Varjota~Várzea Alegre~Viçosa do Ceará"}
+data/BR/CE/Abaiara={"id":"data/BR/CE/Abaiara","key":"Abaiara","lang":"pt"}
+data/BR/CE/Acarape={"id":"data/BR/CE/Acarape","key":"Acarape","lang":"pt"}
+data/BR/CE/Acaraú={"id":"data/BR/CE/Acaraú","key":"Acaraú","lang":"pt"}
+data/BR/CE/Acopiara={"id":"data/BR/CE/Acopiara","key":"Acopiara","lang":"pt"}
+data/BR/CE/Aiuaba={"id":"data/BR/CE/Aiuaba","key":"Aiuaba","lang":"pt"}
+data/BR/CE/Alcântaras={"id":"data/BR/CE/Alcântaras","key":"Alcântaras","lang":"pt"}
+data/BR/CE/Altaneira={"id":"data/BR/CE/Altaneira","key":"Altaneira","lang":"pt"}
+data/BR/CE/Alto Santo={"id":"data/BR/CE/Alto Santo","key":"Alto Santo","lang":"pt"}
+data/BR/CE/Amontada={"id":"data/BR/CE/Amontada","key":"Amontada","lang":"pt"}
+data/BR/CE/Antonina do Norte={"id":"data/BR/CE/Antonina do Norte","key":"Antonina do Norte","lang":"pt"}
+data/BR/CE/Apuiarés={"id":"data/BR/CE/Apuiarés","key":"Apuiarés","lang":"pt"}
+data/BR/CE/Aquiraz={"id":"data/BR/CE/Aquiraz","key":"Aquiraz","lang":"pt"}
+data/BR/CE/Aracati={"id":"data/BR/CE/Aracati","key":"Aracati","lang":"pt"}
+data/BR/CE/Aracoiaba={"id":"data/BR/CE/Aracoiaba","key":"Aracoiaba","lang":"pt"}
+data/BR/CE/Ararendá={"id":"data/BR/CE/Ararendá","key":"Ararendá","lang":"pt"}
+data/BR/CE/Araripe={"id":"data/BR/CE/Araripe","key":"Araripe","lang":"pt"}
+data/BR/CE/Aratuba={"id":"data/BR/CE/Aratuba","key":"Aratuba","lang":"pt"}
+data/BR/CE/Arneiroz={"id":"data/BR/CE/Arneiroz","key":"Arneiroz","lang":"pt"}
+data/BR/CE/Assaré={"id":"data/BR/CE/Assaré","key":"Assaré","lang":"pt"}
+data/BR/CE/Aurora={"id":"data/BR/CE/Aurora","key":"Aurora","lang":"pt"}
+data/BR/CE/Baixio={"id":"data/BR/CE/Baixio","key":"Baixio","lang":"pt"}
+data/BR/CE/Banabuiú={"id":"data/BR/CE/Banabuiú","key":"Banabuiú","lang":"pt"}
+data/BR/CE/Barbalha={"id":"data/BR/CE/Barbalha","key":"Barbalha","lang":"pt"}
+data/BR/CE/Barreira={"id":"data/BR/CE/Barreira","key":"Barreira","lang":"pt"}
+data/BR/CE/Barro={"id":"data/BR/CE/Barro","key":"Barro","lang":"pt"}
+data/BR/CE/Barroquinha={"id":"data/BR/CE/Barroquinha","key":"Barroquinha","lang":"pt"}
+data/BR/CE/Baturité={"id":"data/BR/CE/Baturité","key":"Baturité","lang":"pt"}
+data/BR/CE/Beberibe={"id":"data/BR/CE/Beberibe","key":"Beberibe","lang":"pt"}
+data/BR/CE/Bela Cruz={"id":"data/BR/CE/Bela Cruz","key":"Bela Cruz","lang":"pt"}
+data/BR/CE/Boa Viagem={"id":"data/BR/CE/Boa Viagem","key":"Boa Viagem","lang":"pt"}
+data/BR/CE/Brejo Santo={"id":"data/BR/CE/Brejo Santo","key":"Brejo Santo","lang":"pt"}
+data/BR/CE/Camocim={"id":"data/BR/CE/Camocim","key":"Camocim","lang":"pt"}
+data/BR/CE/Campos Sales={"id":"data/BR/CE/Campos Sales","key":"Campos Sales","lang":"pt"}
+data/BR/CE/Canindé={"id":"data/BR/CE/Canindé","key":"Canindé","lang":"pt"}
+data/BR/CE/Capistrano={"id":"data/BR/CE/Capistrano","key":"Capistrano","lang":"pt"}
+data/BR/CE/Caridade={"id":"data/BR/CE/Caridade","key":"Caridade","lang":"pt"}
+data/BR/CE/Caririaçú={"id":"data/BR/CE/Caririaçú","key":"Caririaçú","lang":"pt"}
+data/BR/CE/Cariré={"id":"data/BR/CE/Cariré","key":"Cariré","lang":"pt"}
+data/BR/CE/Cariús={"id":"data/BR/CE/Cariús","key":"Cariús","lang":"pt"}
+data/BR/CE/Carnaubal={"id":"data/BR/CE/Carnaubal","key":"Carnaubal","lang":"pt"}
+data/BR/CE/Cascavel={"id":"data/BR/CE/Cascavel","key":"Cascavel","lang":"pt"}
+data/BR/CE/Catarina={"id":"data/BR/CE/Catarina","key":"Catarina","lang":"pt"}
+data/BR/CE/Catunda={"id":"data/BR/CE/Catunda","key":"Catunda","lang":"pt"}
+data/BR/CE/Caucaia={"id":"data/BR/CE/Caucaia","key":"Caucaia","lang":"pt"}
+data/BR/CE/Cedro={"id":"data/BR/CE/Cedro","key":"Cedro","lang":"pt"}
+data/BR/CE/Chaval={"id":"data/BR/CE/Chaval","key":"Chaval","lang":"pt"}
+data/BR/CE/Choro={"id":"data/BR/CE/Choro","key":"Choro","lang":"pt"}
+data/BR/CE/Chorozinho={"id":"data/BR/CE/Chorozinho","key":"Chorozinho","lang":"pt"}
+data/BR/CE/Coreaú={"id":"data/BR/CE/Coreaú","key":"Coreaú","lang":"pt"}
+data/BR/CE/Crateús={"id":"data/BR/CE/Crateús","key":"Crateús","lang":"pt"}
+data/BR/CE/Crato={"id":"data/BR/CE/Crato","key":"Crato","lang":"pt"}
+data/BR/CE/Croatá={"id":"data/BR/CE/Croatá","key":"Croatá","lang":"pt"}
+data/BR/CE/Cruz={"id":"data/BR/CE/Cruz","key":"Cruz","lang":"pt"}
+data/BR/CE/Deputado Irapuan Pinheiro={"id":"data/BR/CE/Deputado Irapuan Pinheiro","key":"Deputado Irapuan Pinheiro","lang":"pt"}
+data/BR/CE/Ererê={"id":"data/BR/CE/Ererê","key":"Ererê","lang":"pt"}
+data/BR/CE/Eusébio={"id":"data/BR/CE/Eusébio","key":"Eusébio","lang":"pt"}
+data/BR/CE/Farias Brito={"id":"data/BR/CE/Farias Brito","key":"Farias Brito","lang":"pt"}
+data/BR/CE/Forquilha={"id":"data/BR/CE/Forquilha","key":"Forquilha","lang":"pt"}
+data/BR/CE/Fortaleza={"id":"data/BR/CE/Fortaleza","key":"Fortaleza","lang":"pt"}
+data/BR/CE/Fortim={"id":"data/BR/CE/Fortim","key":"Fortim","lang":"pt"}
+data/BR/CE/Frecheirinha={"id":"data/BR/CE/Frecheirinha","key":"Frecheirinha","lang":"pt"}
+data/BR/CE/General Sampaio={"id":"data/BR/CE/General Sampaio","key":"General Sampaio","lang":"pt"}
+data/BR/CE/Granja={"id":"data/BR/CE/Granja","key":"Granja","lang":"pt"}
+data/BR/CE/Granjeiro={"id":"data/BR/CE/Granjeiro","key":"Granjeiro","lang":"pt"}
+data/BR/CE/Graça={"id":"data/BR/CE/Graça","key":"Graça","lang":"pt"}
+data/BR/CE/Groaíras={"id":"data/BR/CE/Groaíras","key":"Groaíras","lang":"pt"}
+data/BR/CE/Guaiúba={"id":"data/BR/CE/Guaiúba","key":"Guaiúba","lang":"pt"}
+data/BR/CE/Guaraciaba do Norte={"id":"data/BR/CE/Guaraciaba do Norte","key":"Guaraciaba do Norte","lang":"pt"}
+data/BR/CE/Guaramiranga={"id":"data/BR/CE/Guaramiranga","key":"Guaramiranga","lang":"pt"}
+data/BR/CE/Hidrolândia={"id":"data/BR/CE/Hidrolândia","key":"Hidrolândia","lang":"pt"}
+data/BR/CE/Horizonte={"id":"data/BR/CE/Horizonte","key":"Horizonte","lang":"pt"}
+data/BR/CE/Ibaretama={"id":"data/BR/CE/Ibaretama","key":"Ibaretama","lang":"pt"}
+data/BR/CE/Ibiapina={"id":"data/BR/CE/Ibiapina","key":"Ibiapina","lang":"pt"}
+data/BR/CE/Ibicuitinga={"id":"data/BR/CE/Ibicuitinga","key":"Ibicuitinga","lang":"pt"}
+data/BR/CE/Icapuí={"id":"data/BR/CE/Icapuí","key":"Icapuí","lang":"pt"}
+data/BR/CE/Ico={"id":"data/BR/CE/Ico","key":"Ico","lang":"pt"}
+data/BR/CE/Iguatu={"id":"data/BR/CE/Iguatu","key":"Iguatu","lang":"pt"}
+data/BR/CE/Independencia={"id":"data/BR/CE/Independencia","key":"Independencia","lang":"pt"}
+data/BR/CE/Ipaporanga={"id":"data/BR/CE/Ipaporanga","key":"Ipaporanga","lang":"pt"}
+data/BR/CE/Ipaumirim={"id":"data/BR/CE/Ipaumirim","key":"Ipaumirim","lang":"pt"}
+data/BR/CE/Ipueiras={"id":"data/BR/CE/Ipueiras","key":"Ipueiras","lang":"pt"}
+data/BR/CE/Ipú={"id":"data/BR/CE/Ipú","key":"Ipú","lang":"pt"}
+data/BR/CE/Iracema={"id":"data/BR/CE/Iracema","key":"Iracema","lang":"pt"}
+data/BR/CE/Irauçuba={"id":"data/BR/CE/Irauçuba","key":"Irauçuba","lang":"pt"}
+data/BR/CE/Itaitinga={"id":"data/BR/CE/Itaitinga","key":"Itaitinga","lang":"pt"}
+data/BR/CE/Itaiçaba={"id":"data/BR/CE/Itaiçaba","key":"Itaiçaba","lang":"pt"}
+data/BR/CE/Itapagé={"id":"data/BR/CE/Itapagé","key":"Itapagé","lang":"pt"}
+data/BR/CE/Itapipoca={"id":"data/BR/CE/Itapipoca","key":"Itapipoca","lang":"pt"}
+data/BR/CE/Itapiúna={"id":"data/BR/CE/Itapiúna","key":"Itapiúna","lang":"pt"}
+data/BR/CE/Itarema={"id":"data/BR/CE/Itarema","key":"Itarema","lang":"pt"}
+data/BR/CE/Itatira={"id":"data/BR/CE/Itatira","key":"Itatira","lang":"pt"}
+data/BR/CE/Jaguaretama={"id":"data/BR/CE/Jaguaretama","key":"Jaguaretama","lang":"pt"}
+data/BR/CE/Jaguaribara={"id":"data/BR/CE/Jaguaribara","key":"Jaguaribara","lang":"pt"}
+data/BR/CE/Jaguaribe={"id":"data/BR/CE/Jaguaribe","key":"Jaguaribe","lang":"pt"}
+data/BR/CE/Jaguaruana={"id":"data/BR/CE/Jaguaruana","key":"Jaguaruana","lang":"pt"}
+data/BR/CE/Jardim={"id":"data/BR/CE/Jardim","key":"Jardim","lang":"pt"}
+data/BR/CE/Jijoca de Jericoacoara={"id":"data/BR/CE/Jijoca de Jericoacoara","key":"Jijoca de Jericoacoara","lang":"pt"}
+data/BR/CE/Juazeiro do Norte={"id":"data/BR/CE/Juazeiro do Norte","key":"Juazeiro do Norte","lang":"pt"}
+data/BR/CE/Jucás={"id":"data/BR/CE/Jucás","key":"Jucás","lang":"pt"}
+data/BR/CE/Jāti={"id":"data/BR/CE/Jāti","key":"Jāti","lang":"pt"}
+data/BR/CE/Lavras da Mangabeira={"id":"data/BR/CE/Lavras da Mangabeira","key":"Lavras da Mangabeira","lang":"pt"}
+data/BR/CE/Limoeiro do Norte={"id":"data/BR/CE/Limoeiro do Norte","key":"Limoeiro do Norte","lang":"pt"}
+data/BR/CE/Madalena={"id":"data/BR/CE/Madalena","key":"Madalena","lang":"pt"}
+data/BR/CE/Maracanaú={"id":"data/BR/CE/Maracanaú","key":"Maracanaú","lang":"pt"}
+data/BR/CE/Maranguape={"id":"data/BR/CE/Maranguape","key":"Maranguape","lang":"pt"}
+data/BR/CE/Marco={"id":"data/BR/CE/Marco","key":"Marco","lang":"pt"}
+data/BR/CE/Martinópole={"id":"data/BR/CE/Martinópole","key":"Martinópole","lang":"pt"}
+data/BR/CE/Massapê={"id":"data/BR/CE/Massapê","key":"Massapê","lang":"pt"}
+data/BR/CE/Mauriti={"id":"data/BR/CE/Mauriti","key":"Mauriti","lang":"pt"}
+data/BR/CE/Meruoca={"id":"data/BR/CE/Meruoca","key":"Meruoca","lang":"pt"}
+data/BR/CE/Milagres={"id":"data/BR/CE/Milagres","key":"Milagres","lang":"pt"}
+data/BR/CE/Milhã={"id":"data/BR/CE/Milhã","key":"Milhã","lang":"pt"}
+data/BR/CE/Miraíma={"id":"data/BR/CE/Miraíma","key":"Miraíma","lang":"pt"}
+data/BR/CE/Missão Velha={"id":"data/BR/CE/Missão Velha","key":"Missão Velha","lang":"pt"}
+data/BR/CE/Mombaça={"id":"data/BR/CE/Mombaça","key":"Mombaça","lang":"pt"}
+data/BR/CE/Monsenhor Tabosa={"id":"data/BR/CE/Monsenhor Tabosa","key":"Monsenhor Tabosa","lang":"pt"}
+data/BR/CE/Morada Nova={"id":"data/BR/CE/Morada Nova","key":"Morada Nova","lang":"pt"}
+data/BR/CE/Moraújo={"id":"data/BR/CE/Moraújo","key":"Moraújo","lang":"pt"}
+data/BR/CE/Morrinhos={"id":"data/BR/CE/Morrinhos","key":"Morrinhos","lang":"pt"}
+data/BR/CE/Mucambo={"id":"data/BR/CE/Mucambo","key":"Mucambo","lang":"pt"}
+data/BR/CE/Mulungú={"id":"data/BR/CE/Mulungú","key":"Mulungú","lang":"pt"}
+data/BR/CE/Nova Olinda={"id":"data/BR/CE/Nova Olinda","key":"Nova Olinda","lang":"pt"}
+data/BR/CE/Nova Russas={"id":"data/BR/CE/Nova Russas","key":"Nova Russas","lang":"pt"}
+data/BR/CE/Novo Oriente={"id":"data/BR/CE/Novo Oriente","key":"Novo Oriente","lang":"pt"}
+data/BR/CE/Ocara={"id":"data/BR/CE/Ocara","key":"Ocara","lang":"pt"}
+data/BR/CE/Orós={"id":"data/BR/CE/Orós","key":"Orós","lang":"pt"}
+data/BR/CE/Pacajús={"id":"data/BR/CE/Pacajús","key":"Pacajús","lang":"pt"}
+data/BR/CE/Pacatuba={"id":"data/BR/CE/Pacatuba","key":"Pacatuba","lang":"pt"}
+data/BR/CE/Pacoti={"id":"data/BR/CE/Pacoti","key":"Pacoti","lang":"pt"}
+data/BR/CE/Pacujá={"id":"data/BR/CE/Pacujá","key":"Pacujá","lang":"pt"}
+data/BR/CE/Palhano={"id":"data/BR/CE/Palhano","key":"Palhano","lang":"pt"}
+data/BR/CE/Palmácia={"id":"data/BR/CE/Palmácia","key":"Palmácia","lang":"pt"}
+data/BR/CE/Paracuru={"id":"data/BR/CE/Paracuru","key":"Paracuru","lang":"pt"}
+data/BR/CE/Paraipaba={"id":"data/BR/CE/Paraipaba","key":"Paraipaba","lang":"pt"}
+data/BR/CE/Parambu={"id":"data/BR/CE/Parambu","key":"Parambu","lang":"pt"}
+data/BR/CE/Paramoti={"id":"data/BR/CE/Paramoti","key":"Paramoti","lang":"pt"}
+data/BR/CE/Pedra Branca={"id":"data/BR/CE/Pedra Branca","key":"Pedra Branca","lang":"pt"}
+data/BR/CE/Penaforte={"id":"data/BR/CE/Penaforte","key":"Penaforte","lang":"pt"}
+data/BR/CE/Pentecoste={"id":"data/BR/CE/Pentecoste","key":"Pentecoste","lang":"pt"}
+data/BR/CE/Pereiro={"id":"data/BR/CE/Pereiro","key":"Pereiro","lang":"pt"}
+data/BR/CE/Pindoretama={"id":"data/BR/CE/Pindoretama","key":"Pindoretama","lang":"pt"}
+data/BR/CE/Piquet Carneiro={"id":"data/BR/CE/Piquet Carneiro","key":"Piquet Carneiro","lang":"pt"}
+data/BR/CE/Pires Ferreira={"id":"data/BR/CE/Pires Ferreira","key":"Pires Ferreira","lang":"pt"}
+data/BR/CE/Poranga={"id":"data/BR/CE/Poranga","key":"Poranga","lang":"pt"}
+data/BR/CE/Porteiras={"id":"data/BR/CE/Porteiras","key":"Porteiras","lang":"pt"}
+data/BR/CE/Potengi={"id":"data/BR/CE/Potengi","key":"Potengi","lang":"pt"}
+data/BR/CE/Potiretama={"id":"data/BR/CE/Potiretama","key":"Potiretama","lang":"pt"}
+data/BR/CE/Quiterianópolis={"id":"data/BR/CE/Quiterianópolis","key":"Quiterianópolis","lang":"pt"}
+data/BR/CE/Quixadá={"id":"data/BR/CE/Quixadá","key":"Quixadá","lang":"pt"}
+data/BR/CE/Quixelô={"id":"data/BR/CE/Quixelô","key":"Quixelô","lang":"pt"}
+data/BR/CE/Quixeramobim={"id":"data/BR/CE/Quixeramobim","key":"Quixeramobim","lang":"pt"}
+data/BR/CE/Quixeré={"id":"data/BR/CE/Quixeré","key":"Quixeré","lang":"pt"}
+data/BR/CE/Redenção={"id":"data/BR/CE/Redenção","key":"Redenção","lang":"pt"}
+data/BR/CE/Reriutaba={"id":"data/BR/CE/Reriutaba","key":"Reriutaba","lang":"pt"}
+data/BR/CE/Russas={"id":"data/BR/CE/Russas","key":"Russas","lang":"pt"}
+data/BR/CE/Saboeiro={"id":"data/BR/CE/Saboeiro","key":"Saboeiro","lang":"pt"}
+data/BR/CE/Salitre={"id":"data/BR/CE/Salitre","key":"Salitre","lang":"pt"}
+data/BR/CE/Santa Quitéria={"id":"data/BR/CE/Santa Quitéria","key":"Santa Quitéria","lang":"pt"}
+data/BR/CE/Santana do Acaraú={"id":"data/BR/CE/Santana do Acaraú","key":"Santana do Acaraú","lang":"pt"}
+data/BR/CE/Santana do Cariri={"id":"data/BR/CE/Santana do Cariri","key":"Santana do Cariri","lang":"pt"}
+data/BR/CE/Senador Pompeu={"id":"data/BR/CE/Senador Pompeu","key":"Senador Pompeu","lang":"pt"}
+data/BR/CE/Senador Sá={"id":"data/BR/CE/Senador Sá","key":"Senador Sá","lang":"pt"}
+data/BR/CE/Sobral={"id":"data/BR/CE/Sobral","key":"Sobral","lang":"pt"}
+data/BR/CE/Solonópole={"id":"data/BR/CE/Solonópole","key":"Solonópole","lang":"pt"}
+data/BR/CE/São Benedito={"id":"data/BR/CE/São Benedito","key":"São Benedito","lang":"pt"}
+data/BR/CE/São Gonçalo do Amarante={"id":"data/BR/CE/São Gonçalo do Amarante","key":"São Gonçalo do Amarante","lang":"pt"}
+data/BR/CE/São João do Jaguaribe={"id":"data/BR/CE/São João do Jaguaribe","key":"São João do Jaguaribe","lang":"pt"}
+data/BR/CE/São Luís do Curu={"id":"data/BR/CE/São Luís do Curu","key":"São Luís do Curu","lang":"pt"}
+data/BR/CE/Tabuleiro do Norte={"id":"data/BR/CE/Tabuleiro do Norte","key":"Tabuleiro do Norte","lang":"pt"}
+data/BR/CE/Tamboril={"id":"data/BR/CE/Tamboril","key":"Tamboril","lang":"pt"}
+data/BR/CE/Tarrafas={"id":"data/BR/CE/Tarrafas","key":"Tarrafas","lang":"pt"}
+data/BR/CE/Tauá={"id":"data/BR/CE/Tauá","key":"Tauá","lang":"pt"}
+data/BR/CE/Tejuçuoca={"id":"data/BR/CE/Tejuçuoca","key":"Tejuçuoca","lang":"pt"}
+data/BR/CE/Tianguá={"id":"data/BR/CE/Tianguá","key":"Tianguá","lang":"pt"}
+data/BR/CE/Trairi={"id":"data/BR/CE/Trairi","key":"Trairi","lang":"pt"}
+data/BR/CE/Tururu={"id":"data/BR/CE/Tururu","key":"Tururu","lang":"pt"}
+data/BR/CE/Ubajara={"id":"data/BR/CE/Ubajara","key":"Ubajara","lang":"pt"}
+data/BR/CE/Umari={"id":"data/BR/CE/Umari","key":"Umari","lang":"pt"}
+data/BR/CE/Umirim={"id":"data/BR/CE/Umirim","key":"Umirim","lang":"pt"}
+data/BR/CE/Uruburetama={"id":"data/BR/CE/Uruburetama","key":"Uruburetama","lang":"pt"}
+data/BR/CE/Uruoca={"id":"data/BR/CE/Uruoca","key":"Uruoca","lang":"pt"}
+data/BR/CE/Varjota={"id":"data/BR/CE/Varjota","key":"Varjota","lang":"pt"}
+data/BR/CE/Viçosa do Ceará={"id":"data/BR/CE/Viçosa do Ceará","key":"Viçosa do Ceará","lang":"pt"}
+data/BR/CE/Várzea Alegre={"id":"data/BR/CE/Várzea Alegre","key":"Várzea Alegre","lang":"pt"}
+data/BR/DF={"id":"data/BR/DF","key":"DF","name":"Distrito Federal","lang":"pt","zip":"7[0-1]|72[0-7]|73[0-6]","zipex":"70000-000,72799-999:73000-000,73699-999","sub_keys":"Brasília"}
+data/BR/DF/Brasília={"id":"data/BR/DF/Brasília","key":"Brasília","lang":"pt"}
+data/BR/ES={"id":"data/BR/ES","key":"ES","name":"Espírito Santo","lang":"pt","zip":"29","zipex":"29000-000,29999-999","sub_keys":"Afonso Claudio~Água Doce do Norte~Águia Branca~Alegre~Alfredo Chaves~Alto Rio Novo~Anchieta~Apiacá~Aracruz~Atilio Vivaqua~Baixo Guandu~Barra de São Francisco~Boa Esperança~Bom Jesus do Norte~Brejetuba~Cachoeiro de Itapemirim~Cariacica~Castelo~Colatina~Conceição da Barra~Conceição do Castelo~Divino de São Lourenço~Domingos Martins~Dores do Rio Preto~Ecoporanga~Espírito Santo~Fundão~Governador Lindenberg~Guaçuí~Guarapari~Ibatiba~Ibiraçu~Ibitirama~Iconha~Irupi~Itaguaçu~Itapemirim~Itarana~Iúna~Jaguaré~Jerônimo Monteiro~João Neiva~Laranja da Terra~Linhares~Mantenópolis~Marataízes~Marechal Floriano~Marilândia~Mimoso do Sul~Montanha~Mucurici~Muniz Freire~Muqui~Nova Venécia~Pancas~Pedro Canário~Pinheiros~Piúma~Ponto Belo~Presidente Kennedy~Rio Bananal~Rio Novo do Sul~Santa Leopoldina~Santa Maria de Jetibá~Santa Teresa~São Domingos do Norte~São Gabriel da Palha~São José do Calçado~São Mateus~São Roque do Canaã~Serra~Sooretama~Vargem Alta~Venda Nova do Imigrante~Viana~Vila Pavão~Vila Valério~Vila Velha~Vitória"}
+data/BR/ES/Afonso Claudio={"id":"data/BR/ES/Afonso Claudio","key":"Afonso Claudio","lang":"pt"}
+data/BR/ES/Alegre={"id":"data/BR/ES/Alegre","key":"Alegre","lang":"pt"}
+data/BR/ES/Alfredo Chaves={"id":"data/BR/ES/Alfredo Chaves","key":"Alfredo Chaves","lang":"pt"}
+data/BR/ES/Alto Rio Novo={"id":"data/BR/ES/Alto Rio Novo","key":"Alto Rio Novo","lang":"pt"}
+data/BR/ES/Anchieta={"id":"data/BR/ES/Anchieta","key":"Anchieta","lang":"pt"}
+data/BR/ES/Apiacá={"id":"data/BR/ES/Apiacá","key":"Apiacá","lang":"pt"}
+data/BR/ES/Aracruz={"id":"data/BR/ES/Aracruz","key":"Aracruz","lang":"pt"}
+data/BR/ES/Atilio Vivaqua={"id":"data/BR/ES/Atilio Vivaqua","key":"Atilio Vivaqua","lang":"pt"}
+data/BR/ES/Baixo Guandu={"id":"data/BR/ES/Baixo Guandu","key":"Baixo Guandu","lang":"pt"}
+data/BR/ES/Barra de São Francisco={"id":"data/BR/ES/Barra de São Francisco","key":"Barra de São Francisco","lang":"pt"}
+data/BR/ES/Boa Esperança={"id":"data/BR/ES/Boa Esperança","key":"Boa Esperança","lang":"pt"}
+data/BR/ES/Bom Jesus do Norte={"id":"data/BR/ES/Bom Jesus do Norte","key":"Bom Jesus do Norte","lang":"pt"}
+data/BR/ES/Brejetuba={"id":"data/BR/ES/Brejetuba","key":"Brejetuba","lang":"pt"}
+data/BR/ES/Cachoeiro de Itapemirim={"id":"data/BR/ES/Cachoeiro de Itapemirim","key":"Cachoeiro de Itapemirim","lang":"pt"}
+data/BR/ES/Cariacica={"id":"data/BR/ES/Cariacica","key":"Cariacica","lang":"pt"}
+data/BR/ES/Castelo={"id":"data/BR/ES/Castelo","key":"Castelo","lang":"pt"}
+data/BR/ES/Colatina={"id":"data/BR/ES/Colatina","key":"Colatina","lang":"pt"}
+data/BR/ES/Conceição da Barra={"id":"data/BR/ES/Conceição da Barra","key":"Conceição da Barra","lang":"pt"}
+data/BR/ES/Conceição do Castelo={"id":"data/BR/ES/Conceição do Castelo","key":"Conceição do Castelo","lang":"pt"}
+data/BR/ES/Divino de São Lourenço={"id":"data/BR/ES/Divino de São Lourenço","key":"Divino de São Lourenço","lang":"pt"}
+data/BR/ES/Domingos Martins={"id":"data/BR/ES/Domingos Martins","key":"Domingos Martins","lang":"pt"}
+data/BR/ES/Dores do Rio Preto={"id":"data/BR/ES/Dores do Rio Preto","key":"Dores do Rio Preto","lang":"pt"}
+data/BR/ES/Ecoporanga={"id":"data/BR/ES/Ecoporanga","key":"Ecoporanga","lang":"pt"}
+data/BR/ES/Espírito Santo={"id":"data/BR/ES/Espírito Santo","key":"Espírito Santo","lang":"pt"}
+data/BR/ES/Fundão={"id":"data/BR/ES/Fundão","key":"Fundão","lang":"pt"}
+data/BR/ES/Governador Lindenberg={"id":"data/BR/ES/Governador Lindenberg","key":"Governador Lindenberg","lang":"pt"}
+data/BR/ES/Guarapari={"id":"data/BR/ES/Guarapari","key":"Guarapari","lang":"pt"}
+data/BR/ES/Guaçuí={"id":"data/BR/ES/Guaçuí","key":"Guaçuí","lang":"pt"}
+data/BR/ES/Ibatiba={"id":"data/BR/ES/Ibatiba","key":"Ibatiba","lang":"pt"}
+data/BR/ES/Ibiraçu={"id":"data/BR/ES/Ibiraçu","key":"Ibiraçu","lang":"pt"}
+data/BR/ES/Ibitirama={"id":"data/BR/ES/Ibitirama","key":"Ibitirama","lang":"pt"}
+data/BR/ES/Iconha={"id":"data/BR/ES/Iconha","key":"Iconha","lang":"pt"}
+data/BR/ES/Irupi={"id":"data/BR/ES/Irupi","key":"Irupi","lang":"pt"}
+data/BR/ES/Itaguaçu={"id":"data/BR/ES/Itaguaçu","key":"Itaguaçu","lang":"pt"}
+data/BR/ES/Itapemirim={"id":"data/BR/ES/Itapemirim","key":"Itapemirim","lang":"pt"}
+data/BR/ES/Itarana={"id":"data/BR/ES/Itarana","key":"Itarana","lang":"pt"}
+data/BR/ES/Iúna={"id":"data/BR/ES/Iúna","key":"Iúna","lang":"pt"}
+data/BR/ES/Jaguaré={"id":"data/BR/ES/Jaguaré","key":"Jaguaré","lang":"pt"}
+data/BR/ES/Jerônimo Monteiro={"id":"data/BR/ES/Jerônimo Monteiro","key":"Jerônimo Monteiro","lang":"pt"}
+data/BR/ES/João Neiva={"id":"data/BR/ES/João Neiva","key":"João Neiva","lang":"pt"}
+data/BR/ES/Laranja da Terra={"id":"data/BR/ES/Laranja da Terra","key":"Laranja da Terra","lang":"pt"}
+data/BR/ES/Linhares={"id":"data/BR/ES/Linhares","key":"Linhares","lang":"pt"}
+data/BR/ES/Mantenópolis={"id":"data/BR/ES/Mantenópolis","key":"Mantenópolis","lang":"pt"}
+data/BR/ES/Marataízes={"id":"data/BR/ES/Marataízes","key":"Marataízes","lang":"pt"}
+data/BR/ES/Marechal Floriano={"id":"data/BR/ES/Marechal Floriano","key":"Marechal Floriano","lang":"pt"}
+data/BR/ES/Marilândia={"id":"data/BR/ES/Marilândia","key":"Marilândia","lang":"pt"}
+data/BR/ES/Mimoso do Sul={"id":"data/BR/ES/Mimoso do Sul","key":"Mimoso do Sul","lang":"pt"}
+data/BR/ES/Montanha={"id":"data/BR/ES/Montanha","key":"Montanha","lang":"pt"}
+data/BR/ES/Mucurici={"id":"data/BR/ES/Mucurici","key":"Mucurici","lang":"pt"}
+data/BR/ES/Muniz Freire={"id":"data/BR/ES/Muniz Freire","key":"Muniz Freire","lang":"pt"}
+data/BR/ES/Muqui={"id":"data/BR/ES/Muqui","key":"Muqui","lang":"pt"}
+data/BR/ES/Nova Venécia={"id":"data/BR/ES/Nova Venécia","key":"Nova Venécia","lang":"pt"}
+data/BR/ES/Pancas={"id":"data/BR/ES/Pancas","key":"Pancas","lang":"pt"}
+data/BR/ES/Pedro Canário={"id":"data/BR/ES/Pedro Canário","key":"Pedro Canário","lang":"pt"}
+data/BR/ES/Pinheiros={"id":"data/BR/ES/Pinheiros","key":"Pinheiros","lang":"pt"}
+data/BR/ES/Piúma={"id":"data/BR/ES/Piúma","key":"Piúma","lang":"pt"}
+data/BR/ES/Ponto Belo={"id":"data/BR/ES/Ponto Belo","key":"Ponto Belo","lang":"pt"}
+data/BR/ES/Presidente Kennedy={"id":"data/BR/ES/Presidente Kennedy","key":"Presidente Kennedy","lang":"pt"}
+data/BR/ES/Rio Bananal={"id":"data/BR/ES/Rio Bananal","key":"Rio Bananal","lang":"pt"}
+data/BR/ES/Rio Novo do Sul={"id":"data/BR/ES/Rio Novo do Sul","key":"Rio Novo do Sul","lang":"pt"}
+data/BR/ES/Santa Leopoldina={"id":"data/BR/ES/Santa Leopoldina","key":"Santa Leopoldina","lang":"pt"}
+data/BR/ES/Santa Maria de Jetibá={"id":"data/BR/ES/Santa Maria de Jetibá","key":"Santa Maria de Jetibá","lang":"pt"}
+data/BR/ES/Santa Teresa={"id":"data/BR/ES/Santa Teresa","key":"Santa Teresa","lang":"pt"}
+data/BR/ES/Serra={"id":"data/BR/ES/Serra","key":"Serra","lang":"pt"}
+data/BR/ES/Sooretama={"id":"data/BR/ES/Sooretama","key":"Sooretama","lang":"pt"}
+data/BR/ES/São Domingos do Norte={"id":"data/BR/ES/São Domingos do Norte","key":"São Domingos do Norte","lang":"pt"}
+data/BR/ES/São Gabriel da Palha={"id":"data/BR/ES/São Gabriel da Palha","key":"São Gabriel da Palha","lang":"pt"}
+data/BR/ES/São José do Calçado={"id":"data/BR/ES/São José do Calçado","key":"São José do Calçado","lang":"pt"}
+data/BR/ES/São Mateus={"id":"data/BR/ES/São Mateus","key":"São Mateus","lang":"pt"}
+data/BR/ES/São Roque do Canaã={"id":"data/BR/ES/São Roque do Canaã","key":"São Roque do Canaã","lang":"pt"}
+data/BR/ES/Vargem Alta={"id":"data/BR/ES/Vargem Alta","key":"Vargem Alta","lang":"pt"}
+data/BR/ES/Venda Nova do Imigrante={"id":"data/BR/ES/Venda Nova do Imigrante","key":"Venda Nova do Imigrante","lang":"pt"}
+data/BR/ES/Viana={"id":"data/BR/ES/Viana","key":"Viana","lang":"pt"}
+data/BR/ES/Vila Pavão={"id":"data/BR/ES/Vila Pavão","key":"Vila Pavão","lang":"pt"}
+data/BR/ES/Vila Valério={"id":"data/BR/ES/Vila Valério","key":"Vila Valério","lang":"pt"}
+data/BR/ES/Vila Velha={"id":"data/BR/ES/Vila Velha","key":"Vila Velha","lang":"pt"}
+data/BR/ES/Vitória={"id":"data/BR/ES/Vitória","key":"Vitória","lang":"pt"}
+data/BR/ES/Água Doce do Norte={"id":"data/BR/ES/Água Doce do Norte","key":"Água Doce do Norte","lang":"pt"}
+data/BR/ES/Águia Branca={"id":"data/BR/ES/Águia Branca","key":"Águia Branca","lang":"pt"}
+data/BR/GO={"id":"data/BR/GO","key":"GO","name":"Goiás","lang":"pt","zip":"72[89]|73[7-9]|7[4-6]","zipex":"72800-000,72999-999:73700-000,76999-999","sub_keys":"Abadia de Goiás~Abadiânia~Acreúna~Adelândia~Água Fria de Goiás~Água Limpa~Águas Lindas de Goiás~Alexânia~Aloândia~Alto Horizonte~Alto Paraíso de Goiás~Alvorada do Norte~Amaralina~Americano do Brasil~Amorinópolis~Anápolis~Anhanguera~Anicuns~Aparecida de Goiânia~Aparecida do Rio Doce~Aporé~Araçu~Aragarças~Aragoiânia~Araguapaz~Arenópolis~Aruanã~Aurilândia~Avelinópolis~Baliza~Barro Alto~Bela Vista de Goiás~Bom Jardim de Goiás~Bom Jesus de Goiás~Bonfinópolis~Bonópolis~Brazabrantes~Britânia~Buriti Alegre~Buriti de Goiás~Buritinópolis~Cabeceiras~Cachoeira Alta~Cachoeira de Goiás~Cachoeira Dourada~Caçu~Caiapônia~Caldas Novas~Caldazinha~Campestre de Goiás~Campinaçu~Campinorte~Campo Alegre de Goiás~Campo Limpo de Goiás~Campos Belos~Campos Verdes~Carmo do Rio Verde~Castelândia~Catalão~Caturaí~Cavalcante~Ceres~Cezarina~Chapadão do Céu~Cidade Ocidental~Cocalzinho de Goiás~Colinas do Sul~Córrego do Ouro~Corumbá de Goiás~Corumbaíba~Cristalina~Cristianópolis~Crixás~Cromínia~Cumari~Damianópolis~Damolândia~Davinópolis~Diorama~Divinópolis de Goiás~Doverlândia~Edealina~Edéia~Estrela do Norte~Faina~Fazenda Nova~Firminópolis~Flores de Goiás~Formosa~Formoso~Gameleira de Goiás~Goianápolis~Goiandira~Goianésia~Goiânia~Goianira~Goiás~Goiatuba~Gouvelândia~Guapó~Guaraíta~Guarani de Goiás~Guarinos~Heitoraí~Hidrolândia~Hidrolina~Iaciara~Inaciolândia~Indiara~Inhumas~Ipameri~Ipiranga de Goiás~Iporá~Israelândia~Itaberaí~Itaguari~Itaguaru~Itajá~Itapaci~Itapirapuã~Itapuranga~Itarumã~Itauçu~Itumbiara~Ivolândia~Jandaia~Jaraguá~Jataí~Jaupaci~Jesúpolis~Joviânia~Jussara~Lagoa Santa~Leopoldo de Bulhões~Luziânia~Mairipotaba~Mambaí~Mara Rosa~Marzagão~Matrinchã~Maurilândia~Mimoso de Goiás~Minaçu~Mineiros~Moiporá~Monte Alegre de Goiás~Montes Claros de Goiás~Montividiu~Montividiu do Norte~Morrinhos~Morro Agudo de Goiás~Mossâmedes~Mozarlândia~Mundo Novo~Mutunópolis~Nazário~Nerópolis~Niquelândia~Nova América~Nova Aurora~Nova Crixás~Nova Glória~Nova Iguaçu de Goiás~Nova Roma~Nova Veneza~Novo Brasil~Novo Gama~Novo Planalto~Orizona~Ouro Verde de Goiás~Ouvidor~Padre Bernardo~Palestina de Goiás~Palmeiras de Goiás~Palmelo~Palminópolis~Panama~Paranaiguara~Paraúna~Perolândia~Petrolina de Goiás~Pilar de Goiás~Piracanjuba~Piranhas~Pirenópolis~Pires do Rio~Planaltina~Pontalina~Porangatu~Porteirão~Portelândia~Posse~Professor Jamil~Quirinópolis~Rialma~Rianápolis~Rio Quente~Río Verde~Rubiataba~Sanclerlândia~Santa Bárbara de Goiás~Santa Cruz de Goiás~Santa Fé de Goiás~Santa Helena de Goiás~Santa Isabel~Santa Rita do Araguaia~Santa Rita do Novo Destino~Santa Rosa de Goiás~Santa Tereza de Goiás~Santa Terezinha de Goiás~Santo Antônio da Barra~Santo Antônio de Goiás~Santo Antônio do Descoberto~São Domingos~São Francisco de Goiás~São João d'Aliança~São João da Paraúna~São Luís de Montes Belos~São Luíz do Norte~São Miguel do Araguaia~São Miguel do Passa Quatro~São Patrício~São Simão~Senador Canedo~Serranópolis~Silvania~Simolândia~Sítio d'Abadia~Taquaral de Goiás~Teresina de Goiás~Terezópolis de Goiás~Três Ranchos~Trindade~Trombas~Turvânia~Turvelândia~Uirapuru~Uruaçu~Uruana~Urutaí~Valparaíso de Goiás~Varjão~Vianópolis~Vicentinópolis~Vila Boa~Vila Propício"}
+data/BR/GO/Abadia de Goiás={"id":"data/BR/GO/Abadia de Goiás","key":"Abadia de Goiás","lang":"pt"}
+data/BR/GO/Abadiânia={"id":"data/BR/GO/Abadiânia","key":"Abadiânia","lang":"pt"}
+data/BR/GO/Acreúna={"id":"data/BR/GO/Acreúna","key":"Acreúna","lang":"pt"}
+data/BR/GO/Adelândia={"id":"data/BR/GO/Adelândia","key":"Adelândia","lang":"pt"}
+data/BR/GO/Alexânia={"id":"data/BR/GO/Alexânia","key":"Alexânia","lang":"pt"}
+data/BR/GO/Aloândia={"id":"data/BR/GO/Aloândia","key":"Aloândia","lang":"pt"}
+data/BR/GO/Alto Horizonte={"id":"data/BR/GO/Alto Horizonte","key":"Alto Horizonte","lang":"pt"}
+data/BR/GO/Alto Paraíso de Goiás={"id":"data/BR/GO/Alto Paraíso de Goiás","key":"Alto Paraíso de Goiás","lang":"pt"}
+data/BR/GO/Alvorada do Norte={"id":"data/BR/GO/Alvorada do Norte","key":"Alvorada do Norte","lang":"pt"}
+data/BR/GO/Amaralina={"id":"data/BR/GO/Amaralina","key":"Amaralina","lang":"pt"}
+data/BR/GO/Americano do Brasil={"id":"data/BR/GO/Americano do Brasil","key":"Americano do Brasil","lang":"pt"}
+data/BR/GO/Amorinópolis={"id":"data/BR/GO/Amorinópolis","key":"Amorinópolis","lang":"pt"}
+data/BR/GO/Anhanguera={"id":"data/BR/GO/Anhanguera","key":"Anhanguera","lang":"pt"}
+data/BR/GO/Anicuns={"id":"data/BR/GO/Anicuns","key":"Anicuns","lang":"pt"}
+data/BR/GO/Anápolis={"id":"data/BR/GO/Anápolis","key":"Anápolis","lang":"pt"}
+data/BR/GO/Aparecida de Goiânia={"id":"data/BR/GO/Aparecida de Goiânia","key":"Aparecida de Goiânia","lang":"pt"}
+data/BR/GO/Aparecida do Rio Doce={"id":"data/BR/GO/Aparecida do Rio Doce","key":"Aparecida do Rio Doce","lang":"pt"}
+data/BR/GO/Aporé={"id":"data/BR/GO/Aporé","key":"Aporé","lang":"pt"}
+data/BR/GO/Aragarças={"id":"data/BR/GO/Aragarças","key":"Aragarças","lang":"pt"}
+data/BR/GO/Aragoiânia={"id":"data/BR/GO/Aragoiânia","key":"Aragoiânia","lang":"pt"}
+data/BR/GO/Araguapaz={"id":"data/BR/GO/Araguapaz","key":"Araguapaz","lang":"pt"}
+data/BR/GO/Araçu={"id":"data/BR/GO/Araçu","key":"Araçu","lang":"pt"}
+data/BR/GO/Arenópolis={"id":"data/BR/GO/Arenópolis","key":"Arenópolis","lang":"pt"}
+data/BR/GO/Aruanã={"id":"data/BR/GO/Aruanã","key":"Aruanã","lang":"pt"}
+data/BR/GO/Aurilândia={"id":"data/BR/GO/Aurilândia","key":"Aurilândia","lang":"pt"}
+data/BR/GO/Avelinópolis={"id":"data/BR/GO/Avelinópolis","key":"Avelinópolis","lang":"pt"}
+data/BR/GO/Baliza={"id":"data/BR/GO/Baliza","key":"Baliza","lang":"pt"}
+data/BR/GO/Barro Alto={"id":"data/BR/GO/Barro Alto","key":"Barro Alto","lang":"pt"}
+data/BR/GO/Bela Vista de Goiás={"id":"data/BR/GO/Bela Vista de Goiás","key":"Bela Vista de Goiás","lang":"pt"}
+data/BR/GO/Bom Jardim de Goiás={"id":"data/BR/GO/Bom Jardim de Goiás","key":"Bom Jardim de Goiás","lang":"pt"}
+data/BR/GO/Bom Jesus de Goiás={"id":"data/BR/GO/Bom Jesus de Goiás","key":"Bom Jesus de Goiás","lang":"pt"}
+data/BR/GO/Bonfinópolis={"id":"data/BR/GO/Bonfinópolis","key":"Bonfinópolis","lang":"pt"}
+data/BR/GO/Bonópolis={"id":"data/BR/GO/Bonópolis","key":"Bonópolis","lang":"pt"}
+data/BR/GO/Brazabrantes={"id":"data/BR/GO/Brazabrantes","key":"Brazabrantes","lang":"pt"}
+data/BR/GO/Britânia={"id":"data/BR/GO/Britânia","key":"Britânia","lang":"pt"}
+data/BR/GO/Buriti Alegre={"id":"data/BR/GO/Buriti Alegre","key":"Buriti Alegre","lang":"pt"}
+data/BR/GO/Buriti de Goiás={"id":"data/BR/GO/Buriti de Goiás","key":"Buriti de Goiás","lang":"pt"}
+data/BR/GO/Buritinópolis={"id":"data/BR/GO/Buritinópolis","key":"Buritinópolis","lang":"pt"}
+data/BR/GO/Cabeceiras={"id":"data/BR/GO/Cabeceiras","key":"Cabeceiras","lang":"pt"}
+data/BR/GO/Cachoeira Alta={"id":"data/BR/GO/Cachoeira Alta","key":"Cachoeira Alta","lang":"pt"}
+data/BR/GO/Cachoeira Dourada={"id":"data/BR/GO/Cachoeira Dourada","key":"Cachoeira Dourada","lang":"pt"}
+data/BR/GO/Cachoeira de Goiás={"id":"data/BR/GO/Cachoeira de Goiás","key":"Cachoeira de Goiás","lang":"pt"}
+data/BR/GO/Caiapônia={"id":"data/BR/GO/Caiapônia","key":"Caiapônia","lang":"pt"}
+data/BR/GO/Caldas Novas={"id":"data/BR/GO/Caldas Novas","key":"Caldas Novas","lang":"pt"}
+data/BR/GO/Caldazinha={"id":"data/BR/GO/Caldazinha","key":"Caldazinha","lang":"pt"}
+data/BR/GO/Campestre de Goiás={"id":"data/BR/GO/Campestre de Goiás","key":"Campestre de Goiás","lang":"pt"}
+data/BR/GO/Campinaçu={"id":"data/BR/GO/Campinaçu","key":"Campinaçu","lang":"pt"}
+data/BR/GO/Campinorte={"id":"data/BR/GO/Campinorte","key":"Campinorte","lang":"pt"}
+data/BR/GO/Campo Alegre de Goiás={"id":"data/BR/GO/Campo Alegre de Goiás","key":"Campo Alegre de Goiás","lang":"pt"}
+data/BR/GO/Campo Limpo de Goiás={"id":"data/BR/GO/Campo Limpo de Goiás","key":"Campo Limpo de Goiás","lang":"pt"}
+data/BR/GO/Campos Belos={"id":"data/BR/GO/Campos Belos","key":"Campos Belos","lang":"pt"}
+data/BR/GO/Campos Verdes={"id":"data/BR/GO/Campos Verdes","key":"Campos Verdes","lang":"pt"}
+data/BR/GO/Carmo do Rio Verde={"id":"data/BR/GO/Carmo do Rio Verde","key":"Carmo do Rio Verde","lang":"pt"}
+data/BR/GO/Castelândia={"id":"data/BR/GO/Castelândia","key":"Castelândia","lang":"pt"}
+data/BR/GO/Catalão={"id":"data/BR/GO/Catalão","key":"Catalão","lang":"pt"}
+data/BR/GO/Caturaí={"id":"data/BR/GO/Caturaí","key":"Caturaí","lang":"pt"}
+data/BR/GO/Cavalcante={"id":"data/BR/GO/Cavalcante","key":"Cavalcante","lang":"pt"}
+data/BR/GO/Caçu={"id":"data/BR/GO/Caçu","key":"Caçu","lang":"pt"}
+data/BR/GO/Ceres={"id":"data/BR/GO/Ceres","key":"Ceres","lang":"pt"}
+data/BR/GO/Cezarina={"id":"data/BR/GO/Cezarina","key":"Cezarina","lang":"pt"}
+data/BR/GO/Chapadão do Céu={"id":"data/BR/GO/Chapadão do Céu","key":"Chapadão do Céu","lang":"pt"}
+data/BR/GO/Cidade Ocidental={"id":"data/BR/GO/Cidade Ocidental","key":"Cidade Ocidental","lang":"pt"}
+data/BR/GO/Cocalzinho de Goiás={"id":"data/BR/GO/Cocalzinho de Goiás","key":"Cocalzinho de Goiás","lang":"pt"}
+data/BR/GO/Colinas do Sul={"id":"data/BR/GO/Colinas do Sul","key":"Colinas do Sul","lang":"pt"}
+data/BR/GO/Corumbaíba={"id":"data/BR/GO/Corumbaíba","key":"Corumbaíba","lang":"pt"}
+data/BR/GO/Corumbá de Goiás={"id":"data/BR/GO/Corumbá de Goiás","key":"Corumbá de Goiás","lang":"pt"}
+data/BR/GO/Cristalina={"id":"data/BR/GO/Cristalina","key":"Cristalina","lang":"pt"}
+data/BR/GO/Cristianópolis={"id":"data/BR/GO/Cristianópolis","key":"Cristianópolis","lang":"pt"}
+data/BR/GO/Crixás={"id":"data/BR/GO/Crixás","key":"Crixás","lang":"pt"}
+data/BR/GO/Cromínia={"id":"data/BR/GO/Cromínia","key":"Cromínia","lang":"pt"}
+data/BR/GO/Cumari={"id":"data/BR/GO/Cumari","key":"Cumari","lang":"pt"}
+data/BR/GO/Córrego do Ouro={"id":"data/BR/GO/Córrego do Ouro","key":"Córrego do Ouro","lang":"pt"}
+data/BR/GO/Damianópolis={"id":"data/BR/GO/Damianópolis","key":"Damianópolis","lang":"pt"}
+data/BR/GO/Damolândia={"id":"data/BR/GO/Damolândia","key":"Damolândia","lang":"pt"}
+data/BR/GO/Davinópolis={"id":"data/BR/GO/Davinópolis","key":"Davinópolis","lang":"pt"}
+data/BR/GO/Diorama={"id":"data/BR/GO/Diorama","key":"Diorama","lang":"pt"}
+data/BR/GO/Divinópolis de Goiás={"id":"data/BR/GO/Divinópolis de Goiás","key":"Divinópolis de Goiás","lang":"pt"}
+data/BR/GO/Doverlândia={"id":"data/BR/GO/Doverlândia","key":"Doverlândia","lang":"pt"}
+data/BR/GO/Edealina={"id":"data/BR/GO/Edealina","key":"Edealina","lang":"pt"}
+data/BR/GO/Edéia={"id":"data/BR/GO/Edéia","key":"Edéia","lang":"pt"}
+data/BR/GO/Estrela do Norte={"id":"data/BR/GO/Estrela do Norte","key":"Estrela do Norte","lang":"pt"}
+data/BR/GO/Faina={"id":"data/BR/GO/Faina","key":"Faina","lang":"pt"}
+data/BR/GO/Fazenda Nova={"id":"data/BR/GO/Fazenda Nova","key":"Fazenda Nova","lang":"pt"}
+data/BR/GO/Firminópolis={"id":"data/BR/GO/Firminópolis","key":"Firminópolis","lang":"pt"}
+data/BR/GO/Flores de Goiás={"id":"data/BR/GO/Flores de Goiás","key":"Flores de Goiás","lang":"pt"}
+data/BR/GO/Formosa={"id":"data/BR/GO/Formosa","key":"Formosa","lang":"pt"}
+data/BR/GO/Formoso={"id":"data/BR/GO/Formoso","key":"Formoso","lang":"pt"}
+data/BR/GO/Gameleira de Goiás={"id":"data/BR/GO/Gameleira de Goiás","key":"Gameleira de Goiás","lang":"pt"}
+data/BR/GO/Goiandira={"id":"data/BR/GO/Goiandira","key":"Goiandira","lang":"pt"}
+data/BR/GO/Goianira={"id":"data/BR/GO/Goianira","key":"Goianira","lang":"pt"}
+data/BR/GO/Goianápolis={"id":"data/BR/GO/Goianápolis","key":"Goianápolis","lang":"pt"}
+data/BR/GO/Goianésia={"id":"data/BR/GO/Goianésia","key":"Goianésia","lang":"pt"}
+data/BR/GO/Goiatuba={"id":"data/BR/GO/Goiatuba","key":"Goiatuba","lang":"pt"}
+data/BR/GO/Goiás={"id":"data/BR/GO/Goiás","key":"Goiás","lang":"pt"}
+data/BR/GO/Goiânia={"id":"data/BR/GO/Goiânia","key":"Goiânia","lang":"pt"}
+data/BR/GO/Gouvelândia={"id":"data/BR/GO/Gouvelândia","key":"Gouvelândia","lang":"pt"}
+data/BR/GO/Guapó={"id":"data/BR/GO/Guapó","key":"Guapó","lang":"pt"}
+data/BR/GO/Guarani de Goiás={"id":"data/BR/GO/Guarani de Goiás","key":"Guarani de Goiás","lang":"pt"}
+data/BR/GO/Guaraíta={"id":"data/BR/GO/Guaraíta","key":"Guaraíta","lang":"pt"}
+data/BR/GO/Guarinos={"id":"data/BR/GO/Guarinos","key":"Guarinos","lang":"pt"}
+data/BR/GO/Heitoraí={"id":"data/BR/GO/Heitoraí","key":"Heitoraí","lang":"pt"}
+data/BR/GO/Hidrolina={"id":"data/BR/GO/Hidrolina","key":"Hidrolina","lang":"pt"}
+data/BR/GO/Hidrolândia={"id":"data/BR/GO/Hidrolândia","key":"Hidrolândia","lang":"pt"}
+data/BR/GO/Iaciara={"id":"data/BR/GO/Iaciara","key":"Iaciara","lang":"pt"}
+data/BR/GO/Inaciolândia={"id":"data/BR/GO/Inaciolândia","key":"Inaciolândia","lang":"pt"}
+data/BR/GO/Indiara={"id":"data/BR/GO/Indiara","key":"Indiara","lang":"pt"}
+data/BR/GO/Inhumas={"id":"data/BR/GO/Inhumas","key":"Inhumas","lang":"pt"}
+data/BR/GO/Ipameri={"id":"data/BR/GO/Ipameri","key":"Ipameri","lang":"pt"}
+data/BR/GO/Ipiranga de Goiás={"id":"data/BR/GO/Ipiranga de Goiás","key":"Ipiranga de Goiás","lang":"pt"}
+data/BR/GO/Iporá={"id":"data/BR/GO/Iporá","key":"Iporá","lang":"pt"}
+data/BR/GO/Israelândia={"id":"data/BR/GO/Israelândia","key":"Israelândia","lang":"pt"}
+data/BR/GO/Itaberaí={"id":"data/BR/GO/Itaberaí","key":"Itaberaí","lang":"pt"}
+data/BR/GO/Itaguari={"id":"data/BR/GO/Itaguari","key":"Itaguari","lang":"pt"}
+data/BR/GO/Itaguaru={"id":"data/BR/GO/Itaguaru","key":"Itaguaru","lang":"pt"}
+data/BR/GO/Itajá={"id":"data/BR/GO/Itajá","key":"Itajá","lang":"pt"}
+data/BR/GO/Itapaci={"id":"data/BR/GO/Itapaci","key":"Itapaci","lang":"pt"}
+data/BR/GO/Itapirapuã={"id":"data/BR/GO/Itapirapuã","key":"Itapirapuã","lang":"pt"}
+data/BR/GO/Itapuranga={"id":"data/BR/GO/Itapuranga","key":"Itapuranga","lang":"pt"}
+data/BR/GO/Itarumã={"id":"data/BR/GO/Itarumã","key":"Itarumã","lang":"pt"}
+data/BR/GO/Itauçu={"id":"data/BR/GO/Itauçu","key":"Itauçu","lang":"pt"}
+data/BR/GO/Itumbiara={"id":"data/BR/GO/Itumbiara","key":"Itumbiara","lang":"pt"}
+data/BR/GO/Ivolândia={"id":"data/BR/GO/Ivolândia","key":"Ivolândia","lang":"pt"}
+data/BR/GO/Jandaia={"id":"data/BR/GO/Jandaia","key":"Jandaia","lang":"pt"}
+data/BR/GO/Jaraguá={"id":"data/BR/GO/Jaraguá","key":"Jaraguá","lang":"pt"}
+data/BR/GO/Jataí={"id":"data/BR/GO/Jataí","key":"Jataí","lang":"pt"}
+data/BR/GO/Jaupaci={"id":"data/BR/GO/Jaupaci","key":"Jaupaci","lang":"pt"}
+data/BR/GO/Jesúpolis={"id":"data/BR/GO/Jesúpolis","key":"Jesúpolis","lang":"pt"}
+data/BR/GO/Joviânia={"id":"data/BR/GO/Joviânia","key":"Joviânia","lang":"pt"}
+data/BR/GO/Jussara={"id":"data/BR/GO/Jussara","key":"Jussara","lang":"pt"}
+data/BR/GO/Lagoa Santa={"id":"data/BR/GO/Lagoa Santa","key":"Lagoa Santa","lang":"pt"}
+data/BR/GO/Leopoldo de Bulhões={"id":"data/BR/GO/Leopoldo de Bulhões","key":"Leopoldo de Bulhões","lang":"pt"}
+data/BR/GO/Luziânia={"id":"data/BR/GO/Luziânia","key":"Luziânia","lang":"pt"}
+data/BR/GO/Mairipotaba={"id":"data/BR/GO/Mairipotaba","key":"Mairipotaba","lang":"pt"}
+data/BR/GO/Mambaí={"id":"data/BR/GO/Mambaí","key":"Mambaí","lang":"pt"}
+data/BR/GO/Mara Rosa={"id":"data/BR/GO/Mara Rosa","key":"Mara Rosa","lang":"pt"}
+data/BR/GO/Marzagão={"id":"data/BR/GO/Marzagão","key":"Marzagão","lang":"pt"}
+data/BR/GO/Matrinchã={"id":"data/BR/GO/Matrinchã","key":"Matrinchã","lang":"pt"}
+data/BR/GO/Maurilândia={"id":"data/BR/GO/Maurilândia","key":"Maurilândia","lang":"pt"}
+data/BR/GO/Mimoso de Goiás={"id":"data/BR/GO/Mimoso de Goiás","key":"Mimoso de Goiás","lang":"pt"}
+data/BR/GO/Minaçu={"id":"data/BR/GO/Minaçu","key":"Minaçu","lang":"pt"}
+data/BR/GO/Mineiros={"id":"data/BR/GO/Mineiros","key":"Mineiros","lang":"pt"}
+data/BR/GO/Moiporá={"id":"data/BR/GO/Moiporá","key":"Moiporá","lang":"pt"}
+data/BR/GO/Monte Alegre de Goiás={"id":"data/BR/GO/Monte Alegre de Goiás","key":"Monte Alegre de Goiás","lang":"pt"}
+data/BR/GO/Montes Claros de Goiás={"id":"data/BR/GO/Montes Claros de Goiás","key":"Montes Claros de Goiás","lang":"pt"}
+data/BR/GO/Montividiu={"id":"data/BR/GO/Montividiu","key":"Montividiu","lang":"pt"}
+data/BR/GO/Montividiu do Norte={"id":"data/BR/GO/Montividiu do Norte","key":"Montividiu do Norte","lang":"pt"}
+data/BR/GO/Morrinhos={"id":"data/BR/GO/Morrinhos","key":"Morrinhos","lang":"pt"}
+data/BR/GO/Morro Agudo de Goiás={"id":"data/BR/GO/Morro Agudo de Goiás","key":"Morro Agudo de Goiás","lang":"pt"}
+data/BR/GO/Mossâmedes={"id":"data/BR/GO/Mossâmedes","key":"Mossâmedes","lang":"pt"}
+data/BR/GO/Mozarlândia={"id":"data/BR/GO/Mozarlândia","key":"Mozarlândia","lang":"pt"}
+data/BR/GO/Mundo Novo={"id":"data/BR/GO/Mundo Novo","key":"Mundo Novo","lang":"pt"}
+data/BR/GO/Mutunópolis={"id":"data/BR/GO/Mutunópolis","key":"Mutunópolis","lang":"pt"}
+data/BR/GO/Nazário={"id":"data/BR/GO/Nazário","key":"Nazário","lang":"pt"}
+data/BR/GO/Nerópolis={"id":"data/BR/GO/Nerópolis","key":"Nerópolis","lang":"pt"}
+data/BR/GO/Niquelândia={"id":"data/BR/GO/Niquelândia","key":"Niquelândia","lang":"pt"}
+data/BR/GO/Nova América={"id":"data/BR/GO/Nova América","key":"Nova América","lang":"pt"}
+data/BR/GO/Nova Aurora={"id":"data/BR/GO/Nova Aurora","key":"Nova Aurora","lang":"pt"}
+data/BR/GO/Nova Crixás={"id":"data/BR/GO/Nova Crixás","key":"Nova Crixás","lang":"pt"}
+data/BR/GO/Nova Glória={"id":"data/BR/GO/Nova Glória","key":"Nova Glória","lang":"pt"}
+data/BR/GO/Nova Iguaçu de Goiás={"id":"data/BR/GO/Nova Iguaçu de Goiás","key":"Nova Iguaçu de Goiás","lang":"pt"}
+data/BR/GO/Nova Roma={"id":"data/BR/GO/Nova Roma","key":"Nova Roma","lang":"pt"}
+data/BR/GO/Nova Veneza={"id":"data/BR/GO/Nova Veneza","key":"Nova Veneza","lang":"pt"}
+data/BR/GO/Novo Brasil={"id":"data/BR/GO/Novo Brasil","key":"Novo Brasil","lang":"pt"}
+data/BR/GO/Novo Gama={"id":"data/BR/GO/Novo Gama","key":"Novo Gama","lang":"pt"}
+data/BR/GO/Novo Planalto={"id":"data/BR/GO/Novo Planalto","key":"Novo Planalto","lang":"pt"}
+data/BR/GO/Orizona={"id":"data/BR/GO/Orizona","key":"Orizona","lang":"pt"}
+data/BR/GO/Ouro Verde de Goiás={"id":"data/BR/GO/Ouro Verde de Goiás","key":"Ouro Verde de Goiás","lang":"pt"}
+data/BR/GO/Ouvidor={"id":"data/BR/GO/Ouvidor","key":"Ouvidor","lang":"pt"}
+data/BR/GO/Padre Bernardo={"id":"data/BR/GO/Padre Bernardo","key":"Padre Bernardo","lang":"pt"}
+data/BR/GO/Palestina de Goiás={"id":"data/BR/GO/Palestina de Goiás","key":"Palestina de Goiás","lang":"pt"}
+data/BR/GO/Palmeiras de Goiás={"id":"data/BR/GO/Palmeiras de Goiás","key":"Palmeiras de Goiás","lang":"pt"}
+data/BR/GO/Palmelo={"id":"data/BR/GO/Palmelo","key":"Palmelo","lang":"pt"}
+data/BR/GO/Palminópolis={"id":"data/BR/GO/Palminópolis","key":"Palminópolis","lang":"pt"}
+data/BR/GO/Panama={"id":"data/BR/GO/Panama","key":"Panama","lang":"pt"}
+data/BR/GO/Paranaiguara={"id":"data/BR/GO/Paranaiguara","key":"Paranaiguara","lang":"pt"}
+data/BR/GO/Paraúna={"id":"data/BR/GO/Paraúna","key":"Paraúna","lang":"pt"}
+data/BR/GO/Perolândia={"id":"data/BR/GO/Perolândia","key":"Perolândia","lang":"pt"}
+data/BR/GO/Petrolina de Goiás={"id":"data/BR/GO/Petrolina de Goiás","key":"Petrolina de Goiás","lang":"pt"}
+data/BR/GO/Pilar de Goiás={"id":"data/BR/GO/Pilar de Goiás","key":"Pilar de Goiás","lang":"pt"}
+data/BR/GO/Piracanjuba={"id":"data/BR/GO/Piracanjuba","key":"Piracanjuba","lang":"pt"}
+data/BR/GO/Piranhas={"id":"data/BR/GO/Piranhas","key":"Piranhas","lang":"pt"}
+data/BR/GO/Pirenópolis={"id":"data/BR/GO/Pirenópolis","key":"Pirenópolis","lang":"pt"}
+data/BR/GO/Pires do Rio={"id":"data/BR/GO/Pires do Rio","key":"Pires do Rio","lang":"pt"}
+data/BR/GO/Planaltina={"id":"data/BR/GO/Planaltina","key":"Planaltina","lang":"pt"}
+data/BR/GO/Pontalina={"id":"data/BR/GO/Pontalina","key":"Pontalina","lang":"pt"}
+data/BR/GO/Porangatu={"id":"data/BR/GO/Porangatu","key":"Porangatu","lang":"pt"}
+data/BR/GO/Porteirão={"id":"data/BR/GO/Porteirão","key":"Porteirão","lang":"pt"}
+data/BR/GO/Portelândia={"id":"data/BR/GO/Portelândia","key":"Portelândia","lang":"pt"}
+data/BR/GO/Posse={"id":"data/BR/GO/Posse","key":"Posse","lang":"pt"}
+data/BR/GO/Professor Jamil={"id":"data/BR/GO/Professor Jamil","key":"Professor Jamil","lang":"pt"}
+data/BR/GO/Quirinópolis={"id":"data/BR/GO/Quirinópolis","key":"Quirinópolis","lang":"pt"}
+data/BR/GO/Rialma={"id":"data/BR/GO/Rialma","key":"Rialma","lang":"pt"}
+data/BR/GO/Rianápolis={"id":"data/BR/GO/Rianápolis","key":"Rianápolis","lang":"pt"}
+data/BR/GO/Rio Quente={"id":"data/BR/GO/Rio Quente","key":"Rio Quente","lang":"pt"}
+data/BR/GO/Rubiataba={"id":"data/BR/GO/Rubiataba","key":"Rubiataba","lang":"pt"}
+data/BR/GO/Río Verde={"id":"data/BR/GO/Río Verde","key":"Río Verde","lang":"pt"}
+data/BR/GO/Sanclerlândia={"id":"data/BR/GO/Sanclerlândia","key":"Sanclerlândia","lang":"pt"}
+data/BR/GO/Santa Bárbara de Goiás={"id":"data/BR/GO/Santa Bárbara de Goiás","key":"Santa Bárbara de Goiás","lang":"pt"}
+data/BR/GO/Santa Cruz de Goiás={"id":"data/BR/GO/Santa Cruz de Goiás","key":"Santa Cruz de Goiás","lang":"pt"}
+data/BR/GO/Santa Fé de Goiás={"id":"data/BR/GO/Santa Fé de Goiás","key":"Santa Fé de Goiás","lang":"pt"}
+data/BR/GO/Santa Helena de Goiás={"id":"data/BR/GO/Santa Helena de Goiás","key":"Santa Helena de Goiás","lang":"pt"}
+data/BR/GO/Santa Isabel={"id":"data/BR/GO/Santa Isabel","key":"Santa Isabel","lang":"pt"}
+data/BR/GO/Santa Rita do Araguaia={"id":"data/BR/GO/Santa Rita do Araguaia","key":"Santa Rita do Araguaia","lang":"pt"}
+data/BR/GO/Santa Rita do Novo Destino={"id":"data/BR/GO/Santa Rita do Novo Destino","key":"Santa Rita do Novo Destino","lang":"pt"}
+data/BR/GO/Santa Rosa de Goiás={"id":"data/BR/GO/Santa Rosa de Goiás","key":"Santa Rosa de Goiás","lang":"pt"}
+data/BR/GO/Santa Tereza de Goiás={"id":"data/BR/GO/Santa Tereza de Goiás","key":"Santa Tereza de Goiás","lang":"pt"}
+data/BR/GO/Santa Terezinha de Goiás={"id":"data/BR/GO/Santa Terezinha de Goiás","key":"Santa Terezinha de Goiás","lang":"pt"}
+data/BR/GO/Santo Antônio da Barra={"id":"data/BR/GO/Santo Antônio da Barra","key":"Santo Antônio da Barra","lang":"pt"}
+data/BR/GO/Santo Antônio de Goiás={"id":"data/BR/GO/Santo Antônio de Goiás","key":"Santo Antônio de Goiás","lang":"pt"}
+data/BR/GO/Santo Antônio do Descoberto={"id":"data/BR/GO/Santo Antônio do Descoberto","key":"Santo Antônio do Descoberto","lang":"pt"}
+data/BR/GO/Senador Canedo={"id":"data/BR/GO/Senador Canedo","key":"Senador Canedo","lang":"pt"}
+data/BR/GO/Serranópolis={"id":"data/BR/GO/Serranópolis","key":"Serranópolis","lang":"pt"}
+data/BR/GO/Silvania={"id":"data/BR/GO/Silvania","key":"Silvania","lang":"pt"}
+data/BR/GO/Simolândia={"id":"data/BR/GO/Simolândia","key":"Simolândia","lang":"pt"}
+data/BR/GO/São Domingos={"id":"data/BR/GO/São Domingos","key":"São Domingos","lang":"pt"}
+data/BR/GO/São Francisco de Goiás={"id":"data/BR/GO/São Francisco de Goiás","key":"São Francisco de Goiás","lang":"pt"}
+data/BR/GO/São João d'Aliança={"id":"data/BR/GO/São João d'Aliança","key":"São João d'Aliança","lang":"pt"}
+data/BR/GO/São João da Paraúna={"id":"data/BR/GO/São João da Paraúna","key":"São João da Paraúna","lang":"pt"}
+data/BR/GO/São Luís de Montes Belos={"id":"data/BR/GO/São Luís de Montes Belos","key":"São Luís de Montes Belos","lang":"pt"}
+data/BR/GO/São Luíz do Norte={"id":"data/BR/GO/São Luíz do Norte","key":"São Luíz do Norte","lang":"pt"}
+data/BR/GO/São Miguel do Araguaia={"id":"data/BR/GO/São Miguel do Araguaia","key":"São Miguel do Araguaia","lang":"pt"}
+data/BR/GO/São Miguel do Passa Quatro={"id":"data/BR/GO/São Miguel do Passa Quatro","key":"São Miguel do Passa Quatro","lang":"pt"}
+data/BR/GO/São Patrício={"id":"data/BR/GO/São Patrício","key":"São Patrício","lang":"pt"}
+data/BR/GO/São Simão={"id":"data/BR/GO/São Simão","key":"São Simão","lang":"pt"}
+data/BR/GO/Sítio d'Abadia={"id":"data/BR/GO/Sítio d'Abadia","key":"Sítio d'Abadia","lang":"pt"}
+data/BR/GO/Taquaral de Goiás={"id":"data/BR/GO/Taquaral de Goiás","key":"Taquaral de Goiás","lang":"pt"}
+data/BR/GO/Teresina de Goiás={"id":"data/BR/GO/Teresina de Goiás","key":"Teresina de Goiás","lang":"pt"}
+data/BR/GO/Terezópolis de Goiás={"id":"data/BR/GO/Terezópolis de Goiás","key":"Terezópolis de Goiás","lang":"pt"}
+data/BR/GO/Trindade={"id":"data/BR/GO/Trindade","key":"Trindade","lang":"pt"}
+data/BR/GO/Trombas={"id":"data/BR/GO/Trombas","key":"Trombas","lang":"pt"}
+data/BR/GO/Três Ranchos={"id":"data/BR/GO/Três Ranchos","key":"Três Ranchos","lang":"pt"}
+data/BR/GO/Turvelândia={"id":"data/BR/GO/Turvelândia","key":"Turvelândia","lang":"pt"}
+data/BR/GO/Turvânia={"id":"data/BR/GO/Turvânia","key":"Turvânia","lang":"pt"}
+data/BR/GO/Uirapuru={"id":"data/BR/GO/Uirapuru","key":"Uirapuru","lang":"pt"}
+data/BR/GO/Uruana={"id":"data/BR/GO/Uruana","key":"Uruana","lang":"pt"}
+data/BR/GO/Uruaçu={"id":"data/BR/GO/Uruaçu","key":"Uruaçu","lang":"pt"}
+data/BR/GO/Urutaí={"id":"data/BR/GO/Urutaí","key":"Urutaí","lang":"pt"}
+data/BR/GO/Valparaíso de Goiás={"id":"data/BR/GO/Valparaíso de Goiás","key":"Valparaíso de Goiás","lang":"pt"}
+data/BR/GO/Varjão={"id":"data/BR/GO/Varjão","key":"Varjão","lang":"pt"}
+data/BR/GO/Vianópolis={"id":"data/BR/GO/Vianópolis","key":"Vianópolis","lang":"pt"}
+data/BR/GO/Vicentinópolis={"id":"data/BR/GO/Vicentinópolis","key":"Vicentinópolis","lang":"pt"}
+data/BR/GO/Vila Boa={"id":"data/BR/GO/Vila Boa","key":"Vila Boa","lang":"pt"}
+data/BR/GO/Vila Propício={"id":"data/BR/GO/Vila Propício","key":"Vila Propício","lang":"pt"}
+data/BR/GO/Água Fria de Goiás={"id":"data/BR/GO/Água Fria de Goiás","key":"Água Fria de Goiás","lang":"pt"}
+data/BR/GO/Água Limpa={"id":"data/BR/GO/Água Limpa","key":"Água Limpa","lang":"pt"}
+data/BR/GO/Águas Lindas de Goiás={"id":"data/BR/GO/Águas Lindas de Goiás","key":"Águas Lindas de Goiás","lang":"pt"}
+data/BR/MA={"id":"data/BR/MA","key":"MA","name":"Maranhão","lang":"pt","zip":"65","zipex":"65000-000,65999-999","sub_keys":"Açailândia~Afonso Cunha~Água Doce do Maranhão~Alcântara~Aldeias Altas~Altamira do Maranhão~Alto Alegre do Maranhão~Alto Alegre do Pindaré~Alto Parnaíba~Amapá do Maranhão~Amarante do Maranhão~Anajatuba~Anapurus~Apicum-Açu~Araguanã~Araioses~Arame~Arari~Axixá~Bacabal~Bacabeira~Bacuri~Bacurituba~Balsas~Barão de Grajaú~Barra do Corda~Barreirinhas~Bela Vista do Maranhão~Belágua~Benedito Leite~Bequimão~Bernardo do Mearim~Boa Vista do Gurupi~Bom Jardim~Bom Jesus das Selvas~Bom Lugar~Brejo~Brejo de Areia~Buriti~Buriti Bravo~Buriticupu~Buritirama~Cachoeira Grande~Cajapió~Cajari~Campestre do Maranhão~Cândido Mendes~Cantanhede~Capinzal do Norte~Carolina~Carutapera~Caxias~Cedral~Central do Maranhão~Centro do Guilherme~Centro Novo do Maranhão~Chapadinha~Cidelândia~Codó~Coelho Neto~Colinas~Conceição do Lago-Açu~Coroatá~Cururupu~Davinópolis~Dom Pedro~Duque Bacelar~Esperantinópolis~Estreito~Feira Nova do Maranhão~Fernando Falcão~Formosa da Serra Negra~Fortaleza dos Nogueiras~Fortuna~Godofredo Viana~Gonçalves Dias~Governador Archer~Governador Edison Lobão~Governador Eugênio Barros~Governador Luiz Rocha~Governador Newton Bello~Governador Nunes Freire~Graça Aranha~Grajaú~Guimarães~Humberto de Campos~Icatu~Igarapé do Meio~Igarapé Grande~Imperatriz~Itaipava do Grajaú~Itapecuru Mirim~Itinga do Maranhão~Jatobá~Jenipapo dos Vieiras~João Lisboa~Joselândia~Junco do Maranhão~Lago da Pedra~Lago do Junco~Lago dos Rodrigues~Lago Verde~Lagoa do Mato~Lagoa Grande do Maranhão~Lajeado Novo~Lima Campos~Loreto~Luís Domingues~Magalhães de Almeida~Maracaçumé~Marajá do Sena~Maranhãozinho~Mata Roma~Matinha~Matões~Matões do Norte~Milagres do Maranhão~Mirador~Miranda do Norte~Mirinzal~Monção~Montes Altos~Morros~Nina Rodrigues~Nova Colinas~Nova Iorque~Nova Olinda do Maranhão~Olho d'Água das Cunhãs~Olinda Nova do Maranhão~Paço do Lumiar~Palmeirândia~Paraibano~Parnarama~Passagem Franca~Pastos Bons~Paulino Neves~Paulo Ramos~Pedreiras~Pedro do Rosário~Penalva~Peri Mirim~Peritoró~Pindaré Mirim~Pinheiro~Pio XII~Pirapemas~Poção de Pedras~Porto Franco~Porto Rico do Maranhão~Presidente Dutra~Presidente Juscelino~Presidente Médici~Presidente Sarney~Presidente Vargas~Primeira Cruz~Raposa~Riachão~Ribamar Fiquene~Rosario~Sambaíba~Santa Filomena do Maranhão~Santa Helena~Santa Inês~Santa Luzia~Santa Luzia do Paruá~Santa Quitéria do Maranhão~Santa Rita~Santana do Maranhão~Santo Amaro do Maranhão~Santo Antônio dos Lopes~São Benedito do Rio Preto~São Bento~São Bernardo~São Domingos do Azeitão~São Domingos do Maranhão~São Félix de Balsas~São Francisco do Brejão~São Francisco do Maranhão~São João Batista~São João do Carú~São João do Paraíso~São João do Soter~São João dos Patos~São José de Ribamar~São José dos Basílios~São Luís~São Luís Gonzaga do Maranhão~São Mateus do Maranhão~São Pedro da Água Branca~São Pedro dos Crentes~São Raimundo das Mangabeiras~São Raimundo do Doca Bezerra~São Roberto~São Vicente Ferrer~Satubinha~Senador Alexandre Costa~Senador La Rocque~Serrano do Maranhão~Sítio Novo~Sucupira do Norte~Sucupira do Riachão~Tasso Fragoso~Timbiras~Timon~Trizidela do Vale~Tufilândia~Tuntum~Turiaçu~Turilândia~Tutóia~Urbano Santos~Vargem Grande~Viana~Vila Nova dos Martírios~Vitória do Mearim~Vitorino Freire~Zé Doca"}
+data/BR/MA/Afonso Cunha={"id":"data/BR/MA/Afonso Cunha","key":"Afonso Cunha","lang":"pt"}
+data/BR/MA/Alcântara={"id":"data/BR/MA/Alcântara","key":"Alcântara","lang":"pt"}
+data/BR/MA/Aldeias Altas={"id":"data/BR/MA/Aldeias Altas","key":"Aldeias Altas","lang":"pt"}
+data/BR/MA/Altamira do Maranhão={"id":"data/BR/MA/Altamira do Maranhão","key":"Altamira do Maranhão","lang":"pt"}
+data/BR/MA/Alto Alegre do Maranhão={"id":"data/BR/MA/Alto Alegre do Maranhão","key":"Alto Alegre do Maranhão","lang":"pt"}
+data/BR/MA/Alto Alegre do Pindaré={"id":"data/BR/MA/Alto Alegre do Pindaré","key":"Alto Alegre do Pindaré","lang":"pt"}
+data/BR/MA/Alto Parnaíba={"id":"data/BR/MA/Alto Parnaíba","key":"Alto Parnaíba","lang":"pt"}
+data/BR/MA/Amapá do Maranhão={"id":"data/BR/MA/Amapá do Maranhão","key":"Amapá do Maranhão","lang":"pt"}
+data/BR/MA/Amarante do Maranhão={"id":"data/BR/MA/Amarante do Maranhão","key":"Amarante do Maranhão","lang":"pt"}
+data/BR/MA/Anajatuba={"id":"data/BR/MA/Anajatuba","key":"Anajatuba","lang":"pt"}
+data/BR/MA/Anapurus={"id":"data/BR/MA/Anapurus","key":"Anapurus","lang":"pt"}
+data/BR/MA/Apicum-Açu={"id":"data/BR/MA/Apicum-Açu","key":"Apicum-Açu","lang":"pt"}
+data/BR/MA/Araguanã={"id":"data/BR/MA/Araguanã","key":"Araguanã","lang":"pt"}
+data/BR/MA/Araioses={"id":"data/BR/MA/Araioses","key":"Araioses","lang":"pt"}
+data/BR/MA/Arame={"id":"data/BR/MA/Arame","key":"Arame","lang":"pt"}
+data/BR/MA/Arari={"id":"data/BR/MA/Arari","key":"Arari","lang":"pt"}
+data/BR/MA/Axixá={"id":"data/BR/MA/Axixá","key":"Axixá","lang":"pt"}
+data/BR/MA/Açailândia={"id":"data/BR/MA/Açailândia","key":"Açailândia","lang":"pt"}
+data/BR/MA/Bacabal={"id":"data/BR/MA/Bacabal","key":"Bacabal","lang":"pt"}
+data/BR/MA/Bacabeira={"id":"data/BR/MA/Bacabeira","key":"Bacabeira","lang":"pt"}
+data/BR/MA/Bacuri={"id":"data/BR/MA/Bacuri","key":"Bacuri","lang":"pt"}
+data/BR/MA/Bacurituba={"id":"data/BR/MA/Bacurituba","key":"Bacurituba","lang":"pt"}
+data/BR/MA/Balsas={"id":"data/BR/MA/Balsas","key":"Balsas","lang":"pt"}
+data/BR/MA/Barra do Corda={"id":"data/BR/MA/Barra do Corda","key":"Barra do Corda","lang":"pt"}
+data/BR/MA/Barreirinhas={"id":"data/BR/MA/Barreirinhas","key":"Barreirinhas","lang":"pt"}
+data/BR/MA/Barão de Grajaú={"id":"data/BR/MA/Barão de Grajaú","key":"Barão de Grajaú","lang":"pt"}
+data/BR/MA/Bela Vista do Maranhão={"id":"data/BR/MA/Bela Vista do Maranhão","key":"Bela Vista do Maranhão","lang":"pt"}
+data/BR/MA/Belágua={"id":"data/BR/MA/Belágua","key":"Belágua","lang":"pt"}
+data/BR/MA/Benedito Leite={"id":"data/BR/MA/Benedito Leite","key":"Benedito Leite","lang":"pt"}
+data/BR/MA/Bequimão={"id":"data/BR/MA/Bequimão","key":"Bequimão","lang":"pt"}
+data/BR/MA/Bernardo do Mearim={"id":"data/BR/MA/Bernardo do Mearim","key":"Bernardo do Mearim","lang":"pt"}
+data/BR/MA/Boa Vista do Gurupi={"id":"data/BR/MA/Boa Vista do Gurupi","key":"Boa Vista do Gurupi","lang":"pt"}
+data/BR/MA/Bom Jardim={"id":"data/BR/MA/Bom Jardim","key":"Bom Jardim","lang":"pt"}
+data/BR/MA/Bom Jesus das Selvas={"id":"data/BR/MA/Bom Jesus das Selvas","key":"Bom Jesus das Selvas","lang":"pt"}
+data/BR/MA/Bom Lugar={"id":"data/BR/MA/Bom Lugar","key":"Bom Lugar","lang":"pt"}
+data/BR/MA/Brejo={"id":"data/BR/MA/Brejo","key":"Brejo","lang":"pt"}
+data/BR/MA/Brejo de Areia={"id":"data/BR/MA/Brejo de Areia","key":"Brejo de Areia","lang":"pt"}
+data/BR/MA/Buriti={"id":"data/BR/MA/Buriti","key":"Buriti","lang":"pt"}
+data/BR/MA/Buriti Bravo={"id":"data/BR/MA/Buriti Bravo","key":"Buriti Bravo","lang":"pt"}
+data/BR/MA/Buriticupu={"id":"data/BR/MA/Buriticupu","key":"Buriticupu","lang":"pt"}
+data/BR/MA/Buritirama={"id":"data/BR/MA/Buritirama","key":"Buritirama","lang":"pt"}
+data/BR/MA/Cachoeira Grande={"id":"data/BR/MA/Cachoeira Grande","key":"Cachoeira Grande","lang":"pt"}
+data/BR/MA/Cajapió={"id":"data/BR/MA/Cajapió","key":"Cajapió","lang":"pt"}
+data/BR/MA/Cajari={"id":"data/BR/MA/Cajari","key":"Cajari","lang":"pt"}
+data/BR/MA/Campestre do Maranhão={"id":"data/BR/MA/Campestre do Maranhão","key":"Campestre do Maranhão","lang":"pt"}
+data/BR/MA/Cantanhede={"id":"data/BR/MA/Cantanhede","key":"Cantanhede","lang":"pt"}
+data/BR/MA/Capinzal do Norte={"id":"data/BR/MA/Capinzal do Norte","key":"Capinzal do Norte","lang":"pt"}
+data/BR/MA/Carolina={"id":"data/BR/MA/Carolina","key":"Carolina","lang":"pt"}
+data/BR/MA/Carutapera={"id":"data/BR/MA/Carutapera","key":"Carutapera","lang":"pt"}
+data/BR/MA/Caxias={"id":"data/BR/MA/Caxias","key":"Caxias","lang":"pt"}
+data/BR/MA/Cedral={"id":"data/BR/MA/Cedral","key":"Cedral","lang":"pt"}
+data/BR/MA/Central do Maranhão={"id":"data/BR/MA/Central do Maranhão","key":"Central do Maranhão","lang":"pt"}
+data/BR/MA/Centro Novo do Maranhão={"id":"data/BR/MA/Centro Novo do Maranhão","key":"Centro Novo do Maranhão","lang":"pt"}
+data/BR/MA/Centro do Guilherme={"id":"data/BR/MA/Centro do Guilherme","key":"Centro do Guilherme","lang":"pt"}
+data/BR/MA/Chapadinha={"id":"data/BR/MA/Chapadinha","key":"Chapadinha","lang":"pt"}
+data/BR/MA/Cidelândia={"id":"data/BR/MA/Cidelândia","key":"Cidelândia","lang":"pt"}
+data/BR/MA/Codó={"id":"data/BR/MA/Codó","key":"Codó","lang":"pt"}
+data/BR/MA/Coelho Neto={"id":"data/BR/MA/Coelho Neto","key":"Coelho Neto","lang":"pt"}
+data/BR/MA/Colinas={"id":"data/BR/MA/Colinas","key":"Colinas","lang":"pt"}
+data/BR/MA/Conceição do Lago-Açu={"id":"data/BR/MA/Conceição do Lago-Açu","key":"Conceição do Lago-Açu","lang":"pt"}
+data/BR/MA/Coroatá={"id":"data/BR/MA/Coroatá","key":"Coroatá","lang":"pt"}
+data/BR/MA/Cururupu={"id":"data/BR/MA/Cururupu","key":"Cururupu","lang":"pt"}
+data/BR/MA/Cândido Mendes={"id":"data/BR/MA/Cândido Mendes","key":"Cândido Mendes","lang":"pt"}
+data/BR/MA/Davinópolis={"id":"data/BR/MA/Davinópolis","key":"Davinópolis","lang":"pt"}
+data/BR/MA/Dom Pedro={"id":"data/BR/MA/Dom Pedro","key":"Dom Pedro","lang":"pt"}
+data/BR/MA/Duque Bacelar={"id":"data/BR/MA/Duque Bacelar","key":"Duque Bacelar","lang":"pt"}
+data/BR/MA/Esperantinópolis={"id":"data/BR/MA/Esperantinópolis","key":"Esperantinópolis","lang":"pt"}
+data/BR/MA/Estreito={"id":"data/BR/MA/Estreito","key":"Estreito","lang":"pt"}
+data/BR/MA/Feira Nova do Maranhão={"id":"data/BR/MA/Feira Nova do Maranhão","key":"Feira Nova do Maranhão","lang":"pt"}
+data/BR/MA/Fernando Falcão={"id":"data/BR/MA/Fernando Falcão","key":"Fernando Falcão","lang":"pt"}
+data/BR/MA/Formosa da Serra Negra={"id":"data/BR/MA/Formosa da Serra Negra","key":"Formosa da Serra Negra","lang":"pt"}
+data/BR/MA/Fortaleza dos Nogueiras={"id":"data/BR/MA/Fortaleza dos Nogueiras","key":"Fortaleza dos Nogueiras","lang":"pt"}
+data/BR/MA/Fortuna={"id":"data/BR/MA/Fortuna","key":"Fortuna","lang":"pt"}
+data/BR/MA/Godofredo Viana={"id":"data/BR/MA/Godofredo Viana","key":"Godofredo Viana","lang":"pt"}
+data/BR/MA/Gonçalves Dias={"id":"data/BR/MA/Gonçalves Dias","key":"Gonçalves Dias","lang":"pt"}
+data/BR/MA/Governador Archer={"id":"data/BR/MA/Governador Archer","key":"Governador Archer","lang":"pt"}
+data/BR/MA/Governador Edison Lobão={"id":"data/BR/MA/Governador Edison Lobão","key":"Governador Edison Lobão","lang":"pt"}
+data/BR/MA/Governador Eugênio Barros={"id":"data/BR/MA/Governador Eugênio Barros","key":"Governador Eugênio Barros","lang":"pt"}
+data/BR/MA/Governador Luiz Rocha={"id":"data/BR/MA/Governador Luiz Rocha","key":"Governador Luiz Rocha","lang":"pt"}
+data/BR/MA/Governador Newton Bello={"id":"data/BR/MA/Governador Newton Bello","key":"Governador Newton Bello","lang":"pt"}
+data/BR/MA/Governador Nunes Freire={"id":"data/BR/MA/Governador Nunes Freire","key":"Governador Nunes Freire","lang":"pt"}
+data/BR/MA/Grajaú={"id":"data/BR/MA/Grajaú","key":"Grajaú","lang":"pt"}
+data/BR/MA/Graça Aranha={"id":"data/BR/MA/Graça Aranha","key":"Graça Aranha","lang":"pt"}
+data/BR/MA/Guimarães={"id":"data/BR/MA/Guimarães","key":"Guimarães","lang":"pt"}
+data/BR/MA/Humberto de Campos={"id":"data/BR/MA/Humberto de Campos","key":"Humberto de Campos","lang":"pt"}
+data/BR/MA/Icatu={"id":"data/BR/MA/Icatu","key":"Icatu","lang":"pt"}
+data/BR/MA/Igarapé Grande={"id":"data/BR/MA/Igarapé Grande","key":"Igarapé Grande","lang":"pt"}
+data/BR/MA/Igarapé do Meio={"id":"data/BR/MA/Igarapé do Meio","key":"Igarapé do Meio","lang":"pt"}
+data/BR/MA/Imperatriz={"id":"data/BR/MA/Imperatriz","key":"Imperatriz","lang":"pt"}
+data/BR/MA/Itaipava do Grajaú={"id":"data/BR/MA/Itaipava do Grajaú","key":"Itaipava do Grajaú","lang":"pt"}
+data/BR/MA/Itapecuru Mirim={"id":"data/BR/MA/Itapecuru Mirim","key":"Itapecuru Mirim","lang":"pt"}
+data/BR/MA/Itinga do Maranhão={"id":"data/BR/MA/Itinga do Maranhão","key":"Itinga do Maranhão","lang":"pt"}
+data/BR/MA/Jatobá={"id":"data/BR/MA/Jatobá","key":"Jatobá","lang":"pt"}
+data/BR/MA/Jenipapo dos Vieiras={"id":"data/BR/MA/Jenipapo dos Vieiras","key":"Jenipapo dos Vieiras","lang":"pt"}
+data/BR/MA/Joselândia={"id":"data/BR/MA/Joselândia","key":"Joselândia","lang":"pt"}
+data/BR/MA/João Lisboa={"id":"data/BR/MA/João Lisboa","key":"João Lisboa","lang":"pt"}
+data/BR/MA/Junco do Maranhão={"id":"data/BR/MA/Junco do Maranhão","key":"Junco do Maranhão","lang":"pt"}
+data/BR/MA/Lago Verde={"id":"data/BR/MA/Lago Verde","key":"Lago Verde","lang":"pt"}
+data/BR/MA/Lago da Pedra={"id":"data/BR/MA/Lago da Pedra","key":"Lago da Pedra","lang":"pt"}
+data/BR/MA/Lago do Junco={"id":"data/BR/MA/Lago do Junco","key":"Lago do Junco","lang":"pt"}
+data/BR/MA/Lago dos Rodrigues={"id":"data/BR/MA/Lago dos Rodrigues","key":"Lago dos Rodrigues","lang":"pt"}
+data/BR/MA/Lagoa Grande do Maranhão={"id":"data/BR/MA/Lagoa Grande do Maranhão","key":"Lagoa Grande do Maranhão","lang":"pt"}
+data/BR/MA/Lagoa do Mato={"id":"data/BR/MA/Lagoa do Mato","key":"Lagoa do Mato","lang":"pt"}
+data/BR/MA/Lajeado Novo={"id":"data/BR/MA/Lajeado Novo","key":"Lajeado Novo","lang":"pt"}
+data/BR/MA/Lima Campos={"id":"data/BR/MA/Lima Campos","key":"Lima Campos","lang":"pt"}
+data/BR/MA/Loreto={"id":"data/BR/MA/Loreto","key":"Loreto","lang":"pt"}
+data/BR/MA/Luís Domingues={"id":"data/BR/MA/Luís Domingues","key":"Luís Domingues","lang":"pt"}
+data/BR/MA/Magalhães de Almeida={"id":"data/BR/MA/Magalhães de Almeida","key":"Magalhães de Almeida","lang":"pt"}
+data/BR/MA/Maracaçumé={"id":"data/BR/MA/Maracaçumé","key":"Maracaçumé","lang":"pt"}
+data/BR/MA/Marajá do Sena={"id":"data/BR/MA/Marajá do Sena","key":"Marajá do Sena","lang":"pt"}
+data/BR/MA/Maranhãozinho={"id":"data/BR/MA/Maranhãozinho","key":"Maranhãozinho","lang":"pt"}
+data/BR/MA/Mata Roma={"id":"data/BR/MA/Mata Roma","key":"Mata Roma","lang":"pt"}
+data/BR/MA/Matinha={"id":"data/BR/MA/Matinha","key":"Matinha","lang":"pt"}
+data/BR/MA/Matões={"id":"data/BR/MA/Matões","key":"Matões","lang":"pt"}
+data/BR/MA/Matões do Norte={"id":"data/BR/MA/Matões do Norte","key":"Matões do Norte","lang":"pt"}
+data/BR/MA/Milagres do Maranhão={"id":"data/BR/MA/Milagres do Maranhão","key":"Milagres do Maranhão","lang":"pt"}
+data/BR/MA/Mirador={"id":"data/BR/MA/Mirador","key":"Mirador","lang":"pt"}
+data/BR/MA/Miranda do Norte={"id":"data/BR/MA/Miranda do Norte","key":"Miranda do Norte","lang":"pt"}
+data/BR/MA/Mirinzal={"id":"data/BR/MA/Mirinzal","key":"Mirinzal","lang":"pt"}
+data/BR/MA/Montes Altos={"id":"data/BR/MA/Montes Altos","key":"Montes Altos","lang":"pt"}
+data/BR/MA/Monção={"id":"data/BR/MA/Monção","key":"Monção","lang":"pt"}
+data/BR/MA/Morros={"id":"data/BR/MA/Morros","key":"Morros","lang":"pt"}
+data/BR/MA/Nina Rodrigues={"id":"data/BR/MA/Nina Rodrigues","key":"Nina Rodrigues","lang":"pt"}
+data/BR/MA/Nova Colinas={"id":"data/BR/MA/Nova Colinas","key":"Nova Colinas","lang":"pt"}
+data/BR/MA/Nova Iorque={"id":"data/BR/MA/Nova Iorque","key":"Nova Iorque","lang":"pt"}
+data/BR/MA/Nova Olinda do Maranhão={"id":"data/BR/MA/Nova Olinda do Maranhão","key":"Nova Olinda do Maranhão","lang":"pt"}
+data/BR/MA/Olho d'Água das Cunhãs={"id":"data/BR/MA/Olho d'Água das Cunhãs","key":"Olho d'Água das Cunhãs","lang":"pt"}
+data/BR/MA/Olinda Nova do Maranhão={"id":"data/BR/MA/Olinda Nova do Maranhão","key":"Olinda Nova do Maranhão","lang":"pt"}
+data/BR/MA/Palmeirândia={"id":"data/BR/MA/Palmeirândia","key":"Palmeirândia","lang":"pt"}
+data/BR/MA/Paraibano={"id":"data/BR/MA/Paraibano","key":"Paraibano","lang":"pt"}
+data/BR/MA/Parnarama={"id":"data/BR/MA/Parnarama","key":"Parnarama","lang":"pt"}
+data/BR/MA/Passagem Franca={"id":"data/BR/MA/Passagem Franca","key":"Passagem Franca","lang":"pt"}
+data/BR/MA/Pastos Bons={"id":"data/BR/MA/Pastos Bons","key":"Pastos Bons","lang":"pt"}
+data/BR/MA/Paulino Neves={"id":"data/BR/MA/Paulino Neves","key":"Paulino Neves","lang":"pt"}
+data/BR/MA/Paulo Ramos={"id":"data/BR/MA/Paulo Ramos","key":"Paulo Ramos","lang":"pt"}
+data/BR/MA/Paço do Lumiar={"id":"data/BR/MA/Paço do Lumiar","key":"Paço do Lumiar","lang":"pt"}
+data/BR/MA/Pedreiras={"id":"data/BR/MA/Pedreiras","key":"Pedreiras","lang":"pt"}
+data/BR/MA/Pedro do Rosário={"id":"data/BR/MA/Pedro do Rosário","key":"Pedro do Rosário","lang":"pt"}
+data/BR/MA/Penalva={"id":"data/BR/MA/Penalva","key":"Penalva","lang":"pt"}
+data/BR/MA/Peri Mirim={"id":"data/BR/MA/Peri Mirim","key":"Peri Mirim","lang":"pt"}
+data/BR/MA/Peritoró={"id":"data/BR/MA/Peritoró","key":"Peritoró","lang":"pt"}
+data/BR/MA/Pindaré Mirim={"id":"data/BR/MA/Pindaré Mirim","key":"Pindaré Mirim","lang":"pt"}
+data/BR/MA/Pinheiro={"id":"data/BR/MA/Pinheiro","key":"Pinheiro","lang":"pt"}
+data/BR/MA/Pio XII={"id":"data/BR/MA/Pio XII","key":"Pio XII","lang":"pt"}
+data/BR/MA/Pirapemas={"id":"data/BR/MA/Pirapemas","key":"Pirapemas","lang":"pt"}
+data/BR/MA/Porto Franco={"id":"data/BR/MA/Porto Franco","key":"Porto Franco","lang":"pt"}
+data/BR/MA/Porto Rico do Maranhão={"id":"data/BR/MA/Porto Rico do Maranhão","key":"Porto Rico do Maranhão","lang":"pt"}
+data/BR/MA/Poção de Pedras={"id":"data/BR/MA/Poção de Pedras","key":"Poção de Pedras","lang":"pt"}
+data/BR/MA/Presidente Dutra={"id":"data/BR/MA/Presidente Dutra","key":"Presidente Dutra","lang":"pt"}
+data/BR/MA/Presidente Juscelino={"id":"data/BR/MA/Presidente Juscelino","key":"Presidente Juscelino","lang":"pt"}
+data/BR/MA/Presidente Médici={"id":"data/BR/MA/Presidente Médici","key":"Presidente Médici","lang":"pt"}
+data/BR/MA/Presidente Sarney={"id":"data/BR/MA/Presidente Sarney","key":"Presidente Sarney","lang":"pt"}
+data/BR/MA/Presidente Vargas={"id":"data/BR/MA/Presidente Vargas","key":"Presidente Vargas","lang":"pt"}
+data/BR/MA/Primeira Cruz={"id":"data/BR/MA/Primeira Cruz","key":"Primeira Cruz","lang":"pt"}
+data/BR/MA/Raposa={"id":"data/BR/MA/Raposa","key":"Raposa","lang":"pt"}
+data/BR/MA/Riachão={"id":"data/BR/MA/Riachão","key":"Riachão","lang":"pt"}
+data/BR/MA/Ribamar Fiquene={"id":"data/BR/MA/Ribamar Fiquene","key":"Ribamar Fiquene","lang":"pt"}
+data/BR/MA/Rosario={"id":"data/BR/MA/Rosario","key":"Rosario","lang":"pt"}
+data/BR/MA/Sambaíba={"id":"data/BR/MA/Sambaíba","key":"Sambaíba","lang":"pt"}
+data/BR/MA/Santa Filomena do Maranhão={"id":"data/BR/MA/Santa Filomena do Maranhão","key":"Santa Filomena do Maranhão","lang":"pt"}
+data/BR/MA/Santa Helena={"id":"data/BR/MA/Santa Helena","key":"Santa Helena","lang":"pt"}
+data/BR/MA/Santa Inês={"id":"data/BR/MA/Santa Inês","key":"Santa Inês","lang":"pt"}
+data/BR/MA/Santa Luzia={"id":"data/BR/MA/Santa Luzia","key":"Santa Luzia","lang":"pt"}
+data/BR/MA/Santa Luzia do Paruá={"id":"data/BR/MA/Santa Luzia do Paruá","key":"Santa Luzia do Paruá","lang":"pt"}
+data/BR/MA/Santa Quitéria do Maranhão={"id":"data/BR/MA/Santa Quitéria do Maranhão","key":"Santa Quitéria do Maranhão","lang":"pt"}
+data/BR/MA/Santa Rita={"id":"data/BR/MA/Santa Rita","key":"Santa Rita","lang":"pt"}
+data/BR/MA/Santana do Maranhão={"id":"data/BR/MA/Santana do Maranhão","key":"Santana do Maranhão","lang":"pt"}
+data/BR/MA/Santo Amaro do Maranhão={"id":"data/BR/MA/Santo Amaro do Maranhão","key":"Santo Amaro do Maranhão","lang":"pt"}
+data/BR/MA/Santo Antônio dos Lopes={"id":"data/BR/MA/Santo Antônio dos Lopes","key":"Santo Antônio dos Lopes","lang":"pt"}
+data/BR/MA/Satubinha={"id":"data/BR/MA/Satubinha","key":"Satubinha","lang":"pt"}
+data/BR/MA/Senador Alexandre Costa={"id":"data/BR/MA/Senador Alexandre Costa","key":"Senador Alexandre Costa","lang":"pt"}
+data/BR/MA/Senador La Rocque={"id":"data/BR/MA/Senador La Rocque","key":"Senador La Rocque","lang":"pt"}
+data/BR/MA/Serrano do Maranhão={"id":"data/BR/MA/Serrano do Maranhão","key":"Serrano do Maranhão","lang":"pt"}
+data/BR/MA/Sucupira do Norte={"id":"data/BR/MA/Sucupira do Norte","key":"Sucupira do Norte","lang":"pt"}
+data/BR/MA/Sucupira do Riachão={"id":"data/BR/MA/Sucupira do Riachão","key":"Sucupira do Riachão","lang":"pt"}
+data/BR/MA/São Benedito do Rio Preto={"id":"data/BR/MA/São Benedito do Rio Preto","key":"São Benedito do Rio Preto","lang":"pt"}
+data/BR/MA/São Bento={"id":"data/BR/MA/São Bento","key":"São Bento","lang":"pt"}
+data/BR/MA/São Bernardo={"id":"data/BR/MA/São Bernardo","key":"São Bernardo","lang":"pt"}
+data/BR/MA/São Domingos do Azeitão={"id":"data/BR/MA/São Domingos do Azeitão","key":"São Domingos do Azeitão","lang":"pt"}
+data/BR/MA/São Domingos do Maranhão={"id":"data/BR/MA/São Domingos do Maranhão","key":"São Domingos do Maranhão","lang":"pt"}
+data/BR/MA/São Francisco do Brejão={"id":"data/BR/MA/São Francisco do Brejão","key":"São Francisco do Brejão","lang":"pt"}
+data/BR/MA/São Francisco do Maranhão={"id":"data/BR/MA/São Francisco do Maranhão","key":"São Francisco do Maranhão","lang":"pt"}
+data/BR/MA/São Félix de Balsas={"id":"data/BR/MA/São Félix de Balsas","key":"São Félix de Balsas","lang":"pt"}
+data/BR/MA/São José de Ribamar={"id":"data/BR/MA/São José de Ribamar","key":"São José de Ribamar","lang":"pt"}
+data/BR/MA/São José dos Basílios={"id":"data/BR/MA/São José dos Basílios","key":"São José dos Basílios","lang":"pt"}
+data/BR/MA/São João Batista={"id":"data/BR/MA/São João Batista","key":"São João Batista","lang":"pt"}
+data/BR/MA/São João do Carú={"id":"data/BR/MA/São João do Carú","key":"São João do Carú","lang":"pt"}
+data/BR/MA/São João do Paraíso={"id":"data/BR/MA/São João do Paraíso","key":"São João do Paraíso","lang":"pt"}
+data/BR/MA/São João do Soter={"id":"data/BR/MA/São João do Soter","key":"São João do Soter","lang":"pt"}
+data/BR/MA/São João dos Patos={"id":"data/BR/MA/São João dos Patos","key":"São João dos Patos","lang":"pt"}
+data/BR/MA/São Luís={"id":"data/BR/MA/São Luís","key":"São Luís","lang":"pt"}
+data/BR/MA/São Luís Gonzaga do Maranhão={"id":"data/BR/MA/São Luís Gonzaga do Maranhão","key":"São Luís Gonzaga do Maranhão","lang":"pt"}
+data/BR/MA/São Mateus do Maranhão={"id":"data/BR/MA/São Mateus do Maranhão","key":"São Mateus do Maranhão","lang":"pt"}
+data/BR/MA/São Pedro da Água Branca={"id":"data/BR/MA/São Pedro da Água Branca","key":"São Pedro da Água Branca","lang":"pt"}
+data/BR/MA/São Pedro dos Crentes={"id":"data/BR/MA/São Pedro dos Crentes","key":"São Pedro dos Crentes","lang":"pt"}
+data/BR/MA/São Raimundo das Mangabeiras={"id":"data/BR/MA/São Raimundo das Mangabeiras","key":"São Raimundo das Mangabeiras","lang":"pt"}
+data/BR/MA/São Raimundo do Doca Bezerra={"id":"data/BR/MA/São Raimundo do Doca Bezerra","key":"São Raimundo do Doca Bezerra","lang":"pt"}
+data/BR/MA/São Roberto={"id":"data/BR/MA/São Roberto","key":"São Roberto","lang":"pt"}
+data/BR/MA/São Vicente Ferrer={"id":"data/BR/MA/São Vicente Ferrer","key":"São Vicente Ferrer","lang":"pt"}
+data/BR/MA/Sítio Novo={"id":"data/BR/MA/Sítio Novo","key":"Sítio Novo","lang":"pt"}
+data/BR/MA/Tasso Fragoso={"id":"data/BR/MA/Tasso Fragoso","key":"Tasso Fragoso","lang":"pt"}
+data/BR/MA/Timbiras={"id":"data/BR/MA/Timbiras","key":"Timbiras","lang":"pt"}
+data/BR/MA/Timon={"id":"data/BR/MA/Timon","key":"Timon","lang":"pt"}
+data/BR/MA/Trizidela do Vale={"id":"data/BR/MA/Trizidela do Vale","key":"Trizidela do Vale","lang":"pt"}
+data/BR/MA/Tufilândia={"id":"data/BR/MA/Tufilândia","key":"Tufilândia","lang":"pt"}
+data/BR/MA/Tuntum={"id":"data/BR/MA/Tuntum","key":"Tuntum","lang":"pt"}
+data/BR/MA/Turiaçu={"id":"data/BR/MA/Turiaçu","key":"Turiaçu","lang":"pt"}
+data/BR/MA/Turilândia={"id":"data/BR/MA/Turilândia","key":"Turilândia","lang":"pt"}
+data/BR/MA/Tutóia={"id":"data/BR/MA/Tutóia","key":"Tutóia","lang":"pt"}
+data/BR/MA/Urbano Santos={"id":"data/BR/MA/Urbano Santos","key":"Urbano Santos","lang":"pt"}
+data/BR/MA/Vargem Grande={"id":"data/BR/MA/Vargem Grande","key":"Vargem Grande","lang":"pt"}
+data/BR/MA/Viana={"id":"data/BR/MA/Viana","key":"Viana","lang":"pt"}
+data/BR/MA/Vila Nova dos Martírios={"id":"data/BR/MA/Vila Nova dos Martírios","key":"Vila Nova dos Martírios","lang":"pt"}
+data/BR/MA/Vitorino Freire={"id":"data/BR/MA/Vitorino Freire","key":"Vitorino Freire","lang":"pt"}
+data/BR/MA/Vitória do Mearim={"id":"data/BR/MA/Vitória do Mearim","key":"Vitória do Mearim","lang":"pt"}
+data/BR/MA/Zé Doca={"id":"data/BR/MA/Zé Doca","key":"Zé Doca","lang":"pt"}
+data/BR/MA/Água Doce do Maranhão={"id":"data/BR/MA/Água Doce do Maranhão","key":"Água Doce do Maranhão","lang":"pt"}
+data/BR/MG={"id":"data/BR/MG","key":"MG","name":"Minas Gerais","lang":"pt","zip":"3","zipex":"30000-000,39999-999","sub_keys":"Abadia dos Dourados~Abaeté~Abre Campo~Acaiaca~Açucena~Água Boa~Água Comprida~Aguanil~Águas Formosas~Águas Vermelhas~Aimorés~Aiuruoca~Alagoa~Albertina~Além Paraíba~Alfenas~Alfredo Vasconcelos~Almenara~Alpercata~Alpinópolis~Alterosa~Alto Caparaó~Alto Jequitibá~Alto Rio Doce~Alvarenga~Alvinópolis~Alvorada de Minas~Amparo do Serra~Andradas~Andrelândia~Angelândia~Antônio Carlos~Antônio Dias~Antônio Prado de Minas~Araçaí~Aracitaba~Araçuaí~Araguari~Arantina~Araponga~Araporã~Arapuá~Araújos~Araxá~Arceburgo~Arcos~Areado~Argirita~Aricanduva~Arinos~Astolfo Dutra~Ataléia~Augusto de Lima~Baependi~Baldim~Bambuí~Bandeira~Bandeira do Sul~Barão de Cocais~Barão de Monte Alto~Barbacena~Barra Longa~Barroso~Bela Vista de Minas~Belmiro Braga~Belo Horizonte~Belo Oriente~Belo Vale~Berilo~Berizal~Bertópolis~Betim~Bias Fortes~Bicas~Biquinhas~Boa Esperança~Bocaina de Minas~Bocaiúva~Bom Despacho~Bom Jardim de Minas~Bom Jesus da Penha~Bom Jesus do Amparo~Bom Jesus do Galho~Bom Repouso~Bom Sucesso~Bonfim~Bonfinópolis de Minas~Bonito de Minas~Borda da Mata~Botelhos~Botumirim~Brás Pires~Brasilândia de Minas~Brasília de Minas~Brasopolis~Braúnas~Brumadinho~Bueno Brandão~Buenópolis~Bugre~Buritis~Buritizeiro~Cabeceira Grande~Cabo Verde~Cachoeira da Prata~Cachoeira de Minas~Cachoeira de Pajeú~Cachoeira Dourada~Caetanópolis~Caeté~Caiana~Cajuri~Caldas~Camacho~Camanducaia~Cambuí~Cambuquira~Campanário~Campanhã~Campestre~Campina Verde~Campo Azul~Campo Belo~Campo do Meio~Campo Florido~Campos Altos~Campos Gerais~Cana Verde~Canaã~Canápolis~Candeias~Cantagalo~Caparaó~Capela Nova~Capelinha~Capetinga~Capim Branco~Capinópolis~Capitão Andrade~Capitão Enéas~Capitólio~Caputira~Caraí~Caranaíba~Carandaí~Carangola~Caratinga~Carbonita~Careaçu~Carlos Chagas~Carmésia~Carmo da Cachoeira~Carmo da Mata~Carmo de Minas~Carmo do Cajuru~Carmo do Paranaíba~Carmo do Rio Claro~Carmópolis de Minas~Carneirinho~Carrancas~Carvalhópolis~Carvalhos~Casa Grande~Cascalho Rico~Cassia~Cataguases~Catas Altas~Catas Altas da Noruega~Catuji~Catuti~Caxambu~Cedro do Abaeté~Central de Minas~Centralina~Chácara~Chalé~Chapada do Norte~Chapada Gaúcha~Chiador~Cipotânea~Claraval~Claro dos Poções~Cláudio~Coimbra~Coluna~Comendador Gomes~Comercinho~Conceição da Aparecida~Conceição da Barra de Minas~Conceição das Alagoas~Conceição das Pedras~Conceição de Ipanema~Conceição do Mato Dentro~Conceição do Pará~Conceição do Rio Verde~Conceição dos Ouros~Cônego Marinho~Confins~Congonhal~Congonhas~Congonhas do Norte~Conquista~Conselheiro Lafaiete~Conselheiro Pena~Consolação~Contagem~Coqueiral~Coração de Jesus~Cordisburgo~Cordislândia~Corinto~Coroaci~Coromandel~Coronel Fabriciano~Coronel Murta~Coronel Pacheco~Coronel Xavier Chaves~Córrego Danta~Córrego do Bom Jesus~Córrego Fundo~Córrego Novo~Couto de Magalhães de Minas~Crisólita~Cristais~Cristália~Cristiano Otoni~Cristina~Crucilândia~Cruzeiro da Fortaleza~Cruzília~Cuparaque~Curral de Dentro~Curvelo~Datas~Delfim Moreira~Delfinópolis~Delta~Descoberto~Desterro de Entre Rios~Desterro do Melo~Diamantina~Diogo de Vasconcelos~Dionísio~Divinésia~Divino~Divino das Laranjeiras~Divinolândia de Minas~Divinópolis~Divisa Alegre~Divisa Nova~Divisópolis~Dom Bosco~Dom Cavati~Dom Joaquim~Dom Silvério~Dom Viçoso~Dona Eusébia~Dores de Campos~Dores de Guanhães~Dores do Indaiá~Dores do Turvo~Doresópolis~Douradoquara~Durandé~Elói Mendes~Engenheiro Caldas~Engenheiro Navarro~Entre Folhas~Entre Rios de Minas~Ervália~Esmeraldas~Espera feliz~Espinosa~Espírito Santo do Dourado~Estiva~Estrela Dalva~Estrela do Indaiá~Estrela do Sul~Eugenópolis~Ewbank da Câmara~Extrema~Fama~Faria Lemos~Felício dos Santos~Felisburgo~Felixlândia~Fernandes Tourinho~Ferros~Fervedouro~Florestal~Formiga~Formoso~Fortaleza de Minas~Fortuna de Minas~Francisco Badaró~Francisco Dumont~Francisco Sá~Franciscópolis~Frei Gaspar~Frei Inocêncio~Frei Lagonegro~Fronteira~Fronteira dos Vales~Fruta de Leite~Frutal~Funilândia~Galiléia~Gameleiras~Glaucilândia~Goiabeira~Goiana~Gonçalves~Gonzaga~Gouveia~Governador Valadares~Grão Mogol~Grupiara~Guanhães~Guapé~Guaraciaba~Guaraciama~Guaranésia~Guarani~Guarará~Guarda-Mor~Guaxupé~Guidoval~Guimarânia~Guiricema~Gurinhatã~Heliodora~Iapu~Ibertioga~Ibiá~Ibiaí~Ibiracatu~Ibiraci~Ibirité~Ibitiúra de Minas~Ibituruna~Icaraí de Minas~Igarapé~Igaratinga~Iguatama~Ijaci~Ilicínea~Imbé de Minas~Inconfidentes~Indaiabira~Indianópolis~Ingaí~Inhapim~Inhaúma~Inimutaba~Ipaba~Ipanema~Ipatinga~Ipiaçu~Ipuiúna~Iraí de Minas~Itabira~Itabirinha~Itabirito~Itacambira~Itacarambi~Itaguara~Itaipé~Itajubá~Itamarandiba~Itamarati de Minas~Itambacuri~Itambé do Mato Dentro~Itamogi~Itamonte~Itanhandu~Itanhomi~Itaobim~Itapagipe~Itapecerica~Itapeva~Itatiaiuçu~Itaú de Minas~Itaúna~Itaverava~Itinga~Itueta~Ituiutaba~Itumirim~Iturama~Itutinga~Jaboticatubas~Jacinto~Jacuí~Jacutinga~Jaguaraçu~Jaíba~Jampruca~Janaúba~Januária~Japaraíba~Japonvar~Jeceaba~Jenipapo de Minas~Jequeri~Jequitaí~Jequitibá~Jequitinhonha~Jesuânia~Joaíma~Joanésia~João Monlevade~João Pinheiro~Joaquim Felício~Jordânia~José Gonçalves de Minas~José Raydan~Josenópolis~Juatuba~Juiz de Fora~Juramento~Juruaia~Juvenilia~Ladainha~Lagamar~Lagoa da Prata~Lagoa dos Patos~Lagoa Dourada~Lagoa Formosa~Lagoa Grande~Lagoa Santa~Lajinha~Lambari~Lamim~Laranjal~Lassance~Lavras~Leandro Ferreira~Leme do Prado~Leopoldina~Liberdade~Lima Duarte~Limeira do Oeste~Lontra~Luisburgo~Luislândia~Luminárias~Luz~Machacalis~Machado~Madre de Deus de Minas~Malacacheta~Mamonas~Manga~Manhuaçu~Manhumirim~Mantena~Mar de Espanha~Maravilhas~Maria da Fé~Mariana~Marilac~Mário Campos~Maripá de Minas~Marliéria~Marmelópolis~Martinho Campos~Martins Soares~Mata Verde~Materlândia~Mateus Leme~Mathias Lobato~Matias Barbosa~Matias Cardoso~Matipo~Mato Verde~Matozinhos~Matutina~Medeiros~Medina~Mendes Pimentel~Mercês~Mesquita~Minas Novas~Minduri~Mirabela~Miradouro~Miraí~Miravânia~Moeda~Moema~Monjolos~Monsenhor Paulo~Montalvânia~Monte Alegre de Minas~Monte Azul~Monte Belo~Monte Carmelo~Monte Formoso~Monte Santo de Minas~Monte Sião~Montes Claros~Montezuma~Morada Nova de Minas~Morro da Garça~Morro do Pilar~Munhoz~Muriaé~Mutum~Muzambinho~Nacip Raydan~Nanuque~Naque~Natalândia~Natércia~Nazareno~Nepomuceno~Ninheira~Nova Belém~Nova Era~Nova Lima~Nova Módica~Nova Ponte~Nova Porteirinha~Nova Resende~Nova Serrana~Nova União~Novo Cruzeiro~Novo Oriente de Minas~Novorizonte~Olaria~Olhos-d'Água~Olímpio Noronha~Oliveira~Oliveira Fortes~Onça de Pitangui~Oratórios~Orizânia~Ouro Branco~Ouro Fino~Ouro Preto~Ouro Verde de Minas~Padre Carvalho~Padre Paraíso~Pai Pedro~Paineiras~Pains~Paiva~Palma~Palmópolis~Papagaios~Pará de Minas~Paracatu~Paraguaçu~Paraisópolis~Paraopeba~Passa Quatro~Passa Tempo~Passa Vinte~Passabém~Passos~Patis~Patos de Minas~Patrocínio~Patrocínio do Muriaé~Paula Cândido~Paulistas~Pavão~Peçanha~Pedra Azul~Pedra Bonita~Pedra do Anta~Pedra do Indaiá~Pedra Dourada~Pedralva~Pedras de Maria da Cruz~Pedrinópolis~Pedro Leopoldo~Pedro Teixeira~Pequeri~Pequi~Perdigão~Perdizes~Perdões~Periquito~Pescador~Piau~Piedade de Caratinga~Piedade de Ponte Nova~Piedade do Rio Grande~Piedade dos Gerais~Pimenta~Pingo d'Água~Pintópolis~Piracema~Pirajuba~Piranga~Piranguçu~Piranguinho~Pirapetinga~Pirapora~Piraúba~Pitangui~Piumhi~Planura~Poço Fundo~Poços de Caldas~Pocrane~Pompéu~Ponte Nova~Ponto Chique~Ponto dos Volantes~Porteirinha~Porto Firme~Poté~Pouso Alegre~Pouso Alto~Prados~Prata~Pratápolis~Pratinha~Presidente Bernardes~Presidente Juscelino~Presidente Kubitschek~Presidente Olegário~Prudente de Morais~Quartel Geral~Queluzito~Raposos~Raul Soares~Recreio~Reduto~Resende Costa~Resplendor~Ressaquinha~Riachinho~Riacho dos Machados~Ribeirão das Neves~Ribeirão Vermelho~Rio Acima~Rio Casca~Rio do Prado~Rio Doce~Rio Espera~Rio Manso~Rio Novo~Rio Paranaíba~Rio Pardo de Minas~Rio Piracicaba~Rio Pomba~Rio Preto~Rio Vermelho~Ritápolis~Rochedo de Minas~Rodeiro~Romaria~Rosário da Limeira~Rubelita~Rubim~Sabará~Sabinópolis~Sacramento~Salinas~Salto da Divisa~Santa Barbara~Santa Bárbara do Leste~Santa Bárbara do Monte Verde~Santa Bárbara do Tugúrio~Santa Cruz de Minas~Santa Cruz de Salinas~Santa Cruz do Escalvado~Santa Efigênia de Minas~Santa Fé de Minas~Santa Helena de Minas~Santa Juliana~Santa Luzia~Santa Margarida~Santa Maria de Itabira~Santa Maria do Salto~Santa Maria do Suaçuí~Santa Rita de Caldas~Santa Rita de Ibitipoca~Santa Rita de Jacutinga~Santa Rita de Minas~Santa Rita do Itueto~Santa Rita do Sapucaí~Santa Rosa da Serra~Santa Vitória~Santana da Vargem~Santana de Cataguases~Santana de Pirapama~Santana do Deserto~Santana do Garambéu~Santana do Jacaré~Santana do Manhuaçu~Santana do Paraíso~Santana do Riacho~Santana dos Montes~Santo Antônio do Amparo~Santo Antônio do Aventureiro~Santo Antônio do Grama~Santo Antônio do Itambé~Santo Antônio do Jacinto~Santo Antônio do Monte~Santo Antônio do Retiro~Santo Antônio do Rio Abaixo~Santo Hipólito~Santos Dumont~São Bento Abade~São Brás do Suaçuí~São Domingos das Dores~São Domingos do Prata~São Félix de Minas~São Francisco~São Francisco de Paula~São Francisco de Sales~São Francisco do Glória~São Geraldo~São Geraldo da Piedade~São Geraldo do Baixio~São Gonçalo do Abaeté~São Gonçalo do Pará~São Gonçalo do Rio Abaixo~São Gonçalo do Rio Preto~São Gonçalo do Sapucaí~São Gotardo~São João Batista do Glória~São João da Lagoa~São João da Mata~São João da Ponte~São João das Missões~São João del Rei~São João do Manhuaçu~São João do Manteninha~São João do Oriente~São João do Pacuí~São João do Paraíso~São João Evangelista~São João Nepomuceno~São Joaquim de Bicas~São José da Barra~São José da Lapa~São José da Safira~São José da Varginha~São José do Alegre~São José do Divino~São José do Goiabal~São José do Jacuri~São José do Mantimento~São Lourenço~São Miguel do Anta~São Pedro da União~São Pedro do Suaçuí~São Pedro dos Ferros~São Romão~São Roque de Minas~São Sebastião da Bela Vista~São Sebastião da Vargem Alegre~São Sebastião do Anta~São Sebastião do Maranhão~São Sebastião do Oeste~São Sebastião do Paraíso~São Sebastião do Rio Preto~São Sebastião do Rio Verde~São Thomé das Letras~São Tiago~São Tomás de Aquino~São Vicente de Minas~Sapucaí-Mirim~Sardoá~Sarzedo~Sem-Peixe~Senador Amaral~Senador Cortes~Senador Firmino~Senador José Bento~Senador Modestino Gonçalves~Senhora de Oliveira~Senhora do Porto~Senhora dos Remédios~Sericita~Seritinga~Serra Azul de Minas~Serra da Saudade~Serra do Salitre~Serra dos Aimorés~Serrania~Serranópolis de Minas~Serranos~Serro~Sete Lagoas~Setubinha~Silveirânia~Silvianópolis~Simão Pereira~Simonésia~Sobrália~Soledade de Minas~Tabuleiro~Taiobeiras~Taparuba~Tapira~Tapiraí~Taquaraçu de Minas~Tarumirim~Teixeiras~Teófilo Otoni~Timóteo~Tiradentes~Tiros~Tocantins~Tocos do Moji~Toledo~Tombos~Três Corações~Três Marias~Três Pontas~Tumiritinga~Tupaciguara~Turmalina~Turvolândia~Ubá~Ubaí~Ubaporanga~Uberaba~Uberlândia~Umburatiba~Unaí~União de Minas~Uruana de Minas~Urucânia~Urucuia~Vargem Alegre~Vargem Bonita~Vargem Grande do Rio Pardo~Varginha~Varjão de Minas~Várzea da Palma~Varzelândia~Vazante~Verdelândia~Veredinha~Veríssimo~Vermelho Novo~Vespasiano~Viçosa~Vieiras~Virgem da Lapa~Virginia~Virginópolis~Virgolândia~Visconde do Rio Branco~Volta Grande~Wenceslau Braz"}
+data/BR/MG/Abadia dos Dourados={"id":"data/BR/MG/Abadia dos Dourados","key":"Abadia dos Dourados","lang":"pt"}
+data/BR/MG/Abaeté={"id":"data/BR/MG/Abaeté","key":"Abaeté","lang":"pt"}
+data/BR/MG/Abre Campo={"id":"data/BR/MG/Abre Campo","key":"Abre Campo","lang":"pt"}
+data/BR/MG/Acaiaca={"id":"data/BR/MG/Acaiaca","key":"Acaiaca","lang":"pt"}
+data/BR/MG/Aguanil={"id":"data/BR/MG/Aguanil","key":"Aguanil","lang":"pt"}
+data/BR/MG/Aimorés={"id":"data/BR/MG/Aimorés","key":"Aimorés","lang":"pt"}
+data/BR/MG/Aiuruoca={"id":"data/BR/MG/Aiuruoca","key":"Aiuruoca","lang":"pt"}
+data/BR/MG/Alagoa={"id":"data/BR/MG/Alagoa","key":"Alagoa","lang":"pt"}
+data/BR/MG/Albertina={"id":"data/BR/MG/Albertina","key":"Albertina","lang":"pt"}
+data/BR/MG/Alfenas={"id":"data/BR/MG/Alfenas","key":"Alfenas","lang":"pt"}
+data/BR/MG/Alfredo Vasconcelos={"id":"data/BR/MG/Alfredo Vasconcelos","key":"Alfredo Vasconcelos","lang":"pt"}
+data/BR/MG/Almenara={"id":"data/BR/MG/Almenara","key":"Almenara","lang":"pt"}
+data/BR/MG/Alpercata={"id":"data/BR/MG/Alpercata","key":"Alpercata","lang":"pt"}
+data/BR/MG/Alpinópolis={"id":"data/BR/MG/Alpinópolis","key":"Alpinópolis","lang":"pt"}
+data/BR/MG/Alterosa={"id":"data/BR/MG/Alterosa","key":"Alterosa","lang":"pt"}
+data/BR/MG/Alto Caparaó={"id":"data/BR/MG/Alto Caparaó","key":"Alto Caparaó","lang":"pt"}
+data/BR/MG/Alto Jequitibá={"id":"data/BR/MG/Alto Jequitibá","key":"Alto Jequitibá","lang":"pt"}
+data/BR/MG/Alto Rio Doce={"id":"data/BR/MG/Alto Rio Doce","key":"Alto Rio Doce","lang":"pt"}
+data/BR/MG/Alvarenga={"id":"data/BR/MG/Alvarenga","key":"Alvarenga","lang":"pt"}
+data/BR/MG/Alvinópolis={"id":"data/BR/MG/Alvinópolis","key":"Alvinópolis","lang":"pt"}
+data/BR/MG/Alvorada de Minas={"id":"data/BR/MG/Alvorada de Minas","key":"Alvorada de Minas","lang":"pt"}
+data/BR/MG/Além Paraíba={"id":"data/BR/MG/Além Paraíba","key":"Além Paraíba","lang":"pt"}
+data/BR/MG/Amparo do Serra={"id":"data/BR/MG/Amparo do Serra","key":"Amparo do Serra","lang":"pt"}
+data/BR/MG/Andradas={"id":"data/BR/MG/Andradas","key":"Andradas","lang":"pt"}
+data/BR/MG/Andrelândia={"id":"data/BR/MG/Andrelândia","key":"Andrelândia","lang":"pt"}
+data/BR/MG/Angelândia={"id":"data/BR/MG/Angelândia","key":"Angelândia","lang":"pt"}
+data/BR/MG/Antônio Carlos={"id":"data/BR/MG/Antônio Carlos","key":"Antônio Carlos","lang":"pt"}
+data/BR/MG/Antônio Dias={"id":"data/BR/MG/Antônio Dias","key":"Antônio Dias","lang":"pt"}
+data/BR/MG/Antônio Prado de Minas={"id":"data/BR/MG/Antônio Prado de Minas","key":"Antônio Prado de Minas","lang":"pt"}
+data/BR/MG/Aracitaba={"id":"data/BR/MG/Aracitaba","key":"Aracitaba","lang":"pt"}
+data/BR/MG/Araguari={"id":"data/BR/MG/Araguari","key":"Araguari","lang":"pt"}
+data/BR/MG/Arantina={"id":"data/BR/MG/Arantina","key":"Arantina","lang":"pt"}
+data/BR/MG/Araponga={"id":"data/BR/MG/Araponga","key":"Araponga","lang":"pt"}
+data/BR/MG/Araporã={"id":"data/BR/MG/Araporã","key":"Araporã","lang":"pt"}
+data/BR/MG/Arapuá={"id":"data/BR/MG/Arapuá","key":"Arapuá","lang":"pt"}
+data/BR/MG/Araxá={"id":"data/BR/MG/Araxá","key":"Araxá","lang":"pt"}
+data/BR/MG/Araçaí={"id":"data/BR/MG/Araçaí","key":"Araçaí","lang":"pt"}
+data/BR/MG/Araçuaí={"id":"data/BR/MG/Araçuaí","key":"Araçuaí","lang":"pt"}
+data/BR/MG/Araújos={"id":"data/BR/MG/Araújos","key":"Araújos","lang":"pt"}
+data/BR/MG/Arceburgo={"id":"data/BR/MG/Arceburgo","key":"Arceburgo","lang":"pt"}
+data/BR/MG/Arcos={"id":"data/BR/MG/Arcos","key":"Arcos","lang":"pt"}
+data/BR/MG/Areado={"id":"data/BR/MG/Areado","key":"Areado","lang":"pt"}
+data/BR/MG/Argirita={"id":"data/BR/MG/Argirita","key":"Argirita","lang":"pt"}
+data/BR/MG/Aricanduva={"id":"data/BR/MG/Aricanduva","key":"Aricanduva","lang":"pt"}
+data/BR/MG/Arinos={"id":"data/BR/MG/Arinos","key":"Arinos","lang":"pt"}
+data/BR/MG/Astolfo Dutra={"id":"data/BR/MG/Astolfo Dutra","key":"Astolfo Dutra","lang":"pt"}
+data/BR/MG/Ataléia={"id":"data/BR/MG/Ataléia","key":"Ataléia","lang":"pt"}
+data/BR/MG/Augusto de Lima={"id":"data/BR/MG/Augusto de Lima","key":"Augusto de Lima","lang":"pt"}
+data/BR/MG/Açucena={"id":"data/BR/MG/Açucena","key":"Açucena","lang":"pt"}
+data/BR/MG/Baependi={"id":"data/BR/MG/Baependi","key":"Baependi","lang":"pt"}
+data/BR/MG/Baldim={"id":"data/BR/MG/Baldim","key":"Baldim","lang":"pt"}
+data/BR/MG/Bambuí={"id":"data/BR/MG/Bambuí","key":"Bambuí","lang":"pt"}
+data/BR/MG/Bandeira={"id":"data/BR/MG/Bandeira","key":"Bandeira","lang":"pt"}
+data/BR/MG/Bandeira do Sul={"id":"data/BR/MG/Bandeira do Sul","key":"Bandeira do Sul","lang":"pt"}
+data/BR/MG/Barbacena={"id":"data/BR/MG/Barbacena","key":"Barbacena","lang":"pt"}
+data/BR/MG/Barra Longa={"id":"data/BR/MG/Barra Longa","key":"Barra Longa","lang":"pt"}
+data/BR/MG/Barroso={"id":"data/BR/MG/Barroso","key":"Barroso","lang":"pt"}
+data/BR/MG/Barão de Cocais={"id":"data/BR/MG/Barão de Cocais","key":"Barão de Cocais","lang":"pt"}
+data/BR/MG/Barão de Monte Alto={"id":"data/BR/MG/Barão de Monte Alto","key":"Barão de Monte Alto","lang":"pt"}
+data/BR/MG/Bela Vista de Minas={"id":"data/BR/MG/Bela Vista de Minas","key":"Bela Vista de Minas","lang":"pt"}
+data/BR/MG/Belmiro Braga={"id":"data/BR/MG/Belmiro Braga","key":"Belmiro Braga","lang":"pt"}
+data/BR/MG/Belo Horizonte={"id":"data/BR/MG/Belo Horizonte","key":"Belo Horizonte","lang":"pt"}
+data/BR/MG/Belo Oriente={"id":"data/BR/MG/Belo Oriente","key":"Belo Oriente","lang":"pt"}
+data/BR/MG/Belo Vale={"id":"data/BR/MG/Belo Vale","key":"Belo Vale","lang":"pt"}
+data/BR/MG/Berilo={"id":"data/BR/MG/Berilo","key":"Berilo","lang":"pt"}
+data/BR/MG/Berizal={"id":"data/BR/MG/Berizal","key":"Berizal","lang":"pt"}
+data/BR/MG/Bertópolis={"id":"data/BR/MG/Bertópolis","key":"Bertópolis","lang":"pt"}
+data/BR/MG/Betim={"id":"data/BR/MG/Betim","key":"Betim","lang":"pt"}
+data/BR/MG/Bias Fortes={"id":"data/BR/MG/Bias Fortes","key":"Bias Fortes","lang":"pt"}
+data/BR/MG/Bicas={"id":"data/BR/MG/Bicas","key":"Bicas","lang":"pt"}
+data/BR/MG/Biquinhas={"id":"data/BR/MG/Biquinhas","key":"Biquinhas","lang":"pt"}
+data/BR/MG/Boa Esperança={"id":"data/BR/MG/Boa Esperança","key":"Boa Esperança","lang":"pt"}
+data/BR/MG/Bocaina de Minas={"id":"data/BR/MG/Bocaina de Minas","key":"Bocaina de Minas","lang":"pt"}
+data/BR/MG/Bocaiúva={"id":"data/BR/MG/Bocaiúva","key":"Bocaiúva","lang":"pt"}
+data/BR/MG/Bom Despacho={"id":"data/BR/MG/Bom Despacho","key":"Bom Despacho","lang":"pt"}
+data/BR/MG/Bom Jardim de Minas={"id":"data/BR/MG/Bom Jardim de Minas","key":"Bom Jardim de Minas","lang":"pt"}
+data/BR/MG/Bom Jesus da Penha={"id":"data/BR/MG/Bom Jesus da Penha","key":"Bom Jesus da Penha","lang":"pt"}
+data/BR/MG/Bom Jesus do Amparo={"id":"data/BR/MG/Bom Jesus do Amparo","key":"Bom Jesus do Amparo","lang":"pt"}
+data/BR/MG/Bom Jesus do Galho={"id":"data/BR/MG/Bom Jesus do Galho","key":"Bom Jesus do Galho","lang":"pt"}
+data/BR/MG/Bom Repouso={"id":"data/BR/MG/Bom Repouso","key":"Bom Repouso","lang":"pt"}
+data/BR/MG/Bom Sucesso={"id":"data/BR/MG/Bom Sucesso","key":"Bom Sucesso","lang":"pt"}
+data/BR/MG/Bonfim={"id":"data/BR/MG/Bonfim","key":"Bonfim","lang":"pt"}
+data/BR/MG/Bonfinópolis de Minas={"id":"data/BR/MG/Bonfinópolis de Minas","key":"Bonfinópolis de Minas","lang":"pt"}
+data/BR/MG/Bonito de Minas={"id":"data/BR/MG/Bonito de Minas","key":"Bonito de Minas","lang":"pt"}
+data/BR/MG/Borda da Mata={"id":"data/BR/MG/Borda da Mata","key":"Borda da Mata","lang":"pt"}
+data/BR/MG/Botelhos={"id":"data/BR/MG/Botelhos","key":"Botelhos","lang":"pt"}
+data/BR/MG/Botumirim={"id":"data/BR/MG/Botumirim","key":"Botumirim","lang":"pt"}
+data/BR/MG/Brasilândia de Minas={"id":"data/BR/MG/Brasilândia de Minas","key":"Brasilândia de Minas","lang":"pt"}
+data/BR/MG/Brasopolis={"id":"data/BR/MG/Brasopolis","key":"Brasopolis","lang":"pt"}
+data/BR/MG/Brasília de Minas={"id":"data/BR/MG/Brasília de Minas","key":"Brasília de Minas","lang":"pt"}
+data/BR/MG/Braúnas={"id":"data/BR/MG/Braúnas","key":"Braúnas","lang":"pt"}
+data/BR/MG/Brumadinho={"id":"data/BR/MG/Brumadinho","key":"Brumadinho","lang":"pt"}
+data/BR/MG/Brás Pires={"id":"data/BR/MG/Brás Pires","key":"Brás Pires","lang":"pt"}
+data/BR/MG/Bueno Brandão={"id":"data/BR/MG/Bueno Brandão","key":"Bueno Brandão","lang":"pt"}
+data/BR/MG/Buenópolis={"id":"data/BR/MG/Buenópolis","key":"Buenópolis","lang":"pt"}
+data/BR/MG/Bugre={"id":"data/BR/MG/Bugre","key":"Bugre","lang":"pt"}
+data/BR/MG/Buritis={"id":"data/BR/MG/Buritis","key":"Buritis","lang":"pt"}
+data/BR/MG/Buritizeiro={"id":"data/BR/MG/Buritizeiro","key":"Buritizeiro","lang":"pt"}
+data/BR/MG/Cabeceira Grande={"id":"data/BR/MG/Cabeceira Grande","key":"Cabeceira Grande","lang":"pt"}
+data/BR/MG/Cabo Verde={"id":"data/BR/MG/Cabo Verde","key":"Cabo Verde","lang":"pt"}
+data/BR/MG/Cachoeira Dourada={"id":"data/BR/MG/Cachoeira Dourada","key":"Cachoeira Dourada","lang":"pt"}
+data/BR/MG/Cachoeira da Prata={"id":"data/BR/MG/Cachoeira da Prata","key":"Cachoeira da Prata","lang":"pt"}
+data/BR/MG/Cachoeira de Minas={"id":"data/BR/MG/Cachoeira de Minas","key":"Cachoeira de Minas","lang":"pt"}
+data/BR/MG/Cachoeira de Pajeú={"id":"data/BR/MG/Cachoeira de Pajeú","key":"Cachoeira de Pajeú","lang":"pt"}
+data/BR/MG/Caetanópolis={"id":"data/BR/MG/Caetanópolis","key":"Caetanópolis","lang":"pt"}
+data/BR/MG/Caeté={"id":"data/BR/MG/Caeté","key":"Caeté","lang":"pt"}
+data/BR/MG/Caiana={"id":"data/BR/MG/Caiana","key":"Caiana","lang":"pt"}
+data/BR/MG/Cajuri={"id":"data/BR/MG/Cajuri","key":"Cajuri","lang":"pt"}
+data/BR/MG/Caldas={"id":"data/BR/MG/Caldas","key":"Caldas","lang":"pt"}
+data/BR/MG/Camacho={"id":"data/BR/MG/Camacho","key":"Camacho","lang":"pt"}
+data/BR/MG/Camanducaia={"id":"data/BR/MG/Camanducaia","key":"Camanducaia","lang":"pt"}
+data/BR/MG/Cambuquira={"id":"data/BR/MG/Cambuquira","key":"Cambuquira","lang":"pt"}
+data/BR/MG/Cambuí={"id":"data/BR/MG/Cambuí","key":"Cambuí","lang":"pt"}
+data/BR/MG/Campanhã={"id":"data/BR/MG/Campanhã","key":"Campanhã","lang":"pt"}
+data/BR/MG/Campanário={"id":"data/BR/MG/Campanário","key":"Campanário","lang":"pt"}
+data/BR/MG/Campestre={"id":"data/BR/MG/Campestre","key":"Campestre","lang":"pt"}
+data/BR/MG/Campina Verde={"id":"data/BR/MG/Campina Verde","key":"Campina Verde","lang":"pt"}
+data/BR/MG/Campo Azul={"id":"data/BR/MG/Campo Azul","key":"Campo Azul","lang":"pt"}
+data/BR/MG/Campo Belo={"id":"data/BR/MG/Campo Belo","key":"Campo Belo","lang":"pt"}
+data/BR/MG/Campo Florido={"id":"data/BR/MG/Campo Florido","key":"Campo Florido","lang":"pt"}
+data/BR/MG/Campo do Meio={"id":"data/BR/MG/Campo do Meio","key":"Campo do Meio","lang":"pt"}
+data/BR/MG/Campos Altos={"id":"data/BR/MG/Campos Altos","key":"Campos Altos","lang":"pt"}
+data/BR/MG/Campos Gerais={"id":"data/BR/MG/Campos Gerais","key":"Campos Gerais","lang":"pt"}
+data/BR/MG/Cana Verde={"id":"data/BR/MG/Cana Verde","key":"Cana Verde","lang":"pt"}
+data/BR/MG/Canaã={"id":"data/BR/MG/Canaã","key":"Canaã","lang":"pt"}
+data/BR/MG/Candeias={"id":"data/BR/MG/Candeias","key":"Candeias","lang":"pt"}
+data/BR/MG/Cantagalo={"id":"data/BR/MG/Cantagalo","key":"Cantagalo","lang":"pt"}
+data/BR/MG/Canápolis={"id":"data/BR/MG/Canápolis","key":"Canápolis","lang":"pt"}
+data/BR/MG/Caparaó={"id":"data/BR/MG/Caparaó","key":"Caparaó","lang":"pt"}
+data/BR/MG/Capela Nova={"id":"data/BR/MG/Capela Nova","key":"Capela Nova","lang":"pt"}
+data/BR/MG/Capelinha={"id":"data/BR/MG/Capelinha","key":"Capelinha","lang":"pt"}
+data/BR/MG/Capetinga={"id":"data/BR/MG/Capetinga","key":"Capetinga","lang":"pt"}
+data/BR/MG/Capim Branco={"id":"data/BR/MG/Capim Branco","key":"Capim Branco","lang":"pt"}
+data/BR/MG/Capinópolis={"id":"data/BR/MG/Capinópolis","key":"Capinópolis","lang":"pt"}
+data/BR/MG/Capitão Andrade={"id":"data/BR/MG/Capitão Andrade","key":"Capitão Andrade","lang":"pt"}
+data/BR/MG/Capitão Enéas={"id":"data/BR/MG/Capitão Enéas","key":"Capitão Enéas","lang":"pt"}
+data/BR/MG/Capitólio={"id":"data/BR/MG/Capitólio","key":"Capitólio","lang":"pt"}
+data/BR/MG/Caputira={"id":"data/BR/MG/Caputira","key":"Caputira","lang":"pt"}
+data/BR/MG/Caranaíba={"id":"data/BR/MG/Caranaíba","key":"Caranaíba","lang":"pt"}
+data/BR/MG/Carandaí={"id":"data/BR/MG/Carandaí","key":"Carandaí","lang":"pt"}
+data/BR/MG/Carangola={"id":"data/BR/MG/Carangola","key":"Carangola","lang":"pt"}
+data/BR/MG/Caratinga={"id":"data/BR/MG/Caratinga","key":"Caratinga","lang":"pt"}
+data/BR/MG/Caraí={"id":"data/BR/MG/Caraí","key":"Caraí","lang":"pt"}
+data/BR/MG/Carbonita={"id":"data/BR/MG/Carbonita","key":"Carbonita","lang":"pt"}
+data/BR/MG/Careaçu={"id":"data/BR/MG/Careaçu","key":"Careaçu","lang":"pt"}
+data/BR/MG/Carlos Chagas={"id":"data/BR/MG/Carlos Chagas","key":"Carlos Chagas","lang":"pt"}
+data/BR/MG/Carmo da Cachoeira={"id":"data/BR/MG/Carmo da Cachoeira","key":"Carmo da Cachoeira","lang":"pt"}
+data/BR/MG/Carmo da Mata={"id":"data/BR/MG/Carmo da Mata","key":"Carmo da Mata","lang":"pt"}
+data/BR/MG/Carmo de Minas={"id":"data/BR/MG/Carmo de Minas","key":"Carmo de Minas","lang":"pt"}
+data/BR/MG/Carmo do Cajuru={"id":"data/BR/MG/Carmo do Cajuru","key":"Carmo do Cajuru","lang":"pt"}
+data/BR/MG/Carmo do Paranaíba={"id":"data/BR/MG/Carmo do Paranaíba","key":"Carmo do Paranaíba","lang":"pt"}
+data/BR/MG/Carmo do Rio Claro={"id":"data/BR/MG/Carmo do Rio Claro","key":"Carmo do Rio Claro","lang":"pt"}
+data/BR/MG/Carmésia={"id":"data/BR/MG/Carmésia","key":"Carmésia","lang":"pt"}
+data/BR/MG/Carmópolis de Minas={"id":"data/BR/MG/Carmópolis de Minas","key":"Carmópolis de Minas","lang":"pt"}
+data/BR/MG/Carneirinho={"id":"data/BR/MG/Carneirinho","key":"Carneirinho","lang":"pt"}
+data/BR/MG/Carrancas={"id":"data/BR/MG/Carrancas","key":"Carrancas","lang":"pt"}
+data/BR/MG/Carvalhos={"id":"data/BR/MG/Carvalhos","key":"Carvalhos","lang":"pt"}
+data/BR/MG/Carvalhópolis={"id":"data/BR/MG/Carvalhópolis","key":"Carvalhópolis","lang":"pt"}
+data/BR/MG/Casa Grande={"id":"data/BR/MG/Casa Grande","key":"Casa Grande","lang":"pt"}
+data/BR/MG/Cascalho Rico={"id":"data/BR/MG/Cascalho Rico","key":"Cascalho Rico","lang":"pt"}
+data/BR/MG/Cassia={"id":"data/BR/MG/Cassia","key":"Cassia","lang":"pt"}
+data/BR/MG/Cataguases={"id":"data/BR/MG/Cataguases","key":"Cataguases","lang":"pt"}
+data/BR/MG/Catas Altas={"id":"data/BR/MG/Catas Altas","key":"Catas Altas","lang":"pt"}
+data/BR/MG/Catas Altas da Noruega={"id":"data/BR/MG/Catas Altas da Noruega","key":"Catas Altas da Noruega","lang":"pt"}
+data/BR/MG/Catuji={"id":"data/BR/MG/Catuji","key":"Catuji","lang":"pt"}
+data/BR/MG/Catuti={"id":"data/BR/MG/Catuti","key":"Catuti","lang":"pt"}
+data/BR/MG/Caxambu={"id":"data/BR/MG/Caxambu","key":"Caxambu","lang":"pt"}
+data/BR/MG/Cedro do Abaeté={"id":"data/BR/MG/Cedro do Abaeté","key":"Cedro do Abaeté","lang":"pt"}
+data/BR/MG/Central de Minas={"id":"data/BR/MG/Central de Minas","key":"Central de Minas","lang":"pt"}
+data/BR/MG/Centralina={"id":"data/BR/MG/Centralina","key":"Centralina","lang":"pt"}
+data/BR/MG/Chalé={"id":"data/BR/MG/Chalé","key":"Chalé","lang":"pt"}
+data/BR/MG/Chapada Gaúcha={"id":"data/BR/MG/Chapada Gaúcha","key":"Chapada Gaúcha","lang":"pt"}
+data/BR/MG/Chapada do Norte={"id":"data/BR/MG/Chapada do Norte","key":"Chapada do Norte","lang":"pt"}
+data/BR/MG/Chiador={"id":"data/BR/MG/Chiador","key":"Chiador","lang":"pt"}
+data/BR/MG/Chácara={"id":"data/BR/MG/Chácara","key":"Chácara","lang":"pt"}
+data/BR/MG/Cipotânea={"id":"data/BR/MG/Cipotânea","key":"Cipotânea","lang":"pt"}
+data/BR/MG/Claraval={"id":"data/BR/MG/Claraval","key":"Claraval","lang":"pt"}
+data/BR/MG/Claro dos Poções={"id":"data/BR/MG/Claro dos Poções","key":"Claro dos Poções","lang":"pt"}
+data/BR/MG/Cláudio={"id":"data/BR/MG/Cláudio","key":"Cláudio","lang":"pt"}
+data/BR/MG/Coimbra={"id":"data/BR/MG/Coimbra","key":"Coimbra","lang":"pt"}
+data/BR/MG/Coluna={"id":"data/BR/MG/Coluna","key":"Coluna","lang":"pt"}
+data/BR/MG/Comendador Gomes={"id":"data/BR/MG/Comendador Gomes","key":"Comendador Gomes","lang":"pt"}
+data/BR/MG/Comercinho={"id":"data/BR/MG/Comercinho","key":"Comercinho","lang":"pt"}
+data/BR/MG/Conceição da Aparecida={"id":"data/BR/MG/Conceição da Aparecida","key":"Conceição da Aparecida","lang":"pt"}
+data/BR/MG/Conceição da Barra de Minas={"id":"data/BR/MG/Conceição da Barra de Minas","key":"Conceição da Barra de Minas","lang":"pt"}
+data/BR/MG/Conceição das Alagoas={"id":"data/BR/MG/Conceição das Alagoas","key":"Conceição das Alagoas","lang":"pt"}
+data/BR/MG/Conceição das Pedras={"id":"data/BR/MG/Conceição das Pedras","key":"Conceição das Pedras","lang":"pt"}
+data/BR/MG/Conceição de Ipanema={"id":"data/BR/MG/Conceição de Ipanema","key":"Conceição de Ipanema","lang":"pt"}
+data/BR/MG/Conceição do Mato Dentro={"id":"data/BR/MG/Conceição do Mato Dentro","key":"Conceição do Mato Dentro","lang":"pt"}
+data/BR/MG/Conceição do Pará={"id":"data/BR/MG/Conceição do Pará","key":"Conceição do Pará","lang":"pt"}
+data/BR/MG/Conceição do Rio Verde={"id":"data/BR/MG/Conceição do Rio Verde","key":"Conceição do Rio Verde","lang":"pt"}
+data/BR/MG/Conceição dos Ouros={"id":"data/BR/MG/Conceição dos Ouros","key":"Conceição dos Ouros","lang":"pt"}
+data/BR/MG/Confins={"id":"data/BR/MG/Confins","key":"Confins","lang":"pt"}
+data/BR/MG/Congonhal={"id":"data/BR/MG/Congonhal","key":"Congonhal","lang":"pt"}
+data/BR/MG/Congonhas={"id":"data/BR/MG/Congonhas","key":"Congonhas","lang":"pt"}
+data/BR/MG/Congonhas do Norte={"id":"data/BR/MG/Congonhas do Norte","key":"Congonhas do Norte","lang":"pt"}
+data/BR/MG/Conquista={"id":"data/BR/MG/Conquista","key":"Conquista","lang":"pt"}
+data/BR/MG/Conselheiro Lafaiete={"id":"data/BR/MG/Conselheiro Lafaiete","key":"Conselheiro Lafaiete","lang":"pt"}
+data/BR/MG/Conselheiro Pena={"id":"data/BR/MG/Conselheiro Pena","key":"Conselheiro Pena","lang":"pt"}
+data/BR/MG/Consolação={"id":"data/BR/MG/Consolação","key":"Consolação","lang":"pt"}
+data/BR/MG/Contagem={"id":"data/BR/MG/Contagem","key":"Contagem","lang":"pt"}
+data/BR/MG/Coqueiral={"id":"data/BR/MG/Coqueiral","key":"Coqueiral","lang":"pt"}
+data/BR/MG/Coração de Jesus={"id":"data/BR/MG/Coração de Jesus","key":"Coração de Jesus","lang":"pt"}
+data/BR/MG/Cordisburgo={"id":"data/BR/MG/Cordisburgo","key":"Cordisburgo","lang":"pt"}
+data/BR/MG/Cordislândia={"id":"data/BR/MG/Cordislândia","key":"Cordislândia","lang":"pt"}
+data/BR/MG/Corinto={"id":"data/BR/MG/Corinto","key":"Corinto","lang":"pt"}
+data/BR/MG/Coroaci={"id":"data/BR/MG/Coroaci","key":"Coroaci","lang":"pt"}
+data/BR/MG/Coromandel={"id":"data/BR/MG/Coromandel","key":"Coromandel","lang":"pt"}
+data/BR/MG/Coronel Fabriciano={"id":"data/BR/MG/Coronel Fabriciano","key":"Coronel Fabriciano","lang":"pt"}
+data/BR/MG/Coronel Murta={"id":"data/BR/MG/Coronel Murta","key":"Coronel Murta","lang":"pt"}
+data/BR/MG/Coronel Pacheco={"id":"data/BR/MG/Coronel Pacheco","key":"Coronel Pacheco","lang":"pt"}
+data/BR/MG/Coronel Xavier Chaves={"id":"data/BR/MG/Coronel Xavier Chaves","key":"Coronel Xavier Chaves","lang":"pt"}
+data/BR/MG/Couto de Magalhães de Minas={"id":"data/BR/MG/Couto de Magalhães de Minas","key":"Couto de Magalhães de Minas","lang":"pt"}
+data/BR/MG/Cristais={"id":"data/BR/MG/Cristais","key":"Cristais","lang":"pt"}
+data/BR/MG/Cristiano Otoni={"id":"data/BR/MG/Cristiano Otoni","key":"Cristiano Otoni","lang":"pt"}
+data/BR/MG/Cristina={"id":"data/BR/MG/Cristina","key":"Cristina","lang":"pt"}
+data/BR/MG/Cristália={"id":"data/BR/MG/Cristália","key":"Cristália","lang":"pt"}
+data/BR/MG/Crisólita={"id":"data/BR/MG/Crisólita","key":"Crisólita","lang":"pt"}
+data/BR/MG/Crucilândia={"id":"data/BR/MG/Crucilândia","key":"Crucilândia","lang":"pt"}
+data/BR/MG/Cruzeiro da Fortaleza={"id":"data/BR/MG/Cruzeiro da Fortaleza","key":"Cruzeiro da Fortaleza","lang":"pt"}
+data/BR/MG/Cruzília={"id":"data/BR/MG/Cruzília","key":"Cruzília","lang":"pt"}
+data/BR/MG/Cuparaque={"id":"data/BR/MG/Cuparaque","key":"Cuparaque","lang":"pt"}
+data/BR/MG/Curral de Dentro={"id":"data/BR/MG/Curral de Dentro","key":"Curral de Dentro","lang":"pt"}
+data/BR/MG/Curvelo={"id":"data/BR/MG/Curvelo","key":"Curvelo","lang":"pt"}
+data/BR/MG/Córrego Danta={"id":"data/BR/MG/Córrego Danta","key":"Córrego Danta","lang":"pt"}
+data/BR/MG/Córrego Fundo={"id":"data/BR/MG/Córrego Fundo","key":"Córrego Fundo","lang":"pt"}
+data/BR/MG/Córrego Novo={"id":"data/BR/MG/Córrego Novo","key":"Córrego Novo","lang":"pt"}
+data/BR/MG/Córrego do Bom Jesus={"id":"data/BR/MG/Córrego do Bom Jesus","key":"Córrego do Bom Jesus","lang":"pt"}
+data/BR/MG/Cônego Marinho={"id":"data/BR/MG/Cônego Marinho","key":"Cônego Marinho","lang":"pt"}
+data/BR/MG/Datas={"id":"data/BR/MG/Datas","key":"Datas","lang":"pt"}
+data/BR/MG/Delfim Moreira={"id":"data/BR/MG/Delfim Moreira","key":"Delfim Moreira","lang":"pt"}
+data/BR/MG/Delfinópolis={"id":"data/BR/MG/Delfinópolis","key":"Delfinópolis","lang":"pt"}
+data/BR/MG/Delta={"id":"data/BR/MG/Delta","key":"Delta","lang":"pt"}
+data/BR/MG/Descoberto={"id":"data/BR/MG/Descoberto","key":"Descoberto","lang":"pt"}
+data/BR/MG/Desterro de Entre Rios={"id":"data/BR/MG/Desterro de Entre Rios","key":"Desterro de Entre Rios","lang":"pt"}
+data/BR/MG/Desterro do Melo={"id":"data/BR/MG/Desterro do Melo","key":"Desterro do Melo","lang":"pt"}
+data/BR/MG/Diamantina={"id":"data/BR/MG/Diamantina","key":"Diamantina","lang":"pt"}
+data/BR/MG/Diogo de Vasconcelos={"id":"data/BR/MG/Diogo de Vasconcelos","key":"Diogo de Vasconcelos","lang":"pt"}
+data/BR/MG/Dionísio={"id":"data/BR/MG/Dionísio","key":"Dionísio","lang":"pt"}
+data/BR/MG/Divino={"id":"data/BR/MG/Divino","key":"Divino","lang":"pt"}
+data/BR/MG/Divino das Laranjeiras={"id":"data/BR/MG/Divino das Laranjeiras","key":"Divino das Laranjeiras","lang":"pt"}
+data/BR/MG/Divinolândia de Minas={"id":"data/BR/MG/Divinolândia de Minas","key":"Divinolândia de Minas","lang":"pt"}
+data/BR/MG/Divinésia={"id":"data/BR/MG/Divinésia","key":"Divinésia","lang":"pt"}
+data/BR/MG/Divinópolis={"id":"data/BR/MG/Divinópolis","key":"Divinópolis","lang":"pt"}
+data/BR/MG/Divisa Alegre={"id":"data/BR/MG/Divisa Alegre","key":"Divisa Alegre","lang":"pt"}
+data/BR/MG/Divisa Nova={"id":"data/BR/MG/Divisa Nova","key":"Divisa Nova","lang":"pt"}
+data/BR/MG/Divisópolis={"id":"data/BR/MG/Divisópolis","key":"Divisópolis","lang":"pt"}
+data/BR/MG/Dom Bosco={"id":"data/BR/MG/Dom Bosco","key":"Dom Bosco","lang":"pt"}
+data/BR/MG/Dom Cavati={"id":"data/BR/MG/Dom Cavati","key":"Dom Cavati","lang":"pt"}
+data/BR/MG/Dom Joaquim={"id":"data/BR/MG/Dom Joaquim","key":"Dom Joaquim","lang":"pt"}
+data/BR/MG/Dom Silvério={"id":"data/BR/MG/Dom Silvério","key":"Dom Silvério","lang":"pt"}
+data/BR/MG/Dom Viçoso={"id":"data/BR/MG/Dom Viçoso","key":"Dom Viçoso","lang":"pt"}
+data/BR/MG/Dona Eusébia={"id":"data/BR/MG/Dona Eusébia","key":"Dona Eusébia","lang":"pt"}
+data/BR/MG/Dores de Campos={"id":"data/BR/MG/Dores de Campos","key":"Dores de Campos","lang":"pt"}
+data/BR/MG/Dores de Guanhães={"id":"data/BR/MG/Dores de Guanhães","key":"Dores de Guanhães","lang":"pt"}
+data/BR/MG/Dores do Indaiá={"id":"data/BR/MG/Dores do Indaiá","key":"Dores do Indaiá","lang":"pt"}
+data/BR/MG/Dores do Turvo={"id":"data/BR/MG/Dores do Turvo","key":"Dores do Turvo","lang":"pt"}
+data/BR/MG/Doresópolis={"id":"data/BR/MG/Doresópolis","key":"Doresópolis","lang":"pt"}
+data/BR/MG/Douradoquara={"id":"data/BR/MG/Douradoquara","key":"Douradoquara","lang":"pt"}
+data/BR/MG/Durandé={"id":"data/BR/MG/Durandé","key":"Durandé","lang":"pt"}
+data/BR/MG/Elói Mendes={"id":"data/BR/MG/Elói Mendes","key":"Elói Mendes","lang":"pt"}
+data/BR/MG/Engenheiro Caldas={"id":"data/BR/MG/Engenheiro Caldas","key":"Engenheiro Caldas","lang":"pt"}
+data/BR/MG/Engenheiro Navarro={"id":"data/BR/MG/Engenheiro Navarro","key":"Engenheiro Navarro","lang":"pt"}
+data/BR/MG/Entre Folhas={"id":"data/BR/MG/Entre Folhas","key":"Entre Folhas","lang":"pt"}
+data/BR/MG/Entre Rios de Minas={"id":"data/BR/MG/Entre Rios de Minas","key":"Entre Rios de Minas","lang":"pt"}
+data/BR/MG/Ervália={"id":"data/BR/MG/Ervália","key":"Ervália","lang":"pt"}
+data/BR/MG/Esmeraldas={"id":"data/BR/MG/Esmeraldas","key":"Esmeraldas","lang":"pt"}
+data/BR/MG/Espera feliz={"id":"data/BR/MG/Espera feliz","key":"Espera feliz","lang":"pt"}
+data/BR/MG/Espinosa={"id":"data/BR/MG/Espinosa","key":"Espinosa","lang":"pt"}
+data/BR/MG/Espírito Santo do Dourado={"id":"data/BR/MG/Espírito Santo do Dourado","key":"Espírito Santo do Dourado","lang":"pt"}
+data/BR/MG/Estiva={"id":"data/BR/MG/Estiva","key":"Estiva","lang":"pt"}
+data/BR/MG/Estrela Dalva={"id":"data/BR/MG/Estrela Dalva","key":"Estrela Dalva","lang":"pt"}
+data/BR/MG/Estrela do Indaiá={"id":"data/BR/MG/Estrela do Indaiá","key":"Estrela do Indaiá","lang":"pt"}
+data/BR/MG/Estrela do Sul={"id":"data/BR/MG/Estrela do Sul","key":"Estrela do Sul","lang":"pt"}
+data/BR/MG/Eugenópolis={"id":"data/BR/MG/Eugenópolis","key":"Eugenópolis","lang":"pt"}
+data/BR/MG/Ewbank da Câmara={"id":"data/BR/MG/Ewbank da Câmara","key":"Ewbank da Câmara","lang":"pt"}
+data/BR/MG/Extrema={"id":"data/BR/MG/Extrema","key":"Extrema","lang":"pt"}
+data/BR/MG/Fama={"id":"data/BR/MG/Fama","key":"Fama","lang":"pt"}
+data/BR/MG/Faria Lemos={"id":"data/BR/MG/Faria Lemos","key":"Faria Lemos","lang":"pt"}
+data/BR/MG/Felisburgo={"id":"data/BR/MG/Felisburgo","key":"Felisburgo","lang":"pt"}
+data/BR/MG/Felixlândia={"id":"data/BR/MG/Felixlândia","key":"Felixlândia","lang":"pt"}
+data/BR/MG/Felício dos Santos={"id":"data/BR/MG/Felício dos Santos","key":"Felício dos Santos","lang":"pt"}
+data/BR/MG/Fernandes Tourinho={"id":"data/BR/MG/Fernandes Tourinho","key":"Fernandes Tourinho","lang":"pt"}
+data/BR/MG/Ferros={"id":"data/BR/MG/Ferros","key":"Ferros","lang":"pt"}
+data/BR/MG/Fervedouro={"id":"data/BR/MG/Fervedouro","key":"Fervedouro","lang":"pt"}
+data/BR/MG/Florestal={"id":"data/BR/MG/Florestal","key":"Florestal","lang":"pt"}
+data/BR/MG/Formiga={"id":"data/BR/MG/Formiga","key":"Formiga","lang":"pt"}
+data/BR/MG/Formoso={"id":"data/BR/MG/Formoso","key":"Formoso","lang":"pt"}
+data/BR/MG/Fortaleza de Minas={"id":"data/BR/MG/Fortaleza de Minas","key":"Fortaleza de Minas","lang":"pt"}
+data/BR/MG/Fortuna de Minas={"id":"data/BR/MG/Fortuna de Minas","key":"Fortuna de Minas","lang":"pt"}
+data/BR/MG/Francisco Badaró={"id":"data/BR/MG/Francisco Badaró","key":"Francisco Badaró","lang":"pt"}
+data/BR/MG/Francisco Dumont={"id":"data/BR/MG/Francisco Dumont","key":"Francisco Dumont","lang":"pt"}
+data/BR/MG/Francisco Sá={"id":"data/BR/MG/Francisco Sá","key":"Francisco Sá","lang":"pt"}
+data/BR/MG/Franciscópolis={"id":"data/BR/MG/Franciscópolis","key":"Franciscópolis","lang":"pt"}
+data/BR/MG/Frei Gaspar={"id":"data/BR/MG/Frei Gaspar","key":"Frei Gaspar","lang":"pt"}
+data/BR/MG/Frei Inocêncio={"id":"data/BR/MG/Frei Inocêncio","key":"Frei Inocêncio","lang":"pt"}
+data/BR/MG/Frei Lagonegro={"id":"data/BR/MG/Frei Lagonegro","key":"Frei Lagonegro","lang":"pt"}
+data/BR/MG/Fronteira={"id":"data/BR/MG/Fronteira","key":"Fronteira","lang":"pt"}
+data/BR/MG/Fronteira dos Vales={"id":"data/BR/MG/Fronteira dos Vales","key":"Fronteira dos Vales","lang":"pt"}
+data/BR/MG/Fruta de Leite={"id":"data/BR/MG/Fruta de Leite","key":"Fruta de Leite","lang":"pt"}
+data/BR/MG/Frutal={"id":"data/BR/MG/Frutal","key":"Frutal","lang":"pt"}
+data/BR/MG/Funilândia={"id":"data/BR/MG/Funilândia","key":"Funilândia","lang":"pt"}
+data/BR/MG/Galiléia={"id":"data/BR/MG/Galiléia","key":"Galiléia","lang":"pt"}
+data/BR/MG/Gameleiras={"id":"data/BR/MG/Gameleiras","key":"Gameleiras","lang":"pt"}
+data/BR/MG/Glaucilândia={"id":"data/BR/MG/Glaucilândia","key":"Glaucilândia","lang":"pt"}
+data/BR/MG/Goiabeira={"id":"data/BR/MG/Goiabeira","key":"Goiabeira","lang":"pt"}
+data/BR/MG/Goiana={"id":"data/BR/MG/Goiana","key":"Goiana","lang":"pt"}
+data/BR/MG/Gonzaga={"id":"data/BR/MG/Gonzaga","key":"Gonzaga","lang":"pt"}
+data/BR/MG/Gonçalves={"id":"data/BR/MG/Gonçalves","key":"Gonçalves","lang":"pt"}
+data/BR/MG/Gouveia={"id":"data/BR/MG/Gouveia","key":"Gouveia","lang":"pt"}
+data/BR/MG/Governador Valadares={"id":"data/BR/MG/Governador Valadares","key":"Governador Valadares","lang":"pt"}
+data/BR/MG/Grupiara={"id":"data/BR/MG/Grupiara","key":"Grupiara","lang":"pt"}
+data/BR/MG/Grão Mogol={"id":"data/BR/MG/Grão Mogol","key":"Grão Mogol","lang":"pt"}
+data/BR/MG/Guanhães={"id":"data/BR/MG/Guanhães","key":"Guanhães","lang":"pt"}
+data/BR/MG/Guapé={"id":"data/BR/MG/Guapé","key":"Guapé","lang":"pt"}
+data/BR/MG/Guaraciaba={"id":"data/BR/MG/Guaraciaba","key":"Guaraciaba","lang":"pt"}
+data/BR/MG/Guaraciama={"id":"data/BR/MG/Guaraciama","key":"Guaraciama","lang":"pt"}
+data/BR/MG/Guarani={"id":"data/BR/MG/Guarani","key":"Guarani","lang":"pt"}
+data/BR/MG/Guaranésia={"id":"data/BR/MG/Guaranésia","key":"Guaranésia","lang":"pt"}
+data/BR/MG/Guarará={"id":"data/BR/MG/Guarará","key":"Guarará","lang":"pt"}
+data/BR/MG/Guarda-Mor={"id":"data/BR/MG/Guarda-Mor","key":"Guarda-Mor","lang":"pt"}
+data/BR/MG/Guaxupé={"id":"data/BR/MG/Guaxupé","key":"Guaxupé","lang":"pt"}
+data/BR/MG/Guidoval={"id":"data/BR/MG/Guidoval","key":"Guidoval","lang":"pt"}
+data/BR/MG/Guimarânia={"id":"data/BR/MG/Guimarânia","key":"Guimarânia","lang":"pt"}
+data/BR/MG/Guiricema={"id":"data/BR/MG/Guiricema","key":"Guiricema","lang":"pt"}
+data/BR/MG/Gurinhatã={"id":"data/BR/MG/Gurinhatã","key":"Gurinhatã","lang":"pt"}
+data/BR/MG/Heliodora={"id":"data/BR/MG/Heliodora","key":"Heliodora","lang":"pt"}
+data/BR/MG/Iapu={"id":"data/BR/MG/Iapu","key":"Iapu","lang":"pt"}
+data/BR/MG/Ibertioga={"id":"data/BR/MG/Ibertioga","key":"Ibertioga","lang":"pt"}
+data/BR/MG/Ibiaí={"id":"data/BR/MG/Ibiaí","key":"Ibiaí","lang":"pt"}
+data/BR/MG/Ibiracatu={"id":"data/BR/MG/Ibiracatu","key":"Ibiracatu","lang":"pt"}
+data/BR/MG/Ibiraci={"id":"data/BR/MG/Ibiraci","key":"Ibiraci","lang":"pt"}
+data/BR/MG/Ibirité={"id":"data/BR/MG/Ibirité","key":"Ibirité","lang":"pt"}
+data/BR/MG/Ibitiúra de Minas={"id":"data/BR/MG/Ibitiúra de Minas","key":"Ibitiúra de Minas","lang":"pt"}
+data/BR/MG/Ibituruna={"id":"data/BR/MG/Ibituruna","key":"Ibituruna","lang":"pt"}
+data/BR/MG/Ibiá={"id":"data/BR/MG/Ibiá","key":"Ibiá","lang":"pt"}
+data/BR/MG/Icaraí de Minas={"id":"data/BR/MG/Icaraí de Minas","key":"Icaraí de Minas","lang":"pt"}
+data/BR/MG/Igarapé={"id":"data/BR/MG/Igarapé","key":"Igarapé","lang":"pt"}
+data/BR/MG/Igaratinga={"id":"data/BR/MG/Igaratinga","key":"Igaratinga","lang":"pt"}
+data/BR/MG/Iguatama={"id":"data/BR/MG/Iguatama","key":"Iguatama","lang":"pt"}
+data/BR/MG/Ijaci={"id":"data/BR/MG/Ijaci","key":"Ijaci","lang":"pt"}
+data/BR/MG/Ilicínea={"id":"data/BR/MG/Ilicínea","key":"Ilicínea","lang":"pt"}
+data/BR/MG/Imbé de Minas={"id":"data/BR/MG/Imbé de Minas","key":"Imbé de Minas","lang":"pt"}
+data/BR/MG/Inconfidentes={"id":"data/BR/MG/Inconfidentes","key":"Inconfidentes","lang":"pt"}
+data/BR/MG/Indaiabira={"id":"data/BR/MG/Indaiabira","key":"Indaiabira","lang":"pt"}
+data/BR/MG/Indianópolis={"id":"data/BR/MG/Indianópolis","key":"Indianópolis","lang":"pt"}
+data/BR/MG/Ingaí={"id":"data/BR/MG/Ingaí","key":"Ingaí","lang":"pt"}
+data/BR/MG/Inhapim={"id":"data/BR/MG/Inhapim","key":"Inhapim","lang":"pt"}
+data/BR/MG/Inhaúma={"id":"data/BR/MG/Inhaúma","key":"Inhaúma","lang":"pt"}
+data/BR/MG/Inimutaba={"id":"data/BR/MG/Inimutaba","key":"Inimutaba","lang":"pt"}
+data/BR/MG/Ipaba={"id":"data/BR/MG/Ipaba","key":"Ipaba","lang":"pt"}
+data/BR/MG/Ipanema={"id":"data/BR/MG/Ipanema","key":"Ipanema","lang":"pt"}
+data/BR/MG/Ipatinga={"id":"data/BR/MG/Ipatinga","key":"Ipatinga","lang":"pt"}
+data/BR/MG/Ipiaçu={"id":"data/BR/MG/Ipiaçu","key":"Ipiaçu","lang":"pt"}
+data/BR/MG/Ipuiúna={"id":"data/BR/MG/Ipuiúna","key":"Ipuiúna","lang":"pt"}
+data/BR/MG/Iraí de Minas={"id":"data/BR/MG/Iraí de Minas","key":"Iraí de Minas","lang":"pt"}
+data/BR/MG/Itabira={"id":"data/BR/MG/Itabira","key":"Itabira","lang":"pt"}
+data/BR/MG/Itabirinha={"id":"data/BR/MG/Itabirinha","key":"Itabirinha","lang":"pt"}
+data/BR/MG/Itabirito={"id":"data/BR/MG/Itabirito","key":"Itabirito","lang":"pt"}
+data/BR/MG/Itacambira={"id":"data/BR/MG/Itacambira","key":"Itacambira","lang":"pt"}
+data/BR/MG/Itacarambi={"id":"data/BR/MG/Itacarambi","key":"Itacarambi","lang":"pt"}
+data/BR/MG/Itaguara={"id":"data/BR/MG/Itaguara","key":"Itaguara","lang":"pt"}
+data/BR/MG/Itaipé={"id":"data/BR/MG/Itaipé","key":"Itaipé","lang":"pt"}
+data/BR/MG/Itajubá={"id":"data/BR/MG/Itajubá","key":"Itajubá","lang":"pt"}
+data/BR/MG/Itamarandiba={"id":"data/BR/MG/Itamarandiba","key":"Itamarandiba","lang":"pt"}
+data/BR/MG/Itamarati de Minas={"id":"data/BR/MG/Itamarati de Minas","key":"Itamarati de Minas","lang":"pt"}
+data/BR/MG/Itambacuri={"id":"data/BR/MG/Itambacuri","key":"Itambacuri","lang":"pt"}
+data/BR/MG/Itambé do Mato Dentro={"id":"data/BR/MG/Itambé do Mato Dentro","key":"Itambé do Mato Dentro","lang":"pt"}
+data/BR/MG/Itamogi={"id":"data/BR/MG/Itamogi","key":"Itamogi","lang":"pt"}
+data/BR/MG/Itamonte={"id":"data/BR/MG/Itamonte","key":"Itamonte","lang":"pt"}
+data/BR/MG/Itanhandu={"id":"data/BR/MG/Itanhandu","key":"Itanhandu","lang":"pt"}
+data/BR/MG/Itanhomi={"id":"data/BR/MG/Itanhomi","key":"Itanhomi","lang":"pt"}
+data/BR/MG/Itaobim={"id":"data/BR/MG/Itaobim","key":"Itaobim","lang":"pt"}
+data/BR/MG/Itapagipe={"id":"data/BR/MG/Itapagipe","key":"Itapagipe","lang":"pt"}
+data/BR/MG/Itapecerica={"id":"data/BR/MG/Itapecerica","key":"Itapecerica","lang":"pt"}
+data/BR/MG/Itapeva={"id":"data/BR/MG/Itapeva","key":"Itapeva","lang":"pt"}
+data/BR/MG/Itatiaiuçu={"id":"data/BR/MG/Itatiaiuçu","key":"Itatiaiuçu","lang":"pt"}
+data/BR/MG/Itaverava={"id":"data/BR/MG/Itaverava","key":"Itaverava","lang":"pt"}
+data/BR/MG/Itaú de Minas={"id":"data/BR/MG/Itaú de Minas","key":"Itaú de Minas","lang":"pt"}
+data/BR/MG/Itaúna={"id":"data/BR/MG/Itaúna","key":"Itaúna","lang":"pt"}
+data/BR/MG/Itinga={"id":"data/BR/MG/Itinga","key":"Itinga","lang":"pt"}
+data/BR/MG/Itueta={"id":"data/BR/MG/Itueta","key":"Itueta","lang":"pt"}
+data/BR/MG/Ituiutaba={"id":"data/BR/MG/Ituiutaba","key":"Ituiutaba","lang":"pt"}
+data/BR/MG/Itumirim={"id":"data/BR/MG/Itumirim","key":"Itumirim","lang":"pt"}
+data/BR/MG/Iturama={"id":"data/BR/MG/Iturama","key":"Iturama","lang":"pt"}
+data/BR/MG/Itutinga={"id":"data/BR/MG/Itutinga","key":"Itutinga","lang":"pt"}
+data/BR/MG/Jaboticatubas={"id":"data/BR/MG/Jaboticatubas","key":"Jaboticatubas","lang":"pt"}
+data/BR/MG/Jacinto={"id":"data/BR/MG/Jacinto","key":"Jacinto","lang":"pt"}
+data/BR/MG/Jacutinga={"id":"data/BR/MG/Jacutinga","key":"Jacutinga","lang":"pt"}
+data/BR/MG/Jacuí={"id":"data/BR/MG/Jacuí","key":"Jacuí","lang":"pt"}
+data/BR/MG/Jaguaraçu={"id":"data/BR/MG/Jaguaraçu","key":"Jaguaraçu","lang":"pt"}
+data/BR/MG/Jampruca={"id":"data/BR/MG/Jampruca","key":"Jampruca","lang":"pt"}
+data/BR/MG/Janaúba={"id":"data/BR/MG/Janaúba","key":"Janaúba","lang":"pt"}
+data/BR/MG/Januária={"id":"data/BR/MG/Januária","key":"Januária","lang":"pt"}
+data/BR/MG/Japaraíba={"id":"data/BR/MG/Japaraíba","key":"Japaraíba","lang":"pt"}
+data/BR/MG/Japonvar={"id":"data/BR/MG/Japonvar","key":"Japonvar","lang":"pt"}
+data/BR/MG/Jaíba={"id":"data/BR/MG/Jaíba","key":"Jaíba","lang":"pt"}
+data/BR/MG/Jeceaba={"id":"data/BR/MG/Jeceaba","key":"Jeceaba","lang":"pt"}
+data/BR/MG/Jenipapo de Minas={"id":"data/BR/MG/Jenipapo de Minas","key":"Jenipapo de Minas","lang":"pt"}
+data/BR/MG/Jequeri={"id":"data/BR/MG/Jequeri","key":"Jequeri","lang":"pt"}
+data/BR/MG/Jequitaí={"id":"data/BR/MG/Jequitaí","key":"Jequitaí","lang":"pt"}
+data/BR/MG/Jequitibá={"id":"data/BR/MG/Jequitibá","key":"Jequitibá","lang":"pt"}
+data/BR/MG/Jequitinhonha={"id":"data/BR/MG/Jequitinhonha","key":"Jequitinhonha","lang":"pt"}
+data/BR/MG/Jesuânia={"id":"data/BR/MG/Jesuânia","key":"Jesuânia","lang":"pt"}
+data/BR/MG/Joanésia={"id":"data/BR/MG/Joanésia","key":"Joanésia","lang":"pt"}
+data/BR/MG/Joaquim Felício={"id":"data/BR/MG/Joaquim Felício","key":"Joaquim Felício","lang":"pt"}
+data/BR/MG/Joaíma={"id":"data/BR/MG/Joaíma","key":"Joaíma","lang":"pt"}
+data/BR/MG/Jordânia={"id":"data/BR/MG/Jordânia","key":"Jordânia","lang":"pt"}
+data/BR/MG/Josenópolis={"id":"data/BR/MG/Josenópolis","key":"Josenópolis","lang":"pt"}
+data/BR/MG/José Gonçalves de Minas={"id":"data/BR/MG/José Gonçalves de Minas","key":"José Gonçalves de Minas","lang":"pt"}
+data/BR/MG/José Raydan={"id":"data/BR/MG/José Raydan","key":"José Raydan","lang":"pt"}
+data/BR/MG/João Monlevade={"id":"data/BR/MG/João Monlevade","key":"João Monlevade","lang":"pt"}
+data/BR/MG/João Pinheiro={"id":"data/BR/MG/João Pinheiro","key":"João Pinheiro","lang":"pt"}
+data/BR/MG/Juatuba={"id":"data/BR/MG/Juatuba","key":"Juatuba","lang":"pt"}
+data/BR/MG/Juiz de Fora={"id":"data/BR/MG/Juiz de Fora","key":"Juiz de Fora","lang":"pt"}
+data/BR/MG/Juramento={"id":"data/BR/MG/Juramento","key":"Juramento","lang":"pt"}
+data/BR/MG/Juruaia={"id":"data/BR/MG/Juruaia","key":"Juruaia","lang":"pt"}
+data/BR/MG/Juvenilia={"id":"data/BR/MG/Juvenilia","key":"Juvenilia","lang":"pt"}
+data/BR/MG/Ladainha={"id":"data/BR/MG/Ladainha","key":"Ladainha","lang":"pt"}
+data/BR/MG/Lagamar={"id":"data/BR/MG/Lagamar","key":"Lagamar","lang":"pt"}
+data/BR/MG/Lagoa Dourada={"id":"data/BR/MG/Lagoa Dourada","key":"Lagoa Dourada","lang":"pt"}
+data/BR/MG/Lagoa Formosa={"id":"data/BR/MG/Lagoa Formosa","key":"Lagoa Formosa","lang":"pt"}
+data/BR/MG/Lagoa Grande={"id":"data/BR/MG/Lagoa Grande","key":"Lagoa Grande","lang":"pt"}
+data/BR/MG/Lagoa Santa={"id":"data/BR/MG/Lagoa Santa","key":"Lagoa Santa","lang":"pt"}
+data/BR/MG/Lagoa da Prata={"id":"data/BR/MG/Lagoa da Prata","key":"Lagoa da Prata","lang":"pt"}
+data/BR/MG/Lagoa dos Patos={"id":"data/BR/MG/Lagoa dos Patos","key":"Lagoa dos Patos","lang":"pt"}
+data/BR/MG/Lajinha={"id":"data/BR/MG/Lajinha","key":"Lajinha","lang":"pt"}
+data/BR/MG/Lambari={"id":"data/BR/MG/Lambari","key":"Lambari","lang":"pt"}
+data/BR/MG/Lamim={"id":"data/BR/MG/Lamim","key":"Lamim","lang":"pt"}
+data/BR/MG/Laranjal={"id":"data/BR/MG/Laranjal","key":"Laranjal","lang":"pt"}
+data/BR/MG/Lassance={"id":"data/BR/MG/Lassance","key":"Lassance","lang":"pt"}
+data/BR/MG/Lavras={"id":"data/BR/MG/Lavras","key":"Lavras","lang":"pt"}
+data/BR/MG/Leandro Ferreira={"id":"data/BR/MG/Leandro Ferreira","key":"Leandro Ferreira","lang":"pt"}
+data/BR/MG/Leme do Prado={"id":"data/BR/MG/Leme do Prado","key":"Leme do Prado","lang":"pt"}
+data/BR/MG/Leopoldina={"id":"data/BR/MG/Leopoldina","key":"Leopoldina","lang":"pt"}
+data/BR/MG/Liberdade={"id":"data/BR/MG/Liberdade","key":"Liberdade","lang":"pt"}
+data/BR/MG/Lima Duarte={"id":"data/BR/MG/Lima Duarte","key":"Lima Duarte","lang":"pt"}
+data/BR/MG/Limeira do Oeste={"id":"data/BR/MG/Limeira do Oeste","key":"Limeira do Oeste","lang":"pt"}
+data/BR/MG/Lontra={"id":"data/BR/MG/Lontra","key":"Lontra","lang":"pt"}
+data/BR/MG/Luisburgo={"id":"data/BR/MG/Luisburgo","key":"Luisburgo","lang":"pt"}
+data/BR/MG/Luislândia={"id":"data/BR/MG/Luislândia","key":"Luislândia","lang":"pt"}
+data/BR/MG/Luminárias={"id":"data/BR/MG/Luminárias","key":"Luminárias","lang":"pt"}
+data/BR/MG/Luz={"id":"data/BR/MG/Luz","key":"Luz","lang":"pt"}
+data/BR/MG/Machacalis={"id":"data/BR/MG/Machacalis","key":"Machacalis","lang":"pt"}
+data/BR/MG/Machado={"id":"data/BR/MG/Machado","key":"Machado","lang":"pt"}
+data/BR/MG/Madre de Deus de Minas={"id":"data/BR/MG/Madre de Deus de Minas","key":"Madre de Deus de Minas","lang":"pt"}
+data/BR/MG/Malacacheta={"id":"data/BR/MG/Malacacheta","key":"Malacacheta","lang":"pt"}
+data/BR/MG/Mamonas={"id":"data/BR/MG/Mamonas","key":"Mamonas","lang":"pt"}
+data/BR/MG/Manga={"id":"data/BR/MG/Manga","key":"Manga","lang":"pt"}
+data/BR/MG/Manhuaçu={"id":"data/BR/MG/Manhuaçu","key":"Manhuaçu","lang":"pt"}
+data/BR/MG/Manhumirim={"id":"data/BR/MG/Manhumirim","key":"Manhumirim","lang":"pt"}
+data/BR/MG/Mantena={"id":"data/BR/MG/Mantena","key":"Mantena","lang":"pt"}
+data/BR/MG/Mar de Espanha={"id":"data/BR/MG/Mar de Espanha","key":"Mar de Espanha","lang":"pt"}
+data/BR/MG/Maravilhas={"id":"data/BR/MG/Maravilhas","key":"Maravilhas","lang":"pt"}
+data/BR/MG/Maria da Fé={"id":"data/BR/MG/Maria da Fé","key":"Maria da Fé","lang":"pt"}
+data/BR/MG/Mariana={"id":"data/BR/MG/Mariana","key":"Mariana","lang":"pt"}
+data/BR/MG/Marilac={"id":"data/BR/MG/Marilac","key":"Marilac","lang":"pt"}
+data/BR/MG/Maripá de Minas={"id":"data/BR/MG/Maripá de Minas","key":"Maripá de Minas","lang":"pt"}
+data/BR/MG/Marliéria={"id":"data/BR/MG/Marliéria","key":"Marliéria","lang":"pt"}
+data/BR/MG/Marmelópolis={"id":"data/BR/MG/Marmelópolis","key":"Marmelópolis","lang":"pt"}
+data/BR/MG/Martinho Campos={"id":"data/BR/MG/Martinho Campos","key":"Martinho Campos","lang":"pt"}
+data/BR/MG/Martins Soares={"id":"data/BR/MG/Martins Soares","key":"Martins Soares","lang":"pt"}
+data/BR/MG/Mata Verde={"id":"data/BR/MG/Mata Verde","key":"Mata Verde","lang":"pt"}
+data/BR/MG/Materlândia={"id":"data/BR/MG/Materlândia","key":"Materlândia","lang":"pt"}
+data/BR/MG/Mateus Leme={"id":"data/BR/MG/Mateus Leme","key":"Mateus Leme","lang":"pt"}
+data/BR/MG/Mathias Lobato={"id":"data/BR/MG/Mathias Lobato","key":"Mathias Lobato","lang":"pt"}
+data/BR/MG/Matias Barbosa={"id":"data/BR/MG/Matias Barbosa","key":"Matias Barbosa","lang":"pt"}
+data/BR/MG/Matias Cardoso={"id":"data/BR/MG/Matias Cardoso","key":"Matias Cardoso","lang":"pt"}
+data/BR/MG/Matipo={"id":"data/BR/MG/Matipo","key":"Matipo","lang":"pt"}
+data/BR/MG/Mato Verde={"id":"data/BR/MG/Mato Verde","key":"Mato Verde","lang":"pt"}
+data/BR/MG/Matozinhos={"id":"data/BR/MG/Matozinhos","key":"Matozinhos","lang":"pt"}
+data/BR/MG/Matutina={"id":"data/BR/MG/Matutina","key":"Matutina","lang":"pt"}
+data/BR/MG/Medeiros={"id":"data/BR/MG/Medeiros","key":"Medeiros","lang":"pt"}
+data/BR/MG/Medina={"id":"data/BR/MG/Medina","key":"Medina","lang":"pt"}
+data/BR/MG/Mendes Pimentel={"id":"data/BR/MG/Mendes Pimentel","key":"Mendes Pimentel","lang":"pt"}
+data/BR/MG/Mercês={"id":"data/BR/MG/Mercês","key":"Mercês","lang":"pt"}
+data/BR/MG/Mesquita={"id":"data/BR/MG/Mesquita","key":"Mesquita","lang":"pt"}
+data/BR/MG/Minas Novas={"id":"data/BR/MG/Minas Novas","key":"Minas Novas","lang":"pt"}
+data/BR/MG/Minduri={"id":"data/BR/MG/Minduri","key":"Minduri","lang":"pt"}
+data/BR/MG/Mirabela={"id":"data/BR/MG/Mirabela","key":"Mirabela","lang":"pt"}
+data/BR/MG/Miradouro={"id":"data/BR/MG/Miradouro","key":"Miradouro","lang":"pt"}
+data/BR/MG/Miravânia={"id":"data/BR/MG/Miravânia","key":"Miravânia","lang":"pt"}
+data/BR/MG/Miraí={"id":"data/BR/MG/Miraí","key":"Miraí","lang":"pt"}
+data/BR/MG/Moeda={"id":"data/BR/MG/Moeda","key":"Moeda","lang":"pt"}
+data/BR/MG/Moema={"id":"data/BR/MG/Moema","key":"Moema","lang":"pt"}
+data/BR/MG/Monjolos={"id":"data/BR/MG/Monjolos","key":"Monjolos","lang":"pt"}
+data/BR/MG/Monsenhor Paulo={"id":"data/BR/MG/Monsenhor Paulo","key":"Monsenhor Paulo","lang":"pt"}
+data/BR/MG/Montalvânia={"id":"data/BR/MG/Montalvânia","key":"Montalvânia","lang":"pt"}
+data/BR/MG/Monte Alegre de Minas={"id":"data/BR/MG/Monte Alegre de Minas","key":"Monte Alegre de Minas","lang":"pt"}
+data/BR/MG/Monte Azul={"id":"data/BR/MG/Monte Azul","key":"Monte Azul","lang":"pt"}
+data/BR/MG/Monte Belo={"id":"data/BR/MG/Monte Belo","key":"Monte Belo","lang":"pt"}
+data/BR/MG/Monte Carmelo={"id":"data/BR/MG/Monte Carmelo","key":"Monte Carmelo","lang":"pt"}
+data/BR/MG/Monte Formoso={"id":"data/BR/MG/Monte Formoso","key":"Monte Formoso","lang":"pt"}
+data/BR/MG/Monte Santo de Minas={"id":"data/BR/MG/Monte Santo de Minas","key":"Monte Santo de Minas","lang":"pt"}
+data/BR/MG/Monte Sião={"id":"data/BR/MG/Monte Sião","key":"Monte Sião","lang":"pt"}
+data/BR/MG/Montes Claros={"id":"data/BR/MG/Montes Claros","key":"Montes Claros","lang":"pt"}
+data/BR/MG/Montezuma={"id":"data/BR/MG/Montezuma","key":"Montezuma","lang":"pt"}
+data/BR/MG/Morada Nova de Minas={"id":"data/BR/MG/Morada Nova de Minas","key":"Morada Nova de Minas","lang":"pt"}
+data/BR/MG/Morro da Garça={"id":"data/BR/MG/Morro da Garça","key":"Morro da Garça","lang":"pt"}
+data/BR/MG/Morro do Pilar={"id":"data/BR/MG/Morro do Pilar","key":"Morro do Pilar","lang":"pt"}
+data/BR/MG/Munhoz={"id":"data/BR/MG/Munhoz","key":"Munhoz","lang":"pt"}
+data/BR/MG/Muriaé={"id":"data/BR/MG/Muriaé","key":"Muriaé","lang":"pt"}
+data/BR/MG/Mutum={"id":"data/BR/MG/Mutum","key":"Mutum","lang":"pt"}
+data/BR/MG/Muzambinho={"id":"data/BR/MG/Muzambinho","key":"Muzambinho","lang":"pt"}
+data/BR/MG/Mário Campos={"id":"data/BR/MG/Mário Campos","key":"Mário Campos","lang":"pt"}
+data/BR/MG/Nacip Raydan={"id":"data/BR/MG/Nacip Raydan","key":"Nacip Raydan","lang":"pt"}
+data/BR/MG/Nanuque={"id":"data/BR/MG/Nanuque","key":"Nanuque","lang":"pt"}
+data/BR/MG/Naque={"id":"data/BR/MG/Naque","key":"Naque","lang":"pt"}
+data/BR/MG/Natalândia={"id":"data/BR/MG/Natalândia","key":"Natalândia","lang":"pt"}
+data/BR/MG/Natércia={"id":"data/BR/MG/Natércia","key":"Natércia","lang":"pt"}
+data/BR/MG/Nazareno={"id":"data/BR/MG/Nazareno","key":"Nazareno","lang":"pt"}
+data/BR/MG/Nepomuceno={"id":"data/BR/MG/Nepomuceno","key":"Nepomuceno","lang":"pt"}
+data/BR/MG/Ninheira={"id":"data/BR/MG/Ninheira","key":"Ninheira","lang":"pt"}
+data/BR/MG/Nova Belém={"id":"data/BR/MG/Nova Belém","key":"Nova Belém","lang":"pt"}
+data/BR/MG/Nova Era={"id":"data/BR/MG/Nova Era","key":"Nova Era","lang":"pt"}
+data/BR/MG/Nova Lima={"id":"data/BR/MG/Nova Lima","key":"Nova Lima","lang":"pt"}
+data/BR/MG/Nova Módica={"id":"data/BR/MG/Nova Módica","key":"Nova Módica","lang":"pt"}
+data/BR/MG/Nova Ponte={"id":"data/BR/MG/Nova Ponte","key":"Nova Ponte","lang":"pt"}
+data/BR/MG/Nova Porteirinha={"id":"data/BR/MG/Nova Porteirinha","key":"Nova Porteirinha","lang":"pt"}
+data/BR/MG/Nova Resende={"id":"data/BR/MG/Nova Resende","key":"Nova Resende","lang":"pt"}
+data/BR/MG/Nova Serrana={"id":"data/BR/MG/Nova Serrana","key":"Nova Serrana","lang":"pt"}
+data/BR/MG/Nova União={"id":"data/BR/MG/Nova União","key":"Nova União","lang":"pt"}
+data/BR/MG/Novo Cruzeiro={"id":"data/BR/MG/Novo Cruzeiro","key":"Novo Cruzeiro","lang":"pt"}
+data/BR/MG/Novo Oriente de Minas={"id":"data/BR/MG/Novo Oriente de Minas","key":"Novo Oriente de Minas","lang":"pt"}
+data/BR/MG/Novorizonte={"id":"data/BR/MG/Novorizonte","key":"Novorizonte","lang":"pt"}
+data/BR/MG/Olaria={"id":"data/BR/MG/Olaria","key":"Olaria","lang":"pt"}
+data/BR/MG/Olhos-d'Água={"id":"data/BR/MG/Olhos-d'Água","key":"Olhos-d'Água","lang":"pt"}
+data/BR/MG/Oliveira={"id":"data/BR/MG/Oliveira","key":"Oliveira","lang":"pt"}
+data/BR/MG/Oliveira Fortes={"id":"data/BR/MG/Oliveira Fortes","key":"Oliveira Fortes","lang":"pt"}
+data/BR/MG/Olímpio Noronha={"id":"data/BR/MG/Olímpio Noronha","key":"Olímpio Noronha","lang":"pt"}
+data/BR/MG/Onça de Pitangui={"id":"data/BR/MG/Onça de Pitangui","key":"Onça de Pitangui","lang":"pt"}
+data/BR/MG/Oratórios={"id":"data/BR/MG/Oratórios","key":"Oratórios","lang":"pt"}
+data/BR/MG/Orizânia={"id":"data/BR/MG/Orizânia","key":"Orizânia","lang":"pt"}
+data/BR/MG/Ouro Branco={"id":"data/BR/MG/Ouro Branco","key":"Ouro Branco","lang":"pt"}
+data/BR/MG/Ouro Fino={"id":"data/BR/MG/Ouro Fino","key":"Ouro Fino","lang":"pt"}
+data/BR/MG/Ouro Preto={"id":"data/BR/MG/Ouro Preto","key":"Ouro Preto","lang":"pt"}
+data/BR/MG/Ouro Verde de Minas={"id":"data/BR/MG/Ouro Verde de Minas","key":"Ouro Verde de Minas","lang":"pt"}
+data/BR/MG/Padre Carvalho={"id":"data/BR/MG/Padre Carvalho","key":"Padre Carvalho","lang":"pt"}
+data/BR/MG/Padre Paraíso={"id":"data/BR/MG/Padre Paraíso","key":"Padre Paraíso","lang":"pt"}
+data/BR/MG/Pai Pedro={"id":"data/BR/MG/Pai Pedro","key":"Pai Pedro","lang":"pt"}
+data/BR/MG/Paineiras={"id":"data/BR/MG/Paineiras","key":"Paineiras","lang":"pt"}
+data/BR/MG/Pains={"id":"data/BR/MG/Pains","key":"Pains","lang":"pt"}
+data/BR/MG/Paiva={"id":"data/BR/MG/Paiva","key":"Paiva","lang":"pt"}
+data/BR/MG/Palma={"id":"data/BR/MG/Palma","key":"Palma","lang":"pt"}
+data/BR/MG/Palmópolis={"id":"data/BR/MG/Palmópolis","key":"Palmópolis","lang":"pt"}
+data/BR/MG/Papagaios={"id":"data/BR/MG/Papagaios","key":"Papagaios","lang":"pt"}
+data/BR/MG/Paracatu={"id":"data/BR/MG/Paracatu","key":"Paracatu","lang":"pt"}
+data/BR/MG/Paraguaçu={"id":"data/BR/MG/Paraguaçu","key":"Paraguaçu","lang":"pt"}
+data/BR/MG/Paraisópolis={"id":"data/BR/MG/Paraisópolis","key":"Paraisópolis","lang":"pt"}
+data/BR/MG/Paraopeba={"id":"data/BR/MG/Paraopeba","key":"Paraopeba","lang":"pt"}
+data/BR/MG/Pará de Minas={"id":"data/BR/MG/Pará de Minas","key":"Pará de Minas","lang":"pt"}
+data/BR/MG/Passa Quatro={"id":"data/BR/MG/Passa Quatro","key":"Passa Quatro","lang":"pt"}
+data/BR/MG/Passa Tempo={"id":"data/BR/MG/Passa Tempo","key":"Passa Tempo","lang":"pt"}
+data/BR/MG/Passa Vinte={"id":"data/BR/MG/Passa Vinte","key":"Passa Vinte","lang":"pt"}
+data/BR/MG/Passabém={"id":"data/BR/MG/Passabém","key":"Passabém","lang":"pt"}
+data/BR/MG/Passos={"id":"data/BR/MG/Passos","key":"Passos","lang":"pt"}
+data/BR/MG/Patis={"id":"data/BR/MG/Patis","key":"Patis","lang":"pt"}
+data/BR/MG/Patos de Minas={"id":"data/BR/MG/Patos de Minas","key":"Patos de Minas","lang":"pt"}
+data/BR/MG/Patrocínio={"id":"data/BR/MG/Patrocínio","key":"Patrocínio","lang":"pt"}
+data/BR/MG/Patrocínio do Muriaé={"id":"data/BR/MG/Patrocínio do Muriaé","key":"Patrocínio do Muriaé","lang":"pt"}
+data/BR/MG/Paula Cândido={"id":"data/BR/MG/Paula Cândido","key":"Paula Cândido","lang":"pt"}
+data/BR/MG/Paulistas={"id":"data/BR/MG/Paulistas","key":"Paulistas","lang":"pt"}
+data/BR/MG/Pavão={"id":"data/BR/MG/Pavão","key":"Pavão","lang":"pt"}
+data/BR/MG/Pedra Azul={"id":"data/BR/MG/Pedra Azul","key":"Pedra Azul","lang":"pt"}
+data/BR/MG/Pedra Bonita={"id":"data/BR/MG/Pedra Bonita","key":"Pedra Bonita","lang":"pt"}
+data/BR/MG/Pedra Dourada={"id":"data/BR/MG/Pedra Dourada","key":"Pedra Dourada","lang":"pt"}
+data/BR/MG/Pedra do Anta={"id":"data/BR/MG/Pedra do Anta","key":"Pedra do Anta","lang":"pt"}
+data/BR/MG/Pedra do Indaiá={"id":"data/BR/MG/Pedra do Indaiá","key":"Pedra do Indaiá","lang":"pt"}
+data/BR/MG/Pedralva={"id":"data/BR/MG/Pedralva","key":"Pedralva","lang":"pt"}
+data/BR/MG/Pedras de Maria da Cruz={"id":"data/BR/MG/Pedras de Maria da Cruz","key":"Pedras de Maria da Cruz","lang":"pt"}
+data/BR/MG/Pedrinópolis={"id":"data/BR/MG/Pedrinópolis","key":"Pedrinópolis","lang":"pt"}
+data/BR/MG/Pedro Leopoldo={"id":"data/BR/MG/Pedro Leopoldo","key":"Pedro Leopoldo","lang":"pt"}
+data/BR/MG/Pedro Teixeira={"id":"data/BR/MG/Pedro Teixeira","key":"Pedro Teixeira","lang":"pt"}
+data/BR/MG/Pequeri={"id":"data/BR/MG/Pequeri","key":"Pequeri","lang":"pt"}
+data/BR/MG/Pequi={"id":"data/BR/MG/Pequi","key":"Pequi","lang":"pt"}
+data/BR/MG/Perdigão={"id":"data/BR/MG/Perdigão","key":"Perdigão","lang":"pt"}
+data/BR/MG/Perdizes={"id":"data/BR/MG/Perdizes","key":"Perdizes","lang":"pt"}
+data/BR/MG/Perdões={"id":"data/BR/MG/Perdões","key":"Perdões","lang":"pt"}
+data/BR/MG/Periquito={"id":"data/BR/MG/Periquito","key":"Periquito","lang":"pt"}
+data/BR/MG/Pescador={"id":"data/BR/MG/Pescador","key":"Pescador","lang":"pt"}
+data/BR/MG/Peçanha={"id":"data/BR/MG/Peçanha","key":"Peçanha","lang":"pt"}
+data/BR/MG/Piau={"id":"data/BR/MG/Piau","key":"Piau","lang":"pt"}
+data/BR/MG/Piedade de Caratinga={"id":"data/BR/MG/Piedade de Caratinga","key":"Piedade de Caratinga","lang":"pt"}
+data/BR/MG/Piedade de Ponte Nova={"id":"data/BR/MG/Piedade de Ponte Nova","key":"Piedade de Ponte Nova","lang":"pt"}
+data/BR/MG/Piedade do Rio Grande={"id":"data/BR/MG/Piedade do Rio Grande","key":"Piedade do Rio Grande","lang":"pt"}
+data/BR/MG/Piedade dos Gerais={"id":"data/BR/MG/Piedade dos Gerais","key":"Piedade dos Gerais","lang":"pt"}
+data/BR/MG/Pimenta={"id":"data/BR/MG/Pimenta","key":"Pimenta","lang":"pt"}
+data/BR/MG/Pingo d'Água={"id":"data/BR/MG/Pingo d'Água","key":"Pingo d'Água","lang":"pt"}
+data/BR/MG/Pintópolis={"id":"data/BR/MG/Pintópolis","key":"Pintópolis","lang":"pt"}
+data/BR/MG/Piracema={"id":"data/BR/MG/Piracema","key":"Piracema","lang":"pt"}
+data/BR/MG/Pirajuba={"id":"data/BR/MG/Pirajuba","key":"Pirajuba","lang":"pt"}
+data/BR/MG/Piranga={"id":"data/BR/MG/Piranga","key":"Piranga","lang":"pt"}
+data/BR/MG/Piranguinho={"id":"data/BR/MG/Piranguinho","key":"Piranguinho","lang":"pt"}
+data/BR/MG/Piranguçu={"id":"data/BR/MG/Piranguçu","key":"Piranguçu","lang":"pt"}
+data/BR/MG/Pirapetinga={"id":"data/BR/MG/Pirapetinga","key":"Pirapetinga","lang":"pt"}
+data/BR/MG/Pirapora={"id":"data/BR/MG/Pirapora","key":"Pirapora","lang":"pt"}
+data/BR/MG/Piraúba={"id":"data/BR/MG/Piraúba","key":"Piraúba","lang":"pt"}
+data/BR/MG/Pitangui={"id":"data/BR/MG/Pitangui","key":"Pitangui","lang":"pt"}
+data/BR/MG/Piumhi={"id":"data/BR/MG/Piumhi","key":"Piumhi","lang":"pt"}
+data/BR/MG/Planura={"id":"data/BR/MG/Planura","key":"Planura","lang":"pt"}
+data/BR/MG/Pocrane={"id":"data/BR/MG/Pocrane","key":"Pocrane","lang":"pt"}
+data/BR/MG/Pompéu={"id":"data/BR/MG/Pompéu","key":"Pompéu","lang":"pt"}
+data/BR/MG/Ponte Nova={"id":"data/BR/MG/Ponte Nova","key":"Ponte Nova","lang":"pt"}
+data/BR/MG/Ponto Chique={"id":"data/BR/MG/Ponto Chique","key":"Ponto Chique","lang":"pt"}
+data/BR/MG/Ponto dos Volantes={"id":"data/BR/MG/Ponto dos Volantes","key":"Ponto dos Volantes","lang":"pt"}
+data/BR/MG/Porteirinha={"id":"data/BR/MG/Porteirinha","key":"Porteirinha","lang":"pt"}
+data/BR/MG/Porto Firme={"id":"data/BR/MG/Porto Firme","key":"Porto Firme","lang":"pt"}
+data/BR/MG/Poté={"id":"data/BR/MG/Poté","key":"Poté","lang":"pt"}
+data/BR/MG/Pouso Alegre={"id":"data/BR/MG/Pouso Alegre","key":"Pouso Alegre","lang":"pt"}
+data/BR/MG/Pouso Alto={"id":"data/BR/MG/Pouso Alto","key":"Pouso Alto","lang":"pt"}
+data/BR/MG/Poço Fundo={"id":"data/BR/MG/Poço Fundo","key":"Poço Fundo","lang":"pt"}
+data/BR/MG/Poços de Caldas={"id":"data/BR/MG/Poços de Caldas","key":"Poços de Caldas","lang":"pt"}
+data/BR/MG/Prados={"id":"data/BR/MG/Prados","key":"Prados","lang":"pt"}
+data/BR/MG/Prata={"id":"data/BR/MG/Prata","key":"Prata","lang":"pt"}
+data/BR/MG/Pratinha={"id":"data/BR/MG/Pratinha","key":"Pratinha","lang":"pt"}
+data/BR/MG/Pratápolis={"id":"data/BR/MG/Pratápolis","key":"Pratápolis","lang":"pt"}
+data/BR/MG/Presidente Bernardes={"id":"data/BR/MG/Presidente Bernardes","key":"Presidente Bernardes","lang":"pt"}
+data/BR/MG/Presidente Juscelino={"id":"data/BR/MG/Presidente Juscelino","key":"Presidente Juscelino","lang":"pt"}
+data/BR/MG/Presidente Kubitschek={"id":"data/BR/MG/Presidente Kubitschek","key":"Presidente Kubitschek","lang":"pt"}
+data/BR/MG/Presidente Olegário={"id":"data/BR/MG/Presidente Olegário","key":"Presidente Olegário","lang":"pt"}
+data/BR/MG/Prudente de Morais={"id":"data/BR/MG/Prudente de Morais","key":"Prudente de Morais","lang":"pt"}
+data/BR/MG/Quartel Geral={"id":"data/BR/MG/Quartel Geral","key":"Quartel Geral","lang":"pt"}
+data/BR/MG/Queluzito={"id":"data/BR/MG/Queluzito","key":"Queluzito","lang":"pt"}
+data/BR/MG/Raposos={"id":"data/BR/MG/Raposos","key":"Raposos","lang":"pt"}
+data/BR/MG/Raul Soares={"id":"data/BR/MG/Raul Soares","key":"Raul Soares","lang":"pt"}
+data/BR/MG/Recreio={"id":"data/BR/MG/Recreio","key":"Recreio","lang":"pt"}
+data/BR/MG/Reduto={"id":"data/BR/MG/Reduto","key":"Reduto","lang":"pt"}
+data/BR/MG/Resende Costa={"id":"data/BR/MG/Resende Costa","key":"Resende Costa","lang":"pt"}
+data/BR/MG/Resplendor={"id":"data/BR/MG/Resplendor","key":"Resplendor","lang":"pt"}
+data/BR/MG/Ressaquinha={"id":"data/BR/MG/Ressaquinha","key":"Ressaquinha","lang":"pt"}
+data/BR/MG/Riachinho={"id":"data/BR/MG/Riachinho","key":"Riachinho","lang":"pt"}
+data/BR/MG/Riacho dos Machados={"id":"data/BR/MG/Riacho dos Machados","key":"Riacho dos Machados","lang":"pt"}
+data/BR/MG/Ribeirão Vermelho={"id":"data/BR/MG/Ribeirão Vermelho","key":"Ribeirão Vermelho","lang":"pt"}
+data/BR/MG/Ribeirão das Neves={"id":"data/BR/MG/Ribeirão das Neves","key":"Ribeirão das Neves","lang":"pt"}
+data/BR/MG/Rio Acima={"id":"data/BR/MG/Rio Acima","key":"Rio Acima","lang":"pt"}
+data/BR/MG/Rio Casca={"id":"data/BR/MG/Rio Casca","key":"Rio Casca","lang":"pt"}
+data/BR/MG/Rio Doce={"id":"data/BR/MG/Rio Doce","key":"Rio Doce","lang":"pt"}
+data/BR/MG/Rio Espera={"id":"data/BR/MG/Rio Espera","key":"Rio Espera","lang":"pt"}
+data/BR/MG/Rio Manso={"id":"data/BR/MG/Rio Manso","key":"Rio Manso","lang":"pt"}
+data/BR/MG/Rio Novo={"id":"data/BR/MG/Rio Novo","key":"Rio Novo","lang":"pt"}
+data/BR/MG/Rio Paranaíba={"id":"data/BR/MG/Rio Paranaíba","key":"Rio Paranaíba","lang":"pt"}
+data/BR/MG/Rio Pardo de Minas={"id":"data/BR/MG/Rio Pardo de Minas","key":"Rio Pardo de Minas","lang":"pt"}
+data/BR/MG/Rio Piracicaba={"id":"data/BR/MG/Rio Piracicaba","key":"Rio Piracicaba","lang":"pt"}
+data/BR/MG/Rio Pomba={"id":"data/BR/MG/Rio Pomba","key":"Rio Pomba","lang":"pt"}
+data/BR/MG/Rio Preto={"id":"data/BR/MG/Rio Preto","key":"Rio Preto","lang":"pt"}
+data/BR/MG/Rio Vermelho={"id":"data/BR/MG/Rio Vermelho","key":"Rio Vermelho","lang":"pt"}
+data/BR/MG/Rio do Prado={"id":"data/BR/MG/Rio do Prado","key":"Rio do Prado","lang":"pt"}
+data/BR/MG/Ritápolis={"id":"data/BR/MG/Ritápolis","key":"Ritápolis","lang":"pt"}
+data/BR/MG/Rochedo de Minas={"id":"data/BR/MG/Rochedo de Minas","key":"Rochedo de Minas","lang":"pt"}
+data/BR/MG/Rodeiro={"id":"data/BR/MG/Rodeiro","key":"Rodeiro","lang":"pt"}
+data/BR/MG/Romaria={"id":"data/BR/MG/Romaria","key":"Romaria","lang":"pt"}
+data/BR/MG/Rosário da Limeira={"id":"data/BR/MG/Rosário da Limeira","key":"Rosário da Limeira","lang":"pt"}
+data/BR/MG/Rubelita={"id":"data/BR/MG/Rubelita","key":"Rubelita","lang":"pt"}
+data/BR/MG/Rubim={"id":"data/BR/MG/Rubim","key":"Rubim","lang":"pt"}
+data/BR/MG/Sabará={"id":"data/BR/MG/Sabará","key":"Sabará","lang":"pt"}
+data/BR/MG/Sabinópolis={"id":"data/BR/MG/Sabinópolis","key":"Sabinópolis","lang":"pt"}
+data/BR/MG/Sacramento={"id":"data/BR/MG/Sacramento","key":"Sacramento","lang":"pt"}
+data/BR/MG/Salinas={"id":"data/BR/MG/Salinas","key":"Salinas","lang":"pt"}
+data/BR/MG/Salto da Divisa={"id":"data/BR/MG/Salto da Divisa","key":"Salto da Divisa","lang":"pt"}
+data/BR/MG/Santa Barbara={"id":"data/BR/MG/Santa Barbara","key":"Santa Barbara","lang":"pt"}
+data/BR/MG/Santa Bárbara do Leste={"id":"data/BR/MG/Santa Bárbara do Leste","key":"Santa Bárbara do Leste","lang":"pt"}
+data/BR/MG/Santa Bárbara do Monte Verde={"id":"data/BR/MG/Santa Bárbara do Monte Verde","key":"Santa Bárbara do Monte Verde","lang":"pt"}
+data/BR/MG/Santa Bárbara do Tugúrio={"id":"data/BR/MG/Santa Bárbara do Tugúrio","key":"Santa Bárbara do Tugúrio","lang":"pt"}
+data/BR/MG/Santa Cruz de Minas={"id":"data/BR/MG/Santa Cruz de Minas","key":"Santa Cruz de Minas","lang":"pt"}
+data/BR/MG/Santa Cruz de Salinas={"id":"data/BR/MG/Santa Cruz de Salinas","key":"Santa Cruz de Salinas","lang":"pt"}
+data/BR/MG/Santa Cruz do Escalvado={"id":"data/BR/MG/Santa Cruz do Escalvado","key":"Santa Cruz do Escalvado","lang":"pt"}
+data/BR/MG/Santa Efigênia de Minas={"id":"data/BR/MG/Santa Efigênia de Minas","key":"Santa Efigênia de Minas","lang":"pt"}
+data/BR/MG/Santa Fé de Minas={"id":"data/BR/MG/Santa Fé de Minas","key":"Santa Fé de Minas","lang":"pt"}
+data/BR/MG/Santa Helena de Minas={"id":"data/BR/MG/Santa Helena de Minas","key":"Santa Helena de Minas","lang":"pt"}
+data/BR/MG/Santa Juliana={"id":"data/BR/MG/Santa Juliana","key":"Santa Juliana","lang":"pt"}
+data/BR/MG/Santa Luzia={"id":"data/BR/MG/Santa Luzia","key":"Santa Luzia","lang":"pt"}
+data/BR/MG/Santa Margarida={"id":"data/BR/MG/Santa Margarida","key":"Santa Margarida","lang":"pt"}
+data/BR/MG/Santa Maria de Itabira={"id":"data/BR/MG/Santa Maria de Itabira","key":"Santa Maria de Itabira","lang":"pt"}
+data/BR/MG/Santa Maria do Salto={"id":"data/BR/MG/Santa Maria do Salto","key":"Santa Maria do Salto","lang":"pt"}
+data/BR/MG/Santa Maria do Suaçuí={"id":"data/BR/MG/Santa Maria do Suaçuí","key":"Santa Maria do Suaçuí","lang":"pt"}
+data/BR/MG/Santa Rita de Caldas={"id":"data/BR/MG/Santa Rita de Caldas","key":"Santa Rita de Caldas","lang":"pt"}
+data/BR/MG/Santa Rita de Ibitipoca={"id":"data/BR/MG/Santa Rita de Ibitipoca","key":"Santa Rita de Ibitipoca","lang":"pt"}
+data/BR/MG/Santa Rita de Jacutinga={"id":"data/BR/MG/Santa Rita de Jacutinga","key":"Santa Rita de Jacutinga","lang":"pt"}
+data/BR/MG/Santa Rita de Minas={"id":"data/BR/MG/Santa Rita de Minas","key":"Santa Rita de Minas","lang":"pt"}
+data/BR/MG/Santa Rita do Itueto={"id":"data/BR/MG/Santa Rita do Itueto","key":"Santa Rita do Itueto","lang":"pt"}
+data/BR/MG/Santa Rita do Sapucaí={"id":"data/BR/MG/Santa Rita do Sapucaí","key":"Santa Rita do Sapucaí","lang":"pt"}
+data/BR/MG/Santa Rosa da Serra={"id":"data/BR/MG/Santa Rosa da Serra","key":"Santa Rosa da Serra","lang":"pt"}
+data/BR/MG/Santa Vitória={"id":"data/BR/MG/Santa Vitória","key":"Santa Vitória","lang":"pt"}
+data/BR/MG/Santana da Vargem={"id":"data/BR/MG/Santana da Vargem","key":"Santana da Vargem","lang":"pt"}
+data/BR/MG/Santana de Cataguases={"id":"data/BR/MG/Santana de Cataguases","key":"Santana de Cataguases","lang":"pt"}
+data/BR/MG/Santana de Pirapama={"id":"data/BR/MG/Santana de Pirapama","key":"Santana de Pirapama","lang":"pt"}
+data/BR/MG/Santana do Deserto={"id":"data/BR/MG/Santana do Deserto","key":"Santana do Deserto","lang":"pt"}
+data/BR/MG/Santana do Garambéu={"id":"data/BR/MG/Santana do Garambéu","key":"Santana do Garambéu","lang":"pt"}
+data/BR/MG/Santana do Jacaré={"id":"data/BR/MG/Santana do Jacaré","key":"Santana do Jacaré","lang":"pt"}
+data/BR/MG/Santana do Manhuaçu={"id":"data/BR/MG/Santana do Manhuaçu","key":"Santana do Manhuaçu","lang":"pt"}
+data/BR/MG/Santana do Paraíso={"id":"data/BR/MG/Santana do Paraíso","key":"Santana do Paraíso","lang":"pt"}
+data/BR/MG/Santana do Riacho={"id":"data/BR/MG/Santana do Riacho","key":"Santana do Riacho","lang":"pt"}
+data/BR/MG/Santana dos Montes={"id":"data/BR/MG/Santana dos Montes","key":"Santana dos Montes","lang":"pt"}
+data/BR/MG/Santo Antônio do Amparo={"id":"data/BR/MG/Santo Antônio do Amparo","key":"Santo Antônio do Amparo","lang":"pt"}
+data/BR/MG/Santo Antônio do Aventureiro={"id":"data/BR/MG/Santo Antônio do Aventureiro","key":"Santo Antônio do Aventureiro","lang":"pt"}
+data/BR/MG/Santo Antônio do Grama={"id":"data/BR/MG/Santo Antônio do Grama","key":"Santo Antônio do Grama","lang":"pt"}
+data/BR/MG/Santo Antônio do Itambé={"id":"data/BR/MG/Santo Antônio do Itambé","key":"Santo Antônio do Itambé","lang":"pt"}
+data/BR/MG/Santo Antônio do Jacinto={"id":"data/BR/MG/Santo Antônio do Jacinto","key":"Santo Antônio do Jacinto","lang":"pt"}
+data/BR/MG/Santo Antônio do Monte={"id":"data/BR/MG/Santo Antônio do Monte","key":"Santo Antônio do Monte","lang":"pt"}
+data/BR/MG/Santo Antônio do Retiro={"id":"data/BR/MG/Santo Antônio do Retiro","key":"Santo Antônio do Retiro","lang":"pt"}
+data/BR/MG/Santo Antônio do Rio Abaixo={"id":"data/BR/MG/Santo Antônio do Rio Abaixo","key":"Santo Antônio do Rio Abaixo","lang":"pt"}
+data/BR/MG/Santo Hipólito={"id":"data/BR/MG/Santo Hipólito","key":"Santo Hipólito","lang":"pt"}
+data/BR/MG/Santos Dumont={"id":"data/BR/MG/Santos Dumont","key":"Santos Dumont","lang":"pt"}
+data/BR/MG/Sapucaí-Mirim={"id":"data/BR/MG/Sapucaí-Mirim","key":"Sapucaí-Mirim","lang":"pt"}
+data/BR/MG/Sardoá={"id":"data/BR/MG/Sardoá","key":"Sardoá","lang":"pt"}
+data/BR/MG/Sarzedo={"id":"data/BR/MG/Sarzedo","key":"Sarzedo","lang":"pt"}
+data/BR/MG/Sem-Peixe={"id":"data/BR/MG/Sem-Peixe","key":"Sem-Peixe","lang":"pt"}
+data/BR/MG/Senador Amaral={"id":"data/BR/MG/Senador Amaral","key":"Senador Amaral","lang":"pt"}
+data/BR/MG/Senador Cortes={"id":"data/BR/MG/Senador Cortes","key":"Senador Cortes","lang":"pt"}
+data/BR/MG/Senador Firmino={"id":"data/BR/MG/Senador Firmino","key":"Senador Firmino","lang":"pt"}
+data/BR/MG/Senador José Bento={"id":"data/BR/MG/Senador José Bento","key":"Senador José Bento","lang":"pt"}
+data/BR/MG/Senador Modestino Gonçalves={"id":"data/BR/MG/Senador Modestino Gonçalves","key":"Senador Modestino Gonçalves","lang":"pt"}
+data/BR/MG/Senhora de Oliveira={"id":"data/BR/MG/Senhora de Oliveira","key":"Senhora de Oliveira","lang":"pt"}
+data/BR/MG/Senhora do Porto={"id":"data/BR/MG/Senhora do Porto","key":"Senhora do Porto","lang":"pt"}
+data/BR/MG/Senhora dos Remédios={"id":"data/BR/MG/Senhora dos Remédios","key":"Senhora dos Remédios","lang":"pt"}
+data/BR/MG/Sericita={"id":"data/BR/MG/Sericita","key":"Sericita","lang":"pt"}
+data/BR/MG/Seritinga={"id":"data/BR/MG/Seritinga","key":"Seritinga","lang":"pt"}
+data/BR/MG/Serra Azul de Minas={"id":"data/BR/MG/Serra Azul de Minas","key":"Serra Azul de Minas","lang":"pt"}
+data/BR/MG/Serra da Saudade={"id":"data/BR/MG/Serra da Saudade","key":"Serra da Saudade","lang":"pt"}
+data/BR/MG/Serra do Salitre={"id":"data/BR/MG/Serra do Salitre","key":"Serra do Salitre","lang":"pt"}
+data/BR/MG/Serra dos Aimorés={"id":"data/BR/MG/Serra dos Aimorés","key":"Serra dos Aimorés","lang":"pt"}
+data/BR/MG/Serrania={"id":"data/BR/MG/Serrania","key":"Serrania","lang":"pt"}
+data/BR/MG/Serranos={"id":"data/BR/MG/Serranos","key":"Serranos","lang":"pt"}
+data/BR/MG/Serranópolis de Minas={"id":"data/BR/MG/Serranópolis de Minas","key":"Serranópolis de Minas","lang":"pt"}
+data/BR/MG/Serro={"id":"data/BR/MG/Serro","key":"Serro","lang":"pt"}
+data/BR/MG/Sete Lagoas={"id":"data/BR/MG/Sete Lagoas","key":"Sete Lagoas","lang":"pt"}
+data/BR/MG/Setubinha={"id":"data/BR/MG/Setubinha","key":"Setubinha","lang":"pt"}
+data/BR/MG/Silveirânia={"id":"data/BR/MG/Silveirânia","key":"Silveirânia","lang":"pt"}
+data/BR/MG/Silvianópolis={"id":"data/BR/MG/Silvianópolis","key":"Silvianópolis","lang":"pt"}
+data/BR/MG/Simonésia={"id":"data/BR/MG/Simonésia","key":"Simonésia","lang":"pt"}
+data/BR/MG/Simão Pereira={"id":"data/BR/MG/Simão Pereira","key":"Simão Pereira","lang":"pt"}
+data/BR/MG/Sobrália={"id":"data/BR/MG/Sobrália","key":"Sobrália","lang":"pt"}
+data/BR/MG/Soledade de Minas={"id":"data/BR/MG/Soledade de Minas","key":"Soledade de Minas","lang":"pt"}
+data/BR/MG/São Bento Abade={"id":"data/BR/MG/São Bento Abade","key":"São Bento Abade","lang":"pt"}
+data/BR/MG/São Brás do Suaçuí={"id":"data/BR/MG/São Brás do Suaçuí","key":"São Brás do Suaçuí","lang":"pt"}
+data/BR/MG/São Domingos das Dores={"id":"data/BR/MG/São Domingos das Dores","key":"São Domingos das Dores","lang":"pt"}
+data/BR/MG/São Domingos do Prata={"id":"data/BR/MG/São Domingos do Prata","key":"São Domingos do Prata","lang":"pt"}
+data/BR/MG/São Francisco={"id":"data/BR/MG/São Francisco","key":"São Francisco","lang":"pt"}
+data/BR/MG/São Francisco de Paula={"id":"data/BR/MG/São Francisco de Paula","key":"São Francisco de Paula","lang":"pt"}
+data/BR/MG/São Francisco de Sales={"id":"data/BR/MG/São Francisco de Sales","key":"São Francisco de Sales","lang":"pt"}
+data/BR/MG/São Francisco do Glória={"id":"data/BR/MG/São Francisco do Glória","key":"São Francisco do Glória","lang":"pt"}
+data/BR/MG/São Félix de Minas={"id":"data/BR/MG/São Félix de Minas","key":"São Félix de Minas","lang":"pt"}
+data/BR/MG/São Geraldo={"id":"data/BR/MG/São Geraldo","key":"São Geraldo","lang":"pt"}
+data/BR/MG/São Geraldo da Piedade={"id":"data/BR/MG/São Geraldo da Piedade","key":"São Geraldo da Piedade","lang":"pt"}
+data/BR/MG/São Geraldo do Baixio={"id":"data/BR/MG/São Geraldo do Baixio","key":"São Geraldo do Baixio","lang":"pt"}
+data/BR/MG/São Gonçalo do Abaeté={"id":"data/BR/MG/São Gonçalo do Abaeté","key":"São Gonçalo do Abaeté","lang":"pt"}
+data/BR/MG/São Gonçalo do Pará={"id":"data/BR/MG/São Gonçalo do Pará","key":"São Gonçalo do Pará","lang":"pt"}
+data/BR/MG/São Gonçalo do Rio Abaixo={"id":"data/BR/MG/São Gonçalo do Rio Abaixo","key":"São Gonçalo do Rio Abaixo","lang":"pt"}
+data/BR/MG/São Gonçalo do Rio Preto={"id":"data/BR/MG/São Gonçalo do Rio Preto","key":"São Gonçalo do Rio Preto","lang":"pt"}
+data/BR/MG/São Gonçalo do Sapucaí={"id":"data/BR/MG/São Gonçalo do Sapucaí","key":"São Gonçalo do Sapucaí","lang":"pt"}
+data/BR/MG/São Gotardo={"id":"data/BR/MG/São Gotardo","key":"São Gotardo","lang":"pt"}
+data/BR/MG/São Joaquim de Bicas={"id":"data/BR/MG/São Joaquim de Bicas","key":"São Joaquim de Bicas","lang":"pt"}
+data/BR/MG/São José da Barra={"id":"data/BR/MG/São José da Barra","key":"São José da Barra","lang":"pt"}
+data/BR/MG/São José da Lapa={"id":"data/BR/MG/São José da Lapa","key":"São José da Lapa","lang":"pt"}
+data/BR/MG/São José da Safira={"id":"data/BR/MG/São José da Safira","key":"São José da Safira","lang":"pt"}
+data/BR/MG/São José da Varginha={"id":"data/BR/MG/São José da Varginha","key":"São José da Varginha","lang":"pt"}
+data/BR/MG/São José do Alegre={"id":"data/BR/MG/São José do Alegre","key":"São José do Alegre","lang":"pt"}
+data/BR/MG/São José do Divino={"id":"data/BR/MG/São José do Divino","key":"São José do Divino","lang":"pt"}
+data/BR/MG/São José do Goiabal={"id":"data/BR/MG/São José do Goiabal","key":"São José do Goiabal","lang":"pt"}
+data/BR/MG/São José do Jacuri={"id":"data/BR/MG/São José do Jacuri","key":"São José do Jacuri","lang":"pt"}
+data/BR/MG/São José do Mantimento={"id":"data/BR/MG/São José do Mantimento","key":"São José do Mantimento","lang":"pt"}
+data/BR/MG/São João Batista do Glória={"id":"data/BR/MG/São João Batista do Glória","key":"São João Batista do Glória","lang":"pt"}
+data/BR/MG/São João Evangelista={"id":"data/BR/MG/São João Evangelista","key":"São João Evangelista","lang":"pt"}
+data/BR/MG/São João Nepomuceno={"id":"data/BR/MG/São João Nepomuceno","key":"São João Nepomuceno","lang":"pt"}
+data/BR/MG/São João da Lagoa={"id":"data/BR/MG/São João da Lagoa","key":"São João da Lagoa","lang":"pt"}
+data/BR/MG/São João da Mata={"id":"data/BR/MG/São João da Mata","key":"São João da Mata","lang":"pt"}
+data/BR/MG/São João da Ponte={"id":"data/BR/MG/São João da Ponte","key":"São João da Ponte","lang":"pt"}
+data/BR/MG/São João das Missões={"id":"data/BR/MG/São João das Missões","key":"São João das Missões","lang":"pt"}
+data/BR/MG/São João del Rei={"id":"data/BR/MG/São João del Rei","key":"São João del Rei","lang":"pt"}
+data/BR/MG/São João do Manhuaçu={"id":"data/BR/MG/São João do Manhuaçu","key":"São João do Manhuaçu","lang":"pt"}
+data/BR/MG/São João do Manteninha={"id":"data/BR/MG/São João do Manteninha","key":"São João do Manteninha","lang":"pt"}
+data/BR/MG/São João do Oriente={"id":"data/BR/MG/São João do Oriente","key":"São João do Oriente","lang":"pt"}
+data/BR/MG/São João do Pacuí={"id":"data/BR/MG/São João do Pacuí","key":"São João do Pacuí","lang":"pt"}
+data/BR/MG/São João do Paraíso={"id":"data/BR/MG/São João do Paraíso","key":"São João do Paraíso","lang":"pt"}
+data/BR/MG/São Lourenço={"id":"data/BR/MG/São Lourenço","key":"São Lourenço","lang":"pt"}
+data/BR/MG/São Miguel do Anta={"id":"data/BR/MG/São Miguel do Anta","key":"São Miguel do Anta","lang":"pt"}
+data/BR/MG/São Pedro da União={"id":"data/BR/MG/São Pedro da União","key":"São Pedro da União","lang":"pt"}
+data/BR/MG/São Pedro do Suaçuí={"id":"data/BR/MG/São Pedro do Suaçuí","key":"São Pedro do Suaçuí","lang":"pt"}
+data/BR/MG/São Pedro dos Ferros={"id":"data/BR/MG/São Pedro dos Ferros","key":"São Pedro dos Ferros","lang":"pt"}
+data/BR/MG/São Romão={"id":"data/BR/MG/São Romão","key":"São Romão","lang":"pt"}
+data/BR/MG/São Roque de Minas={"id":"data/BR/MG/São Roque de Minas","key":"São Roque de Minas","lang":"pt"}
+data/BR/MG/São Sebastião da Bela Vista={"id":"data/BR/MG/São Sebastião da Bela Vista","key":"São Sebastião da Bela Vista","lang":"pt"}
+data/BR/MG/São Sebastião da Vargem Alegre={"id":"data/BR/MG/São Sebastião da Vargem Alegre","key":"São Sebastião da Vargem Alegre","lang":"pt"}
+data/BR/MG/São Sebastião do Anta={"id":"data/BR/MG/São Sebastião do Anta","key":"São Sebastião do Anta","lang":"pt"}
+data/BR/MG/São Sebastião do Maranhão={"id":"data/BR/MG/São Sebastião do Maranhão","key":"São Sebastião do Maranhão","lang":"pt"}
+data/BR/MG/São Sebastião do Oeste={"id":"data/BR/MG/São Sebastião do Oeste","key":"São Sebastião do Oeste","lang":"pt"}
+data/BR/MG/São Sebastião do Paraíso={"id":"data/BR/MG/São Sebastião do Paraíso","key":"São Sebastião do Paraíso","lang":"pt"}
+data/BR/MG/São Sebastião do Rio Preto={"id":"data/BR/MG/São Sebastião do Rio Preto","key":"São Sebastião do Rio Preto","lang":"pt"}
+data/BR/MG/São Sebastião do Rio Verde={"id":"data/BR/MG/São Sebastião do Rio Verde","key":"São Sebastião do Rio Verde","lang":"pt"}
+data/BR/MG/São Thomé das Letras={"id":"data/BR/MG/São Thomé das Letras","key":"São Thomé das Letras","lang":"pt"}
+data/BR/MG/São Tiago={"id":"data/BR/MG/São Tiago","key":"São Tiago","lang":"pt"}
+data/BR/MG/São Tomás de Aquino={"id":"data/BR/MG/São Tomás de Aquino","key":"São Tomás de Aquino","lang":"pt"}
+data/BR/MG/São Vicente de Minas={"id":"data/BR/MG/São Vicente de Minas","key":"São Vicente de Minas","lang":"pt"}
+data/BR/MG/Tabuleiro={"id":"data/BR/MG/Tabuleiro","key":"Tabuleiro","lang":"pt"}
+data/BR/MG/Taiobeiras={"id":"data/BR/MG/Taiobeiras","key":"Taiobeiras","lang":"pt"}
+data/BR/MG/Taparuba={"id":"data/BR/MG/Taparuba","key":"Taparuba","lang":"pt"}
+data/BR/MG/Tapira={"id":"data/BR/MG/Tapira","key":"Tapira","lang":"pt"}
+data/BR/MG/Tapiraí={"id":"data/BR/MG/Tapiraí","key":"Tapiraí","lang":"pt"}
+data/BR/MG/Taquaraçu de Minas={"id":"data/BR/MG/Taquaraçu de Minas","key":"Taquaraçu de Minas","lang":"pt"}
+data/BR/MG/Tarumirim={"id":"data/BR/MG/Tarumirim","key":"Tarumirim","lang":"pt"}
+data/BR/MG/Teixeiras={"id":"data/BR/MG/Teixeiras","key":"Teixeiras","lang":"pt"}
+data/BR/MG/Teófilo Otoni={"id":"data/BR/MG/Teófilo Otoni","key":"Teófilo Otoni","lang":"pt"}
+data/BR/MG/Timóteo={"id":"data/BR/MG/Timóteo","key":"Timóteo","lang":"pt"}
+data/BR/MG/Tiradentes={"id":"data/BR/MG/Tiradentes","key":"Tiradentes","lang":"pt"}
+data/BR/MG/Tiros={"id":"data/BR/MG/Tiros","key":"Tiros","lang":"pt"}
+data/BR/MG/Tocantins={"id":"data/BR/MG/Tocantins","key":"Tocantins","lang":"pt"}
+data/BR/MG/Tocos do Moji={"id":"data/BR/MG/Tocos do Moji","key":"Tocos do Moji","lang":"pt"}
+data/BR/MG/Toledo={"id":"data/BR/MG/Toledo","key":"Toledo","lang":"pt"}
+data/BR/MG/Tombos={"id":"data/BR/MG/Tombos","key":"Tombos","lang":"pt"}
+data/BR/MG/Três Corações={"id":"data/BR/MG/Três Corações","key":"Três Corações","lang":"pt"}
+data/BR/MG/Três Marias={"id":"data/BR/MG/Três Marias","key":"Três Marias","lang":"pt"}
+data/BR/MG/Três Pontas={"id":"data/BR/MG/Três Pontas","key":"Três Pontas","lang":"pt"}
+data/BR/MG/Tumiritinga={"id":"data/BR/MG/Tumiritinga","key":"Tumiritinga","lang":"pt"}
+data/BR/MG/Tupaciguara={"id":"data/BR/MG/Tupaciguara","key":"Tupaciguara","lang":"pt"}
+data/BR/MG/Turmalina={"id":"data/BR/MG/Turmalina","key":"Turmalina","lang":"pt"}
+data/BR/MG/Turvolândia={"id":"data/BR/MG/Turvolândia","key":"Turvolândia","lang":"pt"}
+data/BR/MG/Ubaporanga={"id":"data/BR/MG/Ubaporanga","key":"Ubaporanga","lang":"pt"}
+data/BR/MG/Ubaí={"id":"data/BR/MG/Ubaí","key":"Ubaí","lang":"pt"}
+data/BR/MG/Uberaba={"id":"data/BR/MG/Uberaba","key":"Uberaba","lang":"pt"}
+data/BR/MG/Uberlândia={"id":"data/BR/MG/Uberlândia","key":"Uberlândia","lang":"pt"}
+data/BR/MG/Ubá={"id":"data/BR/MG/Ubá","key":"Ubá","lang":"pt"}
+data/BR/MG/Umburatiba={"id":"data/BR/MG/Umburatiba","key":"Umburatiba","lang":"pt"}
+data/BR/MG/Unaí={"id":"data/BR/MG/Unaí","key":"Unaí","lang":"pt"}
+data/BR/MG/União de Minas={"id":"data/BR/MG/União de Minas","key":"União de Minas","lang":"pt"}
+data/BR/MG/Uruana de Minas={"id":"data/BR/MG/Uruana de Minas","key":"Uruana de Minas","lang":"pt"}
+data/BR/MG/Urucuia={"id":"data/BR/MG/Urucuia","key":"Urucuia","lang":"pt"}
+data/BR/MG/Urucânia={"id":"data/BR/MG/Urucânia","key":"Urucânia","lang":"pt"}
+data/BR/MG/Vargem Alegre={"id":"data/BR/MG/Vargem Alegre","key":"Vargem Alegre","lang":"pt"}
+data/BR/MG/Vargem Bonita={"id":"data/BR/MG/Vargem Bonita","key":"Vargem Bonita","lang":"pt"}
+data/BR/MG/Vargem Grande do Rio Pardo={"id":"data/BR/MG/Vargem Grande do Rio Pardo","key":"Vargem Grande do Rio Pardo","lang":"pt"}
+data/BR/MG/Varginha={"id":"data/BR/MG/Varginha","key":"Varginha","lang":"pt"}
+data/BR/MG/Varjão de Minas={"id":"data/BR/MG/Varjão de Minas","key":"Varjão de Minas","lang":"pt"}
+data/BR/MG/Varzelândia={"id":"data/BR/MG/Varzelândia","key":"Varzelândia","lang":"pt"}
+data/BR/MG/Vazante={"id":"data/BR/MG/Vazante","key":"Vazante","lang":"pt"}
+data/BR/MG/Verdelândia={"id":"data/BR/MG/Verdelândia","key":"Verdelândia","lang":"pt"}
+data/BR/MG/Veredinha={"id":"data/BR/MG/Veredinha","key":"Veredinha","lang":"pt"}
+data/BR/MG/Vermelho Novo={"id":"data/BR/MG/Vermelho Novo","key":"Vermelho Novo","lang":"pt"}
+data/BR/MG/Veríssimo={"id":"data/BR/MG/Veríssimo","key":"Veríssimo","lang":"pt"}
+data/BR/MG/Vespasiano={"id":"data/BR/MG/Vespasiano","key":"Vespasiano","lang":"pt"}
+data/BR/MG/Vieiras={"id":"data/BR/MG/Vieiras","key":"Vieiras","lang":"pt"}
+data/BR/MG/Virgem da Lapa={"id":"data/BR/MG/Virgem da Lapa","key":"Virgem da Lapa","lang":"pt"}
+data/BR/MG/Virginia={"id":"data/BR/MG/Virginia","key":"Virginia","lang":"pt"}
+data/BR/MG/Virginópolis={"id":"data/BR/MG/Virginópolis","key":"Virginópolis","lang":"pt"}
+data/BR/MG/Virgolândia={"id":"data/BR/MG/Virgolândia","key":"Virgolândia","lang":"pt"}
+data/BR/MG/Visconde do Rio Branco={"id":"data/BR/MG/Visconde do Rio Branco","key":"Visconde do Rio Branco","lang":"pt"}
+data/BR/MG/Viçosa={"id":"data/BR/MG/Viçosa","key":"Viçosa","lang":"pt"}
+data/BR/MG/Volta Grande={"id":"data/BR/MG/Volta Grande","key":"Volta Grande","lang":"pt"}
+data/BR/MG/Várzea da Palma={"id":"data/BR/MG/Várzea da Palma","key":"Várzea da Palma","lang":"pt"}
+data/BR/MG/Wenceslau Braz={"id":"data/BR/MG/Wenceslau Braz","key":"Wenceslau Braz","lang":"pt"}
+data/BR/MG/Água Boa={"id":"data/BR/MG/Água Boa","key":"Água Boa","lang":"pt"}
+data/BR/MG/Água Comprida={"id":"data/BR/MG/Água Comprida","key":"Água Comprida","lang":"pt"}
+data/BR/MG/Águas Formosas={"id":"data/BR/MG/Águas Formosas","key":"Águas Formosas","lang":"pt"}
+data/BR/MG/Águas Vermelhas={"id":"data/BR/MG/Águas Vermelhas","key":"Águas Vermelhas","lang":"pt"}
+data/BR/MS={"id":"data/BR/MS","key":"MS","name":"Mato Grosso do Sul","lang":"pt","zip":"79","zipex":"79000-000,79999-999","sub_keys":"Água Clara~Alcinópolis~Amambai~Anastácio~Anaurilândia~Angelica~Antônio João~Aparecida do Taboado~Aquidauana~Aral Moreira~Bandeirantes~Bataguassu~Bataiporã~Bela Vista~Bodoquena~Bonito~Brasilândia~Caarapó~Camapuã~Campo Grande~Caracol~Cassilândia~Chapadão do Sul~Corguinho~Coronel Sapucaia~Corumbá~Costa Rica~Coxim~Deodápolis~Dois Irmãos do Buriti~Douradina~Dourados~Eldorado~Fátima do Sul~Figueirão~Glória de Dourados~Guia Lopes da Laguna~Iguatemi~Inocencia~Itaporã~Itaquiraí~Ivinhema~Japorã~Jaraguari~Jardim~Jateí~Juti~Ladário~Laguna Carapã~Maracaju~Miranda~Mundo Novo~Naviraí~Nioaque~Nova Alvorada do Sul~Nova Andradina~Novo Horizonte do Sul~Paranaíba~Paranhos~Pedro Gomes~Ponta Porã~Porto Murtinho~Ribas do Rio Pardo~Rio Brilhante~Rio Negro~Rio Verde de Mato Grosso~Rochedo~Santa Rita do Pardo~São Gabriel do Oeste~Selvíria~Sete Quedas~Sidrolândia~Sonora~Tacuru~Taquarussu~Terenos~Três Lagoas~Vicentina"}
+data/BR/MS/Alcinópolis={"id":"data/BR/MS/Alcinópolis","key":"Alcinópolis","lang":"pt"}
+data/BR/MS/Amambai={"id":"data/BR/MS/Amambai","key":"Amambai","lang":"pt"}
+data/BR/MS/Anastácio={"id":"data/BR/MS/Anastácio","key":"Anastácio","lang":"pt"}
+data/BR/MS/Anaurilândia={"id":"data/BR/MS/Anaurilândia","key":"Anaurilândia","lang":"pt"}
+data/BR/MS/Angelica={"id":"data/BR/MS/Angelica","key":"Angelica","lang":"pt"}
+data/BR/MS/Antônio João={"id":"data/BR/MS/Antônio João","key":"Antônio João","lang":"pt"}
+data/BR/MS/Aparecida do Taboado={"id":"data/BR/MS/Aparecida do Taboado","key":"Aparecida do Taboado","lang":"pt"}
+data/BR/MS/Aquidauana={"id":"data/BR/MS/Aquidauana","key":"Aquidauana","lang":"pt"}
+data/BR/MS/Aral Moreira={"id":"data/BR/MS/Aral Moreira","key":"Aral Moreira","lang":"pt"}
+data/BR/MS/Bandeirantes={"id":"data/BR/MS/Bandeirantes","key":"Bandeirantes","lang":"pt"}
+data/BR/MS/Bataguassu={"id":"data/BR/MS/Bataguassu","key":"Bataguassu","lang":"pt"}
+data/BR/MS/Bataiporã={"id":"data/BR/MS/Bataiporã","key":"Bataiporã","lang":"pt"}
+data/BR/MS/Bela Vista={"id":"data/BR/MS/Bela Vista","key":"Bela Vista","lang":"pt"}
+data/BR/MS/Bodoquena={"id":"data/BR/MS/Bodoquena","key":"Bodoquena","lang":"pt"}
+data/BR/MS/Bonito={"id":"data/BR/MS/Bonito","key":"Bonito","lang":"pt"}
+data/BR/MS/Brasilândia={"id":"data/BR/MS/Brasilândia","key":"Brasilândia","lang":"pt"}
+data/BR/MS/Caarapó={"id":"data/BR/MS/Caarapó","key":"Caarapó","lang":"pt"}
+data/BR/MS/Camapuã={"id":"data/BR/MS/Camapuã","key":"Camapuã","lang":"pt"}
+data/BR/MS/Campo Grande={"id":"data/BR/MS/Campo Grande","key":"Campo Grande","lang":"pt"}
+data/BR/MS/Caracol={"id":"data/BR/MS/Caracol","key":"Caracol","lang":"pt"}
+data/BR/MS/Cassilândia={"id":"data/BR/MS/Cassilândia","key":"Cassilândia","lang":"pt"}
+data/BR/MS/Chapadão do Sul={"id":"data/BR/MS/Chapadão do Sul","key":"Chapadão do Sul","lang":"pt"}
+data/BR/MS/Corguinho={"id":"data/BR/MS/Corguinho","key":"Corguinho","lang":"pt"}
+data/BR/MS/Coronel Sapucaia={"id":"data/BR/MS/Coronel Sapucaia","key":"Coronel Sapucaia","lang":"pt"}
+data/BR/MS/Corumbá={"id":"data/BR/MS/Corumbá","key":"Corumbá","lang":"pt"}
+data/BR/MS/Costa Rica={"id":"data/BR/MS/Costa Rica","key":"Costa Rica","lang":"pt"}
+data/BR/MS/Coxim={"id":"data/BR/MS/Coxim","key":"Coxim","lang":"pt"}
+data/BR/MS/Deodápolis={"id":"data/BR/MS/Deodápolis","key":"Deodápolis","lang":"pt"}
+data/BR/MS/Dois Irmãos do Buriti={"id":"data/BR/MS/Dois Irmãos do Buriti","key":"Dois Irmãos do Buriti","lang":"pt"}
+data/BR/MS/Douradina={"id":"data/BR/MS/Douradina","key":"Douradina","lang":"pt"}
+data/BR/MS/Dourados={"id":"data/BR/MS/Dourados","key":"Dourados","lang":"pt"}
+data/BR/MS/Eldorado={"id":"data/BR/MS/Eldorado","key":"Eldorado","lang":"pt"}
+data/BR/MS/Figueirão={"id":"data/BR/MS/Figueirão","key":"Figueirão","lang":"pt"}
+data/BR/MS/Fátima do Sul={"id":"data/BR/MS/Fátima do Sul","key":"Fátima do Sul","lang":"pt"}
+data/BR/MS/Glória de Dourados={"id":"data/BR/MS/Glória de Dourados","key":"Glória de Dourados","lang":"pt"}
+data/BR/MS/Guia Lopes da Laguna={"id":"data/BR/MS/Guia Lopes da Laguna","key":"Guia Lopes da Laguna","lang":"pt"}
+data/BR/MS/Iguatemi={"id":"data/BR/MS/Iguatemi","key":"Iguatemi","lang":"pt"}
+data/BR/MS/Inocencia={"id":"data/BR/MS/Inocencia","key":"Inocencia","lang":"pt"}
+data/BR/MS/Itaporã={"id":"data/BR/MS/Itaporã","key":"Itaporã","lang":"pt"}
+data/BR/MS/Itaquiraí={"id":"data/BR/MS/Itaquiraí","key":"Itaquiraí","lang":"pt"}
+data/BR/MS/Ivinhema={"id":"data/BR/MS/Ivinhema","key":"Ivinhema","lang":"pt"}
+data/BR/MS/Japorã={"id":"data/BR/MS/Japorã","key":"Japorã","lang":"pt"}
+data/BR/MS/Jaraguari={"id":"data/BR/MS/Jaraguari","key":"Jaraguari","lang":"pt"}
+data/BR/MS/Jardim={"id":"data/BR/MS/Jardim","key":"Jardim","lang":"pt"}
+data/BR/MS/Jateí={"id":"data/BR/MS/Jateí","key":"Jateí","lang":"pt"}
+data/BR/MS/Juti={"id":"data/BR/MS/Juti","key":"Juti","lang":"pt"}
+data/BR/MS/Ladário={"id":"data/BR/MS/Ladário","key":"Ladário","lang":"pt"}
+data/BR/MS/Laguna Carapã={"id":"data/BR/MS/Laguna Carapã","key":"Laguna Carapã","lang":"pt"}
+data/BR/MS/Maracaju={"id":"data/BR/MS/Maracaju","key":"Maracaju","lang":"pt"}
+data/BR/MS/Miranda={"id":"data/BR/MS/Miranda","key":"Miranda","lang":"pt"}
+data/BR/MS/Mundo Novo={"id":"data/BR/MS/Mundo Novo","key":"Mundo Novo","lang":"pt"}
+data/BR/MS/Naviraí={"id":"data/BR/MS/Naviraí","key":"Naviraí","lang":"pt"}
+data/BR/MS/Nioaque={"id":"data/BR/MS/Nioaque","key":"Nioaque","lang":"pt"}
+data/BR/MS/Nova Alvorada do Sul={"id":"data/BR/MS/Nova Alvorada do Sul","key":"Nova Alvorada do Sul","lang":"pt"}
+data/BR/MS/Nova Andradina={"id":"data/BR/MS/Nova Andradina","key":"Nova Andradina","lang":"pt"}
+data/BR/MS/Novo Horizonte do Sul={"id":"data/BR/MS/Novo Horizonte do Sul","key":"Novo Horizonte do Sul","lang":"pt"}
+data/BR/MS/Paranaíba={"id":"data/BR/MS/Paranaíba","key":"Paranaíba","lang":"pt"}
+data/BR/MS/Paranhos={"id":"data/BR/MS/Paranhos","key":"Paranhos","lang":"pt"}
+data/BR/MS/Pedro Gomes={"id":"data/BR/MS/Pedro Gomes","key":"Pedro Gomes","lang":"pt"}
+data/BR/MS/Ponta Porã={"id":"data/BR/MS/Ponta Porã","key":"Ponta Porã","lang":"pt"}
+data/BR/MS/Porto Murtinho={"id":"data/BR/MS/Porto Murtinho","key":"Porto Murtinho","lang":"pt"}
+data/BR/MS/Ribas do Rio Pardo={"id":"data/BR/MS/Ribas do Rio Pardo","key":"Ribas do Rio Pardo","lang":"pt"}
+data/BR/MS/Rio Brilhante={"id":"data/BR/MS/Rio Brilhante","key":"Rio Brilhante","lang":"pt"}
+data/BR/MS/Rio Negro={"id":"data/BR/MS/Rio Negro","key":"Rio Negro","lang":"pt"}
+data/BR/MS/Rio Verde de Mato Grosso={"id":"data/BR/MS/Rio Verde de Mato Grosso","key":"Rio Verde de Mato Grosso","lang":"pt"}
+data/BR/MS/Rochedo={"id":"data/BR/MS/Rochedo","key":"Rochedo","lang":"pt"}
+data/BR/MS/Santa Rita do Pardo={"id":"data/BR/MS/Santa Rita do Pardo","key":"Santa Rita do Pardo","lang":"pt"}
+data/BR/MS/Selvíria={"id":"data/BR/MS/Selvíria","key":"Selvíria","lang":"pt"}
+data/BR/MS/Sete Quedas={"id":"data/BR/MS/Sete Quedas","key":"Sete Quedas","lang":"pt"}
+data/BR/MS/Sidrolândia={"id":"data/BR/MS/Sidrolândia","key":"Sidrolândia","lang":"pt"}
+data/BR/MS/Sonora={"id":"data/BR/MS/Sonora","key":"Sonora","lang":"pt"}
+data/BR/MS/São Gabriel do Oeste={"id":"data/BR/MS/São Gabriel do Oeste","key":"São Gabriel do Oeste","lang":"pt"}
+data/BR/MS/Tacuru={"id":"data/BR/MS/Tacuru","key":"Tacuru","lang":"pt"}
+data/BR/MS/Taquarussu={"id":"data/BR/MS/Taquarussu","key":"Taquarussu","lang":"pt"}
+data/BR/MS/Terenos={"id":"data/BR/MS/Terenos","key":"Terenos","lang":"pt"}
+data/BR/MS/Três Lagoas={"id":"data/BR/MS/Três Lagoas","key":"Três Lagoas","lang":"pt"}
+data/BR/MS/Vicentina={"id":"data/BR/MS/Vicentina","key":"Vicentina","lang":"pt"}
+data/BR/MS/Água Clara={"id":"data/BR/MS/Água Clara","key":"Água Clara","lang":"pt"}
+data/BR/MT={"id":"data/BR/MT","key":"MT","name":"Mato Grosso","lang":"pt","zip":"78[0-8]","zipex":"78000-000,78899-999","sub_keys":"Acorizal~Água Boa~Alta Floresta~Alto Araguaia~Alto Boa Vista~Alto Garças~Alto Paraguai~Alto Taquari~Apiacás~Araguaiana~Araguainha~Araputanga~Arenápolis~Aripuana~Barão de Melgaço~Barra do Bugres~Barra do Garças~Bom Jesus do Araguaia~Brasnorte~Cáceres~Campinápolis~Campo Novo do Parecis~Campo Verde~Campos de Júlio~Canabrava do Norte~Canarana~Carlinda~Castanheira~Chapada dos Guimarães~Claudia~Cocalinho~Colíder~Colniza~Comodoro~Confresa~Conquista d'Oeste~Cotriguaçu~Cuiabá~Curvelândia~Denise~Diamantino~Dom Aquino~Feliz Natal~Figueirópolis d'Oeste~Gaúcha do Norte~General Carneiro~Glória d'Oeste~Guaranta do Norte~Guiratinga~Indiavaí~Ipiranga do Norte~Itanhangá~Itaúba~Itiquira~Jaciara~Jangada~Jauru~Juara~Juína~Juruena~Juscimeira~Lambari d'Oeste~Lucas do Rio Verde~Luciára~Marcelândia~Matupá~Mirassol d'Oeste~Nobres~Nortelândia~Nossa Senhora do Livramento~Nova Bandeirantes~Nova Brasilândia~Nova Canaã do Norte~Nova Guarita~Nova Lacerda~Nova Marilândia~Nova Maringá~Nova Monte Verde~Nova Mutum~Nova Nazaré~Nova Olímpia~Nova Santa Helena~Nova Ubiratã~Nova Xavantina~Novo Horizonte do Norte~Novo Mundo~Novo Santo Antônio~Novo São Joaquim~Paranaíta~Paranatinga~Pedra Preta~Peixoto de Azevedo~Planalto da Serra~Poconé~Pontal do Araguaia~Ponte Branca~Pontes e Lacerda~Porto Alegre do Norte~Porto dos Gaúchos~Porto Esperidião~Porto Estrela~Poxoréo~Primavera do Leste~Querência~Reserva do Cabaçal~Ribeirão Cascalheira~Ribeirãozinho~Rio Branco~Rondolândia~Rondonópolis~Rosário Oeste~Salto do Céu~Santa Carmem~Santa Cruz do Xingu~Santa Rita do Trivelato~Santa Terezinha~Santo Afonso~Santo Antônio do Leste~Santo Antônio do Leverger~São Félix do Araguaia~São José do Povo~São José do Rio Claro~São José do Xingu~São José dos Quatro Marcos~São Pedro da Cipa~Sapezal~Serra Nova Dourada~Sinop~Sorriso~Tabaporã~Tangará da Serra~Tapurah~Terra Nova do Norte~Tesouro~Torixoréu~União do Sul~Vale de São Domingos~Várzea Grande~Vera~Vila Bela da Santíssima Trindade~Vila Rica"}
+data/BR/MT/Acorizal={"id":"data/BR/MT/Acorizal","key":"Acorizal","lang":"pt"}
+data/BR/MT/Alta Floresta={"id":"data/BR/MT/Alta Floresta","key":"Alta Floresta","lang":"pt"}
+data/BR/MT/Alto Araguaia={"id":"data/BR/MT/Alto Araguaia","key":"Alto Araguaia","lang":"pt"}
+data/BR/MT/Alto Boa Vista={"id":"data/BR/MT/Alto Boa Vista","key":"Alto Boa Vista","lang":"pt"}
+data/BR/MT/Alto Garças={"id":"data/BR/MT/Alto Garças","key":"Alto Garças","lang":"pt"}
+data/BR/MT/Alto Paraguai={"id":"data/BR/MT/Alto Paraguai","key":"Alto Paraguai","lang":"pt"}
+data/BR/MT/Alto Taquari={"id":"data/BR/MT/Alto Taquari","key":"Alto Taquari","lang":"pt"}
+data/BR/MT/Apiacás={"id":"data/BR/MT/Apiacás","key":"Apiacás","lang":"pt"}
+data/BR/MT/Araguaiana={"id":"data/BR/MT/Araguaiana","key":"Araguaiana","lang":"pt"}
+data/BR/MT/Araguainha={"id":"data/BR/MT/Araguainha","key":"Araguainha","lang":"pt"}
+data/BR/MT/Araputanga={"id":"data/BR/MT/Araputanga","key":"Araputanga","lang":"pt"}
+data/BR/MT/Arenápolis={"id":"data/BR/MT/Arenápolis","key":"Arenápolis","lang":"pt"}
+data/BR/MT/Aripuana={"id":"data/BR/MT/Aripuana","key":"Aripuana","lang":"pt"}
+data/BR/MT/Barra do Bugres={"id":"data/BR/MT/Barra do Bugres","key":"Barra do Bugres","lang":"pt"}
+data/BR/MT/Barra do Garças={"id":"data/BR/MT/Barra do Garças","key":"Barra do Garças","lang":"pt"}
+data/BR/MT/Barão de Melgaço={"id":"data/BR/MT/Barão de Melgaço","key":"Barão de Melgaço","lang":"pt"}
+data/BR/MT/Bom Jesus do Araguaia={"id":"data/BR/MT/Bom Jesus do Araguaia","key":"Bom Jesus do Araguaia","lang":"pt"}
+data/BR/MT/Brasnorte={"id":"data/BR/MT/Brasnorte","key":"Brasnorte","lang":"pt"}
+data/BR/MT/Campinápolis={"id":"data/BR/MT/Campinápolis","key":"Campinápolis","lang":"pt"}
+data/BR/MT/Campo Novo do Parecis={"id":"data/BR/MT/Campo Novo do Parecis","key":"Campo Novo do Parecis","lang":"pt"}
+data/BR/MT/Campo Verde={"id":"data/BR/MT/Campo Verde","key":"Campo Verde","lang":"pt"}
+data/BR/MT/Campos de Júlio={"id":"data/BR/MT/Campos de Júlio","key":"Campos de Júlio","lang":"pt"}
+data/BR/MT/Canabrava do Norte={"id":"data/BR/MT/Canabrava do Norte","key":"Canabrava do Norte","lang":"pt"}
+data/BR/MT/Canarana={"id":"data/BR/MT/Canarana","key":"Canarana","lang":"pt"}
+data/BR/MT/Carlinda={"id":"data/BR/MT/Carlinda","key":"Carlinda","lang":"pt"}
+data/BR/MT/Castanheira={"id":"data/BR/MT/Castanheira","key":"Castanheira","lang":"pt"}
+data/BR/MT/Chapada dos Guimarães={"id":"data/BR/MT/Chapada dos Guimarães","key":"Chapada dos Guimarães","lang":"pt"}
+data/BR/MT/Claudia={"id":"data/BR/MT/Claudia","key":"Claudia","lang":"pt"}
+data/BR/MT/Cocalinho={"id":"data/BR/MT/Cocalinho","key":"Cocalinho","lang":"pt"}
+data/BR/MT/Colniza={"id":"data/BR/MT/Colniza","key":"Colniza","lang":"pt"}
+data/BR/MT/Colíder={"id":"data/BR/MT/Colíder","key":"Colíder","lang":"pt"}
+data/BR/MT/Comodoro={"id":"data/BR/MT/Comodoro","key":"Comodoro","lang":"pt"}
+data/BR/MT/Confresa={"id":"data/BR/MT/Confresa","key":"Confresa","lang":"pt"}
+data/BR/MT/Conquista d'Oeste={"id":"data/BR/MT/Conquista d'Oeste","key":"Conquista d'Oeste","lang":"pt"}
+data/BR/MT/Cotriguaçu={"id":"data/BR/MT/Cotriguaçu","key":"Cotriguaçu","lang":"pt"}
+data/BR/MT/Cuiabá={"id":"data/BR/MT/Cuiabá","key":"Cuiabá","lang":"pt"}
+data/BR/MT/Curvelândia={"id":"data/BR/MT/Curvelândia","key":"Curvelândia","lang":"pt"}
+data/BR/MT/Cáceres={"id":"data/BR/MT/Cáceres","key":"Cáceres","lang":"pt"}
+data/BR/MT/Denise={"id":"data/BR/MT/Denise","key":"Denise","lang":"pt"}
+data/BR/MT/Diamantino={"id":"data/BR/MT/Diamantino","key":"Diamantino","lang":"pt"}
+data/BR/MT/Dom Aquino={"id":"data/BR/MT/Dom Aquino","key":"Dom Aquino","lang":"pt"}
+data/BR/MT/Feliz Natal={"id":"data/BR/MT/Feliz Natal","key":"Feliz Natal","lang":"pt"}
+data/BR/MT/Figueirópolis d'Oeste={"id":"data/BR/MT/Figueirópolis d'Oeste","key":"Figueirópolis d'Oeste","lang":"pt"}
+data/BR/MT/Gaúcha do Norte={"id":"data/BR/MT/Gaúcha do Norte","key":"Gaúcha do Norte","lang":"pt"}
+data/BR/MT/General Carneiro={"id":"data/BR/MT/General Carneiro","key":"General Carneiro","lang":"pt"}
+data/BR/MT/Glória d'Oeste={"id":"data/BR/MT/Glória d'Oeste","key":"Glória d'Oeste","lang":"pt"}
+data/BR/MT/Guaranta do Norte={"id":"data/BR/MT/Guaranta do Norte","key":"Guaranta do Norte","lang":"pt"}
+data/BR/MT/Guiratinga={"id":"data/BR/MT/Guiratinga","key":"Guiratinga","lang":"pt"}
+data/BR/MT/Indiavaí={"id":"data/BR/MT/Indiavaí","key":"Indiavaí","lang":"pt"}
+data/BR/MT/Ipiranga do Norte={"id":"data/BR/MT/Ipiranga do Norte","key":"Ipiranga do Norte","lang":"pt"}
+data/BR/MT/Itanhangá={"id":"data/BR/MT/Itanhangá","key":"Itanhangá","lang":"pt"}
+data/BR/MT/Itaúba={"id":"data/BR/MT/Itaúba","key":"Itaúba","lang":"pt"}
+data/BR/MT/Itiquira={"id":"data/BR/MT/Itiquira","key":"Itiquira","lang":"pt"}
+data/BR/MT/Jaciara={"id":"data/BR/MT/Jaciara","key":"Jaciara","lang":"pt"}
+data/BR/MT/Jangada={"id":"data/BR/MT/Jangada","key":"Jangada","lang":"pt"}
+data/BR/MT/Jauru={"id":"data/BR/MT/Jauru","key":"Jauru","lang":"pt"}
+data/BR/MT/Juara={"id":"data/BR/MT/Juara","key":"Juara","lang":"pt"}
+data/BR/MT/Juruena={"id":"data/BR/MT/Juruena","key":"Juruena","lang":"pt"}
+data/BR/MT/Juscimeira={"id":"data/BR/MT/Juscimeira","key":"Juscimeira","lang":"pt"}
+data/BR/MT/Juína={"id":"data/BR/MT/Juína","key":"Juína","lang":"pt"}
+data/BR/MT/Lambari d'Oeste={"id":"data/BR/MT/Lambari d'Oeste","key":"Lambari d'Oeste","lang":"pt"}
+data/BR/MT/Lucas do Rio Verde={"id":"data/BR/MT/Lucas do Rio Verde","key":"Lucas do Rio Verde","lang":"pt"}
+data/BR/MT/Luciára={"id":"data/BR/MT/Luciára","key":"Luciára","lang":"pt"}
+data/BR/MT/Marcelândia={"id":"data/BR/MT/Marcelândia","key":"Marcelândia","lang":"pt"}
+data/BR/MT/Matupá={"id":"data/BR/MT/Matupá","key":"Matupá","lang":"pt"}
+data/BR/MT/Mirassol d'Oeste={"id":"data/BR/MT/Mirassol d'Oeste","key":"Mirassol d'Oeste","lang":"pt"}
+data/BR/MT/Nobres={"id":"data/BR/MT/Nobres","key":"Nobres","lang":"pt"}
+data/BR/MT/Nortelândia={"id":"data/BR/MT/Nortelândia","key":"Nortelândia","lang":"pt"}
+data/BR/MT/Nossa Senhora do Livramento={"id":"data/BR/MT/Nossa Senhora do Livramento","key":"Nossa Senhora do Livramento","lang":"pt"}
+data/BR/MT/Nova Bandeirantes={"id":"data/BR/MT/Nova Bandeirantes","key":"Nova Bandeirantes","lang":"pt"}
+data/BR/MT/Nova Brasilândia={"id":"data/BR/MT/Nova Brasilândia","key":"Nova Brasilândia","lang":"pt"}
+data/BR/MT/Nova Canaã do Norte={"id":"data/BR/MT/Nova Canaã do Norte","key":"Nova Canaã do Norte","lang":"pt"}
+data/BR/MT/Nova Guarita={"id":"data/BR/MT/Nova Guarita","key":"Nova Guarita","lang":"pt"}
+data/BR/MT/Nova Lacerda={"id":"data/BR/MT/Nova Lacerda","key":"Nova Lacerda","lang":"pt"}
+data/BR/MT/Nova Marilândia={"id":"data/BR/MT/Nova Marilândia","key":"Nova Marilândia","lang":"pt"}
+data/BR/MT/Nova Maringá={"id":"data/BR/MT/Nova Maringá","key":"Nova Maringá","lang":"pt"}
+data/BR/MT/Nova Monte Verde={"id":"data/BR/MT/Nova Monte Verde","key":"Nova Monte Verde","lang":"pt"}
+data/BR/MT/Nova Mutum={"id":"data/BR/MT/Nova Mutum","key":"Nova Mutum","lang":"pt"}
+data/BR/MT/Nova Nazaré={"id":"data/BR/MT/Nova Nazaré","key":"Nova Nazaré","lang":"pt"}
+data/BR/MT/Nova Olímpia={"id":"data/BR/MT/Nova Olímpia","key":"Nova Olímpia","lang":"pt"}
+data/BR/MT/Nova Santa Helena={"id":"data/BR/MT/Nova Santa Helena","key":"Nova Santa Helena","lang":"pt"}
+data/BR/MT/Nova Ubiratã={"id":"data/BR/MT/Nova Ubiratã","key":"Nova Ubiratã","lang":"pt"}
+data/BR/MT/Nova Xavantina={"id":"data/BR/MT/Nova Xavantina","key":"Nova Xavantina","lang":"pt"}
+data/BR/MT/Novo Horizonte do Norte={"id":"data/BR/MT/Novo Horizonte do Norte","key":"Novo Horizonte do Norte","lang":"pt"}
+data/BR/MT/Novo Mundo={"id":"data/BR/MT/Novo Mundo","key":"Novo Mundo","lang":"pt"}
+data/BR/MT/Novo Santo Antônio={"id":"data/BR/MT/Novo Santo Antônio","key":"Novo Santo Antônio","lang":"pt"}
+data/BR/MT/Novo São Joaquim={"id":"data/BR/MT/Novo São Joaquim","key":"Novo São Joaquim","lang":"pt"}
+data/BR/MT/Paranatinga={"id":"data/BR/MT/Paranatinga","key":"Paranatinga","lang":"pt"}
+data/BR/MT/Paranaíta={"id":"data/BR/MT/Paranaíta","key":"Paranaíta","lang":"pt"}
+data/BR/MT/Pedra Preta={"id":"data/BR/MT/Pedra Preta","key":"Pedra Preta","lang":"pt"}
+data/BR/MT/Peixoto de Azevedo={"id":"data/BR/MT/Peixoto de Azevedo","key":"Peixoto de Azevedo","lang":"pt"}
+data/BR/MT/Planalto da Serra={"id":"data/BR/MT/Planalto da Serra","key":"Planalto da Serra","lang":"pt"}
+data/BR/MT/Poconé={"id":"data/BR/MT/Poconé","key":"Poconé","lang":"pt"}
+data/BR/MT/Pontal do Araguaia={"id":"data/BR/MT/Pontal do Araguaia","key":"Pontal do Araguaia","lang":"pt"}
+data/BR/MT/Ponte Branca={"id":"data/BR/MT/Ponte Branca","key":"Ponte Branca","lang":"pt"}
+data/BR/MT/Pontes e Lacerda={"id":"data/BR/MT/Pontes e Lacerda","key":"Pontes e Lacerda","lang":"pt"}
+data/BR/MT/Porto Alegre do Norte={"id":"data/BR/MT/Porto Alegre do Norte","key":"Porto Alegre do Norte","lang":"pt"}
+data/BR/MT/Porto Esperidião={"id":"data/BR/MT/Porto Esperidião","key":"Porto Esperidião","lang":"pt"}
+data/BR/MT/Porto Estrela={"id":"data/BR/MT/Porto Estrela","key":"Porto Estrela","lang":"pt"}
+data/BR/MT/Porto dos Gaúchos={"id":"data/BR/MT/Porto dos Gaúchos","key":"Porto dos Gaúchos","lang":"pt"}
+data/BR/MT/Poxoréo={"id":"data/BR/MT/Poxoréo","key":"Poxoréo","lang":"pt"}
+data/BR/MT/Primavera do Leste={"id":"data/BR/MT/Primavera do Leste","key":"Primavera do Leste","lang":"pt"}
+data/BR/MT/Querência={"id":"data/BR/MT/Querência","key":"Querência","lang":"pt"}
+data/BR/MT/Reserva do Cabaçal={"id":"data/BR/MT/Reserva do Cabaçal","key":"Reserva do Cabaçal","lang":"pt"}
+data/BR/MT/Ribeirão Cascalheira={"id":"data/BR/MT/Ribeirão Cascalheira","key":"Ribeirão Cascalheira","lang":"pt"}
+data/BR/MT/Ribeirãozinho={"id":"data/BR/MT/Ribeirãozinho","key":"Ribeirãozinho","lang":"pt"}
+data/BR/MT/Rio Branco={"id":"data/BR/MT/Rio Branco","key":"Rio Branco","lang":"pt"}
+data/BR/MT/Rondolândia={"id":"data/BR/MT/Rondolândia","key":"Rondolândia","lang":"pt"}
+data/BR/MT/Rondonópolis={"id":"data/BR/MT/Rondonópolis","key":"Rondonópolis","lang":"pt"}
+data/BR/MT/Rosário Oeste={"id":"data/BR/MT/Rosário Oeste","key":"Rosário Oeste","lang":"pt"}
+data/BR/MT/Salto do Céu={"id":"data/BR/MT/Salto do Céu","key":"Salto do Céu","lang":"pt"}
+data/BR/MT/Santa Carmem={"id":"data/BR/MT/Santa Carmem","key":"Santa Carmem","lang":"pt"}
+data/BR/MT/Santa Cruz do Xingu={"id":"data/BR/MT/Santa Cruz do Xingu","key":"Santa Cruz do Xingu","lang":"pt"}
+data/BR/MT/Santa Rita do Trivelato={"id":"data/BR/MT/Santa Rita do Trivelato","key":"Santa Rita do Trivelato","lang":"pt"}
+data/BR/MT/Santa Terezinha={"id":"data/BR/MT/Santa Terezinha","key":"Santa Terezinha","lang":"pt"}
+data/BR/MT/Santo Afonso={"id":"data/BR/MT/Santo Afonso","key":"Santo Afonso","lang":"pt"}
+data/BR/MT/Santo Antônio do Leste={"id":"data/BR/MT/Santo Antônio do Leste","key":"Santo Antônio do Leste","lang":"pt"}
+data/BR/MT/Santo Antônio do Leverger={"id":"data/BR/MT/Santo Antônio do Leverger","key":"Santo Antônio do Leverger","lang":"pt"}
+data/BR/MT/Sapezal={"id":"data/BR/MT/Sapezal","key":"Sapezal","lang":"pt"}
+data/BR/MT/Serra Nova Dourada={"id":"data/BR/MT/Serra Nova Dourada","key":"Serra Nova Dourada","lang":"pt"}
+data/BR/MT/Sinop={"id":"data/BR/MT/Sinop","key":"Sinop","lang":"pt"}
+data/BR/MT/Sorriso={"id":"data/BR/MT/Sorriso","key":"Sorriso","lang":"pt"}
+data/BR/MT/São Félix do Araguaia={"id":"data/BR/MT/São Félix do Araguaia","key":"São Félix do Araguaia","lang":"pt"}
+data/BR/MT/São José do Povo={"id":"data/BR/MT/São José do Povo","key":"São José do Povo","lang":"pt"}
+data/BR/MT/São José do Rio Claro={"id":"data/BR/MT/São José do Rio Claro","key":"São José do Rio Claro","lang":"pt"}
+data/BR/MT/São José do Xingu={"id":"data/BR/MT/São José do Xingu","key":"São José do Xingu","lang":"pt"}
+data/BR/MT/São José dos Quatro Marcos={"id":"data/BR/MT/São José dos Quatro Marcos","key":"São José dos Quatro Marcos","lang":"pt"}
+data/BR/MT/São Pedro da Cipa={"id":"data/BR/MT/São Pedro da Cipa","key":"São Pedro da Cipa","lang":"pt"}
+data/BR/MT/Tabaporã={"id":"data/BR/MT/Tabaporã","key":"Tabaporã","lang":"pt"}
+data/BR/MT/Tangará da Serra={"id":"data/BR/MT/Tangará da Serra","key":"Tangará da Serra","lang":"pt"}
+data/BR/MT/Tapurah={"id":"data/BR/MT/Tapurah","key":"Tapurah","lang":"pt"}
+data/BR/MT/Terra Nova do Norte={"id":"data/BR/MT/Terra Nova do Norte","key":"Terra Nova do Norte","lang":"pt"}
+data/BR/MT/Tesouro={"id":"data/BR/MT/Tesouro","key":"Tesouro","lang":"pt"}
+data/BR/MT/Torixoréu={"id":"data/BR/MT/Torixoréu","key":"Torixoréu","lang":"pt"}
+data/BR/MT/União do Sul={"id":"data/BR/MT/União do Sul","key":"União do Sul","lang":"pt"}
+data/BR/MT/Vale de São Domingos={"id":"data/BR/MT/Vale de São Domingos","key":"Vale de São Domingos","lang":"pt"}
+data/BR/MT/Vera={"id":"data/BR/MT/Vera","key":"Vera","lang":"pt"}
+data/BR/MT/Vila Bela da Santíssima Trindade={"id":"data/BR/MT/Vila Bela da Santíssima Trindade","key":"Vila Bela da Santíssima Trindade","lang":"pt"}
+data/BR/MT/Vila Rica={"id":"data/BR/MT/Vila Rica","key":"Vila Rica","lang":"pt"}
+data/BR/MT/Várzea Grande={"id":"data/BR/MT/Várzea Grande","key":"Várzea Grande","lang":"pt"}
+data/BR/MT/Água Boa={"id":"data/BR/MT/Água Boa","key":"Água Boa","lang":"pt"}
+data/BR/PA={"id":"data/BR/PA","key":"PA","name":"Pará","lang":"pt","zip":"6[6-7]|68[0-8]","zipex":"66000-000,68899-999","sub_keys":"Abaetetuba~Abel Figueiredo~Acará~Afuá~Água Azul do Norte~Alenquer~Almeirim~Altamira~Anajás~Ananindeua~Anapu~Augusto Corrêa~Aurora do Pará~Aveiro~Bagre~Baião~Bannach~Barcarena~Belém~Belterra~Benevides~Bom Jesus do Tocantins~Bonito~Bragança~Brasil Novo~Brejo Grande do Araguaia~Breu Branco~Breves~Bujaru~Cachoeira do Arari~Cachoeira do Piriá~Cameta~Canaã dos Carajás~Capanema~Capitão Poço~Castanhal~Chaves~Colares~Conceição do Araguaia~Concórdia do Pará~Cumaru do Norte~Curionópolis~Curralinho~Curuá~Curuçá~Dom Eliseu~Eldorado dos Carajás~Faro~Floresta do Araguaia~Garrafão do Norte~Goianésia do Pará~Gurupá~Igarapé-Açu~Igarapé-Miri~Inhangapi~Ipixuna do Pará~Irituia~Itaituba~Itupiranga~Jacareacanga~Jacundá~Juruti~Limoeiro do Ajuru~Mãe do Rio~Magalhães Barata~Marabá~Maracanã~Marapanim~Marituba~Medicilândia~Melgaço~Mocajuba~Moju~Monte Alegre~Muaná~Nova Esperança do Piriá~Nova Ipixuna~Nova Timboteua~Novo Progresso~Novo Repartimento~Óbidos~Oeiras do Pará~Oriximiná~Ourém~Ourilândia do Norte~Pacajá~Palestina do Pará~Paragominas~Parauapebas~Pau D'Arco~Peixe-Boi~Piçarra~Placas~Ponta de Pedras~Portel~Porto de Moz~Prainha~Primavera~Quatipuru~Redenção~Rio Maria~Rondon do Pará~Rurópolis~Salinópolis~Salvaterra~Santa Bárbara do Pará~Santa Cruz do Arari~Santa Isabel do Pará~Santa Luzia do Pará~Santa Maria das Barreiras~Santa Maria do Pará~Santana do Araguaia~Santarém~Santarém Novo~Santo Antônio do Tauá~São Caetano de Odivelas~São Domingos do Araguaia~São Domingos do Capim~São Félix do Xingu~São Francisco do Pará~São Geraldo do Araguaia~São João da Ponta~São João de Pirabas~São João do Araguaia~São Miguel do Guamá~São Sebastião da Boa Vista~Sapucaia~Senador José Porfírio~Soure~Tailândia~Terra Alta~Terra Santa~Tomé-Açu~Tracuateua~Trairão~Tucumã~Tucuruí~Ulianópolis~Uruará~Vigia~Viseu~Vitória do Xingu~Xinguara"}
+data/BR/PA/Abaetetuba={"id":"data/BR/PA/Abaetetuba","key":"Abaetetuba","lang":"pt"}
+data/BR/PA/Abel Figueiredo={"id":"data/BR/PA/Abel Figueiredo","key":"Abel Figueiredo","lang":"pt"}
+data/BR/PA/Acará={"id":"data/BR/PA/Acará","key":"Acará","lang":"pt"}
+data/BR/PA/Afuá={"id":"data/BR/PA/Afuá","key":"Afuá","lang":"pt"}
+data/BR/PA/Alenquer={"id":"data/BR/PA/Alenquer","key":"Alenquer","lang":"pt"}
+data/BR/PA/Almeirim={"id":"data/BR/PA/Almeirim","key":"Almeirim","lang":"pt"}
+data/BR/PA/Altamira={"id":"data/BR/PA/Altamira","key":"Altamira","lang":"pt"}
+data/BR/PA/Anajás={"id":"data/BR/PA/Anajás","key":"Anajás","lang":"pt"}
+data/BR/PA/Ananindeua={"id":"data/BR/PA/Ananindeua","key":"Ananindeua","lang":"pt"}
+data/BR/PA/Anapu={"id":"data/BR/PA/Anapu","key":"Anapu","lang":"pt"}
+data/BR/PA/Augusto Corrêa={"id":"data/BR/PA/Augusto Corrêa","key":"Augusto Corrêa","lang":"pt"}
+data/BR/PA/Aurora do Pará={"id":"data/BR/PA/Aurora do Pará","key":"Aurora do Pará","lang":"pt"}
+data/BR/PA/Aveiro={"id":"data/BR/PA/Aveiro","key":"Aveiro","lang":"pt"}
+data/BR/PA/Bagre={"id":"data/BR/PA/Bagre","key":"Bagre","lang":"pt"}
+data/BR/PA/Baião={"id":"data/BR/PA/Baião","key":"Baião","lang":"pt"}
+data/BR/PA/Bannach={"id":"data/BR/PA/Bannach","key":"Bannach","lang":"pt"}
+data/BR/PA/Barcarena={"id":"data/BR/PA/Barcarena","key":"Barcarena","lang":"pt"}
+data/BR/PA/Belterra={"id":"data/BR/PA/Belterra","key":"Belterra","lang":"pt"}
+data/BR/PA/Belém={"id":"data/BR/PA/Belém","key":"Belém","lang":"pt"}
+data/BR/PA/Benevides={"id":"data/BR/PA/Benevides","key":"Benevides","lang":"pt"}
+data/BR/PA/Bom Jesus do Tocantins={"id":"data/BR/PA/Bom Jesus do Tocantins","key":"Bom Jesus do Tocantins","lang":"pt"}
+data/BR/PA/Bonito={"id":"data/BR/PA/Bonito","key":"Bonito","lang":"pt"}
+data/BR/PA/Bragança={"id":"data/BR/PA/Bragança","key":"Bragança","lang":"pt"}
+data/BR/PA/Brasil Novo={"id":"data/BR/PA/Brasil Novo","key":"Brasil Novo","lang":"pt"}
+data/BR/PA/Brejo Grande do Araguaia={"id":"data/BR/PA/Brejo Grande do Araguaia","key":"Brejo Grande do Araguaia","lang":"pt"}
+data/BR/PA/Breu Branco={"id":"data/BR/PA/Breu Branco","key":"Breu Branco","lang":"pt"}
+data/BR/PA/Breves={"id":"data/BR/PA/Breves","key":"Breves","lang":"pt"}
+data/BR/PA/Bujaru={"id":"data/BR/PA/Bujaru","key":"Bujaru","lang":"pt"}
+data/BR/PA/Cachoeira do Arari={"id":"data/BR/PA/Cachoeira do Arari","key":"Cachoeira do Arari","lang":"pt"}
+data/BR/PA/Cachoeira do Piriá={"id":"data/BR/PA/Cachoeira do Piriá","key":"Cachoeira do Piriá","lang":"pt"}
+data/BR/PA/Cameta={"id":"data/BR/PA/Cameta","key":"Cameta","lang":"pt"}
+data/BR/PA/Canaã dos Carajás={"id":"data/BR/PA/Canaã dos Carajás","key":"Canaã dos Carajás","lang":"pt"}
+data/BR/PA/Capanema={"id":"data/BR/PA/Capanema","key":"Capanema","lang":"pt"}
+data/BR/PA/Capitão Poço={"id":"data/BR/PA/Capitão Poço","key":"Capitão Poço","lang":"pt"}
+data/BR/PA/Castanhal={"id":"data/BR/PA/Castanhal","key":"Castanhal","lang":"pt"}
+data/BR/PA/Chaves={"id":"data/BR/PA/Chaves","key":"Chaves","lang":"pt"}
+data/BR/PA/Colares={"id":"data/BR/PA/Colares","key":"Colares","lang":"pt"}
+data/BR/PA/Conceição do Araguaia={"id":"data/BR/PA/Conceição do Araguaia","key":"Conceição do Araguaia","lang":"pt"}
+data/BR/PA/Concórdia do Pará={"id":"data/BR/PA/Concórdia do Pará","key":"Concórdia do Pará","lang":"pt"}
+data/BR/PA/Cumaru do Norte={"id":"data/BR/PA/Cumaru do Norte","key":"Cumaru do Norte","lang":"pt"}
+data/BR/PA/Curionópolis={"id":"data/BR/PA/Curionópolis","key":"Curionópolis","lang":"pt"}
+data/BR/PA/Curralinho={"id":"data/BR/PA/Curralinho","key":"Curralinho","lang":"pt"}
+data/BR/PA/Curuá={"id":"data/BR/PA/Curuá","key":"Curuá","lang":"pt"}
+data/BR/PA/Curuçá={"id":"data/BR/PA/Curuçá","key":"Curuçá","lang":"pt"}
+data/BR/PA/Dom Eliseu={"id":"data/BR/PA/Dom Eliseu","key":"Dom Eliseu","lang":"pt"}
+data/BR/PA/Eldorado dos Carajás={"id":"data/BR/PA/Eldorado dos Carajás","key":"Eldorado dos Carajás","lang":"pt"}
+data/BR/PA/Faro={"id":"data/BR/PA/Faro","key":"Faro","lang":"pt"}
+data/BR/PA/Floresta do Araguaia={"id":"data/BR/PA/Floresta do Araguaia","key":"Floresta do Araguaia","lang":"pt"}
+data/BR/PA/Garrafão do Norte={"id":"data/BR/PA/Garrafão do Norte","key":"Garrafão do Norte","lang":"pt"}
+data/BR/PA/Goianésia do Pará={"id":"data/BR/PA/Goianésia do Pará","key":"Goianésia do Pará","lang":"pt"}
+data/BR/PA/Gurupá={"id":"data/BR/PA/Gurupá","key":"Gurupá","lang":"pt"}
+data/BR/PA/Igarapé-Açu={"id":"data/BR/PA/Igarapé-Açu","key":"Igarapé-Açu","lang":"pt"}
+data/BR/PA/Igarapé-Miri={"id":"data/BR/PA/Igarapé-Miri","key":"Igarapé-Miri","lang":"pt"}
+data/BR/PA/Inhangapi={"id":"data/BR/PA/Inhangapi","key":"Inhangapi","lang":"pt"}
+data/BR/PA/Ipixuna do Pará={"id":"data/BR/PA/Ipixuna do Pará","key":"Ipixuna do Pará","lang":"pt"}
+data/BR/PA/Irituia={"id":"data/BR/PA/Irituia","key":"Irituia","lang":"pt"}
+data/BR/PA/Itaituba={"id":"data/BR/PA/Itaituba","key":"Itaituba","lang":"pt"}
+data/BR/PA/Itupiranga={"id":"data/BR/PA/Itupiranga","key":"Itupiranga","lang":"pt"}
+data/BR/PA/Jacareacanga={"id":"data/BR/PA/Jacareacanga","key":"Jacareacanga","lang":"pt"}
+data/BR/PA/Jacundá={"id":"data/BR/PA/Jacundá","key":"Jacundá","lang":"pt"}
+data/BR/PA/Juruti={"id":"data/BR/PA/Juruti","key":"Juruti","lang":"pt"}
+data/BR/PA/Limoeiro do Ajuru={"id":"data/BR/PA/Limoeiro do Ajuru","key":"Limoeiro do Ajuru","lang":"pt"}
+data/BR/PA/Magalhães Barata={"id":"data/BR/PA/Magalhães Barata","key":"Magalhães Barata","lang":"pt"}
+data/BR/PA/Marabá={"id":"data/BR/PA/Marabá","key":"Marabá","lang":"pt"}
+data/BR/PA/Maracanã={"id":"data/BR/PA/Maracanã","key":"Maracanã","lang":"pt"}
+data/BR/PA/Marapanim={"id":"data/BR/PA/Marapanim","key":"Marapanim","lang":"pt"}
+data/BR/PA/Marituba={"id":"data/BR/PA/Marituba","key":"Marituba","lang":"pt"}
+data/BR/PA/Medicilândia={"id":"data/BR/PA/Medicilândia","key":"Medicilândia","lang":"pt"}
+data/BR/PA/Melgaço={"id":"data/BR/PA/Melgaço","key":"Melgaço","lang":"pt"}
+data/BR/PA/Mocajuba={"id":"data/BR/PA/Mocajuba","key":"Mocajuba","lang":"pt"}
+data/BR/PA/Moju={"id":"data/BR/PA/Moju","key":"Moju","lang":"pt"}
+data/BR/PA/Monte Alegre={"id":"data/BR/PA/Monte Alegre","key":"Monte Alegre","lang":"pt"}
+data/BR/PA/Muaná={"id":"data/BR/PA/Muaná","key":"Muaná","lang":"pt"}
+data/BR/PA/Mãe do Rio={"id":"data/BR/PA/Mãe do Rio","key":"Mãe do Rio","lang":"pt"}
+data/BR/PA/Nova Esperança do Piriá={"id":"data/BR/PA/Nova Esperança do Piriá","key":"Nova Esperança do Piriá","lang":"pt"}
+data/BR/PA/Nova Ipixuna={"id":"data/BR/PA/Nova Ipixuna","key":"Nova Ipixuna","lang":"pt"}
+data/BR/PA/Nova Timboteua={"id":"data/BR/PA/Nova Timboteua","key":"Nova Timboteua","lang":"pt"}
+data/BR/PA/Novo Progresso={"id":"data/BR/PA/Novo Progresso","key":"Novo Progresso","lang":"pt"}
+data/BR/PA/Novo Repartimento={"id":"data/BR/PA/Novo Repartimento","key":"Novo Repartimento","lang":"pt"}
+data/BR/PA/Oeiras do Pará={"id":"data/BR/PA/Oeiras do Pará","key":"Oeiras do Pará","lang":"pt"}
+data/BR/PA/Oriximiná={"id":"data/BR/PA/Oriximiná","key":"Oriximiná","lang":"pt"}
+data/BR/PA/Ourilândia do Norte={"id":"data/BR/PA/Ourilândia do Norte","key":"Ourilândia do Norte","lang":"pt"}
+data/BR/PA/Ourém={"id":"data/BR/PA/Ourém","key":"Ourém","lang":"pt"}
+data/BR/PA/Pacajá={"id":"data/BR/PA/Pacajá","key":"Pacajá","lang":"pt"}
+data/BR/PA/Palestina do Pará={"id":"data/BR/PA/Palestina do Pará","key":"Palestina do Pará","lang":"pt"}
+data/BR/PA/Paragominas={"id":"data/BR/PA/Paragominas","key":"Paragominas","lang":"pt"}
+data/BR/PA/Parauapebas={"id":"data/BR/PA/Parauapebas","key":"Parauapebas","lang":"pt"}
+data/BR/PA/Pau D'Arco={"id":"data/BR/PA/Pau D'Arco","key":"Pau D'Arco","lang":"pt"}
+data/BR/PA/Peixe-Boi={"id":"data/BR/PA/Peixe-Boi","key":"Peixe-Boi","lang":"pt"}
+data/BR/PA/Piçarra={"id":"data/BR/PA/Piçarra","key":"Piçarra","lang":"pt"}
+data/BR/PA/Placas={"id":"data/BR/PA/Placas","key":"Placas","lang":"pt"}
+data/BR/PA/Ponta de Pedras={"id":"data/BR/PA/Ponta de Pedras","key":"Ponta de Pedras","lang":"pt"}
+data/BR/PA/Portel={"id":"data/BR/PA/Portel","key":"Portel","lang":"pt"}
+data/BR/PA/Porto de Moz={"id":"data/BR/PA/Porto de Moz","key":"Porto de Moz","lang":"pt"}
+data/BR/PA/Prainha={"id":"data/BR/PA/Prainha","key":"Prainha","lang":"pt"}
+data/BR/PA/Primavera={"id":"data/BR/PA/Primavera","key":"Primavera","lang":"pt"}
+data/BR/PA/Quatipuru={"id":"data/BR/PA/Quatipuru","key":"Quatipuru","lang":"pt"}
+data/BR/PA/Redenção={"id":"data/BR/PA/Redenção","key":"Redenção","lang":"pt"}
+data/BR/PA/Rio Maria={"id":"data/BR/PA/Rio Maria","key":"Rio Maria","lang":"pt"}
+data/BR/PA/Rondon do Pará={"id":"data/BR/PA/Rondon do Pará","key":"Rondon do Pará","lang":"pt"}
+data/BR/PA/Rurópolis={"id":"data/BR/PA/Rurópolis","key":"Rurópolis","lang":"pt"}
+data/BR/PA/Salinópolis={"id":"data/BR/PA/Salinópolis","key":"Salinópolis","lang":"pt"}
+data/BR/PA/Salvaterra={"id":"data/BR/PA/Salvaterra","key":"Salvaterra","lang":"pt"}
+data/BR/PA/Santa Bárbara do Pará={"id":"data/BR/PA/Santa Bárbara do Pará","key":"Santa Bárbara do Pará","lang":"pt"}
+data/BR/PA/Santa Cruz do Arari={"id":"data/BR/PA/Santa Cruz do Arari","key":"Santa Cruz do Arari","lang":"pt"}
+data/BR/PA/Santa Isabel do Pará={"id":"data/BR/PA/Santa Isabel do Pará","key":"Santa Isabel do Pará","lang":"pt"}
+data/BR/PA/Santa Luzia do Pará={"id":"data/BR/PA/Santa Luzia do Pará","key":"Santa Luzia do Pará","lang":"pt"}
+data/BR/PA/Santa Maria das Barreiras={"id":"data/BR/PA/Santa Maria das Barreiras","key":"Santa Maria das Barreiras","lang":"pt"}
+data/BR/PA/Santa Maria do Pará={"id":"data/BR/PA/Santa Maria do Pará","key":"Santa Maria do Pará","lang":"pt"}
+data/BR/PA/Santana do Araguaia={"id":"data/BR/PA/Santana do Araguaia","key":"Santana do Araguaia","lang":"pt"}
+data/BR/PA/Santarém={"id":"data/BR/PA/Santarém","key":"Santarém","lang":"pt"}
+data/BR/PA/Santarém Novo={"id":"data/BR/PA/Santarém Novo","key":"Santarém Novo","lang":"pt"}
+data/BR/PA/Santo Antônio do Tauá={"id":"data/BR/PA/Santo Antônio do Tauá","key":"Santo Antônio do Tauá","lang":"pt"}
+data/BR/PA/Sapucaia={"id":"data/BR/PA/Sapucaia","key":"Sapucaia","lang":"pt"}
+data/BR/PA/Senador José Porfírio={"id":"data/BR/PA/Senador José Porfírio","key":"Senador José Porfírio","lang":"pt"}
+data/BR/PA/Soure={"id":"data/BR/PA/Soure","key":"Soure","lang":"pt"}
+data/BR/PA/São Caetano de Odivelas={"id":"data/BR/PA/São Caetano de Odivelas","key":"São Caetano de Odivelas","lang":"pt"}
+data/BR/PA/São Domingos do Araguaia={"id":"data/BR/PA/São Domingos do Araguaia","key":"São Domingos do Araguaia","lang":"pt"}
+data/BR/PA/São Domingos do Capim={"id":"data/BR/PA/São Domingos do Capim","key":"São Domingos do Capim","lang":"pt"}
+data/BR/PA/São Francisco do Pará={"id":"data/BR/PA/São Francisco do Pará","key":"São Francisco do Pará","lang":"pt"}
+data/BR/PA/São Félix do Xingu={"id":"data/BR/PA/São Félix do Xingu","key":"São Félix do Xingu","lang":"pt"}
+data/BR/PA/São Geraldo do Araguaia={"id":"data/BR/PA/São Geraldo do Araguaia","key":"São Geraldo do Araguaia","lang":"pt"}
+data/BR/PA/São João da Ponta={"id":"data/BR/PA/São João da Ponta","key":"São João da Ponta","lang":"pt"}
+data/BR/PA/São João de Pirabas={"id":"data/BR/PA/São João de Pirabas","key":"São João de Pirabas","lang":"pt"}
+data/BR/PA/São João do Araguaia={"id":"data/BR/PA/São João do Araguaia","key":"São João do Araguaia","lang":"pt"}
+data/BR/PA/São Miguel do Guamá={"id":"data/BR/PA/São Miguel do Guamá","key":"São Miguel do Guamá","lang":"pt"}
+data/BR/PA/São Sebastião da Boa Vista={"id":"data/BR/PA/São Sebastião da Boa Vista","key":"São Sebastião da Boa Vista","lang":"pt"}
+data/BR/PA/Tailândia={"id":"data/BR/PA/Tailândia","key":"Tailândia","lang":"pt"}
+data/BR/PA/Terra Alta={"id":"data/BR/PA/Terra Alta","key":"Terra Alta","lang":"pt"}
+data/BR/PA/Terra Santa={"id":"data/BR/PA/Terra Santa","key":"Terra Santa","lang":"pt"}
+data/BR/PA/Tomé-Açu={"id":"data/BR/PA/Tomé-Açu","key":"Tomé-Açu","lang":"pt"}
+data/BR/PA/Tracuateua={"id":"data/BR/PA/Tracuateua","key":"Tracuateua","lang":"pt"}
+data/BR/PA/Trairão={"id":"data/BR/PA/Trairão","key":"Trairão","lang":"pt"}
+data/BR/PA/Tucumã={"id":"data/BR/PA/Tucumã","key":"Tucumã","lang":"pt"}
+data/BR/PA/Tucuruí={"id":"data/BR/PA/Tucuruí","key":"Tucuruí","lang":"pt"}
+data/BR/PA/Ulianópolis={"id":"data/BR/PA/Ulianópolis","key":"Ulianópolis","lang":"pt"}
+data/BR/PA/Uruará={"id":"data/BR/PA/Uruará","key":"Uruará","lang":"pt"}
+data/BR/PA/Vigia={"id":"data/BR/PA/Vigia","key":"Vigia","lang":"pt"}
+data/BR/PA/Viseu={"id":"data/BR/PA/Viseu","key":"Viseu","lang":"pt"}
+data/BR/PA/Vitória do Xingu={"id":"data/BR/PA/Vitória do Xingu","key":"Vitória do Xingu","lang":"pt"}
+data/BR/PA/Xinguara={"id":"data/BR/PA/Xinguara","key":"Xinguara","lang":"pt"}
+data/BR/PA/Água Azul do Norte={"id":"data/BR/PA/Água Azul do Norte","key":"Água Azul do Norte","lang":"pt"}
+data/BR/PA/Óbidos={"id":"data/BR/PA/Óbidos","key":"Óbidos","lang":"pt"}
+data/BR/PB={"id":"data/BR/PB","key":"PB","name":"Paraíba","lang":"pt","zip":"58","zipex":"58000-000,58999-999","sub_keys":"Água Branca~Aguiar~Alagoa Grande~Alagoa Nova~Alagoinha~Alcantil~Algodão de Jandaíra~Alhandra~Amparo~Aparecida~Araçagi~Arará~Araruna~Areia~Areia de Baraúnas~Areial~Aroeiras~Assunção~Baía da Traição~Bananeiras~Baraúna~Barra de Santa Rosa~Barra de Santana~Barra de São Miguel~Bayeux~Belém~Belém do Brejo do Cruz~Bernardino Batista~Boa Ventura~Boa Vista~Bom Jesus~Bom Sucesso~Bonito de Santa Fé~Boqueirão~Borborema~Brejo do Cruz~Brejo dos Santos~Caaporã~Cabaceiras~Cabedelo~Cachoeira dos Índios~Cacimba de Areia~Cacimba de Dentro~Cacimbas~Caiçara~Cajazeiras~Cajazeirinhas~Caldas Brandão~Camalaú~Campina Grande~Campo de Santana~Capim~Caraúbas~Carrapateira~Casserengue~Catingueira~Catolé do Rocha~Caturité~Conceição~Condado~Conde~Congo~Coremas~Coxixola~Cruz do Espírito Santo~Cubati~Cuité~Cuité de Mamanguape~Cuitegi~Curral de Cima~Curral Velho~Damião~Desterro~Diamante~Dona Inês~Duas Estradas~Emas~Esperança~Fagundes~Frei Martinho~Gado Bravo~Guarabira~Gurinhém~Gurjão~Ibiara~Igaracy~Imaculada~Inga~Itabaiana~Itaporanga~Itapororoca~Itatuba~Jacaraú~Jerico~João Pessoa~Juarez Távora~Juazeirinho~Junco do Seridó~Juripiranga~Juru~Lagoa~Lagoa de Dentro~Lagoa Seca~Lastro~Livramento~Logradouro~Lucena~Mãe d'água~Malta~Mamanguape~Manaíra~Marcação~Mari~Marizópolis~Massaranduba~Mataraca~Matinhas~Mato Grosso~Maturéia~Mogeiro~Montadas~Monte Horebe~Monteiro~Mulungú~Natuba~Nazarezinho~Nova Floresta~Nova Olinda~Nova Palmeira~Olho d'Água~Olivedos~Ouro Velho~Parari~Passagem~Patos~Paulista~Pedra Branca~Pedra Lavrada~Pedras de Fogo~Pedro Régis~Piancó~Picuí~Pilar~Pilões~Pilõezinhos~Pirpirituba~Pitimbu~Pocinhos~Poço Dantas~Poço de José de Moura~Pombal~Prata~Princesa Isabel~Puxinanã~Queimadas~Quixaba~Remígio~Riachão~Riachão do Bacamarte~Riachão do Poço~Riacho de Santo Antônio~Riacho dos Cavalos~Rio Tinto~Salgadinho~Salgado de São Félix~Santa Cecília~Santa Cruz~Santa Helena~Santa Inês~Santa Luzia~Santa Rita~Santa Teresinha~Santana de Mangueira~Santana dos Garrotes~Santarém~Santo André~São Bentinho~São Bento~São Domingos de Pombal~São Domingos do Cariri~São Francisco~São João do Cariri~São João do Rio do Peixe~São João do Tigre~São José da Lagoa Tapada~São José de Caiana~São José de Espinharas~São José de Piranhas~São José de Princesa~São José do Bonfim~São José do Brejo do Cruz~São José do Sabugi~São José dos Cordeiros~São José dos Ramos~São Mamede~São Miguel de Taipu~São Sebastião de Lagoa de Roça~São Sebastião do Umbuzeiro~Sāpe~Seridó~Serra Branca~Serra da Raiz~Serra Grande~Serra Redonda~Serraria~Sertãozinho~Sobrado~Solânea~Soledade~Sossego~Sousa~Sumé~Taperoá~Tavares~Teixeira~Tenório~Triunfo~Uiraúna~Umbuzeiro~Várzea~Vieirópolis~Vista Serrana~Zabelê"}
+data/BR/PB/Aguiar={"id":"data/BR/PB/Aguiar","key":"Aguiar","lang":"pt"}
+data/BR/PB/Alagoa Grande={"id":"data/BR/PB/Alagoa Grande","key":"Alagoa Grande","lang":"pt"}
+data/BR/PB/Alagoa Nova={"id":"data/BR/PB/Alagoa Nova","key":"Alagoa Nova","lang":"pt"}
+data/BR/PB/Alagoinha={"id":"data/BR/PB/Alagoinha","key":"Alagoinha","lang":"pt"}
+data/BR/PB/Alcantil={"id":"data/BR/PB/Alcantil","key":"Alcantil","lang":"pt"}
+data/BR/PB/Algodão de Jandaíra={"id":"data/BR/PB/Algodão de Jandaíra","key":"Algodão de Jandaíra","lang":"pt"}
+data/BR/PB/Alhandra={"id":"data/BR/PB/Alhandra","key":"Alhandra","lang":"pt"}
+data/BR/PB/Amparo={"id":"data/BR/PB/Amparo","key":"Amparo","lang":"pt"}
+data/BR/PB/Aparecida={"id":"data/BR/PB/Aparecida","key":"Aparecida","lang":"pt"}
+data/BR/PB/Araruna={"id":"data/BR/PB/Araruna","key":"Araruna","lang":"pt"}
+data/BR/PB/Arará={"id":"data/BR/PB/Arará","key":"Arará","lang":"pt"}
+data/BR/PB/Araçagi={"id":"data/BR/PB/Araçagi","key":"Araçagi","lang":"pt"}
+data/BR/PB/Areia={"id":"data/BR/PB/Areia","key":"Areia","lang":"pt"}
+data/BR/PB/Areia de Baraúnas={"id":"data/BR/PB/Areia de Baraúnas","key":"Areia de Baraúnas","lang":"pt"}
+data/BR/PB/Areial={"id":"data/BR/PB/Areial","key":"Areial","lang":"pt"}
+data/BR/PB/Aroeiras={"id":"data/BR/PB/Aroeiras","key":"Aroeiras","lang":"pt"}
+data/BR/PB/Assunção={"id":"data/BR/PB/Assunção","key":"Assunção","lang":"pt"}
+data/BR/PB/Bananeiras={"id":"data/BR/PB/Bananeiras","key":"Bananeiras","lang":"pt"}
+data/BR/PB/Baraúna={"id":"data/BR/PB/Baraúna","key":"Baraúna","lang":"pt"}
+data/BR/PB/Barra de Santa Rosa={"id":"data/BR/PB/Barra de Santa Rosa","key":"Barra de Santa Rosa","lang":"pt"}
+data/BR/PB/Barra de Santana={"id":"data/BR/PB/Barra de Santana","key":"Barra de Santana","lang":"pt"}
+data/BR/PB/Barra de São Miguel={"id":"data/BR/PB/Barra de São Miguel","key":"Barra de São Miguel","lang":"pt"}
+data/BR/PB/Bayeux={"id":"data/BR/PB/Bayeux","key":"Bayeux","lang":"pt"}
+data/BR/PB/Baía da Traição={"id":"data/BR/PB/Baía da Traição","key":"Baía da Traição","lang":"pt"}
+data/BR/PB/Belém={"id":"data/BR/PB/Belém","key":"Belém","lang":"pt"}
+data/BR/PB/Belém do Brejo do Cruz={"id":"data/BR/PB/Belém do Brejo do Cruz","key":"Belém do Brejo do Cruz","lang":"pt"}
+data/BR/PB/Bernardino Batista={"id":"data/BR/PB/Bernardino Batista","key":"Bernardino Batista","lang":"pt"}
+data/BR/PB/Boa Ventura={"id":"data/BR/PB/Boa Ventura","key":"Boa Ventura","lang":"pt"}
+data/BR/PB/Boa Vista={"id":"data/BR/PB/Boa Vista","key":"Boa Vista","lang":"pt"}
+data/BR/PB/Bom Jesus={"id":"data/BR/PB/Bom Jesus","key":"Bom Jesus","lang":"pt"}
+data/BR/PB/Bom Sucesso={"id":"data/BR/PB/Bom Sucesso","key":"Bom Sucesso","lang":"pt"}
+data/BR/PB/Bonito de Santa Fé={"id":"data/BR/PB/Bonito de Santa Fé","key":"Bonito de Santa Fé","lang":"pt"}
+data/BR/PB/Boqueirão={"id":"data/BR/PB/Boqueirão","key":"Boqueirão","lang":"pt"}
+data/BR/PB/Borborema={"id":"data/BR/PB/Borborema","key":"Borborema","lang":"pt"}
+data/BR/PB/Brejo do Cruz={"id":"data/BR/PB/Brejo do Cruz","key":"Brejo do Cruz","lang":"pt"}
+data/BR/PB/Brejo dos Santos={"id":"data/BR/PB/Brejo dos Santos","key":"Brejo dos Santos","lang":"pt"}
+data/BR/PB/Caaporã={"id":"data/BR/PB/Caaporã","key":"Caaporã","lang":"pt"}
+data/BR/PB/Cabaceiras={"id":"data/BR/PB/Cabaceiras","key":"Cabaceiras","lang":"pt"}
+data/BR/PB/Cabedelo={"id":"data/BR/PB/Cabedelo","key":"Cabedelo","lang":"pt"}
+data/BR/PB/Cachoeira dos Índios={"id":"data/BR/PB/Cachoeira dos Índios","key":"Cachoeira dos Índios","lang":"pt"}
+data/BR/PB/Cacimba de Areia={"id":"data/BR/PB/Cacimba de Areia","key":"Cacimba de Areia","lang":"pt"}
+data/BR/PB/Cacimba de Dentro={"id":"data/BR/PB/Cacimba de Dentro","key":"Cacimba de Dentro","lang":"pt"}
+data/BR/PB/Cacimbas={"id":"data/BR/PB/Cacimbas","key":"Cacimbas","lang":"pt"}
+data/BR/PB/Caiçara={"id":"data/BR/PB/Caiçara","key":"Caiçara","lang":"pt"}
+data/BR/PB/Cajazeiras={"id":"data/BR/PB/Cajazeiras","key":"Cajazeiras","lang":"pt"}
+data/BR/PB/Cajazeirinhas={"id":"data/BR/PB/Cajazeirinhas","key":"Cajazeirinhas","lang":"pt"}
+data/BR/PB/Caldas Brandão={"id":"data/BR/PB/Caldas Brandão","key":"Caldas Brandão","lang":"pt"}
+data/BR/PB/Camalaú={"id":"data/BR/PB/Camalaú","key":"Camalaú","lang":"pt"}
+data/BR/PB/Campina Grande={"id":"data/BR/PB/Campina Grande","key":"Campina Grande","lang":"pt"}
+data/BR/PB/Campo de Santana={"id":"data/BR/PB/Campo de Santana","key":"Campo de Santana","lang":"pt"}
+data/BR/PB/Capim={"id":"data/BR/PB/Capim","key":"Capim","lang":"pt"}
+data/BR/PB/Caraúbas={"id":"data/BR/PB/Caraúbas","key":"Caraúbas","lang":"pt"}
+data/BR/PB/Carrapateira={"id":"data/BR/PB/Carrapateira","key":"Carrapateira","lang":"pt"}
+data/BR/PB/Casserengue={"id":"data/BR/PB/Casserengue","key":"Casserengue","lang":"pt"}
+data/BR/PB/Catingueira={"id":"data/BR/PB/Catingueira","key":"Catingueira","lang":"pt"}
+data/BR/PB/Catolé do Rocha={"id":"data/BR/PB/Catolé do Rocha","key":"Catolé do Rocha","lang":"pt"}
+data/BR/PB/Caturité={"id":"data/BR/PB/Caturité","key":"Caturité","lang":"pt"}
+data/BR/PB/Conceição={"id":"data/BR/PB/Conceição","key":"Conceição","lang":"pt"}
+data/BR/PB/Condado={"id":"data/BR/PB/Condado","key":"Condado","lang":"pt"}
+data/BR/PB/Conde={"id":"data/BR/PB/Conde","key":"Conde","lang":"pt"}
+data/BR/PB/Congo={"id":"data/BR/PB/Congo","key":"Congo","lang":"pt"}
+data/BR/PB/Coremas={"id":"data/BR/PB/Coremas","key":"Coremas","lang":"pt"}
+data/BR/PB/Coxixola={"id":"data/BR/PB/Coxixola","key":"Coxixola","lang":"pt"}
+data/BR/PB/Cruz do Espírito Santo={"id":"data/BR/PB/Cruz do Espírito Santo","key":"Cruz do Espírito Santo","lang":"pt"}
+data/BR/PB/Cubati={"id":"data/BR/PB/Cubati","key":"Cubati","lang":"pt"}
+data/BR/PB/Cuitegi={"id":"data/BR/PB/Cuitegi","key":"Cuitegi","lang":"pt"}
+data/BR/PB/Cuité={"id":"data/BR/PB/Cuité","key":"Cuité","lang":"pt"}
+data/BR/PB/Cuité de Mamanguape={"id":"data/BR/PB/Cuité de Mamanguape","key":"Cuité de Mamanguape","lang":"pt"}
+data/BR/PB/Curral Velho={"id":"data/BR/PB/Curral Velho","key":"Curral Velho","lang":"pt"}
+data/BR/PB/Curral de Cima={"id":"data/BR/PB/Curral de Cima","key":"Curral de Cima","lang":"pt"}
+data/BR/PB/Damião={"id":"data/BR/PB/Damião","key":"Damião","lang":"pt"}
+data/BR/PB/Desterro={"id":"data/BR/PB/Desterro","key":"Desterro","lang":"pt"}
+data/BR/PB/Diamante={"id":"data/BR/PB/Diamante","key":"Diamante","lang":"pt"}
+data/BR/PB/Dona Inês={"id":"data/BR/PB/Dona Inês","key":"Dona Inês","lang":"pt"}
+data/BR/PB/Duas Estradas={"id":"data/BR/PB/Duas Estradas","key":"Duas Estradas","lang":"pt"}
+data/BR/PB/Emas={"id":"data/BR/PB/Emas","key":"Emas","lang":"pt"}
+data/BR/PB/Esperança={"id":"data/BR/PB/Esperança","key":"Esperança","lang":"pt"}
+data/BR/PB/Fagundes={"id":"data/BR/PB/Fagundes","key":"Fagundes","lang":"pt"}
+data/BR/PB/Frei Martinho={"id":"data/BR/PB/Frei Martinho","key":"Frei Martinho","lang":"pt"}
+data/BR/PB/Gado Bravo={"id":"data/BR/PB/Gado Bravo","key":"Gado Bravo","lang":"pt"}
+data/BR/PB/Guarabira={"id":"data/BR/PB/Guarabira","key":"Guarabira","lang":"pt"}
+data/BR/PB/Gurinhém={"id":"data/BR/PB/Gurinhém","key":"Gurinhém","lang":"pt"}
+data/BR/PB/Gurjão={"id":"data/BR/PB/Gurjão","key":"Gurjão","lang":"pt"}
+data/BR/PB/Ibiara={"id":"data/BR/PB/Ibiara","key":"Ibiara","lang":"pt"}
+data/BR/PB/Igaracy={"id":"data/BR/PB/Igaracy","key":"Igaracy","lang":"pt"}
+data/BR/PB/Imaculada={"id":"data/BR/PB/Imaculada","key":"Imaculada","lang":"pt"}
+data/BR/PB/Inga={"id":"data/BR/PB/Inga","key":"Inga","lang":"pt"}
+data/BR/PB/Itabaiana={"id":"data/BR/PB/Itabaiana","key":"Itabaiana","lang":"pt"}
+data/BR/PB/Itaporanga={"id":"data/BR/PB/Itaporanga","key":"Itaporanga","lang":"pt"}
+data/BR/PB/Itapororoca={"id":"data/BR/PB/Itapororoca","key":"Itapororoca","lang":"pt"}
+data/BR/PB/Itatuba={"id":"data/BR/PB/Itatuba","key":"Itatuba","lang":"pt"}
+data/BR/PB/Jacaraú={"id":"data/BR/PB/Jacaraú","key":"Jacaraú","lang":"pt"}
+data/BR/PB/Jerico={"id":"data/BR/PB/Jerico","key":"Jerico","lang":"pt"}
+data/BR/PB/João Pessoa={"id":"data/BR/PB/João Pessoa","key":"João Pessoa","lang":"pt"}
+data/BR/PB/Juarez Távora={"id":"data/BR/PB/Juarez Távora","key":"Juarez Távora","lang":"pt"}
+data/BR/PB/Juazeirinho={"id":"data/BR/PB/Juazeirinho","key":"Juazeirinho","lang":"pt"}
+data/BR/PB/Junco do Seridó={"id":"data/BR/PB/Junco do Seridó","key":"Junco do Seridó","lang":"pt"}
+data/BR/PB/Juripiranga={"id":"data/BR/PB/Juripiranga","key":"Juripiranga","lang":"pt"}
+data/BR/PB/Juru={"id":"data/BR/PB/Juru","key":"Juru","lang":"pt"}
+data/BR/PB/Lagoa={"id":"data/BR/PB/Lagoa","key":"Lagoa","lang":"pt"}
+data/BR/PB/Lagoa Seca={"id":"data/BR/PB/Lagoa Seca","key":"Lagoa Seca","lang":"pt"}
+data/BR/PB/Lagoa de Dentro={"id":"data/BR/PB/Lagoa de Dentro","key":"Lagoa de Dentro","lang":"pt"}
+data/BR/PB/Lastro={"id":"data/BR/PB/Lastro","key":"Lastro","lang":"pt"}
+data/BR/PB/Livramento={"id":"data/BR/PB/Livramento","key":"Livramento","lang":"pt"}
+data/BR/PB/Logradouro={"id":"data/BR/PB/Logradouro","key":"Logradouro","lang":"pt"}
+data/BR/PB/Lucena={"id":"data/BR/PB/Lucena","key":"Lucena","lang":"pt"}
+data/BR/PB/Malta={"id":"data/BR/PB/Malta","key":"Malta","lang":"pt"}
+data/BR/PB/Mamanguape={"id":"data/BR/PB/Mamanguape","key":"Mamanguape","lang":"pt"}
+data/BR/PB/Manaíra={"id":"data/BR/PB/Manaíra","key":"Manaíra","lang":"pt"}
+data/BR/PB/Marcação={"id":"data/BR/PB/Marcação","key":"Marcação","lang":"pt"}
+data/BR/PB/Mari={"id":"data/BR/PB/Mari","key":"Mari","lang":"pt"}
+data/BR/PB/Marizópolis={"id":"data/BR/PB/Marizópolis","key":"Marizópolis","lang":"pt"}
+data/BR/PB/Massaranduba={"id":"data/BR/PB/Massaranduba","key":"Massaranduba","lang":"pt"}
+data/BR/PB/Mataraca={"id":"data/BR/PB/Mataraca","key":"Mataraca","lang":"pt"}
+data/BR/PB/Matinhas={"id":"data/BR/PB/Matinhas","key":"Matinhas","lang":"pt"}
+data/BR/PB/Mato Grosso={"id":"data/BR/PB/Mato Grosso","key":"Mato Grosso","lang":"pt"}
+data/BR/PB/Maturéia={"id":"data/BR/PB/Maturéia","key":"Maturéia","lang":"pt"}
+data/BR/PB/Mogeiro={"id":"data/BR/PB/Mogeiro","key":"Mogeiro","lang":"pt"}
+data/BR/PB/Montadas={"id":"data/BR/PB/Montadas","key":"Montadas","lang":"pt"}
+data/BR/PB/Monte Horebe={"id":"data/BR/PB/Monte Horebe","key":"Monte Horebe","lang":"pt"}
+data/BR/PB/Monteiro={"id":"data/BR/PB/Monteiro","key":"Monteiro","lang":"pt"}
+data/BR/PB/Mulungú={"id":"data/BR/PB/Mulungú","key":"Mulungú","lang":"pt"}
+data/BR/PB/Mãe d'água={"id":"data/BR/PB/Mãe d'água","key":"Mãe d'água","lang":"pt"}
+data/BR/PB/Natuba={"id":"data/BR/PB/Natuba","key":"Natuba","lang":"pt"}
+data/BR/PB/Nazarezinho={"id":"data/BR/PB/Nazarezinho","key":"Nazarezinho","lang":"pt"}
+data/BR/PB/Nova Floresta={"id":"data/BR/PB/Nova Floresta","key":"Nova Floresta","lang":"pt"}
+data/BR/PB/Nova Olinda={"id":"data/BR/PB/Nova Olinda","key":"Nova Olinda","lang":"pt"}
+data/BR/PB/Nova Palmeira={"id":"data/BR/PB/Nova Palmeira","key":"Nova Palmeira","lang":"pt"}
+data/BR/PB/Olho d'Água={"id":"data/BR/PB/Olho d'Água","key":"Olho d'Água","lang":"pt"}
+data/BR/PB/Olivedos={"id":"data/BR/PB/Olivedos","key":"Olivedos","lang":"pt"}
+data/BR/PB/Ouro Velho={"id":"data/BR/PB/Ouro Velho","key":"Ouro Velho","lang":"pt"}
+data/BR/PB/Parari={"id":"data/BR/PB/Parari","key":"Parari","lang":"pt"}
+data/BR/PB/Passagem={"id":"data/BR/PB/Passagem","key":"Passagem","lang":"pt"}
+data/BR/PB/Patos={"id":"data/BR/PB/Patos","key":"Patos","lang":"pt"}
+data/BR/PB/Paulista={"id":"data/BR/PB/Paulista","key":"Paulista","lang":"pt"}
+data/BR/PB/Pedra Branca={"id":"data/BR/PB/Pedra Branca","key":"Pedra Branca","lang":"pt"}
+data/BR/PB/Pedra Lavrada={"id":"data/BR/PB/Pedra Lavrada","key":"Pedra Lavrada","lang":"pt"}
+data/BR/PB/Pedras de Fogo={"id":"data/BR/PB/Pedras de Fogo","key":"Pedras de Fogo","lang":"pt"}
+data/BR/PB/Pedro Régis={"id":"data/BR/PB/Pedro Régis","key":"Pedro Régis","lang":"pt"}
+data/BR/PB/Piancó={"id":"data/BR/PB/Piancó","key":"Piancó","lang":"pt"}
+data/BR/PB/Picuí={"id":"data/BR/PB/Picuí","key":"Picuí","lang":"pt"}
+data/BR/PB/Pilar={"id":"data/BR/PB/Pilar","key":"Pilar","lang":"pt"}
+data/BR/PB/Pilões={"id":"data/BR/PB/Pilões","key":"Pilões","lang":"pt"}
+data/BR/PB/Pilõezinhos={"id":"data/BR/PB/Pilõezinhos","key":"Pilõezinhos","lang":"pt"}
+data/BR/PB/Pirpirituba={"id":"data/BR/PB/Pirpirituba","key":"Pirpirituba","lang":"pt"}
+data/BR/PB/Pitimbu={"id":"data/BR/PB/Pitimbu","key":"Pitimbu","lang":"pt"}
+data/BR/PB/Pocinhos={"id":"data/BR/PB/Pocinhos","key":"Pocinhos","lang":"pt"}
+data/BR/PB/Pombal={"id":"data/BR/PB/Pombal","key":"Pombal","lang":"pt"}
+data/BR/PB/Poço Dantas={"id":"data/BR/PB/Poço Dantas","key":"Poço Dantas","lang":"pt"}
+data/BR/PB/Poço de José de Moura={"id":"data/BR/PB/Poço de José de Moura","key":"Poço de José de Moura","lang":"pt"}
+data/BR/PB/Prata={"id":"data/BR/PB/Prata","key":"Prata","lang":"pt"}
+data/BR/PB/Princesa Isabel={"id":"data/BR/PB/Princesa Isabel","key":"Princesa Isabel","lang":"pt"}
+data/BR/PB/Puxinanã={"id":"data/BR/PB/Puxinanã","key":"Puxinanã","lang":"pt"}
+data/BR/PB/Queimadas={"id":"data/BR/PB/Queimadas","key":"Queimadas","lang":"pt"}
+data/BR/PB/Quixaba={"id":"data/BR/PB/Quixaba","key":"Quixaba","lang":"pt"}
+data/BR/PB/Remígio={"id":"data/BR/PB/Remígio","key":"Remígio","lang":"pt"}
+data/BR/PB/Riacho de Santo Antônio={"id":"data/BR/PB/Riacho de Santo Antônio","key":"Riacho de Santo Antônio","lang":"pt"}
+data/BR/PB/Riacho dos Cavalos={"id":"data/BR/PB/Riacho dos Cavalos","key":"Riacho dos Cavalos","lang":"pt"}
+data/BR/PB/Riachão={"id":"data/BR/PB/Riachão","key":"Riachão","lang":"pt"}
+data/BR/PB/Riachão do Bacamarte={"id":"data/BR/PB/Riachão do Bacamarte","key":"Riachão do Bacamarte","lang":"pt"}
+data/BR/PB/Riachão do Poço={"id":"data/BR/PB/Riachão do Poço","key":"Riachão do Poço","lang":"pt"}
+data/BR/PB/Rio Tinto={"id":"data/BR/PB/Rio Tinto","key":"Rio Tinto","lang":"pt"}
+data/BR/PB/Salgadinho={"id":"data/BR/PB/Salgadinho","key":"Salgadinho","lang":"pt"}
+data/BR/PB/Salgado de São Félix={"id":"data/BR/PB/Salgado de São Félix","key":"Salgado de São Félix","lang":"pt"}
+data/BR/PB/Santa Cecília={"id":"data/BR/PB/Santa Cecília","key":"Santa Cecília","lang":"pt"}
+data/BR/PB/Santa Cruz={"id":"data/BR/PB/Santa Cruz","key":"Santa Cruz","lang":"pt"}
+data/BR/PB/Santa Helena={"id":"data/BR/PB/Santa Helena","key":"Santa Helena","lang":"pt"}
+data/BR/PB/Santa Inês={"id":"data/BR/PB/Santa Inês","key":"Santa Inês","lang":"pt"}
+data/BR/PB/Santa Luzia={"id":"data/BR/PB/Santa Luzia","key":"Santa Luzia","lang":"pt"}
+data/BR/PB/Santa Rita={"id":"data/BR/PB/Santa Rita","key":"Santa Rita","lang":"pt"}
+data/BR/PB/Santa Teresinha={"id":"data/BR/PB/Santa Teresinha","key":"Santa Teresinha","lang":"pt"}
+data/BR/PB/Santana de Mangueira={"id":"data/BR/PB/Santana de Mangueira","key":"Santana de Mangueira","lang":"pt"}
+data/BR/PB/Santana dos Garrotes={"id":"data/BR/PB/Santana dos Garrotes","key":"Santana dos Garrotes","lang":"pt"}
+data/BR/PB/Santarém={"id":"data/BR/PB/Santarém","key":"Santarém","lang":"pt"}
+data/BR/PB/Santo André={"id":"data/BR/PB/Santo André","key":"Santo André","lang":"pt"}
+data/BR/PB/Seridó={"id":"data/BR/PB/Seridó","key":"Seridó","lang":"pt"}
+data/BR/PB/Serra Branca={"id":"data/BR/PB/Serra Branca","key":"Serra Branca","lang":"pt"}
+data/BR/PB/Serra Grande={"id":"data/BR/PB/Serra Grande","key":"Serra Grande","lang":"pt"}
+data/BR/PB/Serra Redonda={"id":"data/BR/PB/Serra Redonda","key":"Serra Redonda","lang":"pt"}
+data/BR/PB/Serra da Raiz={"id":"data/BR/PB/Serra da Raiz","key":"Serra da Raiz","lang":"pt"}
+data/BR/PB/Serraria={"id":"data/BR/PB/Serraria","key":"Serraria","lang":"pt"}
+data/BR/PB/Sertãozinho={"id":"data/BR/PB/Sertãozinho","key":"Sertãozinho","lang":"pt"}
+data/BR/PB/Sobrado={"id":"data/BR/PB/Sobrado","key":"Sobrado","lang":"pt"}
+data/BR/PB/Soledade={"id":"data/BR/PB/Soledade","key":"Soledade","lang":"pt"}
+data/BR/PB/Solânea={"id":"data/BR/PB/Solânea","key":"Solânea","lang":"pt"}
+data/BR/PB/Sossego={"id":"data/BR/PB/Sossego","key":"Sossego","lang":"pt"}
+data/BR/PB/Sousa={"id":"data/BR/PB/Sousa","key":"Sousa","lang":"pt"}
+data/BR/PB/Sumé={"id":"data/BR/PB/Sumé","key":"Sumé","lang":"pt"}
+data/BR/PB/São Bentinho={"id":"data/BR/PB/São Bentinho","key":"São Bentinho","lang":"pt"}
+data/BR/PB/São Bento={"id":"data/BR/PB/São Bento","key":"São Bento","lang":"pt"}
+data/BR/PB/São Domingos de Pombal={"id":"data/BR/PB/São Domingos de Pombal","key":"São Domingos de Pombal","lang":"pt"}
+data/BR/PB/São Domingos do Cariri={"id":"data/BR/PB/São Domingos do Cariri","key":"São Domingos do Cariri","lang":"pt"}
+data/BR/PB/São Francisco={"id":"data/BR/PB/São Francisco","key":"São Francisco","lang":"pt"}
+data/BR/PB/São José da Lagoa Tapada={"id":"data/BR/PB/São José da Lagoa Tapada","key":"São José da Lagoa Tapada","lang":"pt"}
+data/BR/PB/São José de Caiana={"id":"data/BR/PB/São José de Caiana","key":"São José de Caiana","lang":"pt"}
+data/BR/PB/São José de Espinharas={"id":"data/BR/PB/São José de Espinharas","key":"São José de Espinharas","lang":"pt"}
+data/BR/PB/São José de Piranhas={"id":"data/BR/PB/São José de Piranhas","key":"São José de Piranhas","lang":"pt"}
+data/BR/PB/São José de Princesa={"id":"data/BR/PB/São José de Princesa","key":"São José de Princesa","lang":"pt"}
+data/BR/PB/São José do Bonfim={"id":"data/BR/PB/São José do Bonfim","key":"São José do Bonfim","lang":"pt"}
+data/BR/PB/São José do Brejo do Cruz={"id":"data/BR/PB/São José do Brejo do Cruz","key":"São José do Brejo do Cruz","lang":"pt"}
+data/BR/PB/São José do Sabugi={"id":"data/BR/PB/São José do Sabugi","key":"São José do Sabugi","lang":"pt"}
+data/BR/PB/São José dos Cordeiros={"id":"data/BR/PB/São José dos Cordeiros","key":"São José dos Cordeiros","lang":"pt"}
+data/BR/PB/São José dos Ramos={"id":"data/BR/PB/São José dos Ramos","key":"São José dos Ramos","lang":"pt"}
+data/BR/PB/São João do Cariri={"id":"data/BR/PB/São João do Cariri","key":"São João do Cariri","lang":"pt"}
+data/BR/PB/São João do Rio do Peixe={"id":"data/BR/PB/São João do Rio do Peixe","key":"São João do Rio do Peixe","lang":"pt"}
+data/BR/PB/São João do Tigre={"id":"data/BR/PB/São João do Tigre","key":"São João do Tigre","lang":"pt"}
+data/BR/PB/São Mamede={"id":"data/BR/PB/São Mamede","key":"São Mamede","lang":"pt"}
+data/BR/PB/São Miguel de Taipu={"id":"data/BR/PB/São Miguel de Taipu","key":"São Miguel de Taipu","lang":"pt"}
+data/BR/PB/São Sebastião de Lagoa de Roça={"id":"data/BR/PB/São Sebastião de Lagoa de Roça","key":"São Sebastião de Lagoa de Roça","lang":"pt"}
+data/BR/PB/São Sebastião do Umbuzeiro={"id":"data/BR/PB/São Sebastião do Umbuzeiro","key":"São Sebastião do Umbuzeiro","lang":"pt"}
+data/BR/PB/Sāpe={"id":"data/BR/PB/Sāpe","key":"Sāpe","lang":"pt"}
+data/BR/PB/Taperoá={"id":"data/BR/PB/Taperoá","key":"Taperoá","lang":"pt"}
+data/BR/PB/Tavares={"id":"data/BR/PB/Tavares","key":"Tavares","lang":"pt"}
+data/BR/PB/Teixeira={"id":"data/BR/PB/Teixeira","key":"Teixeira","lang":"pt"}
+data/BR/PB/Tenório={"id":"data/BR/PB/Tenório","key":"Tenório","lang":"pt"}
+data/BR/PB/Triunfo={"id":"data/BR/PB/Triunfo","key":"Triunfo","lang":"pt"}
+data/BR/PB/Uiraúna={"id":"data/BR/PB/Uiraúna","key":"Uiraúna","lang":"pt"}
+data/BR/PB/Umbuzeiro={"id":"data/BR/PB/Umbuzeiro","key":"Umbuzeiro","lang":"pt"}
+data/BR/PB/Vieirópolis={"id":"data/BR/PB/Vieirópolis","key":"Vieirópolis","lang":"pt"}
+data/BR/PB/Vista Serrana={"id":"data/BR/PB/Vista Serrana","key":"Vista Serrana","lang":"pt"}
+data/BR/PB/Várzea={"id":"data/BR/PB/Várzea","key":"Várzea","lang":"pt"}
+data/BR/PB/Zabelê={"id":"data/BR/PB/Zabelê","key":"Zabelê","lang":"pt"}
+data/BR/PB/Água Branca={"id":"data/BR/PB/Água Branca","key":"Água Branca","lang":"pt"}
+data/BR/PE={"id":"data/BR/PE","key":"PE","name":"Pernambuco","lang":"pt","zip":"5[0-6]","zipex":"50000-000,56999-999","sub_keys":"Abreu e Lima~Afogados da Ingazeira~Afrânio~Agrestina~Água Preta~Águas Belas~Alagoinha~Aliança~Altinho~Amaraji~Angelim~Aracoiaba~Araripina~Arcoverde~Barra de Guabiraba~Barreiros~Belém de Maria~Belém de São Francisco~Belo Jardim~Betania~Bezerros~Bodoco~Bom Conselho~Bom Jardim~Bonito~Brejão~Brejinho~Brejo da Madre de Deus~Buenos Aires~Buíque~Cabo de Santo Agostinho~Cabrobó~Cachoeirinha~Caetés~Calçado~Calumbi~Camaragibe~Camocim de São Félix~Camutanga~Canhotinho~Capoeiras~Carnaiba~Carnaubeira da Penha~Carpina~Caruaru~Casinhas~Catende~Cedro~Chã de Alegria~Chã Grande~Condado~Correntes~Cortés~Cumaru~Cupira~Custodia~Dormentes~Escada~Exu~Feira Nova~Fernando de Noronha (Distrito Estadual)~Ferreiros~Flores~Floresta~Frei Miguelinho~Gameleira~Garanhuns~Glória do Goitá~Goiana~Granito~Gravatá~Iati~Ibimirim~Ibirajuba~Igarassu~Iguaraci~Ilha de Itamaracá~Inajá~Ingazeira~Ipojuca~Ipubi~Itacuruba~Itaiba~Itambé~Itapetim~Itapissuma~Itaquitinga~Jaboatão dos Guararapes~Jaqueira~Jatauba~Jatobá~João Alfredo~Joaquim Nabuco~Jucati~Jupi~Jurema~Lagoa do Carro~Lagoa do Itaenga~Lagoa do Ouro~Lagoa dos Gatos~Lagoa Grande~Lajedo~Limoeiro~Macaparana~Machados~Manari~Maraial~Mirandiba~Moreilandia~Moreno~Nazaré da Mata~Olinda~Orobó~Oroco~Ouricuri~Palmares~Palmeirina~Panelas~Paranatama~Parnamirim~Passira~Paudalho~Paulista~Pedrá~Pesqueira~Petrolândia~Petrolina~Poção~Pombos~Primavera~Quipapá~Quixaba~Recife~Riacho das Almas~Ribeirão~Rio Formoso~Sairé~Salgadinho~Salgueiro~Saloa~Sanharo~Santa Cruz~Santa Cruz da Baixa Verde~Santa Cruz do Capibaribe~Santa Filomena~Santa Maria da Boa Vista~Santa Maria do Cambucá~Santa Terezinha~São Benedito do Sul~São Bento do Una~São Caetano~São João~São Joaquim do Monte~São José da Coroa Grande~São José do Belmonte~São José do Egito~São Lourenço da Mata~São Vicente Ferrer~Serra Talhada~Serrita~Sertânia~Sirinhaém~Solidao~Surubim~Tabira~Tacaimbó~Tacaratu~Tamandaré~Taquaritinga do Norte~Terezinha~Terra Nova~Timbaúba~Toritama~Tracunhaém~Trindade~Triunfo~Tupanatinga~Tuparetama~Venturosa~Verdejante~Vertentes~Vertentes do Lério~Vicência~Vitória de Santo Antão~Xexéu"}
+data/BR/PE/Abreu e Lima={"id":"data/BR/PE/Abreu e Lima","key":"Abreu e Lima","lang":"pt"}
+data/BR/PE/Afogados da Ingazeira={"id":"data/BR/PE/Afogados da Ingazeira","key":"Afogados da Ingazeira","lang":"pt"}
+data/BR/PE/Afrânio={"id":"data/BR/PE/Afrânio","key":"Afrânio","lang":"pt"}
+data/BR/PE/Agrestina={"id":"data/BR/PE/Agrestina","key":"Agrestina","lang":"pt"}
+data/BR/PE/Alagoinha={"id":"data/BR/PE/Alagoinha","key":"Alagoinha","lang":"pt"}
+data/BR/PE/Aliança={"id":"data/BR/PE/Aliança","key":"Aliança","lang":"pt"}
+data/BR/PE/Altinho={"id":"data/BR/PE/Altinho","key":"Altinho","lang":"pt"}
+data/BR/PE/Amaraji={"id":"data/BR/PE/Amaraji","key":"Amaraji","lang":"pt"}
+data/BR/PE/Angelim={"id":"data/BR/PE/Angelim","key":"Angelim","lang":"pt"}
+data/BR/PE/Aracoiaba={"id":"data/BR/PE/Aracoiaba","key":"Aracoiaba","lang":"pt"}
+data/BR/PE/Araripina={"id":"data/BR/PE/Araripina","key":"Araripina","lang":"pt"}
+data/BR/PE/Arcoverde={"id":"data/BR/PE/Arcoverde","key":"Arcoverde","lang":"pt"}
+data/BR/PE/Barra de Guabiraba={"id":"data/BR/PE/Barra de Guabiraba","key":"Barra de Guabiraba","lang":"pt"}
+data/BR/PE/Barreiros={"id":"data/BR/PE/Barreiros","key":"Barreiros","lang":"pt"}
+data/BR/PE/Belo Jardim={"id":"data/BR/PE/Belo Jardim","key":"Belo Jardim","lang":"pt"}
+data/BR/PE/Belém de Maria={"id":"data/BR/PE/Belém de Maria","key":"Belém de Maria","lang":"pt"}
+data/BR/PE/Belém de São Francisco={"id":"data/BR/PE/Belém de São Francisco","key":"Belém de São Francisco","lang":"pt"}
+data/BR/PE/Betania={"id":"data/BR/PE/Betania","key":"Betania","lang":"pt"}
+data/BR/PE/Bezerros={"id":"data/BR/PE/Bezerros","key":"Bezerros","lang":"pt"}
+data/BR/PE/Bodoco={"id":"data/BR/PE/Bodoco","key":"Bodoco","lang":"pt"}
+data/BR/PE/Bom Conselho={"id":"data/BR/PE/Bom Conselho","key":"Bom Conselho","lang":"pt"}
+data/BR/PE/Bom Jardim={"id":"data/BR/PE/Bom Jardim","key":"Bom Jardim","lang":"pt"}
+data/BR/PE/Bonito={"id":"data/BR/PE/Bonito","key":"Bonito","lang":"pt"}
+data/BR/PE/Brejinho={"id":"data/BR/PE/Brejinho","key":"Brejinho","lang":"pt"}
+data/BR/PE/Brejo da Madre de Deus={"id":"data/BR/PE/Brejo da Madre de Deus","key":"Brejo da Madre de Deus","lang":"pt"}
+data/BR/PE/Brejão={"id":"data/BR/PE/Brejão","key":"Brejão","lang":"pt"}
+data/BR/PE/Buenos Aires={"id":"data/BR/PE/Buenos Aires","key":"Buenos Aires","lang":"pt"}
+data/BR/PE/Buíque={"id":"data/BR/PE/Buíque","key":"Buíque","lang":"pt"}
+data/BR/PE/Cabo de Santo Agostinho={"id":"data/BR/PE/Cabo de Santo Agostinho","key":"Cabo de Santo Agostinho","lang":"pt"}
+data/BR/PE/Cabrobó={"id":"data/BR/PE/Cabrobó","key":"Cabrobó","lang":"pt"}
+data/BR/PE/Cachoeirinha={"id":"data/BR/PE/Cachoeirinha","key":"Cachoeirinha","lang":"pt"}
+data/BR/PE/Caetés={"id":"data/BR/PE/Caetés","key":"Caetés","lang":"pt"}
+data/BR/PE/Calumbi={"id":"data/BR/PE/Calumbi","key":"Calumbi","lang":"pt"}
+data/BR/PE/Calçado={"id":"data/BR/PE/Calçado","key":"Calçado","lang":"pt"}
+data/BR/PE/Camaragibe={"id":"data/BR/PE/Camaragibe","key":"Camaragibe","lang":"pt"}
+data/BR/PE/Camocim de São Félix={"id":"data/BR/PE/Camocim de São Félix","key":"Camocim de São Félix","lang":"pt"}
+data/BR/PE/Camutanga={"id":"data/BR/PE/Camutanga","key":"Camutanga","lang":"pt"}
+data/BR/PE/Canhotinho={"id":"data/BR/PE/Canhotinho","key":"Canhotinho","lang":"pt"}
+data/BR/PE/Capoeiras={"id":"data/BR/PE/Capoeiras","key":"Capoeiras","lang":"pt"}
+data/BR/PE/Carnaiba={"id":"data/BR/PE/Carnaiba","key":"Carnaiba","lang":"pt"}
+data/BR/PE/Carnaubeira da Penha={"id":"data/BR/PE/Carnaubeira da Penha","key":"Carnaubeira da Penha","lang":"pt"}
+data/BR/PE/Carpina={"id":"data/BR/PE/Carpina","key":"Carpina","lang":"pt"}
+data/BR/PE/Caruaru={"id":"data/BR/PE/Caruaru","key":"Caruaru","lang":"pt"}
+data/BR/PE/Casinhas={"id":"data/BR/PE/Casinhas","key":"Casinhas","lang":"pt"}
+data/BR/PE/Catende={"id":"data/BR/PE/Catende","key":"Catende","lang":"pt"}
+data/BR/PE/Cedro={"id":"data/BR/PE/Cedro","key":"Cedro","lang":"pt"}
+data/BR/PE/Chã Grande={"id":"data/BR/PE/Chã Grande","key":"Chã Grande","lang":"pt"}
+data/BR/PE/Chã de Alegria={"id":"data/BR/PE/Chã de Alegria","key":"Chã de Alegria","lang":"pt"}
+data/BR/PE/Condado={"id":"data/BR/PE/Condado","key":"Condado","lang":"pt"}
+data/BR/PE/Correntes={"id":"data/BR/PE/Correntes","key":"Correntes","lang":"pt"}
+data/BR/PE/Cortés={"id":"data/BR/PE/Cortés","key":"Cortés","lang":"pt"}
+data/BR/PE/Cumaru={"id":"data/BR/PE/Cumaru","key":"Cumaru","lang":"pt"}
+data/BR/PE/Cupira={"id":"data/BR/PE/Cupira","key":"Cupira","lang":"pt"}
+data/BR/PE/Custodia={"id":"data/BR/PE/Custodia","key":"Custodia","lang":"pt"}
+data/BR/PE/Dormentes={"id":"data/BR/PE/Dormentes","key":"Dormentes","lang":"pt"}
+data/BR/PE/Escada={"id":"data/BR/PE/Escada","key":"Escada","lang":"pt"}
+data/BR/PE/Exu={"id":"data/BR/PE/Exu","key":"Exu","lang":"pt"}
+data/BR/PE/Feira Nova={"id":"data/BR/PE/Feira Nova","key":"Feira Nova","lang":"pt"}
+data/BR/PE/Fernando de Noronha (Distrito Estadual)={"id":"data/BR/PE/Fernando de Noronha (Distrito Estadual)","key":"Fernando de Noronha (Distrito Estadual)","lang":"pt"}
+data/BR/PE/Ferreiros={"id":"data/BR/PE/Ferreiros","key":"Ferreiros","lang":"pt"}
+data/BR/PE/Flores={"id":"data/BR/PE/Flores","key":"Flores","lang":"pt"}
+data/BR/PE/Floresta={"id":"data/BR/PE/Floresta","key":"Floresta","lang":"pt"}
+data/BR/PE/Frei Miguelinho={"id":"data/BR/PE/Frei Miguelinho","key":"Frei Miguelinho","lang":"pt"}
+data/BR/PE/Gameleira={"id":"data/BR/PE/Gameleira","key":"Gameleira","lang":"pt"}
+data/BR/PE/Garanhuns={"id":"data/BR/PE/Garanhuns","key":"Garanhuns","lang":"pt"}
+data/BR/PE/Glória do Goitá={"id":"data/BR/PE/Glória do Goitá","key":"Glória do Goitá","lang":"pt"}
+data/BR/PE/Goiana={"id":"data/BR/PE/Goiana","key":"Goiana","lang":"pt"}
+data/BR/PE/Granito={"id":"data/BR/PE/Granito","key":"Granito","lang":"pt"}
+data/BR/PE/Gravatá={"id":"data/BR/PE/Gravatá","key":"Gravatá","lang":"pt"}
+data/BR/PE/Iati={"id":"data/BR/PE/Iati","key":"Iati","lang":"pt"}
+data/BR/PE/Ibimirim={"id":"data/BR/PE/Ibimirim","key":"Ibimirim","lang":"pt"}
+data/BR/PE/Ibirajuba={"id":"data/BR/PE/Ibirajuba","key":"Ibirajuba","lang":"pt"}
+data/BR/PE/Igarassu={"id":"data/BR/PE/Igarassu","key":"Igarassu","lang":"pt"}
+data/BR/PE/Iguaraci={"id":"data/BR/PE/Iguaraci","key":"Iguaraci","lang":"pt"}
+data/BR/PE/Ilha de Itamaracá={"id":"data/BR/PE/Ilha de Itamaracá","key":"Ilha de Itamaracá","lang":"pt"}
+data/BR/PE/Inajá={"id":"data/BR/PE/Inajá","key":"Inajá","lang":"pt"}
+data/BR/PE/Ingazeira={"id":"data/BR/PE/Ingazeira","key":"Ingazeira","lang":"pt"}
+data/BR/PE/Ipojuca={"id":"data/BR/PE/Ipojuca","key":"Ipojuca","lang":"pt"}
+data/BR/PE/Ipubi={"id":"data/BR/PE/Ipubi","key":"Ipubi","lang":"pt"}
+data/BR/PE/Itacuruba={"id":"data/BR/PE/Itacuruba","key":"Itacuruba","lang":"pt"}
+data/BR/PE/Itaiba={"id":"data/BR/PE/Itaiba","key":"Itaiba","lang":"pt"}
+data/BR/PE/Itambé={"id":"data/BR/PE/Itambé","key":"Itambé","lang":"pt"}
+data/BR/PE/Itapetim={"id":"data/BR/PE/Itapetim","key":"Itapetim","lang":"pt"}
+data/BR/PE/Itapissuma={"id":"data/BR/PE/Itapissuma","key":"Itapissuma","lang":"pt"}
+data/BR/PE/Itaquitinga={"id":"data/BR/PE/Itaquitinga","key":"Itaquitinga","lang":"pt"}
+data/BR/PE/Jaboatão dos Guararapes={"id":"data/BR/PE/Jaboatão dos Guararapes","key":"Jaboatão dos Guararapes","lang":"pt"}
+data/BR/PE/Jaqueira={"id":"data/BR/PE/Jaqueira","key":"Jaqueira","lang":"pt"}
+data/BR/PE/Jatauba={"id":"data/BR/PE/Jatauba","key":"Jatauba","lang":"pt"}
+data/BR/PE/Jatobá={"id":"data/BR/PE/Jatobá","key":"Jatobá","lang":"pt"}
+data/BR/PE/Joaquim Nabuco={"id":"data/BR/PE/Joaquim Nabuco","key":"Joaquim Nabuco","lang":"pt"}
+data/BR/PE/João Alfredo={"id":"data/BR/PE/João Alfredo","key":"João Alfredo","lang":"pt"}
+data/BR/PE/Jucati={"id":"data/BR/PE/Jucati","key":"Jucati","lang":"pt"}
+data/BR/PE/Jupi={"id":"data/BR/PE/Jupi","key":"Jupi","lang":"pt"}
+data/BR/PE/Jurema={"id":"data/BR/PE/Jurema","key":"Jurema","lang":"pt"}
+data/BR/PE/Lagoa Grande={"id":"data/BR/PE/Lagoa Grande","key":"Lagoa Grande","lang":"pt"}
+data/BR/PE/Lagoa do Carro={"id":"data/BR/PE/Lagoa do Carro","key":"Lagoa do Carro","lang":"pt"}
+data/BR/PE/Lagoa do Itaenga={"id":"data/BR/PE/Lagoa do Itaenga","key":"Lagoa do Itaenga","lang":"pt"}
+data/BR/PE/Lagoa do Ouro={"id":"data/BR/PE/Lagoa do Ouro","key":"Lagoa do Ouro","lang":"pt"}
+data/BR/PE/Lagoa dos Gatos={"id":"data/BR/PE/Lagoa dos Gatos","key":"Lagoa dos Gatos","lang":"pt"}
+data/BR/PE/Lajedo={"id":"data/BR/PE/Lajedo","key":"Lajedo","lang":"pt"}
+data/BR/PE/Limoeiro={"id":"data/BR/PE/Limoeiro","key":"Limoeiro","lang":"pt"}
+data/BR/PE/Macaparana={"id":"data/BR/PE/Macaparana","key":"Macaparana","lang":"pt"}
+data/BR/PE/Machados={"id":"data/BR/PE/Machados","key":"Machados","lang":"pt"}
+data/BR/PE/Manari={"id":"data/BR/PE/Manari","key":"Manari","lang":"pt"}
+data/BR/PE/Maraial={"id":"data/BR/PE/Maraial","key":"Maraial","lang":"pt"}
+data/BR/PE/Mirandiba={"id":"data/BR/PE/Mirandiba","key":"Mirandiba","lang":"pt"}
+data/BR/PE/Moreilandia={"id":"data/BR/PE/Moreilandia","key":"Moreilandia","lang":"pt"}
+data/BR/PE/Moreno={"id":"data/BR/PE/Moreno","key":"Moreno","lang":"pt"}
+data/BR/PE/Nazaré da Mata={"id":"data/BR/PE/Nazaré da Mata","key":"Nazaré da Mata","lang":"pt"}
+data/BR/PE/Olinda={"id":"data/BR/PE/Olinda","key":"Olinda","lang":"pt"}
+data/BR/PE/Orobó={"id":"data/BR/PE/Orobó","key":"Orobó","lang":"pt"}
+data/BR/PE/Oroco={"id":"data/BR/PE/Oroco","key":"Oroco","lang":"pt"}
+data/BR/PE/Ouricuri={"id":"data/BR/PE/Ouricuri","key":"Ouricuri","lang":"pt"}
+data/BR/PE/Palmares={"id":"data/BR/PE/Palmares","key":"Palmares","lang":"pt"}
+data/BR/PE/Palmeirina={"id":"data/BR/PE/Palmeirina","key":"Palmeirina","lang":"pt"}
+data/BR/PE/Panelas={"id":"data/BR/PE/Panelas","key":"Panelas","lang":"pt"}
+data/BR/PE/Paranatama={"id":"data/BR/PE/Paranatama","key":"Paranatama","lang":"pt"}
+data/BR/PE/Parnamirim={"id":"data/BR/PE/Parnamirim","key":"Parnamirim","lang":"pt"}
+data/BR/PE/Passira={"id":"data/BR/PE/Passira","key":"Passira","lang":"pt"}
+data/BR/PE/Paudalho={"id":"data/BR/PE/Paudalho","key":"Paudalho","lang":"pt"}
+data/BR/PE/Paulista={"id":"data/BR/PE/Paulista","key":"Paulista","lang":"pt"}
+data/BR/PE/Pedrá={"id":"data/BR/PE/Pedrá","key":"Pedrá","lang":"pt"}
+data/BR/PE/Pesqueira={"id":"data/BR/PE/Pesqueira","key":"Pesqueira","lang":"pt"}
+data/BR/PE/Petrolina={"id":"data/BR/PE/Petrolina","key":"Petrolina","lang":"pt"}
+data/BR/PE/Petrolândia={"id":"data/BR/PE/Petrolândia","key":"Petrolândia","lang":"pt"}
+data/BR/PE/Pombos={"id":"data/BR/PE/Pombos","key":"Pombos","lang":"pt"}
+data/BR/PE/Poção={"id":"data/BR/PE/Poção","key":"Poção","lang":"pt"}
+data/BR/PE/Primavera={"id":"data/BR/PE/Primavera","key":"Primavera","lang":"pt"}
+data/BR/PE/Quipapá={"id":"data/BR/PE/Quipapá","key":"Quipapá","lang":"pt"}
+data/BR/PE/Quixaba={"id":"data/BR/PE/Quixaba","key":"Quixaba","lang":"pt"}
+data/BR/PE/Recife={"id":"data/BR/PE/Recife","key":"Recife","lang":"pt"}
+data/BR/PE/Riacho das Almas={"id":"data/BR/PE/Riacho das Almas","key":"Riacho das Almas","lang":"pt"}
+data/BR/PE/Ribeirão={"id":"data/BR/PE/Ribeirão","key":"Ribeirão","lang":"pt"}
+data/BR/PE/Rio Formoso={"id":"data/BR/PE/Rio Formoso","key":"Rio Formoso","lang":"pt"}
+data/BR/PE/Sairé={"id":"data/BR/PE/Sairé","key":"Sairé","lang":"pt"}
+data/BR/PE/Salgadinho={"id":"data/BR/PE/Salgadinho","key":"Salgadinho","lang":"pt"}
+data/BR/PE/Salgueiro={"id":"data/BR/PE/Salgueiro","key":"Salgueiro","lang":"pt"}
+data/BR/PE/Saloa={"id":"data/BR/PE/Saloa","key":"Saloa","lang":"pt"}
+data/BR/PE/Sanharo={"id":"data/BR/PE/Sanharo","key":"Sanharo","lang":"pt"}
+data/BR/PE/Santa Cruz={"id":"data/BR/PE/Santa Cruz","key":"Santa Cruz","lang":"pt"}
+data/BR/PE/Santa Cruz da Baixa Verde={"id":"data/BR/PE/Santa Cruz da Baixa Verde","key":"Santa Cruz da Baixa Verde","lang":"pt"}
+data/BR/PE/Santa Cruz do Capibaribe={"id":"data/BR/PE/Santa Cruz do Capibaribe","key":"Santa Cruz do Capibaribe","lang":"pt"}
+data/BR/PE/Santa Filomena={"id":"data/BR/PE/Santa Filomena","key":"Santa Filomena","lang":"pt"}
+data/BR/PE/Santa Maria da Boa Vista={"id":"data/BR/PE/Santa Maria da Boa Vista","key":"Santa Maria da Boa Vista","lang":"pt"}
+data/BR/PE/Santa Maria do Cambucá={"id":"data/BR/PE/Santa Maria do Cambucá","key":"Santa Maria do Cambucá","lang":"pt"}
+data/BR/PE/Santa Terezinha={"id":"data/BR/PE/Santa Terezinha","key":"Santa Terezinha","lang":"pt"}
+data/BR/PE/Serra Talhada={"id":"data/BR/PE/Serra Talhada","key":"Serra Talhada","lang":"pt"}
+data/BR/PE/Serrita={"id":"data/BR/PE/Serrita","key":"Serrita","lang":"pt"}
+data/BR/PE/Sertânia={"id":"data/BR/PE/Sertânia","key":"Sertânia","lang":"pt"}
+data/BR/PE/Sirinhaém={"id":"data/BR/PE/Sirinhaém","key":"Sirinhaém","lang":"pt"}
+data/BR/PE/Solidao={"id":"data/BR/PE/Solidao","key":"Solidao","lang":"pt"}
+data/BR/PE/Surubim={"id":"data/BR/PE/Surubim","key":"Surubim","lang":"pt"}
+data/BR/PE/São Benedito do Sul={"id":"data/BR/PE/São Benedito do Sul","key":"São Benedito do Sul","lang":"pt"}
+data/BR/PE/São Bento do Una={"id":"data/BR/PE/São Bento do Una","key":"São Bento do Una","lang":"pt"}
+data/BR/PE/São Caetano={"id":"data/BR/PE/São Caetano","key":"São Caetano","lang":"pt"}
+data/BR/PE/São Joaquim do Monte={"id":"data/BR/PE/São Joaquim do Monte","key":"São Joaquim do Monte","lang":"pt"}
+data/BR/PE/São José da Coroa Grande={"id":"data/BR/PE/São José da Coroa Grande","key":"São José da Coroa Grande","lang":"pt"}
+data/BR/PE/São José do Belmonte={"id":"data/BR/PE/São José do Belmonte","key":"São José do Belmonte","lang":"pt"}
+data/BR/PE/São José do Egito={"id":"data/BR/PE/São José do Egito","key":"São José do Egito","lang":"pt"}
+data/BR/PE/São João={"id":"data/BR/PE/São João","key":"São João","lang":"pt"}
+data/BR/PE/São Lourenço da Mata={"id":"data/BR/PE/São Lourenço da Mata","key":"São Lourenço da Mata","lang":"pt"}
+data/BR/PE/São Vicente Ferrer={"id":"data/BR/PE/São Vicente Ferrer","key":"São Vicente Ferrer","lang":"pt"}
+data/BR/PE/Tabira={"id":"data/BR/PE/Tabira","key":"Tabira","lang":"pt"}
+data/BR/PE/Tacaimbó={"id":"data/BR/PE/Tacaimbó","key":"Tacaimbó","lang":"pt"}
+data/BR/PE/Tacaratu={"id":"data/BR/PE/Tacaratu","key":"Tacaratu","lang":"pt"}
+data/BR/PE/Tamandaré={"id":"data/BR/PE/Tamandaré","key":"Tamandaré","lang":"pt"}
+data/BR/PE/Taquaritinga do Norte={"id":"data/BR/PE/Taquaritinga do Norte","key":"Taquaritinga do Norte","lang":"pt"}
+data/BR/PE/Terezinha={"id":"data/BR/PE/Terezinha","key":"Terezinha","lang":"pt"}
+data/BR/PE/Terra Nova={"id":"data/BR/PE/Terra Nova","key":"Terra Nova","lang":"pt"}
+data/BR/PE/Timbaúba={"id":"data/BR/PE/Timbaúba","key":"Timbaúba","lang":"pt"}
+data/BR/PE/Toritama={"id":"data/BR/PE/Toritama","key":"Toritama","lang":"pt"}
+data/BR/PE/Tracunhaém={"id":"data/BR/PE/Tracunhaém","key":"Tracunhaém","lang":"pt"}
+data/BR/PE/Trindade={"id":"data/BR/PE/Trindade","key":"Trindade","lang":"pt"}
+data/BR/PE/Triunfo={"id":"data/BR/PE/Triunfo","key":"Triunfo","lang":"pt"}
+data/BR/PE/Tupanatinga={"id":"data/BR/PE/Tupanatinga","key":"Tupanatinga","lang":"pt"}
+data/BR/PE/Tuparetama={"id":"data/BR/PE/Tuparetama","key":"Tuparetama","lang":"pt"}
+data/BR/PE/Venturosa={"id":"data/BR/PE/Venturosa","key":"Venturosa","lang":"pt"}
+data/BR/PE/Verdejante={"id":"data/BR/PE/Verdejante","key":"Verdejante","lang":"pt"}
+data/BR/PE/Vertentes={"id":"data/BR/PE/Vertentes","key":"Vertentes","lang":"pt"}
+data/BR/PE/Vertentes do Lério={"id":"data/BR/PE/Vertentes do Lério","key":"Vertentes do Lério","lang":"pt"}
+data/BR/PE/Vicência={"id":"data/BR/PE/Vicência","key":"Vicência","lang":"pt"}
+data/BR/PE/Vitória de Santo Antão={"id":"data/BR/PE/Vitória de Santo Antão","key":"Vitória de Santo Antão","lang":"pt"}
+data/BR/PE/Xexéu={"id":"data/BR/PE/Xexéu","key":"Xexéu","lang":"pt"}
+data/BR/PE/Água Preta={"id":"data/BR/PE/Água Preta","key":"Água Preta","lang":"pt"}
+data/BR/PE/Águas Belas={"id":"data/BR/PE/Águas Belas","key":"Águas Belas","lang":"pt"}
+data/BR/PI={"id":"data/BR/PI","key":"PI","name":"Piauí","lang":"pt","zip":"64","zipex":"64000-000,64999-999","sub_keys":"Acauã~Agricolândia~Água Branca~Alagoinha do Piauí~Alegrete do Piauí~Alto Longá~Altos~Alvorada do Gurguéia~Amarante~Angical do Piauí~Anísio de Abreu~Antônio Almeida~Aroazes~Aroeiras do Itaim~Arraial~Assunção do Piauí~Avelino Lopes~Baixa Grande do Ribeiro~Barra d'Alcântara~Barras~Barreiras do Piauí~Barro Duro~Batalha~Bela Vista do Piauí~Belém do Piauí~Beneditinos~Bertolínia~Betânia do Piauí~Boa Hora~Bocaina~Bom Jesus~Bom Princípio do Piauí~Bonfim do Piauí~Boqueirão do Piauí~Brasileira~Brejo do Piauí~Buriti dos Lopes~Buriti dos Montes~Cabeceiras do Piauí~Cajazeiras do Piauí~Cajueiro da Praia~Caldeirão Grande do Piauí~Campinas do Piauí~Campo Alegre do Fidalgo~Campo Grande do Piauí~Campo Largo do Piauí~Campo Maior~Canavieira~Canto do Buriti~Capitão de Campos~Capitão Gervásio Oliveira~Caracol~Caraúbas do Piauí~Caridade do Piauí~Castelo do Piauí~Caxingó~Cocal~Cocal de Telha~Cocal dos Alves~Coivaras~Colônia do Gurguéia~Colônia do Piauí~Conceição do Canindé~Coronel José Dias~Corrente~Cristalândia do Piauí~Cristino Castro~Curimatá~Currais~Curral Novo do Piauí~Curralinhos~Demerval Lobão~Dirceu Arcoverde~Dom Expedito Lopes~Dom Inocêncio~Domingos Mourão~Elesbão Veloso~Eliseu Martins~Esperantina~Fartura do Piauí~Flores do Piauí~Floresta do Piauí~Floriano~Francinópolis~Francisco Ayres~Francisco Macedo~Francisco Santos~Fronteiras~Geminiano~Gilbués~Guadalupe~Guaribas~Hugo Napoleão~Ilha Grande~Inhuma~Ipiranga do Piauí~Isaías Coelho~Itainópolis~Itaueira~Jacobina do Piauí~Jaicós~Jardim do Mulato~Jatobá do Piauí~Jerumenha~João Costa~Joaquim Pires~Joca Marques~José de Freitas~Juazeiro do Piauí~Julio Borges~Jurema~Lagoa Alegre~Lagoa de São Francisco~Lagoa do Barro do Piauí~Lagoa do Piauí~Lagoa do Sítio~Lagoinha do Piauí~Landri Sales~Luís Correia~Luzilândia~Madeiro~Manoel Emídio~Marcolândia~Marcos Parente~Massapê do Piauí~Matias Olímpio~Miguel Alves~Miguel Leão~Milton Brandão~Monsenhor Gil~Monsenhor Hipólito~Monte Alegre do Piauí~Morro Cabeça no Tempo~Morro do Chapéu do Piauí~Murici dos Portelas~Nazaré do Piauí~Nossa Senhora de Nazaré~Nossa Senhora dos Remédios~Nova Santa Rita~Novo Oriente do Piauí~Novo Santo Antônio~Oeiras~Olho d'Água do Piauí~Padre Marcos~Paes Landim~Pajeú do Piauí~Palmeira do Piauí~Palmeirais~Paquetá~Parnaguá~Parnaíba~Passagem Franca do Piauí~Patos do Piauí~Pau d'Arco do Piauí~Paulistana~Pavussu~Pedro II~Pedro Laurentino~Picos~Pimenteiras~Pio IX~Piracuruca~Piripiri~Porto~Porto Alegre do Piauí~Prata do Piauí~Queimada Nova~Redenção do Gurguéia~Regeneração~Riacho Frio~Ribeira do Piauí~Ribeiro Gonçalves~Rio Grande do Piauí~Santa Cruz do Piauí~Santa Cruz dos Milagres~Santa Filomena~Santa Luz~Santa Rosa do Piauí~Santana do Piauí~Santo Antônio de Lisboa~Santo Antônio dos Milagres~Santo Inácio do Piauí~São Braz do Piauí~São Félix do Piauí~São Francisco de Assis do Piauí~São Francisco do Piauí~São Gonçalo do Gurguéia~São Gonçalo do Piauí~São João da Canabrava~São João da Fronteira~São João da Serra~São João da Varjota~São João do Arraial~São João do Piauí~São José do Divino~São José do Peixe~São José do Piauí~São Julião~São Lourenço do Piauí~São Luís do Piauí~São Miguel da Baixa Grande~São Miguel do Fidalgo~São Miguel do Tapuio~São Pedro do Piauí~São Raimundo Nonato~Sebastião Barros~Sebastião Leal~Sigefredo Pacheco~Simões~Simplício Mendes~Socorro do Piauí~Sussuapara~Tamboril do Piauí~Tanque do Piauí~Teresina~União~Uruçuí~Valença do Piauí~Várzea Branca~Várzea Grande~Vera Mendes~Vila Nova do Piauí~Wall Ferraz"}
+data/BR/PI/Acauã={"id":"data/BR/PI/Acauã","key":"Acauã","lang":"pt"}
+data/BR/PI/Agricolândia={"id":"data/BR/PI/Agricolândia","key":"Agricolândia","lang":"pt"}
+data/BR/PI/Alagoinha do Piauí={"id":"data/BR/PI/Alagoinha do Piauí","key":"Alagoinha do Piauí","lang":"pt"}
+data/BR/PI/Alegrete do Piauí={"id":"data/BR/PI/Alegrete do Piauí","key":"Alegrete do Piauí","lang":"pt"}
+data/BR/PI/Alto Longá={"id":"data/BR/PI/Alto Longá","key":"Alto Longá","lang":"pt"}
+data/BR/PI/Altos={"id":"data/BR/PI/Altos","key":"Altos","lang":"pt"}
+data/BR/PI/Alvorada do Gurguéia={"id":"data/BR/PI/Alvorada do Gurguéia","key":"Alvorada do Gurguéia","lang":"pt"}
+data/BR/PI/Amarante={"id":"data/BR/PI/Amarante","key":"Amarante","lang":"pt"}
+data/BR/PI/Angical do Piauí={"id":"data/BR/PI/Angical do Piauí","key":"Angical do Piauí","lang":"pt"}
+data/BR/PI/Antônio Almeida={"id":"data/BR/PI/Antônio Almeida","key":"Antônio Almeida","lang":"pt"}
+data/BR/PI/Anísio de Abreu={"id":"data/BR/PI/Anísio de Abreu","key":"Anísio de Abreu","lang":"pt"}
+data/BR/PI/Aroazes={"id":"data/BR/PI/Aroazes","key":"Aroazes","lang":"pt"}
+data/BR/PI/Aroeiras do Itaim={"id":"data/BR/PI/Aroeiras do Itaim","key":"Aroeiras do Itaim","lang":"pt"}
+data/BR/PI/Arraial={"id":"data/BR/PI/Arraial","key":"Arraial","lang":"pt"}
+data/BR/PI/Assunção do Piauí={"id":"data/BR/PI/Assunção do Piauí","key":"Assunção do Piauí","lang":"pt"}
+data/BR/PI/Avelino Lopes={"id":"data/BR/PI/Avelino Lopes","key":"Avelino Lopes","lang":"pt"}
+data/BR/PI/Baixa Grande do Ribeiro={"id":"data/BR/PI/Baixa Grande do Ribeiro","key":"Baixa Grande do Ribeiro","lang":"pt"}
+data/BR/PI/Barra d'Alcântara={"id":"data/BR/PI/Barra d'Alcântara","key":"Barra d'Alcântara","lang":"pt"}
+data/BR/PI/Barras={"id":"data/BR/PI/Barras","key":"Barras","lang":"pt"}
+data/BR/PI/Barreiras do Piauí={"id":"data/BR/PI/Barreiras do Piauí","key":"Barreiras do Piauí","lang":"pt"}
+data/BR/PI/Barro Duro={"id":"data/BR/PI/Barro Duro","key":"Barro Duro","lang":"pt"}
+data/BR/PI/Batalha={"id":"data/BR/PI/Batalha","key":"Batalha","lang":"pt"}
+data/BR/PI/Bela Vista do Piauí={"id":"data/BR/PI/Bela Vista do Piauí","key":"Bela Vista do Piauí","lang":"pt"}
+data/BR/PI/Belém do Piauí={"id":"data/BR/PI/Belém do Piauí","key":"Belém do Piauí","lang":"pt"}
+data/BR/PI/Beneditinos={"id":"data/BR/PI/Beneditinos","key":"Beneditinos","lang":"pt"}
+data/BR/PI/Bertolínia={"id":"data/BR/PI/Bertolínia","key":"Bertolínia","lang":"pt"}
+data/BR/PI/Betânia do Piauí={"id":"data/BR/PI/Betânia do Piauí","key":"Betânia do Piauí","lang":"pt"}
+data/BR/PI/Boa Hora={"id":"data/BR/PI/Boa Hora","key":"Boa Hora","lang":"pt"}
+data/BR/PI/Bocaina={"id":"data/BR/PI/Bocaina","key":"Bocaina","lang":"pt"}
+data/BR/PI/Bom Jesus={"id":"data/BR/PI/Bom Jesus","key":"Bom Jesus","lang":"pt"}
+data/BR/PI/Bom Princípio do Piauí={"id":"data/BR/PI/Bom Princípio do Piauí","key":"Bom Princípio do Piauí","lang":"pt"}
+data/BR/PI/Bonfim do Piauí={"id":"data/BR/PI/Bonfim do Piauí","key":"Bonfim do Piauí","lang":"pt"}
+data/BR/PI/Boqueirão do Piauí={"id":"data/BR/PI/Boqueirão do Piauí","key":"Boqueirão do Piauí","lang":"pt"}
+data/BR/PI/Brasileira={"id":"data/BR/PI/Brasileira","key":"Brasileira","lang":"pt"}
+data/BR/PI/Brejo do Piauí={"id":"data/BR/PI/Brejo do Piauí","key":"Brejo do Piauí","lang":"pt"}
+data/BR/PI/Buriti dos Lopes={"id":"data/BR/PI/Buriti dos Lopes","key":"Buriti dos Lopes","lang":"pt"}
+data/BR/PI/Buriti dos Montes={"id":"data/BR/PI/Buriti dos Montes","key":"Buriti dos Montes","lang":"pt"}
+data/BR/PI/Cabeceiras do Piauí={"id":"data/BR/PI/Cabeceiras do Piauí","key":"Cabeceiras do Piauí","lang":"pt"}
+data/BR/PI/Cajazeiras do Piauí={"id":"data/BR/PI/Cajazeiras do Piauí","key":"Cajazeiras do Piauí","lang":"pt"}
+data/BR/PI/Cajueiro da Praia={"id":"data/BR/PI/Cajueiro da Praia","key":"Cajueiro da Praia","lang":"pt"}
+data/BR/PI/Caldeirão Grande do Piauí={"id":"data/BR/PI/Caldeirão Grande do Piauí","key":"Caldeirão Grande do Piauí","lang":"pt"}
+data/BR/PI/Campinas do Piauí={"id":"data/BR/PI/Campinas do Piauí","key":"Campinas do Piauí","lang":"pt"}
+data/BR/PI/Campo Alegre do Fidalgo={"id":"data/BR/PI/Campo Alegre do Fidalgo","key":"Campo Alegre do Fidalgo","lang":"pt"}
+data/BR/PI/Campo Grande do Piauí={"id":"data/BR/PI/Campo Grande do Piauí","key":"Campo Grande do Piauí","lang":"pt"}
+data/BR/PI/Campo Largo do Piauí={"id":"data/BR/PI/Campo Largo do Piauí","key":"Campo Largo do Piauí","lang":"pt"}
+data/BR/PI/Campo Maior={"id":"data/BR/PI/Campo Maior","key":"Campo Maior","lang":"pt"}
+data/BR/PI/Canavieira={"id":"data/BR/PI/Canavieira","key":"Canavieira","lang":"pt"}
+data/BR/PI/Canto do Buriti={"id":"data/BR/PI/Canto do Buriti","key":"Canto do Buriti","lang":"pt"}
+data/BR/PI/Capitão Gervásio Oliveira={"id":"data/BR/PI/Capitão Gervásio Oliveira","key":"Capitão Gervásio Oliveira","lang":"pt"}
+data/BR/PI/Capitão de Campos={"id":"data/BR/PI/Capitão de Campos","key":"Capitão de Campos","lang":"pt"}
+data/BR/PI/Caracol={"id":"data/BR/PI/Caracol","key":"Caracol","lang":"pt"}
+data/BR/PI/Caraúbas do Piauí={"id":"data/BR/PI/Caraúbas do Piauí","key":"Caraúbas do Piauí","lang":"pt"}
+data/BR/PI/Caridade do Piauí={"id":"data/BR/PI/Caridade do Piauí","key":"Caridade do Piauí","lang":"pt"}
+data/BR/PI/Castelo do Piauí={"id":"data/BR/PI/Castelo do Piauí","key":"Castelo do Piauí","lang":"pt"}
+data/BR/PI/Caxingó={"id":"data/BR/PI/Caxingó","key":"Caxingó","lang":"pt"}
+data/BR/PI/Cocal={"id":"data/BR/PI/Cocal","key":"Cocal","lang":"pt"}
+data/BR/PI/Cocal de Telha={"id":"data/BR/PI/Cocal de Telha","key":"Cocal de Telha","lang":"pt"}
+data/BR/PI/Cocal dos Alves={"id":"data/BR/PI/Cocal dos Alves","key":"Cocal dos Alves","lang":"pt"}
+data/BR/PI/Coivaras={"id":"data/BR/PI/Coivaras","key":"Coivaras","lang":"pt"}
+data/BR/PI/Colônia do Gurguéia={"id":"data/BR/PI/Colônia do Gurguéia","key":"Colônia do Gurguéia","lang":"pt"}
+data/BR/PI/Colônia do Piauí={"id":"data/BR/PI/Colônia do Piauí","key":"Colônia do Piauí","lang":"pt"}
+data/BR/PI/Conceição do Canindé={"id":"data/BR/PI/Conceição do Canindé","key":"Conceição do Canindé","lang":"pt"}
+data/BR/PI/Coronel José Dias={"id":"data/BR/PI/Coronel José Dias","key":"Coronel José Dias","lang":"pt"}
+data/BR/PI/Corrente={"id":"data/BR/PI/Corrente","key":"Corrente","lang":"pt"}
+data/BR/PI/Cristalândia do Piauí={"id":"data/BR/PI/Cristalândia do Piauí","key":"Cristalândia do Piauí","lang":"pt"}
+data/BR/PI/Cristino Castro={"id":"data/BR/PI/Cristino Castro","key":"Cristino Castro","lang":"pt"}
+data/BR/PI/Curimatá={"id":"data/BR/PI/Curimatá","key":"Curimatá","lang":"pt"}
+data/BR/PI/Currais={"id":"data/BR/PI/Currais","key":"Currais","lang":"pt"}
+data/BR/PI/Curral Novo do Piauí={"id":"data/BR/PI/Curral Novo do Piauí","key":"Curral Novo do Piauí","lang":"pt"}
+data/BR/PI/Curralinhos={"id":"data/BR/PI/Curralinhos","key":"Curralinhos","lang":"pt"}
+data/BR/PI/Demerval Lobão={"id":"data/BR/PI/Demerval Lobão","key":"Demerval Lobão","lang":"pt"}
+data/BR/PI/Dirceu Arcoverde={"id":"data/BR/PI/Dirceu Arcoverde","key":"Dirceu Arcoverde","lang":"pt"}
+data/BR/PI/Dom Expedito Lopes={"id":"data/BR/PI/Dom Expedito Lopes","key":"Dom Expedito Lopes","lang":"pt"}
+data/BR/PI/Dom Inocêncio={"id":"data/BR/PI/Dom Inocêncio","key":"Dom Inocêncio","lang":"pt"}
+data/BR/PI/Domingos Mourão={"id":"data/BR/PI/Domingos Mourão","key":"Domingos Mourão","lang":"pt"}
+data/BR/PI/Elesbão Veloso={"id":"data/BR/PI/Elesbão Veloso","key":"Elesbão Veloso","lang":"pt"}
+data/BR/PI/Eliseu Martins={"id":"data/BR/PI/Eliseu Martins","key":"Eliseu Martins","lang":"pt"}
+data/BR/PI/Esperantina={"id":"data/BR/PI/Esperantina","key":"Esperantina","lang":"pt"}
+data/BR/PI/Fartura do Piauí={"id":"data/BR/PI/Fartura do Piauí","key":"Fartura do Piauí","lang":"pt"}
+data/BR/PI/Flores do Piauí={"id":"data/BR/PI/Flores do Piauí","key":"Flores do Piauí","lang":"pt"}
+data/BR/PI/Floresta do Piauí={"id":"data/BR/PI/Floresta do Piauí","key":"Floresta do Piauí","lang":"pt"}
+data/BR/PI/Floriano={"id":"data/BR/PI/Floriano","key":"Floriano","lang":"pt"}
+data/BR/PI/Francinópolis={"id":"data/BR/PI/Francinópolis","key":"Francinópolis","lang":"pt"}
+data/BR/PI/Francisco Ayres={"id":"data/BR/PI/Francisco Ayres","key":"Francisco Ayres","lang":"pt"}
+data/BR/PI/Francisco Macedo={"id":"data/BR/PI/Francisco Macedo","key":"Francisco Macedo","lang":"pt"}
+data/BR/PI/Francisco Santos={"id":"data/BR/PI/Francisco Santos","key":"Francisco Santos","lang":"pt"}
+data/BR/PI/Fronteiras={"id":"data/BR/PI/Fronteiras","key":"Fronteiras","lang":"pt"}
+data/BR/PI/Geminiano={"id":"data/BR/PI/Geminiano","key":"Geminiano","lang":"pt"}
+data/BR/PI/Gilbués={"id":"data/BR/PI/Gilbués","key":"Gilbués","lang":"pt"}
+data/BR/PI/Guadalupe={"id":"data/BR/PI/Guadalupe","key":"Guadalupe","lang":"pt"}
+data/BR/PI/Guaribas={"id":"data/BR/PI/Guaribas","key":"Guaribas","lang":"pt"}
+data/BR/PI/Hugo Napoleão={"id":"data/BR/PI/Hugo Napoleão","key":"Hugo Napoleão","lang":"pt"}
+data/BR/PI/Ilha Grande={"id":"data/BR/PI/Ilha Grande","key":"Ilha Grande","lang":"pt"}
+data/BR/PI/Inhuma={"id":"data/BR/PI/Inhuma","key":"Inhuma","lang":"pt"}
+data/BR/PI/Ipiranga do Piauí={"id":"data/BR/PI/Ipiranga do Piauí","key":"Ipiranga do Piauí","lang":"pt"}
+data/BR/PI/Isaías Coelho={"id":"data/BR/PI/Isaías Coelho","key":"Isaías Coelho","lang":"pt"}
+data/BR/PI/Itainópolis={"id":"data/BR/PI/Itainópolis","key":"Itainópolis","lang":"pt"}
+data/BR/PI/Itaueira={"id":"data/BR/PI/Itaueira","key":"Itaueira","lang":"pt"}
+data/BR/PI/Jacobina do Piauí={"id":"data/BR/PI/Jacobina do Piauí","key":"Jacobina do Piauí","lang":"pt"}
+data/BR/PI/Jaicós={"id":"data/BR/PI/Jaicós","key":"Jaicós","lang":"pt"}
+data/BR/PI/Jardim do Mulato={"id":"data/BR/PI/Jardim do Mulato","key":"Jardim do Mulato","lang":"pt"}
+data/BR/PI/Jatobá do Piauí={"id":"data/BR/PI/Jatobá do Piauí","key":"Jatobá do Piauí","lang":"pt"}
+data/BR/PI/Jerumenha={"id":"data/BR/PI/Jerumenha","key":"Jerumenha","lang":"pt"}
+data/BR/PI/Joaquim Pires={"id":"data/BR/PI/Joaquim Pires","key":"Joaquim Pires","lang":"pt"}
+data/BR/PI/Joca Marques={"id":"data/BR/PI/Joca Marques","key":"Joca Marques","lang":"pt"}
+data/BR/PI/José de Freitas={"id":"data/BR/PI/José de Freitas","key":"José de Freitas","lang":"pt"}
+data/BR/PI/João Costa={"id":"data/BR/PI/João Costa","key":"João Costa","lang":"pt"}
+data/BR/PI/Juazeiro do Piauí={"id":"data/BR/PI/Juazeiro do Piauí","key":"Juazeiro do Piauí","lang":"pt"}
+data/BR/PI/Julio Borges={"id":"data/BR/PI/Julio Borges","key":"Julio Borges","lang":"pt"}
+data/BR/PI/Jurema={"id":"data/BR/PI/Jurema","key":"Jurema","lang":"pt"}
+data/BR/PI/Lagoa Alegre={"id":"data/BR/PI/Lagoa Alegre","key":"Lagoa Alegre","lang":"pt"}
+data/BR/PI/Lagoa de São Francisco={"id":"data/BR/PI/Lagoa de São Francisco","key":"Lagoa de São Francisco","lang":"pt"}
+data/BR/PI/Lagoa do Barro do Piauí={"id":"data/BR/PI/Lagoa do Barro do Piauí","key":"Lagoa do Barro do Piauí","lang":"pt"}
+data/BR/PI/Lagoa do Piauí={"id":"data/BR/PI/Lagoa do Piauí","key":"Lagoa do Piauí","lang":"pt"}
+data/BR/PI/Lagoa do Sítio={"id":"data/BR/PI/Lagoa do Sítio","key":"Lagoa do Sítio","lang":"pt"}
+data/BR/PI/Lagoinha do Piauí={"id":"data/BR/PI/Lagoinha do Piauí","key":"Lagoinha do Piauí","lang":"pt"}
+data/BR/PI/Landri Sales={"id":"data/BR/PI/Landri Sales","key":"Landri Sales","lang":"pt"}
+data/BR/PI/Luzilândia={"id":"data/BR/PI/Luzilândia","key":"Luzilândia","lang":"pt"}
+data/BR/PI/Luís Correia={"id":"data/BR/PI/Luís Correia","key":"Luís Correia","lang":"pt"}
+data/BR/PI/Madeiro={"id":"data/BR/PI/Madeiro","key":"Madeiro","lang":"pt"}
+data/BR/PI/Manoel Emídio={"id":"data/BR/PI/Manoel Emídio","key":"Manoel Emídio","lang":"pt"}
+data/BR/PI/Marcolândia={"id":"data/BR/PI/Marcolândia","key":"Marcolândia","lang":"pt"}
+data/BR/PI/Marcos Parente={"id":"data/BR/PI/Marcos Parente","key":"Marcos Parente","lang":"pt"}
+data/BR/PI/Massapê do Piauí={"id":"data/BR/PI/Massapê do Piauí","key":"Massapê do Piauí","lang":"pt"}
+data/BR/PI/Matias Olímpio={"id":"data/BR/PI/Matias Olímpio","key":"Matias Olímpio","lang":"pt"}
+data/BR/PI/Miguel Alves={"id":"data/BR/PI/Miguel Alves","key":"Miguel Alves","lang":"pt"}
+data/BR/PI/Miguel Leão={"id":"data/BR/PI/Miguel Leão","key":"Miguel Leão","lang":"pt"}
+data/BR/PI/Milton Brandão={"id":"data/BR/PI/Milton Brandão","key":"Milton Brandão","lang":"pt"}
+data/BR/PI/Monsenhor Gil={"id":"data/BR/PI/Monsenhor Gil","key":"Monsenhor Gil","lang":"pt"}
+data/BR/PI/Monsenhor Hipólito={"id":"data/BR/PI/Monsenhor Hipólito","key":"Monsenhor Hipólito","lang":"pt"}
+data/BR/PI/Monte Alegre do Piauí={"id":"data/BR/PI/Monte Alegre do Piauí","key":"Monte Alegre do Piauí","lang":"pt"}
+data/BR/PI/Morro Cabeça no Tempo={"id":"data/BR/PI/Morro Cabeça no Tempo","key":"Morro Cabeça no Tempo","lang":"pt"}
+data/BR/PI/Morro do Chapéu do Piauí={"id":"data/BR/PI/Morro do Chapéu do Piauí","key":"Morro do Chapéu do Piauí","lang":"pt"}
+data/BR/PI/Murici dos Portelas={"id":"data/BR/PI/Murici dos Portelas","key":"Murici dos Portelas","lang":"pt"}
+data/BR/PI/Nazaré do Piauí={"id":"data/BR/PI/Nazaré do Piauí","key":"Nazaré do Piauí","lang":"pt"}
+data/BR/PI/Nossa Senhora de Nazaré={"id":"data/BR/PI/Nossa Senhora de Nazaré","key":"Nossa Senhora de Nazaré","lang":"pt"}
+data/BR/PI/Nossa Senhora dos Remédios={"id":"data/BR/PI/Nossa Senhora dos Remédios","key":"Nossa Senhora dos Remédios","lang":"pt"}
+data/BR/PI/Nova Santa Rita={"id":"data/BR/PI/Nova Santa Rita","key":"Nova Santa Rita","lang":"pt"}
+data/BR/PI/Novo Oriente do Piauí={"id":"data/BR/PI/Novo Oriente do Piauí","key":"Novo Oriente do Piauí","lang":"pt"}
+data/BR/PI/Novo Santo Antônio={"id":"data/BR/PI/Novo Santo Antônio","key":"Novo Santo Antônio","lang":"pt"}
+data/BR/PI/Oeiras={"id":"data/BR/PI/Oeiras","key":"Oeiras","lang":"pt"}
+data/BR/PI/Olho d'Água do Piauí={"id":"data/BR/PI/Olho d'Água do Piauí","key":"Olho d'Água do Piauí","lang":"pt"}
+data/BR/PI/Padre Marcos={"id":"data/BR/PI/Padre Marcos","key":"Padre Marcos","lang":"pt"}
+data/BR/PI/Paes Landim={"id":"data/BR/PI/Paes Landim","key":"Paes Landim","lang":"pt"}
+data/BR/PI/Pajeú do Piauí={"id":"data/BR/PI/Pajeú do Piauí","key":"Pajeú do Piauí","lang":"pt"}
+data/BR/PI/Palmeira do Piauí={"id":"data/BR/PI/Palmeira do Piauí","key":"Palmeira do Piauí","lang":"pt"}
+data/BR/PI/Palmeirais={"id":"data/BR/PI/Palmeirais","key":"Palmeirais","lang":"pt"}
+data/BR/PI/Paquetá={"id":"data/BR/PI/Paquetá","key":"Paquetá","lang":"pt"}
+data/BR/PI/Parnaguá={"id":"data/BR/PI/Parnaguá","key":"Parnaguá","lang":"pt"}
+data/BR/PI/Parnaíba={"id":"data/BR/PI/Parnaíba","key":"Parnaíba","lang":"pt"}
+data/BR/PI/Passagem Franca do Piauí={"id":"data/BR/PI/Passagem Franca do Piauí","key":"Passagem Franca do Piauí","lang":"pt"}
+data/BR/PI/Patos do Piauí={"id":"data/BR/PI/Patos do Piauí","key":"Patos do Piauí","lang":"pt"}
+data/BR/PI/Pau d'Arco do Piauí={"id":"data/BR/PI/Pau d'Arco do Piauí","key":"Pau d'Arco do Piauí","lang":"pt"}
+data/BR/PI/Paulistana={"id":"data/BR/PI/Paulistana","key":"Paulistana","lang":"pt"}
+data/BR/PI/Pavussu={"id":"data/BR/PI/Pavussu","key":"Pavussu","lang":"pt"}
+data/BR/PI/Pedro II={"id":"data/BR/PI/Pedro II","key":"Pedro II","lang":"pt"}
+data/BR/PI/Pedro Laurentino={"id":"data/BR/PI/Pedro Laurentino","key":"Pedro Laurentino","lang":"pt"}
+data/BR/PI/Picos={"id":"data/BR/PI/Picos","key":"Picos","lang":"pt"}
+data/BR/PI/Pimenteiras={"id":"data/BR/PI/Pimenteiras","key":"Pimenteiras","lang":"pt"}
+data/BR/PI/Pio IX={"id":"data/BR/PI/Pio IX","key":"Pio IX","lang":"pt"}
+data/BR/PI/Piracuruca={"id":"data/BR/PI/Piracuruca","key":"Piracuruca","lang":"pt"}
+data/BR/PI/Piripiri={"id":"data/BR/PI/Piripiri","key":"Piripiri","lang":"pt"}
+data/BR/PI/Porto={"id":"data/BR/PI/Porto","key":"Porto","lang":"pt"}
+data/BR/PI/Porto Alegre do Piauí={"id":"data/BR/PI/Porto Alegre do Piauí","key":"Porto Alegre do Piauí","lang":"pt"}
+data/BR/PI/Prata do Piauí={"id":"data/BR/PI/Prata do Piauí","key":"Prata do Piauí","lang":"pt"}
+data/BR/PI/Queimada Nova={"id":"data/BR/PI/Queimada Nova","key":"Queimada Nova","lang":"pt"}
+data/BR/PI/Redenção do Gurguéia={"id":"data/BR/PI/Redenção do Gurguéia","key":"Redenção do Gurguéia","lang":"pt"}
+data/BR/PI/Regeneração={"id":"data/BR/PI/Regeneração","key":"Regeneração","lang":"pt"}
+data/BR/PI/Riacho Frio={"id":"data/BR/PI/Riacho Frio","key":"Riacho Frio","lang":"pt"}
+data/BR/PI/Ribeira do Piauí={"id":"data/BR/PI/Ribeira do Piauí","key":"Ribeira do Piauí","lang":"pt"}
+data/BR/PI/Ribeiro Gonçalves={"id":"data/BR/PI/Ribeiro Gonçalves","key":"Ribeiro Gonçalves","lang":"pt"}
+data/BR/PI/Rio Grande do Piauí={"id":"data/BR/PI/Rio Grande do Piauí","key":"Rio Grande do Piauí","lang":"pt"}
+data/BR/PI/Santa Cruz do Piauí={"id":"data/BR/PI/Santa Cruz do Piauí","key":"Santa Cruz do Piauí","lang":"pt"}
+data/BR/PI/Santa Cruz dos Milagres={"id":"data/BR/PI/Santa Cruz dos Milagres","key":"Santa Cruz dos Milagres","lang":"pt"}
+data/BR/PI/Santa Filomena={"id":"data/BR/PI/Santa Filomena","key":"Santa Filomena","lang":"pt"}
+data/BR/PI/Santa Luz={"id":"data/BR/PI/Santa Luz","key":"Santa Luz","lang":"pt"}
+data/BR/PI/Santa Rosa do Piauí={"id":"data/BR/PI/Santa Rosa do Piauí","key":"Santa Rosa do Piauí","lang":"pt"}
+data/BR/PI/Santana do Piauí={"id":"data/BR/PI/Santana do Piauí","key":"Santana do Piauí","lang":"pt"}
+data/BR/PI/Santo Antônio de Lisboa={"id":"data/BR/PI/Santo Antônio de Lisboa","key":"Santo Antônio de Lisboa","lang":"pt"}
+data/BR/PI/Santo Antônio dos Milagres={"id":"data/BR/PI/Santo Antônio dos Milagres","key":"Santo Antônio dos Milagres","lang":"pt"}
+data/BR/PI/Santo Inácio do Piauí={"id":"data/BR/PI/Santo Inácio do Piauí","key":"Santo Inácio do Piauí","lang":"pt"}
+data/BR/PI/Sebastião Barros={"id":"data/BR/PI/Sebastião Barros","key":"Sebastião Barros","lang":"pt"}
+data/BR/PI/Sebastião Leal={"id":"data/BR/PI/Sebastião Leal","key":"Sebastião Leal","lang":"pt"}
+data/BR/PI/Sigefredo Pacheco={"id":"data/BR/PI/Sigefredo Pacheco","key":"Sigefredo Pacheco","lang":"pt"}
+data/BR/PI/Simplício Mendes={"id":"data/BR/PI/Simplício Mendes","key":"Simplício Mendes","lang":"pt"}
+data/BR/PI/Simões={"id":"data/BR/PI/Simões","key":"Simões","lang":"pt"}
+data/BR/PI/Socorro do Piauí={"id":"data/BR/PI/Socorro do Piauí","key":"Socorro do Piauí","lang":"pt"}
+data/BR/PI/Sussuapara={"id":"data/BR/PI/Sussuapara","key":"Sussuapara","lang":"pt"}
+data/BR/PI/São Braz do Piauí={"id":"data/BR/PI/São Braz do Piauí","key":"São Braz do Piauí","lang":"pt"}
+data/BR/PI/São Francisco de Assis do Piauí={"id":"data/BR/PI/São Francisco de Assis do Piauí","key":"São Francisco de Assis do Piauí","lang":"pt"}
+data/BR/PI/São Francisco do Piauí={"id":"data/BR/PI/São Francisco do Piauí","key":"São Francisco do Piauí","lang":"pt"}
+data/BR/PI/São Félix do Piauí={"id":"data/BR/PI/São Félix do Piauí","key":"São Félix do Piauí","lang":"pt"}
+data/BR/PI/São Gonçalo do Gurguéia={"id":"data/BR/PI/São Gonçalo do Gurguéia","key":"São Gonçalo do Gurguéia","lang":"pt"}
+data/BR/PI/São Gonçalo do Piauí={"id":"data/BR/PI/São Gonçalo do Piauí","key":"São Gonçalo do Piauí","lang":"pt"}
+data/BR/PI/São José do Divino={"id":"data/BR/PI/São José do Divino","key":"São José do Divino","lang":"pt"}
+data/BR/PI/São José do Peixe={"id":"data/BR/PI/São José do Peixe","key":"São José do Peixe","lang":"pt"}
+data/BR/PI/São José do Piauí={"id":"data/BR/PI/São José do Piauí","key":"São José do Piauí","lang":"pt"}
+data/BR/PI/São João da Canabrava={"id":"data/BR/PI/São João da Canabrava","key":"São João da Canabrava","lang":"pt"}
+data/BR/PI/São João da Fronteira={"id":"data/BR/PI/São João da Fronteira","key":"São João da Fronteira","lang":"pt"}
+data/BR/PI/São João da Serra={"id":"data/BR/PI/São João da Serra","key":"São João da Serra","lang":"pt"}
+data/BR/PI/São João da Varjota={"id":"data/BR/PI/São João da Varjota","key":"São João da Varjota","lang":"pt"}
+data/BR/PI/São João do Arraial={"id":"data/BR/PI/São João do Arraial","key":"São João do Arraial","lang":"pt"}
+data/BR/PI/São João do Piauí={"id":"data/BR/PI/São João do Piauí","key":"São João do Piauí","lang":"pt"}
+data/BR/PI/São Julião={"id":"data/BR/PI/São Julião","key":"São Julião","lang":"pt"}
+data/BR/PI/São Lourenço do Piauí={"id":"data/BR/PI/São Lourenço do Piauí","key":"São Lourenço do Piauí","lang":"pt"}
+data/BR/PI/São Luís do Piauí={"id":"data/BR/PI/São Luís do Piauí","key":"São Luís do Piauí","lang":"pt"}
+data/BR/PI/São Miguel da Baixa Grande={"id":"data/BR/PI/São Miguel da Baixa Grande","key":"São Miguel da Baixa Grande","lang":"pt"}
+data/BR/PI/São Miguel do Fidalgo={"id":"data/BR/PI/São Miguel do Fidalgo","key":"São Miguel do Fidalgo","lang":"pt"}
+data/BR/PI/São Miguel do Tapuio={"id":"data/BR/PI/São Miguel do Tapuio","key":"São Miguel do Tapuio","lang":"pt"}
+data/BR/PI/São Pedro do Piauí={"id":"data/BR/PI/São Pedro do Piauí","key":"São Pedro do Piauí","lang":"pt"}
+data/BR/PI/São Raimundo Nonato={"id":"data/BR/PI/São Raimundo Nonato","key":"São Raimundo Nonato","lang":"pt"}
+data/BR/PI/Tamboril do Piauí={"id":"data/BR/PI/Tamboril do Piauí","key":"Tamboril do Piauí","lang":"pt"}
+data/BR/PI/Tanque do Piauí={"id":"data/BR/PI/Tanque do Piauí","key":"Tanque do Piauí","lang":"pt"}
+data/BR/PI/Teresina={"id":"data/BR/PI/Teresina","key":"Teresina","lang":"pt"}
+data/BR/PI/União={"id":"data/BR/PI/União","key":"União","lang":"pt"}
+data/BR/PI/Uruçuí={"id":"data/BR/PI/Uruçuí","key":"Uruçuí","lang":"pt"}
+data/BR/PI/Valença do Piauí={"id":"data/BR/PI/Valença do Piauí","key":"Valença do Piauí","lang":"pt"}
+data/BR/PI/Vera Mendes={"id":"data/BR/PI/Vera Mendes","key":"Vera Mendes","lang":"pt"}
+data/BR/PI/Vila Nova do Piauí={"id":"data/BR/PI/Vila Nova do Piauí","key":"Vila Nova do Piauí","lang":"pt"}
+data/BR/PI/Várzea Branca={"id":"data/BR/PI/Várzea Branca","key":"Várzea Branca","lang":"pt"}
+data/BR/PI/Várzea Grande={"id":"data/BR/PI/Várzea Grande","key":"Várzea Grande","lang":"pt"}
+data/BR/PI/Wall Ferraz={"id":"data/BR/PI/Wall Ferraz","key":"Wall Ferraz","lang":"pt"}
+data/BR/PI/Água Branca={"id":"data/BR/PI/Água Branca","key":"Água Branca","lang":"pt"}
+data/BR/PR={"id":"data/BR/PR","key":"PR","name":"Paraná","lang":"pt","zip":"8[0-7]","zipex":"80000-000,87999-999","sub_keys":"Abatiá~Adrianópolis~Agudos do Sul~Almirante Tamandaré~Altamira do Paraná~Alto Paraná~Alto Piquiri~Altônia~Alvorada do Sul~Amaporã~Ampere~Anahy~Andira~Angulo~Antonina~Antônio Olinto~Apucarana~Arapongas~Arapoti~Arapuá~Araruna~Araucaria~Ariranha do Ivaí~Assaí~Assis Chateaubriand~Astorga~Atalaia~Balsa Nova~Bandeirantes~Barbosa Ferraz~Barra do Jacaré~Barracão~Bela Vista da Caroba~Bela Vista do Paraíso~Bituruna~Boa Esperança~Boa Esperança do Iguaçu~Boa Ventura de São Roque~Boa Vista da Aparecida~Bocaiúva do Sul~Bom Jesus do Sul~Bom Sucesso~Bom Sucesso do Sul~Borrazópolis~Braganey~Brasilândia do Sul~Cafeara~Cafelândia~Cafezal do Sul~California~Cambará~Cambé~Cambira~Campina da Lagoa~Campina do Simão~Campina Grande do Sul~Campo Bonito~Campo do Tenente~Campo Largo~Campo Magro~Campo Mourão~Cândido de Abreu~Candói~Cantagalo~Capanema~Capitão Leônidas Marques~Carambeí~Carlópolis~Cascavel~Castro~Catanduvas~Centenário do Sul~Cerro Azul~Céu Azul~Chopinzinho~Cianorte~Cidade Gaúcha~Clevelândia~Colombo~Colorado~Congonhinhas~Conselheiro Mairinck~Contenda~Corbélia~Cornélio Procópio~Coronel Domingos Soares~Coronel Vivida~Corumbataí do Sul~Cruz Machado~Cruzeiro do Iguaçu~Cruzeiro do Oeste~Cruzeiro do Sul~Cruzmaltina~Curitiba~Curiúva~Diamante d'Oeste~Diamante do Norte~Diamante do Sul~Dois Vizinhos~Douradina~Doutor Camargo~Doutor Ulysses~Enéas Marques~Engenheiro Beltrão~Entre Rios do Oeste~Esperança Nova~Espigão Alto do Iguaçu~Farol~Faxinal~Fazenda Rio Grande~Fênix~Fernandes Pinheiro~Figueira~Flor da Serra do Sul~Floraí~Floresta~Florestópolis~Flórida~Formosa do Oeste~Foz do Iguaçu~Foz do Jordão~Francisco Alves~Francisco Beltrão~General Carneiro~Godoy Moreira~Goioerê~Goioxim~Grandes Rios~Guaíra~Guairaçá~Guamiranga~Guapirama~Guaporema~Guaraci~Guaraniaçu~Guarapuava~Guaraqueçaba~Guaratuba~Honório Serpa~Ibaiti~Ibema~Ibiporã~Icaraíma~Iguaraçu~Iguatu~Imbaú~Imbituva~Inácio Martins~Inajá~Indianópolis~Ipiranga~Iporá~Iracema do Oeste~Irati~Iretama~Itaguajé~Itaipulândia~Itambaracá~Itambé~Itapejara d'Oeste~Itaperuçu~Itaúna do Sul~Ivaí~Ivaiporã~Ivaté~Ivatuba~Jaboti~Jacarezinho~Jaguapitã~Jaguariaíva~Jandaia do Sul~Janiópolis~Japira~Japurá~Jardim Alegre~Jardim Olinda~Jataizinho~Jesuítas~Joaquim Távora~Jundiaí do Sul~Juranda~Jussara~Kaloré~Lapa~Laranjal~Laranjeiras do Sul~Leopolis~Lidianópolis~Lindoeste~Loanda~Lobato~Londrina~Luiziana~Lunardelli~Lupionópolis~Mallet~Mamborê~Mandaguaçu~Mandaguari~Mandirituba~Manfrinópolis~Mangueirinha~Manoel Ribas~Marechal Cândido Rondon~Maria Helena~Marialva~Marilândia do Sul~Marilena~Mariluz~Maringá~Mariópolis~Maripá~Marmeleiro~Marquinho~Marumbi~Matelândia~Matinhos~Mato Rico~Mauá da Serra~Medianeira~Mercedes~Mirador~Miraselva~Missal~Moreira Sales~Morretes~Munhoz de Melo~Nossa Senhora das Graças~Nova Aliança do Ivaí~Nova América da Colina~Nova Aurora~Nova Cantu~Nova Esperança~Nova Esperança do Sudoeste~Nova Fátima~Nova Laranjeiras~Nova Londrina~Nova Olímpia~Nova Prata do Iguaçu~Nova Santa Bárbara~Nova Santa Rosa~Nova Tebas~Novo Itacolomi~Ortigueira~Ourizona~Ouro Verde do Oeste~Paiçandu~Palmas~Palmeira~Palmital~Palotina~Paraíso do Norte~Paranacity~Paranaguá~Paranapoema~Paranavaí~Pato Bragado~Pato Branco~Paula Freitas~Paulo Frontin~Peabiru~Perobal~Pérola~Pérola d'Oeste~Piên~Pinhais~Pinhal de São Bento~Pinhalão~Pinhão~Piraí do Sul~Piraquara~Pitanga~Pitangueiras~Planaltina do Paraná~Planalto~Ponta Grossa~Pontal do Paraná~Porecatu~Porto Amazonas~Porto Barreiro~Porto Rico~Porto Vitória~Prado Ferreira~Pranchita~Presidente Castelo Branco~Primeiro de Maio~Prudentópolis~Quarto Centenário~Quatiguá~Quatro Barras~Quatro Pontes~Quedas do Iguaçu~Querência do Norte~Quinta do Sol~Quitandinha~Ramilândia~Rancho Alegre~Rancho Alegre d'Oeste~Realeza~Rebouças~Renascença~Reserva~Reserva do Iguaçu~Ribeirão Claro~Ribeirão do Pinhal~Río Azul~Rio Bom~Rio Bonito do Iguaçu~Rio Branco do Ivaí~Rio Branco do Sul~Rio Negro~Rolândia~Roncador~Rondon~Rosário do Ivaí~Sabaudia~Salgado Filho~Salto do Itararé~Salto do Lontra~Santa Amélia~Santa Cecília do Pavão~Santa Cruz do Monte Castelo~Santa Fé~Santa Helena~Santa Inês~Santa Isabel do Ivaí~Santa Izabel do Oeste~Santa Lucia~Santa Maria do Oeste~Santa Mariana~Santa Monica~Santa Tereza do Oeste~Santa Terezinha de Itaipu~Santana do Itararé~Santo Antônio da Platina~Santo Antônio do Caiuá~Santo Antônio do Paraíso~Santo Antonio Do Sudoeste~Santo Inácio~São Carlos do Ivaí~São Jerônimo da Serra~São João~São João do Caiuá~São João do Ivaí~São João do Triunfo~São Jorge d'Oeste~São Jorge do Ivaí~São Jorge do Patrocínio~São José da Boa Vista~São José das Palmeiras~São José dos Pinhais~São Manoel do Paraná~São Mateus do Sul~São Miguel do Iguaçu~São Pedro do Iguaçu~São Pedro do Ivaí~São Pedro do Paraná~São Sebastião da Amoreira~São Tomé~Sapopema~Sarandí~Saudade do Iguaçu~Sengés~Serranópolis do Iguaçu~Sertaneja~Sertanópolis~Siqueira Campos~Sulina~Tamarana~Tamboara~Tapejara~Tapira~Teixeira Soares~Telêmaco Borba~Terra Boa~Terra Rica~Terra Roxa~Tibagi~Tijucas do Sul~Toledo~Tomazina~Três Barras do Paraná~Tunas do Paraná~Tuneiras do Oeste~Tupãssi~Turvo~Ubiratã~Umuarama~União da Vitória~Uniflor~Uraí~Ventania~Vera Cruz do Oeste~Verê~Vila Alta~Virmond~Vitorino~Wenceslau Braz~Xambrê"}
+data/BR/PR/Abatiá={"id":"data/BR/PR/Abatiá","key":"Abatiá","lang":"pt"}
+data/BR/PR/Adrianópolis={"id":"data/BR/PR/Adrianópolis","key":"Adrianópolis","lang":"pt"}
+data/BR/PR/Agudos do Sul={"id":"data/BR/PR/Agudos do Sul","key":"Agudos do Sul","lang":"pt"}
+data/BR/PR/Almirante Tamandaré={"id":"data/BR/PR/Almirante Tamandaré","key":"Almirante Tamandaré","lang":"pt"}
+data/BR/PR/Altamira do Paraná={"id":"data/BR/PR/Altamira do Paraná","key":"Altamira do Paraná","lang":"pt"}
+data/BR/PR/Alto Paraná={"id":"data/BR/PR/Alto Paraná","key":"Alto Paraná","lang":"pt"}
+data/BR/PR/Alto Piquiri={"id":"data/BR/PR/Alto Piquiri","key":"Alto Piquiri","lang":"pt"}
+data/BR/PR/Altônia={"id":"data/BR/PR/Altônia","key":"Altônia","lang":"pt"}
+data/BR/PR/Alvorada do Sul={"id":"data/BR/PR/Alvorada do Sul","key":"Alvorada do Sul","lang":"pt"}
+data/BR/PR/Amaporã={"id":"data/BR/PR/Amaporã","key":"Amaporã","lang":"pt"}
+data/BR/PR/Ampere={"id":"data/BR/PR/Ampere","key":"Ampere","lang":"pt"}
+data/BR/PR/Anahy={"id":"data/BR/PR/Anahy","key":"Anahy","lang":"pt"}
+data/BR/PR/Andira={"id":"data/BR/PR/Andira","key":"Andira","lang":"pt"}
+data/BR/PR/Angulo={"id":"data/BR/PR/Angulo","key":"Angulo","lang":"pt"}
+data/BR/PR/Antonina={"id":"data/BR/PR/Antonina","key":"Antonina","lang":"pt"}
+data/BR/PR/Antônio Olinto={"id":"data/BR/PR/Antônio Olinto","key":"Antônio Olinto","lang":"pt"}
+data/BR/PR/Apucarana={"id":"data/BR/PR/Apucarana","key":"Apucarana","lang":"pt"}
+data/BR/PR/Arapongas={"id":"data/BR/PR/Arapongas","key":"Arapongas","lang":"pt"}
+data/BR/PR/Arapoti={"id":"data/BR/PR/Arapoti","key":"Arapoti","lang":"pt"}
+data/BR/PR/Arapuá={"id":"data/BR/PR/Arapuá","key":"Arapuá","lang":"pt"}
+data/BR/PR/Araruna={"id":"data/BR/PR/Araruna","key":"Araruna","lang":"pt"}
+data/BR/PR/Araucaria={"id":"data/BR/PR/Araucaria","key":"Araucaria","lang":"pt"}
+data/BR/PR/Ariranha do Ivaí={"id":"data/BR/PR/Ariranha do Ivaí","key":"Ariranha do Ivaí","lang":"pt"}
+data/BR/PR/Assaí={"id":"data/BR/PR/Assaí","key":"Assaí","lang":"pt"}
+data/BR/PR/Assis Chateaubriand={"id":"data/BR/PR/Assis Chateaubriand","key":"Assis Chateaubriand","lang":"pt"}
+data/BR/PR/Astorga={"id":"data/BR/PR/Astorga","key":"Astorga","lang":"pt"}
+data/BR/PR/Atalaia={"id":"data/BR/PR/Atalaia","key":"Atalaia","lang":"pt"}
+data/BR/PR/Balsa Nova={"id":"data/BR/PR/Balsa Nova","key":"Balsa Nova","lang":"pt"}
+data/BR/PR/Bandeirantes={"id":"data/BR/PR/Bandeirantes","key":"Bandeirantes","lang":"pt"}
+data/BR/PR/Barbosa Ferraz={"id":"data/BR/PR/Barbosa Ferraz","key":"Barbosa Ferraz","lang":"pt"}
+data/BR/PR/Barra do Jacaré={"id":"data/BR/PR/Barra do Jacaré","key":"Barra do Jacaré","lang":"pt"}
+data/BR/PR/Barracão={"id":"data/BR/PR/Barracão","key":"Barracão","lang":"pt"}
+data/BR/PR/Bela Vista da Caroba={"id":"data/BR/PR/Bela Vista da Caroba","key":"Bela Vista da Caroba","lang":"pt"}
+data/BR/PR/Bela Vista do Paraíso={"id":"data/BR/PR/Bela Vista do Paraíso","key":"Bela Vista do Paraíso","lang":"pt"}
+data/BR/PR/Bituruna={"id":"data/BR/PR/Bituruna","key":"Bituruna","lang":"pt"}
+data/BR/PR/Boa Esperança={"id":"data/BR/PR/Boa Esperança","key":"Boa Esperança","lang":"pt"}
+data/BR/PR/Boa Esperança do Iguaçu={"id":"data/BR/PR/Boa Esperança do Iguaçu","key":"Boa Esperança do Iguaçu","lang":"pt"}
+data/BR/PR/Boa Ventura de São Roque={"id":"data/BR/PR/Boa Ventura de São Roque","key":"Boa Ventura de São Roque","lang":"pt"}
+data/BR/PR/Boa Vista da Aparecida={"id":"data/BR/PR/Boa Vista da Aparecida","key":"Boa Vista da Aparecida","lang":"pt"}
+data/BR/PR/Bocaiúva do Sul={"id":"data/BR/PR/Bocaiúva do Sul","key":"Bocaiúva do Sul","lang":"pt"}
+data/BR/PR/Bom Jesus do Sul={"id":"data/BR/PR/Bom Jesus do Sul","key":"Bom Jesus do Sul","lang":"pt"}
+data/BR/PR/Bom Sucesso={"id":"data/BR/PR/Bom Sucesso","key":"Bom Sucesso","lang":"pt"}
+data/BR/PR/Bom Sucesso do Sul={"id":"data/BR/PR/Bom Sucesso do Sul","key":"Bom Sucesso do Sul","lang":"pt"}
+data/BR/PR/Borrazópolis={"id":"data/BR/PR/Borrazópolis","key":"Borrazópolis","lang":"pt"}
+data/BR/PR/Braganey={"id":"data/BR/PR/Braganey","key":"Braganey","lang":"pt"}
+data/BR/PR/Brasilândia do Sul={"id":"data/BR/PR/Brasilândia do Sul","key":"Brasilândia do Sul","lang":"pt"}
+data/BR/PR/Cafeara={"id":"data/BR/PR/Cafeara","key":"Cafeara","lang":"pt"}
+data/BR/PR/Cafelândia={"id":"data/BR/PR/Cafelândia","key":"Cafelândia","lang":"pt"}
+data/BR/PR/Cafezal do Sul={"id":"data/BR/PR/Cafezal do Sul","key":"Cafezal do Sul","lang":"pt"}
+data/BR/PR/California={"id":"data/BR/PR/California","key":"California","lang":"pt"}
+data/BR/PR/Cambará={"id":"data/BR/PR/Cambará","key":"Cambará","lang":"pt"}
+data/BR/PR/Cambira={"id":"data/BR/PR/Cambira","key":"Cambira","lang":"pt"}
+data/BR/PR/Cambé={"id":"data/BR/PR/Cambé","key":"Cambé","lang":"pt"}
+data/BR/PR/Campina Grande do Sul={"id":"data/BR/PR/Campina Grande do Sul","key":"Campina Grande do Sul","lang":"pt"}
+data/BR/PR/Campina da Lagoa={"id":"data/BR/PR/Campina da Lagoa","key":"Campina da Lagoa","lang":"pt"}
+data/BR/PR/Campina do Simão={"id":"data/BR/PR/Campina do Simão","key":"Campina do Simão","lang":"pt"}
+data/BR/PR/Campo Bonito={"id":"data/BR/PR/Campo Bonito","key":"Campo Bonito","lang":"pt"}
+data/BR/PR/Campo Largo={"id":"data/BR/PR/Campo Largo","key":"Campo Largo","lang":"pt"}
+data/BR/PR/Campo Magro={"id":"data/BR/PR/Campo Magro","key":"Campo Magro","lang":"pt"}
+data/BR/PR/Campo Mourão={"id":"data/BR/PR/Campo Mourão","key":"Campo Mourão","lang":"pt"}
+data/BR/PR/Campo do Tenente={"id":"data/BR/PR/Campo do Tenente","key":"Campo do Tenente","lang":"pt"}
+data/BR/PR/Candói={"id":"data/BR/PR/Candói","key":"Candói","lang":"pt"}
+data/BR/PR/Cantagalo={"id":"data/BR/PR/Cantagalo","key":"Cantagalo","lang":"pt"}
+data/BR/PR/Capanema={"id":"data/BR/PR/Capanema","key":"Capanema","lang":"pt"}
+data/BR/PR/Capitão Leônidas Marques={"id":"data/BR/PR/Capitão Leônidas Marques","key":"Capitão Leônidas Marques","lang":"pt"}
+data/BR/PR/Carambeí={"id":"data/BR/PR/Carambeí","key":"Carambeí","lang":"pt"}
+data/BR/PR/Carlópolis={"id":"data/BR/PR/Carlópolis","key":"Carlópolis","lang":"pt"}
+data/BR/PR/Cascavel={"id":"data/BR/PR/Cascavel","key":"Cascavel","lang":"pt"}
+data/BR/PR/Castro={"id":"data/BR/PR/Castro","key":"Castro","lang":"pt"}
+data/BR/PR/Catanduvas={"id":"data/BR/PR/Catanduvas","key":"Catanduvas","lang":"pt"}
+data/BR/PR/Centenário do Sul={"id":"data/BR/PR/Centenário do Sul","key":"Centenário do Sul","lang":"pt"}
+data/BR/PR/Cerro Azul={"id":"data/BR/PR/Cerro Azul","key":"Cerro Azul","lang":"pt"}
+data/BR/PR/Chopinzinho={"id":"data/BR/PR/Chopinzinho","key":"Chopinzinho","lang":"pt"}
+data/BR/PR/Cianorte={"id":"data/BR/PR/Cianorte","key":"Cianorte","lang":"pt"}
+data/BR/PR/Cidade Gaúcha={"id":"data/BR/PR/Cidade Gaúcha","key":"Cidade Gaúcha","lang":"pt"}
+data/BR/PR/Clevelândia={"id":"data/BR/PR/Clevelândia","key":"Clevelândia","lang":"pt"}
+data/BR/PR/Colombo={"id":"data/BR/PR/Colombo","key":"Colombo","lang":"pt"}
+data/BR/PR/Colorado={"id":"data/BR/PR/Colorado","key":"Colorado","lang":"pt"}
+data/BR/PR/Congonhinhas={"id":"data/BR/PR/Congonhinhas","key":"Congonhinhas","lang":"pt"}
+data/BR/PR/Conselheiro Mairinck={"id":"data/BR/PR/Conselheiro Mairinck","key":"Conselheiro Mairinck","lang":"pt"}
+data/BR/PR/Contenda={"id":"data/BR/PR/Contenda","key":"Contenda","lang":"pt"}
+data/BR/PR/Corbélia={"id":"data/BR/PR/Corbélia","key":"Corbélia","lang":"pt"}
+data/BR/PR/Cornélio Procópio={"id":"data/BR/PR/Cornélio Procópio","key":"Cornélio Procópio","lang":"pt"}
+data/BR/PR/Coronel Domingos Soares={"id":"data/BR/PR/Coronel Domingos Soares","key":"Coronel Domingos Soares","lang":"pt"}
+data/BR/PR/Coronel Vivida={"id":"data/BR/PR/Coronel Vivida","key":"Coronel Vivida","lang":"pt"}
+data/BR/PR/Corumbataí do Sul={"id":"data/BR/PR/Corumbataí do Sul","key":"Corumbataí do Sul","lang":"pt"}
+data/BR/PR/Cruz Machado={"id":"data/BR/PR/Cruz Machado","key":"Cruz Machado","lang":"pt"}
+data/BR/PR/Cruzeiro do Iguaçu={"id":"data/BR/PR/Cruzeiro do Iguaçu","key":"Cruzeiro do Iguaçu","lang":"pt"}
+data/BR/PR/Cruzeiro do Oeste={"id":"data/BR/PR/Cruzeiro do Oeste","key":"Cruzeiro do Oeste","lang":"pt"}
+data/BR/PR/Cruzeiro do Sul={"id":"data/BR/PR/Cruzeiro do Sul","key":"Cruzeiro do Sul","lang":"pt"}
+data/BR/PR/Cruzmaltina={"id":"data/BR/PR/Cruzmaltina","key":"Cruzmaltina","lang":"pt"}
+data/BR/PR/Curitiba={"id":"data/BR/PR/Curitiba","key":"Curitiba","lang":"pt"}
+data/BR/PR/Curiúva={"id":"data/BR/PR/Curiúva","key":"Curiúva","lang":"pt"}
+data/BR/PR/Cândido de Abreu={"id":"data/BR/PR/Cândido de Abreu","key":"Cândido de Abreu","lang":"pt"}
+data/BR/PR/Céu Azul={"id":"data/BR/PR/Céu Azul","key":"Céu Azul","lang":"pt"}
+data/BR/PR/Diamante d'Oeste={"id":"data/BR/PR/Diamante d'Oeste","key":"Diamante d'Oeste","lang":"pt"}
+data/BR/PR/Diamante do Norte={"id":"data/BR/PR/Diamante do Norte","key":"Diamante do Norte","lang":"pt"}
+data/BR/PR/Diamante do Sul={"id":"data/BR/PR/Diamante do Sul","key":"Diamante do Sul","lang":"pt"}
+data/BR/PR/Dois Vizinhos={"id":"data/BR/PR/Dois Vizinhos","key":"Dois Vizinhos","lang":"pt"}
+data/BR/PR/Douradina={"id":"data/BR/PR/Douradina","key":"Douradina","lang":"pt"}
+data/BR/PR/Doutor Camargo={"id":"data/BR/PR/Doutor Camargo","key":"Doutor Camargo","lang":"pt"}
+data/BR/PR/Doutor Ulysses={"id":"data/BR/PR/Doutor Ulysses","key":"Doutor Ulysses","lang":"pt"}
+data/BR/PR/Engenheiro Beltrão={"id":"data/BR/PR/Engenheiro Beltrão","key":"Engenheiro Beltrão","lang":"pt"}
+data/BR/PR/Entre Rios do Oeste={"id":"data/BR/PR/Entre Rios do Oeste","key":"Entre Rios do Oeste","lang":"pt"}
+data/BR/PR/Enéas Marques={"id":"data/BR/PR/Enéas Marques","key":"Enéas Marques","lang":"pt"}
+data/BR/PR/Esperança Nova={"id":"data/BR/PR/Esperança Nova","key":"Esperança Nova","lang":"pt"}
+data/BR/PR/Espigão Alto do Iguaçu={"id":"data/BR/PR/Espigão Alto do Iguaçu","key":"Espigão Alto do Iguaçu","lang":"pt"}
+data/BR/PR/Farol={"id":"data/BR/PR/Farol","key":"Farol","lang":"pt"}
+data/BR/PR/Faxinal={"id":"data/BR/PR/Faxinal","key":"Faxinal","lang":"pt"}
+data/BR/PR/Fazenda Rio Grande={"id":"data/BR/PR/Fazenda Rio Grande","key":"Fazenda Rio Grande","lang":"pt"}
+data/BR/PR/Fernandes Pinheiro={"id":"data/BR/PR/Fernandes Pinheiro","key":"Fernandes Pinheiro","lang":"pt"}
+data/BR/PR/Figueira={"id":"data/BR/PR/Figueira","key":"Figueira","lang":"pt"}
+data/BR/PR/Flor da Serra do Sul={"id":"data/BR/PR/Flor da Serra do Sul","key":"Flor da Serra do Sul","lang":"pt"}
+data/BR/PR/Floraí={"id":"data/BR/PR/Floraí","key":"Floraí","lang":"pt"}
+data/BR/PR/Floresta={"id":"data/BR/PR/Floresta","key":"Floresta","lang":"pt"}
+data/BR/PR/Florestópolis={"id":"data/BR/PR/Florestópolis","key":"Florestópolis","lang":"pt"}
+data/BR/PR/Flórida={"id":"data/BR/PR/Flórida","key":"Flórida","lang":"pt"}
+data/BR/PR/Formosa do Oeste={"id":"data/BR/PR/Formosa do Oeste","key":"Formosa do Oeste","lang":"pt"}
+data/BR/PR/Foz do Iguaçu={"id":"data/BR/PR/Foz do Iguaçu","key":"Foz do Iguaçu","lang":"pt"}
+data/BR/PR/Foz do Jordão={"id":"data/BR/PR/Foz do Jordão","key":"Foz do Jordão","lang":"pt"}
+data/BR/PR/Francisco Alves={"id":"data/BR/PR/Francisco Alves","key":"Francisco Alves","lang":"pt"}
+data/BR/PR/Francisco Beltrão={"id":"data/BR/PR/Francisco Beltrão","key":"Francisco Beltrão","lang":"pt"}
+data/BR/PR/Fênix={"id":"data/BR/PR/Fênix","key":"Fênix","lang":"pt"}
+data/BR/PR/General Carneiro={"id":"data/BR/PR/General Carneiro","key":"General Carneiro","lang":"pt"}
+data/BR/PR/Godoy Moreira={"id":"data/BR/PR/Godoy Moreira","key":"Godoy Moreira","lang":"pt"}
+data/BR/PR/Goioerê={"id":"data/BR/PR/Goioerê","key":"Goioerê","lang":"pt"}
+data/BR/PR/Goioxim={"id":"data/BR/PR/Goioxim","key":"Goioxim","lang":"pt"}
+data/BR/PR/Grandes Rios={"id":"data/BR/PR/Grandes Rios","key":"Grandes Rios","lang":"pt"}
+data/BR/PR/Guairaçá={"id":"data/BR/PR/Guairaçá","key":"Guairaçá","lang":"pt"}
+data/BR/PR/Guamiranga={"id":"data/BR/PR/Guamiranga","key":"Guamiranga","lang":"pt"}
+data/BR/PR/Guapirama={"id":"data/BR/PR/Guapirama","key":"Guapirama","lang":"pt"}
+data/BR/PR/Guaporema={"id":"data/BR/PR/Guaporema","key":"Guaporema","lang":"pt"}
+data/BR/PR/Guaraci={"id":"data/BR/PR/Guaraci","key":"Guaraci","lang":"pt"}
+data/BR/PR/Guaraniaçu={"id":"data/BR/PR/Guaraniaçu","key":"Guaraniaçu","lang":"pt"}
+data/BR/PR/Guarapuava={"id":"data/BR/PR/Guarapuava","key":"Guarapuava","lang":"pt"}
+data/BR/PR/Guaraqueçaba={"id":"data/BR/PR/Guaraqueçaba","key":"Guaraqueçaba","lang":"pt"}
+data/BR/PR/Guaratuba={"id":"data/BR/PR/Guaratuba","key":"Guaratuba","lang":"pt"}
+data/BR/PR/Guaíra={"id":"data/BR/PR/Guaíra","key":"Guaíra","lang":"pt"}
+data/BR/PR/Honório Serpa={"id":"data/BR/PR/Honório Serpa","key":"Honório Serpa","lang":"pt"}
+data/BR/PR/Ibaiti={"id":"data/BR/PR/Ibaiti","key":"Ibaiti","lang":"pt"}
+data/BR/PR/Ibema={"id":"data/BR/PR/Ibema","key":"Ibema","lang":"pt"}
+data/BR/PR/Ibiporã={"id":"data/BR/PR/Ibiporã","key":"Ibiporã","lang":"pt"}
+data/BR/PR/Icaraíma={"id":"data/BR/PR/Icaraíma","key":"Icaraíma","lang":"pt"}
+data/BR/PR/Iguaraçu={"id":"data/BR/PR/Iguaraçu","key":"Iguaraçu","lang":"pt"}
+data/BR/PR/Iguatu={"id":"data/BR/PR/Iguatu","key":"Iguatu","lang":"pt"}
+data/BR/PR/Imbaú={"id":"data/BR/PR/Imbaú","key":"Imbaú","lang":"pt"}
+data/BR/PR/Imbituva={"id":"data/BR/PR/Imbituva","key":"Imbituva","lang":"pt"}
+data/BR/PR/Inajá={"id":"data/BR/PR/Inajá","key":"Inajá","lang":"pt"}
+data/BR/PR/Indianópolis={"id":"data/BR/PR/Indianópolis","key":"Indianópolis","lang":"pt"}
+data/BR/PR/Inácio Martins={"id":"data/BR/PR/Inácio Martins","key":"Inácio Martins","lang":"pt"}
+data/BR/PR/Ipiranga={"id":"data/BR/PR/Ipiranga","key":"Ipiranga","lang":"pt"}
+data/BR/PR/Iporá={"id":"data/BR/PR/Iporá","key":"Iporá","lang":"pt"}
+data/BR/PR/Iracema do Oeste={"id":"data/BR/PR/Iracema do Oeste","key":"Iracema do Oeste","lang":"pt"}
+data/BR/PR/Irati={"id":"data/BR/PR/Irati","key":"Irati","lang":"pt"}
+data/BR/PR/Iretama={"id":"data/BR/PR/Iretama","key":"Iretama","lang":"pt"}
+data/BR/PR/Itaguajé={"id":"data/BR/PR/Itaguajé","key":"Itaguajé","lang":"pt"}
+data/BR/PR/Itaipulândia={"id":"data/BR/PR/Itaipulândia","key":"Itaipulândia","lang":"pt"}
+data/BR/PR/Itambaracá={"id":"data/BR/PR/Itambaracá","key":"Itambaracá","lang":"pt"}
+data/BR/PR/Itambé={"id":"data/BR/PR/Itambé","key":"Itambé","lang":"pt"}
+data/BR/PR/Itapejara d'Oeste={"id":"data/BR/PR/Itapejara d'Oeste","key":"Itapejara d'Oeste","lang":"pt"}
+data/BR/PR/Itaperuçu={"id":"data/BR/PR/Itaperuçu","key":"Itaperuçu","lang":"pt"}
+data/BR/PR/Itaúna do Sul={"id":"data/BR/PR/Itaúna do Sul","key":"Itaúna do Sul","lang":"pt"}
+data/BR/PR/Ivaiporã={"id":"data/BR/PR/Ivaiporã","key":"Ivaiporã","lang":"pt"}
+data/BR/PR/Ivatuba={"id":"data/BR/PR/Ivatuba","key":"Ivatuba","lang":"pt"}
+data/BR/PR/Ivaté={"id":"data/BR/PR/Ivaté","key":"Ivaté","lang":"pt"}
+data/BR/PR/Ivaí={"id":"data/BR/PR/Ivaí","key":"Ivaí","lang":"pt"}
+data/BR/PR/Jaboti={"id":"data/BR/PR/Jaboti","key":"Jaboti","lang":"pt"}
+data/BR/PR/Jacarezinho={"id":"data/BR/PR/Jacarezinho","key":"Jacarezinho","lang":"pt"}
+data/BR/PR/Jaguapitã={"id":"data/BR/PR/Jaguapitã","key":"Jaguapitã","lang":"pt"}
+data/BR/PR/Jaguariaíva={"id":"data/BR/PR/Jaguariaíva","key":"Jaguariaíva","lang":"pt"}
+data/BR/PR/Jandaia do Sul={"id":"data/BR/PR/Jandaia do Sul","key":"Jandaia do Sul","lang":"pt"}
+data/BR/PR/Janiópolis={"id":"data/BR/PR/Janiópolis","key":"Janiópolis","lang":"pt"}
+data/BR/PR/Japira={"id":"data/BR/PR/Japira","key":"Japira","lang":"pt"}
+data/BR/PR/Japurá={"id":"data/BR/PR/Japurá","key":"Japurá","lang":"pt"}
+data/BR/PR/Jardim Alegre={"id":"data/BR/PR/Jardim Alegre","key":"Jardim Alegre","lang":"pt"}
+data/BR/PR/Jardim Olinda={"id":"data/BR/PR/Jardim Olinda","key":"Jardim Olinda","lang":"pt"}
+data/BR/PR/Jataizinho={"id":"data/BR/PR/Jataizinho","key":"Jataizinho","lang":"pt"}
+data/BR/PR/Jesuítas={"id":"data/BR/PR/Jesuítas","key":"Jesuítas","lang":"pt"}
+data/BR/PR/Joaquim Távora={"id":"data/BR/PR/Joaquim Távora","key":"Joaquim Távora","lang":"pt"}
+data/BR/PR/Jundiaí do Sul={"id":"data/BR/PR/Jundiaí do Sul","key":"Jundiaí do Sul","lang":"pt"}
+data/BR/PR/Juranda={"id":"data/BR/PR/Juranda","key":"Juranda","lang":"pt"}
+data/BR/PR/Jussara={"id":"data/BR/PR/Jussara","key":"Jussara","lang":"pt"}
+data/BR/PR/Kaloré={"id":"data/BR/PR/Kaloré","key":"Kaloré","lang":"pt"}
+data/BR/PR/Lapa={"id":"data/BR/PR/Lapa","key":"Lapa","lang":"pt"}
+data/BR/PR/Laranjal={"id":"data/BR/PR/Laranjal","key":"Laranjal","lang":"pt"}
+data/BR/PR/Laranjeiras do Sul={"id":"data/BR/PR/Laranjeiras do Sul","key":"Laranjeiras do Sul","lang":"pt"}
+data/BR/PR/Leopolis={"id":"data/BR/PR/Leopolis","key":"Leopolis","lang":"pt"}
+data/BR/PR/Lidianópolis={"id":"data/BR/PR/Lidianópolis","key":"Lidianópolis","lang":"pt"}
+data/BR/PR/Lindoeste={"id":"data/BR/PR/Lindoeste","key":"Lindoeste","lang":"pt"}
+data/BR/PR/Loanda={"id":"data/BR/PR/Loanda","key":"Loanda","lang":"pt"}
+data/BR/PR/Lobato={"id":"data/BR/PR/Lobato","key":"Lobato","lang":"pt"}
+data/BR/PR/Londrina={"id":"data/BR/PR/Londrina","key":"Londrina","lang":"pt"}
+data/BR/PR/Luiziana={"id":"data/BR/PR/Luiziana","key":"Luiziana","lang":"pt"}
+data/BR/PR/Lunardelli={"id":"data/BR/PR/Lunardelli","key":"Lunardelli","lang":"pt"}
+data/BR/PR/Lupionópolis={"id":"data/BR/PR/Lupionópolis","key":"Lupionópolis","lang":"pt"}
+data/BR/PR/Mallet={"id":"data/BR/PR/Mallet","key":"Mallet","lang":"pt"}
+data/BR/PR/Mamborê={"id":"data/BR/PR/Mamborê","key":"Mamborê","lang":"pt"}
+data/BR/PR/Mandaguari={"id":"data/BR/PR/Mandaguari","key":"Mandaguari","lang":"pt"}
+data/BR/PR/Mandaguaçu={"id":"data/BR/PR/Mandaguaçu","key":"Mandaguaçu","lang":"pt"}
+data/BR/PR/Mandirituba={"id":"data/BR/PR/Mandirituba","key":"Mandirituba","lang":"pt"}
+data/BR/PR/Manfrinópolis={"id":"data/BR/PR/Manfrinópolis","key":"Manfrinópolis","lang":"pt"}
+data/BR/PR/Mangueirinha={"id":"data/BR/PR/Mangueirinha","key":"Mangueirinha","lang":"pt"}
+data/BR/PR/Manoel Ribas={"id":"data/BR/PR/Manoel Ribas","key":"Manoel Ribas","lang":"pt"}
+data/BR/PR/Marechal Cândido Rondon={"id":"data/BR/PR/Marechal Cândido Rondon","key":"Marechal Cândido Rondon","lang":"pt"}
+data/BR/PR/Maria Helena={"id":"data/BR/PR/Maria Helena","key":"Maria Helena","lang":"pt"}
+data/BR/PR/Marialva={"id":"data/BR/PR/Marialva","key":"Marialva","lang":"pt"}
+data/BR/PR/Marilena={"id":"data/BR/PR/Marilena","key":"Marilena","lang":"pt"}
+data/BR/PR/Mariluz={"id":"data/BR/PR/Mariluz","key":"Mariluz","lang":"pt"}
+data/BR/PR/Marilândia do Sul={"id":"data/BR/PR/Marilândia do Sul","key":"Marilândia do Sul","lang":"pt"}
+data/BR/PR/Maringá={"id":"data/BR/PR/Maringá","key":"Maringá","lang":"pt"}
+data/BR/PR/Maripá={"id":"data/BR/PR/Maripá","key":"Maripá","lang":"pt"}
+data/BR/PR/Mariópolis={"id":"data/BR/PR/Mariópolis","key":"Mariópolis","lang":"pt"}
+data/BR/PR/Marmeleiro={"id":"data/BR/PR/Marmeleiro","key":"Marmeleiro","lang":"pt"}
+data/BR/PR/Marquinho={"id":"data/BR/PR/Marquinho","key":"Marquinho","lang":"pt"}
+data/BR/PR/Marumbi={"id":"data/BR/PR/Marumbi","key":"Marumbi","lang":"pt"}
+data/BR/PR/Matelândia={"id":"data/BR/PR/Matelândia","key":"Matelândia","lang":"pt"}
+data/BR/PR/Matinhos={"id":"data/BR/PR/Matinhos","key":"Matinhos","lang":"pt"}
+data/BR/PR/Mato Rico={"id":"data/BR/PR/Mato Rico","key":"Mato Rico","lang":"pt"}
+data/BR/PR/Mauá da Serra={"id":"data/BR/PR/Mauá da Serra","key":"Mauá da Serra","lang":"pt"}
+data/BR/PR/Medianeira={"id":"data/BR/PR/Medianeira","key":"Medianeira","lang":"pt"}
+data/BR/PR/Mercedes={"id":"data/BR/PR/Mercedes","key":"Mercedes","lang":"pt"}
+data/BR/PR/Mirador={"id":"data/BR/PR/Mirador","key":"Mirador","lang":"pt"}
+data/BR/PR/Miraselva={"id":"data/BR/PR/Miraselva","key":"Miraselva","lang":"pt"}
+data/BR/PR/Missal={"id":"data/BR/PR/Missal","key":"Missal","lang":"pt"}
+data/BR/PR/Moreira Sales={"id":"data/BR/PR/Moreira Sales","key":"Moreira Sales","lang":"pt"}
+data/BR/PR/Morretes={"id":"data/BR/PR/Morretes","key":"Morretes","lang":"pt"}
+data/BR/PR/Munhoz de Melo={"id":"data/BR/PR/Munhoz de Melo","key":"Munhoz de Melo","lang":"pt"}
+data/BR/PR/Nossa Senhora das Graças={"id":"data/BR/PR/Nossa Senhora das Graças","key":"Nossa Senhora das Graças","lang":"pt"}
+data/BR/PR/Nova Aliança do Ivaí={"id":"data/BR/PR/Nova Aliança do Ivaí","key":"Nova Aliança do Ivaí","lang":"pt"}
+data/BR/PR/Nova América da Colina={"id":"data/BR/PR/Nova América da Colina","key":"Nova América da Colina","lang":"pt"}
+data/BR/PR/Nova Aurora={"id":"data/BR/PR/Nova Aurora","key":"Nova Aurora","lang":"pt"}
+data/BR/PR/Nova Cantu={"id":"data/BR/PR/Nova Cantu","key":"Nova Cantu","lang":"pt"}
+data/BR/PR/Nova Esperança={"id":"data/BR/PR/Nova Esperança","key":"Nova Esperança","lang":"pt"}
+data/BR/PR/Nova Esperança do Sudoeste={"id":"data/BR/PR/Nova Esperança do Sudoeste","key":"Nova Esperança do Sudoeste","lang":"pt"}
+data/BR/PR/Nova Fátima={"id":"data/BR/PR/Nova Fátima","key":"Nova Fátima","lang":"pt"}
+data/BR/PR/Nova Laranjeiras={"id":"data/BR/PR/Nova Laranjeiras","key":"Nova Laranjeiras","lang":"pt"}
+data/BR/PR/Nova Londrina={"id":"data/BR/PR/Nova Londrina","key":"Nova Londrina","lang":"pt"}
+data/BR/PR/Nova Olímpia={"id":"data/BR/PR/Nova Olímpia","key":"Nova Olímpia","lang":"pt"}
+data/BR/PR/Nova Prata do Iguaçu={"id":"data/BR/PR/Nova Prata do Iguaçu","key":"Nova Prata do Iguaçu","lang":"pt"}
+data/BR/PR/Nova Santa Bárbara={"id":"data/BR/PR/Nova Santa Bárbara","key":"Nova Santa Bárbara","lang":"pt"}
+data/BR/PR/Nova Santa Rosa={"id":"data/BR/PR/Nova Santa Rosa","key":"Nova Santa Rosa","lang":"pt"}
+data/BR/PR/Nova Tebas={"id":"data/BR/PR/Nova Tebas","key":"Nova Tebas","lang":"pt"}
+data/BR/PR/Novo Itacolomi={"id":"data/BR/PR/Novo Itacolomi","key":"Novo Itacolomi","lang":"pt"}
+data/BR/PR/Ortigueira={"id":"data/BR/PR/Ortigueira","key":"Ortigueira","lang":"pt"}
+data/BR/PR/Ourizona={"id":"data/BR/PR/Ourizona","key":"Ourizona","lang":"pt"}
+data/BR/PR/Ouro Verde do Oeste={"id":"data/BR/PR/Ouro Verde do Oeste","key":"Ouro Verde do Oeste","lang":"pt"}
+data/BR/PR/Paiçandu={"id":"data/BR/PR/Paiçandu","key":"Paiçandu","lang":"pt"}
+data/BR/PR/Palmas={"id":"data/BR/PR/Palmas","key":"Palmas","lang":"pt"}
+data/BR/PR/Palmeira={"id":"data/BR/PR/Palmeira","key":"Palmeira","lang":"pt"}
+data/BR/PR/Palmital={"id":"data/BR/PR/Palmital","key":"Palmital","lang":"pt"}
+data/BR/PR/Palotina={"id":"data/BR/PR/Palotina","key":"Palotina","lang":"pt"}
+data/BR/PR/Paranacity={"id":"data/BR/PR/Paranacity","key":"Paranacity","lang":"pt"}
+data/BR/PR/Paranaguá={"id":"data/BR/PR/Paranaguá","key":"Paranaguá","lang":"pt"}
+data/BR/PR/Paranapoema={"id":"data/BR/PR/Paranapoema","key":"Paranapoema","lang":"pt"}
+data/BR/PR/Paranavaí={"id":"data/BR/PR/Paranavaí","key":"Paranavaí","lang":"pt"}
+data/BR/PR/Paraíso do Norte={"id":"data/BR/PR/Paraíso do Norte","key":"Paraíso do Norte","lang":"pt"}
+data/BR/PR/Pato Bragado={"id":"data/BR/PR/Pato Bragado","key":"Pato Bragado","lang":"pt"}
+data/BR/PR/Pato Branco={"id":"data/BR/PR/Pato Branco","key":"Pato Branco","lang":"pt"}
+data/BR/PR/Paula Freitas={"id":"data/BR/PR/Paula Freitas","key":"Paula Freitas","lang":"pt"}
+data/BR/PR/Paulo Frontin={"id":"data/BR/PR/Paulo Frontin","key":"Paulo Frontin","lang":"pt"}
+data/BR/PR/Peabiru={"id":"data/BR/PR/Peabiru","key":"Peabiru","lang":"pt"}
+data/BR/PR/Perobal={"id":"data/BR/PR/Perobal","key":"Perobal","lang":"pt"}
+data/BR/PR/Pinhais={"id":"data/BR/PR/Pinhais","key":"Pinhais","lang":"pt"}
+data/BR/PR/Pinhal de São Bento={"id":"data/BR/PR/Pinhal de São Bento","key":"Pinhal de São Bento","lang":"pt"}
+data/BR/PR/Pinhalão={"id":"data/BR/PR/Pinhalão","key":"Pinhalão","lang":"pt"}
+data/BR/PR/Pinhão={"id":"data/BR/PR/Pinhão","key":"Pinhão","lang":"pt"}
+data/BR/PR/Piraquara={"id":"data/BR/PR/Piraquara","key":"Piraquara","lang":"pt"}
+data/BR/PR/Piraí do Sul={"id":"data/BR/PR/Piraí do Sul","key":"Piraí do Sul","lang":"pt"}
+data/BR/PR/Pitanga={"id":"data/BR/PR/Pitanga","key":"Pitanga","lang":"pt"}
+data/BR/PR/Pitangueiras={"id":"data/BR/PR/Pitangueiras","key":"Pitangueiras","lang":"pt"}
+data/BR/PR/Piên={"id":"data/BR/PR/Piên","key":"Piên","lang":"pt"}
+data/BR/PR/Planaltina do Paraná={"id":"data/BR/PR/Planaltina do Paraná","key":"Planaltina do Paraná","lang":"pt"}
+data/BR/PR/Planalto={"id":"data/BR/PR/Planalto","key":"Planalto","lang":"pt"}
+data/BR/PR/Ponta Grossa={"id":"data/BR/PR/Ponta Grossa","key":"Ponta Grossa","lang":"pt"}
+data/BR/PR/Pontal do Paraná={"id":"data/BR/PR/Pontal do Paraná","key":"Pontal do Paraná","lang":"pt"}
+data/BR/PR/Porecatu={"id":"data/BR/PR/Porecatu","key":"Porecatu","lang":"pt"}
+data/BR/PR/Porto Amazonas={"id":"data/BR/PR/Porto Amazonas","key":"Porto Amazonas","lang":"pt"}
+data/BR/PR/Porto Barreiro={"id":"data/BR/PR/Porto Barreiro","key":"Porto Barreiro","lang":"pt"}
+data/BR/PR/Porto Rico={"id":"data/BR/PR/Porto Rico","key":"Porto Rico","lang":"pt"}
+data/BR/PR/Porto Vitória={"id":"data/BR/PR/Porto Vitória","key":"Porto Vitória","lang":"pt"}
+data/BR/PR/Prado Ferreira={"id":"data/BR/PR/Prado Ferreira","key":"Prado Ferreira","lang":"pt"}
+data/BR/PR/Pranchita={"id":"data/BR/PR/Pranchita","key":"Pranchita","lang":"pt"}
+data/BR/PR/Presidente Castelo Branco={"id":"data/BR/PR/Presidente Castelo Branco","key":"Presidente Castelo Branco","lang":"pt"}
+data/BR/PR/Primeiro de Maio={"id":"data/BR/PR/Primeiro de Maio","key":"Primeiro de Maio","lang":"pt"}
+data/BR/PR/Prudentópolis={"id":"data/BR/PR/Prudentópolis","key":"Prudentópolis","lang":"pt"}
+data/BR/PR/Pérola={"id":"data/BR/PR/Pérola","key":"Pérola","lang":"pt"}
+data/BR/PR/Pérola d'Oeste={"id":"data/BR/PR/Pérola d'Oeste","key":"Pérola d'Oeste","lang":"pt"}
+data/BR/PR/Quarto Centenário={"id":"data/BR/PR/Quarto Centenário","key":"Quarto Centenário","lang":"pt"}
+data/BR/PR/Quatiguá={"id":"data/BR/PR/Quatiguá","key":"Quatiguá","lang":"pt"}
+data/BR/PR/Quatro Barras={"id":"data/BR/PR/Quatro Barras","key":"Quatro Barras","lang":"pt"}
+data/BR/PR/Quatro Pontes={"id":"data/BR/PR/Quatro Pontes","key":"Quatro Pontes","lang":"pt"}
+data/BR/PR/Quedas do Iguaçu={"id":"data/BR/PR/Quedas do Iguaçu","key":"Quedas do Iguaçu","lang":"pt"}
+data/BR/PR/Querência do Norte={"id":"data/BR/PR/Querência do Norte","key":"Querência do Norte","lang":"pt"}
+data/BR/PR/Quinta do Sol={"id":"data/BR/PR/Quinta do Sol","key":"Quinta do Sol","lang":"pt"}
+data/BR/PR/Quitandinha={"id":"data/BR/PR/Quitandinha","key":"Quitandinha","lang":"pt"}
+data/BR/PR/Ramilândia={"id":"data/BR/PR/Ramilândia","key":"Ramilândia","lang":"pt"}
+data/BR/PR/Rancho Alegre={"id":"data/BR/PR/Rancho Alegre","key":"Rancho Alegre","lang":"pt"}
+data/BR/PR/Rancho Alegre d'Oeste={"id":"data/BR/PR/Rancho Alegre d'Oeste","key":"Rancho Alegre d'Oeste","lang":"pt"}
+data/BR/PR/Realeza={"id":"data/BR/PR/Realeza","key":"Realeza","lang":"pt"}
+data/BR/PR/Rebouças={"id":"data/BR/PR/Rebouças","key":"Rebouças","lang":"pt"}
+data/BR/PR/Renascença={"id":"data/BR/PR/Renascença","key":"Renascença","lang":"pt"}
+data/BR/PR/Reserva={"id":"data/BR/PR/Reserva","key":"Reserva","lang":"pt"}
+data/BR/PR/Reserva do Iguaçu={"id":"data/BR/PR/Reserva do Iguaçu","key":"Reserva do Iguaçu","lang":"pt"}
+data/BR/PR/Ribeirão Claro={"id":"data/BR/PR/Ribeirão Claro","key":"Ribeirão Claro","lang":"pt"}
+data/BR/PR/Ribeirão do Pinhal={"id":"data/BR/PR/Ribeirão do Pinhal","key":"Ribeirão do Pinhal","lang":"pt"}
+data/BR/PR/Rio Bom={"id":"data/BR/PR/Rio Bom","key":"Rio Bom","lang":"pt"}
+data/BR/PR/Rio Bonito do Iguaçu={"id":"data/BR/PR/Rio Bonito do Iguaçu","key":"Rio Bonito do Iguaçu","lang":"pt"}
+data/BR/PR/Rio Branco do Ivaí={"id":"data/BR/PR/Rio Branco do Ivaí","key":"Rio Branco do Ivaí","lang":"pt"}
+data/BR/PR/Rio Branco do Sul={"id":"data/BR/PR/Rio Branco do Sul","key":"Rio Branco do Sul","lang":"pt"}
+data/BR/PR/Rio Negro={"id":"data/BR/PR/Rio Negro","key":"Rio Negro","lang":"pt"}
+data/BR/PR/Rolândia={"id":"data/BR/PR/Rolândia","key":"Rolândia","lang":"pt"}
+data/BR/PR/Roncador={"id":"data/BR/PR/Roncador","key":"Roncador","lang":"pt"}
+data/BR/PR/Rondon={"id":"data/BR/PR/Rondon","key":"Rondon","lang":"pt"}
+data/BR/PR/Rosário do Ivaí={"id":"data/BR/PR/Rosário do Ivaí","key":"Rosário do Ivaí","lang":"pt"}
+data/BR/PR/Río Azul={"id":"data/BR/PR/Río Azul","key":"Río Azul","lang":"pt"}
+data/BR/PR/Sabaudia={"id":"data/BR/PR/Sabaudia","key":"Sabaudia","lang":"pt"}
+data/BR/PR/Salgado Filho={"id":"data/BR/PR/Salgado Filho","key":"Salgado Filho","lang":"pt"}
+data/BR/PR/Salto do Itararé={"id":"data/BR/PR/Salto do Itararé","key":"Salto do Itararé","lang":"pt"}
+data/BR/PR/Salto do Lontra={"id":"data/BR/PR/Salto do Lontra","key":"Salto do Lontra","lang":"pt"}
+data/BR/PR/Santa Amélia={"id":"data/BR/PR/Santa Amélia","key":"Santa Amélia","lang":"pt"}
+data/BR/PR/Santa Cecília do Pavão={"id":"data/BR/PR/Santa Cecília do Pavão","key":"Santa Cecília do Pavão","lang":"pt"}
+data/BR/PR/Santa Cruz do Monte Castelo={"id":"data/BR/PR/Santa Cruz do Monte Castelo","key":"Santa Cruz do Monte Castelo","lang":"pt"}
+data/BR/PR/Santa Fé={"id":"data/BR/PR/Santa Fé","key":"Santa Fé","lang":"pt"}
+data/BR/PR/Santa Helena={"id":"data/BR/PR/Santa Helena","key":"Santa Helena","lang":"pt"}
+data/BR/PR/Santa Inês={"id":"data/BR/PR/Santa Inês","key":"Santa Inês","lang":"pt"}
+data/BR/PR/Santa Isabel do Ivaí={"id":"data/BR/PR/Santa Isabel do Ivaí","key":"Santa Isabel do Ivaí","lang":"pt"}
+data/BR/PR/Santa Izabel do Oeste={"id":"data/BR/PR/Santa Izabel do Oeste","key":"Santa Izabel do Oeste","lang":"pt"}
+data/BR/PR/Santa Lucia={"id":"data/BR/PR/Santa Lucia","key":"Santa Lucia","lang":"pt"}
+data/BR/PR/Santa Maria do Oeste={"id":"data/BR/PR/Santa Maria do Oeste","key":"Santa Maria do Oeste","lang":"pt"}
+data/BR/PR/Santa Mariana={"id":"data/BR/PR/Santa Mariana","key":"Santa Mariana","lang":"pt"}
+data/BR/PR/Santa Monica={"id":"data/BR/PR/Santa Monica","key":"Santa Monica","lang":"pt"}
+data/BR/PR/Santa Tereza do Oeste={"id":"data/BR/PR/Santa Tereza do Oeste","key":"Santa Tereza do Oeste","lang":"pt"}
+data/BR/PR/Santa Terezinha de Itaipu={"id":"data/BR/PR/Santa Terezinha de Itaipu","key":"Santa Terezinha de Itaipu","lang":"pt"}
+data/BR/PR/Santana do Itararé={"id":"data/BR/PR/Santana do Itararé","key":"Santana do Itararé","lang":"pt"}
+data/BR/PR/Santo Antonio Do Sudoeste={"id":"data/BR/PR/Santo Antonio Do Sudoeste","key":"Santo Antonio Do Sudoeste","lang":"pt"}
+data/BR/PR/Santo Antônio da Platina={"id":"data/BR/PR/Santo Antônio da Platina","key":"Santo Antônio da Platina","lang":"pt"}
+data/BR/PR/Santo Antônio do Caiuá={"id":"data/BR/PR/Santo Antônio do Caiuá","key":"Santo Antônio do Caiuá","lang":"pt"}
+data/BR/PR/Santo Antônio do Paraíso={"id":"data/BR/PR/Santo Antônio do Paraíso","key":"Santo Antônio do Paraíso","lang":"pt"}
+data/BR/PR/Santo Inácio={"id":"data/BR/PR/Santo Inácio","key":"Santo Inácio","lang":"pt"}
+data/BR/PR/Sapopema={"id":"data/BR/PR/Sapopema","key":"Sapopema","lang":"pt"}
+data/BR/PR/Sarandí={"id":"data/BR/PR/Sarandí","key":"Sarandí","lang":"pt"}
+data/BR/PR/Saudade do Iguaçu={"id":"data/BR/PR/Saudade do Iguaçu","key":"Saudade do Iguaçu","lang":"pt"}
+data/BR/PR/Sengés={"id":"data/BR/PR/Sengés","key":"Sengés","lang":"pt"}
+data/BR/PR/Serranópolis do Iguaçu={"id":"data/BR/PR/Serranópolis do Iguaçu","key":"Serranópolis do Iguaçu","lang":"pt"}
+data/BR/PR/Sertaneja={"id":"data/BR/PR/Sertaneja","key":"Sertaneja","lang":"pt"}
+data/BR/PR/Sertanópolis={"id":"data/BR/PR/Sertanópolis","key":"Sertanópolis","lang":"pt"}
+data/BR/PR/Siqueira Campos={"id":"data/BR/PR/Siqueira Campos","key":"Siqueira Campos","lang":"pt"}
+data/BR/PR/Sulina={"id":"data/BR/PR/Sulina","key":"Sulina","lang":"pt"}
+data/BR/PR/São Carlos do Ivaí={"id":"data/BR/PR/São Carlos do Ivaí","key":"São Carlos do Ivaí","lang":"pt"}
+data/BR/PR/São Jerônimo da Serra={"id":"data/BR/PR/São Jerônimo da Serra","key":"São Jerônimo da Serra","lang":"pt"}
+data/BR/PR/São Jorge d'Oeste={"id":"data/BR/PR/São Jorge d'Oeste","key":"São Jorge d'Oeste","lang":"pt"}
+data/BR/PR/São Jorge do Ivaí={"id":"data/BR/PR/São Jorge do Ivaí","key":"São Jorge do Ivaí","lang":"pt"}
+data/BR/PR/São Jorge do Patrocínio={"id":"data/BR/PR/São Jorge do Patrocínio","key":"São Jorge do Patrocínio","lang":"pt"}
+data/BR/PR/São José da Boa Vista={"id":"data/BR/PR/São José da Boa Vista","key":"São José da Boa Vista","lang":"pt"}
+data/BR/PR/São José das Palmeiras={"id":"data/BR/PR/São José das Palmeiras","key":"São José das Palmeiras","lang":"pt"}
+data/BR/PR/São José dos Pinhais={"id":"data/BR/PR/São José dos Pinhais","key":"São José dos Pinhais","lang":"pt"}
+data/BR/PR/São João={"id":"data/BR/PR/São João","key":"São João","lang":"pt"}
+data/BR/PR/São João do Caiuá={"id":"data/BR/PR/São João do Caiuá","key":"São João do Caiuá","lang":"pt"}
+data/BR/PR/São João do Ivaí={"id":"data/BR/PR/São João do Ivaí","key":"São João do Ivaí","lang":"pt"}
+data/BR/PR/São João do Triunfo={"id":"data/BR/PR/São João do Triunfo","key":"São João do Triunfo","lang":"pt"}
+data/BR/PR/São Manoel do Paraná={"id":"data/BR/PR/São Manoel do Paraná","key":"São Manoel do Paraná","lang":"pt"}
+data/BR/PR/São Mateus do Sul={"id":"data/BR/PR/São Mateus do Sul","key":"São Mateus do Sul","lang":"pt"}
+data/BR/PR/São Miguel do Iguaçu={"id":"data/BR/PR/São Miguel do Iguaçu","key":"São Miguel do Iguaçu","lang":"pt"}
+data/BR/PR/São Pedro do Iguaçu={"id":"data/BR/PR/São Pedro do Iguaçu","key":"São Pedro do Iguaçu","lang":"pt"}
+data/BR/PR/São Pedro do Ivaí={"id":"data/BR/PR/São Pedro do Ivaí","key":"São Pedro do Ivaí","lang":"pt"}
+data/BR/PR/São Pedro do Paraná={"id":"data/BR/PR/São Pedro do Paraná","key":"São Pedro do Paraná","lang":"pt"}
+data/BR/PR/São Sebastião da Amoreira={"id":"data/BR/PR/São Sebastião da Amoreira","key":"São Sebastião da Amoreira","lang":"pt"}
+data/BR/PR/São Tomé={"id":"data/BR/PR/São Tomé","key":"São Tomé","lang":"pt"}
+data/BR/PR/Tamarana={"id":"data/BR/PR/Tamarana","key":"Tamarana","lang":"pt"}
+data/BR/PR/Tamboara={"id":"data/BR/PR/Tamboara","key":"Tamboara","lang":"pt"}
+data/BR/PR/Tapejara={"id":"data/BR/PR/Tapejara","key":"Tapejara","lang":"pt"}
+data/BR/PR/Tapira={"id":"data/BR/PR/Tapira","key":"Tapira","lang":"pt"}
+data/BR/PR/Teixeira Soares={"id":"data/BR/PR/Teixeira Soares","key":"Teixeira Soares","lang":"pt"}
+data/BR/PR/Telêmaco Borba={"id":"data/BR/PR/Telêmaco Borba","key":"Telêmaco Borba","lang":"pt"}
+data/BR/PR/Terra Boa={"id":"data/BR/PR/Terra Boa","key":"Terra Boa","lang":"pt"}
+data/BR/PR/Terra Rica={"id":"data/BR/PR/Terra Rica","key":"Terra Rica","lang":"pt"}
+data/BR/PR/Terra Roxa={"id":"data/BR/PR/Terra Roxa","key":"Terra Roxa","lang":"pt"}
+data/BR/PR/Tibagi={"id":"data/BR/PR/Tibagi","key":"Tibagi","lang":"pt"}
+data/BR/PR/Tijucas do Sul={"id":"data/BR/PR/Tijucas do Sul","key":"Tijucas do Sul","lang":"pt"}
+data/BR/PR/Toledo={"id":"data/BR/PR/Toledo","key":"Toledo","lang":"pt"}
+data/BR/PR/Tomazina={"id":"data/BR/PR/Tomazina","key":"Tomazina","lang":"pt"}
+data/BR/PR/Três Barras do Paraná={"id":"data/BR/PR/Três Barras do Paraná","key":"Três Barras do Paraná","lang":"pt"}
+data/BR/PR/Tunas do Paraná={"id":"data/BR/PR/Tunas do Paraná","key":"Tunas do Paraná","lang":"pt"}
+data/BR/PR/Tuneiras do Oeste={"id":"data/BR/PR/Tuneiras do Oeste","key":"Tuneiras do Oeste","lang":"pt"}
+data/BR/PR/Tupãssi={"id":"data/BR/PR/Tupãssi","key":"Tupãssi","lang":"pt"}
+data/BR/PR/Turvo={"id":"data/BR/PR/Turvo","key":"Turvo","lang":"pt"}
+data/BR/PR/Ubiratã={"id":"data/BR/PR/Ubiratã","key":"Ubiratã","lang":"pt"}
+data/BR/PR/Umuarama={"id":"data/BR/PR/Umuarama","key":"Umuarama","lang":"pt"}
+data/BR/PR/Uniflor={"id":"data/BR/PR/Uniflor","key":"Uniflor","lang":"pt"}
+data/BR/PR/União da Vitória={"id":"data/BR/PR/União da Vitória","key":"União da Vitória","lang":"pt"}
+data/BR/PR/Uraí={"id":"data/BR/PR/Uraí","key":"Uraí","lang":"pt"}
+data/BR/PR/Ventania={"id":"data/BR/PR/Ventania","key":"Ventania","lang":"pt"}
+data/BR/PR/Vera Cruz do Oeste={"id":"data/BR/PR/Vera Cruz do Oeste","key":"Vera Cruz do Oeste","lang":"pt"}
+data/BR/PR/Verê={"id":"data/BR/PR/Verê","key":"Verê","lang":"pt"}
+data/BR/PR/Vila Alta={"id":"data/BR/PR/Vila Alta","key":"Vila Alta","lang":"pt"}
+data/BR/PR/Virmond={"id":"data/BR/PR/Virmond","key":"Virmond","lang":"pt"}
+data/BR/PR/Vitorino={"id":"data/BR/PR/Vitorino","key":"Vitorino","lang":"pt"}
+data/BR/PR/Wenceslau Braz={"id":"data/BR/PR/Wenceslau Braz","key":"Wenceslau Braz","lang":"pt"}
+data/BR/PR/Xambrê={"id":"data/BR/PR/Xambrê","key":"Xambrê","lang":"pt"}
+data/BR/RJ={"id":"data/BR/RJ","key":"RJ","name":"Rio de Janeiro","lang":"pt","zip":"2[0-8]","zipex":"20000-000,28999-999","sub_keys":"Angra dos Reis~Aperibé~Araruama~Areal~Armação dos Búzios~Arraial do Cabo~Barra do Piraí~Barra Mansa~Belford Roxo~Bom Jardim~Bom Jesus do Itabapoana~Cabo Frio~Cachoeiras de Macacu~Cambuci~Campos dos Goytacazes~Cantagalo~Carapebus~Cardoso Moreira~Carmo~Casimiro de Abreu~Comendador Levy Gasparian~Conceição de Macabu~Cordeiro~Duas Barras~Duque de Caxias~Engenheiro Paulo de Frontin~Guapimirim~Iguaba Grande~Itaboraí~Itaguaí~Italva~Itaocara~Itaperuna~Itatiaia~Japeri~Laje do Muriaé~Macaé~Macuco~Magé~Mangaratiba~Maricá~Mendes~Mesquita~Miguel Pereira~Miracema~Natividade~Nilópolis~Niterói~Nova Friburgo~Nova Iguaçu~Paracambi~Paraíba do Sul~Parati~Paty do Alferes~Petrópolis~Pinheiral~Piraí~Porciúncula~Porto Real~Quatis~Queimados~Quissamã~Resende~Rio Bonito~Rio Claro~Rio das Flores~Rio das Ostras~Rio de Janeiro~Santa Maria Madalena~Santo Antônio de Pádua~São Fidélis~São Francisco de Itabapoana~São Gonçalo~São João da Barra~São João de Meriti~São José de Ubá~São José do Vale do Rio Preto~São Pedro da Aldeia~São Sebastião do Alto~Sapucaia~Saquarema~Seropédica~Silva Jardim~Sumidouro~Tanguá~Teresópolis~Trajano de Morais~Três Rios~Valença~Varre-Sai~Vassouras~Volta Redonda"}
+data/BR/RJ/Angra dos Reis={"id":"data/BR/RJ/Angra dos Reis","key":"Angra dos Reis","lang":"pt"}
+data/BR/RJ/Aperibé={"id":"data/BR/RJ/Aperibé","key":"Aperibé","lang":"pt"}
+data/BR/RJ/Araruama={"id":"data/BR/RJ/Araruama","key":"Araruama","lang":"pt"}
+data/BR/RJ/Areal={"id":"data/BR/RJ/Areal","key":"Areal","lang":"pt"}
+data/BR/RJ/Armação dos Búzios={"id":"data/BR/RJ/Armação dos Búzios","key":"Armação dos Búzios","lang":"pt"}
+data/BR/RJ/Arraial do Cabo={"id":"data/BR/RJ/Arraial do Cabo","key":"Arraial do Cabo","lang":"pt"}
+data/BR/RJ/Barra Mansa={"id":"data/BR/RJ/Barra Mansa","key":"Barra Mansa","lang":"pt"}
+data/BR/RJ/Barra do Piraí={"id":"data/BR/RJ/Barra do Piraí","key":"Barra do Piraí","lang":"pt"}
+data/BR/RJ/Belford Roxo={"id":"data/BR/RJ/Belford Roxo","key":"Belford Roxo","lang":"pt"}
+data/BR/RJ/Bom Jardim={"id":"data/BR/RJ/Bom Jardim","key":"Bom Jardim","lang":"pt"}
+data/BR/RJ/Bom Jesus do Itabapoana={"id":"data/BR/RJ/Bom Jesus do Itabapoana","key":"Bom Jesus do Itabapoana","lang":"pt"}
+data/BR/RJ/Cabo Frio={"id":"data/BR/RJ/Cabo Frio","key":"Cabo Frio","lang":"pt"}
+data/BR/RJ/Cachoeiras de Macacu={"id":"data/BR/RJ/Cachoeiras de Macacu","key":"Cachoeiras de Macacu","lang":"pt"}
+data/BR/RJ/Cambuci={"id":"data/BR/RJ/Cambuci","key":"Cambuci","lang":"pt"}
+data/BR/RJ/Campos dos Goytacazes={"id":"data/BR/RJ/Campos dos Goytacazes","key":"Campos dos Goytacazes","lang":"pt"}
+data/BR/RJ/Cantagalo={"id":"data/BR/RJ/Cantagalo","key":"Cantagalo","lang":"pt"}
+data/BR/RJ/Carapebus={"id":"data/BR/RJ/Carapebus","key":"Carapebus","lang":"pt"}
+data/BR/RJ/Cardoso Moreira={"id":"data/BR/RJ/Cardoso Moreira","key":"Cardoso Moreira","lang":"pt"}
+data/BR/RJ/Carmo={"id":"data/BR/RJ/Carmo","key":"Carmo","lang":"pt"}
+data/BR/RJ/Casimiro de Abreu={"id":"data/BR/RJ/Casimiro de Abreu","key":"Casimiro de Abreu","lang":"pt"}
+data/BR/RJ/Comendador Levy Gasparian={"id":"data/BR/RJ/Comendador Levy Gasparian","key":"Comendador Levy Gasparian","lang":"pt"}
+data/BR/RJ/Conceição de Macabu={"id":"data/BR/RJ/Conceição de Macabu","key":"Conceição de Macabu","lang":"pt"}
+data/BR/RJ/Cordeiro={"id":"data/BR/RJ/Cordeiro","key":"Cordeiro","lang":"pt"}
+data/BR/RJ/Duas Barras={"id":"data/BR/RJ/Duas Barras","key":"Duas Barras","lang":"pt"}
+data/BR/RJ/Duque de Caxias={"id":"data/BR/RJ/Duque de Caxias","key":"Duque de Caxias","lang":"pt"}
+data/BR/RJ/Engenheiro Paulo de Frontin={"id":"data/BR/RJ/Engenheiro Paulo de Frontin","key":"Engenheiro Paulo de Frontin","lang":"pt"}
+data/BR/RJ/Guapimirim={"id":"data/BR/RJ/Guapimirim","key":"Guapimirim","lang":"pt"}
+data/BR/RJ/Iguaba Grande={"id":"data/BR/RJ/Iguaba Grande","key":"Iguaba Grande","lang":"pt"}
+data/BR/RJ/Itaboraí={"id":"data/BR/RJ/Itaboraí","key":"Itaboraí","lang":"pt"}
+data/BR/RJ/Itaguaí={"id":"data/BR/RJ/Itaguaí","key":"Itaguaí","lang":"pt"}
+data/BR/RJ/Italva={"id":"data/BR/RJ/Italva","key":"Italva","lang":"pt"}
+data/BR/RJ/Itaocara={"id":"data/BR/RJ/Itaocara","key":"Itaocara","lang":"pt"}
+data/BR/RJ/Itaperuna={"id":"data/BR/RJ/Itaperuna","key":"Itaperuna","lang":"pt"}
+data/BR/RJ/Itatiaia={"id":"data/BR/RJ/Itatiaia","key":"Itatiaia","lang":"pt"}
+data/BR/RJ/Japeri={"id":"data/BR/RJ/Japeri","key":"Japeri","lang":"pt"}
+data/BR/RJ/Laje do Muriaé={"id":"data/BR/RJ/Laje do Muriaé","key":"Laje do Muriaé","lang":"pt"}
+data/BR/RJ/Macaé={"id":"data/BR/RJ/Macaé","key":"Macaé","lang":"pt"}
+data/BR/RJ/Macuco={"id":"data/BR/RJ/Macuco","key":"Macuco","lang":"pt"}
+data/BR/RJ/Magé={"id":"data/BR/RJ/Magé","key":"Magé","lang":"pt"}
+data/BR/RJ/Mangaratiba={"id":"data/BR/RJ/Mangaratiba","key":"Mangaratiba","lang":"pt"}
+data/BR/RJ/Maricá={"id":"data/BR/RJ/Maricá","key":"Maricá","lang":"pt"}
+data/BR/RJ/Mendes={"id":"data/BR/RJ/Mendes","key":"Mendes","lang":"pt"}
+data/BR/RJ/Mesquita={"id":"data/BR/RJ/Mesquita","key":"Mesquita","lang":"pt"}
+data/BR/RJ/Miguel Pereira={"id":"data/BR/RJ/Miguel Pereira","key":"Miguel Pereira","lang":"pt"}
+data/BR/RJ/Miracema={"id":"data/BR/RJ/Miracema","key":"Miracema","lang":"pt"}
+data/BR/RJ/Natividade={"id":"data/BR/RJ/Natividade","key":"Natividade","lang":"pt"}
+data/BR/RJ/Nilópolis={"id":"data/BR/RJ/Nilópolis","key":"Nilópolis","lang":"pt"}
+data/BR/RJ/Niterói={"id":"data/BR/RJ/Niterói","key":"Niterói","lang":"pt"}
+data/BR/RJ/Nova Friburgo={"id":"data/BR/RJ/Nova Friburgo","key":"Nova Friburgo","lang":"pt"}
+data/BR/RJ/Nova Iguaçu={"id":"data/BR/RJ/Nova Iguaçu","key":"Nova Iguaçu","lang":"pt"}
+data/BR/RJ/Paracambi={"id":"data/BR/RJ/Paracambi","key":"Paracambi","lang":"pt"}
+data/BR/RJ/Parati={"id":"data/BR/RJ/Parati","key":"Parati","lang":"pt"}
+data/BR/RJ/Paraíba do Sul={"id":"data/BR/RJ/Paraíba do Sul","key":"Paraíba do Sul","lang":"pt"}
+data/BR/RJ/Paty do Alferes={"id":"data/BR/RJ/Paty do Alferes","key":"Paty do Alferes","lang":"pt"}
+data/BR/RJ/Petrópolis={"id":"data/BR/RJ/Petrópolis","key":"Petrópolis","lang":"pt"}
+data/BR/RJ/Pinheiral={"id":"data/BR/RJ/Pinheiral","key":"Pinheiral","lang":"pt"}
+data/BR/RJ/Piraí={"id":"data/BR/RJ/Piraí","key":"Piraí","lang":"pt"}
+data/BR/RJ/Porciúncula={"id":"data/BR/RJ/Porciúncula","key":"Porciúncula","lang":"pt"}
+data/BR/RJ/Porto Real={"id":"data/BR/RJ/Porto Real","key":"Porto Real","lang":"pt"}
+data/BR/RJ/Quatis={"id":"data/BR/RJ/Quatis","key":"Quatis","lang":"pt"}
+data/BR/RJ/Queimados={"id":"data/BR/RJ/Queimados","key":"Queimados","lang":"pt"}
+data/BR/RJ/Quissamã={"id":"data/BR/RJ/Quissamã","key":"Quissamã","lang":"pt"}
+data/BR/RJ/Resende={"id":"data/BR/RJ/Resende","key":"Resende","lang":"pt"}
+data/BR/RJ/Rio Bonito={"id":"data/BR/RJ/Rio Bonito","key":"Rio Bonito","lang":"pt"}
+data/BR/RJ/Rio Claro={"id":"data/BR/RJ/Rio Claro","key":"Rio Claro","lang":"pt"}
+data/BR/RJ/Rio das Flores={"id":"data/BR/RJ/Rio das Flores","key":"Rio das Flores","lang":"pt"}
+data/BR/RJ/Rio das Ostras={"id":"data/BR/RJ/Rio das Ostras","key":"Rio das Ostras","lang":"pt"}
+data/BR/RJ/Rio de Janeiro={"id":"data/BR/RJ/Rio de Janeiro","key":"Rio de Janeiro","lang":"pt"}
+data/BR/RJ/Santa Maria Madalena={"id":"data/BR/RJ/Santa Maria Madalena","key":"Santa Maria Madalena","lang":"pt"}
+data/BR/RJ/Santo Antônio de Pádua={"id":"data/BR/RJ/Santo Antônio de Pádua","key":"Santo Antônio de Pádua","lang":"pt"}
+data/BR/RJ/Sapucaia={"id":"data/BR/RJ/Sapucaia","key":"Sapucaia","lang":"pt"}
+data/BR/RJ/Saquarema={"id":"data/BR/RJ/Saquarema","key":"Saquarema","lang":"pt"}
+data/BR/RJ/Seropédica={"id":"data/BR/RJ/Seropédica","key":"Seropédica","lang":"pt"}
+data/BR/RJ/Silva Jardim={"id":"data/BR/RJ/Silva Jardim","key":"Silva Jardim","lang":"pt"}
+data/BR/RJ/Sumidouro={"id":"data/BR/RJ/Sumidouro","key":"Sumidouro","lang":"pt"}
+data/BR/RJ/São Fidélis={"id":"data/BR/RJ/São Fidélis","key":"São Fidélis","lang":"pt"}
+data/BR/RJ/São Francisco de Itabapoana={"id":"data/BR/RJ/São Francisco de Itabapoana","key":"São Francisco de Itabapoana","lang":"pt"}
+data/BR/RJ/São Gonçalo={"id":"data/BR/RJ/São Gonçalo","key":"São Gonçalo","lang":"pt"}
+data/BR/RJ/São José de Ubá={"id":"data/BR/RJ/São José de Ubá","key":"São José de Ubá","lang":"pt"}
+data/BR/RJ/São José do Vale do Rio Preto={"id":"data/BR/RJ/São José do Vale do Rio Preto","key":"São José do Vale do Rio Preto","lang":"pt"}
+data/BR/RJ/São João da Barra={"id":"data/BR/RJ/São João da Barra","key":"São João da Barra","lang":"pt"}
+data/BR/RJ/São João de Meriti={"id":"data/BR/RJ/São João de Meriti","key":"São João de Meriti","lang":"pt"}
+data/BR/RJ/São Pedro da Aldeia={"id":"data/BR/RJ/São Pedro da Aldeia","key":"São Pedro da Aldeia","lang":"pt"}
+data/BR/RJ/São Sebastião do Alto={"id":"data/BR/RJ/São Sebastião do Alto","key":"São Sebastião do Alto","lang":"pt"}
+data/BR/RJ/Tanguá={"id":"data/BR/RJ/Tanguá","key":"Tanguá","lang":"pt"}
+data/BR/RJ/Teresópolis={"id":"data/BR/RJ/Teresópolis","key":"Teresópolis","lang":"pt"}
+data/BR/RJ/Trajano de Morais={"id":"data/BR/RJ/Trajano de Morais","key":"Trajano de Morais","lang":"pt"}
+data/BR/RJ/Três Rios={"id":"data/BR/RJ/Três Rios","key":"Três Rios","lang":"pt"}
+data/BR/RJ/Valença={"id":"data/BR/RJ/Valença","key":"Valença","lang":"pt"}
+data/BR/RJ/Varre-Sai={"id":"data/BR/RJ/Varre-Sai","key":"Varre-Sai","lang":"pt"}
+data/BR/RJ/Vassouras={"id":"data/BR/RJ/Vassouras","key":"Vassouras","lang":"pt"}
+data/BR/RJ/Volta Redonda={"id":"data/BR/RJ/Volta Redonda","key":"Volta Redonda","lang":"pt"}
+data/BR/RN={"id":"data/BR/RN","key":"RN","name":"Rio Grande do Norte","lang":"pt","zip":"59","zipex":"59000-000,59999-999","sub_keys":"Acari~Açu~Afonso Bezerra~Água Nova~Alexandria~Almino Afonso~Alto do Rodrigues~Angicos~Antônio Martins~Apodi~Areia Branca~Ares~Augusto Severo~Baía Formosa~Baraúna~Barcelona~Bento Fernandes~Bodó~Bom Jesus~Brejinho~Caiçara do Norte~Caiçara do Rio do Vento~Caicó~Campo Redondo~Canguaretama~Caraúbas~Carnaúba dos Dantas~Carnaubais~Ceará-Mirim~Cerro Corá~Coronel Ezequiel~Coronel João Pessoa~Cruzeta~Currais Novos~Doutor Severiano~Encanto~Equador~Extremoz~Felipe Guerra~Fernando Pedroza~Florânia~Francisco Dantas~Frutuoso Gomes~Galinhos~Goianinha~Governador Dix-Sept Rosado~Grossos~Guamare~Ielmo Marinho~Ipanguaçu~Ipueira~Itajá~Itaú~Jaçanã~Jandaíra~Janduís~Januario Cicco~Japi~Jardim de Angicos~Jardim de Piranhas~Jardim do Seridó~João Câmara~João Dias~José da Penha~Jucurutu~Jundiá~Lagoa d'Anta~Lagoa de Pedras~Lagoa de Velhos~Lagoa Nova~Lagoa Salgada~Lajes~Lajes Pintadas~Lucrecia~Luís Gomes~Macaíba~Macau~Major Sales~Marcelino Vieira~Martins~Maxaranguape~Messias Targino~Montanhas~Monte Alegre~Monte das Gameleiras~Mossoró~Natal~Nísia Floresta~Nova Cruz~Olho d'Água do Borges~Ouro Branco~Paraná~Părău~Parazinho~Parelhas~Parnamirim~Passa e Fica~Passagem~Patu~Pau dos Ferros~Pedra Grande~Pedra Preta~Pedro Avelino~Pedro Velho~Pendências~Pilões~Poço Branco~Portalegre~Porto do Mangue~Presidente Juscelino~Pureza~Rafael Fernandes~Rafael Godeiro~Riacho da Cruz~Riacho de Santana~Riachuelo~Rio do Fogo~Rodolfo Fernandes~Ruy Barbosa~Santa Cruz~Santa Maria~Santana do Matos~Santana do Seridó~Santo António~São Bento do Norte~São Bento do Trairi~São Fernando~São Francisco do Oeste~São Gonçalo do Amarante~São João do Sabugi~São José de Mipibu~São José do Campestre~São José do Seridó~São Miguel~São Miguel do Gostoso~São Paulo do Potengi~São Pedro~São Rafael~São Tomé~São Vicente~Senador Elói de Souza~Senador Georgino Avelino~Serra de São Bento~Serra do Mel~Serra Negra do Norte~Serrinha~Serrinha dos Pintos~Severiano Melo~Sítio Novo~Taboleiro Grande~Taipu~Tangara~Tenente Ananias~Tenente Laurentino Cruz~Tibau~Tibau do Sul~Timbaúba dos Batistas~Touros~Triunfo Potiguar~Umarizal~Upanema~Várzea~Venha-Ver~Vera Cruz~Viçosa~Vila Flor"}
+data/BR/RN/Acari={"id":"data/BR/RN/Acari","key":"Acari","lang":"pt"}
+data/BR/RN/Afonso Bezerra={"id":"data/BR/RN/Afonso Bezerra","key":"Afonso Bezerra","lang":"pt"}
+data/BR/RN/Alexandria={"id":"data/BR/RN/Alexandria","key":"Alexandria","lang":"pt"}
+data/BR/RN/Almino Afonso={"id":"data/BR/RN/Almino Afonso","key":"Almino Afonso","lang":"pt"}
+data/BR/RN/Alto do Rodrigues={"id":"data/BR/RN/Alto do Rodrigues","key":"Alto do Rodrigues","lang":"pt"}
+data/BR/RN/Angicos={"id":"data/BR/RN/Angicos","key":"Angicos","lang":"pt"}
+data/BR/RN/Antônio Martins={"id":"data/BR/RN/Antônio Martins","key":"Antônio Martins","lang":"pt"}
+data/BR/RN/Apodi={"id":"data/BR/RN/Apodi","key":"Apodi","lang":"pt"}
+data/BR/RN/Areia Branca={"id":"data/BR/RN/Areia Branca","key":"Areia Branca","lang":"pt"}
+data/BR/RN/Ares={"id":"data/BR/RN/Ares","key":"Ares","lang":"pt"}
+data/BR/RN/Augusto Severo={"id":"data/BR/RN/Augusto Severo","key":"Augusto Severo","lang":"pt"}
+data/BR/RN/Açu={"id":"data/BR/RN/Açu","key":"Açu","lang":"pt"}
+data/BR/RN/Baraúna={"id":"data/BR/RN/Baraúna","key":"Baraúna","lang":"pt"}
+data/BR/RN/Barcelona={"id":"data/BR/RN/Barcelona","key":"Barcelona","lang":"pt"}
+data/BR/RN/Baía Formosa={"id":"data/BR/RN/Baía Formosa","key":"Baía Formosa","lang":"pt"}
+data/BR/RN/Bento Fernandes={"id":"data/BR/RN/Bento Fernandes","key":"Bento Fernandes","lang":"pt"}
+data/BR/RN/Bodó={"id":"data/BR/RN/Bodó","key":"Bodó","lang":"pt"}
+data/BR/RN/Bom Jesus={"id":"data/BR/RN/Bom Jesus","key":"Bom Jesus","lang":"pt"}
+data/BR/RN/Brejinho={"id":"data/BR/RN/Brejinho","key":"Brejinho","lang":"pt"}
+data/BR/RN/Caicó={"id":"data/BR/RN/Caicó","key":"Caicó","lang":"pt"}
+data/BR/RN/Caiçara do Norte={"id":"data/BR/RN/Caiçara do Norte","key":"Caiçara do Norte","lang":"pt"}
+data/BR/RN/Caiçara do Rio do Vento={"id":"data/BR/RN/Caiçara do Rio do Vento","key":"Caiçara do Rio do Vento","lang":"pt"}
+data/BR/RN/Campo Redondo={"id":"data/BR/RN/Campo Redondo","key":"Campo Redondo","lang":"pt"}
+data/BR/RN/Canguaretama={"id":"data/BR/RN/Canguaretama","key":"Canguaretama","lang":"pt"}
+data/BR/RN/Caraúbas={"id":"data/BR/RN/Caraúbas","key":"Caraúbas","lang":"pt"}
+data/BR/RN/Carnaubais={"id":"data/BR/RN/Carnaubais","key":"Carnaubais","lang":"pt"}
+data/BR/RN/Carnaúba dos Dantas={"id":"data/BR/RN/Carnaúba dos Dantas","key":"Carnaúba dos Dantas","lang":"pt"}
+data/BR/RN/Ceará-Mirim={"id":"data/BR/RN/Ceará-Mirim","key":"Ceará-Mirim","lang":"pt"}
+data/BR/RN/Cerro Corá={"id":"data/BR/RN/Cerro Corá","key":"Cerro Corá","lang":"pt"}
+data/BR/RN/Coronel Ezequiel={"id":"data/BR/RN/Coronel Ezequiel","key":"Coronel Ezequiel","lang":"pt"}
+data/BR/RN/Coronel João Pessoa={"id":"data/BR/RN/Coronel João Pessoa","key":"Coronel João Pessoa","lang":"pt"}
+data/BR/RN/Cruzeta={"id":"data/BR/RN/Cruzeta","key":"Cruzeta","lang":"pt"}
+data/BR/RN/Currais Novos={"id":"data/BR/RN/Currais Novos","key":"Currais Novos","lang":"pt"}
+data/BR/RN/Doutor Severiano={"id":"data/BR/RN/Doutor Severiano","key":"Doutor Severiano","lang":"pt"}
+data/BR/RN/Encanto={"id":"data/BR/RN/Encanto","key":"Encanto","lang":"pt"}
+data/BR/RN/Equador={"id":"data/BR/RN/Equador","key":"Equador","lang":"pt"}
+data/BR/RN/Extremoz={"id":"data/BR/RN/Extremoz","key":"Extremoz","lang":"pt"}
+data/BR/RN/Felipe Guerra={"id":"data/BR/RN/Felipe Guerra","key":"Felipe Guerra","lang":"pt"}
+data/BR/RN/Fernando Pedroza={"id":"data/BR/RN/Fernando Pedroza","key":"Fernando Pedroza","lang":"pt"}
+data/BR/RN/Florânia={"id":"data/BR/RN/Florânia","key":"Florânia","lang":"pt"}
+data/BR/RN/Francisco Dantas={"id":"data/BR/RN/Francisco Dantas","key":"Francisco Dantas","lang":"pt"}
+data/BR/RN/Frutuoso Gomes={"id":"data/BR/RN/Frutuoso Gomes","key":"Frutuoso Gomes","lang":"pt"}
+data/BR/RN/Galinhos={"id":"data/BR/RN/Galinhos","key":"Galinhos","lang":"pt"}
+data/BR/RN/Goianinha={"id":"data/BR/RN/Goianinha","key":"Goianinha","lang":"pt"}
+data/BR/RN/Governador Dix-Sept Rosado={"id":"data/BR/RN/Governador Dix-Sept Rosado","key":"Governador Dix-Sept Rosado","lang":"pt"}
+data/BR/RN/Grossos={"id":"data/BR/RN/Grossos","key":"Grossos","lang":"pt"}
+data/BR/RN/Guamare={"id":"data/BR/RN/Guamare","key":"Guamare","lang":"pt"}
+data/BR/RN/Ielmo Marinho={"id":"data/BR/RN/Ielmo Marinho","key":"Ielmo Marinho","lang":"pt"}
+data/BR/RN/Ipanguaçu={"id":"data/BR/RN/Ipanguaçu","key":"Ipanguaçu","lang":"pt"}
+data/BR/RN/Ipueira={"id":"data/BR/RN/Ipueira","key":"Ipueira","lang":"pt"}
+data/BR/RN/Itajá={"id":"data/BR/RN/Itajá","key":"Itajá","lang":"pt"}
+data/BR/RN/Itaú={"id":"data/BR/RN/Itaú","key":"Itaú","lang":"pt"}
+data/BR/RN/Jandaíra={"id":"data/BR/RN/Jandaíra","key":"Jandaíra","lang":"pt"}
+data/BR/RN/Janduís={"id":"data/BR/RN/Janduís","key":"Janduís","lang":"pt"}
+data/BR/RN/Januario Cicco={"id":"data/BR/RN/Januario Cicco","key":"Januario Cicco","lang":"pt"}
+data/BR/RN/Japi={"id":"data/BR/RN/Japi","key":"Japi","lang":"pt"}
+data/BR/RN/Jardim de Angicos={"id":"data/BR/RN/Jardim de Angicos","key":"Jardim de Angicos","lang":"pt"}
+data/BR/RN/Jardim de Piranhas={"id":"data/BR/RN/Jardim de Piranhas","key":"Jardim de Piranhas","lang":"pt"}
+data/BR/RN/Jardim do Seridó={"id":"data/BR/RN/Jardim do Seridó","key":"Jardim do Seridó","lang":"pt"}
+data/BR/RN/Jaçanã={"id":"data/BR/RN/Jaçanã","key":"Jaçanã","lang":"pt"}
+data/BR/RN/José da Penha={"id":"data/BR/RN/José da Penha","key":"José da Penha","lang":"pt"}
+data/BR/RN/João Câmara={"id":"data/BR/RN/João Câmara","key":"João Câmara","lang":"pt"}
+data/BR/RN/João Dias={"id":"data/BR/RN/João Dias","key":"João Dias","lang":"pt"}
+data/BR/RN/Jucurutu={"id":"data/BR/RN/Jucurutu","key":"Jucurutu","lang":"pt"}
+data/BR/RN/Jundiá={"id":"data/BR/RN/Jundiá","key":"Jundiá","lang":"pt"}
+data/BR/RN/Lagoa Nova={"id":"data/BR/RN/Lagoa Nova","key":"Lagoa Nova","lang":"pt"}
+data/BR/RN/Lagoa Salgada={"id":"data/BR/RN/Lagoa Salgada","key":"Lagoa Salgada","lang":"pt"}
+data/BR/RN/Lagoa d'Anta={"id":"data/BR/RN/Lagoa d'Anta","key":"Lagoa d'Anta","lang":"pt"}
+data/BR/RN/Lagoa de Pedras={"id":"data/BR/RN/Lagoa de Pedras","key":"Lagoa de Pedras","lang":"pt"}
+data/BR/RN/Lagoa de Velhos={"id":"data/BR/RN/Lagoa de Velhos","key":"Lagoa de Velhos","lang":"pt"}
+data/BR/RN/Lajes={"id":"data/BR/RN/Lajes","key":"Lajes","lang":"pt"}
+data/BR/RN/Lajes Pintadas={"id":"data/BR/RN/Lajes Pintadas","key":"Lajes Pintadas","lang":"pt"}
+data/BR/RN/Lucrecia={"id":"data/BR/RN/Lucrecia","key":"Lucrecia","lang":"pt"}
+data/BR/RN/Luís Gomes={"id":"data/BR/RN/Luís Gomes","key":"Luís Gomes","lang":"pt"}
+data/BR/RN/Macau={"id":"data/BR/RN/Macau","key":"Macau","lang":"pt"}
+data/BR/RN/Macaíba={"id":"data/BR/RN/Macaíba","key":"Macaíba","lang":"pt"}
+data/BR/RN/Major Sales={"id":"data/BR/RN/Major Sales","key":"Major Sales","lang":"pt"}
+data/BR/RN/Marcelino Vieira={"id":"data/BR/RN/Marcelino Vieira","key":"Marcelino Vieira","lang":"pt"}
+data/BR/RN/Martins={"id":"data/BR/RN/Martins","key":"Martins","lang":"pt"}
+data/BR/RN/Maxaranguape={"id":"data/BR/RN/Maxaranguape","key":"Maxaranguape","lang":"pt"}
+data/BR/RN/Messias Targino={"id":"data/BR/RN/Messias Targino","key":"Messias Targino","lang":"pt"}
+data/BR/RN/Montanhas={"id":"data/BR/RN/Montanhas","key":"Montanhas","lang":"pt"}
+data/BR/RN/Monte Alegre={"id":"data/BR/RN/Monte Alegre","key":"Monte Alegre","lang":"pt"}
+data/BR/RN/Monte das Gameleiras={"id":"data/BR/RN/Monte das Gameleiras","key":"Monte das Gameleiras","lang":"pt"}
+data/BR/RN/Mossoró={"id":"data/BR/RN/Mossoró","key":"Mossoró","lang":"pt"}
+data/BR/RN/Natal={"id":"data/BR/RN/Natal","key":"Natal","lang":"pt"}
+data/BR/RN/Nova Cruz={"id":"data/BR/RN/Nova Cruz","key":"Nova Cruz","lang":"pt"}
+data/BR/RN/Nísia Floresta={"id":"data/BR/RN/Nísia Floresta","key":"Nísia Floresta","lang":"pt"}
+data/BR/RN/Olho d'Água do Borges={"id":"data/BR/RN/Olho d'Água do Borges","key":"Olho d'Água do Borges","lang":"pt"}
+data/BR/RN/Ouro Branco={"id":"data/BR/RN/Ouro Branco","key":"Ouro Branco","lang":"pt"}
+data/BR/RN/Paraná={"id":"data/BR/RN/Paraná","key":"Paraná","lang":"pt"}
+data/BR/RN/Parazinho={"id":"data/BR/RN/Parazinho","key":"Parazinho","lang":"pt"}
+data/BR/RN/Parelhas={"id":"data/BR/RN/Parelhas","key":"Parelhas","lang":"pt"}
+data/BR/RN/Parnamirim={"id":"data/BR/RN/Parnamirim","key":"Parnamirim","lang":"pt"}
+data/BR/RN/Passa e Fica={"id":"data/BR/RN/Passa e Fica","key":"Passa e Fica","lang":"pt"}
+data/BR/RN/Passagem={"id":"data/BR/RN/Passagem","key":"Passagem","lang":"pt"}
+data/BR/RN/Patu={"id":"data/BR/RN/Patu","key":"Patu","lang":"pt"}
+data/BR/RN/Pau dos Ferros={"id":"data/BR/RN/Pau dos Ferros","key":"Pau dos Ferros","lang":"pt"}
+data/BR/RN/Pedra Grande={"id":"data/BR/RN/Pedra Grande","key":"Pedra Grande","lang":"pt"}
+data/BR/RN/Pedra Preta={"id":"data/BR/RN/Pedra Preta","key":"Pedra Preta","lang":"pt"}
+data/BR/RN/Pedro Avelino={"id":"data/BR/RN/Pedro Avelino","key":"Pedro Avelino","lang":"pt"}
+data/BR/RN/Pedro Velho={"id":"data/BR/RN/Pedro Velho","key":"Pedro Velho","lang":"pt"}
+data/BR/RN/Pendências={"id":"data/BR/RN/Pendências","key":"Pendências","lang":"pt"}
+data/BR/RN/Pilões={"id":"data/BR/RN/Pilões","key":"Pilões","lang":"pt"}
+data/BR/RN/Portalegre={"id":"data/BR/RN/Portalegre","key":"Portalegre","lang":"pt"}
+data/BR/RN/Porto do Mangue={"id":"data/BR/RN/Porto do Mangue","key":"Porto do Mangue","lang":"pt"}
+data/BR/RN/Poço Branco={"id":"data/BR/RN/Poço Branco","key":"Poço Branco","lang":"pt"}
+data/BR/RN/Presidente Juscelino={"id":"data/BR/RN/Presidente Juscelino","key":"Presidente Juscelino","lang":"pt"}
+data/BR/RN/Pureza={"id":"data/BR/RN/Pureza","key":"Pureza","lang":"pt"}
+data/BR/RN/Părău={"id":"data/BR/RN/Părău","key":"Părău","lang":"pt"}
+data/BR/RN/Rafael Fernandes={"id":"data/BR/RN/Rafael Fernandes","key":"Rafael Fernandes","lang":"pt"}
+data/BR/RN/Rafael Godeiro={"id":"data/BR/RN/Rafael Godeiro","key":"Rafael Godeiro","lang":"pt"}
+data/BR/RN/Riacho da Cruz={"id":"data/BR/RN/Riacho da Cruz","key":"Riacho da Cruz","lang":"pt"}
+data/BR/RN/Riacho de Santana={"id":"data/BR/RN/Riacho de Santana","key":"Riacho de Santana","lang":"pt"}
+data/BR/RN/Riachuelo={"id":"data/BR/RN/Riachuelo","key":"Riachuelo","lang":"pt"}
+data/BR/RN/Rio do Fogo={"id":"data/BR/RN/Rio do Fogo","key":"Rio do Fogo","lang":"pt"}
+data/BR/RN/Rodolfo Fernandes={"id":"data/BR/RN/Rodolfo Fernandes","key":"Rodolfo Fernandes","lang":"pt"}
+data/BR/RN/Ruy Barbosa={"id":"data/BR/RN/Ruy Barbosa","key":"Ruy Barbosa","lang":"pt"}
+data/BR/RN/Santa Cruz={"id":"data/BR/RN/Santa Cruz","key":"Santa Cruz","lang":"pt"}
+data/BR/RN/Santa Maria={"id":"data/BR/RN/Santa Maria","key":"Santa Maria","lang":"pt"}
+data/BR/RN/Santana do Matos={"id":"data/BR/RN/Santana do Matos","key":"Santana do Matos","lang":"pt"}
+data/BR/RN/Santana do Seridó={"id":"data/BR/RN/Santana do Seridó","key":"Santana do Seridó","lang":"pt"}
+data/BR/RN/Santo António={"id":"data/BR/RN/Santo António","key":"Santo António","lang":"pt"}
+data/BR/RN/Senador Elói de Souza={"id":"data/BR/RN/Senador Elói de Souza","key":"Senador Elói de Souza","lang":"pt"}
+data/BR/RN/Senador Georgino Avelino={"id":"data/BR/RN/Senador Georgino Avelino","key":"Senador Georgino Avelino","lang":"pt"}
+data/BR/RN/Serra Negra do Norte={"id":"data/BR/RN/Serra Negra do Norte","key":"Serra Negra do Norte","lang":"pt"}
+data/BR/RN/Serra de São Bento={"id":"data/BR/RN/Serra de São Bento","key":"Serra de São Bento","lang":"pt"}
+data/BR/RN/Serra do Mel={"id":"data/BR/RN/Serra do Mel","key":"Serra do Mel","lang":"pt"}
+data/BR/RN/Serrinha={"id":"data/BR/RN/Serrinha","key":"Serrinha","lang":"pt"}
+data/BR/RN/Serrinha dos Pintos={"id":"data/BR/RN/Serrinha dos Pintos","key":"Serrinha dos Pintos","lang":"pt"}
+data/BR/RN/Severiano Melo={"id":"data/BR/RN/Severiano Melo","key":"Severiano Melo","lang":"pt"}
+data/BR/RN/São Bento do Norte={"id":"data/BR/RN/São Bento do Norte","key":"São Bento do Norte","lang":"pt"}
+data/BR/RN/São Bento do Trairi={"id":"data/BR/RN/São Bento do Trairi","key":"São Bento do Trairi","lang":"pt"}
+data/BR/RN/São Fernando={"id":"data/BR/RN/São Fernando","key":"São Fernando","lang":"pt"}
+data/BR/RN/São Francisco do Oeste={"id":"data/BR/RN/São Francisco do Oeste","key":"São Francisco do Oeste","lang":"pt"}
+data/BR/RN/São Gonçalo do Amarante={"id":"data/BR/RN/São Gonçalo do Amarante","key":"São Gonçalo do Amarante","lang":"pt"}
+data/BR/RN/São José de Mipibu={"id":"data/BR/RN/São José de Mipibu","key":"São José de Mipibu","lang":"pt"}
+data/BR/RN/São José do Campestre={"id":"data/BR/RN/São José do Campestre","key":"São José do Campestre","lang":"pt"}
+data/BR/RN/São José do Seridó={"id":"data/BR/RN/São José do Seridó","key":"São José do Seridó","lang":"pt"}
+data/BR/RN/São João do Sabugi={"id":"data/BR/RN/São João do Sabugi","key":"São João do Sabugi","lang":"pt"}
+data/BR/RN/São Miguel={"id":"data/BR/RN/São Miguel","key":"São Miguel","lang":"pt"}
+data/BR/RN/São Miguel do Gostoso={"id":"data/BR/RN/São Miguel do Gostoso","key":"São Miguel do Gostoso","lang":"pt"}
+data/BR/RN/São Paulo do Potengi={"id":"data/BR/RN/São Paulo do Potengi","key":"São Paulo do Potengi","lang":"pt"}
+data/BR/RN/São Pedro={"id":"data/BR/RN/São Pedro","key":"São Pedro","lang":"pt"}
+data/BR/RN/São Rafael={"id":"data/BR/RN/São Rafael","key":"São Rafael","lang":"pt"}
+data/BR/RN/São Tomé={"id":"data/BR/RN/São Tomé","key":"São Tomé","lang":"pt"}
+data/BR/RN/São Vicente={"id":"data/BR/RN/São Vicente","key":"São Vicente","lang":"pt"}
+data/BR/RN/Sítio Novo={"id":"data/BR/RN/Sítio Novo","key":"Sítio Novo","lang":"pt"}
+data/BR/RN/Taboleiro Grande={"id":"data/BR/RN/Taboleiro Grande","key":"Taboleiro Grande","lang":"pt"}
+data/BR/RN/Taipu={"id":"data/BR/RN/Taipu","key":"Taipu","lang":"pt"}
+data/BR/RN/Tangara={"id":"data/BR/RN/Tangara","key":"Tangara","lang":"pt"}
+data/BR/RN/Tenente Ananias={"id":"data/BR/RN/Tenente Ananias","key":"Tenente Ananias","lang":"pt"}
+data/BR/RN/Tenente Laurentino Cruz={"id":"data/BR/RN/Tenente Laurentino Cruz","key":"Tenente Laurentino Cruz","lang":"pt"}
+data/BR/RN/Tibau={"id":"data/BR/RN/Tibau","key":"Tibau","lang":"pt"}
+data/BR/RN/Tibau do Sul={"id":"data/BR/RN/Tibau do Sul","key":"Tibau do Sul","lang":"pt"}
+data/BR/RN/Timbaúba dos Batistas={"id":"data/BR/RN/Timbaúba dos Batistas","key":"Timbaúba dos Batistas","lang":"pt"}
+data/BR/RN/Touros={"id":"data/BR/RN/Touros","key":"Touros","lang":"pt"}
+data/BR/RN/Triunfo Potiguar={"id":"data/BR/RN/Triunfo Potiguar","key":"Triunfo Potiguar","lang":"pt"}
+data/BR/RN/Umarizal={"id":"data/BR/RN/Umarizal","key":"Umarizal","lang":"pt"}
+data/BR/RN/Upanema={"id":"data/BR/RN/Upanema","key":"Upanema","lang":"pt"}
+data/BR/RN/Venha-Ver={"id":"data/BR/RN/Venha-Ver","key":"Venha-Ver","lang":"pt"}
+data/BR/RN/Vera Cruz={"id":"data/BR/RN/Vera Cruz","key":"Vera Cruz","lang":"pt"}
+data/BR/RN/Vila Flor={"id":"data/BR/RN/Vila Flor","key":"Vila Flor","lang":"pt"}
+data/BR/RN/Viçosa={"id":"data/BR/RN/Viçosa","key":"Viçosa","lang":"pt"}
+data/BR/RN/Várzea={"id":"data/BR/RN/Várzea","key":"Várzea","lang":"pt"}
+data/BR/RN/Água Nova={"id":"data/BR/RN/Água Nova","key":"Água Nova","lang":"pt"}
+data/BR/RO={"id":"data/BR/RO","key":"RO","name":"Rondônia","lang":"pt","zip":"76[89]|789","zipex":"76800-000,78900-000,78999-999","sub_keys":"Alta Floresta d'Oeste~Alto Alegre do Parecis~Alto Paraíso~Alvorada d'Oeste~Ariquemes~Buritis~Cabixi~Cacaulândia~Cacoal~Campo Novo de Rondônia~Candeias do Jamari~Castanheiras~Cerejeiras~Chupinguaia~Colorado do Oeste~Corumbiara~Costa Marques~Cujubim~Espigão d'Oeste~Governador Jorge Teixeira~Guajará-Mirim~Itapuã do Oeste~Jaru~Ji-Paraná~Machadinho d'Oeste~Ministro Andreazza~Mirante da Serra~Monte Negro~Nova Brasilândia d'Oeste~Nova Mamoré~Nova União~Novo Horizonte do Oeste~Ouro Preto do Oeste~Parecis~Pimenta Bueno~Pimenteiras do Oeste~Porto Velho~Presidente Médici~Primavera de Rondônia~Rio Crespo~Rolim de Moura~Santa Luzia d'Oeste~São Felipe d'Oeste~São Francisco do Guaporé~São Miguel do Guaporé~Seringueiras~Teixeirópolis~Theobroma~Urupá~Vale do Anari~Vale do Paraíso~Vilhena"}
+data/BR/RO/Alta Floresta d'Oeste={"id":"data/BR/RO/Alta Floresta d'Oeste","key":"Alta Floresta d'Oeste","lang":"pt"}
+data/BR/RO/Alto Alegre do Parecis={"id":"data/BR/RO/Alto Alegre do Parecis","key":"Alto Alegre do Parecis","lang":"pt"}
+data/BR/RO/Alto Paraíso={"id":"data/BR/RO/Alto Paraíso","key":"Alto Paraíso","lang":"pt"}
+data/BR/RO/Alvorada d'Oeste={"id":"data/BR/RO/Alvorada d'Oeste","key":"Alvorada d'Oeste","lang":"pt"}
+data/BR/RO/Ariquemes={"id":"data/BR/RO/Ariquemes","key":"Ariquemes","lang":"pt"}
+data/BR/RO/Buritis={"id":"data/BR/RO/Buritis","key":"Buritis","lang":"pt"}
+data/BR/RO/Cabixi={"id":"data/BR/RO/Cabixi","key":"Cabixi","lang":"pt"}
+data/BR/RO/Cacaulândia={"id":"data/BR/RO/Cacaulândia","key":"Cacaulândia","lang":"pt"}
+data/BR/RO/Cacoal={"id":"data/BR/RO/Cacoal","key":"Cacoal","lang":"pt"}
+data/BR/RO/Campo Novo de Rondônia={"id":"data/BR/RO/Campo Novo de Rondônia","key":"Campo Novo de Rondônia","lang":"pt"}
+data/BR/RO/Candeias do Jamari={"id":"data/BR/RO/Candeias do Jamari","key":"Candeias do Jamari","lang":"pt"}
+data/BR/RO/Castanheiras={"id":"data/BR/RO/Castanheiras","key":"Castanheiras","lang":"pt"}
+data/BR/RO/Cerejeiras={"id":"data/BR/RO/Cerejeiras","key":"Cerejeiras","lang":"pt"}
+data/BR/RO/Chupinguaia={"id":"data/BR/RO/Chupinguaia","key":"Chupinguaia","lang":"pt"}
+data/BR/RO/Colorado do Oeste={"id":"data/BR/RO/Colorado do Oeste","key":"Colorado do Oeste","lang":"pt"}
+data/BR/RO/Corumbiara={"id":"data/BR/RO/Corumbiara","key":"Corumbiara","lang":"pt"}
+data/BR/RO/Costa Marques={"id":"data/BR/RO/Costa Marques","key":"Costa Marques","lang":"pt"}
+data/BR/RO/Cujubim={"id":"data/BR/RO/Cujubim","key":"Cujubim","lang":"pt"}
+data/BR/RO/Espigão d'Oeste={"id":"data/BR/RO/Espigão d'Oeste","key":"Espigão d'Oeste","lang":"pt"}
+data/BR/RO/Governador Jorge Teixeira={"id":"data/BR/RO/Governador Jorge Teixeira","key":"Governador Jorge Teixeira","lang":"pt"}
+data/BR/RO/Guajará-Mirim={"id":"data/BR/RO/Guajará-Mirim","key":"Guajará-Mirim","lang":"pt"}
+data/BR/RO/Itapuã do Oeste={"id":"data/BR/RO/Itapuã do Oeste","key":"Itapuã do Oeste","lang":"pt"}
+data/BR/RO/Jaru={"id":"data/BR/RO/Jaru","key":"Jaru","lang":"pt"}
+data/BR/RO/Ji-Paraná={"id":"data/BR/RO/Ji-Paraná","key":"Ji-Paraná","lang":"pt"}
+data/BR/RO/Machadinho d'Oeste={"id":"data/BR/RO/Machadinho d'Oeste","key":"Machadinho d'Oeste","lang":"pt"}
+data/BR/RO/Ministro Andreazza={"id":"data/BR/RO/Ministro Andreazza","key":"Ministro Andreazza","lang":"pt"}
+data/BR/RO/Mirante da Serra={"id":"data/BR/RO/Mirante da Serra","key":"Mirante da Serra","lang":"pt"}
+data/BR/RO/Monte Negro={"id":"data/BR/RO/Monte Negro","key":"Monte Negro","lang":"pt"}
+data/BR/RO/Nova Brasilândia d'Oeste={"id":"data/BR/RO/Nova Brasilândia d'Oeste","key":"Nova Brasilândia d'Oeste","lang":"pt"}
+data/BR/RO/Nova Mamoré={"id":"data/BR/RO/Nova Mamoré","key":"Nova Mamoré","lang":"pt"}
+data/BR/RO/Nova União={"id":"data/BR/RO/Nova União","key":"Nova União","lang":"pt"}
+data/BR/RO/Novo Horizonte do Oeste={"id":"data/BR/RO/Novo Horizonte do Oeste","key":"Novo Horizonte do Oeste","lang":"pt"}
+data/BR/RO/Ouro Preto do Oeste={"id":"data/BR/RO/Ouro Preto do Oeste","key":"Ouro Preto do Oeste","lang":"pt"}
+data/BR/RO/Parecis={"id":"data/BR/RO/Parecis","key":"Parecis","lang":"pt"}
+data/BR/RO/Pimenta Bueno={"id":"data/BR/RO/Pimenta Bueno","key":"Pimenta Bueno","lang":"pt"}
+data/BR/RO/Pimenteiras do Oeste={"id":"data/BR/RO/Pimenteiras do Oeste","key":"Pimenteiras do Oeste","lang":"pt"}
+data/BR/RO/Porto Velho={"id":"data/BR/RO/Porto Velho","key":"Porto Velho","lang":"pt"}
+data/BR/RO/Presidente Médici={"id":"data/BR/RO/Presidente Médici","key":"Presidente Médici","lang":"pt"}
+data/BR/RO/Primavera de Rondônia={"id":"data/BR/RO/Primavera de Rondônia","key":"Primavera de Rondônia","lang":"pt"}
+data/BR/RO/Rio Crespo={"id":"data/BR/RO/Rio Crespo","key":"Rio Crespo","lang":"pt"}
+data/BR/RO/Rolim de Moura={"id":"data/BR/RO/Rolim de Moura","key":"Rolim de Moura","lang":"pt"}
+data/BR/RO/Santa Luzia d'Oeste={"id":"data/BR/RO/Santa Luzia d'Oeste","key":"Santa Luzia d'Oeste","lang":"pt"}
+data/BR/RO/Seringueiras={"id":"data/BR/RO/Seringueiras","key":"Seringueiras","lang":"pt"}
+data/BR/RO/São Felipe d'Oeste={"id":"data/BR/RO/São Felipe d'Oeste","key":"São Felipe d'Oeste","lang":"pt"}
+data/BR/RO/São Francisco do Guaporé={"id":"data/BR/RO/São Francisco do Guaporé","key":"São Francisco do Guaporé","lang":"pt"}
+data/BR/RO/São Miguel do Guaporé={"id":"data/BR/RO/São Miguel do Guaporé","key":"São Miguel do Guaporé","lang":"pt"}
+data/BR/RO/Teixeirópolis={"id":"data/BR/RO/Teixeirópolis","key":"Teixeirópolis","lang":"pt"}
+data/BR/RO/Theobroma={"id":"data/BR/RO/Theobroma","key":"Theobroma","lang":"pt"}
+data/BR/RO/Urupá={"id":"data/BR/RO/Urupá","key":"Urupá","lang":"pt"}
+data/BR/RO/Vale do Anari={"id":"data/BR/RO/Vale do Anari","key":"Vale do Anari","lang":"pt"}
+data/BR/RO/Vale do Paraíso={"id":"data/BR/RO/Vale do Paraíso","key":"Vale do Paraíso","lang":"pt"}
+data/BR/RO/Vilhena={"id":"data/BR/RO/Vilhena","key":"Vilhena","lang":"pt"}
+data/BR/RR={"id":"data/BR/RR","key":"RR","name":"Roraima","lang":"pt","zip":"693","zipex":"69300-000,69399-999","sub_keys":"Alto Alegre~Amajari~Boa Vista~Bonfim~Cantá~Caracaraí~Caroebe~Iracema~Mucajaí~Normandia~Pacaraima~Rorainópolis~São João da Baliza~São Luiz~Uiramutã"}
+data/BR/RR/Alto Alegre={"id":"data/BR/RR/Alto Alegre","key":"Alto Alegre","lang":"pt"}
+data/BR/RR/Amajari={"id":"data/BR/RR/Amajari","key":"Amajari","lang":"pt"}
+data/BR/RR/Boa Vista={"id":"data/BR/RR/Boa Vista","key":"Boa Vista","lang":"pt"}
+data/BR/RR/Bonfim={"id":"data/BR/RR/Bonfim","key":"Bonfim","lang":"pt"}
+data/BR/RR/Cantá={"id":"data/BR/RR/Cantá","key":"Cantá","lang":"pt"}
+data/BR/RR/Caracaraí={"id":"data/BR/RR/Caracaraí","key":"Caracaraí","lang":"pt"}
+data/BR/RR/Caroebe={"id":"data/BR/RR/Caroebe","key":"Caroebe","lang":"pt"}
+data/BR/RR/Iracema={"id":"data/BR/RR/Iracema","key":"Iracema","lang":"pt"}
+data/BR/RR/Mucajaí={"id":"data/BR/RR/Mucajaí","key":"Mucajaí","lang":"pt"}
+data/BR/RR/Normandia={"id":"data/BR/RR/Normandia","key":"Normandia","lang":"pt"}
+data/BR/RR/Pacaraima={"id":"data/BR/RR/Pacaraima","key":"Pacaraima","lang":"pt"}
+data/BR/RR/Rorainópolis={"id":"data/BR/RR/Rorainópolis","key":"Rorainópolis","lang":"pt"}
+data/BR/RR/São João da Baliza={"id":"data/BR/RR/São João da Baliza","key":"São João da Baliza","lang":"pt"}
+data/BR/RR/São Luiz={"id":"data/BR/RR/São Luiz","key":"São Luiz","lang":"pt"}
+data/BR/RR/Uiramutã={"id":"data/BR/RR/Uiramutã","key":"Uiramutã","lang":"pt"}
+data/BR/RS={"id":"data/BR/RS","key":"RS","name":"Rio Grande do Sul","lang":"pt","zip":"9","zipex":"90000-000,99999-999","sub_keys":"Aceguá~Água Santa~Agudo~Ajuricaba~Alecrim~Alegrete~Alegría~Almirante Tamandaré do Sul~Alpestre~Alto Alegre~Alto Feliz~Alvorada~Amaral Ferrador~Ametista do Sul~André da Rocha~Anta Gorda~Antônio Prado~Arambaré~Araricá~Aratiba~Arroio do Meio~Arroio do Padre~Arroio do Sal~Arroio do Tigre~Arroio dos Ratos~Arroio Grande~Arvorezinha~Augusto Pestana~Aurea~Bagé~Balneário Pinhal~Barão~Barão de Cotegipe~Barão do Triunfo~Barra do Guarita~Barra do Quaraí~Barra do Ribeiro~Barra do Rio Azul~Barra Funda~Barracão~Barros Cassal~Benjamin Constant do Sul~Bento Gonçalves~Boa Vista das Missões~Boa Vista do Buricá~Boa Vista do Cadeado~Boa Vista do Incra~Boa Vista do Sul~Bom Jesus~Bom Princípio~Bom Progresso~Bom Retiro do Sul~Boqueirão do Leão~Bossoroca~Bozano~Braga~Brochier~Butia~Caçapava do Sul~Cacequi~Cachoeira do Sul~Cachoeirinha~Cacique Doble~Caibaté~Caiçara~Camaquã~Camargo~Cambará do Sul~Campestre da Serra~Campina das Missões~Campinas do Sul~Campo Bom~Campo Novo~Campos Borges~Candelária~Cândido Godói~Candiota~Canela~Canguçu~Canoas~Canudos do Vale~Capão Bonito do Sul~Capão da Canoa~Capão do Cipó~Capão do Leão~Capela de Santana~Capitao~Capivari do Sul~Caraá~Carazinho~Carlos Barbosa~Carlos Gomes~Casca~Caseiros~Catuípe~Caxias do Sul~Centenário~Cerrito~Cerro Branco~Cerro Grande~Cerro Grande do Sul~Cerro Largo~Chapada~Charqueadas~Charrua~Chiapeta~Chui~Chuvisca~Cidreira~Ciríaco~Colinas~Colorado~Condor~Constantina~Coqueiro Baixo~Coqueiros do Sul~Coronel Barros~Coronel Bicaco~Coronel Pilar~Cotiporã~Coxilha~Crissiumal~Cristal~Cristal do Sul~Cruz Alta~Cruzaltense~Cruzeiro do Sul~David Canabarro~Derrubadas~Dezesseis de Novembro~Dilermando de Aguiar~Dois Irmãos~Dois Irmãos das Missões~Dois Lajeados~Dom Feliciano~Dom Pedrito~Dom Pedro de Alcântara~Dona Francisca~Doutor Maurício Cardoso~Doutor Ricardo~Eldorado do Sul~Encantado~Encruzilhada do Sul~Engenho Velho~Entre Rios do Sul~Entre-Ijuís~Erebango~Erechim~Ernestina~Erval Grande~Erval Seco~Esmeralda~Esperança do Sul~Espumoso~Estação~Estância Velha~Esteio~Estrela~Estrela Velha~Eugênio de Castro~Fagundes Varela~Farroupilha~Faxinal do Soturno~Faxinalzinho~Fazenda Vilanova~Feliz~Flores da Cunha~Floriano Peixoto~Fontoura Xavier~Formigueiro~Forquetinha~Fortaleza dos Valos~Frederico Westphalen~Garibaldi~Garruchos~Gaurama~General Câmara~Gentil~Getúlio Vargas~Giruá~Glorinha~Gramado~Gramado dos Loureiros~Gramado Xavier~Gravataí~Guabiju~Guaíba~Guaporé~Guarani das Missões~Harmonia~Herval~Herveiras~Horizontina~Hulha Negra~Humaitá~Ibarama~Ibiaçá~Ibiraiaras~Ibirapuitã~Ibirubá~Igrejinha~Ijuí~Ilópolis~Imbé~Imigrante~Independencia~Inhacorá~Ipê~Ipiranga do Sul~Irai~Itaara~Itacurubi~Itapuca~Itaqui~Itatí~Itatiba do Sul~Ivorá~Ivoti~Jaboticaba~Jacuizinho~Jacutinga~Jaguarão~Jaguari~Jaquirana~Jari~Jóia~Júlio de Castilhos~Lagoa Bonita do Sul~Lagoa dos Três Cantos~Lagoa Vermelha~Lagoão~Lajeado~Lajeado do Bugre~Lavras do Sul~Liberato Salzano~Lindolfo Collor~Linha Nova~Maçambara~Machadinho~Mampituba~Manoel Viana~Maquiné~Maratá~Marau~Marcelino Ramos~Mariana Pimentel~Mariano Moro~Marques de Souza~Mata~Mato Castelhano~Mato Leitão~Mato Queimado~Maximiliano de Almeida~Minas do Leão~Miraguaí~Montauri~Monte Alegre dos Campos~Monte Belo do Sul~Montenegro~Mormaço~Morrinhos do Sul~Morro Redondo~Morro Reuter~Mostardas~Muçum~Muitos Capões~Muliterno~Não-Me-Toque~Nicolau Vergueiro~Nonoai~Nova Alvorada~Nova Araçá~Nova Bassano~Nova Boa Vista~Nova Bréscia~Nova Candelária~Nova Esperança do Sul~Nova Hartz~Nova Pádua~Nova Palma~Nova Petrópolis~Nova Prata~Nova Ramada~Nova Roma do Sul~Nova Santa Rita~Novo Barreiro~Novo Cabrais~Novo Hamburgo~Novo Machado~Novo Tiradentes~Novo Xingu~Osório~Paim Filho~Palmares do Sul~Palmeira das Missões~Palmitinho~Panambi~Pantano Grande~Paraí~Paraíso do Sul~Pareci Novo~Parobé~Passa Sete~Passo do Sobrado~Passo Fundo~Paulo Bento~Paverama~Pedras Altas~Pedro Osório~Pejuçara~Pelotas~Picada Café~Pinhal~Pinhal da Serra~Pinhal Grande~Pinheirinho do Vale~Pinheiro Machado~Pinto Bandeira~Pirapó~Piratini~Planalto~Poço das Antas~Pontão~Ponte Preta~Portão~Porto Alegre~Porto Lucena~Porto Mauá~Porto Vera Cruz~Porto Xavier~Pouso Novo~Presidente Lucena~Progresso~Protásio Alves~Putinga~Quaraí~Quatro Irmãos~Quevedos~Quinze de Novembro~Redentora~Relvado~Restinga Seca~Rio dos Índios~Rio Grande~Rio Pardo~Riozinho~Roca Sales~Rodeio Bonito~Rolador~Rolante~Ronda Alta~Rondinha~Roque Gonzales~Rosário do Sul~Sagrada Familia~Saldanha Marinho~Salto do Jacuí~Salvador das Missões~Salvador do Sul~Sananduva~Santa Bárbara do Sul~Santa Cecília do Sul~Santa Clara do Sul~Santa Cruz do Sul~Santa Margarida do Sul~Santa Maria~Santa Maria do Herval~Santa Rosa~Santa Tereza~Santa Vitória do Palmar~Santana da Boa Vista~Santana do Livramento~Santiago~Santo Ângelo~Santo Antônio da Patrulha~Santo Antônio das Missões~Santo Antônio do Palma~Santo Antônio do Planalto~Santo Augusto~Santo Cristo~Santo Expedito do Sul~São Borja~São Domingos do Sul~São Francisco de Assis~São Francisco de Paula~São Gabriel~São Jerônimo~São João da Urtiga~São João do Polêsine~São Jorge~São José das Missões~São José do Herval~São José do Hortêncio~São José do Inhacorá~São José do Norte~São José do Ouro~São José do Sul~São José dos Ausentes~São Leopoldo~São Lourenço do Sul~São Luiz Gonzaga~São Marcos~São Martinho~São Martinho da Serra~São Miguel das Missões~São Nicolau~São Paulo das Missões~São Pedro da Serra~São Pedro das Missões~São Pedro do Butiá~São Pedro do Sul~São Sebastião do Caí~São Sepé~São Valentim~São Valentim do Sul~São Valério do Sul~São Vendelino~São Vicente do Sul~Sapiranga~Sapucaia do Sul~Sarandí~Seberi~Sede Nova~Segredo~Selbach~Senador Salgado Filho~Sentinela do Sul~Serafina Corrêa~Sério~Sertão~Sertão Santana~Sete de Setembro~Severiano de Almeida~Silveira Martins~Sinimbu~Sobradinho~Soledade~Tabaí~Tapejara~Tapera~Tapes~Taquara~Taquari~Taquaruçu do Sul~Tavares~Tenente Portela~Terra de Areia~Teutônia~Tio Hugo~Tiradentes do Sul~Toropi~Torres~Tramandaí~Travesseiro~Três Arroios~Três Cachoeiras~Três Coroas~Três de Maio~Três Forquilhas~Três Palmeiras~Três Passos~Trindade do Sul~Triunfo~Tucunduva~Tunas~Tupanci do Sul~Tupanciretã~Tupandi~Tuparendi~Turuçu~Ubiretama~União da Serra~Unistalda~Uruguaiana~Vacaria~Vale do Sol~Vale Real~Vale Verde~Vanini~Venâncio Aires~Vera Cruz~Veranópolis~Vespasiano Correa~Viadutos~Viamão~Vicente Dutra~Victor Graeff~Vila Flores~Vila Lângaro~Vila Maria~Vila Nova do Sul~Vista Alegre~Vista Alegre do Prata~Vista Gaúcha~Vitória das Missões~Westfalia~Xangri-lá"}
+data/BR/RS/Aceguá={"id":"data/BR/RS/Aceguá","key":"Aceguá","lang":"pt"}
+data/BR/RS/Agudo={"id":"data/BR/RS/Agudo","key":"Agudo","lang":"pt"}
+data/BR/RS/Ajuricaba={"id":"data/BR/RS/Ajuricaba","key":"Ajuricaba","lang":"pt"}
+data/BR/RS/Alecrim={"id":"data/BR/RS/Alecrim","key":"Alecrim","lang":"pt"}
+data/BR/RS/Alegrete={"id":"data/BR/RS/Alegrete","key":"Alegrete","lang":"pt"}
+data/BR/RS/Alegría={"id":"data/BR/RS/Alegría","key":"Alegría","lang":"pt"}
+data/BR/RS/Almirante Tamandaré do Sul={"id":"data/BR/RS/Almirante Tamandaré do Sul","key":"Almirante Tamandaré do Sul","lang":"pt"}
+data/BR/RS/Alpestre={"id":"data/BR/RS/Alpestre","key":"Alpestre","lang":"pt"}
+data/BR/RS/Alto Alegre={"id":"data/BR/RS/Alto Alegre","key":"Alto Alegre","lang":"pt"}
+data/BR/RS/Alto Feliz={"id":"data/BR/RS/Alto Feliz","key":"Alto Feliz","lang":"pt"}
+data/BR/RS/Alvorada={"id":"data/BR/RS/Alvorada","key":"Alvorada","lang":"pt"}
+data/BR/RS/Amaral Ferrador={"id":"data/BR/RS/Amaral Ferrador","key":"Amaral Ferrador","lang":"pt"}
+data/BR/RS/Ametista do Sul={"id":"data/BR/RS/Ametista do Sul","key":"Ametista do Sul","lang":"pt"}
+data/BR/RS/André da Rocha={"id":"data/BR/RS/André da Rocha","key":"André da Rocha","lang":"pt"}
+data/BR/RS/Anta Gorda={"id":"data/BR/RS/Anta Gorda","key":"Anta Gorda","lang":"pt"}
+data/BR/RS/Antônio Prado={"id":"data/BR/RS/Antônio Prado","key":"Antônio Prado","lang":"pt"}
+data/BR/RS/Arambaré={"id":"data/BR/RS/Arambaré","key":"Arambaré","lang":"pt"}
+data/BR/RS/Araricá={"id":"data/BR/RS/Araricá","key":"Araricá","lang":"pt"}
+data/BR/RS/Aratiba={"id":"data/BR/RS/Aratiba","key":"Aratiba","lang":"pt"}
+data/BR/RS/Arroio Grande={"id":"data/BR/RS/Arroio Grande","key":"Arroio Grande","lang":"pt"}
+data/BR/RS/Arroio do Meio={"id":"data/BR/RS/Arroio do Meio","key":"Arroio do Meio","lang":"pt"}
+data/BR/RS/Arroio do Padre={"id":"data/BR/RS/Arroio do Padre","key":"Arroio do Padre","lang":"pt"}
+data/BR/RS/Arroio do Sal={"id":"data/BR/RS/Arroio do Sal","key":"Arroio do Sal","lang":"pt"}
+data/BR/RS/Arroio do Tigre={"id":"data/BR/RS/Arroio do Tigre","key":"Arroio do Tigre","lang":"pt"}
+data/BR/RS/Arroio dos Ratos={"id":"data/BR/RS/Arroio dos Ratos","key":"Arroio dos Ratos","lang":"pt"}
+data/BR/RS/Arvorezinha={"id":"data/BR/RS/Arvorezinha","key":"Arvorezinha","lang":"pt"}
+data/BR/RS/Augusto Pestana={"id":"data/BR/RS/Augusto Pestana","key":"Augusto Pestana","lang":"pt"}
+data/BR/RS/Aurea={"id":"data/BR/RS/Aurea","key":"Aurea","lang":"pt"}
+data/BR/RS/Bagé={"id":"data/BR/RS/Bagé","key":"Bagé","lang":"pt"}
+data/BR/RS/Balneário Pinhal={"id":"data/BR/RS/Balneário Pinhal","key":"Balneário Pinhal","lang":"pt"}
+data/BR/RS/Barra Funda={"id":"data/BR/RS/Barra Funda","key":"Barra Funda","lang":"pt"}
+data/BR/RS/Barra do Guarita={"id":"data/BR/RS/Barra do Guarita","key":"Barra do Guarita","lang":"pt"}
+data/BR/RS/Barra do Quaraí={"id":"data/BR/RS/Barra do Quaraí","key":"Barra do Quaraí","lang":"pt"}
+data/BR/RS/Barra do Ribeiro={"id":"data/BR/RS/Barra do Ribeiro","key":"Barra do Ribeiro","lang":"pt"}
+data/BR/RS/Barra do Rio Azul={"id":"data/BR/RS/Barra do Rio Azul","key":"Barra do Rio Azul","lang":"pt"}
+data/BR/RS/Barracão={"id":"data/BR/RS/Barracão","key":"Barracão","lang":"pt"}
+data/BR/RS/Barros Cassal={"id":"data/BR/RS/Barros Cassal","key":"Barros Cassal","lang":"pt"}
+data/BR/RS/Barão={"id":"data/BR/RS/Barão","key":"Barão","lang":"pt"}
+data/BR/RS/Barão de Cotegipe={"id":"data/BR/RS/Barão de Cotegipe","key":"Barão de Cotegipe","lang":"pt"}
+data/BR/RS/Barão do Triunfo={"id":"data/BR/RS/Barão do Triunfo","key":"Barão do Triunfo","lang":"pt"}
+data/BR/RS/Benjamin Constant do Sul={"id":"data/BR/RS/Benjamin Constant do Sul","key":"Benjamin Constant do Sul","lang":"pt"}
+data/BR/RS/Bento Gonçalves={"id":"data/BR/RS/Bento Gonçalves","key":"Bento Gonçalves","lang":"pt"}
+data/BR/RS/Boa Vista das Missões={"id":"data/BR/RS/Boa Vista das Missões","key":"Boa Vista das Missões","lang":"pt"}
+data/BR/RS/Boa Vista do Buricá={"id":"data/BR/RS/Boa Vista do Buricá","key":"Boa Vista do Buricá","lang":"pt"}
+data/BR/RS/Boa Vista do Cadeado={"id":"data/BR/RS/Boa Vista do Cadeado","key":"Boa Vista do Cadeado","lang":"pt"}
+data/BR/RS/Boa Vista do Incra={"id":"data/BR/RS/Boa Vista do Incra","key":"Boa Vista do Incra","lang":"pt"}
+data/BR/RS/Boa Vista do Sul={"id":"data/BR/RS/Boa Vista do Sul","key":"Boa Vista do Sul","lang":"pt"}
+data/BR/RS/Bom Jesus={"id":"data/BR/RS/Bom Jesus","key":"Bom Jesus","lang":"pt"}
+data/BR/RS/Bom Princípio={"id":"data/BR/RS/Bom Princípio","key":"Bom Princípio","lang":"pt"}
+data/BR/RS/Bom Progresso={"id":"data/BR/RS/Bom Progresso","key":"Bom Progresso","lang":"pt"}
+data/BR/RS/Bom Retiro do Sul={"id":"data/BR/RS/Bom Retiro do Sul","key":"Bom Retiro do Sul","lang":"pt"}
+data/BR/RS/Boqueirão do Leão={"id":"data/BR/RS/Boqueirão do Leão","key":"Boqueirão do Leão","lang":"pt"}
+data/BR/RS/Bossoroca={"id":"data/BR/RS/Bossoroca","key":"Bossoroca","lang":"pt"}
+data/BR/RS/Bozano={"id":"data/BR/RS/Bozano","key":"Bozano","lang":"pt"}
+data/BR/RS/Braga={"id":"data/BR/RS/Braga","key":"Braga","lang":"pt"}
+data/BR/RS/Brochier={"id":"data/BR/RS/Brochier","key":"Brochier","lang":"pt"}
+data/BR/RS/Butia={"id":"data/BR/RS/Butia","key":"Butia","lang":"pt"}
+data/BR/RS/Cacequi={"id":"data/BR/RS/Cacequi","key":"Cacequi","lang":"pt"}
+data/BR/RS/Cachoeira do Sul={"id":"data/BR/RS/Cachoeira do Sul","key":"Cachoeira do Sul","lang":"pt"}
+data/BR/RS/Cachoeirinha={"id":"data/BR/RS/Cachoeirinha","key":"Cachoeirinha","lang":"pt"}
+data/BR/RS/Cacique Doble={"id":"data/BR/RS/Cacique Doble","key":"Cacique Doble","lang":"pt"}
+data/BR/RS/Caibaté={"id":"data/BR/RS/Caibaté","key":"Caibaté","lang":"pt"}
+data/BR/RS/Caiçara={"id":"data/BR/RS/Caiçara","key":"Caiçara","lang":"pt"}
+data/BR/RS/Camaquã={"id":"data/BR/RS/Camaquã","key":"Camaquã","lang":"pt"}
+data/BR/RS/Camargo={"id":"data/BR/RS/Camargo","key":"Camargo","lang":"pt"}
+data/BR/RS/Cambará do Sul={"id":"data/BR/RS/Cambará do Sul","key":"Cambará do Sul","lang":"pt"}
+data/BR/RS/Campestre da Serra={"id":"data/BR/RS/Campestre da Serra","key":"Campestre da Serra","lang":"pt"}
+data/BR/RS/Campina das Missões={"id":"data/BR/RS/Campina das Missões","key":"Campina das Missões","lang":"pt"}
+data/BR/RS/Campinas do Sul={"id":"data/BR/RS/Campinas do Sul","key":"Campinas do Sul","lang":"pt"}
+data/BR/RS/Campo Bom={"id":"data/BR/RS/Campo Bom","key":"Campo Bom","lang":"pt"}
+data/BR/RS/Campo Novo={"id":"data/BR/RS/Campo Novo","key":"Campo Novo","lang":"pt"}
+data/BR/RS/Campos Borges={"id":"data/BR/RS/Campos Borges","key":"Campos Borges","lang":"pt"}
+data/BR/RS/Candelária={"id":"data/BR/RS/Candelária","key":"Candelária","lang":"pt"}
+data/BR/RS/Candiota={"id":"data/BR/RS/Candiota","key":"Candiota","lang":"pt"}
+data/BR/RS/Canela={"id":"data/BR/RS/Canela","key":"Canela","lang":"pt"}
+data/BR/RS/Canguçu={"id":"data/BR/RS/Canguçu","key":"Canguçu","lang":"pt"}
+data/BR/RS/Canoas={"id":"data/BR/RS/Canoas","key":"Canoas","lang":"pt"}
+data/BR/RS/Canudos do Vale={"id":"data/BR/RS/Canudos do Vale","key":"Canudos do Vale","lang":"pt"}
+data/BR/RS/Capela de Santana={"id":"data/BR/RS/Capela de Santana","key":"Capela de Santana","lang":"pt"}
+data/BR/RS/Capitao={"id":"data/BR/RS/Capitao","key":"Capitao","lang":"pt"}
+data/BR/RS/Capivari do Sul={"id":"data/BR/RS/Capivari do Sul","key":"Capivari do Sul","lang":"pt"}
+data/BR/RS/Capão Bonito do Sul={"id":"data/BR/RS/Capão Bonito do Sul","key":"Capão Bonito do Sul","lang":"pt"}
+data/BR/RS/Capão da Canoa={"id":"data/BR/RS/Capão da Canoa","key":"Capão da Canoa","lang":"pt"}
+data/BR/RS/Capão do Cipó={"id":"data/BR/RS/Capão do Cipó","key":"Capão do Cipó","lang":"pt"}
+data/BR/RS/Capão do Leão={"id":"data/BR/RS/Capão do Leão","key":"Capão do Leão","lang":"pt"}
+data/BR/RS/Carazinho={"id":"data/BR/RS/Carazinho","key":"Carazinho","lang":"pt"}
+data/BR/RS/Caraá={"id":"data/BR/RS/Caraá","key":"Caraá","lang":"pt"}
+data/BR/RS/Carlos Barbosa={"id":"data/BR/RS/Carlos Barbosa","key":"Carlos Barbosa","lang":"pt"}
+data/BR/RS/Carlos Gomes={"id":"data/BR/RS/Carlos Gomes","key":"Carlos Gomes","lang":"pt"}
+data/BR/RS/Casca={"id":"data/BR/RS/Casca","key":"Casca","lang":"pt"}
+data/BR/RS/Caseiros={"id":"data/BR/RS/Caseiros","key":"Caseiros","lang":"pt"}
+data/BR/RS/Catuípe={"id":"data/BR/RS/Catuípe","key":"Catuípe","lang":"pt"}
+data/BR/RS/Caxias do Sul={"id":"data/BR/RS/Caxias do Sul","key":"Caxias do Sul","lang":"pt"}
+data/BR/RS/Caçapava do Sul={"id":"data/BR/RS/Caçapava do Sul","key":"Caçapava do Sul","lang":"pt"}
+data/BR/RS/Centenário={"id":"data/BR/RS/Centenário","key":"Centenário","lang":"pt"}
+data/BR/RS/Cerrito={"id":"data/BR/RS/Cerrito","key":"Cerrito","lang":"pt"}
+data/BR/RS/Cerro Branco={"id":"data/BR/RS/Cerro Branco","key":"Cerro Branco","lang":"pt"}
+data/BR/RS/Cerro Grande={"id":"data/BR/RS/Cerro Grande","key":"Cerro Grande","lang":"pt"}
+data/BR/RS/Cerro Grande do Sul={"id":"data/BR/RS/Cerro Grande do Sul","key":"Cerro Grande do Sul","lang":"pt"}
+data/BR/RS/Cerro Largo={"id":"data/BR/RS/Cerro Largo","key":"Cerro Largo","lang":"pt"}
+data/BR/RS/Chapada={"id":"data/BR/RS/Chapada","key":"Chapada","lang":"pt"}
+data/BR/RS/Charqueadas={"id":"data/BR/RS/Charqueadas","key":"Charqueadas","lang":"pt"}
+data/BR/RS/Charrua={"id":"data/BR/RS/Charrua","key":"Charrua","lang":"pt"}
+data/BR/RS/Chiapeta={"id":"data/BR/RS/Chiapeta","key":"Chiapeta","lang":"pt"}
+data/BR/RS/Chui={"id":"data/BR/RS/Chui","key":"Chui","lang":"pt"}
+data/BR/RS/Chuvisca={"id":"data/BR/RS/Chuvisca","key":"Chuvisca","lang":"pt"}
+data/BR/RS/Cidreira={"id":"data/BR/RS/Cidreira","key":"Cidreira","lang":"pt"}
+data/BR/RS/Ciríaco={"id":"data/BR/RS/Ciríaco","key":"Ciríaco","lang":"pt"}
+data/BR/RS/Colinas={"id":"data/BR/RS/Colinas","key":"Colinas","lang":"pt"}
+data/BR/RS/Colorado={"id":"data/BR/RS/Colorado","key":"Colorado","lang":"pt"}
+data/BR/RS/Condor={"id":"data/BR/RS/Condor","key":"Condor","lang":"pt"}
+data/BR/RS/Constantina={"id":"data/BR/RS/Constantina","key":"Constantina","lang":"pt"}
+data/BR/RS/Coqueiro Baixo={"id":"data/BR/RS/Coqueiro Baixo","key":"Coqueiro Baixo","lang":"pt"}
+data/BR/RS/Coqueiros do Sul={"id":"data/BR/RS/Coqueiros do Sul","key":"Coqueiros do Sul","lang":"pt"}
+data/BR/RS/Coronel Barros={"id":"data/BR/RS/Coronel Barros","key":"Coronel Barros","lang":"pt"}
+data/BR/RS/Coronel Bicaco={"id":"data/BR/RS/Coronel Bicaco","key":"Coronel Bicaco","lang":"pt"}
+data/BR/RS/Coronel Pilar={"id":"data/BR/RS/Coronel Pilar","key":"Coronel Pilar","lang":"pt"}
+data/BR/RS/Cotiporã={"id":"data/BR/RS/Cotiporã","key":"Cotiporã","lang":"pt"}
+data/BR/RS/Coxilha={"id":"data/BR/RS/Coxilha","key":"Coxilha","lang":"pt"}
+data/BR/RS/Crissiumal={"id":"data/BR/RS/Crissiumal","key":"Crissiumal","lang":"pt"}
+data/BR/RS/Cristal={"id":"data/BR/RS/Cristal","key":"Cristal","lang":"pt"}
+data/BR/RS/Cristal do Sul={"id":"data/BR/RS/Cristal do Sul","key":"Cristal do Sul","lang":"pt"}
+data/BR/RS/Cruz Alta={"id":"data/BR/RS/Cruz Alta","key":"Cruz Alta","lang":"pt"}
+data/BR/RS/Cruzaltense={"id":"data/BR/RS/Cruzaltense","key":"Cruzaltense","lang":"pt"}
+data/BR/RS/Cruzeiro do Sul={"id":"data/BR/RS/Cruzeiro do Sul","key":"Cruzeiro do Sul","lang":"pt"}
+data/BR/RS/Cândido Godói={"id":"data/BR/RS/Cândido Godói","key":"Cândido Godói","lang":"pt"}
+data/BR/RS/David Canabarro={"id":"data/BR/RS/David Canabarro","key":"David Canabarro","lang":"pt"}
+data/BR/RS/Derrubadas={"id":"data/BR/RS/Derrubadas","key":"Derrubadas","lang":"pt"}
+data/BR/RS/Dezesseis de Novembro={"id":"data/BR/RS/Dezesseis de Novembro","key":"Dezesseis de Novembro","lang":"pt"}
+data/BR/RS/Dilermando de Aguiar={"id":"data/BR/RS/Dilermando de Aguiar","key":"Dilermando de Aguiar","lang":"pt"}
+data/BR/RS/Dois Irmãos={"id":"data/BR/RS/Dois Irmãos","key":"Dois Irmãos","lang":"pt"}
+data/BR/RS/Dois Irmãos das Missões={"id":"data/BR/RS/Dois Irmãos das Missões","key":"Dois Irmãos das Missões","lang":"pt"}
+data/BR/RS/Dois Lajeados={"id":"data/BR/RS/Dois Lajeados","key":"Dois Lajeados","lang":"pt"}
+data/BR/RS/Dom Feliciano={"id":"data/BR/RS/Dom Feliciano","key":"Dom Feliciano","lang":"pt"}
+data/BR/RS/Dom Pedrito={"id":"data/BR/RS/Dom Pedrito","key":"Dom Pedrito","lang":"pt"}
+data/BR/RS/Dom Pedro de Alcântara={"id":"data/BR/RS/Dom Pedro de Alcântara","key":"Dom Pedro de Alcântara","lang":"pt"}
+data/BR/RS/Dona Francisca={"id":"data/BR/RS/Dona Francisca","key":"Dona Francisca","lang":"pt"}
+data/BR/RS/Doutor Maurício Cardoso={"id":"data/BR/RS/Doutor Maurício Cardoso","key":"Doutor Maurício Cardoso","lang":"pt"}
+data/BR/RS/Doutor Ricardo={"id":"data/BR/RS/Doutor Ricardo","key":"Doutor Ricardo","lang":"pt"}
+data/BR/RS/Eldorado do Sul={"id":"data/BR/RS/Eldorado do Sul","key":"Eldorado do Sul","lang":"pt"}
+data/BR/RS/Encantado={"id":"data/BR/RS/Encantado","key":"Encantado","lang":"pt"}
+data/BR/RS/Encruzilhada do Sul={"id":"data/BR/RS/Encruzilhada do Sul","key":"Encruzilhada do Sul","lang":"pt"}
+data/BR/RS/Engenho Velho={"id":"data/BR/RS/Engenho Velho","key":"Engenho Velho","lang":"pt"}
+data/BR/RS/Entre Rios do Sul={"id":"data/BR/RS/Entre Rios do Sul","key":"Entre Rios do Sul","lang":"pt"}
+data/BR/RS/Entre-Ijuís={"id":"data/BR/RS/Entre-Ijuís","key":"Entre-Ijuís","lang":"pt"}
+data/BR/RS/Erebango={"id":"data/BR/RS/Erebango","key":"Erebango","lang":"pt"}
+data/BR/RS/Erechim={"id":"data/BR/RS/Erechim","key":"Erechim","lang":"pt"}
+data/BR/RS/Ernestina={"id":"data/BR/RS/Ernestina","key":"Ernestina","lang":"pt"}
+data/BR/RS/Erval Grande={"id":"data/BR/RS/Erval Grande","key":"Erval Grande","lang":"pt"}
+data/BR/RS/Erval Seco={"id":"data/BR/RS/Erval Seco","key":"Erval Seco","lang":"pt"}
+data/BR/RS/Esmeralda={"id":"data/BR/RS/Esmeralda","key":"Esmeralda","lang":"pt"}
+data/BR/RS/Esperança do Sul={"id":"data/BR/RS/Esperança do Sul","key":"Esperança do Sul","lang":"pt"}
+data/BR/RS/Espumoso={"id":"data/BR/RS/Espumoso","key":"Espumoso","lang":"pt"}
+data/BR/RS/Estação={"id":"data/BR/RS/Estação","key":"Estação","lang":"pt"}
+data/BR/RS/Esteio={"id":"data/BR/RS/Esteio","key":"Esteio","lang":"pt"}
+data/BR/RS/Estrela={"id":"data/BR/RS/Estrela","key":"Estrela","lang":"pt"}
+data/BR/RS/Estrela Velha={"id":"data/BR/RS/Estrela Velha","key":"Estrela Velha","lang":"pt"}
+data/BR/RS/Estância Velha={"id":"data/BR/RS/Estância Velha","key":"Estância Velha","lang":"pt"}
+data/BR/RS/Eugênio de Castro={"id":"data/BR/RS/Eugênio de Castro","key":"Eugênio de Castro","lang":"pt"}
+data/BR/RS/Fagundes Varela={"id":"data/BR/RS/Fagundes Varela","key":"Fagundes Varela","lang":"pt"}
+data/BR/RS/Farroupilha={"id":"data/BR/RS/Farroupilha","key":"Farroupilha","lang":"pt"}
+data/BR/RS/Faxinal do Soturno={"id":"data/BR/RS/Faxinal do Soturno","key":"Faxinal do Soturno","lang":"pt"}
+data/BR/RS/Faxinalzinho={"id":"data/BR/RS/Faxinalzinho","key":"Faxinalzinho","lang":"pt"}
+data/BR/RS/Fazenda Vilanova={"id":"data/BR/RS/Fazenda Vilanova","key":"Fazenda Vilanova","lang":"pt"}
+data/BR/RS/Feliz={"id":"data/BR/RS/Feliz","key":"Feliz","lang":"pt"}
+data/BR/RS/Flores da Cunha={"id":"data/BR/RS/Flores da Cunha","key":"Flores da Cunha","lang":"pt"}
+data/BR/RS/Floriano Peixoto={"id":"data/BR/RS/Floriano Peixoto","key":"Floriano Peixoto","lang":"pt"}
+data/BR/RS/Fontoura Xavier={"id":"data/BR/RS/Fontoura Xavier","key":"Fontoura Xavier","lang":"pt"}
+data/BR/RS/Formigueiro={"id":"data/BR/RS/Formigueiro","key":"Formigueiro","lang":"pt"}
+data/BR/RS/Forquetinha={"id":"data/BR/RS/Forquetinha","key":"Forquetinha","lang":"pt"}
+data/BR/RS/Fortaleza dos Valos={"id":"data/BR/RS/Fortaleza dos Valos","key":"Fortaleza dos Valos","lang":"pt"}
+data/BR/RS/Frederico Westphalen={"id":"data/BR/RS/Frederico Westphalen","key":"Frederico Westphalen","lang":"pt"}
+data/BR/RS/Garibaldi={"id":"data/BR/RS/Garibaldi","key":"Garibaldi","lang":"pt"}
+data/BR/RS/Garruchos={"id":"data/BR/RS/Garruchos","key":"Garruchos","lang":"pt"}
+data/BR/RS/Gaurama={"id":"data/BR/RS/Gaurama","key":"Gaurama","lang":"pt"}
+data/BR/RS/General Câmara={"id":"data/BR/RS/General Câmara","key":"General Câmara","lang":"pt"}
+data/BR/RS/Gentil={"id":"data/BR/RS/Gentil","key":"Gentil","lang":"pt"}
+data/BR/RS/Getúlio Vargas={"id":"data/BR/RS/Getúlio Vargas","key":"Getúlio Vargas","lang":"pt"}
+data/BR/RS/Giruá={"id":"data/BR/RS/Giruá","key":"Giruá","lang":"pt"}
+data/BR/RS/Glorinha={"id":"data/BR/RS/Glorinha","key":"Glorinha","lang":"pt"}
+data/BR/RS/Gramado={"id":"data/BR/RS/Gramado","key":"Gramado","lang":"pt"}
+data/BR/RS/Gramado Xavier={"id":"data/BR/RS/Gramado Xavier","key":"Gramado Xavier","lang":"pt"}
+data/BR/RS/Gramado dos Loureiros={"id":"data/BR/RS/Gramado dos Loureiros","key":"Gramado dos Loureiros","lang":"pt"}
+data/BR/RS/Gravataí={"id":"data/BR/RS/Gravataí","key":"Gravataí","lang":"pt"}
+data/BR/RS/Guabiju={"id":"data/BR/RS/Guabiju","key":"Guabiju","lang":"pt"}
+data/BR/RS/Guaporé={"id":"data/BR/RS/Guaporé","key":"Guaporé","lang":"pt"}
+data/BR/RS/Guarani das Missões={"id":"data/BR/RS/Guarani das Missões","key":"Guarani das Missões","lang":"pt"}
+data/BR/RS/Guaíba={"id":"data/BR/RS/Guaíba","key":"Guaíba","lang":"pt"}
+data/BR/RS/Harmonia={"id":"data/BR/RS/Harmonia","key":"Harmonia","lang":"pt"}
+data/BR/RS/Herval={"id":"data/BR/RS/Herval","key":"Herval","lang":"pt"}
+data/BR/RS/Herveiras={"id":"data/BR/RS/Herveiras","key":"Herveiras","lang":"pt"}
+data/BR/RS/Horizontina={"id":"data/BR/RS/Horizontina","key":"Horizontina","lang":"pt"}
+data/BR/RS/Hulha Negra={"id":"data/BR/RS/Hulha Negra","key":"Hulha Negra","lang":"pt"}
+data/BR/RS/Humaitá={"id":"data/BR/RS/Humaitá","key":"Humaitá","lang":"pt"}
+data/BR/RS/Ibarama={"id":"data/BR/RS/Ibarama","key":"Ibarama","lang":"pt"}
+data/BR/RS/Ibiaçá={"id":"data/BR/RS/Ibiaçá","key":"Ibiaçá","lang":"pt"}
+data/BR/RS/Ibiraiaras={"id":"data/BR/RS/Ibiraiaras","key":"Ibiraiaras","lang":"pt"}
+data/BR/RS/Ibirapuitã={"id":"data/BR/RS/Ibirapuitã","key":"Ibirapuitã","lang":"pt"}
+data/BR/RS/Ibirubá={"id":"data/BR/RS/Ibirubá","key":"Ibirubá","lang":"pt"}
+data/BR/RS/Igrejinha={"id":"data/BR/RS/Igrejinha","key":"Igrejinha","lang":"pt"}
+data/BR/RS/Ijuí={"id":"data/BR/RS/Ijuí","key":"Ijuí","lang":"pt"}
+data/BR/RS/Ilópolis={"id":"data/BR/RS/Ilópolis","key":"Ilópolis","lang":"pt"}
+data/BR/RS/Imbé={"id":"data/BR/RS/Imbé","key":"Imbé","lang":"pt"}
+data/BR/RS/Imigrante={"id":"data/BR/RS/Imigrante","key":"Imigrante","lang":"pt"}
+data/BR/RS/Independencia={"id":"data/BR/RS/Independencia","key":"Independencia","lang":"pt"}
+data/BR/RS/Inhacorá={"id":"data/BR/RS/Inhacorá","key":"Inhacorá","lang":"pt"}
+data/BR/RS/Ipiranga do Sul={"id":"data/BR/RS/Ipiranga do Sul","key":"Ipiranga do Sul","lang":"pt"}
+data/BR/RS/Ipê={"id":"data/BR/RS/Ipê","key":"Ipê","lang":"pt"}
+data/BR/RS/Irai={"id":"data/BR/RS/Irai","key":"Irai","lang":"pt"}
+data/BR/RS/Itaara={"id":"data/BR/RS/Itaara","key":"Itaara","lang":"pt"}
+data/BR/RS/Itacurubi={"id":"data/BR/RS/Itacurubi","key":"Itacurubi","lang":"pt"}
+data/BR/RS/Itapuca={"id":"data/BR/RS/Itapuca","key":"Itapuca","lang":"pt"}
+data/BR/RS/Itaqui={"id":"data/BR/RS/Itaqui","key":"Itaqui","lang":"pt"}
+data/BR/RS/Itatiba do Sul={"id":"data/BR/RS/Itatiba do Sul","key":"Itatiba do Sul","lang":"pt"}
+data/BR/RS/Itatí={"id":"data/BR/RS/Itatí","key":"Itatí","lang":"pt"}
+data/BR/RS/Ivorá={"id":"data/BR/RS/Ivorá","key":"Ivorá","lang":"pt"}
+data/BR/RS/Ivoti={"id":"data/BR/RS/Ivoti","key":"Ivoti","lang":"pt"}
+data/BR/RS/Jaboticaba={"id":"data/BR/RS/Jaboticaba","key":"Jaboticaba","lang":"pt"}
+data/BR/RS/Jacuizinho={"id":"data/BR/RS/Jacuizinho","key":"Jacuizinho","lang":"pt"}
+data/BR/RS/Jacutinga={"id":"data/BR/RS/Jacutinga","key":"Jacutinga","lang":"pt"}
+data/BR/RS/Jaguari={"id":"data/BR/RS/Jaguari","key":"Jaguari","lang":"pt"}
+data/BR/RS/Jaguarão={"id":"data/BR/RS/Jaguarão","key":"Jaguarão","lang":"pt"}
+data/BR/RS/Jaquirana={"id":"data/BR/RS/Jaquirana","key":"Jaquirana","lang":"pt"}
+data/BR/RS/Jari={"id":"data/BR/RS/Jari","key":"Jari","lang":"pt"}
+data/BR/RS/Jóia={"id":"data/BR/RS/Jóia","key":"Jóia","lang":"pt"}
+data/BR/RS/Júlio de Castilhos={"id":"data/BR/RS/Júlio de Castilhos","key":"Júlio de Castilhos","lang":"pt"}
+data/BR/RS/Lagoa Bonita do Sul={"id":"data/BR/RS/Lagoa Bonita do Sul","key":"Lagoa Bonita do Sul","lang":"pt"}
+data/BR/RS/Lagoa Vermelha={"id":"data/BR/RS/Lagoa Vermelha","key":"Lagoa Vermelha","lang":"pt"}
+data/BR/RS/Lagoa dos Três Cantos={"id":"data/BR/RS/Lagoa dos Três Cantos","key":"Lagoa dos Três Cantos","lang":"pt"}
+data/BR/RS/Lagoão={"id":"data/BR/RS/Lagoão","key":"Lagoão","lang":"pt"}
+data/BR/RS/Lajeado={"id":"data/BR/RS/Lajeado","key":"Lajeado","lang":"pt"}
+data/BR/RS/Lajeado do Bugre={"id":"data/BR/RS/Lajeado do Bugre","key":"Lajeado do Bugre","lang":"pt"}
+data/BR/RS/Lavras do Sul={"id":"data/BR/RS/Lavras do Sul","key":"Lavras do Sul","lang":"pt"}
+data/BR/RS/Liberato Salzano={"id":"data/BR/RS/Liberato Salzano","key":"Liberato Salzano","lang":"pt"}
+data/BR/RS/Lindolfo Collor={"id":"data/BR/RS/Lindolfo Collor","key":"Lindolfo Collor","lang":"pt"}
+data/BR/RS/Linha Nova={"id":"data/BR/RS/Linha Nova","key":"Linha Nova","lang":"pt"}
+data/BR/RS/Machadinho={"id":"data/BR/RS/Machadinho","key":"Machadinho","lang":"pt"}
+data/BR/RS/Mampituba={"id":"data/BR/RS/Mampituba","key":"Mampituba","lang":"pt"}
+data/BR/RS/Manoel Viana={"id":"data/BR/RS/Manoel Viana","key":"Manoel Viana","lang":"pt"}
+data/BR/RS/Maquiné={"id":"data/BR/RS/Maquiné","key":"Maquiné","lang":"pt"}
+data/BR/RS/Maratá={"id":"data/BR/RS/Maratá","key":"Maratá","lang":"pt"}
+data/BR/RS/Marau={"id":"data/BR/RS/Marau","key":"Marau","lang":"pt"}
+data/BR/RS/Marcelino Ramos={"id":"data/BR/RS/Marcelino Ramos","key":"Marcelino Ramos","lang":"pt"}
+data/BR/RS/Mariana Pimentel={"id":"data/BR/RS/Mariana Pimentel","key":"Mariana Pimentel","lang":"pt"}
+data/BR/RS/Mariano Moro={"id":"data/BR/RS/Mariano Moro","key":"Mariano Moro","lang":"pt"}
+data/BR/RS/Marques de Souza={"id":"data/BR/RS/Marques de Souza","key":"Marques de Souza","lang":"pt"}
+data/BR/RS/Mata={"id":"data/BR/RS/Mata","key":"Mata","lang":"pt"}
+data/BR/RS/Mato Castelhano={"id":"data/BR/RS/Mato Castelhano","key":"Mato Castelhano","lang":"pt"}
+data/BR/RS/Mato Leitão={"id":"data/BR/RS/Mato Leitão","key":"Mato Leitão","lang":"pt"}
+data/BR/RS/Mato Queimado={"id":"data/BR/RS/Mato Queimado","key":"Mato Queimado","lang":"pt"}
+data/BR/RS/Maximiliano de Almeida={"id":"data/BR/RS/Maximiliano de Almeida","key":"Maximiliano de Almeida","lang":"pt"}
+data/BR/RS/Maçambara={"id":"data/BR/RS/Maçambara","key":"Maçambara","lang":"pt"}
+data/BR/RS/Minas do Leão={"id":"data/BR/RS/Minas do Leão","key":"Minas do Leão","lang":"pt"}
+data/BR/RS/Miraguaí={"id":"data/BR/RS/Miraguaí","key":"Miraguaí","lang":"pt"}
+data/BR/RS/Montauri={"id":"data/BR/RS/Montauri","key":"Montauri","lang":"pt"}
+data/BR/RS/Monte Alegre dos Campos={"id":"data/BR/RS/Monte Alegre dos Campos","key":"Monte Alegre dos Campos","lang":"pt"}
+data/BR/RS/Monte Belo do Sul={"id":"data/BR/RS/Monte Belo do Sul","key":"Monte Belo do Sul","lang":"pt"}
+data/BR/RS/Montenegro={"id":"data/BR/RS/Montenegro","key":"Montenegro","lang":"pt"}
+data/BR/RS/Mormaço={"id":"data/BR/RS/Mormaço","key":"Mormaço","lang":"pt"}
+data/BR/RS/Morrinhos do Sul={"id":"data/BR/RS/Morrinhos do Sul","key":"Morrinhos do Sul","lang":"pt"}
+data/BR/RS/Morro Redondo={"id":"data/BR/RS/Morro Redondo","key":"Morro Redondo","lang":"pt"}
+data/BR/RS/Morro Reuter={"id":"data/BR/RS/Morro Reuter","key":"Morro Reuter","lang":"pt"}
+data/BR/RS/Mostardas={"id":"data/BR/RS/Mostardas","key":"Mostardas","lang":"pt"}
+data/BR/RS/Muitos Capões={"id":"data/BR/RS/Muitos Capões","key":"Muitos Capões","lang":"pt"}
+data/BR/RS/Muliterno={"id":"data/BR/RS/Muliterno","key":"Muliterno","lang":"pt"}
+data/BR/RS/Muçum={"id":"data/BR/RS/Muçum","key":"Muçum","lang":"pt"}
+data/BR/RS/Nicolau Vergueiro={"id":"data/BR/RS/Nicolau Vergueiro","key":"Nicolau Vergueiro","lang":"pt"}
+data/BR/RS/Nonoai={"id":"data/BR/RS/Nonoai","key":"Nonoai","lang":"pt"}
+data/BR/RS/Nova Alvorada={"id":"data/BR/RS/Nova Alvorada","key":"Nova Alvorada","lang":"pt"}
+data/BR/RS/Nova Araçá={"id":"data/BR/RS/Nova Araçá","key":"Nova Araçá","lang":"pt"}
+data/BR/RS/Nova Bassano={"id":"data/BR/RS/Nova Bassano","key":"Nova Bassano","lang":"pt"}
+data/BR/RS/Nova Boa Vista={"id":"data/BR/RS/Nova Boa Vista","key":"Nova Boa Vista","lang":"pt"}
+data/BR/RS/Nova Bréscia={"id":"data/BR/RS/Nova Bréscia","key":"Nova Bréscia","lang":"pt"}
+data/BR/RS/Nova Candelária={"id":"data/BR/RS/Nova Candelária","key":"Nova Candelária","lang":"pt"}
+data/BR/RS/Nova Esperança do Sul={"id":"data/BR/RS/Nova Esperança do Sul","key":"Nova Esperança do Sul","lang":"pt"}
+data/BR/RS/Nova Hartz={"id":"data/BR/RS/Nova Hartz","key":"Nova Hartz","lang":"pt"}
+data/BR/RS/Nova Palma={"id":"data/BR/RS/Nova Palma","key":"Nova Palma","lang":"pt"}
+data/BR/RS/Nova Petrópolis={"id":"data/BR/RS/Nova Petrópolis","key":"Nova Petrópolis","lang":"pt"}
+data/BR/RS/Nova Prata={"id":"data/BR/RS/Nova Prata","key":"Nova Prata","lang":"pt"}
+data/BR/RS/Nova Pádua={"id":"data/BR/RS/Nova Pádua","key":"Nova Pádua","lang":"pt"}
+data/BR/RS/Nova Ramada={"id":"data/BR/RS/Nova Ramada","key":"Nova Ramada","lang":"pt"}
+data/BR/RS/Nova Roma do Sul={"id":"data/BR/RS/Nova Roma do Sul","key":"Nova Roma do Sul","lang":"pt"}
+data/BR/RS/Nova Santa Rita={"id":"data/BR/RS/Nova Santa Rita","key":"Nova Santa Rita","lang":"pt"}
+data/BR/RS/Novo Barreiro={"id":"data/BR/RS/Novo Barreiro","key":"Novo Barreiro","lang":"pt"}
+data/BR/RS/Novo Cabrais={"id":"data/BR/RS/Novo Cabrais","key":"Novo Cabrais","lang":"pt"}
+data/BR/RS/Novo Hamburgo={"id":"data/BR/RS/Novo Hamburgo","key":"Novo Hamburgo","lang":"pt"}
+data/BR/RS/Novo Machado={"id":"data/BR/RS/Novo Machado","key":"Novo Machado","lang":"pt"}
+data/BR/RS/Novo Tiradentes={"id":"data/BR/RS/Novo Tiradentes","key":"Novo Tiradentes","lang":"pt"}
+data/BR/RS/Novo Xingu={"id":"data/BR/RS/Novo Xingu","key":"Novo Xingu","lang":"pt"}
+data/BR/RS/Não-Me-Toque={"id":"data/BR/RS/Não-Me-Toque","key":"Não-Me-Toque","lang":"pt"}
+data/BR/RS/Osório={"id":"data/BR/RS/Osório","key":"Osório","lang":"pt"}
+data/BR/RS/Paim Filho={"id":"data/BR/RS/Paim Filho","key":"Paim Filho","lang":"pt"}
+data/BR/RS/Palmares do Sul={"id":"data/BR/RS/Palmares do Sul","key":"Palmares do Sul","lang":"pt"}
+data/BR/RS/Palmeira das Missões={"id":"data/BR/RS/Palmeira das Missões","key":"Palmeira das Missões","lang":"pt"}
+data/BR/RS/Palmitinho={"id":"data/BR/RS/Palmitinho","key":"Palmitinho","lang":"pt"}
+data/BR/RS/Panambi={"id":"data/BR/RS/Panambi","key":"Panambi","lang":"pt"}
+data/BR/RS/Pantano Grande={"id":"data/BR/RS/Pantano Grande","key":"Pantano Grande","lang":"pt"}
+data/BR/RS/Paraí={"id":"data/BR/RS/Paraí","key":"Paraí","lang":"pt"}
+data/BR/RS/Paraíso do Sul={"id":"data/BR/RS/Paraíso do Sul","key":"Paraíso do Sul","lang":"pt"}
+data/BR/RS/Pareci Novo={"id":"data/BR/RS/Pareci Novo","key":"Pareci Novo","lang":"pt"}
+data/BR/RS/Parobé={"id":"data/BR/RS/Parobé","key":"Parobé","lang":"pt"}
+data/BR/RS/Passa Sete={"id":"data/BR/RS/Passa Sete","key":"Passa Sete","lang":"pt"}
+data/BR/RS/Passo Fundo={"id":"data/BR/RS/Passo Fundo","key":"Passo Fundo","lang":"pt"}
+data/BR/RS/Passo do Sobrado={"id":"data/BR/RS/Passo do Sobrado","key":"Passo do Sobrado","lang":"pt"}
+data/BR/RS/Paulo Bento={"id":"data/BR/RS/Paulo Bento","key":"Paulo Bento","lang":"pt"}
+data/BR/RS/Paverama={"id":"data/BR/RS/Paverama","key":"Paverama","lang":"pt"}
+data/BR/RS/Pedras Altas={"id":"data/BR/RS/Pedras Altas","key":"Pedras Altas","lang":"pt"}
+data/BR/RS/Pedro Osório={"id":"data/BR/RS/Pedro Osório","key":"Pedro Osório","lang":"pt"}
+data/BR/RS/Pejuçara={"id":"data/BR/RS/Pejuçara","key":"Pejuçara","lang":"pt"}
+data/BR/RS/Pelotas={"id":"data/BR/RS/Pelotas","key":"Pelotas","lang":"pt"}
+data/BR/RS/Picada Café={"id":"data/BR/RS/Picada Café","key":"Picada Café","lang":"pt"}
+data/BR/RS/Pinhal={"id":"data/BR/RS/Pinhal","key":"Pinhal","lang":"pt"}
+data/BR/RS/Pinhal Grande={"id":"data/BR/RS/Pinhal Grande","key":"Pinhal Grande","lang":"pt"}
+data/BR/RS/Pinhal da Serra={"id":"data/BR/RS/Pinhal da Serra","key":"Pinhal da Serra","lang":"pt"}
+data/BR/RS/Pinheirinho do Vale={"id":"data/BR/RS/Pinheirinho do Vale","key":"Pinheirinho do Vale","lang":"pt"}
+data/BR/RS/Pinheiro Machado={"id":"data/BR/RS/Pinheiro Machado","key":"Pinheiro Machado","lang":"pt"}
+data/BR/RS/Pinto Bandeira={"id":"data/BR/RS/Pinto Bandeira","key":"Pinto Bandeira","lang":"pt"}
+data/BR/RS/Pirapó={"id":"data/BR/RS/Pirapó","key":"Pirapó","lang":"pt"}
+data/BR/RS/Piratini={"id":"data/BR/RS/Piratini","key":"Piratini","lang":"pt"}
+data/BR/RS/Planalto={"id":"data/BR/RS/Planalto","key":"Planalto","lang":"pt"}
+data/BR/RS/Ponte Preta={"id":"data/BR/RS/Ponte Preta","key":"Ponte Preta","lang":"pt"}
+data/BR/RS/Pontão={"id":"data/BR/RS/Pontão","key":"Pontão","lang":"pt"}
+data/BR/RS/Porto Alegre={"id":"data/BR/RS/Porto Alegre","key":"Porto Alegre","lang":"pt"}
+data/BR/RS/Porto Lucena={"id":"data/BR/RS/Porto Lucena","key":"Porto Lucena","lang":"pt"}
+data/BR/RS/Porto Mauá={"id":"data/BR/RS/Porto Mauá","key":"Porto Mauá","lang":"pt"}
+data/BR/RS/Porto Vera Cruz={"id":"data/BR/RS/Porto Vera Cruz","key":"Porto Vera Cruz","lang":"pt"}
+data/BR/RS/Porto Xavier={"id":"data/BR/RS/Porto Xavier","key":"Porto Xavier","lang":"pt"}
+data/BR/RS/Portão={"id":"data/BR/RS/Portão","key":"Portão","lang":"pt"}
+data/BR/RS/Pouso Novo={"id":"data/BR/RS/Pouso Novo","key":"Pouso Novo","lang":"pt"}
+data/BR/RS/Poço das Antas={"id":"data/BR/RS/Poço das Antas","key":"Poço das Antas","lang":"pt"}
+data/BR/RS/Presidente Lucena={"id":"data/BR/RS/Presidente Lucena","key":"Presidente Lucena","lang":"pt"}
+data/BR/RS/Progresso={"id":"data/BR/RS/Progresso","key":"Progresso","lang":"pt"}
+data/BR/RS/Protásio Alves={"id":"data/BR/RS/Protásio Alves","key":"Protásio Alves","lang":"pt"}
+data/BR/RS/Putinga={"id":"data/BR/RS/Putinga","key":"Putinga","lang":"pt"}
+data/BR/RS/Quaraí={"id":"data/BR/RS/Quaraí","key":"Quaraí","lang":"pt"}
+data/BR/RS/Quatro Irmãos={"id":"data/BR/RS/Quatro Irmãos","key":"Quatro Irmãos","lang":"pt"}
+data/BR/RS/Quevedos={"id":"data/BR/RS/Quevedos","key":"Quevedos","lang":"pt"}
+data/BR/RS/Quinze de Novembro={"id":"data/BR/RS/Quinze de Novembro","key":"Quinze de Novembro","lang":"pt"}
+data/BR/RS/Redentora={"id":"data/BR/RS/Redentora","key":"Redentora","lang":"pt"}
+data/BR/RS/Relvado={"id":"data/BR/RS/Relvado","key":"Relvado","lang":"pt"}
+data/BR/RS/Restinga Seca={"id":"data/BR/RS/Restinga Seca","key":"Restinga Seca","lang":"pt"}
+data/BR/RS/Rio Grande={"id":"data/BR/RS/Rio Grande","key":"Rio Grande","lang":"pt"}
+data/BR/RS/Rio Pardo={"id":"data/BR/RS/Rio Pardo","key":"Rio Pardo","lang":"pt"}
+data/BR/RS/Rio dos Índios={"id":"data/BR/RS/Rio dos Índios","key":"Rio dos Índios","lang":"pt"}
+data/BR/RS/Riozinho={"id":"data/BR/RS/Riozinho","key":"Riozinho","lang":"pt"}
+data/BR/RS/Roca Sales={"id":"data/BR/RS/Roca Sales","key":"Roca Sales","lang":"pt"}
+data/BR/RS/Rodeio Bonito={"id":"data/BR/RS/Rodeio Bonito","key":"Rodeio Bonito","lang":"pt"}
+data/BR/RS/Rolador={"id":"data/BR/RS/Rolador","key":"Rolador","lang":"pt"}
+data/BR/RS/Rolante={"id":"data/BR/RS/Rolante","key":"Rolante","lang":"pt"}
+data/BR/RS/Ronda Alta={"id":"data/BR/RS/Ronda Alta","key":"Ronda Alta","lang":"pt"}
+data/BR/RS/Rondinha={"id":"data/BR/RS/Rondinha","key":"Rondinha","lang":"pt"}
+data/BR/RS/Roque Gonzales={"id":"data/BR/RS/Roque Gonzales","key":"Roque Gonzales","lang":"pt"}
+data/BR/RS/Rosário do Sul={"id":"data/BR/RS/Rosário do Sul","key":"Rosário do Sul","lang":"pt"}
+data/BR/RS/Sagrada Familia={"id":"data/BR/RS/Sagrada Familia","key":"Sagrada Familia","lang":"pt"}
+data/BR/RS/Saldanha Marinho={"id":"data/BR/RS/Saldanha Marinho","key":"Saldanha Marinho","lang":"pt"}
+data/BR/RS/Salto do Jacuí={"id":"data/BR/RS/Salto do Jacuí","key":"Salto do Jacuí","lang":"pt"}
+data/BR/RS/Salvador das Missões={"id":"data/BR/RS/Salvador das Missões","key":"Salvador das Missões","lang":"pt"}
+data/BR/RS/Salvador do Sul={"id":"data/BR/RS/Salvador do Sul","key":"Salvador do Sul","lang":"pt"}
+data/BR/RS/Sananduva={"id":"data/BR/RS/Sananduva","key":"Sananduva","lang":"pt"}
+data/BR/RS/Santa Bárbara do Sul={"id":"data/BR/RS/Santa Bárbara do Sul","key":"Santa Bárbara do Sul","lang":"pt"}
+data/BR/RS/Santa Cecília do Sul={"id":"data/BR/RS/Santa Cecília do Sul","key":"Santa Cecília do Sul","lang":"pt"}
+data/BR/RS/Santa Clara do Sul={"id":"data/BR/RS/Santa Clara do Sul","key":"Santa Clara do Sul","lang":"pt"}
+data/BR/RS/Santa Cruz do Sul={"id":"data/BR/RS/Santa Cruz do Sul","key":"Santa Cruz do Sul","lang":"pt"}
+data/BR/RS/Santa Margarida do Sul={"id":"data/BR/RS/Santa Margarida do Sul","key":"Santa Margarida do Sul","lang":"pt"}
+data/BR/RS/Santa Maria={"id":"data/BR/RS/Santa Maria","key":"Santa Maria","lang":"pt"}
+data/BR/RS/Santa Maria do Herval={"id":"data/BR/RS/Santa Maria do Herval","key":"Santa Maria do Herval","lang":"pt"}
+data/BR/RS/Santa Rosa={"id":"data/BR/RS/Santa Rosa","key":"Santa Rosa","lang":"pt"}
+data/BR/RS/Santa Tereza={"id":"data/BR/RS/Santa Tereza","key":"Santa Tereza","lang":"pt"}
+data/BR/RS/Santa Vitória do Palmar={"id":"data/BR/RS/Santa Vitória do Palmar","key":"Santa Vitória do Palmar","lang":"pt"}
+data/BR/RS/Santana da Boa Vista={"id":"data/BR/RS/Santana da Boa Vista","key":"Santana da Boa Vista","lang":"pt"}
+data/BR/RS/Santana do Livramento={"id":"data/BR/RS/Santana do Livramento","key":"Santana do Livramento","lang":"pt"}
+data/BR/RS/Santiago={"id":"data/BR/RS/Santiago","key":"Santiago","lang":"pt"}
+data/BR/RS/Santo Antônio da Patrulha={"id":"data/BR/RS/Santo Antônio da Patrulha","key":"Santo Antônio da Patrulha","lang":"pt"}
+data/BR/RS/Santo Antônio das Missões={"id":"data/BR/RS/Santo Antônio das Missões","key":"Santo Antônio das Missões","lang":"pt"}
+data/BR/RS/Santo Antônio do Palma={"id":"data/BR/RS/Santo Antônio do Palma","key":"Santo Antônio do Palma","lang":"pt"}
+data/BR/RS/Santo Antônio do Planalto={"id":"data/BR/RS/Santo Antônio do Planalto","key":"Santo Antônio do Planalto","lang":"pt"}
+data/BR/RS/Santo Augusto={"id":"data/BR/RS/Santo Augusto","key":"Santo Augusto","lang":"pt"}
+data/BR/RS/Santo Cristo={"id":"data/BR/RS/Santo Cristo","key":"Santo Cristo","lang":"pt"}
+data/BR/RS/Santo Expedito do Sul={"id":"data/BR/RS/Santo Expedito do Sul","key":"Santo Expedito do Sul","lang":"pt"}
+data/BR/RS/Santo Ângelo={"id":"data/BR/RS/Santo Ângelo","key":"Santo Ângelo","lang":"pt"}
+data/BR/RS/Sapiranga={"id":"data/BR/RS/Sapiranga","key":"Sapiranga","lang":"pt"}
+data/BR/RS/Sapucaia do Sul={"id":"data/BR/RS/Sapucaia do Sul","key":"Sapucaia do Sul","lang":"pt"}
+data/BR/RS/Sarandí={"id":"data/BR/RS/Sarandí","key":"Sarandí","lang":"pt"}
+data/BR/RS/Seberi={"id":"data/BR/RS/Seberi","key":"Seberi","lang":"pt"}
+data/BR/RS/Sede Nova={"id":"data/BR/RS/Sede Nova","key":"Sede Nova","lang":"pt"}
+data/BR/RS/Segredo={"id":"data/BR/RS/Segredo","key":"Segredo","lang":"pt"}
+data/BR/RS/Selbach={"id":"data/BR/RS/Selbach","key":"Selbach","lang":"pt"}
+data/BR/RS/Senador Salgado Filho={"id":"data/BR/RS/Senador Salgado Filho","key":"Senador Salgado Filho","lang":"pt"}
+data/BR/RS/Sentinela do Sul={"id":"data/BR/RS/Sentinela do Sul","key":"Sentinela do Sul","lang":"pt"}
+data/BR/RS/Serafina Corrêa={"id":"data/BR/RS/Serafina Corrêa","key":"Serafina Corrêa","lang":"pt"}
+data/BR/RS/Sertão={"id":"data/BR/RS/Sertão","key":"Sertão","lang":"pt"}
+data/BR/RS/Sertão Santana={"id":"data/BR/RS/Sertão Santana","key":"Sertão Santana","lang":"pt"}
+data/BR/RS/Sete de Setembro={"id":"data/BR/RS/Sete de Setembro","key":"Sete de Setembro","lang":"pt"}
+data/BR/RS/Severiano de Almeida={"id":"data/BR/RS/Severiano de Almeida","key":"Severiano de Almeida","lang":"pt"}
+data/BR/RS/Silveira Martins={"id":"data/BR/RS/Silveira Martins","key":"Silveira Martins","lang":"pt"}
+data/BR/RS/Sinimbu={"id":"data/BR/RS/Sinimbu","key":"Sinimbu","lang":"pt"}
+data/BR/RS/Sobradinho={"id":"data/BR/RS/Sobradinho","key":"Sobradinho","lang":"pt"}
+data/BR/RS/Soledade={"id":"data/BR/RS/Soledade","key":"Soledade","lang":"pt"}
+data/BR/RS/São Borja={"id":"data/BR/RS/São Borja","key":"São Borja","lang":"pt"}
+data/BR/RS/São Domingos do Sul={"id":"data/BR/RS/São Domingos do Sul","key":"São Domingos do Sul","lang":"pt"}
+data/BR/RS/São Francisco de Assis={"id":"data/BR/RS/São Francisco de Assis","key":"São Francisco de Assis","lang":"pt"}
+data/BR/RS/São Francisco de Paula={"id":"data/BR/RS/São Francisco de Paula","key":"São Francisco de Paula","lang":"pt"}
+data/BR/RS/São Gabriel={"id":"data/BR/RS/São Gabriel","key":"São Gabriel","lang":"pt"}
+data/BR/RS/São Jerônimo={"id":"data/BR/RS/São Jerônimo","key":"São Jerônimo","lang":"pt"}
+data/BR/RS/São Jorge={"id":"data/BR/RS/São Jorge","key":"São Jorge","lang":"pt"}
+data/BR/RS/São José das Missões={"id":"data/BR/RS/São José das Missões","key":"São José das Missões","lang":"pt"}
+data/BR/RS/São José do Herval={"id":"data/BR/RS/São José do Herval","key":"São José do Herval","lang":"pt"}
+data/BR/RS/São José do Hortêncio={"id":"data/BR/RS/São José do Hortêncio","key":"São José do Hortêncio","lang":"pt"}
+data/BR/RS/São José do Inhacorá={"id":"data/BR/RS/São José do Inhacorá","key":"São José do Inhacorá","lang":"pt"}
+data/BR/RS/São José do Norte={"id":"data/BR/RS/São José do Norte","key":"São José do Norte","lang":"pt"}
+data/BR/RS/São José do Ouro={"id":"data/BR/RS/São José do Ouro","key":"São José do Ouro","lang":"pt"}
+data/BR/RS/São José do Sul={"id":"data/BR/RS/São José do Sul","key":"São José do Sul","lang":"pt"}
+data/BR/RS/São José dos Ausentes={"id":"data/BR/RS/São José dos Ausentes","key":"São José dos Ausentes","lang":"pt"}
+data/BR/RS/São João da Urtiga={"id":"data/BR/RS/São João da Urtiga","key":"São João da Urtiga","lang":"pt"}
+data/BR/RS/São João do Polêsine={"id":"data/BR/RS/São João do Polêsine","key":"São João do Polêsine","lang":"pt"}
+data/BR/RS/São Leopoldo={"id":"data/BR/RS/São Leopoldo","key":"São Leopoldo","lang":"pt"}
+data/BR/RS/São Lourenço do Sul={"id":"data/BR/RS/São Lourenço do Sul","key":"São Lourenço do Sul","lang":"pt"}
+data/BR/RS/São Luiz Gonzaga={"id":"data/BR/RS/São Luiz Gonzaga","key":"São Luiz Gonzaga","lang":"pt"}
+data/BR/RS/São Marcos={"id":"data/BR/RS/São Marcos","key":"São Marcos","lang":"pt"}
+data/BR/RS/São Martinho={"id":"data/BR/RS/São Martinho","key":"São Martinho","lang":"pt"}
+data/BR/RS/São Martinho da Serra={"id":"data/BR/RS/São Martinho da Serra","key":"São Martinho da Serra","lang":"pt"}
+data/BR/RS/São Miguel das Missões={"id":"data/BR/RS/São Miguel das Missões","key":"São Miguel das Missões","lang":"pt"}
+data/BR/RS/São Nicolau={"id":"data/BR/RS/São Nicolau","key":"São Nicolau","lang":"pt"}
+data/BR/RS/São Paulo das Missões={"id":"data/BR/RS/São Paulo das Missões","key":"São Paulo das Missões","lang":"pt"}
+data/BR/RS/São Pedro da Serra={"id":"data/BR/RS/São Pedro da Serra","key":"São Pedro da Serra","lang":"pt"}
+data/BR/RS/São Pedro das Missões={"id":"data/BR/RS/São Pedro das Missões","key":"São Pedro das Missões","lang":"pt"}
+data/BR/RS/São Pedro do Butiá={"id":"data/BR/RS/São Pedro do Butiá","key":"São Pedro do Butiá","lang":"pt"}
+data/BR/RS/São Pedro do Sul={"id":"data/BR/RS/São Pedro do Sul","key":"São Pedro do Sul","lang":"pt"}
+data/BR/RS/São Sebastião do Caí={"id":"data/BR/RS/São Sebastião do Caí","key":"São Sebastião do Caí","lang":"pt"}
+data/BR/RS/São Sepé={"id":"data/BR/RS/São Sepé","key":"São Sepé","lang":"pt"}
+data/BR/RS/São Valentim={"id":"data/BR/RS/São Valentim","key":"São Valentim","lang":"pt"}
+data/BR/RS/São Valentim do Sul={"id":"data/BR/RS/São Valentim do Sul","key":"São Valentim do Sul","lang":"pt"}
+data/BR/RS/São Valério do Sul={"id":"data/BR/RS/São Valério do Sul","key":"São Valério do Sul","lang":"pt"}
+data/BR/RS/São Vendelino={"id":"data/BR/RS/São Vendelino","key":"São Vendelino","lang":"pt"}
+data/BR/RS/São Vicente do Sul={"id":"data/BR/RS/São Vicente do Sul","key":"São Vicente do Sul","lang":"pt"}
+data/BR/RS/Sério={"id":"data/BR/RS/Sério","key":"Sério","lang":"pt"}
+data/BR/RS/Tabaí={"id":"data/BR/RS/Tabaí","key":"Tabaí","lang":"pt"}
+data/BR/RS/Tapejara={"id":"data/BR/RS/Tapejara","key":"Tapejara","lang":"pt"}
+data/BR/RS/Tapera={"id":"data/BR/RS/Tapera","key":"Tapera","lang":"pt"}
+data/BR/RS/Tapes={"id":"data/BR/RS/Tapes","key":"Tapes","lang":"pt"}
+data/BR/RS/Taquara={"id":"data/BR/RS/Taquara","key":"Taquara","lang":"pt"}
+data/BR/RS/Taquari={"id":"data/BR/RS/Taquari","key":"Taquari","lang":"pt"}
+data/BR/RS/Taquaruçu do Sul={"id":"data/BR/RS/Taquaruçu do Sul","key":"Taquaruçu do Sul","lang":"pt"}
+data/BR/RS/Tavares={"id":"data/BR/RS/Tavares","key":"Tavares","lang":"pt"}
+data/BR/RS/Tenente Portela={"id":"data/BR/RS/Tenente Portela","key":"Tenente Portela","lang":"pt"}
+data/BR/RS/Terra de Areia={"id":"data/BR/RS/Terra de Areia","key":"Terra de Areia","lang":"pt"}
+data/BR/RS/Teutônia={"id":"data/BR/RS/Teutônia","key":"Teutônia","lang":"pt"}
+data/BR/RS/Tio Hugo={"id":"data/BR/RS/Tio Hugo","key":"Tio Hugo","lang":"pt"}
+data/BR/RS/Tiradentes do Sul={"id":"data/BR/RS/Tiradentes do Sul","key":"Tiradentes do Sul","lang":"pt"}
+data/BR/RS/Toropi={"id":"data/BR/RS/Toropi","key":"Toropi","lang":"pt"}
+data/BR/RS/Torres={"id":"data/BR/RS/Torres","key":"Torres","lang":"pt"}
+data/BR/RS/Tramandaí={"id":"data/BR/RS/Tramandaí","key":"Tramandaí","lang":"pt"}
+data/BR/RS/Travesseiro={"id":"data/BR/RS/Travesseiro","key":"Travesseiro","lang":"pt"}
+data/BR/RS/Trindade do Sul={"id":"data/BR/RS/Trindade do Sul","key":"Trindade do Sul","lang":"pt"}
+data/BR/RS/Triunfo={"id":"data/BR/RS/Triunfo","key":"Triunfo","lang":"pt"}
+data/BR/RS/Três Arroios={"id":"data/BR/RS/Três Arroios","key":"Três Arroios","lang":"pt"}
+data/BR/RS/Três Cachoeiras={"id":"data/BR/RS/Três Cachoeiras","key":"Três Cachoeiras","lang":"pt"}
+data/BR/RS/Três Coroas={"id":"data/BR/RS/Três Coroas","key":"Três Coroas","lang":"pt"}
+data/BR/RS/Três Forquilhas={"id":"data/BR/RS/Três Forquilhas","key":"Três Forquilhas","lang":"pt"}
+data/BR/RS/Três Palmeiras={"id":"data/BR/RS/Três Palmeiras","key":"Três Palmeiras","lang":"pt"}
+data/BR/RS/Três Passos={"id":"data/BR/RS/Três Passos","key":"Três Passos","lang":"pt"}
+data/BR/RS/Três de Maio={"id":"data/BR/RS/Três de Maio","key":"Três de Maio","lang":"pt"}
+data/BR/RS/Tucunduva={"id":"data/BR/RS/Tucunduva","key":"Tucunduva","lang":"pt"}
+data/BR/RS/Tunas={"id":"data/BR/RS/Tunas","key":"Tunas","lang":"pt"}
+data/BR/RS/Tupanci do Sul={"id":"data/BR/RS/Tupanci do Sul","key":"Tupanci do Sul","lang":"pt"}
+data/BR/RS/Tupanciretã={"id":"data/BR/RS/Tupanciretã","key":"Tupanciretã","lang":"pt"}
+data/BR/RS/Tupandi={"id":"data/BR/RS/Tupandi","key":"Tupandi","lang":"pt"}
+data/BR/RS/Tuparendi={"id":"data/BR/RS/Tuparendi","key":"Tuparendi","lang":"pt"}
+data/BR/RS/Turuçu={"id":"data/BR/RS/Turuçu","key":"Turuçu","lang":"pt"}
+data/BR/RS/Ubiretama={"id":"data/BR/RS/Ubiretama","key":"Ubiretama","lang":"pt"}
+data/BR/RS/Unistalda={"id":"data/BR/RS/Unistalda","key":"Unistalda","lang":"pt"}
+data/BR/RS/União da Serra={"id":"data/BR/RS/União da Serra","key":"União da Serra","lang":"pt"}
+data/BR/RS/Uruguaiana={"id":"data/BR/RS/Uruguaiana","key":"Uruguaiana","lang":"pt"}
+data/BR/RS/Vacaria={"id":"data/BR/RS/Vacaria","key":"Vacaria","lang":"pt"}
+data/BR/RS/Vale Real={"id":"data/BR/RS/Vale Real","key":"Vale Real","lang":"pt"}
+data/BR/RS/Vale Verde={"id":"data/BR/RS/Vale Verde","key":"Vale Verde","lang":"pt"}
+data/BR/RS/Vale do Sol={"id":"data/BR/RS/Vale do Sol","key":"Vale do Sol","lang":"pt"}
+data/BR/RS/Vanini={"id":"data/BR/RS/Vanini","key":"Vanini","lang":"pt"}
+data/BR/RS/Venâncio Aires={"id":"data/BR/RS/Venâncio Aires","key":"Venâncio Aires","lang":"pt"}
+data/BR/RS/Vera Cruz={"id":"data/BR/RS/Vera Cruz","key":"Vera Cruz","lang":"pt"}
+data/BR/RS/Veranópolis={"id":"data/BR/RS/Veranópolis","key":"Veranópolis","lang":"pt"}
+data/BR/RS/Vespasiano Correa={"id":"data/BR/RS/Vespasiano Correa","key":"Vespasiano Correa","lang":"pt"}
+data/BR/RS/Viadutos={"id":"data/BR/RS/Viadutos","key":"Viadutos","lang":"pt"}
+data/BR/RS/Viamão={"id":"data/BR/RS/Viamão","key":"Viamão","lang":"pt"}
+data/BR/RS/Vicente Dutra={"id":"data/BR/RS/Vicente Dutra","key":"Vicente Dutra","lang":"pt"}
+data/BR/RS/Victor Graeff={"id":"data/BR/RS/Victor Graeff","key":"Victor Graeff","lang":"pt"}
+data/BR/RS/Vila Flores={"id":"data/BR/RS/Vila Flores","key":"Vila Flores","lang":"pt"}
+data/BR/RS/Vila Lângaro={"id":"data/BR/RS/Vila Lângaro","key":"Vila Lângaro","lang":"pt"}
+data/BR/RS/Vila Maria={"id":"data/BR/RS/Vila Maria","key":"Vila Maria","lang":"pt"}
+data/BR/RS/Vila Nova do Sul={"id":"data/BR/RS/Vila Nova do Sul","key":"Vila Nova do Sul","lang":"pt"}
+data/BR/RS/Vista Alegre={"id":"data/BR/RS/Vista Alegre","key":"Vista Alegre","lang":"pt"}
+data/BR/RS/Vista Alegre do Prata={"id":"data/BR/RS/Vista Alegre do Prata","key":"Vista Alegre do Prata","lang":"pt"}
+data/BR/RS/Vista Gaúcha={"id":"data/BR/RS/Vista Gaúcha","key":"Vista Gaúcha","lang":"pt"}
+data/BR/RS/Vitória das Missões={"id":"data/BR/RS/Vitória das Missões","key":"Vitória das Missões","lang":"pt"}
+data/BR/RS/Westfalia={"id":"data/BR/RS/Westfalia","key":"Westfalia","lang":"pt"}
+data/BR/RS/Xangri-lá={"id":"data/BR/RS/Xangri-lá","key":"Xangri-lá","lang":"pt"}
+data/BR/RS/Água Santa={"id":"data/BR/RS/Água Santa","key":"Água Santa","lang":"pt"}
+data/BR/SC={"id":"data/BR/SC","key":"SC","name":"Santa Catarina","lang":"pt","zip":"8[89]","zipex":"88000-000,89999-999","sub_keys":"Abdon Batista~Abelardo Luz~Agrolândia~Agronômica~Água Doce~Águas de Chapecó~Águas Frias~Águas Mornas~Alfredo Wagner~Alto Bela Vista~Anchieta~Angelina~Anita Garibaldi~Anitápolis~Antônio Carlos~Apiúna~Arabutã~Araquari~Araranguá~Armazém~Arroio Trinta~Arvoredo~Ascurra~Atalanta~Aurora~Balneário Arroio do Silva~Balneário Barra do Sul~Balneário Camboriú~Balneário Gaivota~Bandeirante~Barra Bonita~Barra Velha~Bela Vista do Toldo~Belmonte~Benedito Novo~Biguaçu~Blumenau~Bocaina do Sul~Bom Jardim da Serra~Bom Jesus~Bom Jesus do Oeste~Bom Retiro~Bombinhas~Botuverá~Braço do Norte~Braço do Trombudo~Brunópolis~Brusque~Caçador~Caibi~Calmon~Camboriú~Campo Alegre~Campo Belo do Sul~Campo Erê~Campos Novos~Canelinha~Canoinhas~Capão Alto~Capinzal~Capivari de Baixo~Catanduvas~Caxambu do Sul~Celso Ramos~Cerro Negro~Chapadão do Lageado~Chapecó~Cocal do Sul~Concórdia~Cordilheira Alta~Coronel Freitas~Coronel Martins~Correia Pinto~Corupá~Criciúma~Cunha Porã~Cunhataí~Curitibanos~Descanso~Dionísio Cerqueira~Dona Emma~Doutor Pedrinho~Entre Rios~Ermo~Erval Velho~Faxinal dos Guedes~Flor do Sertão~Florianópolis~Formosa do Sul~Forquilhinha~Fraiburgo~Frei Rogério~Galvão~Garopaba~Garuva~Gaspar~Governador Celso Ramos~Grão Pará~Gravatal~Guabiruba~Guaraciaba~Guaramirim~Guarujá do Sul~Guatambú~Herval d'Oeste~Ibiam~Ibicaré~Ibirama~Içara~Ilhota~Imaruí~Imbituba~Imbuia~Indaial~Iomerê~Ipirá~Iporã do Oeste~Ipuaçu~Ipumirim~Iraceminha~Irani~Irati~Irineópolis~Itá~Itaiópolis~Itajaí~Itapema~Itapiranga~Itapoá~Ituporanga~Jaborá~Jacinto Machado~Jaguaruna~Jaraguá do Sul~Jardinópolis~Joaçaba~Joinville~José Boiteux~Jupiá~Lacerdópolis~Lages~Laguna~Lajeado Grande~Laurentino~Lauro Muller~Lebon Régis~Leoberto Leal~Lindóia do Sul~Lontras~Luiz Alves~Luzerna~Macieira~Mafra~Major Gercino~Major Vieira~Maracajá~Maravilha~Marema~Massaranduba~Matos Costa~Meleiro~Mirim Doce~Modelo~Mondaí~Monte Carlo~Monte Castelo~Morro da Fumaça~Morro Grande~Navegantes~Nova Erechim~Nova Itaberaba~Nova Trento~Nova Veneza~Novo Horizonte~Orléans~Otacílio Costa~Ouro~Ouro Verde~Paial~Painel~Palhoça~Palma Sola~Palmeira~Palmitos~Papanduva~Paraiso~Passo de Torres~Passos Maia~Paulo Lopes~Pedras Grandes~Penha~Peritiba~Petrolândia~Piçarras~Pinhalzinho~Pinheiro Preto~Piratuba~Planalto Alegre~Pomerode~Ponte Alta~Ponte Alta do Norte~Ponte Serrada~Porto Belo~Porto União~Pouso Redondo~Presidente Castelo Branco~Presidente Getúlio~Presidente Nereu~Princesa~Quilombo~Rancho Queimado~Rio das Antas~Rio do Campo~Rio do Oeste~Rio do Sul~Rio dos Cedros~Rio Fortuna~Rio Negrinho~Rio Rufino~Riqueza~Rodeio~Romelândia~Salete~Saltinho~Salto Veloso~Sangão~Santa Cecília~Santa Helena~Santa Rosa de Lima~Santa Rosa do Sul~Santa Terezinha~Santa Terezinha do Progresso~Santiago do Sul~Santo Amaro da Imperatriz~São Bento do Sul~São Bernardino~São Bonifácio~São Carlos~São Cristóvão do Sul~São Domingos~São Francisco do Sul~São João Batista~São João do Itaperiú~São João do Oeste~São João do Sul~São Joaquim~São José~São José do Cedro~São José do Cerrito~São Lourenço d'Oeste~São Ludgero~São Martinho~São Miguel da Boa Vista~São Miguel do Oeste~São Pedro de Alcântara~Saudades~Schroeder~Seara~Serra Alta~Siderópolis~Sombrio~Sul Brasil~Taió~Tangara~Tigrinhos~Tijucas~Timbé do Sul~Timbo~Timbó Grande~Três Barras~Treviso~Treze de Maio~Treze Tílias~Trombudo Central~Tubarão~Tunápolis~Turvo~União do Oeste~Urubici~Urupema~Urussanga~Vargeão~Vargem~Vargem Bonita~Vidal Ramos~Videira~Vitor Meireles~Witmarsum~Xanxerê~Xavantina~Xaxim~Zortéa"}
+data/BR/SC/Abdon Batista={"id":"data/BR/SC/Abdon Batista","key":"Abdon Batista","lang":"pt"}
+data/BR/SC/Abelardo Luz={"id":"data/BR/SC/Abelardo Luz","key":"Abelardo Luz","lang":"pt"}
+data/BR/SC/Agrolândia={"id":"data/BR/SC/Agrolândia","key":"Agrolândia","lang":"pt"}
+data/BR/SC/Agronômica={"id":"data/BR/SC/Agronômica","key":"Agronômica","lang":"pt"}
+data/BR/SC/Alfredo Wagner={"id":"data/BR/SC/Alfredo Wagner","key":"Alfredo Wagner","lang":"pt"}
+data/BR/SC/Alto Bela Vista={"id":"data/BR/SC/Alto Bela Vista","key":"Alto Bela Vista","lang":"pt"}
+data/BR/SC/Anchieta={"id":"data/BR/SC/Anchieta","key":"Anchieta","lang":"pt"}
+data/BR/SC/Angelina={"id":"data/BR/SC/Angelina","key":"Angelina","lang":"pt"}
+data/BR/SC/Anita Garibaldi={"id":"data/BR/SC/Anita Garibaldi","key":"Anita Garibaldi","lang":"pt"}
+data/BR/SC/Anitápolis={"id":"data/BR/SC/Anitápolis","key":"Anitápolis","lang":"pt"}
+data/BR/SC/Antônio Carlos={"id":"data/BR/SC/Antônio Carlos","key":"Antônio Carlos","lang":"pt"}
+data/BR/SC/Apiúna={"id":"data/BR/SC/Apiúna","key":"Apiúna","lang":"pt"}
+data/BR/SC/Arabutã={"id":"data/BR/SC/Arabutã","key":"Arabutã","lang":"pt"}
+data/BR/SC/Araquari={"id":"data/BR/SC/Araquari","key":"Araquari","lang":"pt"}
+data/BR/SC/Araranguá={"id":"data/BR/SC/Araranguá","key":"Araranguá","lang":"pt"}
+data/BR/SC/Armazém={"id":"data/BR/SC/Armazém","key":"Armazém","lang":"pt"}
+data/BR/SC/Arroio Trinta={"id":"data/BR/SC/Arroio Trinta","key":"Arroio Trinta","lang":"pt"}
+data/BR/SC/Arvoredo={"id":"data/BR/SC/Arvoredo","key":"Arvoredo","lang":"pt"}
+data/BR/SC/Ascurra={"id":"data/BR/SC/Ascurra","key":"Ascurra","lang":"pt"}
+data/BR/SC/Atalanta={"id":"data/BR/SC/Atalanta","key":"Atalanta","lang":"pt"}
+data/BR/SC/Aurora={"id":"data/BR/SC/Aurora","key":"Aurora","lang":"pt"}
+data/BR/SC/Balneário Arroio do Silva={"id":"data/BR/SC/Balneário Arroio do Silva","key":"Balneário Arroio do Silva","lang":"pt"}
+data/BR/SC/Balneário Barra do Sul={"id":"data/BR/SC/Balneário Barra do Sul","key":"Balneário Barra do Sul","lang":"pt"}
+data/BR/SC/Balneário Camboriú={"id":"data/BR/SC/Balneário Camboriú","key":"Balneário Camboriú","lang":"pt"}
+data/BR/SC/Balneário Gaivota={"id":"data/BR/SC/Balneário Gaivota","key":"Balneário Gaivota","lang":"pt"}
+data/BR/SC/Bandeirante={"id":"data/BR/SC/Bandeirante","key":"Bandeirante","lang":"pt"}
+data/BR/SC/Barra Bonita={"id":"data/BR/SC/Barra Bonita","key":"Barra Bonita","lang":"pt"}
+data/BR/SC/Barra Velha={"id":"data/BR/SC/Barra Velha","key":"Barra Velha","lang":"pt"}
+data/BR/SC/Bela Vista do Toldo={"id":"data/BR/SC/Bela Vista do Toldo","key":"Bela Vista do Toldo","lang":"pt"}
+data/BR/SC/Belmonte={"id":"data/BR/SC/Belmonte","key":"Belmonte","lang":"pt"}
+data/BR/SC/Benedito Novo={"id":"data/BR/SC/Benedito Novo","key":"Benedito Novo","lang":"pt"}
+data/BR/SC/Biguaçu={"id":"data/BR/SC/Biguaçu","key":"Biguaçu","lang":"pt"}
+data/BR/SC/Blumenau={"id":"data/BR/SC/Blumenau","key":"Blumenau","lang":"pt"}
+data/BR/SC/Bocaina do Sul={"id":"data/BR/SC/Bocaina do Sul","key":"Bocaina do Sul","lang":"pt"}
+data/BR/SC/Bom Jardim da Serra={"id":"data/BR/SC/Bom Jardim da Serra","key":"Bom Jardim da Serra","lang":"pt"}
+data/BR/SC/Bom Jesus={"id":"data/BR/SC/Bom Jesus","key":"Bom Jesus","lang":"pt"}
+data/BR/SC/Bom Jesus do Oeste={"id":"data/BR/SC/Bom Jesus do Oeste","key":"Bom Jesus do Oeste","lang":"pt"}
+data/BR/SC/Bom Retiro={"id":"data/BR/SC/Bom Retiro","key":"Bom Retiro","lang":"pt"}
+data/BR/SC/Bombinhas={"id":"data/BR/SC/Bombinhas","key":"Bombinhas","lang":"pt"}
+data/BR/SC/Botuverá={"id":"data/BR/SC/Botuverá","key":"Botuverá","lang":"pt"}
+data/BR/SC/Braço do Norte={"id":"data/BR/SC/Braço do Norte","key":"Braço do Norte","lang":"pt"}
+data/BR/SC/Braço do Trombudo={"id":"data/BR/SC/Braço do Trombudo","key":"Braço do Trombudo","lang":"pt"}
+data/BR/SC/Brunópolis={"id":"data/BR/SC/Brunópolis","key":"Brunópolis","lang":"pt"}
+data/BR/SC/Brusque={"id":"data/BR/SC/Brusque","key":"Brusque","lang":"pt"}
+data/BR/SC/Caibi={"id":"data/BR/SC/Caibi","key":"Caibi","lang":"pt"}
+data/BR/SC/Calmon={"id":"data/BR/SC/Calmon","key":"Calmon","lang":"pt"}
+data/BR/SC/Camboriú={"id":"data/BR/SC/Camboriú","key":"Camboriú","lang":"pt"}
+data/BR/SC/Campo Alegre={"id":"data/BR/SC/Campo Alegre","key":"Campo Alegre","lang":"pt"}
+data/BR/SC/Campo Belo do Sul={"id":"data/BR/SC/Campo Belo do Sul","key":"Campo Belo do Sul","lang":"pt"}
+data/BR/SC/Campo Erê={"id":"data/BR/SC/Campo Erê","key":"Campo Erê","lang":"pt"}
+data/BR/SC/Campos Novos={"id":"data/BR/SC/Campos Novos","key":"Campos Novos","lang":"pt"}
+data/BR/SC/Canelinha={"id":"data/BR/SC/Canelinha","key":"Canelinha","lang":"pt"}
+data/BR/SC/Canoinhas={"id":"data/BR/SC/Canoinhas","key":"Canoinhas","lang":"pt"}
+data/BR/SC/Capinzal={"id":"data/BR/SC/Capinzal","key":"Capinzal","lang":"pt"}
+data/BR/SC/Capivari de Baixo={"id":"data/BR/SC/Capivari de Baixo","key":"Capivari de Baixo","lang":"pt"}
+data/BR/SC/Capão Alto={"id":"data/BR/SC/Capão Alto","key":"Capão Alto","lang":"pt"}
+data/BR/SC/Catanduvas={"id":"data/BR/SC/Catanduvas","key":"Catanduvas","lang":"pt"}
+data/BR/SC/Caxambu do Sul={"id":"data/BR/SC/Caxambu do Sul","key":"Caxambu do Sul","lang":"pt"}
+data/BR/SC/Caçador={"id":"data/BR/SC/Caçador","key":"Caçador","lang":"pt"}
+data/BR/SC/Celso Ramos={"id":"data/BR/SC/Celso Ramos","key":"Celso Ramos","lang":"pt"}
+data/BR/SC/Cerro Negro={"id":"data/BR/SC/Cerro Negro","key":"Cerro Negro","lang":"pt"}
+data/BR/SC/Chapadão do Lageado={"id":"data/BR/SC/Chapadão do Lageado","key":"Chapadão do Lageado","lang":"pt"}
+data/BR/SC/Chapecó={"id":"data/BR/SC/Chapecó","key":"Chapecó","lang":"pt"}
+data/BR/SC/Cocal do Sul={"id":"data/BR/SC/Cocal do Sul","key":"Cocal do Sul","lang":"pt"}
+data/BR/SC/Concórdia={"id":"data/BR/SC/Concórdia","key":"Concórdia","lang":"pt"}
+data/BR/SC/Cordilheira Alta={"id":"data/BR/SC/Cordilheira Alta","key":"Cordilheira Alta","lang":"pt"}
+data/BR/SC/Coronel Freitas={"id":"data/BR/SC/Coronel Freitas","key":"Coronel Freitas","lang":"pt"}
+data/BR/SC/Coronel Martins={"id":"data/BR/SC/Coronel Martins","key":"Coronel Martins","lang":"pt"}
+data/BR/SC/Correia Pinto={"id":"data/BR/SC/Correia Pinto","key":"Correia Pinto","lang":"pt"}
+data/BR/SC/Corupá={"id":"data/BR/SC/Corupá","key":"Corupá","lang":"pt"}
+data/BR/SC/Criciúma={"id":"data/BR/SC/Criciúma","key":"Criciúma","lang":"pt"}
+data/BR/SC/Cunha Porã={"id":"data/BR/SC/Cunha Porã","key":"Cunha Porã","lang":"pt"}
+data/BR/SC/Cunhataí={"id":"data/BR/SC/Cunhataí","key":"Cunhataí","lang":"pt"}
+data/BR/SC/Curitibanos={"id":"data/BR/SC/Curitibanos","key":"Curitibanos","lang":"pt"}
+data/BR/SC/Descanso={"id":"data/BR/SC/Descanso","key":"Descanso","lang":"pt"}
+data/BR/SC/Dionísio Cerqueira={"id":"data/BR/SC/Dionísio Cerqueira","key":"Dionísio Cerqueira","lang":"pt"}
+data/BR/SC/Dona Emma={"id":"data/BR/SC/Dona Emma","key":"Dona Emma","lang":"pt"}
+data/BR/SC/Doutor Pedrinho={"id":"data/BR/SC/Doutor Pedrinho","key":"Doutor Pedrinho","lang":"pt"}
+data/BR/SC/Entre Rios={"id":"data/BR/SC/Entre Rios","key":"Entre Rios","lang":"pt"}
+data/BR/SC/Ermo={"id":"data/BR/SC/Ermo","key":"Ermo","lang":"pt"}
+data/BR/SC/Erval Velho={"id":"data/BR/SC/Erval Velho","key":"Erval Velho","lang":"pt"}
+data/BR/SC/Faxinal dos Guedes={"id":"data/BR/SC/Faxinal dos Guedes","key":"Faxinal dos Guedes","lang":"pt"}
+data/BR/SC/Flor do Sertão={"id":"data/BR/SC/Flor do Sertão","key":"Flor do Sertão","lang":"pt"}
+data/BR/SC/Florianópolis={"id":"data/BR/SC/Florianópolis","key":"Florianópolis","lang":"pt"}
+data/BR/SC/Formosa do Sul={"id":"data/BR/SC/Formosa do Sul","key":"Formosa do Sul","lang":"pt"}
+data/BR/SC/Forquilhinha={"id":"data/BR/SC/Forquilhinha","key":"Forquilhinha","lang":"pt"}
+data/BR/SC/Fraiburgo={"id":"data/BR/SC/Fraiburgo","key":"Fraiburgo","lang":"pt"}
+data/BR/SC/Frei Rogério={"id":"data/BR/SC/Frei Rogério","key":"Frei Rogério","lang":"pt"}
+data/BR/SC/Galvão={"id":"data/BR/SC/Galvão","key":"Galvão","lang":"pt"}
+data/BR/SC/Garopaba={"id":"data/BR/SC/Garopaba","key":"Garopaba","lang":"pt"}
+data/BR/SC/Garuva={"id":"data/BR/SC/Garuva","key":"Garuva","lang":"pt"}
+data/BR/SC/Gaspar={"id":"data/BR/SC/Gaspar","key":"Gaspar","lang":"pt"}
+data/BR/SC/Governador Celso Ramos={"id":"data/BR/SC/Governador Celso Ramos","key":"Governador Celso Ramos","lang":"pt"}
+data/BR/SC/Gravatal={"id":"data/BR/SC/Gravatal","key":"Gravatal","lang":"pt"}
+data/BR/SC/Grão Pará={"id":"data/BR/SC/Grão Pará","key":"Grão Pará","lang":"pt"}
+data/BR/SC/Guabiruba={"id":"data/BR/SC/Guabiruba","key":"Guabiruba","lang":"pt"}
+data/BR/SC/Guaraciaba={"id":"data/BR/SC/Guaraciaba","key":"Guaraciaba","lang":"pt"}
+data/BR/SC/Guaramirim={"id":"data/BR/SC/Guaramirim","key":"Guaramirim","lang":"pt"}
+data/BR/SC/Guarujá do Sul={"id":"data/BR/SC/Guarujá do Sul","key":"Guarujá do Sul","lang":"pt"}
+data/BR/SC/Guatambú={"id":"data/BR/SC/Guatambú","key":"Guatambú","lang":"pt"}
+data/BR/SC/Herval d'Oeste={"id":"data/BR/SC/Herval d'Oeste","key":"Herval d'Oeste","lang":"pt"}
+data/BR/SC/Ibiam={"id":"data/BR/SC/Ibiam","key":"Ibiam","lang":"pt"}
+data/BR/SC/Ibicaré={"id":"data/BR/SC/Ibicaré","key":"Ibicaré","lang":"pt"}
+data/BR/SC/Ibirama={"id":"data/BR/SC/Ibirama","key":"Ibirama","lang":"pt"}
+data/BR/SC/Ilhota={"id":"data/BR/SC/Ilhota","key":"Ilhota","lang":"pt"}
+data/BR/SC/Imaruí={"id":"data/BR/SC/Imaruí","key":"Imaruí","lang":"pt"}
+data/BR/SC/Imbituba={"id":"data/BR/SC/Imbituba","key":"Imbituba","lang":"pt"}
+data/BR/SC/Imbuia={"id":"data/BR/SC/Imbuia","key":"Imbuia","lang":"pt"}
+data/BR/SC/Indaial={"id":"data/BR/SC/Indaial","key":"Indaial","lang":"pt"}
+data/BR/SC/Iomerê={"id":"data/BR/SC/Iomerê","key":"Iomerê","lang":"pt"}
+data/BR/SC/Ipirá={"id":"data/BR/SC/Ipirá","key":"Ipirá","lang":"pt"}
+data/BR/SC/Iporã do Oeste={"id":"data/BR/SC/Iporã do Oeste","key":"Iporã do Oeste","lang":"pt"}
+data/BR/SC/Ipuaçu={"id":"data/BR/SC/Ipuaçu","key":"Ipuaçu","lang":"pt"}
+data/BR/SC/Ipumirim={"id":"data/BR/SC/Ipumirim","key":"Ipumirim","lang":"pt"}
+data/BR/SC/Iraceminha={"id":"data/BR/SC/Iraceminha","key":"Iraceminha","lang":"pt"}
+data/BR/SC/Irani={"id":"data/BR/SC/Irani","key":"Irani","lang":"pt"}
+data/BR/SC/Irati={"id":"data/BR/SC/Irati","key":"Irati","lang":"pt"}
+data/BR/SC/Irineópolis={"id":"data/BR/SC/Irineópolis","key":"Irineópolis","lang":"pt"}
+data/BR/SC/Itaiópolis={"id":"data/BR/SC/Itaiópolis","key":"Itaiópolis","lang":"pt"}
+data/BR/SC/Itajaí={"id":"data/BR/SC/Itajaí","key":"Itajaí","lang":"pt"}
+data/BR/SC/Itapema={"id":"data/BR/SC/Itapema","key":"Itapema","lang":"pt"}
+data/BR/SC/Itapiranga={"id":"data/BR/SC/Itapiranga","key":"Itapiranga","lang":"pt"}
+data/BR/SC/Itapoá={"id":"data/BR/SC/Itapoá","key":"Itapoá","lang":"pt"}
+data/BR/SC/Ituporanga={"id":"data/BR/SC/Ituporanga","key":"Ituporanga","lang":"pt"}
+data/BR/SC/Itá={"id":"data/BR/SC/Itá","key":"Itá","lang":"pt"}
+data/BR/SC/Içara={"id":"data/BR/SC/Içara","key":"Içara","lang":"pt"}
+data/BR/SC/Jaborá={"id":"data/BR/SC/Jaborá","key":"Jaborá","lang":"pt"}
+data/BR/SC/Jacinto Machado={"id":"data/BR/SC/Jacinto Machado","key":"Jacinto Machado","lang":"pt"}
+data/BR/SC/Jaguaruna={"id":"data/BR/SC/Jaguaruna","key":"Jaguaruna","lang":"pt"}
+data/BR/SC/Jaraguá do Sul={"id":"data/BR/SC/Jaraguá do Sul","key":"Jaraguá do Sul","lang":"pt"}
+data/BR/SC/Jardinópolis={"id":"data/BR/SC/Jardinópolis","key":"Jardinópolis","lang":"pt"}
+data/BR/SC/Joaçaba={"id":"data/BR/SC/Joaçaba","key":"Joaçaba","lang":"pt"}
+data/BR/SC/Joinville={"id":"data/BR/SC/Joinville","key":"Joinville","lang":"pt"}
+data/BR/SC/José Boiteux={"id":"data/BR/SC/José Boiteux","key":"José Boiteux","lang":"pt"}
+data/BR/SC/Jupiá={"id":"data/BR/SC/Jupiá","key":"Jupiá","lang":"pt"}
+data/BR/SC/Lacerdópolis={"id":"data/BR/SC/Lacerdópolis","key":"Lacerdópolis","lang":"pt"}
+data/BR/SC/Lages={"id":"data/BR/SC/Lages","key":"Lages","lang":"pt"}
+data/BR/SC/Laguna={"id":"data/BR/SC/Laguna","key":"Laguna","lang":"pt"}
+data/BR/SC/Lajeado Grande={"id":"data/BR/SC/Lajeado Grande","key":"Lajeado Grande","lang":"pt"}
+data/BR/SC/Laurentino={"id":"data/BR/SC/Laurentino","key":"Laurentino","lang":"pt"}
+data/BR/SC/Lauro Muller={"id":"data/BR/SC/Lauro Muller","key":"Lauro Muller","lang":"pt"}
+data/BR/SC/Lebon Régis={"id":"data/BR/SC/Lebon Régis","key":"Lebon Régis","lang":"pt"}
+data/BR/SC/Leoberto Leal={"id":"data/BR/SC/Leoberto Leal","key":"Leoberto Leal","lang":"pt"}
+data/BR/SC/Lindóia do Sul={"id":"data/BR/SC/Lindóia do Sul","key":"Lindóia do Sul","lang":"pt"}
+data/BR/SC/Lontras={"id":"data/BR/SC/Lontras","key":"Lontras","lang":"pt"}
+data/BR/SC/Luiz Alves={"id":"data/BR/SC/Luiz Alves","key":"Luiz Alves","lang":"pt"}
+data/BR/SC/Luzerna={"id":"data/BR/SC/Luzerna","key":"Luzerna","lang":"pt"}
+data/BR/SC/Macieira={"id":"data/BR/SC/Macieira","key":"Macieira","lang":"pt"}
+data/BR/SC/Mafra={"id":"data/BR/SC/Mafra","key":"Mafra","lang":"pt"}
+data/BR/SC/Major Gercino={"id":"data/BR/SC/Major Gercino","key":"Major Gercino","lang":"pt"}
+data/BR/SC/Major Vieira={"id":"data/BR/SC/Major Vieira","key":"Major Vieira","lang":"pt"}
+data/BR/SC/Maracajá={"id":"data/BR/SC/Maracajá","key":"Maracajá","lang":"pt"}
+data/BR/SC/Maravilha={"id":"data/BR/SC/Maravilha","key":"Maravilha","lang":"pt"}
+data/BR/SC/Marema={"id":"data/BR/SC/Marema","key":"Marema","lang":"pt"}
+data/BR/SC/Massaranduba={"id":"data/BR/SC/Massaranduba","key":"Massaranduba","lang":"pt"}
+data/BR/SC/Matos Costa={"id":"data/BR/SC/Matos Costa","key":"Matos Costa","lang":"pt"}
+data/BR/SC/Meleiro={"id":"data/BR/SC/Meleiro","key":"Meleiro","lang":"pt"}
+data/BR/SC/Mirim Doce={"id":"data/BR/SC/Mirim Doce","key":"Mirim Doce","lang":"pt"}
+data/BR/SC/Modelo={"id":"data/BR/SC/Modelo","key":"Modelo","lang":"pt"}
+data/BR/SC/Mondaí={"id":"data/BR/SC/Mondaí","key":"Mondaí","lang":"pt"}
+data/BR/SC/Monte Carlo={"id":"data/BR/SC/Monte Carlo","key":"Monte Carlo","lang":"pt"}
+data/BR/SC/Monte Castelo={"id":"data/BR/SC/Monte Castelo","key":"Monte Castelo","lang":"pt"}
+data/BR/SC/Morro Grande={"id":"data/BR/SC/Morro Grande","key":"Morro Grande","lang":"pt"}
+data/BR/SC/Morro da Fumaça={"id":"data/BR/SC/Morro da Fumaça","key":"Morro da Fumaça","lang":"pt"}
+data/BR/SC/Navegantes={"id":"data/BR/SC/Navegantes","key":"Navegantes","lang":"pt"}
+data/BR/SC/Nova Erechim={"id":"data/BR/SC/Nova Erechim","key":"Nova Erechim","lang":"pt"}
+data/BR/SC/Nova Itaberaba={"id":"data/BR/SC/Nova Itaberaba","key":"Nova Itaberaba","lang":"pt"}
+data/BR/SC/Nova Trento={"id":"data/BR/SC/Nova Trento","key":"Nova Trento","lang":"pt"}
+data/BR/SC/Nova Veneza={"id":"data/BR/SC/Nova Veneza","key":"Nova Veneza","lang":"pt"}
+data/BR/SC/Novo Horizonte={"id":"data/BR/SC/Novo Horizonte","key":"Novo Horizonte","lang":"pt"}
+data/BR/SC/Orléans={"id":"data/BR/SC/Orléans","key":"Orléans","lang":"pt"}
+data/BR/SC/Otacílio Costa={"id":"data/BR/SC/Otacílio Costa","key":"Otacílio Costa","lang":"pt"}
+data/BR/SC/Ouro={"id":"data/BR/SC/Ouro","key":"Ouro","lang":"pt"}
+data/BR/SC/Ouro Verde={"id":"data/BR/SC/Ouro Verde","key":"Ouro Verde","lang":"pt"}
+data/BR/SC/Paial={"id":"data/BR/SC/Paial","key":"Paial","lang":"pt"}
+data/BR/SC/Painel={"id":"data/BR/SC/Painel","key":"Painel","lang":"pt"}
+data/BR/SC/Palhoça={"id":"data/BR/SC/Palhoça","key":"Palhoça","lang":"pt"}
+data/BR/SC/Palma Sola={"id":"data/BR/SC/Palma Sola","key":"Palma Sola","lang":"pt"}
+data/BR/SC/Palmeira={"id":"data/BR/SC/Palmeira","key":"Palmeira","lang":"pt"}
+data/BR/SC/Palmitos={"id":"data/BR/SC/Palmitos","key":"Palmitos","lang":"pt"}
+data/BR/SC/Papanduva={"id":"data/BR/SC/Papanduva","key":"Papanduva","lang":"pt"}
+data/BR/SC/Paraiso={"id":"data/BR/SC/Paraiso","key":"Paraiso","lang":"pt"}
+data/BR/SC/Passo de Torres={"id":"data/BR/SC/Passo de Torres","key":"Passo de Torres","lang":"pt"}
+data/BR/SC/Passos Maia={"id":"data/BR/SC/Passos Maia","key":"Passos Maia","lang":"pt"}
+data/BR/SC/Paulo Lopes={"id":"data/BR/SC/Paulo Lopes","key":"Paulo Lopes","lang":"pt"}
+data/BR/SC/Pedras Grandes={"id":"data/BR/SC/Pedras Grandes","key":"Pedras Grandes","lang":"pt"}
+data/BR/SC/Penha={"id":"data/BR/SC/Penha","key":"Penha","lang":"pt"}
+data/BR/SC/Peritiba={"id":"data/BR/SC/Peritiba","key":"Peritiba","lang":"pt"}
+data/BR/SC/Petrolândia={"id":"data/BR/SC/Petrolândia","key":"Petrolândia","lang":"pt"}
+data/BR/SC/Pinhalzinho={"id":"data/BR/SC/Pinhalzinho","key":"Pinhalzinho","lang":"pt"}
+data/BR/SC/Pinheiro Preto={"id":"data/BR/SC/Pinheiro Preto","key":"Pinheiro Preto","lang":"pt"}
+data/BR/SC/Piratuba={"id":"data/BR/SC/Piratuba","key":"Piratuba","lang":"pt"}
+data/BR/SC/Piçarras={"id":"data/BR/SC/Piçarras","key":"Piçarras","lang":"pt"}
+data/BR/SC/Planalto Alegre={"id":"data/BR/SC/Planalto Alegre","key":"Planalto Alegre","lang":"pt"}
+data/BR/SC/Pomerode={"id":"data/BR/SC/Pomerode","key":"Pomerode","lang":"pt"}
+data/BR/SC/Ponte Alta={"id":"data/BR/SC/Ponte Alta","key":"Ponte Alta","lang":"pt"}
+data/BR/SC/Ponte Alta do Norte={"id":"data/BR/SC/Ponte Alta do Norte","key":"Ponte Alta do Norte","lang":"pt"}
+data/BR/SC/Ponte Serrada={"id":"data/BR/SC/Ponte Serrada","key":"Ponte Serrada","lang":"pt"}
+data/BR/SC/Porto Belo={"id":"data/BR/SC/Porto Belo","key":"Porto Belo","lang":"pt"}
+data/BR/SC/Porto União={"id":"data/BR/SC/Porto União","key":"Porto União","lang":"pt"}
+data/BR/SC/Pouso Redondo={"id":"data/BR/SC/Pouso Redondo","key":"Pouso Redondo","lang":"pt"}
+data/BR/SC/Presidente Castelo Branco={"id":"data/BR/SC/Presidente Castelo Branco","key":"Presidente Castelo Branco","lang":"pt"}
+data/BR/SC/Presidente Getúlio={"id":"data/BR/SC/Presidente Getúlio","key":"Presidente Getúlio","lang":"pt"}
+data/BR/SC/Presidente Nereu={"id":"data/BR/SC/Presidente Nereu","key":"Presidente Nereu","lang":"pt"}
+data/BR/SC/Princesa={"id":"data/BR/SC/Princesa","key":"Princesa","lang":"pt"}
+data/BR/SC/Quilombo={"id":"data/BR/SC/Quilombo","key":"Quilombo","lang":"pt"}
+data/BR/SC/Rancho Queimado={"id":"data/BR/SC/Rancho Queimado","key":"Rancho Queimado","lang":"pt"}
+data/BR/SC/Rio Fortuna={"id":"data/BR/SC/Rio Fortuna","key":"Rio Fortuna","lang":"pt"}
+data/BR/SC/Rio Negrinho={"id":"data/BR/SC/Rio Negrinho","key":"Rio Negrinho","lang":"pt"}
+data/BR/SC/Rio Rufino={"id":"data/BR/SC/Rio Rufino","key":"Rio Rufino","lang":"pt"}
+data/BR/SC/Rio das Antas={"id":"data/BR/SC/Rio das Antas","key":"Rio das Antas","lang":"pt"}
+data/BR/SC/Rio do Campo={"id":"data/BR/SC/Rio do Campo","key":"Rio do Campo","lang":"pt"}
+data/BR/SC/Rio do Oeste={"id":"data/BR/SC/Rio do Oeste","key":"Rio do Oeste","lang":"pt"}
+data/BR/SC/Rio do Sul={"id":"data/BR/SC/Rio do Sul","key":"Rio do Sul","lang":"pt"}
+data/BR/SC/Rio dos Cedros={"id":"data/BR/SC/Rio dos Cedros","key":"Rio dos Cedros","lang":"pt"}
+data/BR/SC/Riqueza={"id":"data/BR/SC/Riqueza","key":"Riqueza","lang":"pt"}
+data/BR/SC/Rodeio={"id":"data/BR/SC/Rodeio","key":"Rodeio","lang":"pt"}
+data/BR/SC/Romelândia={"id":"data/BR/SC/Romelândia","key":"Romelândia","lang":"pt"}
+data/BR/SC/Salete={"id":"data/BR/SC/Salete","key":"Salete","lang":"pt"}
+data/BR/SC/Saltinho={"id":"data/BR/SC/Saltinho","key":"Saltinho","lang":"pt"}
+data/BR/SC/Salto Veloso={"id":"data/BR/SC/Salto Veloso","key":"Salto Veloso","lang":"pt"}
+data/BR/SC/Sangão={"id":"data/BR/SC/Sangão","key":"Sangão","lang":"pt"}
+data/BR/SC/Santa Cecília={"id":"data/BR/SC/Santa Cecília","key":"Santa Cecília","lang":"pt"}
+data/BR/SC/Santa Helena={"id":"data/BR/SC/Santa Helena","key":"Santa Helena","lang":"pt"}
+data/BR/SC/Santa Rosa de Lima={"id":"data/BR/SC/Santa Rosa de Lima","key":"Santa Rosa de Lima","lang":"pt"}
+data/BR/SC/Santa Rosa do Sul={"id":"data/BR/SC/Santa Rosa do Sul","key":"Santa Rosa do Sul","lang":"pt"}
+data/BR/SC/Santa Terezinha={"id":"data/BR/SC/Santa Terezinha","key":"Santa Terezinha","lang":"pt"}
+data/BR/SC/Santa Terezinha do Progresso={"id":"data/BR/SC/Santa Terezinha do Progresso","key":"Santa Terezinha do Progresso","lang":"pt"}
+data/BR/SC/Santiago do Sul={"id":"data/BR/SC/Santiago do Sul","key":"Santiago do Sul","lang":"pt"}
+data/BR/SC/Santo Amaro da Imperatriz={"id":"data/BR/SC/Santo Amaro da Imperatriz","key":"Santo Amaro da Imperatriz","lang":"pt"}
+data/BR/SC/Saudades={"id":"data/BR/SC/Saudades","key":"Saudades","lang":"pt"}
+data/BR/SC/Schroeder={"id":"data/BR/SC/Schroeder","key":"Schroeder","lang":"pt"}
+data/BR/SC/Seara={"id":"data/BR/SC/Seara","key":"Seara","lang":"pt"}
+data/BR/SC/Serra Alta={"id":"data/BR/SC/Serra Alta","key":"Serra Alta","lang":"pt"}
+data/BR/SC/Siderópolis={"id":"data/BR/SC/Siderópolis","key":"Siderópolis","lang":"pt"}
+data/BR/SC/Sombrio={"id":"data/BR/SC/Sombrio","key":"Sombrio","lang":"pt"}
+data/BR/SC/Sul Brasil={"id":"data/BR/SC/Sul Brasil","key":"Sul Brasil","lang":"pt"}
+data/BR/SC/São Bento do Sul={"id":"data/BR/SC/São Bento do Sul","key":"São Bento do Sul","lang":"pt"}
+data/BR/SC/São Bernardino={"id":"data/BR/SC/São Bernardino","key":"São Bernardino","lang":"pt"}
+data/BR/SC/São Bonifácio={"id":"data/BR/SC/São Bonifácio","key":"São Bonifácio","lang":"pt"}
+data/BR/SC/São Carlos={"id":"data/BR/SC/São Carlos","key":"São Carlos","lang":"pt"}
+data/BR/SC/São Cristóvão do Sul={"id":"data/BR/SC/São Cristóvão do Sul","key":"São Cristóvão do Sul","lang":"pt"}
+data/BR/SC/São Domingos={"id":"data/BR/SC/São Domingos","key":"São Domingos","lang":"pt"}
+data/BR/SC/São Francisco do Sul={"id":"data/BR/SC/São Francisco do Sul","key":"São Francisco do Sul","lang":"pt"}
+data/BR/SC/São Joaquim={"id":"data/BR/SC/São Joaquim","key":"São Joaquim","lang":"pt"}
+data/BR/SC/São José={"id":"data/BR/SC/São José","key":"São José","lang":"pt"}
+data/BR/SC/São José do Cedro={"id":"data/BR/SC/São José do Cedro","key":"São José do Cedro","lang":"pt"}
+data/BR/SC/São José do Cerrito={"id":"data/BR/SC/São José do Cerrito","key":"São José do Cerrito","lang":"pt"}
+data/BR/SC/São João Batista={"id":"data/BR/SC/São João Batista","key":"São João Batista","lang":"pt"}
+data/BR/SC/São João do Itaperiú={"id":"data/BR/SC/São João do Itaperiú","key":"São João do Itaperiú","lang":"pt"}
+data/BR/SC/São João do Oeste={"id":"data/BR/SC/São João do Oeste","key":"São João do Oeste","lang":"pt"}
+data/BR/SC/São João do Sul={"id":"data/BR/SC/São João do Sul","key":"São João do Sul","lang":"pt"}
+data/BR/SC/São Lourenço d'Oeste={"id":"data/BR/SC/São Lourenço d'Oeste","key":"São Lourenço d'Oeste","lang":"pt"}
+data/BR/SC/São Ludgero={"id":"data/BR/SC/São Ludgero","key":"São Ludgero","lang":"pt"}
+data/BR/SC/São Martinho={"id":"data/BR/SC/São Martinho","key":"São Martinho","lang":"pt"}
+data/BR/SC/São Miguel da Boa Vista={"id":"data/BR/SC/São Miguel da Boa Vista","key":"São Miguel da Boa Vista","lang":"pt"}
+data/BR/SC/São Miguel do Oeste={"id":"data/BR/SC/São Miguel do Oeste","key":"São Miguel do Oeste","lang":"pt"}
+data/BR/SC/São Pedro de Alcântara={"id":"data/BR/SC/São Pedro de Alcântara","key":"São Pedro de Alcântara","lang":"pt"}
+data/BR/SC/Taió={"id":"data/BR/SC/Taió","key":"Taió","lang":"pt"}
+data/BR/SC/Tangara={"id":"data/BR/SC/Tangara","key":"Tangara","lang":"pt"}
+data/BR/SC/Tigrinhos={"id":"data/BR/SC/Tigrinhos","key":"Tigrinhos","lang":"pt"}
+data/BR/SC/Tijucas={"id":"data/BR/SC/Tijucas","key":"Tijucas","lang":"pt"}
+data/BR/SC/Timbo={"id":"data/BR/SC/Timbo","key":"Timbo","lang":"pt"}
+data/BR/SC/Timbé do Sul={"id":"data/BR/SC/Timbé do Sul","key":"Timbé do Sul","lang":"pt"}
+data/BR/SC/Timbó Grande={"id":"data/BR/SC/Timbó Grande","key":"Timbó Grande","lang":"pt"}
+data/BR/SC/Treviso={"id":"data/BR/SC/Treviso","key":"Treviso","lang":"pt"}
+data/BR/SC/Treze Tílias={"id":"data/BR/SC/Treze Tílias","key":"Treze Tílias","lang":"pt"}
+data/BR/SC/Treze de Maio={"id":"data/BR/SC/Treze de Maio","key":"Treze de Maio","lang":"pt"}
+data/BR/SC/Trombudo Central={"id":"data/BR/SC/Trombudo Central","key":"Trombudo Central","lang":"pt"}
+data/BR/SC/Três Barras={"id":"data/BR/SC/Três Barras","key":"Três Barras","lang":"pt"}
+data/BR/SC/Tubarão={"id":"data/BR/SC/Tubarão","key":"Tubarão","lang":"pt"}
+data/BR/SC/Tunápolis={"id":"data/BR/SC/Tunápolis","key":"Tunápolis","lang":"pt"}
+data/BR/SC/Turvo={"id":"data/BR/SC/Turvo","key":"Turvo","lang":"pt"}
+data/BR/SC/União do Oeste={"id":"data/BR/SC/União do Oeste","key":"União do Oeste","lang":"pt"}
+data/BR/SC/Urubici={"id":"data/BR/SC/Urubici","key":"Urubici","lang":"pt"}
+data/BR/SC/Urupema={"id":"data/BR/SC/Urupema","key":"Urupema","lang":"pt"}
+data/BR/SC/Urussanga={"id":"data/BR/SC/Urussanga","key":"Urussanga","lang":"pt"}
+data/BR/SC/Vargem={"id":"data/BR/SC/Vargem","key":"Vargem","lang":"pt"}
+data/BR/SC/Vargem Bonita={"id":"data/BR/SC/Vargem Bonita","key":"Vargem Bonita","lang":"pt"}
+data/BR/SC/Vargeão={"id":"data/BR/SC/Vargeão","key":"Vargeão","lang":"pt"}
+data/BR/SC/Vidal Ramos={"id":"data/BR/SC/Vidal Ramos","key":"Vidal Ramos","lang":"pt"}
+data/BR/SC/Videira={"id":"data/BR/SC/Videira","key":"Videira","lang":"pt"}
+data/BR/SC/Vitor Meireles={"id":"data/BR/SC/Vitor Meireles","key":"Vitor Meireles","lang":"pt"}
+data/BR/SC/Witmarsum={"id":"data/BR/SC/Witmarsum","key":"Witmarsum","lang":"pt"}
+data/BR/SC/Xanxerê={"id":"data/BR/SC/Xanxerê","key":"Xanxerê","lang":"pt"}
+data/BR/SC/Xavantina={"id":"data/BR/SC/Xavantina","key":"Xavantina","lang":"pt"}
+data/BR/SC/Xaxim={"id":"data/BR/SC/Xaxim","key":"Xaxim","lang":"pt"}
+data/BR/SC/Zortéa={"id":"data/BR/SC/Zortéa","key":"Zortéa","lang":"pt"}
+data/BR/SC/Água Doce={"id":"data/BR/SC/Água Doce","key":"Água Doce","lang":"pt"}
+data/BR/SC/Águas Frias={"id":"data/BR/SC/Águas Frias","key":"Águas Frias","lang":"pt"}
+data/BR/SC/Águas Mornas={"id":"data/BR/SC/Águas Mornas","key":"Águas Mornas","lang":"pt"}
+data/BR/SC/Águas de Chapecó={"id":"data/BR/SC/Águas de Chapecó","key":"Águas de Chapecó","lang":"pt"}
+data/BR/SE={"id":"data/BR/SE","key":"SE","name":"Sergipe","lang":"pt","zip":"49","zipex":"49000-000,49999-999","sub_keys":"Amparo de São Francisco~Aquidabã~Aracaju~Arauá~Areia Branca~Barra dos Coqueiros~Boquim~Brejo Grande~Campo do Brito~Canhoba~Canindé de São Francisco~Capela~Carira~Carmópolis~Cedro de São João~Cristinápolis~Cumbe~Divina Pastora~Estancia~Feira Nova~Frei Paulo~Gararu~General Maynard~Gracho Cardoso~Ilha das Flores~Indiaroba~Itabaiana~Itabaianinha~Itabi~Itaporanga d'Ajuda~Japaratuba~Japoatã~Lagarto~Laranjeiras~Macambira~Malhada dos Bois~Malhador~Maruim~Moita Bonita~Monte Alegre de Sergipe~Muribeca~Neópolis~Nossa Senhora Aparecida~Nossa Senhora da Glória~Nossa Senhora das Dores~Nossa Senhora de Lourdes~Nossa Senhora do Socorro~Pacatuba~Pedra Mole~Pedrinhas~Pinhão~Pirambu~Poço Redondo~Poço Verde~Porto da Folha~Propriá~Riachão do Dantas~Riachuelo~Ribeirópolis~Rosário do Catete~Salgado~Santa Luzia do Itanhy~Santa Rosa de Lima~Santana do São Francisco~Santo Amaro das Brotas~São Cristóvão~São Domingos~São Francisco~São Miguel do Aleixo~Simão Dias~Siriri~Telha~Tobias Barreto~Tomar do Geru~Umbaúba"}
+data/BR/SE/Amparo de São Francisco={"id":"data/BR/SE/Amparo de São Francisco","key":"Amparo de São Francisco","lang":"pt"}
+data/BR/SE/Aquidabã={"id":"data/BR/SE/Aquidabã","key":"Aquidabã","lang":"pt"}
+data/BR/SE/Aracaju={"id":"data/BR/SE/Aracaju","key":"Aracaju","lang":"pt"}
+data/BR/SE/Arauá={"id":"data/BR/SE/Arauá","key":"Arauá","lang":"pt"}
+data/BR/SE/Areia Branca={"id":"data/BR/SE/Areia Branca","key":"Areia Branca","lang":"pt"}
+data/BR/SE/Barra dos Coqueiros={"id":"data/BR/SE/Barra dos Coqueiros","key":"Barra dos Coqueiros","lang":"pt"}
+data/BR/SE/Boquim={"id":"data/BR/SE/Boquim","key":"Boquim","lang":"pt"}
+data/BR/SE/Brejo Grande={"id":"data/BR/SE/Brejo Grande","key":"Brejo Grande","lang":"pt"}
+data/BR/SE/Campo do Brito={"id":"data/BR/SE/Campo do Brito","key":"Campo do Brito","lang":"pt"}
+data/BR/SE/Canhoba={"id":"data/BR/SE/Canhoba","key":"Canhoba","lang":"pt"}
+data/BR/SE/Canindé de São Francisco={"id":"data/BR/SE/Canindé de São Francisco","key":"Canindé de São Francisco","lang":"pt"}
+data/BR/SE/Capela={"id":"data/BR/SE/Capela","key":"Capela","lang":"pt"}
+data/BR/SE/Carira={"id":"data/BR/SE/Carira","key":"Carira","lang":"pt"}
+data/BR/SE/Carmópolis={"id":"data/BR/SE/Carmópolis","key":"Carmópolis","lang":"pt"}
+data/BR/SE/Cedro de São João={"id":"data/BR/SE/Cedro de São João","key":"Cedro de São João","lang":"pt"}
+data/BR/SE/Cristinápolis={"id":"data/BR/SE/Cristinápolis","key":"Cristinápolis","lang":"pt"}
+data/BR/SE/Cumbe={"id":"data/BR/SE/Cumbe","key":"Cumbe","lang":"pt"}
+data/BR/SE/Divina Pastora={"id":"data/BR/SE/Divina Pastora","key":"Divina Pastora","lang":"pt"}
+data/BR/SE/Estancia={"id":"data/BR/SE/Estancia","key":"Estancia","lang":"pt"}
+data/BR/SE/Feira Nova={"id":"data/BR/SE/Feira Nova","key":"Feira Nova","lang":"pt"}
+data/BR/SE/Frei Paulo={"id":"data/BR/SE/Frei Paulo","key":"Frei Paulo","lang":"pt"}
+data/BR/SE/Gararu={"id":"data/BR/SE/Gararu","key":"Gararu","lang":"pt"}
+data/BR/SE/General Maynard={"id":"data/BR/SE/General Maynard","key":"General Maynard","lang":"pt"}
+data/BR/SE/Gracho Cardoso={"id":"data/BR/SE/Gracho Cardoso","key":"Gracho Cardoso","lang":"pt"}
+data/BR/SE/Ilha das Flores={"id":"data/BR/SE/Ilha das Flores","key":"Ilha das Flores","lang":"pt"}
+data/BR/SE/Indiaroba={"id":"data/BR/SE/Indiaroba","key":"Indiaroba","lang":"pt"}
+data/BR/SE/Itabaiana={"id":"data/BR/SE/Itabaiana","key":"Itabaiana","lang":"pt"}
+data/BR/SE/Itabaianinha={"id":"data/BR/SE/Itabaianinha","key":"Itabaianinha","lang":"pt"}
+data/BR/SE/Itabi={"id":"data/BR/SE/Itabi","key":"Itabi","lang":"pt"}
+data/BR/SE/Itaporanga d'Ajuda={"id":"data/BR/SE/Itaporanga d'Ajuda","key":"Itaporanga d'Ajuda","lang":"pt"}
+data/BR/SE/Japaratuba={"id":"data/BR/SE/Japaratuba","key":"Japaratuba","lang":"pt"}
+data/BR/SE/Japoatã={"id":"data/BR/SE/Japoatã","key":"Japoatã","lang":"pt"}
+data/BR/SE/Lagarto={"id":"data/BR/SE/Lagarto","key":"Lagarto","lang":"pt"}
+data/BR/SE/Laranjeiras={"id":"data/BR/SE/Laranjeiras","key":"Laranjeiras","lang":"pt"}
+data/BR/SE/Macambira={"id":"data/BR/SE/Macambira","key":"Macambira","lang":"pt"}
+data/BR/SE/Malhada dos Bois={"id":"data/BR/SE/Malhada dos Bois","key":"Malhada dos Bois","lang":"pt"}
+data/BR/SE/Malhador={"id":"data/BR/SE/Malhador","key":"Malhador","lang":"pt"}
+data/BR/SE/Maruim={"id":"data/BR/SE/Maruim","key":"Maruim","lang":"pt"}
+data/BR/SE/Moita Bonita={"id":"data/BR/SE/Moita Bonita","key":"Moita Bonita","lang":"pt"}
+data/BR/SE/Monte Alegre de Sergipe={"id":"data/BR/SE/Monte Alegre de Sergipe","key":"Monte Alegre de Sergipe","lang":"pt"}
+data/BR/SE/Muribeca={"id":"data/BR/SE/Muribeca","key":"Muribeca","lang":"pt"}
+data/BR/SE/Neópolis={"id":"data/BR/SE/Neópolis","key":"Neópolis","lang":"pt"}
+data/BR/SE/Nossa Senhora Aparecida={"id":"data/BR/SE/Nossa Senhora Aparecida","key":"Nossa Senhora Aparecida","lang":"pt"}
+data/BR/SE/Nossa Senhora da Glória={"id":"data/BR/SE/Nossa Senhora da Glória","key":"Nossa Senhora da Glória","lang":"pt"}
+data/BR/SE/Nossa Senhora das Dores={"id":"data/BR/SE/Nossa Senhora das Dores","key":"Nossa Senhora das Dores","lang":"pt"}
+data/BR/SE/Nossa Senhora de Lourdes={"id":"data/BR/SE/Nossa Senhora de Lourdes","key":"Nossa Senhora de Lourdes","lang":"pt"}
+data/BR/SE/Nossa Senhora do Socorro={"id":"data/BR/SE/Nossa Senhora do Socorro","key":"Nossa Senhora do Socorro","lang":"pt"}
+data/BR/SE/Pacatuba={"id":"data/BR/SE/Pacatuba","key":"Pacatuba","lang":"pt"}
+data/BR/SE/Pedra Mole={"id":"data/BR/SE/Pedra Mole","key":"Pedra Mole","lang":"pt"}
+data/BR/SE/Pedrinhas={"id":"data/BR/SE/Pedrinhas","key":"Pedrinhas","lang":"pt"}
+data/BR/SE/Pinhão={"id":"data/BR/SE/Pinhão","key":"Pinhão","lang":"pt"}
+data/BR/SE/Pirambu={"id":"data/BR/SE/Pirambu","key":"Pirambu","lang":"pt"}
+data/BR/SE/Porto da Folha={"id":"data/BR/SE/Porto da Folha","key":"Porto da Folha","lang":"pt"}
+data/BR/SE/Poço Redondo={"id":"data/BR/SE/Poço Redondo","key":"Poço Redondo","lang":"pt"}
+data/BR/SE/Poço Verde={"id":"data/BR/SE/Poço Verde","key":"Poço Verde","lang":"pt"}
+data/BR/SE/Propriá={"id":"data/BR/SE/Propriá","key":"Propriá","lang":"pt"}
+data/BR/SE/Riachuelo={"id":"data/BR/SE/Riachuelo","key":"Riachuelo","lang":"pt"}
+data/BR/SE/Riachão do Dantas={"id":"data/BR/SE/Riachão do Dantas","key":"Riachão do Dantas","lang":"pt"}
+data/BR/SE/Ribeirópolis={"id":"data/BR/SE/Ribeirópolis","key":"Ribeirópolis","lang":"pt"}
+data/BR/SE/Rosário do Catete={"id":"data/BR/SE/Rosário do Catete","key":"Rosário do Catete","lang":"pt"}
+data/BR/SE/Salgado={"id":"data/BR/SE/Salgado","key":"Salgado","lang":"pt"}
+data/BR/SE/Santa Luzia do Itanhy={"id":"data/BR/SE/Santa Luzia do Itanhy","key":"Santa Luzia do Itanhy","lang":"pt"}
+data/BR/SE/Santa Rosa de Lima={"id":"data/BR/SE/Santa Rosa de Lima","key":"Santa Rosa de Lima","lang":"pt"}
+data/BR/SE/Santana do São Francisco={"id":"data/BR/SE/Santana do São Francisco","key":"Santana do São Francisco","lang":"pt"}
+data/BR/SE/Santo Amaro das Brotas={"id":"data/BR/SE/Santo Amaro das Brotas","key":"Santo Amaro das Brotas","lang":"pt"}
+data/BR/SE/Simão Dias={"id":"data/BR/SE/Simão Dias","key":"Simão Dias","lang":"pt"}
+data/BR/SE/Siriri={"id":"data/BR/SE/Siriri","key":"Siriri","lang":"pt"}
+data/BR/SE/São Cristóvão={"id":"data/BR/SE/São Cristóvão","key":"São Cristóvão","lang":"pt"}
+data/BR/SE/São Domingos={"id":"data/BR/SE/São Domingos","key":"São Domingos","lang":"pt"}
+data/BR/SE/São Francisco={"id":"data/BR/SE/São Francisco","key":"São Francisco","lang":"pt"}
+data/BR/SE/São Miguel do Aleixo={"id":"data/BR/SE/São Miguel do Aleixo","key":"São Miguel do Aleixo","lang":"pt"}
+data/BR/SE/Telha={"id":"data/BR/SE/Telha","key":"Telha","lang":"pt"}
+data/BR/SE/Tobias Barreto={"id":"data/BR/SE/Tobias Barreto","key":"Tobias Barreto","lang":"pt"}
+data/BR/SE/Tomar do Geru={"id":"data/BR/SE/Tomar do Geru","key":"Tomar do Geru","lang":"pt"}
+data/BR/SE/Umbaúba={"id":"data/BR/SE/Umbaúba","key":"Umbaúba","lang":"pt"}
+data/BR/SP={"id":"data/BR/SP","key":"SP","name":"São Paulo","lang":"pt","zip":"[01][1-9]","zipex":"01000-000,09999-999:11000-000,19999-999","sub_keys":"Adamantina~Adolfo~Aguaí~Águas da Prata~Águas de Lindóia~Águas de Santa Bárbara~Águas de São Pedro~Agudos~Alambari~Alfredo Marcondes~Altair~Altinópolis~Alto Alegre~Alumínio~Álvares Florence~Álvares Machado~Álvaro de Carvalho~Alvinlândia~Americana~Américo Brasiliense~Américo de Campos~Amparo~Analândia~Andradina~Angatuba~Anhembi~Anhumas~Aparecida~Aparecida d'Oeste~Apiaí~Araçariguama~Araçatuba~Araçoiaba da Serra~Aramina~Arandu~Arapeí~Araraquara~Araras~Arco-Íris~Arealva~Areias~Areiópolis~Ariranha~Artur Nogueira~Arujá~Aspásia~Assis~Atibaia~Auriflama~Avaí~Avanhandava~Avaré~Bady Bassitt~Balbinos~Bálsamo~Bananal~Barão de Antonina~Barbosa~Bariri~Barra Bonita~Barra do Chapéu~Barra do Turvo~Barretos~Barrinha~Barueri~Bastos~Batatais~Bauru~Bebedouro~Bento de Abreu~Bernardino de Campos~Bertioga~Bilac~Birigüi~Biritiba-Mirim~Boa Esperança do Sul~Bocaina~Bofete~Boituva~Bom Jesus dos Perdões~Bom Sucesso de Itararé~Borá~Boracéia~Borborema~Borebi~Botucatu~Bragança Paulista~Braúna~Brejo Alegre~Brodowski~Brotas~Buri~Buritama~Buritizal~Cabrália Paulista~Cabreúva~Caçapava~Cachoeira Paulista~Caconde~Cafelândia~Caiabu~Caieiras~Caiuá~Cajamar~Cajati~Cajobi~Cajuru~Campina do Monte Alegre~Campinas~Campo Limpo Paulista~Campos do Jordão~Campos Novos Paulista~Cananéia~Canas~Cândido Mota~Cândido Rodrigues~Canitar~Capão Bonito~Capela do Alto~Capivari~Caraguatatuba~Carapicuíba~Cardoso~Casa Branca~Cássia dos Coqueiros~Castilho~Catanduva~Catiguá~Cedral~Cerqueira César~Cerquilho~Cesário Lange~Charqueada~Chavantes~Clementina~Colina~Colombia~Conchal~Conchas~Cordeirópolis~Coroados~Coronel Macedo~Corumbataí~Cosmopolis~Cosmorama~Cotia~Cravinhos~Cristais Paulista~Cruzália~Cruzeiro~Cubatão~Cunha~Descalvado~Diadema~Dirce Reis~Divinolândia~Dobrada~Dois Córregos~Dolcinópolis~Dourado~Dracena~Duartina~Dumont~Echaporã~Eldorado~Elias Fausto~Elisiário~Embaúba~Embu~Embu-Guaçu~Emilianópolis~Engenheiro Coelho~Espírito Santo do Pinhal~Espírito Santo do Turvo~Estiva Gerbi~Estrela d'Oeste~Estrela do Norte~Euclides da Cunha Paulista~Fartura~Fernando Prestes~Fernandópolis~Fernão~Ferraz de Vasconcelos~Flora Rica~Floréal~Flórida Paulista~Florínia~Franca~Francisco Morato~Franco da Rocha~Gabriel Monteiro~Gália~Garça~Gastão Vidigal~Gavião Peixoto~General Salgado~Getulina~Glicério~Guaiçara~Guaimbê~Guaíra~Guapiaçu~Guapiara~Guará~Guaraçaí~Guaraci~Guarani d'Oeste~Guarantã~Guararapes~Guararema~Guaratinguetá~Guareí~Guariba~Guarujá~Guarulhos~Guatapará~Guzolândia~Herculândia~Holambra~Hortolândia~Iacanga~Iacri~Iaras~Ibaté~Ibirá~Ibirarema~Ibitinga~Ibiúna~Icém~Iepê~Igaraçu do Tietê~Igarapava~Igaratá~Iguape~Ilha Comprida~Ilha Solteira~Ilhabela~Indaiatuba~Indiana~Indiaporã~Inúbia Paulista~Ipaussu~Iperó~Ipeúna~Ipiguá~Iporanga~Ipuã~Iracemápolis~Irapuã~Irapuru~Itaberá~Itaí~Itajobi~Itaju~Itanhaém~Itaóca~Itapecerica da Serra~Itapetininga~Itapeva~Itapevi~Itapira~Itapirapuã Paulista~Itápolis~Itaporanga~Itapuí~Itapura~Itaquaquecetuba~Itararé~Itariri~Itatiba~Itatinga~Itirapina~Itirapuã~Itobi~Itu~Itupeva~Ituverava~Jaborandi~Jaboticabal~Jacareí~Jaci~Jacupiranga~Jaguariúna~Jales~Jambeiro~Jandira~Jardinópolis~Jarinu~Jaú~Jeriquara~Joanópolis~João Ramalho~José Bonifácio~Júlio Mesquita~Jumirim~Jundiaí~Junqueirópolis~Juquiá~Juquitiba~Lagoinha~Laranjal Paulista~Lavínia~Lavrinhas~Leme~Lençóis Paulista~Limeira~Lindóia~Lins~Lorena~Lourdes~Louveira~Lucélia~Lucianópolis~Luís Antônio~Luiziânia~Lupércio~Lutécia~Macatuba~Macaubal~Macedônia~Magda~Mairinque~Mairiporã~Manduri~Marabá Paulista~Maracaí~Marapoama~Mariápolis~Marília~Marinópolis~Martinópolis~Matão~Mauá~Mendonça~Meridiano~Mesópolis~Miguelópolis~Mineiros do Tietê~Mira Estrela~Miracatu~Mirandópolis~Mirante do Paranapanema~Mirassol~Mirassolândia~Mococa~Mogi das Cruzes~Mogi Guaçu~Moji-Mirim~Mombuca~Monções~Mongaguá~Monte Alegre do Sul~Monte Alto~Monte Aprazível~Monte Azul Paulista~Monte Castelo~Monte Mor~Monteiro Lobato~Morro Agudo~Morungaba~Motuca~Murutinga do Sul~Nantes~Narandiba~Natividade da Serra~Nazaré Paulista~Neves Paulista~Nhandeara~Nipoã~Nova Aliança~Nova Campina~Nova Canaã Paulista~Nova Castilho~Nova Europa~Nova Granada~Nova Guataporanga~Nova Independência~Nova Luzitânia~Nova Odessa~Novais~Novo Horizonte~Nuporanga~Ocauçu~Oleo~Olímpia~Onda Verde~Oriente~Orindiúva~Orlândia~Osasco~Oscar Bressane~Osvaldo Cruz~Ourinhos~Ouro Verde~Ouroeste~Pacaembu~Palestina~Palmares Paulista~Palmeira d'Oeste~Palmital~Panorama~Paraguaçu Paulista~Paraibuna~Paraiso~Paranapanema~Paranapuã~Parapuã~Pardinho~Pariquera-Açu~Parisi~Patrocínio Paulista~Paulicéia~Paulínia~Paulistânia~Paulo de Faria~Pederneiras~Pedra Bela~Pedranópolis~Pedregulho~Pedreira~Pedrinhas Paulista~Pedro de Toledo~Penápolis~Pereira Barreto~Pereiras~Peruíbe~Piacatu~Piedade~Pilar do Sul~Pindamonhangaba~Pindorama~Pinhalzinho~Piquerobi~Piquete~Piracaia~Piracicaba~Piraju~Pirajuí~Pirangi~Pirapora do Bom Jesus~Pirapozinho~Pirassununga~Piratininga~Pitangueiras~Planalto~Platina~Poa~Poloni~Pompéia~Pongaí~Pontal~Pontalinda~Pontes Gestal~Populina~Porangaba~Porto Feliz~Porto Ferreira~Potim~Potirendaba~Pracinha~Pradópolis~Praia Grande~Pratânia~Presidente Alves~Presidente Bernardes~Presidente Epitácio~Presidente Prudente~Presidente Venceslau~Promissão~Quadra~Quatá~Queiroz~Queluz~Quintana~Rafard~Rancharia~Redenção da Serra~Regente Feijó~Reginópolis~Registro~Restinga~Ribeira~Ribeirão Bonito~Ribeirão Branco~Ribeirão Corrente~Ribeirão do Sul~Ribeirão dos Índios~Ribeirão Grande~Ribeirão Pires~Ribeirão Preto~Rifaina~Rincão~Rinópolis~Rio Claro~Rio das Pedras~Rio Grande da Serra~Riolândia~Riversul~Rosana~Roseira~Rubiácea~Rubinéia~Sabino~Sagres~Sales~Sales Oliveira~Salesópolis~Salmourão~Saltinho~Salto~Salto de Pirapora~Salto Grande~Sandovalina~Santa Adélia~Santa Albertina~Santa Bárbara d'Oeste~Santa Branca~Santa Clara d'Oeste~Santa Cruz da Conceição~Santa Cruz da Esperança~Santa Cruz das Palmeiras~Santa Cruz do Rio Pardo~Santa Ernestina~Santa Fé do Sul~Santa Gertrudes~Santa Isabel~Santa Lucia~Santa Maria da Serra~Santa Mercedes~Santa Rita d'Oeste~Santa Rita do Passa Quatro~Santa Rosa de Viterbo~Santa Salete~Santana da Ponte Pensa~Santana de Parnaíba~Santo Anastácio~Santo André~Santo Antônio da Alegria~Santo Antônio de Posse~Santo Antônio do Aracanguá~Santo Antônio do Jardim~Santo Antônio do Pinhal~Santo Expedito~Santópolis do Aguapeí~Santos~São Bento do Sapucaí~São Bernardo do Campo~São Caetano do Sul~São Carlos~São Francisco~São João da Boa Vista~São João das Duas Pontes~São João de Iracema~São João do Pau d'Alho~São Joaquim da Barra~São José da Bela Vista~São José do Barreiro~São José do Rio Pardo~São José do Rio Preto~São José dos Campos~São Lourenço da Serra~São Luíz do Paraitinga~São Manuel~São Miguel Arcanjo~São Paulo~São Pedro~São Pedro do Turvo~São Roque~São Sebastião~São Sebastião da Grama~São Simão~São Vicente~Sarapuí~Sarutaiá~Sebastianópolis do Sul~Serra Azul~Serra Negra~Serrana~Sertãozinho~Sete Barras~Severínia~Silveiras~Socorro~Sorocaba~Sud Mennucci~Sumaré~Suzanápolis~Suzano~Tabapuã~Tabatinga~Taboão da Serra~Taciba~Taguaí~Taiaçu~Taiúva~Tambaú~Tanabi~Tapiraí~Tapiratiba~Taquaral~Taquaritinga~Taquarituba~Taquarivaí~Tarabai~Tarumã~Tatuí~Taubaté~Tejupá~Teodoro Sampaio~Terra Roxa~Tietê~Timburi~Torre de Pedra~Torrinha~Trabiju~Tremembé~Três Fronteiras~Tuiuti~Tupã~Tupi Paulista~Turiúba~Turmalina~Ubarana~Ubatuba~Ubirajara~Uchoa~União Paulista~Urânia~Uru~Urupês~Valentim Gentil~Valinhos~Valparaíso~Vargem~Vargem Grande do Sul~Vargem Grande Paulista~Várzea Paulista~Vera Cruz~Vinhedo~Viradouro~Vista Alegre do Alto~Vitória Brasil~Votorantim~Votuporanga~Zacarias"}
+data/BR/SP/Adamantina={"id":"data/BR/SP/Adamantina","key":"Adamantina","lang":"pt"}
+data/BR/SP/Adolfo={"id":"data/BR/SP/Adolfo","key":"Adolfo","lang":"pt"}
+data/BR/SP/Aguaí={"id":"data/BR/SP/Aguaí","key":"Aguaí","lang":"pt"}
+data/BR/SP/Agudos={"id":"data/BR/SP/Agudos","key":"Agudos","lang":"pt"}
+data/BR/SP/Alambari={"id":"data/BR/SP/Alambari","key":"Alambari","lang":"pt"}
+data/BR/SP/Alfredo Marcondes={"id":"data/BR/SP/Alfredo Marcondes","key":"Alfredo Marcondes","lang":"pt"}
+data/BR/SP/Altair={"id":"data/BR/SP/Altair","key":"Altair","lang":"pt"}
+data/BR/SP/Altinópolis={"id":"data/BR/SP/Altinópolis","key":"Altinópolis","lang":"pt"}
+data/BR/SP/Alto Alegre={"id":"data/BR/SP/Alto Alegre","key":"Alto Alegre","lang":"pt"}
+data/BR/SP/Alumínio={"id":"data/BR/SP/Alumínio","key":"Alumínio","lang":"pt"}
+data/BR/SP/Alvinlândia={"id":"data/BR/SP/Alvinlândia","key":"Alvinlândia","lang":"pt"}
+data/BR/SP/Americana={"id":"data/BR/SP/Americana","key":"Americana","lang":"pt"}
+data/BR/SP/Amparo={"id":"data/BR/SP/Amparo","key":"Amparo","lang":"pt"}
+data/BR/SP/Américo Brasiliense={"id":"data/BR/SP/Américo Brasiliense","key":"Américo Brasiliense","lang":"pt"}
+data/BR/SP/Américo de Campos={"id":"data/BR/SP/Américo de Campos","key":"Américo de Campos","lang":"pt"}
+data/BR/SP/Analândia={"id":"data/BR/SP/Analândia","key":"Analândia","lang":"pt"}
+data/BR/SP/Andradina={"id":"data/BR/SP/Andradina","key":"Andradina","lang":"pt"}
+data/BR/SP/Angatuba={"id":"data/BR/SP/Angatuba","key":"Angatuba","lang":"pt"}
+data/BR/SP/Anhembi={"id":"data/BR/SP/Anhembi","key":"Anhembi","lang":"pt"}
+data/BR/SP/Anhumas={"id":"data/BR/SP/Anhumas","key":"Anhumas","lang":"pt"}
+data/BR/SP/Aparecida={"id":"data/BR/SP/Aparecida","key":"Aparecida","lang":"pt"}
+data/BR/SP/Aparecida d'Oeste={"id":"data/BR/SP/Aparecida d'Oeste","key":"Aparecida d'Oeste","lang":"pt"}
+data/BR/SP/Apiaí={"id":"data/BR/SP/Apiaí","key":"Apiaí","lang":"pt"}
+data/BR/SP/Aramina={"id":"data/BR/SP/Aramina","key":"Aramina","lang":"pt"}
+data/BR/SP/Arandu={"id":"data/BR/SP/Arandu","key":"Arandu","lang":"pt"}
+data/BR/SP/Arapeí={"id":"data/BR/SP/Arapeí","key":"Arapeí","lang":"pt"}
+data/BR/SP/Araraquara={"id":"data/BR/SP/Araraquara","key":"Araraquara","lang":"pt"}
+data/BR/SP/Araras={"id":"data/BR/SP/Araras","key":"Araras","lang":"pt"}
+data/BR/SP/Araçariguama={"id":"data/BR/SP/Araçariguama","key":"Araçariguama","lang":"pt"}
+data/BR/SP/Araçatuba={"id":"data/BR/SP/Araçatuba","key":"Araçatuba","lang":"pt"}
+data/BR/SP/Araçoiaba da Serra={"id":"data/BR/SP/Araçoiaba da Serra","key":"Araçoiaba da Serra","lang":"pt"}
+data/BR/SP/Arco-Íris={"id":"data/BR/SP/Arco-Íris","key":"Arco-Íris","lang":"pt"}
+data/BR/SP/Arealva={"id":"data/BR/SP/Arealva","key":"Arealva","lang":"pt"}
+data/BR/SP/Areias={"id":"data/BR/SP/Areias","key":"Areias","lang":"pt"}
+data/BR/SP/Areiópolis={"id":"data/BR/SP/Areiópolis","key":"Areiópolis","lang":"pt"}
+data/BR/SP/Ariranha={"id":"data/BR/SP/Ariranha","key":"Ariranha","lang":"pt"}
+data/BR/SP/Artur Nogueira={"id":"data/BR/SP/Artur Nogueira","key":"Artur Nogueira","lang":"pt"}
+data/BR/SP/Arujá={"id":"data/BR/SP/Arujá","key":"Arujá","lang":"pt"}
+data/BR/SP/Aspásia={"id":"data/BR/SP/Aspásia","key":"Aspásia","lang":"pt"}
+data/BR/SP/Assis={"id":"data/BR/SP/Assis","key":"Assis","lang":"pt"}
+data/BR/SP/Atibaia={"id":"data/BR/SP/Atibaia","key":"Atibaia","lang":"pt"}
+data/BR/SP/Auriflama={"id":"data/BR/SP/Auriflama","key":"Auriflama","lang":"pt"}
+data/BR/SP/Avanhandava={"id":"data/BR/SP/Avanhandava","key":"Avanhandava","lang":"pt"}
+data/BR/SP/Avaré={"id":"data/BR/SP/Avaré","key":"Avaré","lang":"pt"}
+data/BR/SP/Avaí={"id":"data/BR/SP/Avaí","key":"Avaí","lang":"pt"}
+data/BR/SP/Bady Bassitt={"id":"data/BR/SP/Bady Bassitt","key":"Bady Bassitt","lang":"pt"}
+data/BR/SP/Balbinos={"id":"data/BR/SP/Balbinos","key":"Balbinos","lang":"pt"}
+data/BR/SP/Bananal={"id":"data/BR/SP/Bananal","key":"Bananal","lang":"pt"}
+data/BR/SP/Barbosa={"id":"data/BR/SP/Barbosa","key":"Barbosa","lang":"pt"}
+data/BR/SP/Bariri={"id":"data/BR/SP/Bariri","key":"Bariri","lang":"pt"}
+data/BR/SP/Barra Bonita={"id":"data/BR/SP/Barra Bonita","key":"Barra Bonita","lang":"pt"}
+data/BR/SP/Barra do Chapéu={"id":"data/BR/SP/Barra do Chapéu","key":"Barra do Chapéu","lang":"pt"}
+data/BR/SP/Barra do Turvo={"id":"data/BR/SP/Barra do Turvo","key":"Barra do Turvo","lang":"pt"}
+data/BR/SP/Barretos={"id":"data/BR/SP/Barretos","key":"Barretos","lang":"pt"}
+data/BR/SP/Barrinha={"id":"data/BR/SP/Barrinha","key":"Barrinha","lang":"pt"}
+data/BR/SP/Barueri={"id":"data/BR/SP/Barueri","key":"Barueri","lang":"pt"}
+data/BR/SP/Barão de Antonina={"id":"data/BR/SP/Barão de Antonina","key":"Barão de Antonina","lang":"pt"}
+data/BR/SP/Bastos={"id":"data/BR/SP/Bastos","key":"Bastos","lang":"pt"}
+data/BR/SP/Batatais={"id":"data/BR/SP/Batatais","key":"Batatais","lang":"pt"}
+data/BR/SP/Bauru={"id":"data/BR/SP/Bauru","key":"Bauru","lang":"pt"}
+data/BR/SP/Bebedouro={"id":"data/BR/SP/Bebedouro","key":"Bebedouro","lang":"pt"}
+data/BR/SP/Bento de Abreu={"id":"data/BR/SP/Bento de Abreu","key":"Bento de Abreu","lang":"pt"}
+data/BR/SP/Bernardino de Campos={"id":"data/BR/SP/Bernardino de Campos","key":"Bernardino de Campos","lang":"pt"}
+data/BR/SP/Bertioga={"id":"data/BR/SP/Bertioga","key":"Bertioga","lang":"pt"}
+data/BR/SP/Bilac={"id":"data/BR/SP/Bilac","key":"Bilac","lang":"pt"}
+data/BR/SP/Birigüi={"id":"data/BR/SP/Birigüi","key":"Birigüi","lang":"pt"}
+data/BR/SP/Biritiba-Mirim={"id":"data/BR/SP/Biritiba-Mirim","key":"Biritiba-Mirim","lang":"pt"}
+data/BR/SP/Boa Esperança do Sul={"id":"data/BR/SP/Boa Esperança do Sul","key":"Boa Esperança do Sul","lang":"pt"}
+data/BR/SP/Bocaina={"id":"data/BR/SP/Bocaina","key":"Bocaina","lang":"pt"}
+data/BR/SP/Bofete={"id":"data/BR/SP/Bofete","key":"Bofete","lang":"pt"}
+data/BR/SP/Boituva={"id":"data/BR/SP/Boituva","key":"Boituva","lang":"pt"}
+data/BR/SP/Bom Jesus dos Perdões={"id":"data/BR/SP/Bom Jesus dos Perdões","key":"Bom Jesus dos Perdões","lang":"pt"}
+data/BR/SP/Bom Sucesso de Itararé={"id":"data/BR/SP/Bom Sucesso de Itararé","key":"Bom Sucesso de Itararé","lang":"pt"}
+data/BR/SP/Boracéia={"id":"data/BR/SP/Boracéia","key":"Boracéia","lang":"pt"}
+data/BR/SP/Borborema={"id":"data/BR/SP/Borborema","key":"Borborema","lang":"pt"}
+data/BR/SP/Borebi={"id":"data/BR/SP/Borebi","key":"Borebi","lang":"pt"}
+data/BR/SP/Borá={"id":"data/BR/SP/Borá","key":"Borá","lang":"pt"}
+data/BR/SP/Botucatu={"id":"data/BR/SP/Botucatu","key":"Botucatu","lang":"pt"}
+data/BR/SP/Bragança Paulista={"id":"data/BR/SP/Bragança Paulista","key":"Bragança Paulista","lang":"pt"}
+data/BR/SP/Braúna={"id":"data/BR/SP/Braúna","key":"Braúna","lang":"pt"}
+data/BR/SP/Brejo Alegre={"id":"data/BR/SP/Brejo Alegre","key":"Brejo Alegre","lang":"pt"}
+data/BR/SP/Brodowski={"id":"data/BR/SP/Brodowski","key":"Brodowski","lang":"pt"}
+data/BR/SP/Brotas={"id":"data/BR/SP/Brotas","key":"Brotas","lang":"pt"}
+data/BR/SP/Buri={"id":"data/BR/SP/Buri","key":"Buri","lang":"pt"}
+data/BR/SP/Buritama={"id":"data/BR/SP/Buritama","key":"Buritama","lang":"pt"}
+data/BR/SP/Buritizal={"id":"data/BR/SP/Buritizal","key":"Buritizal","lang":"pt"}
+data/BR/SP/Bálsamo={"id":"data/BR/SP/Bálsamo","key":"Bálsamo","lang":"pt"}
+data/BR/SP/Cabreúva={"id":"data/BR/SP/Cabreúva","key":"Cabreúva","lang":"pt"}
+data/BR/SP/Cabrália Paulista={"id":"data/BR/SP/Cabrália Paulista","key":"Cabrália Paulista","lang":"pt"}
+data/BR/SP/Cachoeira Paulista={"id":"data/BR/SP/Cachoeira Paulista","key":"Cachoeira Paulista","lang":"pt"}
+data/BR/SP/Caconde={"id":"data/BR/SP/Caconde","key":"Caconde","lang":"pt"}
+data/BR/SP/Cafelândia={"id":"data/BR/SP/Cafelândia","key":"Cafelândia","lang":"pt"}
+data/BR/SP/Caiabu={"id":"data/BR/SP/Caiabu","key":"Caiabu","lang":"pt"}
+data/BR/SP/Caieiras={"id":"data/BR/SP/Caieiras","key":"Caieiras","lang":"pt"}
+data/BR/SP/Caiuá={"id":"data/BR/SP/Caiuá","key":"Caiuá","lang":"pt"}
+data/BR/SP/Cajamar={"id":"data/BR/SP/Cajamar","key":"Cajamar","lang":"pt"}
+data/BR/SP/Cajati={"id":"data/BR/SP/Cajati","key":"Cajati","lang":"pt"}
+data/BR/SP/Cajobi={"id":"data/BR/SP/Cajobi","key":"Cajobi","lang":"pt"}
+data/BR/SP/Cajuru={"id":"data/BR/SP/Cajuru","key":"Cajuru","lang":"pt"}
+data/BR/SP/Campina do Monte Alegre={"id":"data/BR/SP/Campina do Monte Alegre","key":"Campina do Monte Alegre","lang":"pt"}
+data/BR/SP/Campinas={"id":"data/BR/SP/Campinas","key":"Campinas","lang":"pt"}
+data/BR/SP/Campo Limpo Paulista={"id":"data/BR/SP/Campo Limpo Paulista","key":"Campo Limpo Paulista","lang":"pt"}
+data/BR/SP/Campos Novos Paulista={"id":"data/BR/SP/Campos Novos Paulista","key":"Campos Novos Paulista","lang":"pt"}
+data/BR/SP/Campos do Jordão={"id":"data/BR/SP/Campos do Jordão","key":"Campos do Jordão","lang":"pt"}
+data/BR/SP/Cananéia={"id":"data/BR/SP/Cananéia","key":"Cananéia","lang":"pt"}
+data/BR/SP/Canas={"id":"data/BR/SP/Canas","key":"Canas","lang":"pt"}
+data/BR/SP/Canitar={"id":"data/BR/SP/Canitar","key":"Canitar","lang":"pt"}
+data/BR/SP/Capela do Alto={"id":"data/BR/SP/Capela do Alto","key":"Capela do Alto","lang":"pt"}
+data/BR/SP/Capivari={"id":"data/BR/SP/Capivari","key":"Capivari","lang":"pt"}
+data/BR/SP/Capão Bonito={"id":"data/BR/SP/Capão Bonito","key":"Capão Bonito","lang":"pt"}
+data/BR/SP/Caraguatatuba={"id":"data/BR/SP/Caraguatatuba","key":"Caraguatatuba","lang":"pt"}
+data/BR/SP/Carapicuíba={"id":"data/BR/SP/Carapicuíba","key":"Carapicuíba","lang":"pt"}
+data/BR/SP/Cardoso={"id":"data/BR/SP/Cardoso","key":"Cardoso","lang":"pt"}
+data/BR/SP/Casa Branca={"id":"data/BR/SP/Casa Branca","key":"Casa Branca","lang":"pt"}
+data/BR/SP/Castilho={"id":"data/BR/SP/Castilho","key":"Castilho","lang":"pt"}
+data/BR/SP/Catanduva={"id":"data/BR/SP/Catanduva","key":"Catanduva","lang":"pt"}
+data/BR/SP/Catiguá={"id":"data/BR/SP/Catiguá","key":"Catiguá","lang":"pt"}
+data/BR/SP/Caçapava={"id":"data/BR/SP/Caçapava","key":"Caçapava","lang":"pt"}
+data/BR/SP/Cedral={"id":"data/BR/SP/Cedral","key":"Cedral","lang":"pt"}
+data/BR/SP/Cerqueira César={"id":"data/BR/SP/Cerqueira César","key":"Cerqueira César","lang":"pt"}
+data/BR/SP/Cerquilho={"id":"data/BR/SP/Cerquilho","key":"Cerquilho","lang":"pt"}
+data/BR/SP/Cesário Lange={"id":"data/BR/SP/Cesário Lange","key":"Cesário Lange","lang":"pt"}
+data/BR/SP/Charqueada={"id":"data/BR/SP/Charqueada","key":"Charqueada","lang":"pt"}
+data/BR/SP/Chavantes={"id":"data/BR/SP/Chavantes","key":"Chavantes","lang":"pt"}
+data/BR/SP/Clementina={"id":"data/BR/SP/Clementina","key":"Clementina","lang":"pt"}
+data/BR/SP/Colina={"id":"data/BR/SP/Colina","key":"Colina","lang":"pt"}
+data/BR/SP/Colombia={"id":"data/BR/SP/Colombia","key":"Colombia","lang":"pt"}
+data/BR/SP/Conchal={"id":"data/BR/SP/Conchal","key":"Conchal","lang":"pt"}
+data/BR/SP/Conchas={"id":"data/BR/SP/Conchas","key":"Conchas","lang":"pt"}
+data/BR/SP/Cordeirópolis={"id":"data/BR/SP/Cordeirópolis","key":"Cordeirópolis","lang":"pt"}
+data/BR/SP/Coroados={"id":"data/BR/SP/Coroados","key":"Coroados","lang":"pt"}
+data/BR/SP/Coronel Macedo={"id":"data/BR/SP/Coronel Macedo","key":"Coronel Macedo","lang":"pt"}
+data/BR/SP/Corumbataí={"id":"data/BR/SP/Corumbataí","key":"Corumbataí","lang":"pt"}
+data/BR/SP/Cosmopolis={"id":"data/BR/SP/Cosmopolis","key":"Cosmopolis","lang":"pt"}
+data/BR/SP/Cosmorama={"id":"data/BR/SP/Cosmorama","key":"Cosmorama","lang":"pt"}
+data/BR/SP/Cotia={"id":"data/BR/SP/Cotia","key":"Cotia","lang":"pt"}
+data/BR/SP/Cravinhos={"id":"data/BR/SP/Cravinhos","key":"Cravinhos","lang":"pt"}
+data/BR/SP/Cristais Paulista={"id":"data/BR/SP/Cristais Paulista","key":"Cristais Paulista","lang":"pt"}
+data/BR/SP/Cruzeiro={"id":"data/BR/SP/Cruzeiro","key":"Cruzeiro","lang":"pt"}
+data/BR/SP/Cruzália={"id":"data/BR/SP/Cruzália","key":"Cruzália","lang":"pt"}
+data/BR/SP/Cubatão={"id":"data/BR/SP/Cubatão","key":"Cubatão","lang":"pt"}
+data/BR/SP/Cunha={"id":"data/BR/SP/Cunha","key":"Cunha","lang":"pt"}
+data/BR/SP/Cássia dos Coqueiros={"id":"data/BR/SP/Cássia dos Coqueiros","key":"Cássia dos Coqueiros","lang":"pt"}
+data/BR/SP/Cândido Mota={"id":"data/BR/SP/Cândido Mota","key":"Cândido Mota","lang":"pt"}
+data/BR/SP/Cândido Rodrigues={"id":"data/BR/SP/Cândido Rodrigues","key":"Cândido Rodrigues","lang":"pt"}
+data/BR/SP/Descalvado={"id":"data/BR/SP/Descalvado","key":"Descalvado","lang":"pt"}
+data/BR/SP/Diadema={"id":"data/BR/SP/Diadema","key":"Diadema","lang":"pt"}
+data/BR/SP/Dirce Reis={"id":"data/BR/SP/Dirce Reis","key":"Dirce Reis","lang":"pt"}
+data/BR/SP/Divinolândia={"id":"data/BR/SP/Divinolândia","key":"Divinolândia","lang":"pt"}
+data/BR/SP/Dobrada={"id":"data/BR/SP/Dobrada","key":"Dobrada","lang":"pt"}
+data/BR/SP/Dois Córregos={"id":"data/BR/SP/Dois Córregos","key":"Dois Córregos","lang":"pt"}
+data/BR/SP/Dolcinópolis={"id":"data/BR/SP/Dolcinópolis","key":"Dolcinópolis","lang":"pt"}
+data/BR/SP/Dourado={"id":"data/BR/SP/Dourado","key":"Dourado","lang":"pt"}
+data/BR/SP/Dracena={"id":"data/BR/SP/Dracena","key":"Dracena","lang":"pt"}
+data/BR/SP/Duartina={"id":"data/BR/SP/Duartina","key":"Duartina","lang":"pt"}
+data/BR/SP/Dumont={"id":"data/BR/SP/Dumont","key":"Dumont","lang":"pt"}
+data/BR/SP/Echaporã={"id":"data/BR/SP/Echaporã","key":"Echaporã","lang":"pt"}
+data/BR/SP/Eldorado={"id":"data/BR/SP/Eldorado","key":"Eldorado","lang":"pt"}
+data/BR/SP/Elias Fausto={"id":"data/BR/SP/Elias Fausto","key":"Elias Fausto","lang":"pt"}
+data/BR/SP/Elisiário={"id":"data/BR/SP/Elisiário","key":"Elisiário","lang":"pt"}
+data/BR/SP/Embaúba={"id":"data/BR/SP/Embaúba","key":"Embaúba","lang":"pt"}
+data/BR/SP/Embu={"id":"data/BR/SP/Embu","key":"Embu","lang":"pt"}
+data/BR/SP/Embu-Guaçu={"id":"data/BR/SP/Embu-Guaçu","key":"Embu-Guaçu","lang":"pt"}
+data/BR/SP/Emilianópolis={"id":"data/BR/SP/Emilianópolis","key":"Emilianópolis","lang":"pt"}
+data/BR/SP/Engenheiro Coelho={"id":"data/BR/SP/Engenheiro Coelho","key":"Engenheiro Coelho","lang":"pt"}
+data/BR/SP/Espírito Santo do Pinhal={"id":"data/BR/SP/Espírito Santo do Pinhal","key":"Espírito Santo do Pinhal","lang":"pt"}
+data/BR/SP/Espírito Santo do Turvo={"id":"data/BR/SP/Espírito Santo do Turvo","key":"Espírito Santo do Turvo","lang":"pt"}
+data/BR/SP/Estiva Gerbi={"id":"data/BR/SP/Estiva Gerbi","key":"Estiva Gerbi","lang":"pt"}
+data/BR/SP/Estrela d'Oeste={"id":"data/BR/SP/Estrela d'Oeste","key":"Estrela d'Oeste","lang":"pt"}
+data/BR/SP/Estrela do Norte={"id":"data/BR/SP/Estrela do Norte","key":"Estrela do Norte","lang":"pt"}
+data/BR/SP/Euclides da Cunha Paulista={"id":"data/BR/SP/Euclides da Cunha Paulista","key":"Euclides da Cunha Paulista","lang":"pt"}
+data/BR/SP/Fartura={"id":"data/BR/SP/Fartura","key":"Fartura","lang":"pt"}
+data/BR/SP/Fernando Prestes={"id":"data/BR/SP/Fernando Prestes","key":"Fernando Prestes","lang":"pt"}
+data/BR/SP/Fernandópolis={"id":"data/BR/SP/Fernandópolis","key":"Fernandópolis","lang":"pt"}
+data/BR/SP/Fernão={"id":"data/BR/SP/Fernão","key":"Fernão","lang":"pt"}
+data/BR/SP/Ferraz de Vasconcelos={"id":"data/BR/SP/Ferraz de Vasconcelos","key":"Ferraz de Vasconcelos","lang":"pt"}
+data/BR/SP/Flora Rica={"id":"data/BR/SP/Flora Rica","key":"Flora Rica","lang":"pt"}
+data/BR/SP/Floréal={"id":"data/BR/SP/Floréal","key":"Floréal","lang":"pt"}
+data/BR/SP/Florínia={"id":"data/BR/SP/Florínia","key":"Florínia","lang":"pt"}
+data/BR/SP/Flórida Paulista={"id":"data/BR/SP/Flórida Paulista","key":"Flórida Paulista","lang":"pt"}
+data/BR/SP/Franca={"id":"data/BR/SP/Franca","key":"Franca","lang":"pt"}
+data/BR/SP/Francisco Morato={"id":"data/BR/SP/Francisco Morato","key":"Francisco Morato","lang":"pt"}
+data/BR/SP/Franco da Rocha={"id":"data/BR/SP/Franco da Rocha","key":"Franco da Rocha","lang":"pt"}
+data/BR/SP/Gabriel Monteiro={"id":"data/BR/SP/Gabriel Monteiro","key":"Gabriel Monteiro","lang":"pt"}
+data/BR/SP/Garça={"id":"data/BR/SP/Garça","key":"Garça","lang":"pt"}
+data/BR/SP/Gastão Vidigal={"id":"data/BR/SP/Gastão Vidigal","key":"Gastão Vidigal","lang":"pt"}
+data/BR/SP/Gavião Peixoto={"id":"data/BR/SP/Gavião Peixoto","key":"Gavião Peixoto","lang":"pt"}
+data/BR/SP/General Salgado={"id":"data/BR/SP/General Salgado","key":"General Salgado","lang":"pt"}
+data/BR/SP/Getulina={"id":"data/BR/SP/Getulina","key":"Getulina","lang":"pt"}
+data/BR/SP/Glicério={"id":"data/BR/SP/Glicério","key":"Glicério","lang":"pt"}
+data/BR/SP/Guaimbê={"id":"data/BR/SP/Guaimbê","key":"Guaimbê","lang":"pt"}
+data/BR/SP/Guaiçara={"id":"data/BR/SP/Guaiçara","key":"Guaiçara","lang":"pt"}
+data/BR/SP/Guapiara={"id":"data/BR/SP/Guapiara","key":"Guapiara","lang":"pt"}
+data/BR/SP/Guapiaçu={"id":"data/BR/SP/Guapiaçu","key":"Guapiaçu","lang":"pt"}
+data/BR/SP/Guaraci={"id":"data/BR/SP/Guaraci","key":"Guaraci","lang":"pt"}
+data/BR/SP/Guarani d'Oeste={"id":"data/BR/SP/Guarani d'Oeste","key":"Guarani d'Oeste","lang":"pt"}
+data/BR/SP/Guarantã={"id":"data/BR/SP/Guarantã","key":"Guarantã","lang":"pt"}
+data/BR/SP/Guararapes={"id":"data/BR/SP/Guararapes","key":"Guararapes","lang":"pt"}
+data/BR/SP/Guararema={"id":"data/BR/SP/Guararema","key":"Guararema","lang":"pt"}
+data/BR/SP/Guaratinguetá={"id":"data/BR/SP/Guaratinguetá","key":"Guaratinguetá","lang":"pt"}
+data/BR/SP/Guaraçaí={"id":"data/BR/SP/Guaraçaí","key":"Guaraçaí","lang":"pt"}
+data/BR/SP/Guareí={"id":"data/BR/SP/Guareí","key":"Guareí","lang":"pt"}
+data/BR/SP/Guariba={"id":"data/BR/SP/Guariba","key":"Guariba","lang":"pt"}
+data/BR/SP/Guarujá={"id":"data/BR/SP/Guarujá","key":"Guarujá","lang":"pt"}
+data/BR/SP/Guarulhos={"id":"data/BR/SP/Guarulhos","key":"Guarulhos","lang":"pt"}
+data/BR/SP/Guará={"id":"data/BR/SP/Guará","key":"Guará","lang":"pt"}
+data/BR/SP/Guatapará={"id":"data/BR/SP/Guatapará","key":"Guatapará","lang":"pt"}
+data/BR/SP/Guaíra={"id":"data/BR/SP/Guaíra","key":"Guaíra","lang":"pt"}
+data/BR/SP/Guzolândia={"id":"data/BR/SP/Guzolândia","key":"Guzolândia","lang":"pt"}
+data/BR/SP/Gália={"id":"data/BR/SP/Gália","key":"Gália","lang":"pt"}
+data/BR/SP/Herculândia={"id":"data/BR/SP/Herculândia","key":"Herculândia","lang":"pt"}
+data/BR/SP/Holambra={"id":"data/BR/SP/Holambra","key":"Holambra","lang":"pt"}
+data/BR/SP/Hortolândia={"id":"data/BR/SP/Hortolândia","key":"Hortolândia","lang":"pt"}
+data/BR/SP/Iacanga={"id":"data/BR/SP/Iacanga","key":"Iacanga","lang":"pt"}
+data/BR/SP/Iacri={"id":"data/BR/SP/Iacri","key":"Iacri","lang":"pt"}
+data/BR/SP/Iaras={"id":"data/BR/SP/Iaras","key":"Iaras","lang":"pt"}
+data/BR/SP/Ibaté={"id":"data/BR/SP/Ibaté","key":"Ibaté","lang":"pt"}
+data/BR/SP/Ibirarema={"id":"data/BR/SP/Ibirarema","key":"Ibirarema","lang":"pt"}
+data/BR/SP/Ibirá={"id":"data/BR/SP/Ibirá","key":"Ibirá","lang":"pt"}
+data/BR/SP/Ibitinga={"id":"data/BR/SP/Ibitinga","key":"Ibitinga","lang":"pt"}
+data/BR/SP/Ibiúna={"id":"data/BR/SP/Ibiúna","key":"Ibiúna","lang":"pt"}
+data/BR/SP/Icém={"id":"data/BR/SP/Icém","key":"Icém","lang":"pt"}
+data/BR/SP/Iepê={"id":"data/BR/SP/Iepê","key":"Iepê","lang":"pt"}
+data/BR/SP/Igarapava={"id":"data/BR/SP/Igarapava","key":"Igarapava","lang":"pt"}
+data/BR/SP/Igaratá={"id":"data/BR/SP/Igaratá","key":"Igaratá","lang":"pt"}
+data/BR/SP/Igaraçu do Tietê={"id":"data/BR/SP/Igaraçu do Tietê","key":"Igaraçu do Tietê","lang":"pt"}
+data/BR/SP/Iguape={"id":"data/BR/SP/Iguape","key":"Iguape","lang":"pt"}
+data/BR/SP/Ilha Comprida={"id":"data/BR/SP/Ilha Comprida","key":"Ilha Comprida","lang":"pt"}
+data/BR/SP/Ilha Solteira={"id":"data/BR/SP/Ilha Solteira","key":"Ilha Solteira","lang":"pt"}
+data/BR/SP/Ilhabela={"id":"data/BR/SP/Ilhabela","key":"Ilhabela","lang":"pt"}
+data/BR/SP/Indaiatuba={"id":"data/BR/SP/Indaiatuba","key":"Indaiatuba","lang":"pt"}
+data/BR/SP/Indiana={"id":"data/BR/SP/Indiana","key":"Indiana","lang":"pt"}
+data/BR/SP/Indiaporã={"id":"data/BR/SP/Indiaporã","key":"Indiaporã","lang":"pt"}
+data/BR/SP/Inúbia Paulista={"id":"data/BR/SP/Inúbia Paulista","key":"Inúbia Paulista","lang":"pt"}
+data/BR/SP/Ipaussu={"id":"data/BR/SP/Ipaussu","key":"Ipaussu","lang":"pt"}
+data/BR/SP/Iperó={"id":"data/BR/SP/Iperó","key":"Iperó","lang":"pt"}
+data/BR/SP/Ipeúna={"id":"data/BR/SP/Ipeúna","key":"Ipeúna","lang":"pt"}
+data/BR/SP/Ipiguá={"id":"data/BR/SP/Ipiguá","key":"Ipiguá","lang":"pt"}
+data/BR/SP/Iporanga={"id":"data/BR/SP/Iporanga","key":"Iporanga","lang":"pt"}
+data/BR/SP/Ipuã={"id":"data/BR/SP/Ipuã","key":"Ipuã","lang":"pt"}
+data/BR/SP/Iracemápolis={"id":"data/BR/SP/Iracemápolis","key":"Iracemápolis","lang":"pt"}
+data/BR/SP/Irapuru={"id":"data/BR/SP/Irapuru","key":"Irapuru","lang":"pt"}
+data/BR/SP/Irapuã={"id":"data/BR/SP/Irapuã","key":"Irapuã","lang":"pt"}
+data/BR/SP/Itaberá={"id":"data/BR/SP/Itaberá","key":"Itaberá","lang":"pt"}
+data/BR/SP/Itajobi={"id":"data/BR/SP/Itajobi","key":"Itajobi","lang":"pt"}
+data/BR/SP/Itaju={"id":"data/BR/SP/Itaju","key":"Itaju","lang":"pt"}
+data/BR/SP/Itanhaém={"id":"data/BR/SP/Itanhaém","key":"Itanhaém","lang":"pt"}
+data/BR/SP/Itapecerica da Serra={"id":"data/BR/SP/Itapecerica da Serra","key":"Itapecerica da Serra","lang":"pt"}
+data/BR/SP/Itapetininga={"id":"data/BR/SP/Itapetininga","key":"Itapetininga","lang":"pt"}
+data/BR/SP/Itapeva={"id":"data/BR/SP/Itapeva","key":"Itapeva","lang":"pt"}
+data/BR/SP/Itapevi={"id":"data/BR/SP/Itapevi","key":"Itapevi","lang":"pt"}
+data/BR/SP/Itapira={"id":"data/BR/SP/Itapira","key":"Itapira","lang":"pt"}
+data/BR/SP/Itapirapuã Paulista={"id":"data/BR/SP/Itapirapuã Paulista","key":"Itapirapuã Paulista","lang":"pt"}
+data/BR/SP/Itaporanga={"id":"data/BR/SP/Itaporanga","key":"Itaporanga","lang":"pt"}
+data/BR/SP/Itapura={"id":"data/BR/SP/Itapura","key":"Itapura","lang":"pt"}
+data/BR/SP/Itapuí={"id":"data/BR/SP/Itapuí","key":"Itapuí","lang":"pt"}
+data/BR/SP/Itaquaquecetuba={"id":"data/BR/SP/Itaquaquecetuba","key":"Itaquaquecetuba","lang":"pt"}
+data/BR/SP/Itararé={"id":"data/BR/SP/Itararé","key":"Itararé","lang":"pt"}
+data/BR/SP/Itariri={"id":"data/BR/SP/Itariri","key":"Itariri","lang":"pt"}
+data/BR/SP/Itatiba={"id":"data/BR/SP/Itatiba","key":"Itatiba","lang":"pt"}
+data/BR/SP/Itatinga={"id":"data/BR/SP/Itatinga","key":"Itatinga","lang":"pt"}
+data/BR/SP/Itaí={"id":"data/BR/SP/Itaí","key":"Itaí","lang":"pt"}
+data/BR/SP/Itaóca={"id":"data/BR/SP/Itaóca","key":"Itaóca","lang":"pt"}
+data/BR/SP/Itirapina={"id":"data/BR/SP/Itirapina","key":"Itirapina","lang":"pt"}
+data/BR/SP/Itirapuã={"id":"data/BR/SP/Itirapuã","key":"Itirapuã","lang":"pt"}
+data/BR/SP/Itobi={"id":"data/BR/SP/Itobi","key":"Itobi","lang":"pt"}
+data/BR/SP/Itu={"id":"data/BR/SP/Itu","key":"Itu","lang":"pt"}
+data/BR/SP/Itupeva={"id":"data/BR/SP/Itupeva","key":"Itupeva","lang":"pt"}
+data/BR/SP/Ituverava={"id":"data/BR/SP/Ituverava","key":"Ituverava","lang":"pt"}
+data/BR/SP/Itápolis={"id":"data/BR/SP/Itápolis","key":"Itápolis","lang":"pt"}
+data/BR/SP/Jaborandi={"id":"data/BR/SP/Jaborandi","key":"Jaborandi","lang":"pt"}
+data/BR/SP/Jaboticabal={"id":"data/BR/SP/Jaboticabal","key":"Jaboticabal","lang":"pt"}
+data/BR/SP/Jacareí={"id":"data/BR/SP/Jacareí","key":"Jacareí","lang":"pt"}
+data/BR/SP/Jaci={"id":"data/BR/SP/Jaci","key":"Jaci","lang":"pt"}
+data/BR/SP/Jacupiranga={"id":"data/BR/SP/Jacupiranga","key":"Jacupiranga","lang":"pt"}
+data/BR/SP/Jaguariúna={"id":"data/BR/SP/Jaguariúna","key":"Jaguariúna","lang":"pt"}
+data/BR/SP/Jales={"id":"data/BR/SP/Jales","key":"Jales","lang":"pt"}
+data/BR/SP/Jambeiro={"id":"data/BR/SP/Jambeiro","key":"Jambeiro","lang":"pt"}
+data/BR/SP/Jandira={"id":"data/BR/SP/Jandira","key":"Jandira","lang":"pt"}
+data/BR/SP/Jardinópolis={"id":"data/BR/SP/Jardinópolis","key":"Jardinópolis","lang":"pt"}
+data/BR/SP/Jarinu={"id":"data/BR/SP/Jarinu","key":"Jarinu","lang":"pt"}
+data/BR/SP/Jaú={"id":"data/BR/SP/Jaú","key":"Jaú","lang":"pt"}
+data/BR/SP/Jeriquara={"id":"data/BR/SP/Jeriquara","key":"Jeriquara","lang":"pt"}
+data/BR/SP/Joanópolis={"id":"data/BR/SP/Joanópolis","key":"Joanópolis","lang":"pt"}
+data/BR/SP/José Bonifácio={"id":"data/BR/SP/José Bonifácio","key":"José Bonifácio","lang":"pt"}
+data/BR/SP/João Ramalho={"id":"data/BR/SP/João Ramalho","key":"João Ramalho","lang":"pt"}
+data/BR/SP/Jumirim={"id":"data/BR/SP/Jumirim","key":"Jumirim","lang":"pt"}
+data/BR/SP/Jundiaí={"id":"data/BR/SP/Jundiaí","key":"Jundiaí","lang":"pt"}
+data/BR/SP/Junqueirópolis={"id":"data/BR/SP/Junqueirópolis","key":"Junqueirópolis","lang":"pt"}
+data/BR/SP/Juquitiba={"id":"data/BR/SP/Juquitiba","key":"Juquitiba","lang":"pt"}
+data/BR/SP/Juquiá={"id":"data/BR/SP/Juquiá","key":"Juquiá","lang":"pt"}
+data/BR/SP/Júlio Mesquita={"id":"data/BR/SP/Júlio Mesquita","key":"Júlio Mesquita","lang":"pt"}
+data/BR/SP/Lagoinha={"id":"data/BR/SP/Lagoinha","key":"Lagoinha","lang":"pt"}
+data/BR/SP/Laranjal Paulista={"id":"data/BR/SP/Laranjal Paulista","key":"Laranjal Paulista","lang":"pt"}
+data/BR/SP/Lavrinhas={"id":"data/BR/SP/Lavrinhas","key":"Lavrinhas","lang":"pt"}
+data/BR/SP/Lavínia={"id":"data/BR/SP/Lavínia","key":"Lavínia","lang":"pt"}
+data/BR/SP/Leme={"id":"data/BR/SP/Leme","key":"Leme","lang":"pt"}
+data/BR/SP/Lençóis Paulista={"id":"data/BR/SP/Lençóis Paulista","key":"Lençóis Paulista","lang":"pt"}
+data/BR/SP/Limeira={"id":"data/BR/SP/Limeira","key":"Limeira","lang":"pt"}
+data/BR/SP/Lindóia={"id":"data/BR/SP/Lindóia","key":"Lindóia","lang":"pt"}
+data/BR/SP/Lins={"id":"data/BR/SP/Lins","key":"Lins","lang":"pt"}
+data/BR/SP/Lorena={"id":"data/BR/SP/Lorena","key":"Lorena","lang":"pt"}
+data/BR/SP/Lourdes={"id":"data/BR/SP/Lourdes","key":"Lourdes","lang":"pt"}
+data/BR/SP/Louveira={"id":"data/BR/SP/Louveira","key":"Louveira","lang":"pt"}
+data/BR/SP/Lucianópolis={"id":"data/BR/SP/Lucianópolis","key":"Lucianópolis","lang":"pt"}
+data/BR/SP/Lucélia={"id":"data/BR/SP/Lucélia","key":"Lucélia","lang":"pt"}
+data/BR/SP/Luiziânia={"id":"data/BR/SP/Luiziânia","key":"Luiziânia","lang":"pt"}
+data/BR/SP/Lupércio={"id":"data/BR/SP/Lupércio","key":"Lupércio","lang":"pt"}
+data/BR/SP/Lutécia={"id":"data/BR/SP/Lutécia","key":"Lutécia","lang":"pt"}
+data/BR/SP/Luís Antônio={"id":"data/BR/SP/Luís Antônio","key":"Luís Antônio","lang":"pt"}
+data/BR/SP/Macatuba={"id":"data/BR/SP/Macatuba","key":"Macatuba","lang":"pt"}
+data/BR/SP/Macaubal={"id":"data/BR/SP/Macaubal","key":"Macaubal","lang":"pt"}
+data/BR/SP/Macedônia={"id":"data/BR/SP/Macedônia","key":"Macedônia","lang":"pt"}
+data/BR/SP/Magda={"id":"data/BR/SP/Magda","key":"Magda","lang":"pt"}
+data/BR/SP/Mairinque={"id":"data/BR/SP/Mairinque","key":"Mairinque","lang":"pt"}
+data/BR/SP/Mairiporã={"id":"data/BR/SP/Mairiporã","key":"Mairiporã","lang":"pt"}
+data/BR/SP/Manduri={"id":"data/BR/SP/Manduri","key":"Manduri","lang":"pt"}
+data/BR/SP/Marabá Paulista={"id":"data/BR/SP/Marabá Paulista","key":"Marabá Paulista","lang":"pt"}
+data/BR/SP/Maracaí={"id":"data/BR/SP/Maracaí","key":"Maracaí","lang":"pt"}
+data/BR/SP/Marapoama={"id":"data/BR/SP/Marapoama","key":"Marapoama","lang":"pt"}
+data/BR/SP/Marinópolis={"id":"data/BR/SP/Marinópolis","key":"Marinópolis","lang":"pt"}
+data/BR/SP/Mariápolis={"id":"data/BR/SP/Mariápolis","key":"Mariápolis","lang":"pt"}
+data/BR/SP/Martinópolis={"id":"data/BR/SP/Martinópolis","key":"Martinópolis","lang":"pt"}
+data/BR/SP/Marília={"id":"data/BR/SP/Marília","key":"Marília","lang":"pt"}
+data/BR/SP/Matão={"id":"data/BR/SP/Matão","key":"Matão","lang":"pt"}
+data/BR/SP/Mauá={"id":"data/BR/SP/Mauá","key":"Mauá","lang":"pt"}
+data/BR/SP/Mendonça={"id":"data/BR/SP/Mendonça","key":"Mendonça","lang":"pt"}
+data/BR/SP/Meridiano={"id":"data/BR/SP/Meridiano","key":"Meridiano","lang":"pt"}
+data/BR/SP/Mesópolis={"id":"data/BR/SP/Mesópolis","key":"Mesópolis","lang":"pt"}
+data/BR/SP/Miguelópolis={"id":"data/BR/SP/Miguelópolis","key":"Miguelópolis","lang":"pt"}
+data/BR/SP/Mineiros do Tietê={"id":"data/BR/SP/Mineiros do Tietê","key":"Mineiros do Tietê","lang":"pt"}
+data/BR/SP/Mira Estrela={"id":"data/BR/SP/Mira Estrela","key":"Mira Estrela","lang":"pt"}
+data/BR/SP/Miracatu={"id":"data/BR/SP/Miracatu","key":"Miracatu","lang":"pt"}
+data/BR/SP/Mirandópolis={"id":"data/BR/SP/Mirandópolis","key":"Mirandópolis","lang":"pt"}
+data/BR/SP/Mirante do Paranapanema={"id":"data/BR/SP/Mirante do Paranapanema","key":"Mirante do Paranapanema","lang":"pt"}
+data/BR/SP/Mirassol={"id":"data/BR/SP/Mirassol","key":"Mirassol","lang":"pt"}
+data/BR/SP/Mirassolândia={"id":"data/BR/SP/Mirassolândia","key":"Mirassolândia","lang":"pt"}
+data/BR/SP/Mococa={"id":"data/BR/SP/Mococa","key":"Mococa","lang":"pt"}
+data/BR/SP/Mogi Guaçu={"id":"data/BR/SP/Mogi Guaçu","key":"Mogi Guaçu","lang":"pt"}
+data/BR/SP/Mogi das Cruzes={"id":"data/BR/SP/Mogi das Cruzes","key":"Mogi das Cruzes","lang":"pt"}
+data/BR/SP/Moji-Mirim={"id":"data/BR/SP/Moji-Mirim","key":"Moji-Mirim","lang":"pt"}
+data/BR/SP/Mombuca={"id":"data/BR/SP/Mombuca","key":"Mombuca","lang":"pt"}
+data/BR/SP/Mongaguá={"id":"data/BR/SP/Mongaguá","key":"Mongaguá","lang":"pt"}
+data/BR/SP/Monte Alegre do Sul={"id":"data/BR/SP/Monte Alegre do Sul","key":"Monte Alegre do Sul","lang":"pt"}
+data/BR/SP/Monte Alto={"id":"data/BR/SP/Monte Alto","key":"Monte Alto","lang":"pt"}
+data/BR/SP/Monte Aprazível={"id":"data/BR/SP/Monte Aprazível","key":"Monte Aprazível","lang":"pt"}
+data/BR/SP/Monte Azul Paulista={"id":"data/BR/SP/Monte Azul Paulista","key":"Monte Azul Paulista","lang":"pt"}
+data/BR/SP/Monte Castelo={"id":"data/BR/SP/Monte Castelo","key":"Monte Castelo","lang":"pt"}
+data/BR/SP/Monte Mor={"id":"data/BR/SP/Monte Mor","key":"Monte Mor","lang":"pt"}
+data/BR/SP/Monteiro Lobato={"id":"data/BR/SP/Monteiro Lobato","key":"Monteiro Lobato","lang":"pt"}
+data/BR/SP/Monções={"id":"data/BR/SP/Monções","key":"Monções","lang":"pt"}
+data/BR/SP/Morro Agudo={"id":"data/BR/SP/Morro Agudo","key":"Morro Agudo","lang":"pt"}
+data/BR/SP/Morungaba={"id":"data/BR/SP/Morungaba","key":"Morungaba","lang":"pt"}
+data/BR/SP/Motuca={"id":"data/BR/SP/Motuca","key":"Motuca","lang":"pt"}
+data/BR/SP/Murutinga do Sul={"id":"data/BR/SP/Murutinga do Sul","key":"Murutinga do Sul","lang":"pt"}
+data/BR/SP/Nantes={"id":"data/BR/SP/Nantes","key":"Nantes","lang":"pt"}
+data/BR/SP/Narandiba={"id":"data/BR/SP/Narandiba","key":"Narandiba","lang":"pt"}
+data/BR/SP/Natividade da Serra={"id":"data/BR/SP/Natividade da Serra","key":"Natividade da Serra","lang":"pt"}
+data/BR/SP/Nazaré Paulista={"id":"data/BR/SP/Nazaré Paulista","key":"Nazaré Paulista","lang":"pt"}
+data/BR/SP/Neves Paulista={"id":"data/BR/SP/Neves Paulista","key":"Neves Paulista","lang":"pt"}
+data/BR/SP/Nhandeara={"id":"data/BR/SP/Nhandeara","key":"Nhandeara","lang":"pt"}
+data/BR/SP/Nipoã={"id":"data/BR/SP/Nipoã","key":"Nipoã","lang":"pt"}
+data/BR/SP/Nova Aliança={"id":"data/BR/SP/Nova Aliança","key":"Nova Aliança","lang":"pt"}
+data/BR/SP/Nova Campina={"id":"data/BR/SP/Nova Campina","key":"Nova Campina","lang":"pt"}
+data/BR/SP/Nova Canaã Paulista={"id":"data/BR/SP/Nova Canaã Paulista","key":"Nova Canaã Paulista","lang":"pt"}
+data/BR/SP/Nova Castilho={"id":"data/BR/SP/Nova Castilho","key":"Nova Castilho","lang":"pt"}
+data/BR/SP/Nova Europa={"id":"data/BR/SP/Nova Europa","key":"Nova Europa","lang":"pt"}
+data/BR/SP/Nova Granada={"id":"data/BR/SP/Nova Granada","key":"Nova Granada","lang":"pt"}
+data/BR/SP/Nova Guataporanga={"id":"data/BR/SP/Nova Guataporanga","key":"Nova Guataporanga","lang":"pt"}
+data/BR/SP/Nova Independência={"id":"data/BR/SP/Nova Independência","key":"Nova Independência","lang":"pt"}
+data/BR/SP/Nova Luzitânia={"id":"data/BR/SP/Nova Luzitânia","key":"Nova Luzitânia","lang":"pt"}
+data/BR/SP/Nova Odessa={"id":"data/BR/SP/Nova Odessa","key":"Nova Odessa","lang":"pt"}
+data/BR/SP/Novais={"id":"data/BR/SP/Novais","key":"Novais","lang":"pt"}
+data/BR/SP/Novo Horizonte={"id":"data/BR/SP/Novo Horizonte","key":"Novo Horizonte","lang":"pt"}
+data/BR/SP/Nuporanga={"id":"data/BR/SP/Nuporanga","key":"Nuporanga","lang":"pt"}
+data/BR/SP/Ocauçu={"id":"data/BR/SP/Ocauçu","key":"Ocauçu","lang":"pt"}
+data/BR/SP/Oleo={"id":"data/BR/SP/Oleo","key":"Oleo","lang":"pt"}
+data/BR/SP/Olímpia={"id":"data/BR/SP/Olímpia","key":"Olímpia","lang":"pt"}
+data/BR/SP/Onda Verde={"id":"data/BR/SP/Onda Verde","key":"Onda Verde","lang":"pt"}
+data/BR/SP/Oriente={"id":"data/BR/SP/Oriente","key":"Oriente","lang":"pt"}
+data/BR/SP/Orindiúva={"id":"data/BR/SP/Orindiúva","key":"Orindiúva","lang":"pt"}
+data/BR/SP/Orlândia={"id":"data/BR/SP/Orlândia","key":"Orlândia","lang":"pt"}
+data/BR/SP/Osasco={"id":"data/BR/SP/Osasco","key":"Osasco","lang":"pt"}
+data/BR/SP/Oscar Bressane={"id":"data/BR/SP/Oscar Bressane","key":"Oscar Bressane","lang":"pt"}
+data/BR/SP/Osvaldo Cruz={"id":"data/BR/SP/Osvaldo Cruz","key":"Osvaldo Cruz","lang":"pt"}
+data/BR/SP/Ourinhos={"id":"data/BR/SP/Ourinhos","key":"Ourinhos","lang":"pt"}
+data/BR/SP/Ouro Verde={"id":"data/BR/SP/Ouro Verde","key":"Ouro Verde","lang":"pt"}
+data/BR/SP/Ouroeste={"id":"data/BR/SP/Ouroeste","key":"Ouroeste","lang":"pt"}
+data/BR/SP/Pacaembu={"id":"data/BR/SP/Pacaembu","key":"Pacaembu","lang":"pt"}
+data/BR/SP/Palestina={"id":"data/BR/SP/Palestina","key":"Palestina","lang":"pt"}
+data/BR/SP/Palmares Paulista={"id":"data/BR/SP/Palmares Paulista","key":"Palmares Paulista","lang":"pt"}
+data/BR/SP/Palmeira d'Oeste={"id":"data/BR/SP/Palmeira d'Oeste","key":"Palmeira d'Oeste","lang":"pt"}
+data/BR/SP/Palmital={"id":"data/BR/SP/Palmital","key":"Palmital","lang":"pt"}
+data/BR/SP/Panorama={"id":"data/BR/SP/Panorama","key":"Panorama","lang":"pt"}
+data/BR/SP/Paraguaçu Paulista={"id":"data/BR/SP/Paraguaçu Paulista","key":"Paraguaçu Paulista","lang":"pt"}
+data/BR/SP/Paraibuna={"id":"data/BR/SP/Paraibuna","key":"Paraibuna","lang":"pt"}
+data/BR/SP/Paraiso={"id":"data/BR/SP/Paraiso","key":"Paraiso","lang":"pt"}
+data/BR/SP/Paranapanema={"id":"data/BR/SP/Paranapanema","key":"Paranapanema","lang":"pt"}
+data/BR/SP/Paranapuã={"id":"data/BR/SP/Paranapuã","key":"Paranapuã","lang":"pt"}
+data/BR/SP/Parapuã={"id":"data/BR/SP/Parapuã","key":"Parapuã","lang":"pt"}
+data/BR/SP/Pardinho={"id":"data/BR/SP/Pardinho","key":"Pardinho","lang":"pt"}
+data/BR/SP/Pariquera-Açu={"id":"data/BR/SP/Pariquera-Açu","key":"Pariquera-Açu","lang":"pt"}
+data/BR/SP/Parisi={"id":"data/BR/SP/Parisi","key":"Parisi","lang":"pt"}
+data/BR/SP/Patrocínio Paulista={"id":"data/BR/SP/Patrocínio Paulista","key":"Patrocínio Paulista","lang":"pt"}
+data/BR/SP/Paulicéia={"id":"data/BR/SP/Paulicéia","key":"Paulicéia","lang":"pt"}
+data/BR/SP/Paulistânia={"id":"data/BR/SP/Paulistânia","key":"Paulistânia","lang":"pt"}
+data/BR/SP/Paulo de Faria={"id":"data/BR/SP/Paulo de Faria","key":"Paulo de Faria","lang":"pt"}
+data/BR/SP/Paulínia={"id":"data/BR/SP/Paulínia","key":"Paulínia","lang":"pt"}
+data/BR/SP/Pederneiras={"id":"data/BR/SP/Pederneiras","key":"Pederneiras","lang":"pt"}
+data/BR/SP/Pedra Bela={"id":"data/BR/SP/Pedra Bela","key":"Pedra Bela","lang":"pt"}
+data/BR/SP/Pedranópolis={"id":"data/BR/SP/Pedranópolis","key":"Pedranópolis","lang":"pt"}
+data/BR/SP/Pedregulho={"id":"data/BR/SP/Pedregulho","key":"Pedregulho","lang":"pt"}
+data/BR/SP/Pedreira={"id":"data/BR/SP/Pedreira","key":"Pedreira","lang":"pt"}
+data/BR/SP/Pedrinhas Paulista={"id":"data/BR/SP/Pedrinhas Paulista","key":"Pedrinhas Paulista","lang":"pt"}
+data/BR/SP/Pedro de Toledo={"id":"data/BR/SP/Pedro de Toledo","key":"Pedro de Toledo","lang":"pt"}
+data/BR/SP/Penápolis={"id":"data/BR/SP/Penápolis","key":"Penápolis","lang":"pt"}
+data/BR/SP/Pereira Barreto={"id":"data/BR/SP/Pereira Barreto","key":"Pereira Barreto","lang":"pt"}
+data/BR/SP/Pereiras={"id":"data/BR/SP/Pereiras","key":"Pereiras","lang":"pt"}
+data/BR/SP/Peruíbe={"id":"data/BR/SP/Peruíbe","key":"Peruíbe","lang":"pt"}
+data/BR/SP/Piacatu={"id":"data/BR/SP/Piacatu","key":"Piacatu","lang":"pt"}
+data/BR/SP/Piedade={"id":"data/BR/SP/Piedade","key":"Piedade","lang":"pt"}
+data/BR/SP/Pilar do Sul={"id":"data/BR/SP/Pilar do Sul","key":"Pilar do Sul","lang":"pt"}
+data/BR/SP/Pindamonhangaba={"id":"data/BR/SP/Pindamonhangaba","key":"Pindamonhangaba","lang":"pt"}
+data/BR/SP/Pindorama={"id":"data/BR/SP/Pindorama","key":"Pindorama","lang":"pt"}
+data/BR/SP/Pinhalzinho={"id":"data/BR/SP/Pinhalzinho","key":"Pinhalzinho","lang":"pt"}
+data/BR/SP/Piquerobi={"id":"data/BR/SP/Piquerobi","key":"Piquerobi","lang":"pt"}
+data/BR/SP/Piquete={"id":"data/BR/SP/Piquete","key":"Piquete","lang":"pt"}
+data/BR/SP/Piracaia={"id":"data/BR/SP/Piracaia","key":"Piracaia","lang":"pt"}
+data/BR/SP/Piracicaba={"id":"data/BR/SP/Piracicaba","key":"Piracicaba","lang":"pt"}
+data/BR/SP/Piraju={"id":"data/BR/SP/Piraju","key":"Piraju","lang":"pt"}
+data/BR/SP/Pirajuí={"id":"data/BR/SP/Pirajuí","key":"Pirajuí","lang":"pt"}
+data/BR/SP/Pirangi={"id":"data/BR/SP/Pirangi","key":"Pirangi","lang":"pt"}
+data/BR/SP/Pirapora do Bom Jesus={"id":"data/BR/SP/Pirapora do Bom Jesus","key":"Pirapora do Bom Jesus","lang":"pt"}
+data/BR/SP/Pirapozinho={"id":"data/BR/SP/Pirapozinho","key":"Pirapozinho","lang":"pt"}
+data/BR/SP/Pirassununga={"id":"data/BR/SP/Pirassununga","key":"Pirassununga","lang":"pt"}
+data/BR/SP/Piratininga={"id":"data/BR/SP/Piratininga","key":"Piratininga","lang":"pt"}
+data/BR/SP/Pitangueiras={"id":"data/BR/SP/Pitangueiras","key":"Pitangueiras","lang":"pt"}
+data/BR/SP/Planalto={"id":"data/BR/SP/Planalto","key":"Planalto","lang":"pt"}
+data/BR/SP/Platina={"id":"data/BR/SP/Platina","key":"Platina","lang":"pt"}
+data/BR/SP/Poa={"id":"data/BR/SP/Poa","key":"Poa","lang":"pt"}
+data/BR/SP/Poloni={"id":"data/BR/SP/Poloni","key":"Poloni","lang":"pt"}
+data/BR/SP/Pompéia={"id":"data/BR/SP/Pompéia","key":"Pompéia","lang":"pt"}
+data/BR/SP/Pongaí={"id":"data/BR/SP/Pongaí","key":"Pongaí","lang":"pt"}
+data/BR/SP/Pontal={"id":"data/BR/SP/Pontal","key":"Pontal","lang":"pt"}
+data/BR/SP/Pontalinda={"id":"data/BR/SP/Pontalinda","key":"Pontalinda","lang":"pt"}
+data/BR/SP/Pontes Gestal={"id":"data/BR/SP/Pontes Gestal","key":"Pontes Gestal","lang":"pt"}
+data/BR/SP/Populina={"id":"data/BR/SP/Populina","key":"Populina","lang":"pt"}
+data/BR/SP/Porangaba={"id":"data/BR/SP/Porangaba","key":"Porangaba","lang":"pt"}
+data/BR/SP/Porto Feliz={"id":"data/BR/SP/Porto Feliz","key":"Porto Feliz","lang":"pt"}
+data/BR/SP/Porto Ferreira={"id":"data/BR/SP/Porto Ferreira","key":"Porto Ferreira","lang":"pt"}
+data/BR/SP/Potim={"id":"data/BR/SP/Potim","key":"Potim","lang":"pt"}
+data/BR/SP/Potirendaba={"id":"data/BR/SP/Potirendaba","key":"Potirendaba","lang":"pt"}
+data/BR/SP/Pracinha={"id":"data/BR/SP/Pracinha","key":"Pracinha","lang":"pt"}
+data/BR/SP/Pradópolis={"id":"data/BR/SP/Pradópolis","key":"Pradópolis","lang":"pt"}
+data/BR/SP/Praia Grande={"id":"data/BR/SP/Praia Grande","key":"Praia Grande","lang":"pt"}
+data/BR/SP/Pratânia={"id":"data/BR/SP/Pratânia","key":"Pratânia","lang":"pt"}
+data/BR/SP/Presidente Alves={"id":"data/BR/SP/Presidente Alves","key":"Presidente Alves","lang":"pt"}
+data/BR/SP/Presidente Bernardes={"id":"data/BR/SP/Presidente Bernardes","key":"Presidente Bernardes","lang":"pt"}
+data/BR/SP/Presidente Epitácio={"id":"data/BR/SP/Presidente Epitácio","key":"Presidente Epitácio","lang":"pt"}
+data/BR/SP/Presidente Prudente={"id":"data/BR/SP/Presidente Prudente","key":"Presidente Prudente","lang":"pt"}
+data/BR/SP/Presidente Venceslau={"id":"data/BR/SP/Presidente Venceslau","key":"Presidente Venceslau","lang":"pt"}
+data/BR/SP/Promissão={"id":"data/BR/SP/Promissão","key":"Promissão","lang":"pt"}
+data/BR/SP/Quadra={"id":"data/BR/SP/Quadra","key":"Quadra","lang":"pt"}
+data/BR/SP/Quatá={"id":"data/BR/SP/Quatá","key":"Quatá","lang":"pt"}
+data/BR/SP/Queiroz={"id":"data/BR/SP/Queiroz","key":"Queiroz","lang":"pt"}
+data/BR/SP/Queluz={"id":"data/BR/SP/Queluz","key":"Queluz","lang":"pt"}
+data/BR/SP/Quintana={"id":"data/BR/SP/Quintana","key":"Quintana","lang":"pt"}
+data/BR/SP/Rafard={"id":"data/BR/SP/Rafard","key":"Rafard","lang":"pt"}
+data/BR/SP/Rancharia={"id":"data/BR/SP/Rancharia","key":"Rancharia","lang":"pt"}
+data/BR/SP/Redenção da Serra={"id":"data/BR/SP/Redenção da Serra","key":"Redenção da Serra","lang":"pt"}
+data/BR/SP/Regente Feijó={"id":"data/BR/SP/Regente Feijó","key":"Regente Feijó","lang":"pt"}
+data/BR/SP/Reginópolis={"id":"data/BR/SP/Reginópolis","key":"Reginópolis","lang":"pt"}
+data/BR/SP/Registro={"id":"data/BR/SP/Registro","key":"Registro","lang":"pt"}
+data/BR/SP/Restinga={"id":"data/BR/SP/Restinga","key":"Restinga","lang":"pt"}
+data/BR/SP/Ribeira={"id":"data/BR/SP/Ribeira","key":"Ribeira","lang":"pt"}
+data/BR/SP/Ribeirão Bonito={"id":"data/BR/SP/Ribeirão Bonito","key":"Ribeirão Bonito","lang":"pt"}
+data/BR/SP/Ribeirão Branco={"id":"data/BR/SP/Ribeirão Branco","key":"Ribeirão Branco","lang":"pt"}
+data/BR/SP/Ribeirão Corrente={"id":"data/BR/SP/Ribeirão Corrente","key":"Ribeirão Corrente","lang":"pt"}
+data/BR/SP/Ribeirão Grande={"id":"data/BR/SP/Ribeirão Grande","key":"Ribeirão Grande","lang":"pt"}
+data/BR/SP/Ribeirão Pires={"id":"data/BR/SP/Ribeirão Pires","key":"Ribeirão Pires","lang":"pt"}
+data/BR/SP/Ribeirão Preto={"id":"data/BR/SP/Ribeirão Preto","key":"Ribeirão Preto","lang":"pt"}
+data/BR/SP/Ribeirão do Sul={"id":"data/BR/SP/Ribeirão do Sul","key":"Ribeirão do Sul","lang":"pt"}
+data/BR/SP/Ribeirão dos Índios={"id":"data/BR/SP/Ribeirão dos Índios","key":"Ribeirão dos Índios","lang":"pt"}
+data/BR/SP/Rifaina={"id":"data/BR/SP/Rifaina","key":"Rifaina","lang":"pt"}
+data/BR/SP/Rincão={"id":"data/BR/SP/Rincão","key":"Rincão","lang":"pt"}
+data/BR/SP/Rinópolis={"id":"data/BR/SP/Rinópolis","key":"Rinópolis","lang":"pt"}
+data/BR/SP/Rio Claro={"id":"data/BR/SP/Rio Claro","key":"Rio Claro","lang":"pt"}
+data/BR/SP/Rio Grande da Serra={"id":"data/BR/SP/Rio Grande da Serra","key":"Rio Grande da Serra","lang":"pt"}
+data/BR/SP/Rio das Pedras={"id":"data/BR/SP/Rio das Pedras","key":"Rio das Pedras","lang":"pt"}
+data/BR/SP/Riolândia={"id":"data/BR/SP/Riolândia","key":"Riolândia","lang":"pt"}
+data/BR/SP/Riversul={"id":"data/BR/SP/Riversul","key":"Riversul","lang":"pt"}
+data/BR/SP/Rosana={"id":"data/BR/SP/Rosana","key":"Rosana","lang":"pt"}
+data/BR/SP/Roseira={"id":"data/BR/SP/Roseira","key":"Roseira","lang":"pt"}
+data/BR/SP/Rubinéia={"id":"data/BR/SP/Rubinéia","key":"Rubinéia","lang":"pt"}
+data/BR/SP/Rubiácea={"id":"data/BR/SP/Rubiácea","key":"Rubiácea","lang":"pt"}
+data/BR/SP/Sabino={"id":"data/BR/SP/Sabino","key":"Sabino","lang":"pt"}
+data/BR/SP/Sagres={"id":"data/BR/SP/Sagres","key":"Sagres","lang":"pt"}
+data/BR/SP/Sales={"id":"data/BR/SP/Sales","key":"Sales","lang":"pt"}
+data/BR/SP/Sales Oliveira={"id":"data/BR/SP/Sales Oliveira","key":"Sales Oliveira","lang":"pt"}
+data/BR/SP/Salesópolis={"id":"data/BR/SP/Salesópolis","key":"Salesópolis","lang":"pt"}
+data/BR/SP/Salmourão={"id":"data/BR/SP/Salmourão","key":"Salmourão","lang":"pt"}
+data/BR/SP/Saltinho={"id":"data/BR/SP/Saltinho","key":"Saltinho","lang":"pt"}
+data/BR/SP/Salto={"id":"data/BR/SP/Salto","key":"Salto","lang":"pt"}
+data/BR/SP/Salto Grande={"id":"data/BR/SP/Salto Grande","key":"Salto Grande","lang":"pt"}
+data/BR/SP/Salto de Pirapora={"id":"data/BR/SP/Salto de Pirapora","key":"Salto de Pirapora","lang":"pt"}
+data/BR/SP/Sandovalina={"id":"data/BR/SP/Sandovalina","key":"Sandovalina","lang":"pt"}
+data/BR/SP/Santa Adélia={"id":"data/BR/SP/Santa Adélia","key":"Santa Adélia","lang":"pt"}
+data/BR/SP/Santa Albertina={"id":"data/BR/SP/Santa Albertina","key":"Santa Albertina","lang":"pt"}
+data/BR/SP/Santa Branca={"id":"data/BR/SP/Santa Branca","key":"Santa Branca","lang":"pt"}
+data/BR/SP/Santa Bárbara d'Oeste={"id":"data/BR/SP/Santa Bárbara d'Oeste","key":"Santa Bárbara d'Oeste","lang":"pt"}
+data/BR/SP/Santa Clara d'Oeste={"id":"data/BR/SP/Santa Clara d'Oeste","key":"Santa Clara d'Oeste","lang":"pt"}
+data/BR/SP/Santa Cruz da Conceição={"id":"data/BR/SP/Santa Cruz da Conceição","key":"Santa Cruz da Conceição","lang":"pt"}
+data/BR/SP/Santa Cruz da Esperança={"id":"data/BR/SP/Santa Cruz da Esperança","key":"Santa Cruz da Esperança","lang":"pt"}
+data/BR/SP/Santa Cruz das Palmeiras={"id":"data/BR/SP/Santa Cruz das Palmeiras","key":"Santa Cruz das Palmeiras","lang":"pt"}
+data/BR/SP/Santa Cruz do Rio Pardo={"id":"data/BR/SP/Santa Cruz do Rio Pardo","key":"Santa Cruz do Rio Pardo","lang":"pt"}
+data/BR/SP/Santa Ernestina={"id":"data/BR/SP/Santa Ernestina","key":"Santa Ernestina","lang":"pt"}
+data/BR/SP/Santa Fé do Sul={"id":"data/BR/SP/Santa Fé do Sul","key":"Santa Fé do Sul","lang":"pt"}
+data/BR/SP/Santa Gertrudes={"id":"data/BR/SP/Santa Gertrudes","key":"Santa Gertrudes","lang":"pt"}
+data/BR/SP/Santa Isabel={"id":"data/BR/SP/Santa Isabel","key":"Santa Isabel","lang":"pt"}
+data/BR/SP/Santa Lucia={"id":"data/BR/SP/Santa Lucia","key":"Santa Lucia","lang":"pt"}
+data/BR/SP/Santa Maria da Serra={"id":"data/BR/SP/Santa Maria da Serra","key":"Santa Maria da Serra","lang":"pt"}
+data/BR/SP/Santa Mercedes={"id":"data/BR/SP/Santa Mercedes","key":"Santa Mercedes","lang":"pt"}
+data/BR/SP/Santa Rita d'Oeste={"id":"data/BR/SP/Santa Rita d'Oeste","key":"Santa Rita d'Oeste","lang":"pt"}
+data/BR/SP/Santa Rita do Passa Quatro={"id":"data/BR/SP/Santa Rita do Passa Quatro","key":"Santa Rita do Passa Quatro","lang":"pt"}
+data/BR/SP/Santa Rosa de Viterbo={"id":"data/BR/SP/Santa Rosa de Viterbo","key":"Santa Rosa de Viterbo","lang":"pt"}
+data/BR/SP/Santa Salete={"id":"data/BR/SP/Santa Salete","key":"Santa Salete","lang":"pt"}
+data/BR/SP/Santana da Ponte Pensa={"id":"data/BR/SP/Santana da Ponte Pensa","key":"Santana da Ponte Pensa","lang":"pt"}
+data/BR/SP/Santana de Parnaíba={"id":"data/BR/SP/Santana de Parnaíba","key":"Santana de Parnaíba","lang":"pt"}
+data/BR/SP/Santo Anastácio={"id":"data/BR/SP/Santo Anastácio","key":"Santo Anastácio","lang":"pt"}
+data/BR/SP/Santo André={"id":"data/BR/SP/Santo André","key":"Santo André","lang":"pt"}
+data/BR/SP/Santo Antônio da Alegria={"id":"data/BR/SP/Santo Antônio da Alegria","key":"Santo Antônio da Alegria","lang":"pt"}
+data/BR/SP/Santo Antônio de Posse={"id":"data/BR/SP/Santo Antônio de Posse","key":"Santo Antônio de Posse","lang":"pt"}
+data/BR/SP/Santo Antônio do Aracanguá={"id":"data/BR/SP/Santo Antônio do Aracanguá","key":"Santo Antônio do Aracanguá","lang":"pt"}
+data/BR/SP/Santo Antônio do Jardim={"id":"data/BR/SP/Santo Antônio do Jardim","key":"Santo Antônio do Jardim","lang":"pt"}
+data/BR/SP/Santo Antônio do Pinhal={"id":"data/BR/SP/Santo Antônio do Pinhal","key":"Santo Antônio do Pinhal","lang":"pt"}
+data/BR/SP/Santo Expedito={"id":"data/BR/SP/Santo Expedito","key":"Santo Expedito","lang":"pt"}
+data/BR/SP/Santos={"id":"data/BR/SP/Santos","key":"Santos","lang":"pt"}
+data/BR/SP/Santópolis do Aguapeí={"id":"data/BR/SP/Santópolis do Aguapeí","key":"Santópolis do Aguapeí","lang":"pt"}
+data/BR/SP/Sarapuí={"id":"data/BR/SP/Sarapuí","key":"Sarapuí","lang":"pt"}
+data/BR/SP/Sarutaiá={"id":"data/BR/SP/Sarutaiá","key":"Sarutaiá","lang":"pt"}
+data/BR/SP/Sebastianópolis do Sul={"id":"data/BR/SP/Sebastianópolis do Sul","key":"Sebastianópolis do Sul","lang":"pt"}
+data/BR/SP/Serra Azul={"id":"data/BR/SP/Serra Azul","key":"Serra Azul","lang":"pt"}
+data/BR/SP/Serra Negra={"id":"data/BR/SP/Serra Negra","key":"Serra Negra","lang":"pt"}
+data/BR/SP/Serrana={"id":"data/BR/SP/Serrana","key":"Serrana","lang":"pt"}
+data/BR/SP/Sertãozinho={"id":"data/BR/SP/Sertãozinho","key":"Sertãozinho","lang":"pt"}
+data/BR/SP/Sete Barras={"id":"data/BR/SP/Sete Barras","key":"Sete Barras","lang":"pt"}
+data/BR/SP/Severínia={"id":"data/BR/SP/Severínia","key":"Severínia","lang":"pt"}
+data/BR/SP/Silveiras={"id":"data/BR/SP/Silveiras","key":"Silveiras","lang":"pt"}
+data/BR/SP/Socorro={"id":"data/BR/SP/Socorro","key":"Socorro","lang":"pt"}
+data/BR/SP/Sorocaba={"id":"data/BR/SP/Sorocaba","key":"Sorocaba","lang":"pt"}
+data/BR/SP/Sud Mennucci={"id":"data/BR/SP/Sud Mennucci","key":"Sud Mennucci","lang":"pt"}
+data/BR/SP/Sumaré={"id":"data/BR/SP/Sumaré","key":"Sumaré","lang":"pt"}
+data/BR/SP/Suzano={"id":"data/BR/SP/Suzano","key":"Suzano","lang":"pt"}
+data/BR/SP/Suzanápolis={"id":"data/BR/SP/Suzanápolis","key":"Suzanápolis","lang":"pt"}
+data/BR/SP/São Bento do Sapucaí={"id":"data/BR/SP/São Bento do Sapucaí","key":"São Bento do Sapucaí","lang":"pt"}
+data/BR/SP/São Bernardo do Campo={"id":"data/BR/SP/São Bernardo do Campo","key":"São Bernardo do Campo","lang":"pt"}
+data/BR/SP/São Caetano do Sul={"id":"data/BR/SP/São Caetano do Sul","key":"São Caetano do Sul","lang":"pt"}
+data/BR/SP/São Carlos={"id":"data/BR/SP/São Carlos","key":"São Carlos","lang":"pt"}
+data/BR/SP/São Francisco={"id":"data/BR/SP/São Francisco","key":"São Francisco","lang":"pt"}
+data/BR/SP/São Joaquim da Barra={"id":"data/BR/SP/São Joaquim da Barra","key":"São Joaquim da Barra","lang":"pt"}
+data/BR/SP/São José da Bela Vista={"id":"data/BR/SP/São José da Bela Vista","key":"São José da Bela Vista","lang":"pt"}
+data/BR/SP/São José do Barreiro={"id":"data/BR/SP/São José do Barreiro","key":"São José do Barreiro","lang":"pt"}
+data/BR/SP/São José do Rio Pardo={"id":"data/BR/SP/São José do Rio Pardo","key":"São José do Rio Pardo","lang":"pt"}
+data/BR/SP/São José do Rio Preto={"id":"data/BR/SP/São José do Rio Preto","key":"São José do Rio Preto","lang":"pt"}
+data/BR/SP/São José dos Campos={"id":"data/BR/SP/São José dos Campos","key":"São José dos Campos","lang":"pt"}
+data/BR/SP/São João da Boa Vista={"id":"data/BR/SP/São João da Boa Vista","key":"São João da Boa Vista","lang":"pt"}
+data/BR/SP/São João das Duas Pontes={"id":"data/BR/SP/São João das Duas Pontes","key":"São João das Duas Pontes","lang":"pt"}
+data/BR/SP/São João de Iracema={"id":"data/BR/SP/São João de Iracema","key":"São João de Iracema","lang":"pt"}
+data/BR/SP/São João do Pau d'Alho={"id":"data/BR/SP/São João do Pau d'Alho","key":"São João do Pau d'Alho","lang":"pt"}
+data/BR/SP/São Lourenço da Serra={"id":"data/BR/SP/São Lourenço da Serra","key":"São Lourenço da Serra","lang":"pt"}
+data/BR/SP/São Luíz do Paraitinga={"id":"data/BR/SP/São Luíz do Paraitinga","key":"São Luíz do Paraitinga","lang":"pt"}
+data/BR/SP/São Manuel={"id":"data/BR/SP/São Manuel","key":"São Manuel","lang":"pt"}
+data/BR/SP/São Miguel Arcanjo={"id":"data/BR/SP/São Miguel Arcanjo","key":"São Miguel Arcanjo","lang":"pt"}
+data/BR/SP/São Paulo={"id":"data/BR/SP/São Paulo","key":"São Paulo","lang":"pt"}
+data/BR/SP/São Pedro={"id":"data/BR/SP/São Pedro","key":"São Pedro","lang":"pt"}
+data/BR/SP/São Pedro do Turvo={"id":"data/BR/SP/São Pedro do Turvo","key":"São Pedro do Turvo","lang":"pt"}
+data/BR/SP/São Roque={"id":"data/BR/SP/São Roque","key":"São Roque","lang":"pt"}
+data/BR/SP/São Sebastião={"id":"data/BR/SP/São Sebastião","key":"São Sebastião","lang":"pt"}
+data/BR/SP/São Sebastião da Grama={"id":"data/BR/SP/São Sebastião da Grama","key":"São Sebastião da Grama","lang":"pt"}
+data/BR/SP/São Simão={"id":"data/BR/SP/São Simão","key":"São Simão","lang":"pt"}
+data/BR/SP/São Vicente={"id":"data/BR/SP/São Vicente","key":"São Vicente","lang":"pt"}
+data/BR/SP/Tabapuã={"id":"data/BR/SP/Tabapuã","key":"Tabapuã","lang":"pt"}
+data/BR/SP/Tabatinga={"id":"data/BR/SP/Tabatinga","key":"Tabatinga","lang":"pt"}
+data/BR/SP/Taboão da Serra={"id":"data/BR/SP/Taboão da Serra","key":"Taboão da Serra","lang":"pt"}
+data/BR/SP/Taciba={"id":"data/BR/SP/Taciba","key":"Taciba","lang":"pt"}
+data/BR/SP/Taguaí={"id":"data/BR/SP/Taguaí","key":"Taguaí","lang":"pt"}
+data/BR/SP/Taiaçu={"id":"data/BR/SP/Taiaçu","key":"Taiaçu","lang":"pt"}
+data/BR/SP/Taiúva={"id":"data/BR/SP/Taiúva","key":"Taiúva","lang":"pt"}
+data/BR/SP/Tambaú={"id":"data/BR/SP/Tambaú","key":"Tambaú","lang":"pt"}
+data/BR/SP/Tanabi={"id":"data/BR/SP/Tanabi","key":"Tanabi","lang":"pt"}
+data/BR/SP/Tapiratiba={"id":"data/BR/SP/Tapiratiba","key":"Tapiratiba","lang":"pt"}
+data/BR/SP/Tapiraí={"id":"data/BR/SP/Tapiraí","key":"Tapiraí","lang":"pt"}
+data/BR/SP/Taquaral={"id":"data/BR/SP/Taquaral","key":"Taquaral","lang":"pt"}
+data/BR/SP/Taquaritinga={"id":"data/BR/SP/Taquaritinga","key":"Taquaritinga","lang":"pt"}
+data/BR/SP/Taquarituba={"id":"data/BR/SP/Taquarituba","key":"Taquarituba","lang":"pt"}
+data/BR/SP/Taquarivaí={"id":"data/BR/SP/Taquarivaí","key":"Taquarivaí","lang":"pt"}
+data/BR/SP/Tarabai={"id":"data/BR/SP/Tarabai","key":"Tarabai","lang":"pt"}
+data/BR/SP/Tarumã={"id":"data/BR/SP/Tarumã","key":"Tarumã","lang":"pt"}
+data/BR/SP/Tatuí={"id":"data/BR/SP/Tatuí","key":"Tatuí","lang":"pt"}
+data/BR/SP/Taubaté={"id":"data/BR/SP/Taubaté","key":"Taubaté","lang":"pt"}
+data/BR/SP/Tejupá={"id":"data/BR/SP/Tejupá","key":"Tejupá","lang":"pt"}
+data/BR/SP/Teodoro Sampaio={"id":"data/BR/SP/Teodoro Sampaio","key":"Teodoro Sampaio","lang":"pt"}
+data/BR/SP/Terra Roxa={"id":"data/BR/SP/Terra Roxa","key":"Terra Roxa","lang":"pt"}
+data/BR/SP/Tietê={"id":"data/BR/SP/Tietê","key":"Tietê","lang":"pt"}
+data/BR/SP/Timburi={"id":"data/BR/SP/Timburi","key":"Timburi","lang":"pt"}
+data/BR/SP/Torre de Pedra={"id":"data/BR/SP/Torre de Pedra","key":"Torre de Pedra","lang":"pt"}
+data/BR/SP/Torrinha={"id":"data/BR/SP/Torrinha","key":"Torrinha","lang":"pt"}
+data/BR/SP/Trabiju={"id":"data/BR/SP/Trabiju","key":"Trabiju","lang":"pt"}
+data/BR/SP/Tremembé={"id":"data/BR/SP/Tremembé","key":"Tremembé","lang":"pt"}
+data/BR/SP/Três Fronteiras={"id":"data/BR/SP/Três Fronteiras","key":"Três Fronteiras","lang":"pt"}
+data/BR/SP/Tuiuti={"id":"data/BR/SP/Tuiuti","key":"Tuiuti","lang":"pt"}
+data/BR/SP/Tupi Paulista={"id":"data/BR/SP/Tupi Paulista","key":"Tupi Paulista","lang":"pt"}
+data/BR/SP/Tupã={"id":"data/BR/SP/Tupã","key":"Tupã","lang":"pt"}
+data/BR/SP/Turiúba={"id":"data/BR/SP/Turiúba","key":"Turiúba","lang":"pt"}
+data/BR/SP/Turmalina={"id":"data/BR/SP/Turmalina","key":"Turmalina","lang":"pt"}
+data/BR/SP/Ubarana={"id":"data/BR/SP/Ubarana","key":"Ubarana","lang":"pt"}
+data/BR/SP/Ubatuba={"id":"data/BR/SP/Ubatuba","key":"Ubatuba","lang":"pt"}
+data/BR/SP/Ubirajara={"id":"data/BR/SP/Ubirajara","key":"Ubirajara","lang":"pt"}
+data/BR/SP/Uchoa={"id":"data/BR/SP/Uchoa","key":"Uchoa","lang":"pt"}
+data/BR/SP/União Paulista={"id":"data/BR/SP/União Paulista","key":"União Paulista","lang":"pt"}
+data/BR/SP/Uru={"id":"data/BR/SP/Uru","key":"Uru","lang":"pt"}
+data/BR/SP/Urupês={"id":"data/BR/SP/Urupês","key":"Urupês","lang":"pt"}
+data/BR/SP/Urânia={"id":"data/BR/SP/Urânia","key":"Urânia","lang":"pt"}
+data/BR/SP/Valentim Gentil={"id":"data/BR/SP/Valentim Gentil","key":"Valentim Gentil","lang":"pt"}
+data/BR/SP/Valinhos={"id":"data/BR/SP/Valinhos","key":"Valinhos","lang":"pt"}
+data/BR/SP/Valparaíso={"id":"data/BR/SP/Valparaíso","key":"Valparaíso","lang":"pt"}
+data/BR/SP/Vargem={"id":"data/BR/SP/Vargem","key":"Vargem","lang":"pt"}
+data/BR/SP/Vargem Grande Paulista={"id":"data/BR/SP/Vargem Grande Paulista","key":"Vargem Grande Paulista","lang":"pt"}
+data/BR/SP/Vargem Grande do Sul={"id":"data/BR/SP/Vargem Grande do Sul","key":"Vargem Grande do Sul","lang":"pt"}
+data/BR/SP/Vera Cruz={"id":"data/BR/SP/Vera Cruz","key":"Vera Cruz","lang":"pt"}
+data/BR/SP/Vinhedo={"id":"data/BR/SP/Vinhedo","key":"Vinhedo","lang":"pt"}
+data/BR/SP/Viradouro={"id":"data/BR/SP/Viradouro","key":"Viradouro","lang":"pt"}
+data/BR/SP/Vista Alegre do Alto={"id":"data/BR/SP/Vista Alegre do Alto","key":"Vista Alegre do Alto","lang":"pt"}
+data/BR/SP/Vitória Brasil={"id":"data/BR/SP/Vitória Brasil","key":"Vitória Brasil","lang":"pt"}
+data/BR/SP/Votorantim={"id":"data/BR/SP/Votorantim","key":"Votorantim","lang":"pt"}
+data/BR/SP/Votuporanga={"id":"data/BR/SP/Votuporanga","key":"Votuporanga","lang":"pt"}
+data/BR/SP/Várzea Paulista={"id":"data/BR/SP/Várzea Paulista","key":"Várzea Paulista","lang":"pt"}
+data/BR/SP/Zacarias={"id":"data/BR/SP/Zacarias","key":"Zacarias","lang":"pt"}
+data/BR/SP/Águas da Prata={"id":"data/BR/SP/Águas da Prata","key":"Águas da Prata","lang":"pt"}
+data/BR/SP/Águas de Lindóia={"id":"data/BR/SP/Águas de Lindóia","key":"Águas de Lindóia","lang":"pt"}
+data/BR/SP/Águas de Santa Bárbara={"id":"data/BR/SP/Águas de Santa Bárbara","key":"Águas de Santa Bárbara","lang":"pt"}
+data/BR/SP/Águas de São Pedro={"id":"data/BR/SP/Águas de São Pedro","key":"Águas de São Pedro","lang":"pt"}
+data/BR/SP/Álvares Florence={"id":"data/BR/SP/Álvares Florence","key":"Álvares Florence","lang":"pt"}
+data/BR/SP/Álvares Machado={"id":"data/BR/SP/Álvares Machado","key":"Álvares Machado","lang":"pt"}
+data/BR/SP/Álvaro de Carvalho={"id":"data/BR/SP/Álvaro de Carvalho","key":"Álvaro de Carvalho","lang":"pt"}
+data/BR/TO={"id":"data/BR/TO","key":"TO","name":"Tocantins","lang":"pt","zip":"77","zipex":"77000-000,77999-999","sub_keys":"Abreulândia~Aguiarnópolis~Aliança do Tocantins~Almas~Alvorada~Ananas~Angico~Aparecida do Rio Negro~Aragominas~Araguacema~Araguaçu~Araguaína~Araguanã~Araguatins~Arapoema~Arraias~Augustinópolis~Aurora do Tocantins~Axixá do Tocantins~Babaçulândia~Bandeirantes do Tocantins~Barra do Ouro~Barrolândia~Bernardo Sayão~Bom Jesus do Tocantins~Brasilândia do Tocantins~Brejinho de Nazaré~Buriti do Tocantins~Cachoeirinha~Campos Lindos~Cariri do Tocantins~Carmolândia~Carrasco Bonito~Caseara~Centenário~Chapada da Natividade~Chapada de Areia~Colinas do Tocantins~Colméia~Combinado~Conceição do Tocantins~Couto de Magalhães~Cristalândia~Crixás do Tocantins~Darcinópolis~Dianópolis~Divinópolis do Tocantins~Dois Irmãos do Tocantins~Dueré~Esperantina~Fátima~Figueirópolis~Filadelfia~Formoso do Araguaia~Fortaleza do Tabocão~Goianorte~Goiatins~Guaraí~Gurupi~Ipueiras~Itacajá~Itaguatins~Itapiratins~Itaporã do Tocantins~Jaú do Tocantins~Juarina~Lagoa da Confusão~Lagoa do Tocantins~Lajeado~Lavandeira~Lizarda~Luzinópolis~Marianópolis do Tocantins~Mateiros~Maurilândia do Tocantins~Miracema do Tocantins~Miranorte~Monte do Carmo~Monte Santo do Tocantins~Muricilândia~Natividade~Nazaré~Nova Olinda~Nova Rosalândia~Novo Acordo~Novo Alegre~Novo Jardim~Oliveira de Fátima~Palmas~Palmeirante~Palmeiras do Tocantins~Palmeirópolis~Paraíso do Tocantins~Paraná~Pau D'Arco~Pedro Afonso~Peixe~Pequizeiro~Pindorama do Tocantins~Piraquê~Pium~Ponte Alta do Bom Jesus~Ponte Alta do Tocantins~Porto Alegre do Tocantins~Porto Nacional~Praia Norte~Presidente Kennedy~Pugmil~Recursolândia~Riachinho~Rio da Conceição~Rio dos Bois~Rio Sono~Sampaio~Sandolândia~Santa Fé do Araguaia~Santa Maria do Tocantins~Santa Rita do Tocantins~Santa Rosa do Tocantins~Santa Tereza do Tocantins~Santa Terezinha do Tocantins~São Bento do Tocantins~São Félix do Tocantins~São Miguel do Tocantins~São Salvador do Tocantins~São Sebastião do Tocantins~São Valério da Natividade~Silvanópolis~Sítio Novo do Tocantins~Sucupira~Taguatinga~Taipas do Tocantins~Talisma~Tocantínia~Tocantinópolis~Tupirama~Tupiratins~Wanderlândia~Xambioá"}
+data/BR/TO/Abreulândia={"id":"data/BR/TO/Abreulândia","key":"Abreulândia","lang":"pt"}
+data/BR/TO/Aguiarnópolis={"id":"data/BR/TO/Aguiarnópolis","key":"Aguiarnópolis","lang":"pt"}
+data/BR/TO/Aliança do Tocantins={"id":"data/BR/TO/Aliança do Tocantins","key":"Aliança do Tocantins","lang":"pt"}
+data/BR/TO/Almas={"id":"data/BR/TO/Almas","key":"Almas","lang":"pt"}
+data/BR/TO/Alvorada={"id":"data/BR/TO/Alvorada","key":"Alvorada","lang":"pt"}
+data/BR/TO/Ananas={"id":"data/BR/TO/Ananas","key":"Ananas","lang":"pt"}
+data/BR/TO/Angico={"id":"data/BR/TO/Angico","key":"Angico","lang":"pt"}
+data/BR/TO/Aparecida do Rio Negro={"id":"data/BR/TO/Aparecida do Rio Negro","key":"Aparecida do Rio Negro","lang":"pt"}
+data/BR/TO/Aragominas={"id":"data/BR/TO/Aragominas","key":"Aragominas","lang":"pt"}
+data/BR/TO/Araguacema={"id":"data/BR/TO/Araguacema","key":"Araguacema","lang":"pt"}
+data/BR/TO/Araguanã={"id":"data/BR/TO/Araguanã","key":"Araguanã","lang":"pt"}
+data/BR/TO/Araguatins={"id":"data/BR/TO/Araguatins","key":"Araguatins","lang":"pt"}
+data/BR/TO/Araguaçu={"id":"data/BR/TO/Araguaçu","key":"Araguaçu","lang":"pt"}
+data/BR/TO/Araguaína={"id":"data/BR/TO/Araguaína","key":"Araguaína","lang":"pt"}
+data/BR/TO/Arapoema={"id":"data/BR/TO/Arapoema","key":"Arapoema","lang":"pt"}
+data/BR/TO/Arraias={"id":"data/BR/TO/Arraias","key":"Arraias","lang":"pt"}
+data/BR/TO/Augustinópolis={"id":"data/BR/TO/Augustinópolis","key":"Augustinópolis","lang":"pt"}
+data/BR/TO/Aurora do Tocantins={"id":"data/BR/TO/Aurora do Tocantins","key":"Aurora do Tocantins","lang":"pt"}
+data/BR/TO/Axixá do Tocantins={"id":"data/BR/TO/Axixá do Tocantins","key":"Axixá do Tocantins","lang":"pt"}
+data/BR/TO/Babaçulândia={"id":"data/BR/TO/Babaçulândia","key":"Babaçulândia","lang":"pt"}
+data/BR/TO/Bandeirantes do Tocantins={"id":"data/BR/TO/Bandeirantes do Tocantins","key":"Bandeirantes do Tocantins","lang":"pt"}
+data/BR/TO/Barra do Ouro={"id":"data/BR/TO/Barra do Ouro","key":"Barra do Ouro","lang":"pt"}
+data/BR/TO/Barrolândia={"id":"data/BR/TO/Barrolândia","key":"Barrolândia","lang":"pt"}
+data/BR/TO/Bernardo Sayão={"id":"data/BR/TO/Bernardo Sayão","key":"Bernardo Sayão","lang":"pt"}
+data/BR/TO/Bom Jesus do Tocantins={"id":"data/BR/TO/Bom Jesus do Tocantins","key":"Bom Jesus do Tocantins","lang":"pt"}
+data/BR/TO/Brasilândia do Tocantins={"id":"data/BR/TO/Brasilândia do Tocantins","key":"Brasilândia do Tocantins","lang":"pt"}
+data/BR/TO/Brejinho de Nazaré={"id":"data/BR/TO/Brejinho de Nazaré","key":"Brejinho de Nazaré","lang":"pt"}
+data/BR/TO/Buriti do Tocantins={"id":"data/BR/TO/Buriti do Tocantins","key":"Buriti do Tocantins","lang":"pt"}
+data/BR/TO/Cachoeirinha={"id":"data/BR/TO/Cachoeirinha","key":"Cachoeirinha","lang":"pt"}
+data/BR/TO/Campos Lindos={"id":"data/BR/TO/Campos Lindos","key":"Campos Lindos","lang":"pt"}
+data/BR/TO/Cariri do Tocantins={"id":"data/BR/TO/Cariri do Tocantins","key":"Cariri do Tocantins","lang":"pt"}
+data/BR/TO/Carmolândia={"id":"data/BR/TO/Carmolândia","key":"Carmolândia","lang":"pt"}
+data/BR/TO/Carrasco Bonito={"id":"data/BR/TO/Carrasco Bonito","key":"Carrasco Bonito","lang":"pt"}
+data/BR/TO/Caseara={"id":"data/BR/TO/Caseara","key":"Caseara","lang":"pt"}
+data/BR/TO/Centenário={"id":"data/BR/TO/Centenário","key":"Centenário","lang":"pt"}
+data/BR/TO/Chapada da Natividade={"id":"data/BR/TO/Chapada da Natividade","key":"Chapada da Natividade","lang":"pt"}
+data/BR/TO/Chapada de Areia={"id":"data/BR/TO/Chapada de Areia","key":"Chapada de Areia","lang":"pt"}
+data/BR/TO/Colinas do Tocantins={"id":"data/BR/TO/Colinas do Tocantins","key":"Colinas do Tocantins","lang":"pt"}
+data/BR/TO/Colméia={"id":"data/BR/TO/Colméia","key":"Colméia","lang":"pt"}
+data/BR/TO/Combinado={"id":"data/BR/TO/Combinado","key":"Combinado","lang":"pt"}
+data/BR/TO/Conceição do Tocantins={"id":"data/BR/TO/Conceição do Tocantins","key":"Conceição do Tocantins","lang":"pt"}
+data/BR/TO/Couto de Magalhães={"id":"data/BR/TO/Couto de Magalhães","key":"Couto de Magalhães","lang":"pt"}
+data/BR/TO/Cristalândia={"id":"data/BR/TO/Cristalândia","key":"Cristalândia","lang":"pt"}
+data/BR/TO/Crixás do Tocantins={"id":"data/BR/TO/Crixás do Tocantins","key":"Crixás do Tocantins","lang":"pt"}
+data/BR/TO/Darcinópolis={"id":"data/BR/TO/Darcinópolis","key":"Darcinópolis","lang":"pt"}
+data/BR/TO/Dianópolis={"id":"data/BR/TO/Dianópolis","key":"Dianópolis","lang":"pt"}
+data/BR/TO/Divinópolis do Tocantins={"id":"data/BR/TO/Divinópolis do Tocantins","key":"Divinópolis do Tocantins","lang":"pt"}
+data/BR/TO/Dois Irmãos do Tocantins={"id":"data/BR/TO/Dois Irmãos do Tocantins","key":"Dois Irmãos do Tocantins","lang":"pt"}
+data/BR/TO/Dueré={"id":"data/BR/TO/Dueré","key":"Dueré","lang":"pt"}
+data/BR/TO/Esperantina={"id":"data/BR/TO/Esperantina","key":"Esperantina","lang":"pt"}
+data/BR/TO/Figueirópolis={"id":"data/BR/TO/Figueirópolis","key":"Figueirópolis","lang":"pt"}
+data/BR/TO/Filadelfia={"id":"data/BR/TO/Filadelfia","key":"Filadelfia","lang":"pt"}
+data/BR/TO/Formoso do Araguaia={"id":"data/BR/TO/Formoso do Araguaia","key":"Formoso do Araguaia","lang":"pt"}
+data/BR/TO/Fortaleza do Tabocão={"id":"data/BR/TO/Fortaleza do Tabocão","key":"Fortaleza do Tabocão","lang":"pt"}
+data/BR/TO/Fátima={"id":"data/BR/TO/Fátima","key":"Fátima","lang":"pt"}
+data/BR/TO/Goianorte={"id":"data/BR/TO/Goianorte","key":"Goianorte","lang":"pt"}
+data/BR/TO/Goiatins={"id":"data/BR/TO/Goiatins","key":"Goiatins","lang":"pt"}
+data/BR/TO/Guaraí={"id":"data/BR/TO/Guaraí","key":"Guaraí","lang":"pt"}
+data/BR/TO/Gurupi={"id":"data/BR/TO/Gurupi","key":"Gurupi","lang":"pt"}
+data/BR/TO/Ipueiras={"id":"data/BR/TO/Ipueiras","key":"Ipueiras","lang":"pt"}
+data/BR/TO/Itacajá={"id":"data/BR/TO/Itacajá","key":"Itacajá","lang":"pt"}
+data/BR/TO/Itaguatins={"id":"data/BR/TO/Itaguatins","key":"Itaguatins","lang":"pt"}
+data/BR/TO/Itapiratins={"id":"data/BR/TO/Itapiratins","key":"Itapiratins","lang":"pt"}
+data/BR/TO/Itaporã do Tocantins={"id":"data/BR/TO/Itaporã do Tocantins","key":"Itaporã do Tocantins","lang":"pt"}
+data/BR/TO/Jaú do Tocantins={"id":"data/BR/TO/Jaú do Tocantins","key":"Jaú do Tocantins","lang":"pt"}
+data/BR/TO/Juarina={"id":"data/BR/TO/Juarina","key":"Juarina","lang":"pt"}
+data/BR/TO/Lagoa da Confusão={"id":"data/BR/TO/Lagoa da Confusão","key":"Lagoa da Confusão","lang":"pt"}
+data/BR/TO/Lagoa do Tocantins={"id":"data/BR/TO/Lagoa do Tocantins","key":"Lagoa do Tocantins","lang":"pt"}
+data/BR/TO/Lajeado={"id":"data/BR/TO/Lajeado","key":"Lajeado","lang":"pt"}
+data/BR/TO/Lavandeira={"id":"data/BR/TO/Lavandeira","key":"Lavandeira","lang":"pt"}
+data/BR/TO/Lizarda={"id":"data/BR/TO/Lizarda","key":"Lizarda","lang":"pt"}
+data/BR/TO/Luzinópolis={"id":"data/BR/TO/Luzinópolis","key":"Luzinópolis","lang":"pt"}
+data/BR/TO/Marianópolis do Tocantins={"id":"data/BR/TO/Marianópolis do Tocantins","key":"Marianópolis do Tocantins","lang":"pt"}
+data/BR/TO/Mateiros={"id":"data/BR/TO/Mateiros","key":"Mateiros","lang":"pt"}
+data/BR/TO/Maurilândia do Tocantins={"id":"data/BR/TO/Maurilândia do Tocantins","key":"Maurilândia do Tocantins","lang":"pt"}
+data/BR/TO/Miracema do Tocantins={"id":"data/BR/TO/Miracema do Tocantins","key":"Miracema do Tocantins","lang":"pt"}
+data/BR/TO/Miranorte={"id":"data/BR/TO/Miranorte","key":"Miranorte","lang":"pt"}
+data/BR/TO/Monte Santo do Tocantins={"id":"data/BR/TO/Monte Santo do Tocantins","key":"Monte Santo do Tocantins","lang":"pt"}
+data/BR/TO/Monte do Carmo={"id":"data/BR/TO/Monte do Carmo","key":"Monte do Carmo","lang":"pt"}
+data/BR/TO/Muricilândia={"id":"data/BR/TO/Muricilândia","key":"Muricilândia","lang":"pt"}
+data/BR/TO/Natividade={"id":"data/BR/TO/Natividade","key":"Natividade","lang":"pt"}
+data/BR/TO/Nazaré={"id":"data/BR/TO/Nazaré","key":"Nazaré","lang":"pt"}
+data/BR/TO/Nova Olinda={"id":"data/BR/TO/Nova Olinda","key":"Nova Olinda","lang":"pt"}
+data/BR/TO/Nova Rosalândia={"id":"data/BR/TO/Nova Rosalândia","key":"Nova Rosalândia","lang":"pt"}
+data/BR/TO/Novo Acordo={"id":"data/BR/TO/Novo Acordo","key":"Novo Acordo","lang":"pt"}
+data/BR/TO/Novo Alegre={"id":"data/BR/TO/Novo Alegre","key":"Novo Alegre","lang":"pt"}
+data/BR/TO/Novo Jardim={"id":"data/BR/TO/Novo Jardim","key":"Novo Jardim","lang":"pt"}
+data/BR/TO/Oliveira de Fátima={"id":"data/BR/TO/Oliveira de Fátima","key":"Oliveira de Fátima","lang":"pt"}
+data/BR/TO/Palmas={"id":"data/BR/TO/Palmas","key":"Palmas","lang":"pt"}
+data/BR/TO/Palmeirante={"id":"data/BR/TO/Palmeirante","key":"Palmeirante","lang":"pt"}
+data/BR/TO/Palmeiras do Tocantins={"id":"data/BR/TO/Palmeiras do Tocantins","key":"Palmeiras do Tocantins","lang":"pt"}
+data/BR/TO/Palmeirópolis={"id":"data/BR/TO/Palmeirópolis","key":"Palmeirópolis","lang":"pt"}
+data/BR/TO/Paraná={"id":"data/BR/TO/Paraná","key":"Paraná","lang":"pt"}
+data/BR/TO/Paraíso do Tocantins={"id":"data/BR/TO/Paraíso do Tocantins","key":"Paraíso do Tocantins","lang":"pt"}
+data/BR/TO/Pau D'Arco={"id":"data/BR/TO/Pau D'Arco","key":"Pau D'Arco","lang":"pt"}
+data/BR/TO/Pedro Afonso={"id":"data/BR/TO/Pedro Afonso","key":"Pedro Afonso","lang":"pt"}
+data/BR/TO/Peixe={"id":"data/BR/TO/Peixe","key":"Peixe","lang":"pt"}
+data/BR/TO/Pequizeiro={"id":"data/BR/TO/Pequizeiro","key":"Pequizeiro","lang":"pt"}
+data/BR/TO/Pindorama do Tocantins={"id":"data/BR/TO/Pindorama do Tocantins","key":"Pindorama do Tocantins","lang":"pt"}
+data/BR/TO/Piraquê={"id":"data/BR/TO/Piraquê","key":"Piraquê","lang":"pt"}
+data/BR/TO/Pium={"id":"data/BR/TO/Pium","key":"Pium","lang":"pt"}
+data/BR/TO/Ponte Alta do Bom Jesus={"id":"data/BR/TO/Ponte Alta do Bom Jesus","key":"Ponte Alta do Bom Jesus","lang":"pt"}
+data/BR/TO/Ponte Alta do Tocantins={"id":"data/BR/TO/Ponte Alta do Tocantins","key":"Ponte Alta do Tocantins","lang":"pt"}
+data/BR/TO/Porto Alegre do Tocantins={"id":"data/BR/TO/Porto Alegre do Tocantins","key":"Porto Alegre do Tocantins","lang":"pt"}
+data/BR/TO/Porto Nacional={"id":"data/BR/TO/Porto Nacional","key":"Porto Nacional","lang":"pt"}
+data/BR/TO/Praia Norte={"id":"data/BR/TO/Praia Norte","key":"Praia Norte","lang":"pt"}
+data/BR/TO/Presidente Kennedy={"id":"data/BR/TO/Presidente Kennedy","key":"Presidente Kennedy","lang":"pt"}
+data/BR/TO/Pugmil={"id":"data/BR/TO/Pugmil","key":"Pugmil","lang":"pt"}
+data/BR/TO/Recursolândia={"id":"data/BR/TO/Recursolândia","key":"Recursolândia","lang":"pt"}
+data/BR/TO/Riachinho={"id":"data/BR/TO/Riachinho","key":"Riachinho","lang":"pt"}
+data/BR/TO/Rio Sono={"id":"data/BR/TO/Rio Sono","key":"Rio Sono","lang":"pt"}
+data/BR/TO/Rio da Conceição={"id":"data/BR/TO/Rio da Conceição","key":"Rio da Conceição","lang":"pt"}
+data/BR/TO/Rio dos Bois={"id":"data/BR/TO/Rio dos Bois","key":"Rio dos Bois","lang":"pt"}
+data/BR/TO/Sampaio={"id":"data/BR/TO/Sampaio","key":"Sampaio","lang":"pt"}
+data/BR/TO/Sandolândia={"id":"data/BR/TO/Sandolândia","key":"Sandolândia","lang":"pt"}
+data/BR/TO/Santa Fé do Araguaia={"id":"data/BR/TO/Santa Fé do Araguaia","key":"Santa Fé do Araguaia","lang":"pt"}
+data/BR/TO/Santa Maria do Tocantins={"id":"data/BR/TO/Santa Maria do Tocantins","key":"Santa Maria do Tocantins","lang":"pt"}
+data/BR/TO/Santa Rita do Tocantins={"id":"data/BR/TO/Santa Rita do Tocantins","key":"Santa Rita do Tocantins","lang":"pt"}
+data/BR/TO/Santa Rosa do Tocantins={"id":"data/BR/TO/Santa Rosa do Tocantins","key":"Santa Rosa do Tocantins","lang":"pt"}
+data/BR/TO/Santa Tereza do Tocantins={"id":"data/BR/TO/Santa Tereza do Tocantins","key":"Santa Tereza do Tocantins","lang":"pt"}
+data/BR/TO/Santa Terezinha do Tocantins={"id":"data/BR/TO/Santa Terezinha do Tocantins","key":"Santa Terezinha do Tocantins","lang":"pt"}
+data/BR/TO/Silvanópolis={"id":"data/BR/TO/Silvanópolis","key":"Silvanópolis","lang":"pt"}
+data/BR/TO/Sucupira={"id":"data/BR/TO/Sucupira","key":"Sucupira","lang":"pt"}
+data/BR/TO/São Bento do Tocantins={"id":"data/BR/TO/São Bento do Tocantins","key":"São Bento do Tocantins","lang":"pt"}
+data/BR/TO/São Félix do Tocantins={"id":"data/BR/TO/São Félix do Tocantins","key":"São Félix do Tocantins","lang":"pt"}
+data/BR/TO/São Miguel do Tocantins={"id":"data/BR/TO/São Miguel do Tocantins","key":"São Miguel do Tocantins","lang":"pt"}
+data/BR/TO/São Salvador do Tocantins={"id":"data/BR/TO/São Salvador do Tocantins","key":"São Salvador do Tocantins","lang":"pt"}
+data/BR/TO/São Sebastião do Tocantins={"id":"data/BR/TO/São Sebastião do Tocantins","key":"São Sebastião do Tocantins","lang":"pt"}
+data/BR/TO/São Valério da Natividade={"id":"data/BR/TO/São Valério da Natividade","key":"São Valério da Natividade","lang":"pt"}
+data/BR/TO/Sítio Novo do Tocantins={"id":"data/BR/TO/Sítio Novo do Tocantins","key":"Sítio Novo do Tocantins","lang":"pt"}
+data/BR/TO/Taguatinga={"id":"data/BR/TO/Taguatinga","key":"Taguatinga","lang":"pt"}
+data/BR/TO/Taipas do Tocantins={"id":"data/BR/TO/Taipas do Tocantins","key":"Taipas do Tocantins","lang":"pt"}
+data/BR/TO/Talisma={"id":"data/BR/TO/Talisma","key":"Talisma","lang":"pt"}
+data/BR/TO/Tocantinópolis={"id":"data/BR/TO/Tocantinópolis","key":"Tocantinópolis","lang":"pt"}
+data/BR/TO/Tocantínia={"id":"data/BR/TO/Tocantínia","key":"Tocantínia","lang":"pt"}
+data/BR/TO/Tupirama={"id":"data/BR/TO/Tupirama","key":"Tupirama","lang":"pt"}
+data/BR/TO/Tupiratins={"id":"data/BR/TO/Tupiratins","key":"Tupiratins","lang":"pt"}
+data/BR/TO/Wanderlândia={"id":"data/BR/TO/Wanderlândia","key":"Wanderlândia","lang":"pt"}
+data/BR/TO/Xambioá={"id":"data/BR/TO/Xambioá","key":"Xambioá","lang":"pt"}
+data/BS={"id":"data/BS","key":"BS","name":"BAHAMAS","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C, %S","state_name_type":"island","sub_keys":"ABACO~ACKLINS~ANDROS~BERRY ISLANDS~BIMINI~CAT ISLAND~CROOKED ISLAND~ELEUTHERA~EXUMA~GRAND BAHAMA~HARBOUR ISLAND~INAGUA~LONG ISLAND~MAYAGUANA~N.P.~RAGGED ISLAND~RUM CAY~SAN SALVADOR~SPANISH WELLS","sub_names":"Abaco Islands~Acklins~Andros Island~Berry Islands~Bimini~Cat Island~Crooked Island~Eleuthera~Exuma and Cays~Grand Bahama~Harbour Island~Inagua~Long Island~Mayaguana~New Providence~Ragged Island~Rum Cay~San Salvador~Spanish Wells","sub_isoids":"~AK~~BY~BI~CI~~~EX~~HI~IN~LI~MG~~RI~RC~SS~SW"}
+data/BS/ABACO={"id":"data/BS/ABACO","key":"ABACO","name":"Abaco Islands","lang":"en"}
+data/BS/ACKLINS={"id":"data/BS/ACKLINS","key":"ACKLINS","name":"Acklins","lang":"en","isoid":"AK"}
+data/BS/ANDROS={"id":"data/BS/ANDROS","key":"ANDROS","name":"Andros Island","lang":"en"}
+data/BS/BERRY ISLANDS={"id":"data/BS/BERRY ISLANDS","key":"BERRY ISLANDS","name":"Berry Islands","lang":"en","isoid":"BY"}
+data/BS/BIMINI={"id":"data/BS/BIMINI","key":"BIMINI","name":"Bimini","lang":"en","isoid":"BI"}
+data/BS/CAT ISLAND={"id":"data/BS/CAT ISLAND","key":"CAT ISLAND","name":"Cat Island","lang":"en","isoid":"CI"}
+data/BS/CROOKED ISLAND={"id":"data/BS/CROOKED ISLAND","key":"CROOKED ISLAND","name":"Crooked Island","lang":"en"}
+data/BS/ELEUTHERA={"id":"data/BS/ELEUTHERA","key":"ELEUTHERA","name":"Eleuthera","lang":"en"}
+data/BS/EXUMA={"id":"data/BS/EXUMA","key":"EXUMA","name":"Exuma and Cays","lang":"en","isoid":"EX"}
+data/BS/GRAND BAHAMA={"id":"data/BS/GRAND BAHAMA","key":"GRAND BAHAMA","name":"Grand Bahama","lang":"en"}
+data/BS/HARBOUR ISLAND={"id":"data/BS/HARBOUR ISLAND","key":"HARBOUR ISLAND","name":"Harbour Island","lang":"en","isoid":"HI"}
+data/BS/INAGUA={"id":"data/BS/INAGUA","key":"INAGUA","name":"Inagua","lang":"en","isoid":"IN"}
+data/BS/LONG ISLAND={"id":"data/BS/LONG ISLAND","key":"LONG ISLAND","name":"Long Island","lang":"en","isoid":"LI"}
+data/BS/MAYAGUANA={"id":"data/BS/MAYAGUANA","key":"MAYAGUANA","name":"Mayaguana","lang":"en","isoid":"MG"}
+data/BS/N.P.={"id":"data/BS/N.P.","key":"N.P.","name":"New Providence","lang":"en"}
+data/BS/RAGGED ISLAND={"id":"data/BS/RAGGED ISLAND","key":"RAGGED ISLAND","name":"Ragged Island","lang":"en","isoid":"RI"}
+data/BS/RUM CAY={"id":"data/BS/RUM CAY","key":"RUM CAY","name":"Rum Cay","lang":"en","isoid":"RC"}
+data/BS/SAN SALVADOR={"id":"data/BS/SAN SALVADOR","key":"SAN SALVADOR","name":"San Salvador","lang":"en","isoid":"SS"}
+data/BS/SPANISH WELLS={"id":"data/BS/SPANISH WELLS","key":"SPANISH WELLS","name":"Spanish Wells","lang":"en","isoid":"SW"}
+data/BT={"id":"data/BT","key":"BT","name":"BHUTAN","zip":"\\d{5}","zipex":"11001,31101,35003","posturl":"http://www.bhutanpost.com.bt/postcode/postcode.php"}
+data/BV={"id":"data/BV","key":"BV","name":"BOUVET ISLAND"}
+data/BW={"id":"data/BW","key":"BW","name":"BOTSWANA"}
+data/BY={"id":"data/BY","key":"BY","name":"BELARUS","fmt":"%S%n%Z %C %X%n%A%n%O%n%N","zip":"\\d{6}","zipex":"20050,223016,225860,220050","posturl":"http://zip.belpost.by"}
+data/BZ={"id":"data/BZ","key":"BZ","name":"BELIZE"}
+data/CA={"id":"data/CA","key":"CA","name":"CANADA","lang":"en","languages":"en~fr","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOSZ","zip":"[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ ]?\\d[ABCEGHJ-NPRSTV-Z]\\d","zipex":"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1","posturl":"http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e2s1","sub_keys":"AB~BC~MB~NB~NL~NT~NS~NU~ON~PE~QC~SK~YT","sub_names":"Alberta~British Columbia~Manitoba~New Brunswick~Newfoundland and Labrador~Northwest Territories~Nova Scotia~Nunavut~Ontario~Prince Edward Island~Quebec~Saskatchewan~Yukon","sub_zips":"T~V~R~E~A~X0E|X0G|X1A~B~X0A|X0B|X0C~K|L|M|N|P~C~G|H|J|K1A~S|R8A~Y"}
+data/CA--fr={"id":"data/CA--fr","key":"CA","name":"CANADA","lang":"fr","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOSZ","zip":"[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ ]?\\d[ABCEGHJ-NPRSTV-Z]\\d","zipex":"H3Z 2Y7,V8X 3X4,T0L 1K0,T0H 1A0,K1A 0B1","posturl":"http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e2s1","sub_keys":"AB~BC~PE~MB~NB~NS~NU~ON~QC~SK~NL~NT~YT","sub_names":"Alberta~Colombie-Britannique~Ile-du-Prince-Edouard~Manitoba~Nouveau-Brunswick~Nouvelle-Ecosse~Nunavut~Ontario~Québec~Saskatchewan~Terre-Neuve-et-Labrador~Territoires du Nord-Ouest~Yukon","sub_zips":"T~V~C~R~E~B~X0A|X0B|X0C~K|L|M|N|P~G|H|J|K1A~S|R8A~A~X0E|X0G|X1A~Y"}
+data/CA/AB={"id":"data/CA/AB","key":"AB","name":"Alberta","lang":"en","zip":"T"}
+data/CA/AB--fr={"id":"data/CA/AB--fr","key":"AB","name":"Alberta","lang":"fr","zip":"T"}
+data/CA/BC={"id":"data/CA/BC","key":"BC","name":"British Columbia","lang":"en","zip":"V"}
+data/CA/BC--fr={"id":"data/CA/BC--fr","key":"BC","name":"Colombie-Britannique","lang":"fr","zip":"V"}
+data/CA/MB={"id":"data/CA/MB","key":"MB","name":"Manitoba","lang":"en","zip":"R"}
+data/CA/MB--fr={"id":"data/CA/MB--fr","key":"MB","name":"Manitoba","lang":"fr","zip":"R"}
+data/CA/NB={"id":"data/CA/NB","key":"NB","name":"New Brunswick","lang":"en","zip":"E"}
+data/CA/NB--fr={"id":"data/CA/NB--fr","key":"NB","name":"Nouveau-Brunswick","lang":"fr","zip":"E"}
+data/CA/NL={"id":"data/CA/NL","key":"NL","name":"Newfoundland and Labrador","lang":"en","zip":"A"}
+data/CA/NL--fr={"id":"data/CA/NL--fr","key":"NL","name":"Terre-Neuve-et-Labrador","lang":"fr","zip":"A"}
+data/CA/NS={"id":"data/CA/NS","key":"NS","name":"Nova Scotia","lang":"en","zip":"B"}
+data/CA/NS--fr={"id":"data/CA/NS--fr","key":"NS","name":"Nouvelle-Ecosse","lang":"fr","zip":"B"}
+data/CA/NT={"id":"data/CA/NT","key":"NT","name":"Northwest Territories","lang":"en","zip":"X0E|X0G|X1A"}
+data/CA/NT--fr={"id":"data/CA/NT--fr","key":"NT","name":"Territoires du Nord-Ouest","lang":"fr","zip":"X0E|X0G|X1A"}
+data/CA/NU={"id":"data/CA/NU","key":"NU","name":"Nunavut","lang":"en","zip":"X0A|X0B|X0C"}
+data/CA/NU--fr={"id":"data/CA/NU--fr","key":"NU","name":"Nunavut","lang":"fr","zip":"X0A|X0B|X0C"}
+data/CA/ON={"id":"data/CA/ON","key":"ON","name":"Ontario","lang":"en","zip":"K|L|M|N|P"}
+data/CA/ON--fr={"id":"data/CA/ON--fr","key":"ON","name":"Ontario","lang":"fr","zip":"K|L|M|N|P"}
+data/CA/PE={"id":"data/CA/PE","key":"PE","name":"Prince Edward Island","lang":"en","zip":"C"}
+data/CA/PE--fr={"id":"data/CA/PE--fr","key":"PE","name":"Ile-du-Prince-Edouard","lang":"fr","zip":"C"}
+data/CA/QC={"id":"data/CA/QC","key":"QC","name":"Quebec","lang":"en","zip":"G|H|J|K1A"}
+data/CA/QC--fr={"id":"data/CA/QC--fr","key":"QC","name":"Québec","lang":"fr","zip":"G|H|J|K1A"}
+data/CA/SK={"id":"data/CA/SK","key":"SK","name":"Saskatchewan","lang":"en","zip":"S|R8A"}
+data/CA/SK--fr={"id":"data/CA/SK--fr","key":"SK","name":"Saskatchewan","lang":"fr","zip":"S|R8A"}
+data/CA/YT={"id":"data/CA/YT","key":"YT","name":"Yukon","lang":"en","zip":"Y"}
+data/CA/YT--fr={"id":"data/CA/YT--fr","key":"YT","name":"Yukon","lang":"fr","zip":"Y"}
+data/CC={"id":"data/CC","key":"CC","name":"COCOS (KEELING) ISLANDS","fmt":"%O%n%N%n%A%n%C %S %Z","upper":"CS","zip":"6799"}
+data/CD={"id":"data/CD","key":"CD","name":"CONGO (DEM. REP.)","fmt":"%N%n%O%n%A%n%C %X"}
+data/CF={"id":"data/CF","key":"CF","name":"CENTRAL AFRICAN REPUBLIC"}
+data/CG={"id":"data/CG","key":"CG","name":"CONGO (REP.)"}
+data/CH={"id":"data/CH","key":"CH","name":"SWITZERLAND","lang":"de","languages":"de~fr~it","fmt":"%O%n%N%n%A%nCH-%Z %C","require":"ACZ","upper":"","zip":"\\d{4}","zipex":"2544,1211,1556,3030","posturl":"http://www.post.ch/db/owa/pv_plz_pack/pr_main","postprefix":"CH-","sub_keys":"AG~AR~AI~BL~BS~BE~FR~GE~GL~GR~JU~LU~NE~NW~OW~SH~SZ~SO~SG~TI~TG~UR~VD~VS~ZG~ZH","sub_names":"Aargau~Appenzell Ausserrhoden~Appenzell Innerrhoden~Basel-Landschaft~Basel-Stadt~Bern~Freiburg~Genf~Glarus~Graubünden~Jura~Luzern~Neuenburg~Nidwalden~Obwalden~Schaffhausen~Schwyz~Solothurn~St. Gallen~Tessin~Thurgau~Uri~Waadt~Wallis~Zug~Zürich"}
+data/CH--fr={"id":"data/CH--fr","key":"CH","name":"SWITZERLAND","lang":"fr","fmt":"%O%n%N%n%A%nCH-%Z %C","require":"ACZ","upper":"","zip":"\\d{4}","zipex":"2544,1211,1556,3030","posturl":"http://www.post.ch/db/owa/pv_plz_pack/pr_main","postprefix":"CH-","sub_keys":"AR~AI~AG~BL~BS~BE~FR~GE~GL~GR~JU~LU~NE~NW~OW~SG~SH~SZ~SO~TI~TG~UR~VS~VD~ZG~ZH","sub_names":"Appenzell Rhodes-Extérieures~Appenzell Rhodes-Intérieures~Argovie~Bâle-Campagne~Bâle-Ville~Berne~Fribourg~Genève~Glaris~Grisons~Jura~Lucerne~Neuchâtel~Nidwald~Obwald~Saint-Gall~Schaffhouse~Schwyz~Soleure~Tessin~Thurgovie~Uri~Valais~Vaud~Zoug~Zurich"}
+data/CH--it={"id":"data/CH--it","key":"CH","name":"SWITZERLAND","lang":"it","fmt":"%O%n%N%n%A%nCH-%Z %C","require":"ACZ","upper":"","zip":"\\d{4}","zipex":"2544,1211,1556,3030","posturl":"http://www.post.ch/db/owa/pv_plz_pack/pr_main","postprefix":"CH-","sub_keys":"AR~AI~AG~BL~BS~BE~FR~GE~JU~GL~GR~LU~NE~NW~OW~SG~SH~SO~SZ~TI~TG~UR~VS~VD~ZG~ZH","sub_names":"Appenzello Esterno~Appenzello Interno~Argovia~Basilea Campagna~Basilea Città~Berna~Friburgo~Ginevra~Giura~Glarona~Grigioni~Lucerna~Neuchâtel~Nidvaldo~Obvaldo~San Gallo~Sciaffusa~Soletta~Svitto~Ticino~Turgovia~Uri~Vallese~Vaud~Zugo~Zurigo"}
+data/CH/AG={"id":"data/CH/AG","key":"AG","name":"Aargau","lang":"de"}
+data/CH/AG--fr={"id":"data/CH/AG--fr","key":"AG","name":"Argovie","lang":"fr"}
+data/CH/AG--it={"id":"data/CH/AG--it","key":"AG","name":"Argovia","lang":"it"}
+data/CH/AI={"id":"data/CH/AI","key":"AI","name":"Appenzell Innerrhoden","lang":"de"}
+data/CH/AI--fr={"id":"data/CH/AI--fr","key":"AI","name":"Appenzell Rhodes-Intérieures","lang":"fr"}
+data/CH/AI--it={"id":"data/CH/AI--it","key":"AI","name":"Appenzello Interno","lang":"it"}
+data/CH/AR={"id":"data/CH/AR","key":"AR","name":"Appenzell Ausserrhoden","lang":"de"}
+data/CH/AR--fr={"id":"data/CH/AR--fr","key":"AR","name":"Appenzell Rhodes-Extérieures","lang":"fr"}
+data/CH/AR--it={"id":"data/CH/AR--it","key":"AR","name":"Appenzello Esterno","lang":"it"}
+data/CH/BE={"id":"data/CH/BE","key":"BE","name":"Bern","lang":"de"}
+data/CH/BE--fr={"id":"data/CH/BE--fr","key":"BE","name":"Berne","lang":"fr"}
+data/CH/BE--it={"id":"data/CH/BE--it","key":"BE","name":"Berna","lang":"it"}
+data/CH/BL={"id":"data/CH/BL","key":"BL","name":"Basel-Landschaft","lang":"de"}
+data/CH/BL--fr={"id":"data/CH/BL--fr","key":"BL","name":"Bâle-Campagne","lang":"fr"}
+data/CH/BL--it={"id":"data/CH/BL--it","key":"BL","name":"Basilea Campagna","lang":"it"}
+data/CH/BS={"id":"data/CH/BS","key":"BS","name":"Basel-Stadt","lang":"de"}
+data/CH/BS--fr={"id":"data/CH/BS--fr","key":"BS","name":"Bâle-Ville","lang":"fr"}
+data/CH/BS--it={"id":"data/CH/BS--it","key":"BS","name":"Basilea Città","lang":"it"}
+data/CH/FR={"id":"data/CH/FR","key":"FR","name":"Freiburg","lang":"de"}
+data/CH/FR--fr={"id":"data/CH/FR--fr","key":"FR","name":"Fribourg","lang":"fr"}
+data/CH/FR--it={"id":"data/CH/FR--it","key":"FR","name":"Friburgo","lang":"it"}
+data/CH/GE={"id":"data/CH/GE","key":"GE","name":"Genf","lang":"de"}
+data/CH/GE--fr={"id":"data/CH/GE--fr","key":"GE","name":"Genève","lang":"fr"}
+data/CH/GE--it={"id":"data/CH/GE--it","key":"GE","name":"Ginevra","lang":"it"}
+data/CH/GL={"id":"data/CH/GL","key":"GL","name":"Glarus","lang":"de"}
+data/CH/GL--fr={"id":"data/CH/GL--fr","key":"GL","name":"Glaris","lang":"fr"}
+data/CH/GL--it={"id":"data/CH/GL--it","key":"GL","name":"Glarona","lang":"it"}
+data/CH/GR={"id":"data/CH/GR","key":"GR","name":"Graubünden","lang":"de"}
+data/CH/GR--fr={"id":"data/CH/GR--fr","key":"GR","name":"Grisons","lang":"fr"}
+data/CH/GR--it={"id":"data/CH/GR--it","key":"GR","name":"Grigioni","lang":"it"}
+data/CH/JU={"id":"data/CH/JU","key":"JU","name":"Jura","lang":"de"}
+data/CH/JU--fr={"id":"data/CH/JU--fr","key":"JU","name":"Jura","lang":"fr"}
+data/CH/JU--it={"id":"data/CH/JU--it","key":"JU","name":"Giura","lang":"it"}
+data/CH/LU={"id":"data/CH/LU","key":"LU","name":"Luzern","lang":"de"}
+data/CH/LU--fr={"id":"data/CH/LU--fr","key":"LU","name":"Lucerne","lang":"fr"}
+data/CH/LU--it={"id":"data/CH/LU--it","key":"LU","name":"Lucerna","lang":"it"}
+data/CH/NE={"id":"data/CH/NE","key":"NE","name":"Neuenburg","lang":"de"}
+data/CH/NE--fr={"id":"data/CH/NE--fr","key":"NE","name":"Neuchâtel","lang":"fr"}
+data/CH/NE--it={"id":"data/CH/NE--it","key":"NE","name":"Neuchâtel","lang":"it"}
+data/CH/NW={"id":"data/CH/NW","key":"NW","name":"Nidwalden","lang":"de"}
+data/CH/NW--fr={"id":"data/CH/NW--fr","key":"NW","name":"Nidwald","lang":"fr"}
+data/CH/NW--it={"id":"data/CH/NW--it","key":"NW","name":"Nidvaldo","lang":"it"}
+data/CH/OW={"id":"data/CH/OW","key":"OW","name":"Obwalden","lang":"de"}
+data/CH/OW--fr={"id":"data/CH/OW--fr","key":"OW","name":"Obwald","lang":"fr"}
+data/CH/OW--it={"id":"data/CH/OW--it","key":"OW","name":"Obvaldo","lang":"it"}
+data/CH/SG={"id":"data/CH/SG","key":"SG","name":"St. Gallen","lang":"de"}
+data/CH/SG--fr={"id":"data/CH/SG--fr","key":"SG","name":"Saint-Gall","lang":"fr"}
+data/CH/SG--it={"id":"data/CH/SG--it","key":"SG","name":"San Gallo","lang":"it"}
+data/CH/SH={"id":"data/CH/SH","key":"SH","name":"Schaffhausen","lang":"de"}
+data/CH/SH--fr={"id":"data/CH/SH--fr","key":"SH","name":"Schaffhouse","lang":"fr"}
+data/CH/SH--it={"id":"data/CH/SH--it","key":"SH","name":"Sciaffusa","lang":"it"}
+data/CH/SO={"id":"data/CH/SO","key":"SO","name":"Solothurn","lang":"de"}
+data/CH/SO--fr={"id":"data/CH/SO--fr","key":"SO","name":"Soleure","lang":"fr"}
+data/CH/SO--it={"id":"data/CH/SO--it","key":"SO","name":"Soletta","lang":"it"}
+data/CH/SZ={"id":"data/CH/SZ","key":"SZ","name":"Schwyz","lang":"de"}
+data/CH/SZ--fr={"id":"data/CH/SZ--fr","key":"SZ","name":"Schwyz","lang":"fr"}
+data/CH/SZ--it={"id":"data/CH/SZ--it","key":"SZ","name":"Svitto","lang":"it"}
+data/CH/TG={"id":"data/CH/TG","key":"TG","name":"Thurgau","lang":"de"}
+data/CH/TG--fr={"id":"data/CH/TG--fr","key":"TG","name":"Thurgovie","lang":"fr"}
+data/CH/TG--it={"id":"data/CH/TG--it","key":"TG","name":"Turgovia","lang":"it"}
+data/CH/TI={"id":"data/CH/TI","key":"TI","name":"Tessin","lang":"de"}
+data/CH/TI--fr={"id":"data/CH/TI--fr","key":"TI","name":"Tessin","lang":"fr"}
+data/CH/TI--it={"id":"data/CH/TI--it","key":"TI","name":"Ticino","lang":"it"}
+data/CH/UR={"id":"data/CH/UR","key":"UR","name":"Uri","lang":"de"}
+data/CH/UR--fr={"id":"data/CH/UR--fr","key":"UR","name":"Uri","lang":"fr"}
+data/CH/UR--it={"id":"data/CH/UR--it","key":"UR","name":"Uri","lang":"it"}
+data/CH/VD={"id":"data/CH/VD","key":"VD","name":"Waadt","lang":"de"}
+data/CH/VD--fr={"id":"data/CH/VD--fr","key":"VD","name":"Vaud","lang":"fr"}
+data/CH/VD--it={"id":"data/CH/VD--it","key":"VD","name":"Vaud","lang":"it"}
+data/CH/VS={"id":"data/CH/VS","key":"VS","name":"Wallis","lang":"de"}
+data/CH/VS--fr={"id":"data/CH/VS--fr","key":"VS","name":"Valais","lang":"fr"}
+data/CH/VS--it={"id":"data/CH/VS--it","key":"VS","name":"Vallese","lang":"it"}
+data/CH/ZG={"id":"data/CH/ZG","key":"ZG","name":"Zug","lang":"de"}
+data/CH/ZG--fr={"id":"data/CH/ZG--fr","key":"ZG","name":"Zoug","lang":"fr"}
+data/CH/ZG--it={"id":"data/CH/ZG--it","key":"ZG","name":"Zugo","lang":"it"}
+data/CH/ZH={"id":"data/CH/ZH","key":"ZH","name":"Zürich","lang":"de"}
+data/CH/ZH--fr={"id":"data/CH/ZH--fr","key":"ZH","name":"Zurich","lang":"fr"}
+data/CH/ZH--it={"id":"data/CH/ZH--it","key":"ZH","name":"Zurigo","lang":"it"}
+data/CI={"id":"data/CI","key":"CI","name":"COTE D'IVOIRE","fmt":"%N%n%O%n%X %A %C %X"}
+data/CK={"id":"data/CK","key":"CK","name":"COOK ISLANDS","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{4}"}
+data/CL={"id":"data/CL","key":"CL","name":"CHILE","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z %C%n%S","zip":"\\d{7}","zipex":"8340457,8720019,1230000,8329100,8720019","posturl":"http://www.correos.cl/SitePages/home.aspx","state_name_type":"state","sub_keys":"II Región de Antofagasta~IX Región de la Araucanía~XV Región de Arica y Parinacota~III Región de Atacama~XI Región Aysén del General Carlos Ibáñez del Campo~VIII Región del Biobío~IV Región de Coquimbo~VI Región del Libertador General Bernardo O'Higgins~X Región de Los Lagos~XIV Región de Los Ríos~XII Región de Magallanes y de la Antártica Chilena~VII Región del Maule~Región Metropolitana de Santiago~I Región de Tarapacá~V Región de Valparaíso","sub_names":"Antofagasta~Araucanía~Arica y Parinacota~Atacama~Aysén del General Carlos Ibáñez del Campo~Biobío~Coquimbo~Libertador General Bernardo O'Higgins~Los Lagos~Los Ríos~Magallanes y de la Antártica Chilena~Maule~Metropolitana de Santiago~Tarapacá~Valparaíso","sub_isoids":"AN~AR~AP~AT~AI~BI~CO~LI~LL~LR~MA~ML~RM~TA~VS","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CL/I Región de Tarapacá={"id":"data/CL/I Región de Tarapacá","key":"I Región de Tarapacá","name":"Tarapacá","lang":"es","isoid":"TA","sub_keys":"Alto Hospicio~Camiña~Colchane~Huara~Iquique~Pica~Pozo Almonte"}
+data/CL/I Región de Tarapacá/Alto Hospicio={"id":"data/CL/I Región de Tarapacá/Alto Hospicio","key":"Alto Hospicio","lang":"es"}
+data/CL/I Región de Tarapacá/Camiña={"id":"data/CL/I Región de Tarapacá/Camiña","key":"Camiña","lang":"es"}
+data/CL/I Región de Tarapacá/Colchane={"id":"data/CL/I Región de Tarapacá/Colchane","key":"Colchane","lang":"es"}
+data/CL/I Región de Tarapacá/Huara={"id":"data/CL/I Región de Tarapacá/Huara","key":"Huara","lang":"es"}
+data/CL/I Región de Tarapacá/Iquique={"id":"data/CL/I Región de Tarapacá/Iquique","key":"Iquique","lang":"es"}
+data/CL/I Región de Tarapacá/Pica={"id":"data/CL/I Región de Tarapacá/Pica","key":"Pica","lang":"es"}
+data/CL/I Región de Tarapacá/Pozo Almonte={"id":"data/CL/I Región de Tarapacá/Pozo Almonte","key":"Pozo Almonte","lang":"es"}
+data/CL/II Región de Antofagasta={"id":"data/CL/II Región de Antofagasta","key":"II Región de Antofagasta","name":"Antofagasta","lang":"es","isoid":"AN","sub_keys":"Antofagasta~Calama~María Elena~Mejillones~Ollagüe~San Pedro de Atacama~Sierra Gorda~Taltal~Tocopilla"}
+data/CL/II Región de Antofagasta/Antofagasta={"id":"data/CL/II Región de Antofagasta/Antofagasta","key":"Antofagasta","lang":"es"}
+data/CL/II Región de Antofagasta/Calama={"id":"data/CL/II Región de Antofagasta/Calama","key":"Calama","lang":"es"}
+data/CL/II Región de Antofagasta/María Elena={"id":"data/CL/II Región de Antofagasta/María Elena","key":"María Elena","lang":"es"}
+data/CL/II Región de Antofagasta/Mejillones={"id":"data/CL/II Región de Antofagasta/Mejillones","key":"Mejillones","lang":"es"}
+data/CL/II Región de Antofagasta/Ollagüe={"id":"data/CL/II Región de Antofagasta/Ollagüe","key":"Ollagüe","lang":"es"}
+data/CL/II Región de Antofagasta/San Pedro de Atacama={"id":"data/CL/II Región de Antofagasta/San Pedro de Atacama","key":"San Pedro de Atacama","lang":"es"}
+data/CL/II Región de Antofagasta/Sierra Gorda={"id":"data/CL/II Región de Antofagasta/Sierra Gorda","key":"Sierra Gorda","lang":"es"}
+data/CL/II Región de Antofagasta/Taltal={"id":"data/CL/II Región de Antofagasta/Taltal","key":"Taltal","lang":"es"}
+data/CL/II Región de Antofagasta/Tocopilla={"id":"data/CL/II Región de Antofagasta/Tocopilla","key":"Tocopilla","lang":"es"}
+data/CL/III Región de Atacama={"id":"data/CL/III Región de Atacama","key":"III Región de Atacama","name":"Atacama","lang":"es","isoid":"AT","sub_keys":"Alto del Carmen~Caldera~Chañaral~Copiapó~Diego de Almagro~Freirina~Huasco~Tierra Amarilla~Vallenar"}
+data/CL/III Región de Atacama/Alto del Carmen={"id":"data/CL/III Región de Atacama/Alto del Carmen","key":"Alto del Carmen","lang":"es"}
+data/CL/III Región de Atacama/Caldera={"id":"data/CL/III Región de Atacama/Caldera","key":"Caldera","lang":"es"}
+data/CL/III Región de Atacama/Chañaral={"id":"data/CL/III Región de Atacama/Chañaral","key":"Chañaral","lang":"es"}
+data/CL/III Región de Atacama/Copiapó={"id":"data/CL/III Región de Atacama/Copiapó","key":"Copiapó","lang":"es"}
+data/CL/III Región de Atacama/Diego de Almagro={"id":"data/CL/III Región de Atacama/Diego de Almagro","key":"Diego de Almagro","lang":"es"}
+data/CL/III Región de Atacama/Freirina={"id":"data/CL/III Región de Atacama/Freirina","key":"Freirina","lang":"es"}
+data/CL/III Región de Atacama/Huasco={"id":"data/CL/III Región de Atacama/Huasco","key":"Huasco","lang":"es"}
+data/CL/III Región de Atacama/Tierra Amarilla={"id":"data/CL/III Región de Atacama/Tierra Amarilla","key":"Tierra Amarilla","lang":"es"}
+data/CL/III Región de Atacama/Vallenar={"id":"data/CL/III Región de Atacama/Vallenar","key":"Vallenar","lang":"es"}
+data/CL/IV Región de Coquimbo={"id":"data/CL/IV Región de Coquimbo","key":"IV Región de Coquimbo","name":"Coquimbo","lang":"es","isoid":"CO","sub_keys":"Andacollo~Canela~Combarbalá~Coquimbo~Illapel~La Higuera~La Serena~Los Vilos~Monte Patria~Ovalle~Paihuano~Punitaqui~Río Hurtado~Salamanca~Vicuña"}
+data/CL/IV Región de Coquimbo/Andacollo={"id":"data/CL/IV Región de Coquimbo/Andacollo","key":"Andacollo","lang":"es"}
+data/CL/IV Región de Coquimbo/Canela={"id":"data/CL/IV Región de Coquimbo/Canela","key":"Canela","lang":"es"}
+data/CL/IV Región de Coquimbo/Combarbalá={"id":"data/CL/IV Región de Coquimbo/Combarbalá","key":"Combarbalá","lang":"es"}
+data/CL/IV Región de Coquimbo/Coquimbo={"id":"data/CL/IV Región de Coquimbo/Coquimbo","key":"Coquimbo","lang":"es"}
+data/CL/IV Región de Coquimbo/Illapel={"id":"data/CL/IV Región de Coquimbo/Illapel","key":"Illapel","lang":"es"}
+data/CL/IV Región de Coquimbo/La Higuera={"id":"data/CL/IV Región de Coquimbo/La Higuera","key":"La Higuera","lang":"es"}
+data/CL/IV Región de Coquimbo/La Serena={"id":"data/CL/IV Región de Coquimbo/La Serena","key":"La Serena","lang":"es"}
+data/CL/IV Región de Coquimbo/Los Vilos={"id":"data/CL/IV Región de Coquimbo/Los Vilos","key":"Los Vilos","lang":"es"}
+data/CL/IV Región de Coquimbo/Monte Patria={"id":"data/CL/IV Región de Coquimbo/Monte Patria","key":"Monte Patria","lang":"es"}
+data/CL/IV Región de Coquimbo/Ovalle={"id":"data/CL/IV Región de Coquimbo/Ovalle","key":"Ovalle","lang":"es"}
+data/CL/IV Región de Coquimbo/Paihuano={"id":"data/CL/IV Región de Coquimbo/Paihuano","key":"Paihuano","lang":"es"}
+data/CL/IV Región de Coquimbo/Punitaqui={"id":"data/CL/IV Región de Coquimbo/Punitaqui","key":"Punitaqui","lang":"es"}
+data/CL/IV Región de Coquimbo/Río Hurtado={"id":"data/CL/IV Región de Coquimbo/Río Hurtado","key":"Río Hurtado","lang":"es"}
+data/CL/IV Región de Coquimbo/Salamanca={"id":"data/CL/IV Región de Coquimbo/Salamanca","key":"Salamanca","lang":"es"}
+data/CL/IV Región de Coquimbo/Vicuña={"id":"data/CL/IV Región de Coquimbo/Vicuña","key":"Vicuña","lang":"es"}
+data/CL/IX Región de la Araucanía={"id":"data/CL/IX Región de la Araucanía","key":"IX Región de la Araucanía","name":"Araucanía","lang":"es","isoid":"AR","sub_keys":"Angol~Carahue~Cholchol~Collipulli~Cunco~Curacautín~Curarrehue~Ercilla~Freire~Galvarino~Gorbea~Lautaro~Loncoche~Lonquimay~Los Sauces~Lumaco~Melipeuco~Nueva Imperial~Padre Las Casas~Perquenco~Pitrufquén~Pucón~Purén~Renaico~Saavedra~Temuco~Teodoro Schmidt~Toltén~Traiguén~Victoria~Vilcún~Villarrica"}
+data/CL/IX Región de la Araucanía/Angol={"id":"data/CL/IX Región de la Araucanía/Angol","key":"Angol","lang":"es"}
+data/CL/IX Región de la Araucanía/Carahue={"id":"data/CL/IX Región de la Araucanía/Carahue","key":"Carahue","lang":"es"}
+data/CL/IX Región de la Araucanía/Cholchol={"id":"data/CL/IX Región de la Araucanía/Cholchol","key":"Cholchol","lang":"es"}
+data/CL/IX Región de la Araucanía/Collipulli={"id":"data/CL/IX Región de la Araucanía/Collipulli","key":"Collipulli","lang":"es"}
+data/CL/IX Región de la Araucanía/Cunco={"id":"data/CL/IX Región de la Araucanía/Cunco","key":"Cunco","lang":"es"}
+data/CL/IX Región de la Araucanía/Curacautín={"id":"data/CL/IX Región de la Araucanía/Curacautín","key":"Curacautín","lang":"es"}
+data/CL/IX Región de la Araucanía/Curarrehue={"id":"data/CL/IX Región de la Araucanía/Curarrehue","key":"Curarrehue","lang":"es"}
+data/CL/IX Región de la Araucanía/Ercilla={"id":"data/CL/IX Región de la Araucanía/Ercilla","key":"Ercilla","lang":"es"}
+data/CL/IX Región de la Araucanía/Freire={"id":"data/CL/IX Región de la Araucanía/Freire","key":"Freire","lang":"es"}
+data/CL/IX Región de la Araucanía/Galvarino={"id":"data/CL/IX Región de la Araucanía/Galvarino","key":"Galvarino","lang":"es"}
+data/CL/IX Región de la Araucanía/Gorbea={"id":"data/CL/IX Región de la Araucanía/Gorbea","key":"Gorbea","lang":"es"}
+data/CL/IX Región de la Araucanía/Lautaro={"id":"data/CL/IX Región de la Araucanía/Lautaro","key":"Lautaro","lang":"es"}
+data/CL/IX Región de la Araucanía/Loncoche={"id":"data/CL/IX Región de la Araucanía/Loncoche","key":"Loncoche","lang":"es"}
+data/CL/IX Región de la Araucanía/Lonquimay={"id":"data/CL/IX Región de la Araucanía/Lonquimay","key":"Lonquimay","lang":"es"}
+data/CL/IX Región de la Araucanía/Los Sauces={"id":"data/CL/IX Región de la Araucanía/Los Sauces","key":"Los Sauces","lang":"es"}
+data/CL/IX Región de la Araucanía/Lumaco={"id":"data/CL/IX Región de la Araucanía/Lumaco","key":"Lumaco","lang":"es"}
+data/CL/IX Región de la Araucanía/Melipeuco={"id":"data/CL/IX Región de la Araucanía/Melipeuco","key":"Melipeuco","lang":"es"}
+data/CL/IX Región de la Araucanía/Nueva Imperial={"id":"data/CL/IX Región de la Araucanía/Nueva Imperial","key":"Nueva Imperial","lang":"es"}
+data/CL/IX Región de la Araucanía/Padre Las Casas={"id":"data/CL/IX Región de la Araucanía/Padre Las Casas","key":"Padre Las Casas","lang":"es"}
+data/CL/IX Región de la Araucanía/Perquenco={"id":"data/CL/IX Región de la Araucanía/Perquenco","key":"Perquenco","lang":"es"}
+data/CL/IX Región de la Araucanía/Pitrufquén={"id":"data/CL/IX Región de la Araucanía/Pitrufquén","key":"Pitrufquén","lang":"es"}
+data/CL/IX Región de la Araucanía/Pucón={"id":"data/CL/IX Región de la Araucanía/Pucón","key":"Pucón","lang":"es"}
+data/CL/IX Región de la Araucanía/Purén={"id":"data/CL/IX Región de la Araucanía/Purén","key":"Purén","lang":"es"}
+data/CL/IX Región de la Araucanía/Renaico={"id":"data/CL/IX Región de la Araucanía/Renaico","key":"Renaico","lang":"es"}
+data/CL/IX Región de la Araucanía/Saavedra={"id":"data/CL/IX Región de la Araucanía/Saavedra","key":"Saavedra","lang":"es"}
+data/CL/IX Región de la Araucanía/Temuco={"id":"data/CL/IX Región de la Araucanía/Temuco","key":"Temuco","lang":"es"}
+data/CL/IX Región de la Araucanía/Teodoro Schmidt={"id":"data/CL/IX Región de la Araucanía/Teodoro Schmidt","key":"Teodoro Schmidt","lang":"es"}
+data/CL/IX Región de la Araucanía/Toltén={"id":"data/CL/IX Región de la Araucanía/Toltén","key":"Toltén","lang":"es"}
+data/CL/IX Región de la Araucanía/Traiguén={"id":"data/CL/IX Región de la Araucanía/Traiguén","key":"Traiguén","lang":"es"}
+data/CL/IX Región de la Araucanía/Victoria={"id":"data/CL/IX Región de la Araucanía/Victoria","key":"Victoria","lang":"es"}
+data/CL/IX Región de la Araucanía/Vilcún={"id":"data/CL/IX Región de la Araucanía/Vilcún","key":"Vilcún","lang":"es"}
+data/CL/IX Región de la Araucanía/Villarrica={"id":"data/CL/IX Región de la Araucanía/Villarrica","key":"Villarrica","lang":"es"}
+data/CL/Región Metropolitana de Santiago={"id":"data/CL/Región Metropolitana de Santiago","key":"Región Metropolitana de Santiago","name":"Metropolitana de Santiago","lang":"es","isoid":"RM","sub_keys":"Alhué~Buin~Calera de Tango~Cerrillos~Cerro Navia~Colina~Conchalí~Curacaví~El Bosque~El Monte~Estación Central~Huechuraba~Independencia~Isla de Maipo~La Cisterna~La Florida~La Granja~La Pintana~La Reina~Lampa~Las Condes~Lo Barnechea~Lo Espejo~Lo Prado~Macul~Maipú~María Pinto~Melipilla~Ñuñoa~Padre Hurtado~Paine~Pedro Aguirre Cerda~Peñaflor~Peñalolén~Pirque~Providencia~Pudahuel~Puente Alto~Quilicura~Quinta Normal~Recoleta~Renca~San Bernardo~San Joaquín~San José de Maipo~San Miguel~San Pedro~San Ramón~Santiago~Talagante~Tiltil~Vitacura"}
+data/CL/Región Metropolitana de Santiago/Alhué={"id":"data/CL/Región Metropolitana de Santiago/Alhué","key":"Alhué","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Buin={"id":"data/CL/Región Metropolitana de Santiago/Buin","key":"Buin","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Calera de Tango={"id":"data/CL/Región Metropolitana de Santiago/Calera de Tango","key":"Calera de Tango","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Cerrillos={"id":"data/CL/Región Metropolitana de Santiago/Cerrillos","key":"Cerrillos","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Cerro Navia={"id":"data/CL/Región Metropolitana de Santiago/Cerro Navia","key":"Cerro Navia","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Colina={"id":"data/CL/Región Metropolitana de Santiago/Colina","key":"Colina","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Conchalí={"id":"data/CL/Región Metropolitana de Santiago/Conchalí","key":"Conchalí","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Curacaví={"id":"data/CL/Región Metropolitana de Santiago/Curacaví","key":"Curacaví","lang":"es"}
+data/CL/Región Metropolitana de Santiago/El Bosque={"id":"data/CL/Región Metropolitana de Santiago/El Bosque","key":"El Bosque","lang":"es"}
+data/CL/Región Metropolitana de Santiago/El Monte={"id":"data/CL/Región Metropolitana de Santiago/El Monte","key":"El Monte","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Estación Central={"id":"data/CL/Región Metropolitana de Santiago/Estación Central","key":"Estación Central","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Huechuraba={"id":"data/CL/Región Metropolitana de Santiago/Huechuraba","key":"Huechuraba","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Independencia={"id":"data/CL/Región Metropolitana de Santiago/Independencia","key":"Independencia","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Isla de Maipo={"id":"data/CL/Región Metropolitana de Santiago/Isla de Maipo","key":"Isla de Maipo","lang":"es"}
+data/CL/Región Metropolitana de Santiago/La Cisterna={"id":"data/CL/Región Metropolitana de Santiago/La Cisterna","key":"La Cisterna","lang":"es"}
+data/CL/Región Metropolitana de Santiago/La Florida={"id":"data/CL/Región Metropolitana de Santiago/La Florida","key":"La Florida","lang":"es"}
+data/CL/Región Metropolitana de Santiago/La Granja={"id":"data/CL/Región Metropolitana de Santiago/La Granja","key":"La Granja","lang":"es"}
+data/CL/Región Metropolitana de Santiago/La Pintana={"id":"data/CL/Región Metropolitana de Santiago/La Pintana","key":"La Pintana","lang":"es"}
+data/CL/Región Metropolitana de Santiago/La Reina={"id":"data/CL/Región Metropolitana de Santiago/La Reina","key":"La Reina","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Lampa={"id":"data/CL/Región Metropolitana de Santiago/Lampa","key":"Lampa","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Las Condes={"id":"data/CL/Región Metropolitana de Santiago/Las Condes","key":"Las Condes","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Lo Barnechea={"id":"data/CL/Región Metropolitana de Santiago/Lo Barnechea","key":"Lo Barnechea","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Lo Espejo={"id":"data/CL/Región Metropolitana de Santiago/Lo Espejo","key":"Lo Espejo","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Lo Prado={"id":"data/CL/Región Metropolitana de Santiago/Lo Prado","key":"Lo Prado","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Macul={"id":"data/CL/Región Metropolitana de Santiago/Macul","key":"Macul","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Maipú={"id":"data/CL/Región Metropolitana de Santiago/Maipú","key":"Maipú","lang":"es"}
+data/CL/Región Metropolitana de Santiago/María Pinto={"id":"data/CL/Región Metropolitana de Santiago/María Pinto","key":"María Pinto","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Melipilla={"id":"data/CL/Región Metropolitana de Santiago/Melipilla","key":"Melipilla","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Padre Hurtado={"id":"data/CL/Región Metropolitana de Santiago/Padre Hurtado","key":"Padre Hurtado","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Paine={"id":"data/CL/Región Metropolitana de Santiago/Paine","key":"Paine","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Pedro Aguirre Cerda={"id":"data/CL/Región Metropolitana de Santiago/Pedro Aguirre Cerda","key":"Pedro Aguirre Cerda","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Peñaflor={"id":"data/CL/Región Metropolitana de Santiago/Peñaflor","key":"Peñaflor","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Peñalolén={"id":"data/CL/Región Metropolitana de Santiago/Peñalolén","key":"Peñalolén","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Pirque={"id":"data/CL/Región Metropolitana de Santiago/Pirque","key":"Pirque","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Providencia={"id":"data/CL/Región Metropolitana de Santiago/Providencia","key":"Providencia","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Pudahuel={"id":"data/CL/Región Metropolitana de Santiago/Pudahuel","key":"Pudahuel","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Puente Alto={"id":"data/CL/Región Metropolitana de Santiago/Puente Alto","key":"Puente Alto","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Quilicura={"id":"data/CL/Región Metropolitana de Santiago/Quilicura","key":"Quilicura","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Quinta Normal={"id":"data/CL/Región Metropolitana de Santiago/Quinta Normal","key":"Quinta Normal","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Recoleta={"id":"data/CL/Región Metropolitana de Santiago/Recoleta","key":"Recoleta","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Renca={"id":"data/CL/Región Metropolitana de Santiago/Renca","key":"Renca","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San Bernardo={"id":"data/CL/Región Metropolitana de Santiago/San Bernardo","key":"San Bernardo","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San Joaquín={"id":"data/CL/Región Metropolitana de Santiago/San Joaquín","key":"San Joaquín","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San José de Maipo={"id":"data/CL/Región Metropolitana de Santiago/San José de Maipo","key":"San José de Maipo","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San Miguel={"id":"data/CL/Región Metropolitana de Santiago/San Miguel","key":"San Miguel","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San Pedro={"id":"data/CL/Región Metropolitana de Santiago/San Pedro","key":"San Pedro","lang":"es"}
+data/CL/Región Metropolitana de Santiago/San Ramón={"id":"data/CL/Región Metropolitana de Santiago/San Ramón","key":"San Ramón","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Santiago={"id":"data/CL/Región Metropolitana de Santiago/Santiago","key":"Santiago","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Talagante={"id":"data/CL/Región Metropolitana de Santiago/Talagante","key":"Talagante","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Tiltil={"id":"data/CL/Región Metropolitana de Santiago/Tiltil","key":"Tiltil","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Vitacura={"id":"data/CL/Región Metropolitana de Santiago/Vitacura","key":"Vitacura","lang":"es"}
+data/CL/Región Metropolitana de Santiago/Ñuñoa={"id":"data/CL/Región Metropolitana de Santiago/Ñuñoa","key":"Ñuñoa","lang":"es"}
+data/CL/V Región de Valparaíso={"id":"data/CL/V Región de Valparaíso","key":"V Región de Valparaíso","name":"Valparaíso","lang":"es","isoid":"VS","sub_keys":"Algarrobo~Cabildo~Calle Larga~Cartagena~Casablanca~Catemu~Concón~El Quisco~El Tabo~Hijuelas~Isla de Pascua~Juan Fernández~La Calera~La Cruz~La Ligua~Limache~Llaillay~Los Andes~Nogales~Olmué~Panquehue~Papudo~Petorca~Puchuncaví~Putaendo~Quillota~Quilpué~Quintero~Rinconada~San Antonio~San Esteban~San Felipe~Santa María~Santo Domingo~Valparaíso~Villa Alemana~Viña del Mar~Zapallar"}
+data/CL/V Región de Valparaíso/Algarrobo={"id":"data/CL/V Región de Valparaíso/Algarrobo","key":"Algarrobo","lang":"es"}
+data/CL/V Región de Valparaíso/Cabildo={"id":"data/CL/V Región de Valparaíso/Cabildo","key":"Cabildo","lang":"es"}
+data/CL/V Región de Valparaíso/Calle Larga={"id":"data/CL/V Región de Valparaíso/Calle Larga","key":"Calle Larga","lang":"es"}
+data/CL/V Región de Valparaíso/Cartagena={"id":"data/CL/V Región de Valparaíso/Cartagena","key":"Cartagena","lang":"es"}
+data/CL/V Región de Valparaíso/Casablanca={"id":"data/CL/V Región de Valparaíso/Casablanca","key":"Casablanca","lang":"es"}
+data/CL/V Región de Valparaíso/Catemu={"id":"data/CL/V Región de Valparaíso/Catemu","key":"Catemu","lang":"es"}
+data/CL/V Región de Valparaíso/Concón={"id":"data/CL/V Región de Valparaíso/Concón","key":"Concón","lang":"es"}
+data/CL/V Región de Valparaíso/El Quisco={"id":"data/CL/V Región de Valparaíso/El Quisco","key":"El Quisco","lang":"es"}
+data/CL/V Región de Valparaíso/El Tabo={"id":"data/CL/V Región de Valparaíso/El Tabo","key":"El Tabo","lang":"es"}
+data/CL/V Región de Valparaíso/Hijuelas={"id":"data/CL/V Región de Valparaíso/Hijuelas","key":"Hijuelas","lang":"es"}
+data/CL/V Región de Valparaíso/Isla de Pascua={"id":"data/CL/V Región de Valparaíso/Isla de Pascua","key":"Isla de Pascua","lang":"es"}
+data/CL/V Región de Valparaíso/Juan Fernández={"id":"data/CL/V Región de Valparaíso/Juan Fernández","key":"Juan Fernández","lang":"es"}
+data/CL/V Región de Valparaíso/La Calera={"id":"data/CL/V Región de Valparaíso/La Calera","key":"La Calera","lang":"es"}
+data/CL/V Región de Valparaíso/La Cruz={"id":"data/CL/V Región de Valparaíso/La Cruz","key":"La Cruz","lang":"es"}
+data/CL/V Región de Valparaíso/La Ligua={"id":"data/CL/V Región de Valparaíso/La Ligua","key":"La Ligua","lang":"es"}
+data/CL/V Región de Valparaíso/Limache={"id":"data/CL/V Región de Valparaíso/Limache","key":"Limache","lang":"es"}
+data/CL/V Región de Valparaíso/Llaillay={"id":"data/CL/V Región de Valparaíso/Llaillay","key":"Llaillay","lang":"es"}
+data/CL/V Región de Valparaíso/Los Andes={"id":"data/CL/V Región de Valparaíso/Los Andes","key":"Los Andes","lang":"es"}
+data/CL/V Región de Valparaíso/Nogales={"id":"data/CL/V Región de Valparaíso/Nogales","key":"Nogales","lang":"es"}
+data/CL/V Región de Valparaíso/Olmué={"id":"data/CL/V Región de Valparaíso/Olmué","key":"Olmué","lang":"es"}
+data/CL/V Región de Valparaíso/Panquehue={"id":"data/CL/V Región de Valparaíso/Panquehue","key":"Panquehue","lang":"es"}
+data/CL/V Región de Valparaíso/Papudo={"id":"data/CL/V Región de Valparaíso/Papudo","key":"Papudo","lang":"es"}
+data/CL/V Región de Valparaíso/Petorca={"id":"data/CL/V Región de Valparaíso/Petorca","key":"Petorca","lang":"es"}
+data/CL/V Región de Valparaíso/Puchuncaví={"id":"data/CL/V Región de Valparaíso/Puchuncaví","key":"Puchuncaví","lang":"es"}
+data/CL/V Región de Valparaíso/Putaendo={"id":"data/CL/V Región de Valparaíso/Putaendo","key":"Putaendo","lang":"es"}
+data/CL/V Región de Valparaíso/Quillota={"id":"data/CL/V Región de Valparaíso/Quillota","key":"Quillota","lang":"es"}
+data/CL/V Región de Valparaíso/Quilpué={"id":"data/CL/V Región de Valparaíso/Quilpué","key":"Quilpué","lang":"es"}
+data/CL/V Región de Valparaíso/Quintero={"id":"data/CL/V Región de Valparaíso/Quintero","key":"Quintero","lang":"es"}
+data/CL/V Región de Valparaíso/Rinconada={"id":"data/CL/V Región de Valparaíso/Rinconada","key":"Rinconada","lang":"es"}
+data/CL/V Región de Valparaíso/San Antonio={"id":"data/CL/V Región de Valparaíso/San Antonio","key":"San Antonio","lang":"es"}
+data/CL/V Región de Valparaíso/San Esteban={"id":"data/CL/V Región de Valparaíso/San Esteban","key":"San Esteban","lang":"es"}
+data/CL/V Región de Valparaíso/San Felipe={"id":"data/CL/V Región de Valparaíso/San Felipe","key":"San Felipe","lang":"es"}
+data/CL/V Región de Valparaíso/Santa María={"id":"data/CL/V Región de Valparaíso/Santa María","key":"Santa María","lang":"es"}
+data/CL/V Región de Valparaíso/Santo Domingo={"id":"data/CL/V Región de Valparaíso/Santo Domingo","key":"Santo Domingo","lang":"es"}
+data/CL/V Región de Valparaíso/Valparaíso={"id":"data/CL/V Región de Valparaíso/Valparaíso","key":"Valparaíso","lang":"es"}
+data/CL/V Región de Valparaíso/Villa Alemana={"id":"data/CL/V Región de Valparaíso/Villa Alemana","key":"Villa Alemana","lang":"es"}
+data/CL/V Región de Valparaíso/Viña del Mar={"id":"data/CL/V Región de Valparaíso/Viña del Mar","key":"Viña del Mar","lang":"es"}
+data/CL/V Región de Valparaíso/Zapallar={"id":"data/CL/V Región de Valparaíso/Zapallar","key":"Zapallar","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins","key":"VI Región del Libertador General Bernardo O'Higgins","name":"Libertador General Bernardo O'Higgins","lang":"es","isoid":"LI","sub_keys":"Chépica~Chimbarongo~Codegua~Coínco~Coltauco~Doñihue~Graneros~La Estrella~Las Cabras~Litueche~Lolol~Machalí~Malloa~Marchigüe~Nancagua~Navidad~Olivar~Palmilla~Paredones~Peralillo~Peumo~Pichidegua~Pichilemu~Placilla~Pumanque~Quinta de Tilcoco~Rancagua~Rengo~Requínoa~San Fernando~San Francisco de Mostazal~San Vicente de Tagua Tagua~Santa Cruz"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Chimbarongo={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Chimbarongo","key":"Chimbarongo","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Chépica={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Chépica","key":"Chépica","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Codegua={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Codegua","key":"Codegua","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Coltauco={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Coltauco","key":"Coltauco","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Coínco={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Coínco","key":"Coínco","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Doñihue={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Doñihue","key":"Doñihue","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Graneros={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Graneros","key":"Graneros","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/La Estrella={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/La Estrella","key":"La Estrella","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Las Cabras={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Las Cabras","key":"Las Cabras","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Litueche={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Litueche","key":"Litueche","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Lolol={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Lolol","key":"Lolol","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Machalí={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Machalí","key":"Machalí","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Malloa={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Malloa","key":"Malloa","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Marchigüe={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Marchigüe","key":"Marchigüe","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Nancagua={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Nancagua","key":"Nancagua","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Navidad={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Navidad","key":"Navidad","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Olivar={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Olivar","key":"Olivar","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Palmilla={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Palmilla","key":"Palmilla","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Paredones={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Paredones","key":"Paredones","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Peralillo={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Peralillo","key":"Peralillo","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Peumo={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Peumo","key":"Peumo","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Pichidegua={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Pichidegua","key":"Pichidegua","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Pichilemu={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Pichilemu","key":"Pichilemu","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Placilla={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Placilla","key":"Placilla","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Pumanque={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Pumanque","key":"Pumanque","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Quinta de Tilcoco={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Quinta de Tilcoco","key":"Quinta de Tilcoco","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Rancagua={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Rancagua","key":"Rancagua","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Rengo={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Rengo","key":"Rengo","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Requínoa={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Requínoa","key":"Requínoa","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/San Fernando={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/San Fernando","key":"San Fernando","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/San Francisco de Mostazal={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/San Francisco de Mostazal","key":"San Francisco de Mostazal","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/San Vicente de Tagua Tagua={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/San Vicente de Tagua Tagua","key":"San Vicente de Tagua Tagua","lang":"es"}
+data/CL/VI Región del Libertador General Bernardo O'Higgins/Santa Cruz={"id":"data/CL/VI Región del Libertador General Bernardo O'Higgins/Santa Cruz","key":"Santa Cruz","lang":"es"}
+data/CL/VII Región del Maule={"id":"data/CL/VII Región del Maule","key":"VII Región del Maule","name":"Maule","lang":"es","isoid":"ML","sub_keys":"Cauquenes~Chanco~Colbún~Constitución~Curepto~Curicó~Empedrado~Hualañé~Licantén~Linares~Longaví~Maule~Molina~Parral~Pelarco~Pelluhue~Pencahue~Rauco~Retiro~Río Claro~Romeral~Sagrada Familia~San Clemente~San Javier de Loncomilla~San Rafael~Talca~Teno~Vichuquén~Villa Alegre~Yerbas Buenas"}
+data/CL/VII Región del Maule/Cauquenes={"id":"data/CL/VII Región del Maule/Cauquenes","key":"Cauquenes","lang":"es"}
+data/CL/VII Región del Maule/Chanco={"id":"data/CL/VII Región del Maule/Chanco","key":"Chanco","lang":"es"}
+data/CL/VII Región del Maule/Colbún={"id":"data/CL/VII Región del Maule/Colbún","key":"Colbún","lang":"es"}
+data/CL/VII Región del Maule/Constitución={"id":"data/CL/VII Región del Maule/Constitución","key":"Constitución","lang":"es"}
+data/CL/VII Región del Maule/Curepto={"id":"data/CL/VII Región del Maule/Curepto","key":"Curepto","lang":"es"}
+data/CL/VII Región del Maule/Curicó={"id":"data/CL/VII Región del Maule/Curicó","key":"Curicó","lang":"es"}
+data/CL/VII Región del Maule/Empedrado={"id":"data/CL/VII Región del Maule/Empedrado","key":"Empedrado","lang":"es"}
+data/CL/VII Región del Maule/Hualañé={"id":"data/CL/VII Región del Maule/Hualañé","key":"Hualañé","lang":"es"}
+data/CL/VII Región del Maule/Licantén={"id":"data/CL/VII Región del Maule/Licantén","key":"Licantén","lang":"es"}
+data/CL/VII Región del Maule/Linares={"id":"data/CL/VII Región del Maule/Linares","key":"Linares","lang":"es"}
+data/CL/VII Región del Maule/Longaví={"id":"data/CL/VII Región del Maule/Longaví","key":"Longaví","lang":"es"}
+data/CL/VII Región del Maule/Maule={"id":"data/CL/VII Región del Maule/Maule","key":"Maule","lang":"es"}
+data/CL/VII Región del Maule/Molina={"id":"data/CL/VII Región del Maule/Molina","key":"Molina","lang":"es"}
+data/CL/VII Región del Maule/Parral={"id":"data/CL/VII Región del Maule/Parral","key":"Parral","lang":"es"}
+data/CL/VII Región del Maule/Pelarco={"id":"data/CL/VII Región del Maule/Pelarco","key":"Pelarco","lang":"es"}
+data/CL/VII Región del Maule/Pelluhue={"id":"data/CL/VII Región del Maule/Pelluhue","key":"Pelluhue","lang":"es"}
+data/CL/VII Región del Maule/Pencahue={"id":"data/CL/VII Región del Maule/Pencahue","key":"Pencahue","lang":"es"}
+data/CL/VII Región del Maule/Rauco={"id":"data/CL/VII Región del Maule/Rauco","key":"Rauco","lang":"es"}
+data/CL/VII Región del Maule/Retiro={"id":"data/CL/VII Región del Maule/Retiro","key":"Retiro","lang":"es"}
+data/CL/VII Región del Maule/Romeral={"id":"data/CL/VII Región del Maule/Romeral","key":"Romeral","lang":"es"}
+data/CL/VII Región del Maule/Río Claro={"id":"data/CL/VII Región del Maule/Río Claro","key":"Río Claro","lang":"es"}
+data/CL/VII Región del Maule/Sagrada Familia={"id":"data/CL/VII Región del Maule/Sagrada Familia","key":"Sagrada Familia","lang":"es"}
+data/CL/VII Región del Maule/San Clemente={"id":"data/CL/VII Región del Maule/San Clemente","key":"San Clemente","lang":"es"}
+data/CL/VII Región del Maule/San Javier de Loncomilla={"id":"data/CL/VII Región del Maule/San Javier de Loncomilla","key":"San Javier de Loncomilla","lang":"es"}
+data/CL/VII Región del Maule/San Rafael={"id":"data/CL/VII Región del Maule/San Rafael","key":"San Rafael","lang":"es"}
+data/CL/VII Región del Maule/Talca={"id":"data/CL/VII Región del Maule/Talca","key":"Talca","lang":"es"}
+data/CL/VII Región del Maule/Teno={"id":"data/CL/VII Región del Maule/Teno","key":"Teno","lang":"es"}
+data/CL/VII Región del Maule/Vichuquén={"id":"data/CL/VII Región del Maule/Vichuquén","key":"Vichuquén","lang":"es"}
+data/CL/VII Región del Maule/Villa Alegre={"id":"data/CL/VII Región del Maule/Villa Alegre","key":"Villa Alegre","lang":"es"}
+data/CL/VII Región del Maule/Yerbas Buenas={"id":"data/CL/VII Región del Maule/Yerbas Buenas","key":"Yerbas Buenas","lang":"es"}
+data/CL/VIII Región del Biobío={"id":"data/CL/VIII Región del Biobío","key":"VIII Región del Biobío","name":"Biobío","lang":"es","isoid":"BI","sub_keys":"Alto Biobío~Antuco~Arauco~Bulnes~Cabrero~Cañete~Chiguayante~Chillán~Chillán Viejo~Cobquecura~Coelemu~Coihueco~Concepción~Contulmo~Coronel~Curanilahue~El Carmen~Florida~Hualpén~Hualqui~Laja~Lebu~Los Álamos~Los Ángeles~Lota~Mulchén~Nacimiento~Negrete~Ninhue~Ñiquén~Pemuco~Penco~Pinto~Portezuelo~Quilaco~Quilleco~Quillón~Quirihue~Ránquil~San Carlos~San Fabián~San Ignacio~San Nicolás~San Pedro de la Paz~San Rosendo~Santa Bárbara~Santa Juana~Talcahuano~Tirúa~Tomé~Treguaco~Tucapel~Yumbel~Yungay"}
+data/CL/VIII Región del Biobío/Alto Biobío={"id":"data/CL/VIII Región del Biobío/Alto Biobío","key":"Alto Biobío","lang":"es"}
+data/CL/VIII Región del Biobío/Antuco={"id":"data/CL/VIII Región del Biobío/Antuco","key":"Antuco","lang":"es"}
+data/CL/VIII Región del Biobío/Arauco={"id":"data/CL/VIII Región del Biobío/Arauco","key":"Arauco","lang":"es"}
+data/CL/VIII Región del Biobío/Bulnes={"id":"data/CL/VIII Región del Biobío/Bulnes","key":"Bulnes","lang":"es"}
+data/CL/VIII Región del Biobío/Cabrero={"id":"data/CL/VIII Región del Biobío/Cabrero","key":"Cabrero","lang":"es"}
+data/CL/VIII Región del Biobío/Cañete={"id":"data/CL/VIII Región del Biobío/Cañete","key":"Cañete","lang":"es"}
+data/CL/VIII Región del Biobío/Chiguayante={"id":"data/CL/VIII Región del Biobío/Chiguayante","key":"Chiguayante","lang":"es"}
+data/CL/VIII Región del Biobío/Chillán={"id":"data/CL/VIII Región del Biobío/Chillán","key":"Chillán","lang":"es"}
+data/CL/VIII Región del Biobío/Chillán Viejo={"id":"data/CL/VIII Región del Biobío/Chillán Viejo","key":"Chillán Viejo","lang":"es"}
+data/CL/VIII Región del Biobío/Cobquecura={"id":"data/CL/VIII Región del Biobío/Cobquecura","key":"Cobquecura","lang":"es"}
+data/CL/VIII Región del Biobío/Coelemu={"id":"data/CL/VIII Región del Biobío/Coelemu","key":"Coelemu","lang":"es"}
+data/CL/VIII Región del Biobío/Coihueco={"id":"data/CL/VIII Región del Biobío/Coihueco","key":"Coihueco","lang":"es"}
+data/CL/VIII Región del Biobío/Concepción={"id":"data/CL/VIII Región del Biobío/Concepción","key":"Concepción","lang":"es"}
+data/CL/VIII Región del Biobío/Contulmo={"id":"data/CL/VIII Región del Biobío/Contulmo","key":"Contulmo","lang":"es"}
+data/CL/VIII Región del Biobío/Coronel={"id":"data/CL/VIII Región del Biobío/Coronel","key":"Coronel","lang":"es"}
+data/CL/VIII Región del Biobío/Curanilahue={"id":"data/CL/VIII Región del Biobío/Curanilahue","key":"Curanilahue","lang":"es"}
+data/CL/VIII Región del Biobío/El Carmen={"id":"data/CL/VIII Región del Biobío/El Carmen","key":"El Carmen","lang":"es"}
+data/CL/VIII Región del Biobío/Florida={"id":"data/CL/VIII Región del Biobío/Florida","key":"Florida","lang":"es"}
+data/CL/VIII Región del Biobío/Hualpén={"id":"data/CL/VIII Región del Biobío/Hualpén","key":"Hualpén","lang":"es"}
+data/CL/VIII Región del Biobío/Hualqui={"id":"data/CL/VIII Región del Biobío/Hualqui","key":"Hualqui","lang":"es"}
+data/CL/VIII Región del Biobío/Laja={"id":"data/CL/VIII Región del Biobío/Laja","key":"Laja","lang":"es"}
+data/CL/VIII Región del Biobío/Lebu={"id":"data/CL/VIII Región del Biobío/Lebu","key":"Lebu","lang":"es"}
+data/CL/VIII Región del Biobío/Los Álamos={"id":"data/CL/VIII Región del Biobío/Los Álamos","key":"Los Álamos","lang":"es"}
+data/CL/VIII Región del Biobío/Los Ángeles={"id":"data/CL/VIII Región del Biobío/Los Ángeles","key":"Los Ángeles","lang":"es"}
+data/CL/VIII Región del Biobío/Lota={"id":"data/CL/VIII Región del Biobío/Lota","key":"Lota","lang":"es"}
+data/CL/VIII Región del Biobío/Mulchén={"id":"data/CL/VIII Región del Biobío/Mulchén","key":"Mulchén","lang":"es"}
+data/CL/VIII Región del Biobío/Nacimiento={"id":"data/CL/VIII Región del Biobío/Nacimiento","key":"Nacimiento","lang":"es"}
+data/CL/VIII Región del Biobío/Negrete={"id":"data/CL/VIII Región del Biobío/Negrete","key":"Negrete","lang":"es"}
+data/CL/VIII Región del Biobío/Ninhue={"id":"data/CL/VIII Región del Biobío/Ninhue","key":"Ninhue","lang":"es"}
+data/CL/VIII Región del Biobío/Pemuco={"id":"data/CL/VIII Región del Biobío/Pemuco","key":"Pemuco","lang":"es"}
+data/CL/VIII Región del Biobío/Penco={"id":"data/CL/VIII Región del Biobío/Penco","key":"Penco","lang":"es"}
+data/CL/VIII Región del Biobío/Pinto={"id":"data/CL/VIII Región del Biobío/Pinto","key":"Pinto","lang":"es"}
+data/CL/VIII Región del Biobío/Portezuelo={"id":"data/CL/VIII Región del Biobío/Portezuelo","key":"Portezuelo","lang":"es"}
+data/CL/VIII Región del Biobío/Quilaco={"id":"data/CL/VIII Región del Biobío/Quilaco","key":"Quilaco","lang":"es"}
+data/CL/VIII Región del Biobío/Quilleco={"id":"data/CL/VIII Región del Biobío/Quilleco","key":"Quilleco","lang":"es"}
+data/CL/VIII Región del Biobío/Quillón={"id":"data/CL/VIII Región del Biobío/Quillón","key":"Quillón","lang":"es"}
+data/CL/VIII Región del Biobío/Quirihue={"id":"data/CL/VIII Región del Biobío/Quirihue","key":"Quirihue","lang":"es"}
+data/CL/VIII Región del Biobío/Ránquil={"id":"data/CL/VIII Región del Biobío/Ránquil","key":"Ránquil","lang":"es"}
+data/CL/VIII Región del Biobío/San Carlos={"id":"data/CL/VIII Región del Biobío/San Carlos","key":"San Carlos","lang":"es"}
+data/CL/VIII Región del Biobío/San Fabián={"id":"data/CL/VIII Región del Biobío/San Fabián","key":"San Fabián","lang":"es"}
+data/CL/VIII Región del Biobío/San Ignacio={"id":"data/CL/VIII Región del Biobío/San Ignacio","key":"San Ignacio","lang":"es"}
+data/CL/VIII Región del Biobío/San Nicolás={"id":"data/CL/VIII Región del Biobío/San Nicolás","key":"San Nicolás","lang":"es"}
+data/CL/VIII Región del Biobío/San Pedro de la Paz={"id":"data/CL/VIII Región del Biobío/San Pedro de la Paz","key":"San Pedro de la Paz","lang":"es"}
+data/CL/VIII Región del Biobío/San Rosendo={"id":"data/CL/VIII Región del Biobío/San Rosendo","key":"San Rosendo","lang":"es"}
+data/CL/VIII Región del Biobío/Santa Bárbara={"id":"data/CL/VIII Región del Biobío/Santa Bárbara","key":"Santa Bárbara","lang":"es"}
+data/CL/VIII Región del Biobío/Santa Juana={"id":"data/CL/VIII Región del Biobío/Santa Juana","key":"Santa Juana","lang":"es"}
+data/CL/VIII Región del Biobío/Talcahuano={"id":"data/CL/VIII Región del Biobío/Talcahuano","key":"Talcahuano","lang":"es"}
+data/CL/VIII Región del Biobío/Tirúa={"id":"data/CL/VIII Región del Biobío/Tirúa","key":"Tirúa","lang":"es"}
+data/CL/VIII Región del Biobío/Tomé={"id":"data/CL/VIII Región del Biobío/Tomé","key":"Tomé","lang":"es"}
+data/CL/VIII Región del Biobío/Treguaco={"id":"data/CL/VIII Región del Biobío/Treguaco","key":"Treguaco","lang":"es"}
+data/CL/VIII Región del Biobío/Tucapel={"id":"data/CL/VIII Región del Biobío/Tucapel","key":"Tucapel","lang":"es"}
+data/CL/VIII Región del Biobío/Yumbel={"id":"data/CL/VIII Región del Biobío/Yumbel","key":"Yumbel","lang":"es"}
+data/CL/VIII Región del Biobío/Yungay={"id":"data/CL/VIII Región del Biobío/Yungay","key":"Yungay","lang":"es"}
+data/CL/VIII Región del Biobío/Ñiquén={"id":"data/CL/VIII Región del Biobío/Ñiquén","key":"Ñiquén","lang":"es"}
+data/CL/X Región de Los Lagos={"id":"data/CL/X Región de Los Lagos","key":"X Región de Los Lagos","name":"Los Lagos","lang":"es","isoid":"LL","sub_keys":"Ancud~Calbuco~Castro~Chaitén~Chonchi~Cochamó~Curaco de Vélez~Dalcahue~Fresia~Frutillar~Futaleufú~Hualaihué~Llanquihue~Los Muermos~Maullín~Osorno~Palena~Puerto Montt~Puerto Octay~Puerto Varas~Puqueldón~Purranque~Puyehue~Queilén~Quellón~Quemchi~Quinchao~Río Negro~San Juan de la Costa~San Pablo"}
+data/CL/X Región de Los Lagos/Ancud={"id":"data/CL/X Región de Los Lagos/Ancud","key":"Ancud","lang":"es"}
+data/CL/X Región de Los Lagos/Calbuco={"id":"data/CL/X Región de Los Lagos/Calbuco","key":"Calbuco","lang":"es"}
+data/CL/X Región de Los Lagos/Castro={"id":"data/CL/X Región de Los Lagos/Castro","key":"Castro","lang":"es"}
+data/CL/X Región de Los Lagos/Chaitén={"id":"data/CL/X Región de Los Lagos/Chaitén","key":"Chaitén","lang":"es"}
+data/CL/X Región de Los Lagos/Chonchi={"id":"data/CL/X Región de Los Lagos/Chonchi","key":"Chonchi","lang":"es"}
+data/CL/X Región de Los Lagos/Cochamó={"id":"data/CL/X Región de Los Lagos/Cochamó","key":"Cochamó","lang":"es"}
+data/CL/X Región de Los Lagos/Curaco de Vélez={"id":"data/CL/X Región de Los Lagos/Curaco de Vélez","key":"Curaco de Vélez","lang":"es"}
+data/CL/X Región de Los Lagos/Dalcahue={"id":"data/CL/X Región de Los Lagos/Dalcahue","key":"Dalcahue","lang":"es"}
+data/CL/X Región de Los Lagos/Fresia={"id":"data/CL/X Región de Los Lagos/Fresia","key":"Fresia","lang":"es"}
+data/CL/X Región de Los Lagos/Frutillar={"id":"data/CL/X Región de Los Lagos/Frutillar","key":"Frutillar","lang":"es"}
+data/CL/X Región de Los Lagos/Futaleufú={"id":"data/CL/X Región de Los Lagos/Futaleufú","key":"Futaleufú","lang":"es"}
+data/CL/X Región de Los Lagos/Hualaihué={"id":"data/CL/X Región de Los Lagos/Hualaihué","key":"Hualaihué","lang":"es"}
+data/CL/X Región de Los Lagos/Llanquihue={"id":"data/CL/X Región de Los Lagos/Llanquihue","key":"Llanquihue","lang":"es"}
+data/CL/X Región de Los Lagos/Los Muermos={"id":"data/CL/X Región de Los Lagos/Los Muermos","key":"Los Muermos","lang":"es"}
+data/CL/X Región de Los Lagos/Maullín={"id":"data/CL/X Región de Los Lagos/Maullín","key":"Maullín","lang":"es"}
+data/CL/X Región de Los Lagos/Osorno={"id":"data/CL/X Región de Los Lagos/Osorno","key":"Osorno","lang":"es"}
+data/CL/X Región de Los Lagos/Palena={"id":"data/CL/X Región de Los Lagos/Palena","key":"Palena","lang":"es"}
+data/CL/X Región de Los Lagos/Puerto Montt={"id":"data/CL/X Región de Los Lagos/Puerto Montt","key":"Puerto Montt","lang":"es"}
+data/CL/X Región de Los Lagos/Puerto Octay={"id":"data/CL/X Región de Los Lagos/Puerto Octay","key":"Puerto Octay","lang":"es"}
+data/CL/X Región de Los Lagos/Puerto Varas={"id":"data/CL/X Región de Los Lagos/Puerto Varas","key":"Puerto Varas","lang":"es"}
+data/CL/X Región de Los Lagos/Puqueldón={"id":"data/CL/X Región de Los Lagos/Puqueldón","key":"Puqueldón","lang":"es"}
+data/CL/X Región de Los Lagos/Purranque={"id":"data/CL/X Región de Los Lagos/Purranque","key":"Purranque","lang":"es"}
+data/CL/X Región de Los Lagos/Puyehue={"id":"data/CL/X Región de Los Lagos/Puyehue","key":"Puyehue","lang":"es"}
+data/CL/X Región de Los Lagos/Queilén={"id":"data/CL/X Región de Los Lagos/Queilén","key":"Queilén","lang":"es"}
+data/CL/X Región de Los Lagos/Quellón={"id":"data/CL/X Región de Los Lagos/Quellón","key":"Quellón","lang":"es"}
+data/CL/X Región de Los Lagos/Quemchi={"id":"data/CL/X Región de Los Lagos/Quemchi","key":"Quemchi","lang":"es"}
+data/CL/X Región de Los Lagos/Quinchao={"id":"data/CL/X Región de Los Lagos/Quinchao","key":"Quinchao","lang":"es"}
+data/CL/X Región de Los Lagos/Río Negro={"id":"data/CL/X Región de Los Lagos/Río Negro","key":"Río Negro","lang":"es"}
+data/CL/X Región de Los Lagos/San Juan de la Costa={"id":"data/CL/X Región de Los Lagos/San Juan de la Costa","key":"San Juan de la Costa","lang":"es"}
+data/CL/X Región de Los Lagos/San Pablo={"id":"data/CL/X Región de Los Lagos/San Pablo","key":"San Pablo","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo","key":"XI Región Aysén del General Carlos Ibáñez del Campo","name":"Aysén del General Carlos Ibáñez del Campo","lang":"es","isoid":"AI","sub_keys":"Aysén~Chile Chico~Cisnes~Cochrane~Coyhaique~Guaitecas~Lago Verde~O'Higgins~Río Ibáñez~Tortel"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Aysén={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Aysén","key":"Aysén","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Chile Chico={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Chile Chico","key":"Chile Chico","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Cisnes={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Cisnes","key":"Cisnes","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Cochrane={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Cochrane","key":"Cochrane","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Coyhaique={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Coyhaique","key":"Coyhaique","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Guaitecas={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Guaitecas","key":"Guaitecas","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Lago Verde={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Lago Verde","key":"Lago Verde","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/O'Higgins={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/O'Higgins","key":"O'Higgins","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Río Ibáñez={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Río Ibáñez","key":"Río Ibáñez","lang":"es"}
+data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Tortel={"id":"data/CL/XI Región Aysén del General Carlos Ibáñez del Campo/Tortel","key":"Tortel","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena","key":"XII Región de Magallanes y de la Antártica Chilena","name":"Magallanes y de la Antártica Chilena","lang":"es","isoid":"MA","sub_keys":"Antártica~Cabo de Hornos~Laguna Blanca~Natales~Porvenir~Primavera~Punta Arenas~Río Verde~San Gregorio~Timaukel~Torres del Paine"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Antártica={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Antártica","key":"Antártica","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Cabo de Hornos={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Cabo de Hornos","key":"Cabo de Hornos","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Laguna Blanca={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Laguna Blanca","key":"Laguna Blanca","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Natales={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Natales","key":"Natales","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Porvenir={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Porvenir","key":"Porvenir","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Primavera={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Primavera","key":"Primavera","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Punta Arenas={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Punta Arenas","key":"Punta Arenas","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Río Verde={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Río Verde","key":"Río Verde","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/San Gregorio={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/San Gregorio","key":"San Gregorio","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Timaukel={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Timaukel","key":"Timaukel","lang":"es"}
+data/CL/XII Región de Magallanes y de la Antártica Chilena/Torres del Paine={"id":"data/CL/XII Región de Magallanes y de la Antártica Chilena/Torres del Paine","key":"Torres del Paine","lang":"es"}
+data/CL/XIV Región de Los Ríos={"id":"data/CL/XIV Región de Los Ríos","key":"XIV Región de Los Ríos","name":"Los Ríos","lang":"es","isoid":"LR","sub_keys":"Corral~Futrono~La Unión~Lago Ranco~Lanco~Los Lagos~Máfil~Mariquina~Paillaco~Panguipulli~Río Bueno~Valdivia"}
+data/CL/XIV Región de Los Ríos/Corral={"id":"data/CL/XIV Región de Los Ríos/Corral","key":"Corral","lang":"es"}
+data/CL/XIV Región de Los Ríos/Futrono={"id":"data/CL/XIV Región de Los Ríos/Futrono","key":"Futrono","lang":"es"}
+data/CL/XIV Región de Los Ríos/La Unión={"id":"data/CL/XIV Región de Los Ríos/La Unión","key":"La Unión","lang":"es"}
+data/CL/XIV Región de Los Ríos/Lago Ranco={"id":"data/CL/XIV Región de Los Ríos/Lago Ranco","key":"Lago Ranco","lang":"es"}
+data/CL/XIV Región de Los Ríos/Lanco={"id":"data/CL/XIV Región de Los Ríos/Lanco","key":"Lanco","lang":"es"}
+data/CL/XIV Región de Los Ríos/Los Lagos={"id":"data/CL/XIV Región de Los Ríos/Los Lagos","key":"Los Lagos","lang":"es"}
+data/CL/XIV Región de Los Ríos/Mariquina={"id":"data/CL/XIV Región de Los Ríos/Mariquina","key":"Mariquina","lang":"es"}
+data/CL/XIV Región de Los Ríos/Máfil={"id":"data/CL/XIV Región de Los Ríos/Máfil","key":"Máfil","lang":"es"}
+data/CL/XIV Región de Los Ríos/Paillaco={"id":"data/CL/XIV Región de Los Ríos/Paillaco","key":"Paillaco","lang":"es"}
+data/CL/XIV Región de Los Ríos/Panguipulli={"id":"data/CL/XIV Región de Los Ríos/Panguipulli","key":"Panguipulli","lang":"es"}
+data/CL/XIV Región de Los Ríos/Río Bueno={"id":"data/CL/XIV Región de Los Ríos/Río Bueno","key":"Río Bueno","lang":"es"}
+data/CL/XIV Región de Los Ríos/Valdivia={"id":"data/CL/XIV Región de Los Ríos/Valdivia","key":"Valdivia","lang":"es"}
+data/CL/XV Región de Arica y Parinacota={"id":"data/CL/XV Región de Arica y Parinacota","key":"XV Región de Arica y Parinacota","name":"Arica y Parinacota","lang":"es","isoid":"AP","sub_keys":"Arica~Camarones~General Lagos~Putre"}
+data/CL/XV Región de Arica y Parinacota/Arica={"id":"data/CL/XV Región de Arica y Parinacota/Arica","key":"Arica","lang":"es"}
+data/CL/XV Región de Arica y Parinacota/Camarones={"id":"data/CL/XV Región de Arica y Parinacota/Camarones","key":"Camarones","lang":"es"}
+data/CL/XV Región de Arica y Parinacota/General Lagos={"id":"data/CL/XV Región de Arica y Parinacota/General Lagos","key":"General Lagos","lang":"es"}
+data/CL/XV Región de Arica y Parinacota/Putre={"id":"data/CL/XV Región de Arica y Parinacota/Putre","key":"Putre","lang":"es"}
+data/CM={"id":"data/CM","key":"CM","name":"CAMEROON"}
+data/CN={"id":"data/CN","key":"CN","name":"P.R. CHINA","lang":"zh-hans","languages":"zh-hans","fmt":"%Z%n%S%C%D%n%A%n%O%n%N","lfmt":"%N%n%O%n%A, %D%n%C%n%S, %Z","require":"ACSZ","upper":"S","zip":"\\d{6}","zipex":"266033,317204,100096,100808","posturl":"http://www.cpdc.com.cn/postcdQueryAction.do?reqCode=gotoQueryPostAddr","sub_keys":"安徽省~澳门~北京市~福建省~甘肃省~广东省~广西~贵州省~海南省~河北省~河南省~黑龙江省~湖北省~湖南省~吉林省~江苏省~江西省~辽宁省~内蒙古~宁夏~青海省~山东省~山西省~陕西省~上海市~四川省~台湾~天津市~西藏~香港~新疆~云南省~浙江省~重庆市","sub_lnames":"Anhui Sheng~Macau~Beijing Shi~Fujian Sheng~Gansu Sheng~Guangdong Sheng~Guangxi~Guizhou Sheng~Hainan Sheng~Hebei Sheng~Henan Sheng~Heilongjiang Sheng~Hubei Sheng~Hunan Sheng~Jilin Sheng~Jiangsu Sheng~Jiangxi Sheng~Liaoning Sheng~Nei Mongol~Ningxia~Qinghai Sheng~Shandong Sheng~Shanxi Sheng~Shaanxi Sheng~Shanghai Shi~Sichuan Sheng~Taiwan~Tianjin Shi~Xizang~Hong Kong~Xinjiang~Yunnan Sheng~Zhejiang Sheng~Chongqing Shi","sub_isoids":"34~92~11~35~62~44~45~52~46~13~41~23~42~43~22~32~36~21~15~64~63~37~14~61~31~51~71~12~54~91~65~53~33~50","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true","sub_xzips":"~999078~~~~~~~~~~~~~~~~~~~~~~~~~\\d{3}(\\d{2})?~~~999077~~~~","sub_xrequires":"~A~~~~~~~~~~~~~~~~~~~~~~~~~~~~ACS~~~~"}
+data/CN/上海市={"id":"data/CN/上海市","key":"上海市","lang":"zh-hans","lname":"Shanghai Shi","isoid":"31","sub_keys":"宝山区~长宁区~崇明县~奉贤区~虹口区~黄浦区~嘉定区~金山区~静安区~闵行区~浦东新区~普陀区~青浦区~松江区~徐汇区~杨浦区~闸北区","sub_lnames":"Baoshan Qu~Changning Qu~Chongming Xian~Fengxian Qu~Hongkou Qu~Huangpu Qu~Jiading Qu~Jinshan Qu~Jing'an Qu~Minhang Qu~Pudong Xinqu~Putuo Qu~Qingpu Qu~Songjiang Qu~Xuhui Qu~Yangpu Qu~Zhabei Qu","sub_zipexs":"201900~200050~201500~201400~200080~200002~201800~201500~200040~201100~200120~200063~201700~201600~200030~200082~200070"}
+data/CN/上海市/嘉定区={"id":"data/CN/上海市/嘉定区","key":"嘉定区","lang":"zh-hans","lname":"Jiading Qu","zipex":"201800"}
+data/CN/上海市/奉贤区={"id":"data/CN/上海市/奉贤区","key":"奉贤区","lang":"zh-hans","lname":"Fengxian Qu","zipex":"201400"}
+data/CN/上海市/宝山区={"id":"data/CN/上海市/宝山区","key":"宝山区","lang":"zh-hans","lname":"Baoshan Qu","zipex":"201900"}
+data/CN/上海市/崇明县={"id":"data/CN/上海市/崇明县","key":"崇明县","lang":"zh-hans","lname":"Chongming Xian","zipex":"201500"}
+data/CN/上海市/徐汇区={"id":"data/CN/上海市/徐汇区","key":"徐汇区","lang":"zh-hans","lname":"Xuhui Qu","zipex":"200030"}
+data/CN/上海市/普陀区={"id":"data/CN/上海市/普陀区","key":"普陀区","lang":"zh-hans","lname":"Putuo Qu","zipex":"200063"}
+data/CN/上海市/杨浦区={"id":"data/CN/上海市/杨浦区","key":"杨浦区","lang":"zh-hans","lname":"Yangpu Qu","zipex":"200082"}
+data/CN/上海市/松江区={"id":"data/CN/上海市/松江区","key":"松江区","lang":"zh-hans","lname":"Songjiang Qu","zipex":"201600"}
+data/CN/上海市/浦东新区={"id":"data/CN/上海市/浦东新区","key":"浦东新区","lang":"zh-hans","lname":"Pudong Xinqu","zipex":"200120"}
+data/CN/上海市/虹口区={"id":"data/CN/上海市/虹口区","key":"虹口区","lang":"zh-hans","lname":"Hongkou Qu","zipex":"200080"}
+data/CN/上海市/金山区={"id":"data/CN/上海市/金山区","key":"金山区","lang":"zh-hans","lname":"Jinshan Qu","zipex":"201500"}
+data/CN/上海市/长宁区={"id":"data/CN/上海市/长宁区","key":"长宁区","lang":"zh-hans","lname":"Changning Qu","zipex":"200050"}
+data/CN/上海市/闵行区={"id":"data/CN/上海市/闵行区","key":"闵行区","lang":"zh-hans","lname":"Minhang Qu","zipex":"201100"}
+data/CN/上海市/闸北区={"id":"data/CN/上海市/闸北区","key":"闸北区","lang":"zh-hans","lname":"Zhabei Qu","zipex":"200070"}
+data/CN/上海市/青浦区={"id":"data/CN/上海市/青浦区","key":"青浦区","lang":"zh-hans","lname":"Qingpu Qu","zipex":"201700"}
+data/CN/上海市/静安区={"id":"data/CN/上海市/静安区","key":"静安区","lang":"zh-hans","lname":"Jing'an Qu","zipex":"200040"}
+data/CN/上海市/黄浦区={"id":"data/CN/上海市/黄浦区","key":"黄浦区","lang":"zh-hans","lname":"Huangpu Qu","zipex":"200002"}
+data/CN/云南省={"id":"data/CN/云南省","key":"云南省","lang":"zh-hans","lname":"Yunnan Sheng","isoid":"53","sub_keys":"保山市~楚雄彝族自治州~大理白族自治州~德宏傣族景颇族自治州~迪庆藏族自治州~红河哈尼族彝族自治州~昆明市~丽江市~临沧市~怒江傈僳族自治州~普洱市~曲靖市~文山壮族苗族自治州~西双版纳傣族自治州~玉溪市~昭通市","sub_lnames":"Baoshan Shi~Chuxiong Zhou~Dali Zhou~Dehong Zhou~Dêqên Zhou~Honghe Zhou~Kunming Shi~Lijiang Shi~Lincang Shi~Nujiang Zhou~Puer Shi~Qujing Shi~Wenshan Zhou~Xishuangbanna Zhou~Yuxi Shi~Zhaotong Shi","sub_zipexs":"678000~675000~671000~678400~674400~661400~650011~674100~677000~673100~665000~655000~663000~666100~653100~657000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true","sub_lfnames":"~Chuxiong Yizu Zizhizhou~Dali Baizu Zizhizhou~Dehong Daizu Jingpozu Zizhizhou~Dêqên Zangzu Zizhizhou~Honghe Hanizu Yizu Zizhizhou~~~~Nujiang Lisuzu Zizhizhou~~~Wenshan Zhuangzu Miaozu Zizhizhou~Xishuangbanna Daizu Zizhizhou~~"}
+data/CN/云南省/临沧市={"id":"data/CN/云南省/临沧市","key":"临沧市","lang":"zh-hans","lname":"Lincang Shi","zipex":"677000","sub_keys":"沧源佤族自治县~凤庆县~耿马傣族佤族自治县~临翔区~双江拉祜族佤族布朗族傣族自治县~永德县~云县~镇康县","sub_lnames":"Cangyuan Xian~Fengqing Xian~Gengma Xian~Linxiang Qu~Shuangjiang Xian~Yongde Xian~Yun Xian~Zhenkang Xian","sub_zipexs":"677400~675900~677500~677000~677300~677600~675800~677704","sub_lfnames":"Cangyuan Vazu Zizhixian~~Gengma Daizu Vazu Zizhixian~~Shuangjiang Lahuzu Vazu Blangzu Daizu Zizhixian~~~"}
+data/CN/云南省/临沧市/临翔区={"id":"data/CN/云南省/临沧市/临翔区","key":"临翔区","lang":"zh-hans","lname":"Linxiang Qu","zipex":"677000"}
+data/CN/云南省/临沧市/云县={"id":"data/CN/云南省/临沧市/云县","key":"云县","lang":"zh-hans","lname":"Yun Xian","zipex":"675800"}
+data/CN/云南省/临沧市/凤庆县={"id":"data/CN/云南省/临沧市/凤庆县","key":"凤庆县","lang":"zh-hans","lname":"Fengqing Xian","zipex":"675900"}
+data/CN/云南省/临沧市/双江拉祜族佤族布朗族傣族自治县={"id":"data/CN/云南省/临沧市/双江拉祜族佤族布朗族傣族自治县","key":"双江拉祜族佤族布朗族傣族自治县","lang":"zh-hans","lname":"Shuangjiang Xian","zipex":"677300","lfname":"Shuangjiang Lahuzu Vazu Blangzu Daizu Zizhixian"}
+data/CN/云南省/临沧市/永德县={"id":"data/CN/云南省/临沧市/永德县","key":"永德县","lang":"zh-hans","lname":"Yongde Xian","zipex":"677600"}
+data/CN/云南省/临沧市/沧源佤族自治县={"id":"data/CN/云南省/临沧市/沧源佤族自治县","key":"沧源佤族自治县","lang":"zh-hans","lname":"Cangyuan Xian","zipex":"677400","lfname":"Cangyuan Vazu Zizhixian"}
+data/CN/云南省/临沧市/耿马傣族佤族自治县={"id":"data/CN/云南省/临沧市/耿马傣族佤族自治县","key":"耿马傣族佤族自治县","lang":"zh-hans","lname":"Gengma Xian","zipex":"677500","lfname":"Gengma Daizu Vazu Zizhixian"}
+data/CN/云南省/临沧市/镇康县={"id":"data/CN/云南省/临沧市/镇康县","key":"镇康县","lang":"zh-hans","lname":"Zhenkang Xian","zipex":"677704"}
+data/CN/云南省/丽江市={"id":"data/CN/云南省/丽江市","key":"丽江市","lang":"zh-hans","lname":"Lijiang Shi","zipex":"674100","sub_keys":"古城区~华坪县~宁蒗彝族自治县~永胜县~玉龙纳西族自治县","sub_lnames":"Gucheng Qu~Huaping Xian~Ninglang Xian~Yongsheng Xian~Yulong Xian","sub_zipexs":"674100~674800~674300~674200~674100","sub_lfnames":"~~Ninglang Yizu Zizhixian~~Yulong Naki Zizhixian"}
+data/CN/云南省/丽江市/华坪县={"id":"data/CN/云南省/丽江市/华坪县","key":"华坪县","lang":"zh-hans","lname":"Huaping Xian","zipex":"674800"}
+data/CN/云南省/丽江市/古城区={"id":"data/CN/云南省/丽江市/古城区","key":"古城区","lang":"zh-hans","lname":"Gucheng Qu","zipex":"674100"}
+data/CN/云南省/丽江市/宁蒗彝族自治县={"id":"data/CN/云南省/丽江市/宁蒗彝族自治县","key":"宁蒗彝族自治县","lang":"zh-hans","lname":"Ninglang Xian","zipex":"674300","lfname":"Ninglang Yizu Zizhixian"}
+data/CN/云南省/丽江市/永胜县={"id":"data/CN/云南省/丽江市/永胜县","key":"永胜县","lang":"zh-hans","lname":"Yongsheng Xian","zipex":"674200"}
+data/CN/云南省/丽江市/玉龙纳西族自治县={"id":"data/CN/云南省/丽江市/玉龙纳西族自治县","key":"玉龙纳西族自治县","lang":"zh-hans","lname":"Yulong Xian","zipex":"674100","lfname":"Yulong Naki Zizhixian"}
+data/CN/云南省/保山市={"id":"data/CN/云南省/保山市","key":"保山市","lang":"zh-hans","lname":"Baoshan Shi","zipex":"678000","sub_keys":"昌宁县~龙陵县~隆阳区~施甸县~腾冲县","sub_lnames":"Changning Xian~Longling Xian~Longyang Qu~Shidian Xian~Tengchong Xian","sub_zipexs":"678100~678300~678000~678200~679100"}
+data/CN/云南省/保山市/施甸县={"id":"data/CN/云南省/保山市/施甸县","key":"施甸县","lang":"zh-hans","lname":"Shidian Xian","zipex":"678200"}
+data/CN/云南省/保山市/昌宁县={"id":"data/CN/云南省/保山市/昌宁县","key":"昌宁县","lang":"zh-hans","lname":"Changning Xian","zipex":"678100"}
+data/CN/云南省/保山市/腾冲县={"id":"data/CN/云南省/保山市/腾冲县","key":"腾冲县","lang":"zh-hans","lname":"Tengchong Xian","zipex":"679100"}
+data/CN/云南省/保山市/隆阳区={"id":"data/CN/云南省/保山市/隆阳区","key":"隆阳区","lang":"zh-hans","lname":"Longyang Qu","zipex":"678000"}
+data/CN/云南省/保山市/龙陵县={"id":"data/CN/云南省/保山市/龙陵县","key":"龙陵县","lang":"zh-hans","lname":"Longling Xian","zipex":"678300"}
+data/CN/云南省/大理白族自治州={"id":"data/CN/云南省/大理白族自治州","key":"大理白族自治州","lang":"zh-hans","lname":"Dali Zhou","zipex":"671000","lfname":"Dali Baizu Zizhizhou","sub_keys":"宾川县~大理市~洱源县~鹤庆县~剑川县~弥渡县~南涧彝族自治县~巍山彝族回族自治县~祥云县~漾濞彝族自治县~永平县~云龙县","sub_lnames":"Binchuan Xian~Dali Shi~Eryuan Xian~Heqing Xian~Jianchuan Xian~Midu Xian~Nanjian Xian~Weishan Xian~Xiangyun Xian~Yangbi Xian~Yongping Xian~Yunlong Xian","sub_zipexs":"671600~671000~671200~671500~671300~675600~675700~672400~672100~672500~672600~672700","sub_lfnames":"~~~~~~Nanjian Yizu Zizhixian~Weishan Yizu Huizu Zizhixian~~Yangbi Yizu Zizhixian~~"}
+data/CN/云南省/大理白族自治州/云龙县={"id":"data/CN/云南省/大理白族自治州/云龙县","key":"云龙县","lang":"zh-hans","lname":"Yunlong Xian","zipex":"672700"}
+data/CN/云南省/大理白族自治州/剑川县={"id":"data/CN/云南省/大理白族自治州/剑川县","key":"剑川县","lang":"zh-hans","lname":"Jianchuan Xian","zipex":"671300"}
+data/CN/云南省/大理白族自治州/南涧彝族自治县={"id":"data/CN/云南省/大理白族自治州/南涧彝族自治县","key":"南涧彝族自治县","lang":"zh-hans","lname":"Nanjian Xian","zipex":"675700","lfname":"Nanjian Yizu Zizhixian"}
+data/CN/云南省/大理白族自治州/大理市={"id":"data/CN/云南省/大理白族自治州/大理市","key":"大理市","lang":"zh-hans","lname":"Dali Shi","zipex":"671000"}
+data/CN/云南省/大理白族自治州/宾川县={"id":"data/CN/云南省/大理白族自治州/宾川县","key":"宾川县","lang":"zh-hans","lname":"Binchuan Xian","zipex":"671600"}
+data/CN/云南省/大理白族自治州/巍山彝族回族自治县={"id":"data/CN/云南省/大理白族自治州/巍山彝族回族自治县","key":"巍山彝族回族自治县","lang":"zh-hans","lname":"Weishan Xian","zipex":"672400","lfname":"Weishan Yizu Huizu Zizhixian"}
+data/CN/云南省/大理白族自治州/弥渡县={"id":"data/CN/云南省/大理白族自治州/弥渡县","key":"弥渡县","lang":"zh-hans","lname":"Midu Xian","zipex":"675600"}
+data/CN/云南省/大理白族自治州/永平县={"id":"data/CN/云南省/大理白族自治州/永平县","key":"永平县","lang":"zh-hans","lname":"Yongping Xian","zipex":"672600"}
+data/CN/云南省/大理白族自治州/洱源县={"id":"data/CN/云南省/大理白族自治州/洱源县","key":"洱源县","lang":"zh-hans","lname":"Eryuan Xian","zipex":"671200"}
+data/CN/云南省/大理白族自治州/漾濞彝族自治县={"id":"data/CN/云南省/大理白族自治州/漾濞彝族自治县","key":"漾濞彝族自治县","lang":"zh-hans","lname":"Yangbi Xian","zipex":"672500","lfname":"Yangbi Yizu Zizhixian"}
+data/CN/云南省/大理白族自治州/祥云县={"id":"data/CN/云南省/大理白族自治州/祥云县","key":"祥云县","lang":"zh-hans","lname":"Xiangyun Xian","zipex":"672100"}
+data/CN/云南省/大理白族自治州/鹤庆县={"id":"data/CN/云南省/大理白族自治州/鹤庆县","key":"鹤庆县","lang":"zh-hans","lname":"Heqing Xian","zipex":"671500"}
+data/CN/云南省/德宏傣族景颇族自治州={"id":"data/CN/云南省/德宏傣族景颇族自治州","key":"德宏傣族景颇族自治州","lang":"zh-hans","lname":"Dehong Zhou","zipex":"678400","lfname":"Dehong Daizu Jingpozu Zizhizhou","sub_keys":"梁河县~陇川县~潞西市~瑞丽市~盈江县","sub_lnames":"Lianghe Xian~Longchuan Xian~Luxi Shi~Ruili Shi~Yingjiang Xian","sub_zipexs":"679200~678700~678400~678600~679300"}
+data/CN/云南省/德宏傣族景颇族自治州/梁河县={"id":"data/CN/云南省/德宏傣族景颇族自治州/梁河县","key":"梁河县","lang":"zh-hans","lname":"Lianghe Xian","zipex":"679200"}
+data/CN/云南省/德宏傣族景颇族自治州/潞西市={"id":"data/CN/云南省/德宏傣族景颇族自治州/潞西市","key":"潞西市","lang":"zh-hans","lname":"Luxi Shi","zipex":"678400"}
+data/CN/云南省/德宏傣族景颇族自治州/瑞丽市={"id":"data/CN/云南省/德宏傣族景颇族自治州/瑞丽市","key":"瑞丽市","lang":"zh-hans","lname":"Ruili Shi","zipex":"678600"}
+data/CN/云南省/德宏傣族景颇族自治州/盈江县={"id":"data/CN/云南省/德宏傣族景颇族自治州/盈江县","key":"盈江县","lang":"zh-hans","lname":"Yingjiang Xian","zipex":"679300"}
+data/CN/云南省/德宏傣族景颇族自治州/陇川县={"id":"data/CN/云南省/德宏傣族景颇族自治州/陇川县","key":"陇川县","lang":"zh-hans","lname":"Longchuan Xian","zipex":"678700"}
+data/CN/云南省/怒江傈僳族自治州={"id":"data/CN/云南省/怒江傈僳族自治州","key":"怒江傈僳族自治州","lang":"zh-hans","lname":"Nujiang Zhou","zipex":"673100","lfname":"Nujiang Lisuzu Zizhizhou","sub_keys":"福贡县~贡山独龙族怒族自治县~兰坪白族普米族自治县~泸水县","sub_lnames":"Fugong Xian~Gongshan Xian~Lanping Xian~Lushui Xian","sub_zipexs":"673400~673500~671400~673200","sub_lfnames":"~Gongshan Derungzu Nuzu Zizhixian~Lanping Baizu Pumizu Zizhixian~"}
+data/CN/云南省/怒江傈僳族自治州/兰坪白族普米族自治县={"id":"data/CN/云南省/怒江傈僳族自治州/兰坪白族普米族自治县","key":"兰坪白族普米族自治县","lang":"zh-hans","lname":"Lanping Xian","zipex":"671400","lfname":"Lanping Baizu Pumizu Zizhixian"}
+data/CN/云南省/怒江傈僳族自治州/泸水县={"id":"data/CN/云南省/怒江傈僳族自治州/泸水县","key":"泸水县","lang":"zh-hans","lname":"Lushui Xian","zipex":"673200"}
+data/CN/云南省/怒江傈僳族自治州/福贡县={"id":"data/CN/云南省/怒江傈僳族自治州/福贡县","key":"福贡县","lang":"zh-hans","lname":"Fugong Xian","zipex":"673400"}
+data/CN/云南省/怒江傈僳族自治州/贡山独龙族怒族自治县={"id":"data/CN/云南省/怒江傈僳族自治州/贡山独龙族怒族自治县","key":"贡山独龙族怒族自治县","lang":"zh-hans","lname":"Gongshan Xian","zipex":"673500","lfname":"Gongshan Derungzu Nuzu Zizhixian"}
+data/CN/云南省/文山壮族苗族自治州={"id":"data/CN/云南省/文山壮族苗族自治州","key":"文山壮族苗族自治州","lang":"zh-hans","lname":"Wenshan Zhou","zipex":"663000","lfname":"Wenshan Zhuangzu Miaozu Zizhizhou","sub_keys":"富宁县~广南县~麻栗坡县~马关县~丘北县~文山县~西畴县~砚山县","sub_lnames":"Funing Xian~Guangnan Xian~Malipo Xian~Maguan Xian~Qiubei Xian~Wenshan Xian~Xichou Xian~Yanshan Xian","sub_zipexs":"663400~663300~663600~663700~663200~663000~663500~663100"}
+data/CN/云南省/文山壮族苗族自治州/丘北县={"id":"data/CN/云南省/文山壮族苗族自治州/丘北县","key":"丘北县","lang":"zh-hans","lname":"Qiubei Xian","zipex":"663200"}
+data/CN/云南省/文山壮族苗族自治州/富宁县={"id":"data/CN/云南省/文山壮族苗族自治州/富宁县","key":"富宁县","lang":"zh-hans","lname":"Funing Xian","zipex":"663400"}
+data/CN/云南省/文山壮族苗族自治州/广南县={"id":"data/CN/云南省/文山壮族苗族自治州/广南县","key":"广南县","lang":"zh-hans","lname":"Guangnan Xian","zipex":"663300"}
+data/CN/云南省/文山壮族苗族自治州/文山县={"id":"data/CN/云南省/文山壮族苗族自治州/文山县","key":"文山县","lang":"zh-hans","lname":"Wenshan Xian","zipex":"663000"}
+data/CN/云南省/文山壮族苗族自治州/砚山县={"id":"data/CN/云南省/文山壮族苗族自治州/砚山县","key":"砚山县","lang":"zh-hans","lname":"Yanshan Xian","zipex":"663100"}
+data/CN/云南省/文山壮族苗族自治州/西畴县={"id":"data/CN/云南省/文山壮族苗族自治州/西畴县","key":"西畴县","lang":"zh-hans","lname":"Xichou Xian","zipex":"663500"}
+data/CN/云南省/文山壮族苗族自治州/马关县={"id":"data/CN/云南省/文山壮族苗族自治州/马关县","key":"马关县","lang":"zh-hans","lname":"Maguan Xian","zipex":"663700"}
+data/CN/云南省/文山壮族苗族自治州/麻栗坡县={"id":"data/CN/云南省/文山壮族苗族自治州/麻栗坡县","key":"麻栗坡县","lang":"zh-hans","lname":"Malipo Xian","zipex":"663600"}
+data/CN/云南省/昆明市={"id":"data/CN/云南省/昆明市","key":"昆明市","lang":"zh-hans","lname":"Kunming Shi","zipex":"650011","sub_keys":"安宁市~呈贡县~东川区~富民县~官渡区~晋宁县~禄劝彝族苗族自治县~盘龙区~石林彝族自治县~嵩明县~五华区~西山区~寻甸回族彝族自治县~宜良县","sub_lnames":"Anning Shi~Chenggong Xian~Dongchuan Qu~Fumin Xian~Guandu Qu~Jinning Xian~Luquan Xian~Panlong Qu~Shilin Xian~Songming Xian~Wuhua Qu~Xishan Qu~Xundian Xian~Yiliang Xian","sub_zipexs":"650300~650500~654100~650400~650220~650600~651500~650051~652200~651700~650032~650100~655200~652100","sub_lfnames":"~~~~~~Luquan Yizu Miaozu Zizhixian~~Shilin Yizu Zizhixian~~~~Xundian Huizu Yizu Zizhixian~"}
+data/CN/云南省/昆明市/东川区={"id":"data/CN/云南省/昆明市/东川区","key":"东川区","lang":"zh-hans","lname":"Dongchuan Qu","zipex":"654100"}
+data/CN/云南省/昆明市/五华区={"id":"data/CN/云南省/昆明市/五华区","key":"五华区","lang":"zh-hans","lname":"Wuhua Qu","zipex":"650032"}
+data/CN/云南省/昆明市/呈贡县={"id":"data/CN/云南省/昆明市/呈贡县","key":"呈贡县","lang":"zh-hans","lname":"Chenggong Xian","zipex":"650500"}
+data/CN/云南省/昆明市/安宁市={"id":"data/CN/云南省/昆明市/安宁市","key":"安宁市","lang":"zh-hans","lname":"Anning Shi","zipex":"650300"}
+data/CN/云南省/昆明市/官渡区={"id":"data/CN/云南省/昆明市/官渡区","key":"官渡区","lang":"zh-hans","lname":"Guandu Qu","zipex":"650220"}
+data/CN/云南省/昆明市/宜良县={"id":"data/CN/云南省/昆明市/宜良县","key":"宜良县","lang":"zh-hans","lname":"Yiliang Xian","zipex":"652100"}
+data/CN/云南省/昆明市/富民县={"id":"data/CN/云南省/昆明市/富民县","key":"富民县","lang":"zh-hans","lname":"Fumin Xian","zipex":"650400"}
+data/CN/云南省/昆明市/寻甸回族彝族自治县={"id":"data/CN/云南省/昆明市/寻甸回族彝族自治县","key":"寻甸回族彝族自治县","lang":"zh-hans","lname":"Xundian Xian","zipex":"655200","lfname":"Xundian Huizu Yizu Zizhixian"}
+data/CN/云南省/昆明市/嵩明县={"id":"data/CN/云南省/昆明市/嵩明县","key":"嵩明县","lang":"zh-hans","lname":"Songming Xian","zipex":"651700"}
+data/CN/云南省/昆明市/晋宁县={"id":"data/CN/云南省/昆明市/晋宁县","key":"晋宁县","lang":"zh-hans","lname":"Jinning Xian","zipex":"650600"}
+data/CN/云南省/昆明市/盘龙区={"id":"data/CN/云南省/昆明市/盘龙区","key":"盘龙区","lang":"zh-hans","lname":"Panlong Qu","zipex":"650051"}
+data/CN/云南省/昆明市/石林彝族自治县={"id":"data/CN/云南省/昆明市/石林彝族自治县","key":"石林彝族自治县","lang":"zh-hans","lname":"Shilin Xian","zipex":"652200","lfname":"Shilin Yizu Zizhixian"}
+data/CN/云南省/昆明市/禄劝彝族苗族自治县={"id":"data/CN/云南省/昆明市/禄劝彝族苗族自治县","key":"禄劝彝族苗族自治县","lang":"zh-hans","lname":"Luquan Xian","zipex":"651500","lfname":"Luquan Yizu Miaozu Zizhixian"}
+data/CN/云南省/昆明市/西山区={"id":"data/CN/云南省/昆明市/西山区","key":"西山区","lang":"zh-hans","lname":"Xishan Qu","zipex":"650100"}
+data/CN/云南省/昭通市={"id":"data/CN/云南省/昭通市","key":"昭通市","lang":"zh-hans","lname":"Zhaotong Shi","zipex":"657000","sub_keys":"大关县~鲁甸县~巧家县~水富县~绥江县~威信县~盐津县~彝良县~永善县~昭阳区~镇雄县","sub_lnames":"Daguan Xian~Ludian Xian~Qiaojia Xian~Shuifu Xian~Suijiang Xian~Weixin Xian~Yanjin Xian~Yiliang Xian~Yongshan Xian~Zhaoyang Qu~Zhenxiong Xian","sub_zipexs":"657400~657100~654600~657800~657700~657900~657500~657600~657300~657000~657200"}
+data/CN/云南省/昭通市/大关县={"id":"data/CN/云南省/昭通市/大关县","key":"大关县","lang":"zh-hans","lname":"Daguan Xian","zipex":"657400"}
+data/CN/云南省/昭通市/威信县={"id":"data/CN/云南省/昭通市/威信县","key":"威信县","lang":"zh-hans","lname":"Weixin Xian","zipex":"657900"}
+data/CN/云南省/昭通市/巧家县={"id":"data/CN/云南省/昭通市/巧家县","key":"巧家县","lang":"zh-hans","lname":"Qiaojia Xian","zipex":"654600"}
+data/CN/云南省/昭通市/彝良县={"id":"data/CN/云南省/昭通市/彝良县","key":"彝良县","lang":"zh-hans","lname":"Yiliang Xian","zipex":"657600"}
+data/CN/云南省/昭通市/昭阳区={"id":"data/CN/云南省/昭通市/昭阳区","key":"昭阳区","lang":"zh-hans","lname":"Zhaoyang Qu","zipex":"657000"}
+data/CN/云南省/昭通市/水富县={"id":"data/CN/云南省/昭通市/水富县","key":"水富县","lang":"zh-hans","lname":"Shuifu Xian","zipex":"657800"}
+data/CN/云南省/昭通市/永善县={"id":"data/CN/云南省/昭通市/永善县","key":"永善县","lang":"zh-hans","lname":"Yongshan Xian","zipex":"657300"}
+data/CN/云南省/昭通市/盐津县={"id":"data/CN/云南省/昭通市/盐津县","key":"盐津县","lang":"zh-hans","lname":"Yanjin Xian","zipex":"657500"}
+data/CN/云南省/昭通市/绥江县={"id":"data/CN/云南省/昭通市/绥江县","key":"绥江县","lang":"zh-hans","lname":"Suijiang Xian","zipex":"657700"}
+data/CN/云南省/昭通市/镇雄县={"id":"data/CN/云南省/昭通市/镇雄县","key":"镇雄县","lang":"zh-hans","lname":"Zhenxiong Xian","zipex":"657200"}
+data/CN/云南省/昭通市/鲁甸县={"id":"data/CN/云南省/昭通市/鲁甸县","key":"鲁甸县","lang":"zh-hans","lname":"Ludian Xian","zipex":"657100"}
+data/CN/云南省/普洱市={"id":"data/CN/云南省/普洱市","key":"普洱市","lang":"zh-hans","lname":"Puer Shi","zipex":"665000","sub_keys":"江城哈尼族彝族自治县~景东彝族自治县~景谷傣族彝族自治县~澜沧拉祜族自治县~孟连傣族拉祜族佤族自治县~墨江哈尼族自治县~宁洱哈尼族彝族自治县~思茅区~西盟佤族自治县~镇沅彝族哈尼族拉祜族自治县","sub_lnames":"Jiangcheng Xian~Jingdong Xian~Jinggu Xian~Lancang Xian~Menglian Xian~Mojiang Xian~Ninger? Xian~Simao Qu~Ximeng Xian~Zhenyuan Xian","sub_zipexs":"665900~676200~666400~665600~665800~654800~665100~665000~665700~666500","sub_lfnames":"Jiangcheng Hanizu Yizu Zizhixian~Jingdong Yizu Zizhixian~Jinggu Daizu Yizu Zizhixian~Lancang Lahuzu Zizhixian~Menglian Daizu Lahuzu Vazu Zizhixian~Mojiang Hanizu Zizhixian~Ninger? Hanizu Yizu Zizhixian~~Ximeng Vazu Zizhixian~Zhenyuan Yizu Hanizu Lahuzu Zizhixian"}
+data/CN/云南省/普洱市/墨江哈尼族自治县={"id":"data/CN/云南省/普洱市/墨江哈尼族自治县","key":"墨江哈尼族自治县","lang":"zh-hans","lname":"Mojiang Xian","zipex":"654800","lfname":"Mojiang Hanizu Zizhixian"}
+data/CN/云南省/普洱市/孟连傣族拉祜族佤族自治县={"id":"data/CN/云南省/普洱市/孟连傣族拉祜族佤族自治县","key":"孟连傣族拉祜族佤族自治县","lang":"zh-hans","lname":"Menglian Xian","zipex":"665800","lfname":"Menglian Daizu Lahuzu Vazu Zizhixian"}
+data/CN/云南省/普洱市/宁洱哈尼族彝族自治县={"id":"data/CN/云南省/普洱市/宁洱哈尼族彝族自治县","key":"宁洱哈尼族彝族自治县","lang":"zh-hans","lname":"Ninger? Xian","zipex":"665100","lfname":"Ninger? Hanizu Yizu Zizhixian"}
+data/CN/云南省/普洱市/思茅区={"id":"data/CN/云南省/普洱市/思茅区","key":"思茅区","lang":"zh-hans","lname":"Simao Qu","zipex":"665000"}
+data/CN/云南省/普洱市/景东彝族自治县={"id":"data/CN/云南省/普洱市/景东彝族自治县","key":"景东彝族自治县","lang":"zh-hans","lname":"Jingdong Xian","zipex":"676200","lfname":"Jingdong Yizu Zizhixian"}
+data/CN/云南省/普洱市/景谷傣族彝族自治县={"id":"data/CN/云南省/普洱市/景谷傣族彝族自治县","key":"景谷傣族彝族自治县","lang":"zh-hans","lname":"Jinggu Xian","zipex":"666400","lfname":"Jinggu Daizu Yizu Zizhixian"}
+data/CN/云南省/普洱市/江城哈尼族彝族自治县={"id":"data/CN/云南省/普洱市/江城哈尼族彝族自治县","key":"江城哈尼族彝族自治县","lang":"zh-hans","lname":"Jiangcheng Xian","zipex":"665900","lfname":"Jiangcheng Hanizu Yizu Zizhixian"}
+data/CN/云南省/普洱市/澜沧拉祜族自治县={"id":"data/CN/云南省/普洱市/澜沧拉祜族自治县","key":"澜沧拉祜族自治县","lang":"zh-hans","lname":"Lancang Xian","zipex":"665600","lfname":"Lancang Lahuzu Zizhixian"}
+data/CN/云南省/普洱市/西盟佤族自治县={"id":"data/CN/云南省/普洱市/西盟佤族自治县","key":"西盟佤族自治县","lang":"zh-hans","lname":"Ximeng Xian","zipex":"665700","lfname":"Ximeng Vazu Zizhixian"}
+data/CN/云南省/普洱市/镇沅彝族哈尼族拉祜族自治县={"id":"data/CN/云南省/普洱市/镇沅彝族哈尼族拉祜族自治县","key":"镇沅彝族哈尼族拉祜族自治县","lang":"zh-hans","lname":"Zhenyuan Xian","zipex":"666500","lfname":"Zhenyuan Yizu Hanizu Lahuzu Zizhixian"}
+data/CN/云南省/曲靖市={"id":"data/CN/云南省/曲靖市","key":"曲靖市","lang":"zh-hans","lname":"Qujing Shi","zipex":"655000","sub_keys":"富源县~会泽县~陆良县~罗平县~马龙县~麒麟区~师宗县~宣威市~沾益县","sub_lnames":"Fuyuan Xian~Huize Xian~Luliang Xian~Luoping Xian~Malong Xian~Qilin Qu~Shizong Xian~Xuanwei Shi~Zhanyi Xian","sub_zipexs":"655500~654200~655600~655800~655100~655000~655700~655400~655500"}
+data/CN/云南省/曲靖市/会泽县={"id":"data/CN/云南省/曲靖市/会泽县","key":"会泽县","lang":"zh-hans","lname":"Huize Xian","zipex":"654200"}
+data/CN/云南省/曲靖市/宣威市={"id":"data/CN/云南省/曲靖市/宣威市","key":"宣威市","lang":"zh-hans","lname":"Xuanwei Shi","zipex":"655400"}
+data/CN/云南省/曲靖市/富源县={"id":"data/CN/云南省/曲靖市/富源县","key":"富源县","lang":"zh-hans","lname":"Fuyuan Xian","zipex":"655500"}
+data/CN/云南省/曲靖市/师宗县={"id":"data/CN/云南省/曲靖市/师宗县","key":"师宗县","lang":"zh-hans","lname":"Shizong Xian","zipex":"655700"}
+data/CN/云南省/曲靖市/沾益县={"id":"data/CN/云南省/曲靖市/沾益县","key":"沾益县","lang":"zh-hans","lname":"Zhanyi Xian","zipex":"655500"}
+data/CN/云南省/曲靖市/罗平县={"id":"data/CN/云南省/曲靖市/罗平县","key":"罗平县","lang":"zh-hans","lname":"Luoping Xian","zipex":"655800"}
+data/CN/云南省/曲靖市/陆良县={"id":"data/CN/云南省/曲靖市/陆良县","key":"陆良县","lang":"zh-hans","lname":"Luliang Xian","zipex":"655600"}
+data/CN/云南省/曲靖市/马龙县={"id":"data/CN/云南省/曲靖市/马龙县","key":"马龙县","lang":"zh-hans","lname":"Malong Xian","zipex":"655100"}
+data/CN/云南省/曲靖市/麒麟区={"id":"data/CN/云南省/曲靖市/麒麟区","key":"麒麟区","lang":"zh-hans","lname":"Qilin Qu","zipex":"655000"}
+data/CN/云南省/楚雄彝族自治州={"id":"data/CN/云南省/楚雄彝族自治州","key":"楚雄彝族自治州","lang":"zh-hans","lname":"Chuxiong Zhou","zipex":"675000","lfname":"Chuxiong Yizu Zizhizhou","sub_keys":"楚雄市~大姚县~禄丰县~牟定县~南华县~双柏县~武定县~姚安县~永仁县~元谋县","sub_lnames":"Chuxiong Shi~Dayao Xian~Lufeng Xian~Mouding Xian~Nanhua Xian~Shuangbai Xian~Wuding Xian~Yao'an Xian~Yongren Xian~Yuanmou Xian","sub_zipexs":"675000~675400~651200~675500~675200~675100~651600~675300~651400~651300"}
+data/CN/云南省/楚雄彝族自治州/元谋县={"id":"data/CN/云南省/楚雄彝族自治州/元谋县","key":"元谋县","lang":"zh-hans","lname":"Yuanmou Xian","zipex":"651300"}
+data/CN/云南省/楚雄彝族自治州/南华县={"id":"data/CN/云南省/楚雄彝族自治州/南华县","key":"南华县","lang":"zh-hans","lname":"Nanhua Xian","zipex":"675200"}
+data/CN/云南省/楚雄彝族自治州/双柏县={"id":"data/CN/云南省/楚雄彝族自治州/双柏县","key":"双柏县","lang":"zh-hans","lname":"Shuangbai Xian","zipex":"675100"}
+data/CN/云南省/楚雄彝族自治州/大姚县={"id":"data/CN/云南省/楚雄彝族自治州/大姚县","key":"大姚县","lang":"zh-hans","lname":"Dayao Xian","zipex":"675400"}
+data/CN/云南省/楚雄彝族自治州/姚安县={"id":"data/CN/云南省/楚雄彝族自治州/姚安县","key":"姚安县","lang":"zh-hans","lname":"Yao'an Xian","zipex":"675300"}
+data/CN/云南省/楚雄彝族自治州/楚雄市={"id":"data/CN/云南省/楚雄彝族自治州/楚雄市","key":"楚雄市","lang":"zh-hans","lname":"Chuxiong Shi","zipex":"675000"}
+data/CN/云南省/楚雄彝族自治州/武定县={"id":"data/CN/云南省/楚雄彝族自治州/武定县","key":"武定县","lang":"zh-hans","lname":"Wuding Xian","zipex":"651600"}
+data/CN/云南省/楚雄彝族自治州/永仁县={"id":"data/CN/云南省/楚雄彝族自治州/永仁县","key":"永仁县","lang":"zh-hans","lname":"Yongren Xian","zipex":"651400"}
+data/CN/云南省/楚雄彝族自治州/牟定县={"id":"data/CN/云南省/楚雄彝族自治州/牟定县","key":"牟定县","lang":"zh-hans","lname":"Mouding Xian","zipex":"675500"}
+data/CN/云南省/楚雄彝族自治州/禄丰县={"id":"data/CN/云南省/楚雄彝族自治州/禄丰县","key":"禄丰县","lang":"zh-hans","lname":"Lufeng Xian","zipex":"651200"}
+data/CN/云南省/玉溪市={"id":"data/CN/云南省/玉溪市","key":"玉溪市","lang":"zh-hans","lname":"Yuxi Shi","zipex":"653100","sub_keys":"澄江县~峨山彝族自治县~红塔区~华宁县~江川县~通海县~新平彝族傣族自治县~易门县~元江哈尼族彝族傣族自治县","sub_lnames":"Chengjiang Xian~Eshan Xian~Hongta Qu~Huaning Xian~Jiangchuan Xian~Tonghai Xian~Xinping Xian~Yimen Xian~Yuanjiang Xian","sub_zipexs":"652500~653200~653100~652800~652600~652700~653400~651100~653300","sub_lfnames":"~Eshan Yizu Zizhixian~~~~~Xinping Yizu Daizu Zizhixian~~Yuanjiang Hanyizu Yizu Daizu Zizhixian"}
+data/CN/云南省/玉溪市/元江哈尼族彝族傣族自治县={"id":"data/CN/云南省/玉溪市/元江哈尼族彝族傣族自治县","key":"元江哈尼族彝族傣族自治县","lang":"zh-hans","lname":"Yuanjiang Xian","zipex":"653300","lfname":"Yuanjiang Hanyizu Yizu Daizu Zizhixian"}
+data/CN/云南省/玉溪市/华宁县={"id":"data/CN/云南省/玉溪市/华宁县","key":"华宁县","lang":"zh-hans","lname":"Huaning Xian","zipex":"652800"}
+data/CN/云南省/玉溪市/峨山彝族自治县={"id":"data/CN/云南省/玉溪市/峨山彝族自治县","key":"峨山彝族自治县","lang":"zh-hans","lname":"Eshan Xian","zipex":"653200","lfname":"Eshan Yizu Zizhixian"}
+data/CN/云南省/玉溪市/新平彝族傣族自治县={"id":"data/CN/云南省/玉溪市/新平彝族傣族自治县","key":"新平彝族傣族自治县","lang":"zh-hans","lname":"Xinping Xian","zipex":"653400","lfname":"Xinping Yizu Daizu Zizhixian"}
+data/CN/云南省/玉溪市/易门县={"id":"data/CN/云南省/玉溪市/易门县","key":"易门县","lang":"zh-hans","lname":"Yimen Xian","zipex":"651100"}
+data/CN/云南省/玉溪市/江川县={"id":"data/CN/云南省/玉溪市/江川县","key":"江川县","lang":"zh-hans","lname":"Jiangchuan Xian","zipex":"652600"}
+data/CN/云南省/玉溪市/澄江县={"id":"data/CN/云南省/玉溪市/澄江县","key":"澄江县","lang":"zh-hans","lname":"Chengjiang Xian","zipex":"652500"}
+data/CN/云南省/玉溪市/红塔区={"id":"data/CN/云南省/玉溪市/红塔区","key":"红塔区","lang":"zh-hans","lname":"Hongta Qu","zipex":"653100"}
+data/CN/云南省/玉溪市/通海县={"id":"data/CN/云南省/玉溪市/通海县","key":"通海县","lang":"zh-hans","lname":"Tonghai Xian","zipex":"652700"}
+data/CN/云南省/红河哈尼族彝族自治州={"id":"data/CN/云南省/红河哈尼族彝族自治州","key":"红河哈尼族彝族自治州","lang":"zh-hans","lname":"Honghe Zhou","zipex":"661400","lfname":"Honghe Hanizu Yizu Zizhizhou","sub_keys":"个旧市~河口瑶族自治县~红河县~建水县~金平苗族瑶族傣族自治县~开远市~泸西县~绿春县~蒙自县~弥勒县~屏边苗族自治县~石屏县~元阳县","sub_lnames":"Gejiu Shi~Hekou Xian~Honghe Xian~Jianshui Xian~Jinping Xian~Kaiyuan Shi~Luxi Xian~Lüchun Xian~Mengzi Xian~Mile Xian~Pingbian Xian~Shiping Xian~Yuanyang Xian","sub_zipexs":"661000~661300~654400~654300~661500~661600~652400~662500~661100~652300~661200~662200~662400","sub_lfnames":"~Hekou Yaozu Zizhixian~~~Jinping Miaozu Yaozu Daizu Zizhixian~~~~~~Pingbian Miaozu Zizhixian~~"}
+data/CN/云南省/红河哈尼族彝族自治州/个旧市={"id":"data/CN/云南省/红河哈尼族彝族自治州/个旧市","key":"个旧市","lang":"zh-hans","lname":"Gejiu Shi","zipex":"661000"}
+data/CN/云南省/红河哈尼族彝族自治州/元阳县={"id":"data/CN/云南省/红河哈尼族彝族自治州/元阳县","key":"元阳县","lang":"zh-hans","lname":"Yuanyang Xian","zipex":"662400"}
+data/CN/云南省/红河哈尼族彝族自治州/屏边苗族自治县={"id":"data/CN/云南省/红河哈尼族彝族自治州/屏边苗族自治县","key":"屏边苗族自治县","lang":"zh-hans","lname":"Pingbian Xian","zipex":"661200","lfname":"Pingbian Miaozu Zizhixian"}
+data/CN/云南省/红河哈尼族彝族自治州/建水县={"id":"data/CN/云南省/红河哈尼族彝族自治州/建水县","key":"建水县","lang":"zh-hans","lname":"Jianshui Xian","zipex":"654300"}
+data/CN/云南省/红河哈尼族彝族自治州/开远市={"id":"data/CN/云南省/红河哈尼族彝族自治州/开远市","key":"开远市","lang":"zh-hans","lname":"Kaiyuan Shi","zipex":"661600"}
+data/CN/云南省/红河哈尼族彝族自治州/弥勒县={"id":"data/CN/云南省/红河哈尼族彝族自治州/弥勒县","key":"弥勒县","lang":"zh-hans","lname":"Mile Xian","zipex":"652300"}
+data/CN/云南省/红河哈尼族彝族自治州/河口瑶族自治县={"id":"data/CN/云南省/红河哈尼族彝族自治州/河口瑶族自治县","key":"河口瑶族自治县","lang":"zh-hans","lname":"Hekou Xian","zipex":"661300","lfname":"Hekou Yaozu Zizhixian"}
+data/CN/云南省/红河哈尼族彝族自治州/泸西县={"id":"data/CN/云南省/红河哈尼族彝族自治州/泸西县","key":"泸西县","lang":"zh-hans","lname":"Luxi Xian","zipex":"652400"}
+data/CN/云南省/红河哈尼族彝族自治州/石屏县={"id":"data/CN/云南省/红河哈尼族彝族自治州/石屏县","key":"石屏县","lang":"zh-hans","lname":"Shiping Xian","zipex":"662200"}
+data/CN/云南省/红河哈尼族彝族自治州/红河县={"id":"data/CN/云南省/红河哈尼族彝族自治州/红河县","key":"红河县","lang":"zh-hans","lname":"Honghe Xian","zipex":"654400"}
+data/CN/云南省/红河哈尼族彝族自治州/绿春县={"id":"data/CN/云南省/红河哈尼族彝族自治州/绿春县","key":"绿春县","lang":"zh-hans","lname":"Lüchun Xian","zipex":"662500"}
+data/CN/云南省/红河哈尼族彝族自治州/蒙自县={"id":"data/CN/云南省/红河哈尼族彝族自治州/蒙自县","key":"蒙自县","lang":"zh-hans","lname":"Mengzi Xian","zipex":"661100"}
+data/CN/云南省/红河哈尼族彝族自治州/金平苗族瑶族傣族自治县={"id":"data/CN/云南省/红河哈尼族彝族自治州/金平苗族瑶族傣族自治县","key":"金平苗族瑶族傣族自治县","lang":"zh-hans","lname":"Jinping Xian","zipex":"661500","lfname":"Jinping Miaozu Yaozu Daizu Zizhixian"}
+data/CN/云南省/西双版纳傣族自治州={"id":"data/CN/云南省/西双版纳傣族自治州","key":"西双版纳傣族自治州","lang":"zh-hans","lname":"Xishuangbanna Zhou","zipex":"666100","lfname":"Xishuangbanna Daizu Zizhizhou","sub_keys":"景洪市~勐海县~勐腊县","sub_lnames":"Jinghong Shi~Menghai Xian~Mengla Xian","sub_zipexs":"666100~666200~666300"}
+data/CN/云南省/西双版纳傣族自治州/勐海县={"id":"data/CN/云南省/西双版纳傣族自治州/勐海县","key":"勐海县","lang":"zh-hans","lname":"Menghai Xian","zipex":"666200"}
+data/CN/云南省/西双版纳傣族自治州/勐腊县={"id":"data/CN/云南省/西双版纳傣族自治州/勐腊县","key":"勐腊县","lang":"zh-hans","lname":"Mengla Xian","zipex":"666300"}
+data/CN/云南省/西双版纳傣族自治州/景洪市={"id":"data/CN/云南省/西双版纳傣族自治州/景洪市","key":"景洪市","lang":"zh-hans","lname":"Jinghong Shi","zipex":"666100"}
+data/CN/云南省/迪庆藏族自治州={"id":"data/CN/云南省/迪庆藏族自治州","key":"迪庆藏族自治州","lang":"zh-hans","lname":"Dêqên Zhou","zipex":"674400","lfname":"Dêqên Zangzu Zizhizhou","sub_keys":"德钦县~维西傈僳族自治县~香格里拉县","sub_lnames":"Dêqên Xian~Weixi Xian~Shangêlila Xian","sub_zipexs":"674500~674600~674400","sub_lfnames":"~Weixi Lisuzu Zizhixian~"}
+data/CN/云南省/迪庆藏族自治州/德钦县={"id":"data/CN/云南省/迪庆藏族自治州/德钦县","key":"德钦县","lang":"zh-hans","lname":"Dêqên Xian","zipex":"674500"}
+data/CN/云南省/迪庆藏族自治州/维西傈僳族自治县={"id":"data/CN/云南省/迪庆藏族自治州/维西傈僳族自治县","key":"维西傈僳族自治县","lang":"zh-hans","lname":"Weixi Xian","zipex":"674600","lfname":"Weixi Lisuzu Zizhixian"}
+data/CN/云南省/迪庆藏族自治州/香格里拉县={"id":"data/CN/云南省/迪庆藏族自治州/香格里拉县","key":"香格里拉县","lang":"zh-hans","lname":"Shangêlila Xian","zipex":"674400"}
+data/CN/内蒙古={"id":"data/CN/内蒙古","key":"内蒙古","lang":"zh-hans","lname":"Nei Mongol","isoid":"15","sub_keys":"阿拉善盟~巴彦淖尔市~包头市~赤峰市~鄂尔多斯市~呼和浩特市~呼伦贝尔市~通辽市~乌海市~乌兰察布市~锡林郭勒盟~兴安盟","sub_lnames":"Alxa Meng~Bayannur Shi~Baotou Shi~Chifeng (Ulanhad) Shi~Ordos Shi~Hohhot Shi~Hulun Buir Shi~Tongliao Shi~Wuhai Shi~Ulanqab Shi~Xilin Gol Meng~Hinggan Meng","sub_zipexs":"750306~015001~014025~024000~017004~010020~021008~028000~016000~012000~026021~137401","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/内蒙古/乌兰察布市={"id":"data/CN/内蒙古/乌兰察布市","key":"乌兰察布市","lang":"zh-hans","lname":"Ulanqab Shi","zipex":"012000","sub_keys":"察哈尔右翼后旗~察哈尔右翼前旗~察哈尔右翼中旗~丰镇市~化德县~集宁区~凉城县~商都县~四子王旗~兴和县~卓资县","sub_lnames":"Qahar Youyi Houqi~Qahar Youyi Qianqi~Qahar Youyi Zhongqi~Fengzhen Shi~Huade Xian~Jining Qu~Liangcheng Xian~Shangdu Xian~Dorbod Qi~Xinghe Xian~Zhuozi Xian","sub_zipexs":"012400~012200~013550~012100~013350~012000~013750~013450~011800~013650~012300"}
+data/CN/内蒙古/乌兰察布市/丰镇市={"id":"data/CN/内蒙古/乌兰察布市/丰镇市","key":"丰镇市","lang":"zh-hans","lname":"Fengzhen Shi","zipex":"012100"}
+data/CN/内蒙古/乌兰察布市/兴和县={"id":"data/CN/内蒙古/乌兰察布市/兴和县","key":"兴和县","lang":"zh-hans","lname":"Xinghe Xian","zipex":"013650"}
+data/CN/内蒙古/乌兰察布市/凉城县={"id":"data/CN/内蒙古/乌兰察布市/凉城县","key":"凉城县","lang":"zh-hans","lname":"Liangcheng Xian","zipex":"013750"}
+data/CN/内蒙古/乌兰察布市/化德县={"id":"data/CN/内蒙古/乌兰察布市/化德县","key":"化德县","lang":"zh-hans","lname":"Huade Xian","zipex":"013350"}
+data/CN/内蒙古/乌兰察布市/卓资县={"id":"data/CN/内蒙古/乌兰察布市/卓资县","key":"卓资县","lang":"zh-hans","lname":"Zhuozi Xian","zipex":"012300"}
+data/CN/内蒙古/乌兰察布市/商都县={"id":"data/CN/内蒙古/乌兰察布市/商都县","key":"商都县","lang":"zh-hans","lname":"Shangdu Xian","zipex":"013450"}
+data/CN/内蒙古/乌兰察布市/四子王旗={"id":"data/CN/内蒙古/乌兰察布市/四子王旗","key":"四子王旗","lang":"zh-hans","lname":"Dorbod Qi","zipex":"011800"}
+data/CN/内蒙古/乌兰察布市/察哈尔右翼中旗={"id":"data/CN/内蒙古/乌兰察布市/察哈尔右翼中旗","key":"察哈尔右翼中旗","lang":"zh-hans","lname":"Qahar Youyi Zhongqi","zipex":"013550"}
+data/CN/内蒙古/乌兰察布市/察哈尔右翼前旗={"id":"data/CN/内蒙古/乌兰察布市/察哈尔右翼前旗","key":"察哈尔右翼前旗","lang":"zh-hans","lname":"Qahar Youyi Qianqi","zipex":"012200"}
+data/CN/内蒙古/乌兰察布市/察哈尔右翼后旗={"id":"data/CN/内蒙古/乌兰察布市/察哈尔右翼后旗","key":"察哈尔右翼后旗","lang":"zh-hans","lname":"Qahar Youyi Houqi","zipex":"012400"}
+data/CN/内蒙古/乌兰察布市/集宁区={"id":"data/CN/内蒙古/乌兰察布市/集宁区","key":"集宁区","lang":"zh-hans","lname":"Jining Qu","zipex":"012000"}
+data/CN/内蒙古/乌海市={"id":"data/CN/内蒙古/乌海市","key":"乌海市","lang":"zh-hans","lname":"Wuhai Shi","zipex":"016000","sub_keys":"海勃湾区~海南区~乌达区","sub_lnames":"Haibowan Qu~Hainan Qu~Ud Qu","sub_zipexs":"016000~016030~016040"}
+data/CN/内蒙古/乌海市/乌达区={"id":"data/CN/内蒙古/乌海市/乌达区","key":"乌达区","lang":"zh-hans","lname":"Ud Qu","zipex":"016040"}
+data/CN/内蒙古/乌海市/海勃湾区={"id":"data/CN/内蒙古/乌海市/海勃湾区","key":"海勃湾区","lang":"zh-hans","lname":"Haibowan Qu","zipex":"016000"}
+data/CN/内蒙古/乌海市/海南区={"id":"data/CN/内蒙古/乌海市/海南区","key":"海南区","lang":"zh-hans","lname":"Hainan Qu","zipex":"016030"}
+data/CN/内蒙古/兴安盟={"id":"data/CN/内蒙古/兴安盟","key":"兴安盟","lang":"zh-hans","lname":"Hinggan Meng","zipex":"137401","sub_keys":"阿尔山市~科尔沁右翼前旗~科尔沁右翼中旗~突泉县~乌兰浩特市~扎赉特旗","sub_lnames":"Arxan Shi~Horqin Youyi Qianqi~Horqin Youyi Zhongqi~Tuquan Xian~Ulan Hot Shi~Jalaid Qi","sub_zipexs":"137800~137400~029300~137500~137401~137600"}
+data/CN/内蒙古/兴安盟/乌兰浩特市={"id":"data/CN/内蒙古/兴安盟/乌兰浩特市","key":"乌兰浩特市","lang":"zh-hans","lname":"Ulan Hot Shi","zipex":"137401"}
+data/CN/内蒙古/兴安盟/扎赉特旗={"id":"data/CN/内蒙古/兴安盟/扎赉特旗","key":"扎赉特旗","lang":"zh-hans","lname":"Jalaid Qi","zipex":"137600"}
+data/CN/内蒙古/兴安盟/科尔沁右翼中旗={"id":"data/CN/内蒙古/兴安盟/科尔沁右翼中旗","key":"科尔沁右翼中旗","lang":"zh-hans","lname":"Horqin Youyi Zhongqi","zipex":"029300"}
+data/CN/内蒙古/兴安盟/科尔沁右翼前旗={"id":"data/CN/内蒙古/兴安盟/科尔沁右翼前旗","key":"科尔沁右翼前旗","lang":"zh-hans","lname":"Horqin Youyi Qianqi","zipex":"137400"}
+data/CN/内蒙古/兴安盟/突泉县={"id":"data/CN/内蒙古/兴安盟/突泉县","key":"突泉县","lang":"zh-hans","lname":"Tuquan Xian","zipex":"137500"}
+data/CN/内蒙古/兴安盟/阿尔山市={"id":"data/CN/内蒙古/兴安盟/阿尔山市","key":"阿尔山市","lang":"zh-hans","lname":"Arxan Shi","zipex":"137800"}
+data/CN/内蒙古/包头市={"id":"data/CN/内蒙古/包头市","key":"包头市","lang":"zh-hans","lname":"Baotou Shi","zipex":"014025","sub_keys":"白云矿区~达尔罕茂明安联合旗~东河区~固阳县~九原区~昆都仑区~青山区~石拐区~土默特右旗","sub_lnames":"Baiyun Kuangqu~Darhan Mumingan Lianheqi~Donghe Qu~Guyang Xian~Jiuyuan Qu~Hondlon Qu~Qingshan Qu~Shiguai Qu~Tumd Youqi","sub_zipexs":"014080~014500~014040~014200~014060~014010~014030~014070~014100"}
+data/CN/内蒙古/包头市/东河区={"id":"data/CN/内蒙古/包头市/东河区","key":"东河区","lang":"zh-hans","lname":"Donghe Qu","zipex":"014040"}
+data/CN/内蒙古/包头市/九原区={"id":"data/CN/内蒙古/包头市/九原区","key":"九原区","lang":"zh-hans","lname":"Jiuyuan Qu","zipex":"014060"}
+data/CN/内蒙古/包头市/固阳县={"id":"data/CN/内蒙古/包头市/固阳县","key":"固阳县","lang":"zh-hans","lname":"Guyang Xian","zipex":"014200"}
+data/CN/内蒙古/包头市/土默特右旗={"id":"data/CN/内蒙古/包头市/土默特右旗","key":"土默特右旗","lang":"zh-hans","lname":"Tumd Youqi","zipex":"014100"}
+data/CN/内蒙古/包头市/昆都仑区={"id":"data/CN/内蒙古/包头市/昆都仑区","key":"昆都仑区","lang":"zh-hans","lname":"Hondlon Qu","zipex":"014010"}
+data/CN/内蒙古/包头市/白云矿区={"id":"data/CN/内蒙古/包头市/白云矿区","key":"白云矿区","lang":"zh-hans","lname":"Baiyun Kuangqu","zipex":"014080"}
+data/CN/内蒙古/包头市/石拐区={"id":"data/CN/内蒙古/包头市/石拐区","key":"石拐区","lang":"zh-hans","lname":"Shiguai Qu","zipex":"014070"}
+data/CN/内蒙古/包头市/达尔罕茂明安联合旗={"id":"data/CN/内蒙古/包头市/达尔罕茂明安联合旗","key":"达尔罕茂明安联合旗","lang":"zh-hans","lname":"Darhan Mumingan Lianheqi","zipex":"014500"}
+data/CN/内蒙古/包头市/青山区={"id":"data/CN/内蒙古/包头市/青山区","key":"青山区","lang":"zh-hans","lname":"Qingshan Qu","zipex":"014030"}
+data/CN/内蒙古/呼伦贝尔市={"id":"data/CN/内蒙古/呼伦贝尔市","key":"呼伦贝尔市","lang":"zh-hans","lname":"Hulun Buir Shi","zipex":"021008","sub_keys":"阿荣旗~陈巴尔虎旗~额尔古纳市~鄂伦春自治旗~鄂温克族自治旗~根河市~海拉尔区~满洲里市~莫力达瓦达斡尔族自治旗~新巴尔虎右旗~新巴尔虎左旗~牙克石市~扎兰屯市","sub_lnames":"Arun Qi~Chen Barag Qi~Ergun Shi~Oroqen Qi~Ewenkizu Qi~Genhe Shi~Hailar Qu~Manzhouli Shi~Morin Dawa Qi~Xin Barag Youqi~Xin Barag Zuoqi~Yakeshi Shi~Zhalantun Shi","sub_zipexs":"162750~021500~022250~165450~021100~022350~021000~021400~162850~021300~021200~162650~162650","sub_lfnames":"~~~Oroqen Zizhiqi~Ewenkizu Zizhiqi~~~~Morin Dawa Daurzu Zizhiqi~~~~"}
+data/CN/内蒙古/呼伦贝尔市/扎兰屯市={"id":"data/CN/内蒙古/呼伦贝尔市/扎兰屯市","key":"扎兰屯市","lang":"zh-hans","lname":"Zhalantun Shi","zipex":"162650"}
+data/CN/内蒙古/呼伦贝尔市/新巴尔虎右旗={"id":"data/CN/内蒙古/呼伦贝尔市/新巴尔虎右旗","key":"新巴尔虎右旗","lang":"zh-hans","lname":"Xin Barag Youqi","zipex":"021300"}
+data/CN/内蒙古/呼伦贝尔市/新巴尔虎左旗={"id":"data/CN/内蒙古/呼伦贝尔市/新巴尔虎左旗","key":"新巴尔虎左旗","lang":"zh-hans","lname":"Xin Barag Zuoqi","zipex":"021200"}
+data/CN/内蒙古/呼伦贝尔市/根河市={"id":"data/CN/内蒙古/呼伦贝尔市/根河市","key":"根河市","lang":"zh-hans","lname":"Genhe Shi","zipex":"022350"}
+data/CN/内蒙古/呼伦贝尔市/海拉尔区={"id":"data/CN/内蒙古/呼伦贝尔市/海拉尔区","key":"海拉尔区","lang":"zh-hans","lname":"Hailar Qu","zipex":"021000"}
+data/CN/内蒙古/呼伦贝尔市/满洲里市={"id":"data/CN/内蒙古/呼伦贝尔市/满洲里市","key":"满洲里市","lang":"zh-hans","lname":"Manzhouli Shi","zipex":"021400"}
+data/CN/内蒙古/呼伦贝尔市/牙克石市={"id":"data/CN/内蒙古/呼伦贝尔市/牙克石市","key":"牙克石市","lang":"zh-hans","lname":"Yakeshi Shi","zipex":"162650"}
+data/CN/内蒙古/呼伦贝尔市/莫力达瓦达斡尔族自治旗={"id":"data/CN/内蒙古/呼伦贝尔市/莫力达瓦达斡尔族自治旗","key":"莫力达瓦达斡尔族自治旗","lang":"zh-hans","lname":"Morin Dawa Qi","zipex":"162850","lfname":"Morin Dawa Daurzu Zizhiqi"}
+data/CN/内蒙古/呼伦贝尔市/鄂伦春自治旗={"id":"data/CN/内蒙古/呼伦贝尔市/鄂伦春自治旗","key":"鄂伦春自治旗","lang":"zh-hans","lname":"Oroqen Qi","zipex":"165450","lfname":"Oroqen Zizhiqi"}
+data/CN/内蒙古/呼伦贝尔市/鄂温克族自治旗={"id":"data/CN/内蒙古/呼伦贝尔市/鄂温克族自治旗","key":"鄂温克族自治旗","lang":"zh-hans","lname":"Ewenkizu Qi","zipex":"021100","lfname":"Ewenkizu Zizhiqi"}
+data/CN/内蒙古/呼伦贝尔市/阿荣旗={"id":"data/CN/内蒙古/呼伦贝尔市/阿荣旗","key":"阿荣旗","lang":"zh-hans","lname":"Arun Qi","zipex":"162750"}
+data/CN/内蒙古/呼伦贝尔市/陈巴尔虎旗={"id":"data/CN/内蒙古/呼伦贝尔市/陈巴尔虎旗","key":"陈巴尔虎旗","lang":"zh-hans","lname":"Chen Barag Qi","zipex":"021500"}
+data/CN/内蒙古/呼伦贝尔市/额尔古纳市={"id":"data/CN/内蒙古/呼伦贝尔市/额尔古纳市","key":"额尔古纳市","lang":"zh-hans","lname":"Ergun Shi","zipex":"022250"}
+data/CN/内蒙古/呼和浩特市={"id":"data/CN/内蒙古/呼和浩特市","key":"呼和浩特市","lang":"zh-hans","lname":"Hohhot Shi","zipex":"010020","sub_keys":"和林格尔县~回民区~清水河县~赛罕区~土默特左旗~托克托县~武川县~新城区~玉泉区","sub_lnames":"Horinger Xian~Huimin Qu~Qingshuihe Xian~Saihan Qu~Tumd Zuoqi~Togtoh Xian~Wuchuan Xian~Xincheng Qu~Yuquan Qu","sub_zipexs":"011500~010030~011600~010020~010100~010200~011700~010010~010031"}
+data/CN/内蒙古/呼和浩特市/和林格尔县={"id":"data/CN/内蒙古/呼和浩特市/和林格尔县","key":"和林格尔县","lang":"zh-hans","lname":"Horinger Xian","zipex":"011500"}
+data/CN/内蒙古/呼和浩特市/回民区={"id":"data/CN/内蒙古/呼和浩特市/回民区","key":"回民区","lang":"zh-hans","lname":"Huimin Qu","zipex":"010030"}
+data/CN/内蒙古/呼和浩特市/土默特左旗={"id":"data/CN/内蒙古/呼和浩特市/土默特左旗","key":"土默特左旗","lang":"zh-hans","lname":"Tumd Zuoqi","zipex":"010100"}
+data/CN/内蒙古/呼和浩特市/托克托县={"id":"data/CN/内蒙古/呼和浩特市/托克托县","key":"托克托县","lang":"zh-hans","lname":"Togtoh Xian","zipex":"010200"}
+data/CN/内蒙古/呼和浩特市/新城区={"id":"data/CN/内蒙古/呼和浩特市/新城区","key":"新城区","lang":"zh-hans","lname":"Xincheng Qu","zipex":"010010"}
+data/CN/内蒙古/呼和浩特市/武川县={"id":"data/CN/内蒙古/呼和浩特市/武川县","key":"武川县","lang":"zh-hans","lname":"Wuchuan Xian","zipex":"011700"}
+data/CN/内蒙古/呼和浩特市/清水河县={"id":"data/CN/内蒙古/呼和浩特市/清水河县","key":"清水河县","lang":"zh-hans","lname":"Qingshuihe Xian","zipex":"011600"}
+data/CN/内蒙古/呼和浩特市/玉泉区={"id":"data/CN/内蒙古/呼和浩特市/玉泉区","key":"玉泉区","lang":"zh-hans","lname":"Yuquan Qu","zipex":"010031"}
+data/CN/内蒙古/呼和浩特市/赛罕区={"id":"data/CN/内蒙古/呼和浩特市/赛罕区","key":"赛罕区","lang":"zh-hans","lname":"Saihan Qu","zipex":"010020"}
+data/CN/内蒙古/巴彦淖尔市={"id":"data/CN/内蒙古/巴彦淖尔市","key":"巴彦淖尔市","lang":"zh-hans","lname":"Bayannur Shi","zipex":"015001","sub_keys":"磴口县~杭锦后旗~临河区~乌拉特后旗~乌拉特前旗~乌拉特中旗~五原县","sub_lnames":"Dengkou Xian~Hanggin Houqi~Linhe Qu~Urad Houqi~Urad Qianqi~Urad Zhongqi~Wuyuan Xian","sub_zipexs":"015200~015400~015001~015500~014400~015300~015100"}
+data/CN/内蒙古/巴彦淖尔市/临河区={"id":"data/CN/内蒙古/巴彦淖尔市/临河区","key":"临河区","lang":"zh-hans","lname":"Linhe Qu","zipex":"015001"}
+data/CN/内蒙古/巴彦淖尔市/乌拉特中旗={"id":"data/CN/内蒙古/巴彦淖尔市/乌拉特中旗","key":"乌拉特中旗","lang":"zh-hans","lname":"Urad Zhongqi","zipex":"015300"}
+data/CN/内蒙古/巴彦淖尔市/乌拉特前旗={"id":"data/CN/内蒙古/巴彦淖尔市/乌拉特前旗","key":"乌拉特前旗","lang":"zh-hans","lname":"Urad Qianqi","zipex":"014400"}
+data/CN/内蒙古/巴彦淖尔市/乌拉特后旗={"id":"data/CN/内蒙古/巴彦淖尔市/乌拉特后旗","key":"乌拉特后旗","lang":"zh-hans","lname":"Urad Houqi","zipex":"015500"}
+data/CN/内蒙古/巴彦淖尔市/五原县={"id":"data/CN/内蒙古/巴彦淖尔市/五原县","key":"五原县","lang":"zh-hans","lname":"Wuyuan Xian","zipex":"015100"}
+data/CN/内蒙古/巴彦淖尔市/杭锦后旗={"id":"data/CN/内蒙古/巴彦淖尔市/杭锦后旗","key":"杭锦后旗","lang":"zh-hans","lname":"Hanggin Houqi","zipex":"015400"}
+data/CN/内蒙古/巴彦淖尔市/磴口县={"id":"data/CN/内蒙古/巴彦淖尔市/磴口县","key":"磴口县","lang":"zh-hans","lname":"Dengkou Xian","zipex":"015200"}
+data/CN/内蒙古/赤峰市={"id":"data/CN/内蒙古/赤峰市","key":"赤峰市","lang":"zh-hans","lname":"Chifeng (Ulanhad) Shi","zipex":"024000","sub_keys":"阿鲁科尔沁旗~敖汉旗~巴林右旗~巴林左旗~红山区~喀喇沁旗~克什克腾旗~林西县~宁城县~松山区~翁牛特旗~元宝山区","sub_lnames":"Ar Horqin Qi~Aohan Qi~Bairin Youqi~Bairin Zuoqi~Hongshan Qu~Harqin Qi~Hexigten Qi~Linxi Xian~Ningcheng Xian~Songshan Qu~Ongniud Qi~Yuanbaoshan Qu","sub_zipexs":"025550~024300~025150~025450~024001~024400~025350~025250~024200~024001~024500~024070"}
+data/CN/内蒙古/赤峰市/元宝山区={"id":"data/CN/内蒙古/赤峰市/元宝山区","key":"元宝山区","lang":"zh-hans","lname":"Yuanbaoshan Qu","zipex":"024070"}
+data/CN/内蒙古/赤峰市/克什克腾旗={"id":"data/CN/内蒙古/赤峰市/克什克腾旗","key":"克什克腾旗","lang":"zh-hans","lname":"Hexigten Qi","zipex":"025350"}
+data/CN/内蒙古/赤峰市/喀喇沁旗={"id":"data/CN/内蒙古/赤峰市/喀喇沁旗","key":"喀喇沁旗","lang":"zh-hans","lname":"Harqin Qi","zipex":"024400"}
+data/CN/内蒙古/赤峰市/宁城县={"id":"data/CN/内蒙古/赤峰市/宁城县","key":"宁城县","lang":"zh-hans","lname":"Ningcheng Xian","zipex":"024200"}
+data/CN/内蒙古/赤峰市/巴林右旗={"id":"data/CN/内蒙古/赤峰市/巴林右旗","key":"巴林右旗","lang":"zh-hans","lname":"Bairin Youqi","zipex":"025150"}
+data/CN/内蒙古/赤峰市/巴林左旗={"id":"data/CN/内蒙古/赤峰市/巴林左旗","key":"巴林左旗","lang":"zh-hans","lname":"Bairin Zuoqi","zipex":"025450"}
+data/CN/内蒙古/赤峰市/敖汉旗={"id":"data/CN/内蒙古/赤峰市/敖汉旗","key":"敖汉旗","lang":"zh-hans","lname":"Aohan Qi","zipex":"024300"}
+data/CN/内蒙古/赤峰市/松山区={"id":"data/CN/内蒙古/赤峰市/松山区","key":"松山区","lang":"zh-hans","lname":"Songshan Qu","zipex":"024001"}
+data/CN/内蒙古/赤峰市/林西县={"id":"data/CN/内蒙古/赤峰市/林西县","key":"林西县","lang":"zh-hans","lname":"Linxi Xian","zipex":"025250"}
+data/CN/内蒙古/赤峰市/红山区={"id":"data/CN/内蒙古/赤峰市/红山区","key":"红山区","lang":"zh-hans","lname":"Hongshan Qu","zipex":"024001"}
+data/CN/内蒙古/赤峰市/翁牛特旗={"id":"data/CN/内蒙古/赤峰市/翁牛特旗","key":"翁牛特旗","lang":"zh-hans","lname":"Ongniud Qi","zipex":"024500"}
+data/CN/内蒙古/赤峰市/阿鲁科尔沁旗={"id":"data/CN/内蒙古/赤峰市/阿鲁科尔沁旗","key":"阿鲁科尔沁旗","lang":"zh-hans","lname":"Ar Horqin Qi","zipex":"025550"}
+data/CN/内蒙古/通辽市={"id":"data/CN/内蒙古/通辽市","key":"通辽市","lang":"zh-hans","lname":"Tongliao Shi","zipex":"028000","sub_keys":"霍林郭勒市~开鲁县~科尔沁区~科尔沁左翼后旗~科尔沁左翼中旗~库伦旗~奈曼旗~扎鲁特旗","sub_lnames":"Holingol Shi~Kailu Xian~Horqin Qu~Horqin Zuoyi Houqi~Horqin Zuoyi Zhongqi~Hure Qi~Naiman Qi~Jarud Qi","sub_zipexs":"029200~028400~028000~028100~029300~028200~028300~029100"}
+data/CN/内蒙古/通辽市/奈曼旗={"id":"data/CN/内蒙古/通辽市/奈曼旗","key":"奈曼旗","lang":"zh-hans","lname":"Naiman Qi","zipex":"028300"}
+data/CN/内蒙古/通辽市/库伦旗={"id":"data/CN/内蒙古/通辽市/库伦旗","key":"库伦旗","lang":"zh-hans","lname":"Hure Qi","zipex":"028200"}
+data/CN/内蒙古/通辽市/开鲁县={"id":"data/CN/内蒙古/通辽市/开鲁县","key":"开鲁县","lang":"zh-hans","lname":"Kailu Xian","zipex":"028400"}
+data/CN/内蒙古/通辽市/扎鲁特旗={"id":"data/CN/内蒙古/通辽市/扎鲁特旗","key":"扎鲁特旗","lang":"zh-hans","lname":"Jarud Qi","zipex":"029100"}
+data/CN/内蒙古/通辽市/科尔沁区={"id":"data/CN/内蒙古/通辽市/科尔沁区","key":"科尔沁区","lang":"zh-hans","lname":"Horqin Qu","zipex":"028000"}
+data/CN/内蒙古/通辽市/科尔沁左翼中旗={"id":"data/CN/内蒙古/通辽市/科尔沁左翼中旗","key":"科尔沁左翼中旗","lang":"zh-hans","lname":"Horqin Zuoyi Zhongqi","zipex":"029300"}
+data/CN/内蒙古/通辽市/科尔沁左翼后旗={"id":"data/CN/内蒙古/通辽市/科尔沁左翼后旗","key":"科尔沁左翼后旗","lang":"zh-hans","lname":"Horqin Zuoyi Houqi","zipex":"028100"}
+data/CN/内蒙古/通辽市/霍林郭勒市={"id":"data/CN/内蒙古/通辽市/霍林郭勒市","key":"霍林郭勒市","lang":"zh-hans","lname":"Holingol Shi","zipex":"029200"}
+data/CN/内蒙古/鄂尔多斯市={"id":"data/CN/内蒙古/鄂尔多斯市","key":"鄂尔多斯市","lang":"zh-hans","lname":"Ordos Shi","zipex":"017004","sub_keys":"达拉特旗~东胜区~鄂托克旗~鄂托克前旗~杭锦旗~乌审旗~伊金霍洛旗~准格尔旗","sub_lnames":"Dalad Qi~Dongsheng Qu~Otog Qi~Otog Qianqi~Hanggin Qi~Uxin Qi~Ejin Qi~Jungar Qi","sub_zipexs":"014300~017000~016100~016200~017400~017300~017200~010425"}
+data/CN/内蒙古/鄂尔多斯市/东胜区={"id":"data/CN/内蒙古/鄂尔多斯市/东胜区","key":"东胜区","lang":"zh-hans","lname":"Dongsheng Qu","zipex":"017000"}
+data/CN/内蒙古/鄂尔多斯市/乌审旗={"id":"data/CN/内蒙古/鄂尔多斯市/乌审旗","key":"乌审旗","lang":"zh-hans","lname":"Uxin Qi","zipex":"017300"}
+data/CN/内蒙古/鄂尔多斯市/伊金霍洛旗={"id":"data/CN/内蒙古/鄂尔多斯市/伊金霍洛旗","key":"伊金霍洛旗","lang":"zh-hans","lname":"Ejin Qi","zipex":"017200"}
+data/CN/内蒙古/鄂尔多斯市/准格尔旗={"id":"data/CN/内蒙古/鄂尔多斯市/准格尔旗","key":"准格尔旗","lang":"zh-hans","lname":"Jungar Qi","zipex":"010425"}
+data/CN/内蒙古/鄂尔多斯市/杭锦旗={"id":"data/CN/内蒙古/鄂尔多斯市/杭锦旗","key":"杭锦旗","lang":"zh-hans","lname":"Hanggin Qi","zipex":"017400"}
+data/CN/内蒙古/鄂尔多斯市/达拉特旗={"id":"data/CN/内蒙古/鄂尔多斯市/达拉特旗","key":"达拉特旗","lang":"zh-hans","lname":"Dalad Qi","zipex":"014300"}
+data/CN/内蒙古/鄂尔多斯市/鄂托克前旗={"id":"data/CN/内蒙古/鄂尔多斯市/鄂托克前旗","key":"鄂托克前旗","lang":"zh-hans","lname":"Otog Qianqi","zipex":"016200"}
+data/CN/内蒙古/鄂尔多斯市/鄂托克旗={"id":"data/CN/内蒙古/鄂尔多斯市/鄂托克旗","key":"鄂托克旗","lang":"zh-hans","lname":"Otog Qi","zipex":"016100"}
+data/CN/内蒙古/锡林郭勒盟={"id":"data/CN/内蒙古/锡林郭勒盟","key":"锡林郭勒盟","lang":"zh-hans","lname":"Xilin Gol Meng","zipex":"026021","sub_keys":"阿巴嘎旗~东乌珠穆沁旗~多伦县~二连浩特市~苏尼特右旗~苏尼特左旗~太仆寺旗~西乌珠穆沁旗~锡林浩特市~镶黄旗~正蓝旗~正镶白旗","sub_lnames":"Abag Qi~Dong Ujimqin Qi~Duolun (Dolonnur) Xian~Erenhot Shi~Sonid Youqi~Sonid Zuoqi~Taibus Qi~Xi Ujimqin Qi~Xilinhot Shi~Xianghuang (Hobot Xar) Qi~Zhenglan (Xulun Hoh) Qi~Zhengxiangbai (Xulun Hobot Qagan) Qi","sub_zipexs":"011400~026300~027300~011100~011200~011300~027000~026200~026021~013250~027200~013800"}
+data/CN/内蒙古/锡林郭勒盟/东乌珠穆沁旗={"id":"data/CN/内蒙古/锡林郭勒盟/东乌珠穆沁旗","key":"东乌珠穆沁旗","lang":"zh-hans","lname":"Dong Ujimqin Qi","zipex":"026300"}
+data/CN/内蒙古/锡林郭勒盟/二连浩特市={"id":"data/CN/内蒙古/锡林郭勒盟/二连浩特市","key":"二连浩特市","lang":"zh-hans","lname":"Erenhot Shi","zipex":"011100"}
+data/CN/内蒙古/锡林郭勒盟/多伦县={"id":"data/CN/内蒙古/锡林郭勒盟/多伦县","key":"多伦县","lang":"zh-hans","lname":"Duolun (Dolonnur) Xian","zipex":"027300"}
+data/CN/内蒙古/锡林郭勒盟/太仆寺旗={"id":"data/CN/内蒙古/锡林郭勒盟/太仆寺旗","key":"太仆寺旗","lang":"zh-hans","lname":"Taibus Qi","zipex":"027000"}
+data/CN/内蒙古/锡林郭勒盟/正蓝旗={"id":"data/CN/内蒙古/锡林郭勒盟/正蓝旗","key":"正蓝旗","lang":"zh-hans","lname":"Zhenglan (Xulun Hoh) Qi","zipex":"027200"}
+data/CN/内蒙古/锡林郭勒盟/正镶白旗={"id":"data/CN/内蒙古/锡林郭勒盟/正镶白旗","key":"正镶白旗","lang":"zh-hans","lname":"Zhengxiangbai (Xulun Hobot Qagan) Qi","zipex":"013800"}
+data/CN/内蒙古/锡林郭勒盟/苏尼特右旗={"id":"data/CN/内蒙古/锡林郭勒盟/苏尼特右旗","key":"苏尼特右旗","lang":"zh-hans","lname":"Sonid Youqi","zipex":"011200"}
+data/CN/内蒙古/锡林郭勒盟/苏尼特左旗={"id":"data/CN/内蒙古/锡林郭勒盟/苏尼特左旗","key":"苏尼特左旗","lang":"zh-hans","lname":"Sonid Zuoqi","zipex":"011300"}
+data/CN/内蒙古/锡林郭勒盟/西乌珠穆沁旗={"id":"data/CN/内蒙古/锡林郭勒盟/西乌珠穆沁旗","key":"西乌珠穆沁旗","lang":"zh-hans","lname":"Xi Ujimqin Qi","zipex":"026200"}
+data/CN/内蒙古/锡林郭勒盟/锡林浩特市={"id":"data/CN/内蒙古/锡林郭勒盟/锡林浩特市","key":"锡林浩特市","lang":"zh-hans","lname":"Xilinhot Shi","zipex":"026021"}
+data/CN/内蒙古/锡林郭勒盟/镶黄旗={"id":"data/CN/内蒙古/锡林郭勒盟/镶黄旗","key":"镶黄旗","lang":"zh-hans","lname":"Xianghuang (Hobot Xar) Qi","zipex":"013250"}
+data/CN/内蒙古/锡林郭勒盟/阿巴嘎旗={"id":"data/CN/内蒙古/锡林郭勒盟/阿巴嘎旗","key":"阿巴嘎旗","lang":"zh-hans","lname":"Abag Qi","zipex":"011400"}
+data/CN/内蒙古/阿拉善盟={"id":"data/CN/内蒙古/阿拉善盟","key":"阿拉善盟","lang":"zh-hans","lname":"Alxa Meng","zipex":"750306","sub_keys":"阿拉善右旗~阿拉善左旗~额济纳旗","sub_lnames":"Alxa Youqi~Alxa Zuoqi~Ejin Qi","sub_zipexs":"737300~750306~735400"}
+data/CN/内蒙古/阿拉善盟/阿拉善右旗={"id":"data/CN/内蒙古/阿拉善盟/阿拉善右旗","key":"阿拉善右旗","lang":"zh-hans","lname":"Alxa Youqi","zipex":"737300"}
+data/CN/内蒙古/阿拉善盟/阿拉善左旗={"id":"data/CN/内蒙古/阿拉善盟/阿拉善左旗","key":"阿拉善左旗","lang":"zh-hans","lname":"Alxa Zuoqi","zipex":"750306"}
+data/CN/内蒙古/阿拉善盟/额济纳旗={"id":"data/CN/内蒙古/阿拉善盟/额济纳旗","key":"额济纳旗","lang":"zh-hans","lname":"Ejin Qi","zipex":"735400"}
+data/CN/北京市={"id":"data/CN/北京市","key":"北京市","lang":"zh-hans","lname":"Beijing Shi","isoid":"11","sub_keys":"昌平区~朝阳区~大兴区~东城区~房山区~丰台区~海淀区~怀柔区~门头沟区~密云县~平谷区~石景山区~顺义区~通州区~西城区~延庆县","sub_lnames":"Changping Qu~Chaoyang Qu~Daxing Qu~Dongcheng Qu~Fangshan Qu~Fengtai Qu~Haidian Qu~Huairou Qu~Mentougou Qu~Miyun Xian~Pinggu Qu~Shijingshan Qu~Shunyi Qu~Tongzhou Qu~Xicheng Qu~Yanqing Xian","sub_zipexs":"102200~100020~102600~100010~102400~100071~100080~101400~102300~101500~101200~100043~101300~101149~100032~102100"}
+data/CN/北京市/东城区={"id":"data/CN/北京市/东城区","key":"东城区","lang":"zh-hans","lname":"Dongcheng Qu","zipex":"100010"}
+data/CN/北京市/丰台区={"id":"data/CN/北京市/丰台区","key":"丰台区","lang":"zh-hans","lname":"Fengtai Qu","zipex":"100071"}
+data/CN/北京市/大兴区={"id":"data/CN/北京市/大兴区","key":"大兴区","lang":"zh-hans","lname":"Daxing Qu","zipex":"102600"}
+data/CN/北京市/密云县={"id":"data/CN/北京市/密云县","key":"密云县","lang":"zh-hans","lname":"Miyun Xian","zipex":"101500"}
+data/CN/北京市/平谷区={"id":"data/CN/北京市/平谷区","key":"平谷区","lang":"zh-hans","lname":"Pinggu Qu","zipex":"101200"}
+data/CN/北京市/延庆县={"id":"data/CN/北京市/延庆县","key":"延庆县","lang":"zh-hans","lname":"Yanqing Xian","zipex":"102100"}
+data/CN/北京市/怀柔区={"id":"data/CN/北京市/怀柔区","key":"怀柔区","lang":"zh-hans","lname":"Huairou Qu","zipex":"101400"}
+data/CN/北京市/房山区={"id":"data/CN/北京市/房山区","key":"房山区","lang":"zh-hans","lname":"Fangshan Qu","zipex":"102400"}
+data/CN/北京市/昌平区={"id":"data/CN/北京市/昌平区","key":"昌平区","lang":"zh-hans","lname":"Changping Qu","zipex":"102200"}
+data/CN/北京市/朝阳区={"id":"data/CN/北京市/朝阳区","key":"朝阳区","lang":"zh-hans","lname":"Chaoyang Qu","zipex":"100020"}
+data/CN/北京市/海淀区={"id":"data/CN/北京市/海淀区","key":"海淀区","lang":"zh-hans","lname":"Haidian Qu","zipex":"100080"}
+data/CN/北京市/石景山区={"id":"data/CN/北京市/石景山区","key":"石景山区","lang":"zh-hans","lname":"Shijingshan Qu","zipex":"100043"}
+data/CN/北京市/西城区={"id":"data/CN/北京市/西城区","key":"西城区","lang":"zh-hans","lname":"Xicheng Qu","zipex":"100032"}
+data/CN/北京市/通州区={"id":"data/CN/北京市/通州区","key":"通州区","lang":"zh-hans","lname":"Tongzhou Qu","zipex":"101149"}
+data/CN/北京市/门头沟区={"id":"data/CN/北京市/门头沟区","key":"门头沟区","lang":"zh-hans","lname":"Mentougou Qu","zipex":"102300"}
+data/CN/北京市/顺义区={"id":"data/CN/北京市/顺义区","key":"顺义区","lang":"zh-hans","lname":"Shunyi Qu","zipex":"101300"}
+data/CN/台湾={"id":"data/CN/台湾","key":"台湾","lang":"zh-hans","lname":"Taiwan","isoid":"71","xzip":"\\d{3}(\\d{2})?","sub_keys":"高雄市~高雄縣~花蓮縣~基隆市~嘉義市~嘉義縣~金門縣~連江縣~苗栗縣~南投縣~澎湖縣~屏東縣~台北市~台北縣~台東縣~台南市~台南縣~台中市~台中縣~桃園縣~新竹市~新竹縣~宜蘭縣~雲林縣~彰化縣","sub_lnames":"Kaohsiung City~Kaohsiung County~Hualien County~Keelung City~Chiayi City~Chiayi County~Kinmen County~Lienchiang County~Miaoli County~Nantou County~Penghu County~Pingtung County~Taipei City~Taipei County~Taitung County~Tainan City~Tainan County~Taichung City~Taichung County~Taoyuan County~Hsinchu City~Hsinchu County~Yilan County~Yunlin County~Changhua County","sub_zips":"80|81[1-379]~8[2-5]|81[45]~9[78]~20[0-6]~600~60[1-9]|6[12]~89~209|21[012]~3[56]~5[45]~88~9[0-4]~1[01]~20[78]|2[2345]~9[56]~70~7[1-4]~40~4[123]~3[23]~300~30[2-9]|31~2[67]~6[3-5]~5[0123]","sub_zipexs":"800,813:817,819~814,815:820,852~970,983~200,206~~602,625~890,896~209,212~350,369~540,558~880,885~900,947~100,119~207,208:220,253~950,966~700,709~710,745~400,408~411,439~320,338~~302,315~260,272~630,655~500,530","sub_mores":"true~true~true~true~false~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~false~true~true~true~true"}
+data/CN/台湾/南投縣={"id":"data/CN/台湾/南投縣","key":"南投縣","lang":"zh-hans","lname":"Nantou County","zip":"5[45]","zipex":"540,558","sub_keys":"草屯鎮~國姓鄉~集集鎮~鹿谷鄉~名間鄉~南投市~埔里鎮~仁愛鄉~水里鄉~信義鄉~魚池鄉~中寮鄉~竹山鎮","sub_lnames":"Caotun Township~Guosing Township~Jiji Township~Lugu Township~Mingjian Township~Nantou City~Puli Township~Ren-ai Township~Shueili Township~Sinyi Township~Yuchih Township~Jhongliao Township~Jhushan Township","sub_zips":"542~544~552~558~551~540~545~546~553~556~555~541~557"}
+data/CN/台湾/南投縣/中寮鄉={"id":"data/CN/台湾/南投縣/中寮鄉","key":"中寮鄉","lang":"zh-hans","lname":"Jhongliao Township","zip":"541"}
+data/CN/台湾/南投縣/仁愛鄉={"id":"data/CN/台湾/南投縣/仁愛鄉","key":"仁愛鄉","lang":"zh-hans","lname":"Ren-ai Township","zip":"546"}
+data/CN/台湾/南投縣/信義鄉={"id":"data/CN/台湾/南投縣/信義鄉","key":"信義鄉","lang":"zh-hans","lname":"Sinyi Township","zip":"556"}
+data/CN/台湾/南投縣/南投市={"id":"data/CN/台湾/南投縣/南投市","key":"南投市","lang":"zh-hans","lname":"Nantou City","zip":"540"}
+data/CN/台湾/南投縣/名間鄉={"id":"data/CN/台湾/南投縣/名間鄉","key":"名間鄉","lang":"zh-hans","lname":"Mingjian Township","zip":"551"}
+data/CN/台湾/南投縣/國姓鄉={"id":"data/CN/台湾/南投縣/國姓鄉","key":"國姓鄉","lang":"zh-hans","lname":"Guosing Township","zip":"544"}
+data/CN/台湾/南投縣/埔里鎮={"id":"data/CN/台湾/南投縣/埔里鎮","key":"埔里鎮","lang":"zh-hans","lname":"Puli Township","zip":"545"}
+data/CN/台湾/南投縣/水里鄉={"id":"data/CN/台湾/南投縣/水里鄉","key":"水里鄉","lang":"zh-hans","lname":"Shueili Township","zip":"553"}
+data/CN/台湾/南投縣/竹山鎮={"id":"data/CN/台湾/南投縣/竹山鎮","key":"竹山鎮","lang":"zh-hans","lname":"Jhushan Township","zip":"557"}
+data/CN/台湾/南投縣/草屯鎮={"id":"data/CN/台湾/南投縣/草屯鎮","key":"草屯鎮","lang":"zh-hans","lname":"Caotun Township","zip":"542"}
+data/CN/台湾/南投縣/集集鎮={"id":"data/CN/台湾/南投縣/集集鎮","key":"集集鎮","lang":"zh-hans","lname":"Jiji Township","zip":"552"}
+data/CN/台湾/南投縣/魚池鄉={"id":"data/CN/台湾/南投縣/魚池鄉","key":"魚池鄉","lang":"zh-hans","lname":"Yuchih Township","zip":"555"}
+data/CN/台湾/南投縣/鹿谷鄉={"id":"data/CN/台湾/南投縣/鹿谷鄉","key":"鹿谷鄉","lang":"zh-hans","lname":"Lugu Township","zip":"558"}
+data/CN/台湾/台中市={"id":"data/CN/台湾/台中市","key":"台中市","lang":"zh-hans","lname":"Taichung City","zip":"40","zipex":"400,408","sub_keys":"北區~北屯區~東區~南區~南屯區~西區~西屯區~中區","sub_lnames":"North District~Beitun District~East District~South District~Nantun District~West District~Situn District~Central District","sub_zips":"404~406~401~402~408~403~407~400"}
+data/CN/台湾/台中市/中區={"id":"data/CN/台湾/台中市/中區","key":"中區","lang":"zh-hans","lname":"Central District","zip":"400"}
+data/CN/台湾/台中市/北區={"id":"data/CN/台湾/台中市/北區","key":"北區","lang":"zh-hans","lname":"North District","zip":"404"}
+data/CN/台湾/台中市/北屯區={"id":"data/CN/台湾/台中市/北屯區","key":"北屯區","lang":"zh-hans","lname":"Beitun District","zip":"406"}
+data/CN/台湾/台中市/南區={"id":"data/CN/台湾/台中市/南區","key":"南區","lang":"zh-hans","lname":"South District","zip":"402"}
+data/CN/台湾/台中市/南屯區={"id":"data/CN/台湾/台中市/南屯區","key":"南屯區","lang":"zh-hans","lname":"Nantun District","zip":"408"}
+data/CN/台湾/台中市/東區={"id":"data/CN/台湾/台中市/東區","key":"東區","lang":"zh-hans","lname":"East District","zip":"401"}
+data/CN/台湾/台中市/西區={"id":"data/CN/台湾/台中市/西區","key":"西區","lang":"zh-hans","lname":"West District","zip":"403"}
+data/CN/台湾/台中市/西屯區={"id":"data/CN/台湾/台中市/西屯區","key":"西屯區","lang":"zh-hans","lname":"Situn District","zip":"407"}
+data/CN/台湾/台中縣={"id":"data/CN/台湾/台中縣","key":"台中縣","lang":"zh-hans","lname":"Taichung County","zip":"4[123]","zipex":"411,439","sub_keys":"大安鄉~大肚鄉~大甲鎮~大里市~大雅鄉~東勢鎮~豐原市~和平鄉~后里鄉~龍井鄉~清水鎮~沙鹿鎮~神岡鄉~石岡鄉~太平市~潭子鄉~外埔鄉~烏日鄉~梧棲鎮~霧峰鄉~新社鄉","sub_lnames":"Da-an Township~Dadu Township~Dajia Township~Dali City~Daya Township~Dongshih Township~Fongyuan City~Heping Township~Houli Township~Longjing Township~Cingshuei Township~Shalu Township~Shengang Township~Shihgang Township~Taiping City~Tanzih Township~Waipu Township~Wurih Township~Wuci Township~Wufong Township~Sinshe Township","sub_zips":"439~432~437~412~428~423~420~424~421~434~436~433~429~422~411~427~438~414~435~413~426"}
+data/CN/台湾/台中縣/后里鄉={"id":"data/CN/台湾/台中縣/后里鄉","key":"后里鄉","lang":"zh-hans","lname":"Houli Township","zip":"421"}
+data/CN/台湾/台中縣/和平鄉={"id":"data/CN/台湾/台中縣/和平鄉","key":"和平鄉","lang":"zh-hans","lname":"Heping Township","zip":"424"}
+data/CN/台湾/台中縣/外埔鄉={"id":"data/CN/台湾/台中縣/外埔鄉","key":"外埔鄉","lang":"zh-hans","lname":"Waipu Township","zip":"438"}
+data/CN/台湾/台中縣/大安鄉={"id":"data/CN/台湾/台中縣/大安鄉","key":"大安鄉","lang":"zh-hans","lname":"Da-an Township","zip":"439"}
+data/CN/台湾/台中縣/大甲鎮={"id":"data/CN/台湾/台中縣/大甲鎮","key":"大甲鎮","lang":"zh-hans","lname":"Dajia Township","zip":"437"}
+data/CN/台湾/台中縣/大肚鄉={"id":"data/CN/台湾/台中縣/大肚鄉","key":"大肚鄉","lang":"zh-hans","lname":"Dadu Township","zip":"432"}
+data/CN/台湾/台中縣/大里市={"id":"data/CN/台湾/台中縣/大里市","key":"大里市","lang":"zh-hans","lname":"Dali City","zip":"412"}
+data/CN/台湾/台中縣/大雅鄉={"id":"data/CN/台湾/台中縣/大雅鄉","key":"大雅鄉","lang":"zh-hans","lname":"Daya Township","zip":"428"}
+data/CN/台湾/台中縣/太平市={"id":"data/CN/台湾/台中縣/太平市","key":"太平市","lang":"zh-hans","lname":"Taiping City","zip":"411"}
+data/CN/台湾/台中縣/新社鄉={"id":"data/CN/台湾/台中縣/新社鄉","key":"新社鄉","lang":"zh-hans","lname":"Sinshe Township","zip":"426"}
+data/CN/台湾/台中縣/東勢鎮={"id":"data/CN/台湾/台中縣/東勢鎮","key":"東勢鎮","lang":"zh-hans","lname":"Dongshih Township","zip":"423"}
+data/CN/台湾/台中縣/梧棲鎮={"id":"data/CN/台湾/台中縣/梧棲鎮","key":"梧棲鎮","lang":"zh-hans","lname":"Wuci Township","zip":"435"}
+data/CN/台湾/台中縣/沙鹿鎮={"id":"data/CN/台湾/台中縣/沙鹿鎮","key":"沙鹿鎮","lang":"zh-hans","lname":"Shalu Township","zip":"433"}
+data/CN/台湾/台中縣/清水鎮={"id":"data/CN/台湾/台中縣/清水鎮","key":"清水鎮","lang":"zh-hans","lname":"Cingshuei Township","zip":"436"}
+data/CN/台湾/台中縣/潭子鄉={"id":"data/CN/台湾/台中縣/潭子鄉","key":"潭子鄉","lang":"zh-hans","lname":"Tanzih Township","zip":"427"}
+data/CN/台湾/台中縣/烏日鄉={"id":"data/CN/台湾/台中縣/烏日鄉","key":"烏日鄉","lang":"zh-hans","lname":"Wurih Township","zip":"414"}
+data/CN/台湾/台中縣/石岡鄉={"id":"data/CN/台湾/台中縣/石岡鄉","key":"石岡鄉","lang":"zh-hans","lname":"Shihgang Township","zip":"422"}
+data/CN/台湾/台中縣/神岡鄉={"id":"data/CN/台湾/台中縣/神岡鄉","key":"神岡鄉","lang":"zh-hans","lname":"Shengang Township","zip":"429"}
+data/CN/台湾/台中縣/豐原市={"id":"data/CN/台湾/台中縣/豐原市","key":"豐原市","lang":"zh-hans","lname":"Fongyuan City","zip":"420"}
+data/CN/台湾/台中縣/霧峰鄉={"id":"data/CN/台湾/台中縣/霧峰鄉","key":"霧峰鄉","lang":"zh-hans","lname":"Wufong Township","zip":"413"}
+data/CN/台湾/台中縣/龍井鄉={"id":"data/CN/台湾/台中縣/龍井鄉","key":"龍井鄉","lang":"zh-hans","lname":"Longjing Township","zip":"434"}
+data/CN/台湾/台北市={"id":"data/CN/台湾/台北市","key":"台北市","lang":"zh-hans","lname":"Taipei City","zip":"1[01]","zipex":"100,119","sub_keys":"北投區~大安區~大同區~南港區~內湖區~士林區~松山區~萬華區~文山區~信義區~中山區~中正區","sub_lnames":"Beitou District~Da-an District~Datong District~Nangang District~Neihu District~Shihlin District~Songshan District~Wanhua District~Wunshan District~Sinyi District~Jhongshan District~Jhongjheng District","sub_zips":"112~106~103~115~114~111~105~108~116~110~104~100"}
+data/CN/台湾/台北市/中山區={"id":"data/CN/台湾/台北市/中山區","key":"中山區","lang":"zh-hans","lname":"Jhongshan District","zip":"104"}
+data/CN/台湾/台北市/中正區={"id":"data/CN/台湾/台北市/中正區","key":"中正區","lang":"zh-hans","lname":"Jhongjheng District","zip":"100"}
+data/CN/台湾/台北市/信義區={"id":"data/CN/台湾/台北市/信義區","key":"信義區","lang":"zh-hans","lname":"Sinyi District","zip":"110"}
+data/CN/台湾/台北市/內湖區={"id":"data/CN/台湾/台北市/內湖區","key":"內湖區","lang":"zh-hans","lname":"Neihu District","zip":"114"}
+data/CN/台湾/台北市/北投區={"id":"data/CN/台湾/台北市/北投區","key":"北投區","lang":"zh-hans","lname":"Beitou District","zip":"112"}
+data/CN/台湾/台北市/南港區={"id":"data/CN/台湾/台北市/南港區","key":"南港區","lang":"zh-hans","lname":"Nangang District","zip":"115"}
+data/CN/台湾/台北市/士林區={"id":"data/CN/台湾/台北市/士林區","key":"士林區","lang":"zh-hans","lname":"Shihlin District","zip":"111"}
+data/CN/台湾/台北市/大同區={"id":"data/CN/台湾/台北市/大同區","key":"大同區","lang":"zh-hans","lname":"Datong District","zip":"103"}
+data/CN/台湾/台北市/大安區={"id":"data/CN/台湾/台北市/大安區","key":"大安區","lang":"zh-hans","lname":"Da-an District","zip":"106"}
+data/CN/台湾/台北市/文山區={"id":"data/CN/台湾/台北市/文山區","key":"文山區","lang":"zh-hans","lname":"Wunshan District","zip":"116"}
+data/CN/台湾/台北市/松山區={"id":"data/CN/台湾/台北市/松山區","key":"松山區","lang":"zh-hans","lname":"Songshan District","zip":"105"}
+data/CN/台湾/台北市/萬華區={"id":"data/CN/台湾/台北市/萬華區","key":"萬華區","lang":"zh-hans","lname":"Wanhua District","zip":"108"}
+data/CN/台湾/台北縣={"id":"data/CN/台湾/台北縣","key":"台北縣","lang":"zh-hans","lname":"Taipei County","zip":"20[78]|2[2345]","zipex":"207,208:220,253","sub_keys":"八里鄉~板橋市~淡水鎮~貢寮鄉~金山鄉~林口鄉~蘆洲市~平溪鄉~坪林鄉~瑞芳鎮~三峽鎮~三芝鄉~三重市~深坑鄉~石碇鄉~石門鄉~樹林市~雙溪鄉~泰山鄉~土城市~萬里鄉~烏來鄉~五股鄉~汐止市~新店市~新莊市~鶯歌鎮~永和市~中和市","sub_lnames":"Bali Township~Banciao City~Danshuei Township~Gongliao Township~Jinshan Township~Linkou Township~Lujhou City~Pingsi Township~Pinglin Township~Rueifang Township~Sansia Township~Sanjhih Township~Sanchong City~Shenkeng Township~Shihding Township~Shihmen Township~Shulin City~Shuangsi Township~Taishan Township~Tucheng City~Wanli Township~Wulai Township~Wugu Township~Sijhih City~Sindian City~Sinjhuang City~Yingge Township~Yonghe City~Jhonghe City","sub_zips":"249~220~251~228~208~244~247~226~232~224~237~252~241~222~223~253~238~227~243~236~207~233~248~221~231~242~239~234~235"}
+data/CN/台湾/台北縣/三峽鎮={"id":"data/CN/台湾/台北縣/三峽鎮","key":"三峽鎮","lang":"zh-hans","lname":"Sansia Township","zip":"237"}
+data/CN/台湾/台北縣/三芝鄉={"id":"data/CN/台湾/台北縣/三芝鄉","key":"三芝鄉","lang":"zh-hans","lname":"Sanjhih Township","zip":"252"}
+data/CN/台湾/台北縣/三重市={"id":"data/CN/台湾/台北縣/三重市","key":"三重市","lang":"zh-hans","lname":"Sanchong City","zip":"241"}
+data/CN/台湾/台北縣/中和市={"id":"data/CN/台湾/台北縣/中和市","key":"中和市","lang":"zh-hans","lname":"Jhonghe City","zip":"235"}
+data/CN/台湾/台北縣/五股鄉={"id":"data/CN/台湾/台北縣/五股鄉","key":"五股鄉","lang":"zh-hans","lname":"Wugu Township","zip":"248"}
+data/CN/台湾/台北縣/八里鄉={"id":"data/CN/台湾/台北縣/八里鄉","key":"八里鄉","lang":"zh-hans","lname":"Bali Township","zip":"249"}
+data/CN/台湾/台北縣/土城市={"id":"data/CN/台湾/台北縣/土城市","key":"土城市","lang":"zh-hans","lname":"Tucheng City","zip":"236"}
+data/CN/台湾/台北縣/坪林鄉={"id":"data/CN/台湾/台北縣/坪林鄉","key":"坪林鄉","lang":"zh-hans","lname":"Pinglin Township","zip":"232"}
+data/CN/台湾/台北縣/平溪鄉={"id":"data/CN/台湾/台北縣/平溪鄉","key":"平溪鄉","lang":"zh-hans","lname":"Pingsi Township","zip":"226"}
+data/CN/台湾/台北縣/新店市={"id":"data/CN/台湾/台北縣/新店市","key":"新店市","lang":"zh-hans","lname":"Sindian City","zip":"231"}
+data/CN/台湾/台北縣/新莊市={"id":"data/CN/台湾/台北縣/新莊市","key":"新莊市","lang":"zh-hans","lname":"Sinjhuang City","zip":"242"}
+data/CN/台湾/台北縣/板橋市={"id":"data/CN/台湾/台北縣/板橋市","key":"板橋市","lang":"zh-hans","lname":"Banciao City","zip":"220"}
+data/CN/台湾/台北縣/林口鄉={"id":"data/CN/台湾/台北縣/林口鄉","key":"林口鄉","lang":"zh-hans","lname":"Linkou Township","zip":"244"}
+data/CN/台湾/台北縣/樹林市={"id":"data/CN/台湾/台北縣/樹林市","key":"樹林市","lang":"zh-hans","lname":"Shulin City","zip":"238"}
+data/CN/台湾/台北縣/永和市={"id":"data/CN/台湾/台北縣/永和市","key":"永和市","lang":"zh-hans","lname":"Yonghe City","zip":"234"}
+data/CN/台湾/台北縣/汐止市={"id":"data/CN/台湾/台北縣/汐止市","key":"汐止市","lang":"zh-hans","lname":"Sijhih City","zip":"221"}
+data/CN/台湾/台北縣/泰山鄉={"id":"data/CN/台湾/台北縣/泰山鄉","key":"泰山鄉","lang":"zh-hans","lname":"Taishan Township","zip":"243"}
+data/CN/台湾/台北縣/淡水鎮={"id":"data/CN/台湾/台北縣/淡水鎮","key":"淡水鎮","lang":"zh-hans","lname":"Danshuei Township","zip":"251"}
+data/CN/台湾/台北縣/深坑鄉={"id":"data/CN/台湾/台北縣/深坑鄉","key":"深坑鄉","lang":"zh-hans","lname":"Shenkeng Township","zip":"222"}
+data/CN/台湾/台北縣/烏來鄉={"id":"data/CN/台湾/台北縣/烏來鄉","key":"烏來鄉","lang":"zh-hans","lname":"Wulai Township","zip":"233"}
+data/CN/台湾/台北縣/瑞芳鎮={"id":"data/CN/台湾/台北縣/瑞芳鎮","key":"瑞芳鎮","lang":"zh-hans","lname":"Rueifang Township","zip":"224"}
+data/CN/台湾/台北縣/石碇鄉={"id":"data/CN/台湾/台北縣/石碇鄉","key":"石碇鄉","lang":"zh-hans","lname":"Shihding Township","zip":"223"}
+data/CN/台湾/台北縣/石門鄉={"id":"data/CN/台湾/台北縣/石門鄉","key":"石門鄉","lang":"zh-hans","lname":"Shihmen Township","zip":"253"}
+data/CN/台湾/台北縣/萬里鄉={"id":"data/CN/台湾/台北縣/萬里鄉","key":"萬里鄉","lang":"zh-hans","lname":"Wanli Township","zip":"207"}
+data/CN/台湾/台北縣/蘆洲市={"id":"data/CN/台湾/台北縣/蘆洲市","key":"蘆洲市","lang":"zh-hans","lname":"Lujhou City","zip":"247"}
+data/CN/台湾/台北縣/貢寮鄉={"id":"data/CN/台湾/台北縣/貢寮鄉","key":"貢寮鄉","lang":"zh-hans","lname":"Gongliao Township","zip":"228"}
+data/CN/台湾/台北縣/金山鄉={"id":"data/CN/台湾/台北縣/金山鄉","key":"金山鄉","lang":"zh-hans","lname":"Jinshan Township","zip":"208"}
+data/CN/台湾/台北縣/雙溪鄉={"id":"data/CN/台湾/台北縣/雙溪鄉","key":"雙溪鄉","lang":"zh-hans","lname":"Shuangsi Township","zip":"227"}
+data/CN/台湾/台北縣/鶯歌鎮={"id":"data/CN/台湾/台北縣/鶯歌鎮","key":"鶯歌鎮","lang":"zh-hans","lname":"Yingge Township","zip":"239"}
+data/CN/台湾/台南市={"id":"data/CN/台湾/台南市","key":"台南市","lang":"zh-hans","lname":"Tainan City","zip":"70","zipex":"700,709","sub_keys":"安南區~安平區~北區~東區~南區~中西區","sub_lnames":"Annan District~Anping District~North District~East District~South District~West Central District","sub_zips":"709~708~704~701~702~700"}
+data/CN/台湾/台南市/中西區={"id":"data/CN/台湾/台南市/中西區","key":"中西區","lang":"zh-hans","lname":"West Central District","zip":"700"}
+data/CN/台湾/台南市/北區={"id":"data/CN/台湾/台南市/北區","key":"北區","lang":"zh-hans","lname":"North District","zip":"704"}
+data/CN/台湾/台南市/南區={"id":"data/CN/台湾/台南市/南區","key":"南區","lang":"zh-hans","lname":"South District","zip":"702"}
+data/CN/台湾/台南市/安南區={"id":"data/CN/台湾/台南市/安南區","key":"安南區","lang":"zh-hans","lname":"Annan District","zip":"709"}
+data/CN/台湾/台南市/安平區={"id":"data/CN/台湾/台南市/安平區","key":"安平區","lang":"zh-hans","lname":"Anping District","zip":"708"}
+data/CN/台湾/台南市/東區={"id":"data/CN/台湾/台南市/東區","key":"東區","lang":"zh-hans","lname":"East District","zip":"701"}
+data/CN/台湾/台南縣={"id":"data/CN/台湾/台南縣","key":"台南縣","lang":"zh-hans","lname":"Tainan County","zip":"7[1-4]","zipex":"710,745","sub_keys":"安定鄉~白河鎮~北門鄉~大內鄉~東山鄉~官田鄉~關廟鄉~歸仁鄉~後壁鄉~佳里鎮~將軍鄉~柳營鄉~六甲鄉~龍崎鄉~麻豆鎮~南化鄉~楠西鄉~七股鄉~仁德鄉~山上鄉~善化鎮~西港鄉~下營鄉~新化鎮~新市鄉~新營市~學甲鎮~鹽水鎮~永康市~玉井鄉~左鎮鄉","sub_lnames":"Anding Township~Baihe Township~Beimen Township~Danei Township~Dongshan Township~Guantian Township~Guanmiao Township~Gueiren Township~Houbi Township~Jiali Township~Jiangjyun Township~Liouying Township~Lioujia Township~Longci Township~Madou Township~Nanhua Township~Nansi Township~Cigu Township~Rende Township~Shanshang Township~Shanhua Township~Sigang Township~Siaying Township~Sinhua Township~Sinshih Township~Sinying City~Syuejia Township~Yanshuei Township~Yongkang City~Yujing Township~Zuojhen Township","sub_zips":"745~732~727~742~733~720~718~711~731~722~725~736~734~719~721~716~715~724~717~743~741~723~735~712~744~730~726~737~710~714~713"}
+data/CN/台湾/台南縣/七股鄉={"id":"data/CN/台湾/台南縣/七股鄉","key":"七股鄉","lang":"zh-hans","lname":"Cigu Township","zip":"724"}
+data/CN/台湾/台南縣/下營鄉={"id":"data/CN/台湾/台南縣/下營鄉","key":"下營鄉","lang":"zh-hans","lname":"Siaying Township","zip":"735"}
+data/CN/台湾/台南縣/仁德鄉={"id":"data/CN/台湾/台南縣/仁德鄉","key":"仁德鄉","lang":"zh-hans","lname":"Rende Township","zip":"717"}
+data/CN/台湾/台南縣/佳里鎮={"id":"data/CN/台湾/台南縣/佳里鎮","key":"佳里鎮","lang":"zh-hans","lname":"Jiali Township","zip":"722"}
+data/CN/台湾/台南縣/六甲鄉={"id":"data/CN/台湾/台南縣/六甲鄉","key":"六甲鄉","lang":"zh-hans","lname":"Lioujia Township","zip":"734"}
+data/CN/台湾/台南縣/北門鄉={"id":"data/CN/台湾/台南縣/北門鄉","key":"北門鄉","lang":"zh-hans","lname":"Beimen Township","zip":"727"}
+data/CN/台湾/台南縣/南化鄉={"id":"data/CN/台湾/台南縣/南化鄉","key":"南化鄉","lang":"zh-hans","lname":"Nanhua Township","zip":"716"}
+data/CN/台湾/台南縣/善化鎮={"id":"data/CN/台湾/台南縣/善化鎮","key":"善化鎮","lang":"zh-hans","lname":"Shanhua Township","zip":"741"}
+data/CN/台湾/台南縣/大內鄉={"id":"data/CN/台湾/台南縣/大內鄉","key":"大內鄉","lang":"zh-hans","lname":"Danei Township","zip":"742"}
+data/CN/台湾/台南縣/學甲鎮={"id":"data/CN/台湾/台南縣/學甲鎮","key":"學甲鎮","lang":"zh-hans","lname":"Syuejia Township","zip":"726"}
+data/CN/台湾/台南縣/安定鄉={"id":"data/CN/台湾/台南縣/安定鄉","key":"安定鄉","lang":"zh-hans","lname":"Anding Township","zip":"745"}
+data/CN/台湾/台南縣/官田鄉={"id":"data/CN/台湾/台南縣/官田鄉","key":"官田鄉","lang":"zh-hans","lname":"Guantian Township","zip":"720"}
+data/CN/台湾/台南縣/將軍鄉={"id":"data/CN/台湾/台南縣/將軍鄉","key":"將軍鄉","lang":"zh-hans","lname":"Jiangjyun Township","zip":"725"}
+data/CN/台湾/台南縣/山上鄉={"id":"data/CN/台湾/台南縣/山上鄉","key":"山上鄉","lang":"zh-hans","lname":"Shanshang Township","zip":"743"}
+data/CN/台湾/台南縣/左鎮鄉={"id":"data/CN/台湾/台南縣/左鎮鄉","key":"左鎮鄉","lang":"zh-hans","lname":"Zuojhen Township","zip":"713"}
+data/CN/台湾/台南縣/後壁鄉={"id":"data/CN/台湾/台南縣/後壁鄉","key":"後壁鄉","lang":"zh-hans","lname":"Houbi Township","zip":"731"}
+data/CN/台湾/台南縣/新化鎮={"id":"data/CN/台湾/台南縣/新化鎮","key":"新化鎮","lang":"zh-hans","lname":"Sinhua Township","zip":"712"}
+data/CN/台湾/台南縣/新市鄉={"id":"data/CN/台湾/台南縣/新市鄉","key":"新市鄉","lang":"zh-hans","lname":"Sinshih Township","zip":"744"}
+data/CN/台湾/台南縣/新營市={"id":"data/CN/台湾/台南縣/新營市","key":"新營市","lang":"zh-hans","lname":"Sinying City","zip":"730"}
+data/CN/台湾/台南縣/東山鄉={"id":"data/CN/台湾/台南縣/東山鄉","key":"東山鄉","lang":"zh-hans","lname":"Dongshan Township","zip":"733"}
+data/CN/台湾/台南縣/柳營鄉={"id":"data/CN/台湾/台南縣/柳營鄉","key":"柳營鄉","lang":"zh-hans","lname":"Liouying Township","zip":"736"}
+data/CN/台湾/台南縣/楠西鄉={"id":"data/CN/台湾/台南縣/楠西鄉","key":"楠西鄉","lang":"zh-hans","lname":"Nansi Township","zip":"715"}
+data/CN/台湾/台南縣/歸仁鄉={"id":"data/CN/台湾/台南縣/歸仁鄉","key":"歸仁鄉","lang":"zh-hans","lname":"Gueiren Township","zip":"711"}
+data/CN/台湾/台南縣/永康市={"id":"data/CN/台湾/台南縣/永康市","key":"永康市","lang":"zh-hans","lname":"Yongkang City","zip":"710"}
+data/CN/台湾/台南縣/玉井鄉={"id":"data/CN/台湾/台南縣/玉井鄉","key":"玉井鄉","lang":"zh-hans","lname":"Yujing Township","zip":"714"}
+data/CN/台湾/台南縣/白河鎮={"id":"data/CN/台湾/台南縣/白河鎮","key":"白河鎮","lang":"zh-hans","lname":"Baihe Township","zip":"732"}
+data/CN/台湾/台南縣/西港鄉={"id":"data/CN/台湾/台南縣/西港鄉","key":"西港鄉","lang":"zh-hans","lname":"Sigang Township","zip":"723"}
+data/CN/台湾/台南縣/關廟鄉={"id":"data/CN/台湾/台南縣/關廟鄉","key":"關廟鄉","lang":"zh-hans","lname":"Guanmiao Township","zip":"718"}
+data/CN/台湾/台南縣/鹽水鎮={"id":"data/CN/台湾/台南縣/鹽水鎮","key":"鹽水鎮","lang":"zh-hans","lname":"Yanshuei Township","zip":"737"}
+data/CN/台湾/台南縣/麻豆鎮={"id":"data/CN/台湾/台南縣/麻豆鎮","key":"麻豆鎮","lang":"zh-hans","lname":"Madou Township","zip":"721"}
+data/CN/台湾/台南縣/龍崎鄉={"id":"data/CN/台湾/台南縣/龍崎鄉","key":"龍崎鄉","lang":"zh-hans","lname":"Longci Township","zip":"719"}
+data/CN/台湾/台東縣={"id":"data/CN/台湾/台東縣","key":"台東縣","lang":"zh-hans","lname":"Taitung County","zip":"9[56]","zipex":"950,966","sub_keys":"卑南鄉~長濱鄉~成功鎮~池上鄉~達仁鄉~大武鄉~東河鄉~關山鎮~海端鄉~金峰鄉~蘭嶼鄉~鹿野鄉~綠島鄉~台東市~太麻里鄉~延平鄉","sub_lnames":"Beinan Township~Changbin Township~Chenggong Township~Chihshang Township~Daren Township~Dawu Township~Donghe Township~Guanshan Township~Haiduan Township~Jinfong Township~Lanyu Township~Luye Township~Lyudao Township~Taitung City~Taimali Township~Yanping Township","sub_zips":"954~962~961~958~966~965~959~956~957~964~952~955~951~950~963~953"}
+data/CN/台湾/台東縣/卑南鄉={"id":"data/CN/台湾/台東縣/卑南鄉","key":"卑南鄉","lang":"zh-hans","lname":"Beinan Township","zip":"954"}
+data/CN/台湾/台東縣/台東市={"id":"data/CN/台湾/台東縣/台東市","key":"台東市","lang":"zh-hans","lname":"Taitung City","zip":"950"}
+data/CN/台湾/台東縣/大武鄉={"id":"data/CN/台湾/台東縣/大武鄉","key":"大武鄉","lang":"zh-hans","lname":"Dawu Township","zip":"965"}
+data/CN/台湾/台東縣/太麻里鄉={"id":"data/CN/台湾/台東縣/太麻里鄉","key":"太麻里鄉","lang":"zh-hans","lname":"Taimali Township","zip":"963"}
+data/CN/台湾/台東縣/延平鄉={"id":"data/CN/台湾/台東縣/延平鄉","key":"延平鄉","lang":"zh-hans","lname":"Yanping Township","zip":"953"}
+data/CN/台湾/台東縣/成功鎮={"id":"data/CN/台湾/台東縣/成功鎮","key":"成功鎮","lang":"zh-hans","lname":"Chenggong Township","zip":"961"}
+data/CN/台湾/台東縣/東河鄉={"id":"data/CN/台湾/台東縣/東河鄉","key":"東河鄉","lang":"zh-hans","lname":"Donghe Township","zip":"959"}
+data/CN/台湾/台東縣/池上鄉={"id":"data/CN/台湾/台東縣/池上鄉","key":"池上鄉","lang":"zh-hans","lname":"Chihshang Township","zip":"958"}
+data/CN/台湾/台東縣/海端鄉={"id":"data/CN/台湾/台東縣/海端鄉","key":"海端鄉","lang":"zh-hans","lname":"Haiduan Township","zip":"957"}
+data/CN/台湾/台東縣/綠島鄉={"id":"data/CN/台湾/台東縣/綠島鄉","key":"綠島鄉","lang":"zh-hans","lname":"Lyudao Township","zip":"951"}
+data/CN/台湾/台東縣/蘭嶼鄉={"id":"data/CN/台湾/台東縣/蘭嶼鄉","key":"蘭嶼鄉","lang":"zh-hans","lname":"Lanyu Township","zip":"952"}
+data/CN/台湾/台東縣/達仁鄉={"id":"data/CN/台湾/台東縣/達仁鄉","key":"達仁鄉","lang":"zh-hans","lname":"Daren Township","zip":"966"}
+data/CN/台湾/台東縣/金峰鄉={"id":"data/CN/台湾/台東縣/金峰鄉","key":"金峰鄉","lang":"zh-hans","lname":"Jinfong Township","zip":"964"}
+data/CN/台湾/台東縣/長濱鄉={"id":"data/CN/台湾/台東縣/長濱鄉","key":"長濱鄉","lang":"zh-hans","lname":"Changbin Township","zip":"962"}
+data/CN/台湾/台東縣/關山鎮={"id":"data/CN/台湾/台東縣/關山鎮","key":"關山鎮","lang":"zh-hans","lname":"Guanshan Township","zip":"956"}
+data/CN/台湾/台東縣/鹿野鄉={"id":"data/CN/台湾/台東縣/鹿野鄉","key":"鹿野鄉","lang":"zh-hans","lname":"Luye Township","zip":"955"}
+data/CN/台湾/嘉義市={"id":"data/CN/台湾/嘉義市","key":"嘉義市","lang":"zh-hans","lname":"Chiayi City","zip":"600"}
+data/CN/台湾/嘉義縣={"id":"data/CN/台湾/嘉義縣","key":"嘉義縣","lang":"zh-hans","lname":"Chiayi County","zip":"60[1-9]|6[12]","zipex":"602,625","sub_keys":"阿里山鄉~布袋鎮~大林鎮~大埔鄉~東石鄉~番路鄉~六腳鄉~鹿草鄉~梅山鄉~民雄鄉~朴子市~水上鄉~太保市~溪口鄉~新港鄉~義竹鄉~中埔鄉~竹崎鄉","sub_lnames":"Alishan Township~Budai Township~Dalin Township~Dapu Township~Dongshih Township~Fanlu Township~Lioujiao Township~Lucao Township~Meishan Township~Minsyong Township~Puzih City~Shueishang Township~Taibao City~Sikou Township~Singang Township~Yijhu Township~Jhongpu Township~Jhuci Township","sub_zips":"605~625~622~607~614~602~615~611~603~621~613~608~612~623~616~624~606~604"}
+data/CN/台湾/嘉義縣/中埔鄉={"id":"data/CN/台湾/嘉義縣/中埔鄉","key":"中埔鄉","lang":"zh-hans","lname":"Jhongpu Township","zip":"606"}
+data/CN/台湾/嘉義縣/六腳鄉={"id":"data/CN/台湾/嘉義縣/六腳鄉","key":"六腳鄉","lang":"zh-hans","lname":"Lioujiao Township","zip":"615"}
+data/CN/台湾/嘉義縣/大埔鄉={"id":"data/CN/台湾/嘉義縣/大埔鄉","key":"大埔鄉","lang":"zh-hans","lname":"Dapu Township","zip":"607"}
+data/CN/台湾/嘉義縣/大林鎮={"id":"data/CN/台湾/嘉義縣/大林鎮","key":"大林鎮","lang":"zh-hans","lname":"Dalin Township","zip":"622"}
+data/CN/台湾/嘉義縣/太保市={"id":"data/CN/台湾/嘉義縣/太保市","key":"太保市","lang":"zh-hans","lname":"Taibao City","zip":"612"}
+data/CN/台湾/嘉義縣/布袋鎮={"id":"data/CN/台湾/嘉義縣/布袋鎮","key":"布袋鎮","lang":"zh-hans","lname":"Budai Township","zip":"625"}
+data/CN/台湾/嘉義縣/新港鄉={"id":"data/CN/台湾/嘉義縣/新港鄉","key":"新港鄉","lang":"zh-hans","lname":"Singang Township","zip":"616"}
+data/CN/台湾/嘉義縣/朴子市={"id":"data/CN/台湾/嘉義縣/朴子市","key":"朴子市","lang":"zh-hans","lname":"Puzih City","zip":"613"}
+data/CN/台湾/嘉義縣/東石鄉={"id":"data/CN/台湾/嘉義縣/東石鄉","key":"東石鄉","lang":"zh-hans","lname":"Dongshih Township","zip":"614"}
+data/CN/台湾/嘉義縣/梅山鄉={"id":"data/CN/台湾/嘉義縣/梅山鄉","key":"梅山鄉","lang":"zh-hans","lname":"Meishan Township","zip":"603"}
+data/CN/台湾/嘉義縣/民雄鄉={"id":"data/CN/台湾/嘉義縣/民雄鄉","key":"民雄鄉","lang":"zh-hans","lname":"Minsyong Township","zip":"621"}
+data/CN/台湾/嘉義縣/水上鄉={"id":"data/CN/台湾/嘉義縣/水上鄉","key":"水上鄉","lang":"zh-hans","lname":"Shueishang Township","zip":"608"}
+data/CN/台湾/嘉義縣/溪口鄉={"id":"data/CN/台湾/嘉義縣/溪口鄉","key":"溪口鄉","lang":"zh-hans","lname":"Sikou Township","zip":"623"}
+data/CN/台湾/嘉義縣/番路鄉={"id":"data/CN/台湾/嘉義縣/番路鄉","key":"番路鄉","lang":"zh-hans","lname":"Fanlu Township","zip":"602"}
+data/CN/台湾/嘉義縣/竹崎鄉={"id":"data/CN/台湾/嘉義縣/竹崎鄉","key":"竹崎鄉","lang":"zh-hans","lname":"Jhuci Township","zip":"604"}
+data/CN/台湾/嘉義縣/義竹鄉={"id":"data/CN/台湾/嘉義縣/義竹鄉","key":"義竹鄉","lang":"zh-hans","lname":"Yijhu Township","zip":"624"}
+data/CN/台湾/嘉義縣/阿里山鄉={"id":"data/CN/台湾/嘉義縣/阿里山鄉","key":"阿里山鄉","lang":"zh-hans","lname":"Alishan Township","zip":"605"}
+data/CN/台湾/嘉義縣/鹿草鄉={"id":"data/CN/台湾/嘉義縣/鹿草鄉","key":"鹿草鄉","lang":"zh-hans","lname":"Lucao Township","zip":"611"}
+data/CN/台湾/基隆市={"id":"data/CN/台湾/基隆市","key":"基隆市","lang":"zh-hans","lname":"Keelung City","zip":"20[0-6]","zipex":"200,206","sub_keys":"安樂區~暖暖區~七堵區~仁愛區~信義區~中山區~中正區","sub_lnames":"Anle District~Nuannuan District~Cidu District~Ren-ai District~Sinyi District~Jhongshan District~Jhongjheng District","sub_zips":"204~205~206~200~201~203~202"}
+data/CN/台湾/基隆市/七堵區={"id":"data/CN/台湾/基隆市/七堵區","key":"七堵區","lang":"zh-hans","lname":"Cidu District","zip":"206"}
+data/CN/台湾/基隆市/中山區={"id":"data/CN/台湾/基隆市/中山區","key":"中山區","lang":"zh-hans","lname":"Jhongshan District","zip":"203"}
+data/CN/台湾/基隆市/中正區={"id":"data/CN/台湾/基隆市/中正區","key":"中正區","lang":"zh-hans","lname":"Jhongjheng District","zip":"202"}
+data/CN/台湾/基隆市/仁愛區={"id":"data/CN/台湾/基隆市/仁愛區","key":"仁愛區","lang":"zh-hans","lname":"Ren-ai District","zip":"200"}
+data/CN/台湾/基隆市/信義區={"id":"data/CN/台湾/基隆市/信義區","key":"信義區","lang":"zh-hans","lname":"Sinyi District","zip":"201"}
+data/CN/台湾/基隆市/安樂區={"id":"data/CN/台湾/基隆市/安樂區","key":"安樂區","lang":"zh-hans","lname":"Anle District","zip":"204"}
+data/CN/台湾/基隆市/暖暖區={"id":"data/CN/台湾/基隆市/暖暖區","key":"暖暖區","lang":"zh-hans","lname":"Nuannuan District","zip":"205"}
+data/CN/台湾/宜蘭縣={"id":"data/CN/台湾/宜蘭縣","key":"宜蘭縣","lang":"zh-hans","lname":"Yilan County","zip":"2[67]","zipex":"260,272","sub_keys":"大同鄉~冬山鄉~礁溪鄉~羅東鎮~南澳鄉~三星鄉~蘇澳鎮~頭城鎮~五結鄉~宜蘭市~員山鄉~壯圍鄉","sub_lnames":"Datong Township~Dongshan Township~Jiaosi Township~Luodong Township~Nan-ao Township~Sansing Township~Su-ao Township~Toucheng Township~Wujie Township~Yilan City~Yuanshan Township~Jhuangwei Township","sub_zips":"267~269~262~265~272~266~270~261~268~260~264~263"}
+data/CN/台湾/宜蘭縣/三星鄉={"id":"data/CN/台湾/宜蘭縣/三星鄉","key":"三星鄉","lang":"zh-hans","lname":"Sansing Township","zip":"266"}
+data/CN/台湾/宜蘭縣/五結鄉={"id":"data/CN/台湾/宜蘭縣/五結鄉","key":"五結鄉","lang":"zh-hans","lname":"Wujie Township","zip":"268"}
+data/CN/台湾/宜蘭縣/冬山鄉={"id":"data/CN/台湾/宜蘭縣/冬山鄉","key":"冬山鄉","lang":"zh-hans","lname":"Dongshan Township","zip":"269"}
+data/CN/台湾/宜蘭縣/南澳鄉={"id":"data/CN/台湾/宜蘭縣/南澳鄉","key":"南澳鄉","lang":"zh-hans","lname":"Nan-ao Township","zip":"272"}
+data/CN/台湾/宜蘭縣/員山鄉={"id":"data/CN/台湾/宜蘭縣/員山鄉","key":"員山鄉","lang":"zh-hans","lname":"Yuanshan Township","zip":"264"}
+data/CN/台湾/宜蘭縣/壯圍鄉={"id":"data/CN/台湾/宜蘭縣/壯圍鄉","key":"壯圍鄉","lang":"zh-hans","lname":"Jhuangwei Township","zip":"263"}
+data/CN/台湾/宜蘭縣/大同鄉={"id":"data/CN/台湾/宜蘭縣/大同鄉","key":"大同鄉","lang":"zh-hans","lname":"Datong Township","zip":"267"}
+data/CN/台湾/宜蘭縣/宜蘭市={"id":"data/CN/台湾/宜蘭縣/宜蘭市","key":"宜蘭市","lang":"zh-hans","lname":"Yilan City","zip":"260"}
+data/CN/台湾/宜蘭縣/礁溪鄉={"id":"data/CN/台湾/宜蘭縣/礁溪鄉","key":"礁溪鄉","lang":"zh-hans","lname":"Jiaosi Township","zip":"262"}
+data/CN/台湾/宜蘭縣/羅東鎮={"id":"data/CN/台湾/宜蘭縣/羅東鎮","key":"羅東鎮","lang":"zh-hans","lname":"Luodong Township","zip":"265"}
+data/CN/台湾/宜蘭縣/蘇澳鎮={"id":"data/CN/台湾/宜蘭縣/蘇澳鎮","key":"蘇澳鎮","lang":"zh-hans","lname":"Su-ao Township","zip":"270"}
+data/CN/台湾/宜蘭縣/頭城鎮={"id":"data/CN/台湾/宜蘭縣/頭城鎮","key":"頭城鎮","lang":"zh-hans","lname":"Toucheng Township","zip":"261"}
+data/CN/台湾/屏東縣={"id":"data/CN/台湾/屏東縣","key":"屏東縣","lang":"zh-hans","lname":"Pingtung County","zip":"9[0-4]","zipex":"900,947","sub_keys":"長治鄉~潮州鎮~車城鄉~春日鄉~東港鎮~枋寮鄉~枋山鄉~高樹鄉~恆春鎮~佳冬鄉~九如鄉~崁頂鄉~來義鄉~里港鄉~林邊鄉~麟洛鄉~琉球鄉~瑪家鄉~滿洲鄉~牡丹鄉~南州鄉~內埔鄉~屏東市~三地門鄉~獅子鄉~泰武鄉~萬丹鄉~萬巒鄉~霧台鄉~新埤鄉~新園鄉~鹽埔鄉~竹田鄉","sub_lnames":"Changjhih Township~Chaojhou Township~Checheng Township~Chunrih Township~Donggang Township~Fangliao Township~Fangshan Township~Gaoshu Township~Hengchun Township~Jiadong Township~Jiouru Township~Kanding Township~Laiyi Township~Ligang Township~Linbian Township~Linluo Township~Liouciou Township~Majia Township~Manjhou Township~Mudan Township~Nanjhou Township~Neipu Township~Pingtung City~Sandimen Township~Shihzih Township~Taiwu Township~Wandan Township~Wanluan Township~Wutai Township~Sinpi Township~Sinyuan Township~Yanpu Township~Jhutian Township","sub_zips":"908~920~944~942~928~940~941~906~946~931~904~924~922~905~927~909~929~903~947~945~926~912~900~901~943~921~913~923~902~925~932~907~911"}
+data/CN/台湾/屏東縣/三地門鄉={"id":"data/CN/台湾/屏東縣/三地門鄉","key":"三地門鄉","lang":"zh-hans","lname":"Sandimen Township","zip":"901"}
+data/CN/台湾/屏東縣/九如鄉={"id":"data/CN/台湾/屏東縣/九如鄉","key":"九如鄉","lang":"zh-hans","lname":"Jiouru Township","zip":"904"}
+data/CN/台湾/屏東縣/佳冬鄉={"id":"data/CN/台湾/屏東縣/佳冬鄉","key":"佳冬鄉","lang":"zh-hans","lname":"Jiadong Township","zip":"931"}
+data/CN/台湾/屏東縣/來義鄉={"id":"data/CN/台湾/屏東縣/來義鄉","key":"來義鄉","lang":"zh-hans","lname":"Laiyi Township","zip":"922"}
+data/CN/台湾/屏東縣/內埔鄉={"id":"data/CN/台湾/屏東縣/內埔鄉","key":"內埔鄉","lang":"zh-hans","lname":"Neipu Township","zip":"912"}
+data/CN/台湾/屏東縣/南州鄉={"id":"data/CN/台湾/屏東縣/南州鄉","key":"南州鄉","lang":"zh-hans","lname":"Nanjhou Township","zip":"926"}
+data/CN/台湾/屏東縣/屏東市={"id":"data/CN/台湾/屏東縣/屏東市","key":"屏東市","lang":"zh-hans","lname":"Pingtung City","zip":"900"}
+data/CN/台湾/屏東縣/崁頂鄉={"id":"data/CN/台湾/屏東縣/崁頂鄉","key":"崁頂鄉","lang":"zh-hans","lname":"Kanding Township","zip":"924"}
+data/CN/台湾/屏東縣/恆春鎮={"id":"data/CN/台湾/屏東縣/恆春鎮","key":"恆春鎮","lang":"zh-hans","lname":"Hengchun Township","zip":"946"}
+data/CN/台湾/屏東縣/新園鄉={"id":"data/CN/台湾/屏東縣/新園鄉","key":"新園鄉","lang":"zh-hans","lname":"Sinyuan Township","zip":"932"}
+data/CN/台湾/屏東縣/新埤鄉={"id":"data/CN/台湾/屏東縣/新埤鄉","key":"新埤鄉","lang":"zh-hans","lname":"Sinpi Township","zip":"925"}
+data/CN/台湾/屏東縣/春日鄉={"id":"data/CN/台湾/屏東縣/春日鄉","key":"春日鄉","lang":"zh-hans","lname":"Chunrih Township","zip":"942"}
+data/CN/台湾/屏東縣/東港鎮={"id":"data/CN/台湾/屏東縣/東港鎮","key":"東港鎮","lang":"zh-hans","lname":"Donggang Township","zip":"928"}
+data/CN/台湾/屏東縣/枋寮鄉={"id":"data/CN/台湾/屏東縣/枋寮鄉","key":"枋寮鄉","lang":"zh-hans","lname":"Fangliao Township","zip":"940"}
+data/CN/台湾/屏東縣/枋山鄉={"id":"data/CN/台湾/屏東縣/枋山鄉","key":"枋山鄉","lang":"zh-hans","lname":"Fangshan Township","zip":"941"}
+data/CN/台湾/屏東縣/林邊鄉={"id":"data/CN/台湾/屏東縣/林邊鄉","key":"林邊鄉","lang":"zh-hans","lname":"Linbian Township","zip":"927"}
+data/CN/台湾/屏東縣/泰武鄉={"id":"data/CN/台湾/屏東縣/泰武鄉","key":"泰武鄉","lang":"zh-hans","lname":"Taiwu Township","zip":"921"}
+data/CN/台湾/屏東縣/滿洲鄉={"id":"data/CN/台湾/屏東縣/滿洲鄉","key":"滿洲鄉","lang":"zh-hans","lname":"Manjhou Township","zip":"947"}
+data/CN/台湾/屏東縣/潮州鎮={"id":"data/CN/台湾/屏東縣/潮州鎮","key":"潮州鎮","lang":"zh-hans","lname":"Chaojhou Township","zip":"920"}
+data/CN/台湾/屏東縣/牡丹鄉={"id":"data/CN/台湾/屏東縣/牡丹鄉","key":"牡丹鄉","lang":"zh-hans","lname":"Mudan Township","zip":"945"}
+data/CN/台湾/屏東縣/獅子鄉={"id":"data/CN/台湾/屏東縣/獅子鄉","key":"獅子鄉","lang":"zh-hans","lname":"Shihzih Township","zip":"943"}
+data/CN/台湾/屏東縣/琉球鄉={"id":"data/CN/台湾/屏東縣/琉球鄉","key":"琉球鄉","lang":"zh-hans","lname":"Liouciou Township","zip":"929"}
+data/CN/台湾/屏東縣/瑪家鄉={"id":"data/CN/台湾/屏東縣/瑪家鄉","key":"瑪家鄉","lang":"zh-hans","lname":"Majia Township","zip":"903"}
+data/CN/台湾/屏東縣/竹田鄉={"id":"data/CN/台湾/屏東縣/竹田鄉","key":"竹田鄉","lang":"zh-hans","lname":"Jhutian Township","zip":"911"}
+data/CN/台湾/屏東縣/萬丹鄉={"id":"data/CN/台湾/屏東縣/萬丹鄉","key":"萬丹鄉","lang":"zh-hans","lname":"Wandan Township","zip":"913"}
+data/CN/台湾/屏東縣/萬巒鄉={"id":"data/CN/台湾/屏東縣/萬巒鄉","key":"萬巒鄉","lang":"zh-hans","lname":"Wanluan Township","zip":"923"}
+data/CN/台湾/屏東縣/車城鄉={"id":"data/CN/台湾/屏東縣/車城鄉","key":"車城鄉","lang":"zh-hans","lname":"Checheng Township","zip":"944"}
+data/CN/台湾/屏東縣/里港鄉={"id":"data/CN/台湾/屏東縣/里港鄉","key":"里港鄉","lang":"zh-hans","lname":"Ligang Township","zip":"905"}
+data/CN/台湾/屏東縣/長治鄉={"id":"data/CN/台湾/屏東縣/長治鄉","key":"長治鄉","lang":"zh-hans","lname":"Changjhih Township","zip":"908"}
+data/CN/台湾/屏東縣/霧台鄉={"id":"data/CN/台湾/屏東縣/霧台鄉","key":"霧台鄉","lang":"zh-hans","lname":"Wutai Township","zip":"902"}
+data/CN/台湾/屏東縣/高樹鄉={"id":"data/CN/台湾/屏東縣/高樹鄉","key":"高樹鄉","lang":"zh-hans","lname":"Gaoshu Township","zip":"906"}
+data/CN/台湾/屏東縣/鹽埔鄉={"id":"data/CN/台湾/屏東縣/鹽埔鄉","key":"鹽埔鄉","lang":"zh-hans","lname":"Yanpu Township","zip":"907"}
+data/CN/台湾/屏東縣/麟洛鄉={"id":"data/CN/台湾/屏東縣/麟洛鄉","key":"麟洛鄉","lang":"zh-hans","lname":"Linluo Township","zip":"909"}
+data/CN/台湾/彰化縣={"id":"data/CN/台湾/彰化縣","key":"彰化縣","lang":"zh-hans","lname":"Changhua County","zip":"5[0123]","zipex":"500,530","sub_keys":"北斗鎮~大城鄉~大村鄉~二林鎮~二水鄉~芳苑鄉~芬園鄉~福興鄉~和美鎮~花壇鄉~鹿港鎮~埤頭鄉~埔心鄉~埔鹽鄉~社頭鄉~伸港鄉~田尾鄉~田中鎮~溪湖鎮~溪州鄉~線西鄉~秀水鄉~永靖鄉~員林鎮~彰化市~竹塘鄉","sub_lnames":"Beidou Township~Dacheng Township~Dacun Township~Erlin Township~Ershuei Township~Fangyuan Township~Fenyuan Township~Fusing Township~Hemei Township~Huatan Township~Lugang Township~Pitou Township~Pusin Township~Puyan Township~Shetou Township~Shengang Township~Tianwei Township~Tianjhong Township~Sihu Township~Sijhou Township~Siansi Township~Sioushuei Township~Yongjing Township~Yuanlin Township~Changhua City~Jhutang Township","sub_zips":"521~527~515~526~530~528~502~506~508~503~505~523~513~516~511~509~522~520~514~524~507~504~512~510~500~525"}
+data/CN/台湾/彰化縣/二林鎮={"id":"data/CN/台湾/彰化縣/二林鎮","key":"二林鎮","lang":"zh-hans","lname":"Erlin Township","zip":"526"}
+data/CN/台湾/彰化縣/二水鄉={"id":"data/CN/台湾/彰化縣/二水鄉","key":"二水鄉","lang":"zh-hans","lname":"Ershuei Township","zip":"530"}
+data/CN/台湾/彰化縣/伸港鄉={"id":"data/CN/台湾/彰化縣/伸港鄉","key":"伸港鄉","lang":"zh-hans","lname":"Shengang Township","zip":"509"}
+data/CN/台湾/彰化縣/北斗鎮={"id":"data/CN/台湾/彰化縣/北斗鎮","key":"北斗鎮","lang":"zh-hans","lname":"Beidou Township","zip":"521"}
+data/CN/台湾/彰化縣/和美鎮={"id":"data/CN/台湾/彰化縣/和美鎮","key":"和美鎮","lang":"zh-hans","lname":"Hemei Township","zip":"508"}
+data/CN/台湾/彰化縣/員林鎮={"id":"data/CN/台湾/彰化縣/員林鎮","key":"員林鎮","lang":"zh-hans","lname":"Yuanlin Township","zip":"510"}
+data/CN/台湾/彰化縣/埔心鄉={"id":"data/CN/台湾/彰化縣/埔心鄉","key":"埔心鄉","lang":"zh-hans","lname":"Pusin Township","zip":"513"}
+data/CN/台湾/彰化縣/埔鹽鄉={"id":"data/CN/台湾/彰化縣/埔鹽鄉","key":"埔鹽鄉","lang":"zh-hans","lname":"Puyan Township","zip":"516"}
+data/CN/台湾/彰化縣/埤頭鄉={"id":"data/CN/台湾/彰化縣/埤頭鄉","key":"埤頭鄉","lang":"zh-hans","lname":"Pitou Township","zip":"523"}
+data/CN/台湾/彰化縣/大城鄉={"id":"data/CN/台湾/彰化縣/大城鄉","key":"大城鄉","lang":"zh-hans","lname":"Dacheng Township","zip":"527"}
+data/CN/台湾/彰化縣/大村鄉={"id":"data/CN/台湾/彰化縣/大村鄉","key":"大村鄉","lang":"zh-hans","lname":"Dacun Township","zip":"515"}
+data/CN/台湾/彰化縣/彰化市={"id":"data/CN/台湾/彰化縣/彰化市","key":"彰化市","lang":"zh-hans","lname":"Changhua City","zip":"500"}
+data/CN/台湾/彰化縣/永靖鄉={"id":"data/CN/台湾/彰化縣/永靖鄉","key":"永靖鄉","lang":"zh-hans","lname":"Yongjing Township","zip":"512"}
+data/CN/台湾/彰化縣/溪州鄉={"id":"data/CN/台湾/彰化縣/溪州鄉","key":"溪州鄉","lang":"zh-hans","lname":"Sijhou Township","zip":"524"}
+data/CN/台湾/彰化縣/溪湖鎮={"id":"data/CN/台湾/彰化縣/溪湖鎮","key":"溪湖鎮","lang":"zh-hans","lname":"Sihu Township","zip":"514"}
+data/CN/台湾/彰化縣/田中鎮={"id":"data/CN/台湾/彰化縣/田中鎮","key":"田中鎮","lang":"zh-hans","lname":"Tianjhong Township","zip":"520"}
+data/CN/台湾/彰化縣/田尾鄉={"id":"data/CN/台湾/彰化縣/田尾鄉","key":"田尾鄉","lang":"zh-hans","lname":"Tianwei Township","zip":"522"}
+data/CN/台湾/彰化縣/社頭鄉={"id":"data/CN/台湾/彰化縣/社頭鄉","key":"社頭鄉","lang":"zh-hans","lname":"Shetou Township","zip":"511"}
+data/CN/台湾/彰化縣/福興鄉={"id":"data/CN/台湾/彰化縣/福興鄉","key":"福興鄉","lang":"zh-hans","lname":"Fusing Township","zip":"506"}
+data/CN/台湾/彰化縣/秀水鄉={"id":"data/CN/台湾/彰化縣/秀水鄉","key":"秀水鄉","lang":"zh-hans","lname":"Sioushuei Township","zip":"504"}
+data/CN/台湾/彰化縣/竹塘鄉={"id":"data/CN/台湾/彰化縣/竹塘鄉","key":"竹塘鄉","lang":"zh-hans","lname":"Jhutang Township","zip":"525"}
+data/CN/台湾/彰化縣/線西鄉={"id":"data/CN/台湾/彰化縣/線西鄉","key":"線西鄉","lang":"zh-hans","lname":"Siansi Township","zip":"507"}
+data/CN/台湾/彰化縣/芬園鄉={"id":"data/CN/台湾/彰化縣/芬園鄉","key":"芬園鄉","lang":"zh-hans","lname":"Fenyuan Township","zip":"502"}
+data/CN/台湾/彰化縣/花壇鄉={"id":"data/CN/台湾/彰化縣/花壇鄉","key":"花壇鄉","lang":"zh-hans","lname":"Huatan Township","zip":"503"}
+data/CN/台湾/彰化縣/芳苑鄉={"id":"data/CN/台湾/彰化縣/芳苑鄉","key":"芳苑鄉","lang":"zh-hans","lname":"Fangyuan Township","zip":"528"}
+data/CN/台湾/彰化縣/鹿港鎮={"id":"data/CN/台湾/彰化縣/鹿港鎮","key":"鹿港鎮","lang":"zh-hans","lname":"Lugang Township","zip":"505"}
+data/CN/台湾/新竹市={"id":"data/CN/台湾/新竹市","key":"新竹市","lang":"zh-hans","lname":"Hsinchu City","zip":"300"}
+data/CN/台湾/新竹縣={"id":"data/CN/台湾/新竹縣","key":"新竹縣","lang":"zh-hans","lname":"Hsinchu County","zip":"30[2-9]|31","zipex":"302,315","sub_keys":"寶山鄉~北埔鄉~峨眉鄉~關西鎮~橫山鄉~湖口鄉~尖石鄉~五峰鄉~新豐鄉~新埔鎮~芎林鄉~竹北市~竹東鎮","sub_lnames":"Baoshan Township~Beipu Township~Emei Township~Guansi Township~Hengshan Township~Hukou Township~Jianshih Township~Wufong Township~Sinfong Township~Sinpu Township~Cyonglin Township~Jhubei City~Jhudong Township","sub_zips":"308~314~315~306~312~303~313~311~304~305~307~302~310"}
+data/CN/台湾/新竹縣/五峰鄉={"id":"data/CN/台湾/新竹縣/五峰鄉","key":"五峰鄉","lang":"zh-hans","lname":"Wufong Township","zip":"311"}
+data/CN/台湾/新竹縣/北埔鄉={"id":"data/CN/台湾/新竹縣/北埔鄉","key":"北埔鄉","lang":"zh-hans","lname":"Beipu Township","zip":"314"}
+data/CN/台湾/新竹縣/寶山鄉={"id":"data/CN/台湾/新竹縣/寶山鄉","key":"寶山鄉","lang":"zh-hans","lname":"Baoshan Township","zip":"308"}
+data/CN/台湾/新竹縣/尖石鄉={"id":"data/CN/台湾/新竹縣/尖石鄉","key":"尖石鄉","lang":"zh-hans","lname":"Jianshih Township","zip":"313"}
+data/CN/台湾/新竹縣/峨眉鄉={"id":"data/CN/台湾/新竹縣/峨眉鄉","key":"峨眉鄉","lang":"zh-hans","lname":"Emei Township","zip":"315"}
+data/CN/台湾/新竹縣/新埔鎮={"id":"data/CN/台湾/新竹縣/新埔鎮","key":"新埔鎮","lang":"zh-hans","lname":"Sinpu Township","zip":"305"}
+data/CN/台湾/新竹縣/新豐鄉={"id":"data/CN/台湾/新竹縣/新豐鄉","key":"新豐鄉","lang":"zh-hans","lname":"Sinfong Township","zip":"304"}
+data/CN/台湾/新竹縣/橫山鄉={"id":"data/CN/台湾/新竹縣/橫山鄉","key":"橫山鄉","lang":"zh-hans","lname":"Hengshan Township","zip":"312"}
+data/CN/台湾/新竹縣/湖口鄉={"id":"data/CN/台湾/新竹縣/湖口鄉","key":"湖口鄉","lang":"zh-hans","lname":"Hukou Township","zip":"303"}
+data/CN/台湾/新竹縣/竹北市={"id":"data/CN/台湾/新竹縣/竹北市","key":"竹北市","lang":"zh-hans","lname":"Jhubei City","zip":"302"}
+data/CN/台湾/新竹縣/竹東鎮={"id":"data/CN/台湾/新竹縣/竹東鎮","key":"竹東鎮","lang":"zh-hans","lname":"Jhudong Township","zip":"310"}
+data/CN/台湾/新竹縣/芎林鄉={"id":"data/CN/台湾/新竹縣/芎林鄉","key":"芎林鄉","lang":"zh-hans","lname":"Cyonglin Township","zip":"307"}
+data/CN/台湾/新竹縣/關西鎮={"id":"data/CN/台湾/新竹縣/關西鎮","key":"關西鎮","lang":"zh-hans","lname":"Guansi Township","zip":"306"}
+data/CN/台湾/桃園縣={"id":"data/CN/台湾/桃園縣","key":"桃園縣","lang":"zh-hans","lname":"Taoyuan County","zip":"3[23]","zipex":"320,338","sub_keys":"八德市~大溪鎮~大園鄉~復興鄉~觀音鄉~龜山鄉~龍潭鄉~蘆竹鄉~平鎮市~桃園市~新屋鄉~楊梅鎮~中壢市","sub_lnames":"Bade City~Dasi Township~Dayuan Township~Fusing Township~Guanyin Township~Gueishan Township~Longtan Township~Lujhu Township~Pingjhen City~Taoyuan City~Sinwu Township~Yangmei Township~Jhongli City","sub_zips":"334~335~337~336~328~333~325~338~324~330~327~326~320"}
+data/CN/台湾/桃園縣/中壢市={"id":"data/CN/台湾/桃園縣/中壢市","key":"中壢市","lang":"zh-hans","lname":"Jhongli City","zip":"320"}
+data/CN/台湾/桃園縣/八德市={"id":"data/CN/台湾/桃園縣/八德市","key":"八德市","lang":"zh-hans","lname":"Bade City","zip":"334"}
+data/CN/台湾/桃園縣/大園鄉={"id":"data/CN/台湾/桃園縣/大園鄉","key":"大園鄉","lang":"zh-hans","lname":"Dayuan Township","zip":"337"}
+data/CN/台湾/桃園縣/大溪鎮={"id":"data/CN/台湾/桃園縣/大溪鎮","key":"大溪鎮","lang":"zh-hans","lname":"Dasi Township","zip":"335"}
+data/CN/台湾/桃園縣/平鎮市={"id":"data/CN/台湾/桃園縣/平鎮市","key":"平鎮市","lang":"zh-hans","lname":"Pingjhen City","zip":"324"}
+data/CN/台湾/桃園縣/復興鄉={"id":"data/CN/台湾/桃園縣/復興鄉","key":"復興鄉","lang":"zh-hans","lname":"Fusing Township","zip":"336"}
+data/CN/台湾/桃園縣/新屋鄉={"id":"data/CN/台湾/桃園縣/新屋鄉","key":"新屋鄉","lang":"zh-hans","lname":"Sinwu Township","zip":"327"}
+data/CN/台湾/桃園縣/桃園市={"id":"data/CN/台湾/桃園縣/桃園市","key":"桃園市","lang":"zh-hans","lname":"Taoyuan City","zip":"330"}
+data/CN/台湾/桃園縣/楊梅鎮={"id":"data/CN/台湾/桃園縣/楊梅鎮","key":"楊梅鎮","lang":"zh-hans","lname":"Yangmei Township","zip":"326"}
+data/CN/台湾/桃園縣/蘆竹鄉={"id":"data/CN/台湾/桃園縣/蘆竹鄉","key":"蘆竹鄉","lang":"zh-hans","lname":"Lujhu Township","zip":"338"}
+data/CN/台湾/桃園縣/觀音鄉={"id":"data/CN/台湾/桃園縣/觀音鄉","key":"觀音鄉","lang":"zh-hans","lname":"Guanyin Township","zip":"328"}
+data/CN/台湾/桃園縣/龍潭鄉={"id":"data/CN/台湾/桃園縣/龍潭鄉","key":"龍潭鄉","lang":"zh-hans","lname":"Longtan Township","zip":"325"}
+data/CN/台湾/桃園縣/龜山鄉={"id":"data/CN/台湾/桃園縣/龜山鄉","key":"龜山鄉","lang":"zh-hans","lname":"Gueishan Township","zip":"333"}
+data/CN/台湾/澎湖縣={"id":"data/CN/台湾/澎湖縣","key":"澎湖縣","lang":"zh-hans","lname":"Penghu County","zip":"88","zipex":"880,885","sub_keys":"白沙鄉~湖西鄉~馬公市~七美鄉~望安鄉~西嶼鄉","sub_lnames":"Baisha Township~Husi Township~Magong City~Cimei Township~Wang-an Township~Siyu Township","sub_zips":"884~885~880~883~882~881"}
+data/CN/台湾/澎湖縣/七美鄉={"id":"data/CN/台湾/澎湖縣/七美鄉","key":"七美鄉","lang":"zh-hans","lname":"Cimei Township","zip":"883"}
+data/CN/台湾/澎湖縣/望安鄉={"id":"data/CN/台湾/澎湖縣/望安鄉","key":"望安鄉","lang":"zh-hans","lname":"Wang-an Township","zip":"882"}
+data/CN/台湾/澎湖縣/湖西鄉={"id":"data/CN/台湾/澎湖縣/湖西鄉","key":"湖西鄉","lang":"zh-hans","lname":"Husi Township","zip":"885"}
+data/CN/台湾/澎湖縣/白沙鄉={"id":"data/CN/台湾/澎湖縣/白沙鄉","key":"白沙鄉","lang":"zh-hans","lname":"Baisha Township","zip":"884"}
+data/CN/台湾/澎湖縣/西嶼鄉={"id":"data/CN/台湾/澎湖縣/西嶼鄉","key":"西嶼鄉","lang":"zh-hans","lname":"Siyu Township","zip":"881"}
+data/CN/台湾/澎湖縣/馬公市={"id":"data/CN/台湾/澎湖縣/馬公市","key":"馬公市","lang":"zh-hans","lname":"Magong City","zip":"880"}
+data/CN/台湾/花蓮縣={"id":"data/CN/台湾/花蓮縣","key":"花蓮縣","lang":"zh-hans","lname":"Hualien County","zip":"9[78]","zipex":"970,983","sub_keys":"豐濱鄉~鳳林鎮~富里鄉~光復鄉~花蓮市~吉安鄉~瑞穗鄉~壽豐鄉~萬榮鄉~新城鄉~秀林鄉~玉里鎮~卓溪鄉","sub_lnames":"Fongbin Township~Fonglin Township~Fuli Township~Guangfu Township~Hualien City~Ji-an Township~Rueisuei Township~Shoufong Township~Wanrong Township~Sincheng Township~Sioulin Township~Yuli Township~Jhuosi Township","sub_zips":"977~975~983~976~970~973~978~974~979~971~972~981~982"}
+data/CN/台湾/花蓮縣/光復鄉={"id":"data/CN/台湾/花蓮縣/光復鄉","key":"光復鄉","lang":"zh-hans","lname":"Guangfu Township","zip":"976"}
+data/CN/台湾/花蓮縣/卓溪鄉={"id":"data/CN/台湾/花蓮縣/卓溪鄉","key":"卓溪鄉","lang":"zh-hans","lname":"Jhuosi Township","zip":"982"}
+data/CN/台湾/花蓮縣/吉安鄉={"id":"data/CN/台湾/花蓮縣/吉安鄉","key":"吉安鄉","lang":"zh-hans","lname":"Ji-an Township","zip":"973"}
+data/CN/台湾/花蓮縣/壽豐鄉={"id":"data/CN/台湾/花蓮縣/壽豐鄉","key":"壽豐鄉","lang":"zh-hans","lname":"Shoufong Township","zip":"974"}
+data/CN/台湾/花蓮縣/富里鄉={"id":"data/CN/台湾/花蓮縣/富里鄉","key":"富里鄉","lang":"zh-hans","lname":"Fuli Township","zip":"983"}
+data/CN/台湾/花蓮縣/新城鄉={"id":"data/CN/台湾/花蓮縣/新城鄉","key":"新城鄉","lang":"zh-hans","lname":"Sincheng Township","zip":"971"}
+data/CN/台湾/花蓮縣/玉里鎮={"id":"data/CN/台湾/花蓮縣/玉里鎮","key":"玉里鎮","lang":"zh-hans","lname":"Yuli Township","zip":"981"}
+data/CN/台湾/花蓮縣/瑞穗鄉={"id":"data/CN/台湾/花蓮縣/瑞穗鄉","key":"瑞穗鄉","lang":"zh-hans","lname":"Rueisuei Township","zip":"978"}
+data/CN/台湾/花蓮縣/秀林鄉={"id":"data/CN/台湾/花蓮縣/秀林鄉","key":"秀林鄉","lang":"zh-hans","lname":"Sioulin Township","zip":"972"}
+data/CN/台湾/花蓮縣/花蓮市={"id":"data/CN/台湾/花蓮縣/花蓮市","key":"花蓮市","lang":"zh-hans","lname":"Hualien City","zip":"970"}
+data/CN/台湾/花蓮縣/萬榮鄉={"id":"data/CN/台湾/花蓮縣/萬榮鄉","key":"萬榮鄉","lang":"zh-hans","lname":"Wanrong Township","zip":"979"}
+data/CN/台湾/花蓮縣/豐濱鄉={"id":"data/CN/台湾/花蓮縣/豐濱鄉","key":"豐濱鄉","lang":"zh-hans","lname":"Fongbin Township","zip":"977"}
+data/CN/台湾/花蓮縣/鳳林鎮={"id":"data/CN/台湾/花蓮縣/鳳林鎮","key":"鳳林鎮","lang":"zh-hans","lname":"Fonglin Township","zip":"975"}
+data/CN/台湾/苗栗縣={"id":"data/CN/台湾/苗栗縣","key":"苗栗縣","lang":"zh-hans","lname":"Miaoli County","zip":"3[56]","zipex":"350,369","sub_keys":"大湖鄉~公館鄉~後龍鎮~苗栗市~南庄鄉~三灣鄉~三義鄉~獅潭鄉~泰安鄉~通霄鎮~銅鑼鄉~頭份鎮~頭屋鄉~西湖鄉~苑裡鎮~造橋鄉~竹南鎮~卓蘭鎮","sub_lnames":"Dahu Township~Gongguan Township~Houlong Township~Miaoli City~Nanjhuang Township~Sanwan Township~Sanyi Township~Shihtan Township~Tai-an Township~Tongsiao Township~Tongluo Township~Toufen Township~Touwu Township~Sihu Township~Yuanli Township~Zaociao Township~Jhunan Township~Jhuolan Township","sub_zips":"364~363~356~360~353~352~367~354~365~357~366~351~362~368~358~361~350~369"}
+data/CN/台湾/苗栗縣/三灣鄉={"id":"data/CN/台湾/苗栗縣/三灣鄉","key":"三灣鄉","lang":"zh-hans","lname":"Sanwan Township","zip":"352"}
+data/CN/台湾/苗栗縣/三義鄉={"id":"data/CN/台湾/苗栗縣/三義鄉","key":"三義鄉","lang":"zh-hans","lname":"Sanyi Township","zip":"367"}
+data/CN/台湾/苗栗縣/公館鄉={"id":"data/CN/台湾/苗栗縣/公館鄉","key":"公館鄉","lang":"zh-hans","lname":"Gongguan Township","zip":"363"}
+data/CN/台湾/苗栗縣/卓蘭鎮={"id":"data/CN/台湾/苗栗縣/卓蘭鎮","key":"卓蘭鎮","lang":"zh-hans","lname":"Jhuolan Township","zip":"369"}
+data/CN/台湾/苗栗縣/南庄鄉={"id":"data/CN/台湾/苗栗縣/南庄鄉","key":"南庄鄉","lang":"zh-hans","lname":"Nanjhuang Township","zip":"353"}
+data/CN/台湾/苗栗縣/大湖鄉={"id":"data/CN/台湾/苗栗縣/大湖鄉","key":"大湖鄉","lang":"zh-hans","lname":"Dahu Township","zip":"364"}
+data/CN/台湾/苗栗縣/後龍鎮={"id":"data/CN/台湾/苗栗縣/後龍鎮","key":"後龍鎮","lang":"zh-hans","lname":"Houlong Township","zip":"356"}
+data/CN/台湾/苗栗縣/泰安鄉={"id":"data/CN/台湾/苗栗縣/泰安鄉","key":"泰安鄉","lang":"zh-hans","lname":"Tai-an Township","zip":"365"}
+data/CN/台湾/苗栗縣/獅潭鄉={"id":"data/CN/台湾/苗栗縣/獅潭鄉","key":"獅潭鄉","lang":"zh-hans","lname":"Shihtan Township","zip":"354"}
+data/CN/台湾/苗栗縣/竹南鎮={"id":"data/CN/台湾/苗栗縣/竹南鎮","key":"竹南鎮","lang":"zh-hans","lname":"Jhunan Township","zip":"350"}
+data/CN/台湾/苗栗縣/苑裡鎮={"id":"data/CN/台湾/苗栗縣/苑裡鎮","key":"苑裡鎮","lang":"zh-hans","lname":"Yuanli Township","zip":"358"}
+data/CN/台湾/苗栗縣/苗栗市={"id":"data/CN/台湾/苗栗縣/苗栗市","key":"苗栗市","lang":"zh-hans","lname":"Miaoli City","zip":"360"}
+data/CN/台湾/苗栗縣/西湖鄉={"id":"data/CN/台湾/苗栗縣/西湖鄉","key":"西湖鄉","lang":"zh-hans","lname":"Sihu Township","zip":"368"}
+data/CN/台湾/苗栗縣/通霄鎮={"id":"data/CN/台湾/苗栗縣/通霄鎮","key":"通霄鎮","lang":"zh-hans","lname":"Tongsiao Township","zip":"357"}
+data/CN/台湾/苗栗縣/造橋鄉={"id":"data/CN/台湾/苗栗縣/造橋鄉","key":"造橋鄉","lang":"zh-hans","lname":"Zaociao Township","zip":"361"}
+data/CN/台湾/苗栗縣/銅鑼鄉={"id":"data/CN/台湾/苗栗縣/銅鑼鄉","key":"銅鑼鄉","lang":"zh-hans","lname":"Tongluo Township","zip":"366"}
+data/CN/台湾/苗栗縣/頭份鎮={"id":"data/CN/台湾/苗栗縣/頭份鎮","key":"頭份鎮","lang":"zh-hans","lname":"Toufen Township","zip":"351"}
+data/CN/台湾/苗栗縣/頭屋鄉={"id":"data/CN/台湾/苗栗縣/頭屋鄉","key":"頭屋鄉","lang":"zh-hans","lname":"Touwu Township","zip":"362"}
+data/CN/台湾/連江縣={"id":"data/CN/台湾/連江縣","key":"連江縣","lang":"zh-hans","lname":"Lienchiang County","zip":"209|21[012]","zipex":"209,212","sub_keys":"北竿鄉~東引鄉~莒光鄉~南竿鄉","sub_lnames":"Beigan Township~Dongyin Township~Jyuguang Township~Nangan Township","sub_zips":"210~212~211~209"}
+data/CN/台湾/連江縣/北竿鄉={"id":"data/CN/台湾/連江縣/北竿鄉","key":"北竿鄉","lang":"zh-hans","lname":"Beigan Township","zip":"210"}
+data/CN/台湾/連江縣/南竿鄉={"id":"data/CN/台湾/連江縣/南竿鄉","key":"南竿鄉","lang":"zh-hans","lname":"Nangan Township","zip":"209"}
+data/CN/台湾/連江縣/東引鄉={"id":"data/CN/台湾/連江縣/東引鄉","key":"東引鄉","lang":"zh-hans","lname":"Dongyin Township","zip":"212"}
+data/CN/台湾/連江縣/莒光鄉={"id":"data/CN/台湾/連江縣/莒光鄉","key":"莒光鄉","lang":"zh-hans","lname":"Jyuguang Township","zip":"211"}
+data/CN/台湾/金門縣={"id":"data/CN/台湾/金門縣","key":"金門縣","lang":"zh-hans","lname":"Kinmen County","zip":"89","zipex":"890,896","sub_keys":"金城鎮~金湖鎮~金寧鄉~金沙鎮~烈嶼鄉~烏坵鄉","sub_lnames":"Jincheng Township~Jinhu Township~Jinning Township~Jinsha Township~Lieyu Township~Wuciou Township","sub_zips":"893~891~892~890~894~896"}
+data/CN/台湾/金門縣/烈嶼鄉={"id":"data/CN/台湾/金門縣/烈嶼鄉","key":"烈嶼鄉","lang":"zh-hans","lname":"Lieyu Township","zip":"894"}
+data/CN/台湾/金門縣/烏坵鄉={"id":"data/CN/台湾/金門縣/烏坵鄉","key":"烏坵鄉","lang":"zh-hans","lname":"Wuciou Township","zip":"896"}
+data/CN/台湾/金門縣/金城鎮={"id":"data/CN/台湾/金門縣/金城鎮","key":"金城鎮","lang":"zh-hans","lname":"Jincheng Township","zip":"893"}
+data/CN/台湾/金門縣/金寧鄉={"id":"data/CN/台湾/金門縣/金寧鄉","key":"金寧鄉","lang":"zh-hans","lname":"Jinning Township","zip":"892"}
+data/CN/台湾/金門縣/金沙鎮={"id":"data/CN/台湾/金門縣/金沙鎮","key":"金沙鎮","lang":"zh-hans","lname":"Jinsha Township","zip":"890"}
+data/CN/台湾/金門縣/金湖鎮={"id":"data/CN/台湾/金門縣/金湖鎮","key":"金湖鎮","lang":"zh-hans","lname":"Jinhu Township","zip":"891"}
+data/CN/台湾/雲林縣={"id":"data/CN/台湾/雲林縣","key":"雲林縣","lang":"zh-hans","lname":"Yunlin County","zip":"6[3-5]","zipex":"630,655","sub_keys":"褒忠鄉~北港鎮~莿桐鄉~大埤鄉~東勢鄉~斗六市~斗南鎮~二崙鄉~古坑鄉~虎尾鎮~口湖鄉~林內鄉~崙背鄉~麥寮鄉~水林鄉~四湖鄉~台西鄉~土庫鎮~西螺鎮~元長鄉","sub_lnames":"Baojhong Township~Beigang Township~Cihtong Township~Dapi Township~Dongshih Township~Douliou City~Dounan Township~Erlun Township~Gukeng Township~Huwei Township~Kouhu Township~Linnei Township~Lunbei Township~Mailiao Township~Shueilin Township~Sihhu Township~Taisi Township~Tuku Township~Siluo Township~Yuanchang Township","sub_zips":"634~651~647~631~635~640~630~649~646~632~653~643~637~638~652~654~636~633~648~655"}
+data/CN/台湾/雲林縣/二崙鄉={"id":"data/CN/台湾/雲林縣/二崙鄉","key":"二崙鄉","lang":"zh-hans","lname":"Erlun Township","zip":"649"}
+data/CN/台湾/雲林縣/元長鄉={"id":"data/CN/台湾/雲林縣/元長鄉","key":"元長鄉","lang":"zh-hans","lname":"Yuanchang Township","zip":"655"}
+data/CN/台湾/雲林縣/北港鎮={"id":"data/CN/台湾/雲林縣/北港鎮","key":"北港鎮","lang":"zh-hans","lname":"Beigang Township","zip":"651"}
+data/CN/台湾/雲林縣/口湖鄉={"id":"data/CN/台湾/雲林縣/口湖鄉","key":"口湖鄉","lang":"zh-hans","lname":"Kouhu Township","zip":"653"}
+data/CN/台湾/雲林縣/古坑鄉={"id":"data/CN/台湾/雲林縣/古坑鄉","key":"古坑鄉","lang":"zh-hans","lname":"Gukeng Township","zip":"646"}
+data/CN/台湾/雲林縣/台西鄉={"id":"data/CN/台湾/雲林縣/台西鄉","key":"台西鄉","lang":"zh-hans","lname":"Taisi Township","zip":"636"}
+data/CN/台湾/雲林縣/四湖鄉={"id":"data/CN/台湾/雲林縣/四湖鄉","key":"四湖鄉","lang":"zh-hans","lname":"Sihhu Township","zip":"654"}
+data/CN/台湾/雲林縣/土庫鎮={"id":"data/CN/台湾/雲林縣/土庫鎮","key":"土庫鎮","lang":"zh-hans","lname":"Tuku Township","zip":"633"}
+data/CN/台湾/雲林縣/大埤鄉={"id":"data/CN/台湾/雲林縣/大埤鄉","key":"大埤鄉","lang":"zh-hans","lname":"Dapi Township","zip":"631"}
+data/CN/台湾/雲林縣/崙背鄉={"id":"data/CN/台湾/雲林縣/崙背鄉","key":"崙背鄉","lang":"zh-hans","lname":"Lunbei Township","zip":"637"}
+data/CN/台湾/雲林縣/斗六市={"id":"data/CN/台湾/雲林縣/斗六市","key":"斗六市","lang":"zh-hans","lname":"Douliou City","zip":"640"}
+data/CN/台湾/雲林縣/斗南鎮={"id":"data/CN/台湾/雲林縣/斗南鎮","key":"斗南鎮","lang":"zh-hans","lname":"Dounan Township","zip":"630"}
+data/CN/台湾/雲林縣/東勢鄉={"id":"data/CN/台湾/雲林縣/東勢鄉","key":"東勢鄉","lang":"zh-hans","lname":"Dongshih Township","zip":"635"}
+data/CN/台湾/雲林縣/林內鄉={"id":"data/CN/台湾/雲林縣/林內鄉","key":"林內鄉","lang":"zh-hans","lname":"Linnei Township","zip":"643"}
+data/CN/台湾/雲林縣/水林鄉={"id":"data/CN/台湾/雲林縣/水林鄉","key":"水林鄉","lang":"zh-hans","lname":"Shueilin Township","zip":"652"}
+data/CN/台湾/雲林縣/莿桐鄉={"id":"data/CN/台湾/雲林縣/莿桐鄉","key":"莿桐鄉","lang":"zh-hans","lname":"Cihtong Township","zip":"647"}
+data/CN/台湾/雲林縣/虎尾鎮={"id":"data/CN/台湾/雲林縣/虎尾鎮","key":"虎尾鎮","lang":"zh-hans","lname":"Huwei Township","zip":"632"}
+data/CN/台湾/雲林縣/褒忠鄉={"id":"data/CN/台湾/雲林縣/褒忠鄉","key":"褒忠鄉","lang":"zh-hans","lname":"Baojhong Township","zip":"634"}
+data/CN/台湾/雲林縣/西螺鎮={"id":"data/CN/台湾/雲林縣/西螺鎮","key":"西螺鎮","lang":"zh-hans","lname":"Siluo Township","zip":"648"}
+data/CN/台湾/雲林縣/麥寮鄉={"id":"data/CN/台湾/雲林縣/麥寮鄉","key":"麥寮鄉","lang":"zh-hans","lname":"Mailiao Township","zip":"638"}
+data/CN/台湾/高雄市={"id":"data/CN/台湾/高雄市","key":"高雄市","lang":"zh-hans","lname":"Kaohsiung City","zip":"80|81[1-379]","zipex":"800,813:817,819","sub_keys":"東沙島~鼓山區~苓雅區~南沙島~楠梓區~旗津區~前金區~前鎮區~三民區~小港區~新興區~鹽埕區~左營區","sub_lnames":"Dongsha Island~Gushan District~Lingya District~Nansha Island~Nanzih District~Cijin District~Cianjin District~Cianjhen District~Sanmin District~Siaogang District~Sinsing District~Yancheng District~Zuoying District","sub_zips":"817~804~802~819~811~805~801~806~807~812~800~803~813"}
+data/CN/台湾/高雄市/三民區={"id":"data/CN/台湾/高雄市/三民區","key":"三民區","lang":"zh-hans","lname":"Sanmin District","zip":"807"}
+data/CN/台湾/高雄市/前金區={"id":"data/CN/台湾/高雄市/前金區","key":"前金區","lang":"zh-hans","lname":"Cianjin District","zip":"801"}
+data/CN/台湾/高雄市/前鎮區={"id":"data/CN/台湾/高雄市/前鎮區","key":"前鎮區","lang":"zh-hans","lname":"Cianjhen District","zip":"806"}
+data/CN/台湾/高雄市/南沙島={"id":"data/CN/台湾/高雄市/南沙島","key":"南沙島","lang":"zh-hans","lname":"Nansha Island","zip":"819"}
+data/CN/台湾/高雄市/小港區={"id":"data/CN/台湾/高雄市/小港區","key":"小港區","lang":"zh-hans","lname":"Siaogang District","zip":"812"}
+data/CN/台湾/高雄市/左營區={"id":"data/CN/台湾/高雄市/左營區","key":"左營區","lang":"zh-hans","lname":"Zuoying District","zip":"813"}
+data/CN/台湾/高雄市/新興區={"id":"data/CN/台湾/高雄市/新興區","key":"新興區","lang":"zh-hans","lname":"Sinsing District","zip":"800"}
+data/CN/台湾/高雄市/旗津區={"id":"data/CN/台湾/高雄市/旗津區","key":"旗津區","lang":"zh-hans","lname":"Cijin District","zip":"805"}
+data/CN/台湾/高雄市/東沙島={"id":"data/CN/台湾/高雄市/東沙島","key":"東沙島","lang":"zh-hans","lname":"Dongsha Island","zip":"817"}
+data/CN/台湾/高雄市/楠梓區={"id":"data/CN/台湾/高雄市/楠梓區","key":"楠梓區","lang":"zh-hans","lname":"Nanzih District","zip":"811"}
+data/CN/台湾/高雄市/苓雅區={"id":"data/CN/台湾/高雄市/苓雅區","key":"苓雅區","lang":"zh-hans","lname":"Lingya District","zip":"802"}
+data/CN/台湾/高雄市/鹽埕區={"id":"data/CN/台湾/高雄市/鹽埕區","key":"鹽埕區","lang":"zh-hans","lname":"Yancheng District","zip":"803"}
+data/CN/台湾/高雄市/鼓山區={"id":"data/CN/台湾/高雄市/鼓山區","key":"鼓山區","lang":"zh-hans","lname":"Gushan District","zip":"804"}
+data/CN/台湾/高雄縣={"id":"data/CN/台湾/高雄縣","key":"高雄縣","lang":"zh-hans","lname":"Kaohsiung County","zip":"8[2-5]|81[45]","zipex":"814,815:820,852","sub_keys":"阿蓮鄉~大寮鄉~大社鄉~大樹鄉~鳳山市~岡山鎮~湖內鄉~甲仙鄉~林園鄉~六龜鄉~路竹鄉~茂林鄉~美濃鎮~彌陀鄉~內門鄉~鳥松鄉~旗山鎮~橋頭鄉~茄萣鄉~仁武鄉~三民鄉~杉林鄉~桃源鄉~田寮鄉~燕巢鄉~永安鄉~梓官鄉","sub_lnames":"Alian Township~Daliao Township~Dashe Township~Dashu Township~Fongshan City~Gangshan Township~Hunei Township~Jiasian Township~Linyuan Township~Liouguei Township~Lujhu Township~Maolin Township~Meinong Township~Mituo Township~Neimen Township~Niaosong Township~Cishan Township~Ciaotou Township~Jiading Township~Renwu Township~Sanmin Township~Shanlin Township~Taoyuan Township~Tianliao Township~Yanchao Township~Yong-an Township~Zihguan Township","sub_zips":"822~831~815~840~830~820~829~847~832~844~821~851~843~827~845~833~842~825~852~814~849~846~848~823~824~828~826"}
+data/CN/台湾/高雄縣/三民鄉={"id":"data/CN/台湾/高雄縣/三民鄉","key":"三民鄉","lang":"zh-hans","lname":"Sanmin Township","zip":"849"}
+data/CN/台湾/高雄縣/仁武鄉={"id":"data/CN/台湾/高雄縣/仁武鄉","key":"仁武鄉","lang":"zh-hans","lname":"Renwu Township","zip":"814"}
+data/CN/台湾/高雄縣/內門鄉={"id":"data/CN/台湾/高雄縣/內門鄉","key":"內門鄉","lang":"zh-hans","lname":"Neimen Township","zip":"845"}
+data/CN/台湾/高雄縣/六龜鄉={"id":"data/CN/台湾/高雄縣/六龜鄉","key":"六龜鄉","lang":"zh-hans","lname":"Liouguei Township","zip":"844"}
+data/CN/台湾/高雄縣/大寮鄉={"id":"data/CN/台湾/高雄縣/大寮鄉","key":"大寮鄉","lang":"zh-hans","lname":"Daliao Township","zip":"831"}
+data/CN/台湾/高雄縣/大樹鄉={"id":"data/CN/台湾/高雄縣/大樹鄉","key":"大樹鄉","lang":"zh-hans","lname":"Dashu Township","zip":"840"}
+data/CN/台湾/高雄縣/大社鄉={"id":"data/CN/台湾/高雄縣/大社鄉","key":"大社鄉","lang":"zh-hans","lname":"Dashe Township","zip":"815"}
+data/CN/台湾/高雄縣/岡山鎮={"id":"data/CN/台湾/高雄縣/岡山鎮","key":"岡山鎮","lang":"zh-hans","lname":"Gangshan Township","zip":"820"}
+data/CN/台湾/高雄縣/彌陀鄉={"id":"data/CN/台湾/高雄縣/彌陀鄉","key":"彌陀鄉","lang":"zh-hans","lname":"Mituo Township","zip":"827"}
+data/CN/台湾/高雄縣/旗山鎮={"id":"data/CN/台湾/高雄縣/旗山鎮","key":"旗山鎮","lang":"zh-hans","lname":"Cishan Township","zip":"842"}
+data/CN/台湾/高雄縣/杉林鄉={"id":"data/CN/台湾/高雄縣/杉林鄉","key":"杉林鄉","lang":"zh-hans","lname":"Shanlin Township","zip":"846"}
+data/CN/台湾/高雄縣/林園鄉={"id":"data/CN/台湾/高雄縣/林園鄉","key":"林園鄉","lang":"zh-hans","lname":"Linyuan Township","zip":"832"}
+data/CN/台湾/高雄縣/桃源鄉={"id":"data/CN/台湾/高雄縣/桃源鄉","key":"桃源鄉","lang":"zh-hans","lname":"Taoyuan Township","zip":"848"}
+data/CN/台湾/高雄縣/梓官鄉={"id":"data/CN/台湾/高雄縣/梓官鄉","key":"梓官鄉","lang":"zh-hans","lname":"Zihguan Township","zip":"826"}
+data/CN/台湾/高雄縣/橋頭鄉={"id":"data/CN/台湾/高雄縣/橋頭鄉","key":"橋頭鄉","lang":"zh-hans","lname":"Ciaotou Township","zip":"825"}
+data/CN/台湾/高雄縣/永安鄉={"id":"data/CN/台湾/高雄縣/永安鄉","key":"永安鄉","lang":"zh-hans","lname":"Yong-an Township","zip":"828"}
+data/CN/台湾/高雄縣/湖內鄉={"id":"data/CN/台湾/高雄縣/湖內鄉","key":"湖內鄉","lang":"zh-hans","lname":"Hunei Township","zip":"829"}
+data/CN/台湾/高雄縣/燕巢鄉={"id":"data/CN/台湾/高雄縣/燕巢鄉","key":"燕巢鄉","lang":"zh-hans","lname":"Yanchao Township","zip":"824"}
+data/CN/台湾/高雄縣/田寮鄉={"id":"data/CN/台湾/高雄縣/田寮鄉","key":"田寮鄉","lang":"zh-hans","lname":"Tianliao Township","zip":"823"}
+data/CN/台湾/高雄縣/甲仙鄉={"id":"data/CN/台湾/高雄縣/甲仙鄉","key":"甲仙鄉","lang":"zh-hans","lname":"Jiasian Township","zip":"847"}
+data/CN/台湾/高雄縣/美濃鎮={"id":"data/CN/台湾/高雄縣/美濃鎮","key":"美濃鎮","lang":"zh-hans","lname":"Meinong Township","zip":"843"}
+data/CN/台湾/高雄縣/茂林鄉={"id":"data/CN/台湾/高雄縣/茂林鄉","key":"茂林鄉","lang":"zh-hans","lname":"Maolin Township","zip":"851"}
+data/CN/台湾/高雄縣/茄萣鄉={"id":"data/CN/台湾/高雄縣/茄萣鄉","key":"茄萣鄉","lang":"zh-hans","lname":"Jiading Township","zip":"852"}
+data/CN/台湾/高雄縣/路竹鄉={"id":"data/CN/台湾/高雄縣/路竹鄉","key":"路竹鄉","lang":"zh-hans","lname":"Lujhu Township","zip":"821"}
+data/CN/台湾/高雄縣/阿蓮鄉={"id":"data/CN/台湾/高雄縣/阿蓮鄉","key":"阿蓮鄉","lang":"zh-hans","lname":"Alian Township","zip":"822"}
+data/CN/台湾/高雄縣/鳥松鄉={"id":"data/CN/台湾/高雄縣/鳥松鄉","key":"鳥松鄉","lang":"zh-hans","lname":"Niaosong Township","zip":"833"}
+data/CN/台湾/高雄縣/鳳山市={"id":"data/CN/台湾/高雄縣/鳳山市","key":"鳳山市","lang":"zh-hans","lname":"Fongshan City","zip":"830"}
+data/CN/吉林省={"id":"data/CN/吉林省","key":"吉林省","lang":"zh-hans","lname":"Jilin Sheng","isoid":"22","sub_keys":"白城市~白山市~长春市~吉林市~辽源市~四平市~松原市~通化市~延边朝鲜族自治州","sub_lnames":"Baicheng Shi~Baishan Shi~Changchun Shi~Jilin Shi~Liaoyuan Shi~Siping Shi~Songyuan Shi~Tonghua Shi~Yanbian Zhou","sub_zipexs":"137000~134300~130061~132011~136200~136000~138000~134001~133000","sub_mores":"true~true~true~true~true~true~true~true~true","sub_lfnames":"~~~~~~~~Yanbian Chosenzu Zizhizhou"}
+data/CN/吉林省/吉林市={"id":"data/CN/吉林省/吉林市","key":"吉林市","lang":"zh-hans","lname":"Jilin Shi","zipex":"132011","sub_keys":"昌邑区~船营区~丰满区~桦甸市~蛟河市~龙潭区~磐石市~舒兰市~永吉县","sub_lnames":"Changyi Qu~Chuanying Qu~Fengman Qu~Huadian Shi~Jiaohe Shi~Longtan Qu~Panshi Shi~Shulan Shi~Yongji Xian","sub_zipexs":"132001~132011~132108~132400~132500~132021~132300~132600~132200"}
+data/CN/吉林省/吉林市/丰满区={"id":"data/CN/吉林省/吉林市/丰满区","key":"丰满区","lang":"zh-hans","lname":"Fengman Qu","zipex":"132108"}
+data/CN/吉林省/吉林市/昌邑区={"id":"data/CN/吉林省/吉林市/昌邑区","key":"昌邑区","lang":"zh-hans","lname":"Changyi Qu","zipex":"132001"}
+data/CN/吉林省/吉林市/桦甸市={"id":"data/CN/吉林省/吉林市/桦甸市","key":"桦甸市","lang":"zh-hans","lname":"Huadian Shi","zipex":"132400"}
+data/CN/吉林省/吉林市/永吉县={"id":"data/CN/吉林省/吉林市/永吉县","key":"永吉县","lang":"zh-hans","lname":"Yongji Xian","zipex":"132200"}
+data/CN/吉林省/吉林市/磐石市={"id":"data/CN/吉林省/吉林市/磐石市","key":"磐石市","lang":"zh-hans","lname":"Panshi Shi","zipex":"132300"}
+data/CN/吉林省/吉林市/舒兰市={"id":"data/CN/吉林省/吉林市/舒兰市","key":"舒兰市","lang":"zh-hans","lname":"Shulan Shi","zipex":"132600"}
+data/CN/吉林省/吉林市/船营区={"id":"data/CN/吉林省/吉林市/船营区","key":"船营区","lang":"zh-hans","lname":"Chuanying Qu","zipex":"132011"}
+data/CN/吉林省/吉林市/蛟河市={"id":"data/CN/吉林省/吉林市/蛟河市","key":"蛟河市","lang":"zh-hans","lname":"Jiaohe Shi","zipex":"132500"}
+data/CN/吉林省/吉林市/龙潭区={"id":"data/CN/吉林省/吉林市/龙潭区","key":"龙潭区","lang":"zh-hans","lname":"Longtan Qu","zipex":"132021"}
+data/CN/吉林省/四平市={"id":"data/CN/吉林省/四平市","key":"四平市","lang":"zh-hans","lname":"Siping Shi","zipex":"136000","sub_keys":"公主岭市~梨树县~双辽市~铁东区~铁西区~伊通满族自治县","sub_lnames":"Gongzhuling Shi~Lishu Xian~Shuangliao Shi~Tiedong Qu~Tiexi Qu~Yitong Xian","sub_zipexs":"136100~136500~136400~136001~136000~130700","sub_lfnames":"~~~~~Yitong Manzu Zizhixian"}
+data/CN/吉林省/四平市/伊通满族自治县={"id":"data/CN/吉林省/四平市/伊通满族自治县","key":"伊通满族自治县","lang":"zh-hans","lname":"Yitong Xian","zipex":"130700","lfname":"Yitong Manzu Zizhixian"}
+data/CN/吉林省/四平市/公主岭市={"id":"data/CN/吉林省/四平市/公主岭市","key":"公主岭市","lang":"zh-hans","lname":"Gongzhuling Shi","zipex":"136100"}
+data/CN/吉林省/四平市/双辽市={"id":"data/CN/吉林省/四平市/双辽市","key":"双辽市","lang":"zh-hans","lname":"Shuangliao Shi","zipex":"136400"}
+data/CN/吉林省/四平市/梨树县={"id":"data/CN/吉林省/四平市/梨树县","key":"梨树县","lang":"zh-hans","lname":"Lishu Xian","zipex":"136500"}
+data/CN/吉林省/四平市/铁东区={"id":"data/CN/吉林省/四平市/铁东区","key":"铁东区","lang":"zh-hans","lname":"Tiedong Qu","zipex":"136001"}
+data/CN/吉林省/四平市/铁西区={"id":"data/CN/吉林省/四平市/铁西区","key":"铁西区","lang":"zh-hans","lname":"Tiexi Qu","zipex":"136000"}
+data/CN/吉林省/延边朝鲜族自治州={"id":"data/CN/吉林省/延边朝鲜族自治州","key":"延边朝鲜族自治州","lang":"zh-hans","lname":"Yanbian Zhou","zipex":"133000","lfname":"Yanbian Chosenzu Zizhizhou","sub_keys":"安图县~敦化市~和龙市~珲春市~龙井市~图们市~汪清县~延吉市","sub_lnames":"Antu Xian~Dunhua Shi~Helong Shi~Hunchun Shi~Longjing Shi~Tumen Shi~Wangqing Xian~Yanji Shi","sub_zipexs":"133600~133700~133500~133300~133400~133100~133200~133000"}
+data/CN/吉林省/延边朝鲜族自治州/和龙市={"id":"data/CN/吉林省/延边朝鲜族自治州/和龙市","key":"和龙市","lang":"zh-hans","lname":"Helong Shi","zipex":"133500"}
+data/CN/吉林省/延边朝鲜族自治州/图们市={"id":"data/CN/吉林省/延边朝鲜族自治州/图们市","key":"图们市","lang":"zh-hans","lname":"Tumen Shi","zipex":"133100"}
+data/CN/吉林省/延边朝鲜族自治州/安图县={"id":"data/CN/吉林省/延边朝鲜族自治州/安图县","key":"安图县","lang":"zh-hans","lname":"Antu Xian","zipex":"133600"}
+data/CN/吉林省/延边朝鲜族自治州/延吉市={"id":"data/CN/吉林省/延边朝鲜族自治州/延吉市","key":"延吉市","lang":"zh-hans","lname":"Yanji Shi","zipex":"133000"}
+data/CN/吉林省/延边朝鲜族自治州/敦化市={"id":"data/CN/吉林省/延边朝鲜族自治州/敦化市","key":"敦化市","lang":"zh-hans","lname":"Dunhua Shi","zipex":"133700"}
+data/CN/吉林省/延边朝鲜族自治州/汪清县={"id":"data/CN/吉林省/延边朝鲜族自治州/汪清县","key":"汪清县","lang":"zh-hans","lname":"Wangqing Xian","zipex":"133200"}
+data/CN/吉林省/延边朝鲜族自治州/珲春市={"id":"data/CN/吉林省/延边朝鲜族自治州/珲春市","key":"珲春市","lang":"zh-hans","lname":"Hunchun Shi","zipex":"133300"}
+data/CN/吉林省/延边朝鲜族自治州/龙井市={"id":"data/CN/吉林省/延边朝鲜族自治州/龙井市","key":"龙井市","lang":"zh-hans","lname":"Longjing Shi","zipex":"133400"}
+data/CN/吉林省/松原市={"id":"data/CN/吉林省/松原市","key":"松原市","lang":"zh-hans","lname":"Songyuan Shi","zipex":"138000","sub_keys":"长岭县~扶余县~宁江区~前郭尔罗斯蒙古族自治县~乾安县","sub_lnames":"Changling Xian~Fuyu Xian~Ningjiang Qu~Qian Gorlos Xian~Qian'an Xian","sub_zipexs":"131500~131203~138000~131100~131400","sub_lfnames":"~~~Qian Gorlos Mongolzu Zizhixian~"}
+data/CN/吉林省/松原市/乾安县={"id":"data/CN/吉林省/松原市/乾安县","key":"乾安县","lang":"zh-hans","lname":"Qian'an Xian","zipex":"131400"}
+data/CN/吉林省/松原市/前郭尔罗斯蒙古族自治县={"id":"data/CN/吉林省/松原市/前郭尔罗斯蒙古族自治县","key":"前郭尔罗斯蒙古族自治县","lang":"zh-hans","lname":"Qian Gorlos Xian","zipex":"131100","lfname":"Qian Gorlos Mongolzu Zizhixian"}
+data/CN/吉林省/松原市/宁江区={"id":"data/CN/吉林省/松原市/宁江区","key":"宁江区","lang":"zh-hans","lname":"Ningjiang Qu","zipex":"138000"}
+data/CN/吉林省/松原市/扶余县={"id":"data/CN/吉林省/松原市/扶余县","key":"扶余县","lang":"zh-hans","lname":"Fuyu Xian","zipex":"131203"}
+data/CN/吉林省/松原市/长岭县={"id":"data/CN/吉林省/松原市/长岭县","key":"长岭县","lang":"zh-hans","lname":"Changling Xian","zipex":"131500"}
+data/CN/吉林省/白城市={"id":"data/CN/吉林省/白城市","key":"白城市","lang":"zh-hans","lname":"Baicheng Shi","zipex":"137000","sub_keys":"大安市~洮北区~洮南市~通榆县~镇赉县","sub_lnames":"Da'an Shi~Taobei Qu~Taonan Shi~Tongyu Xian~Zhenlai Xian","sub_zipexs":"131300~137000~137100~137200~137300"}
+data/CN/吉林省/白城市/大安市={"id":"data/CN/吉林省/白城市/大安市","key":"大安市","lang":"zh-hans","lname":"Da'an Shi","zipex":"131300"}
+data/CN/吉林省/白城市/洮北区={"id":"data/CN/吉林省/白城市/洮北区","key":"洮北区","lang":"zh-hans","lname":"Taobei Qu","zipex":"137000"}
+data/CN/吉林省/白城市/洮南市={"id":"data/CN/吉林省/白城市/洮南市","key":"洮南市","lang":"zh-hans","lname":"Taonan Shi","zipex":"137100"}
+data/CN/吉林省/白城市/通榆县={"id":"data/CN/吉林省/白城市/通榆县","key":"通榆县","lang":"zh-hans","lname":"Tongyu Xian","zipex":"137200"}
+data/CN/吉林省/白城市/镇赉县={"id":"data/CN/吉林省/白城市/镇赉县","key":"镇赉县","lang":"zh-hans","lname":"Zhenlai Xian","zipex":"137300"}
+data/CN/吉林省/白山市={"id":"data/CN/吉林省/白山市","key":"白山市","lang":"zh-hans","lname":"Baishan Shi","zipex":"134300","sub_keys":"八道江区~长白朝鲜族自治县~抚松县~江源区~靖宇县~临江市","sub_lnames":"Badaojiang Qu~Changbai Xian~Fusong Xian~Jiangyuan Qu~Jingyu Xian~Linjiang Shi","sub_zipexs":"134300~134400~134500~134700~135200~134600","sub_lfnames":"~Changbai Chosenzu Zizhixian~~~~"}
+data/CN/吉林省/白山市/临江市={"id":"data/CN/吉林省/白山市/临江市","key":"临江市","lang":"zh-hans","lname":"Linjiang Shi","zipex":"134600"}
+data/CN/吉林省/白山市/八道江区={"id":"data/CN/吉林省/白山市/八道江区","key":"八道江区","lang":"zh-hans","lname":"Badaojiang Qu","zipex":"134300"}
+data/CN/吉林省/白山市/抚松县={"id":"data/CN/吉林省/白山市/抚松县","key":"抚松县","lang":"zh-hans","lname":"Fusong Xian","zipex":"134500"}
+data/CN/吉林省/白山市/江源区={"id":"data/CN/吉林省/白山市/江源区","key":"江源区","lang":"zh-hans","lname":"Jiangyuan Qu","zipex":"134700"}
+data/CN/吉林省/白山市/长白朝鲜族自治县={"id":"data/CN/吉林省/白山市/长白朝鲜族自治县","key":"长白朝鲜族自治县","lang":"zh-hans","lname":"Changbai Xian","zipex":"134400","lfname":"Changbai Chosenzu Zizhixian"}
+data/CN/吉林省/白山市/靖宇县={"id":"data/CN/吉林省/白山市/靖宇县","key":"靖宇县","lang":"zh-hans","lname":"Jingyu Xian","zipex":"135200"}
+data/CN/吉林省/辽源市={"id":"data/CN/吉林省/辽源市","key":"辽源市","lang":"zh-hans","lname":"Liaoyuan Shi","zipex":"136200","sub_keys":"东丰县~东辽县~龙山区~西安区","sub_lnames":"Dongfeng Xian~Dongliao Xian~Longshan Qu~Xi'an Qu","sub_zipexs":"136300~136600~136200~136201"}
+data/CN/吉林省/辽源市/东丰县={"id":"data/CN/吉林省/辽源市/东丰县","key":"东丰县","lang":"zh-hans","lname":"Dongfeng Xian","zipex":"136300"}
+data/CN/吉林省/辽源市/东辽县={"id":"data/CN/吉林省/辽源市/东辽县","key":"东辽县","lang":"zh-hans","lname":"Dongliao Xian","zipex":"136600"}
+data/CN/吉林省/辽源市/西安区={"id":"data/CN/吉林省/辽源市/西安区","key":"西安区","lang":"zh-hans","lname":"Xi'an Qu","zipex":"136201"}
+data/CN/吉林省/辽源市/龙山区={"id":"data/CN/吉林省/辽源市/龙山区","key":"龙山区","lang":"zh-hans","lname":"Longshan Qu","zipex":"136200"}
+data/CN/吉林省/通化市={"id":"data/CN/吉林省/通化市","key":"通化市","lang":"zh-hans","lname":"Tonghua Shi","zipex":"134001","sub_keys":"东昌区~二道江区~辉南县~集安市~柳河县~梅河口市~通化县","sub_lnames":"Dongchang Qu~Erdaojiang Qu~Huinan Xian~Ji'an Shi~Liuhe Xian~Meihekou Shi~Tonghua Xian","sub_zipexs":"134001~134300~135100~134200~135300~135000~134100"}
+data/CN/吉林省/通化市/东昌区={"id":"data/CN/吉林省/通化市/东昌区","key":"东昌区","lang":"zh-hans","lname":"Dongchang Qu","zipex":"134001"}
+data/CN/吉林省/通化市/二道江区={"id":"data/CN/吉林省/通化市/二道江区","key":"二道江区","lang":"zh-hans","lname":"Erdaojiang Qu","zipex":"134300"}
+data/CN/吉林省/通化市/柳河县={"id":"data/CN/吉林省/通化市/柳河县","key":"柳河县","lang":"zh-hans","lname":"Liuhe Xian","zipex":"135300"}
+data/CN/吉林省/通化市/梅河口市={"id":"data/CN/吉林省/通化市/梅河口市","key":"梅河口市","lang":"zh-hans","lname":"Meihekou Shi","zipex":"135000"}
+data/CN/吉林省/通化市/辉南县={"id":"data/CN/吉林省/通化市/辉南县","key":"辉南县","lang":"zh-hans","lname":"Huinan Xian","zipex":"135100"}
+data/CN/吉林省/通化市/通化县={"id":"data/CN/吉林省/通化市/通化县","key":"通化县","lang":"zh-hans","lname":"Tonghua Xian","zipex":"134100"}
+data/CN/吉林省/通化市/集安市={"id":"data/CN/吉林省/通化市/集安市","key":"集安市","lang":"zh-hans","lname":"Ji'an Shi","zipex":"134200"}
+data/CN/吉林省/长春市={"id":"data/CN/吉林省/长春市","key":"长春市","lang":"zh-hans","lname":"Changchun Shi","zipex":"130061","sub_keys":"朝阳区~德惠市~二道区~九台市~宽城区~绿园区~南关区~农安县~双阳区~榆树市","sub_lnames":"Chaoyang Qu~Dehui Shi~Erdao Qu~Jiutai Shi~Kuancheng Qu~Lüyuan Qu~Nanguan Qu~Nong'an Xian~Shuangyang Qu~Yushu Shi","sub_zipexs":"130061~130300~130031~130500~130051~130062~130041~130200~130600~130400"}
+data/CN/吉林省/长春市/九台市={"id":"data/CN/吉林省/长春市/九台市","key":"九台市","lang":"zh-hans","lname":"Jiutai Shi","zipex":"130500"}
+data/CN/吉林省/长春市/二道区={"id":"data/CN/吉林省/长春市/二道区","key":"二道区","lang":"zh-hans","lname":"Erdao Qu","zipex":"130031"}
+data/CN/吉林省/长春市/农安县={"id":"data/CN/吉林省/长春市/农安县","key":"农安县","lang":"zh-hans","lname":"Nong'an Xian","zipex":"130200"}
+data/CN/吉林省/长春市/南关区={"id":"data/CN/吉林省/长春市/南关区","key":"南关区","lang":"zh-hans","lname":"Nanguan Qu","zipex":"130041"}
+data/CN/吉林省/长春市/双阳区={"id":"data/CN/吉林省/长春市/双阳区","key":"双阳区","lang":"zh-hans","lname":"Shuangyang Qu","zipex":"130600"}
+data/CN/吉林省/长春市/宽城区={"id":"data/CN/吉林省/长春市/宽城区","key":"宽城区","lang":"zh-hans","lname":"Kuancheng Qu","zipex":"130051"}
+data/CN/吉林省/长春市/德惠市={"id":"data/CN/吉林省/长春市/德惠市","key":"德惠市","lang":"zh-hans","lname":"Dehui Shi","zipex":"130300"}
+data/CN/吉林省/长春市/朝阳区={"id":"data/CN/吉林省/长春市/朝阳区","key":"朝阳区","lang":"zh-hans","lname":"Chaoyang Qu","zipex":"130061"}
+data/CN/吉林省/长春市/榆树市={"id":"data/CN/吉林省/长春市/榆树市","key":"榆树市","lang":"zh-hans","lname":"Yushu Shi","zipex":"130400"}
+data/CN/吉林省/长春市/绿园区={"id":"data/CN/吉林省/长春市/绿园区","key":"绿园区","lang":"zh-hans","lname":"Lüyuan Qu","zipex":"130062"}
+data/CN/四川省={"id":"data/CN/四川省","key":"四川省","lang":"zh-hans","lname":"Sichuan Sheng","isoid":"51","sub_keys":"阿坝藏族羌族自治州~巴中市~成都市~达州市~德阳市~甘孜藏族自治州~广安市~广元市~乐山市~凉山彝族自治州~泸州市~眉山市~绵阳市~内江市~南充市~攀枝花市~遂宁市~雅安市~宜宾市~资阳市~自贡市","sub_lnames":"Aba (Ngawa) Zhou~Bazhong Shi~Chengdu Shi~Dazhou Shi~Deyang Shi~Garzê Zhou~Guang'an Shi~Guangyuan Shi~Leshan Shi~Liangshan Zhou~Luzhou Shi~Meishan Shi~Mianyang Shi~Neijiang Shi~Nanchong Shi~Panzhihua Shi~Suining Shi~Ya'an Shi~Yibin Shi~Ziyang Shi~Zigong Shi","sub_zipexs":"624000~636600~610015~635000~618000~626000~638500~628017~614000~615000~646000~620010~621000~641000~637000~617000~629000~625000~644000~641300~643000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true","sub_lfnames":"Aba (Ngawa) Zangzu Qiangzu Zizhizhou~~~~~Garzê Zangzu Zizhizhou~~~~Liangshan Yizu Zizhizhou~~~~~~~~~~~"}
+data/CN/四川省/乐山市={"id":"data/CN/四川省/乐山市","key":"乐山市","lang":"zh-hans","lname":"Leshan Shi","zipex":"614000","sub_keys":"峨边彝族自治县~峨眉山市~夹江县~犍为县~金口河区~井研县~马边彝族自治县~沐川县~沙湾区~市中区~五通桥区","sub_lnames":"Ebian Xian~Emeishan Shi~Jiajiang Xian~Qianwei Xian~Jinkouhe Qu~Jingyan Xian~Mabian Xian~Muchuan Xian~Shawan Qu~Shizhong Qu~Wutongqiao Qu","sub_zipexs":"614300~614200~614100~614400~614700~613100~614600~614500~614900~614000~614800","sub_lfnames":"Ebian Yizu Zizhixian~~~~~~Mabian Yizu Zizhixian~~~~"}
+data/CN/四川省/乐山市/五通桥区={"id":"data/CN/四川省/乐山市/五通桥区","key":"五通桥区","lang":"zh-hans","lname":"Wutongqiao Qu","zipex":"614800"}
+data/CN/四川省/乐山市/井研县={"id":"data/CN/四川省/乐山市/井研县","key":"井研县","lang":"zh-hans","lname":"Jingyan Xian","zipex":"613100"}
+data/CN/四川省/乐山市/夹江县={"id":"data/CN/四川省/乐山市/夹江县","key":"夹江县","lang":"zh-hans","lname":"Jiajiang Xian","zipex":"614100"}
+data/CN/四川省/乐山市/峨眉山市={"id":"data/CN/四川省/乐山市/峨眉山市","key":"峨眉山市","lang":"zh-hans","lname":"Emeishan Shi","zipex":"614200"}
+data/CN/四川省/乐山市/峨边彝族自治县={"id":"data/CN/四川省/乐山市/峨边彝族自治县","key":"峨边彝族自治县","lang":"zh-hans","lname":"Ebian Xian","zipex":"614300","lfname":"Ebian Yizu Zizhixian"}
+data/CN/四川省/乐山市/市中区={"id":"data/CN/四川省/乐山市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"614000"}
+data/CN/四川省/乐山市/沐川县={"id":"data/CN/四川省/乐山市/沐川县","key":"沐川县","lang":"zh-hans","lname":"Muchuan Xian","zipex":"614500"}
+data/CN/四川省/乐山市/沙湾区={"id":"data/CN/四川省/乐山市/沙湾区","key":"沙湾区","lang":"zh-hans","lname":"Shawan Qu","zipex":"614900"}
+data/CN/四川省/乐山市/犍为县={"id":"data/CN/四川省/乐山市/犍为县","key":"犍为县","lang":"zh-hans","lname":"Qianwei Xian","zipex":"614400"}
+data/CN/四川省/乐山市/金口河区={"id":"data/CN/四川省/乐山市/金口河区","key":"金口河区","lang":"zh-hans","lname":"Jinkouhe Qu","zipex":"614700"}
+data/CN/四川省/乐山市/马边彝族自治县={"id":"data/CN/四川省/乐山市/马边彝族自治县","key":"马边彝族自治县","lang":"zh-hans","lname":"Mabian Xian","zipex":"614600","lfname":"Mabian Yizu Zizhixian"}
+data/CN/四川省/内江市={"id":"data/CN/四川省/内江市","key":"内江市","lang":"zh-hans","lname":"Neijiang Shi","zipex":"641000","sub_keys":"东兴区~隆昌县~市中区~威远县~资中县","sub_lnames":"Dongxing Qu~Longchang Xian~Shizhong Qu~Weiyuan Xian~Zizhong Xian","sub_zipexs":"641100~642150~641000~642450~641200"}
+data/CN/四川省/内江市/东兴区={"id":"data/CN/四川省/内江市/东兴区","key":"东兴区","lang":"zh-hans","lname":"Dongxing Qu","zipex":"641100"}
+data/CN/四川省/内江市/威远县={"id":"data/CN/四川省/内江市/威远县","key":"威远县","lang":"zh-hans","lname":"Weiyuan Xian","zipex":"642450"}
+data/CN/四川省/内江市/市中区={"id":"data/CN/四川省/内江市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"641000"}
+data/CN/四川省/内江市/资中县={"id":"data/CN/四川省/内江市/资中县","key":"资中县","lang":"zh-hans","lname":"Zizhong Xian","zipex":"641200"}
+data/CN/四川省/内江市/隆昌县={"id":"data/CN/四川省/内江市/隆昌县","key":"隆昌县","lang":"zh-hans","lname":"Longchang Xian","zipex":"642150"}
+data/CN/四川省/凉山彝族自治州={"id":"data/CN/四川省/凉山彝族自治州","key":"凉山彝族自治州","lang":"zh-hans","lname":"Liangshan Zhou","zipex":"615000","lfname":"Liangshan Yizu Zizhizhou","sub_keys":"布拖县~德昌县~甘洛县~会东县~会理县~金阳县~雷波县~美姑县~冕宁县~木里藏族自治县~宁南县~普格县~西昌市~喜德县~盐源县~越西县~昭觉县","sub_lnames":"Butuo Xian~Dechang Xian~Ganluo Xian~Huidong Xian~Huili Xian~Jinyang Xian~Leibo Xian~Meigu Xian~Mianning Xian~Muli Xian~Ningnan Xian~Puge Xian~Xichang Shi~Xide Xian~Yanyuan Xian~Yuexi Xian~Zhaojue Xian","sub_zipexs":"615350~615500~616850~615200~615100~616250~616550~616450~615600~615800~615400~615300~615000~616750~615700~616650~616150","sub_lfnames":"~~~~~~~~~Muli Zangzu Zizhixian~~~~~~~"}
+data/CN/四川省/凉山彝族自治州/会东县={"id":"data/CN/四川省/凉山彝族自治州/会东县","key":"会东县","lang":"zh-hans","lname":"Huidong Xian","zipex":"615200"}
+data/CN/四川省/凉山彝族自治州/会理县={"id":"data/CN/四川省/凉山彝族自治州/会理县","key":"会理县","lang":"zh-hans","lname":"Huili Xian","zipex":"615100"}
+data/CN/四川省/凉山彝族自治州/冕宁县={"id":"data/CN/四川省/凉山彝族自治州/冕宁县","key":"冕宁县","lang":"zh-hans","lname":"Mianning Xian","zipex":"615600"}
+data/CN/四川省/凉山彝族自治州/喜德县={"id":"data/CN/四川省/凉山彝族自治州/喜德县","key":"喜德县","lang":"zh-hans","lname":"Xide Xian","zipex":"616750"}
+data/CN/四川省/凉山彝族自治州/宁南县={"id":"data/CN/四川省/凉山彝族自治州/宁南县","key":"宁南县","lang":"zh-hans","lname":"Ningnan Xian","zipex":"615400"}
+data/CN/四川省/凉山彝族自治州/布拖县={"id":"data/CN/四川省/凉山彝族自治州/布拖县","key":"布拖县","lang":"zh-hans","lname":"Butuo Xian","zipex":"615350"}
+data/CN/四川省/凉山彝族自治州/德昌县={"id":"data/CN/四川省/凉山彝族自治州/德昌县","key":"德昌县","lang":"zh-hans","lname":"Dechang Xian","zipex":"615500"}
+data/CN/四川省/凉山彝族自治州/昭觉县={"id":"data/CN/四川省/凉山彝族自治州/昭觉县","key":"昭觉县","lang":"zh-hans","lname":"Zhaojue Xian","zipex":"616150"}
+data/CN/四川省/凉山彝族自治州/普格县={"id":"data/CN/四川省/凉山彝族自治州/普格县","key":"普格县","lang":"zh-hans","lname":"Puge Xian","zipex":"615300"}
+data/CN/四川省/凉山彝族自治州/木里藏族自治县={"id":"data/CN/四川省/凉山彝族自治州/木里藏族自治县","key":"木里藏族自治县","lang":"zh-hans","lname":"Muli Xian","zipex":"615800","lfname":"Muli Zangzu Zizhixian"}
+data/CN/四川省/凉山彝族自治州/甘洛县={"id":"data/CN/四川省/凉山彝族自治州/甘洛县","key":"甘洛县","lang":"zh-hans","lname":"Ganluo Xian","zipex":"616850"}
+data/CN/四川省/凉山彝族自治州/盐源县={"id":"data/CN/四川省/凉山彝族自治州/盐源县","key":"盐源县","lang":"zh-hans","lname":"Yanyuan Xian","zipex":"615700"}
+data/CN/四川省/凉山彝族自治州/美姑县={"id":"data/CN/四川省/凉山彝族自治州/美姑县","key":"美姑县","lang":"zh-hans","lname":"Meigu Xian","zipex":"616450"}
+data/CN/四川省/凉山彝族自治州/西昌市={"id":"data/CN/四川省/凉山彝族自治州/西昌市","key":"西昌市","lang":"zh-hans","lname":"Xichang Shi","zipex":"615000"}
+data/CN/四川省/凉山彝族自治州/越西县={"id":"data/CN/四川省/凉山彝族自治州/越西县","key":"越西县","lang":"zh-hans","lname":"Yuexi Xian","zipex":"616650"}
+data/CN/四川省/凉山彝族自治州/金阳县={"id":"data/CN/四川省/凉山彝族自治州/金阳县","key":"金阳县","lang":"zh-hans","lname":"Jinyang Xian","zipex":"616250"}
+data/CN/四川省/凉山彝族自治州/雷波县={"id":"data/CN/四川省/凉山彝族自治州/雷波县","key":"雷波县","lang":"zh-hans","lname":"Leibo Xian","zipex":"616550"}
+data/CN/四川省/南充市={"id":"data/CN/四川省/南充市","key":"南充市","lang":"zh-hans","lname":"Nanchong Shi","zipex":"637000","sub_keys":"高坪区~嘉陵区~阆中市~南部县~蓬安县~顺庆区~西充县~仪陇县~营山县","sub_lnames":"Gaoping Qu~Jialing Qu~Langzhong Shi~Nanbu Xian~Peng'an Xian~Shunqing Qu~Xichong Xian~Yilong Xian~Yingshan Xian","sub_zipexs":"637100~637500~637400~637300~637800~637000~637200~637600~637700"}
+data/CN/四川省/南充市/仪陇县={"id":"data/CN/四川省/南充市/仪陇县","key":"仪陇县","lang":"zh-hans","lname":"Yilong Xian","zipex":"637600"}
+data/CN/四川省/南充市/南部县={"id":"data/CN/四川省/南充市/南部县","key":"南部县","lang":"zh-hans","lname":"Nanbu Xian","zipex":"637300"}
+data/CN/四川省/南充市/嘉陵区={"id":"data/CN/四川省/南充市/嘉陵区","key":"嘉陵区","lang":"zh-hans","lname":"Jialing Qu","zipex":"637500"}
+data/CN/四川省/南充市/营山县={"id":"data/CN/四川省/南充市/营山县","key":"营山县","lang":"zh-hans","lname":"Yingshan Xian","zipex":"637700"}
+data/CN/四川省/南充市/蓬安县={"id":"data/CN/四川省/南充市/蓬安县","key":"蓬安县","lang":"zh-hans","lname":"Peng'an Xian","zipex":"637800"}
+data/CN/四川省/南充市/西充县={"id":"data/CN/四川省/南充市/西充县","key":"西充县","lang":"zh-hans","lname":"Xichong Xian","zipex":"637200"}
+data/CN/四川省/南充市/阆中市={"id":"data/CN/四川省/南充市/阆中市","key":"阆中市","lang":"zh-hans","lname":"Langzhong Shi","zipex":"637400"}
+data/CN/四川省/南充市/顺庆区={"id":"data/CN/四川省/南充市/顺庆区","key":"顺庆区","lang":"zh-hans","lname":"Shunqing Qu","zipex":"637000"}
+data/CN/四川省/南充市/高坪区={"id":"data/CN/四川省/南充市/高坪区","key":"高坪区","lang":"zh-hans","lname":"Gaoping Qu","zipex":"637100"}
+data/CN/四川省/宜宾市={"id":"data/CN/四川省/宜宾市","key":"宜宾市","lang":"zh-hans","lname":"Yibin Shi","zipex":"644000","sub_keys":"长宁县~翠屏区~高县~珙县~江安县~筠连县~南溪县~屏山县~兴文县~宜宾县","sub_lnames":"Changning Xian~Cuiping Qu~Gao Xian~Gong Xian~Jiang'an Xian~Junlian Xian~Nanxi Xian~Pingshan Xian~Xingwen Xian~Yibin Xian","sub_zipexs":"644300~644000~645154~644501~644200~645250~644100~645350~644400~644600"}
+data/CN/四川省/宜宾市/兴文县={"id":"data/CN/四川省/宜宾市/兴文县","key":"兴文县","lang":"zh-hans","lname":"Xingwen Xian","zipex":"644400"}
+data/CN/四川省/宜宾市/南溪县={"id":"data/CN/四川省/宜宾市/南溪县","key":"南溪县","lang":"zh-hans","lname":"Nanxi Xian","zipex":"644100"}
+data/CN/四川省/宜宾市/宜宾县={"id":"data/CN/四川省/宜宾市/宜宾县","key":"宜宾县","lang":"zh-hans","lname":"Yibin Xian","zipex":"644600"}
+data/CN/四川省/宜宾市/屏山县={"id":"data/CN/四川省/宜宾市/屏山县","key":"屏山县","lang":"zh-hans","lname":"Pingshan Xian","zipex":"645350"}
+data/CN/四川省/宜宾市/江安县={"id":"data/CN/四川省/宜宾市/江安县","key":"江安县","lang":"zh-hans","lname":"Jiang'an Xian","zipex":"644200"}
+data/CN/四川省/宜宾市/珙县={"id":"data/CN/四川省/宜宾市/珙县","key":"珙县","lang":"zh-hans","lname":"Gong Xian","zipex":"644501"}
+data/CN/四川省/宜宾市/筠连县={"id":"data/CN/四川省/宜宾市/筠连县","key":"筠连县","lang":"zh-hans","lname":"Junlian Xian","zipex":"645250"}
+data/CN/四川省/宜宾市/翠屏区={"id":"data/CN/四川省/宜宾市/翠屏区","key":"翠屏区","lang":"zh-hans","lname":"Cuiping Qu","zipex":"644000"}
+data/CN/四川省/宜宾市/长宁县={"id":"data/CN/四川省/宜宾市/长宁县","key":"长宁县","lang":"zh-hans","lname":"Changning Xian","zipex":"644300"}
+data/CN/四川省/宜宾市/高县={"id":"data/CN/四川省/宜宾市/高县","key":"高县","lang":"zh-hans","lname":"Gao Xian","zipex":"645154"}
+data/CN/四川省/巴中市={"id":"data/CN/四川省/巴中市","key":"巴中市","lang":"zh-hans","lname":"Bazhong Shi","zipex":"636600","sub_keys":"巴州区~南江县~平昌县~通江县","sub_lnames":"Bazhou Qu~Nanjiang Xian~Pingchang Xian~Tongjiang Xian","sub_zipexs":"636600~635600~636400~636700"}
+data/CN/四川省/巴中市/南江县={"id":"data/CN/四川省/巴中市/南江县","key":"南江县","lang":"zh-hans","lname":"Nanjiang Xian","zipex":"635600"}
+data/CN/四川省/巴中市/巴州区={"id":"data/CN/四川省/巴中市/巴州区","key":"巴州区","lang":"zh-hans","lname":"Bazhou Qu","zipex":"636600"}
+data/CN/四川省/巴中市/平昌县={"id":"data/CN/四川省/巴中市/平昌县","key":"平昌县","lang":"zh-hans","lname":"Pingchang Xian","zipex":"636400"}
+data/CN/四川省/巴中市/通江县={"id":"data/CN/四川省/巴中市/通江县","key":"通江县","lang":"zh-hans","lname":"Tongjiang Xian","zipex":"636700"}
+data/CN/四川省/广元市={"id":"data/CN/四川省/广元市","key":"广元市","lang":"zh-hans","lname":"Guangyuan Shi","zipex":"628017","sub_keys":"苍溪县~朝天区~剑阁县~青川县~市中区~旺苍县~元坝区","sub_lnames":"Cangxi Xian~Chaotian Qu~Jiange Xian~Qingchuan Xian~Shizhong Qu~Wangcang Xian~Yuanba Qu","sub_zipexs":"628400~628012~628300~628100~628017~628200~628021"}
+data/CN/四川省/广元市/元坝区={"id":"data/CN/四川省/广元市/元坝区","key":"元坝区","lang":"zh-hans","lname":"Yuanba Qu","zipex":"628021"}
+data/CN/四川省/广元市/剑阁县={"id":"data/CN/四川省/广元市/剑阁县","key":"剑阁县","lang":"zh-hans","lname":"Jiange Xian","zipex":"628300"}
+data/CN/四川省/广元市/市中区={"id":"data/CN/四川省/广元市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"628017"}
+data/CN/四川省/广元市/旺苍县={"id":"data/CN/四川省/广元市/旺苍县","key":"旺苍县","lang":"zh-hans","lname":"Wangcang Xian","zipex":"628200"}
+data/CN/四川省/广元市/朝天区={"id":"data/CN/四川省/广元市/朝天区","key":"朝天区","lang":"zh-hans","lname":"Chaotian Qu","zipex":"628012"}
+data/CN/四川省/广元市/苍溪县={"id":"data/CN/四川省/广元市/苍溪县","key":"苍溪县","lang":"zh-hans","lname":"Cangxi Xian","zipex":"628400"}
+data/CN/四川省/广元市/青川县={"id":"data/CN/四川省/广元市/青川县","key":"青川县","lang":"zh-hans","lname":"Qingchuan Xian","zipex":"628100"}
+data/CN/四川省/广安市={"id":"data/CN/四川省/广安市","key":"广安市","lang":"zh-hans","lname":"Guang'an Shi","zipex":"638500","sub_keys":"广安区~华蓥市~邻水县~武胜县~岳池县","sub_lnames":"Guang'an Qu~Huaying Shi~Linshui Xian~Wusheng Xian~Yuechi Xian","sub_zipexs":"638550~638600~638500~638400~638300"}
+data/CN/四川省/广安市/华蓥市={"id":"data/CN/四川省/广安市/华蓥市","key":"华蓥市","lang":"zh-hans","lname":"Huaying Shi","zipex":"638600"}
+data/CN/四川省/广安市/岳池县={"id":"data/CN/四川省/广安市/岳池县","key":"岳池县","lang":"zh-hans","lname":"Yuechi Xian","zipex":"638300"}
+data/CN/四川省/广安市/广安区={"id":"data/CN/四川省/广安市/广安区","key":"广安区","lang":"zh-hans","lname":"Guang'an Qu","zipex":"638550"}
+data/CN/四川省/广安市/武胜县={"id":"data/CN/四川省/广安市/武胜县","key":"武胜县","lang":"zh-hans","lname":"Wusheng Xian","zipex":"638400"}
+data/CN/四川省/广安市/邻水县={"id":"data/CN/四川省/广安市/邻水县","key":"邻水县","lang":"zh-hans","lname":"Linshui Xian","zipex":"638500"}
+data/CN/四川省/德阳市={"id":"data/CN/四川省/德阳市","key":"德阳市","lang":"zh-hans","lname":"Deyang Shi","zipex":"618000","sub_keys":"广汉市~旌阳区~罗江县~绵竹市~什邡市~中江县","sub_lnames":"Guanghan Shi~Jingyang Qu~Luojiang Xian~Mianzhu Shi~Shifang Shi~Zhongjiang Xian","sub_zipexs":"618300~618000~618500~618200~618400~618300"}
+data/CN/四川省/德阳市/中江县={"id":"data/CN/四川省/德阳市/中江县","key":"中江县","lang":"zh-hans","lname":"Zhongjiang Xian","zipex":"618300"}
+data/CN/四川省/德阳市/什邡市={"id":"data/CN/四川省/德阳市/什邡市","key":"什邡市","lang":"zh-hans","lname":"Shifang Shi","zipex":"618400"}
+data/CN/四川省/德阳市/广汉市={"id":"data/CN/四川省/德阳市/广汉市","key":"广汉市","lang":"zh-hans","lname":"Guanghan Shi","zipex":"618300"}
+data/CN/四川省/德阳市/旌阳区={"id":"data/CN/四川省/德阳市/旌阳区","key":"旌阳区","lang":"zh-hans","lname":"Jingyang Qu","zipex":"618000"}
+data/CN/四川省/德阳市/绵竹市={"id":"data/CN/四川省/德阳市/绵竹市","key":"绵竹市","lang":"zh-hans","lname":"Mianzhu Shi","zipex":"618200"}
+data/CN/四川省/德阳市/罗江县={"id":"data/CN/四川省/德阳市/罗江县","key":"罗江县","lang":"zh-hans","lname":"Luojiang Xian","zipex":"618500"}
+data/CN/四川省/成都市={"id":"data/CN/四川省/成都市","key":"成都市","lang":"zh-hans","lname":"Chengdu Shi","zipex":"610015","sub_keys":"成华区~崇州市~大邑县~都江堰市~金牛区~金堂县~锦江区~龙泉驿区~彭州市~郫县~蒲江县~青白江区~青羊区~邛崃市~双流县~温江区~武侯区~新都区~新津县","sub_lnames":"Chenghua Qu~Chongzhou Shi~Dayi Xian~Dujiangyan Shi~Jinniu Qu~Jintang Xian~Jinjiang Qu~Longquanyi Qu~Pengzhou Shi~Pi Xian~Pujiang Xian~Qingbaijiang Qu~Qingyang Qu~Qionglai Shi~Shuangliu Xian~Wenjiang Qu~Wuhou Qu~Xindu Qu~Xinjin Xian","sub_zipexs":"610051~611230~611330~611830~610036~610400~610011~610100~611930~611730~611630~610300~610031~611530~610200~611130~610041~610500~611430"}
+data/CN/四川省/成都市/双流县={"id":"data/CN/四川省/成都市/双流县","key":"双流县","lang":"zh-hans","lname":"Shuangliu Xian","zipex":"610200"}
+data/CN/四川省/成都市/大邑县={"id":"data/CN/四川省/成都市/大邑县","key":"大邑县","lang":"zh-hans","lname":"Dayi Xian","zipex":"611330"}
+data/CN/四川省/成都市/崇州市={"id":"data/CN/四川省/成都市/崇州市","key":"崇州市","lang":"zh-hans","lname":"Chongzhou Shi","zipex":"611230"}
+data/CN/四川省/成都市/彭州市={"id":"data/CN/四川省/成都市/彭州市","key":"彭州市","lang":"zh-hans","lname":"Pengzhou Shi","zipex":"611930"}
+data/CN/四川省/成都市/成华区={"id":"data/CN/四川省/成都市/成华区","key":"成华区","lang":"zh-hans","lname":"Chenghua Qu","zipex":"610051"}
+data/CN/四川省/成都市/新津县={"id":"data/CN/四川省/成都市/新津县","key":"新津县","lang":"zh-hans","lname":"Xinjin Xian","zipex":"611430"}
+data/CN/四川省/成都市/新都区={"id":"data/CN/四川省/成都市/新都区","key":"新都区","lang":"zh-hans","lname":"Xindu Qu","zipex":"610500"}
+data/CN/四川省/成都市/武侯区={"id":"data/CN/四川省/成都市/武侯区","key":"武侯区","lang":"zh-hans","lname":"Wuhou Qu","zipex":"610041"}
+data/CN/四川省/成都市/温江区={"id":"data/CN/四川省/成都市/温江区","key":"温江区","lang":"zh-hans","lname":"Wenjiang Qu","zipex":"611130"}
+data/CN/四川省/成都市/蒲江县={"id":"data/CN/四川省/成都市/蒲江县","key":"蒲江县","lang":"zh-hans","lname":"Pujiang Xian","zipex":"611630"}
+data/CN/四川省/成都市/邛崃市={"id":"data/CN/四川省/成都市/邛崃市","key":"邛崃市","lang":"zh-hans","lname":"Qionglai Shi","zipex":"611530"}
+data/CN/四川省/成都市/郫县={"id":"data/CN/四川省/成都市/郫县","key":"郫县","lang":"zh-hans","lname":"Pi Xian","zipex":"611730"}
+data/CN/四川省/成都市/都江堰市={"id":"data/CN/四川省/成都市/都江堰市","key":"都江堰市","lang":"zh-hans","lname":"Dujiangyan Shi","zipex":"611830"}
+data/CN/四川省/成都市/金堂县={"id":"data/CN/四川省/成都市/金堂县","key":"金堂县","lang":"zh-hans","lname":"Jintang Xian","zipex":"610400"}
+data/CN/四川省/成都市/金牛区={"id":"data/CN/四川省/成都市/金牛区","key":"金牛区","lang":"zh-hans","lname":"Jinniu Qu","zipex":"610036"}
+data/CN/四川省/成都市/锦江区={"id":"data/CN/四川省/成都市/锦江区","key":"锦江区","lang":"zh-hans","lname":"Jinjiang Qu","zipex":"610011"}
+data/CN/四川省/成都市/青白江区={"id":"data/CN/四川省/成都市/青白江区","key":"青白江区","lang":"zh-hans","lname":"Qingbaijiang Qu","zipex":"610300"}
+data/CN/四川省/成都市/青羊区={"id":"data/CN/四川省/成都市/青羊区","key":"青羊区","lang":"zh-hans","lname":"Qingyang Qu","zipex":"610031"}
+data/CN/四川省/成都市/龙泉驿区={"id":"data/CN/四川省/成都市/龙泉驿区","key":"龙泉驿区","lang":"zh-hans","lname":"Longquanyi Qu","zipex":"610100"}
+data/CN/四川省/攀枝花市={"id":"data/CN/四川省/攀枝花市","key":"攀枝花市","lang":"zh-hans","lname":"Panzhihua Shi","zipex":"617000","sub_keys":"东区~米易县~仁和区~西区~盐边县","sub_lnames":"Dong Qu~Miyi Xian~Renhe Qu~Xi Qu~Yanbian Xian","sub_zipexs":"617067~617200~617061~617012~617100"}
+data/CN/四川省/攀枝花市/东区={"id":"data/CN/四川省/攀枝花市/东区","key":"东区","lang":"zh-hans","lname":"Dong Qu","zipex":"617067"}
+data/CN/四川省/攀枝花市/仁和区={"id":"data/CN/四川省/攀枝花市/仁和区","key":"仁和区","lang":"zh-hans","lname":"Renhe Qu","zipex":"617061"}
+data/CN/四川省/攀枝花市/盐边县={"id":"data/CN/四川省/攀枝花市/盐边县","key":"盐边县","lang":"zh-hans","lname":"Yanbian Xian","zipex":"617100"}
+data/CN/四川省/攀枝花市/米易县={"id":"data/CN/四川省/攀枝花市/米易县","key":"米易县","lang":"zh-hans","lname":"Miyi Xian","zipex":"617200"}
+data/CN/四川省/攀枝花市/西区={"id":"data/CN/四川省/攀枝花市/西区","key":"西区","lang":"zh-hans","lname":"Xi Qu","zipex":"617012"}
+data/CN/四川省/泸州市={"id":"data/CN/四川省/泸州市","key":"泸州市","lang":"zh-hans","lname":"Luzhou Shi","zipex":"646000","sub_keys":"古蔺县~合江县~江阳区~龙马潭区~泸县~纳溪区~叙永县","sub_lnames":"Gulin Xian~Hejiang Xian~Jiangyang Qu~Longmatan Qu~Lu Xian~Naxi Qu~Xuyong Xian","sub_zipexs":"646500~646200~646000~646000~646106~646300~646400"}
+data/CN/四川省/泸州市/叙永县={"id":"data/CN/四川省/泸州市/叙永县","key":"叙永县","lang":"zh-hans","lname":"Xuyong Xian","zipex":"646400"}
+data/CN/四川省/泸州市/古蔺县={"id":"data/CN/四川省/泸州市/古蔺县","key":"古蔺县","lang":"zh-hans","lname":"Gulin Xian","zipex":"646500"}
+data/CN/四川省/泸州市/合江县={"id":"data/CN/四川省/泸州市/合江县","key":"合江县","lang":"zh-hans","lname":"Hejiang Xian","zipex":"646200"}
+data/CN/四川省/泸州市/江阳区={"id":"data/CN/四川省/泸州市/江阳区","key":"江阳区","lang":"zh-hans","lname":"Jiangyang Qu","zipex":"646000"}
+data/CN/四川省/泸州市/泸县={"id":"data/CN/四川省/泸州市/泸县","key":"泸县","lang":"zh-hans","lname":"Lu Xian","zipex":"646106"}
+data/CN/四川省/泸州市/纳溪区={"id":"data/CN/四川省/泸州市/纳溪区","key":"纳溪区","lang":"zh-hans","lname":"Naxi Qu","zipex":"646300"}
+data/CN/四川省/泸州市/龙马潭区={"id":"data/CN/四川省/泸州市/龙马潭区","key":"龙马潭区","lang":"zh-hans","lname":"Longmatan Qu","zipex":"646000"}
+data/CN/四川省/甘孜藏族自治州={"id":"data/CN/四川省/甘孜藏族自治州","key":"甘孜藏族自治州","lang":"zh-hans","lname":"Garzê Zhou","zipex":"626000","lfname":"Garzê Zangzu Zizhizhou","sub_keys":"巴塘县~白玉县~丹巴县~道孚县~稻城县~得荣县~德格县~甘孜县~九龙县~康定县~理塘县~泸定县~炉霍县~色达县~石渠县~乡城县~新龙县~雅江县","sub_lnames":"Batang Xian~Baiyu Xian~Danba (Rongzhag) Xian~Dawu Xian~Daocheng (Dabba) Xian~Dêrong Xian~Dêgê Xian~Garzê Xian~Jiulong (Gyaisi) Xian~Kangding (Dardo) Xian~Litang Xian~Luding (Jagsamka) Xian~Luhuo (Zhaggo) Xian~Sêrtar Xian~Sêrxü Xian~Xiangcheng (Qagchêng) Xian~Xinlong (Nyagrong) Xian~Yajiang (Nyagquka) Xian","sub_zipexs":"627650~627150~626300~626400~627750~627950~627250~626700~616200~626000~624300~626100~626500~626600~627350~627850~626800~627450"}
+data/CN/四川省/甘孜藏族自治州/丹巴县={"id":"data/CN/四川省/甘孜藏族自治州/丹巴县","key":"丹巴县","lang":"zh-hans","lname":"Danba (Rongzhag) Xian","zipex":"626300"}
+data/CN/四川省/甘孜藏族自治州/九龙县={"id":"data/CN/四川省/甘孜藏族自治州/九龙县","key":"九龙县","lang":"zh-hans","lname":"Jiulong (Gyaisi) Xian","zipex":"616200"}
+data/CN/四川省/甘孜藏族自治州/乡城县={"id":"data/CN/四川省/甘孜藏族自治州/乡城县","key":"乡城县","lang":"zh-hans","lname":"Xiangcheng (Qagchêng) Xian","zipex":"627850"}
+data/CN/四川省/甘孜藏族自治州/巴塘县={"id":"data/CN/四川省/甘孜藏族自治州/巴塘县","key":"巴塘县","lang":"zh-hans","lname":"Batang Xian","zipex":"627650"}
+data/CN/四川省/甘孜藏族自治州/康定县={"id":"data/CN/四川省/甘孜藏族自治州/康定县","key":"康定县","lang":"zh-hans","lname":"Kangding (Dardo) Xian","zipex":"626000"}
+data/CN/四川省/甘孜藏族自治州/得荣县={"id":"data/CN/四川省/甘孜藏族自治州/得荣县","key":"得荣县","lang":"zh-hans","lname":"Dêrong Xian","zipex":"627950"}
+data/CN/四川省/甘孜藏族自治州/德格县={"id":"data/CN/四川省/甘孜藏族自治州/德格县","key":"德格县","lang":"zh-hans","lname":"Dêgê Xian","zipex":"627250"}
+data/CN/四川省/甘孜藏族自治州/新龙县={"id":"data/CN/四川省/甘孜藏族自治州/新龙县","key":"新龙县","lang":"zh-hans","lname":"Xinlong (Nyagrong) Xian","zipex":"626800"}
+data/CN/四川省/甘孜藏族自治州/泸定县={"id":"data/CN/四川省/甘孜藏族自治州/泸定县","key":"泸定县","lang":"zh-hans","lname":"Luding (Jagsamka) Xian","zipex":"626100"}
+data/CN/四川省/甘孜藏族自治州/炉霍县={"id":"data/CN/四川省/甘孜藏族自治州/炉霍县","key":"炉霍县","lang":"zh-hans","lname":"Luhuo (Zhaggo) Xian","zipex":"626500"}
+data/CN/四川省/甘孜藏族自治州/理塘县={"id":"data/CN/四川省/甘孜藏族自治州/理塘县","key":"理塘县","lang":"zh-hans","lname":"Litang Xian","zipex":"624300"}
+data/CN/四川省/甘孜藏族自治州/甘孜县={"id":"data/CN/四川省/甘孜藏族自治州/甘孜县","key":"甘孜县","lang":"zh-hans","lname":"Garzê Xian","zipex":"626700"}
+data/CN/四川省/甘孜藏族自治州/白玉县={"id":"data/CN/四川省/甘孜藏族自治州/白玉县","key":"白玉县","lang":"zh-hans","lname":"Baiyu Xian","zipex":"627150"}
+data/CN/四川省/甘孜藏族自治州/石渠县={"id":"data/CN/四川省/甘孜藏族自治州/石渠县","key":"石渠县","lang":"zh-hans","lname":"Sêrxü Xian","zipex":"627350"}
+data/CN/四川省/甘孜藏族自治州/稻城县={"id":"data/CN/四川省/甘孜藏族自治州/稻城县","key":"稻城县","lang":"zh-hans","lname":"Daocheng (Dabba) Xian","zipex":"627750"}
+data/CN/四川省/甘孜藏族自治州/色达县={"id":"data/CN/四川省/甘孜藏族自治州/色达县","key":"色达县","lang":"zh-hans","lname":"Sêrtar Xian","zipex":"626600"}
+data/CN/四川省/甘孜藏族自治州/道孚县={"id":"data/CN/四川省/甘孜藏族自治州/道孚县","key":"道孚县","lang":"zh-hans","lname":"Dawu Xian","zipex":"626400"}
+data/CN/四川省/甘孜藏族自治州/雅江县={"id":"data/CN/四川省/甘孜藏族自治州/雅江县","key":"雅江县","lang":"zh-hans","lname":"Yajiang (Nyagquka) Xian","zipex":"627450"}
+data/CN/四川省/眉山市={"id":"data/CN/四川省/眉山市","key":"眉山市","lang":"zh-hans","lname":"Meishan Shi","zipex":"620010","sub_keys":"丹棱县~东坡区~洪雅县~彭山县~青神县~仁寿县","sub_lnames":"Danling Xian~Dongpo Qu~Hongya Xian~Pengshan Xian~Qingshen Xian~Renshou Xian","sub_zipexs":"620200~620010~620360~620860~620460~620500"}
+data/CN/四川省/眉山市/东坡区={"id":"data/CN/四川省/眉山市/东坡区","key":"东坡区","lang":"zh-hans","lname":"Dongpo Qu","zipex":"620010"}
+data/CN/四川省/眉山市/丹棱县={"id":"data/CN/四川省/眉山市/丹棱县","key":"丹棱县","lang":"zh-hans","lname":"Danling Xian","zipex":"620200"}
+data/CN/四川省/眉山市/仁寿县={"id":"data/CN/四川省/眉山市/仁寿县","key":"仁寿县","lang":"zh-hans","lname":"Renshou Xian","zipex":"620500"}
+data/CN/四川省/眉山市/彭山县={"id":"data/CN/四川省/眉山市/彭山县","key":"彭山县","lang":"zh-hans","lname":"Pengshan Xian","zipex":"620860"}
+data/CN/四川省/眉山市/洪雅县={"id":"data/CN/四川省/眉山市/洪雅县","key":"洪雅县","lang":"zh-hans","lname":"Hongya Xian","zipex":"620360"}
+data/CN/四川省/眉山市/青神县={"id":"data/CN/四川省/眉山市/青神县","key":"青神县","lang":"zh-hans","lname":"Qingshen Xian","zipex":"620460"}
+data/CN/四川省/绵阳市={"id":"data/CN/四川省/绵阳市","key":"绵阳市","lang":"zh-hans","lname":"Mianyang Shi","zipex":"621000","sub_keys":"安县~北川羌族自治县~涪城区~江油市~平武县~三台县~盐亭县~游仙区~梓潼县","sub_lnames":"An Xian~Beichuan Xian~Fucheng Qu~Jiangyou Shi~Pingwu Xian~Santai Xian~Yanting Xian~Youxian Qu~Zitong Xian","sub_zipexs":"622650~622750~621000~621700~622550~621100~621600~621022~622150","sub_lfnames":"~Beichuan Qiangzu Zizhixian~~~~~~~"}
+data/CN/四川省/绵阳市/三台县={"id":"data/CN/四川省/绵阳市/三台县","key":"三台县","lang":"zh-hans","lname":"Santai Xian","zipex":"621100"}
+data/CN/四川省/绵阳市/北川羌族自治县={"id":"data/CN/四川省/绵阳市/北川羌族自治县","key":"北川羌族自治县","lang":"zh-hans","lname":"Beichuan Xian","zipex":"622750","lfname":"Beichuan Qiangzu Zizhixian"}
+data/CN/四川省/绵阳市/安县={"id":"data/CN/四川省/绵阳市/安县","key":"安县","lang":"zh-hans","lname":"An Xian","zipex":"622650"}
+data/CN/四川省/绵阳市/平武县={"id":"data/CN/四川省/绵阳市/平武县","key":"平武县","lang":"zh-hans","lname":"Pingwu Xian","zipex":"622550"}
+data/CN/四川省/绵阳市/梓潼县={"id":"data/CN/四川省/绵阳市/梓潼县","key":"梓潼县","lang":"zh-hans","lname":"Zitong Xian","zipex":"622150"}
+data/CN/四川省/绵阳市/江油市={"id":"data/CN/四川省/绵阳市/江油市","key":"江油市","lang":"zh-hans","lname":"Jiangyou Shi","zipex":"621700"}
+data/CN/四川省/绵阳市/涪城区={"id":"data/CN/四川省/绵阳市/涪城区","key":"涪城区","lang":"zh-hans","lname":"Fucheng Qu","zipex":"621000"}
+data/CN/四川省/绵阳市/游仙区={"id":"data/CN/四川省/绵阳市/游仙区","key":"游仙区","lang":"zh-hans","lname":"Youxian Qu","zipex":"621022"}
+data/CN/四川省/绵阳市/盐亭县={"id":"data/CN/四川省/绵阳市/盐亭县","key":"盐亭县","lang":"zh-hans","lname":"Yanting Xian","zipex":"621600"}
+data/CN/四川省/自贡市={"id":"data/CN/四川省/自贡市","key":"自贡市","lang":"zh-hans","lname":"Zigong Shi","zipex":"643000","sub_keys":"大安区~富顺县~贡井区~荣县~沿滩区~自流井区","sub_lnames":"Da'an Qu~Fushun Xian~Gongjing Qu~Rong Xian~Yantan Qu~Ziliujing Qu","sub_zipexs":"643010~643200~643020~643100~643030~643000"}
+data/CN/四川省/自贡市/大安区={"id":"data/CN/四川省/自贡市/大安区","key":"大安区","lang":"zh-hans","lname":"Da'an Qu","zipex":"643010"}
+data/CN/四川省/自贡市/富顺县={"id":"data/CN/四川省/自贡市/富顺县","key":"富顺县","lang":"zh-hans","lname":"Fushun Xian","zipex":"643200"}
+data/CN/四川省/自贡市/沿滩区={"id":"data/CN/四川省/自贡市/沿滩区","key":"沿滩区","lang":"zh-hans","lname":"Yantan Qu","zipex":"643030"}
+data/CN/四川省/自贡市/自流井区={"id":"data/CN/四川省/自贡市/自流井区","key":"自流井区","lang":"zh-hans","lname":"Ziliujing Qu","zipex":"643000"}
+data/CN/四川省/自贡市/荣县={"id":"data/CN/四川省/自贡市/荣县","key":"荣县","lang":"zh-hans","lname":"Rong Xian","zipex":"643100"}
+data/CN/四川省/自贡市/贡井区={"id":"data/CN/四川省/自贡市/贡井区","key":"贡井区","lang":"zh-hans","lname":"Gongjing Qu","zipex":"643020"}
+data/CN/四川省/资阳市={"id":"data/CN/四川省/资阳市","key":"资阳市","lang":"zh-hans","lname":"Ziyang Shi","zipex":"641300","sub_keys":"安岳县~简阳市~乐至县~雁江区","sub_lnames":"Anyue Xian~Jianyang Shi~Lezhi Xian~Yanjiang Qu","sub_zipexs":"642350~641400~641500~641300"}
+data/CN/四川省/资阳市/乐至县={"id":"data/CN/四川省/资阳市/乐至县","key":"乐至县","lang":"zh-hans","lname":"Lezhi Xian","zipex":"641500"}
+data/CN/四川省/资阳市/安岳县={"id":"data/CN/四川省/资阳市/安岳县","key":"安岳县","lang":"zh-hans","lname":"Anyue Xian","zipex":"642350"}
+data/CN/四川省/资阳市/简阳市={"id":"data/CN/四川省/资阳市/简阳市","key":"简阳市","lang":"zh-hans","lname":"Jianyang Shi","zipex":"641400"}
+data/CN/四川省/资阳市/雁江区={"id":"data/CN/四川省/资阳市/雁江区","key":"雁江区","lang":"zh-hans","lname":"Yanjiang Qu","zipex":"641300"}
+data/CN/四川省/达州市={"id":"data/CN/四川省/达州市","key":"达州市","lang":"zh-hans","lname":"Dazhou Shi","zipex":"635000","sub_keys":"达县~大竹县~开江县~渠县~通川区~万源市~宣汉县","sub_lnames":"Da Xian~Dazhu Xian~Kaijiang Xian~Qu Xian~Tongzhou Qu~Wanyuan Shi~Xuanhan Xian","sub_zipexs":"635000~635100~636250~635200~635000~636350~636150"}
+data/CN/四川省/达州市/万源市={"id":"data/CN/四川省/达州市/万源市","key":"万源市","lang":"zh-hans","lname":"Wanyuan Shi","zipex":"636350"}
+data/CN/四川省/达州市/大竹县={"id":"data/CN/四川省/达州市/大竹县","key":"大竹县","lang":"zh-hans","lname":"Dazhu Xian","zipex":"635100"}
+data/CN/四川省/达州市/宣汉县={"id":"data/CN/四川省/达州市/宣汉县","key":"宣汉县","lang":"zh-hans","lname":"Xuanhan Xian","zipex":"636150"}
+data/CN/四川省/达州市/开江县={"id":"data/CN/四川省/达州市/开江县","key":"开江县","lang":"zh-hans","lname":"Kaijiang Xian","zipex":"636250"}
+data/CN/四川省/达州市/渠县={"id":"data/CN/四川省/达州市/渠县","key":"渠县","lang":"zh-hans","lname":"Qu Xian","zipex":"635200"}
+data/CN/四川省/达州市/达县={"id":"data/CN/四川省/达州市/达县","key":"达县","lang":"zh-hans","lname":"Da Xian","zipex":"635000"}
+data/CN/四川省/达州市/通川区={"id":"data/CN/四川省/达州市/通川区","key":"通川区","lang":"zh-hans","lname":"Tongzhou Qu","zipex":"635000"}
+data/CN/四川省/遂宁市={"id":"data/CN/四川省/遂宁市","key":"遂宁市","lang":"zh-hans","lname":"Suining Shi","zipex":"629000","sub_keys":"安居区~船山区~大英县~蓬溪县~射洪县","sub_lnames":"Anju Qu~Chuanshan Qu~Daying Xian~Pengxi Xian~Shehong Xian","sub_zipexs":"629000~629000~629300~629100~629200"}
+data/CN/四川省/遂宁市/大英县={"id":"data/CN/四川省/遂宁市/大英县","key":"大英县","lang":"zh-hans","lname":"Daying Xian","zipex":"629300"}
+data/CN/四川省/遂宁市/安居区={"id":"data/CN/四川省/遂宁市/安居区","key":"安居区","lang":"zh-hans","lname":"Anju Qu","zipex":"629000"}
+data/CN/四川省/遂宁市/射洪县={"id":"data/CN/四川省/遂宁市/射洪县","key":"射洪县","lang":"zh-hans","lname":"Shehong Xian","zipex":"629200"}
+data/CN/四川省/遂宁市/船山区={"id":"data/CN/四川省/遂宁市/船山区","key":"船山区","lang":"zh-hans","lname":"Chuanshan Qu","zipex":"629000"}
+data/CN/四川省/遂宁市/蓬溪县={"id":"data/CN/四川省/遂宁市/蓬溪县","key":"蓬溪县","lang":"zh-hans","lname":"Pengxi Xian","zipex":"629100"}
+data/CN/四川省/阿坝藏族羌族自治州={"id":"data/CN/四川省/阿坝藏族羌族自治州","key":"阿坝藏族羌族自治州","lang":"zh-hans","lname":"Aba (Ngawa) Zhou","zipex":"624000","lfname":"Aba (Ngawa) Zangzu Qiangzu Zizhizhou","sub_keys":"阿坝县~黑水县~红原县~金川县~九寨沟县~理县~马尔康县~茂县~壤塘县~若尔盖县~松潘县~汶川县~小金县","sub_lnames":"Aba (Ngawa) Xian~Heishui Xian~Hongyuan Xian~Jinchuan (Quqên) Xian~Jiuzhaigou Xian~Li Xian~Barkam Xian~Mao Xian~Zamtang Xian~Zoǐgê Xian~Songpan (Sungqu) Xian~Wenchuan Xian~Xiaojin Xian","sub_zipexs":"624600~623500~624400~624100~623400~623100~624000~623200~624300~624500~623300~623000~624200"}
+data/CN/四川省/阿坝藏族羌族自治州/九寨沟县={"id":"data/CN/四川省/阿坝藏族羌族自治州/九寨沟县","key":"九寨沟县","lang":"zh-hans","lname":"Jiuzhaigou Xian","zipex":"623400"}
+data/CN/四川省/阿坝藏族羌族自治州/壤塘县={"id":"data/CN/四川省/阿坝藏族羌族自治州/壤塘县","key":"壤塘县","lang":"zh-hans","lname":"Zamtang Xian","zipex":"624300"}
+data/CN/四川省/阿坝藏族羌族自治州/小金县={"id":"data/CN/四川省/阿坝藏族羌族自治州/小金县","key":"小金县","lang":"zh-hans","lname":"Xiaojin Xian","zipex":"624200"}
+data/CN/四川省/阿坝藏族羌族自治州/松潘县={"id":"data/CN/四川省/阿坝藏族羌族自治州/松潘县","key":"松潘县","lang":"zh-hans","lname":"Songpan (Sungqu) Xian","zipex":"623300"}
+data/CN/四川省/阿坝藏族羌族自治州/汶川县={"id":"data/CN/四川省/阿坝藏族羌族自治州/汶川县","key":"汶川县","lang":"zh-hans","lname":"Wenchuan Xian","zipex":"623000"}
+data/CN/四川省/阿坝藏族羌族自治州/理县={"id":"data/CN/四川省/阿坝藏族羌族自治州/理县","key":"理县","lang":"zh-hans","lname":"Li Xian","zipex":"623100"}
+data/CN/四川省/阿坝藏族羌族自治州/红原县={"id":"data/CN/四川省/阿坝藏族羌族自治州/红原县","key":"红原县","lang":"zh-hans","lname":"Hongyuan Xian","zipex":"624400"}
+data/CN/四川省/阿坝藏族羌族自治州/若尔盖县={"id":"data/CN/四川省/阿坝藏族羌族自治州/若尔盖县","key":"若尔盖县","lang":"zh-hans","lname":"Zoǐgê Xian","zipex":"624500"}
+data/CN/四川省/阿坝藏族羌族自治州/茂县={"id":"data/CN/四川省/阿坝藏族羌族自治州/茂县","key":"茂县","lang":"zh-hans","lname":"Mao Xian","zipex":"623200"}
+data/CN/四川省/阿坝藏族羌族自治州/金川县={"id":"data/CN/四川省/阿坝藏族羌族自治州/金川县","key":"金川县","lang":"zh-hans","lname":"Jinchuan (Quqên) Xian","zipex":"624100"}
+data/CN/四川省/阿坝藏族羌族自治州/阿坝县={"id":"data/CN/四川省/阿坝藏族羌族自治州/阿坝县","key":"阿坝县","lang":"zh-hans","lname":"Aba (Ngawa) Xian","zipex":"624600"}
+data/CN/四川省/阿坝藏族羌族自治州/马尔康县={"id":"data/CN/四川省/阿坝藏族羌族自治州/马尔康县","key":"马尔康县","lang":"zh-hans","lname":"Barkam Xian","zipex":"624000"}
+data/CN/四川省/阿坝藏族羌族自治州/黑水县={"id":"data/CN/四川省/阿坝藏族羌族自治州/黑水县","key":"黑水县","lang":"zh-hans","lname":"Heishui Xian","zipex":"623500"}
+data/CN/四川省/雅安市={"id":"data/CN/四川省/雅安市","key":"雅安市","lang":"zh-hans","lname":"Ya'an Shi","zipex":"625000","sub_keys":"宝兴县~汉源县~芦山县~名山县~石棉县~天全县~荥经县~雨城区","sub_lnames":"Baoxing Xian~Hanyuan Xian~Lushan Xian~Mingshan Xian~Shimian Xian~Tianquan Xian~Yingjing Xian~Yucheng Qu","sub_zipexs":"625700~625300~625600~625100~625400~625500~625200~625000"}
+data/CN/四川省/雅安市/名山县={"id":"data/CN/四川省/雅安市/名山县","key":"名山县","lang":"zh-hans","lname":"Mingshan Xian","zipex":"625100"}
+data/CN/四川省/雅安市/天全县={"id":"data/CN/四川省/雅安市/天全县","key":"天全县","lang":"zh-hans","lname":"Tianquan Xian","zipex":"625500"}
+data/CN/四川省/雅安市/宝兴县={"id":"data/CN/四川省/雅安市/宝兴县","key":"宝兴县","lang":"zh-hans","lname":"Baoxing Xian","zipex":"625700"}
+data/CN/四川省/雅安市/汉源县={"id":"data/CN/四川省/雅安市/汉源县","key":"汉源县","lang":"zh-hans","lname":"Hanyuan Xian","zipex":"625300"}
+data/CN/四川省/雅安市/石棉县={"id":"data/CN/四川省/雅安市/石棉县","key":"石棉县","lang":"zh-hans","lname":"Shimian Xian","zipex":"625400"}
+data/CN/四川省/雅安市/芦山县={"id":"data/CN/四川省/雅安市/芦山县","key":"芦山县","lang":"zh-hans","lname":"Lushan Xian","zipex":"625600"}
+data/CN/四川省/雅安市/荥经县={"id":"data/CN/四川省/雅安市/荥经县","key":"荥经县","lang":"zh-hans","lname":"Yingjing Xian","zipex":"625200"}
+data/CN/四川省/雅安市/雨城区={"id":"data/CN/四川省/雅安市/雨城区","key":"雨城区","lang":"zh-hans","lname":"Yucheng Qu","zipex":"625000"}
+data/CN/天津市={"id":"data/CN/天津市","key":"天津市","lang":"zh-hans","lname":"Tianjin Shi","isoid":"12","sub_keys":"宝坻区~北辰区~滨海新区~东丽区~和平区~河北区~河东区~河西区~红桥区~蓟县~津南区~静海县~南开区~宁河县~武清区~西青区","sub_lnames":"Baodi Qu~Beichen Qu~Binhai Xinqu~Dongli Qu~Heping Qu~Hebei Qu~Hedong Qu~Hexi Qu~Hongqiao Qu~Ji Xian~Jinnan Qu~Jinghai Xian~Nankai Qu~Ninghe Xian~Wuqing Qu~Xiqing Qu","sub_zipexs":"301800~300400~300050~300300~300041~300143~300171~300202~300131~301900~300350~301600~300100~301500~301700~300380"}
+data/CN/天津市/东丽区={"id":"data/CN/天津市/东丽区","key":"东丽区","lang":"zh-hans","lname":"Dongli Qu","zipex":"300300"}
+data/CN/天津市/北辰区={"id":"data/CN/天津市/北辰区","key":"北辰区","lang":"zh-hans","lname":"Beichen Qu","zipex":"300400"}
+data/CN/天津市/南开区={"id":"data/CN/天津市/南开区","key":"南开区","lang":"zh-hans","lname":"Nankai Qu","zipex":"300100"}
+data/CN/天津市/和平区={"id":"data/CN/天津市/和平区","key":"和平区","lang":"zh-hans","lname":"Heping Qu","zipex":"300041"}
+data/CN/天津市/宁河县={"id":"data/CN/天津市/宁河县","key":"宁河县","lang":"zh-hans","lname":"Ninghe Xian","zipex":"301500"}
+data/CN/天津市/宝坻区={"id":"data/CN/天津市/宝坻区","key":"宝坻区","lang":"zh-hans","lname":"Baodi Qu","zipex":"301800"}
+data/CN/天津市/武清区={"id":"data/CN/天津市/武清区","key":"武清区","lang":"zh-hans","lname":"Wuqing Qu","zipex":"301700"}
+data/CN/天津市/河东区={"id":"data/CN/天津市/河东区","key":"河东区","lang":"zh-hans","lname":"Hedong Qu","zipex":"300171"}
+data/CN/天津市/河北区={"id":"data/CN/天津市/河北区","key":"河北区","lang":"zh-hans","lname":"Hebei Qu","zipex":"300143"}
+data/CN/天津市/河西区={"id":"data/CN/天津市/河西区","key":"河西区","lang":"zh-hans","lname":"Hexi Qu","zipex":"300202"}
+data/CN/天津市/津南区={"id":"data/CN/天津市/津南区","key":"津南区","lang":"zh-hans","lname":"Jinnan Qu","zipex":"300350"}
+data/CN/天津市/滨海新区={"id":"data/CN/天津市/滨海新区","key":"滨海新区","lang":"zh-hans","lname":"Binhai Xinqu","zipex":"300050"}
+data/CN/天津市/红桥区={"id":"data/CN/天津市/红桥区","key":"红桥区","lang":"zh-hans","lname":"Hongqiao Qu","zipex":"300131"}
+data/CN/天津市/蓟县={"id":"data/CN/天津市/蓟县","key":"蓟县","lang":"zh-hans","lname":"Ji Xian","zipex":"301900"}
+data/CN/天津市/西青区={"id":"data/CN/天津市/西青区","key":"西青区","lang":"zh-hans","lname":"Xiqing Qu","zipex":"300380"}
+data/CN/天津市/静海县={"id":"data/CN/天津市/静海县","key":"静海县","lang":"zh-hans","lname":"Jinghai Xian","zipex":"301600"}
+data/CN/宁夏={"id":"data/CN/宁夏","key":"宁夏","lang":"zh-hans","lname":"Ningxia","isoid":"64","sub_keys":"固原市~石嘴山市~吴忠市~银川市~中卫市","sub_lnames":"Guyuan Shi~Shizuishan Shi~Wuzhong Shi~Yinchuan Shi~Zhongwei Shi","sub_zipexs":"756000~753000~751100~750004~751700","sub_mores":"true~true~true~true~true"}
+data/CN/宁夏/中卫市={"id":"data/CN/宁夏/中卫市","key":"中卫市","lang":"zh-hans","lname":"Zhongwei Shi","zipex":"751700","sub_keys":"海原县~沙坡头区~中宁县","sub_lnames":"Haiyuan Xian~Shapotou Qu~Zhongning Xian","sub_zipexs":"751800~751700~751200"}
+data/CN/宁夏/中卫市/中宁县={"id":"data/CN/宁夏/中卫市/中宁县","key":"中宁县","lang":"zh-hans","lname":"Zhongning Xian","zipex":"751200"}
+data/CN/宁夏/中卫市/沙坡头区={"id":"data/CN/宁夏/中卫市/沙坡头区","key":"沙坡头区","lang":"zh-hans","lname":"Shapotou Qu","zipex":"751700"}
+data/CN/宁夏/中卫市/海原县={"id":"data/CN/宁夏/中卫市/海原县","key":"海原县","lang":"zh-hans","lname":"Haiyuan Xian","zipex":"751800"}
+data/CN/宁夏/吴忠市={"id":"data/CN/宁夏/吴忠市","key":"吴忠市","lang":"zh-hans","lname":"Wuzhong Shi","zipex":"751100","sub_keys":"利通区~青铜峡市~同心县~盐池县","sub_lnames":"Litong Qu~Qingtongxia Shi~Tongxin Xian~Yanchi Xian","sub_zipexs":"751100~751600~751300~751500"}
+data/CN/宁夏/吴忠市/利通区={"id":"data/CN/宁夏/吴忠市/利通区","key":"利通区","lang":"zh-hans","lname":"Litong Qu","zipex":"751100"}
+data/CN/宁夏/吴忠市/同心县={"id":"data/CN/宁夏/吴忠市/同心县","key":"同心县","lang":"zh-hans","lname":"Tongxin Xian","zipex":"751300"}
+data/CN/宁夏/吴忠市/盐池县={"id":"data/CN/宁夏/吴忠市/盐池县","key":"盐池县","lang":"zh-hans","lname":"Yanchi Xian","zipex":"751500"}
+data/CN/宁夏/吴忠市/青铜峡市={"id":"data/CN/宁夏/吴忠市/青铜峡市","key":"青铜峡市","lang":"zh-hans","lname":"Qingtongxia Shi","zipex":"751600"}
+data/CN/宁夏/固原市={"id":"data/CN/宁夏/固原市","key":"固原市","lang":"zh-hans","lname":"Guyuan Shi","zipex":"756000","sub_keys":"泾源县~隆德县~彭阳县~西吉县~原州区","sub_lnames":"Jingyuan Xian~Longde Xian~Pengyang Xian~Xiji Xian~Yuanzhou Qu","sub_zipexs":"756400~756300~756500~756200~756000"}
+data/CN/宁夏/固原市/原州区={"id":"data/CN/宁夏/固原市/原州区","key":"原州区","lang":"zh-hans","lname":"Yuanzhou Qu","zipex":"756000"}
+data/CN/宁夏/固原市/彭阳县={"id":"data/CN/宁夏/固原市/彭阳县","key":"彭阳县","lang":"zh-hans","lname":"Pengyang Xian","zipex":"756500"}
+data/CN/宁夏/固原市/泾源县={"id":"data/CN/宁夏/固原市/泾源县","key":"泾源县","lang":"zh-hans","lname":"Jingyuan Xian","zipex":"756400"}
+data/CN/宁夏/固原市/西吉县={"id":"data/CN/宁夏/固原市/西吉县","key":"西吉县","lang":"zh-hans","lname":"Xiji Xian","zipex":"756200"}
+data/CN/宁夏/固原市/隆德县={"id":"data/CN/宁夏/固原市/隆德县","key":"隆德县","lang":"zh-hans","lname":"Longde Xian","zipex":"756300"}
+data/CN/宁夏/石嘴山市={"id":"data/CN/宁夏/石嘴山市","key":"石嘴山市","lang":"zh-hans","lname":"Shizuishan Shi","zipex":"753000","sub_keys":"大武口区~惠农区~平罗县","sub_lnames":"Dawukou Qu~Huinong Qu~Pingluo Xian","sub_zipexs":"753000~753200~753400"}
+data/CN/宁夏/石嘴山市/大武口区={"id":"data/CN/宁夏/石嘴山市/大武口区","key":"大武口区","lang":"zh-hans","lname":"Dawukou Qu","zipex":"753000"}
+data/CN/宁夏/石嘴山市/平罗县={"id":"data/CN/宁夏/石嘴山市/平罗县","key":"平罗县","lang":"zh-hans","lname":"Pingluo Xian","zipex":"753400"}
+data/CN/宁夏/石嘴山市/惠农区={"id":"data/CN/宁夏/石嘴山市/惠农区","key":"惠农区","lang":"zh-hans","lname":"Huinong Qu","zipex":"753200"}
+data/CN/宁夏/银川市={"id":"data/CN/宁夏/银川市","key":"银川市","lang":"zh-hans","lname":"Yinchuan Shi","zipex":"750004","sub_keys":"贺兰县~金凤区~灵武市~西夏区~兴庆区~永宁县","sub_lnames":"Helan Xian~Jinfeng Qu~Lingwu Shi~Xixia Qu~Xingqing Qu~Yongning Xian","sub_zipexs":"750200~750011~750400~750027~750001~750100"}
+data/CN/宁夏/银川市/兴庆区={"id":"data/CN/宁夏/银川市/兴庆区","key":"兴庆区","lang":"zh-hans","lname":"Xingqing Qu","zipex":"750001"}
+data/CN/宁夏/银川市/永宁县={"id":"data/CN/宁夏/银川市/永宁县","key":"永宁县","lang":"zh-hans","lname":"Yongning Xian","zipex":"750100"}
+data/CN/宁夏/银川市/灵武市={"id":"data/CN/宁夏/银川市/灵武市","key":"灵武市","lang":"zh-hans","lname":"Lingwu Shi","zipex":"750400"}
+data/CN/宁夏/银川市/西夏区={"id":"data/CN/宁夏/银川市/西夏区","key":"西夏区","lang":"zh-hans","lname":"Xixia Qu","zipex":"750027"}
+data/CN/宁夏/银川市/贺兰县={"id":"data/CN/宁夏/银川市/贺兰县","key":"贺兰县","lang":"zh-hans","lname":"Helan Xian","zipex":"750200"}
+data/CN/宁夏/银川市/金凤区={"id":"data/CN/宁夏/银川市/金凤区","key":"金凤区","lang":"zh-hans","lname":"Jinfeng Qu","zipex":"750011"}
+data/CN/安徽省={"id":"data/CN/安徽省","key":"安徽省","lang":"zh-hans","lname":"Anhui Sheng","isoid":"34","sub_keys":"安庆市~蚌埠市~亳州市~巢湖市~池州市~滁州市~阜阳市~合肥市~淮北市~淮南市~黄山市~六安市~马鞍山市~宿州市~铜陵市~芜湖市~宣城市","sub_lnames":"Anqing Shi~Bengbu Shi~Bozhou Shi~Chaohu Shi~Chizhou Shi~Chuzhou Shi~Fuyang Shi~Hefei Shi~Huaibei Shi~Huainan Shi~Huangshan Shi~Lu'an Shi~Ma'anshan Shi~Suzhou Shi~Tongling shi~Wuhu Shi~Xuancheng Shi","sub_zipexs":"246001~233000~236802~238000~247100~239001~236033~230001~235000~232000~245000~237002~243000~234000~244000~241000~242000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/安徽省/亳州市={"id":"data/CN/安徽省/亳州市","key":"亳州市","lang":"zh-hans","lname":"Bozhou Shi","zipex":"236802","sub_keys":"利辛县~蒙城县~谯城区~涡阳县","sub_lnames":"Lixin Xian~Mengcheng Xian~Qiaocheng Qu~Guoyang Xian","sub_zipexs":"236702~233500~236800~233601"}
+data/CN/安徽省/亳州市/利辛县={"id":"data/CN/安徽省/亳州市/利辛县","key":"利辛县","lang":"zh-hans","lname":"Lixin Xian","zipex":"236702"}
+data/CN/安徽省/亳州市/涡阳县={"id":"data/CN/安徽省/亳州市/涡阳县","key":"涡阳县","lang":"zh-hans","lname":"Guoyang Xian","zipex":"233601"}
+data/CN/安徽省/亳州市/蒙城县={"id":"data/CN/安徽省/亳州市/蒙城县","key":"蒙城县","lang":"zh-hans","lname":"Mengcheng Xian","zipex":"233500"}
+data/CN/安徽省/亳州市/谯城区={"id":"data/CN/安徽省/亳州市/谯城区","key":"谯城区","lang":"zh-hans","lname":"Qiaocheng Qu","zipex":"236800"}
+data/CN/安徽省/六安市={"id":"data/CN/安徽省/六安市","key":"六安市","lang":"zh-hans","lname":"Lu'an Shi","zipex":"237002","sub_keys":"霍邱县~霍山县~金安区~金寨县~寿县~舒城县~裕安区","sub_lnames":"Huoqiu Xian~Huoshan Xian~Jin'an Qu~Jinzhai Xian~Shou Xian~Shucheng Xian~Yu'an Qu","sub_zipexs":"237400~237200~237005~237300~232200~231300~237000"}
+data/CN/安徽省/六安市/寿县={"id":"data/CN/安徽省/六安市/寿县","key":"寿县","lang":"zh-hans","lname":"Shou Xian","zipex":"232200"}
+data/CN/安徽省/六安市/舒城县={"id":"data/CN/安徽省/六安市/舒城县","key":"舒城县","lang":"zh-hans","lname":"Shucheng Xian","zipex":"231300"}
+data/CN/安徽省/六安市/裕安区={"id":"data/CN/安徽省/六安市/裕安区","key":"裕安区","lang":"zh-hans","lname":"Yu'an Qu","zipex":"237000"}
+data/CN/安徽省/六安市/金安区={"id":"data/CN/安徽省/六安市/金安区","key":"金安区","lang":"zh-hans","lname":"Jin'an Qu","zipex":"237005"}
+data/CN/安徽省/六安市/金寨县={"id":"data/CN/安徽省/六安市/金寨县","key":"金寨县","lang":"zh-hans","lname":"Jinzhai Xian","zipex":"237300"}
+data/CN/安徽省/六安市/霍山县={"id":"data/CN/安徽省/六安市/霍山县","key":"霍山县","lang":"zh-hans","lname":"Huoshan Xian","zipex":"237200"}
+data/CN/安徽省/六安市/霍邱县={"id":"data/CN/安徽省/六安市/霍邱县","key":"霍邱县","lang":"zh-hans","lname":"Huoqiu Xian","zipex":"237400"}
+data/CN/安徽省/合肥市={"id":"data/CN/安徽省/合肥市","key":"合肥市","lang":"zh-hans","lname":"Hefei Shi","zipex":"230001","sub_keys":"包河区~长丰县~肥东县~肥西县~庐阳区~蜀山区~瑶海区","sub_lnames":"Baohe Qu~Changfeng Xian~Feidong Xian~Feixi Xian~Luyang Qu~Shushan Qu~Yaohai Qu","sub_zipexs":"230041~231100~231600~231200~230001~230061~230011"}
+data/CN/安徽省/合肥市/包河区={"id":"data/CN/安徽省/合肥市/包河区","key":"包河区","lang":"zh-hans","lname":"Baohe Qu","zipex":"230041"}
+data/CN/安徽省/合肥市/庐阳区={"id":"data/CN/安徽省/合肥市/庐阳区","key":"庐阳区","lang":"zh-hans","lname":"Luyang Qu","zipex":"230001"}
+data/CN/安徽省/合肥市/瑶海区={"id":"data/CN/安徽省/合肥市/瑶海区","key":"瑶海区","lang":"zh-hans","lname":"Yaohai Qu","zipex":"230011"}
+data/CN/安徽省/合肥市/肥东县={"id":"data/CN/安徽省/合肥市/肥东县","key":"肥东县","lang":"zh-hans","lname":"Feidong Xian","zipex":"231600"}
+data/CN/安徽省/合肥市/肥西县={"id":"data/CN/安徽省/合肥市/肥西县","key":"肥西县","lang":"zh-hans","lname":"Feixi Xian","zipex":"231200"}
+data/CN/安徽省/合肥市/蜀山区={"id":"data/CN/安徽省/合肥市/蜀山区","key":"蜀山区","lang":"zh-hans","lname":"Shushan Qu","zipex":"230061"}
+data/CN/安徽省/合肥市/长丰县={"id":"data/CN/安徽省/合肥市/长丰县","key":"长丰县","lang":"zh-hans","lname":"Changfeng Xian","zipex":"231100"}
+data/CN/安徽省/安庆市={"id":"data/CN/安徽省/安庆市","key":"安庆市","lang":"zh-hans","lname":"Anqing Shi","zipex":"246001","sub_keys":"枞阳县~大观区~怀宁县~潜山县~宿松县~太湖县~桐城市~望江县~宜秀区~迎江区~岳西县","sub_lnames":"Zongyang Xian~Daguan Qu~Huaining Xian~Qianshan Xian~Susong Xian~Taihu Xian~Tongcheng Shi~Wangjiang Xian~Yixiu Qu~Yingjiang Qu~Yuexi Xian","sub_zipexs":"246700~246004~246100~246300~246500~246400~231402~246200~246003~246003~246600"}
+data/CN/安徽省/安庆市/大观区={"id":"data/CN/安徽省/安庆市/大观区","key":"大观区","lang":"zh-hans","lname":"Daguan Qu","zipex":"246004"}
+data/CN/安徽省/安庆市/太湖县={"id":"data/CN/安徽省/安庆市/太湖县","key":"太湖县","lang":"zh-hans","lname":"Taihu Xian","zipex":"246400"}
+data/CN/安徽省/安庆市/宜秀区={"id":"data/CN/安徽省/安庆市/宜秀区","key":"宜秀区","lang":"zh-hans","lname":"Yixiu Qu","zipex":"246003"}
+data/CN/安徽省/安庆市/宿松县={"id":"data/CN/安徽省/安庆市/宿松县","key":"宿松县","lang":"zh-hans","lname":"Susong Xian","zipex":"246500"}
+data/CN/安徽省/安庆市/岳西县={"id":"data/CN/安徽省/安庆市/岳西县","key":"岳西县","lang":"zh-hans","lname":"Yuexi Xian","zipex":"246600"}
+data/CN/安徽省/安庆市/怀宁县={"id":"data/CN/安徽省/安庆市/怀宁县","key":"怀宁县","lang":"zh-hans","lname":"Huaining Xian","zipex":"246100"}
+data/CN/安徽省/安庆市/望江县={"id":"data/CN/安徽省/安庆市/望江县","key":"望江县","lang":"zh-hans","lname":"Wangjiang Xian","zipex":"246200"}
+data/CN/安徽省/安庆市/枞阳县={"id":"data/CN/安徽省/安庆市/枞阳县","key":"枞阳县","lang":"zh-hans","lname":"Zongyang Xian","zipex":"246700"}
+data/CN/安徽省/安庆市/桐城市={"id":"data/CN/安徽省/安庆市/桐城市","key":"桐城市","lang":"zh-hans","lname":"Tongcheng Shi","zipex":"231402"}
+data/CN/安徽省/安庆市/潜山县={"id":"data/CN/安徽省/安庆市/潜山县","key":"潜山县","lang":"zh-hans","lname":"Qianshan Xian","zipex":"246300"}
+data/CN/安徽省/安庆市/迎江区={"id":"data/CN/安徽省/安庆市/迎江区","key":"迎江区","lang":"zh-hans","lname":"Yingjiang Qu","zipex":"246003"}
+data/CN/安徽省/宣城市={"id":"data/CN/安徽省/宣城市","key":"宣城市","lang":"zh-hans","lname":"Xuancheng Shi","zipex":"242000","sub_keys":"广德县~绩溪县~泾县~旌德县~郎溪县~宁国市~宣州区","sub_lnames":"Guangde Xian~Jixi Xian~Jing Xian~Jingde Xian~Langxi Xian~Ningguo Shi~Xuanzhou Qu","sub_zipexs":"242200~245300~242500~242600~242100~242300~242000"}
+data/CN/安徽省/宣城市/宁国市={"id":"data/CN/安徽省/宣城市/宁国市","key":"宁国市","lang":"zh-hans","lname":"Ningguo Shi","zipex":"242300"}
+data/CN/安徽省/宣城市/宣州区={"id":"data/CN/安徽省/宣城市/宣州区","key":"宣州区","lang":"zh-hans","lname":"Xuanzhou Qu","zipex":"242000"}
+data/CN/安徽省/宣城市/广德县={"id":"data/CN/安徽省/宣城市/广德县","key":"广德县","lang":"zh-hans","lname":"Guangde Xian","zipex":"242200"}
+data/CN/安徽省/宣城市/旌德县={"id":"data/CN/安徽省/宣城市/旌德县","key":"旌德县","lang":"zh-hans","lname":"Jingde Xian","zipex":"242600"}
+data/CN/安徽省/宣城市/泾县={"id":"data/CN/安徽省/宣城市/泾县","key":"泾县","lang":"zh-hans","lname":"Jing Xian","zipex":"242500"}
+data/CN/安徽省/宣城市/绩溪县={"id":"data/CN/安徽省/宣城市/绩溪县","key":"绩溪县","lang":"zh-hans","lname":"Jixi Xian","zipex":"245300"}
+data/CN/安徽省/宣城市/郎溪县={"id":"data/CN/安徽省/宣城市/郎溪县","key":"郎溪县","lang":"zh-hans","lname":"Langxi Xian","zipex":"242100"}
+data/CN/安徽省/宿州市={"id":"data/CN/安徽省/宿州市","key":"宿州市","lang":"zh-hans","lname":"Suzhou Shi","zipex":"234000","sub_keys":"砀山县~灵璧县~泗县~萧县~埇桥区","sub_lnames":"Dangshan Xian~Lingbi Xian~Si Xian~Xiao Xian~Yongqiao Qu","sub_zipexs":"235300~234200~234300~235200~234000"}
+data/CN/安徽省/宿州市/埇桥区={"id":"data/CN/安徽省/宿州市/埇桥区","key":"埇桥区","lang":"zh-hans","lname":"Yongqiao Qu","zipex":"234000"}
+data/CN/安徽省/宿州市/泗县={"id":"data/CN/安徽省/宿州市/泗县","key":"泗县","lang":"zh-hans","lname":"Si Xian","zipex":"234300"}
+data/CN/安徽省/宿州市/灵璧县={"id":"data/CN/安徽省/宿州市/灵璧县","key":"灵璧县","lang":"zh-hans","lname":"Lingbi Xian","zipex":"234200"}
+data/CN/安徽省/宿州市/砀山县={"id":"data/CN/安徽省/宿州市/砀山县","key":"砀山县","lang":"zh-hans","lname":"Dangshan Xian","zipex":"235300"}
+data/CN/安徽省/宿州市/萧县={"id":"data/CN/安徽省/宿州市/萧县","key":"萧县","lang":"zh-hans","lname":"Xiao Xian","zipex":"235200"}
+data/CN/安徽省/巢湖市={"id":"data/CN/安徽省/巢湖市","key":"巢湖市","lang":"zh-hans","lname":"Chaohu Shi","zipex":"238000","sub_keys":"含山县~和县~居巢区~庐江县~无为县","sub_lnames":"Hanshan Xian~He Xian~Juchao Qu~Lujiang Xian~Wuwei Xian","sub_zipexs":"238100~238200~238000~231500~238300"}
+data/CN/安徽省/巢湖市/含山县={"id":"data/CN/安徽省/巢湖市/含山县","key":"含山县","lang":"zh-hans","lname":"Hanshan Xian","zipex":"238100"}
+data/CN/安徽省/巢湖市/和县={"id":"data/CN/安徽省/巢湖市/和县","key":"和县","lang":"zh-hans","lname":"He Xian","zipex":"238200"}
+data/CN/安徽省/巢湖市/居巢区={"id":"data/CN/安徽省/巢湖市/居巢区","key":"居巢区","lang":"zh-hans","lname":"Juchao Qu","zipex":"238000"}
+data/CN/安徽省/巢湖市/庐江县={"id":"data/CN/安徽省/巢湖市/庐江县","key":"庐江县","lang":"zh-hans","lname":"Lujiang Xian","zipex":"231500"}
+data/CN/安徽省/巢湖市/无为县={"id":"data/CN/安徽省/巢湖市/无为县","key":"无为县","lang":"zh-hans","lname":"Wuwei Xian","zipex":"238300"}
+data/CN/安徽省/池州市={"id":"data/CN/安徽省/池州市","key":"池州市","lang":"zh-hans","lname":"Chizhou Shi","zipex":"247100","sub_keys":"东至县~贵池区~青阳县~石台县","sub_lnames":"Dongzhi Xian~Guichi Qu~Qingyang Xian~Shitai Xian","sub_zipexs":"247200~247100~242800~245101"}
+data/CN/安徽省/池州市/东至县={"id":"data/CN/安徽省/池州市/东至县","key":"东至县","lang":"zh-hans","lname":"Dongzhi Xian","zipex":"247200"}
+data/CN/安徽省/池州市/石台县={"id":"data/CN/安徽省/池州市/石台县","key":"石台县","lang":"zh-hans","lname":"Shitai Xian","zipex":"245101"}
+data/CN/安徽省/池州市/贵池区={"id":"data/CN/安徽省/池州市/贵池区","key":"贵池区","lang":"zh-hans","lname":"Guichi Qu","zipex":"247100"}
+data/CN/安徽省/池州市/青阳县={"id":"data/CN/安徽省/池州市/青阳县","key":"青阳县","lang":"zh-hans","lname":"Qingyang Xian","zipex":"242800"}
+data/CN/安徽省/淮北市={"id":"data/CN/安徽省/淮北市","key":"淮北市","lang":"zh-hans","lname":"Huaibei Shi","zipex":"235000","sub_keys":"杜集区~烈山区~濉溪县~相山区","sub_lnames":"Duji Qu~Lieshan Qu~Suixi Xian~Xiangshan Qu","sub_zipexs":"235047~235025~235100~235000"}
+data/CN/安徽省/淮北市/杜集区={"id":"data/CN/安徽省/淮北市/杜集区","key":"杜集区","lang":"zh-hans","lname":"Duji Qu","zipex":"235047"}
+data/CN/安徽省/淮北市/濉溪县={"id":"data/CN/安徽省/淮北市/濉溪县","key":"濉溪县","lang":"zh-hans","lname":"Suixi Xian","zipex":"235100"}
+data/CN/安徽省/淮北市/烈山区={"id":"data/CN/安徽省/淮北市/烈山区","key":"烈山区","lang":"zh-hans","lname":"Lieshan Qu","zipex":"235025"}
+data/CN/安徽省/淮北市/相山区={"id":"data/CN/安徽省/淮北市/相山区","key":"相山区","lang":"zh-hans","lname":"Xiangshan Qu","zipex":"235000"}
+data/CN/安徽省/淮南市={"id":"data/CN/安徽省/淮南市","key":"淮南市","lang":"zh-hans","lname":"Huainan Shi","zipex":"232000","sub_keys":"八公山区~大通区~凤台县~潘集区~田家庵区~谢家集区","sub_lnames":"Bagongshan Qu~Datong Qu~Fengtai Xian~Panji Qu~Tianjia'an Qu~Xiejiaji Qu","sub_zipexs":"232072~232033~232100~232082~232000~232052"}
+data/CN/安徽省/淮南市/八公山区={"id":"data/CN/安徽省/淮南市/八公山区","key":"八公山区","lang":"zh-hans","lname":"Bagongshan Qu","zipex":"232072"}
+data/CN/安徽省/淮南市/凤台县={"id":"data/CN/安徽省/淮南市/凤台县","key":"凤台县","lang":"zh-hans","lname":"Fengtai Xian","zipex":"232100"}
+data/CN/安徽省/淮南市/大通区={"id":"data/CN/安徽省/淮南市/大通区","key":"大通区","lang":"zh-hans","lname":"Datong Qu","zipex":"232033"}
+data/CN/安徽省/淮南市/潘集区={"id":"data/CN/安徽省/淮南市/潘集区","key":"潘集区","lang":"zh-hans","lname":"Panji Qu","zipex":"232082"}
+data/CN/安徽省/淮南市/田家庵区={"id":"data/CN/安徽省/淮南市/田家庵区","key":"田家庵区","lang":"zh-hans","lname":"Tianjia'an Qu","zipex":"232000"}
+data/CN/安徽省/淮南市/谢家集区={"id":"data/CN/安徽省/淮南市/谢家集区","key":"谢家集区","lang":"zh-hans","lname":"Xiejiaji Qu","zipex":"232052"}
+data/CN/安徽省/滁州市={"id":"data/CN/安徽省/滁州市","key":"滁州市","lang":"zh-hans","lname":"Chuzhou Shi","zipex":"239001","sub_keys":"定远县~凤阳县~来安县~琅琊区~明光市~南谯区~全椒县~天长市","sub_lnames":"Dingyuan Xian~Fengyang Xian~Lai'an Xian~Liangya Qu~Mingguang Shi~Nanqiao Qu~Quanjiao Xian~Tianchang Shi","sub_zipexs":"233201~233100~239200~238058~239400~239001~239500~239300"}
+data/CN/安徽省/滁州市/全椒县={"id":"data/CN/安徽省/滁州市/全椒县","key":"全椒县","lang":"zh-hans","lname":"Quanjiao Xian","zipex":"239500"}
+data/CN/安徽省/滁州市/凤阳县={"id":"data/CN/安徽省/滁州市/凤阳县","key":"凤阳县","lang":"zh-hans","lname":"Fengyang Xian","zipex":"233100"}
+data/CN/安徽省/滁州市/南谯区={"id":"data/CN/安徽省/滁州市/南谯区","key":"南谯区","lang":"zh-hans","lname":"Nanqiao Qu","zipex":"239001"}
+data/CN/安徽省/滁州市/天长市={"id":"data/CN/安徽省/滁州市/天长市","key":"天长市","lang":"zh-hans","lname":"Tianchang Shi","zipex":"239300"}
+data/CN/安徽省/滁州市/定远县={"id":"data/CN/安徽省/滁州市/定远县","key":"定远县","lang":"zh-hans","lname":"Dingyuan Xian","zipex":"233201"}
+data/CN/安徽省/滁州市/明光市={"id":"data/CN/安徽省/滁州市/明光市","key":"明光市","lang":"zh-hans","lname":"Mingguang Shi","zipex":"239400"}
+data/CN/安徽省/滁州市/来安县={"id":"data/CN/安徽省/滁州市/来安县","key":"来安县","lang":"zh-hans","lname":"Lai'an Xian","zipex":"239200"}
+data/CN/安徽省/滁州市/琅琊区={"id":"data/CN/安徽省/滁州市/琅琊区","key":"琅琊区","lang":"zh-hans","lname":"Liangya Qu","zipex":"238058"}
+data/CN/安徽省/芜湖市={"id":"data/CN/安徽省/芜湖市","key":"芜湖市","lang":"zh-hans","lname":"Wuhu Shi","zipex":"241000","sub_keys":"繁昌县~镜湖区~鸠江区~南陵县~三山区~芜湖县~弋江区","sub_lnames":"Fanchang Xian~Jinghu Qu~Jiujiang Qu~Nanling Xian~Sanshan Qu~Wuhu Xian~Yijiang Qu","sub_zipexs":"241200~241000~241000~241300~241000~241100~241002"}
+data/CN/安徽省/芜湖市/三山区={"id":"data/CN/安徽省/芜湖市/三山区","key":"三山区","lang":"zh-hans","lname":"Sanshan Qu","zipex":"241000"}
+data/CN/安徽省/芜湖市/南陵县={"id":"data/CN/安徽省/芜湖市/南陵县","key":"南陵县","lang":"zh-hans","lname":"Nanling Xian","zipex":"241300"}
+data/CN/安徽省/芜湖市/弋江区={"id":"data/CN/安徽省/芜湖市/弋江区","key":"弋江区","lang":"zh-hans","lname":"Yijiang Qu","zipex":"241002"}
+data/CN/安徽省/芜湖市/繁昌县={"id":"data/CN/安徽省/芜湖市/繁昌县","key":"繁昌县","lang":"zh-hans","lname":"Fanchang Xian","zipex":"241200"}
+data/CN/安徽省/芜湖市/芜湖县={"id":"data/CN/安徽省/芜湖市/芜湖县","key":"芜湖县","lang":"zh-hans","lname":"Wuhu Xian","zipex":"241100"}
+data/CN/安徽省/芜湖市/镜湖区={"id":"data/CN/安徽省/芜湖市/镜湖区","key":"镜湖区","lang":"zh-hans","lname":"Jinghu Qu","zipex":"241000"}
+data/CN/安徽省/芜湖市/鸠江区={"id":"data/CN/安徽省/芜湖市/鸠江区","key":"鸠江区","lang":"zh-hans","lname":"Jiujiang Qu","zipex":"241000"}
+data/CN/安徽省/蚌埠市={"id":"data/CN/安徽省/蚌埠市","key":"蚌埠市","lang":"zh-hans","lname":"Bengbu Shi","zipex":"233000","sub_keys":"蚌山区~固镇县~怀远县~淮上区~龙子湖区~五河县~禹会区","sub_lnames":"Bengshan Qu~Guzhen Xian~Huaiyuan Xian~Huaishang Qu~Longzihu Qu~Wuhe Xian~Yuhui Qu","sub_zipexs":"233000~233700~233400~233002~233000~233300~233010"}
+data/CN/安徽省/蚌埠市/五河县={"id":"data/CN/安徽省/蚌埠市/五河县","key":"五河县","lang":"zh-hans","lname":"Wuhe Xian","zipex":"233300"}
+data/CN/安徽省/蚌埠市/固镇县={"id":"data/CN/安徽省/蚌埠市/固镇县","key":"固镇县","lang":"zh-hans","lname":"Guzhen Xian","zipex":"233700"}
+data/CN/安徽省/蚌埠市/怀远县={"id":"data/CN/安徽省/蚌埠市/怀远县","key":"怀远县","lang":"zh-hans","lname":"Huaiyuan Xian","zipex":"233400"}
+data/CN/安徽省/蚌埠市/淮上区={"id":"data/CN/安徽省/蚌埠市/淮上区","key":"淮上区","lang":"zh-hans","lname":"Huaishang Qu","zipex":"233002"}
+data/CN/安徽省/蚌埠市/禹会区={"id":"data/CN/安徽省/蚌埠市/禹会区","key":"禹会区","lang":"zh-hans","lname":"Yuhui Qu","zipex":"233010"}
+data/CN/安徽省/蚌埠市/蚌山区={"id":"data/CN/安徽省/蚌埠市/蚌山区","key":"蚌山区","lang":"zh-hans","lname":"Bengshan Qu","zipex":"233000"}
+data/CN/安徽省/蚌埠市/龙子湖区={"id":"data/CN/安徽省/蚌埠市/龙子湖区","key":"龙子湖区","lang":"zh-hans","lname":"Longzihu Qu","zipex":"233000"}
+data/CN/安徽省/铜陵市={"id":"data/CN/安徽省/铜陵市","key":"铜陵市","lang":"zh-hans","lname":"Tongling shi","zipex":"244000","sub_keys":"郊区~狮子山区~铜官山区~铜陵县","sub_lnames":"Jiao Qu~Shizishan Qu~Tongguanshan Qu~Tongling Xian","sub_zipexs":"244000~244031~244000~244100"}
+data/CN/安徽省/铜陵市/狮子山区={"id":"data/CN/安徽省/铜陵市/狮子山区","key":"狮子山区","lang":"zh-hans","lname":"Shizishan Qu","zipex":"244031"}
+data/CN/安徽省/铜陵市/郊区={"id":"data/CN/安徽省/铜陵市/郊区","key":"郊区","lang":"zh-hans","lname":"Jiao Qu","zipex":"244000"}
+data/CN/安徽省/铜陵市/铜官山区={"id":"data/CN/安徽省/铜陵市/铜官山区","key":"铜官山区","lang":"zh-hans","lname":"Tongguanshan Qu","zipex":"244000"}
+data/CN/安徽省/铜陵市/铜陵县={"id":"data/CN/安徽省/铜陵市/铜陵县","key":"铜陵县","lang":"zh-hans","lname":"Tongling Xian","zipex":"244100"}
+data/CN/安徽省/阜阳市={"id":"data/CN/安徽省/阜阳市","key":"阜阳市","lang":"zh-hans","lname":"Fuyang Shi","zipex":"236033","sub_keys":"阜南县~界首市~临泉县~太和县~颍东区~颍泉区~颍上县~颍州区","sub_lnames":"Funan Xian~Jieshou Shi~Linquan Xian~Taihe Xian~Yingdong Qu~Yingquan Qu~Yingshang Xian~Yingzhou Qu","sub_zipexs":"236200~236501~236400~236601~236033~236033~236201~236033"}
+data/CN/安徽省/阜阳市/临泉县={"id":"data/CN/安徽省/阜阳市/临泉县","key":"临泉县","lang":"zh-hans","lname":"Linquan Xian","zipex":"236400"}
+data/CN/安徽省/阜阳市/太和县={"id":"data/CN/安徽省/阜阳市/太和县","key":"太和县","lang":"zh-hans","lname":"Taihe Xian","zipex":"236601"}
+data/CN/安徽省/阜阳市/界首市={"id":"data/CN/安徽省/阜阳市/界首市","key":"界首市","lang":"zh-hans","lname":"Jieshou Shi","zipex":"236501"}
+data/CN/安徽省/阜阳市/阜南县={"id":"data/CN/安徽省/阜阳市/阜南县","key":"阜南县","lang":"zh-hans","lname":"Funan Xian","zipex":"236200"}
+data/CN/安徽省/阜阳市/颍上县={"id":"data/CN/安徽省/阜阳市/颍上县","key":"颍上县","lang":"zh-hans","lname":"Yingshang Xian","zipex":"236201"}
+data/CN/安徽省/阜阳市/颍东区={"id":"data/CN/安徽省/阜阳市/颍东区","key":"颍东区","lang":"zh-hans","lname":"Yingdong Qu","zipex":"236033"}
+data/CN/安徽省/阜阳市/颍州区={"id":"data/CN/安徽省/阜阳市/颍州区","key":"颍州区","lang":"zh-hans","lname":"Yingzhou Qu","zipex":"236033"}
+data/CN/安徽省/阜阳市/颍泉区={"id":"data/CN/安徽省/阜阳市/颍泉区","key":"颍泉区","lang":"zh-hans","lname":"Yingquan Qu","zipex":"236033"}
+data/CN/安徽省/马鞍山市={"id":"data/CN/安徽省/马鞍山市","key":"马鞍山市","lang":"zh-hans","lname":"Ma'anshan Shi","zipex":"243000","sub_keys":"当涂县~花山区~金家庄区~雨山区","sub_lnames":"Dangtu Xian~Huashan Qu~Jinjiazhuang Qu~Yushan Qu","sub_zipexs":"243100~243000~243021~243011"}
+data/CN/安徽省/马鞍山市/当涂县={"id":"data/CN/安徽省/马鞍山市/当涂县","key":"当涂县","lang":"zh-hans","lname":"Dangtu Xian","zipex":"243100"}
+data/CN/安徽省/马鞍山市/花山区={"id":"data/CN/安徽省/马鞍山市/花山区","key":"花山区","lang":"zh-hans","lname":"Huashan Qu","zipex":"243000"}
+data/CN/安徽省/马鞍山市/金家庄区={"id":"data/CN/安徽省/马鞍山市/金家庄区","key":"金家庄区","lang":"zh-hans","lname":"Jinjiazhuang Qu","zipex":"243021"}
+data/CN/安徽省/马鞍山市/雨山区={"id":"data/CN/安徽省/马鞍山市/雨山区","key":"雨山区","lang":"zh-hans","lname":"Yushan Qu","zipex":"243011"}
+data/CN/安徽省/黄山市={"id":"data/CN/安徽省/黄山市","key":"黄山市","lang":"zh-hans","lname":"Huangshan Shi","zipex":"245000","sub_keys":"黄山区~徽州区~祁门县~屯溪区~歙县~休宁县~黟县","sub_lnames":"Huangshan Qu~Huizhou Qu~Qimen Xian~Tunxi Qu~She Xian~Xiuning Xian~Yi Xian","sub_zipexs":"242700~245061~245600~245000~245200~245400~245500"}
+data/CN/安徽省/黄山市/休宁县={"id":"data/CN/安徽省/黄山市/休宁县","key":"休宁县","lang":"zh-hans","lname":"Xiuning Xian","zipex":"245400"}
+data/CN/安徽省/黄山市/屯溪区={"id":"data/CN/安徽省/黄山市/屯溪区","key":"屯溪区","lang":"zh-hans","lname":"Tunxi Qu","zipex":"245000"}
+data/CN/安徽省/黄山市/徽州区={"id":"data/CN/安徽省/黄山市/徽州区","key":"徽州区","lang":"zh-hans","lname":"Huizhou Qu","zipex":"245061"}
+data/CN/安徽省/黄山市/歙县={"id":"data/CN/安徽省/黄山市/歙县","key":"歙县","lang":"zh-hans","lname":"She Xian","zipex":"245200"}
+data/CN/安徽省/黄山市/祁门县={"id":"data/CN/安徽省/黄山市/祁门县","key":"祁门县","lang":"zh-hans","lname":"Qimen Xian","zipex":"245600"}
+data/CN/安徽省/黄山市/黄山区={"id":"data/CN/安徽省/黄山市/黄山区","key":"黄山区","lang":"zh-hans","lname":"Huangshan Qu","zipex":"242700"}
+data/CN/安徽省/黄山市/黟县={"id":"data/CN/安徽省/黄山市/黟县","key":"黟县","lang":"zh-hans","lname":"Yi Xian","zipex":"245500"}
+data/CN/山东省={"id":"data/CN/山东省","key":"山东省","lang":"zh-hans","lname":"Shandong Sheng","isoid":"37","sub_keys":"滨州市~德州市~东营市~菏泽市~济南市~济宁市~莱芜市~聊城市~临沂市~青岛市~日照市~泰安市~威海市~潍坊市~烟台市~枣庄市~淄博市","sub_lnames":"Binzhou shi~Dezhou Shi~Dongying Shi~Heze Shi~Jinan Shi~Jining Shi~Laiwu Shi~Liaocheng Shi~Linyi Shi~Qingdao Shi~Rizhao Shi~Tai'an Shi~Wehai Shi~Weifang shi~Yantai Shi~Zaozhuang Shi~Zibo Shi","sub_zipexs":"256619~253012~257093~274020~250001~272119~271100~252052~276001~266001~276800~271000~264200~261041~264001~277101~255039","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/山东省/东营市={"id":"data/CN/山东省/东营市","key":"东营市","lang":"zh-hans","lname":"Dongying Shi","zipex":"257093","sub_keys":"东营区~广饶县~河口区~垦利县~利津县","sub_lnames":"Dongying Qu~Guangrao Xian~Hekou Qu~Kenli Xian~Lijin Xian","sub_zipexs":"257029~257300~257200~257500~257400"}
+data/CN/山东省/东营市/东营区={"id":"data/CN/山东省/东营市/东营区","key":"东营区","lang":"zh-hans","lname":"Dongying Qu","zipex":"257029"}
+data/CN/山东省/东营市/利津县={"id":"data/CN/山东省/东营市/利津县","key":"利津县","lang":"zh-hans","lname":"Lijin Xian","zipex":"257400"}
+data/CN/山东省/东营市/垦利县={"id":"data/CN/山东省/东营市/垦利县","key":"垦利县","lang":"zh-hans","lname":"Kenli Xian","zipex":"257500"}
+data/CN/山东省/东营市/广饶县={"id":"data/CN/山东省/东营市/广饶县","key":"广饶县","lang":"zh-hans","lname":"Guangrao Xian","zipex":"257300"}
+data/CN/山东省/东营市/河口区={"id":"data/CN/山东省/东营市/河口区","key":"河口区","lang":"zh-hans","lname":"Hekou Qu","zipex":"257200"}
+data/CN/山东省/临沂市={"id":"data/CN/山东省/临沂市","key":"临沂市","lang":"zh-hans","lname":"Linyi Shi","zipex":"276001","sub_keys":"苍山县~费县~河东区~莒南县~兰山区~临沭县~罗庄区~蒙阴县~平邑县~郯城县~沂南县~沂水县","sub_lnames":"Cangshan Xian~Fei Xian~Hedong Qu~Junan Xian~Lanshan Qu~Linshu Xian~Luozhuang Qu~Mengyin Xian~Pingyi Xian~Tancheng Xian~Yinan Xian~Yishui Xian","sub_zipexs":"277700~273400~276034~276600~276002~276700~276022~276200~273300~276100~276300~276400"}
+data/CN/山东省/临沂市/临沭县={"id":"data/CN/山东省/临沂市/临沭县","key":"临沭县","lang":"zh-hans","lname":"Linshu Xian","zipex":"276700"}
+data/CN/山东省/临沂市/兰山区={"id":"data/CN/山东省/临沂市/兰山区","key":"兰山区","lang":"zh-hans","lname":"Lanshan Qu","zipex":"276002"}
+data/CN/山东省/临沂市/平邑县={"id":"data/CN/山东省/临沂市/平邑县","key":"平邑县","lang":"zh-hans","lname":"Pingyi Xian","zipex":"273300"}
+data/CN/山东省/临沂市/沂南县={"id":"data/CN/山东省/临沂市/沂南县","key":"沂南县","lang":"zh-hans","lname":"Yinan Xian","zipex":"276300"}
+data/CN/山东省/临沂市/沂水县={"id":"data/CN/山东省/临沂市/沂水县","key":"沂水县","lang":"zh-hans","lname":"Yishui Xian","zipex":"276400"}
+data/CN/山东省/临沂市/河东区={"id":"data/CN/山东省/临沂市/河东区","key":"河东区","lang":"zh-hans","lname":"Hedong Qu","zipex":"276034"}
+data/CN/山东省/临沂市/罗庄区={"id":"data/CN/山东省/临沂市/罗庄区","key":"罗庄区","lang":"zh-hans","lname":"Luozhuang Qu","zipex":"276022"}
+data/CN/山东省/临沂市/苍山县={"id":"data/CN/山东省/临沂市/苍山县","key":"苍山县","lang":"zh-hans","lname":"Cangshan Xian","zipex":"277700"}
+data/CN/山东省/临沂市/莒南县={"id":"data/CN/山东省/临沂市/莒南县","key":"莒南县","lang":"zh-hans","lname":"Junan Xian","zipex":"276600"}
+data/CN/山东省/临沂市/蒙阴县={"id":"data/CN/山东省/临沂市/蒙阴县","key":"蒙阴县","lang":"zh-hans","lname":"Mengyin Xian","zipex":"276200"}
+data/CN/山东省/临沂市/费县={"id":"data/CN/山东省/临沂市/费县","key":"费县","lang":"zh-hans","lname":"Fei Xian","zipex":"273400"}
+data/CN/山东省/临沂市/郯城县={"id":"data/CN/山东省/临沂市/郯城县","key":"郯城县","lang":"zh-hans","lname":"Tancheng Xian","zipex":"276100"}
+data/CN/山东省/威海市={"id":"data/CN/山东省/威海市","key":"威海市","lang":"zh-hans","lname":"Wehai Shi","zipex":"264200","sub_keys":"环翠区~荣成市~乳山市~文登市","sub_lnames":"Huancui Qu~Rongcheng Shi~Rushan Shi~Wendeng Shi","sub_zipexs":"264200~264300~264500~264400"}
+data/CN/山东省/威海市/乳山市={"id":"data/CN/山东省/威海市/乳山市","key":"乳山市","lang":"zh-hans","lname":"Rushan Shi","zipex":"264500"}
+data/CN/山东省/威海市/文登市={"id":"data/CN/山东省/威海市/文登市","key":"文登市","lang":"zh-hans","lname":"Wendeng Shi","zipex":"264400"}
+data/CN/山东省/威海市/环翠区={"id":"data/CN/山东省/威海市/环翠区","key":"环翠区","lang":"zh-hans","lname":"Huancui Qu","zipex":"264200"}
+data/CN/山东省/威海市/荣成市={"id":"data/CN/山东省/威海市/荣成市","key":"荣成市","lang":"zh-hans","lname":"Rongcheng Shi","zipex":"264300"}
+data/CN/山东省/德州市={"id":"data/CN/山东省/德州市","key":"德州市","lang":"zh-hans","lname":"Dezhou Shi","zipex":"253012","sub_keys":"德城区~乐陵市~临邑县~陵县~宁津县~平原县~齐河县~庆云县~武城县~夏津县~禹城市","sub_lnames":"Decheng Qu~Leling Shi~Linyi Xian~Ling Xian~Ningjin Xian~Pingyuan Xian~Qihe Xian~Qingyun Xian~Wucheng Xian~Xiajin Xian~Yucheng Shi","sub_zipexs":"253011~253600~251500~253500~253400~253100~251100~253700~253300~253200~251200"}
+data/CN/山东省/德州市/临邑县={"id":"data/CN/山东省/德州市/临邑县","key":"临邑县","lang":"zh-hans","lname":"Linyi Xian","zipex":"251500"}
+data/CN/山东省/德州市/乐陵市={"id":"data/CN/山东省/德州市/乐陵市","key":"乐陵市","lang":"zh-hans","lname":"Leling Shi","zipex":"253600"}
+data/CN/山东省/德州市/夏津县={"id":"data/CN/山东省/德州市/夏津县","key":"夏津县","lang":"zh-hans","lname":"Xiajin Xian","zipex":"253200"}
+data/CN/山东省/德州市/宁津县={"id":"data/CN/山东省/德州市/宁津县","key":"宁津县","lang":"zh-hans","lname":"Ningjin Xian","zipex":"253400"}
+data/CN/山东省/德州市/平原县={"id":"data/CN/山东省/德州市/平原县","key":"平原县","lang":"zh-hans","lname":"Pingyuan Xian","zipex":"253100"}
+data/CN/山东省/德州市/庆云县={"id":"data/CN/山东省/德州市/庆云县","key":"庆云县","lang":"zh-hans","lname":"Qingyun Xian","zipex":"253700"}
+data/CN/山东省/德州市/德城区={"id":"data/CN/山东省/德州市/德城区","key":"德城区","lang":"zh-hans","lname":"Decheng Qu","zipex":"253011"}
+data/CN/山东省/德州市/武城县={"id":"data/CN/山东省/德州市/武城县","key":"武城县","lang":"zh-hans","lname":"Wucheng Xian","zipex":"253300"}
+data/CN/山东省/德州市/禹城市={"id":"data/CN/山东省/德州市/禹城市","key":"禹城市","lang":"zh-hans","lname":"Yucheng Shi","zipex":"251200"}
+data/CN/山东省/德州市/陵县={"id":"data/CN/山东省/德州市/陵县","key":"陵县","lang":"zh-hans","lname":"Ling Xian","zipex":"253500"}
+data/CN/山东省/德州市/齐河县={"id":"data/CN/山东省/德州市/齐河县","key":"齐河县","lang":"zh-hans","lname":"Qihe Xian","zipex":"251100"}
+data/CN/山东省/日照市={"id":"data/CN/山东省/日照市","key":"日照市","lang":"zh-hans","lname":"Rizhao Shi","zipex":"276800","sub_keys":"东港区~莒县~岚山区~五莲县","sub_lnames":"Donggang Qu~Ju Xian~Lanshan Qu~Wulian Xian","sub_zipexs":"276800~276500~276808~262300"}
+data/CN/山东省/日照市/东港区={"id":"data/CN/山东省/日照市/东港区","key":"东港区","lang":"zh-hans","lname":"Donggang Qu","zipex":"276800"}
+data/CN/山东省/日照市/五莲县={"id":"data/CN/山东省/日照市/五莲县","key":"五莲县","lang":"zh-hans","lname":"Wulian Xian","zipex":"262300"}
+data/CN/山东省/日照市/岚山区={"id":"data/CN/山东省/日照市/岚山区","key":"岚山区","lang":"zh-hans","lname":"Lanshan Qu","zipex":"276808"}
+data/CN/山东省/日照市/莒县={"id":"data/CN/山东省/日照市/莒县","key":"莒县","lang":"zh-hans","lname":"Ju Xian","zipex":"276500"}
+data/CN/山东省/枣庄市={"id":"data/CN/山东省/枣庄市","key":"枣庄市","lang":"zh-hans","lname":"Zaozhuang Shi","zipex":"277101","sub_keys":"山亭区~市中区~台儿庄区~滕州市~薛城区~峄城区","sub_lnames":"Shanting Qu~Shizhong Qu~Tai'erzhuang Qu~Tengzhou Shi~Xuecheng Qu~Yicheng Qu","sub_zipexs":"277200~277101~277400~277500~277000~277300"}
+data/CN/山东省/枣庄市/台儿庄区={"id":"data/CN/山东省/枣庄市/台儿庄区","key":"台儿庄区","lang":"zh-hans","lname":"Tai'erzhuang Qu","zipex":"277400"}
+data/CN/山东省/枣庄市/山亭区={"id":"data/CN/山东省/枣庄市/山亭区","key":"山亭区","lang":"zh-hans","lname":"Shanting Qu","zipex":"277200"}
+data/CN/山东省/枣庄市/峄城区={"id":"data/CN/山东省/枣庄市/峄城区","key":"峄城区","lang":"zh-hans","lname":"Yicheng Qu","zipex":"277300"}
+data/CN/山东省/枣庄市/市中区={"id":"data/CN/山东省/枣庄市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"277101"}
+data/CN/山东省/枣庄市/滕州市={"id":"data/CN/山东省/枣庄市/滕州市","key":"滕州市","lang":"zh-hans","lname":"Tengzhou Shi","zipex":"277500"}
+data/CN/山东省/枣庄市/薛城区={"id":"data/CN/山东省/枣庄市/薛城区","key":"薛城区","lang":"zh-hans","lname":"Xuecheng Qu","zipex":"277000"}
+data/CN/山东省/泰安市={"id":"data/CN/山东省/泰安市","key":"泰安市","lang":"zh-hans","lname":"Tai'an Shi","zipex":"271000","sub_keys":"岱岳区~东平县~肥城市~宁阳县~泰山区~新泰市","sub_lnames":"Daiyue Qu~Dongping Xian~Feicheng Shi~Ningyang Xian~Taishan Qu~Xintai Shi","sub_zipexs":"271000~271500~271600~271400~271000~271200"}
+data/CN/山东省/泰安市/东平县={"id":"data/CN/山东省/泰安市/东平县","key":"东平县","lang":"zh-hans","lname":"Dongping Xian","zipex":"271500"}
+data/CN/山东省/泰安市/宁阳县={"id":"data/CN/山东省/泰安市/宁阳县","key":"宁阳县","lang":"zh-hans","lname":"Ningyang Xian","zipex":"271400"}
+data/CN/山东省/泰安市/岱岳区={"id":"data/CN/山东省/泰安市/岱岳区","key":"岱岳区","lang":"zh-hans","lname":"Daiyue Qu","zipex":"271000"}
+data/CN/山东省/泰安市/新泰市={"id":"data/CN/山东省/泰安市/新泰市","key":"新泰市","lang":"zh-hans","lname":"Xintai Shi","zipex":"271200"}
+data/CN/山东省/泰安市/泰山区={"id":"data/CN/山东省/泰安市/泰山区","key":"泰山区","lang":"zh-hans","lname":"Taishan Qu","zipex":"271000"}
+data/CN/山东省/泰安市/肥城市={"id":"data/CN/山东省/泰安市/肥城市","key":"肥城市","lang":"zh-hans","lname":"Feicheng Shi","zipex":"271600"}
+data/CN/山东省/济南市={"id":"data/CN/山东省/济南市","key":"济南市","lang":"zh-hans","lname":"Jinan Shi","zipex":"250001","sub_keys":"长清区~槐荫区~济阳县~历城区~历下区~平阴县~商河县~市中区~天桥区~章丘市","sub_lnames":"Changqing Qu~Huaiyin Qu~Jiyang Xian~Licheng Qu~Lixia Qu~Pingyin Xian~Shanghe Xian~Shizhong Qu~Tianqiao Qu~Zhangqiu Shi","sub_zipexs":"250300~250021~251400~250100~250013~250400~251600~250001~250031~250200"}
+data/CN/山东省/济南市/历下区={"id":"data/CN/山东省/济南市/历下区","key":"历下区","lang":"zh-hans","lname":"Lixia Qu","zipex":"250013"}
+data/CN/山东省/济南市/历城区={"id":"data/CN/山东省/济南市/历城区","key":"历城区","lang":"zh-hans","lname":"Licheng Qu","zipex":"250100"}
+data/CN/山东省/济南市/商河县={"id":"data/CN/山东省/济南市/商河县","key":"商河县","lang":"zh-hans","lname":"Shanghe Xian","zipex":"251600"}
+data/CN/山东省/济南市/天桥区={"id":"data/CN/山东省/济南市/天桥区","key":"天桥区","lang":"zh-hans","lname":"Tianqiao Qu","zipex":"250031"}
+data/CN/山东省/济南市/市中区={"id":"data/CN/山东省/济南市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"250001"}
+data/CN/山东省/济南市/平阴县={"id":"data/CN/山东省/济南市/平阴县","key":"平阴县","lang":"zh-hans","lname":"Pingyin Xian","zipex":"250400"}
+data/CN/山东省/济南市/槐荫区={"id":"data/CN/山东省/济南市/槐荫区","key":"槐荫区","lang":"zh-hans","lname":"Huaiyin Qu","zipex":"250021"}
+data/CN/山东省/济南市/济阳县={"id":"data/CN/山东省/济南市/济阳县","key":"济阳县","lang":"zh-hans","lname":"Jiyang Xian","zipex":"251400"}
+data/CN/山东省/济南市/章丘市={"id":"data/CN/山东省/济南市/章丘市","key":"章丘市","lang":"zh-hans","lname":"Zhangqiu Shi","zipex":"250200"}
+data/CN/山东省/济南市/长清区={"id":"data/CN/山东省/济南市/长清区","key":"长清区","lang":"zh-hans","lname":"Changqing Qu","zipex":"250300"}
+data/CN/山东省/济宁市={"id":"data/CN/山东省/济宁市","key":"济宁市","lang":"zh-hans","lname":"Jining Shi","zipex":"272119","sub_keys":"嘉祥县~金乡县~梁山县~曲阜市~任城区~市中区~泗水县~微山县~汶上县~兖州市~鱼台县~邹城市","sub_lnames":"Jiaxiang Xian~Jinxiang Xian~Liangshan Xian~Qufu Shi~Rencheng Qu~Shizhong Qu~Sishui Xian~Weishan Xian~Wenshang Xian~Yanzhou Shi~Yutai Xian~Zoucheng Shi","sub_zipexs":"272400~272200~272600~273100~272113~272133~273200~277600~272501~272000~272300~273500"}
+data/CN/山东省/济宁市/任城区={"id":"data/CN/山东省/济宁市/任城区","key":"任城区","lang":"zh-hans","lname":"Rencheng Qu","zipex":"272113"}
+data/CN/山东省/济宁市/兖州市={"id":"data/CN/山东省/济宁市/兖州市","key":"兖州市","lang":"zh-hans","lname":"Yanzhou Shi","zipex":"272000"}
+data/CN/山东省/济宁市/嘉祥县={"id":"data/CN/山东省/济宁市/嘉祥县","key":"嘉祥县","lang":"zh-hans","lname":"Jiaxiang Xian","zipex":"272400"}
+data/CN/山东省/济宁市/市中区={"id":"data/CN/山东省/济宁市/市中区","key":"市中区","lang":"zh-hans","lname":"Shizhong Qu","zipex":"272133"}
+data/CN/山东省/济宁市/微山县={"id":"data/CN/山东省/济宁市/微山县","key":"微山县","lang":"zh-hans","lname":"Weishan Xian","zipex":"277600"}
+data/CN/山东省/济宁市/曲阜市={"id":"data/CN/山东省/济宁市/曲阜市","key":"曲阜市","lang":"zh-hans","lname":"Qufu Shi","zipex":"273100"}
+data/CN/山东省/济宁市/梁山县={"id":"data/CN/山东省/济宁市/梁山县","key":"梁山县","lang":"zh-hans","lname":"Liangshan Xian","zipex":"272600"}
+data/CN/山东省/济宁市/汶上县={"id":"data/CN/山东省/济宁市/汶上县","key":"汶上县","lang":"zh-hans","lname":"Wenshang Xian","zipex":"272501"}
+data/CN/山东省/济宁市/泗水县={"id":"data/CN/山东省/济宁市/泗水县","key":"泗水县","lang":"zh-hans","lname":"Sishui Xian","zipex":"273200"}
+data/CN/山东省/济宁市/邹城市={"id":"data/CN/山东省/济宁市/邹城市","key":"邹城市","lang":"zh-hans","lname":"Zoucheng Shi","zipex":"273500"}
+data/CN/山东省/济宁市/金乡县={"id":"data/CN/山东省/济宁市/金乡县","key":"金乡县","lang":"zh-hans","lname":"Jinxiang Xian","zipex":"272200"}
+data/CN/山东省/济宁市/鱼台县={"id":"data/CN/山东省/济宁市/鱼台县","key":"鱼台县","lang":"zh-hans","lname":"Yutai Xian","zipex":"272300"}
+data/CN/山东省/淄博市={"id":"data/CN/山东省/淄博市","key":"淄博市","lang":"zh-hans","lname":"Zibo Shi","zipex":"255039","sub_keys":"博山区~高青县~桓台县~临淄区~沂源县~张店区~周村区~淄川区","sub_lnames":"Boshan Qu~Gaoqing Xian~Huantai Xian~Linzi Qu~Yiyuan Xian~Zhangdian Qu~Zhoucun Qu~Zichuan Qu","sub_zipexs":"255200~256300~256400~255400~256100~255022~255300~255100"}
+data/CN/山东省/淄博市/临淄区={"id":"data/CN/山东省/淄博市/临淄区","key":"临淄区","lang":"zh-hans","lname":"Linzi Qu","zipex":"255400"}
+data/CN/山东省/淄博市/博山区={"id":"data/CN/山东省/淄博市/博山区","key":"博山区","lang":"zh-hans","lname":"Boshan Qu","zipex":"255200"}
+data/CN/山东省/淄博市/周村区={"id":"data/CN/山东省/淄博市/周村区","key":"周村区","lang":"zh-hans","lname":"Zhoucun Qu","zipex":"255300"}
+data/CN/山东省/淄博市/张店区={"id":"data/CN/山东省/淄博市/张店区","key":"张店区","lang":"zh-hans","lname":"Zhangdian Qu","zipex":"255022"}
+data/CN/山东省/淄博市/桓台县={"id":"data/CN/山东省/淄博市/桓台县","key":"桓台县","lang":"zh-hans","lname":"Huantai Xian","zipex":"256400"}
+data/CN/山东省/淄博市/沂源县={"id":"data/CN/山东省/淄博市/沂源县","key":"沂源县","lang":"zh-hans","lname":"Yiyuan Xian","zipex":"256100"}
+data/CN/山东省/淄博市/淄川区={"id":"data/CN/山东省/淄博市/淄川区","key":"淄川区","lang":"zh-hans","lname":"Zichuan Qu","zipex":"255100"}
+data/CN/山东省/淄博市/高青县={"id":"data/CN/山东省/淄博市/高青县","key":"高青县","lang":"zh-hans","lname":"Gaoqing Xian","zipex":"256300"}
+data/CN/山东省/滨州市={"id":"data/CN/山东省/滨州市","key":"滨州市","lang":"zh-hans","lname":"Binzhou shi","zipex":"256619","sub_keys":"滨城区~博兴县~惠民县~无棣县~阳信县~沾化县~邹平县","sub_lnames":"Bincheng Qu~Boxing Xian~Huimin Xian~Wudi Xian~Yangxin Xian~Zhanhua Xian~Zouping Xian","sub_zipexs":"256613~256200~251700~251900~251800~256800~256200"}
+data/CN/山东省/滨州市/博兴县={"id":"data/CN/山东省/滨州市/博兴县","key":"博兴县","lang":"zh-hans","lname":"Boxing Xian","zipex":"256200"}
+data/CN/山东省/滨州市/惠民县={"id":"data/CN/山东省/滨州市/惠民县","key":"惠民县","lang":"zh-hans","lname":"Huimin Xian","zipex":"251700"}
+data/CN/山东省/滨州市/无棣县={"id":"data/CN/山东省/滨州市/无棣县","key":"无棣县","lang":"zh-hans","lname":"Wudi Xian","zipex":"251900"}
+data/CN/山东省/滨州市/沾化县={"id":"data/CN/山东省/滨州市/沾化县","key":"沾化县","lang":"zh-hans","lname":"Zhanhua Xian","zipex":"256800"}
+data/CN/山东省/滨州市/滨城区={"id":"data/CN/山东省/滨州市/滨城区","key":"滨城区","lang":"zh-hans","lname":"Bincheng Qu","zipex":"256613"}
+data/CN/山东省/滨州市/邹平县={"id":"data/CN/山东省/滨州市/邹平县","key":"邹平县","lang":"zh-hans","lname":"Zouping Xian","zipex":"256200"}
+data/CN/山东省/滨州市/阳信县={"id":"data/CN/山东省/滨州市/阳信县","key":"阳信县","lang":"zh-hans","lname":"Yangxin Xian","zipex":"251800"}
+data/CN/山东省/潍坊市={"id":"data/CN/山东省/潍坊市","key":"潍坊市","lang":"zh-hans","lname":"Weifang shi","zipex":"261041","sub_keys":"安丘市~昌乐县~昌邑市~坊子区~高密市~寒亭区~奎文区~临朐县~青州市~寿光市~潍城区~诸城市","sub_lnames":"Anqiu Shi~Changle Xian~Changyi Shi~Fangzi Qu~Gaomi Shi~Hanting Qu~Kuiwen Qu~Linqu Xian~Qingzhou Shi~Shouguang Shi~Weicheng Qu~Zhucheng Shi","sub_zipexs":"262100~262400~261300~261200~261500~261100~261041~262600~262500~262700~261021~262200"}
+data/CN/山东省/潍坊市/临朐县={"id":"data/CN/山东省/潍坊市/临朐县","key":"临朐县","lang":"zh-hans","lname":"Linqu Xian","zipex":"262600"}
+data/CN/山东省/潍坊市/坊子区={"id":"data/CN/山东省/潍坊市/坊子区","key":"坊子区","lang":"zh-hans","lname":"Fangzi Qu","zipex":"261200"}
+data/CN/山东省/潍坊市/奎文区={"id":"data/CN/山东省/潍坊市/奎文区","key":"奎文区","lang":"zh-hans","lname":"Kuiwen Qu","zipex":"261041"}
+data/CN/山东省/潍坊市/安丘市={"id":"data/CN/山东省/潍坊市/安丘市","key":"安丘市","lang":"zh-hans","lname":"Anqiu Shi","zipex":"262100"}
+data/CN/山东省/潍坊市/寒亭区={"id":"data/CN/山东省/潍坊市/寒亭区","key":"寒亭区","lang":"zh-hans","lname":"Hanting Qu","zipex":"261100"}
+data/CN/山东省/潍坊市/寿光市={"id":"data/CN/山东省/潍坊市/寿光市","key":"寿光市","lang":"zh-hans","lname":"Shouguang Shi","zipex":"262700"}
+data/CN/山东省/潍坊市/昌乐县={"id":"data/CN/山东省/潍坊市/昌乐县","key":"昌乐县","lang":"zh-hans","lname":"Changle Xian","zipex":"262400"}
+data/CN/山东省/潍坊市/昌邑市={"id":"data/CN/山东省/潍坊市/昌邑市","key":"昌邑市","lang":"zh-hans","lname":"Changyi Shi","zipex":"261300"}
+data/CN/山东省/潍坊市/潍城区={"id":"data/CN/山东省/潍坊市/潍城区","key":"潍城区","lang":"zh-hans","lname":"Weicheng Qu","zipex":"261021"}
+data/CN/山东省/潍坊市/诸城市={"id":"data/CN/山东省/潍坊市/诸城市","key":"诸城市","lang":"zh-hans","lname":"Zhucheng Shi","zipex":"262200"}
+data/CN/山东省/潍坊市/青州市={"id":"data/CN/山东省/潍坊市/青州市","key":"青州市","lang":"zh-hans","lname":"Qingzhou Shi","zipex":"262500"}
+data/CN/山东省/潍坊市/高密市={"id":"data/CN/山东省/潍坊市/高密市","key":"高密市","lang":"zh-hans","lname":"Gaomi Shi","zipex":"261500"}
+data/CN/山东省/烟台市={"id":"data/CN/山东省/烟台市","key":"烟台市","lang":"zh-hans","lname":"Yantai Shi","zipex":"264001","sub_keys":"长岛县~福山区~海阳市~莱山区~莱阳市~莱州市~龙口市~牟平区~蓬莱市~栖霞市~招远市~芝罘区","sub_lnames":"Changdao Xian~Fushan Qu~Haiyang Shi~Laishan Qu~Laiyang Shi~Laizhou Shi~Longkou Shi~Muping Qu~Penglai Shi~Qixia Shi~Zhaoyuan Shi~Zhifu Qu","sub_zipexs":"265800~265500~265100~264600~265200~261400~265700~264100~265600~265300~265400~264001"}
+data/CN/山东省/烟台市/招远市={"id":"data/CN/山东省/烟台市/招远市","key":"招远市","lang":"zh-hans","lname":"Zhaoyuan Shi","zipex":"265400"}
+data/CN/山东省/烟台市/栖霞市={"id":"data/CN/山东省/烟台市/栖霞市","key":"栖霞市","lang":"zh-hans","lname":"Qixia Shi","zipex":"265300"}
+data/CN/山东省/烟台市/海阳市={"id":"data/CN/山东省/烟台市/海阳市","key":"海阳市","lang":"zh-hans","lname":"Haiyang Shi","zipex":"265100"}
+data/CN/山东省/烟台市/牟平区={"id":"data/CN/山东省/烟台市/牟平区","key":"牟平区","lang":"zh-hans","lname":"Muping Qu","zipex":"264100"}
+data/CN/山东省/烟台市/福山区={"id":"data/CN/山东省/烟台市/福山区","key":"福山区","lang":"zh-hans","lname":"Fushan Qu","zipex":"265500"}
+data/CN/山东省/烟台市/芝罘区={"id":"data/CN/山东省/烟台市/芝罘区","key":"芝罘区","lang":"zh-hans","lname":"Zhifu Qu","zipex":"264001"}
+data/CN/山东省/烟台市/莱山区={"id":"data/CN/山东省/烟台市/莱山区","key":"莱山区","lang":"zh-hans","lname":"Laishan Qu","zipex":"264600"}
+data/CN/山东省/烟台市/莱州市={"id":"data/CN/山东省/烟台市/莱州市","key":"莱州市","lang":"zh-hans","lname":"Laizhou Shi","zipex":"261400"}
+data/CN/山东省/烟台市/莱阳市={"id":"data/CN/山东省/烟台市/莱阳市","key":"莱阳市","lang":"zh-hans","lname":"Laiyang Shi","zipex":"265200"}
+data/CN/山东省/烟台市/蓬莱市={"id":"data/CN/山东省/烟台市/蓬莱市","key":"蓬莱市","lang":"zh-hans","lname":"Penglai Shi","zipex":"265600"}
+data/CN/山东省/烟台市/长岛县={"id":"data/CN/山东省/烟台市/长岛县","key":"长岛县","lang":"zh-hans","lname":"Changdao Xian","zipex":"265800"}
+data/CN/山东省/烟台市/龙口市={"id":"data/CN/山东省/烟台市/龙口市","key":"龙口市","lang":"zh-hans","lname":"Longkou Shi","zipex":"265700"}
+data/CN/山东省/聊城市={"id":"data/CN/山东省/聊城市","key":"聊城市","lang":"zh-hans","lname":"Liaocheng Shi","zipex":"252052","sub_keys":"茌平县~东阿县~东昌府区~高唐县~冠县~临清市~莘县~阳谷县","sub_lnames":"Chiping Xian~Dong'e Xian~Dongchangfu Qu~Gaotang Xian~Guan Xian~Linqing Shi~Shen Xian~Yanggu Xian","sub_zipexs":"252100~252200~252000~252800~252500~252600~252400~252300"}
+data/CN/山东省/聊城市/东昌府区={"id":"data/CN/山东省/聊城市/东昌府区","key":"东昌府区","lang":"zh-hans","lname":"Dongchangfu Qu","zipex":"252000"}
+data/CN/山东省/聊城市/东阿县={"id":"data/CN/山东省/聊城市/东阿县","key":"东阿县","lang":"zh-hans","lname":"Dong'e Xian","zipex":"252200"}
+data/CN/山东省/聊城市/临清市={"id":"data/CN/山东省/聊城市/临清市","key":"临清市","lang":"zh-hans","lname":"Linqing Shi","zipex":"252600"}
+data/CN/山东省/聊城市/冠县={"id":"data/CN/山东省/聊城市/冠县","key":"冠县","lang":"zh-hans","lname":"Guan Xian","zipex":"252500"}
+data/CN/山东省/聊城市/茌平县={"id":"data/CN/山东省/聊城市/茌平县","key":"茌平县","lang":"zh-hans","lname":"Chiping Xian","zipex":"252100"}
+data/CN/山东省/聊城市/莘县={"id":"data/CN/山东省/聊城市/莘县","key":"莘县","lang":"zh-hans","lname":"Shen Xian","zipex":"252400"}
+data/CN/山东省/聊城市/阳谷县={"id":"data/CN/山东省/聊城市/阳谷县","key":"阳谷县","lang":"zh-hans","lname":"Yanggu Xian","zipex":"252300"}
+data/CN/山东省/聊城市/高唐县={"id":"data/CN/山东省/聊城市/高唐县","key":"高唐县","lang":"zh-hans","lname":"Gaotang Xian","zipex":"252800"}
+data/CN/山东省/莱芜市={"id":"data/CN/山东省/莱芜市","key":"莱芜市","lang":"zh-hans","lname":"Laiwu Shi","zipex":"271100","sub_keys":"钢城区~莱城区","sub_lnames":"Gangcheng Qu~Laicheng Qu","sub_zipexs":"271100~271100"}
+data/CN/山东省/莱芜市/莱城区={"id":"data/CN/山东省/莱芜市/莱城区","key":"莱城区","lang":"zh-hans","lname":"Laicheng Qu","zipex":"271100"}
+data/CN/山东省/莱芜市/钢城区={"id":"data/CN/山东省/莱芜市/钢城区","key":"钢城区","lang":"zh-hans","lname":"Gangcheng Qu","zipex":"271100"}
+data/CN/山东省/菏泽市={"id":"data/CN/山东省/菏泽市","key":"菏泽市","lang":"zh-hans","lname":"Heze Shi","zipex":"274020","sub_keys":"曹县~成武县~单县~定陶县~东明县~巨野县~鄄城县~牡丹区~郓城县","sub_lnames":"Cao Xian~Chengwu Xian~Shan Xian~Dingtao Xian~Dongming Xian~Juye Xian~Juancheng Xian~Mudan Qu~Yuncheng Xian","sub_zipexs":"274400~274200~273700~274100~274500~274900~274600~274009~274700"}
+data/CN/山东省/菏泽市/东明县={"id":"data/CN/山东省/菏泽市/东明县","key":"东明县","lang":"zh-hans","lname":"Dongming Xian","zipex":"274500"}
+data/CN/山东省/菏泽市/单县={"id":"data/CN/山东省/菏泽市/单县","key":"单县","lang":"zh-hans","lname":"Shan Xian","zipex":"273700"}
+data/CN/山东省/菏泽市/定陶县={"id":"data/CN/山东省/菏泽市/定陶县","key":"定陶县","lang":"zh-hans","lname":"Dingtao Xian","zipex":"274100"}
+data/CN/山东省/菏泽市/巨野县={"id":"data/CN/山东省/菏泽市/巨野县","key":"巨野县","lang":"zh-hans","lname":"Juye Xian","zipex":"274900"}
+data/CN/山东省/菏泽市/成武县={"id":"data/CN/山东省/菏泽市/成武县","key":"成武县","lang":"zh-hans","lname":"Chengwu Xian","zipex":"274200"}
+data/CN/山东省/菏泽市/曹县={"id":"data/CN/山东省/菏泽市/曹县","key":"曹县","lang":"zh-hans","lname":"Cao Xian","zipex":"274400"}
+data/CN/山东省/菏泽市/牡丹区={"id":"data/CN/山东省/菏泽市/牡丹区","key":"牡丹区","lang":"zh-hans","lname":"Mudan Qu","zipex":"274009"}
+data/CN/山东省/菏泽市/郓城县={"id":"data/CN/山东省/菏泽市/郓城县","key":"郓城县","lang":"zh-hans","lname":"Yuncheng Xian","zipex":"274700"}
+data/CN/山东省/菏泽市/鄄城县={"id":"data/CN/山东省/菏泽市/鄄城县","key":"鄄城县","lang":"zh-hans","lname":"Juancheng Xian","zipex":"274600"}
+data/CN/山东省/青岛市={"id":"data/CN/山东省/青岛市","key":"青岛市","lang":"zh-hans","lname":"Qingdao Shi","zipex":"266001","sub_keys":"城阳区~黄岛区~即墨市~胶南市~胶州市~莱西市~崂山区~李沧区~平度市~市北区~市南区~四方区","sub_lnames":"Chengyang Qu~Huangdao Qu~Jimo Shi~Jiaonan Shi~Jiaozhou Shi~Laixi Shi~Laoshan Qu~Licang Qu~Pingdu Shi~Shibei Qu~Shinan Qu~Sifang Qu","sub_zipexs":"266041~266500~266200~266400~266300~266600~266100~266021~266700~266011~266001~266031"}
+data/CN/山东省/青岛市/即墨市={"id":"data/CN/山东省/青岛市/即墨市","key":"即墨市","lang":"zh-hans","lname":"Jimo Shi","zipex":"266200"}
+data/CN/山东省/青岛市/四方区={"id":"data/CN/山东省/青岛市/四方区","key":"四方区","lang":"zh-hans","lname":"Sifang Qu","zipex":"266031"}
+data/CN/山东省/青岛市/城阳区={"id":"data/CN/山东省/青岛市/城阳区","key":"城阳区","lang":"zh-hans","lname":"Chengyang Qu","zipex":"266041"}
+data/CN/山东省/青岛市/崂山区={"id":"data/CN/山东省/青岛市/崂山区","key":"崂山区","lang":"zh-hans","lname":"Laoshan Qu","zipex":"266100"}
+data/CN/山东省/青岛市/市北区={"id":"data/CN/山东省/青岛市/市北区","key":"市北区","lang":"zh-hans","lname":"Shibei Qu","zipex":"266011"}
+data/CN/山东省/青岛市/市南区={"id":"data/CN/山东省/青岛市/市南区","key":"市南区","lang":"zh-hans","lname":"Shinan Qu","zipex":"266001"}
+data/CN/山东省/青岛市/平度市={"id":"data/CN/山东省/青岛市/平度市","key":"平度市","lang":"zh-hans","lname":"Pingdu Shi","zipex":"266700"}
+data/CN/山东省/青岛市/李沧区={"id":"data/CN/山东省/青岛市/李沧区","key":"李沧区","lang":"zh-hans","lname":"Licang Qu","zipex":"266021"}
+data/CN/山东省/青岛市/胶南市={"id":"data/CN/山东省/青岛市/胶南市","key":"胶南市","lang":"zh-hans","lname":"Jiaonan Shi","zipex":"266400"}
+data/CN/山东省/青岛市/胶州市={"id":"data/CN/山东省/青岛市/胶州市","key":"胶州市","lang":"zh-hans","lname":"Jiaozhou Shi","zipex":"266300"}
+data/CN/山东省/青岛市/莱西市={"id":"data/CN/山东省/青岛市/莱西市","key":"莱西市","lang":"zh-hans","lname":"Laixi Shi","zipex":"266600"}
+data/CN/山东省/青岛市/黄岛区={"id":"data/CN/山东省/青岛市/黄岛区","key":"黄岛区","lang":"zh-hans","lname":"Huangdao Qu","zipex":"266500"}
+data/CN/山西省={"id":"data/CN/山西省","key":"山西省","lang":"zh-hans","lname":"Shanxi Sheng","isoid":"14","sub_keys":"长治市~大同市~晋城市~晋中市~临汾市~吕梁市~朔州市~太原市~忻州市~阳泉市~运城市","sub_lnames":"Changzhi Shi~Datong Shi~Jincheng Shi~Jinzhong Shi~Linfen Shi~Lüliang Shi~Shuozhou Shi~Taiyuan Shi~Xinzhou Shi~Yangquan Shi~Yuncheng Shi","sub_zipexs":"046000~037008~048000~030600~041000~033000~036000~030082~034000~045000~044000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/山西省/临汾市={"id":"data/CN/山西省/临汾市","key":"临汾市","lang":"zh-hans","lname":"Linfen Shi","zipex":"041000","sub_keys":"安泽县~大宁县~汾西县~浮山县~古县~洪洞县~侯马市~霍州市~吉县~蒲县~曲沃县~隰县~乡宁县~襄汾县~尧都区~翼城县~永和县","sub_lnames":"Anze Xian~Daning Xian~Fenxi Xian~Fushan Xian~Gu Xian~Hongtong Xian~Houma Shi~Huozhou Shi~Ji Xian~Pu Xian~Quwo Xian~Xi Xian~Xiangning Xian~Xiangfen Xian~Yaodu Qu~Yicheng Xian~Yonghe Xian","sub_zipexs":"042500~042300~031500~042600~042400~031600~043000~031400~042200~041200~043400~041300~042100~041500~041000~043500~041400"}
+data/CN/山西省/临汾市/乡宁县={"id":"data/CN/山西省/临汾市/乡宁县","key":"乡宁县","lang":"zh-hans","lname":"Xiangning Xian","zipex":"042100"}
+data/CN/山西省/临汾市/侯马市={"id":"data/CN/山西省/临汾市/侯马市","key":"侯马市","lang":"zh-hans","lname":"Houma Shi","zipex":"043000"}
+data/CN/山西省/临汾市/古县={"id":"data/CN/山西省/临汾市/古县","key":"古县","lang":"zh-hans","lname":"Gu Xian","zipex":"042400"}
+data/CN/山西省/临汾市/吉县={"id":"data/CN/山西省/临汾市/吉县","key":"吉县","lang":"zh-hans","lname":"Ji Xian","zipex":"042200"}
+data/CN/山西省/临汾市/大宁县={"id":"data/CN/山西省/临汾市/大宁县","key":"大宁县","lang":"zh-hans","lname":"Daning Xian","zipex":"042300"}
+data/CN/山西省/临汾市/安泽县={"id":"data/CN/山西省/临汾市/安泽县","key":"安泽县","lang":"zh-hans","lname":"Anze Xian","zipex":"042500"}
+data/CN/山西省/临汾市/尧都区={"id":"data/CN/山西省/临汾市/尧都区","key":"尧都区","lang":"zh-hans","lname":"Yaodu Qu","zipex":"041000"}
+data/CN/山西省/临汾市/曲沃县={"id":"data/CN/山西省/临汾市/曲沃县","key":"曲沃县","lang":"zh-hans","lname":"Quwo Xian","zipex":"043400"}
+data/CN/山西省/临汾市/永和县={"id":"data/CN/山西省/临汾市/永和县","key":"永和县","lang":"zh-hans","lname":"Yonghe Xian","zipex":"041400"}
+data/CN/山西省/临汾市/汾西县={"id":"data/CN/山西省/临汾市/汾西县","key":"汾西县","lang":"zh-hans","lname":"Fenxi Xian","zipex":"031500"}
+data/CN/山西省/临汾市/洪洞县={"id":"data/CN/山西省/临汾市/洪洞县","key":"洪洞县","lang":"zh-hans","lname":"Hongtong Xian","zipex":"031600"}
+data/CN/山西省/临汾市/浮山县={"id":"data/CN/山西省/临汾市/浮山县","key":"浮山县","lang":"zh-hans","lname":"Fushan Xian","zipex":"042600"}
+data/CN/山西省/临汾市/翼城县={"id":"data/CN/山西省/临汾市/翼城县","key":"翼城县","lang":"zh-hans","lname":"Yicheng Xian","zipex":"043500"}
+data/CN/山西省/临汾市/蒲县={"id":"data/CN/山西省/临汾市/蒲县","key":"蒲县","lang":"zh-hans","lname":"Pu Xian","zipex":"041200"}
+data/CN/山西省/临汾市/襄汾县={"id":"data/CN/山西省/临汾市/襄汾县","key":"襄汾县","lang":"zh-hans","lname":"Xiangfen Xian","zipex":"041500"}
+data/CN/山西省/临汾市/隰县={"id":"data/CN/山西省/临汾市/隰县","key":"隰县","lang":"zh-hans","lname":"Xi Xian","zipex":"041300"}
+data/CN/山西省/临汾市/霍州市={"id":"data/CN/山西省/临汾市/霍州市","key":"霍州市","lang":"zh-hans","lname":"Huozhou Shi","zipex":"031400"}
+data/CN/山西省/吕梁市={"id":"data/CN/山西省/吕梁市","key":"吕梁市","lang":"zh-hans","lname":"Lüliang Shi","zipex":"033000","sub_keys":"方山县~汾阳市~交城县~交口县~岚县~离石区~临县~柳林县~石楼县~文水县~孝义市~兴县~中阳县","sub_lnames":"Wanshan Xian~Fenyang Shi~Jiaocheng Xian~Jiaokou Xian~Lan Xian~Lishi Qu~Lin Xian~Liulin Xian~Shilou Xian~Wenshui Xian~Xiaoyi Shi~Xing Xian~Zhongyang Xian","sub_zipexs":"033100~032200~030500~032400~033500~033000~033200~033300~032500~032100~032300~033600~033400"}
+data/CN/山西省/吕梁市/中阳县={"id":"data/CN/山西省/吕梁市/中阳县","key":"中阳县","lang":"zh-hans","lname":"Zhongyang Xian","zipex":"033400"}
+data/CN/山西省/吕梁市/临县={"id":"data/CN/山西省/吕梁市/临县","key":"临县","lang":"zh-hans","lname":"Lin Xian","zipex":"033200"}
+data/CN/山西省/吕梁市/交口县={"id":"data/CN/山西省/吕梁市/交口县","key":"交口县","lang":"zh-hans","lname":"Jiaokou Xian","zipex":"032400"}
+data/CN/山西省/吕梁市/交城县={"id":"data/CN/山西省/吕梁市/交城县","key":"交城县","lang":"zh-hans","lname":"Jiaocheng Xian","zipex":"030500"}
+data/CN/山西省/吕梁市/兴县={"id":"data/CN/山西省/吕梁市/兴县","key":"兴县","lang":"zh-hans","lname":"Xing Xian","zipex":"033600"}
+data/CN/山西省/吕梁市/孝义市={"id":"data/CN/山西省/吕梁市/孝义市","key":"孝义市","lang":"zh-hans","lname":"Xiaoyi Shi","zipex":"032300"}
+data/CN/山西省/吕梁市/岚县={"id":"data/CN/山西省/吕梁市/岚县","key":"岚县","lang":"zh-hans","lname":"Lan Xian","zipex":"033500"}
+data/CN/山西省/吕梁市/文水县={"id":"data/CN/山西省/吕梁市/文水县","key":"文水县","lang":"zh-hans","lname":"Wenshui Xian","zipex":"032100"}
+data/CN/山西省/吕梁市/方山县={"id":"data/CN/山西省/吕梁市/方山县","key":"方山县","lang":"zh-hans","lname":"Wanshan Xian","zipex":"033100"}
+data/CN/山西省/吕梁市/柳林县={"id":"data/CN/山西省/吕梁市/柳林县","key":"柳林县","lang":"zh-hans","lname":"Liulin Xian","zipex":"033300"}
+data/CN/山西省/吕梁市/汾阳市={"id":"data/CN/山西省/吕梁市/汾阳市","key":"汾阳市","lang":"zh-hans","lname":"Fenyang Shi","zipex":"032200"}
+data/CN/山西省/吕梁市/石楼县={"id":"data/CN/山西省/吕梁市/石楼县","key":"石楼县","lang":"zh-hans","lname":"Shilou Xian","zipex":"032500"}
+data/CN/山西省/吕梁市/离石区={"id":"data/CN/山西省/吕梁市/离石区","key":"离石区","lang":"zh-hans","lname":"Lishi Qu","zipex":"033000"}
+data/CN/山西省/大同市={"id":"data/CN/山西省/大同市","key":"大同市","lang":"zh-hans","lname":"Datong Shi","zipex":"037008","sub_keys":"城区~大同县~广灵县~浑源县~矿区~灵丘县~南郊区~天镇县~新荣区~阳高县~左云县","sub_lnames":"Cheng Qu~Datong Xian~Guangling Xian~Hunyuan Xian~Kuang Qu~Lingqiu Xian~Nanjiao Qu~Tianzhen Xian~Xinrong Qu~Yanggao Xian~Zuoyun Xian","sub_zipexs":"037008~037300~037500~037400~037001~034400~037001~038200~037002~038100~037100"}
+data/CN/山西省/大同市/南郊区={"id":"data/CN/山西省/大同市/南郊区","key":"南郊区","lang":"zh-hans","lname":"Nanjiao Qu","zipex":"037001"}
+data/CN/山西省/大同市/城区={"id":"data/CN/山西省/大同市/城区","key":"城区","lang":"zh-hans","lname":"Cheng Qu","zipex":"037008"}
+data/CN/山西省/大同市/大同县={"id":"data/CN/山西省/大同市/大同县","key":"大同县","lang":"zh-hans","lname":"Datong Xian","zipex":"037300"}
+data/CN/山西省/大同市/天镇县={"id":"data/CN/山西省/大同市/天镇县","key":"天镇县","lang":"zh-hans","lname":"Tianzhen Xian","zipex":"038200"}
+data/CN/山西省/大同市/左云县={"id":"data/CN/山西省/大同市/左云县","key":"左云县","lang":"zh-hans","lname":"Zuoyun Xian","zipex":"037100"}
+data/CN/山西省/大同市/广灵县={"id":"data/CN/山西省/大同市/广灵县","key":"广灵县","lang":"zh-hans","lname":"Guangling Xian","zipex":"037500"}
+data/CN/山西省/大同市/新荣区={"id":"data/CN/山西省/大同市/新荣区","key":"新荣区","lang":"zh-hans","lname":"Xinrong Qu","zipex":"037002"}
+data/CN/山西省/大同市/浑源县={"id":"data/CN/山西省/大同市/浑源县","key":"浑源县","lang":"zh-hans","lname":"Hunyuan Xian","zipex":"037400"}
+data/CN/山西省/大同市/灵丘县={"id":"data/CN/山西省/大同市/灵丘县","key":"灵丘县","lang":"zh-hans","lname":"Lingqiu Xian","zipex":"034400"}
+data/CN/山西省/大同市/矿区={"id":"data/CN/山西省/大同市/矿区","key":"矿区","lang":"zh-hans","lname":"Kuang Qu","zipex":"037001"}
+data/CN/山西省/大同市/阳高县={"id":"data/CN/山西省/大同市/阳高县","key":"阳高县","lang":"zh-hans","lname":"Yanggao Xian","zipex":"038100"}
+data/CN/山西省/太原市={"id":"data/CN/山西省/太原市","key":"太原市","lang":"zh-hans","lname":"Taiyuan Shi","zipex":"030082","sub_keys":"古交市~尖草坪区~晋源区~娄烦县~清徐县~万柏林区~小店区~杏花岭区~阳曲县~迎泽区","sub_lnames":"Gujiao Shi~Jiancaoping Qu~Jinyuan Qu~Loufan Xian~Qingxu Xian~Wanbailin Qu~Xiaodian Qu~Xinghualing Qu~Yangqu Xian~Yingze Qu","sub_zipexs":"030200~030003~030025~030300~030400~030027~030032~030001~030100~030024"}
+data/CN/山西省/太原市/万柏林区={"id":"data/CN/山西省/太原市/万柏林区","key":"万柏林区","lang":"zh-hans","lname":"Wanbailin Qu","zipex":"030027"}
+data/CN/山西省/太原市/古交市={"id":"data/CN/山西省/太原市/古交市","key":"古交市","lang":"zh-hans","lname":"Gujiao Shi","zipex":"030200"}
+data/CN/山西省/太原市/娄烦县={"id":"data/CN/山西省/太原市/娄烦县","key":"娄烦县","lang":"zh-hans","lname":"Loufan Xian","zipex":"030300"}
+data/CN/山西省/太原市/小店区={"id":"data/CN/山西省/太原市/小店区","key":"小店区","lang":"zh-hans","lname":"Xiaodian Qu","zipex":"030032"}
+data/CN/山西省/太原市/尖草坪区={"id":"data/CN/山西省/太原市/尖草坪区","key":"尖草坪区","lang":"zh-hans","lname":"Jiancaoping Qu","zipex":"030003"}
+data/CN/山西省/太原市/晋源区={"id":"data/CN/山西省/太原市/晋源区","key":"晋源区","lang":"zh-hans","lname":"Jinyuan Qu","zipex":"030025"}
+data/CN/山西省/太原市/杏花岭区={"id":"data/CN/山西省/太原市/杏花岭区","key":"杏花岭区","lang":"zh-hans","lname":"Xinghualing Qu","zipex":"030001"}
+data/CN/山西省/太原市/清徐县={"id":"data/CN/山西省/太原市/清徐县","key":"清徐县","lang":"zh-hans","lname":"Qingxu Xian","zipex":"030400"}
+data/CN/山西省/太原市/迎泽区={"id":"data/CN/山西省/太原市/迎泽区","key":"迎泽区","lang":"zh-hans","lname":"Yingze Qu","zipex":"030024"}
+data/CN/山西省/太原市/阳曲县={"id":"data/CN/山西省/太原市/阳曲县","key":"阳曲县","lang":"zh-hans","lname":"Yangqu Xian","zipex":"030100"}
+data/CN/山西省/忻州市={"id":"data/CN/山西省/忻州市","key":"忻州市","lang":"zh-hans","lname":"Xinzhou Shi","zipex":"034000","sub_keys":"保德县~代县~定襄县~繁峙县~河曲县~静乐县~岢岚县~宁武县~偏关县~神池县~五台县~五寨县~忻府区~原平市","sub_lnames":"Baode Xian~Dai Xian~Dingxiang Xian~Fanshi Xian~Hequ Xian~Jingle Xian~Kelan Xian~Ningwu Xian~Pianguan Xian~Shenchi Xian~Wutai Xian~Wuzhai Xian~Xinfu Qu~Yuanping Shi","sub_zipexs":"036600~034200~035400~034300~036500~035100~036300~036700~036400~036100~035500~036200~034000~034100"}
+data/CN/山西省/忻州市/五台县={"id":"data/CN/山西省/忻州市/五台县","key":"五台县","lang":"zh-hans","lname":"Wutai Xian","zipex":"035500"}
+data/CN/山西省/忻州市/五寨县={"id":"data/CN/山西省/忻州市/五寨县","key":"五寨县","lang":"zh-hans","lname":"Wuzhai Xian","zipex":"036200"}
+data/CN/山西省/忻州市/代县={"id":"data/CN/山西省/忻州市/代县","key":"代县","lang":"zh-hans","lname":"Dai Xian","zipex":"034200"}
+data/CN/山西省/忻州市/保德县={"id":"data/CN/山西省/忻州市/保德县","key":"保德县","lang":"zh-hans","lname":"Baode Xian","zipex":"036600"}
+data/CN/山西省/忻州市/偏关县={"id":"data/CN/山西省/忻州市/偏关县","key":"偏关县","lang":"zh-hans","lname":"Pianguan Xian","zipex":"036400"}
+data/CN/山西省/忻州市/原平市={"id":"data/CN/山西省/忻州市/原平市","key":"原平市","lang":"zh-hans","lname":"Yuanping Shi","zipex":"034100"}
+data/CN/山西省/忻州市/宁武县={"id":"data/CN/山西省/忻州市/宁武县","key":"宁武县","lang":"zh-hans","lname":"Ningwu Xian","zipex":"036700"}
+data/CN/山西省/忻州市/定襄县={"id":"data/CN/山西省/忻州市/定襄县","key":"定襄县","lang":"zh-hans","lname":"Dingxiang Xian","zipex":"035400"}
+data/CN/山西省/忻州市/岢岚县={"id":"data/CN/山西省/忻州市/岢岚县","key":"岢岚县","lang":"zh-hans","lname":"Kelan Xian","zipex":"036300"}
+data/CN/山西省/忻州市/忻府区={"id":"data/CN/山西省/忻州市/忻府区","key":"忻府区","lang":"zh-hans","lname":"Xinfu Qu","zipex":"034000"}
+data/CN/山西省/忻州市/河曲县={"id":"data/CN/山西省/忻州市/河曲县","key":"河曲县","lang":"zh-hans","lname":"Hequ Xian","zipex":"036500"}
+data/CN/山西省/忻州市/神池县={"id":"data/CN/山西省/忻州市/神池县","key":"神池县","lang":"zh-hans","lname":"Shenchi Xian","zipex":"036100"}
+data/CN/山西省/忻州市/繁峙县={"id":"data/CN/山西省/忻州市/繁峙县","key":"繁峙县","lang":"zh-hans","lname":"Fanshi Xian","zipex":"034300"}
+data/CN/山西省/忻州市/静乐县={"id":"data/CN/山西省/忻州市/静乐县","key":"静乐县","lang":"zh-hans","lname":"Jingle Xian","zipex":"035100"}
+data/CN/山西省/晋中市={"id":"data/CN/山西省/晋中市","key":"晋中市","lang":"zh-hans","lname":"Jinzhong Shi","zipex":"030600","sub_keys":"和顺县~介休市~灵石县~平遥县~祁县~寿阳县~太谷县~昔阳县~榆次区~榆社县~左权县","sub_lnames":"Heshun Xian~Jiexiu Shi~Lingshi Xian~Pingyao Xian~Qi Xian~Shouyang Xian~Taigu Xian~Xiyang Xian~Yuci Qu~Yushe Xian~Zuoquan Xian","sub_zipexs":"032700~031200~031300~031100~030900~045400~030800~045400~030600~031800~032600"}
+data/CN/山西省/晋中市/介休市={"id":"data/CN/山西省/晋中市/介休市","key":"介休市","lang":"zh-hans","lname":"Jiexiu Shi","zipex":"031200"}
+data/CN/山西省/晋中市/和顺县={"id":"data/CN/山西省/晋中市/和顺县","key":"和顺县","lang":"zh-hans","lname":"Heshun Xian","zipex":"032700"}
+data/CN/山西省/晋中市/太谷县={"id":"data/CN/山西省/晋中市/太谷县","key":"太谷县","lang":"zh-hans","lname":"Taigu Xian","zipex":"030800"}
+data/CN/山西省/晋中市/寿阳县={"id":"data/CN/山西省/晋中市/寿阳县","key":"寿阳县","lang":"zh-hans","lname":"Shouyang Xian","zipex":"045400"}
+data/CN/山西省/晋中市/左权县={"id":"data/CN/山西省/晋中市/左权县","key":"左权县","lang":"zh-hans","lname":"Zuoquan Xian","zipex":"032600"}
+data/CN/山西省/晋中市/平遥县={"id":"data/CN/山西省/晋中市/平遥县","key":"平遥县","lang":"zh-hans","lname":"Pingyao Xian","zipex":"031100"}
+data/CN/山西省/晋中市/昔阳县={"id":"data/CN/山西省/晋中市/昔阳县","key":"昔阳县","lang":"zh-hans","lname":"Xiyang Xian","zipex":"045400"}
+data/CN/山西省/晋中市/榆次区={"id":"data/CN/山西省/晋中市/榆次区","key":"榆次区","lang":"zh-hans","lname":"Yuci Qu","zipex":"030600"}
+data/CN/山西省/晋中市/榆社县={"id":"data/CN/山西省/晋中市/榆社县","key":"榆社县","lang":"zh-hans","lname":"Yushe Xian","zipex":"031800"}
+data/CN/山西省/晋中市/灵石县={"id":"data/CN/山西省/晋中市/灵石县","key":"灵石县","lang":"zh-hans","lname":"Lingshi Xian","zipex":"031300"}
+data/CN/山西省/晋中市/祁县={"id":"data/CN/山西省/晋中市/祁县","key":"祁县","lang":"zh-hans","lname":"Qi Xian","zipex":"030900"}
+data/CN/山西省/晋城市={"id":"data/CN/山西省/晋城市","key":"晋城市","lang":"zh-hans","lname":"Jincheng Shi","zipex":"048000","sub_keys":"城区~高平市~陵川县~沁水县~阳城县~泽州县","sub_lnames":"Cheng Qu~Gaoping Shi~Lingchuan Xian~Qinshui Xian~Yangcheng Xian~Zezhou Xian","sub_zipexs":"048000~048400~048300~048200~048100~048012"}
+data/CN/山西省/晋城市/城区={"id":"data/CN/山西省/晋城市/城区","key":"城区","lang":"zh-hans","lname":"Cheng Qu","zipex":"048000"}
+data/CN/山西省/晋城市/沁水县={"id":"data/CN/山西省/晋城市/沁水县","key":"沁水县","lang":"zh-hans","lname":"Qinshui Xian","zipex":"048200"}
+data/CN/山西省/晋城市/泽州县={"id":"data/CN/山西省/晋城市/泽州县","key":"泽州县","lang":"zh-hans","lname":"Zezhou Xian","zipex":"048012"}
+data/CN/山西省/晋城市/阳城县={"id":"data/CN/山西省/晋城市/阳城县","key":"阳城县","lang":"zh-hans","lname":"Yangcheng Xian","zipex":"048100"}
+data/CN/山西省/晋城市/陵川县={"id":"data/CN/山西省/晋城市/陵川县","key":"陵川县","lang":"zh-hans","lname":"Lingchuan Xian","zipex":"048300"}
+data/CN/山西省/晋城市/高平市={"id":"data/CN/山西省/晋城市/高平市","key":"高平市","lang":"zh-hans","lname":"Gaoping Shi","zipex":"048400"}
+data/CN/山西省/朔州市={"id":"data/CN/山西省/朔州市","key":"朔州市","lang":"zh-hans","lname":"Shuozhou Shi","zipex":"036000","sub_keys":"怀仁县~平鲁区~山阴县~朔城区~应县~右玉县","sub_lnames":"Huairen Xian~Pinglu Qu~Shanyin Xian~Shuocheng Qu~Ying Xian~Youyu Xian","sub_zipexs":"038300~038600~036900~038500~037600~037200"}
+data/CN/山西省/朔州市/右玉县={"id":"data/CN/山西省/朔州市/右玉县","key":"右玉县","lang":"zh-hans","lname":"Youyu Xian","zipex":"037200"}
+data/CN/山西省/朔州市/山阴县={"id":"data/CN/山西省/朔州市/山阴县","key":"山阴县","lang":"zh-hans","lname":"Shanyin Xian","zipex":"036900"}
+data/CN/山西省/朔州市/平鲁区={"id":"data/CN/山西省/朔州市/平鲁区","key":"平鲁区","lang":"zh-hans","lname":"Pinglu Qu","zipex":"038600"}
+data/CN/山西省/朔州市/应县={"id":"data/CN/山西省/朔州市/应县","key":"应县","lang":"zh-hans","lname":"Ying Xian","zipex":"037600"}
+data/CN/山西省/朔州市/怀仁县={"id":"data/CN/山西省/朔州市/怀仁县","key":"怀仁县","lang":"zh-hans","lname":"Huairen Xian","zipex":"038300"}
+data/CN/山西省/朔州市/朔城区={"id":"data/CN/山西省/朔州市/朔城区","key":"朔城区","lang":"zh-hans","lname":"Shuocheng Qu","zipex":"038500"}
+data/CN/山西省/运城市={"id":"data/CN/山西省/运城市","key":"运城市","lang":"zh-hans","lname":"Yuncheng Shi","zipex":"044000","sub_keys":"河津市~稷山县~绛县~临猗县~平陆县~芮城县~万荣县~闻喜县~夏县~新绛县~盐湖区~永济市~垣曲县","sub_lnames":"Hejin Shi~Jishan Xian~Jiang Xian~Linyi Xian~Pinglu Xian~Ruicheng Xian~Wanrong Xian~Wenxi Xian~Xia Xian~Xinjiang Xian~Yanhu Qu~Yongji Shi~Yuanqu Xian","sub_zipexs":"043300~043200~043600~044100~044300~044600~044200~043800~044400~043100~044300~044500~043700"}
+data/CN/山西省/运城市/万荣县={"id":"data/CN/山西省/运城市/万荣县","key":"万荣县","lang":"zh-hans","lname":"Wanrong Xian","zipex":"044200"}
+data/CN/山西省/运城市/临猗县={"id":"data/CN/山西省/运城市/临猗县","key":"临猗县","lang":"zh-hans","lname":"Linyi Xian","zipex":"044100"}
+data/CN/山西省/运城市/垣曲县={"id":"data/CN/山西省/运城市/垣曲县","key":"垣曲县","lang":"zh-hans","lname":"Yuanqu Xian","zipex":"043700"}
+data/CN/山西省/运城市/夏县={"id":"data/CN/山西省/运城市/夏县","key":"夏县","lang":"zh-hans","lname":"Xia Xian","zipex":"044400"}
+data/CN/山西省/运城市/平陆县={"id":"data/CN/山西省/运城市/平陆县","key":"平陆县","lang":"zh-hans","lname":"Pinglu Xian","zipex":"044300"}
+data/CN/山西省/运城市/新绛县={"id":"data/CN/山西省/运城市/新绛县","key":"新绛县","lang":"zh-hans","lname":"Xinjiang Xian","zipex":"043100"}
+data/CN/山西省/运城市/永济市={"id":"data/CN/山西省/运城市/永济市","key":"永济市","lang":"zh-hans","lname":"Yongji Shi","zipex":"044500"}
+data/CN/山西省/运城市/河津市={"id":"data/CN/山西省/运城市/河津市","key":"河津市","lang":"zh-hans","lname":"Hejin Shi","zipex":"043300"}
+data/CN/山西省/运城市/盐湖区={"id":"data/CN/山西省/运城市/盐湖区","key":"盐湖区","lang":"zh-hans","lname":"Yanhu Qu","zipex":"044300"}
+data/CN/山西省/运城市/稷山县={"id":"data/CN/山西省/运城市/稷山县","key":"稷山县","lang":"zh-hans","lname":"Jishan Xian","zipex":"043200"}
+data/CN/山西省/运城市/绛县={"id":"data/CN/山西省/运城市/绛县","key":"绛县","lang":"zh-hans","lname":"Jiang Xian","zipex":"043600"}
+data/CN/山西省/运城市/芮城县={"id":"data/CN/山西省/运城市/芮城县","key":"芮城县","lang":"zh-hans","lname":"Ruicheng Xian","zipex":"044600"}
+data/CN/山西省/运城市/闻喜县={"id":"data/CN/山西省/运城市/闻喜县","key":"闻喜县","lang":"zh-hans","lname":"Wenxi Xian","zipex":"043800"}
+data/CN/山西省/长治市={"id":"data/CN/山西省/长治市","key":"长治市","lang":"zh-hans","lname":"Changzhi Shi","zipex":"046000","sub_keys":"长治县~长子县~城区~壶关县~郊区~黎城县~潞城市~平顺县~沁县~沁源县~屯留县~武乡县~襄垣县","sub_lnames":"Changzhi Xian~Zhangzi Xian~Cheng Qu~Huguan Xian~Jiao Qu~Licheng Xian~Lucheng Shi~Pingshun Xian~Qin Xian~Qinyuan Xian~Tunliu Xian~Wuxiang Xian~Xiangyuan Xian","sub_zipexs":"047100~046600~046011~047300~046011~047600~047500~047400~046400~046500~046100~046300~046200"}
+data/CN/山西省/长治市/城区={"id":"data/CN/山西省/长治市/城区","key":"城区","lang":"zh-hans","lname":"Cheng Qu","zipex":"046011"}
+data/CN/山西省/长治市/壶关县={"id":"data/CN/山西省/长治市/壶关县","key":"壶关县","lang":"zh-hans","lname":"Huguan Xian","zipex":"047300"}
+data/CN/山西省/长治市/屯留县={"id":"data/CN/山西省/长治市/屯留县","key":"屯留县","lang":"zh-hans","lname":"Tunliu Xian","zipex":"046100"}
+data/CN/山西省/长治市/平顺县={"id":"data/CN/山西省/长治市/平顺县","key":"平顺县","lang":"zh-hans","lname":"Pingshun Xian","zipex":"047400"}
+data/CN/山西省/长治市/武乡县={"id":"data/CN/山西省/长治市/武乡县","key":"武乡县","lang":"zh-hans","lname":"Wuxiang Xian","zipex":"046300"}
+data/CN/山西省/长治市/沁县={"id":"data/CN/山西省/长治市/沁县","key":"沁县","lang":"zh-hans","lname":"Qin Xian","zipex":"046400"}
+data/CN/山西省/长治市/沁源县={"id":"data/CN/山西省/长治市/沁源县","key":"沁源县","lang":"zh-hans","lname":"Qinyuan Xian","zipex":"046500"}
+data/CN/山西省/长治市/潞城市={"id":"data/CN/山西省/长治市/潞城市","key":"潞城市","lang":"zh-hans","lname":"Lucheng Shi","zipex":"047500"}
+data/CN/山西省/长治市/襄垣县={"id":"data/CN/山西省/长治市/襄垣县","key":"襄垣县","lang":"zh-hans","lname":"Xiangyuan Xian","zipex":"046200"}
+data/CN/山西省/长治市/郊区={"id":"data/CN/山西省/长治市/郊区","key":"郊区","lang":"zh-hans","lname":"Jiao Qu","zipex":"046011"}
+data/CN/山西省/长治市/长子县={"id":"data/CN/山西省/长治市/长子县","key":"长子县","lang":"zh-hans","lname":"Zhangzi Xian","zipex":"046600"}
+data/CN/山西省/长治市/长治县={"id":"data/CN/山西省/长治市/长治县","key":"长治县","lang":"zh-hans","lname":"Changzhi Xian","zipex":"047100"}
+data/CN/山西省/长治市/黎城县={"id":"data/CN/山西省/长治市/黎城县","key":"黎城县","lang":"zh-hans","lname":"Licheng Xian","zipex":"047600"}
+data/CN/山西省/阳泉市={"id":"data/CN/山西省/阳泉市","key":"阳泉市","lang":"zh-hans","lname":"Yangquan Shi","zipex":"045000","sub_keys":"城区~郊区~矿区~平定县~盂县","sub_lnames":"Cheng Qu~Jiao Qu~Kuang Qu~Pingding Xian~Yu Xian","sub_zipexs":"045000~045011~045000~045200~045100"}
+data/CN/山西省/阳泉市/城区={"id":"data/CN/山西省/阳泉市/城区","key":"城区","lang":"zh-hans","lname":"Cheng Qu","zipex":"045000"}
+data/CN/山西省/阳泉市/平定县={"id":"data/CN/山西省/阳泉市/平定县","key":"平定县","lang":"zh-hans","lname":"Pingding Xian","zipex":"045200"}
+data/CN/山西省/阳泉市/盂县={"id":"data/CN/山西省/阳泉市/盂县","key":"盂县","lang":"zh-hans","lname":"Yu Xian","zipex":"045100"}
+data/CN/山西省/阳泉市/矿区={"id":"data/CN/山西省/阳泉市/矿区","key":"矿区","lang":"zh-hans","lname":"Kuang Qu","zipex":"045000"}
+data/CN/山西省/阳泉市/郊区={"id":"data/CN/山西省/阳泉市/郊区","key":"郊区","lang":"zh-hans","lname":"Jiao Qu","zipex":"045011"}
+data/CN/广东省={"id":"data/CN/广东省","key":"广东省","lang":"zh-hans","lname":"Guangdong Sheng","isoid":"44","sub_keys":"潮州市~东莞市~佛山市~广州市~河源市~惠州市~江门市~揭阳市~茂名市~梅州市~清远市~汕头市~汕尾市~韶关市~深圳市~阳江市~云浮市~湛江市~肇庆市~中山市~珠海市","sub_lnames":"Chaozhou Shi~Dongguan Shi~Foshan Shi~Guangzhou Shi~Heyuan Shi~Huizhou Shi~Jiangmen Shi~Jieyang Shi~Maoming Shi~Meizhou Shi~Qingyuan Shi~Shantou Shi~Shanwei Shi~Shaoguan Shi~Shenzhen Shi~Yangjiang Shi~Yunfu Shi~Zhanjiang Shi~Zhaoqing Shi~Zhongshan Shi~Zhuhai Shi","sub_zipexs":"521000~523003~528000~510130~517001~516001~529020~522000~525011~514021~511500~515031~516601~512000~518027~529525~527300~524038~526060~528403~519000","sub_mores":"true~false~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~false~true"}
+data/CN/广东省/东莞市={"id":"data/CN/广东省/东莞市","key":"东莞市","lang":"zh-hans","lname":"Dongguan Shi","zipex":"523003"}
+data/CN/广东省/中山市={"id":"data/CN/广东省/中山市","key":"中山市","lang":"zh-hans","lname":"Zhongshan Shi","zipex":"528403"}
+data/CN/广东省/云浮市={"id":"data/CN/广东省/云浮市","key":"云浮市","lang":"zh-hans","lname":"Yunfu Shi","zipex":"527300","sub_keys":"罗定市~新兴县~郁南县~云安县~云城区","sub_lnames":"Luoding Shi~Xinxing Xian~Yunan Xian~Yun'an Xian~Yuncheng Qu","sub_zipexs":"527200~527400~527100~527500~527300"}
+data/CN/广东省/云浮市/云城区={"id":"data/CN/广东省/云浮市/云城区","key":"云城区","lang":"zh-hans","lname":"Yuncheng Qu","zipex":"527300"}
+data/CN/广东省/云浮市/云安县={"id":"data/CN/广东省/云浮市/云安县","key":"云安县","lang":"zh-hans","lname":"Yun'an Xian","zipex":"527500"}
+data/CN/广东省/云浮市/新兴县={"id":"data/CN/广东省/云浮市/新兴县","key":"新兴县","lang":"zh-hans","lname":"Xinxing Xian","zipex":"527400"}
+data/CN/广东省/云浮市/罗定市={"id":"data/CN/广东省/云浮市/罗定市","key":"罗定市","lang":"zh-hans","lname":"Luoding Shi","zipex":"527200"}
+data/CN/广东省/云浮市/郁南县={"id":"data/CN/广东省/云浮市/郁南县","key":"郁南县","lang":"zh-hans","lname":"Yunan Xian","zipex":"527100"}
+data/CN/广东省/佛山市={"id":"data/CN/广东省/佛山市","key":"佛山市","lang":"zh-hans","lname":"Foshan Shi","zipex":"528000","sub_keys":"禅城区~高明区~南海区~三水区~顺德区","sub_lnames":"Shancheng Qu~Gaoming Qu~Nanhai Qu~Sanshui Qu~Shunde Qu","sub_zipexs":"528000~528500~528200~528100~528300"}
+data/CN/广东省/佛山市/三水区={"id":"data/CN/广东省/佛山市/三水区","key":"三水区","lang":"zh-hans","lname":"Sanshui Qu","zipex":"528100"}
+data/CN/广东省/佛山市/南海区={"id":"data/CN/广东省/佛山市/南海区","key":"南海区","lang":"zh-hans","lname":"Nanhai Qu","zipex":"528200"}
+data/CN/广东省/佛山市/禅城区={"id":"data/CN/广东省/佛山市/禅城区","key":"禅城区","lang":"zh-hans","lname":"Shancheng Qu","zipex":"528000"}
+data/CN/广东省/佛山市/顺德区={"id":"data/CN/广东省/佛山市/顺德区","key":"顺德区","lang":"zh-hans","lname":"Shunde Qu","zipex":"528300"}
+data/CN/广东省/佛山市/高明区={"id":"data/CN/广东省/佛山市/高明区","key":"高明区","lang":"zh-hans","lname":"Gaoming Qu","zipex":"528500"}
+data/CN/广东省/广州市={"id":"data/CN/广东省/广州市","key":"广州市","lang":"zh-hans","lname":"Guangzhou Shi","zipex":"510130","sub_keys":"白云区~从化市~番禺区~海珠区~花都区~黄埔区~荔湾区~萝岗区~南沙区~天河区~越秀区~增城市","sub_lnames":"Baiyun Qu~Conghua Shi~Panyu Qu~Haizhu Qu~Huadu Qu~Huangpu Qu~Liwan Qu~Luogang Qu~Nansha Qu~Tianhe Qu~Yuexiu Qu~Zengcheng Shi","sub_zipexs":"510080~510900~511400~510220~510800~510700~510145~510730~510080~510630~510030~511300"}
+data/CN/广东省/广州市/从化市={"id":"data/CN/广东省/广州市/从化市","key":"从化市","lang":"zh-hans","lname":"Conghua Shi","zipex":"510900"}
+data/CN/广东省/广州市/南沙区={"id":"data/CN/广东省/广州市/南沙区","key":"南沙区","lang":"zh-hans","lname":"Nansha Qu","zipex":"510080"}
+data/CN/广东省/广州市/增城市={"id":"data/CN/广东省/广州市/增城市","key":"增城市","lang":"zh-hans","lname":"Zengcheng Shi","zipex":"511300"}
+data/CN/广东省/广州市/天河区={"id":"data/CN/广东省/广州市/天河区","key":"天河区","lang":"zh-hans","lname":"Tianhe Qu","zipex":"510630"}
+data/CN/广东省/广州市/海珠区={"id":"data/CN/广东省/广州市/海珠区","key":"海珠区","lang":"zh-hans","lname":"Haizhu Qu","zipex":"510220"}
+data/CN/广东省/广州市/番禺区={"id":"data/CN/广东省/广州市/番禺区","key":"番禺区","lang":"zh-hans","lname":"Panyu Qu","zipex":"511400"}
+data/CN/广东省/广州市/白云区={"id":"data/CN/广东省/广州市/白云区","key":"白云区","lang":"zh-hans","lname":"Baiyun Qu","zipex":"510080"}
+data/CN/广东省/广州市/花都区={"id":"data/CN/广东省/广州市/花都区","key":"花都区","lang":"zh-hans","lname":"Huadu Qu","zipex":"510800"}
+data/CN/广东省/广州市/荔湾区={"id":"data/CN/广东省/广州市/荔湾区","key":"荔湾区","lang":"zh-hans","lname":"Liwan Qu","zipex":"510145"}
+data/CN/广东省/广州市/萝岗区={"id":"data/CN/广东省/广州市/萝岗区","key":"萝岗区","lang":"zh-hans","lname":"Luogang Qu","zipex":"510730"}
+data/CN/广东省/广州市/越秀区={"id":"data/CN/广东省/广州市/越秀区","key":"越秀区","lang":"zh-hans","lname":"Yuexiu Qu","zipex":"510030"}
+data/CN/广东省/广州市/黄埔区={"id":"data/CN/广东省/广州市/黄埔区","key":"黄埔区","lang":"zh-hans","lname":"Huangpu Qu","zipex":"510700"}
+data/CN/广东省/惠州市={"id":"data/CN/广东省/惠州市","key":"惠州市","lang":"zh-hans","lname":"Huizhou Shi","zipex":"516001","sub_keys":"博罗县~惠城区~惠东县~惠阳区~龙门县","sub_lnames":"Boluo Xian~Huicheng Qu~Huidong Xian~Huiyang Qu~Longmen Xian","sub_zipexs":"516100~516001~516300~516200~516800"}
+data/CN/广东省/惠州市/博罗县={"id":"data/CN/广东省/惠州市/博罗县","key":"博罗县","lang":"zh-hans","lname":"Boluo Xian","zipex":"516100"}
+data/CN/广东省/惠州市/惠东县={"id":"data/CN/广东省/惠州市/惠东县","key":"惠东县","lang":"zh-hans","lname":"Huidong Xian","zipex":"516300"}
+data/CN/广东省/惠州市/惠城区={"id":"data/CN/广东省/惠州市/惠城区","key":"惠城区","lang":"zh-hans","lname":"Huicheng Qu","zipex":"516001"}
+data/CN/广东省/惠州市/惠阳区={"id":"data/CN/广东省/惠州市/惠阳区","key":"惠阳区","lang":"zh-hans","lname":"Huiyang Qu","zipex":"516200"}
+data/CN/广东省/惠州市/龙门县={"id":"data/CN/广东省/惠州市/龙门县","key":"龙门县","lang":"zh-hans","lname":"Longmen Xian","zipex":"516800"}
+data/CN/广东省/揭阳市={"id":"data/CN/广东省/揭阳市","key":"揭阳市","lang":"zh-hans","lname":"Jieyang Shi","zipex":"522000","sub_keys":"惠来县~揭东县~揭西县~普宁市~榕城区","sub_lnames":"Huilai Xian~Jiedong Xian~Jiexi Xian~Puning Shi~Rongcheng Qu","sub_zipexs":"515200~515554~515400~515300~522095"}
+data/CN/广东省/揭阳市/惠来县={"id":"data/CN/广东省/揭阳市/惠来县","key":"惠来县","lang":"zh-hans","lname":"Huilai Xian","zipex":"515200"}
+data/CN/广东省/揭阳市/揭东县={"id":"data/CN/广东省/揭阳市/揭东县","key":"揭东县","lang":"zh-hans","lname":"Jiedong Xian","zipex":"515554"}
+data/CN/广东省/揭阳市/揭西县={"id":"data/CN/广东省/揭阳市/揭西县","key":"揭西县","lang":"zh-hans","lname":"Jiexi Xian","zipex":"515400"}
+data/CN/广东省/揭阳市/普宁市={"id":"data/CN/广东省/揭阳市/普宁市","key":"普宁市","lang":"zh-hans","lname":"Puning Shi","zipex":"515300"}
+data/CN/广东省/揭阳市/榕城区={"id":"data/CN/广东省/揭阳市/榕城区","key":"榕城区","lang":"zh-hans","lname":"Rongcheng Qu","zipex":"522095"}
+data/CN/广东省/梅州市={"id":"data/CN/广东省/梅州市","key":"梅州市","lang":"zh-hans","lname":"Meizhou Shi","zipex":"514021","sub_keys":"大埔县~丰顺县~蕉岭县~梅江区~梅县~平远县~五华县~兴宁市","sub_lnames":"Dabu Xian~Fengshun Xian~Jiaoling Xian~Meijiang Qu~Mei Xian~Pingyuan Xian~Wuhua Xian~Xingning Shi","sub_zipexs":"514200~514300~514100~514000~514733~514600~514400~514500"}
+data/CN/广东省/梅州市/丰顺县={"id":"data/CN/广东省/梅州市/丰顺县","key":"丰顺县","lang":"zh-hans","lname":"Fengshun Xian","zipex":"514300"}
+data/CN/广东省/梅州市/五华县={"id":"data/CN/广东省/梅州市/五华县","key":"五华县","lang":"zh-hans","lname":"Wuhua Xian","zipex":"514400"}
+data/CN/广东省/梅州市/兴宁市={"id":"data/CN/广东省/梅州市/兴宁市","key":"兴宁市","lang":"zh-hans","lname":"Xingning Shi","zipex":"514500"}
+data/CN/广东省/梅州市/大埔县={"id":"data/CN/广东省/梅州市/大埔县","key":"大埔县","lang":"zh-hans","lname":"Dabu Xian","zipex":"514200"}
+data/CN/广东省/梅州市/平远县={"id":"data/CN/广东省/梅州市/平远县","key":"平远县","lang":"zh-hans","lname":"Pingyuan Xian","zipex":"514600"}
+data/CN/广东省/梅州市/梅县={"id":"data/CN/广东省/梅州市/梅县","key":"梅县","lang":"zh-hans","lname":"Mei Xian","zipex":"514733"}
+data/CN/广东省/梅州市/梅江区={"id":"data/CN/广东省/梅州市/梅江区","key":"梅江区","lang":"zh-hans","lname":"Meijiang Qu","zipex":"514000"}
+data/CN/广东省/梅州市/蕉岭县={"id":"data/CN/广东省/梅州市/蕉岭县","key":"蕉岭县","lang":"zh-hans","lname":"Jiaoling Xian","zipex":"514100"}
+data/CN/广东省/汕头市={"id":"data/CN/广东省/汕头市","key":"汕头市","lang":"zh-hans","lname":"Shantou Shi","zipex":"515031","sub_keys":"潮南区~潮阳区~澄海区~濠江区~金平区~龙湖区~南澳县","sub_lnames":"Chaonan Qu~Chaoyang Qu~Chenghai Qu~Haojiang Qu~Jinping Qu~Longhu Qu~Nan'ao Xian","sub_zipexs":"515144~515100~515800~515071~515041~515041~515900"}
+data/CN/广东省/汕头市/南澳县={"id":"data/CN/广东省/汕头市/南澳县","key":"南澳县","lang":"zh-hans","lname":"Nan'ao Xian","zipex":"515900"}
+data/CN/广东省/汕头市/潮南区={"id":"data/CN/广东省/汕头市/潮南区","key":"潮南区","lang":"zh-hans","lname":"Chaonan Qu","zipex":"515144"}
+data/CN/广东省/汕头市/潮阳区={"id":"data/CN/广东省/汕头市/潮阳区","key":"潮阳区","lang":"zh-hans","lname":"Chaoyang Qu","zipex":"515100"}
+data/CN/广东省/汕头市/澄海区={"id":"data/CN/广东省/汕头市/澄海区","key":"澄海区","lang":"zh-hans","lname":"Chenghai Qu","zipex":"515800"}
+data/CN/广东省/汕头市/濠江区={"id":"data/CN/广东省/汕头市/濠江区","key":"濠江区","lang":"zh-hans","lname":"Haojiang Qu","zipex":"515071"}
+data/CN/广东省/汕头市/金平区={"id":"data/CN/广东省/汕头市/金平区","key":"金平区","lang":"zh-hans","lname":"Jinping Qu","zipex":"515041"}
+data/CN/广东省/汕头市/龙湖区={"id":"data/CN/广东省/汕头市/龙湖区","key":"龙湖区","lang":"zh-hans","lname":"Longhu Qu","zipex":"515041"}
+data/CN/广东省/汕尾市={"id":"data/CN/广东省/汕尾市","key":"汕尾市","lang":"zh-hans","lname":"Shanwei Shi","zipex":"516601","sub_keys":"城区~海丰县~陆丰市~陆河县","sub_lnames":"Cheng Qu~Haifeng Xian~Lufeng Shi~Luhe Xian","sub_zipexs":"516601~516400~516500~516700"}
+data/CN/广东省/汕尾市/城区={"id":"data/CN/广东省/汕尾市/城区","key":"城区","lang":"zh-hans","lname":"Cheng Qu","zipex":"516601"}
+data/CN/广东省/汕尾市/海丰县={"id":"data/CN/广东省/汕尾市/海丰县","key":"海丰县","lang":"zh-hans","lname":"Haifeng Xian","zipex":"516400"}
+data/CN/广东省/汕尾市/陆丰市={"id":"data/CN/广东省/汕尾市/陆丰市","key":"陆丰市","lang":"zh-hans","lname":"Lufeng Shi","zipex":"516500"}
+data/CN/广东省/汕尾市/陆河县={"id":"data/CN/广东省/汕尾市/陆河县","key":"陆河县","lang":"zh-hans","lname":"Luhe Xian","zipex":"516700"}
+data/CN/广东省/江门市={"id":"data/CN/广东省/江门市","key":"江门市","lang":"zh-hans","lname":"Jiangmen Shi","zipex":"529020","sub_keys":"恩平市~鹤山市~江海区~开平市~蓬江区~台山市~新会区","sub_lnames":"Enping Shi~Heshan Shi~Jianghai Qu~Kaiping Shi~Pengjiang Qu~Taishan Shi~Xinhui Qu","sub_zipexs":"529411~529711~529000~529312~529051~529200~529100"}
+data/CN/广东省/江门市/台山市={"id":"data/CN/广东省/江门市/台山市","key":"台山市","lang":"zh-hans","lname":"Taishan Shi","zipex":"529200"}
+data/CN/广东省/江门市/开平市={"id":"data/CN/广东省/江门市/开平市","key":"开平市","lang":"zh-hans","lname":"Kaiping Shi","zipex":"529312"}
+data/CN/广东省/江门市/恩平市={"id":"data/CN/广东省/江门市/恩平市","key":"恩平市","lang":"zh-hans","lname":"Enping Shi","zipex":"529411"}
+data/CN/广东省/江门市/新会区={"id":"data/CN/广东省/江门市/新会区","key":"新会区","lang":"zh-hans","lname":"Xinhui Qu","zipex":"529100"}
+data/CN/广东省/江门市/江海区={"id":"data/CN/广东省/江门市/江海区","key":"江海区","lang":"zh-hans","lname":"Jianghai Qu","zipex":"529000"}
+data/CN/广东省/江门市/蓬江区={"id":"data/CN/广东省/江门市/蓬江区","key":"蓬江区","lang":"zh-hans","lname":"Pengjiang Qu","zipex":"529051"}
+data/CN/广东省/江门市/鹤山市={"id":"data/CN/广东省/江门市/鹤山市","key":"鹤山市","lang":"zh-hans","lname":"Heshan Shi","zipex":"529711"}
+data/CN/广东省/河源市={"id":"data/CN/广东省/河源市","key":"河源市","lang":"zh-hans","lname":"Heyuan Shi","zipex":"517001","sub_keys":"东源县~和平县~连平县~龙川县~源城区~紫金县","sub_lnames":"Dongyuan Xian~Heping Xian~Lianping Xian~Longchuan Xian~Yuancheng Qu~Zijin Xian","sub_zipexs":"517500~517200~517100~517300~517000~517400"}
+data/CN/广东省/河源市/东源县={"id":"data/CN/广东省/河源市/东源县","key":"东源县","lang":"zh-hans","lname":"Dongyuan Xian","zipex":"517500"}
+data/CN/广东省/河源市/和平县={"id":"data/CN/广东省/河源市/和平县","key":"和平县","lang":"zh-hans","lname":"Heping Xian","zipex":"517200"}
+data/CN/广东省/河源市/源城区={"id":"data/CN/广东省/河源市/源城区","key":"源城区","lang":"zh-hans","lname":"Yuancheng Qu","zipex":"517000"}
+data/CN/广东省/河源市/紫金县={"id":"data/CN/广东省/河源市/紫金县","key":"紫金县","lang":"zh-hans","lname":"Zijin Xian","zipex":"517400"}
+data/CN/广东省/河源市/连平县={"id":"data/CN/广东省/河源市/连平县","key":"连平县","lang":"zh-hans","lname":"Lianping Xian","zipex":"517100"}
+data/CN/广东省/河源市/龙川县={"id":"data/CN/广东省/河源市/龙川县","key":"龙川县","lang":"zh-hans","lname":"Longchuan Xian","zipex":"517300"}
+data/CN/广东省/深圳市={"id":"data/CN/广东省/深圳市","key":"深圳市","lang":"zh-hans","lname":"Shenzhen Shi","zipex":"518027","sub_keys":"宝安区~福田区~龙岗区~罗湖区~南山区~盐田区","sub_lnames":"Bao'an Qu~Futian Qu~Longgang Qu~Luohu Qu~Nanshan Qu~Yantian Qu","sub_zipexs":"518101~518033~518116~518001~518052~518083"}
+data/CN/广东省/深圳市/南山区={"id":"data/CN/广东省/深圳市/南山区","key":"南山区","lang":"zh-hans","lname":"Nanshan Qu","zipex":"518052"}
+data/CN/广东省/深圳市/宝安区={"id":"data/CN/广东省/深圳市/宝安区","key":"宝安区","lang":"zh-hans","lname":"Bao'an Qu","zipex":"518101"}
+data/CN/广东省/深圳市/盐田区={"id":"data/CN/广东省/深圳市/盐田区","key":"盐田区","lang":"zh-hans","lname":"Yantian Qu","zipex":"518083"}
+data/CN/广东省/深圳市/福田区={"id":"data/CN/广东省/深圳市/福田区","key":"福田区","lang":"zh-hans","lname":"Futian Qu","zipex":"518033"}
+data/CN/广东省/深圳市/罗湖区={"id":"data/CN/广东省/深圳市/罗湖区","key":"罗湖区","lang":"zh-hans","lname":"Luohu Qu","zipex":"518001"}
+data/CN/广东省/深圳市/龙岗区={"id":"data/CN/广东省/深圳市/龙岗区","key":"龙岗区","lang":"zh-hans","lname":"Longgang Qu","zipex":"518116"}
+data/CN/广东省/清远市={"id":"data/CN/广东省/清远市","key":"清远市","lang":"zh-hans","lname":"Qingyuan Shi","zipex":"511500","sub_keys":"佛冈县~连南瑶族自治县~连山壮族瑶族自治县~连州市~清城区~清新县~阳山县~英德市","sub_lnames":"Fogang Xian~Liannan Xian~Lianshan Xian~Lianzhou Shi~Qingcheng Qu~Qingxin Xian~Yangshan Xian~Yingde Shi","sub_zipexs":"511600~513300~513200~513401~511500~511800~513100~513000","sub_lfnames":"~Liannan Yaozu Zizhixian~Lianshan Zhuangzu Yaozu Zizhixian~~~~~"}
+data/CN/广东省/清远市/佛冈县={"id":"data/CN/广东省/清远市/佛冈县","key":"佛冈县","lang":"zh-hans","lname":"Fogang Xian","zipex":"511600"}
+data/CN/广东省/清远市/清城区={"id":"data/CN/广东省/清远市/清城区","key":"清城区","lang":"zh-hans","lname":"Qingcheng Qu","zipex":"511500"}
+data/CN/广东省/清远市/清新县={"id":"data/CN/广东省/清远市/清新县","key":"清新县","lang":"zh-hans","lname":"Qingxin Xian","zipex":"511800"}
+data/CN/广东省/清远市/英德市={"id":"data/CN/广东省/清远市/英德市","key":"英德市","lang":"zh-hans","lname":"Yingde Shi","zipex":"513000"}
+data/CN/广东省/清远市/连南瑶族自治县={"id":"data/CN/广东省/清远市/连南瑶族自治县","key":"连南瑶族自治县","lang":"zh-hans","lname":"Liannan Xian","zipex":"513300","lfname":"Liannan Yaozu Zizhixian"}
+data/CN/广东省/清远市/连山壮族瑶族自治县={"id":"data/CN/广东省/清远市/连山壮族瑶族自治县","key":"连山壮族瑶族自治县","lang":"zh-hans","lname":"Lianshan Xian","zipex":"513200","lfname":"Lianshan Zhuangzu Yaozu Zizhixian"}
+data/CN/广东省/清远市/连州市={"id":"data/CN/广东省/清远市/连州市","key":"连州市","lang":"zh-hans","lname":"Lianzhou Shi","zipex":"513401"}
+data/CN/广东省/清远市/阳山县={"id":"data/CN/广东省/清远市/阳山县","key":"阳山县","lang":"zh-hans","lname":"Yangshan Xian","zipex":"513100"}
+data/CN/广东省/湛江市={"id":"data/CN/广东省/湛江市","key":"湛江市","lang":"zh-hans","lname":"Zhanjiang Shi","zipex":"524038","sub_keys":"赤坎区~雷州市~廉江市~麻章区~坡头区~遂溪县~吴川市~霞山区~徐闻县","sub_lnames":"Chikan Qu~Leizhou Shi~Lianjiang Shi~Mazhang Qu~Potou Qu~Suixi Xian~Wuchuan Shi~Xiashan Qu~Xuwen Xian","sub_zipexs":"524033~524200~524400~524003~524057~524300~524500~524002~524100"}
+data/CN/广东省/湛江市/吴川市={"id":"data/CN/广东省/湛江市/吴川市","key":"吴川市","lang":"zh-hans","lname":"Wuchuan Shi","zipex":"524500"}
+data/CN/广东省/湛江市/坡头区={"id":"data/CN/广东省/湛江市/坡头区","key":"坡头区","lang":"zh-hans","lname":"Potou Qu","zipex":"524057"}
+data/CN/广东省/湛江市/廉江市={"id":"data/CN/广东省/湛江市/廉江市","key":"廉江市","lang":"zh-hans","lname":"Lianjiang Shi","zipex":"524400"}
+data/CN/广东省/湛江市/徐闻县={"id":"data/CN/广东省/湛江市/徐闻县","key":"徐闻县","lang":"zh-hans","lname":"Xuwen Xian","zipex":"524100"}
+data/CN/广东省/湛江市/赤坎区={"id":"data/CN/广东省/湛江市/赤坎区","key":"赤坎区","lang":"zh-hans","lname":"Chikan Qu","zipex":"524033"}
+data/CN/广东省/湛江市/遂溪县={"id":"data/CN/广东省/湛江市/遂溪县","key":"遂溪县","lang":"zh-hans","lname":"Suixi Xian","zipex":"524300"}
+data/CN/广东省/湛江市/雷州市={"id":"data/CN/广东省/湛江市/雷州市","key":"雷州市","lang":"zh-hans","lname":"Leizhou Shi","zipex":"524200"}
+data/CN/广东省/湛江市/霞山区={"id":"data/CN/广东省/湛江市/霞山区","key":"霞山区","lang":"zh-hans","lname":"Xiashan Qu","zipex":"524002"}
+data/CN/广东省/湛江市/麻章区={"id":"data/CN/广东省/湛江市/麻章区","key":"麻章区","lang":"zh-hans","lname":"Mazhang Qu","zipex":"524003"}
+data/CN/广东省/潮州市={"id":"data/CN/广东省/潮州市","key":"潮州市","lang":"zh-hans","lname":"Chaozhou Shi","zipex":"521000","sub_keys":"潮安县~饶平县~湘桥区","sub_lnames":"Chao'an Xian~Raoping Xian~Xiangqiao Qu","sub_zipexs":"515638~515700~521000"}
+data/CN/广东省/潮州市/湘桥区={"id":"data/CN/广东省/潮州市/湘桥区","key":"湘桥区","lang":"zh-hans","lname":"Xiangqiao Qu","zipex":"521000"}
+data/CN/广东省/潮州市/潮安县={"id":"data/CN/广东省/潮州市/潮安县","key":"潮安县","lang":"zh-hans","lname":"Chao'an Xian","zipex":"515638"}
+data/CN/广东省/潮州市/饶平县={"id":"data/CN/广东省/潮州市/饶平县","key":"饶平县","lang":"zh-hans","lname":"Raoping Xian","zipex":"515700"}
+data/CN/广东省/珠海市={"id":"data/CN/广东省/珠海市","key":"珠海市","lang":"zh-hans","lname":"Zhuhai Shi","zipex":"519000","sub_keys":"斗门区~金湾区~香洲区","sub_lnames":"Doumen Qu~Jinwan Qu~Xiangzhou Qu","sub_zipexs":"519100~519090~519000"}
+data/CN/广东省/珠海市/斗门区={"id":"data/CN/广东省/珠海市/斗门区","key":"斗门区","lang":"zh-hans","lname":"Doumen Qu","zipex":"519100"}
+data/CN/广东省/珠海市/金湾区={"id":"data/CN/广东省/珠海市/金湾区","key":"金湾区","lang":"zh-hans","lname":"Jinwan Qu","zipex":"519090"}
+data/CN/广东省/珠海市/香洲区={"id":"data/CN/广东省/珠海市/香洲区","key":"香洲区","lang":"zh-hans","lname":"Xiangzhou Qu","zipex":"519000"}
+data/CN/广东省/肇庆市={"id":"data/CN/广东省/肇庆市","key":"肇庆市","lang":"zh-hans","lname":"Zhaoqing Shi","zipex":"526060","sub_keys":"德庆县~鼎湖区~端州区~封开县~高要市~广宁县~怀集县~四会市","sub_lnames":"Deqing Xian~Dinghu Qu~Duanzhou Qu~Fengkai Xian~Gaoyao Shi~Guangning Xian~Huaiji Xian~Sihui Shi","sub_zipexs":"526600~526070~526040~526500~526100~526300~526400~526200"}
+data/CN/广东省/肇庆市/四会市={"id":"data/CN/广东省/肇庆市/四会市","key":"四会市","lang":"zh-hans","lname":"Sihui Shi","zipex":"526200"}
+data/CN/广东省/肇庆市/封开县={"id":"data/CN/广东省/肇庆市/封开县","key":"封开县","lang":"zh-hans","lname":"Fengkai Xian","zipex":"526500"}
+data/CN/广东省/肇庆市/广宁县={"id":"data/CN/广东省/肇庆市/广宁县","key":"广宁县","lang":"zh-hans","lname":"Guangning Xian","zipex":"526300"}
+data/CN/广东省/肇庆市/德庆县={"id":"data/CN/广东省/肇庆市/德庆县","key":"德庆县","lang":"zh-hans","lname":"Deqing Xian","zipex":"526600"}
+data/CN/广东省/肇庆市/怀集县={"id":"data/CN/广东省/肇庆市/怀集县","key":"怀集县","lang":"zh-hans","lname":"Huaiji Xian","zipex":"526400"}
+data/CN/广东省/肇庆市/端州区={"id":"data/CN/广东省/肇庆市/端州区","key":"端州区","lang":"zh-hans","lname":"Duanzhou Qu","zipex":"526040"}
+data/CN/广东省/肇庆市/高要市={"id":"data/CN/广东省/肇庆市/高要市","key":"高要市","lang":"zh-hans","lname":"Gaoyao Shi","zipex":"526100"}
+data/CN/广东省/肇庆市/鼎湖区={"id":"data/CN/广东省/肇庆市/鼎湖区","key":"鼎湖区","lang":"zh-hans","lname":"Dinghu Qu","zipex":"526070"}
+data/CN/广东省/茂名市={"id":"data/CN/广东省/茂名市","key":"茂名市","lang":"zh-hans","lname":"Maoming Shi","zipex":"525011","sub_keys":"电白县~高州市~化州市~茂港区~茂南区~信宜市","sub_lnames":"Dianbai Xian~Gaozhou Shi~Huazhou Shi~Maogang Qu~Maonan Qu~Xinyi Shi","sub_zipexs":"525400~525200~525100~525027~525011~525300"}
+data/CN/广东省/茂名市/信宜市={"id":"data/CN/广东省/茂名市/信宜市","key":"信宜市","lang":"zh-hans","lname":"Xinyi Shi","zipex":"525300"}
+data/CN/广东省/茂名市/化州市={"id":"data/CN/广东省/茂名市/化州市","key":"化州市","lang":"zh-hans","lname":"Huazhou Shi","zipex":"525100"}
+data/CN/广东省/茂名市/电白县={"id":"data/CN/广东省/茂名市/电白县","key":"电白县","lang":"zh-hans","lname":"Dianbai Xian","zipex":"525400"}
+data/CN/广东省/茂名市/茂南区={"id":"data/CN/广东省/茂名市/茂南区","key":"茂南区","lang":"zh-hans","lname":"Maonan Qu","zipex":"525011"}
+data/CN/广东省/茂名市/茂港区={"id":"data/CN/广东省/茂名市/茂港区","key":"茂港区","lang":"zh-hans","lname":"Maogang Qu","zipex":"525027"}
+data/CN/广东省/茂名市/高州市={"id":"data/CN/广东省/茂名市/高州市","key":"高州市","lang":"zh-hans","lname":"Gaozhou Shi","zipex":"525200"}
+data/CN/广东省/阳江市={"id":"data/CN/广东省/阳江市","key":"阳江市","lang":"zh-hans","lname":"Yangjiang Shi","zipex":"529525","sub_keys":"江城区~阳春市~阳东县~阳西县","sub_lnames":"Jiangcheng Qu~Yangchun Shi~Yangdong Xian~Yangxi Xian","sub_zipexs":"529525~529611~529931~529800"}
+data/CN/广东省/阳江市/江城区={"id":"data/CN/广东省/阳江市/江城区","key":"江城区","lang":"zh-hans","lname":"Jiangcheng Qu","zipex":"529525"}
+data/CN/广东省/阳江市/阳东县={"id":"data/CN/广东省/阳江市/阳东县","key":"阳东县","lang":"zh-hans","lname":"Yangdong Xian","zipex":"529931"}
+data/CN/广东省/阳江市/阳春市={"id":"data/CN/广东省/阳江市/阳春市","key":"阳春市","lang":"zh-hans","lname":"Yangchun Shi","zipex":"529611"}
+data/CN/广东省/阳江市/阳西县={"id":"data/CN/广东省/阳江市/阳西县","key":"阳西县","lang":"zh-hans","lname":"Yangxi Xian","zipex":"529800"}
+data/CN/广东省/韶关市={"id":"data/CN/广东省/韶关市","key":"韶关市","lang":"zh-hans","lname":"Shaoguan Shi","zipex":"512000","sub_keys":"乐昌市~南雄市~曲江区~仁化县~乳源瑶族自治县~始兴县~翁源县~武江区~新丰县~浈江区","sub_lnames":"Lechang Shi~Nanxiong Shi~Qujiang Qu~Renhua Xian~Ruyuan Xian~Shixing Xian~Wengyuan Xian~Wujiang Qu~Xinfeng Xian~Zhenjiang Qu","sub_zipexs":"512200~512400~512100~512300~512700~512500~512600~512025~511100~512023","sub_lfnames":"~~~~Ruyuan Yaozu Zizhixian~~~~~"}
+data/CN/广东省/韶关市/乐昌市={"id":"data/CN/广东省/韶关市/乐昌市","key":"乐昌市","lang":"zh-hans","lname":"Lechang Shi","zipex":"512200"}
+data/CN/广东省/韶关市/乳源瑶族自治县={"id":"data/CN/广东省/韶关市/乳源瑶族自治县","key":"乳源瑶族自治县","lang":"zh-hans","lname":"Ruyuan Xian","zipex":"512700","lfname":"Ruyuan Yaozu Zizhixian"}
+data/CN/广东省/韶关市/仁化县={"id":"data/CN/广东省/韶关市/仁化县","key":"仁化县","lang":"zh-hans","lname":"Renhua Xian","zipex":"512300"}
+data/CN/广东省/韶关市/南雄市={"id":"data/CN/广东省/韶关市/南雄市","key":"南雄市","lang":"zh-hans","lname":"Nanxiong Shi","zipex":"512400"}
+data/CN/广东省/韶关市/始兴县={"id":"data/CN/广东省/韶关市/始兴县","key":"始兴县","lang":"zh-hans","lname":"Shixing Xian","zipex":"512500"}
+data/CN/广东省/韶关市/新丰县={"id":"data/CN/广东省/韶关市/新丰县","key":"新丰县","lang":"zh-hans","lname":"Xinfeng Xian","zipex":"511100"}
+data/CN/广东省/韶关市/曲江区={"id":"data/CN/广东省/韶关市/曲江区","key":"曲江区","lang":"zh-hans","lname":"Qujiang Qu","zipex":"512100"}
+data/CN/广东省/韶关市/武江区={"id":"data/CN/广东省/韶关市/武江区","key":"武江区","lang":"zh-hans","lname":"Wujiang Qu","zipex":"512025"}
+data/CN/广东省/韶关市/浈江区={"id":"data/CN/广东省/韶关市/浈江区","key":"浈江区","lang":"zh-hans","lname":"Zhenjiang Qu","zipex":"512023"}
+data/CN/广东省/韶关市/翁源县={"id":"data/CN/广东省/韶关市/翁源县","key":"翁源县","lang":"zh-hans","lname":"Wengyuan Xian","zipex":"512600"}
+data/CN/广西={"id":"data/CN/广西","key":"广西","lang":"zh-hans","lname":"Guangxi","isoid":"45","sub_keys":"百色市~北海市~崇左市~防城港市~贵港市~桂林市~河池市~贺州市~来宾市~柳州市~南宁市~钦州市~梧州市~玉林市","sub_lnames":"Bose Shi~Beihai Shi~Chongzuo Shi~Fangchenggang Shi~Guigang Shi~Guilin Shi~Hechi Shi~Hezhou Shi~Laibin Shi~Liuzhou Shi~Nanning Shi~Qinzhou Shi~Wuzhou Shi~Yulin Shi","sub_zipexs":"533000~536000~532200~538001~537100~541002~547000~542800~546100~545001~530012~535000~543000~537000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/广西/北海市={"id":"data/CN/广西/北海市","key":"北海市","lang":"zh-hans","lname":"Beihai Shi","zipex":"536000","sub_keys":"海城区~合浦县~铁山港区~银海区","sub_lnames":"Haicheng Qu~Hepu Xian~Tieshangang Qu~Yinhai Qu","sub_zipexs":"536000~536100~536017~536000"}
+data/CN/广西/北海市/合浦县={"id":"data/CN/广西/北海市/合浦县","key":"合浦县","lang":"zh-hans","lname":"Hepu Xian","zipex":"536100"}
+data/CN/广西/北海市/海城区={"id":"data/CN/广西/北海市/海城区","key":"海城区","lang":"zh-hans","lname":"Haicheng Qu","zipex":"536000"}
+data/CN/广西/北海市/铁山港区={"id":"data/CN/广西/北海市/铁山港区","key":"铁山港区","lang":"zh-hans","lname":"Tieshangang Qu","zipex":"536017"}
+data/CN/广西/北海市/银海区={"id":"data/CN/广西/北海市/银海区","key":"银海区","lang":"zh-hans","lname":"Yinhai Qu","zipex":"536000"}
+data/CN/广西/南宁市={"id":"data/CN/广西/南宁市","key":"南宁市","lang":"zh-hans","lname":"Nanning Shi","zipex":"530012","sub_keys":"宾阳县~横县~江南区~良庆区~隆安县~马山县~青秀区~上林县~武鸣县~西乡塘区~兴宁区~邕宁区","sub_lnames":"Binyang Xian~Heng Xian~Jiangnan Qu~Liangqing Qu~Long'an Xian~Mashan Xian~Qingxiu Qu~Shanglin Xian~Wuming Xian~Xixiangtang Qu~Xingning Qu~Yongning Qu","sub_zipexs":"530400~530300~530031~530012~532700~530600~530022~530500~530100~530001~530012~530200"}
+data/CN/广西/南宁市/上林县={"id":"data/CN/广西/南宁市/上林县","key":"上林县","lang":"zh-hans","lname":"Shanglin Xian","zipex":"530500"}
+data/CN/广西/南宁市/兴宁区={"id":"data/CN/广西/南宁市/兴宁区","key":"兴宁区","lang":"zh-hans","lname":"Xingning Qu","zipex":"530012"}
+data/CN/广西/南宁市/宾阳县={"id":"data/CN/广西/南宁市/宾阳县","key":"宾阳县","lang":"zh-hans","lname":"Binyang Xian","zipex":"530400"}
+data/CN/广西/南宁市/横县={"id":"data/CN/广西/南宁市/横县","key":"横县","lang":"zh-hans","lname":"Heng Xian","zipex":"530300"}
+data/CN/广西/南宁市/武鸣县={"id":"data/CN/广西/南宁市/武鸣县","key":"武鸣县","lang":"zh-hans","lname":"Wuming Xian","zipex":"530100"}
+data/CN/广西/南宁市/江南区={"id":"data/CN/广西/南宁市/江南区","key":"江南区","lang":"zh-hans","lname":"Jiangnan Qu","zipex":"530031"}
+data/CN/广西/南宁市/良庆区={"id":"data/CN/广西/南宁市/良庆区","key":"良庆区","lang":"zh-hans","lname":"Liangqing Qu","zipex":"530012"}
+data/CN/广西/南宁市/西乡塘区={"id":"data/CN/广西/南宁市/西乡塘区","key":"西乡塘区","lang":"zh-hans","lname":"Xixiangtang Qu","zipex":"530001"}
+data/CN/广西/南宁市/邕宁区={"id":"data/CN/广西/南宁市/邕宁区","key":"邕宁区","lang":"zh-hans","lname":"Yongning Qu","zipex":"530200"}
+data/CN/广西/南宁市/隆安县={"id":"data/CN/广西/南宁市/隆安县","key":"隆安县","lang":"zh-hans","lname":"Long'an Xian","zipex":"532700"}
+data/CN/广西/南宁市/青秀区={"id":"data/CN/广西/南宁市/青秀区","key":"青秀区","lang":"zh-hans","lname":"Qingxiu Qu","zipex":"530022"}
+data/CN/广西/南宁市/马山县={"id":"data/CN/广西/南宁市/马山县","key":"马山县","lang":"zh-hans","lname":"Mashan Xian","zipex":"530600"}
+data/CN/广西/崇左市={"id":"data/CN/广西/崇左市","key":"崇左市","lang":"zh-hans","lname":"Chongzuo Shi","zipex":"532200","sub_keys":"大新县~扶绥县~江洲区~龙州县~宁明县~凭祥市~天等县","sub_lnames":"Daxin Xian~Fusui Xian~Jiangzhou Qu~Longzhou Xian~Ningming Xian~Pingxiang Shi~Tiandeng Xian","sub_zipexs":"532300~532100~532200~532400~532500~532600~532800"}
+data/CN/广西/崇左市/凭祥市={"id":"data/CN/广西/崇左市/凭祥市","key":"凭祥市","lang":"zh-hans","lname":"Pingxiang Shi","zipex":"532600"}
+data/CN/广西/崇左市/大新县={"id":"data/CN/广西/崇左市/大新县","key":"大新县","lang":"zh-hans","lname":"Daxin Xian","zipex":"532300"}
+data/CN/广西/崇左市/天等县={"id":"data/CN/广西/崇左市/天等县","key":"天等县","lang":"zh-hans","lname":"Tiandeng Xian","zipex":"532800"}
+data/CN/广西/崇左市/宁明县={"id":"data/CN/广西/崇左市/宁明县","key":"宁明县","lang":"zh-hans","lname":"Ningming Xian","zipex":"532500"}
+data/CN/广西/崇左市/扶绥县={"id":"data/CN/广西/崇左市/扶绥县","key":"扶绥县","lang":"zh-hans","lname":"Fusui Xian","zipex":"532100"}
+data/CN/广西/崇左市/江洲区={"id":"data/CN/广西/崇左市/江洲区","key":"江洲区","lang":"zh-hans","lname":"Jiangzhou Qu","zipex":"532200"}
+data/CN/广西/崇左市/龙州县={"id":"data/CN/广西/崇左市/龙州县","key":"龙州县","lang":"zh-hans","lname":"Longzhou Xian","zipex":"532400"}
+data/CN/广西/来宾市={"id":"data/CN/广西/来宾市","key":"来宾市","lang":"zh-hans","lname":"Laibin Shi","zipex":"546100","sub_keys":"合山市~金秀瑶族自治县~武宣县~象州县~忻城县~兴宾区","sub_lnames":"Heshan Shi~Jinxiu Xian~Wuxuan Xian~Xiangzhou Xian~Xincheng Xian~Xingbin Qu","sub_zipexs":"546500~545700~545900~545800~546200~546100","sub_lfnames":"~Jinxiu Yaozu Zizhixian~~~~"}
+data/CN/广西/来宾市/兴宾区={"id":"data/CN/广西/来宾市/兴宾区","key":"兴宾区","lang":"zh-hans","lname":"Xingbin Qu","zipex":"546100"}
+data/CN/广西/来宾市/合山市={"id":"data/CN/广西/来宾市/合山市","key":"合山市","lang":"zh-hans","lname":"Heshan Shi","zipex":"546500"}
+data/CN/广西/来宾市/忻城县={"id":"data/CN/广西/来宾市/忻城县","key":"忻城县","lang":"zh-hans","lname":"Xincheng Xian","zipex":"546200"}
+data/CN/广西/来宾市/武宣县={"id":"data/CN/广西/来宾市/武宣县","key":"武宣县","lang":"zh-hans","lname":"Wuxuan Xian","zipex":"545900"}
+data/CN/广西/来宾市/象州县={"id":"data/CN/广西/来宾市/象州县","key":"象州县","lang":"zh-hans","lname":"Xiangzhou Xian","zipex":"545800"}
+data/CN/广西/来宾市/金秀瑶族自治县={"id":"data/CN/广西/来宾市/金秀瑶族自治县","key":"金秀瑶族自治县","lang":"zh-hans","lname":"Jinxiu Xian","zipex":"545700","lfname":"Jinxiu Yaozu Zizhixian"}
+data/CN/广西/柳州市={"id":"data/CN/广西/柳州市","key":"柳州市","lang":"zh-hans","lname":"Liuzhou Shi","zipex":"545001","sub_keys":"城中区~柳北区~柳城县~柳江县~柳南区~鹿寨县~融安县~融水苗族自治县~三江侗族自治县~鱼峰区","sub_lnames":"Chengzhong Qu~Liubei Qu~Liucheng Xian~Liujiang Xian~Liunan Qu~Luzhai Xian~Rong'an Xian~Rongshui Xian~Sanjiang Xian~Yufeng Qu","sub_zipexs":"545001~545001~545200~545100~545005~545600~545400~545300~545500~545005","sub_lfnames":"~~~~~~~Rongshui Miaozu Zizhixian~Sanjiang Dongzu Zizhixian~"}
+data/CN/广西/柳州市/三江侗族自治县={"id":"data/CN/广西/柳州市/三江侗族自治县","key":"三江侗族自治县","lang":"zh-hans","lname":"Sanjiang Xian","zipex":"545500","lfname":"Sanjiang Dongzu Zizhixian"}
+data/CN/广西/柳州市/城中区={"id":"data/CN/广西/柳州市/城中区","key":"城中区","lang":"zh-hans","lname":"Chengzhong Qu","zipex":"545001"}
+data/CN/广西/柳州市/柳北区={"id":"data/CN/广西/柳州市/柳北区","key":"柳北区","lang":"zh-hans","lname":"Liubei Qu","zipex":"545001"}
+data/CN/广西/柳州市/柳南区={"id":"data/CN/广西/柳州市/柳南区","key":"柳南区","lang":"zh-hans","lname":"Liunan Qu","zipex":"545005"}
+data/CN/广西/柳州市/柳城县={"id":"data/CN/广西/柳州市/柳城县","key":"柳城县","lang":"zh-hans","lname":"Liucheng Xian","zipex":"545200"}
+data/CN/广西/柳州市/柳江县={"id":"data/CN/广西/柳州市/柳江县","key":"柳江县","lang":"zh-hans","lname":"Liujiang Xian","zipex":"545100"}
+data/CN/广西/柳州市/融安县={"id":"data/CN/广西/柳州市/融安县","key":"融安县","lang":"zh-hans","lname":"Rong'an Xian","zipex":"545400"}
+data/CN/广西/柳州市/融水苗族自治县={"id":"data/CN/广西/柳州市/融水苗族自治县","key":"融水苗族自治县","lang":"zh-hans","lname":"Rongshui Xian","zipex":"545300","lfname":"Rongshui Miaozu Zizhixian"}
+data/CN/广西/柳州市/鱼峰区={"id":"data/CN/广西/柳州市/鱼峰区","key":"鱼峰区","lang":"zh-hans","lname":"Yufeng Qu","zipex":"545005"}
+data/CN/广西/柳州市/鹿寨县={"id":"data/CN/广西/柳州市/鹿寨县","key":"鹿寨县","lang":"zh-hans","lname":"Luzhai Xian","zipex":"545600"}
+data/CN/广西/桂林市={"id":"data/CN/广西/桂林市","key":"桂林市","lang":"zh-hans","lname":"Guilin Shi","zipex":"541002","sub_keys":"叠彩区~恭城瑶族自治县~灌阳县~荔浦县~临桂县~灵川县~龙胜各族自治县~平乐县~七星区~全州县~象山区~兴安县~秀峰区~雁山区~阳朔县~永福县~资源县","sub_lnames":"Diecai Qu~Gongcheng Xian~Guanyang Xian~Lipu Qu~Lingui Xian~Lingchuan Xian~Longsheng Xian~Pingle Xian~Qixing Qu~Quanzhou Xian~Xiangshan Qu~Xing'an Xian~Xiufeng Qu~Yanshan Qu~Yangshuo Xian~Yongfu Xian~Ziyuan Xian","sub_zipexs":"541001~542500~541600~546600~541100~541200~541700~542400~541004~541500~541002~541300~541001~541006~541900~541800~541400","sub_lfnames":"~Gongcheng Yaozu Zizhixian~~~~~Longsheng Gezu Zizhixian~~~~~~~~~~"}
+data/CN/广西/桂林市/七星区={"id":"data/CN/广西/桂林市/七星区","key":"七星区","lang":"zh-hans","lname":"Qixing Qu","zipex":"541004"}
+data/CN/广西/桂林市/临桂县={"id":"data/CN/广西/桂林市/临桂县","key":"临桂县","lang":"zh-hans","lname":"Lingui Xian","zipex":"541100"}
+data/CN/广西/桂林市/全州县={"id":"data/CN/广西/桂林市/全州县","key":"全州县","lang":"zh-hans","lname":"Quanzhou Xian","zipex":"541500"}
+data/CN/广西/桂林市/兴安县={"id":"data/CN/广西/桂林市/兴安县","key":"兴安县","lang":"zh-hans","lname":"Xing'an Xian","zipex":"541300"}
+data/CN/广西/桂林市/叠彩区={"id":"data/CN/广西/桂林市/叠彩区","key":"叠彩区","lang":"zh-hans","lname":"Diecai Qu","zipex":"541001"}
+data/CN/广西/桂林市/平乐县={"id":"data/CN/广西/桂林市/平乐县","key":"平乐县","lang":"zh-hans","lname":"Pingle Xian","zipex":"542400"}
+data/CN/广西/桂林市/恭城瑶族自治县={"id":"data/CN/广西/桂林市/恭城瑶族自治县","key":"恭城瑶族自治县","lang":"zh-hans","lname":"Gongcheng Xian","zipex":"542500","lfname":"Gongcheng Yaozu Zizhixian"}
+data/CN/广西/桂林市/永福县={"id":"data/CN/广西/桂林市/永福县","key":"永福县","lang":"zh-hans","lname":"Yongfu Xian","zipex":"541800"}
+data/CN/广西/桂林市/灌阳县={"id":"data/CN/广西/桂林市/灌阳县","key":"灌阳县","lang":"zh-hans","lname":"Guanyang Xian","zipex":"541600"}
+data/CN/广西/桂林市/灵川县={"id":"data/CN/广西/桂林市/灵川县","key":"灵川县","lang":"zh-hans","lname":"Lingchuan Xian","zipex":"541200"}
+data/CN/广西/桂林市/秀峰区={"id":"data/CN/广西/桂林市/秀峰区","key":"秀峰区","lang":"zh-hans","lname":"Xiufeng Qu","zipex":"541001"}
+data/CN/广西/桂林市/荔浦县={"id":"data/CN/广西/桂林市/荔浦县","key":"荔浦县","lang":"zh-hans","lname":"Lipu Qu","zipex":"546600"}
+data/CN/广西/桂林市/象山区={"id":"data/CN/广西/桂林市/象山区","key":"象山区","lang":"zh-hans","lname":"Xiangshan Qu","zipex":"541002"}
+data/CN/广西/桂林市/资源县={"id":"data/CN/广西/桂林市/资源县","key":"资源县","lang":"zh-hans","lname":"Ziyuan Xian","zipex":"541400"}
+data/CN/广西/桂林市/阳朔县={"id":"data/CN/广西/桂林市/阳朔县","key":"阳朔县","lang":"zh-hans","lname":"Yangshuo Xian","zipex":"541900"}
+data/CN/广西/桂林市/雁山区={"id":"data/CN/广西/桂林市/雁山区","key":"雁山区","lang":"zh-hans","lname":"Yanshan Qu","zipex":"541006"}
+data/CN/广西/桂林市/龙胜各族自治县={"id":"data/CN/广西/桂林市/龙胜各族自治县","key":"龙胜各族自治县","lang":"zh-hans","lname":"Longsheng Xian","zipex":"541700","lfname":"Longsheng Gezu Zizhixian"}
+data/CN/广西/梧州市={"id":"data/CN/广西/梧州市","key":"梧州市","lang":"zh-hans","lname":"Wuzhou Shi","zipex":"543000","sub_keys":"苍梧县~岑溪市~长洲区~蝶山区~蒙山县~藤县~万秀区","sub_lnames":"Cangwu Xian~Cenxi Shi~Changzhou Qu~Dieshan Qu~Mengshan Xian~Teng Xian~Wanxiu Qu","sub_zipexs":"543100~543200~543002~543002~546700~543300~543000"}
+data/CN/广西/梧州市/万秀区={"id":"data/CN/广西/梧州市/万秀区","key":"万秀区","lang":"zh-hans","lname":"Wanxiu Qu","zipex":"543000"}
+data/CN/广西/梧州市/岑溪市={"id":"data/CN/广西/梧州市/岑溪市","key":"岑溪市","lang":"zh-hans","lname":"Cenxi Shi","zipex":"543200"}
+data/CN/广西/梧州市/苍梧县={"id":"data/CN/广西/梧州市/苍梧县","key":"苍梧县","lang":"zh-hans","lname":"Cangwu Xian","zipex":"543100"}
+data/CN/广西/梧州市/蒙山县={"id":"data/CN/广西/梧州市/蒙山县","key":"蒙山县","lang":"zh-hans","lname":"Mengshan Xian","zipex":"546700"}
+data/CN/广西/梧州市/藤县={"id":"data/CN/广西/梧州市/藤县","key":"藤县","lang":"zh-hans","lname":"Teng Xian","zipex":"543300"}
+data/CN/广西/梧州市/蝶山区={"id":"data/CN/广西/梧州市/蝶山区","key":"蝶山区","lang":"zh-hans","lname":"Dieshan Qu","zipex":"543002"}
+data/CN/广西/梧州市/长洲区={"id":"data/CN/广西/梧州市/长洲区","key":"长洲区","lang":"zh-hans","lname":"Changzhou Qu","zipex":"543002"}
+data/CN/广西/河池市={"id":"data/CN/广西/河池市","key":"河池市","lang":"zh-hans","lname":"Hechi Shi","zipex":"547000","sub_keys":"巴马瑶族自治县~大化瑶族自治县~东兰县~都安瑶族自治县~凤山县~环江毛南族自治县~金城江区~罗城仫佬族自治县~南丹县~天峨县~宜州市","sub_lnames":"Bama Xian~Dahua Xian~Donglan Xian~Du'an Xian~Fengshan Xian~Huanjiang Xian~Jinchengjiang Qu~Luocheng Xian~Nandan Xian~Tian'e Xian~Yizhou Shi","sub_zipexs":"547500~530800~547400~530700~547600~547100~547000~546400~547200~547300~546300","sub_lfnames":"Bama Yaozu Zizhixian~Dahua Yaozu Zizhixian~~Du'an Yaozu Zizhixian~~Huanjiang Maonanzu Zizhixian~~Luocheng Mulaozu Zizhixian~~~"}
+data/CN/广西/河池市/东兰县={"id":"data/CN/广西/河池市/东兰县","key":"东兰县","lang":"zh-hans","lname":"Donglan Xian","zipex":"547400"}
+data/CN/广西/河池市/凤山县={"id":"data/CN/广西/河池市/凤山县","key":"凤山县","lang":"zh-hans","lname":"Fengshan Xian","zipex":"547600"}
+data/CN/广西/河池市/南丹县={"id":"data/CN/广西/河池市/南丹县","key":"南丹县","lang":"zh-hans","lname":"Nandan Xian","zipex":"547200"}
+data/CN/广西/河池市/大化瑶族自治县={"id":"data/CN/广西/河池市/大化瑶族自治县","key":"大化瑶族自治县","lang":"zh-hans","lname":"Dahua Xian","zipex":"530800","lfname":"Dahua Yaozu Zizhixian"}
+data/CN/广西/河池市/天峨县={"id":"data/CN/广西/河池市/天峨县","key":"天峨县","lang":"zh-hans","lname":"Tian'e Xian","zipex":"547300"}
+data/CN/广西/河池市/宜州市={"id":"data/CN/广西/河池市/宜州市","key":"宜州市","lang":"zh-hans","lname":"Yizhou Shi","zipex":"546300"}
+data/CN/广西/河池市/巴马瑶族自治县={"id":"data/CN/广西/河池市/巴马瑶族自治县","key":"巴马瑶族自治县","lang":"zh-hans","lname":"Bama Xian","zipex":"547500","lfname":"Bama Yaozu Zizhixian"}
+data/CN/广西/河池市/环江毛南族自治县={"id":"data/CN/广西/河池市/环江毛南族自治县","key":"环江毛南族自治县","lang":"zh-hans","lname":"Huanjiang Xian","zipex":"547100","lfname":"Huanjiang Maonanzu Zizhixian"}
+data/CN/广西/河池市/罗城仫佬族自治县={"id":"data/CN/广西/河池市/罗城仫佬族自治县","key":"罗城仫佬族自治县","lang":"zh-hans","lname":"Luocheng Xian","zipex":"546400","lfname":"Luocheng Mulaozu Zizhixian"}
+data/CN/广西/河池市/都安瑶族自治县={"id":"data/CN/广西/河池市/都安瑶族自治县","key":"都安瑶族自治县","lang":"zh-hans","lname":"Du'an Xian","zipex":"530700","lfname":"Du'an Yaozu Zizhixian"}
+data/CN/广西/河池市/金城江区={"id":"data/CN/广西/河池市/金城江区","key":"金城江区","lang":"zh-hans","lname":"Jinchengjiang Qu","zipex":"547000"}
+data/CN/广西/玉林市={"id":"data/CN/广西/玉林市","key":"玉林市","lang":"zh-hans","lname":"Yulin Shi","zipex":"537000","sub_keys":"北流市~博白县~陆川县~容县~兴业县~玉州区","sub_lnames":"Beiliu Shi~Bobai Xian~Luchuan Xian~Rong Xian~Xingye Xian~Yuzhou Qu","sub_zipexs":"537400~537600~537700~537500~537800~537000"}
+data/CN/广西/玉林市/兴业县={"id":"data/CN/广西/玉林市/兴业县","key":"兴业县","lang":"zh-hans","lname":"Xingye Xian","zipex":"537800"}
+data/CN/广西/玉林市/北流市={"id":"data/CN/广西/玉林市/北流市","key":"北流市","lang":"zh-hans","lname":"Beiliu Shi","zipex":"537400"}
+data/CN/广西/玉林市/博白县={"id":"data/CN/广西/玉林市/博白县","key":"博白县","lang":"zh-hans","lname":"Bobai Xian","zipex":"537600"}
+data/CN/广西/玉林市/容县={"id":"data/CN/广西/玉林市/容县","key":"容县","lang":"zh-hans","lname":"Rong Xian","zipex":"537500"}
+data/CN/广西/玉林市/玉州区={"id":"data/CN/广西/玉林市/玉州区","key":"玉州区","lang":"zh-hans","lname":"Yuzhou Qu","zipex":"537000"}
+data/CN/广西/玉林市/陆川县={"id":"data/CN/广西/玉林市/陆川县","key":"陆川县","lang":"zh-hans","lname":"Luchuan Xian","zipex":"537700"}
+data/CN/广西/百色市={"id":"data/CN/广西/百色市","key":"百色市","lang":"zh-hans","lname":"Bose Shi","zipex":"533000","sub_keys":"德保县~靖西县~乐业县~凌云县~隆林各族自治县~那坡县~平果县~田东县~田林县~田阳县~西林县~右江区","sub_lnames":"Debao Xian~Jingxi Xian~Leye Xian~Lingyun Xian~Longlin Xian~Napo Xian~Pingguo Xian~Tiandong Xian~Tianlin Xian~Tianyang Xian~Xilin Xian~Youjiang Qu","sub_zipexs":"533700~533800~533200~533100~533500~533900~531400~531500~533300~533600~533500~533000","sub_lfnames":"~~~~Longlin Gezu Zizhixian~~~~~~~"}
+data/CN/广西/百色市/乐业县={"id":"data/CN/广西/百色市/乐业县","key":"乐业县","lang":"zh-hans","lname":"Leye Xian","zipex":"533200"}
+data/CN/广西/百色市/凌云县={"id":"data/CN/广西/百色市/凌云县","key":"凌云县","lang":"zh-hans","lname":"Lingyun Xian","zipex":"533100"}
+data/CN/广西/百色市/右江区={"id":"data/CN/广西/百色市/右江区","key":"右江区","lang":"zh-hans","lname":"Youjiang Qu","zipex":"533000"}
+data/CN/广西/百色市/平果县={"id":"data/CN/广西/百色市/平果县","key":"平果县","lang":"zh-hans","lname":"Pingguo Xian","zipex":"531400"}
+data/CN/广西/百色市/德保县={"id":"data/CN/广西/百色市/德保县","key":"德保县","lang":"zh-hans","lname":"Debao Xian","zipex":"533700"}
+data/CN/广西/百色市/田东县={"id":"data/CN/广西/百色市/田东县","key":"田东县","lang":"zh-hans","lname":"Tiandong Xian","zipex":"531500"}
+data/CN/广西/百色市/田林县={"id":"data/CN/广西/百色市/田林县","key":"田林县","lang":"zh-hans","lname":"Tianlin Xian","zipex":"533300"}
+data/CN/广西/百色市/田阳县={"id":"data/CN/广西/百色市/田阳县","key":"田阳县","lang":"zh-hans","lname":"Tianyang Xian","zipex":"533600"}
+data/CN/广西/百色市/西林县={"id":"data/CN/广西/百色市/西林县","key":"西林县","lang":"zh-hans","lname":"Xilin Xian","zipex":"533500"}
+data/CN/广西/百色市/那坡县={"id":"data/CN/广西/百色市/那坡县","key":"那坡县","lang":"zh-hans","lname":"Napo Xian","zipex":"533900"}
+data/CN/广西/百色市/隆林各族自治县={"id":"data/CN/广西/百色市/隆林各族自治县","key":"隆林各族自治县","lang":"zh-hans","lname":"Longlin Xian","zipex":"533500","lfname":"Longlin Gezu Zizhixian"}
+data/CN/广西/百色市/靖西县={"id":"data/CN/广西/百色市/靖西县","key":"靖西县","lang":"zh-hans","lname":"Jingxi Xian","zipex":"533800"}
+data/CN/广西/贵港市={"id":"data/CN/广西/贵港市","key":"贵港市","lang":"zh-hans","lname":"Guigang Shi","zipex":"537100","sub_keys":"港北区~港南区~桂平市~平南县~覃塘区","sub_lnames":"Gangbei Qu~Gangnan Qu~Guiping Shi~Pingnan Xian~Tantang Qu","sub_zipexs":"537100~537130~537200~537300~537121"}
+data/CN/广西/贵港市/平南县={"id":"data/CN/广西/贵港市/平南县","key":"平南县","lang":"zh-hans","lname":"Pingnan Xian","zipex":"537300"}
+data/CN/广西/贵港市/桂平市={"id":"data/CN/广西/贵港市/桂平市","key":"桂平市","lang":"zh-hans","lname":"Guiping Shi","zipex":"537200"}
+data/CN/广西/贵港市/港北区={"id":"data/CN/广西/贵港市/港北区","key":"港北区","lang":"zh-hans","lname":"Gangbei Qu","zipex":"537100"}
+data/CN/广西/贵港市/港南区={"id":"data/CN/广西/贵港市/港南区","key":"港南区","lang":"zh-hans","lname":"Gangnan Qu","zipex":"537130"}
+data/CN/广西/贵港市/覃塘区={"id":"data/CN/广西/贵港市/覃塘区","key":"覃塘区","lang":"zh-hans","lname":"Tantang Qu","zipex":"537121"}
+data/CN/广西/贺州市={"id":"data/CN/广西/贺州市","key":"贺州市","lang":"zh-hans","lname":"Hezhou Shi","zipex":"542800","sub_keys":"八步区~富川瑶族自治县~昭平县~钟山县","sub_lnames":"Babu Qu~Fuchuan Xian~Zhaoping Xian~Zhongshan Xian","sub_zipexs":"542800~542700~546800~542600","sub_lfnames":"~Fuchuan Yaozu Zizhixian~~"}
+data/CN/广西/贺州市/八步区={"id":"data/CN/广西/贺州市/八步区","key":"八步区","lang":"zh-hans","lname":"Babu Qu","zipex":"542800"}
+data/CN/广西/贺州市/富川瑶族自治县={"id":"data/CN/广西/贺州市/富川瑶族自治县","key":"富川瑶族自治县","lang":"zh-hans","lname":"Fuchuan Xian","zipex":"542700","lfname":"Fuchuan Yaozu Zizhixian"}
+data/CN/广西/贺州市/昭平县={"id":"data/CN/广西/贺州市/昭平县","key":"昭平县","lang":"zh-hans","lname":"Zhaoping Xian","zipex":"546800"}
+data/CN/广西/贺州市/钟山县={"id":"data/CN/广西/贺州市/钟山县","key":"钟山县","lang":"zh-hans","lname":"Zhongshan Xian","zipex":"542600"}
+data/CN/广西/钦州市={"id":"data/CN/广西/钦州市","key":"钦州市","lang":"zh-hans","lname":"Qinzhou Shi","zipex":"535000","sub_keys":"灵山县~浦北县~钦北区~钦南区","sub_lnames":"Lingshan Xian~Pubei Xian~Qinbei Qu~Qinnan Qu","sub_zipexs":"535400~535300~535000~535000"}
+data/CN/广西/钦州市/浦北县={"id":"data/CN/广西/钦州市/浦北县","key":"浦北县","lang":"zh-hans","lname":"Pubei Xian","zipex":"535300"}
+data/CN/广西/钦州市/灵山县={"id":"data/CN/广西/钦州市/灵山县","key":"灵山县","lang":"zh-hans","lname":"Lingshan Xian","zipex":"535400"}
+data/CN/广西/钦州市/钦北区={"id":"data/CN/广西/钦州市/钦北区","key":"钦北区","lang":"zh-hans","lname":"Qinbei Qu","zipex":"535000"}
+data/CN/广西/钦州市/钦南区={"id":"data/CN/广西/钦州市/钦南区","key":"钦南区","lang":"zh-hans","lname":"Qinnan Qu","zipex":"535000"}
+data/CN/广西/防城港市={"id":"data/CN/广西/防城港市","key":"防城港市","lang":"zh-hans","lname":"Fangchenggang Shi","zipex":"538001","sub_keys":"东兴市~防城区~港口区~上思县","sub_lnames":"Dongxing Shi~Fangcheng Qu~Gangkou Qu~Shangsi Xian","sub_zipexs":"538100~538021~538001~535500"}
+data/CN/广西/防城港市/上思县={"id":"data/CN/广西/防城港市/上思县","key":"上思县","lang":"zh-hans","lname":"Shangsi Xian","zipex":"535500"}
+data/CN/广西/防城港市/东兴市={"id":"data/CN/广西/防城港市/东兴市","key":"东兴市","lang":"zh-hans","lname":"Dongxing Shi","zipex":"538100"}
+data/CN/广西/防城港市/港口区={"id":"data/CN/广西/防城港市/港口区","key":"港口区","lang":"zh-hans","lname":"Gangkou Qu","zipex":"538001"}
+data/CN/广西/防城港市/防城区={"id":"data/CN/广西/防城港市/防城区","key":"防城区","lang":"zh-hans","lname":"Fangcheng Qu","zipex":"538021"}
+data/CN/新疆={"id":"data/CN/新疆","key":"新疆","lang":"zh-hans","lname":"Xinjiang","isoid":"65","sub_keys":"阿克苏地区~阿拉尔市~阿勒泰地区~巴音郭楞蒙古自治州~博尔塔拉蒙古自治州~昌吉回族自治州~哈密地区~和田地区~喀什地区~克拉玛依市~克孜勒苏柯尔克孜自治州~石河子市~塔城地区~图木舒克市~吐鲁番地区~乌鲁木齐市~五家渠市~伊犁哈萨克自治州","sub_lnames":"Aksu Diqu~Ala'er Shi~Altay Shi~Bayingolin Zhou~Bortala Zhou~Changji Zhou~Hami (Kumul) Diqu~Hotan Diqu~Kashi (Kaxgar) Diqu~Karamay Shi~Kizilsu Zhou~Shihezi Shi~Tacheng (Qoqek) Diqu~Tumushuke Shi~Turpan Diqu~Ürümqi Shi~Wujiaqu Shi~Ili Zhou","sub_zipexs":"843000~843300~836500~841000~833400~831100~839000~848000~844000~834000~845350~832001~834700~843806~838000~830002~831300~835000","sub_mores":"true~false~true~true~true~true~true~true~true~true~true~false~true~false~true~true~false~true","sub_lfnames":"~~~Bayingolin Mongol Zizhizhou~Bortala Mongol Zizhizhou~Changji Huizu Zizhizhou~~~~~Kizilsu Kirgiz Zizhizhou~~~~~~~Ili Kazak Zizhizhou"}
+data/CN/新疆/乌鲁木齐市={"id":"data/CN/新疆/乌鲁木齐市","key":"乌鲁木齐市","lang":"zh-hans","lname":"Ürümqi Shi","zipex":"830002","sub_keys":"达坂城区~米东区~沙依巴克区~水磨沟区~天山区~头屯河区~乌鲁木齐县~新市区","sub_lnames":"Dabancheng Qu~Midong Qu~Saybagh Qu~Shuimogou Qu~Tianshan Qu~Toutunhe Qu~Ürümqi Xian~Xinshi Qu","sub_zipexs":"830039~831400~830000~830017~830002~830023~830002~830011"}
+data/CN/新疆/乌鲁木齐市/乌鲁木齐县={"id":"data/CN/新疆/乌鲁木齐市/乌鲁木齐县","key":"乌鲁木齐县","lang":"zh-hans","lname":"Ürümqi Xian","zipex":"830002"}
+data/CN/新疆/乌鲁木齐市/天山区={"id":"data/CN/新疆/乌鲁木齐市/天山区","key":"天山区","lang":"zh-hans","lname":"Tianshan Qu","zipex":"830002"}
+data/CN/新疆/乌鲁木齐市/头屯河区={"id":"data/CN/新疆/乌鲁木齐市/头屯河区","key":"头屯河区","lang":"zh-hans","lname":"Toutunhe Qu","zipex":"830023"}
+data/CN/新疆/乌鲁木齐市/新市区={"id":"data/CN/新疆/乌鲁木齐市/新市区","key":"新市区","lang":"zh-hans","lname":"Xinshi Qu","zipex":"830011"}
+data/CN/新疆/乌鲁木齐市/水磨沟区={"id":"data/CN/新疆/乌鲁木齐市/水磨沟区","key":"水磨沟区","lang":"zh-hans","lname":"Shuimogou Qu","zipex":"830017"}
+data/CN/新疆/乌鲁木齐市/沙依巴克区={"id":"data/CN/新疆/乌鲁木齐市/沙依巴克区","key":"沙依巴克区","lang":"zh-hans","lname":"Saybagh Qu","zipex":"830000"}
+data/CN/新疆/乌鲁木齐市/米东区={"id":"data/CN/新疆/乌鲁木齐市/米东区","key":"米东区","lang":"zh-hans","lname":"Midong Qu","zipex":"831400"}
+data/CN/新疆/乌鲁木齐市/达坂城区={"id":"data/CN/新疆/乌鲁木齐市/达坂城区","key":"达坂城区","lang":"zh-hans","lname":"Dabancheng Qu","zipex":"830039"}
+data/CN/新疆/五家渠市={"id":"data/CN/新疆/五家渠市","key":"五家渠市","lang":"zh-hans","lname":"Wujiaqu Shi","zipex":"831300"}
+data/CN/新疆/伊犁哈萨克自治州={"id":"data/CN/新疆/伊犁哈萨克自治州","key":"伊犁哈萨克自治州","lang":"zh-hans","lname":"Ili Zhou","zipex":"835000","lfname":"Ili Kazak Zizhizhou","sub_keys":"察布查尔锡伯自治县~巩留县~霍城县~奎屯市~尼勒克县~特克斯县~新源县~伊宁市~伊宁县~昭苏县","sub_lnames":"Qapqal Xian~Gongliu (Tokkuztara) Xian~Huocheng Xian~Kuytun Shi~Nilka Xian~Tekes Xian~Xinyuan (Künes) Xian~Yining (Gulja) Shi~Yining (Gulja) Xian~Zhaosu (Mongolküre) Xian","sub_zipexs":"835300~835400~835200~833200~835700~835500~835800~835000~835100~835600","sub_lfnames":"Qapqal Xibe Zizhixian~~~~~~~~~"}
+data/CN/新疆/伊犁哈萨克自治州/伊宁县={"id":"data/CN/新疆/伊犁哈萨克自治州/伊宁县","key":"伊宁县","lang":"zh-hans","lname":"Yining (Gulja) Xian","zipex":"835100"}
+data/CN/新疆/伊犁哈萨克自治州/伊宁市={"id":"data/CN/新疆/伊犁哈萨克自治州/伊宁市","key":"伊宁市","lang":"zh-hans","lname":"Yining (Gulja) Shi","zipex":"835000"}
+data/CN/新疆/伊犁哈萨克自治州/奎屯市={"id":"data/CN/新疆/伊犁哈萨克自治州/奎屯市","key":"奎屯市","lang":"zh-hans","lname":"Kuytun Shi","zipex":"833200"}
+data/CN/新疆/伊犁哈萨克自治州/察布查尔锡伯自治县={"id":"data/CN/新疆/伊犁哈萨克自治州/察布查尔锡伯自治县","key":"察布查尔锡伯自治县","lang":"zh-hans","lname":"Qapqal Xian","zipex":"835300","lfname":"Qapqal Xibe Zizhixian"}
+data/CN/新疆/伊犁哈萨克自治州/尼勒克县={"id":"data/CN/新疆/伊犁哈萨克自治州/尼勒克县","key":"尼勒克县","lang":"zh-hans","lname":"Nilka Xian","zipex":"835700"}
+data/CN/新疆/伊犁哈萨克自治州/巩留县={"id":"data/CN/新疆/伊犁哈萨克自治州/巩留县","key":"巩留县","lang":"zh-hans","lname":"Gongliu (Tokkuztara) Xian","zipex":"835400"}
+data/CN/新疆/伊犁哈萨克自治州/新源县={"id":"data/CN/新疆/伊犁哈萨克自治州/新源县","key":"新源县","lang":"zh-hans","lname":"Xinyuan (Künes) Xian","zipex":"835800"}
+data/CN/新疆/伊犁哈萨克自治州/昭苏县={"id":"data/CN/新疆/伊犁哈萨克自治州/昭苏县","key":"昭苏县","lang":"zh-hans","lname":"Zhaosu (Mongolküre) Xian","zipex":"835600"}
+data/CN/新疆/伊犁哈萨克自治州/特克斯县={"id":"data/CN/新疆/伊犁哈萨克自治州/特克斯县","key":"特克斯县","lang":"zh-hans","lname":"Tekes Xian","zipex":"835500"}
+data/CN/新疆/伊犁哈萨克自治州/霍城县={"id":"data/CN/新疆/伊犁哈萨克自治州/霍城县","key":"霍城县","lang":"zh-hans","lname":"Huocheng Xian","zipex":"835200"}
+data/CN/新疆/克孜勒苏柯尔克孜自治州={"id":"data/CN/新疆/克孜勒苏柯尔克孜自治州","key":"克孜勒苏柯尔克孜自治州","lang":"zh-hans","lname":"Kizilsu Zhou","zipex":"845350","lfname":"Kizilsu Kirgiz Zizhizhou","sub_keys":"阿合奇县~阿克陶县~阿图什市~乌恰县","sub_lnames":"Akqi Xian~Akto Xian~Artux Shi~Wuqia (Ulugqat) Xian","sub_zipexs":"843500~845550~845350~845450"}
+data/CN/新疆/克孜勒苏柯尔克孜自治州/乌恰县={"id":"data/CN/新疆/克孜勒苏柯尔克孜自治州/乌恰县","key":"乌恰县","lang":"zh-hans","lname":"Wuqia (Ulugqat) Xian","zipex":"845450"}
+data/CN/新疆/克孜勒苏柯尔克孜自治州/阿克陶县={"id":"data/CN/新疆/克孜勒苏柯尔克孜自治州/阿克陶县","key":"阿克陶县","lang":"zh-hans","lname":"Akto Xian","zipex":"845550"}
+data/CN/新疆/克孜勒苏柯尔克孜自治州/阿合奇县={"id":"data/CN/新疆/克孜勒苏柯尔克孜自治州/阿合奇县","key":"阿合奇县","lang":"zh-hans","lname":"Akqi Xian","zipex":"843500"}
+data/CN/新疆/克孜勒苏柯尔克孜自治州/阿图什市={"id":"data/CN/新疆/克孜勒苏柯尔克孜自治州/阿图什市","key":"阿图什市","lang":"zh-hans","lname":"Artux Shi","zipex":"845350"}
+data/CN/新疆/克拉玛依市={"id":"data/CN/新疆/克拉玛依市","key":"克拉玛依市","lang":"zh-hans","lname":"Karamay Shi","zipex":"834000","sub_keys":"白碱滩区~独山子区~克拉玛依区~乌尔禾区","sub_lnames":"Baijiantan Qu~Dushanzi Qu~Karamay Qu~Orku Qu","sub_zipexs":"834009~838600~834018~834014"}
+data/CN/新疆/克拉玛依市/乌尔禾区={"id":"data/CN/新疆/克拉玛依市/乌尔禾区","key":"乌尔禾区","lang":"zh-hans","lname":"Orku Qu","zipex":"834014"}
+data/CN/新疆/克拉玛依市/克拉玛依区={"id":"data/CN/新疆/克拉玛依市/克拉玛依区","key":"克拉玛依区","lang":"zh-hans","lname":"Karamay Qu","zipex":"834018"}
+data/CN/新疆/克拉玛依市/独山子区={"id":"data/CN/新疆/克拉玛依市/独山子区","key":"独山子区","lang":"zh-hans","lname":"Dushanzi Qu","zipex":"838600"}
+data/CN/新疆/克拉玛依市/白碱滩区={"id":"data/CN/新疆/克拉玛依市/白碱滩区","key":"白碱滩区","lang":"zh-hans","lname":"Baijiantan Qu","zipex":"834009"}
+data/CN/新疆/博尔塔拉蒙古自治州={"id":"data/CN/新疆/博尔塔拉蒙古自治州","key":"博尔塔拉蒙古自治州","lang":"zh-hans","lname":"Bortala Zhou","zipex":"833400","lfname":"Bortala Mongol Zizhizhou","sub_keys":"博乐市~精河县~温泉县","sub_lnames":"Bole (Bortala) Shi~Jinghe (Jing) Xian~Wenquan (Arixang) Xian","sub_zipexs":"833400~833300~833500"}
+data/CN/新疆/博尔塔拉蒙古自治州/博乐市={"id":"data/CN/新疆/博尔塔拉蒙古自治州/博乐市","key":"博乐市","lang":"zh-hans","lname":"Bole (Bortala) Shi","zipex":"833400"}
+data/CN/新疆/博尔塔拉蒙古自治州/温泉县={"id":"data/CN/新疆/博尔塔拉蒙古自治州/温泉县","key":"温泉县","lang":"zh-hans","lname":"Wenquan (Arixang) Xian","zipex":"833500"}
+data/CN/新疆/博尔塔拉蒙古自治州/精河县={"id":"data/CN/新疆/博尔塔拉蒙古自治州/精河县","key":"精河县","lang":"zh-hans","lname":"Jinghe (Jing) Xian","zipex":"833300"}
+data/CN/新疆/吐鲁番地区={"id":"data/CN/新疆/吐鲁番地区","key":"吐鲁番地区","lang":"zh-hans","lname":"Turpan Diqu","zipex":"838000","sub_keys":"鄯善县~吐鲁番市~托克逊县","sub_lnames":"Shanshan (Piqan) Xian~Turpan Shi~Toksun Xian","sub_zipexs":"838200~838000~838100"}
+data/CN/新疆/吐鲁番地区/吐鲁番市={"id":"data/CN/新疆/吐鲁番地区/吐鲁番市","key":"吐鲁番市","lang":"zh-hans","lname":"Turpan Shi","zipex":"838000"}
+data/CN/新疆/吐鲁番地区/托克逊县={"id":"data/CN/新疆/吐鲁番地区/托克逊县","key":"托克逊县","lang":"zh-hans","lname":"Toksun Xian","zipex":"838100"}
+data/CN/新疆/吐鲁番地区/鄯善县={"id":"data/CN/新疆/吐鲁番地区/鄯善县","key":"鄯善县","lang":"zh-hans","lname":"Shanshan (Piqan) Xian","zipex":"838200"}
+data/CN/新疆/和田地区={"id":"data/CN/新疆/和田地区","key":"和田地区","lang":"zh-hans","lname":"Hotan Diqu","zipex":"848000","sub_keys":"策勒县~和田市~和田县~洛浦县~民丰县~墨玉县~皮山县~于田县","sub_lnames":"Qira Xian~Hotan Shi~Hotan Xian~Lop Xian~Minfeng (Niya) Xian~Moyu (Karakax) Xian~Pishan (Guma) Xian~Yutian (Keriya) Xian","sub_zipexs":"848300~848000~848000~848200~848500~848100~845150~848400"}
+data/CN/新疆/和田地区/于田县={"id":"data/CN/新疆/和田地区/于田县","key":"于田县","lang":"zh-hans","lname":"Yutian (Keriya) Xian","zipex":"848400"}
+data/CN/新疆/和田地区/和田县={"id":"data/CN/新疆/和田地区/和田县","key":"和田县","lang":"zh-hans","lname":"Hotan Xian","zipex":"848000"}
+data/CN/新疆/和田地区/和田市={"id":"data/CN/新疆/和田地区/和田市","key":"和田市","lang":"zh-hans","lname":"Hotan Shi","zipex":"848000"}
+data/CN/新疆/和田地区/墨玉县={"id":"data/CN/新疆/和田地区/墨玉县","key":"墨玉县","lang":"zh-hans","lname":"Moyu (Karakax) Xian","zipex":"848100"}
+data/CN/新疆/和田地区/民丰县={"id":"data/CN/新疆/和田地区/民丰县","key":"民丰县","lang":"zh-hans","lname":"Minfeng (Niya) Xian","zipex":"848500"}
+data/CN/新疆/和田地区/洛浦县={"id":"data/CN/新疆/和田地区/洛浦县","key":"洛浦县","lang":"zh-hans","lname":"Lop Xian","zipex":"848200"}
+data/CN/新疆/和田地区/皮山县={"id":"data/CN/新疆/和田地区/皮山县","key":"皮山县","lang":"zh-hans","lname":"Pishan (Guma) Xian","zipex":"845150"}
+data/CN/新疆/和田地区/策勒县={"id":"data/CN/新疆/和田地区/策勒县","key":"策勒县","lang":"zh-hans","lname":"Qira Xian","zipex":"848300"}
+data/CN/新疆/哈密地区={"id":"data/CN/新疆/哈密地区","key":"哈密地区","lang":"zh-hans","lname":"Hami (Kumul) Diqu","zipex":"839000","sub_keys":"巴里坤哈萨克自治县~哈密市~伊吾县","sub_lnames":"Barkol Xian~Hami (Kumul) Shi~Yiwu (Aratürük) Xian","sub_zipexs":"839200~839000~839300","sub_lfnames":"Barkol Kazak Zizhixian~~"}
+data/CN/新疆/哈密地区/伊吾县={"id":"data/CN/新疆/哈密地区/伊吾县","key":"伊吾县","lang":"zh-hans","lname":"Yiwu (Aratürük) Xian","zipex":"839300"}
+data/CN/新疆/哈密地区/哈密市={"id":"data/CN/新疆/哈密地区/哈密市","key":"哈密市","lang":"zh-hans","lname":"Hami (Kumul) Shi","zipex":"839000"}
+data/CN/新疆/哈密地区/巴里坤哈萨克自治县={"id":"data/CN/新疆/哈密地区/巴里坤哈萨克自治县","key":"巴里坤哈萨克自治县","lang":"zh-hans","lname":"Barkol Xian","zipex":"839200","lfname":"Barkol Kazak Zizhixian"}
+data/CN/新疆/喀什地区={"id":"data/CN/新疆/喀什地区","key":"喀什地区","lang":"zh-hans","lname":"Kashi (Kaxgar) Diqu","zipex":"844000","sub_keys":"巴楚县~伽师县~喀什市~麦盖提县~莎车县~疏附县~疏勒县~塔什库尔干塔吉克自治县~叶城县~英吉沙县~岳普湖县~泽普县","sub_lnames":"Bachu (Maralbexi) Xian~Jiashi (Payzawat) Xian~Kashi (Kaxgar) Shi~Markit Xian~Shache (Yarkant) Xian~Shufu Xian~Shule Xian~Taxkorgan Xian~Yecheng (Kargilik) Xian~Yengisar Xian~Yopurga Xian~Zepu (Poskam) Xian","sub_zipexs":"843800~844300~844000~844600~844700~844100~844200~845250~844900~844500~844400~844800","sub_lfnames":"~~~~~~~Taxkorgan Tajik Zizhixian~~~~"}
+data/CN/新疆/喀什地区/伽师县={"id":"data/CN/新疆/喀什地区/伽师县","key":"伽师县","lang":"zh-hans","lname":"Jiashi (Payzawat) Xian","zipex":"844300"}
+data/CN/新疆/喀什地区/叶城县={"id":"data/CN/新疆/喀什地区/叶城县","key":"叶城县","lang":"zh-hans","lname":"Yecheng (Kargilik) Xian","zipex":"844900"}
+data/CN/新疆/喀什地区/喀什市={"id":"data/CN/新疆/喀什地区/喀什市","key":"喀什市","lang":"zh-hans","lname":"Kashi (Kaxgar) Shi","zipex":"844000"}
+data/CN/新疆/喀什地区/塔什库尔干塔吉克自治县={"id":"data/CN/新疆/喀什地区/塔什库尔干塔吉克自治县","key":"塔什库尔干塔吉克自治县","lang":"zh-hans","lname":"Taxkorgan Xian","zipex":"845250","lfname":"Taxkorgan Tajik Zizhixian"}
+data/CN/新疆/喀什地区/岳普湖县={"id":"data/CN/新疆/喀什地区/岳普湖县","key":"岳普湖县","lang":"zh-hans","lname":"Yopurga Xian","zipex":"844400"}
+data/CN/新疆/喀什地区/巴楚县={"id":"data/CN/新疆/喀什地区/巴楚县","key":"巴楚县","lang":"zh-hans","lname":"Bachu (Maralbexi) Xian","zipex":"843800"}
+data/CN/新疆/喀什地区/泽普县={"id":"data/CN/新疆/喀什地区/泽普县","key":"泽普县","lang":"zh-hans","lname":"Zepu (Poskam) Xian","zipex":"844800"}
+data/CN/新疆/喀什地区/疏勒县={"id":"data/CN/新疆/喀什地区/疏勒县","key":"疏勒县","lang":"zh-hans","lname":"Shule Xian","zipex":"844200"}
+data/CN/新疆/喀什地区/疏附县={"id":"data/CN/新疆/喀什地区/疏附县","key":"疏附县","lang":"zh-hans","lname":"Shufu Xian","zipex":"844100"}
+data/CN/新疆/喀什地区/英吉沙县={"id":"data/CN/新疆/喀什地区/英吉沙县","key":"英吉沙县","lang":"zh-hans","lname":"Yengisar Xian","zipex":"844500"}
+data/CN/新疆/喀什地区/莎车县={"id":"data/CN/新疆/喀什地区/莎车县","key":"莎车县","lang":"zh-hans","lname":"Shache (Yarkant) Xian","zipex":"844700"}
+data/CN/新疆/喀什地区/麦盖提县={"id":"data/CN/新疆/喀什地区/麦盖提县","key":"麦盖提县","lang":"zh-hans","lname":"Markit Xian","zipex":"844600"}
+data/CN/新疆/图木舒克市={"id":"data/CN/新疆/图木舒克市","key":"图木舒克市","lang":"zh-hans","lname":"Tumushuke Shi","zipex":"843806"}
+data/CN/新疆/塔城地区={"id":"data/CN/新疆/塔城地区","key":"塔城地区","lang":"zh-hans","lname":"Tacheng (Qoqek) Diqu","zipex":"834700","sub_keys":"额敏县~和布克赛尔蒙古自治县~沙湾县~塔城市~托里县~乌苏市~裕民县","sub_lnames":"Emin (Dorbiljin) Xian~Hoboksar Xian~Shawan Xian~Tachung (Qoqek) Shi~Toli Xian~Usu Shi~Yumin (Qagantokay) Xian","sub_zipexs":"834600~834400~832100~834300~834500~833000~834800","sub_lfnames":"~Hoboksar Mongol Zizhixian~~~~~"}
+data/CN/新疆/塔城地区/乌苏市={"id":"data/CN/新疆/塔城地区/乌苏市","key":"乌苏市","lang":"zh-hans","lname":"Usu Shi","zipex":"833000"}
+data/CN/新疆/塔城地区/和布克赛尔蒙古自治县={"id":"data/CN/新疆/塔城地区/和布克赛尔蒙古自治县","key":"和布克赛尔蒙古自治县","lang":"zh-hans","lname":"Hoboksar Xian","zipex":"834400","lfname":"Hoboksar Mongol Zizhixian"}
+data/CN/新疆/塔城地区/塔城市={"id":"data/CN/新疆/塔城地区/塔城市","key":"塔城市","lang":"zh-hans","lname":"Tachung (Qoqek) Shi","zipex":"834300"}
+data/CN/新疆/塔城地区/托里县={"id":"data/CN/新疆/塔城地区/托里县","key":"托里县","lang":"zh-hans","lname":"Toli Xian","zipex":"834500"}
+data/CN/新疆/塔城地区/沙湾县={"id":"data/CN/新疆/塔城地区/沙湾县","key":"沙湾县","lang":"zh-hans","lname":"Shawan Xian","zipex":"832100"}
+data/CN/新疆/塔城地区/裕民县={"id":"data/CN/新疆/塔城地区/裕民县","key":"裕民县","lang":"zh-hans","lname":"Yumin (Qagantokay) Xian","zipex":"834800"}
+data/CN/新疆/塔城地区/额敏县={"id":"data/CN/新疆/塔城地区/额敏县","key":"额敏县","lang":"zh-hans","lname":"Emin (Dorbiljin) Xian","zipex":"834600"}
+data/CN/新疆/巴音郭楞蒙古自治州={"id":"data/CN/新疆/巴音郭楞蒙古自治州","key":"巴音郭楞蒙古自治州","lang":"zh-hans","lname":"Bayingolin Zhou","zipex":"841000","lfname":"Bayingolin Mongol Zizhizhou","sub_keys":"博湖县~和静县~和硕县~库尔勒市~轮台县~且末县~若羌县~尉犁县~焉耆回族自治县","sub_lnames":"Bohu (Bagrax) Xian~Hejing Xian~Hoxud Xian~Korla Shi~Luntai (Bügür) Xian~Qiemo (Qarqan) Xian~Ruoqiang (Qakilik) Xian~Yuli (Lopnur) Xian~Yanqi Xian","sub_zipexs":"841400~841300~841200~841000~841600~841900~841800~841500~841100","sub_lfnames":"~~~~~~~~Yanqi Huizu Zizhixian"}
+data/CN/新疆/巴音郭楞蒙古自治州/且末县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/且末县","key":"且末县","lang":"zh-hans","lname":"Qiemo (Qarqan) Xian","zipex":"841900"}
+data/CN/新疆/巴音郭楞蒙古自治州/博湖县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/博湖县","key":"博湖县","lang":"zh-hans","lname":"Bohu (Bagrax) Xian","zipex":"841400"}
+data/CN/新疆/巴音郭楞蒙古自治州/和硕县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/和硕县","key":"和硕县","lang":"zh-hans","lname":"Hoxud Xian","zipex":"841200"}
+data/CN/新疆/巴音郭楞蒙古自治州/和静县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/和静县","key":"和静县","lang":"zh-hans","lname":"Hejing Xian","zipex":"841300"}
+data/CN/新疆/巴音郭楞蒙古自治州/尉犁县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/尉犁县","key":"尉犁县","lang":"zh-hans","lname":"Yuli (Lopnur) Xian","zipex":"841500"}
+data/CN/新疆/巴音郭楞蒙古自治州/库尔勒市={"id":"data/CN/新疆/巴音郭楞蒙古自治州/库尔勒市","key":"库尔勒市","lang":"zh-hans","lname":"Korla Shi","zipex":"841000"}
+data/CN/新疆/巴音郭楞蒙古自治州/焉耆回族自治县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/焉耆回族自治县","key":"焉耆回族自治县","lang":"zh-hans","lname":"Yanqi Xian","zipex":"841100","lfname":"Yanqi Huizu Zizhixian"}
+data/CN/新疆/巴音郭楞蒙古自治州/若羌县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/若羌县","key":"若羌县","lang":"zh-hans","lname":"Ruoqiang (Qakilik) Xian","zipex":"841800"}
+data/CN/新疆/巴音郭楞蒙古自治州/轮台县={"id":"data/CN/新疆/巴音郭楞蒙古自治州/轮台县","key":"轮台县","lang":"zh-hans","lname":"Luntai (Bügür) Xian","zipex":"841600"}
+data/CN/新疆/昌吉回族自治州={"id":"data/CN/新疆/昌吉回族自治州","key":"昌吉回族自治州","lang":"zh-hans","lname":"Changji Zhou","zipex":"831100","lfname":"Changji Huizu Zizhizhou","sub_keys":"昌吉市~阜康市~呼图壁县~吉木萨尔县~玛纳斯县~木垒哈萨克自治县~奇台县","sub_lnames":"Changji Shi~Fukang Shi~Hutubi Xian~Jimsar Xian~Manas Xian~Mori Xian~Qitai Xian","sub_zipexs":"831100~831500~831200~831700~832200~831900~831800","sub_lfnames":"~~~~~Mori Kazak Zizhixian~"}
+data/CN/新疆/昌吉回族自治州/吉木萨尔县={"id":"data/CN/新疆/昌吉回族自治州/吉木萨尔县","key":"吉木萨尔县","lang":"zh-hans","lname":"Jimsar Xian","zipex":"831700"}
+data/CN/新疆/昌吉回族自治州/呼图壁县={"id":"data/CN/新疆/昌吉回族自治州/呼图壁县","key":"呼图壁县","lang":"zh-hans","lname":"Hutubi Xian","zipex":"831200"}
+data/CN/新疆/昌吉回族自治州/奇台县={"id":"data/CN/新疆/昌吉回族自治州/奇台县","key":"奇台县","lang":"zh-hans","lname":"Qitai Xian","zipex":"831800"}
+data/CN/新疆/昌吉回族自治州/昌吉市={"id":"data/CN/新疆/昌吉回族自治州/昌吉市","key":"昌吉市","lang":"zh-hans","lname":"Changji Shi","zipex":"831100"}
+data/CN/新疆/昌吉回族自治州/木垒哈萨克自治县={"id":"data/CN/新疆/昌吉回族自治州/木垒哈萨克自治县","key":"木垒哈萨克自治县","lang":"zh-hans","lname":"Mori Xian","zipex":"831900","lfname":"Mori Kazak Zizhixian"}
+data/CN/新疆/昌吉回族自治州/玛纳斯县={"id":"data/CN/新疆/昌吉回族自治州/玛纳斯县","key":"玛纳斯县","lang":"zh-hans","lname":"Manas Xian","zipex":"832200"}
+data/CN/新疆/昌吉回族自治州/阜康市={"id":"data/CN/新疆/昌吉回族自治州/阜康市","key":"阜康市","lang":"zh-hans","lname":"Fukang Shi","zipex":"831500"}
+data/CN/新疆/石河子市={"id":"data/CN/新疆/石河子市","key":"石河子市","lang":"zh-hans","lname":"Shihezi Shi","zipex":"832001"}
+data/CN/新疆/阿克苏地区={"id":"data/CN/新疆/阿克苏地区","key":"阿克苏地区","lang":"zh-hans","lname":"Aksu Diqu","zipex":"843000","sub_keys":"阿克苏市~阿瓦提县~拜城县~柯坪县~库车县~沙雅县~温宿县~乌什县~新和县","sub_lnames":"Aksu Shi~Awat Xian~Baicheng (Bay) Xian~Kalpin Xian~Kuqa Xian~Xayar Xian~Wensu Xian~Wushi (Uqturpan Xian~Xinhe (Toksu) Xian","sub_zipexs":"843000~843200~842300~843600~842000~842200~843100~843400~842100"}
+data/CN/新疆/阿克苏地区/乌什县={"id":"data/CN/新疆/阿克苏地区/乌什县","key":"乌什县","lang":"zh-hans","lname":"Wushi (Uqturpan Xian","zipex":"843400"}
+data/CN/新疆/阿克苏地区/库车县={"id":"data/CN/新疆/阿克苏地区/库车县","key":"库车县","lang":"zh-hans","lname":"Kuqa Xian","zipex":"842000"}
+data/CN/新疆/阿克苏地区/拜城县={"id":"data/CN/新疆/阿克苏地区/拜城县","key":"拜城县","lang":"zh-hans","lname":"Baicheng (Bay) Xian","zipex":"842300"}
+data/CN/新疆/阿克苏地区/新和县={"id":"data/CN/新疆/阿克苏地区/新和县","key":"新和县","lang":"zh-hans","lname":"Xinhe (Toksu) Xian","zipex":"842100"}
+data/CN/新疆/阿克苏地区/柯坪县={"id":"data/CN/新疆/阿克苏地区/柯坪县","key":"柯坪县","lang":"zh-hans","lname":"Kalpin Xian","zipex":"843600"}
+data/CN/新疆/阿克苏地区/沙雅县={"id":"data/CN/新疆/阿克苏地区/沙雅县","key":"沙雅县","lang":"zh-hans","lname":"Xayar Xian","zipex":"842200"}
+data/CN/新疆/阿克苏地区/温宿县={"id":"data/CN/新疆/阿克苏地区/温宿县","key":"温宿县","lang":"zh-hans","lname":"Wensu Xian","zipex":"843100"}
+data/CN/新疆/阿克苏地区/阿克苏市={"id":"data/CN/新疆/阿克苏地区/阿克苏市","key":"阿克苏市","lang":"zh-hans","lname":"Aksu Shi","zipex":"843000"}
+data/CN/新疆/阿克苏地区/阿瓦提县={"id":"data/CN/新疆/阿克苏地区/阿瓦提县","key":"阿瓦提县","lang":"zh-hans","lname":"Awat Xian","zipex":"843200"}
+data/CN/新疆/阿勒泰地区={"id":"data/CN/新疆/阿勒泰地区","key":"阿勒泰地区","lang":"zh-hans","lname":"Altay Shi","zipex":"836500","sub_keys":"阿勒泰市~布尔津县~福海县~富蕴县~哈巴河县~吉木乃县~青河县","sub_lnames":"Aleitai Shi~Burqin Xian~Fuhai (Burultokay) Xian~Fuyun (Koktokay) Xian~Habahe (Kaba) Xian~Jeminay Xian~Qinghe (Qinggil) Xian","sub_zipexs":"836500~836600~836400~836100~836700~836800~836200"}
+data/CN/新疆/阿勒泰地区/吉木乃县={"id":"data/CN/新疆/阿勒泰地区/吉木乃县","key":"吉木乃县","lang":"zh-hans","lname":"Jeminay Xian","zipex":"836800"}
+data/CN/新疆/阿勒泰地区/哈巴河县={"id":"data/CN/新疆/阿勒泰地区/哈巴河县","key":"哈巴河县","lang":"zh-hans","lname":"Habahe (Kaba) Xian","zipex":"836700"}
+data/CN/新疆/阿勒泰地区/富蕴县={"id":"data/CN/新疆/阿勒泰地区/富蕴县","key":"富蕴县","lang":"zh-hans","lname":"Fuyun (Koktokay) Xian","zipex":"836100"}
+data/CN/新疆/阿勒泰地区/布尔津县={"id":"data/CN/新疆/阿勒泰地区/布尔津县","key":"布尔津县","lang":"zh-hans","lname":"Burqin Xian","zipex":"836600"}
+data/CN/新疆/阿勒泰地区/福海县={"id":"data/CN/新疆/阿勒泰地区/福海县","key":"福海县","lang":"zh-hans","lname":"Fuhai (Burultokay) Xian","zipex":"836400"}
+data/CN/新疆/阿勒泰地区/阿勒泰市={"id":"data/CN/新疆/阿勒泰地区/阿勒泰市","key":"阿勒泰市","lang":"zh-hans","lname":"Aleitai Shi","zipex":"836500"}
+data/CN/新疆/阿勒泰地区/青河县={"id":"data/CN/新疆/阿勒泰地区/青河县","key":"青河县","lang":"zh-hans","lname":"Qinghe (Qinggil) Xian","zipex":"836200"}
+data/CN/新疆/阿拉尔市={"id":"data/CN/新疆/阿拉尔市","key":"阿拉尔市","lang":"zh-hans","lname":"Ala'er Shi","zipex":"843300"}
+data/CN/江苏省={"id":"data/CN/江苏省","key":"江苏省","lang":"zh-hans","lname":"Jiangsu Sheng","isoid":"32","sub_keys":"常州市~淮安市~连云港市~南京市~南通市~苏州市~宿迁市~泰州市~无锡市~徐州市~盐城市~扬州市~镇江市","sub_lnames":"Changzhou Shi~Huai'an Shi~Lianyungang Shi~Nanjing Shi~Nantong Shi~Suzhou Shi~Suqian Shi~Taizhou Shi~Wuxi Shi~Xuzhou Shi~Yancheng Shi~Yangzhou Shi~Zhenjiang Shi","sub_zipexs":"213003~223001~222002~210008~226001~215002~223800~225300~214001~221003~224005~225002~212001","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/江苏省/南京市={"id":"data/CN/江苏省/南京市","key":"南京市","lang":"zh-hans","lname":"Nanjing Shi","zipex":"210008","sub_keys":"白下区~高淳县~鼓楼区~建邺区~江宁区~溧水县~六合区~浦口区~栖霞区~秦淮区~下关区~玄武区~雨花台区","sub_lnames":"Baixia Qu~Gaochun Xian~Gulou Qu~Jianye Qu~Jiangning Qu~Lishui Xian~Liuhe Qu~Pukou Qu~Qixia Qu~Qinhuai Qu~Xiaguan Qu~Xuanwu Qu~Yuhuatai Qu","sub_zipexs":"210002~211300~210009~210004~211100~211200~211500~211800~210046~210001~210011~210018~210012"}
+data/CN/江苏省/南京市/下关区={"id":"data/CN/江苏省/南京市/下关区","key":"下关区","lang":"zh-hans","lname":"Xiaguan Qu","zipex":"210011"}
+data/CN/江苏省/南京市/六合区={"id":"data/CN/江苏省/南京市/六合区","key":"六合区","lang":"zh-hans","lname":"Liuhe Qu","zipex":"211500"}
+data/CN/江苏省/南京市/建邺区={"id":"data/CN/江苏省/南京市/建邺区","key":"建邺区","lang":"zh-hans","lname":"Jianye Qu","zipex":"210004"}
+data/CN/江苏省/南京市/栖霞区={"id":"data/CN/江苏省/南京市/栖霞区","key":"栖霞区","lang":"zh-hans","lname":"Qixia Qu","zipex":"210046"}
+data/CN/江苏省/南京市/江宁区={"id":"data/CN/江苏省/南京市/江宁区","key":"江宁区","lang":"zh-hans","lname":"Jiangning Qu","zipex":"211100"}
+data/CN/江苏省/南京市/浦口区={"id":"data/CN/江苏省/南京市/浦口区","key":"浦口区","lang":"zh-hans","lname":"Pukou Qu","zipex":"211800"}
+data/CN/江苏省/南京市/溧水县={"id":"data/CN/江苏省/南京市/溧水县","key":"溧水县","lang":"zh-hans","lname":"Lishui Xian","zipex":"211200"}
+data/CN/江苏省/南京市/玄武区={"id":"data/CN/江苏省/南京市/玄武区","key":"玄武区","lang":"zh-hans","lname":"Xuanwu Qu","zipex":"210018"}
+data/CN/江苏省/南京市/白下区={"id":"data/CN/江苏省/南京市/白下区","key":"白下区","lang":"zh-hans","lname":"Baixia Qu","zipex":"210002"}
+data/CN/江苏省/南京市/秦淮区={"id":"data/CN/江苏省/南京市/秦淮区","key":"秦淮区","lang":"zh-hans","lname":"Qinhuai Qu","zipex":"210001"}
+data/CN/江苏省/南京市/雨花台区={"id":"data/CN/江苏省/南京市/雨花台区","key":"雨花台区","lang":"zh-hans","lname":"Yuhuatai Qu","zipex":"210012"}
+data/CN/江苏省/南京市/高淳县={"id":"data/CN/江苏省/南京市/高淳县","key":"高淳县","lang":"zh-hans","lname":"Gaochun Xian","zipex":"211300"}
+data/CN/江苏省/南京市/鼓楼区={"id":"data/CN/江苏省/南京市/鼓楼区","key":"鼓楼区","lang":"zh-hans","lname":"Gulou Qu","zipex":"210009"}
+data/CN/江苏省/南通市={"id":"data/CN/江苏省/南通市","key":"南通市","lang":"zh-hans","lname":"Nantong Shi","zipex":"226001","sub_keys":"崇川区~港闸区~海安县~海门市~启东市~如东县~如皋市~通州市","sub_lnames":"Chongchuan Qu~Gangzha Qu~Hai'an Xian~Haimen Shi~Qidong Shi~Rudong Xian~Rugao Shi~Tongzhou Shi","sub_zipexs":"226001~226001~226600~226100~226200~226400~226500~226300"}
+data/CN/江苏省/南通市/启东市={"id":"data/CN/江苏省/南通市/启东市","key":"启东市","lang":"zh-hans","lname":"Qidong Shi","zipex":"226200"}
+data/CN/江苏省/南通市/如东县={"id":"data/CN/江苏省/南通市/如东县","key":"如东县","lang":"zh-hans","lname":"Rudong Xian","zipex":"226400"}
+data/CN/江苏省/南通市/如皋市={"id":"data/CN/江苏省/南通市/如皋市","key":"如皋市","lang":"zh-hans","lname":"Rugao Shi","zipex":"226500"}
+data/CN/江苏省/南通市/崇川区={"id":"data/CN/江苏省/南通市/崇川区","key":"崇川区","lang":"zh-hans","lname":"Chongchuan Qu","zipex":"226001"}
+data/CN/江苏省/南通市/海安县={"id":"data/CN/江苏省/南通市/海安县","key":"海安县","lang":"zh-hans","lname":"Hai'an Xian","zipex":"226600"}
+data/CN/江苏省/南通市/海门市={"id":"data/CN/江苏省/南通市/海门市","key":"海门市","lang":"zh-hans","lname":"Haimen Shi","zipex":"226100"}
+data/CN/江苏省/南通市/港闸区={"id":"data/CN/江苏省/南通市/港闸区","key":"港闸区","lang":"zh-hans","lname":"Gangzha Qu","zipex":"226001"}
+data/CN/江苏省/南通市/通州市={"id":"data/CN/江苏省/南通市/通州市","key":"通州市","lang":"zh-hans","lname":"Tongzhou Shi","zipex":"226300"}
+data/CN/江苏省/宿迁市={"id":"data/CN/江苏省/宿迁市","key":"宿迁市","lang":"zh-hans","lname":"Suqian Shi","zipex":"223800","sub_keys":"沭阳县~泗洪县~泗阳县~宿城区~宿豫区","sub_lnames":"Shuyang Xian~Sihong Xian~Siyang Xian~Sucheng Qu~Suyu Qu","sub_zipexs":"223600~223900~223700~223800~223800"}
+data/CN/江苏省/宿迁市/宿城区={"id":"data/CN/江苏省/宿迁市/宿城区","key":"宿城区","lang":"zh-hans","lname":"Sucheng Qu","zipex":"223800"}
+data/CN/江苏省/宿迁市/宿豫区={"id":"data/CN/江苏省/宿迁市/宿豫区","key":"宿豫区","lang":"zh-hans","lname":"Suyu Qu","zipex":"223800"}
+data/CN/江苏省/宿迁市/沭阳县={"id":"data/CN/江苏省/宿迁市/沭阳县","key":"沭阳县","lang":"zh-hans","lname":"Shuyang Xian","zipex":"223600"}
+data/CN/江苏省/宿迁市/泗洪县={"id":"data/CN/江苏省/宿迁市/泗洪县","key":"泗洪县","lang":"zh-hans","lname":"Sihong Xian","zipex":"223900"}
+data/CN/江苏省/宿迁市/泗阳县={"id":"data/CN/江苏省/宿迁市/泗阳县","key":"泗阳县","lang":"zh-hans","lname":"Siyang Xian","zipex":"223700"}
+data/CN/江苏省/常州市={"id":"data/CN/江苏省/常州市","key":"常州市","lang":"zh-hans","lname":"Changzhou Shi","zipex":"213003","sub_keys":"金坛市~溧阳市~戚墅堰区~天宁区~武进区~新北区~钟楼区","sub_lnames":"Jintan Shi~Liyang Shi~Qishuyan Qu~Tianning Qu~Wujin Qu~Xinbei Qu~Zhonglou Qu","sub_zipexs":"213200~213300~213011~213003~213161~213001~213002"}
+data/CN/江苏省/常州市/天宁区={"id":"data/CN/江苏省/常州市/天宁区","key":"天宁区","lang":"zh-hans","lname":"Tianning Qu","zipex":"213003"}
+data/CN/江苏省/常州市/戚墅堰区={"id":"data/CN/江苏省/常州市/戚墅堰区","key":"戚墅堰区","lang":"zh-hans","lname":"Qishuyan Qu","zipex":"213011"}
+data/CN/江苏省/常州市/新北区={"id":"data/CN/江苏省/常州市/新北区","key":"新北区","lang":"zh-hans","lname":"Xinbei Qu","zipex":"213001"}
+data/CN/江苏省/常州市/武进区={"id":"data/CN/江苏省/常州市/武进区","key":"武进区","lang":"zh-hans","lname":"Wujin Qu","zipex":"213161"}
+data/CN/江苏省/常州市/溧阳市={"id":"data/CN/江苏省/常州市/溧阳市","key":"溧阳市","lang":"zh-hans","lname":"Liyang Shi","zipex":"213300"}
+data/CN/江苏省/常州市/金坛市={"id":"data/CN/江苏省/常州市/金坛市","key":"金坛市","lang":"zh-hans","lname":"Jintan Shi","zipex":"213200"}
+data/CN/江苏省/常州市/钟楼区={"id":"data/CN/江苏省/常州市/钟楼区","key":"钟楼区","lang":"zh-hans","lname":"Zhonglou Qu","zipex":"213002"}
+data/CN/江苏省/徐州市={"id":"data/CN/江苏省/徐州市","key":"徐州市","lang":"zh-hans","lname":"Xuzhou Shi","zipex":"221003","sub_keys":"丰县~鼓楼区~贾汪区~九里区~沛县~邳州市~泉山区~睢宁县~铜山县~新沂市~云龙区","sub_lnames":"Feng Xian~Gulou Qu~Jiawang Qu~Jiuli Qu~Pei Xian~Pizhou Shi~Quanshan Qu~Suining Xian~Tongshan Xian~Xinyi Shi~Yunlong Qu","sub_zipexs":"221700~210005~210011~210040~221600~221300~210006~221200~221116~221400~210009"}
+data/CN/江苏省/徐州市/丰县={"id":"data/CN/江苏省/徐州市/丰县","key":"丰县","lang":"zh-hans","lname":"Feng Xian","zipex":"221700"}
+data/CN/江苏省/徐州市/九里区={"id":"data/CN/江苏省/徐州市/九里区","key":"九里区","lang":"zh-hans","lname":"Jiuli Qu","zipex":"210040"}
+data/CN/江苏省/徐州市/云龙区={"id":"data/CN/江苏省/徐州市/云龙区","key":"云龙区","lang":"zh-hans","lname":"Yunlong Qu","zipex":"210009"}
+data/CN/江苏省/徐州市/新沂市={"id":"data/CN/江苏省/徐州市/新沂市","key":"新沂市","lang":"zh-hans","lname":"Xinyi Shi","zipex":"221400"}
+data/CN/江苏省/徐州市/沛县={"id":"data/CN/江苏省/徐州市/沛县","key":"沛县","lang":"zh-hans","lname":"Pei Xian","zipex":"221600"}
+data/CN/江苏省/徐州市/泉山区={"id":"data/CN/江苏省/徐州市/泉山区","key":"泉山区","lang":"zh-hans","lname":"Quanshan Qu","zipex":"210006"}
+data/CN/江苏省/徐州市/睢宁县={"id":"data/CN/江苏省/徐州市/睢宁县","key":"睢宁县","lang":"zh-hans","lname":"Suining Xian","zipex":"221200"}
+data/CN/江苏省/徐州市/贾汪区={"id":"data/CN/江苏省/徐州市/贾汪区","key":"贾汪区","lang":"zh-hans","lname":"Jiawang Qu","zipex":"210011"}
+data/CN/江苏省/徐州市/邳州市={"id":"data/CN/江苏省/徐州市/邳州市","key":"邳州市","lang":"zh-hans","lname":"Pizhou Shi","zipex":"221300"}
+data/CN/江苏省/徐州市/铜山县={"id":"data/CN/江苏省/徐州市/铜山县","key":"铜山县","lang":"zh-hans","lname":"Tongshan Xian","zipex":"221116"}
+data/CN/江苏省/徐州市/鼓楼区={"id":"data/CN/江苏省/徐州市/鼓楼区","key":"鼓楼区","lang":"zh-hans","lname":"Gulou Qu","zipex":"210005"}
+data/CN/江苏省/扬州市={"id":"data/CN/江苏省/扬州市","key":"扬州市","lang":"zh-hans","lname":"Yangzhou Shi","zipex":"225002","sub_keys":"宝应县~高邮市~广陵区~邗江区~江都市~维扬区~仪征市","sub_lnames":"Baoying Xian~Gaoyou Shi~Guangling Qu~Hanjiang Qu~Jiangdu Shi~Weiyang Qu~Yizheng Shi","sub_zipexs":"225800~225600~225002~225002~225200~225002~211400"}
+data/CN/江苏省/扬州市/仪征市={"id":"data/CN/江苏省/扬州市/仪征市","key":"仪征市","lang":"zh-hans","lname":"Yizheng Shi","zipex":"211400"}
+data/CN/江苏省/扬州市/宝应县={"id":"data/CN/江苏省/扬州市/宝应县","key":"宝应县","lang":"zh-hans","lname":"Baoying Xian","zipex":"225800"}
+data/CN/江苏省/扬州市/广陵区={"id":"data/CN/江苏省/扬州市/广陵区","key":"广陵区","lang":"zh-hans","lname":"Guangling Qu","zipex":"225002"}
+data/CN/江苏省/扬州市/江都市={"id":"data/CN/江苏省/扬州市/江都市","key":"江都市","lang":"zh-hans","lname":"Jiangdu Shi","zipex":"225200"}
+data/CN/江苏省/扬州市/维扬区={"id":"data/CN/江苏省/扬州市/维扬区","key":"维扬区","lang":"zh-hans","lname":"Weiyang Qu","zipex":"225002"}
+data/CN/江苏省/扬州市/邗江区={"id":"data/CN/江苏省/扬州市/邗江区","key":"邗江区","lang":"zh-hans","lname":"Hanjiang Qu","zipex":"225002"}
+data/CN/江苏省/扬州市/高邮市={"id":"data/CN/江苏省/扬州市/高邮市","key":"高邮市","lang":"zh-hans","lname":"Gaoyou Shi","zipex":"225600"}
+data/CN/江苏省/无锡市={"id":"data/CN/江苏省/无锡市","key":"无锡市","lang":"zh-hans","lname":"Wuxi Shi","zipex":"214001","sub_keys":"北塘区~滨湖区~崇安区~惠山区~江阴市~南长区~锡山区~宜兴市","sub_lnames":"Beitang Qu~Binhu Qu~Chong'an Qu~Huishan Qu~Jiangyin Shi~Nanchang Qu~Xishan Qu~Yixing Shi","sub_zipexs":"214044~214062~214002~214187~214400~214021~214101~214200"}
+data/CN/江苏省/无锡市/北塘区={"id":"data/CN/江苏省/无锡市/北塘区","key":"北塘区","lang":"zh-hans","lname":"Beitang Qu","zipex":"214044"}
+data/CN/江苏省/无锡市/南长区={"id":"data/CN/江苏省/无锡市/南长区","key":"南长区","lang":"zh-hans","lname":"Nanchang Qu","zipex":"214021"}
+data/CN/江苏省/无锡市/宜兴市={"id":"data/CN/江苏省/无锡市/宜兴市","key":"宜兴市","lang":"zh-hans","lname":"Yixing Shi","zipex":"214200"}
+data/CN/江苏省/无锡市/崇安区={"id":"data/CN/江苏省/无锡市/崇安区","key":"崇安区","lang":"zh-hans","lname":"Chong'an Qu","zipex":"214002"}
+data/CN/江苏省/无锡市/惠山区={"id":"data/CN/江苏省/无锡市/惠山区","key":"惠山区","lang":"zh-hans","lname":"Huishan Qu","zipex":"214187"}
+data/CN/江苏省/无锡市/江阴市={"id":"data/CN/江苏省/无锡市/江阴市","key":"江阴市","lang":"zh-hans","lname":"Jiangyin Shi","zipex":"214400"}
+data/CN/江苏省/无锡市/滨湖区={"id":"data/CN/江苏省/无锡市/滨湖区","key":"滨湖区","lang":"zh-hans","lname":"Binhu Qu","zipex":"214062"}
+data/CN/江苏省/无锡市/锡山区={"id":"data/CN/江苏省/无锡市/锡山区","key":"锡山区","lang":"zh-hans","lname":"Xishan Qu","zipex":"214101"}
+data/CN/江苏省/泰州市={"id":"data/CN/江苏省/泰州市","key":"泰州市","lang":"zh-hans","lname":"Taizhou Shi","zipex":"225300","sub_keys":"高港区~海陵区~姜堰市~靖江市~泰兴市~兴化市","sub_lnames":"Gaogang Qu~Hailing Qu~Jiangyan Shi~Jingjiang Shi~Taixing Shi~Xinghua Shi","sub_zipexs":"225321~225300~225500~214500~225400~225700"}
+data/CN/江苏省/泰州市/兴化市={"id":"data/CN/江苏省/泰州市/兴化市","key":"兴化市","lang":"zh-hans","lname":"Xinghua Shi","zipex":"225700"}
+data/CN/江苏省/泰州市/姜堰市={"id":"data/CN/江苏省/泰州市/姜堰市","key":"姜堰市","lang":"zh-hans","lname":"Jiangyan Shi","zipex":"225500"}
+data/CN/江苏省/泰州市/泰兴市={"id":"data/CN/江苏省/泰州市/泰兴市","key":"泰兴市","lang":"zh-hans","lname":"Taixing Shi","zipex":"225400"}
+data/CN/江苏省/泰州市/海陵区={"id":"data/CN/江苏省/泰州市/海陵区","key":"海陵区","lang":"zh-hans","lname":"Hailing Qu","zipex":"225300"}
+data/CN/江苏省/泰州市/靖江市={"id":"data/CN/江苏省/泰州市/靖江市","key":"靖江市","lang":"zh-hans","lname":"Jingjiang Shi","zipex":"214500"}
+data/CN/江苏省/泰州市/高港区={"id":"data/CN/江苏省/泰州市/高港区","key":"高港区","lang":"zh-hans","lname":"Gaogang Qu","zipex":"225321"}
+data/CN/江苏省/淮安市={"id":"data/CN/江苏省/淮安市","key":"淮安市","lang":"zh-hans","lname":"Huai'an Shi","zipex":"223001","sub_keys":"楚州区~洪泽县~淮阴区~金湖县~涟水县~清河区~清浦区~盱眙县","sub_lnames":"Chuzhou Qu~Hongze Xian~Huaiyin Qu~Jinhu Xian~Lianshui Xian~Qinghe Qu~Qingpu Qu~Xuyi Xian","sub_zipexs":"223200~223100~223300~211600~223400~223001~223002~211700"}
+data/CN/江苏省/淮安市/楚州区={"id":"data/CN/江苏省/淮安市/楚州区","key":"楚州区","lang":"zh-hans","lname":"Chuzhou Qu","zipex":"223200"}
+data/CN/江苏省/淮安市/洪泽县={"id":"data/CN/江苏省/淮安市/洪泽县","key":"洪泽县","lang":"zh-hans","lname":"Hongze Xian","zipex":"223100"}
+data/CN/江苏省/淮安市/涟水县={"id":"data/CN/江苏省/淮安市/涟水县","key":"涟水县","lang":"zh-hans","lname":"Lianshui Xian","zipex":"223400"}
+data/CN/江苏省/淮安市/淮阴区={"id":"data/CN/江苏省/淮安市/淮阴区","key":"淮阴区","lang":"zh-hans","lname":"Huaiyin Qu","zipex":"223300"}
+data/CN/江苏省/淮安市/清河区={"id":"data/CN/江苏省/淮安市/清河区","key":"清河区","lang":"zh-hans","lname":"Qinghe Qu","zipex":"223001"}
+data/CN/江苏省/淮安市/清浦区={"id":"data/CN/江苏省/淮安市/清浦区","key":"清浦区","lang":"zh-hans","lname":"Qingpu Qu","zipex":"223002"}
+data/CN/江苏省/淮安市/盱眙县={"id":"data/CN/江苏省/淮安市/盱眙县","key":"盱眙县","lang":"zh-hans","lname":"Xuyi Xian","zipex":"211700"}
+data/CN/江苏省/淮安市/金湖县={"id":"data/CN/江苏省/淮安市/金湖县","key":"金湖县","lang":"zh-hans","lname":"Jinhu Xian","zipex":"211600"}
+data/CN/江苏省/盐城市={"id":"data/CN/江苏省/盐城市","key":"盐城市","lang":"zh-hans","lname":"Yancheng Shi","zipex":"224005","sub_keys":"滨海县~大丰市~东台市~阜宁县~建湖县~射阳县~亭湖区~响水县~盐都区","sub_lnames":"Binhai Xian~Dafeng Shi~Dongtai Shi~Funing Xian~Jianhu Xian~Sheyang Xian~Tinghu Qu~Xiangshui Xian~Yandu Qu","sub_zipexs":"224500~224100~224200~224400~224700~224300~224005~224600~224055"}
+data/CN/江苏省/盐城市/东台市={"id":"data/CN/江苏省/盐城市/东台市","key":"东台市","lang":"zh-hans","lname":"Dongtai Shi","zipex":"224200"}
+data/CN/江苏省/盐城市/亭湖区={"id":"data/CN/江苏省/盐城市/亭湖区","key":"亭湖区","lang":"zh-hans","lname":"Tinghu Qu","zipex":"224005"}
+data/CN/江苏省/盐城市/响水县={"id":"data/CN/江苏省/盐城市/响水县","key":"响水县","lang":"zh-hans","lname":"Xiangshui Xian","zipex":"224600"}
+data/CN/江苏省/盐城市/大丰市={"id":"data/CN/江苏省/盐城市/大丰市","key":"大丰市","lang":"zh-hans","lname":"Dafeng Shi","zipex":"224100"}
+data/CN/江苏省/盐城市/射阳县={"id":"data/CN/江苏省/盐城市/射阳县","key":"射阳县","lang":"zh-hans","lname":"Sheyang Xian","zipex":"224300"}
+data/CN/江苏省/盐城市/建湖县={"id":"data/CN/江苏省/盐城市/建湖县","key":"建湖县","lang":"zh-hans","lname":"Jianhu Xian","zipex":"224700"}
+data/CN/江苏省/盐城市/滨海县={"id":"data/CN/江苏省/盐城市/滨海县","key":"滨海县","lang":"zh-hans","lname":"Binhai Xian","zipex":"224500"}
+data/CN/江苏省/盐城市/盐都区={"id":"data/CN/江苏省/盐城市/盐都区","key":"盐都区","lang":"zh-hans","lname":"Yandu Qu","zipex":"224055"}
+data/CN/江苏省/盐城市/阜宁县={"id":"data/CN/江苏省/盐城市/阜宁县","key":"阜宁县","lang":"zh-hans","lname":"Funing Xian","zipex":"224400"}
+data/CN/江苏省/苏州市={"id":"data/CN/江苏省/苏州市","key":"苏州市","lang":"zh-hans","lname":"Suzhou Shi","zipex":"215002","sub_keys":"沧浪区~常熟市~虎丘区~金阊区~昆山市~平江区~太仓市~吴江市~吴中区~相城区~张家港市","sub_lnames":"Canglang Qu~Changshu Shi~Huqiu Qu~Jinchang Qu~Kunshan Shi~Pingjiang Qu~Taicang Shi~Wujiang Shi~Wuzhong Qu~Xiangcheng Qu~Zhangjiagang Shi","sub_zipexs":"215006~215500~215004~215008~215300~215005~215400~215200~215128~215131~215600"}
+data/CN/江苏省/苏州市/吴中区={"id":"data/CN/江苏省/苏州市/吴中区","key":"吴中区","lang":"zh-hans","lname":"Wuzhong Qu","zipex":"215128"}
+data/CN/江苏省/苏州市/吴江市={"id":"data/CN/江苏省/苏州市/吴江市","key":"吴江市","lang":"zh-hans","lname":"Wujiang Shi","zipex":"215200"}
+data/CN/江苏省/苏州市/太仓市={"id":"data/CN/江苏省/苏州市/太仓市","key":"太仓市","lang":"zh-hans","lname":"Taicang Shi","zipex":"215400"}
+data/CN/江苏省/苏州市/常熟市={"id":"data/CN/江苏省/苏州市/常熟市","key":"常熟市","lang":"zh-hans","lname":"Changshu Shi","zipex":"215500"}
+data/CN/江苏省/苏州市/平江区={"id":"data/CN/江苏省/苏州市/平江区","key":"平江区","lang":"zh-hans","lname":"Pingjiang Qu","zipex":"215005"}
+data/CN/江苏省/苏州市/张家港市={"id":"data/CN/江苏省/苏州市/张家港市","key":"张家港市","lang":"zh-hans","lname":"Zhangjiagang Shi","zipex":"215600"}
+data/CN/江苏省/苏州市/昆山市={"id":"data/CN/江苏省/苏州市/昆山市","key":"昆山市","lang":"zh-hans","lname":"Kunshan Shi","zipex":"215300"}
+data/CN/江苏省/苏州市/沧浪区={"id":"data/CN/江苏省/苏州市/沧浪区","key":"沧浪区","lang":"zh-hans","lname":"Canglang Qu","zipex":"215006"}
+data/CN/江苏省/苏州市/相城区={"id":"data/CN/江苏省/苏州市/相城区","key":"相城区","lang":"zh-hans","lname":"Xiangcheng Qu","zipex":"215131"}
+data/CN/江苏省/苏州市/虎丘区={"id":"data/CN/江苏省/苏州市/虎丘区","key":"虎丘区","lang":"zh-hans","lname":"Huqiu Qu","zipex":"215004"}
+data/CN/江苏省/苏州市/金阊区={"id":"data/CN/江苏省/苏州市/金阊区","key":"金阊区","lang":"zh-hans","lname":"Jinchang Qu","zipex":"215008"}
+data/CN/江苏省/连云港市={"id":"data/CN/江苏省/连云港市","key":"连云港市","lang":"zh-hans","lname":"Lianyungang Shi","zipex":"222002","sub_keys":"东海县~赣榆县~灌南县~灌云县~海州区~连云区~新浦区","sub_lnames":"Donghai Xian~Ganyu Xian~Guannan Xian~Guanyun Xian~Haizhou Qu~Lianyun Qu~Xinpu Qu","sub_zipexs":"222300~222100~222500~222200~222023~222042~222003"}
+data/CN/江苏省/连云港市/东海县={"id":"data/CN/江苏省/连云港市/东海县","key":"东海县","lang":"zh-hans","lname":"Donghai Xian","zipex":"222300"}
+data/CN/江苏省/连云港市/新浦区={"id":"data/CN/江苏省/连云港市/新浦区","key":"新浦区","lang":"zh-hans","lname":"Xinpu Qu","zipex":"222003"}
+data/CN/江苏省/连云港市/海州区={"id":"data/CN/江苏省/连云港市/海州区","key":"海州区","lang":"zh-hans","lname":"Haizhou Qu","zipex":"222023"}
+data/CN/江苏省/连云港市/灌云县={"id":"data/CN/江苏省/连云港市/灌云县","key":"灌云县","lang":"zh-hans","lname":"Guanyun Xian","zipex":"222200"}
+data/CN/江苏省/连云港市/灌南县={"id":"data/CN/江苏省/连云港市/灌南县","key":"灌南县","lang":"zh-hans","lname":"Guannan Xian","zipex":"222500"}
+data/CN/江苏省/连云港市/赣榆县={"id":"data/CN/江苏省/连云港市/赣榆县","key":"赣榆县","lang":"zh-hans","lname":"Ganyu Xian","zipex":"222100"}
+data/CN/江苏省/连云港市/连云区={"id":"data/CN/江苏省/连云港市/连云区","key":"连云区","lang":"zh-hans","lname":"Lianyun Qu","zipex":"222042"}
+data/CN/江苏省/镇江市={"id":"data/CN/江苏省/镇江市","key":"镇江市","lang":"zh-hans","lname":"Zhenjiang Shi","zipex":"212001","sub_keys":"丹徒区~丹阳市~京口区~句容市~润州区~扬中市","sub_lnames":"Dantu Qu~Danyang Shi~Jingkou Qu~Jurong Shi~Runzhou Qu~Yangzhong Shi","sub_zipexs":"212001~212300~226001~212400~212004~212200"}
+data/CN/江苏省/镇江市/丹徒区={"id":"data/CN/江苏省/镇江市/丹徒区","key":"丹徒区","lang":"zh-hans","lname":"Dantu Qu","zipex":"212001"}
+data/CN/江苏省/镇江市/丹阳市={"id":"data/CN/江苏省/镇江市/丹阳市","key":"丹阳市","lang":"zh-hans","lname":"Danyang Shi","zipex":"212300"}
+data/CN/江苏省/镇江市/京口区={"id":"data/CN/江苏省/镇江市/京口区","key":"京口区","lang":"zh-hans","lname":"Jingkou Qu","zipex":"226001"}
+data/CN/江苏省/镇江市/句容市={"id":"data/CN/江苏省/镇江市/句容市","key":"句容市","lang":"zh-hans","lname":"Jurong Shi","zipex":"212400"}
+data/CN/江苏省/镇江市/扬中市={"id":"data/CN/江苏省/镇江市/扬中市","key":"扬中市","lang":"zh-hans","lname":"Yangzhong Shi","zipex":"212200"}
+data/CN/江苏省/镇江市/润州区={"id":"data/CN/江苏省/镇江市/润州区","key":"润州区","lang":"zh-hans","lname":"Runzhou Qu","zipex":"212004"}
+data/CN/江西省={"id":"data/CN/江西省","key":"江西省","lang":"zh-hans","lname":"Jiangxi Sheng","isoid":"36","sub_keys":"抚州市~赣州市~吉安市~景德镇市~九江市~南昌市~萍乡市~上饶市~新余市~宜春市~鹰潭市","sub_lnames":"Fuzhou Shi~Ganzhou Shi~Ji'an Shi~Jingdezhen Shi~Jiujiang Shi~Nanchang Shi~Pingxiang Shi~Shangrao Shi~Xinyu Shi~Yichun shi~Yingtan Shi","sub_zipexs":"344000~341000~343000~333000~332000~330008~337002~334000~336525~336000~335001","sub_mores":"true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/江西省/上饶市={"id":"data/CN/江西省/上饶市","key":"上饶市","lang":"zh-hans","lname":"Shangrao Shi","zipex":"334000","sub_keys":"德兴市~广丰县~横峰县~鄱阳县~铅山县~上饶县~万年县~婺源县~信州区~弋阳县~余干县~玉山县","sub_lnames":"Dexing Shi~Guangfeng Xian~Hengfeng Xian~Poyang Xian~Yanshan Xian~Shangrao Xian~Wannian Xian~Wuyuan Xian~Xinzhou Qu~Yiyang Xian~Yugan Xian~Yushan Xian","sub_zipexs":"334200~334600~334300~333100~334500~334100~335500~333200~334000~334400~335100~334700"}
+data/CN/江西省/上饶市/万年县={"id":"data/CN/江西省/上饶市/万年县","key":"万年县","lang":"zh-hans","lname":"Wannian Xian","zipex":"335500"}
+data/CN/江西省/上饶市/上饶县={"id":"data/CN/江西省/上饶市/上饶县","key":"上饶县","lang":"zh-hans","lname":"Shangrao Xian","zipex":"334100"}
+data/CN/江西省/上饶市/余干县={"id":"data/CN/江西省/上饶市/余干县","key":"余干县","lang":"zh-hans","lname":"Yugan Xian","zipex":"335100"}
+data/CN/江西省/上饶市/信州区={"id":"data/CN/江西省/上饶市/信州区","key":"信州区","lang":"zh-hans","lname":"Xinzhou Qu","zipex":"334000"}
+data/CN/江西省/上饶市/婺源县={"id":"data/CN/江西省/上饶市/婺源县","key":"婺源县","lang":"zh-hans","lname":"Wuyuan Xian","zipex":"333200"}
+data/CN/江西省/上饶市/广丰县={"id":"data/CN/江西省/上饶市/广丰县","key":"广丰县","lang":"zh-hans","lname":"Guangfeng Xian","zipex":"334600"}
+data/CN/江西省/上饶市/弋阳县={"id":"data/CN/江西省/上饶市/弋阳县","key":"弋阳县","lang":"zh-hans","lname":"Yiyang Xian","zipex":"334400"}
+data/CN/江西省/上饶市/德兴市={"id":"data/CN/江西省/上饶市/德兴市","key":"德兴市","lang":"zh-hans","lname":"Dexing Shi","zipex":"334200"}
+data/CN/江西省/上饶市/横峰县={"id":"data/CN/江西省/上饶市/横峰县","key":"横峰县","lang":"zh-hans","lname":"Hengfeng Xian","zipex":"334300"}
+data/CN/江西省/上饶市/玉山县={"id":"data/CN/江西省/上饶市/玉山县","key":"玉山县","lang":"zh-hans","lname":"Yushan Xian","zipex":"334700"}
+data/CN/江西省/上饶市/鄱阳县={"id":"data/CN/江西省/上饶市/鄱阳县","key":"鄱阳县","lang":"zh-hans","lname":"Poyang Xian","zipex":"333100"}
+data/CN/江西省/上饶市/铅山县={"id":"data/CN/江西省/上饶市/铅山县","key":"铅山县","lang":"zh-hans","lname":"Yanshan Xian","zipex":"334500"}
+data/CN/江西省/九江市={"id":"data/CN/江西省/九江市","key":"九江市","lang":"zh-hans","lname":"Jiujiang Shi","zipex":"332000","sub_keys":"德安县~都昌县~湖口县~九江县~庐山区~彭泽县~瑞昌市~武宁县~星子县~修水县~浔阳区~永修县","sub_lnames":"De'an Xian~Duchang Xian~Hukou Xian~Jiujiang Xian~Lushan Qu~Pengze Xian~Ruichang Shi~Wuning Xian~Xingzi Xian~Xiushui Xian~Xunyang Qu~Yongxiu Xian","sub_zipexs":"330400~332600~332500~332100~332005~332700~332200~332300~332800~332400~332000~330300"}
+data/CN/江西省/九江市/九江县={"id":"data/CN/江西省/九江市/九江县","key":"九江县","lang":"zh-hans","lname":"Jiujiang Xian","zipex":"332100"}
+data/CN/江西省/九江市/修水县={"id":"data/CN/江西省/九江市/修水县","key":"修水县","lang":"zh-hans","lname":"Xiushui Xian","zipex":"332400"}
+data/CN/江西省/九江市/庐山区={"id":"data/CN/江西省/九江市/庐山区","key":"庐山区","lang":"zh-hans","lname":"Lushan Qu","zipex":"332005"}
+data/CN/江西省/九江市/彭泽县={"id":"data/CN/江西省/九江市/彭泽县","key":"彭泽县","lang":"zh-hans","lname":"Pengze Xian","zipex":"332700"}
+data/CN/江西省/九江市/德安县={"id":"data/CN/江西省/九江市/德安县","key":"德安县","lang":"zh-hans","lname":"De'an Xian","zipex":"330400"}
+data/CN/江西省/九江市/星子县={"id":"data/CN/江西省/九江市/星子县","key":"星子县","lang":"zh-hans","lname":"Xingzi Xian","zipex":"332800"}
+data/CN/江西省/九江市/武宁县={"id":"data/CN/江西省/九江市/武宁县","key":"武宁县","lang":"zh-hans","lname":"Wuning Xian","zipex":"332300"}
+data/CN/江西省/九江市/永修县={"id":"data/CN/江西省/九江市/永修县","key":"永修县","lang":"zh-hans","lname":"Yongxiu Xian","zipex":"330300"}
+data/CN/江西省/九江市/浔阳区={"id":"data/CN/江西省/九江市/浔阳区","key":"浔阳区","lang":"zh-hans","lname":"Xunyang Qu","zipex":"332000"}
+data/CN/江西省/九江市/湖口县={"id":"data/CN/江西省/九江市/湖口县","key":"湖口县","lang":"zh-hans","lname":"Hukou Xian","zipex":"332500"}
+data/CN/江西省/九江市/瑞昌市={"id":"data/CN/江西省/九江市/瑞昌市","key":"瑞昌市","lang":"zh-hans","lname":"Ruichang Shi","zipex":"332200"}
+data/CN/江西省/九江市/都昌县={"id":"data/CN/江西省/九江市/都昌县","key":"都昌县","lang":"zh-hans","lname":"Duchang Xian","zipex":"332600"}
+data/CN/江西省/南昌市={"id":"data/CN/江西省/南昌市","key":"南昌市","lang":"zh-hans","lname":"Nanchang Shi","zipex":"330008","sub_keys":"安义县~东湖区~进贤县~南昌县~青山湖区~青云谱区~湾里区~西湖区~新建县","sub_lnames":"Anyi Xian~Donghu Qu~Jinxian Xian~Nanchang Xian~Qingshanhu Qu~Qingyunpu Qu~Wanli Qu~Xihu Qu~Xinjian Xian","sub_zipexs":"330500~330006~331700~330200~330006~330001~330004~330009~330100"}
+data/CN/江西省/南昌市/东湖区={"id":"data/CN/江西省/南昌市/东湖区","key":"东湖区","lang":"zh-hans","lname":"Donghu Qu","zipex":"330006"}
+data/CN/江西省/南昌市/南昌县={"id":"data/CN/江西省/南昌市/南昌县","key":"南昌县","lang":"zh-hans","lname":"Nanchang Xian","zipex":"330200"}
+data/CN/江西省/南昌市/安义县={"id":"data/CN/江西省/南昌市/安义县","key":"安义县","lang":"zh-hans","lname":"Anyi Xian","zipex":"330500"}
+data/CN/江西省/南昌市/新建县={"id":"data/CN/江西省/南昌市/新建县","key":"新建县","lang":"zh-hans","lname":"Xinjian Xian","zipex":"330100"}
+data/CN/江西省/南昌市/湾里区={"id":"data/CN/江西省/南昌市/湾里区","key":"湾里区","lang":"zh-hans","lname":"Wanli Qu","zipex":"330004"}
+data/CN/江西省/南昌市/西湖区={"id":"data/CN/江西省/南昌市/西湖区","key":"西湖区","lang":"zh-hans","lname":"Xihu Qu","zipex":"330009"}
+data/CN/江西省/南昌市/进贤县={"id":"data/CN/江西省/南昌市/进贤县","key":"进贤县","lang":"zh-hans","lname":"Jinxian Xian","zipex":"331700"}
+data/CN/江西省/南昌市/青云谱区={"id":"data/CN/江西省/南昌市/青云谱区","key":"青云谱区","lang":"zh-hans","lname":"Qingyunpu Qu","zipex":"330001"}
+data/CN/江西省/南昌市/青山湖区={"id":"data/CN/江西省/南昌市/青山湖区","key":"青山湖区","lang":"zh-hans","lname":"Qingshanhu Qu","zipex":"330006"}
+data/CN/江西省/吉安市={"id":"data/CN/江西省/吉安市","key":"吉安市","lang":"zh-hans","lname":"Ji'an Shi","zipex":"343000","sub_keys":"安福县~吉安县~吉水县~吉州区~井冈山市~青原区~遂川县~泰和县~万安县~峡江县~新干县~永丰县~永新县","sub_lnames":"Anfu Xian~Ji'an Xian~Jishui Xian~Jizhou Qu~Jinggangshan Shi~Qingyuan Qu~Suichuan Xian~Taihe Xian~Wan'an Xian~Xiajiang Xian~Xingan Xian~Yongfeng Xian~Yongxin Xian","sub_zipexs":"343200~343100~331600~343000~343600~343009~343900~343700~343800~331409~331300~331500~343400"}
+data/CN/江西省/吉安市/万安县={"id":"data/CN/江西省/吉安市/万安县","key":"万安县","lang":"zh-hans","lname":"Wan'an Xian","zipex":"343800"}
+data/CN/江西省/吉安市/井冈山市={"id":"data/CN/江西省/吉安市/井冈山市","key":"井冈山市","lang":"zh-hans","lname":"Jinggangshan Shi","zipex":"343600"}
+data/CN/江西省/吉安市/吉安县={"id":"data/CN/江西省/吉安市/吉安县","key":"吉安县","lang":"zh-hans","lname":"Ji'an Xian","zipex":"343100"}
+data/CN/江西省/吉安市/吉州区={"id":"data/CN/江西省/吉安市/吉州区","key":"吉州区","lang":"zh-hans","lname":"Jizhou Qu","zipex":"343000"}
+data/CN/江西省/吉安市/吉水县={"id":"data/CN/江西省/吉安市/吉水县","key":"吉水县","lang":"zh-hans","lname":"Jishui Xian","zipex":"331600"}
+data/CN/江西省/吉安市/安福县={"id":"data/CN/江西省/吉安市/安福县","key":"安福县","lang":"zh-hans","lname":"Anfu Xian","zipex":"343200"}
+data/CN/江西省/吉安市/峡江县={"id":"data/CN/江西省/吉安市/峡江县","key":"峡江县","lang":"zh-hans","lname":"Xiajiang Xian","zipex":"331409"}
+data/CN/江西省/吉安市/新干县={"id":"data/CN/江西省/吉安市/新干县","key":"新干县","lang":"zh-hans","lname":"Xingan Xian","zipex":"331300"}
+data/CN/江西省/吉安市/永丰县={"id":"data/CN/江西省/吉安市/永丰县","key":"永丰县","lang":"zh-hans","lname":"Yongfeng Xian","zipex":"331500"}
+data/CN/江西省/吉安市/永新县={"id":"data/CN/江西省/吉安市/永新县","key":"永新县","lang":"zh-hans","lname":"Yongxin Xian","zipex":"343400"}
+data/CN/江西省/吉安市/泰和县={"id":"data/CN/江西省/吉安市/泰和县","key":"泰和县","lang":"zh-hans","lname":"Taihe Xian","zipex":"343700"}
+data/CN/江西省/吉安市/遂川县={"id":"data/CN/江西省/吉安市/遂川县","key":"遂川县","lang":"zh-hans","lname":"Suichuan Xian","zipex":"343900"}
+data/CN/江西省/吉安市/青原区={"id":"data/CN/江西省/吉安市/青原区","key":"青原区","lang":"zh-hans","lname":"Qingyuan Qu","zipex":"343009"}
+data/CN/江西省/宜春市={"id":"data/CN/江西省/宜春市","key":"宜春市","lang":"zh-hans","lname":"Yichun shi","zipex":"336000","sub_keys":"丰城市~奉新县~高安市~靖安县~上高县~铜鼓县~万载县~宜丰县~袁州区~樟树市","sub_lnames":"Fengcheng Shi~Fengxin Xian~Gao'an Shi~Jing'an Xian~Shanggao Xian~Tonggu Xian~Wanzai Xian~Yifeng Xian~Yuanzhou Qu~Zhangshu Shi","sub_zipexs":"331100~330700~330800~330600~336400~336200~336100~336300~336000~331200"}
+data/CN/江西省/宜春市/万载县={"id":"data/CN/江西省/宜春市/万载县","key":"万载县","lang":"zh-hans","lname":"Wanzai Xian","zipex":"336100"}
+data/CN/江西省/宜春市/上高县={"id":"data/CN/江西省/宜春市/上高县","key":"上高县","lang":"zh-hans","lname":"Shanggao Xian","zipex":"336400"}
+data/CN/江西省/宜春市/丰城市={"id":"data/CN/江西省/宜春市/丰城市","key":"丰城市","lang":"zh-hans","lname":"Fengcheng Shi","zipex":"331100"}
+data/CN/江西省/宜春市/奉新县={"id":"data/CN/江西省/宜春市/奉新县","key":"奉新县","lang":"zh-hans","lname":"Fengxin Xian","zipex":"330700"}
+data/CN/江西省/宜春市/宜丰县={"id":"data/CN/江西省/宜春市/宜丰县","key":"宜丰县","lang":"zh-hans","lname":"Yifeng Xian","zipex":"336300"}
+data/CN/江西省/宜春市/樟树市={"id":"data/CN/江西省/宜春市/樟树市","key":"樟树市","lang":"zh-hans","lname":"Zhangshu Shi","zipex":"331200"}
+data/CN/江西省/宜春市/袁州区={"id":"data/CN/江西省/宜春市/袁州区","key":"袁州区","lang":"zh-hans","lname":"Yuanzhou Qu","zipex":"336000"}
+data/CN/江西省/宜春市/铜鼓县={"id":"data/CN/江西省/宜春市/铜鼓县","key":"铜鼓县","lang":"zh-hans","lname":"Tonggu Xian","zipex":"336200"}
+data/CN/江西省/宜春市/靖安县={"id":"data/CN/江西省/宜春市/靖安县","key":"靖安县","lang":"zh-hans","lname":"Jing'an Xian","zipex":"330600"}
+data/CN/江西省/宜春市/高安市={"id":"data/CN/江西省/宜春市/高安市","key":"高安市","lang":"zh-hans","lname":"Gao'an Shi","zipex":"330800"}
+data/CN/江西省/抚州市={"id":"data/CN/江西省/抚州市","key":"抚州市","lang":"zh-hans","lname":"Fuzhou Shi","zipex":"344000","sub_keys":"崇仁县~东乡县~广昌县~金溪县~乐安县~黎川县~临川区~南城县~南丰县~宜黄县~资溪县","sub_lnames":"Chongren Xian~Dongxiang Xian~Guangchang Xian~Jinxi Xian~Le'an Xian~Lichuan Xian~Linchuan Qu~Nancheng Xian~Nanfeng Xian~Yihuang Xian~Zixi Xian","sub_zipexs":"344200~331800~344900~344800~344300~344600~344000~344700~344500~344400~335300"}
+data/CN/江西省/抚州市/东乡县={"id":"data/CN/江西省/抚州市/东乡县","key":"东乡县","lang":"zh-hans","lname":"Dongxiang Xian","zipex":"331800"}
+data/CN/江西省/抚州市/临川区={"id":"data/CN/江西省/抚州市/临川区","key":"临川区","lang":"zh-hans","lname":"Linchuan Qu","zipex":"344000"}
+data/CN/江西省/抚州市/乐安县={"id":"data/CN/江西省/抚州市/乐安县","key":"乐安县","lang":"zh-hans","lname":"Le'an Xian","zipex":"344300"}
+data/CN/江西省/抚州市/南丰县={"id":"data/CN/江西省/抚州市/南丰县","key":"南丰县","lang":"zh-hans","lname":"Nanfeng Xian","zipex":"344500"}
+data/CN/江西省/抚州市/南城县={"id":"data/CN/江西省/抚州市/南城县","key":"南城县","lang":"zh-hans","lname":"Nancheng Xian","zipex":"344700"}
+data/CN/江西省/抚州市/宜黄县={"id":"data/CN/江西省/抚州市/宜黄县","key":"宜黄县","lang":"zh-hans","lname":"Yihuang Xian","zipex":"344400"}
+data/CN/江西省/抚州市/崇仁县={"id":"data/CN/江西省/抚州市/崇仁县","key":"崇仁县","lang":"zh-hans","lname":"Chongren Xian","zipex":"344200"}
+data/CN/江西省/抚州市/广昌县={"id":"data/CN/江西省/抚州市/广昌县","key":"广昌县","lang":"zh-hans","lname":"Guangchang Xian","zipex":"344900"}
+data/CN/江西省/抚州市/资溪县={"id":"data/CN/江西省/抚州市/资溪县","key":"资溪县","lang":"zh-hans","lname":"Zixi Xian","zipex":"335300"}
+data/CN/江西省/抚州市/金溪县={"id":"data/CN/江西省/抚州市/金溪县","key":"金溪县","lang":"zh-hans","lname":"Jinxi Xian","zipex":"344800"}
+data/CN/江西省/抚州市/黎川县={"id":"data/CN/江西省/抚州市/黎川县","key":"黎川县","lang":"zh-hans","lname":"Lichuan Xian","zipex":"344600"}
+data/CN/江西省/新余市={"id":"data/CN/江西省/新余市","key":"新余市","lang":"zh-hans","lname":"Xinyu Shi","zipex":"336525","sub_keys":"分宜县~渝水区","sub_lnames":"Fenyi Xian~Yushui Qu","sub_zipexs":"336600~336500"}
+data/CN/江西省/新余市/分宜县={"id":"data/CN/江西省/新余市/分宜县","key":"分宜县","lang":"zh-hans","lname":"Fenyi Xian","zipex":"336600"}
+data/CN/江西省/新余市/渝水区={"id":"data/CN/江西省/新余市/渝水区","key":"渝水区","lang":"zh-hans","lname":"Yushui Qu","zipex":"336500"}
+data/CN/江西省/景德镇市={"id":"data/CN/江西省/景德镇市","key":"景德镇市","lang":"zh-hans","lname":"Jingdezhen Shi","zipex":"333000","sub_keys":"昌江区~浮梁县~乐平市~珠山区","sub_lnames":"Changjiang Qu~Fuliang Xian~Leping Shi~Zhushan Qu","sub_zipexs":"333000~333400~333300~333001"}
+data/CN/江西省/景德镇市/乐平市={"id":"data/CN/江西省/景德镇市/乐平市","key":"乐平市","lang":"zh-hans","lname":"Leping Shi","zipex":"333300"}
+data/CN/江西省/景德镇市/昌江区={"id":"data/CN/江西省/景德镇市/昌江区","key":"昌江区","lang":"zh-hans","lname":"Changjiang Qu","zipex":"333000"}
+data/CN/江西省/景德镇市/浮梁县={"id":"data/CN/江西省/景德镇市/浮梁县","key":"浮梁县","lang":"zh-hans","lname":"Fuliang Xian","zipex":"333400"}
+data/CN/江西省/景德镇市/珠山区={"id":"data/CN/江西省/景德镇市/珠山区","key":"珠山区","lang":"zh-hans","lname":"Zhushan Qu","zipex":"333001"}
+data/CN/江西省/萍乡市={"id":"data/CN/江西省/萍乡市","key":"萍乡市","lang":"zh-hans","lname":"Pingxiang Shi","zipex":"337002","sub_keys":"安源区~莲花县~芦溪县~上栗县~湘东区","sub_lnames":"Anyuan Qu~Lianhua Xian~Luxi Xian~Shangli Xian~Xiangdong Qu","sub_zipexs":"337035~337100~337253~337300~337016"}
+data/CN/江西省/萍乡市/上栗县={"id":"data/CN/江西省/萍乡市/上栗县","key":"上栗县","lang":"zh-hans","lname":"Shangli Xian","zipex":"337300"}
+data/CN/江西省/萍乡市/安源区={"id":"data/CN/江西省/萍乡市/安源区","key":"安源区","lang":"zh-hans","lname":"Anyuan Qu","zipex":"337035"}
+data/CN/江西省/萍乡市/湘东区={"id":"data/CN/江西省/萍乡市/湘东区","key":"湘东区","lang":"zh-hans","lname":"Xiangdong Qu","zipex":"337016"}
+data/CN/江西省/萍乡市/芦溪县={"id":"data/CN/江西省/萍乡市/芦溪县","key":"芦溪县","lang":"zh-hans","lname":"Luxi Xian","zipex":"337253"}
+data/CN/江西省/萍乡市/莲花县={"id":"data/CN/江西省/萍乡市/莲花县","key":"莲花县","lang":"zh-hans","lname":"Lianhua Xian","zipex":"337100"}
+data/CN/江西省/赣州市={"id":"data/CN/江西省/赣州市","key":"赣州市","lang":"zh-hans","lname":"Ganzhou Shi","zipex":"341000","sub_keys":"安远县~崇义县~大余县~定南县~赣县~会昌县~龙南县~南康市~宁都县~全南县~瑞金市~上犹县~石城县~信丰县~兴国县~寻乌县~于都县~章贡区","sub_lnames":"Anyuan Xian~Chongyi Xian~Dayu Xian~Dingnan Xian~Gan Xian~Huichang Xian~Longnan Xian~Nankang Shi~Ningdu Xian~Quannan Xian~Ruijin Shi~Shangyou Xian~Shicheng Xian~Xinfeng Xian~Xingguo Xian~Xunwu Xian~Yudu Xian~Zhanggong Qu","sub_zipexs":"342100~341300~341500~341900~341100~342600~341700~341400~342800~341800~342500~341200~342700~341600~342400~342210~342300~341000"}
+data/CN/江西省/赣州市/上犹县={"id":"data/CN/江西省/赣州市/上犹县","key":"上犹县","lang":"zh-hans","lname":"Shangyou Xian","zipex":"341200"}
+data/CN/江西省/赣州市/于都县={"id":"data/CN/江西省/赣州市/于都县","key":"于都县","lang":"zh-hans","lname":"Yudu Xian","zipex":"342300"}
+data/CN/江西省/赣州市/会昌县={"id":"data/CN/江西省/赣州市/会昌县","key":"会昌县","lang":"zh-hans","lname":"Huichang Xian","zipex":"342600"}
+data/CN/江西省/赣州市/信丰县={"id":"data/CN/江西省/赣州市/信丰县","key":"信丰县","lang":"zh-hans","lname":"Xinfeng Xian","zipex":"341600"}
+data/CN/江西省/赣州市/全南县={"id":"data/CN/江西省/赣州市/全南县","key":"全南县","lang":"zh-hans","lname":"Quannan Xian","zipex":"341800"}
+data/CN/江西省/赣州市/兴国县={"id":"data/CN/江西省/赣州市/兴国县","key":"兴国县","lang":"zh-hans","lname":"Xingguo Xian","zipex":"342400"}
+data/CN/江西省/赣州市/南康市={"id":"data/CN/江西省/赣州市/南康市","key":"南康市","lang":"zh-hans","lname":"Nankang Shi","zipex":"341400"}
+data/CN/江西省/赣州市/大余县={"id":"data/CN/江西省/赣州市/大余县","key":"大余县","lang":"zh-hans","lname":"Dayu Xian","zipex":"341500"}
+data/CN/江西省/赣州市/宁都县={"id":"data/CN/江西省/赣州市/宁都县","key":"宁都县","lang":"zh-hans","lname":"Ningdu Xian","zipex":"342800"}
+data/CN/江西省/赣州市/安远县={"id":"data/CN/江西省/赣州市/安远县","key":"安远县","lang":"zh-hans","lname":"Anyuan Xian","zipex":"342100"}
+data/CN/江西省/赣州市/定南县={"id":"data/CN/江西省/赣州市/定南县","key":"定南县","lang":"zh-hans","lname":"Dingnan Xian","zipex":"341900"}
+data/CN/江西省/赣州市/寻乌县={"id":"data/CN/江西省/赣州市/寻乌县","key":"寻乌县","lang":"zh-hans","lname":"Xunwu Xian","zipex":"342210"}
+data/CN/江西省/赣州市/崇义县={"id":"data/CN/江西省/赣州市/崇义县","key":"崇义县","lang":"zh-hans","lname":"Chongyi Xian","zipex":"341300"}
+data/CN/江西省/赣州市/瑞金市={"id":"data/CN/江西省/赣州市/瑞金市","key":"瑞金市","lang":"zh-hans","lname":"Ruijin Shi","zipex":"342500"}
+data/CN/江西省/赣州市/石城县={"id":"data/CN/江西省/赣州市/石城县","key":"石城县","lang":"zh-hans","lname":"Shicheng Xian","zipex":"342700"}
+data/CN/江西省/赣州市/章贡区={"id":"data/CN/江西省/赣州市/章贡区","key":"章贡区","lang":"zh-hans","lname":"Zhanggong Qu","zipex":"341000"}
+data/CN/江西省/赣州市/赣县={"id":"data/CN/江西省/赣州市/赣县","key":"赣县","lang":"zh-hans","lname":"Gan Xian","zipex":"341100"}
+data/CN/江西省/赣州市/龙南县={"id":"data/CN/江西省/赣州市/龙南县","key":"龙南县","lang":"zh-hans","lname":"Longnan Xian","zipex":"341700"}
+data/CN/江西省/鹰潭市={"id":"data/CN/江西省/鹰潭市","key":"鹰潭市","lang":"zh-hans","lname":"Yingtan Shi","zipex":"335001","sub_keys":"贵溪市~余江县~月湖区","sub_lnames":"Guixi Shi~Yujiang Xian~Yuehu Qu","sub_zipexs":"335400~335200~335000"}
+data/CN/江西省/鹰潭市/余江县={"id":"data/CN/江西省/鹰潭市/余江县","key":"余江县","lang":"zh-hans","lname":"Yujiang Xian","zipex":"335200"}
+data/CN/江西省/鹰潭市/月湖区={"id":"data/CN/江西省/鹰潭市/月湖区","key":"月湖区","lang":"zh-hans","lname":"Yuehu Qu","zipex":"335000"}
+data/CN/江西省/鹰潭市/贵溪市={"id":"data/CN/江西省/鹰潭市/贵溪市","key":"贵溪市","lang":"zh-hans","lname":"Guixi Shi","zipex":"335400"}
+data/CN/河北省={"id":"data/CN/河北省","key":"河北省","lang":"zh-hans","lname":"Hebei Sheng","isoid":"13","sub_keys":"保定市~沧州市~承德市~邯郸市~衡水市~廊坊市~秦皇岛市~石家庄市~唐山市~邢台市~张家口市","sub_lnames":"Baoding Shi~Cangzhou Shi~Chengde Shi~Handan Shi~Hengshui Shi~Langfang Shi~Qinhuangdao Shi~Shijiazhuang Shi~Tangshan Shi~Xingtai Shi~Zhangjiakou Shi","sub_zipexs":"071052~061001~067000~056002~053000~065000~066000~050011~063006~054001~075061","sub_mores":"true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/河北省/保定市={"id":"data/CN/河北省/保定市","key":"保定市","lang":"zh-hans","lname":"Baoding Shi","zipex":"071052","sub_keys":"安国市~安新县~北市区~博野县~定兴县~定州市~阜平县~高碑店市~高阳县~涞水县~涞源县~蠡县~满城县~南市区~清苑县~曲阳县~容城县~顺平县~唐县~望都县~新市区~雄县~徐水县~易县~涿州市","sub_lnames":"Anguo Shi~Anxin Xian~Beishi Qu~Boye Xian~Dingxing Xian~Dingzhou Shi~Fuping Xian~Gaobeidian Shi~Gaoyang Xian~Laishui Xian~Laiyuan Xian~Li Xian~Mancheng Xian~Nanshi Qu~Qingyuan Xian~Quyang Xian~Rongcheng Xian~Shunping Xian~Tang Xian~Wangdu Xian~Xinshi Qu~Xiong Xian~Xushui Xian~Yi Xian~Zhuozhou Shi","sub_zipexs":"071200~071600~071000~071300~074200~073000~073200~074000~071500~074100~074300~071400~072150~071000~071100~073100~071700~072250~072350~072450~071052~071800~072550~074200~072750"}
+data/CN/河北省/保定市/北市区={"id":"data/CN/河北省/保定市/北市区","key":"北市区","lang":"zh-hans","lname":"Beishi Qu","zipex":"071000"}
+data/CN/河北省/保定市/南市区={"id":"data/CN/河北省/保定市/南市区","key":"南市区","lang":"zh-hans","lname":"Nanshi Qu","zipex":"071000"}
+data/CN/河北省/保定市/博野县={"id":"data/CN/河北省/保定市/博野县","key":"博野县","lang":"zh-hans","lname":"Boye Xian","zipex":"071300"}
+data/CN/河北省/保定市/唐县={"id":"data/CN/河北省/保定市/唐县","key":"唐县","lang":"zh-hans","lname":"Tang Xian","zipex":"072350"}
+data/CN/河北省/保定市/安国市={"id":"data/CN/河北省/保定市/安国市","key":"安国市","lang":"zh-hans","lname":"Anguo Shi","zipex":"071200"}
+data/CN/河北省/保定市/安新县={"id":"data/CN/河北省/保定市/安新县","key":"安新县","lang":"zh-hans","lname":"Anxin Xian","zipex":"071600"}
+data/CN/河北省/保定市/定兴县={"id":"data/CN/河北省/保定市/定兴县","key":"定兴县","lang":"zh-hans","lname":"Dingxing Xian","zipex":"074200"}
+data/CN/河北省/保定市/定州市={"id":"data/CN/河北省/保定市/定州市","key":"定州市","lang":"zh-hans","lname":"Dingzhou Shi","zipex":"073000"}
+data/CN/河北省/保定市/容城县={"id":"data/CN/河北省/保定市/容城县","key":"容城县","lang":"zh-hans","lname":"Rongcheng Xian","zipex":"071700"}
+data/CN/河北省/保定市/徐水县={"id":"data/CN/河北省/保定市/徐水县","key":"徐水县","lang":"zh-hans","lname":"Xushui Xian","zipex":"072550"}
+data/CN/河北省/保定市/新市区={"id":"data/CN/河北省/保定市/新市区","key":"新市区","lang":"zh-hans","lname":"Xinshi Qu","zipex":"071052"}
+data/CN/河北省/保定市/易县={"id":"data/CN/河北省/保定市/易县","key":"易县","lang":"zh-hans","lname":"Yi Xian","zipex":"074200"}
+data/CN/河北省/保定市/曲阳县={"id":"data/CN/河北省/保定市/曲阳县","key":"曲阳县","lang":"zh-hans","lname":"Quyang Xian","zipex":"073100"}
+data/CN/河北省/保定市/望都县={"id":"data/CN/河北省/保定市/望都县","key":"望都县","lang":"zh-hans","lname":"Wangdu Xian","zipex":"072450"}
+data/CN/河北省/保定市/涞水县={"id":"data/CN/河北省/保定市/涞水县","key":"涞水县","lang":"zh-hans","lname":"Laishui Xian","zipex":"074100"}
+data/CN/河北省/保定市/涞源县={"id":"data/CN/河北省/保定市/涞源县","key":"涞源县","lang":"zh-hans","lname":"Laiyuan Xian","zipex":"074300"}
+data/CN/河北省/保定市/涿州市={"id":"data/CN/河北省/保定市/涿州市","key":"涿州市","lang":"zh-hans","lname":"Zhuozhou Shi","zipex":"072750"}
+data/CN/河北省/保定市/清苑县={"id":"data/CN/河北省/保定市/清苑县","key":"清苑县","lang":"zh-hans","lname":"Qingyuan Xian","zipex":"071100"}
+data/CN/河北省/保定市/满城县={"id":"data/CN/河北省/保定市/满城县","key":"满城县","lang":"zh-hans","lname":"Mancheng Xian","zipex":"072150"}
+data/CN/河北省/保定市/蠡县={"id":"data/CN/河北省/保定市/蠡县","key":"蠡县","lang":"zh-hans","lname":"Li Xian","zipex":"071400"}
+data/CN/河北省/保定市/阜平县={"id":"data/CN/河北省/保定市/阜平县","key":"阜平县","lang":"zh-hans","lname":"Fuping Xian","zipex":"073200"}
+data/CN/河北省/保定市/雄县={"id":"data/CN/河北省/保定市/雄县","key":"雄县","lang":"zh-hans","lname":"Xiong Xian","zipex":"071800"}
+data/CN/河北省/保定市/顺平县={"id":"data/CN/河北省/保定市/顺平县","key":"顺平县","lang":"zh-hans","lname":"Shunping Xian","zipex":"072250"}
+data/CN/河北省/保定市/高碑店市={"id":"data/CN/河北省/保定市/高碑店市","key":"高碑店市","lang":"zh-hans","lname":"Gaobeidian Shi","zipex":"074000"}
+data/CN/河北省/保定市/高阳县={"id":"data/CN/河北省/保定市/高阳县","key":"高阳县","lang":"zh-hans","lname":"Gaoyang Xian","zipex":"071500"}
+data/CN/河北省/唐山市={"id":"data/CN/河北省/唐山市","key":"唐山市","lang":"zh-hans","lname":"Tangshan Shi","zipex":"063006","sub_keys":"丰南区~丰润区~古冶区~开平区~乐亭县~路北区~路南区~滦南县~滦县~迁安市~迁西县~唐海县~玉田县~遵化市","sub_lnames":"Fengnan Qu~Fengrun Qu~Guye Qu~Kaiping Qu~Leting Xian~Lubei Qu~Lunan Qu~Luannan Xian~Luan Xian~Qian'an Shi~Qianxi Xian~Tanghai Xian~Yutian Xian~Zunhua Shi","sub_zipexs":"063300~063030~063104~063021~063600~063015~063017~063500~063700~064400~064300~063200~064100~064200"}
+data/CN/河北省/唐山市/丰南区={"id":"data/CN/河北省/唐山市/丰南区","key":"丰南区","lang":"zh-hans","lname":"Fengnan Qu","zipex":"063300"}
+data/CN/河北省/唐山市/丰润区={"id":"data/CN/河北省/唐山市/丰润区","key":"丰润区","lang":"zh-hans","lname":"Fengrun Qu","zipex":"063030"}
+data/CN/河北省/唐山市/乐亭县={"id":"data/CN/河北省/唐山市/乐亭县","key":"乐亭县","lang":"zh-hans","lname":"Leting Xian","zipex":"063600"}
+data/CN/河北省/唐山市/古冶区={"id":"data/CN/河北省/唐山市/古冶区","key":"古冶区","lang":"zh-hans","lname":"Guye Qu","zipex":"063104"}
+data/CN/河北省/唐山市/唐海县={"id":"data/CN/河北省/唐山市/唐海县","key":"唐海县","lang":"zh-hans","lname":"Tanghai Xian","zipex":"063200"}
+data/CN/河北省/唐山市/开平区={"id":"data/CN/河北省/唐山市/开平区","key":"开平区","lang":"zh-hans","lname":"Kaiping Qu","zipex":"063021"}
+data/CN/河北省/唐山市/滦南县={"id":"data/CN/河北省/唐山市/滦南县","key":"滦南县","lang":"zh-hans","lname":"Luannan Xian","zipex":"063500"}
+data/CN/河北省/唐山市/滦县={"id":"data/CN/河北省/唐山市/滦县","key":"滦县","lang":"zh-hans","lname":"Luan Xian","zipex":"063700"}
+data/CN/河北省/唐山市/玉田县={"id":"data/CN/河北省/唐山市/玉田县","key":"玉田县","lang":"zh-hans","lname":"Yutian Xian","zipex":"064100"}
+data/CN/河北省/唐山市/路北区={"id":"data/CN/河北省/唐山市/路北区","key":"路北区","lang":"zh-hans","lname":"Lubei Qu","zipex":"063015"}
+data/CN/河北省/唐山市/路南区={"id":"data/CN/河北省/唐山市/路南区","key":"路南区","lang":"zh-hans","lname":"Lunan Qu","zipex":"063017"}
+data/CN/河北省/唐山市/迁安市={"id":"data/CN/河北省/唐山市/迁安市","key":"迁安市","lang":"zh-hans","lname":"Qian'an Shi","zipex":"064400"}
+data/CN/河北省/唐山市/迁西县={"id":"data/CN/河北省/唐山市/迁西县","key":"迁西县","lang":"zh-hans","lname":"Qianxi Xian","zipex":"064300"}
+data/CN/河北省/唐山市/遵化市={"id":"data/CN/河北省/唐山市/遵化市","key":"遵化市","lang":"zh-hans","lname":"Zunhua Shi","zipex":"064200"}
+data/CN/河北省/廊坊市={"id":"data/CN/河北省/廊坊市","key":"廊坊市","lang":"zh-hans","lname":"Langfang Shi","zipex":"065000","sub_keys":"安次区~霸州市~大厂回族自治县~大城县~固安县~广阳区~三河市~文安县~香河县~永清县","sub_lnames":"Anci Qu~Bazhou Shi~Dachang Xian~Daicheng Xian~Gu'an Xian~Guangyang Qu~Sanhe Shi~Wen'an Xian~Xianghe Xian~Yongqing Xian","sub_zipexs":"065000~065700~065300~065900~065500~065000~065200~065800~065400~065600","sub_lfnames":"~~Dachang Huizu Zizhixian~~~~~~~"}
+data/CN/河北省/廊坊市/三河市={"id":"data/CN/河北省/廊坊市/三河市","key":"三河市","lang":"zh-hans","lname":"Sanhe Shi","zipex":"065200"}
+data/CN/河北省/廊坊市/固安县={"id":"data/CN/河北省/廊坊市/固安县","key":"固安县","lang":"zh-hans","lname":"Gu'an Xian","zipex":"065500"}
+data/CN/河北省/廊坊市/大厂回族自治县={"id":"data/CN/河北省/廊坊市/大厂回族自治县","key":"大厂回族自治县","lang":"zh-hans","lname":"Dachang Xian","zipex":"065300","lfname":"Dachang Huizu Zizhixian"}
+data/CN/河北省/廊坊市/大城县={"id":"data/CN/河北省/廊坊市/大城县","key":"大城县","lang":"zh-hans","lname":"Daicheng Xian","zipex":"065900"}
+data/CN/河北省/廊坊市/安次区={"id":"data/CN/河北省/廊坊市/安次区","key":"安次区","lang":"zh-hans","lname":"Anci Qu","zipex":"065000"}
+data/CN/河北省/廊坊市/广阳区={"id":"data/CN/河北省/廊坊市/广阳区","key":"广阳区","lang":"zh-hans","lname":"Guangyang Qu","zipex":"065000"}
+data/CN/河北省/廊坊市/文安县={"id":"data/CN/河北省/廊坊市/文安县","key":"文安县","lang":"zh-hans","lname":"Wen'an Xian","zipex":"065800"}
+data/CN/河北省/廊坊市/永清县={"id":"data/CN/河北省/廊坊市/永清县","key":"永清县","lang":"zh-hans","lname":"Yongqing Xian","zipex":"065600"}
+data/CN/河北省/廊坊市/霸州市={"id":"data/CN/河北省/廊坊市/霸州市","key":"霸州市","lang":"zh-hans","lname":"Bazhou Shi","zipex":"065700"}
+data/CN/河北省/廊坊市/香河县={"id":"data/CN/河北省/廊坊市/香河县","key":"香河县","lang":"zh-hans","lname":"Xianghe Xian","zipex":"065400"}
+data/CN/河北省/张家口市={"id":"data/CN/河北省/张家口市","key":"张家口市","lang":"zh-hans","lname":"Zhangjiakou Shi","zipex":"075061","sub_keys":"赤城县~崇礼县~沽源县~怀安县~怀来县~康保县~桥东区~桥西区~尚义县~万全县~蔚县~下花园区~宣化区~宣化县~阳原县~张北县~涿鹿县","sub_lnames":"Chicheng Xian~Chongli Xian~Guyuan Xian~Huai'an Xian~Huailai Xian~Kangbao Xian~Qiaodong Qu~Qiaoxi Qu~Shangyi Xian~Wanquan Xian~Yu Xian~Xiahuayuan Qu~Xuanhua Qu~Xuanhua Xian~Yangyuan Xian~Zhangbei Xian~Zhuolu Xian","sub_zipexs":"075500~076350~076550~076150~075400~076650~075000~075061~076750~076250~075700~075300~075100~075100~075800~076450~075600"}
+data/CN/河北省/张家口市/万全县={"id":"data/CN/河北省/张家口市/万全县","key":"万全县","lang":"zh-hans","lname":"Wanquan Xian","zipex":"076250"}
+data/CN/河北省/张家口市/下花园区={"id":"data/CN/河北省/张家口市/下花园区","key":"下花园区","lang":"zh-hans","lname":"Xiahuayuan Qu","zipex":"075300"}
+data/CN/河北省/张家口市/宣化区={"id":"data/CN/河北省/张家口市/宣化区","key":"宣化区","lang":"zh-hans","lname":"Xuanhua Qu","zipex":"075100"}
+data/CN/河北省/张家口市/宣化县={"id":"data/CN/河北省/张家口市/宣化县","key":"宣化县","lang":"zh-hans","lname":"Xuanhua Xian","zipex":"075100"}
+data/CN/河北省/张家口市/尚义县={"id":"data/CN/河北省/张家口市/尚义县","key":"尚义县","lang":"zh-hans","lname":"Shangyi Xian","zipex":"076750"}
+data/CN/河北省/张家口市/崇礼县={"id":"data/CN/河北省/张家口市/崇礼县","key":"崇礼县","lang":"zh-hans","lname":"Chongli Xian","zipex":"076350"}
+data/CN/河北省/张家口市/康保县={"id":"data/CN/河北省/张家口市/康保县","key":"康保县","lang":"zh-hans","lname":"Kangbao Xian","zipex":"076650"}
+data/CN/河北省/张家口市/张北县={"id":"data/CN/河北省/张家口市/张北县","key":"张北县","lang":"zh-hans","lname":"Zhangbei Xian","zipex":"076450"}
+data/CN/河北省/张家口市/怀安县={"id":"data/CN/河北省/张家口市/怀安县","key":"怀安县","lang":"zh-hans","lname":"Huai'an Xian","zipex":"076150"}
+data/CN/河北省/张家口市/怀来县={"id":"data/CN/河北省/张家口市/怀来县","key":"怀来县","lang":"zh-hans","lname":"Huailai Xian","zipex":"075400"}
+data/CN/河北省/张家口市/桥东区={"id":"data/CN/河北省/张家口市/桥东区","key":"桥东区","lang":"zh-hans","lname":"Qiaodong Qu","zipex":"075000"}
+data/CN/河北省/张家口市/桥西区={"id":"data/CN/河北省/张家口市/桥西区","key":"桥西区","lang":"zh-hans","lname":"Qiaoxi Qu","zipex":"075061"}
+data/CN/河北省/张家口市/沽源县={"id":"data/CN/河北省/张家口市/沽源县","key":"沽源县","lang":"zh-hans","lname":"Guyuan Xian","zipex":"076550"}
+data/CN/河北省/张家口市/涿鹿县={"id":"data/CN/河北省/张家口市/涿鹿县","key":"涿鹿县","lang":"zh-hans","lname":"Zhuolu Xian","zipex":"075600"}
+data/CN/河北省/张家口市/蔚县={"id":"data/CN/河北省/张家口市/蔚县","key":"蔚县","lang":"zh-hans","lname":"Yu Xian","zipex":"075700"}
+data/CN/河北省/张家口市/赤城县={"id":"data/CN/河北省/张家口市/赤城县","key":"赤城县","lang":"zh-hans","lname":"Chicheng Xian","zipex":"075500"}
+data/CN/河北省/张家口市/阳原县={"id":"data/CN/河北省/张家口市/阳原县","key":"阳原县","lang":"zh-hans","lname":"Yangyuan Xian","zipex":"075800"}
+data/CN/河北省/承德市={"id":"data/CN/河北省/承德市","key":"承德市","lang":"zh-hans","lname":"Chengde Shi","zipex":"067000","sub_keys":"承德县~丰宁满族自治县~宽城满族自治县~隆化县~滦平县~平泉县~双滦区~双桥区~围场满族蒙古族自治县~兴隆县~鹰手营子矿区","sub_lnames":"Chengde Xian~Fengning Xian~Kuancheng Xian~Longhua Xian~Luanping Xian~Pingquan Xian~Shuangluan Qu~Shuangqiao Qu~Weichang Xian~Xinglong Xian~Yingshouyingzi Kuangqu","sub_zipexs":"067400~068350~067600~068150~068250~067500~067000~067000~068450~067300~067000","sub_lfnames":"~Fengning Manzu Zizhixian~Kuancheng Manzu Zizhixian~~~~~~Weichang Manzu Mongolzu Zizhixian~~"}
+data/CN/河北省/承德市/丰宁满族自治县={"id":"data/CN/河北省/承德市/丰宁满族自治县","key":"丰宁满族自治县","lang":"zh-hans","lname":"Fengning Xian","zipex":"068350","lfname":"Fengning Manzu Zizhixian"}
+data/CN/河北省/承德市/兴隆县={"id":"data/CN/河北省/承德市/兴隆县","key":"兴隆县","lang":"zh-hans","lname":"Xinglong Xian","zipex":"067300"}
+data/CN/河北省/承德市/双桥区={"id":"data/CN/河北省/承德市/双桥区","key":"双桥区","lang":"zh-hans","lname":"Shuangqiao Qu","zipex":"067000"}
+data/CN/河北省/承德市/双滦区={"id":"data/CN/河北省/承德市/双滦区","key":"双滦区","lang":"zh-hans","lname":"Shuangluan Qu","zipex":"067000"}
+data/CN/河北省/承德市/围场满族蒙古族自治县={"id":"data/CN/河北省/承德市/围场满族蒙古族自治县","key":"围场满族蒙古族自治县","lang":"zh-hans","lname":"Weichang Xian","zipex":"068450","lfname":"Weichang Manzu Mongolzu Zizhixian"}
+data/CN/河北省/承德市/宽城满族自治县={"id":"data/CN/河北省/承德市/宽城满族自治县","key":"宽城满族自治县","lang":"zh-hans","lname":"Kuancheng Xian","zipex":"067600","lfname":"Kuancheng Manzu Zizhixian"}
+data/CN/河北省/承德市/平泉县={"id":"data/CN/河北省/承德市/平泉县","key":"平泉县","lang":"zh-hans","lname":"Pingquan Xian","zipex":"067500"}
+data/CN/河北省/承德市/承德县={"id":"data/CN/河北省/承德市/承德县","key":"承德县","lang":"zh-hans","lname":"Chengde Xian","zipex":"067400"}
+data/CN/河北省/承德市/滦平县={"id":"data/CN/河北省/承德市/滦平县","key":"滦平县","lang":"zh-hans","lname":"Luanping Xian","zipex":"068250"}
+data/CN/河北省/承德市/隆化县={"id":"data/CN/河北省/承德市/隆化县","key":"隆化县","lang":"zh-hans","lname":"Longhua Xian","zipex":"068150"}
+data/CN/河北省/承德市/鹰手营子矿区={"id":"data/CN/河北省/承德市/鹰手营子矿区","key":"鹰手营子矿区","lang":"zh-hans","lname":"Yingshouyingzi Kuangqu","zipex":"067000"}
+data/CN/河北省/沧州市={"id":"data/CN/河北省/沧州市","key":"沧州市","lang":"zh-hans","lname":"Cangzhou Shi","zipex":"061001","sub_keys":"泊头市~沧县~东光县~海兴县~河间市~黄骅市~孟村回族自治县~南皮县~青县~任丘市~肃宁县~吴桥县~献县~新华区~盐山县~运河区","sub_lnames":"Botou Shi~Cang Xian~Dongguang Xian~Haixing Xian~Hejian Shi~Huanghua Shi~Mengcun Xian~Nanpi Xian~Qing Xian~Renqiu Shi~Suning Xian~Wuqiao Xian~Xian Xian~Xinhua Qu~Yanshan Xian~Yunhe Qu","sub_zipexs":"062150~061000~061600~061200~062450~061100~061400~061500~062650~062550~062350~061800~062250~061000~061300~061000","sub_lfnames":"~~~~~~Mengcun Huizu Zizhixian~~~~~~~~~"}
+data/CN/河北省/沧州市/东光县={"id":"data/CN/河北省/沧州市/东光县","key":"东光县","lang":"zh-hans","lname":"Dongguang Xian","zipex":"061600"}
+data/CN/河北省/沧州市/任丘市={"id":"data/CN/河北省/沧州市/任丘市","key":"任丘市","lang":"zh-hans","lname":"Renqiu Shi","zipex":"062550"}
+data/CN/河北省/沧州市/南皮县={"id":"data/CN/河北省/沧州市/南皮县","key":"南皮县","lang":"zh-hans","lname":"Nanpi Xian","zipex":"061500"}
+data/CN/河北省/沧州市/吴桥县={"id":"data/CN/河北省/沧州市/吴桥县","key":"吴桥县","lang":"zh-hans","lname":"Wuqiao Xian","zipex":"061800"}
+data/CN/河北省/沧州市/孟村回族自治县={"id":"data/CN/河北省/沧州市/孟村回族自治县","key":"孟村回族自治县","lang":"zh-hans","lname":"Mengcun Xian","zipex":"061400","lfname":"Mengcun Huizu Zizhixian"}
+data/CN/河北省/沧州市/新华区={"id":"data/CN/河北省/沧州市/新华区","key":"新华区","lang":"zh-hans","lname":"Xinhua Qu","zipex":"061000"}
+data/CN/河北省/沧州市/沧县={"id":"data/CN/河北省/沧州市/沧县","key":"沧县","lang":"zh-hans","lname":"Cang Xian","zipex":"061000"}
+data/CN/河北省/沧州市/河间市={"id":"data/CN/河北省/沧州市/河间市","key":"河间市","lang":"zh-hans","lname":"Hejian Shi","zipex":"062450"}
+data/CN/河北省/沧州市/泊头市={"id":"data/CN/河北省/沧州市/泊头市","key":"泊头市","lang":"zh-hans","lname":"Botou Shi","zipex":"062150"}
+data/CN/河北省/沧州市/海兴县={"id":"data/CN/河北省/沧州市/海兴县","key":"海兴县","lang":"zh-hans","lname":"Haixing Xian","zipex":"061200"}
+data/CN/河北省/沧州市/献县={"id":"data/CN/河北省/沧州市/献县","key":"献县","lang":"zh-hans","lname":"Xian Xian","zipex":"062250"}
+data/CN/河北省/沧州市/盐山县={"id":"data/CN/河北省/沧州市/盐山县","key":"盐山县","lang":"zh-hans","lname":"Yanshan Xian","zipex":"061300"}
+data/CN/河北省/沧州市/肃宁县={"id":"data/CN/河北省/沧州市/肃宁县","key":"肃宁县","lang":"zh-hans","lname":"Suning Xian","zipex":"062350"}
+data/CN/河北省/沧州市/运河区={"id":"data/CN/河北省/沧州市/运河区","key":"运河区","lang":"zh-hans","lname":"Yunhe Qu","zipex":"061000"}
+data/CN/河北省/沧州市/青县={"id":"data/CN/河北省/沧州市/青县","key":"青县","lang":"zh-hans","lname":"Qing Xian","zipex":"062650"}
+data/CN/河北省/沧州市/黄骅市={"id":"data/CN/河北省/沧州市/黄骅市","key":"黄骅市","lang":"zh-hans","lname":"Huanghua Shi","zipex":"061100"}
+data/CN/河北省/石家庄市={"id":"data/CN/河北省/石家庄市","key":"石家庄市","lang":"zh-hans","lname":"Shijiazhuang Shi","zipex":"050011","sub_keys":"长安区~高邑县~藁城市~晋州市~井陉矿区~井陉县~灵寿县~鹿泉市~栾城县~平山县~桥东区~桥西区~深泽县~无极县~辛集市~新华区~新乐市~行唐县~裕华区~元氏县~赞皇县~赵县~正定县","sub_lnames":"Chang'an Qu~Gaoyi Xian~Gaocheng Shi~Jinzhou Shi~Jingxing Kuangqu~Jingxing Xian~Lingshou Xian~Luquan Shi~Luancheng Xian~Pingshan Xian~Qiaodong Qu~Qiaoxi Qu~Shenze Xian~Wuji Xian~Xinji Shi~Xinhua Qu~Xinle Shi~Xingtang Xian~Yuhua Qu~Yuanshi Xian~Zanhuang Xian~Zhao Xian~Zhengding Xian","sub_zipexs":"050011~051330~052160~052260~050100~050300~050500~050200~051430~050400~050011~050051~052560~052460~052360~050051~050700~050600~050081~051130~051230~051530~050800"}
+data/CN/河北省/石家庄市/井陉县={"id":"data/CN/河北省/石家庄市/井陉县","key":"井陉县","lang":"zh-hans","lname":"Jingxing Xian","zipex":"050300"}
+data/CN/河北省/石家庄市/井陉矿区={"id":"data/CN/河北省/石家庄市/井陉矿区","key":"井陉矿区","lang":"zh-hans","lname":"Jingxing Kuangqu","zipex":"050100"}
+data/CN/河北省/石家庄市/元氏县={"id":"data/CN/河北省/石家庄市/元氏县","key":"元氏县","lang":"zh-hans","lname":"Yuanshi Xian","zipex":"051130"}
+data/CN/河北省/石家庄市/平山县={"id":"data/CN/河北省/石家庄市/平山县","key":"平山县","lang":"zh-hans","lname":"Pingshan Xian","zipex":"050400"}
+data/CN/河北省/石家庄市/新乐市={"id":"data/CN/河北省/石家庄市/新乐市","key":"新乐市","lang":"zh-hans","lname":"Xinle Shi","zipex":"050700"}
+data/CN/河北省/石家庄市/新华区={"id":"data/CN/河北省/石家庄市/新华区","key":"新华区","lang":"zh-hans","lname":"Xinhua Qu","zipex":"050051"}
+data/CN/河北省/石家庄市/无极县={"id":"data/CN/河北省/石家庄市/无极县","key":"无极县","lang":"zh-hans","lname":"Wuji Xian","zipex":"052460"}
+data/CN/河北省/石家庄市/晋州市={"id":"data/CN/河北省/石家庄市/晋州市","key":"晋州市","lang":"zh-hans","lname":"Jinzhou Shi","zipex":"052260"}
+data/CN/河北省/石家庄市/栾城县={"id":"data/CN/河北省/石家庄市/栾城县","key":"栾城县","lang":"zh-hans","lname":"Luancheng Xian","zipex":"051430"}
+data/CN/河北省/石家庄市/桥东区={"id":"data/CN/河北省/石家庄市/桥东区","key":"桥东区","lang":"zh-hans","lname":"Qiaodong Qu","zipex":"050011"}
+data/CN/河北省/石家庄市/桥西区={"id":"data/CN/河北省/石家庄市/桥西区","key":"桥西区","lang":"zh-hans","lname":"Qiaoxi Qu","zipex":"050051"}
+data/CN/河北省/石家庄市/正定县={"id":"data/CN/河北省/石家庄市/正定县","key":"正定县","lang":"zh-hans","lname":"Zhengding Xian","zipex":"050800"}
+data/CN/河北省/石家庄市/深泽县={"id":"data/CN/河北省/石家庄市/深泽县","key":"深泽县","lang":"zh-hans","lname":"Shenze Xian","zipex":"052560"}
+data/CN/河北省/石家庄市/灵寿县={"id":"data/CN/河北省/石家庄市/灵寿县","key":"灵寿县","lang":"zh-hans","lname":"Lingshou Xian","zipex":"050500"}
+data/CN/河北省/石家庄市/藁城市={"id":"data/CN/河北省/石家庄市/藁城市","key":"藁城市","lang":"zh-hans","lname":"Gaocheng Shi","zipex":"052160"}
+data/CN/河北省/石家庄市/行唐县={"id":"data/CN/河北省/石家庄市/行唐县","key":"行唐县","lang":"zh-hans","lname":"Xingtang Xian","zipex":"050600"}
+data/CN/河北省/石家庄市/裕华区={"id":"data/CN/河北省/石家庄市/裕华区","key":"裕华区","lang":"zh-hans","lname":"Yuhua Qu","zipex":"050081"}
+data/CN/河北省/石家庄市/赞皇县={"id":"data/CN/河北省/石家庄市/赞皇县","key":"赞皇县","lang":"zh-hans","lname":"Zanhuang Xian","zipex":"051230"}
+data/CN/河北省/石家庄市/赵县={"id":"data/CN/河北省/石家庄市/赵县","key":"赵县","lang":"zh-hans","lname":"Zhao Xian","zipex":"051530"}
+data/CN/河北省/石家庄市/辛集市={"id":"data/CN/河北省/石家庄市/辛集市","key":"辛集市","lang":"zh-hans","lname":"Xinji Shi","zipex":"052360"}
+data/CN/河北省/石家庄市/长安区={"id":"data/CN/河北省/石家庄市/长安区","key":"长安区","lang":"zh-hans","lname":"Chang'an Qu","zipex":"050011"}
+data/CN/河北省/石家庄市/高邑县={"id":"data/CN/河北省/石家庄市/高邑县","key":"高邑县","lang":"zh-hans","lname":"Gaoyi Xian","zipex":"051330"}
+data/CN/河北省/石家庄市/鹿泉市={"id":"data/CN/河北省/石家庄市/鹿泉市","key":"鹿泉市","lang":"zh-hans","lname":"Luquan Shi","zipex":"050200"}
+data/CN/河北省/秦皇岛市={"id":"data/CN/河北省/秦皇岛市","key":"秦皇岛市","lang":"zh-hans","lname":"Qinhuangdao Shi","zipex":"066000","sub_keys":"北戴河区~昌黎县~抚宁县~海港区~卢龙县~青龙满族自治县~山海关区","sub_lnames":"Beidaihe Qu~Changli Xian~Funing Xian~Haigang Qu~Lulong Xian~Qinglong Xian~Shanhaiguan Qu","sub_zipexs":"066100~066600~066300~066000~066400~066500~066200","sub_lfnames":"~~~~~Qinglong Manzu Zizhixian~"}
+data/CN/河北省/秦皇岛市/北戴河区={"id":"data/CN/河北省/秦皇岛市/北戴河区","key":"北戴河区","lang":"zh-hans","lname":"Beidaihe Qu","zipex":"066100"}
+data/CN/河北省/秦皇岛市/卢龙县={"id":"data/CN/河北省/秦皇岛市/卢龙县","key":"卢龙县","lang":"zh-hans","lname":"Lulong Xian","zipex":"066400"}
+data/CN/河北省/秦皇岛市/山海关区={"id":"data/CN/河北省/秦皇岛市/山海关区","key":"山海关区","lang":"zh-hans","lname":"Shanhaiguan Qu","zipex":"066200"}
+data/CN/河北省/秦皇岛市/抚宁县={"id":"data/CN/河北省/秦皇岛市/抚宁县","key":"抚宁县","lang":"zh-hans","lname":"Funing Xian","zipex":"066300"}
+data/CN/河北省/秦皇岛市/昌黎县={"id":"data/CN/河北省/秦皇岛市/昌黎县","key":"昌黎县","lang":"zh-hans","lname":"Changli Xian","zipex":"066600"}
+data/CN/河北省/秦皇岛市/海港区={"id":"data/CN/河北省/秦皇岛市/海港区","key":"海港区","lang":"zh-hans","lname":"Haigang Qu","zipex":"066000"}
+data/CN/河北省/秦皇岛市/青龙满族自治县={"id":"data/CN/河北省/秦皇岛市/青龙满族自治县","key":"青龙满族自治县","lang":"zh-hans","lname":"Qinglong Xian","zipex":"066500","lfname":"Qinglong Manzu Zizhixian"}
+data/CN/河北省/衡水市={"id":"data/CN/河北省/衡水市","key":"衡水市","lang":"zh-hans","lname":"Hengshui Shi","zipex":"053000","sub_keys":"安平县~阜城县~故城县~冀州市~景县~饶阳县~深州市~桃城区~武强县~武邑县~枣强县","sub_lnames":"Anping Xian~Fucheng Xian~Gucheng Xian~Jizhou Shi~Jing Xian~Raoyang Xian~Shenzhou Shi~Taocheng Qu~Wuqiang Xian~Wuyi Xian~Zaoqiang Xian","sub_zipexs":"053600~053700~053800~053200~053500~053900~053800~053000~053300~053400~053100"}
+data/CN/河北省/衡水市/冀州市={"id":"data/CN/河北省/衡水市/冀州市","key":"冀州市","lang":"zh-hans","lname":"Jizhou Shi","zipex":"053200"}
+data/CN/河北省/衡水市/安平县={"id":"data/CN/河北省/衡水市/安平县","key":"安平县","lang":"zh-hans","lname":"Anping Xian","zipex":"053600"}
+data/CN/河北省/衡水市/故城县={"id":"data/CN/河北省/衡水市/故城县","key":"故城县","lang":"zh-hans","lname":"Gucheng Xian","zipex":"053800"}
+data/CN/河北省/衡水市/景县={"id":"data/CN/河北省/衡水市/景县","key":"景县","lang":"zh-hans","lname":"Jing Xian","zipex":"053500"}
+data/CN/河北省/衡水市/枣强县={"id":"data/CN/河北省/衡水市/枣强县","key":"枣强县","lang":"zh-hans","lname":"Zaoqiang Xian","zipex":"053100"}
+data/CN/河北省/衡水市/桃城区={"id":"data/CN/河北省/衡水市/桃城区","key":"桃城区","lang":"zh-hans","lname":"Taocheng Qu","zipex":"053000"}
+data/CN/河北省/衡水市/武强县={"id":"data/CN/河北省/衡水市/武强县","key":"武强县","lang":"zh-hans","lname":"Wuqiang Xian","zipex":"053300"}
+data/CN/河北省/衡水市/武邑县={"id":"data/CN/河北省/衡水市/武邑县","key":"武邑县","lang":"zh-hans","lname":"Wuyi Xian","zipex":"053400"}
+data/CN/河北省/衡水市/深州市={"id":"data/CN/河北省/衡水市/深州市","key":"深州市","lang":"zh-hans","lname":"Shenzhou Shi","zipex":"053800"}
+data/CN/河北省/衡水市/阜城县={"id":"data/CN/河北省/衡水市/阜城县","key":"阜城县","lang":"zh-hans","lname":"Fucheng Xian","zipex":"053700"}
+data/CN/河北省/衡水市/饶阳县={"id":"data/CN/河北省/衡水市/饶阳县","key":"饶阳县","lang":"zh-hans","lname":"Raoyang Xian","zipex":"053900"}
+data/CN/河北省/邢台市={"id":"data/CN/河北省/邢台市","key":"邢台市","lang":"zh-hans","lname":"Xingtai Shi","zipex":"054001","sub_keys":"柏乡县~广宗县~巨鹿县~临城县~临西县~隆尧县~内丘县~南宫市~南和县~宁晋县~平乡县~桥东区~桥西区~清河县~任县~沙河市~威县~新河县~邢台县","sub_lnames":"Baixiang Xian~Guangzong Xian~Julu Xian~Lincheng Xian~Linxi Xian~Longyao Xian~Neiqiu Xian~Nangong Shi~Nanhe Xian~Ningjin Xian~Pingxiang Xian~Qiaodong Qu~Qiaoxi Qu~Qinghe Xian~Ren Xian~Shahe Shi~Wei Xian~Xinhe Xian~Xingtai Xian","sub_zipexs":"055450~054600~055250~054300~054900~055350~054200~055750~054400~055550~054500~054001~054000~054800~055150~054100~054700~051730~054001"}
+data/CN/河北省/邢台市/临城县={"id":"data/CN/河北省/邢台市/临城县","key":"临城县","lang":"zh-hans","lname":"Lincheng Xian","zipex":"054300"}
+data/CN/河北省/邢台市/临西县={"id":"data/CN/河北省/邢台市/临西县","key":"临西县","lang":"zh-hans","lname":"Linxi Xian","zipex":"054900"}
+data/CN/河北省/邢台市/任县={"id":"data/CN/河北省/邢台市/任县","key":"任县","lang":"zh-hans","lname":"Ren Xian","zipex":"055150"}
+data/CN/河北省/邢台市/内丘县={"id":"data/CN/河北省/邢台市/内丘县","key":"内丘县","lang":"zh-hans","lname":"Neiqiu Xian","zipex":"054200"}
+data/CN/河北省/邢台市/南和县={"id":"data/CN/河北省/邢台市/南和县","key":"南和县","lang":"zh-hans","lname":"Nanhe Xian","zipex":"054400"}
+data/CN/河北省/邢台市/南宫市={"id":"data/CN/河北省/邢台市/南宫市","key":"南宫市","lang":"zh-hans","lname":"Nangong Shi","zipex":"055750"}
+data/CN/河北省/邢台市/威县={"id":"data/CN/河北省/邢台市/威县","key":"威县","lang":"zh-hans","lname":"Wei Xian","zipex":"054700"}
+data/CN/河北省/邢台市/宁晋县={"id":"data/CN/河北省/邢台市/宁晋县","key":"宁晋县","lang":"zh-hans","lname":"Ningjin Xian","zipex":"055550"}
+data/CN/河北省/邢台市/巨鹿县={"id":"data/CN/河北省/邢台市/巨鹿县","key":"巨鹿县","lang":"zh-hans","lname":"Julu Xian","zipex":"055250"}
+data/CN/河北省/邢台市/平乡县={"id":"data/CN/河北省/邢台市/平乡县","key":"平乡县","lang":"zh-hans","lname":"Pingxiang Xian","zipex":"054500"}
+data/CN/河北省/邢台市/广宗县={"id":"data/CN/河北省/邢台市/广宗县","key":"广宗县","lang":"zh-hans","lname":"Guangzong Xian","zipex":"054600"}
+data/CN/河北省/邢台市/新河县={"id":"data/CN/河北省/邢台市/新河县","key":"新河县","lang":"zh-hans","lname":"Xinhe Xian","zipex":"051730"}
+data/CN/河北省/邢台市/柏乡县={"id":"data/CN/河北省/邢台市/柏乡县","key":"柏乡县","lang":"zh-hans","lname":"Baixiang Xian","zipex":"055450"}
+data/CN/河北省/邢台市/桥东区={"id":"data/CN/河北省/邢台市/桥东区","key":"桥东区","lang":"zh-hans","lname":"Qiaodong Qu","zipex":"054001"}
+data/CN/河北省/邢台市/桥西区={"id":"data/CN/河北省/邢台市/桥西区","key":"桥西区","lang":"zh-hans","lname":"Qiaoxi Qu","zipex":"054000"}
+data/CN/河北省/邢台市/沙河市={"id":"data/CN/河北省/邢台市/沙河市","key":"沙河市","lang":"zh-hans","lname":"Shahe Shi","zipex":"054100"}
+data/CN/河北省/邢台市/清河县={"id":"data/CN/河北省/邢台市/清河县","key":"清河县","lang":"zh-hans","lname":"Qinghe Xian","zipex":"054800"}
+data/CN/河北省/邢台市/邢台县={"id":"data/CN/河北省/邢台市/邢台县","key":"邢台县","lang":"zh-hans","lname":"Xingtai Xian","zipex":"054001"}
+data/CN/河北省/邢台市/隆尧县={"id":"data/CN/河北省/邢台市/隆尧县","key":"隆尧县","lang":"zh-hans","lname":"Longyao Xian","zipex":"055350"}
+data/CN/河北省/邯郸市={"id":"data/CN/河北省/邯郸市","key":"邯郸市","lang":"zh-hans","lname":"Handan Shi","zipex":"056002","sub_keys":"成安县~磁县~丛台区~大名县~肥乡县~峰峰矿区~复兴区~馆陶县~广平县~邯郸县~邯山区~鸡泽县~临漳县~邱县~曲周县~涉县~魏县~武安市~永年县","sub_lnames":"Cheng'an Xian~Ci Xian~Congtai Qu~Daming Xian~Feixiang Xian~Fengfeng Kuangqu~Fuxing Qu~Guantao Xian~Guangping Xian~Handan Xian~Hanshan Qu~Jize Xian~Linzhang Xian~Qiu Xian~Quzhou Xian~She Xian~Wei Xian~Wu'an Shi~Yongnian Xian","sub_zipexs":"056700~056600~056004~056900~057550~056200~056003~057750~057650~056100~056001~057350~056600~057450~057250~056500~056800~056300~057150"}
+data/CN/河北省/邯郸市/丛台区={"id":"data/CN/河北省/邯郸市/丛台区","key":"丛台区","lang":"zh-hans","lname":"Congtai Qu","zipex":"056004"}
+data/CN/河北省/邯郸市/临漳县={"id":"data/CN/河北省/邯郸市/临漳县","key":"临漳县","lang":"zh-hans","lname":"Linzhang Xian","zipex":"056600"}
+data/CN/河北省/邯郸市/复兴区={"id":"data/CN/河北省/邯郸市/复兴区","key":"复兴区","lang":"zh-hans","lname":"Fuxing Qu","zipex":"056003"}
+data/CN/河北省/邯郸市/大名县={"id":"data/CN/河北省/邯郸市/大名县","key":"大名县","lang":"zh-hans","lname":"Daming Xian","zipex":"056900"}
+data/CN/河北省/邯郸市/峰峰矿区={"id":"data/CN/河北省/邯郸市/峰峰矿区","key":"峰峰矿区","lang":"zh-hans","lname":"Fengfeng Kuangqu","zipex":"056200"}
+data/CN/河北省/邯郸市/广平县={"id":"data/CN/河北省/邯郸市/广平县","key":"广平县","lang":"zh-hans","lname":"Guangping Xian","zipex":"057650"}
+data/CN/河北省/邯郸市/成安县={"id":"data/CN/河北省/邯郸市/成安县","key":"成安县","lang":"zh-hans","lname":"Cheng'an Xian","zipex":"056700"}
+data/CN/河北省/邯郸市/曲周县={"id":"data/CN/河北省/邯郸市/曲周县","key":"曲周县","lang":"zh-hans","lname":"Quzhou Xian","zipex":"057250"}
+data/CN/河北省/邯郸市/武安市={"id":"data/CN/河北省/邯郸市/武安市","key":"武安市","lang":"zh-hans","lname":"Wu'an Shi","zipex":"056300"}
+data/CN/河北省/邯郸市/永年县={"id":"data/CN/河北省/邯郸市/永年县","key":"永年县","lang":"zh-hans","lname":"Yongnian Xian","zipex":"057150"}
+data/CN/河北省/邯郸市/涉县={"id":"data/CN/河北省/邯郸市/涉县","key":"涉县","lang":"zh-hans","lname":"She Xian","zipex":"056500"}
+data/CN/河北省/邯郸市/磁县={"id":"data/CN/河北省/邯郸市/磁县","key":"磁县","lang":"zh-hans","lname":"Ci Xian","zipex":"056600"}
+data/CN/河北省/邯郸市/肥乡县={"id":"data/CN/河北省/邯郸市/肥乡县","key":"肥乡县","lang":"zh-hans","lname":"Feixiang Xian","zipex":"057550"}
+data/CN/河北省/邯郸市/邯山区={"id":"data/CN/河北省/邯郸市/邯山区","key":"邯山区","lang":"zh-hans","lname":"Hanshan Qu","zipex":"056001"}
+data/CN/河北省/邯郸市/邯郸县={"id":"data/CN/河北省/邯郸市/邯郸县","key":"邯郸县","lang":"zh-hans","lname":"Handan Xian","zipex":"056100"}
+data/CN/河北省/邯郸市/邱县={"id":"data/CN/河北省/邯郸市/邱县","key":"邱县","lang":"zh-hans","lname":"Qiu Xian","zipex":"057450"}
+data/CN/河北省/邯郸市/馆陶县={"id":"data/CN/河北省/邯郸市/馆陶县","key":"馆陶县","lang":"zh-hans","lname":"Guantao Xian","zipex":"057750"}
+data/CN/河北省/邯郸市/魏县={"id":"data/CN/河北省/邯郸市/魏县","key":"魏县","lang":"zh-hans","lname":"Wei Xian","zipex":"056800"}
+data/CN/河北省/邯郸市/鸡泽县={"id":"data/CN/河北省/邯郸市/鸡泽县","key":"鸡泽县","lang":"zh-hans","lname":"Jize Xian","zipex":"057350"}
+data/CN/河南省={"id":"data/CN/河南省","key":"河南省","lang":"zh-hans","lname":"Henan Sheng","isoid":"41","sub_keys":"安阳市~鹤壁市~焦作市~开封市~洛阳市~漯河市~南阳市~平顶山市~濮阳市~三门峡市~商丘市~新乡市~信阳市~许昌市~郑州市~周口市~驻马店市","sub_lnames":"Anyang Shi~Hebi Shi~Jiaozuo Shi~Kaifeng Shi~Luoyang Shi~Luohe Shi~Nanyang Shi~Pingdingshan Shi~Puyang Shi~Sanmenxia Shi~Shangqiu Shi~Xinxiang Shi~Xinyang Shi~Xuchang Shi~Zhengzhou Shi~Zhoukou Shi~Zhumadian Shi","sub_zipexs":"455000~458030~454002~475001~471000~462000~473002~467000~457000~472000~476000~453000~464000~461000~450006~466000~463000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/河南省/三门峡市={"id":"data/CN/河南省/三门峡市","key":"三门峡市","lang":"zh-hans","lname":"Sanmenxia Shi","zipex":"472000","sub_keys":"湖滨区~灵宝市~卢氏县~陕县~渑池县~义马市","sub_lnames":"Hubin Qu~Lingbao Shi~Lushi Xian~Shan Xian~Mianchi Xian~Yima Shi","sub_zipexs":"472000~472500~472200~472100~472400~472300"}
+data/CN/河南省/三门峡市/义马市={"id":"data/CN/河南省/三门峡市/义马市","key":"义马市","lang":"zh-hans","lname":"Yima Shi","zipex":"472300"}
+data/CN/河南省/三门峡市/卢氏县={"id":"data/CN/河南省/三门峡市/卢氏县","key":"卢氏县","lang":"zh-hans","lname":"Lushi Xian","zipex":"472200"}
+data/CN/河南省/三门峡市/渑池县={"id":"data/CN/河南省/三门峡市/渑池县","key":"渑池县","lang":"zh-hans","lname":"Mianchi Xian","zipex":"472400"}
+data/CN/河南省/三门峡市/湖滨区={"id":"data/CN/河南省/三门峡市/湖滨区","key":"湖滨区","lang":"zh-hans","lname":"Hubin Qu","zipex":"472000"}
+data/CN/河南省/三门峡市/灵宝市={"id":"data/CN/河南省/三门峡市/灵宝市","key":"灵宝市","lang":"zh-hans","lname":"Lingbao Shi","zipex":"472500"}
+data/CN/河南省/三门峡市/陕县={"id":"data/CN/河南省/三门峡市/陕县","key":"陕县","lang":"zh-hans","lname":"Shan Xian","zipex":"472100"}
+data/CN/河南省/信阳市={"id":"data/CN/河南省/信阳市","key":"信阳市","lang":"zh-hans","lname":"Xinyang Shi","zipex":"464000","sub_keys":"固始县~光山县~淮滨县~潢川县~罗山县~平桥区~商城县~浉河区~息县~新县","sub_lnames":"Gushi Xian~Guangshan Xian~Huaibin Xian~Huangchuan Xian~Luoshan Xian~Pingqiao Qu~Shangcheng Xian~Shihe Qu~Xi Xian~Xin Xian","sub_zipexs":"465250~465450~464400~465150~464200~464100~465350~464000~464300~465550"}
+data/CN/河南省/信阳市/光山县={"id":"data/CN/河南省/信阳市/光山县","key":"光山县","lang":"zh-hans","lname":"Guangshan Xian","zipex":"465450"}
+data/CN/河南省/信阳市/商城县={"id":"data/CN/河南省/信阳市/商城县","key":"商城县","lang":"zh-hans","lname":"Shangcheng Xian","zipex":"465350"}
+data/CN/河南省/信阳市/固始县={"id":"data/CN/河南省/信阳市/固始县","key":"固始县","lang":"zh-hans","lname":"Gushi Xian","zipex":"465250"}
+data/CN/河南省/信阳市/平桥区={"id":"data/CN/河南省/信阳市/平桥区","key":"平桥区","lang":"zh-hans","lname":"Pingqiao Qu","zipex":"464100"}
+data/CN/河南省/信阳市/息县={"id":"data/CN/河南省/信阳市/息县","key":"息县","lang":"zh-hans","lname":"Xi Xian","zipex":"464300"}
+data/CN/河南省/信阳市/新县={"id":"data/CN/河南省/信阳市/新县","key":"新县","lang":"zh-hans","lname":"Xin Xian","zipex":"465550"}
+data/CN/河南省/信阳市/浉河区={"id":"data/CN/河南省/信阳市/浉河区","key":"浉河区","lang":"zh-hans","lname":"Shihe Qu","zipex":"464000"}
+data/CN/河南省/信阳市/淮滨县={"id":"data/CN/河南省/信阳市/淮滨县","key":"淮滨县","lang":"zh-hans","lname":"Huaibin Xian","zipex":"464400"}
+data/CN/河南省/信阳市/潢川县={"id":"data/CN/河南省/信阳市/潢川县","key":"潢川县","lang":"zh-hans","lname":"Huangchuan Xian","zipex":"465150"}
+data/CN/河南省/信阳市/罗山县={"id":"data/CN/河南省/信阳市/罗山县","key":"罗山县","lang":"zh-hans","lname":"Luoshan Xian","zipex":"464200"}
+data/CN/河南省/南阳市={"id":"data/CN/河南省/南阳市","key":"南阳市","lang":"zh-hans","lname":"Nanyang Shi","zipex":"473002","sub_keys":"邓州市~方城县~内乡县~南召县~社旗县~唐河县~桐柏县~宛城区~卧龙区~西峡县~淅川县~新野县~镇平县","sub_lnames":"Dengzhou Shi~Fangcheng Xian~Neixiang Xian~Nanzhao Xian~Sheqi Xian~Tanghe Xian~Tongbai Xian~Wancheng Qu~Wolong Qu~Xixia Xian~Xichuan Xian~Xinye Xian~Zhenping Xian","sub_zipexs":"474150~473200~474350~474650~473300~473400~474750~473001~473003~474550~474450~473500~474250"}
+data/CN/河南省/南阳市/内乡县={"id":"data/CN/河南省/南阳市/内乡县","key":"内乡县","lang":"zh-hans","lname":"Neixiang Xian","zipex":"474350"}
+data/CN/河南省/南阳市/南召县={"id":"data/CN/河南省/南阳市/南召县","key":"南召县","lang":"zh-hans","lname":"Nanzhao Xian","zipex":"474650"}
+data/CN/河南省/南阳市/卧龙区={"id":"data/CN/河南省/南阳市/卧龙区","key":"卧龙区","lang":"zh-hans","lname":"Wolong Qu","zipex":"473003"}
+data/CN/河南省/南阳市/唐河县={"id":"data/CN/河南省/南阳市/唐河县","key":"唐河县","lang":"zh-hans","lname":"Tanghe Xian","zipex":"473400"}
+data/CN/河南省/南阳市/宛城区={"id":"data/CN/河南省/南阳市/宛城区","key":"宛城区","lang":"zh-hans","lname":"Wancheng Qu","zipex":"473001"}
+data/CN/河南省/南阳市/新野县={"id":"data/CN/河南省/南阳市/新野县","key":"新野县","lang":"zh-hans","lname":"Xinye Xian","zipex":"473500"}
+data/CN/河南省/南阳市/方城县={"id":"data/CN/河南省/南阳市/方城县","key":"方城县","lang":"zh-hans","lname":"Fangcheng Xian","zipex":"473200"}
+data/CN/河南省/南阳市/桐柏县={"id":"data/CN/河南省/南阳市/桐柏县","key":"桐柏县","lang":"zh-hans","lname":"Tongbai Xian","zipex":"474750"}
+data/CN/河南省/南阳市/淅川县={"id":"data/CN/河南省/南阳市/淅川县","key":"淅川县","lang":"zh-hans","lname":"Xichuan Xian","zipex":"474450"}
+data/CN/河南省/南阳市/社旗县={"id":"data/CN/河南省/南阳市/社旗县","key":"社旗县","lang":"zh-hans","lname":"Sheqi Xian","zipex":"473300"}
+data/CN/河南省/南阳市/西峡县={"id":"data/CN/河南省/南阳市/西峡县","key":"西峡县","lang":"zh-hans","lname":"Xixia Xian","zipex":"474550"}
+data/CN/河南省/南阳市/邓州市={"id":"data/CN/河南省/南阳市/邓州市","key":"邓州市","lang":"zh-hans","lname":"Dengzhou Shi","zipex":"474150"}
+data/CN/河南省/南阳市/镇平县={"id":"data/CN/河南省/南阳市/镇平县","key":"镇平县","lang":"zh-hans","lname":"Zhenping Xian","zipex":"474250"}
+data/CN/河南省/周口市={"id":"data/CN/河南省/周口市","key":"周口市","lang":"zh-hans","lname":"Zhoukou Shi","zipex":"466000","sub_keys":"川汇区~郸城县~扶沟县~淮阳县~鹿邑县~商水县~沈丘县~太康县~西华县~项城市","sub_lnames":"Chuanhui Qu~Dancheng Xian~Fugou Xian~Huaiyang Xian~Luyi Xian~Shangshui Xian~Shenqiu Xian~Taikang Xian~Xihua Xian~Xiangcheng Shi","sub_zipexs":"466000~477150~461300~466700~477200~466100~466300~461400~466600~466200"}
+data/CN/河南省/周口市/商水县={"id":"data/CN/河南省/周口市/商水县","key":"商水县","lang":"zh-hans","lname":"Shangshui Xian","zipex":"466100"}
+data/CN/河南省/周口市/太康县={"id":"data/CN/河南省/周口市/太康县","key":"太康县","lang":"zh-hans","lname":"Taikang Xian","zipex":"461400"}
+data/CN/河南省/周口市/川汇区={"id":"data/CN/河南省/周口市/川汇区","key":"川汇区","lang":"zh-hans","lname":"Chuanhui Qu","zipex":"466000"}
+data/CN/河南省/周口市/扶沟县={"id":"data/CN/河南省/周口市/扶沟县","key":"扶沟县","lang":"zh-hans","lname":"Fugou Xian","zipex":"461300"}
+data/CN/河南省/周口市/沈丘县={"id":"data/CN/河南省/周口市/沈丘县","key":"沈丘县","lang":"zh-hans","lname":"Shenqiu Xian","zipex":"466300"}
+data/CN/河南省/周口市/淮阳县={"id":"data/CN/河南省/周口市/淮阳县","key":"淮阳县","lang":"zh-hans","lname":"Huaiyang Xian","zipex":"466700"}
+data/CN/河南省/周口市/西华县={"id":"data/CN/河南省/周口市/西华县","key":"西华县","lang":"zh-hans","lname":"Xihua Xian","zipex":"466600"}
+data/CN/河南省/周口市/郸城县={"id":"data/CN/河南省/周口市/郸城县","key":"郸城县","lang":"zh-hans","lname":"Dancheng Xian","zipex":"477150"}
+data/CN/河南省/周口市/项城市={"id":"data/CN/河南省/周口市/项城市","key":"项城市","lang":"zh-hans","lname":"Xiangcheng Shi","zipex":"466200"}
+data/CN/河南省/周口市/鹿邑县={"id":"data/CN/河南省/周口市/鹿邑县","key":"鹿邑县","lang":"zh-hans","lname":"Luyi Xian","zipex":"477200"}
+data/CN/河南省/商丘市={"id":"data/CN/河南省/商丘市","key":"商丘市","lang":"zh-hans","lname":"Shangqiu Shi","zipex":"476000","sub_keys":"梁园区~民权县~宁陵县~睢县~睢阳区~夏邑县~永城市~虞城县~柘城县","sub_lnames":"Liangyuan Qu~Minquan Xian~Ningling Xian~Sui Xian~Suiyang Qu~Xiayi Xian~Yongcheng Shi~Yucheng Xian~Zhecheng Xian","sub_zipexs":"476000~476600~476700~476900~476100~476400~456550~476100~476200"}
+data/CN/河南省/商丘市/夏邑县={"id":"data/CN/河南省/商丘市/夏邑县","key":"夏邑县","lang":"zh-hans","lname":"Xiayi Xian","zipex":"476400"}
+data/CN/河南省/商丘市/宁陵县={"id":"data/CN/河南省/商丘市/宁陵县","key":"宁陵县","lang":"zh-hans","lname":"Ningling Xian","zipex":"476700"}
+data/CN/河南省/商丘市/柘城县={"id":"data/CN/河南省/商丘市/柘城县","key":"柘城县","lang":"zh-hans","lname":"Zhecheng Xian","zipex":"476200"}
+data/CN/河南省/商丘市/梁园区={"id":"data/CN/河南省/商丘市/梁园区","key":"梁园区","lang":"zh-hans","lname":"Liangyuan Qu","zipex":"476000"}
+data/CN/河南省/商丘市/民权县={"id":"data/CN/河南省/商丘市/民权县","key":"民权县","lang":"zh-hans","lname":"Minquan Xian","zipex":"476600"}
+data/CN/河南省/商丘市/永城市={"id":"data/CN/河南省/商丘市/永城市","key":"永城市","lang":"zh-hans","lname":"Yongcheng Shi","zipex":"456550"}
+data/CN/河南省/商丘市/睢县={"id":"data/CN/河南省/商丘市/睢县","key":"睢县","lang":"zh-hans","lname":"Sui Xian","zipex":"476900"}
+data/CN/河南省/商丘市/睢阳区={"id":"data/CN/河南省/商丘市/睢阳区","key":"睢阳区","lang":"zh-hans","lname":"Suiyang Qu","zipex":"476100"}
+data/CN/河南省/商丘市/虞城县={"id":"data/CN/河南省/商丘市/虞城县","key":"虞城县","lang":"zh-hans","lname":"Yucheng Xian","zipex":"476100"}
+data/CN/河南省/安阳市={"id":"data/CN/河南省/安阳市","key":"安阳市","lang":"zh-hans","lname":"Anyang Shi","zipex":"455000","sub_keys":"安阳县~北关区~滑县~林州市~龙安区~内黄县~汤阴县~文峰区~殷都区","sub_lnames":"Anyang Xian~Beiguan Qu~Hua Xian~Linzhou Shi~Long'an Qu~Neihuang Xian~Tangyin Xian~Wenfeng Qu~Yindou Qu","sub_zipexs":"455000~455001~456400~456550~455001~456350~456150~455000~455004"}
+data/CN/河南省/安阳市/内黄县={"id":"data/CN/河南省/安阳市/内黄县","key":"内黄县","lang":"zh-hans","lname":"Neihuang Xian","zipex":"456350"}
+data/CN/河南省/安阳市/北关区={"id":"data/CN/河南省/安阳市/北关区","key":"北关区","lang":"zh-hans","lname":"Beiguan Qu","zipex":"455001"}
+data/CN/河南省/安阳市/安阳县={"id":"data/CN/河南省/安阳市/安阳县","key":"安阳县","lang":"zh-hans","lname":"Anyang Xian","zipex":"455000"}
+data/CN/河南省/安阳市/文峰区={"id":"data/CN/河南省/安阳市/文峰区","key":"文峰区","lang":"zh-hans","lname":"Wenfeng Qu","zipex":"455000"}
+data/CN/河南省/安阳市/林州市={"id":"data/CN/河南省/安阳市/林州市","key":"林州市","lang":"zh-hans","lname":"Linzhou Shi","zipex":"456550"}
+data/CN/河南省/安阳市/殷都区={"id":"data/CN/河南省/安阳市/殷都区","key":"殷都区","lang":"zh-hans","lname":"Yindou Qu","zipex":"455004"}
+data/CN/河南省/安阳市/汤阴县={"id":"data/CN/河南省/安阳市/汤阴县","key":"汤阴县","lang":"zh-hans","lname":"Tangyin Xian","zipex":"456150"}
+data/CN/河南省/安阳市/滑县={"id":"data/CN/河南省/安阳市/滑县","key":"滑县","lang":"zh-hans","lname":"Hua Xian","zipex":"456400"}
+data/CN/河南省/安阳市/龙安区={"id":"data/CN/河南省/安阳市/龙安区","key":"龙安区","lang":"zh-hans","lname":"Long'an Qu","zipex":"455001"}
+data/CN/河南省/平顶山市={"id":"data/CN/河南省/平顶山市","key":"平顶山市","lang":"zh-hans","lname":"Pingdingshan Shi","zipex":"467000","sub_keys":"宝丰县~郏县~鲁山县~汝州市~石龙区~卫东区~舞钢市~新华区~叶县~湛河区","sub_lnames":"Baofeng Xian~Jia Xian~Lushan Xian~Ruzhou Shi~Shilong Qu~Weidong Qu~Wugang Shi~Xinhua Qu~Ye Xian~Zhanhe Qu","sub_zipexs":"467400~467100~467300~467500~467045~467021~462500~467002~467200~467000"}
+data/CN/河南省/平顶山市/卫东区={"id":"data/CN/河南省/平顶山市/卫东区","key":"卫东区","lang":"zh-hans","lname":"Weidong Qu","zipex":"467021"}
+data/CN/河南省/平顶山市/叶县={"id":"data/CN/河南省/平顶山市/叶县","key":"叶县","lang":"zh-hans","lname":"Ye Xian","zipex":"467200"}
+data/CN/河南省/平顶山市/宝丰县={"id":"data/CN/河南省/平顶山市/宝丰县","key":"宝丰县","lang":"zh-hans","lname":"Baofeng Xian","zipex":"467400"}
+data/CN/河南省/平顶山市/新华区={"id":"data/CN/河南省/平顶山市/新华区","key":"新华区","lang":"zh-hans","lname":"Xinhua Qu","zipex":"467002"}
+data/CN/河南省/平顶山市/汝州市={"id":"data/CN/河南省/平顶山市/汝州市","key":"汝州市","lang":"zh-hans","lname":"Ruzhou Shi","zipex":"467500"}
+data/CN/河南省/平顶山市/湛河区={"id":"data/CN/河南省/平顶山市/湛河区","key":"湛河区","lang":"zh-hans","lname":"Zhanhe Qu","zipex":"467000"}
+data/CN/河南省/平顶山市/石龙区={"id":"data/CN/河南省/平顶山市/石龙区","key":"石龙区","lang":"zh-hans","lname":"Shilong Qu","zipex":"467045"}
+data/CN/河南省/平顶山市/舞钢市={"id":"data/CN/河南省/平顶山市/舞钢市","key":"舞钢市","lang":"zh-hans","lname":"Wugang Shi","zipex":"462500"}
+data/CN/河南省/平顶山市/郏县={"id":"data/CN/河南省/平顶山市/郏县","key":"郏县","lang":"zh-hans","lname":"Jia Xian","zipex":"467100"}
+data/CN/河南省/平顶山市/鲁山县={"id":"data/CN/河南省/平顶山市/鲁山县","key":"鲁山县","lang":"zh-hans","lname":"Lushan Xian","zipex":"467300"}
+data/CN/河南省/开封市={"id":"data/CN/河南省/开封市","key":"开封市","lang":"zh-hans","lname":"Kaifeng Shi","zipex":"475001","sub_keys":"鼓楼区~金明区~开封县~兰考县~龙亭区~杞县~顺河回族区~通许县~尉氏县~禹王台区","sub_lnames":"Gulou Qu~Jinming Qu~Kaifeng Xian~Lankao Xian~Longting Qu~Qi Xian~Shunhe Huizu Qu~Tongxu Xian~Weishi Xian~Yuwangtai Qu","sub_zipexs":"475000~475002~475100~475300~475100~475200~475000~475400~475500~475003"}
+data/CN/河南省/开封市/兰考县={"id":"data/CN/河南省/开封市/兰考县","key":"兰考县","lang":"zh-hans","lname":"Lankao Xian","zipex":"475300"}
+data/CN/河南省/开封市/尉氏县={"id":"data/CN/河南省/开封市/尉氏县","key":"尉氏县","lang":"zh-hans","lname":"Weishi Xian","zipex":"475500"}
+data/CN/河南省/开封市/开封县={"id":"data/CN/河南省/开封市/开封县","key":"开封县","lang":"zh-hans","lname":"Kaifeng Xian","zipex":"475100"}
+data/CN/河南省/开封市/杞县={"id":"data/CN/河南省/开封市/杞县","key":"杞县","lang":"zh-hans","lname":"Qi Xian","zipex":"475200"}
+data/CN/河南省/开封市/禹王台区={"id":"data/CN/河南省/开封市/禹王台区","key":"禹王台区","lang":"zh-hans","lname":"Yuwangtai Qu","zipex":"475003"}
+data/CN/河南省/开封市/通许县={"id":"data/CN/河南省/开封市/通许县","key":"通许县","lang":"zh-hans","lname":"Tongxu Xian","zipex":"475400"}
+data/CN/河南省/开封市/金明区={"id":"data/CN/河南省/开封市/金明区","key":"金明区","lang":"zh-hans","lname":"Jinming Qu","zipex":"475002"}
+data/CN/河南省/开封市/顺河回族区={"id":"data/CN/河南省/开封市/顺河回族区","key":"顺河回族区","lang":"zh-hans","lname":"Shunhe Huizu Qu","zipex":"475000"}
+data/CN/河南省/开封市/鼓楼区={"id":"data/CN/河南省/开封市/鼓楼区","key":"鼓楼区","lang":"zh-hans","lname":"Gulou Qu","zipex":"475000"}
+data/CN/河南省/开封市/龙亭区={"id":"data/CN/河南省/开封市/龙亭区","key":"龙亭区","lang":"zh-hans","lname":"Longting Qu","zipex":"475100"}
+data/CN/河南省/新乡市={"id":"data/CN/河南省/新乡市","key":"新乡市","lang":"zh-hans","lname":"Xinxiang Shi","zipex":"453000","sub_keys":"长垣县~封丘县~凤泉区~红旗区~辉县市~获嘉县~牧野区~卫滨区~卫辉市~新乡县~延津县~原阳县","sub_lnames":"Changyuan Xian~Fengqiu Xian~Fengquan Qu~Hongqi Qu~Huixian Shi~Huojia Xian~Muye Qu~Weibin Qu~Weihui Shi~Xinxiang Xian~Yanjin Xian~Yuanyang Xian","sub_zipexs":"453400~453300~453011~453000~453600~453800~453002~453000~453100~453700~453200~453500"}
+data/CN/河南省/新乡市/凤泉区={"id":"data/CN/河南省/新乡市/凤泉区","key":"凤泉区","lang":"zh-hans","lname":"Fengquan Qu","zipex":"453011"}
+data/CN/河南省/新乡市/卫滨区={"id":"data/CN/河南省/新乡市/卫滨区","key":"卫滨区","lang":"zh-hans","lname":"Weibin Qu","zipex":"453000"}
+data/CN/河南省/新乡市/卫辉市={"id":"data/CN/河南省/新乡市/卫辉市","key":"卫辉市","lang":"zh-hans","lname":"Weihui Shi","zipex":"453100"}
+data/CN/河南省/新乡市/原阳县={"id":"data/CN/河南省/新乡市/原阳县","key":"原阳县","lang":"zh-hans","lname":"Yuanyang Xian","zipex":"453500"}
+data/CN/河南省/新乡市/封丘县={"id":"data/CN/河南省/新乡市/封丘县","key":"封丘县","lang":"zh-hans","lname":"Fengqiu Xian","zipex":"453300"}
+data/CN/河南省/新乡市/延津县={"id":"data/CN/河南省/新乡市/延津县","key":"延津县","lang":"zh-hans","lname":"Yanjin Xian","zipex":"453200"}
+data/CN/河南省/新乡市/新乡县={"id":"data/CN/河南省/新乡市/新乡县","key":"新乡县","lang":"zh-hans","lname":"Xinxiang Xian","zipex":"453700"}
+data/CN/河南省/新乡市/牧野区={"id":"data/CN/河南省/新乡市/牧野区","key":"牧野区","lang":"zh-hans","lname":"Muye Qu","zipex":"453002"}
+data/CN/河南省/新乡市/红旗区={"id":"data/CN/河南省/新乡市/红旗区","key":"红旗区","lang":"zh-hans","lname":"Hongqi Qu","zipex":"453000"}
+data/CN/河南省/新乡市/获嘉县={"id":"data/CN/河南省/新乡市/获嘉县","key":"获嘉县","lang":"zh-hans","lname":"Huojia Xian","zipex":"453800"}
+data/CN/河南省/新乡市/辉县市={"id":"data/CN/河南省/新乡市/辉县市","key":"辉县市","lang":"zh-hans","lname":"Huixian Shi","zipex":"453600"}
+data/CN/河南省/新乡市/长垣县={"id":"data/CN/河南省/新乡市/长垣县","key":"长垣县","lang":"zh-hans","lname":"Changyuan Xian","zipex":"453400"}
+data/CN/河南省/洛阳市={"id":"data/CN/河南省/洛阳市","key":"洛阳市","lang":"zh-hans","lname":"Luoyang Shi","zipex":"471000","sub_keys":"瀍河回族区~吉利区~涧西区~老城区~栾川县~洛龙区~洛宁县~孟津县~汝阳县~嵩县~西工区~新安县~偃师市~伊川县~宜阳县","sub_lnames":"Chanhe Huizu Qu~Jili Qu~Jianxi Qu~Laocheng Qu~Luanchuan Xian~Luolong Qu~Luoning Xian~Mengjin Xian~Ruyang Xian~Song Xian~Xigong Qu~Xin'an Xian~Yanshi Shi~Yichuan Xian~Yiyang Xian","sub_zipexs":"471002~471012~471003~471002~471500~471000~471700~471100~471200~471400~471000~471800~471900~471300~471600"}
+data/CN/河南省/洛阳市/伊川县={"id":"data/CN/河南省/洛阳市/伊川县","key":"伊川县","lang":"zh-hans","lname":"Yichuan Xian","zipex":"471300"}
+data/CN/河南省/洛阳市/偃师市={"id":"data/CN/河南省/洛阳市/偃师市","key":"偃师市","lang":"zh-hans","lname":"Yanshi Shi","zipex":"471900"}
+data/CN/河南省/洛阳市/吉利区={"id":"data/CN/河南省/洛阳市/吉利区","key":"吉利区","lang":"zh-hans","lname":"Jili Qu","zipex":"471012"}
+data/CN/河南省/洛阳市/孟津县={"id":"data/CN/河南省/洛阳市/孟津县","key":"孟津县","lang":"zh-hans","lname":"Mengjin Xian","zipex":"471100"}
+data/CN/河南省/洛阳市/宜阳县={"id":"data/CN/河南省/洛阳市/宜阳县","key":"宜阳县","lang":"zh-hans","lname":"Yiyang Xian","zipex":"471600"}
+data/CN/河南省/洛阳市/嵩县={"id":"data/CN/河南省/洛阳市/嵩县","key":"嵩县","lang":"zh-hans","lname":"Song Xian","zipex":"471400"}
+data/CN/河南省/洛阳市/新安县={"id":"data/CN/河南省/洛阳市/新安县","key":"新安县","lang":"zh-hans","lname":"Xin'an Xian","zipex":"471800"}
+data/CN/河南省/洛阳市/栾川县={"id":"data/CN/河南省/洛阳市/栾川县","key":"栾川县","lang":"zh-hans","lname":"Luanchuan Xian","zipex":"471500"}
+data/CN/河南省/洛阳市/汝阳县={"id":"data/CN/河南省/洛阳市/汝阳县","key":"汝阳县","lang":"zh-hans","lname":"Ruyang Xian","zipex":"471200"}
+data/CN/河南省/洛阳市/洛宁县={"id":"data/CN/河南省/洛阳市/洛宁县","key":"洛宁县","lang":"zh-hans","lname":"Luoning Xian","zipex":"471700"}
+data/CN/河南省/洛阳市/洛龙区={"id":"data/CN/河南省/洛阳市/洛龙区","key":"洛龙区","lang":"zh-hans","lname":"Luolong Qu","zipex":"471000"}
+data/CN/河南省/洛阳市/涧西区={"id":"data/CN/河南省/洛阳市/涧西区","key":"涧西区","lang":"zh-hans","lname":"Jianxi Qu","zipex":"471003"}
+data/CN/河南省/洛阳市/瀍河回族区={"id":"data/CN/河南省/洛阳市/瀍河回族区","key":"瀍河回族区","lang":"zh-hans","lname":"Chanhe Huizu Qu","zipex":"471002"}
+data/CN/河南省/洛阳市/老城区={"id":"data/CN/河南省/洛阳市/老城区","key":"老城区","lang":"zh-hans","lname":"Laocheng Qu","zipex":"471002"}
+data/CN/河南省/洛阳市/西工区={"id":"data/CN/河南省/洛阳市/西工区","key":"西工区","lang":"zh-hans","lname":"Xigong Qu","zipex":"471000"}
+data/CN/河南省/漯河市={"id":"data/CN/河南省/漯河市","key":"漯河市","lang":"zh-hans","lname":"Luohe Shi","zipex":"462000","sub_keys":"临颍县~舞阳县~郾城区~源汇区~召陵区","sub_lnames":"Linying Xian~Wuyang Xian~Yancheng Qu~Yuanhui Qu~Zhaoling Qu","sub_zipexs":"462600~462400~462300~462000~462300"}
+data/CN/河南省/漯河市/临颍县={"id":"data/CN/河南省/漯河市/临颍县","key":"临颍县","lang":"zh-hans","lname":"Linying Xian","zipex":"462600"}
+data/CN/河南省/漯河市/召陵区={"id":"data/CN/河南省/漯河市/召陵区","key":"召陵区","lang":"zh-hans","lname":"Zhaoling Qu","zipex":"462300"}
+data/CN/河南省/漯河市/源汇区={"id":"data/CN/河南省/漯河市/源汇区","key":"源汇区","lang":"zh-hans","lname":"Yuanhui Qu","zipex":"462000"}
+data/CN/河南省/漯河市/舞阳县={"id":"data/CN/河南省/漯河市/舞阳县","key":"舞阳县","lang":"zh-hans","lname":"Wuyang Xian","zipex":"462400"}
+data/CN/河南省/漯河市/郾城区={"id":"data/CN/河南省/漯河市/郾城区","key":"郾城区","lang":"zh-hans","lname":"Yancheng Qu","zipex":"462300"}
+data/CN/河南省/濮阳市={"id":"data/CN/河南省/濮阳市","key":"濮阳市","lang":"zh-hans","lname":"Puyang Shi","zipex":"457000","sub_keys":"范县~华龙区~南乐县~濮阳县~清丰县~台前县","sub_lnames":"Fan Xian~Hualong Qu~Nanle Xian~Puyang Xian~Qingfeng Xian~Taiqian Xian","sub_zipexs":"457500~457001~457400~457100~457300~457600"}
+data/CN/河南省/濮阳市/华龙区={"id":"data/CN/河南省/濮阳市/华龙区","key":"华龙区","lang":"zh-hans","lname":"Hualong Qu","zipex":"457001"}
+data/CN/河南省/濮阳市/南乐县={"id":"data/CN/河南省/濮阳市/南乐县","key":"南乐县","lang":"zh-hans","lname":"Nanle Xian","zipex":"457400"}
+data/CN/河南省/濮阳市/台前县={"id":"data/CN/河南省/濮阳市/台前县","key":"台前县","lang":"zh-hans","lname":"Taiqian Xian","zipex":"457600"}
+data/CN/河南省/濮阳市/清丰县={"id":"data/CN/河南省/濮阳市/清丰县","key":"清丰县","lang":"zh-hans","lname":"Qingfeng Xian","zipex":"457300"}
+data/CN/河南省/濮阳市/濮阳县={"id":"data/CN/河南省/濮阳市/濮阳县","key":"濮阳县","lang":"zh-hans","lname":"Puyang Xian","zipex":"457100"}
+data/CN/河南省/濮阳市/范县={"id":"data/CN/河南省/濮阳市/范县","key":"范县","lang":"zh-hans","lname":"Fan Xian","zipex":"457500"}
+data/CN/河南省/焦作市={"id":"data/CN/河南省/焦作市","key":"焦作市","lang":"zh-hans","lname":"Jiaozuo Shi","zipex":"454002","sub_keys":"博爱县~济源市~解放区~马村区~孟州市~沁阳市~山阳区~温县~武陟县~修武县~中站区","sub_lnames":"Bo'ai Xian~Jiyuan Shi~Jiefang Qu~Macun Qu~Mengzhou Shi~Qinyang Shi~Shanyang Qu~Wen Xian~Wuzhi Xian~Xiwu Xian~Zhongzhan Qu","sub_zipexs":"454450~454650~454000~454171~454750~454550~454002~454850~454950~454350~454191"}
+data/CN/河南省/焦作市/中站区={"id":"data/CN/河南省/焦作市/中站区","key":"中站区","lang":"zh-hans","lname":"Zhongzhan Qu","zipex":"454191"}
+data/CN/河南省/焦作市/修武县={"id":"data/CN/河南省/焦作市/修武县","key":"修武县","lang":"zh-hans","lname":"Xiwu Xian","zipex":"454350"}
+data/CN/河南省/焦作市/博爱县={"id":"data/CN/河南省/焦作市/博爱县","key":"博爱县","lang":"zh-hans","lname":"Bo'ai Xian","zipex":"454450"}
+data/CN/河南省/焦作市/孟州市={"id":"data/CN/河南省/焦作市/孟州市","key":"孟州市","lang":"zh-hans","lname":"Mengzhou Shi","zipex":"454750"}
+data/CN/河南省/焦作市/山阳区={"id":"data/CN/河南省/焦作市/山阳区","key":"山阳区","lang":"zh-hans","lname":"Shanyang Qu","zipex":"454002"}
+data/CN/河南省/焦作市/武陟县={"id":"data/CN/河南省/焦作市/武陟县","key":"武陟县","lang":"zh-hans","lname":"Wuzhi Xian","zipex":"454950"}
+data/CN/河南省/焦作市/沁阳市={"id":"data/CN/河南省/焦作市/沁阳市","key":"沁阳市","lang":"zh-hans","lname":"Qinyang Shi","zipex":"454550"}
+data/CN/河南省/焦作市/济源市={"id":"data/CN/河南省/焦作市/济源市","key":"济源市","lang":"zh-hans","lname":"Jiyuan Shi","zipex":"454650"}
+data/CN/河南省/焦作市/温县={"id":"data/CN/河南省/焦作市/温县","key":"温县","lang":"zh-hans","lname":"Wen Xian","zipex":"454850"}
+data/CN/河南省/焦作市/解放区={"id":"data/CN/河南省/焦作市/解放区","key":"解放区","lang":"zh-hans","lname":"Jiefang Qu","zipex":"454000"}
+data/CN/河南省/焦作市/马村区={"id":"data/CN/河南省/焦作市/马村区","key":"马村区","lang":"zh-hans","lname":"Macun Qu","zipex":"454171"}
+data/CN/河南省/许昌市={"id":"data/CN/河南省/许昌市","key":"许昌市","lang":"zh-hans","lname":"Xuchang Shi","zipex":"461000","sub_keys":"长葛市~魏都区~襄城县~许昌县~鄢陵县~禹州市","sub_lnames":"Changge Shi~Weidu Qu~Xiangcheng Xian~Xuchang Xian~Yanling Xian~Yuzhou Shi","sub_zipexs":"461500~461000~461700~461100~461200~461670"}
+data/CN/河南省/许昌市/禹州市={"id":"data/CN/河南省/许昌市/禹州市","key":"禹州市","lang":"zh-hans","lname":"Yuzhou Shi","zipex":"461670"}
+data/CN/河南省/许昌市/襄城县={"id":"data/CN/河南省/许昌市/襄城县","key":"襄城县","lang":"zh-hans","lname":"Xiangcheng Xian","zipex":"461700"}
+data/CN/河南省/许昌市/许昌县={"id":"data/CN/河南省/许昌市/许昌县","key":"许昌县","lang":"zh-hans","lname":"Xuchang Xian","zipex":"461100"}
+data/CN/河南省/许昌市/鄢陵县={"id":"data/CN/河南省/许昌市/鄢陵县","key":"鄢陵县","lang":"zh-hans","lname":"Yanling Xian","zipex":"461200"}
+data/CN/河南省/许昌市/长葛市={"id":"data/CN/河南省/许昌市/长葛市","key":"长葛市","lang":"zh-hans","lname":"Changge Shi","zipex":"461500"}
+data/CN/河南省/许昌市/魏都区={"id":"data/CN/河南省/许昌市/魏都区","key":"魏都区","lang":"zh-hans","lname":"Weidu Qu","zipex":"461000"}
+data/CN/河南省/郑州市={"id":"data/CN/河南省/郑州市","key":"郑州市","lang":"zh-hans","lname":"Zhengzhou Shi","zipex":"450006","sub_keys":"登封市~二七区~巩义市~管城回族区~惠济区~金水区~上街区~新密市~新郑市~荥阳市~中牟县~中原区","sub_lnames":"Dengfeng Shi~Erqi Qu~Gongyi Shi~Guancheng Huizu Qu~Huiji Qu~Jinshui Qu~Shangjie Qu~Xinmi Shi~Xinzheng Shi~Xingyang Shi~Zhongmu Xian~Zhongyuan Qu","sub_zipexs":"452470~450000~451250~450000~450053~450003~450041~452370~451150~450100~451450~450007"}
+data/CN/河南省/郑州市/上街区={"id":"data/CN/河南省/郑州市/上街区","key":"上街区","lang":"zh-hans","lname":"Shangjie Qu","zipex":"450041"}
+data/CN/河南省/郑州市/中原区={"id":"data/CN/河南省/郑州市/中原区","key":"中原区","lang":"zh-hans","lname":"Zhongyuan Qu","zipex":"450007"}
+data/CN/河南省/郑州市/中牟县={"id":"data/CN/河南省/郑州市/中牟县","key":"中牟县","lang":"zh-hans","lname":"Zhongmu Xian","zipex":"451450"}
+data/CN/河南省/郑州市/二七区={"id":"data/CN/河南省/郑州市/二七区","key":"二七区","lang":"zh-hans","lname":"Erqi Qu","zipex":"450000"}
+data/CN/河南省/郑州市/巩义市={"id":"data/CN/河南省/郑州市/巩义市","key":"巩义市","lang":"zh-hans","lname":"Gongyi Shi","zipex":"451250"}
+data/CN/河南省/郑州市/惠济区={"id":"data/CN/河南省/郑州市/惠济区","key":"惠济区","lang":"zh-hans","lname":"Huiji Qu","zipex":"450053"}
+data/CN/河南省/郑州市/新密市={"id":"data/CN/河南省/郑州市/新密市","key":"新密市","lang":"zh-hans","lname":"Xinmi Shi","zipex":"452370"}
+data/CN/河南省/郑州市/新郑市={"id":"data/CN/河南省/郑州市/新郑市","key":"新郑市","lang":"zh-hans","lname":"Xinzheng Shi","zipex":"451150"}
+data/CN/河南省/郑州市/登封市={"id":"data/CN/河南省/郑州市/登封市","key":"登封市","lang":"zh-hans","lname":"Dengfeng Shi","zipex":"452470"}
+data/CN/河南省/郑州市/管城回族区={"id":"data/CN/河南省/郑州市/管城回族区","key":"管城回族区","lang":"zh-hans","lname":"Guancheng Huizu Qu","zipex":"450000"}
+data/CN/河南省/郑州市/荥阳市={"id":"data/CN/河南省/郑州市/荥阳市","key":"荥阳市","lang":"zh-hans","lname":"Xingyang Shi","zipex":"450100"}
+data/CN/河南省/郑州市/金水区={"id":"data/CN/河南省/郑州市/金水区","key":"金水区","lang":"zh-hans","lname":"Jinshui Qu","zipex":"450003"}
+data/CN/河南省/驻马店市={"id":"data/CN/河南省/驻马店市","key":"驻马店市","lang":"zh-hans","lname":"Zhumadian Shi","zipex":"463000","sub_keys":"泌阳县~平舆县~确山县~汝南县~上蔡县~遂平县~西平县~新蔡县~驿城区~正阳县","sub_lnames":"Biyang Xian~Pingyu Xian~Queshan Xian~Runan Xian~Shangcai Xian~Suiping Xian~Xiping Xian~Xincai Xian~Yicheng Qu~Zhengyang Xian","sub_zipexs":"463700~463400~463200~463300~463800~463100~463900~463500~463000~463600"}
+data/CN/河南省/驻马店市/上蔡县={"id":"data/CN/河南省/驻马店市/上蔡县","key":"上蔡县","lang":"zh-hans","lname":"Shangcai Xian","zipex":"463800"}
+data/CN/河南省/驻马店市/平舆县={"id":"data/CN/河南省/驻马店市/平舆县","key":"平舆县","lang":"zh-hans","lname":"Pingyu Xian","zipex":"463400"}
+data/CN/河南省/驻马店市/新蔡县={"id":"data/CN/河南省/驻马店市/新蔡县","key":"新蔡县","lang":"zh-hans","lname":"Xincai Xian","zipex":"463500"}
+data/CN/河南省/驻马店市/正阳县={"id":"data/CN/河南省/驻马店市/正阳县","key":"正阳县","lang":"zh-hans","lname":"Zhengyang Xian","zipex":"463600"}
+data/CN/河南省/驻马店市/汝南县={"id":"data/CN/河南省/驻马店市/汝南县","key":"汝南县","lang":"zh-hans","lname":"Runan Xian","zipex":"463300"}
+data/CN/河南省/驻马店市/泌阳县={"id":"data/CN/河南省/驻马店市/泌阳县","key":"泌阳县","lang":"zh-hans","lname":"Biyang Xian","zipex":"463700"}
+data/CN/河南省/驻马店市/确山县={"id":"data/CN/河南省/驻马店市/确山县","key":"确山县","lang":"zh-hans","lname":"Queshan Xian","zipex":"463200"}
+data/CN/河南省/驻马店市/西平县={"id":"data/CN/河南省/驻马店市/西平县","key":"西平县","lang":"zh-hans","lname":"Xiping Xian","zipex":"463900"}
+data/CN/河南省/驻马店市/遂平县={"id":"data/CN/河南省/驻马店市/遂平县","key":"遂平县","lang":"zh-hans","lname":"Suiping Xian","zipex":"463100"}
+data/CN/河南省/驻马店市/驿城区={"id":"data/CN/河南省/驻马店市/驿城区","key":"驿城区","lang":"zh-hans","lname":"Yicheng Qu","zipex":"463000"}
+data/CN/河南省/鹤壁市={"id":"data/CN/河南省/鹤壁市","key":"鹤壁市","lang":"zh-hans","lname":"Hebi Shi","zipex":"458030","sub_keys":"鹤山区~浚县~淇滨区~淇县~山城区","sub_lnames":"Heshan Qu~Xun Xian~Qibin Qu~Qi Xian~Shancheng Qu","sub_zipexs":"458010~456250~458030~456750~458000"}
+data/CN/河南省/鹤壁市/山城区={"id":"data/CN/河南省/鹤壁市/山城区","key":"山城区","lang":"zh-hans","lname":"Shancheng Qu","zipex":"458000"}
+data/CN/河南省/鹤壁市/浚县={"id":"data/CN/河南省/鹤壁市/浚县","key":"浚县","lang":"zh-hans","lname":"Xun Xian","zipex":"456250"}
+data/CN/河南省/鹤壁市/淇县={"id":"data/CN/河南省/鹤壁市/淇县","key":"淇县","lang":"zh-hans","lname":"Qi Xian","zipex":"456750"}
+data/CN/河南省/鹤壁市/淇滨区={"id":"data/CN/河南省/鹤壁市/淇滨区","key":"淇滨区","lang":"zh-hans","lname":"Qibin Qu","zipex":"458030"}
+data/CN/河南省/鹤壁市/鹤山区={"id":"data/CN/河南省/鹤壁市/鹤山区","key":"鹤山区","lang":"zh-hans","lname":"Heshan Qu","zipex":"458010"}
+data/CN/浙江省={"id":"data/CN/浙江省","key":"浙江省","lang":"zh-hans","lname":"Zhejiang Sheng","isoid":"33","sub_keys":"杭州市~湖州市~嘉兴市~金华市~丽水市~宁波市~衢州市~绍兴市~台州市~温州市~舟山市","sub_lnames":"Hangzhou Shi~Huzhou Shi~Jiaxing Shi~Jinhua Shi~Lishui Shi~Ningbo Shi~Quzhou Shi~Shaoxing Shi~Taizhou Shi~Wenzhou Shi~Zhoushan Shi","sub_zipexs":"310026~313000~314000~321000~323000~315000~324002~312000~318000~325000~316000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/浙江省/丽水市={"id":"data/CN/浙江省/丽水市","key":"丽水市","lang":"zh-hans","lname":"Lishui Shi","zipex":"323000","sub_keys":"缙云县~景宁畲族自治县~莲都区~龙泉市~青田县~庆元县~松阳县~遂昌县~云和县","sub_lnames":"Jinyun Xian~Jingning Xian~Liandu Qu~Longquan Shi~Qingtian Xian~Qingyuan Xian~Songyang Xian~Suichang Xian~Yunhe Xian","sub_zipexs":"321400~323500~323000~323700~323900~323800~323400~323300~323600","sub_lfnames":"~Jingning Shezu Zizhixian~~~~~~~"}
+data/CN/浙江省/丽水市/云和县={"id":"data/CN/浙江省/丽水市/云和县","key":"云和县","lang":"zh-hans","lname":"Yunhe Xian","zipex":"323600"}
+data/CN/浙江省/丽水市/庆元县={"id":"data/CN/浙江省/丽水市/庆元县","key":"庆元县","lang":"zh-hans","lname":"Qingyuan Xian","zipex":"323800"}
+data/CN/浙江省/丽水市/景宁畲族自治县={"id":"data/CN/浙江省/丽水市/景宁畲族自治县","key":"景宁畲族自治县","lang":"zh-hans","lname":"Jingning Xian","zipex":"323500","lfname":"Jingning Shezu Zizhixian"}
+data/CN/浙江省/丽水市/松阳县={"id":"data/CN/浙江省/丽水市/松阳县","key":"松阳县","lang":"zh-hans","lname":"Songyang Xian","zipex":"323400"}
+data/CN/浙江省/丽水市/缙云县={"id":"data/CN/浙江省/丽水市/缙云县","key":"缙云县","lang":"zh-hans","lname":"Jinyun Xian","zipex":"321400"}
+data/CN/浙江省/丽水市/莲都区={"id":"data/CN/浙江省/丽水市/莲都区","key":"莲都区","lang":"zh-hans","lname":"Liandu Qu","zipex":"323000"}
+data/CN/浙江省/丽水市/遂昌县={"id":"data/CN/浙江省/丽水市/遂昌县","key":"遂昌县","lang":"zh-hans","lname":"Suichang Xian","zipex":"323300"}
+data/CN/浙江省/丽水市/青田县={"id":"data/CN/浙江省/丽水市/青田县","key":"青田县","lang":"zh-hans","lname":"Qingtian Xian","zipex":"323900"}
+data/CN/浙江省/丽水市/龙泉市={"id":"data/CN/浙江省/丽水市/龙泉市","key":"龙泉市","lang":"zh-hans","lname":"Longquan Shi","zipex":"323700"}
+data/CN/浙江省/台州市={"id":"data/CN/浙江省/台州市","key":"台州市","lang":"zh-hans","lname":"Taizhou Shi","zipex":"318000","sub_keys":"黄岩区~椒江区~临海市~路桥区~三门县~天台县~温岭市~仙居县~玉环县","sub_lnames":"Huangyan Qu~Jiaojiang Qu~Linhai Shi~Luqiao Qu~Sanmen Xian~Tiantai Xian~Wenling Shi~Xianju Xian~Yuhuan Xian","sub_zipexs":"318020~318000~317000~318050~317100~317200~317500~317300~317600"}
+data/CN/浙江省/台州市/三门县={"id":"data/CN/浙江省/台州市/三门县","key":"三门县","lang":"zh-hans","lname":"Sanmen Xian","zipex":"317100"}
+data/CN/浙江省/台州市/临海市={"id":"data/CN/浙江省/台州市/临海市","key":"临海市","lang":"zh-hans","lname":"Linhai Shi","zipex":"317000"}
+data/CN/浙江省/台州市/仙居县={"id":"data/CN/浙江省/台州市/仙居县","key":"仙居县","lang":"zh-hans","lname":"Xianju Xian","zipex":"317300"}
+data/CN/浙江省/台州市/天台县={"id":"data/CN/浙江省/台州市/天台县","key":"天台县","lang":"zh-hans","lname":"Tiantai Xian","zipex":"317200"}
+data/CN/浙江省/台州市/椒江区={"id":"data/CN/浙江省/台州市/椒江区","key":"椒江区","lang":"zh-hans","lname":"Jiaojiang Qu","zipex":"318000"}
+data/CN/浙江省/台州市/温岭市={"id":"data/CN/浙江省/台州市/温岭市","key":"温岭市","lang":"zh-hans","lname":"Wenling Shi","zipex":"317500"}
+data/CN/浙江省/台州市/玉环县={"id":"data/CN/浙江省/台州市/玉环县","key":"玉环县","lang":"zh-hans","lname":"Yuhuan Xian","zipex":"317600"}
+data/CN/浙江省/台州市/路桥区={"id":"data/CN/浙江省/台州市/路桥区","key":"路桥区","lang":"zh-hans","lname":"Luqiao Qu","zipex":"318050"}
+data/CN/浙江省/台州市/黄岩区={"id":"data/CN/浙江省/台州市/黄岩区","key":"黄岩区","lang":"zh-hans","lname":"Huangyan Qu","zipex":"318020"}
+data/CN/浙江省/嘉兴市={"id":"data/CN/浙江省/嘉兴市","key":"嘉兴市","lang":"zh-hans","lname":"Jiaxing Shi","zipex":"314000","sub_keys":"海宁市~海盐县~嘉善县~南湖区~平湖市~桐乡市~秀洲区","sub_lnames":"Haining Shi~Haiyan Xian~Jiashan Xian~Nanhu Qu~Pinghu Shi~Tongxiang Shi~Xiuzhou Qu","sub_zipexs":"314400~314300~314100~314001~314200~314500~314001"}
+data/CN/浙江省/嘉兴市/南湖区={"id":"data/CN/浙江省/嘉兴市/南湖区","key":"南湖区","lang":"zh-hans","lname":"Nanhu Qu","zipex":"314001"}
+data/CN/浙江省/嘉兴市/嘉善县={"id":"data/CN/浙江省/嘉兴市/嘉善县","key":"嘉善县","lang":"zh-hans","lname":"Jiashan Xian","zipex":"314100"}
+data/CN/浙江省/嘉兴市/平湖市={"id":"data/CN/浙江省/嘉兴市/平湖市","key":"平湖市","lang":"zh-hans","lname":"Pinghu Shi","zipex":"314200"}
+data/CN/浙江省/嘉兴市/桐乡市={"id":"data/CN/浙江省/嘉兴市/桐乡市","key":"桐乡市","lang":"zh-hans","lname":"Tongxiang Shi","zipex":"314500"}
+data/CN/浙江省/嘉兴市/海宁市={"id":"data/CN/浙江省/嘉兴市/海宁市","key":"海宁市","lang":"zh-hans","lname":"Haining Shi","zipex":"314400"}
+data/CN/浙江省/嘉兴市/海盐县={"id":"data/CN/浙江省/嘉兴市/海盐县","key":"海盐县","lang":"zh-hans","lname":"Haiyan Xian","zipex":"314300"}
+data/CN/浙江省/嘉兴市/秀洲区={"id":"data/CN/浙江省/嘉兴市/秀洲区","key":"秀洲区","lang":"zh-hans","lname":"Xiuzhou Qu","zipex":"314001"}
+data/CN/浙江省/宁波市={"id":"data/CN/浙江省/宁波市","key":"宁波市","lang":"zh-hans","lname":"Ningbo Shi","zipex":"315000","sub_keys":"北仑区~慈溪市~奉化市~海曙区~江北区~江东区~宁海县~象山县~鄞州区~余姚市~镇海区","sub_lnames":"Beilun Qu~Cixi Shi~Fenghua Shi~Haishu Qu~Jiangbei Qu~Jiangdong Qu~Ninghai Xian~Xiangshan Xian~Yinzhou Qu~Yuyao Shi~Zhenhai Qu","sub_zipexs":"315800~315300~315500~315000~315020~315040~315600~315700~315040~315400~315200"}
+data/CN/浙江省/宁波市/余姚市={"id":"data/CN/浙江省/宁波市/余姚市","key":"余姚市","lang":"zh-hans","lname":"Yuyao Shi","zipex":"315400"}
+data/CN/浙江省/宁波市/北仑区={"id":"data/CN/浙江省/宁波市/北仑区","key":"北仑区","lang":"zh-hans","lname":"Beilun Qu","zipex":"315800"}
+data/CN/浙江省/宁波市/奉化市={"id":"data/CN/浙江省/宁波市/奉化市","key":"奉化市","lang":"zh-hans","lname":"Fenghua Shi","zipex":"315500"}
+data/CN/浙江省/宁波市/宁海县={"id":"data/CN/浙江省/宁波市/宁海县","key":"宁海县","lang":"zh-hans","lname":"Ninghai Xian","zipex":"315600"}
+data/CN/浙江省/宁波市/慈溪市={"id":"data/CN/浙江省/宁波市/慈溪市","key":"慈溪市","lang":"zh-hans","lname":"Cixi Shi","zipex":"315300"}
+data/CN/浙江省/宁波市/江东区={"id":"data/CN/浙江省/宁波市/江东区","key":"江东区","lang":"zh-hans","lname":"Jiangdong Qu","zipex":"315040"}
+data/CN/浙江省/宁波市/江北区={"id":"data/CN/浙江省/宁波市/江北区","key":"江北区","lang":"zh-hans","lname":"Jiangbei Qu","zipex":"315020"}
+data/CN/浙江省/宁波市/海曙区={"id":"data/CN/浙江省/宁波市/海曙区","key":"海曙区","lang":"zh-hans","lname":"Haishu Qu","zipex":"315000"}
+data/CN/浙江省/宁波市/象山县={"id":"data/CN/浙江省/宁波市/象山县","key":"象山县","lang":"zh-hans","lname":"Xiangshan Xian","zipex":"315700"}
+data/CN/浙江省/宁波市/鄞州区={"id":"data/CN/浙江省/宁波市/鄞州区","key":"鄞州区","lang":"zh-hans","lname":"Yinzhou Qu","zipex":"315040"}
+data/CN/浙江省/宁波市/镇海区={"id":"data/CN/浙江省/宁波市/镇海区","key":"镇海区","lang":"zh-hans","lname":"Zhenhai Qu","zipex":"315200"}
+data/CN/浙江省/杭州市={"id":"data/CN/浙江省/杭州市","key":"杭州市","lang":"zh-hans","lname":"Hangzhou Shi","zipex":"310026","sub_keys":"滨江区~淳安县~富阳市~拱墅区~建德市~江干区~临安市~上城区~桐庐县~西湖区~下城区~萧山区~余杭区","sub_lnames":"Binjiang Qu~Chun'an Xian~Fuyang Shi~Gongshu Qu~Jiande Shi~Jianggan Qu~Lin'an Shi~Shangcheng Qu~Tonglu Xian~Xihu Qu~Xiacheng Qu~Xiaoshan Qu~Yuhang Qu","sub_zipexs":"310051~311700~311400~310011~311600~310002~311300~311500~311500~310013~310006~311200~311000"}
+data/CN/浙江省/杭州市/上城区={"id":"data/CN/浙江省/杭州市/上城区","key":"上城区","lang":"zh-hans","lname":"Shangcheng Qu","zipex":"311500"}
+data/CN/浙江省/杭州市/下城区={"id":"data/CN/浙江省/杭州市/下城区","key":"下城区","lang":"zh-hans","lname":"Xiacheng Qu","zipex":"310006"}
+data/CN/浙江省/杭州市/临安市={"id":"data/CN/浙江省/杭州市/临安市","key":"临安市","lang":"zh-hans","lname":"Lin'an Shi","zipex":"311300"}
+data/CN/浙江省/杭州市/余杭区={"id":"data/CN/浙江省/杭州市/余杭区","key":"余杭区","lang":"zh-hans","lname":"Yuhang Qu","zipex":"311000"}
+data/CN/浙江省/杭州市/富阳市={"id":"data/CN/浙江省/杭州市/富阳市","key":"富阳市","lang":"zh-hans","lname":"Fuyang Shi","zipex":"311400"}
+data/CN/浙江省/杭州市/建德市={"id":"data/CN/浙江省/杭州市/建德市","key":"建德市","lang":"zh-hans","lname":"Jiande Shi","zipex":"311600"}
+data/CN/浙江省/杭州市/拱墅区={"id":"data/CN/浙江省/杭州市/拱墅区","key":"拱墅区","lang":"zh-hans","lname":"Gongshu Qu","zipex":"310011"}
+data/CN/浙江省/杭州市/桐庐县={"id":"data/CN/浙江省/杭州市/桐庐县","key":"桐庐县","lang":"zh-hans","lname":"Tonglu Xian","zipex":"311500"}
+data/CN/浙江省/杭州市/江干区={"id":"data/CN/浙江省/杭州市/江干区","key":"江干区","lang":"zh-hans","lname":"Jianggan Qu","zipex":"310002"}
+data/CN/浙江省/杭州市/淳安县={"id":"data/CN/浙江省/杭州市/淳安县","key":"淳安县","lang":"zh-hans","lname":"Chun'an Xian","zipex":"311700"}
+data/CN/浙江省/杭州市/滨江区={"id":"data/CN/浙江省/杭州市/滨江区","key":"滨江区","lang":"zh-hans","lname":"Binjiang Qu","zipex":"310051"}
+data/CN/浙江省/杭州市/萧山区={"id":"data/CN/浙江省/杭州市/萧山区","key":"萧山区","lang":"zh-hans","lname":"Xiaoshan Qu","zipex":"311200"}
+data/CN/浙江省/杭州市/西湖区={"id":"data/CN/浙江省/杭州市/西湖区","key":"西湖区","lang":"zh-hans","lname":"Xihu Qu","zipex":"310013"}
+data/CN/浙江省/温州市={"id":"data/CN/浙江省/温州市","key":"温州市","lang":"zh-hans","lname":"Wenzhou Shi","zipex":"325000","sub_keys":"苍南县~洞头县~乐清市~龙湾区~鹿城区~瓯海区~平阳县~瑞安市~泰顺县~文成县~永嘉县","sub_lnames":"Cangnan Xian~Dongtou Xian~Yueqing Shi~Longwan Qu~Lucheng Qu~Ouhai Qu~Pingyang Xian~Rui'an Shi~Taishun Xian~Wencheng Xian~Yongjia Xian","sub_zipexs":"325800~325700~325600~325013~325000~325005~325400~325200~325500~325300~325100"}
+data/CN/浙江省/温州市/乐清市={"id":"data/CN/浙江省/温州市/乐清市","key":"乐清市","lang":"zh-hans","lname":"Yueqing Shi","zipex":"325600"}
+data/CN/浙江省/温州市/平阳县={"id":"data/CN/浙江省/温州市/平阳县","key":"平阳县","lang":"zh-hans","lname":"Pingyang Xian","zipex":"325400"}
+data/CN/浙江省/温州市/文成县={"id":"data/CN/浙江省/温州市/文成县","key":"文成县","lang":"zh-hans","lname":"Wencheng Xian","zipex":"325300"}
+data/CN/浙江省/温州市/永嘉县={"id":"data/CN/浙江省/温州市/永嘉县","key":"永嘉县","lang":"zh-hans","lname":"Yongjia Xian","zipex":"325100"}
+data/CN/浙江省/温州市/泰顺县={"id":"data/CN/浙江省/温州市/泰顺县","key":"泰顺县","lang":"zh-hans","lname":"Taishun Xian","zipex":"325500"}
+data/CN/浙江省/温州市/洞头县={"id":"data/CN/浙江省/温州市/洞头县","key":"洞头县","lang":"zh-hans","lname":"Dongtou Xian","zipex":"325700"}
+data/CN/浙江省/温州市/瑞安市={"id":"data/CN/浙江省/温州市/瑞安市","key":"瑞安市","lang":"zh-hans","lname":"Rui'an Shi","zipex":"325200"}
+data/CN/浙江省/温州市/瓯海区={"id":"data/CN/浙江省/温州市/瓯海区","key":"瓯海区","lang":"zh-hans","lname":"Ouhai Qu","zipex":"325005"}
+data/CN/浙江省/温州市/苍南县={"id":"data/CN/浙江省/温州市/苍南县","key":"苍南县","lang":"zh-hans","lname":"Cangnan Xian","zipex":"325800"}
+data/CN/浙江省/温州市/鹿城区={"id":"data/CN/浙江省/温州市/鹿城区","key":"鹿城区","lang":"zh-hans","lname":"Lucheng Qu","zipex":"325000"}
+data/CN/浙江省/温州市/龙湾区={"id":"data/CN/浙江省/温州市/龙湾区","key":"龙湾区","lang":"zh-hans","lname":"Longwan Qu","zipex":"325013"}
+data/CN/浙江省/湖州市={"id":"data/CN/浙江省/湖州市","key":"湖州市","lang":"zh-hans","lname":"Huzhou Shi","zipex":"313000","sub_keys":"安吉县~长兴县~德清县~南浔区~吴兴区","sub_lnames":"Anji Xian~Changxing Xian~Deqing Xian~Nanxun Qu~Wuxing Qu","sub_zipexs":"313300~313100~313200~313009~313000"}
+data/CN/浙江省/湖州市/南浔区={"id":"data/CN/浙江省/湖州市/南浔区","key":"南浔区","lang":"zh-hans","lname":"Nanxun Qu","zipex":"313009"}
+data/CN/浙江省/湖州市/吴兴区={"id":"data/CN/浙江省/湖州市/吴兴区","key":"吴兴区","lang":"zh-hans","lname":"Wuxing Qu","zipex":"313000"}
+data/CN/浙江省/湖州市/安吉县={"id":"data/CN/浙江省/湖州市/安吉县","key":"安吉县","lang":"zh-hans","lname":"Anji Xian","zipex":"313300"}
+data/CN/浙江省/湖州市/德清县={"id":"data/CN/浙江省/湖州市/德清县","key":"德清县","lang":"zh-hans","lname":"Deqing Xian","zipex":"313200"}
+data/CN/浙江省/湖州市/长兴县={"id":"data/CN/浙江省/湖州市/长兴县","key":"长兴县","lang":"zh-hans","lname":"Changxing Xian","zipex":"313100"}
+data/CN/浙江省/绍兴市={"id":"data/CN/浙江省/绍兴市","key":"绍兴市","lang":"zh-hans","lname":"Shaoxing Shi","zipex":"312000","sub_keys":"上虞市~绍兴县~嵊州市~新昌县~越城区~诸暨市","sub_lnames":"Shangyu Shi~Shaoxing Xian~Shengzhou Shi~Xinchang Xian~Yuecheng Qu~Zhuji Shi","sub_zipexs":"312300~312000~312400~312500~312000~311800"}
+data/CN/浙江省/绍兴市/上虞市={"id":"data/CN/浙江省/绍兴市/上虞市","key":"上虞市","lang":"zh-hans","lname":"Shangyu Shi","zipex":"312300"}
+data/CN/浙江省/绍兴市/嵊州市={"id":"data/CN/浙江省/绍兴市/嵊州市","key":"嵊州市","lang":"zh-hans","lname":"Shengzhou Shi","zipex":"312400"}
+data/CN/浙江省/绍兴市/新昌县={"id":"data/CN/浙江省/绍兴市/新昌县","key":"新昌县","lang":"zh-hans","lname":"Xinchang Xian","zipex":"312500"}
+data/CN/浙江省/绍兴市/绍兴县={"id":"data/CN/浙江省/绍兴市/绍兴县","key":"绍兴县","lang":"zh-hans","lname":"Shaoxing Xian","zipex":"312000"}
+data/CN/浙江省/绍兴市/诸暨市={"id":"data/CN/浙江省/绍兴市/诸暨市","key":"诸暨市","lang":"zh-hans","lname":"Zhuji Shi","zipex":"311800"}
+data/CN/浙江省/绍兴市/越城区={"id":"data/CN/浙江省/绍兴市/越城区","key":"越城区","lang":"zh-hans","lname":"Yuecheng Qu","zipex":"312000"}
+data/CN/浙江省/舟山市={"id":"data/CN/浙江省/舟山市","key":"舟山市","lang":"zh-hans","lname":"Zhoushan Shi","zipex":"316000","sub_keys":"岱山县~定海区~普陀区~嵊泗县","sub_lnames":"Daishan Xian~Dinghai Qu~Putuo Qu~Shengsi Xian","sub_zipexs":"316200~316000~316100~202450"}
+data/CN/浙江省/舟山市/定海区={"id":"data/CN/浙江省/舟山市/定海区","key":"定海区","lang":"zh-hans","lname":"Dinghai Qu","zipex":"316000"}
+data/CN/浙江省/舟山市/岱山县={"id":"data/CN/浙江省/舟山市/岱山县","key":"岱山县","lang":"zh-hans","lname":"Daishan Xian","zipex":"316200"}
+data/CN/浙江省/舟山市/嵊泗县={"id":"data/CN/浙江省/舟山市/嵊泗县","key":"嵊泗县","lang":"zh-hans","lname":"Shengsi Xian","zipex":"202450"}
+data/CN/浙江省/舟山市/普陀区={"id":"data/CN/浙江省/舟山市/普陀区","key":"普陀区","lang":"zh-hans","lname":"Putuo Qu","zipex":"316100"}
+data/CN/浙江省/衢州市={"id":"data/CN/浙江省/衢州市","key":"衢州市","lang":"zh-hans","lname":"Quzhou Shi","zipex":"324002","sub_keys":"常山县~江山市~开化县~柯城区~龙游县~衢江区","sub_lnames":"Changshan Xian~Jiangshan Shi~Kaihua Xian~Kecheng Qu~Longyou Xian~Qujiang Qu","sub_zipexs":"324200~324100~324300~324000~324400~324022"}
+data/CN/浙江省/衢州市/常山县={"id":"data/CN/浙江省/衢州市/常山县","key":"常山县","lang":"zh-hans","lname":"Changshan Xian","zipex":"324200"}
+data/CN/浙江省/衢州市/开化县={"id":"data/CN/浙江省/衢州市/开化县","key":"开化县","lang":"zh-hans","lname":"Kaihua Xian","zipex":"324300"}
+data/CN/浙江省/衢州市/柯城区={"id":"data/CN/浙江省/衢州市/柯城区","key":"柯城区","lang":"zh-hans","lname":"Kecheng Qu","zipex":"324000"}
+data/CN/浙江省/衢州市/江山市={"id":"data/CN/浙江省/衢州市/江山市","key":"江山市","lang":"zh-hans","lname":"Jiangshan Shi","zipex":"324100"}
+data/CN/浙江省/衢州市/衢江区={"id":"data/CN/浙江省/衢州市/衢江区","key":"衢江区","lang":"zh-hans","lname":"Qujiang Qu","zipex":"324022"}
+data/CN/浙江省/衢州市/龙游县={"id":"data/CN/浙江省/衢州市/龙游县","key":"龙游县","lang":"zh-hans","lname":"Longyou Xian","zipex":"324400"}
+data/CN/浙江省/金华市={"id":"data/CN/浙江省/金华市","key":"金华市","lang":"zh-hans","lname":"Jinhua Shi","zipex":"321000","sub_keys":"东阳市~金东区~兰溪市~磐安县~浦江县~武义县~婺城区~义乌市~永康市","sub_lnames":"Dongyang Shi~Jindong Qu~Lanxi Shi~Pan'an Xian~Pujiang Xian~Wuyi Xian~Wucheng Qu~Yiwu Shi~Yongkang Shi","sub_zipexs":"322100~321000~321100~322300~322200~321200~321000~322000~321300"}
+data/CN/浙江省/金华市/东阳市={"id":"data/CN/浙江省/金华市/东阳市","key":"东阳市","lang":"zh-hans","lname":"Dongyang Shi","zipex":"322100"}
+data/CN/浙江省/金华市/义乌市={"id":"data/CN/浙江省/金华市/义乌市","key":"义乌市","lang":"zh-hans","lname":"Yiwu Shi","zipex":"322000"}
+data/CN/浙江省/金华市/兰溪市={"id":"data/CN/浙江省/金华市/兰溪市","key":"兰溪市","lang":"zh-hans","lname":"Lanxi Shi","zipex":"321100"}
+data/CN/浙江省/金华市/婺城区={"id":"data/CN/浙江省/金华市/婺城区","key":"婺城区","lang":"zh-hans","lname":"Wucheng Qu","zipex":"321000"}
+data/CN/浙江省/金华市/武义县={"id":"data/CN/浙江省/金华市/武义县","key":"武义县","lang":"zh-hans","lname":"Wuyi Xian","zipex":"321200"}
+data/CN/浙江省/金华市/永康市={"id":"data/CN/浙江省/金华市/永康市","key":"永康市","lang":"zh-hans","lname":"Yongkang Shi","zipex":"321300"}
+data/CN/浙江省/金华市/浦江县={"id":"data/CN/浙江省/金华市/浦江县","key":"浦江县","lang":"zh-hans","lname":"Pujiang Xian","zipex":"322200"}
+data/CN/浙江省/金华市/磐安县={"id":"data/CN/浙江省/金华市/磐安县","key":"磐安县","lang":"zh-hans","lname":"Pan'an Xian","zipex":"322300"}
+data/CN/浙江省/金华市/金东区={"id":"data/CN/浙江省/金华市/金东区","key":"金东区","lang":"zh-hans","lname":"Jindong Qu","zipex":"321000"}
+data/CN/海南省={"id":"data/CN/海南省","key":"海南省","lang":"zh-hans","lname":"Hainan Sheng","isoid":"46","sub_keys":"白沙黎族自治县~保亭黎族苗族自治县~昌江黎族自治县~澄迈县~儋州市~定安县~东方市~海口市~乐东黎族自治县~临高县~陵水黎族自治县~南沙群岛~琼海市~琼中黎族苗族自治县~三亚市~屯昌县~万宁市~文昌市~五指山市~西沙群岛~中沙群岛的岛礁及其海域","sub_lnames":"Baisha Xian~Baoting Xian~Changjiang Xian~Chengmai Xian~Danzhou Shi~Ding'an Xian~Dongfang Shi~Haikou Shi~Ledong Xian~Lingao Xian~Lingshui Xian~Nansha Qundao~Qionghai Shi~Qiongzhong Xian~Sanya Shi~Tunchang Xian~Wanning Shi~Qiongshan Shi~Wuzhishan Shi~Xisha Qundao~Zhongsha Qundao de Daojiao Jiqi Haiyu","sub_zipexs":"572800~572300~572700~571900~571700~571200~572600~570102~572500~571800~572400~~571400~572900~572002~571600~571500~571300~572200~~","sub_mores":"false~false~false~false~false~false~false~true~false~false~false~false~false~false~false~false~false~false~false~false~false","sub_lfnames":"Baisha Lizu Zizhixian~Baoting Lizu Miaozu Zizhixian~Changjiang Lizu Zizhixian~~~~~~Ledong Lizu Zizhixian~~Lingshui Lizu Zizhixian~~~Qiongzhong Lizu Miaozu Zizhixian~~~~~~~"}
+data/CN/海南省/万宁市={"id":"data/CN/海南省/万宁市","key":"万宁市","lang":"zh-hans","lname":"Wanning Shi","zipex":"571500"}
+data/CN/海南省/三亚市={"id":"data/CN/海南省/三亚市","key":"三亚市","lang":"zh-hans","lname":"Sanya Shi","zipex":"572002"}
+data/CN/海南省/东方市={"id":"data/CN/海南省/东方市","key":"东方市","lang":"zh-hans","lname":"Dongfang Shi","zipex":"572600"}
+data/CN/海南省/中沙群岛的岛礁及其海域={"id":"data/CN/海南省/中沙群岛的岛礁及其海域","key":"中沙群岛的岛礁及其海域","lang":"zh-hans","lname":"Zhongsha Qundao de Daojiao Jiqi Haiyu"}
+data/CN/海南省/临高县={"id":"data/CN/海南省/临高县","key":"临高县","lang":"zh-hans","lname":"Lingao Xian","zipex":"571800"}
+data/CN/海南省/乐东黎族自治县={"id":"data/CN/海南省/乐东黎族自治县","key":"乐东黎族自治县","lang":"zh-hans","lname":"Ledong Xian","zipex":"572500","lfname":"Ledong Lizu Zizhixian"}
+data/CN/海南省/五指山市={"id":"data/CN/海南省/五指山市","key":"五指山市","lang":"zh-hans","lname":"Wuzhishan Shi","zipex":"572200"}
+data/CN/海南省/保亭黎族苗族自治县={"id":"data/CN/海南省/保亭黎族苗族自治县","key":"保亭黎族苗族自治县","lang":"zh-hans","lname":"Baoting Xian","zipex":"572300","lfname":"Baoting Lizu Miaozu Zizhixian"}
+data/CN/海南省/儋州市={"id":"data/CN/海南省/儋州市","key":"儋州市","lang":"zh-hans","lname":"Danzhou Shi","zipex":"571700"}
+data/CN/海南省/南沙群岛={"id":"data/CN/海南省/南沙群岛","key":"南沙群岛","lang":"zh-hans","lname":"Nansha Qundao"}
+data/CN/海南省/定安县={"id":"data/CN/海南省/定安县","key":"定安县","lang":"zh-hans","lname":"Ding'an Xian","zipex":"571200"}
+data/CN/海南省/屯昌县={"id":"data/CN/海南省/屯昌县","key":"屯昌县","lang":"zh-hans","lname":"Tunchang Xian","zipex":"571600"}
+data/CN/海南省/文昌市={"id":"data/CN/海南省/文昌市","key":"文昌市","lang":"zh-hans","lname":"Qiongshan Shi","zipex":"571300"}
+data/CN/海南省/昌江黎族自治县={"id":"data/CN/海南省/昌江黎族自治县","key":"昌江黎族自治县","lang":"zh-hans","lname":"Changjiang Xian","zipex":"572700","lfname":"Changjiang Lizu Zizhixian"}
+data/CN/海南省/海口市={"id":"data/CN/海南省/海口市","key":"海口市","lang":"zh-hans","lname":"Haikou Shi","zipex":"570102","sub_keys":"龙华区~美兰区~琼山区~秀英区","sub_lnames":"Longhua Qu~Meilan Qu~Qiongshan Qu~Xiuying Qu","sub_zipexs":"570105~570203~571100~570311"}
+data/CN/海南省/海口市/琼山区={"id":"data/CN/海南省/海口市/琼山区","key":"琼山区","lang":"zh-hans","lname":"Qiongshan Qu","zipex":"571100"}
+data/CN/海南省/海口市/秀英区={"id":"data/CN/海南省/海口市/秀英区","key":"秀英区","lang":"zh-hans","lname":"Xiuying Qu","zipex":"570311"}
+data/CN/海南省/海口市/美兰区={"id":"data/CN/海南省/海口市/美兰区","key":"美兰区","lang":"zh-hans","lname":"Meilan Qu","zipex":"570203"}
+data/CN/海南省/海口市/龙华区={"id":"data/CN/海南省/海口市/龙华区","key":"龙华区","lang":"zh-hans","lname":"Longhua Qu","zipex":"570105"}
+data/CN/海南省/澄迈县={"id":"data/CN/海南省/澄迈县","key":"澄迈县","lang":"zh-hans","lname":"Chengmai Xian","zipex":"571900"}
+data/CN/海南省/琼中黎族苗族自治县={"id":"data/CN/海南省/琼中黎族苗族自治县","key":"琼中黎族苗族自治县","lang":"zh-hans","lname":"Qiongzhong Xian","zipex":"572900","lfname":"Qiongzhong Lizu Miaozu Zizhixian"}
+data/CN/海南省/琼海市={"id":"data/CN/海南省/琼海市","key":"琼海市","lang":"zh-hans","lname":"Qionghai Shi","zipex":"571400"}
+data/CN/海南省/白沙黎族自治县={"id":"data/CN/海南省/白沙黎族自治县","key":"白沙黎族自治县","lang":"zh-hans","lname":"Baisha Xian","zipex":"572800","lfname":"Baisha Lizu Zizhixian"}
+data/CN/海南省/西沙群岛={"id":"data/CN/海南省/西沙群岛","key":"西沙群岛","lang":"zh-hans","lname":"Xisha Qundao"}
+data/CN/海南省/陵水黎族自治县={"id":"data/CN/海南省/陵水黎族自治县","key":"陵水黎族自治县","lang":"zh-hans","lname":"Lingshui Xian","zipex":"572400","lfname":"Lingshui Lizu Zizhixian"}
+data/CN/湖北省={"id":"data/CN/湖北省","key":"湖北省","lang":"zh-hans","lname":"Hubei Sheng","isoid":"42","sub_keys":"鄂州市~恩施土家族苗族自治州~黄冈市~黄石市~荆门市~荆州市~潜江市~神农架林区~十堰市~随州市~天门市~武汉市~仙桃市~咸宁市~襄樊市~孝感市~宜昌市","sub_lnames":"Ezhou Shi~Enshi Zhou~Huanggang Shi~Huangshi Shi~Jingmen Shi~Jingzhou Shi~Qianjiang Shi~Shennongjia Linqu~Shiyan Shi~Suizhou Shi~Tianmen Shi~Wuhan Shi~Xiantao Shi~Xianning Shi~Xiangfan Shi~Xiaogan Shi~Yichang Shi","sub_zipexs":"436000~445000~438000~435003~448000~434000~433100~442400~442000~441300~431700~430014~433000~437000~441021~432100~443000","sub_mores":"true~true~true~true~true~true~false~false~true~true~false~true~false~true~true~true~true","sub_lfnames":"~Enshi Tujiazu Miaozu Zizhizhou~~~~~~~~~~~~~~~"}
+data/CN/湖北省/仙桃市={"id":"data/CN/湖北省/仙桃市","key":"仙桃市","lang":"zh-hans","lname":"Xiantao Shi","zipex":"433000"}
+data/CN/湖北省/十堰市={"id":"data/CN/湖北省/十堰市","key":"十堰市","lang":"zh-hans","lname":"Shiyan Shi","zipex":"442000","sub_keys":"丹江口市~房县~茅箭区~郧西县~郧县~张湾区~竹山县~竹溪县","sub_lnames":"Danjiangkou Shi~Fang Xian~Maojian Qu~Yunxi Xian~Yun Xian~Zhangwan Qu~Zhushan Xian~Zhuxi Xian","sub_zipexs":"442700~442100~442012~442600~442500~442001~442200~442300"}
+data/CN/湖北省/十堰市/丹江口市={"id":"data/CN/湖北省/十堰市/丹江口市","key":"丹江口市","lang":"zh-hans","lname":"Danjiangkou Shi","zipex":"442700"}
+data/CN/湖北省/十堰市/张湾区={"id":"data/CN/湖北省/十堰市/张湾区","key":"张湾区","lang":"zh-hans","lname":"Zhangwan Qu","zipex":"442001"}
+data/CN/湖北省/十堰市/房县={"id":"data/CN/湖北省/十堰市/房县","key":"房县","lang":"zh-hans","lname":"Fang Xian","zipex":"442100"}
+data/CN/湖北省/十堰市/竹山县={"id":"data/CN/湖北省/十堰市/竹山县","key":"竹山县","lang":"zh-hans","lname":"Zhushan Xian","zipex":"442200"}
+data/CN/湖北省/十堰市/竹溪县={"id":"data/CN/湖北省/十堰市/竹溪县","key":"竹溪县","lang":"zh-hans","lname":"Zhuxi Xian","zipex":"442300"}
+data/CN/湖北省/十堰市/茅箭区={"id":"data/CN/湖北省/十堰市/茅箭区","key":"茅箭区","lang":"zh-hans","lname":"Maojian Qu","zipex":"442012"}
+data/CN/湖北省/十堰市/郧县={"id":"data/CN/湖北省/十堰市/郧县","key":"郧县","lang":"zh-hans","lname":"Yun Xian","zipex":"442500"}
+data/CN/湖北省/十堰市/郧西县={"id":"data/CN/湖北省/十堰市/郧西县","key":"郧西县","lang":"zh-hans","lname":"Yunxi Xian","zipex":"442600"}
+data/CN/湖北省/咸宁市={"id":"data/CN/湖北省/咸宁市","key":"咸宁市","lang":"zh-hans","lname":"Xianning Shi","zipex":"437000","sub_keys":"赤壁市~崇阳县~嘉鱼县~通城县~通山县~咸安区","sub_lnames":"Chibi Shi~Chongyang Xian~Jiayu Xian~Tongcheng Xian~Tongshan Xian~Xian'an Qu","sub_zipexs":"437300~437500~437200~437400~437600~437000"}
+data/CN/湖北省/咸宁市/咸安区={"id":"data/CN/湖北省/咸宁市/咸安区","key":"咸安区","lang":"zh-hans","lname":"Xian'an Qu","zipex":"437000"}
+data/CN/湖北省/咸宁市/嘉鱼县={"id":"data/CN/湖北省/咸宁市/嘉鱼县","key":"嘉鱼县","lang":"zh-hans","lname":"Jiayu Xian","zipex":"437200"}
+data/CN/湖北省/咸宁市/崇阳县={"id":"data/CN/湖北省/咸宁市/崇阳县","key":"崇阳县","lang":"zh-hans","lname":"Chongyang Xian","zipex":"437500"}
+data/CN/湖北省/咸宁市/赤壁市={"id":"data/CN/湖北省/咸宁市/赤壁市","key":"赤壁市","lang":"zh-hans","lname":"Chibi Shi","zipex":"437300"}
+data/CN/湖北省/咸宁市/通城县={"id":"data/CN/湖北省/咸宁市/通城县","key":"通城县","lang":"zh-hans","lname":"Tongcheng Xian","zipex":"437400"}
+data/CN/湖北省/咸宁市/通山县={"id":"data/CN/湖北省/咸宁市/通山县","key":"通山县","lang":"zh-hans","lname":"Tongshan Xian","zipex":"437600"}
+data/CN/湖北省/天门市={"id":"data/CN/湖北省/天门市","key":"天门市","lang":"zh-hans","lname":"Tianmen Shi","zipex":"431700"}
+data/CN/湖北省/孝感市={"id":"data/CN/湖北省/孝感市","key":"孝感市","lang":"zh-hans","lname":"Xiaogan Shi","zipex":"432100","sub_keys":"安陆市~大悟县~汉川市~孝昌县~孝南区~应城市~云梦县","sub_lnames":"Anlu Shi~Dawu Xian~Hanchuan Shi~Xiaochang Xian~Xiaonan Qu~Yingcheng Shi~Yunmeng Xian","sub_zipexs":"432600~432800~432300~432900~432100~432400~432500"}
+data/CN/湖北省/孝感市/云梦县={"id":"data/CN/湖北省/孝感市/云梦县","key":"云梦县","lang":"zh-hans","lname":"Yunmeng Xian","zipex":"432500"}
+data/CN/湖北省/孝感市/大悟县={"id":"data/CN/湖北省/孝感市/大悟县","key":"大悟县","lang":"zh-hans","lname":"Dawu Xian","zipex":"432800"}
+data/CN/湖北省/孝感市/孝南区={"id":"data/CN/湖北省/孝感市/孝南区","key":"孝南区","lang":"zh-hans","lname":"Xiaonan Qu","zipex":"432100"}
+data/CN/湖北省/孝感市/孝昌县={"id":"data/CN/湖北省/孝感市/孝昌县","key":"孝昌县","lang":"zh-hans","lname":"Xiaochang Xian","zipex":"432900"}
+data/CN/湖北省/孝感市/安陆市={"id":"data/CN/湖北省/孝感市/安陆市","key":"安陆市","lang":"zh-hans","lname":"Anlu Shi","zipex":"432600"}
+data/CN/湖北省/孝感市/应城市={"id":"data/CN/湖北省/孝感市/应城市","key":"应城市","lang":"zh-hans","lname":"Yingcheng Shi","zipex":"432400"}
+data/CN/湖北省/孝感市/汉川市={"id":"data/CN/湖北省/孝感市/汉川市","key":"汉川市","lang":"zh-hans","lname":"Hanchuan Shi","zipex":"432300"}
+data/CN/湖北省/宜昌市={"id":"data/CN/湖北省/宜昌市","key":"宜昌市","lang":"zh-hans","lname":"Yichang Shi","zipex":"443000","sub_keys":"长阳土家族自治县~当阳市~点军区~五峰土家族自治县~伍家岗区~西陵区~猇亭区~兴山县~夷陵区~宜都市~远安县~枝江市~秭归县","sub_lnames":"Changyang Xian~Dangyang Shi~Dianjun Qu~Wufeng Xian~Wujiagang Qu~Xiling Qu~Xiaoting Qu~Xingshan Xian~Yiling Qu~Yidu Shi~Yuan'an Xian~Zhijiang Shi~Zigui Xian","sub_zipexs":"443500~444100~443006~443400~443001~443000~443007~443711~443100~443300~444200~443200~443600","sub_lfnames":"Changyang Tujiazu Zizhixian~~~Wufeng Tujiazu Zizhixian~~~~~~~~~"}
+data/CN/湖北省/宜昌市/五峰土家族自治县={"id":"data/CN/湖北省/宜昌市/五峰土家族自治县","key":"五峰土家族自治县","lang":"zh-hans","lname":"Wufeng Xian","zipex":"443400","lfname":"Wufeng Tujiazu Zizhixian"}
+data/CN/湖北省/宜昌市/伍家岗区={"id":"data/CN/湖北省/宜昌市/伍家岗区","key":"伍家岗区","lang":"zh-hans","lname":"Wujiagang Qu","zipex":"443001"}
+data/CN/湖北省/宜昌市/兴山县={"id":"data/CN/湖北省/宜昌市/兴山县","key":"兴山县","lang":"zh-hans","lname":"Xingshan Xian","zipex":"443711"}
+data/CN/湖北省/宜昌市/夷陵区={"id":"data/CN/湖北省/宜昌市/夷陵区","key":"夷陵区","lang":"zh-hans","lname":"Yiling Qu","zipex":"443100"}
+data/CN/湖北省/宜昌市/宜都市={"id":"data/CN/湖北省/宜昌市/宜都市","key":"宜都市","lang":"zh-hans","lname":"Yidu Shi","zipex":"443300"}
+data/CN/湖北省/宜昌市/当阳市={"id":"data/CN/湖北省/宜昌市/当阳市","key":"当阳市","lang":"zh-hans","lname":"Dangyang Shi","zipex":"444100"}
+data/CN/湖北省/宜昌市/枝江市={"id":"data/CN/湖北省/宜昌市/枝江市","key":"枝江市","lang":"zh-hans","lname":"Zhijiang Shi","zipex":"443200"}
+data/CN/湖北省/宜昌市/点军区={"id":"data/CN/湖北省/宜昌市/点军区","key":"点军区","lang":"zh-hans","lname":"Dianjun Qu","zipex":"443006"}
+data/CN/湖北省/宜昌市/猇亭区={"id":"data/CN/湖北省/宜昌市/猇亭区","key":"猇亭区","lang":"zh-hans","lname":"Xiaoting Qu","zipex":"443007"}
+data/CN/湖北省/宜昌市/秭归县={"id":"data/CN/湖北省/宜昌市/秭归县","key":"秭归县","lang":"zh-hans","lname":"Zigui Xian","zipex":"443600"}
+data/CN/湖北省/宜昌市/西陵区={"id":"data/CN/湖北省/宜昌市/西陵区","key":"西陵区","lang":"zh-hans","lname":"Xiling Qu","zipex":"443000"}
+data/CN/湖北省/宜昌市/远安县={"id":"data/CN/湖北省/宜昌市/远安县","key":"远安县","lang":"zh-hans","lname":"Yuan'an Xian","zipex":"444200"}
+data/CN/湖北省/宜昌市/长阳土家族自治县={"id":"data/CN/湖北省/宜昌市/长阳土家族自治县","key":"长阳土家族自治县","lang":"zh-hans","lname":"Changyang Xian","zipex":"443500","lfname":"Changyang Tujiazu Zizhixian"}
+data/CN/湖北省/恩施土家族苗族自治州={"id":"data/CN/湖北省/恩施土家族苗族自治州","key":"恩施土家族苗族自治州","lang":"zh-hans","lname":"Enshi Zhou","zipex":"445000","lfname":"Enshi Tujiazu Miaozu Zizhizhou","sub_keys":"巴东县~恩施市~鹤峰县~建始县~来凤县~利川市~咸丰县~宣恩县","sub_lnames":"Badong Xian~Enshi Shi~Hefeng Xian~Jianshi Xian~Laifeng Xian~Lichuan Shi~Xianfeng Xian~Xuan'en Xian","sub_zipexs":"444300~445000~445800~445300~445700~445400~445600~445500"}
+data/CN/湖北省/恩施土家族苗族自治州/利川市={"id":"data/CN/湖北省/恩施土家族苗族自治州/利川市","key":"利川市","lang":"zh-hans","lname":"Lichuan Shi","zipex":"445400"}
+data/CN/湖北省/恩施土家族苗族自治州/咸丰县={"id":"data/CN/湖北省/恩施土家族苗族自治州/咸丰县","key":"咸丰县","lang":"zh-hans","lname":"Xianfeng Xian","zipex":"445600"}
+data/CN/湖北省/恩施土家族苗族自治州/宣恩县={"id":"data/CN/湖北省/恩施土家族苗族自治州/宣恩县","key":"宣恩县","lang":"zh-hans","lname":"Xuan'en Xian","zipex":"445500"}
+data/CN/湖北省/恩施土家族苗族自治州/巴东县={"id":"data/CN/湖北省/恩施土家族苗族自治州/巴东县","key":"巴东县","lang":"zh-hans","lname":"Badong Xian","zipex":"444300"}
+data/CN/湖北省/恩施土家族苗族自治州/建始县={"id":"data/CN/湖北省/恩施土家族苗族自治州/建始县","key":"建始县","lang":"zh-hans","lname":"Jianshi Xian","zipex":"445300"}
+data/CN/湖北省/恩施土家族苗族自治州/恩施市={"id":"data/CN/湖北省/恩施土家族苗族自治州/恩施市","key":"恩施市","lang":"zh-hans","lname":"Enshi Shi","zipex":"445000"}
+data/CN/湖北省/恩施土家族苗族自治州/来凤县={"id":"data/CN/湖北省/恩施土家族苗族自治州/来凤县","key":"来凤县","lang":"zh-hans","lname":"Laifeng Xian","zipex":"445700"}
+data/CN/湖北省/恩施土家族苗族自治州/鹤峰县={"id":"data/CN/湖北省/恩施土家族苗族自治州/鹤峰县","key":"鹤峰县","lang":"zh-hans","lname":"Hefeng Xian","zipex":"445800"}
+data/CN/湖北省/武汉市={"id":"data/CN/湖北省/武汉市","key":"武汉市","lang":"zh-hans","lname":"Wuhan Shi","zipex":"430014","sub_keys":"蔡甸区~东西湖区~汉南区~汉阳区~洪山区~黄陂区~江岸区~江汉区~江夏区~硚口区~青山区~武昌区~新洲区","sub_lnames":"Caidian Qu~Dongxihu Qu~Hannan Qu~Hanyang Qu~Hongshan Qu~Huangpi Qu~Jiang'an Qu~Jianghan Qu~Jiangxia Qu~Qiaokou Qu~Qingshan Qu~Wuchang Qu~Xinzhou Qu","sub_zipexs":"430100~430040~430090~430050~430070~432200~430014~430021~430200~430033~430080~430061~431400"}
+data/CN/湖北省/武汉市/东西湖区={"id":"data/CN/湖北省/武汉市/东西湖区","key":"东西湖区","lang":"zh-hans","lname":"Dongxihu Qu","zipex":"430040"}
+data/CN/湖北省/武汉市/新洲区={"id":"data/CN/湖北省/武汉市/新洲区","key":"新洲区","lang":"zh-hans","lname":"Xinzhou Qu","zipex":"431400"}
+data/CN/湖北省/武汉市/武昌区={"id":"data/CN/湖北省/武汉市/武昌区","key":"武昌区","lang":"zh-hans","lname":"Wuchang Qu","zipex":"430061"}
+data/CN/湖北省/武汉市/汉南区={"id":"data/CN/湖北省/武汉市/汉南区","key":"汉南区","lang":"zh-hans","lname":"Hannan Qu","zipex":"430090"}
+data/CN/湖北省/武汉市/汉阳区={"id":"data/CN/湖北省/武汉市/汉阳区","key":"汉阳区","lang":"zh-hans","lname":"Hanyang Qu","zipex":"430050"}
+data/CN/湖北省/武汉市/江夏区={"id":"data/CN/湖北省/武汉市/江夏区","key":"江夏区","lang":"zh-hans","lname":"Jiangxia Qu","zipex":"430200"}
+data/CN/湖北省/武汉市/江岸区={"id":"data/CN/湖北省/武汉市/江岸区","key":"江岸区","lang":"zh-hans","lname":"Jiang'an Qu","zipex":"430014"}
+data/CN/湖北省/武汉市/江汉区={"id":"data/CN/湖北省/武汉市/江汉区","key":"江汉区","lang":"zh-hans","lname":"Jianghan Qu","zipex":"430021"}
+data/CN/湖北省/武汉市/洪山区={"id":"data/CN/湖北省/武汉市/洪山区","key":"洪山区","lang":"zh-hans","lname":"Hongshan Qu","zipex":"430070"}
+data/CN/湖北省/武汉市/硚口区={"id":"data/CN/湖北省/武汉市/硚口区","key":"硚口区","lang":"zh-hans","lname":"Qiaokou Qu","zipex":"430033"}
+data/CN/湖北省/武汉市/蔡甸区={"id":"data/CN/湖北省/武汉市/蔡甸区","key":"蔡甸区","lang":"zh-hans","lname":"Caidian Qu","zipex":"430100"}
+data/CN/湖北省/武汉市/青山区={"id":"data/CN/湖北省/武汉市/青山区","key":"青山区","lang":"zh-hans","lname":"Qingshan Qu","zipex":"430080"}
+data/CN/湖北省/武汉市/黄陂区={"id":"data/CN/湖北省/武汉市/黄陂区","key":"黄陂区","lang":"zh-hans","lname":"Huangpi Qu","zipex":"432200"}
+data/CN/湖北省/潜江市={"id":"data/CN/湖北省/潜江市","key":"潜江市","lang":"zh-hans","lname":"Qianjiang Shi","zipex":"433100"}
+data/CN/湖北省/神农架林区={"id":"data/CN/湖北省/神农架林区","key":"神农架林区","lang":"zh-hans","lname":"Shennongjia Linqu","zipex":"442400"}
+data/CN/湖北省/荆州市={"id":"data/CN/湖北省/荆州市","key":"荆州市","lang":"zh-hans","lname":"Jingzhou Shi","zipex":"434000","sub_keys":"公安县~洪湖市~监利县~江陵县~荆州区~沙市区~石首市~松滋市","sub_lnames":"Gong'an Xian~Honghu Shi~Jianli Xian~Jiangling Xian~Jingzhou Qu~Shashi Qu~Shishou Shi~Songzi Shi","sub_zipexs":"434300~433200~433300~434101~434020~434000~434400~434200"}
+data/CN/湖北省/荆州市/公安县={"id":"data/CN/湖北省/荆州市/公安县","key":"公安县","lang":"zh-hans","lname":"Gong'an Xian","zipex":"434300"}
+data/CN/湖北省/荆州市/松滋市={"id":"data/CN/湖北省/荆州市/松滋市","key":"松滋市","lang":"zh-hans","lname":"Songzi Shi","zipex":"434200"}
+data/CN/湖北省/荆州市/江陵县={"id":"data/CN/湖北省/荆州市/江陵县","key":"江陵县","lang":"zh-hans","lname":"Jiangling Xian","zipex":"434101"}
+data/CN/湖北省/荆州市/沙市区={"id":"data/CN/湖北省/荆州市/沙市区","key":"沙市区","lang":"zh-hans","lname":"Shashi Qu","zipex":"434000"}
+data/CN/湖北省/荆州市/洪湖市={"id":"data/CN/湖北省/荆州市/洪湖市","key":"洪湖市","lang":"zh-hans","lname":"Honghu Shi","zipex":"433200"}
+data/CN/湖北省/荆州市/监利县={"id":"data/CN/湖北省/荆州市/监利县","key":"监利县","lang":"zh-hans","lname":"Jianli Xian","zipex":"433300"}
+data/CN/湖北省/荆州市/石首市={"id":"data/CN/湖北省/荆州市/石首市","key":"石首市","lang":"zh-hans","lname":"Shishou Shi","zipex":"434400"}
+data/CN/湖北省/荆州市/荆州区={"id":"data/CN/湖北省/荆州市/荆州区","key":"荆州区","lang":"zh-hans","lname":"Jingzhou Qu","zipex":"434020"}
+data/CN/湖北省/荆门市={"id":"data/CN/湖北省/荆门市","key":"荆门市","lang":"zh-hans","lname":"Jingmen Shi","zipex":"448000","sub_keys":"东宝区~掇刀区~京山县~沙洋县~钟祥市","sub_lnames":"Dongbao Qu~Duodao Qu~Jingshan Xian~Shayang Xian~Zhongxiang Shi","sub_zipexs":"448004~448004~431800~448200~431900"}
+data/CN/湖北省/荆门市/东宝区={"id":"data/CN/湖北省/荆门市/东宝区","key":"东宝区","lang":"zh-hans","lname":"Dongbao Qu","zipex":"448004"}
+data/CN/湖北省/荆门市/京山县={"id":"data/CN/湖北省/荆门市/京山县","key":"京山县","lang":"zh-hans","lname":"Jingshan Xian","zipex":"431800"}
+data/CN/湖北省/荆门市/掇刀区={"id":"data/CN/湖北省/荆门市/掇刀区","key":"掇刀区","lang":"zh-hans","lname":"Duodao Qu","zipex":"448004"}
+data/CN/湖北省/荆门市/沙洋县={"id":"data/CN/湖北省/荆门市/沙洋县","key":"沙洋县","lang":"zh-hans","lname":"Shayang Xian","zipex":"448200"}
+data/CN/湖北省/荆门市/钟祥市={"id":"data/CN/湖北省/荆门市/钟祥市","key":"钟祥市","lang":"zh-hans","lname":"Zhongxiang Shi","zipex":"431900"}
+data/CN/湖北省/襄樊市={"id":"data/CN/湖北省/襄樊市","key":"襄樊市","lang":"zh-hans","lname":"Xiangfan Shi","zipex":"441021","sub_keys":"保康县~樊城区~谷城县~老河口市~南漳县~襄城区~襄阳区~宜城市~枣阳市","sub_lnames":"Baokang Xian~Fancheng Qu~Gucheng Xian~Laohekou Shi~Nanzhang Xian~Xiangcheng Qu~Xiangyang Qu~Yicheng Shi~Zaoyang Shi","sub_zipexs":"441600~441001~441700~441800~441500~441021~441100~441400~441200"}
+data/CN/湖北省/襄樊市/保康县={"id":"data/CN/湖北省/襄樊市/保康县","key":"保康县","lang":"zh-hans","lname":"Baokang Xian","zipex":"441600"}
+data/CN/湖北省/襄樊市/南漳县={"id":"data/CN/湖北省/襄樊市/南漳县","key":"南漳县","lang":"zh-hans","lname":"Nanzhang Xian","zipex":"441500"}
+data/CN/湖北省/襄樊市/宜城市={"id":"data/CN/湖北省/襄樊市/宜城市","key":"宜城市","lang":"zh-hans","lname":"Yicheng Shi","zipex":"441400"}
+data/CN/湖北省/襄樊市/枣阳市={"id":"data/CN/湖北省/襄樊市/枣阳市","key":"枣阳市","lang":"zh-hans","lname":"Zaoyang Shi","zipex":"441200"}
+data/CN/湖北省/襄樊市/樊城区={"id":"data/CN/湖北省/襄樊市/樊城区","key":"樊城区","lang":"zh-hans","lname":"Fancheng Qu","zipex":"441001"}
+data/CN/湖北省/襄樊市/老河口市={"id":"data/CN/湖北省/襄樊市/老河口市","key":"老河口市","lang":"zh-hans","lname":"Laohekou Shi","zipex":"441800"}
+data/CN/湖北省/襄樊市/襄城区={"id":"data/CN/湖北省/襄樊市/襄城区","key":"襄城区","lang":"zh-hans","lname":"Xiangcheng Qu","zipex":"441021"}
+data/CN/湖北省/襄樊市/襄阳区={"id":"data/CN/湖北省/襄樊市/襄阳区","key":"襄阳区","lang":"zh-hans","lname":"Xiangyang Qu","zipex":"441100"}
+data/CN/湖北省/襄樊市/谷城县={"id":"data/CN/湖北省/襄樊市/谷城县","key":"谷城县","lang":"zh-hans","lname":"Gucheng Xian","zipex":"441700"}
+data/CN/湖北省/鄂州市={"id":"data/CN/湖北省/鄂州市","key":"鄂州市","lang":"zh-hans","lname":"Ezhou Shi","zipex":"436000","sub_keys":"鄂城区~华容区~梁子湖区","sub_lnames":"Echeng Qu~Huarong Qu~Liangzihu Qu","sub_zipexs":"436000~436030~436064"}
+data/CN/湖北省/鄂州市/华容区={"id":"data/CN/湖北省/鄂州市/华容区","key":"华容区","lang":"zh-hans","lname":"Huarong Qu","zipex":"436030"}
+data/CN/湖北省/鄂州市/梁子湖区={"id":"data/CN/湖北省/鄂州市/梁子湖区","key":"梁子湖区","lang":"zh-hans","lname":"Liangzihu Qu","zipex":"436064"}
+data/CN/湖北省/鄂州市/鄂城区={"id":"data/CN/湖北省/鄂州市/鄂城区","key":"鄂城区","lang":"zh-hans","lname":"Echeng Qu","zipex":"436000"}
+data/CN/湖北省/随州市={"id":"data/CN/湖北省/随州市","key":"随州市","lang":"zh-hans","lname":"Suizhou Shi","zipex":"441300","sub_keys":"广水市~曾都区","sub_lnames":"Guangshui Shi~Zengdu Qu","sub_zipexs":"432700~441300"}
+data/CN/湖北省/随州市/广水市={"id":"data/CN/湖北省/随州市/广水市","key":"广水市","lang":"zh-hans","lname":"Guangshui Shi","zipex":"432700"}
+data/CN/湖北省/随州市/曾都区={"id":"data/CN/湖北省/随州市/曾都区","key":"曾都区","lang":"zh-hans","lname":"Zengdu Qu","zipex":"441300"}
+data/CN/湖北省/黄冈市={"id":"data/CN/湖北省/黄冈市","key":"黄冈市","lang":"zh-hans","lname":"Huanggang Shi","zipex":"438000","sub_keys":"红安县~黄梅县~黄州区~罗田县~麻城市~蕲春县~团风县~武穴市~浠水县~英山县","sub_lnames":"Hong'an Xian~Huangmei Xian~Huangzhou Qu~Luotian Xian~Macheng Shi~Qichun Xian~Tuanfeng Xian~Wuxue Shi~Xishui Xian~Yingshan Xian","sub_zipexs":"438401~435500~438000~438600~438300~435300~438000~435400~438200~438700"}
+data/CN/湖北省/黄冈市/团风县={"id":"data/CN/湖北省/黄冈市/团风县","key":"团风县","lang":"zh-hans","lname":"Tuanfeng Xian","zipex":"438000"}
+data/CN/湖北省/黄冈市/武穴市={"id":"data/CN/湖北省/黄冈市/武穴市","key":"武穴市","lang":"zh-hans","lname":"Wuxue Shi","zipex":"435400"}
+data/CN/湖北省/黄冈市/浠水县={"id":"data/CN/湖北省/黄冈市/浠水县","key":"浠水县","lang":"zh-hans","lname":"Xishui Xian","zipex":"438200"}
+data/CN/湖北省/黄冈市/红安县={"id":"data/CN/湖北省/黄冈市/红安县","key":"红安县","lang":"zh-hans","lname":"Hong'an Xian","zipex":"438401"}
+data/CN/湖北省/黄冈市/罗田县={"id":"data/CN/湖北省/黄冈市/罗田县","key":"罗田县","lang":"zh-hans","lname":"Luotian Xian","zipex":"438600"}
+data/CN/湖北省/黄冈市/英山县={"id":"data/CN/湖北省/黄冈市/英山县","key":"英山县","lang":"zh-hans","lname":"Yingshan Xian","zipex":"438700"}
+data/CN/湖北省/黄冈市/蕲春县={"id":"data/CN/湖北省/黄冈市/蕲春县","key":"蕲春县","lang":"zh-hans","lname":"Qichun Xian","zipex":"435300"}
+data/CN/湖北省/黄冈市/麻城市={"id":"data/CN/湖北省/黄冈市/麻城市","key":"麻城市","lang":"zh-hans","lname":"Macheng Shi","zipex":"438300"}
+data/CN/湖北省/黄冈市/黄州区={"id":"data/CN/湖北省/黄冈市/黄州区","key":"黄州区","lang":"zh-hans","lname":"Huangzhou Qu","zipex":"438000"}
+data/CN/湖北省/黄冈市/黄梅县={"id":"data/CN/湖北省/黄冈市/黄梅县","key":"黄梅县","lang":"zh-hans","lname":"Huangmei Xian","zipex":"435500"}
+data/CN/湖北省/黄石市={"id":"data/CN/湖北省/黄石市","key":"黄石市","lang":"zh-hans","lname":"Huangshi Shi","zipex":"435003","sub_keys":"大冶市~黄石港区~铁山区~西塞山区~下陆区~阳新县","sub_lnames":"Daye Shi~Huangshigang Qu~Tieshan Qu~Xisaishan Qu~Xialu Qu~Yangxin Xian","sub_zipexs":"435100~435000~435006~435001~435005~435200"}
+data/CN/湖北省/黄石市/下陆区={"id":"data/CN/湖北省/黄石市/下陆区","key":"下陆区","lang":"zh-hans","lname":"Xialu Qu","zipex":"435005"}
+data/CN/湖北省/黄石市/大冶市={"id":"data/CN/湖北省/黄石市/大冶市","key":"大冶市","lang":"zh-hans","lname":"Daye Shi","zipex":"435100"}
+data/CN/湖北省/黄石市/西塞山区={"id":"data/CN/湖北省/黄石市/西塞山区","key":"西塞山区","lang":"zh-hans","lname":"Xisaishan Qu","zipex":"435001"}
+data/CN/湖北省/黄石市/铁山区={"id":"data/CN/湖北省/黄石市/铁山区","key":"铁山区","lang":"zh-hans","lname":"Tieshan Qu","zipex":"435006"}
+data/CN/湖北省/黄石市/阳新县={"id":"data/CN/湖北省/黄石市/阳新县","key":"阳新县","lang":"zh-hans","lname":"Yangxin Xian","zipex":"435200"}
+data/CN/湖北省/黄石市/黄石港区={"id":"data/CN/湖北省/黄石市/黄石港区","key":"黄石港区","lang":"zh-hans","lname":"Huangshigang Qu","zipex":"435000"}
+data/CN/湖南省={"id":"data/CN/湖南省","key":"湖南省","lang":"zh-hans","lname":"Hunan Sheng","isoid":"43","sub_keys":"长沙市~常德市~郴州市~衡阳市~怀化市~娄底市~邵阳市~湘潭市~湘西土家族苗族自治州~益阳市~永州市~岳阳市~张家界市~株洲市","sub_lnames":"Changsha Shi~Changde Shi~Chenzhou Shi~Hengyang Shi~Huaihua Shi~Loudi Shi~Shaoyang Shi~Xiangtan Shi~Xiangxi Zhou~Yiyang Shi~Yongzhou Shi~Yueyang Shi~Zhangjiajie Shi~Zhuzhou Shi","sub_zipexs":"410005~415000~423000~421001~418000~417000~422000~411100~416000~413000~425000~414000~427000~412000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true","sub_lfnames":"~~~~~~~~Xiangxi Tujiazu Miaozu Zizhizhou~~~~~"}
+data/CN/湖南省/娄底市={"id":"data/CN/湖南省/娄底市","key":"娄底市","lang":"zh-hans","lname":"Loudi Shi","zipex":"417000","sub_keys":"冷水江市~涟源市~娄星区~双峰县~新化县","sub_lnames":"Lengshuijiang Shi~Lianyuan Shi~Louxing Qu~Shuangfeng Xian~Xinhua Xian","sub_zipexs":"417500~417100~417000~417700~417600"}
+data/CN/湖南省/娄底市/冷水江市={"id":"data/CN/湖南省/娄底市/冷水江市","key":"冷水江市","lang":"zh-hans","lname":"Lengshuijiang Shi","zipex":"417500"}
+data/CN/湖南省/娄底市/双峰县={"id":"data/CN/湖南省/娄底市/双峰县","key":"双峰县","lang":"zh-hans","lname":"Shuangfeng Xian","zipex":"417700"}
+data/CN/湖南省/娄底市/娄星区={"id":"data/CN/湖南省/娄底市/娄星区","key":"娄星区","lang":"zh-hans","lname":"Louxing Qu","zipex":"417000"}
+data/CN/湖南省/娄底市/新化县={"id":"data/CN/湖南省/娄底市/新化县","key":"新化县","lang":"zh-hans","lname":"Xinhua Xian","zipex":"417600"}
+data/CN/湖南省/娄底市/涟源市={"id":"data/CN/湖南省/娄底市/涟源市","key":"涟源市","lang":"zh-hans","lname":"Lianyuan Shi","zipex":"417100"}
+data/CN/湖南省/岳阳市={"id":"data/CN/湖南省/岳阳市","key":"岳阳市","lang":"zh-hans","lname":"Yueyang Shi","zipex":"414000","sub_keys":"华容县~君山区~临湘市~汨罗市~平江县~湘阴县~岳阳楼区~岳阳县~云溪区","sub_lnames":"Huarong Xian~Junshan Qu~Linxiang Shi~Miluo Shi~Pingjiang Xian~Xiangyin Xian~Yueyanglou Qu~Yueyang Xian~Yunxi Qu","sub_zipexs":"414200~414005~414300~414400~410400~410500~414000~414100~414003"}
+data/CN/湖南省/岳阳市/临湘市={"id":"data/CN/湖南省/岳阳市/临湘市","key":"临湘市","lang":"zh-hans","lname":"Linxiang Shi","zipex":"414300"}
+data/CN/湖南省/岳阳市/云溪区={"id":"data/CN/湖南省/岳阳市/云溪区","key":"云溪区","lang":"zh-hans","lname":"Yunxi Qu","zipex":"414003"}
+data/CN/湖南省/岳阳市/华容县={"id":"data/CN/湖南省/岳阳市/华容县","key":"华容县","lang":"zh-hans","lname":"Huarong Xian","zipex":"414200"}
+data/CN/湖南省/岳阳市/君山区={"id":"data/CN/湖南省/岳阳市/君山区","key":"君山区","lang":"zh-hans","lname":"Junshan Qu","zipex":"414005"}
+data/CN/湖南省/岳阳市/岳阳县={"id":"data/CN/湖南省/岳阳市/岳阳县","key":"岳阳县","lang":"zh-hans","lname":"Yueyang Xian","zipex":"414100"}
+data/CN/湖南省/岳阳市/岳阳楼区={"id":"data/CN/湖南省/岳阳市/岳阳楼区","key":"岳阳楼区","lang":"zh-hans","lname":"Yueyanglou Qu","zipex":"414000"}
+data/CN/湖南省/岳阳市/平江县={"id":"data/CN/湖南省/岳阳市/平江县","key":"平江县","lang":"zh-hans","lname":"Pingjiang Xian","zipex":"410400"}
+data/CN/湖南省/岳阳市/汨罗市={"id":"data/CN/湖南省/岳阳市/汨罗市","key":"汨罗市","lang":"zh-hans","lname":"Miluo Shi","zipex":"414400"}
+data/CN/湖南省/岳阳市/湘阴县={"id":"data/CN/湖南省/岳阳市/湘阴县","key":"湘阴县","lang":"zh-hans","lname":"Xiangyin Xian","zipex":"410500"}
+data/CN/湖南省/常德市={"id":"data/CN/湖南省/常德市","key":"常德市","lang":"zh-hans","lname":"Changde Shi","zipex":"415000","sub_keys":"安乡县~鼎城区~汉寿县~津市市~澧县~临澧县~石门县~桃源县~武陵区","sub_lnames":"Anxiang Xian~Dingcheng Qu~Hanshou Xian~Jinshi Shi~Li Xian~Linli Xian~Shimen Xian~Taoyuan Xian~Wuling Qu","sub_zipexs":"415600~415100~415900~415400~415500~415200~415300~415700~415000"}
+data/CN/湖南省/常德市/临澧县={"id":"data/CN/湖南省/常德市/临澧县","key":"临澧县","lang":"zh-hans","lname":"Linli Xian","zipex":"415200"}
+data/CN/湖南省/常德市/安乡县={"id":"data/CN/湖南省/常德市/安乡县","key":"安乡县","lang":"zh-hans","lname":"Anxiang Xian","zipex":"415600"}
+data/CN/湖南省/常德市/桃源县={"id":"data/CN/湖南省/常德市/桃源县","key":"桃源县","lang":"zh-hans","lname":"Taoyuan Xian","zipex":"415700"}
+data/CN/湖南省/常德市/武陵区={"id":"data/CN/湖南省/常德市/武陵区","key":"武陵区","lang":"zh-hans","lname":"Wuling Qu","zipex":"415000"}
+data/CN/湖南省/常德市/汉寿县={"id":"data/CN/湖南省/常德市/汉寿县","key":"汉寿县","lang":"zh-hans","lname":"Hanshou Xian","zipex":"415900"}
+data/CN/湖南省/常德市/津市市={"id":"data/CN/湖南省/常德市/津市市","key":"津市市","lang":"zh-hans","lname":"Jinshi Shi","zipex":"415400"}
+data/CN/湖南省/常德市/澧县={"id":"data/CN/湖南省/常德市/澧县","key":"澧县","lang":"zh-hans","lname":"Li Xian","zipex":"415500"}
+data/CN/湖南省/常德市/石门县={"id":"data/CN/湖南省/常德市/石门县","key":"石门县","lang":"zh-hans","lname":"Shimen Xian","zipex":"415300"}
+data/CN/湖南省/常德市/鼎城区={"id":"data/CN/湖南省/常德市/鼎城区","key":"鼎城区","lang":"zh-hans","lname":"Dingcheng Qu","zipex":"415100"}
+data/CN/湖南省/张家界市={"id":"data/CN/湖南省/张家界市","key":"张家界市","lang":"zh-hans","lname":"Zhangjiajie Shi","zipex":"427000","sub_keys":"慈利县~桑植县~武陵源区~永定区","sub_lnames":"Cili Xian~Sangzhi Xian~Wulingyuan Qu~Yongding Qu","sub_zipexs":"427200~427100~427400~427000"}
+data/CN/湖南省/张家界市/慈利县={"id":"data/CN/湖南省/张家界市/慈利县","key":"慈利县","lang":"zh-hans","lname":"Cili Xian","zipex":"427200"}
+data/CN/湖南省/张家界市/桑植县={"id":"data/CN/湖南省/张家界市/桑植县","key":"桑植县","lang":"zh-hans","lname":"Sangzhi Xian","zipex":"427100"}
+data/CN/湖南省/张家界市/武陵源区={"id":"data/CN/湖南省/张家界市/武陵源区","key":"武陵源区","lang":"zh-hans","lname":"Wulingyuan Qu","zipex":"427400"}
+data/CN/湖南省/张家界市/永定区={"id":"data/CN/湖南省/张家界市/永定区","key":"永定区","lang":"zh-hans","lname":"Yongding Qu","zipex":"427000"}
+data/CN/湖南省/怀化市={"id":"data/CN/湖南省/怀化市","key":"怀化市","lang":"zh-hans","lname":"Huaihua Shi","zipex":"418000","sub_keys":"辰溪县~鹤城区~洪江市~会同县~靖州苗族侗族自治县~麻阳苗族自治县~通道侗族自治县~新晃侗族自治县~溆浦县~沅陵县~芷江侗族自治县~中方县","sub_lnames":"Chenxi Xian~Hecheng Qu~Hongjiang Shi~Huitong Xian~Jingzhou Xian~Mayang Xian~Tongdao Xian~Xinhuang Xian~Xupu Xian~Yuanling Xian~Zhijiang Xian~Zhongfang Xian","sub_zipexs":"419500~418000~418200~418300~418400~419400~418500~419200~419300~419600~419100~418005","sub_lfnames":"~~~~Jingzhou Miaozu Dongzu Zizhixian~Mayang Miaozu Zizhixian~Tongdao Dongzu Zizhixian~Xinhuang Dongzu Zizhixian~~~Zhijiang Dongzu Zizhixian~"}
+data/CN/湖南省/怀化市/中方县={"id":"data/CN/湖南省/怀化市/中方县","key":"中方县","lang":"zh-hans","lname":"Zhongfang Xian","zipex":"418005"}
+data/CN/湖南省/怀化市/会同县={"id":"data/CN/湖南省/怀化市/会同县","key":"会同县","lang":"zh-hans","lname":"Huitong Xian","zipex":"418300"}
+data/CN/湖南省/怀化市/新晃侗族自治县={"id":"data/CN/湖南省/怀化市/新晃侗族自治县","key":"新晃侗族自治县","lang":"zh-hans","lname":"Xinhuang Xian","zipex":"419200","lfname":"Xinhuang Dongzu Zizhixian"}
+data/CN/湖南省/怀化市/沅陵县={"id":"data/CN/湖南省/怀化市/沅陵县","key":"沅陵县","lang":"zh-hans","lname":"Yuanling Xian","zipex":"419600"}
+data/CN/湖南省/怀化市/洪江市={"id":"data/CN/湖南省/怀化市/洪江市","key":"洪江市","lang":"zh-hans","lname":"Hongjiang Shi","zipex":"418200"}
+data/CN/湖南省/怀化市/溆浦县={"id":"data/CN/湖南省/怀化市/溆浦县","key":"溆浦县","lang":"zh-hans","lname":"Xupu Xian","zipex":"419300"}
+data/CN/湖南省/怀化市/芷江侗族自治县={"id":"data/CN/湖南省/怀化市/芷江侗族自治县","key":"芷江侗族自治县","lang":"zh-hans","lname":"Zhijiang Xian","zipex":"419100","lfname":"Zhijiang Dongzu Zizhixian"}
+data/CN/湖南省/怀化市/辰溪县={"id":"data/CN/湖南省/怀化市/辰溪县","key":"辰溪县","lang":"zh-hans","lname":"Chenxi Xian","zipex":"419500"}
+data/CN/湖南省/怀化市/通道侗族自治县={"id":"data/CN/湖南省/怀化市/通道侗族自治县","key":"通道侗族自治县","lang":"zh-hans","lname":"Tongdao Xian","zipex":"418500","lfname":"Tongdao Dongzu Zizhixian"}
+data/CN/湖南省/怀化市/靖州苗族侗族自治县={"id":"data/CN/湖南省/怀化市/靖州苗族侗族自治县","key":"靖州苗族侗族自治县","lang":"zh-hans","lname":"Jingzhou Xian","zipex":"418400","lfname":"Jingzhou Miaozu Dongzu Zizhixian"}
+data/CN/湖南省/怀化市/鹤城区={"id":"data/CN/湖南省/怀化市/鹤城区","key":"鹤城区","lang":"zh-hans","lname":"Hecheng Qu","zipex":"418000"}
+data/CN/湖南省/怀化市/麻阳苗族自治县={"id":"data/CN/湖南省/怀化市/麻阳苗族自治县","key":"麻阳苗族自治县","lang":"zh-hans","lname":"Mayang Xian","zipex":"419400","lfname":"Mayang Miaozu Zizhixian"}
+data/CN/湖南省/株洲市={"id":"data/CN/湖南省/株洲市","key":"株洲市","lang":"zh-hans","lname":"Zhuzhou Shi","zipex":"412000","sub_keys":"茶陵县~荷塘区~醴陵市~芦淞区~石峰区~天元区~炎陵县~攸县~株洲县","sub_lnames":"Chaling Xian~Hetang Qu~Liling Shi~Lusong Qu~Shifeng Qu~Tianyuan Qu~Yanling Xian~You Xian~Zhuzhou Xian","sub_zipexs":"412400~412000~412200~412000~412005~412000~412500~412300~412100"}
+data/CN/湖南省/株洲市/天元区={"id":"data/CN/湖南省/株洲市/天元区","key":"天元区","lang":"zh-hans","lname":"Tianyuan Qu","zipex":"412000"}
+data/CN/湖南省/株洲市/攸县={"id":"data/CN/湖南省/株洲市/攸县","key":"攸县","lang":"zh-hans","lname":"You Xian","zipex":"412300"}
+data/CN/湖南省/株洲市/株洲县={"id":"data/CN/湖南省/株洲市/株洲县","key":"株洲县","lang":"zh-hans","lname":"Zhuzhou Xian","zipex":"412100"}
+data/CN/湖南省/株洲市/炎陵县={"id":"data/CN/湖南省/株洲市/炎陵县","key":"炎陵县","lang":"zh-hans","lname":"Yanling Xian","zipex":"412500"}
+data/CN/湖南省/株洲市/石峰区={"id":"data/CN/湖南省/株洲市/石峰区","key":"石峰区","lang":"zh-hans","lname":"Shifeng Qu","zipex":"412005"}
+data/CN/湖南省/株洲市/芦淞区={"id":"data/CN/湖南省/株洲市/芦淞区","key":"芦淞区","lang":"zh-hans","lname":"Lusong Qu","zipex":"412000"}
+data/CN/湖南省/株洲市/茶陵县={"id":"data/CN/湖南省/株洲市/茶陵县","key":"茶陵县","lang":"zh-hans","lname":"Chaling Xian","zipex":"412400"}
+data/CN/湖南省/株洲市/荷塘区={"id":"data/CN/湖南省/株洲市/荷塘区","key":"荷塘区","lang":"zh-hans","lname":"Hetang Qu","zipex":"412000"}
+data/CN/湖南省/株洲市/醴陵市={"id":"data/CN/湖南省/株洲市/醴陵市","key":"醴陵市","lang":"zh-hans","lname":"Liling Shi","zipex":"412200"}
+data/CN/湖南省/永州市={"id":"data/CN/湖南省/永州市","key":"永州市","lang":"zh-hans","lname":"Yongzhou Shi","zipex":"425000","sub_keys":"道县~东安县~江华瑶族自治县~江永县~蓝山县~冷水滩区~零陵区~宁远县~祁阳县~双牌县~新田县","sub_lnames":"Dao Xian~Dong'an Xian~Jianghua Xian~Jiangyong Xian~Lanshan Xian~Lengshuitan Qu~Lingling Qu~Ningyuan Xian~Qiyang Xian~Shuangpai Xian~Xintian Xian","sub_zipexs":"425300~425900~425500~425400~425800~425000~425007~425600~421700~425200~425700","sub_lfnames":"~~Jianghua Yaozu Zizhixian~~~~~~~~"}
+data/CN/湖南省/永州市/东安县={"id":"data/CN/湖南省/永州市/东安县","key":"东安县","lang":"zh-hans","lname":"Dong'an Xian","zipex":"425900"}
+data/CN/湖南省/永州市/冷水滩区={"id":"data/CN/湖南省/永州市/冷水滩区","key":"冷水滩区","lang":"zh-hans","lname":"Lengshuitan Qu","zipex":"425000"}
+data/CN/湖南省/永州市/双牌县={"id":"data/CN/湖南省/永州市/双牌县","key":"双牌县","lang":"zh-hans","lname":"Shuangpai Xian","zipex":"425200"}
+data/CN/湖南省/永州市/宁远县={"id":"data/CN/湖南省/永州市/宁远县","key":"宁远县","lang":"zh-hans","lname":"Ningyuan Xian","zipex":"425600"}
+data/CN/湖南省/永州市/新田县={"id":"data/CN/湖南省/永州市/新田县","key":"新田县","lang":"zh-hans","lname":"Xintian Xian","zipex":"425700"}
+data/CN/湖南省/永州市/江华瑶族自治县={"id":"data/CN/湖南省/永州市/江华瑶族自治县","key":"江华瑶族自治县","lang":"zh-hans","lname":"Jianghua Xian","zipex":"425500","lfname":"Jianghua Yaozu Zizhixian"}
+data/CN/湖南省/永州市/江永县={"id":"data/CN/湖南省/永州市/江永县","key":"江永县","lang":"zh-hans","lname":"Jiangyong Xian","zipex":"425400"}
+data/CN/湖南省/永州市/祁阳县={"id":"data/CN/湖南省/永州市/祁阳县","key":"祁阳县","lang":"zh-hans","lname":"Qiyang Xian","zipex":"421700"}
+data/CN/湖南省/永州市/蓝山县={"id":"data/CN/湖南省/永州市/蓝山县","key":"蓝山县","lang":"zh-hans","lname":"Lanshan Xian","zipex":"425800"}
+data/CN/湖南省/永州市/道县={"id":"data/CN/湖南省/永州市/道县","key":"道县","lang":"zh-hans","lname":"Dao Xian","zipex":"425300"}
+data/CN/湖南省/永州市/零陵区={"id":"data/CN/湖南省/永州市/零陵区","key":"零陵区","lang":"zh-hans","lname":"Lingling Qu","zipex":"425007"}
+data/CN/湖南省/湘潭市={"id":"data/CN/湖南省/湘潭市","key":"湘潭市","lang":"zh-hans","lname":"Xiangtan Shi","zipex":"411100","sub_keys":"韶山市~湘潭县~湘乡市~雨湖区~岳塘区","sub_lnames":"Shaoshan Shi~Xiangtan Xian~Xiangxiang Shi~Yuhu Qu~Yuetang Qu","sub_zipexs":"411300~411200~411400~411100~411101"}
+data/CN/湖南省/湘潭市/岳塘区={"id":"data/CN/湖南省/湘潭市/岳塘区","key":"岳塘区","lang":"zh-hans","lname":"Yuetang Qu","zipex":"411101"}
+data/CN/湖南省/湘潭市/湘乡市={"id":"data/CN/湖南省/湘潭市/湘乡市","key":"湘乡市","lang":"zh-hans","lname":"Xiangxiang Shi","zipex":"411400"}
+data/CN/湖南省/湘潭市/湘潭县={"id":"data/CN/湖南省/湘潭市/湘潭县","key":"湘潭县","lang":"zh-hans","lname":"Xiangtan Xian","zipex":"411200"}
+data/CN/湖南省/湘潭市/雨湖区={"id":"data/CN/湖南省/湘潭市/雨湖区","key":"雨湖区","lang":"zh-hans","lname":"Yuhu Qu","zipex":"411100"}
+data/CN/湖南省/湘潭市/韶山市={"id":"data/CN/湖南省/湘潭市/韶山市","key":"韶山市","lang":"zh-hans","lname":"Shaoshan Shi","zipex":"411300"}
+data/CN/湖南省/湘西土家族苗族自治州={"id":"data/CN/湖南省/湘西土家族苗族自治州","key":"湘西土家族苗族自治州","lang":"zh-hans","lname":"Xiangxi Zhou","zipex":"416000","lfname":"Xiangxi Tujiazu Miaozu Zizhizhou","sub_keys":"保靖县~凤凰县~古丈县~花垣县~吉首市~龙山县~泸溪县~永顺县","sub_lnames":"Baojing Xian~Fenghuang Xian~Guzhang Xian~Huayuan Xian~Jishou Shi~Longshan Xian~Luxi Xian~Yongshun Xian","sub_zipexs":"416500~416200~416300~416400~416000~416800~416100~416700"}
+data/CN/湖南省/湘西土家族苗族自治州/保靖县={"id":"data/CN/湖南省/湘西土家族苗族自治州/保靖县","key":"保靖县","lang":"zh-hans","lname":"Baojing Xian","zipex":"416500"}
+data/CN/湖南省/湘西土家族苗族自治州/凤凰县={"id":"data/CN/湖南省/湘西土家族苗族自治州/凤凰县","key":"凤凰县","lang":"zh-hans","lname":"Fenghuang Xian","zipex":"416200"}
+data/CN/湖南省/湘西土家族苗族自治州/古丈县={"id":"data/CN/湖南省/湘西土家族苗族自治州/古丈县","key":"古丈县","lang":"zh-hans","lname":"Guzhang Xian","zipex":"416300"}
+data/CN/湖南省/湘西土家族苗族自治州/吉首市={"id":"data/CN/湖南省/湘西土家族苗族自治州/吉首市","key":"吉首市","lang":"zh-hans","lname":"Jishou Shi","zipex":"416000"}
+data/CN/湖南省/湘西土家族苗族自治州/永顺县={"id":"data/CN/湖南省/湘西土家族苗族自治州/永顺县","key":"永顺县","lang":"zh-hans","lname":"Yongshun Xian","zipex":"416700"}
+data/CN/湖南省/湘西土家族苗族自治州/泸溪县={"id":"data/CN/湖南省/湘西土家族苗族自治州/泸溪县","key":"泸溪县","lang":"zh-hans","lname":"Luxi Xian","zipex":"416100"}
+data/CN/湖南省/湘西土家族苗族自治州/花垣县={"id":"data/CN/湖南省/湘西土家族苗族自治州/花垣县","key":"花垣县","lang":"zh-hans","lname":"Huayuan Xian","zipex":"416400"}
+data/CN/湖南省/湘西土家族苗族自治州/龙山县={"id":"data/CN/湖南省/湘西土家族苗族自治州/龙山县","key":"龙山县","lang":"zh-hans","lname":"Longshan Xian","zipex":"416800"}
+data/CN/湖南省/益阳市={"id":"data/CN/湖南省/益阳市","key":"益阳市","lang":"zh-hans","lname":"Yiyang Shi","zipex":"413000","sub_keys":"安化县~赫山区~南县~桃江县~沅江市~资阳区","sub_lnames":"Anhua Xian~Heshan Qu~Nan Xian~Taojiang Xian~Yuanjiang Shi~Ziyang Qu","sub_zipexs":"413500~413002~413200~413400~413100~413000"}
+data/CN/湖南省/益阳市/南县={"id":"data/CN/湖南省/益阳市/南县","key":"南县","lang":"zh-hans","lname":"Nan Xian","zipex":"413200"}
+data/CN/湖南省/益阳市/安化县={"id":"data/CN/湖南省/益阳市/安化县","key":"安化县","lang":"zh-hans","lname":"Anhua Xian","zipex":"413500"}
+data/CN/湖南省/益阳市/桃江县={"id":"data/CN/湖南省/益阳市/桃江县","key":"桃江县","lang":"zh-hans","lname":"Taojiang Xian","zipex":"413400"}
+data/CN/湖南省/益阳市/沅江市={"id":"data/CN/湖南省/益阳市/沅江市","key":"沅江市","lang":"zh-hans","lname":"Yuanjiang Shi","zipex":"413100"}
+data/CN/湖南省/益阳市/资阳区={"id":"data/CN/湖南省/益阳市/资阳区","key":"资阳区","lang":"zh-hans","lname":"Ziyang Qu","zipex":"413000"}
+data/CN/湖南省/益阳市/赫山区={"id":"data/CN/湖南省/益阳市/赫山区","key":"赫山区","lang":"zh-hans","lname":"Heshan Qu","zipex":"413002"}
+data/CN/湖南省/衡阳市={"id":"data/CN/湖南省/衡阳市","key":"衡阳市","lang":"zh-hans","lname":"Hengyang Shi","zipex":"421001","sub_keys":"常宁市~衡东县~衡南县~衡山县~衡阳县~耒阳市~南岳区~祁东县~石鼓区~雁峰区~蒸湘区~珠晖区","sub_lnames":"Changning Shi~Hengdong Xian~Hengnan Xian~Hengshan Xian~Hengyang Xian~Leiyang Shi~Nanyue Qu~Qidong Xian~Shigu Qu~Yanfeng Qu~Zhengxiang Qu~Zhuhui Qu","sub_zipexs":"421500~421400~421001~421300~421200~421800~421000~421600~421001~421001~421001~421002"}
+data/CN/湖南省/衡阳市/南岳区={"id":"data/CN/湖南省/衡阳市/南岳区","key":"南岳区","lang":"zh-hans","lname":"Nanyue Qu","zipex":"421000"}
+data/CN/湖南省/衡阳市/常宁市={"id":"data/CN/湖南省/衡阳市/常宁市","key":"常宁市","lang":"zh-hans","lname":"Changning Shi","zipex":"421500"}
+data/CN/湖南省/衡阳市/珠晖区={"id":"data/CN/湖南省/衡阳市/珠晖区","key":"珠晖区","lang":"zh-hans","lname":"Zhuhui Qu","zipex":"421002"}
+data/CN/湖南省/衡阳市/石鼓区={"id":"data/CN/湖南省/衡阳市/石鼓区","key":"石鼓区","lang":"zh-hans","lname":"Shigu Qu","zipex":"421001"}
+data/CN/湖南省/衡阳市/祁东县={"id":"data/CN/湖南省/衡阳市/祁东县","key":"祁东县","lang":"zh-hans","lname":"Qidong Xian","zipex":"421600"}
+data/CN/湖南省/衡阳市/耒阳市={"id":"data/CN/湖南省/衡阳市/耒阳市","key":"耒阳市","lang":"zh-hans","lname":"Leiyang Shi","zipex":"421800"}
+data/CN/湖南省/衡阳市/蒸湘区={"id":"data/CN/湖南省/衡阳市/蒸湘区","key":"蒸湘区","lang":"zh-hans","lname":"Zhengxiang Qu","zipex":"421001"}
+data/CN/湖南省/衡阳市/衡东县={"id":"data/CN/湖南省/衡阳市/衡东县","key":"衡东县","lang":"zh-hans","lname":"Hengdong Xian","zipex":"421400"}
+data/CN/湖南省/衡阳市/衡南县={"id":"data/CN/湖南省/衡阳市/衡南县","key":"衡南县","lang":"zh-hans","lname":"Hengnan Xian","zipex":"421001"}
+data/CN/湖南省/衡阳市/衡山县={"id":"data/CN/湖南省/衡阳市/衡山县","key":"衡山县","lang":"zh-hans","lname":"Hengshan Xian","zipex":"421300"}
+data/CN/湖南省/衡阳市/衡阳县={"id":"data/CN/湖南省/衡阳市/衡阳县","key":"衡阳县","lang":"zh-hans","lname":"Hengyang Xian","zipex":"421200"}
+data/CN/湖南省/衡阳市/雁峰区={"id":"data/CN/湖南省/衡阳市/雁峰区","key":"雁峰区","lang":"zh-hans","lname":"Yanfeng Qu","zipex":"421001"}
+data/CN/湖南省/邵阳市={"id":"data/CN/湖南省/邵阳市","key":"邵阳市","lang":"zh-hans","lname":"Shaoyang Shi","zipex":"422000","sub_keys":"北塔区~城步苗族自治县~大祥区~洞口县~隆回县~邵东县~邵阳县~双清区~绥宁县~武冈市~新宁县~新邵县","sub_lnames":"Beita Qu~Chengbu Xian~Daxiang Qu~Dongkou Xian~Longhui Xian~Shaodong Xian~Shaoyang Xian~Shuangqing Qu~Suining Xian~Wugang Shi~Xinning Xian~Xinshao Xian","sub_zipexs":"422001~422500~422000~422300~422200~422800~422100~422001~422600~422400~422700~422900","sub_lfnames":"~Chengbu Miaozu Zizhixian~~~~~~~~~~"}
+data/CN/湖南省/邵阳市/北塔区={"id":"data/CN/湖南省/邵阳市/北塔区","key":"北塔区","lang":"zh-hans","lname":"Beita Qu","zipex":"422001"}
+data/CN/湖南省/邵阳市/双清区={"id":"data/CN/湖南省/邵阳市/双清区","key":"双清区","lang":"zh-hans","lname":"Shuangqing Qu","zipex":"422001"}
+data/CN/湖南省/邵阳市/城步苗族自治县={"id":"data/CN/湖南省/邵阳市/城步苗族自治县","key":"城步苗族自治县","lang":"zh-hans","lname":"Chengbu Xian","zipex":"422500","lfname":"Chengbu Miaozu Zizhixian"}
+data/CN/湖南省/邵阳市/大祥区={"id":"data/CN/湖南省/邵阳市/大祥区","key":"大祥区","lang":"zh-hans","lname":"Daxiang Qu","zipex":"422000"}
+data/CN/湖南省/邵阳市/新宁县={"id":"data/CN/湖南省/邵阳市/新宁县","key":"新宁县","lang":"zh-hans","lname":"Xinning Xian","zipex":"422700"}
+data/CN/湖南省/邵阳市/新邵县={"id":"data/CN/湖南省/邵阳市/新邵县","key":"新邵县","lang":"zh-hans","lname":"Xinshao Xian","zipex":"422900"}
+data/CN/湖南省/邵阳市/武冈市={"id":"data/CN/湖南省/邵阳市/武冈市","key":"武冈市","lang":"zh-hans","lname":"Wugang Shi","zipex":"422400"}
+data/CN/湖南省/邵阳市/洞口县={"id":"data/CN/湖南省/邵阳市/洞口县","key":"洞口县","lang":"zh-hans","lname":"Dongkou Xian","zipex":"422300"}
+data/CN/湖南省/邵阳市/绥宁县={"id":"data/CN/湖南省/邵阳市/绥宁县","key":"绥宁县","lang":"zh-hans","lname":"Suining Xian","zipex":"422600"}
+data/CN/湖南省/邵阳市/邵东县={"id":"data/CN/湖南省/邵阳市/邵东县","key":"邵东县","lang":"zh-hans","lname":"Shaodong Xian","zipex":"422800"}
+data/CN/湖南省/邵阳市/邵阳县={"id":"data/CN/湖南省/邵阳市/邵阳县","key":"邵阳县","lang":"zh-hans","lname":"Shaoyang Xian","zipex":"422100"}
+data/CN/湖南省/邵阳市/隆回县={"id":"data/CN/湖南省/邵阳市/隆回县","key":"隆回县","lang":"zh-hans","lname":"Longhui Xian","zipex":"422200"}
+data/CN/湖南省/郴州市={"id":"data/CN/湖南省/郴州市","key":"郴州市","lang":"zh-hans","lname":"Chenzhou Shi","zipex":"423000","sub_keys":"安仁县~北湖区~桂东县~桂阳县~嘉禾县~临武县~汝城县~苏仙区~宜章县~永兴县~资兴市","sub_lnames":"Anren Xian~Beihu Qu~Guidong Xian~Guiyang Xian~Jiahe Xian~Linwu Xian~Rucheng Xian~Suxian Qu~Yizhang Xian~Yongxing Xian~Zixing Shi","sub_zipexs":"423600~423000~423500~424400~424500~424300~424100~423000~424200~423300~423400"}
+data/CN/湖南省/郴州市/临武县={"id":"data/CN/湖南省/郴州市/临武县","key":"临武县","lang":"zh-hans","lname":"Linwu Xian","zipex":"424300"}
+data/CN/湖南省/郴州市/北湖区={"id":"data/CN/湖南省/郴州市/北湖区","key":"北湖区","lang":"zh-hans","lname":"Beihu Qu","zipex":"423000"}
+data/CN/湖南省/郴州市/嘉禾县={"id":"data/CN/湖南省/郴州市/嘉禾县","key":"嘉禾县","lang":"zh-hans","lname":"Jiahe Xian","zipex":"424500"}
+data/CN/湖南省/郴州市/安仁县={"id":"data/CN/湖南省/郴州市/安仁县","key":"安仁县","lang":"zh-hans","lname":"Anren Xian","zipex":"423600"}
+data/CN/湖南省/郴州市/宜章县={"id":"data/CN/湖南省/郴州市/宜章县","key":"宜章县","lang":"zh-hans","lname":"Yizhang Xian","zipex":"424200"}
+data/CN/湖南省/郴州市/桂东县={"id":"data/CN/湖南省/郴州市/桂东县","key":"桂东县","lang":"zh-hans","lname":"Guidong Xian","zipex":"423500"}
+data/CN/湖南省/郴州市/桂阳县={"id":"data/CN/湖南省/郴州市/桂阳县","key":"桂阳县","lang":"zh-hans","lname":"Guiyang Xian","zipex":"424400"}
+data/CN/湖南省/郴州市/永兴县={"id":"data/CN/湖南省/郴州市/永兴县","key":"永兴县","lang":"zh-hans","lname":"Yongxing Xian","zipex":"423300"}
+data/CN/湖南省/郴州市/汝城县={"id":"data/CN/湖南省/郴州市/汝城县","key":"汝城县","lang":"zh-hans","lname":"Rucheng Xian","zipex":"424100"}
+data/CN/湖南省/郴州市/苏仙区={"id":"data/CN/湖南省/郴州市/苏仙区","key":"苏仙区","lang":"zh-hans","lname":"Suxian Qu","zipex":"423000"}
+data/CN/湖南省/郴州市/资兴市={"id":"data/CN/湖南省/郴州市/资兴市","key":"资兴市","lang":"zh-hans","lname":"Zixing Shi","zipex":"423400"}
+data/CN/湖南省/长沙市={"id":"data/CN/湖南省/长沙市","key":"长沙市","lang":"zh-hans","lname":"Changsha Shi","zipex":"410005","sub_keys":"长沙县~芙蓉区~开福区~浏阳市~宁乡县~天心区~望城县~雨花区~岳麓区","sub_lnames":"Changsha Xian~Furong Qu~Kaifu Qu~Liuyang Shi~Ningxiang Xian~Tianxin Qu~Wangcheng Xian~Yuhua Qu~Yuelu Qu","sub_zipexs":"410100~410011~410005~410300~410600~410002~410200~410007~410006"}
+data/CN/湖南省/长沙市/天心区={"id":"data/CN/湖南省/长沙市/天心区","key":"天心区","lang":"zh-hans","lname":"Tianxin Qu","zipex":"410002"}
+data/CN/湖南省/长沙市/宁乡县={"id":"data/CN/湖南省/长沙市/宁乡县","key":"宁乡县","lang":"zh-hans","lname":"Ningxiang Xian","zipex":"410600"}
+data/CN/湖南省/长沙市/岳麓区={"id":"data/CN/湖南省/长沙市/岳麓区","key":"岳麓区","lang":"zh-hans","lname":"Yuelu Qu","zipex":"410006"}
+data/CN/湖南省/长沙市/开福区={"id":"data/CN/湖南省/长沙市/开福区","key":"开福区","lang":"zh-hans","lname":"Kaifu Qu","zipex":"410005"}
+data/CN/湖南省/长沙市/望城县={"id":"data/CN/湖南省/长沙市/望城县","key":"望城县","lang":"zh-hans","lname":"Wangcheng Xian","zipex":"410200"}
+data/CN/湖南省/长沙市/浏阳市={"id":"data/CN/湖南省/长沙市/浏阳市","key":"浏阳市","lang":"zh-hans","lname":"Liuyang Shi","zipex":"410300"}
+data/CN/湖南省/长沙市/芙蓉区={"id":"data/CN/湖南省/长沙市/芙蓉区","key":"芙蓉区","lang":"zh-hans","lname":"Furong Qu","zipex":"410011"}
+data/CN/湖南省/长沙市/长沙县={"id":"data/CN/湖南省/长沙市/长沙县","key":"长沙县","lang":"zh-hans","lname":"Changsha Xian","zipex":"410100"}
+data/CN/湖南省/长沙市/雨花区={"id":"data/CN/湖南省/长沙市/雨花区","key":"雨花区","lang":"zh-hans","lname":"Yuhua Qu","zipex":"410007"}
+data/CN/澳门={"id":"data/CN/澳门","key":"澳门","lang":"zh-hans","lname":"Macau","isoid":"92","xzip":"999078","xrequire":"A","sub_keys":"澳门","sub_lnames":"Macau"}
+data/CN/澳门/澳门={"id":"data/CN/澳门/澳门","key":"澳门","lang":"zh-hans","lname":"Macau"}
+data/CN/甘肃省={"id":"data/CN/甘肃省","key":"甘肃省","lang":"zh-hans","lname":"Gansu Sheng","isoid":"62","sub_keys":"白银市~定西市~甘南藏族自治州~嘉峪关市~金昌市~酒泉市~兰州市~临夏回族自治州~陇南市~平凉市~庆阳市~天水市~武威市~张掖市","sub_lnames":"Baiyin Shi~Dingxi Shi~Gannan Zhou~Jiayuguan Shi~Jinchang Shi~Jiuquan Shi~Lanzhou Shi~Linxia Zhou~Longnan Shi~Pingliang Shi~Qingyang Shi~Tianshui Shi~Wuwei Shi~Zhangye Shi","sub_zipexs":"730900~743000~747004~735100~737100~735000~730030~731100~742500~744000~745000~741000~733000~734000","sub_mores":"true~true~true~false~true~true~true~true~true~true~true~true~true~true","sub_lfnames":"~~Gannan Zangzu Zizhizhou~~~~~Linxia Huizu Zizhizhou~~~~~~"}
+data/CN/甘肃省/临夏回族自治州={"id":"data/CN/甘肃省/临夏回族自治州","key":"临夏回族自治州","lang":"zh-hans","lname":"Linxia Zhou","zipex":"731100","lfname":"Linxia Huizu Zizhizhou","sub_keys":"东乡族自治县~广河县~和政县~积石山保安族东乡族撒拉族自治县~康乐县~临夏市~临夏县~永靖县","sub_lnames":"Dongxiangzu Xian~Guanghe Xian~Hezheng Xian~Jishishan Xian~Kangle Xian~Linxia Shi~Linxia Xian~Yongjing Xian","sub_zipexs":"731400~731300~731200~731700~731500~731100~731800~731600","sub_lfnames":"Dongxiangzu Zizhixian~~~Jishishan Bonanzu Dongxiangzu Salarzu Zizhixian~~~~"}
+data/CN/甘肃省/临夏回族自治州/东乡族自治县={"id":"data/CN/甘肃省/临夏回族自治州/东乡族自治县","key":"东乡族自治县","lang":"zh-hans","lname":"Dongxiangzu Xian","zipex":"731400","lfname":"Dongxiangzu Zizhixian"}
+data/CN/甘肃省/临夏回族自治州/临夏县={"id":"data/CN/甘肃省/临夏回族自治州/临夏县","key":"临夏县","lang":"zh-hans","lname":"Linxia Xian","zipex":"731800"}
+data/CN/甘肃省/临夏回族自治州/临夏市={"id":"data/CN/甘肃省/临夏回族自治州/临夏市","key":"临夏市","lang":"zh-hans","lname":"Linxia Shi","zipex":"731100"}
+data/CN/甘肃省/临夏回族自治州/和政县={"id":"data/CN/甘肃省/临夏回族自治州/和政县","key":"和政县","lang":"zh-hans","lname":"Hezheng Xian","zipex":"731200"}
+data/CN/甘肃省/临夏回族自治州/广河县={"id":"data/CN/甘肃省/临夏回族自治州/广河县","key":"广河县","lang":"zh-hans","lname":"Guanghe Xian","zipex":"731300"}
+data/CN/甘肃省/临夏回族自治州/康乐县={"id":"data/CN/甘肃省/临夏回族自治州/康乐县","key":"康乐县","lang":"zh-hans","lname":"Kangle Xian","zipex":"731500"}
+data/CN/甘肃省/临夏回族自治州/永靖县={"id":"data/CN/甘肃省/临夏回族自治州/永靖县","key":"永靖县","lang":"zh-hans","lname":"Yongjing Xian","zipex":"731600"}
+data/CN/甘肃省/临夏回族自治州/积石山保安族东乡族撒拉族自治县={"id":"data/CN/甘肃省/临夏回族自治州/积石山保安族东乡族撒拉族自治县","key":"积石山保安族东乡族撒拉族自治县","lang":"zh-hans","lname":"Jishishan Xian","zipex":"731700","lfname":"Jishishan Bonanzu Dongxiangzu Salarzu Zizhixian"}
+data/CN/甘肃省/兰州市={"id":"data/CN/甘肃省/兰州市","key":"兰州市","lang":"zh-hans","lname":"Lanzhou Shi","zipex":"730030","sub_keys":"安宁区~城关区~皋兰县~红古区~七里河区~西固区~永登县~榆中县","sub_lnames":"Anning Qu~Chengguan Qu~Gaolan Xian~Honggu Qu~Qilihe Qu~Xigu Qu~Yongdeng Xian~Yuzhong Xian","sub_zipexs":"730070~730030~730200~730080~730050~730060~730300~730100"}
+data/CN/甘肃省/兰州市/七里河区={"id":"data/CN/甘肃省/兰州市/七里河区","key":"七里河区","lang":"zh-hans","lname":"Qilihe Qu","zipex":"730050"}
+data/CN/甘肃省/兰州市/城关区={"id":"data/CN/甘肃省/兰州市/城关区","key":"城关区","lang":"zh-hans","lname":"Chengguan Qu","zipex":"730030"}
+data/CN/甘肃省/兰州市/安宁区={"id":"data/CN/甘肃省/兰州市/安宁区","key":"安宁区","lang":"zh-hans","lname":"Anning Qu","zipex":"730070"}
+data/CN/甘肃省/兰州市/榆中县={"id":"data/CN/甘肃省/兰州市/榆中县","key":"榆中县","lang":"zh-hans","lname":"Yuzhong Xian","zipex":"730100"}
+data/CN/甘肃省/兰州市/永登县={"id":"data/CN/甘肃省/兰州市/永登县","key":"永登县","lang":"zh-hans","lname":"Yongdeng Xian","zipex":"730300"}
+data/CN/甘肃省/兰州市/皋兰县={"id":"data/CN/甘肃省/兰州市/皋兰县","key":"皋兰县","lang":"zh-hans","lname":"Gaolan Xian","zipex":"730200"}
+data/CN/甘肃省/兰州市/红古区={"id":"data/CN/甘肃省/兰州市/红古区","key":"红古区","lang":"zh-hans","lname":"Honggu Qu","zipex":"730080"}
+data/CN/甘肃省/兰州市/西固区={"id":"data/CN/甘肃省/兰州市/西固区","key":"西固区","lang":"zh-hans","lname":"Xigu Qu","zipex":"730060"}
+data/CN/甘肃省/嘉峪关市={"id":"data/CN/甘肃省/嘉峪关市","key":"嘉峪关市","lang":"zh-hans","lname":"Jiayuguan Shi","zipex":"735100"}
+data/CN/甘肃省/天水市={"id":"data/CN/甘肃省/天水市","key":"天水市","lang":"zh-hans","lname":"Tianshui Shi","zipex":"741000","sub_keys":"甘谷县~麦积区~秦安县~秦州区~清水县~武山县~张家川回族自治县","sub_lnames":"Gangu Xian~Maiji Qu~Qin'an Xian~Qinzhou Qu~Qingshui Xian~Wushan Xian~Zhangjiachuan Xian","sub_zipexs":"741200~741020~741600~741000~741400~741300~741500","sub_lfnames":"~~~~~~Zhangjiachuan Huizu Zizhixian"}
+data/CN/甘肃省/天水市/张家川回族自治县={"id":"data/CN/甘肃省/天水市/张家川回族自治县","key":"张家川回族自治县","lang":"zh-hans","lname":"Zhangjiachuan Xian","zipex":"741500","lfname":"Zhangjiachuan Huizu Zizhixian"}
+data/CN/甘肃省/天水市/武山县={"id":"data/CN/甘肃省/天水市/武山县","key":"武山县","lang":"zh-hans","lname":"Wushan Xian","zipex":"741300"}
+data/CN/甘肃省/天水市/清水县={"id":"data/CN/甘肃省/天水市/清水县","key":"清水县","lang":"zh-hans","lname":"Qingshui Xian","zipex":"741400"}
+data/CN/甘肃省/天水市/甘谷县={"id":"data/CN/甘肃省/天水市/甘谷县","key":"甘谷县","lang":"zh-hans","lname":"Gangu Xian","zipex":"741200"}
+data/CN/甘肃省/天水市/秦安县={"id":"data/CN/甘肃省/天水市/秦安县","key":"秦安县","lang":"zh-hans","lname":"Qin'an Xian","zipex":"741600"}
+data/CN/甘肃省/天水市/秦州区={"id":"data/CN/甘肃省/天水市/秦州区","key":"秦州区","lang":"zh-hans","lname":"Qinzhou Qu","zipex":"741000"}
+data/CN/甘肃省/天水市/麦积区={"id":"data/CN/甘肃省/天水市/麦积区","key":"麦积区","lang":"zh-hans","lname":"Maiji Qu","zipex":"741020"}
+data/CN/甘肃省/定西市={"id":"data/CN/甘肃省/定西市","key":"定西市","lang":"zh-hans","lname":"Dingxi Shi","zipex":"743000","sub_keys":"安定区~临洮县~陇西县~岷县~通渭县~渭源县~漳县","sub_lnames":"Anding Qu~Lintao Xian~Longxi Xian~Min Xian~Tongwei Xian~Weiyuan Xian~Zhang Xian","sub_zipexs":"743000~730500~748100~748400~743300~748200~748300"}
+data/CN/甘肃省/定西市/临洮县={"id":"data/CN/甘肃省/定西市/临洮县","key":"临洮县","lang":"zh-hans","lname":"Lintao Xian","zipex":"730500"}
+data/CN/甘肃省/定西市/安定区={"id":"data/CN/甘肃省/定西市/安定区","key":"安定区","lang":"zh-hans","lname":"Anding Qu","zipex":"743000"}
+data/CN/甘肃省/定西市/岷县={"id":"data/CN/甘肃省/定西市/岷县","key":"岷县","lang":"zh-hans","lname":"Min Xian","zipex":"748400"}
+data/CN/甘肃省/定西市/渭源县={"id":"data/CN/甘肃省/定西市/渭源县","key":"渭源县","lang":"zh-hans","lname":"Weiyuan Xian","zipex":"748200"}
+data/CN/甘肃省/定西市/漳县={"id":"data/CN/甘肃省/定西市/漳县","key":"漳县","lang":"zh-hans","lname":"Zhang Xian","zipex":"748300"}
+data/CN/甘肃省/定西市/通渭县={"id":"data/CN/甘肃省/定西市/通渭县","key":"通渭县","lang":"zh-hans","lname":"Tongwei Xian","zipex":"743300"}
+data/CN/甘肃省/定西市/陇西县={"id":"data/CN/甘肃省/定西市/陇西县","key":"陇西县","lang":"zh-hans","lname":"Longxi Xian","zipex":"748100"}
+data/CN/甘肃省/平凉市={"id":"data/CN/甘肃省/平凉市","key":"平凉市","lang":"zh-hans","lname":"Pingliang Shi","zipex":"744000","sub_keys":"崇信县~华亭县~泾川县~静宁县~崆峒区~灵台县~庄浪县","sub_lnames":"Chongxin Xian~Huating Xian~Jingchuan Xian~Jingning Xian~Kongtong Qu~Lingtai Xian~Zhuangliang Xian","sub_zipexs":"744200~744100~744300~743400~744000~744400~744600"}
+data/CN/甘肃省/平凉市/华亭县={"id":"data/CN/甘肃省/平凉市/华亭县","key":"华亭县","lang":"zh-hans","lname":"Huating Xian","zipex":"744100"}
+data/CN/甘肃省/平凉市/崆峒区={"id":"data/CN/甘肃省/平凉市/崆峒区","key":"崆峒区","lang":"zh-hans","lname":"Kongtong Qu","zipex":"744000"}
+data/CN/甘肃省/平凉市/崇信县={"id":"data/CN/甘肃省/平凉市/崇信县","key":"崇信县","lang":"zh-hans","lname":"Chongxin Xian","zipex":"744200"}
+data/CN/甘肃省/平凉市/庄浪县={"id":"data/CN/甘肃省/平凉市/庄浪县","key":"庄浪县","lang":"zh-hans","lname":"Zhuangliang Xian","zipex":"744600"}
+data/CN/甘肃省/平凉市/泾川县={"id":"data/CN/甘肃省/平凉市/泾川县","key":"泾川县","lang":"zh-hans","lname":"Jingchuan Xian","zipex":"744300"}
+data/CN/甘肃省/平凉市/灵台县={"id":"data/CN/甘肃省/平凉市/灵台县","key":"灵台县","lang":"zh-hans","lname":"Lingtai Xian","zipex":"744400"}
+data/CN/甘肃省/平凉市/静宁县={"id":"data/CN/甘肃省/平凉市/静宁县","key":"静宁县","lang":"zh-hans","lname":"Jingning Xian","zipex":"743400"}
+data/CN/甘肃省/庆阳市={"id":"data/CN/甘肃省/庆阳市","key":"庆阳市","lang":"zh-hans","lname":"Qingyang Shi","zipex":"745000","sub_keys":"合水县~华池县~环县~宁县~庆城县~西峰区~镇原县~正宁县","sub_lnames":"Heshui Xian~Huachi Xian~Huan Xian~Ning Xian~Qingcheng Xian~Xifeng Qu~Zhenyuan Xian~Zhengning Xian","sub_zipexs":"745400~745600~745700~745200~745100~745000~744500~745300"}
+data/CN/甘肃省/庆阳市/华池县={"id":"data/CN/甘肃省/庆阳市/华池县","key":"华池县","lang":"zh-hans","lname":"Huachi Xian","zipex":"745600"}
+data/CN/甘肃省/庆阳市/合水县={"id":"data/CN/甘肃省/庆阳市/合水县","key":"合水县","lang":"zh-hans","lname":"Heshui Xian","zipex":"745400"}
+data/CN/甘肃省/庆阳市/宁县={"id":"data/CN/甘肃省/庆阳市/宁县","key":"宁县","lang":"zh-hans","lname":"Ning Xian","zipex":"745200"}
+data/CN/甘肃省/庆阳市/庆城县={"id":"data/CN/甘肃省/庆阳市/庆城县","key":"庆城县","lang":"zh-hans","lname":"Qingcheng Xian","zipex":"745100"}
+data/CN/甘肃省/庆阳市/正宁县={"id":"data/CN/甘肃省/庆阳市/正宁县","key":"正宁县","lang":"zh-hans","lname":"Zhengning Xian","zipex":"745300"}
+data/CN/甘肃省/庆阳市/环县={"id":"data/CN/甘肃省/庆阳市/环县","key":"环县","lang":"zh-hans","lname":"Huan Xian","zipex":"745700"}
+data/CN/甘肃省/庆阳市/西峰区={"id":"data/CN/甘肃省/庆阳市/西峰区","key":"西峰区","lang":"zh-hans","lname":"Xifeng Qu","zipex":"745000"}
+data/CN/甘肃省/庆阳市/镇原县={"id":"data/CN/甘肃省/庆阳市/镇原县","key":"镇原县","lang":"zh-hans","lname":"Zhenyuan Xian","zipex":"744500"}
+data/CN/甘肃省/张掖市={"id":"data/CN/甘肃省/张掖市","key":"张掖市","lang":"zh-hans","lname":"Zhangye Shi","zipex":"734000","sub_keys":"甘州区~高台县~临泽县~民乐县~山丹县~肃南裕固族自治县","sub_lnames":"Ganzhou Qu~Gaotai Xian~Linze Xian~Minle Xian~Shandan Xian~Sunan Xian","sub_zipexs":"734000~734300~734200~734500~734100~734400","sub_lfnames":"~~~~~Sunan Yugurzu Zizhixian"}
+data/CN/甘肃省/张掖市/临泽县={"id":"data/CN/甘肃省/张掖市/临泽县","key":"临泽县","lang":"zh-hans","lname":"Linze Xian","zipex":"734200"}
+data/CN/甘肃省/张掖市/山丹县={"id":"data/CN/甘肃省/张掖市/山丹县","key":"山丹县","lang":"zh-hans","lname":"Shandan Xian","zipex":"734100"}
+data/CN/甘肃省/张掖市/民乐县={"id":"data/CN/甘肃省/张掖市/民乐县","key":"民乐县","lang":"zh-hans","lname":"Minle Xian","zipex":"734500"}
+data/CN/甘肃省/张掖市/甘州区={"id":"data/CN/甘肃省/张掖市/甘州区","key":"甘州区","lang":"zh-hans","lname":"Ganzhou Qu","zipex":"734000"}
+data/CN/甘肃省/张掖市/肃南裕固族自治县={"id":"data/CN/甘肃省/张掖市/肃南裕固族自治县","key":"肃南裕固族自治县","lang":"zh-hans","lname":"Sunan Xian","zipex":"734400","lfname":"Sunan Yugurzu Zizhixian"}
+data/CN/甘肃省/张掖市/高台县={"id":"data/CN/甘肃省/张掖市/高台县","key":"高台县","lang":"zh-hans","lname":"Gaotai Xian","zipex":"734300"}
+data/CN/甘肃省/武威市={"id":"data/CN/甘肃省/武威市","key":"武威市","lang":"zh-hans","lname":"Wuwei Shi","zipex":"733000","sub_keys":"古浪县~凉州区~民勤县~天祝藏族自治县","sub_lnames":"Gulang Xian~Liangzhou Qu~Minqin Xian~Tianzhu Xian","sub_zipexs":"733100~733000~733300~733200","sub_lfnames":"~~~Tianzhu Zangzu Zizhixian"}
+data/CN/甘肃省/武威市/凉州区={"id":"data/CN/甘肃省/武威市/凉州区","key":"凉州区","lang":"zh-hans","lname":"Liangzhou Qu","zipex":"733000"}
+data/CN/甘肃省/武威市/古浪县={"id":"data/CN/甘肃省/武威市/古浪县","key":"古浪县","lang":"zh-hans","lname":"Gulang Xian","zipex":"733100"}
+data/CN/甘肃省/武威市/天祝藏族自治县={"id":"data/CN/甘肃省/武威市/天祝藏族自治县","key":"天祝藏族自治县","lang":"zh-hans","lname":"Tianzhu Xian","zipex":"733200","lfname":"Tianzhu Zangzu Zizhixian"}
+data/CN/甘肃省/武威市/民勤县={"id":"data/CN/甘肃省/武威市/民勤县","key":"民勤县","lang":"zh-hans","lname":"Minqin Xian","zipex":"733300"}
+data/CN/甘肃省/甘南藏族自治州={"id":"data/CN/甘肃省/甘南藏族自治州","key":"甘南藏族自治州","lang":"zh-hans","lname":"Gannan Zhou","zipex":"747004","lfname":"Gannan Zangzu Zizhizhou","sub_keys":"迭部县~合作市~临潭县~碌曲县~玛曲县~夏河县~舟曲县~卓尼县","sub_lnames":"Têwo Xian~Hezuo Shi~Lintan Xian~Luqu Xian~Maqu Xian~Xiahe Xian~Zhugqu Xian~Jonê Xian","sub_zipexs":"747400~747000~747500~747200~747300~747100~746300~747600"}
+data/CN/甘肃省/甘南藏族自治州/临潭县={"id":"data/CN/甘肃省/甘南藏族自治州/临潭县","key":"临潭县","lang":"zh-hans","lname":"Lintan Xian","zipex":"747500"}
+data/CN/甘肃省/甘南藏族自治州/卓尼县={"id":"data/CN/甘肃省/甘南藏族自治州/卓尼县","key":"卓尼县","lang":"zh-hans","lname":"Jonê Xian","zipex":"747600"}
+data/CN/甘肃省/甘南藏族自治州/合作市={"id":"data/CN/甘肃省/甘南藏族自治州/合作市","key":"合作市","lang":"zh-hans","lname":"Hezuo Shi","zipex":"747000"}
+data/CN/甘肃省/甘南藏族自治州/夏河县={"id":"data/CN/甘肃省/甘南藏族自治州/夏河县","key":"夏河县","lang":"zh-hans","lname":"Xiahe Xian","zipex":"747100"}
+data/CN/甘肃省/甘南藏族自治州/玛曲县={"id":"data/CN/甘肃省/甘南藏族自治州/玛曲县","key":"玛曲县","lang":"zh-hans","lname":"Maqu Xian","zipex":"747300"}
+data/CN/甘肃省/甘南藏族自治州/碌曲县={"id":"data/CN/甘肃省/甘南藏族自治州/碌曲县","key":"碌曲县","lang":"zh-hans","lname":"Luqu Xian","zipex":"747200"}
+data/CN/甘肃省/甘南藏族自治州/舟曲县={"id":"data/CN/甘肃省/甘南藏族自治州/舟曲县","key":"舟曲县","lang":"zh-hans","lname":"Zhugqu Xian","zipex":"746300"}
+data/CN/甘肃省/甘南藏族自治州/迭部县={"id":"data/CN/甘肃省/甘南藏族自治州/迭部县","key":"迭部县","lang":"zh-hans","lname":"Têwo Xian","zipex":"747400"}
+data/CN/甘肃省/白银市={"id":"data/CN/甘肃省/白银市","key":"白银市","lang":"zh-hans","lname":"Baiyin Shi","zipex":"730900","sub_keys":"白银区~会宁县~景泰县~靖远县~平川区","sub_lnames":"Baiyin Qu~Huining Xian~Jingtai Xian~Jingyuan Xian~Pingchuan Qu","sub_zipexs":"730900~730700~730400~730600~730913"}
+data/CN/甘肃省/白银市/会宁县={"id":"data/CN/甘肃省/白银市/会宁县","key":"会宁县","lang":"zh-hans","lname":"Huining Xian","zipex":"730700"}
+data/CN/甘肃省/白银市/平川区={"id":"data/CN/甘肃省/白银市/平川区","key":"平川区","lang":"zh-hans","lname":"Pingchuan Qu","zipex":"730913"}
+data/CN/甘肃省/白银市/景泰县={"id":"data/CN/甘肃省/白银市/景泰县","key":"景泰县","lang":"zh-hans","lname":"Jingtai Xian","zipex":"730400"}
+data/CN/甘肃省/白银市/白银区={"id":"data/CN/甘肃省/白银市/白银区","key":"白银区","lang":"zh-hans","lname":"Baiyin Qu","zipex":"730900"}
+data/CN/甘肃省/白银市/靖远县={"id":"data/CN/甘肃省/白银市/靖远县","key":"靖远县","lang":"zh-hans","lname":"Jingyuan Xian","zipex":"730600"}
+data/CN/甘肃省/酒泉市={"id":"data/CN/甘肃省/酒泉市","key":"酒泉市","lang":"zh-hans","lname":"Jiuquan Shi","zipex":"735000","sub_keys":"阿克塞哈萨克族自治县~敦煌市~瓜州县~金塔县~肃北蒙古族自治县~肃州区~玉门市","sub_lnames":"Aksay Xian~Dunhuang Shi~Guazhou Xian~Jinta Xian~Subei Xian~Suzhou Qu~Yumen Shi","sub_zipexs":"736400~736200~736100~735300~736300~735000~735200","sub_lfnames":"Aksay Kazakzu Zizhixian~~~~Subei Mongolzu Zizhixian~~"}
+data/CN/甘肃省/酒泉市/敦煌市={"id":"data/CN/甘肃省/酒泉市/敦煌市","key":"敦煌市","lang":"zh-hans","lname":"Dunhuang Shi","zipex":"736200"}
+data/CN/甘肃省/酒泉市/玉门市={"id":"data/CN/甘肃省/酒泉市/玉门市","key":"玉门市","lang":"zh-hans","lname":"Yumen Shi","zipex":"735200"}
+data/CN/甘肃省/酒泉市/瓜州县={"id":"data/CN/甘肃省/酒泉市/瓜州县","key":"瓜州县","lang":"zh-hans","lname":"Guazhou Xian","zipex":"736100"}
+data/CN/甘肃省/酒泉市/肃北蒙古族自治县={"id":"data/CN/甘肃省/酒泉市/肃北蒙古族自治县","key":"肃北蒙古族自治县","lang":"zh-hans","lname":"Subei Xian","zipex":"736300","lfname":"Subei Mongolzu Zizhixian"}
+data/CN/甘肃省/酒泉市/肃州区={"id":"data/CN/甘肃省/酒泉市/肃州区","key":"肃州区","lang":"zh-hans","lname":"Suzhou Qu","zipex":"735000"}
+data/CN/甘肃省/酒泉市/金塔县={"id":"data/CN/甘肃省/酒泉市/金塔县","key":"金塔县","lang":"zh-hans","lname":"Jinta Xian","zipex":"735300"}
+data/CN/甘肃省/酒泉市/阿克塞哈萨克族自治县={"id":"data/CN/甘肃省/酒泉市/阿克塞哈萨克族自治县","key":"阿克塞哈萨克族自治县","lang":"zh-hans","lname":"Aksay Xian","zipex":"736400","lfname":"Aksay Kazakzu Zizhixian"}
+data/CN/甘肃省/金昌市={"id":"data/CN/甘肃省/金昌市","key":"金昌市","lang":"zh-hans","lname":"Jinchang Shi","zipex":"737100","sub_keys":"金川区~永昌县","sub_lnames":"Jinchuan Qu~Yongchang Xian","sub_zipexs":"737103~737200"}
+data/CN/甘肃省/金昌市/永昌县={"id":"data/CN/甘肃省/金昌市/永昌县","key":"永昌县","lang":"zh-hans","lname":"Yongchang Xian","zipex":"737200"}
+data/CN/甘肃省/金昌市/金川区={"id":"data/CN/甘肃省/金昌市/金川区","key":"金川区","lang":"zh-hans","lname":"Jinchuan Qu","zipex":"737103"}
+data/CN/甘肃省/陇南市={"id":"data/CN/甘肃省/陇南市","key":"陇南市","lang":"zh-hans","lname":"Longnan Shi","zipex":"742500","sub_keys":"成县~宕昌县~徽县~康县~礼县~两当县~文县~武都区~西和县","sub_lnames":"Cheng Xian~Tanchang Xian~Hui Xian~Kang Xian~Li Xian~Liangdang Xian~Wen Xian~Wudu Qu~Xihe Xian","sub_zipexs":"742500~748500~742300~746500~742200~742400~746400~746000~742100"}
+data/CN/甘肃省/陇南市/两当县={"id":"data/CN/甘肃省/陇南市/两当县","key":"两当县","lang":"zh-hans","lname":"Liangdang Xian","zipex":"742400"}
+data/CN/甘肃省/陇南市/宕昌县={"id":"data/CN/甘肃省/陇南市/宕昌县","key":"宕昌县","lang":"zh-hans","lname":"Tanchang Xian","zipex":"748500"}
+data/CN/甘肃省/陇南市/康县={"id":"data/CN/甘肃省/陇南市/康县","key":"康县","lang":"zh-hans","lname":"Kang Xian","zipex":"746500"}
+data/CN/甘肃省/陇南市/徽县={"id":"data/CN/甘肃省/陇南市/徽县","key":"徽县","lang":"zh-hans","lname":"Hui Xian","zipex":"742300"}
+data/CN/甘肃省/陇南市/成县={"id":"data/CN/甘肃省/陇南市/成县","key":"成县","lang":"zh-hans","lname":"Cheng Xian","zipex":"742500"}
+data/CN/甘肃省/陇南市/文县={"id":"data/CN/甘肃省/陇南市/文县","key":"文县","lang":"zh-hans","lname":"Wen Xian","zipex":"746400"}
+data/CN/甘肃省/陇南市/武都区={"id":"data/CN/甘肃省/陇南市/武都区","key":"武都区","lang":"zh-hans","lname":"Wudu Qu","zipex":"746000"}
+data/CN/甘肃省/陇南市/礼县={"id":"data/CN/甘肃省/陇南市/礼县","key":"礼县","lang":"zh-hans","lname":"Li Xian","zipex":"742200"}
+data/CN/甘肃省/陇南市/西和县={"id":"data/CN/甘肃省/陇南市/西和县","key":"西和县","lang":"zh-hans","lname":"Xihe Xian","zipex":"742100"}
+data/CN/福建省={"id":"data/CN/福建省","key":"福建省","lang":"zh-hans","lname":"Fujian Sheng","isoid":"35","sub_keys":"福州市~龙岩市~南平市~宁德市~莆田市~泉州市~三明市~厦门市~漳州市","sub_lnames":"Fuzhou Shi~Longyan Shi~Nanping Shi~Ningde Shi~Putian Shi~Quanzhou Shi~Sanming Shi~Xiamen Shi~Zhangzhou Shi","sub_zipexs":"350001~364000~353000~352100~351100~362000~365000~361012~363000","sub_mores":"true~true~true~true~true~true~true~true~true"}
+data/CN/福建省/三明市={"id":"data/CN/福建省/三明市","key":"三明市","lang":"zh-hans","lname":"Sanming Shi","zipex":"365000","sub_keys":"大田县~建宁县~将乐县~梅列区~明溪县~宁化县~清流县~三元区~沙县~泰宁县~永安市~尤溪县","sub_lnames":"Datian Xian~Jianning Xian~Jiangle Xian~Meilie Qu~Mingxi Xian~Ninghua Xian~Qingliu Xian~Sanyuan Qu~Sha Xian~Taining Xian~Yong'an Shi~Youxi Xian","sub_zipexs":"366100~354500~353300~365000~365200~365400~365300~365001~365500~354400~366000~365100"}
+data/CN/福建省/三明市/三元区={"id":"data/CN/福建省/三明市/三元区","key":"三元区","lang":"zh-hans","lname":"Sanyuan Qu","zipex":"365001"}
+data/CN/福建省/三明市/大田县={"id":"data/CN/福建省/三明市/大田县","key":"大田县","lang":"zh-hans","lname":"Datian Xian","zipex":"366100"}
+data/CN/福建省/三明市/宁化县={"id":"data/CN/福建省/三明市/宁化县","key":"宁化县","lang":"zh-hans","lname":"Ninghua Xian","zipex":"365400"}
+data/CN/福建省/三明市/将乐县={"id":"data/CN/福建省/三明市/将乐县","key":"将乐县","lang":"zh-hans","lname":"Jiangle Xian","zipex":"353300"}
+data/CN/福建省/三明市/尤溪县={"id":"data/CN/福建省/三明市/尤溪县","key":"尤溪县","lang":"zh-hans","lname":"Youxi Xian","zipex":"365100"}
+data/CN/福建省/三明市/建宁县={"id":"data/CN/福建省/三明市/建宁县","key":"建宁县","lang":"zh-hans","lname":"Jianning Xian","zipex":"354500"}
+data/CN/福建省/三明市/明溪县={"id":"data/CN/福建省/三明市/明溪县","key":"明溪县","lang":"zh-hans","lname":"Mingxi Xian","zipex":"365200"}
+data/CN/福建省/三明市/梅列区={"id":"data/CN/福建省/三明市/梅列区","key":"梅列区","lang":"zh-hans","lname":"Meilie Qu","zipex":"365000"}
+data/CN/福建省/三明市/永安市={"id":"data/CN/福建省/三明市/永安市","key":"永安市","lang":"zh-hans","lname":"Yong'an Shi","zipex":"366000"}
+data/CN/福建省/三明市/沙县={"id":"data/CN/福建省/三明市/沙县","key":"沙县","lang":"zh-hans","lname":"Sha Xian","zipex":"365500"}
+data/CN/福建省/三明市/泰宁县={"id":"data/CN/福建省/三明市/泰宁县","key":"泰宁县","lang":"zh-hans","lname":"Taining Xian","zipex":"354400"}
+data/CN/福建省/三明市/清流县={"id":"data/CN/福建省/三明市/清流县","key":"清流县","lang":"zh-hans","lname":"Qingliu Xian","zipex":"365300"}
+data/CN/福建省/南平市={"id":"data/CN/福建省/南平市","key":"南平市","lang":"zh-hans","lname":"Nanping Shi","zipex":"353000","sub_keys":"光泽县~建瓯市~建阳市~浦城县~邵武市~顺昌县~松溪县~武夷山市~延平区~政和县","sub_lnames":"Guangze Xian~Jian'ou Shi~Jianyang Shi~Pucheng Xian~Shaowu Shi~Shunchang Xian~Songxi Xian~Wuyishan Shi~Yanping Qu~Zhenghe Xian","sub_zipexs":"354100~353100~354200~353400~354000~353200~353500~354300~353000~353600"}
+data/CN/福建省/南平市/光泽县={"id":"data/CN/福建省/南平市/光泽县","key":"光泽县","lang":"zh-hans","lname":"Guangze Xian","zipex":"354100"}
+data/CN/福建省/南平市/延平区={"id":"data/CN/福建省/南平市/延平区","key":"延平区","lang":"zh-hans","lname":"Yanping Qu","zipex":"353000"}
+data/CN/福建省/南平市/建瓯市={"id":"data/CN/福建省/南平市/建瓯市","key":"建瓯市","lang":"zh-hans","lname":"Jian'ou Shi","zipex":"353100"}
+data/CN/福建省/南平市/建阳市={"id":"data/CN/福建省/南平市/建阳市","key":"建阳市","lang":"zh-hans","lname":"Jianyang Shi","zipex":"354200"}
+data/CN/福建省/南平市/政和县={"id":"data/CN/福建省/南平市/政和县","key":"政和县","lang":"zh-hans","lname":"Zhenghe Xian","zipex":"353600"}
+data/CN/福建省/南平市/松溪县={"id":"data/CN/福建省/南平市/松溪县","key":"松溪县","lang":"zh-hans","lname":"Songxi Xian","zipex":"353500"}
+data/CN/福建省/南平市/武夷山市={"id":"data/CN/福建省/南平市/武夷山市","key":"武夷山市","lang":"zh-hans","lname":"Wuyishan Shi","zipex":"354300"}
+data/CN/福建省/南平市/浦城县={"id":"data/CN/福建省/南平市/浦城县","key":"浦城县","lang":"zh-hans","lname":"Pucheng Xian","zipex":"353400"}
+data/CN/福建省/南平市/邵武市={"id":"data/CN/福建省/南平市/邵武市","key":"邵武市","lang":"zh-hans","lname":"Shaowu Shi","zipex":"354000"}
+data/CN/福建省/南平市/顺昌县={"id":"data/CN/福建省/南平市/顺昌县","key":"顺昌县","lang":"zh-hans","lname":"Shunchang Xian","zipex":"353200"}
+data/CN/福建省/厦门市={"id":"data/CN/福建省/厦门市","key":"厦门市","lang":"zh-hans","lname":"Xiamen Shi","zipex":"361012","sub_keys":"海沧区~湖里区~集美区~思明区~同安区~翔安区","sub_lnames":"Haicang Qu~Huli Qu~Jimei Qu~Siming Qu~Tong'an Qu~Xiang'an Qu","sub_zipexs":"361022~361006~361021~361001~361100~361003"}
+data/CN/福建省/厦门市/同安区={"id":"data/CN/福建省/厦门市/同安区","key":"同安区","lang":"zh-hans","lname":"Tong'an Qu","zipex":"361100"}
+data/CN/福建省/厦门市/思明区={"id":"data/CN/福建省/厦门市/思明区","key":"思明区","lang":"zh-hans","lname":"Siming Qu","zipex":"361001"}
+data/CN/福建省/厦门市/海沧区={"id":"data/CN/福建省/厦门市/海沧区","key":"海沧区","lang":"zh-hans","lname":"Haicang Qu","zipex":"361022"}
+data/CN/福建省/厦门市/湖里区={"id":"data/CN/福建省/厦门市/湖里区","key":"湖里区","lang":"zh-hans","lname":"Huli Qu","zipex":"361006"}
+data/CN/福建省/厦门市/翔安区={"id":"data/CN/福建省/厦门市/翔安区","key":"翔安区","lang":"zh-hans","lname":"Xiang'an Qu","zipex":"361003"}
+data/CN/福建省/厦门市/集美区={"id":"data/CN/福建省/厦门市/集美区","key":"集美区","lang":"zh-hans","lname":"Jimei Qu","zipex":"361021"}
+data/CN/福建省/宁德市={"id":"data/CN/福建省/宁德市","key":"宁德市","lang":"zh-hans","lname":"Ningde Shi","zipex":"352100","sub_keys":"福安市~福鼎市~古田县~蕉城区~屏南县~寿宁县~霞浦县~柘荣县~周宁县","sub_lnames":"Fu'an Shi~Fuding Shi~Gutian Xian~Jiaocheng Qu~Pingnan Xian~Shouning Xian~Xiapu Xian~Zherong Xian~Zhouning Xian","sub_zipexs":"355000~355200~352200~352100~352300~355500~355100~355300~355400"}
+data/CN/福建省/宁德市/古田县={"id":"data/CN/福建省/宁德市/古田县","key":"古田县","lang":"zh-hans","lname":"Gutian Xian","zipex":"352200"}
+data/CN/福建省/宁德市/周宁县={"id":"data/CN/福建省/宁德市/周宁县","key":"周宁县","lang":"zh-hans","lname":"Zhouning Xian","zipex":"355400"}
+data/CN/福建省/宁德市/寿宁县={"id":"data/CN/福建省/宁德市/寿宁县","key":"寿宁县","lang":"zh-hans","lname":"Shouning Xian","zipex":"355500"}
+data/CN/福建省/宁德市/屏南县={"id":"data/CN/福建省/宁德市/屏南县","key":"屏南县","lang":"zh-hans","lname":"Pingnan Xian","zipex":"352300"}
+data/CN/福建省/宁德市/柘荣县={"id":"data/CN/福建省/宁德市/柘荣县","key":"柘荣县","lang":"zh-hans","lname":"Zherong Xian","zipex":"355300"}
+data/CN/福建省/宁德市/福安市={"id":"data/CN/福建省/宁德市/福安市","key":"福安市","lang":"zh-hans","lname":"Fu'an Shi","zipex":"355000"}
+data/CN/福建省/宁德市/福鼎市={"id":"data/CN/福建省/宁德市/福鼎市","key":"福鼎市","lang":"zh-hans","lname":"Fuding Shi","zipex":"355200"}
+data/CN/福建省/宁德市/蕉城区={"id":"data/CN/福建省/宁德市/蕉城区","key":"蕉城区","lang":"zh-hans","lname":"Jiaocheng Qu","zipex":"352100"}
+data/CN/福建省/宁德市/霞浦县={"id":"data/CN/福建省/宁德市/霞浦县","key":"霞浦县","lang":"zh-hans","lname":"Xiapu Xian","zipex":"355100"}
+data/CN/福建省/泉州市={"id":"data/CN/福建省/泉州市","key":"泉州市","lang":"zh-hans","lname":"Quanzhou Shi","zipex":"362000","sub_keys":"安溪县~德化县~丰泽区~惠安县~金门县~晋江市~鲤城区~洛江区~南安市~泉港区~石狮市~永春县","sub_lnames":"Anxi Xian~Dehua Xian~Fengze Qu~Hui'an Xian~Jinmen Xian~Jinjiang Shi~Licheng Qu~Luojiang Qu~Nan'an Shi~Quangang Qu~Shishi Shi~Yongchun Xian","sub_zipexs":"362400~362500~362000~362100~~362200~362000~362000~362300~362801~362700~362600"}
+data/CN/福建省/泉州市/丰泽区={"id":"data/CN/福建省/泉州市/丰泽区","key":"丰泽区","lang":"zh-hans","lname":"Fengze Qu","zipex":"362000"}
+data/CN/福建省/泉州市/南安市={"id":"data/CN/福建省/泉州市/南安市","key":"南安市","lang":"zh-hans","lname":"Nan'an Shi","zipex":"362300"}
+data/CN/福建省/泉州市/安溪县={"id":"data/CN/福建省/泉州市/安溪县","key":"安溪县","lang":"zh-hans","lname":"Anxi Xian","zipex":"362400"}
+data/CN/福建省/泉州市/德化县={"id":"data/CN/福建省/泉州市/德化县","key":"德化县","lang":"zh-hans","lname":"Dehua Xian","zipex":"362500"}
+data/CN/福建省/泉州市/惠安县={"id":"data/CN/福建省/泉州市/惠安县","key":"惠安县","lang":"zh-hans","lname":"Hui'an Xian","zipex":"362100"}
+data/CN/福建省/泉州市/晋江市={"id":"data/CN/福建省/泉州市/晋江市","key":"晋江市","lang":"zh-hans","lname":"Jinjiang Shi","zipex":"362200"}
+data/CN/福建省/泉州市/永春县={"id":"data/CN/福建省/泉州市/永春县","key":"永春县","lang":"zh-hans","lname":"Yongchun Xian","zipex":"362600"}
+data/CN/福建省/泉州市/泉港区={"id":"data/CN/福建省/泉州市/泉港区","key":"泉港区","lang":"zh-hans","lname":"Quangang Qu","zipex":"362801"}
+data/CN/福建省/泉州市/洛江区={"id":"data/CN/福建省/泉州市/洛江区","key":"洛江区","lang":"zh-hans","lname":"Luojiang Qu","zipex":"362000"}
+data/CN/福建省/泉州市/石狮市={"id":"data/CN/福建省/泉州市/石狮市","key":"石狮市","lang":"zh-hans","lname":"Shishi Shi","zipex":"362700"}
+data/CN/福建省/泉州市/金门县={"id":"data/CN/福建省/泉州市/金门县","key":"金门县","lang":"zh-hans","lname":"Jinmen Xian"}
+data/CN/福建省/泉州市/鲤城区={"id":"data/CN/福建省/泉州市/鲤城区","key":"鲤城区","lang":"zh-hans","lname":"Licheng Qu","zipex":"362000"}
+data/CN/福建省/漳州市={"id":"data/CN/福建省/漳州市","key":"漳州市","lang":"zh-hans","lname":"Zhangzhou Shi","zipex":"363000","sub_keys":"长泰县~东山县~华安县~龙海市~龙文区~南靖县~平和县~芗城区~云霄县~漳浦县~诏安县","sub_lnames":"Changtai Xian~Dongshan Xian~Hua'an Xian~Longhai Shi~Longwen Qu~Nanjing Xian~Pinghe Xian~Xiangcheng Qu~Yunxiao Xian~Zhangpu Xian~Zhao'an Xian","sub_zipexs":"363900~363400~363800~363100~363005~363600~363700~363000~363300~363200~363500"}
+data/CN/福建省/漳州市/东山县={"id":"data/CN/福建省/漳州市/东山县","key":"东山县","lang":"zh-hans","lname":"Dongshan Xian","zipex":"363400"}
+data/CN/福建省/漳州市/云霄县={"id":"data/CN/福建省/漳州市/云霄县","key":"云霄县","lang":"zh-hans","lname":"Yunxiao Xian","zipex":"363300"}
+data/CN/福建省/漳州市/华安县={"id":"data/CN/福建省/漳州市/华安县","key":"华安县","lang":"zh-hans","lname":"Hua'an Xian","zipex":"363800"}
+data/CN/福建省/漳州市/南靖县={"id":"data/CN/福建省/漳州市/南靖县","key":"南靖县","lang":"zh-hans","lname":"Nanjing Xian","zipex":"363600"}
+data/CN/福建省/漳州市/平和县={"id":"data/CN/福建省/漳州市/平和县","key":"平和县","lang":"zh-hans","lname":"Pinghe Xian","zipex":"363700"}
+data/CN/福建省/漳州市/漳浦县={"id":"data/CN/福建省/漳州市/漳浦县","key":"漳浦县","lang":"zh-hans","lname":"Zhangpu Xian","zipex":"363200"}
+data/CN/福建省/漳州市/芗城区={"id":"data/CN/福建省/漳州市/芗城区","key":"芗城区","lang":"zh-hans","lname":"Xiangcheng Qu","zipex":"363000"}
+data/CN/福建省/漳州市/诏安县={"id":"data/CN/福建省/漳州市/诏安县","key":"诏安县","lang":"zh-hans","lname":"Zhao'an Xian","zipex":"363500"}
+data/CN/福建省/漳州市/长泰县={"id":"data/CN/福建省/漳州市/长泰县","key":"长泰县","lang":"zh-hans","lname":"Changtai Xian","zipex":"363900"}
+data/CN/福建省/漳州市/龙文区={"id":"data/CN/福建省/漳州市/龙文区","key":"龙文区","lang":"zh-hans","lname":"Longwen Qu","zipex":"363005"}
+data/CN/福建省/漳州市/龙海市={"id":"data/CN/福建省/漳州市/龙海市","key":"龙海市","lang":"zh-hans","lname":"Longhai Shi","zipex":"363100"}
+data/CN/福建省/福州市={"id":"data/CN/福建省/福州市","key":"福州市","lang":"zh-hans","lname":"Fuzhou Shi","zipex":"350001","sub_keys":"仓山区~长乐市~福清市~鼓楼区~晋安区~连江县~罗源县~马尾区~闽侯县~闽清县~平潭县~台江区~永泰县","sub_lnames":"Cangshan Qu~Changle Shi~Fuqing Shi~Gulou Qu~Jin'an Qu~Lianjiang Xian~Luoyuan Xian~Mawei Qu~Minhou Xian~Minqing Xian~Pingtan Xian~Taijiang Qu~Yongtai Xian","sub_zipexs":"350007~350200~350300~350001~350011~350500~350600~350015~350100~350800~350400~350004~350700"}
+data/CN/福建省/福州市/仓山区={"id":"data/CN/福建省/福州市/仓山区","key":"仓山区","lang":"zh-hans","lname":"Cangshan Qu","zipex":"350007"}
+data/CN/福建省/福州市/台江区={"id":"data/CN/福建省/福州市/台江区","key":"台江区","lang":"zh-hans","lname":"Taijiang Qu","zipex":"350004"}
+data/CN/福建省/福州市/平潭县={"id":"data/CN/福建省/福州市/平潭县","key":"平潭县","lang":"zh-hans","lname":"Pingtan Xian","zipex":"350400"}
+data/CN/福建省/福州市/晋安区={"id":"data/CN/福建省/福州市/晋安区","key":"晋安区","lang":"zh-hans","lname":"Jin'an Qu","zipex":"350011"}
+data/CN/福建省/福州市/永泰县={"id":"data/CN/福建省/福州市/永泰县","key":"永泰县","lang":"zh-hans","lname":"Yongtai Xian","zipex":"350700"}
+data/CN/福建省/福州市/福清市={"id":"data/CN/福建省/福州市/福清市","key":"福清市","lang":"zh-hans","lname":"Fuqing Shi","zipex":"350300"}
+data/CN/福建省/福州市/罗源县={"id":"data/CN/福建省/福州市/罗源县","key":"罗源县","lang":"zh-hans","lname":"Luoyuan Xian","zipex":"350600"}
+data/CN/福建省/福州市/连江县={"id":"data/CN/福建省/福州市/连江县","key":"连江县","lang":"zh-hans","lname":"Lianjiang Xian","zipex":"350500"}
+data/CN/福建省/福州市/长乐市={"id":"data/CN/福建省/福州市/长乐市","key":"长乐市","lang":"zh-hans","lname":"Changle Shi","zipex":"350200"}
+data/CN/福建省/福州市/闽侯县={"id":"data/CN/福建省/福州市/闽侯县","key":"闽侯县","lang":"zh-hans","lname":"Minhou Xian","zipex":"350100"}
+data/CN/福建省/福州市/闽清县={"id":"data/CN/福建省/福州市/闽清县","key":"闽清县","lang":"zh-hans","lname":"Minqing Xian","zipex":"350800"}
+data/CN/福建省/福州市/马尾区={"id":"data/CN/福建省/福州市/马尾区","key":"马尾区","lang":"zh-hans","lname":"Mawei Qu","zipex":"350015"}
+data/CN/福建省/福州市/鼓楼区={"id":"data/CN/福建省/福州市/鼓楼区","key":"鼓楼区","lang":"zh-hans","lname":"Gulou Qu","zipex":"350001"}
+data/CN/福建省/莆田市={"id":"data/CN/福建省/莆田市","key":"莆田市","lang":"zh-hans","lname":"Putian Shi","zipex":"351100","sub_keys":"城厢区~涵江区~荔城区~仙游县~秀屿区","sub_lnames":"Chengxiang Qu~Hanjiang Qu~Licheng Qu~Xianyou Xian~Xiuyu Qu","sub_zipexs":"351100~351111~351100~351200~351152"}
+data/CN/福建省/莆田市/仙游县={"id":"data/CN/福建省/莆田市/仙游县","key":"仙游县","lang":"zh-hans","lname":"Xianyou Xian","zipex":"351200"}
+data/CN/福建省/莆田市/城厢区={"id":"data/CN/福建省/莆田市/城厢区","key":"城厢区","lang":"zh-hans","lname":"Chengxiang Qu","zipex":"351100"}
+data/CN/福建省/莆田市/涵江区={"id":"data/CN/福建省/莆田市/涵江区","key":"涵江区","lang":"zh-hans","lname":"Hanjiang Qu","zipex":"351111"}
+data/CN/福建省/莆田市/秀屿区={"id":"data/CN/福建省/莆田市/秀屿区","key":"秀屿区","lang":"zh-hans","lname":"Xiuyu Qu","zipex":"351152"}
+data/CN/福建省/莆田市/荔城区={"id":"data/CN/福建省/莆田市/荔城区","key":"荔城区","lang":"zh-hans","lname":"Licheng Qu","zipex":"351100"}
+data/CN/福建省/龙岩市={"id":"data/CN/福建省/龙岩市","key":"龙岩市","lang":"zh-hans","lname":"Longyan Shi","zipex":"364000","sub_keys":"长汀县~连城县~上杭县~武平县~新罗区~永定县~漳平市","sub_lnames":"Changting Xian~Liancheng Xian~Shanghang Xian~Wuping Xian~Xinluo Qu~Yongding Xian~Zhangping Shi","sub_zipexs":"366300~366200~366300~364300~364000~364100~364400"}
+data/CN/福建省/龙岩市/上杭县={"id":"data/CN/福建省/龙岩市/上杭县","key":"上杭县","lang":"zh-hans","lname":"Shanghang Xian","zipex":"366300"}
+data/CN/福建省/龙岩市/新罗区={"id":"data/CN/福建省/龙岩市/新罗区","key":"新罗区","lang":"zh-hans","lname":"Xinluo Qu","zipex":"364000"}
+data/CN/福建省/龙岩市/武平县={"id":"data/CN/福建省/龙岩市/武平县","key":"武平县","lang":"zh-hans","lname":"Wuping Xian","zipex":"364300"}
+data/CN/福建省/龙岩市/永定县={"id":"data/CN/福建省/龙岩市/永定县","key":"永定县","lang":"zh-hans","lname":"Yongding Xian","zipex":"364100"}
+data/CN/福建省/龙岩市/漳平市={"id":"data/CN/福建省/龙岩市/漳平市","key":"漳平市","lang":"zh-hans","lname":"Zhangping Shi","zipex":"364400"}
+data/CN/福建省/龙岩市/连城县={"id":"data/CN/福建省/龙岩市/连城县","key":"连城县","lang":"zh-hans","lname":"Liancheng Xian","zipex":"366200"}
+data/CN/福建省/龙岩市/长汀县={"id":"data/CN/福建省/龙岩市/长汀县","key":"长汀县","lang":"zh-hans","lname":"Changting Xian","zipex":"366300"}
+data/CN/西藏={"id":"data/CN/西藏","key":"西藏","lang":"zh-hans","lname":"Xizang","isoid":"54","sub_keys":"阿里地区~昌都地区~拉萨市~林芝地区~那曲地区~日喀则地区~山南地区","sub_lnames":"Ngari Diqu~Qamdo Diqu~Lhasa Shi~Nyingchi Diqu~Nagqu Diqu~Xigazê Diqu~Shannan Diqu","sub_zipexs":"859000~854000~850012~860000~852000~857000~856000","sub_mores":"true~true~true~true~true~true~true"}
+data/CN/西藏/山南地区={"id":"data/CN/西藏/山南地区","key":"山南地区","lang":"zh-hans","lname":"Shannan Diqu","zipex":"856000","sub_keys":"措美县~错那县~贡嘎县~加查县~浪卡子县~隆子县~洛扎县~乃东县~琼结县~曲松县~桑日县~扎囊县","sub_lnames":"Comai Xian~Cona Xian~Gonggar Xian~Gyaca Xian~Nagarzê Xian~Lhünzê Xian~Lhozhag Xian~Nêdong Xian~Qonggyai Xian~Qusum Xian~Sangri Xian~Chanang (Chatang) Xian","sub_zipexs":"856900~856700~850700~856400~851100~856600~851200~856100~856800~856300~856200~850800"}
+data/CN/西藏/山南地区/乃东县={"id":"data/CN/西藏/山南地区/乃东县","key":"乃东县","lang":"zh-hans","lname":"Nêdong Xian","zipex":"856100"}
+data/CN/西藏/山南地区/加查县={"id":"data/CN/西藏/山南地区/加查县","key":"加查县","lang":"zh-hans","lname":"Gyaca Xian","zipex":"856400"}
+data/CN/西藏/山南地区/扎囊县={"id":"data/CN/西藏/山南地区/扎囊县","key":"扎囊县","lang":"zh-hans","lname":"Chanang (Chatang) Xian","zipex":"850800"}
+data/CN/西藏/山南地区/措美县={"id":"data/CN/西藏/山南地区/措美县","key":"措美县","lang":"zh-hans","lname":"Comai Xian","zipex":"856900"}
+data/CN/西藏/山南地区/曲松县={"id":"data/CN/西藏/山南地区/曲松县","key":"曲松县","lang":"zh-hans","lname":"Qusum Xian","zipex":"856300"}
+data/CN/西藏/山南地区/桑日县={"id":"data/CN/西藏/山南地区/桑日县","key":"桑日县","lang":"zh-hans","lname":"Sangri Xian","zipex":"856200"}
+data/CN/西藏/山南地区/洛扎县={"id":"data/CN/西藏/山南地区/洛扎县","key":"洛扎县","lang":"zh-hans","lname":"Lhozhag Xian","zipex":"851200"}
+data/CN/西藏/山南地区/浪卡子县={"id":"data/CN/西藏/山南地区/浪卡子县","key":"浪卡子县","lang":"zh-hans","lname":"Nagarzê Xian","zipex":"851100"}
+data/CN/西藏/山南地区/琼结县={"id":"data/CN/西藏/山南地区/琼结县","key":"琼结县","lang":"zh-hans","lname":"Qonggyai Xian","zipex":"856800"}
+data/CN/西藏/山南地区/贡嘎县={"id":"data/CN/西藏/山南地区/贡嘎县","key":"贡嘎县","lang":"zh-hans","lname":"Gonggar Xian","zipex":"850700"}
+data/CN/西藏/山南地区/错那县={"id":"data/CN/西藏/山南地区/错那县","key":"错那县","lang":"zh-hans","lname":"Cona Xian","zipex":"856700"}
+data/CN/西藏/山南地区/隆子县={"id":"data/CN/西藏/山南地区/隆子县","key":"隆子县","lang":"zh-hans","lname":"Lhünzê Xian","zipex":"856600"}
+data/CN/西藏/拉萨市={"id":"data/CN/西藏/拉萨市","key":"拉萨市","lang":"zh-hans","lname":"Lhasa Shi","zipex":"850012","sub_keys":"城关区~达孜县~当雄县~堆龙德庆县~林周县~墨竹工卡县~尼木县~曲水县","sub_lnames":"Chengguan Qu~Dagzê Xian~Damxung Xian~Doilungdêqên Xian~Lhünzhub Xian~Maizhokunggar Xian~Nyêmo Xian~Qüxü Xian","sub_zipexs":"850000~850100~851500~851400~851600~850200~851300~850600"}
+data/CN/西藏/拉萨市/城关区={"id":"data/CN/西藏/拉萨市/城关区","key":"城关区","lang":"zh-hans","lname":"Chengguan Qu","zipex":"850000"}
+data/CN/西藏/拉萨市/堆龙德庆县={"id":"data/CN/西藏/拉萨市/堆龙德庆县","key":"堆龙德庆县","lang":"zh-hans","lname":"Doilungdêqên Xian","zipex":"851400"}
+data/CN/西藏/拉萨市/墨竹工卡县={"id":"data/CN/西藏/拉萨市/墨竹工卡县","key":"墨竹工卡县","lang":"zh-hans","lname":"Maizhokunggar Xian","zipex":"850200"}
+data/CN/西藏/拉萨市/尼木县={"id":"data/CN/西藏/拉萨市/尼木县","key":"尼木县","lang":"zh-hans","lname":"Nyêmo Xian","zipex":"851300"}
+data/CN/西藏/拉萨市/当雄县={"id":"data/CN/西藏/拉萨市/当雄县","key":"当雄县","lang":"zh-hans","lname":"Damxung Xian","zipex":"851500"}
+data/CN/西藏/拉萨市/曲水县={"id":"data/CN/西藏/拉萨市/曲水县","key":"曲水县","lang":"zh-hans","lname":"Qüxü Xian","zipex":"850600"}
+data/CN/西藏/拉萨市/林周县={"id":"data/CN/西藏/拉萨市/林周县","key":"林周县","lang":"zh-hans","lname":"Lhünzhub Xian","zipex":"851600"}
+data/CN/西藏/拉萨市/达孜县={"id":"data/CN/西藏/拉萨市/达孜县","key":"达孜县","lang":"zh-hans","lname":"Dagzê Xian","zipex":"850100"}
+data/CN/西藏/日喀则地区={"id":"data/CN/西藏/日喀则地区","key":"日喀则地区","lang":"zh-hans","lname":"Xigazê Diqu","zipex":"857000","sub_keys":"昂仁县~白朗县~定结县~定日县~岗巴县~吉隆县~江孜县~康马县~拉孜县~南木林县~聂拉木县~仁布县~日喀则市~萨嘎县~萨迦县~谢通门县~亚东县~仲巴县","sub_lnames":"Ngamring Xian~Bainang Xian~Dinggyê Xian~Tingri Xian~Gamba Xian~Gyirong Xian~Gyangzê Xian~Kangmar Xian~Lhazê Xian~Namling Xian~Nyalam Xian~Rinbung Xian~Xigazê Shi~Saga Xian~Sa'gya Xian~Xaitongmoin Xian~Yadong (Chomo) Xian~Zhongba Xian","sub_zipexs":"858500~857300~857900~858200~857700~858700~857400~857500~858100~857100~858300~857200~857000~858600~857800~858900~857600~858800"}
+data/CN/西藏/日喀则地区/亚东县={"id":"data/CN/西藏/日喀则地区/亚东县","key":"亚东县","lang":"zh-hans","lname":"Yadong (Chomo) Xian","zipex":"857600"}
+data/CN/西藏/日喀则地区/仁布县={"id":"data/CN/西藏/日喀则地区/仁布县","key":"仁布县","lang":"zh-hans","lname":"Rinbung Xian","zipex":"857200"}
+data/CN/西藏/日喀则地区/仲巴县={"id":"data/CN/西藏/日喀则地区/仲巴县","key":"仲巴县","lang":"zh-hans","lname":"Zhongba Xian","zipex":"858800"}
+data/CN/西藏/日喀则地区/南木林县={"id":"data/CN/西藏/日喀则地区/南木林县","key":"南木林县","lang":"zh-hans","lname":"Namling Xian","zipex":"857100"}
+data/CN/西藏/日喀则地区/吉隆县={"id":"data/CN/西藏/日喀则地区/吉隆县","key":"吉隆县","lang":"zh-hans","lname":"Gyirong Xian","zipex":"858700"}
+data/CN/西藏/日喀则地区/定日县={"id":"data/CN/西藏/日喀则地区/定日县","key":"定日县","lang":"zh-hans","lname":"Tingri Xian","zipex":"858200"}
+data/CN/西藏/日喀则地区/定结县={"id":"data/CN/西藏/日喀则地区/定结县","key":"定结县","lang":"zh-hans","lname":"Dinggyê Xian","zipex":"857900"}
+data/CN/西藏/日喀则地区/岗巴县={"id":"data/CN/西藏/日喀则地区/岗巴县","key":"岗巴县","lang":"zh-hans","lname":"Gamba Xian","zipex":"857700"}
+data/CN/西藏/日喀则地区/康马县={"id":"data/CN/西藏/日喀则地区/康马县","key":"康马县","lang":"zh-hans","lname":"Kangmar Xian","zipex":"857500"}
+data/CN/西藏/日喀则地区/拉孜县={"id":"data/CN/西藏/日喀则地区/拉孜县","key":"拉孜县","lang":"zh-hans","lname":"Lhazê Xian","zipex":"858100"}
+data/CN/西藏/日喀则地区/日喀则市={"id":"data/CN/西藏/日喀则地区/日喀则市","key":"日喀则市","lang":"zh-hans","lname":"Xigazê Shi","zipex":"857000"}
+data/CN/西藏/日喀则地区/昂仁县={"id":"data/CN/西藏/日喀则地区/昂仁县","key":"昂仁县","lang":"zh-hans","lname":"Ngamring Xian","zipex":"858500"}
+data/CN/西藏/日喀则地区/江孜县={"id":"data/CN/西藏/日喀则地区/江孜县","key":"江孜县","lang":"zh-hans","lname":"Gyangzê Xian","zipex":"857400"}
+data/CN/西藏/日喀则地区/白朗县={"id":"data/CN/西藏/日喀则地区/白朗县","key":"白朗县","lang":"zh-hans","lname":"Bainang Xian","zipex":"857300"}
+data/CN/西藏/日喀则地区/聂拉木县={"id":"data/CN/西藏/日喀则地区/聂拉木县","key":"聂拉木县","lang":"zh-hans","lname":"Nyalam Xian","zipex":"858300"}
+data/CN/西藏/日喀则地区/萨嘎县={"id":"data/CN/西藏/日喀则地区/萨嘎县","key":"萨嘎县","lang":"zh-hans","lname":"Saga Xian","zipex":"858600"}
+data/CN/西藏/日喀则地区/萨迦县={"id":"data/CN/西藏/日喀则地区/萨迦县","key":"萨迦县","lang":"zh-hans","lname":"Sa'gya Xian","zipex":"857800"}
+data/CN/西藏/日喀则地区/谢通门县={"id":"data/CN/西藏/日喀则地区/谢通门县","key":"谢通门县","lang":"zh-hans","lname":"Xaitongmoin Xian","zipex":"858900"}
+data/CN/西藏/昌都地区={"id":"data/CN/西藏/昌都地区","key":"昌都地区","lang":"zh-hans","lname":"Qamdo Diqu","zipex":"854000","sub_keys":"八宿县~边坝县~察雅县~昌都县~丁青县~贡觉县~江达县~类乌齐县~洛隆县~芒康县~左贡县","sub_lnames":"Baxoi Xian~Banbar Xian~Chagyab Xian~Qamdo Xian~Dêngqên Xian~Konjo Xian~Jomda Xian~Riwoq Xian~Lhorong Xian~Mangkam Xian~Zogang Xian","sub_zipexs":"854600~855500~854300~854000~855700~854200~854100~855600~855400~854500~854400"}
+data/CN/西藏/昌都地区/丁青县={"id":"data/CN/西藏/昌都地区/丁青县","key":"丁青县","lang":"zh-hans","lname":"Dêngqên Xian","zipex":"855700"}
+data/CN/西藏/昌都地区/八宿县={"id":"data/CN/西藏/昌都地区/八宿县","key":"八宿县","lang":"zh-hans","lname":"Baxoi Xian","zipex":"854600"}
+data/CN/西藏/昌都地区/察雅县={"id":"data/CN/西藏/昌都地区/察雅县","key":"察雅县","lang":"zh-hans","lname":"Chagyab Xian","zipex":"854300"}
+data/CN/西藏/昌都地区/左贡县={"id":"data/CN/西藏/昌都地区/左贡县","key":"左贡县","lang":"zh-hans","lname":"Zogang Xian","zipex":"854400"}
+data/CN/西藏/昌都地区/昌都县={"id":"data/CN/西藏/昌都地区/昌都县","key":"昌都县","lang":"zh-hans","lname":"Qamdo Xian","zipex":"854000"}
+data/CN/西藏/昌都地区/江达县={"id":"data/CN/西藏/昌都地区/江达县","key":"江达县","lang":"zh-hans","lname":"Jomda Xian","zipex":"854100"}
+data/CN/西藏/昌都地区/洛隆县={"id":"data/CN/西藏/昌都地区/洛隆县","key":"洛隆县","lang":"zh-hans","lname":"Lhorong Xian","zipex":"855400"}
+data/CN/西藏/昌都地区/类乌齐县={"id":"data/CN/西藏/昌都地区/类乌齐县","key":"类乌齐县","lang":"zh-hans","lname":"Riwoq Xian","zipex":"855600"}
+data/CN/西藏/昌都地区/芒康县={"id":"data/CN/西藏/昌都地区/芒康县","key":"芒康县","lang":"zh-hans","lname":"Mangkam Xian","zipex":"854500"}
+data/CN/西藏/昌都地区/贡觉县={"id":"data/CN/西藏/昌都地区/贡觉县","key":"贡觉县","lang":"zh-hans","lname":"Konjo Xian","zipex":"854200"}
+data/CN/西藏/昌都地区/边坝县={"id":"data/CN/西藏/昌都地区/边坝县","key":"边坝县","lang":"zh-hans","lname":"Banbar Xian","zipex":"855500"}
+data/CN/西藏/林芝地区={"id":"data/CN/西藏/林芝地区","key":"林芝地区","lang":"zh-hans","lname":"Nyingchi Diqu","zipex":"860000","sub_keys":"波密县~察隅县~工布江达县~朗县~林芝县~米林县~墨脱县","sub_lnames":"Bomi (Bowo) Xian~Zayü Xian~Gongbo'gyamda Xian~Nang Xian~Nyingchi Xian~Mainling Xian~Mêtog Xian","sub_zipexs":"860300~860600~860200~860400~860100~860500~860700"}
+data/CN/西藏/林芝地区/墨脱县={"id":"data/CN/西藏/林芝地区/墨脱县","key":"墨脱县","lang":"zh-hans","lname":"Mêtog Xian","zipex":"860700"}
+data/CN/西藏/林芝地区/察隅县={"id":"data/CN/西藏/林芝地区/察隅县","key":"察隅县","lang":"zh-hans","lname":"Zayü Xian","zipex":"860600"}
+data/CN/西藏/林芝地区/工布江达县={"id":"data/CN/西藏/林芝地区/工布江达县","key":"工布江达县","lang":"zh-hans","lname":"Gongbo'gyamda Xian","zipex":"860200"}
+data/CN/西藏/林芝地区/朗县={"id":"data/CN/西藏/林芝地区/朗县","key":"朗县","lang":"zh-hans","lname":"Nang Xian","zipex":"860400"}
+data/CN/西藏/林芝地区/林芝县={"id":"data/CN/西藏/林芝地区/林芝县","key":"林芝县","lang":"zh-hans","lname":"Nyingchi Xian","zipex":"860100"}
+data/CN/西藏/林芝地区/波密县={"id":"data/CN/西藏/林芝地区/波密县","key":"波密县","lang":"zh-hans","lname":"Bomi (Bowo) Xian","zipex":"860300"}
+data/CN/西藏/林芝地区/米林县={"id":"data/CN/西藏/林芝地区/米林县","key":"米林县","lang":"zh-hans","lname":"Mainling Xian","zipex":"860500"}
+data/CN/西藏/那曲地区={"id":"data/CN/西藏/那曲地区","key":"那曲地区","lang":"zh-hans","lname":"Nagqu Diqu","zipex":"852000","sub_keys":"安多县~巴青县~班戈县~比如县~嘉黎县~那曲县~尼玛县~聂荣县~申扎县~索县","sub_lnames":"Amdo Xian~Baqên Xian~Bangoin Xian~Biru Xian~Lhari Xian~Nagqu Xian~Nyima Xian~Nyainrong Xian~Xainza Xian~Sog Xian","sub_zipexs":"853400~852100~852500~852300~852400~852000~853200~853500~853100~852200"}
+data/CN/西藏/那曲地区/嘉黎县={"id":"data/CN/西藏/那曲地区/嘉黎县","key":"嘉黎县","lang":"zh-hans","lname":"Lhari Xian","zipex":"852400"}
+data/CN/西藏/那曲地区/安多县={"id":"data/CN/西藏/那曲地区/安多县","key":"安多县","lang":"zh-hans","lname":"Amdo Xian","zipex":"853400"}
+data/CN/西藏/那曲地区/尼玛县={"id":"data/CN/西藏/那曲地区/尼玛县","key":"尼玛县","lang":"zh-hans","lname":"Nyima Xian","zipex":"853200"}
+data/CN/西藏/那曲地区/巴青县={"id":"data/CN/西藏/那曲地区/巴青县","key":"巴青县","lang":"zh-hans","lname":"Baqên Xian","zipex":"852100"}
+data/CN/西藏/那曲地区/比如县={"id":"data/CN/西藏/那曲地区/比如县","key":"比如县","lang":"zh-hans","lname":"Biru Xian","zipex":"852300"}
+data/CN/西藏/那曲地区/班戈县={"id":"data/CN/西藏/那曲地区/班戈县","key":"班戈县","lang":"zh-hans","lname":"Bangoin Xian","zipex":"852500"}
+data/CN/西藏/那曲地区/申扎县={"id":"data/CN/西藏/那曲地区/申扎县","key":"申扎县","lang":"zh-hans","lname":"Xainza Xian","zipex":"853100"}
+data/CN/西藏/那曲地区/索县={"id":"data/CN/西藏/那曲地区/索县","key":"索县","lang":"zh-hans","lname":"Sog Xian","zipex":"852200"}
+data/CN/西藏/那曲地区/聂荣县={"id":"data/CN/西藏/那曲地区/聂荣县","key":"聂荣县","lang":"zh-hans","lname":"Nyainrong Xian","zipex":"853500"}
+data/CN/西藏/那曲地区/那曲县={"id":"data/CN/西藏/那曲地区/那曲县","key":"那曲县","lang":"zh-hans","lname":"Nagqu Xian","zipex":"852000"}
+data/CN/西藏/阿里地区={"id":"data/CN/西藏/阿里地区","key":"阿里地区","lang":"zh-hans","lname":"Ngari Diqu","zipex":"859000","sub_keys":"措勤县~噶尔县~改则县~革吉县~普兰县~日土县~札达县","sub_lnames":"Coqên Xian~Gar Xian~Gêrzê Xian~Gê'gyai Xian~Burang Xian~Rutog Xian~Zanda Xian","sub_zipexs":"859300~859001~859200~859100~859500~859700~859600"}
+data/CN/西藏/阿里地区/噶尔县={"id":"data/CN/西藏/阿里地区/噶尔县","key":"噶尔县","lang":"zh-hans","lname":"Gar Xian","zipex":"859001"}
+data/CN/西藏/阿里地区/措勤县={"id":"data/CN/西藏/阿里地区/措勤县","key":"措勤县","lang":"zh-hans","lname":"Coqên Xian","zipex":"859300"}
+data/CN/西藏/阿里地区/改则县={"id":"data/CN/西藏/阿里地区/改则县","key":"改则县","lang":"zh-hans","lname":"Gêrzê Xian","zipex":"859200"}
+data/CN/西藏/阿里地区/日土县={"id":"data/CN/西藏/阿里地区/日土县","key":"日土县","lang":"zh-hans","lname":"Rutog Xian","zipex":"859700"}
+data/CN/西藏/阿里地区/普兰县={"id":"data/CN/西藏/阿里地区/普兰县","key":"普兰县","lang":"zh-hans","lname":"Burang Xian","zipex":"859500"}
+data/CN/西藏/阿里地区/札达县={"id":"data/CN/西藏/阿里地区/札达县","key":"札达县","lang":"zh-hans","lname":"Zanda Xian","zipex":"859600"}
+data/CN/西藏/阿里地区/革吉县={"id":"data/CN/西藏/阿里地区/革吉县","key":"革吉县","lang":"zh-hans","lname":"Gê'gyai Xian","zipex":"859100"}
+data/CN/贵州省={"id":"data/CN/贵州省","key":"贵州省","lang":"zh-hans","lname":"Guizhou Sheng","isoid":"52","sub_keys":"安顺市~毕节地区~贵阳市~六盘水市~黔东南苗族侗族自治州~黔南布依族苗族自治州~黔西南布依族苗族自治州~铜仁地区~遵义市","sub_lnames":"Anshun Shi~Bijie Diqu~Guiyang Shi~Lupanshui Shi~Qiandongnan Zhou~Qiannan Zhou~Qianxinan Zhou~Tongren Diqu~Zunyi Shi","sub_zipexs":"561000~551700~550003~553001~556000~558000~562400~554300~563000","sub_mores":"true~true~true~true~true~true~true~true~true","sub_lfnames":"~~~~Qiandongnan Miaozu Dongzu Zizhizhou~Qiannan Buyeizu Miaozu Zizhizhou~Qianxinan Buyeizu Miaozu Zizhizhou~~"}
+data/CN/贵州省/六盘水市={"id":"data/CN/贵州省/六盘水市","key":"六盘水市","lang":"zh-hans","lname":"Lupanshui Shi","zipex":"553001","sub_keys":"六枝特区~盘县~水城县~钟山区","sub_lnames":"Liuzhi Tequ~Pan Xian~Shuicheng Xian~Zhongshan Qu","sub_zipexs":"553400~561611~553000~553000"}
+data/CN/贵州省/六盘水市/六枝特区={"id":"data/CN/贵州省/六盘水市/六枝特区","key":"六枝特区","lang":"zh-hans","lname":"Liuzhi Tequ","zipex":"553400"}
+data/CN/贵州省/六盘水市/水城县={"id":"data/CN/贵州省/六盘水市/水城县","key":"水城县","lang":"zh-hans","lname":"Shuicheng Xian","zipex":"553000"}
+data/CN/贵州省/六盘水市/盘县={"id":"data/CN/贵州省/六盘水市/盘县","key":"盘县","lang":"zh-hans","lname":"Pan Xian","zipex":"561611"}
+data/CN/贵州省/六盘水市/钟山区={"id":"data/CN/贵州省/六盘水市/钟山区","key":"钟山区","lang":"zh-hans","lname":"Zhongshan Qu","zipex":"553000"}
+data/CN/贵州省/安顺市={"id":"data/CN/贵州省/安顺市","key":"安顺市","lang":"zh-hans","lname":"Anshun Shi","zipex":"561000","sub_keys":"关岭布依族苗族自治县~平坝县~普定县~西秀区~镇宁布依族苗族自治县~紫云苗族布依族自治县","sub_lnames":"Guanling Xian~Pingba Xian~Puding Xian~Xixiu Qu~Zhenning Xian~Ziyun Xian","sub_zipexs":"561300~561100~562100~561000~561200~550800","sub_lfnames":"Guanling Buyeizu Miaozu Zizhixian~~~~Zhenning Buyeizu Miaozu Zizhixian~Ziyun Miaozu Buyeizu Zizhixian"}
+data/CN/贵州省/安顺市/关岭布依族苗族自治县={"id":"data/CN/贵州省/安顺市/关岭布依族苗族自治县","key":"关岭布依族苗族自治县","lang":"zh-hans","lname":"Guanling Xian","zipex":"561300","lfname":"Guanling Buyeizu Miaozu Zizhixian"}
+data/CN/贵州省/安顺市/平坝县={"id":"data/CN/贵州省/安顺市/平坝县","key":"平坝县","lang":"zh-hans","lname":"Pingba Xian","zipex":"561100"}
+data/CN/贵州省/安顺市/普定县={"id":"data/CN/贵州省/安顺市/普定县","key":"普定县","lang":"zh-hans","lname":"Puding Xian","zipex":"562100"}
+data/CN/贵州省/安顺市/紫云苗族布依族自治县={"id":"data/CN/贵州省/安顺市/紫云苗族布依族自治县","key":"紫云苗族布依族自治县","lang":"zh-hans","lname":"Ziyun Xian","zipex":"550800","lfname":"Ziyun Miaozu Buyeizu Zizhixian"}
+data/CN/贵州省/安顺市/西秀区={"id":"data/CN/贵州省/安顺市/西秀区","key":"西秀区","lang":"zh-hans","lname":"Xixiu Qu","zipex":"561000"}
+data/CN/贵州省/安顺市/镇宁布依族苗族自治县={"id":"data/CN/贵州省/安顺市/镇宁布依族苗族自治县","key":"镇宁布依族苗族自治县","lang":"zh-hans","lname":"Zhenning Xian","zipex":"561200","lfname":"Zhenning Buyeizu Miaozu Zizhixian"}
+data/CN/贵州省/毕节地区={"id":"data/CN/贵州省/毕节地区","key":"毕节地区","lang":"zh-hans","lname":"Bijie Diqu","zipex":"551700","sub_keys":"毕节市~大方县~赫章县~金沙县~纳雍县~黔西县~威宁彝族回族苗族自治县~织金县","sub_lnames":"Bijie Shi~Dafang Xian~Hezhang Xian~Jinsha Xian~Nayong Xian~Qianxi Xian~Weining Xian~Zhijin Xian","sub_zipexs":"551700~551600~553200~551800~553300~551500~553100~552100","sub_lfnames":"~~~~~~Weining Yizu Huizu Miaozu Zizhixian~"}
+data/CN/贵州省/毕节地区/大方县={"id":"data/CN/贵州省/毕节地区/大方县","key":"大方县","lang":"zh-hans","lname":"Dafang Xian","zipex":"551600"}
+data/CN/贵州省/毕节地区/威宁彝族回族苗族自治县={"id":"data/CN/贵州省/毕节地区/威宁彝族回族苗族自治县","key":"威宁彝族回族苗族自治县","lang":"zh-hans","lname":"Weining Xian","zipex":"553100","lfname":"Weining Yizu Huizu Miaozu Zizhixian"}
+data/CN/贵州省/毕节地区/毕节市={"id":"data/CN/贵州省/毕节地区/毕节市","key":"毕节市","lang":"zh-hans","lname":"Bijie Shi","zipex":"551700"}
+data/CN/贵州省/毕节地区/纳雍县={"id":"data/CN/贵州省/毕节地区/纳雍县","key":"纳雍县","lang":"zh-hans","lname":"Nayong Xian","zipex":"553300"}
+data/CN/贵州省/毕节地区/织金县={"id":"data/CN/贵州省/毕节地区/织金县","key":"织金县","lang":"zh-hans","lname":"Zhijin Xian","zipex":"552100"}
+data/CN/贵州省/毕节地区/赫章县={"id":"data/CN/贵州省/毕节地区/赫章县","key":"赫章县","lang":"zh-hans","lname":"Hezhang Xian","zipex":"553200"}
+data/CN/贵州省/毕节地区/金沙县={"id":"data/CN/贵州省/毕节地区/金沙县","key":"金沙县","lang":"zh-hans","lname":"Jinsha Xian","zipex":"551800"}
+data/CN/贵州省/毕节地区/黔西县={"id":"data/CN/贵州省/毕节地区/黔西县","key":"黔西县","lang":"zh-hans","lname":"Qianxi Xian","zipex":"551500"}
+data/CN/贵州省/贵阳市={"id":"data/CN/贵州省/贵阳市","key":"贵阳市","lang":"zh-hans","lname":"Guiyang Shi","zipex":"550003","sub_keys":"白云区~花溪区~开阳县~南明区~清镇市~乌当区~息烽县~小河区~修文县~云岩区","sub_lnames":"Baiyun Qu~Huaxi Qu~Kaiyang Xian~Nanming Qu~Qingzhen Shi~Wudang Qu~Xifeng Xian~Xiaohe Qu~Xiuwen Xian~Yunyan Qu","sub_zipexs":"550014~550025~550300~550002~551400~550018~551100~550009~550200~550001"}
+data/CN/贵州省/贵阳市/乌当区={"id":"data/CN/贵州省/贵阳市/乌当区","key":"乌当区","lang":"zh-hans","lname":"Wudang Qu","zipex":"550018"}
+data/CN/贵州省/贵阳市/云岩区={"id":"data/CN/贵州省/贵阳市/云岩区","key":"云岩区","lang":"zh-hans","lname":"Yunyan Qu","zipex":"550001"}
+data/CN/贵州省/贵阳市/修文县={"id":"data/CN/贵州省/贵阳市/修文县","key":"修文县","lang":"zh-hans","lname":"Xiuwen Xian","zipex":"550200"}
+data/CN/贵州省/贵阳市/南明区={"id":"data/CN/贵州省/贵阳市/南明区","key":"南明区","lang":"zh-hans","lname":"Nanming Qu","zipex":"550002"}
+data/CN/贵州省/贵阳市/小河区={"id":"data/CN/贵州省/贵阳市/小河区","key":"小河区","lang":"zh-hans","lname":"Xiaohe Qu","zipex":"550009"}
+data/CN/贵州省/贵阳市/开阳县={"id":"data/CN/贵州省/贵阳市/开阳县","key":"开阳县","lang":"zh-hans","lname":"Kaiyang Xian","zipex":"550300"}
+data/CN/贵州省/贵阳市/息烽县={"id":"data/CN/贵州省/贵阳市/息烽县","key":"息烽县","lang":"zh-hans","lname":"Xifeng Xian","zipex":"551100"}
+data/CN/贵州省/贵阳市/清镇市={"id":"data/CN/贵州省/贵阳市/清镇市","key":"清镇市","lang":"zh-hans","lname":"Qingzhen Shi","zipex":"551400"}
+data/CN/贵州省/贵阳市/白云区={"id":"data/CN/贵州省/贵阳市/白云区","key":"白云区","lang":"zh-hans","lname":"Baiyun Qu","zipex":"550014"}
+data/CN/贵州省/贵阳市/花溪区={"id":"data/CN/贵州省/贵阳市/花溪区","key":"花溪区","lang":"zh-hans","lname":"Huaxi Qu","zipex":"550025"}
+data/CN/贵州省/遵义市={"id":"data/CN/贵州省/遵义市","key":"遵义市","lang":"zh-hans","lname":"Zunyi Shi","zipex":"563000","sub_keys":"赤水市~道真仡佬族苗族自治县~凤冈县~红花岗区~汇川区~湄潭县~仁怀市~绥阳县~桐梓县~务川仡佬族苗族自治县~习水县~余庆县~正安县~遵义县","sub_lnames":"Chishui Shi~Daozhen Xian~Fenggang Xian~Honghuagang Qu~Huichuan Qu~Meitan Xian~Renhuai Shi~Suiyang Xian~Tongzi Xian~Wuchuan Xian~Xishui Xian~Yuqing Xian~Zheng'an Xian~Zunyi Xian","sub_zipexs":"564700~563500~564200~563000~563000~564100~564500~563300~563200~564300~564600~564400~563400~563100","sub_lfnames":"~Daozhen Gelaozu Miaozu Zizhixian~~~~~~~~Wuchuan Gelaozu Miaozu Zizhixian~~~~"}
+data/CN/贵州省/遵义市/习水县={"id":"data/CN/贵州省/遵义市/习水县","key":"习水县","lang":"zh-hans","lname":"Xishui Xian","zipex":"564600"}
+data/CN/贵州省/遵义市/仁怀市={"id":"data/CN/贵州省/遵义市/仁怀市","key":"仁怀市","lang":"zh-hans","lname":"Renhuai Shi","zipex":"564500"}
+data/CN/贵州省/遵义市/余庆县={"id":"data/CN/贵州省/遵义市/余庆县","key":"余庆县","lang":"zh-hans","lname":"Yuqing Xian","zipex":"564400"}
+data/CN/贵州省/遵义市/凤冈县={"id":"data/CN/贵州省/遵义市/凤冈县","key":"凤冈县","lang":"zh-hans","lname":"Fenggang Xian","zipex":"564200"}
+data/CN/贵州省/遵义市/务川仡佬族苗族自治县={"id":"data/CN/贵州省/遵义市/务川仡佬族苗族自治县","key":"务川仡佬族苗族自治县","lang":"zh-hans","lname":"Wuchuan Xian","zipex":"564300","lfname":"Wuchuan Gelaozu Miaozu Zizhixian"}
+data/CN/贵州省/遵义市/桐梓县={"id":"data/CN/贵州省/遵义市/桐梓县","key":"桐梓县","lang":"zh-hans","lname":"Tongzi Xian","zipex":"563200"}
+data/CN/贵州省/遵义市/正安县={"id":"data/CN/贵州省/遵义市/正安县","key":"正安县","lang":"zh-hans","lname":"Zheng'an Xian","zipex":"563400"}
+data/CN/贵州省/遵义市/汇川区={"id":"data/CN/贵州省/遵义市/汇川区","key":"汇川区","lang":"zh-hans","lname":"Huichuan Qu","zipex":"563000"}
+data/CN/贵州省/遵义市/湄潭县={"id":"data/CN/贵州省/遵义市/湄潭县","key":"湄潭县","lang":"zh-hans","lname":"Meitan Xian","zipex":"564100"}
+data/CN/贵州省/遵义市/红花岗区={"id":"data/CN/贵州省/遵义市/红花岗区","key":"红花岗区","lang":"zh-hans","lname":"Honghuagang Qu","zipex":"563000"}
+data/CN/贵州省/遵义市/绥阳县={"id":"data/CN/贵州省/遵义市/绥阳县","key":"绥阳县","lang":"zh-hans","lname":"Suiyang Xian","zipex":"563300"}
+data/CN/贵州省/遵义市/赤水市={"id":"data/CN/贵州省/遵义市/赤水市","key":"赤水市","lang":"zh-hans","lname":"Chishui Shi","zipex":"564700"}
+data/CN/贵州省/遵义市/道真仡佬族苗族自治县={"id":"data/CN/贵州省/遵义市/道真仡佬族苗族自治县","key":"道真仡佬族苗族自治县","lang":"zh-hans","lname":"Daozhen Xian","zipex":"563500","lfname":"Daozhen Gelaozu Miaozu Zizhixian"}
+data/CN/贵州省/遵义市/遵义县={"id":"data/CN/贵州省/遵义市/遵义县","key":"遵义县","lang":"zh-hans","lname":"Zunyi Xian","zipex":"563100"}
+data/CN/贵州省/铜仁地区={"id":"data/CN/贵州省/铜仁地区","key":"铜仁地区","lang":"zh-hans","lname":"Tongren Diqu","zipex":"554300","sub_keys":"德江县~江口县~石阡县~思南县~松桃苗族自治县~铜仁市~万山特区~沿河土家族自治县~印江土家族苗族自治县~玉屏侗族自治县","sub_lnames":"Dejiang Xian~Jiangkou Xian~Shiqian Xian~Sinan Xian~Songtao Xian~Tongren Shi~Wanshan Tequ~Yanhe Xian~Yinjiang Xian~Yuping Xian","sub_zipexs":"565200~554400~555100~565100~554100~554300~554200~565300~555200~554000","sub_lfnames":"~~~~Songtao Miaozu Zizhixian~~~Yanhe Tujiazu Zizhixian~Yinjiang Tujiazu Miaozu Zizhixian~Yuping Dongzu Zizhixian"}
+data/CN/贵州省/铜仁地区/万山特区={"id":"data/CN/贵州省/铜仁地区/万山特区","key":"万山特区","lang":"zh-hans","lname":"Wanshan Tequ","zipex":"554200"}
+data/CN/贵州省/铜仁地区/印江土家族苗族自治县={"id":"data/CN/贵州省/铜仁地区/印江土家族苗族自治县","key":"印江土家族苗族自治县","lang":"zh-hans","lname":"Yinjiang Xian","zipex":"555200","lfname":"Yinjiang Tujiazu Miaozu Zizhixian"}
+data/CN/贵州省/铜仁地区/德江县={"id":"data/CN/贵州省/铜仁地区/德江县","key":"德江县","lang":"zh-hans","lname":"Dejiang Xian","zipex":"565200"}
+data/CN/贵州省/铜仁地区/思南县={"id":"data/CN/贵州省/铜仁地区/思南县","key":"思南县","lang":"zh-hans","lname":"Sinan Xian","zipex":"565100"}
+data/CN/贵州省/铜仁地区/松桃苗族自治县={"id":"data/CN/贵州省/铜仁地区/松桃苗族自治县","key":"松桃苗族自治县","lang":"zh-hans","lname":"Songtao Xian","zipex":"554100","lfname":"Songtao Miaozu Zizhixian"}
+data/CN/贵州省/铜仁地区/江口县={"id":"data/CN/贵州省/铜仁地区/江口县","key":"江口县","lang":"zh-hans","lname":"Jiangkou Xian","zipex":"554400"}
+data/CN/贵州省/铜仁地区/沿河土家族自治县={"id":"data/CN/贵州省/铜仁地区/沿河土家族自治县","key":"沿河土家族自治县","lang":"zh-hans","lname":"Yanhe Xian","zipex":"565300","lfname":"Yanhe Tujiazu Zizhixian"}
+data/CN/贵州省/铜仁地区/玉屏侗族自治县={"id":"data/CN/贵州省/铜仁地区/玉屏侗族自治县","key":"玉屏侗族自治县","lang":"zh-hans","lname":"Yuping Xian","zipex":"554000","lfname":"Yuping Dongzu Zizhixian"}
+data/CN/贵州省/铜仁地区/石阡县={"id":"data/CN/贵州省/铜仁地区/石阡县","key":"石阡县","lang":"zh-hans","lname":"Shiqian Xian","zipex":"555100"}
+data/CN/贵州省/铜仁地区/铜仁市={"id":"data/CN/贵州省/铜仁地区/铜仁市","key":"铜仁市","lang":"zh-hans","lname":"Tongren Shi","zipex":"554300"}
+data/CN/贵州省/黔东南苗族侗族自治州={"id":"data/CN/贵州省/黔东南苗族侗族自治州","key":"黔东南苗族侗族自治州","lang":"zh-hans","lname":"Qiandongnan Zhou","zipex":"556000","lfname":"Qiandongnan Miaozu Dongzu Zizhizhou","sub_keys":"岑巩县~从江县~丹寨县~黄平县~剑河县~锦屏县~凯里市~雷山县~黎平县~麻江县~榕江县~三穗县~施秉县~台江县~天柱县~镇远县","sub_lnames":"Cengong Xian~Congjiang Xian~Danzhai Xian~Huangping Xian~Jianhe Xian~Jinping Xian~Kaili Shi~Leishan Xian~Liping Xian~Majiang Xian~Rongjiang Xian~Sansui Xian~Shibing Xian~Taijiang Xian~Tianzhu Xian~Zhenyuan Xian","sub_zipexs":"557800~557400~557500~556100~556400~556700~556000~557100~557300~557600~557200~556500~556200~556300~556600~557700"}
+data/CN/贵州省/黔东南苗族侗族自治州/三穗县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/三穗县","key":"三穗县","lang":"zh-hans","lname":"Sansui Xian","zipex":"556500"}
+data/CN/贵州省/黔东南苗族侗族自治州/丹寨县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/丹寨县","key":"丹寨县","lang":"zh-hans","lname":"Danzhai Xian","zipex":"557500"}
+data/CN/贵州省/黔东南苗族侗族自治州/从江县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/从江县","key":"从江县","lang":"zh-hans","lname":"Congjiang Xian","zipex":"557400"}
+data/CN/贵州省/黔东南苗族侗族自治州/凯里市={"id":"data/CN/贵州省/黔东南苗族侗族自治州/凯里市","key":"凯里市","lang":"zh-hans","lname":"Kaili Shi","zipex":"556000"}
+data/CN/贵州省/黔东南苗族侗族自治州/剑河县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/剑河县","key":"剑河县","lang":"zh-hans","lname":"Jianhe Xian","zipex":"556400"}
+data/CN/贵州省/黔东南苗族侗族自治州/台江县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/台江县","key":"台江县","lang":"zh-hans","lname":"Taijiang Xian","zipex":"556300"}
+data/CN/贵州省/黔东南苗族侗族自治州/天柱县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/天柱县","key":"天柱县","lang":"zh-hans","lname":"Tianzhu Xian","zipex":"556600"}
+data/CN/贵州省/黔东南苗族侗族自治州/岑巩县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/岑巩县","key":"岑巩县","lang":"zh-hans","lname":"Cengong Xian","zipex":"557800"}
+data/CN/贵州省/黔东南苗族侗族自治州/施秉县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/施秉县","key":"施秉县","lang":"zh-hans","lname":"Shibing Xian","zipex":"556200"}
+data/CN/贵州省/黔东南苗族侗族自治州/榕江县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/榕江县","key":"榕江县","lang":"zh-hans","lname":"Rongjiang Xian","zipex":"557200"}
+data/CN/贵州省/黔东南苗族侗族自治州/锦屏县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/锦屏县","key":"锦屏县","lang":"zh-hans","lname":"Jinping Xian","zipex":"556700"}
+data/CN/贵州省/黔东南苗族侗族自治州/镇远县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/镇远县","key":"镇远县","lang":"zh-hans","lname":"Zhenyuan Xian","zipex":"557700"}
+data/CN/贵州省/黔东南苗族侗族自治州/雷山县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/雷山县","key":"雷山县","lang":"zh-hans","lname":"Leishan Xian","zipex":"557100"}
+data/CN/贵州省/黔东南苗族侗族自治州/麻江县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/麻江县","key":"麻江县","lang":"zh-hans","lname":"Majiang Xian","zipex":"557600"}
+data/CN/贵州省/黔东南苗族侗族自治州/黄平县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/黄平县","key":"黄平县","lang":"zh-hans","lname":"Huangping Xian","zipex":"556100"}
+data/CN/贵州省/黔东南苗族侗族自治州/黎平县={"id":"data/CN/贵州省/黔东南苗族侗族自治州/黎平县","key":"黎平县","lang":"zh-hans","lname":"Liping Xian","zipex":"557300"}
+data/CN/贵州省/黔南布依族苗族自治州={"id":"data/CN/贵州省/黔南布依族苗族自治州","key":"黔南布依族苗族自治州","lang":"zh-hans","lname":"Qiannan Zhou","zipex":"558000","lfname":"Qiannan Buyeizu Miaozu Zizhizhou","sub_keys":"长顺县~都匀市~独山县~福泉市~贵定县~惠水县~荔波县~龙里县~罗甸县~平塘县~三都水族自治县~瓮安县","sub_lnames":"Changshun Xian~Duyun Shi~Dushan Xian~Fuquan Shi~Guiding Xian~Huishui Xian~Libo Xian~Longli Xian~Luodian Xian~Pingtang Xian~Sandu Xian~Weng'an Xian","sub_zipexs":"550700~558000~558200~550500~551300~550600~558400~551200~550100~558300~558100~550400","sub_lfnames":"~~~~~~~~~~Sandu Suizu Zizhixian~"}
+data/CN/贵州省/黔南布依族苗族自治州/三都水族自治县={"id":"data/CN/贵州省/黔南布依族苗族自治州/三都水族自治县","key":"三都水族自治县","lang":"zh-hans","lname":"Sandu Xian","zipex":"558100","lfname":"Sandu Suizu Zizhixian"}
+data/CN/贵州省/黔南布依族苗族自治州/平塘县={"id":"data/CN/贵州省/黔南布依族苗族自治州/平塘县","key":"平塘县","lang":"zh-hans","lname":"Pingtang Xian","zipex":"558300"}
+data/CN/贵州省/黔南布依族苗族自治州/惠水县={"id":"data/CN/贵州省/黔南布依族苗族自治州/惠水县","key":"惠水县","lang":"zh-hans","lname":"Huishui Xian","zipex":"550600"}
+data/CN/贵州省/黔南布依族苗族自治州/独山县={"id":"data/CN/贵州省/黔南布依族苗族自治州/独山县","key":"独山县","lang":"zh-hans","lname":"Dushan Xian","zipex":"558200"}
+data/CN/贵州省/黔南布依族苗族自治州/瓮安县={"id":"data/CN/贵州省/黔南布依族苗族自治州/瓮安县","key":"瓮安县","lang":"zh-hans","lname":"Weng'an Xian","zipex":"550400"}
+data/CN/贵州省/黔南布依族苗族自治州/福泉市={"id":"data/CN/贵州省/黔南布依族苗族自治州/福泉市","key":"福泉市","lang":"zh-hans","lname":"Fuquan Shi","zipex":"550500"}
+data/CN/贵州省/黔南布依族苗族自治州/罗甸县={"id":"data/CN/贵州省/黔南布依族苗族自治州/罗甸县","key":"罗甸县","lang":"zh-hans","lname":"Luodian Xian","zipex":"550100"}
+data/CN/贵州省/黔南布依族苗族自治州/荔波县={"id":"data/CN/贵州省/黔南布依族苗族自治州/荔波县","key":"荔波县","lang":"zh-hans","lname":"Libo Xian","zipex":"558400"}
+data/CN/贵州省/黔南布依族苗族自治州/贵定县={"id":"data/CN/贵州省/黔南布依族苗族自治州/贵定县","key":"贵定县","lang":"zh-hans","lname":"Guiding Xian","zipex":"551300"}
+data/CN/贵州省/黔南布依族苗族自治州/都匀市={"id":"data/CN/贵州省/黔南布依族苗族自治州/都匀市","key":"都匀市","lang":"zh-hans","lname":"Duyun Shi","zipex":"558000"}
+data/CN/贵州省/黔南布依族苗族自治州/长顺县={"id":"data/CN/贵州省/黔南布依族苗族自治州/长顺县","key":"长顺县","lang":"zh-hans","lname":"Changshun Xian","zipex":"550700"}
+data/CN/贵州省/黔南布依族苗族自治州/龙里县={"id":"data/CN/贵州省/黔南布依族苗族自治州/龙里县","key":"龙里县","lang":"zh-hans","lname":"Longli Xian","zipex":"551200"}
+data/CN/贵州省/黔西南布依族苗族自治州={"id":"data/CN/贵州省/黔西南布依族苗族自治州","key":"黔西南布依族苗族自治州","lang":"zh-hans","lname":"Qianxinan Zhou","zipex":"562400","lfname":"Qianxinan Buyeizu Miaozu Zizhizhou","sub_keys":"安龙县~册亨县~普安县~晴隆县~望谟县~兴仁县~兴义市~贞丰县","sub_lnames":"Anlong Xian~Ceheng Xian~Pu'an Xian~Qinglong Xian~Wangmo Xian~Xingren Xian~Xingyi Shi~Zhenfeng Xian","sub_zipexs":"552400~552200~561500~561400~552300~562300~562400~562200"}
+data/CN/贵州省/黔西南布依族苗族自治州/兴义市={"id":"data/CN/贵州省/黔西南布依族苗族自治州/兴义市","key":"兴义市","lang":"zh-hans","lname":"Xingyi Shi","zipex":"562400"}
+data/CN/贵州省/黔西南布依族苗族自治州/兴仁县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/兴仁县","key":"兴仁县","lang":"zh-hans","lname":"Xingren Xian","zipex":"562300"}
+data/CN/贵州省/黔西南布依族苗族自治州/册亨县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/册亨县","key":"册亨县","lang":"zh-hans","lname":"Ceheng Xian","zipex":"552200"}
+data/CN/贵州省/黔西南布依族苗族自治州/安龙县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/安龙县","key":"安龙县","lang":"zh-hans","lname":"Anlong Xian","zipex":"552400"}
+data/CN/贵州省/黔西南布依族苗族自治州/普安县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/普安县","key":"普安县","lang":"zh-hans","lname":"Pu'an Xian","zipex":"561500"}
+data/CN/贵州省/黔西南布依族苗族自治州/晴隆县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/晴隆县","key":"晴隆县","lang":"zh-hans","lname":"Qinglong Xian","zipex":"561400"}
+data/CN/贵州省/黔西南布依族苗族自治州/望谟县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/望谟县","key":"望谟县","lang":"zh-hans","lname":"Wangmo Xian","zipex":"552300"}
+data/CN/贵州省/黔西南布依族苗族自治州/贞丰县={"id":"data/CN/贵州省/黔西南布依族苗族自治州/贞丰县","key":"贞丰县","lang":"zh-hans","lname":"Zhenfeng Xian","zipex":"562200"}
+data/CN/辽宁省={"id":"data/CN/辽宁省","key":"辽宁省","lang":"zh-hans","lname":"Liaoning Sheng","isoid":"21","sub_keys":"鞍山市~本溪市~朝阳市~大连市~丹东市~抚顺市~阜新市~葫芦岛市~锦州市~辽阳市~盘锦市~沈阳市~铁岭市~营口市","sub_lnames":"Anshan Shi~Benxi Shi~Chaoyang Shi~Dalian Shi~Dandong Shi~Fushun Shi~Fuxin Shi~Huludao Shi~Jinzhou Shi~Liaoyang Shi~Panjin Shi~Shenyang Shi~Tieling Shi~Yingkou Shi","sub_zipexs":"114001~117000~122000~116011~118000~113008~123000~125000~121000~111000~124010~110013~112000~115003","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/辽宁省/丹东市={"id":"data/CN/辽宁省/丹东市","key":"丹东市","lang":"zh-hans","lname":"Dandong Shi","zipex":"118000","sub_keys":"东港市~凤城市~宽甸满族自治县~元宝区~振安区~振兴区","sub_lnames":"Donggang Shi~Fengcheng Shi~Kuandian Xian~Yuanbao Qu~Zhen'an Qu~Zhenxing Qu","sub_zipexs":"118300~118100~118200~118000~118001~118002","sub_lfnames":"~~Kuandian Manzu Zizhixian~~~"}
+data/CN/辽宁省/丹东市/东港市={"id":"data/CN/辽宁省/丹东市/东港市","key":"东港市","lang":"zh-hans","lname":"Donggang Shi","zipex":"118300"}
+data/CN/辽宁省/丹东市/元宝区={"id":"data/CN/辽宁省/丹东市/元宝区","key":"元宝区","lang":"zh-hans","lname":"Yuanbao Qu","zipex":"118000"}
+data/CN/辽宁省/丹东市/凤城市={"id":"data/CN/辽宁省/丹东市/凤城市","key":"凤城市","lang":"zh-hans","lname":"Fengcheng Shi","zipex":"118100"}
+data/CN/辽宁省/丹东市/宽甸满族自治县={"id":"data/CN/辽宁省/丹东市/宽甸满族自治县","key":"宽甸满族自治县","lang":"zh-hans","lname":"Kuandian Xian","zipex":"118200","lfname":"Kuandian Manzu Zizhixian"}
+data/CN/辽宁省/丹东市/振兴区={"id":"data/CN/辽宁省/丹东市/振兴区","key":"振兴区","lang":"zh-hans","lname":"Zhenxing Qu","zipex":"118002"}
+data/CN/辽宁省/丹东市/振安区={"id":"data/CN/辽宁省/丹东市/振安区","key":"振安区","lang":"zh-hans","lname":"Zhen'an Qu","zipex":"118001"}
+data/CN/辽宁省/大连市={"id":"data/CN/辽宁省/大连市","key":"大连市","lang":"zh-hans","lname":"Dalian Shi","zipex":"116011","sub_keys":"长海县~甘井子区~金州区~旅顺口区~普兰店市~沙河口区~瓦房店市~西岗区~中山区~庄河市","sub_lnames":"Changhai Xian~Ganjingzi Qu~Jinzhou Qu~Lüshunkou Qu~Pulandian Shi~Shahekou Qu~Wafangdian Shi~Xigang Qu~Zhongshan Qu~Zhuanghe Shi","sub_zipexs":"116500~116033~116100~116041~116200~116021~116300~116001~116001~116400"}
+data/CN/辽宁省/大连市/中山区={"id":"data/CN/辽宁省/大连市/中山区","key":"中山区","lang":"zh-hans","lname":"Zhongshan Qu","zipex":"116001"}
+data/CN/辽宁省/大连市/庄河市={"id":"data/CN/辽宁省/大连市/庄河市","key":"庄河市","lang":"zh-hans","lname":"Zhuanghe Shi","zipex":"116400"}
+data/CN/辽宁省/大连市/旅顺口区={"id":"data/CN/辽宁省/大连市/旅顺口区","key":"旅顺口区","lang":"zh-hans","lname":"Lüshunkou Qu","zipex":"116041"}
+data/CN/辽宁省/大连市/普兰店市={"id":"data/CN/辽宁省/大连市/普兰店市","key":"普兰店市","lang":"zh-hans","lname":"Pulandian Shi","zipex":"116200"}
+data/CN/辽宁省/大连市/沙河口区={"id":"data/CN/辽宁省/大连市/沙河口区","key":"沙河口区","lang":"zh-hans","lname":"Shahekou Qu","zipex":"116021"}
+data/CN/辽宁省/大连市/瓦房店市={"id":"data/CN/辽宁省/大连市/瓦房店市","key":"瓦房店市","lang":"zh-hans","lname":"Wafangdian Shi","zipex":"116300"}
+data/CN/辽宁省/大连市/甘井子区={"id":"data/CN/辽宁省/大连市/甘井子区","key":"甘井子区","lang":"zh-hans","lname":"Ganjingzi Qu","zipex":"116033"}
+data/CN/辽宁省/大连市/西岗区={"id":"data/CN/辽宁省/大连市/西岗区","key":"西岗区","lang":"zh-hans","lname":"Xigang Qu","zipex":"116001"}
+data/CN/辽宁省/大连市/金州区={"id":"data/CN/辽宁省/大连市/金州区","key":"金州区","lang":"zh-hans","lname":"Jinzhou Qu","zipex":"116100"}
+data/CN/辽宁省/大连市/长海县={"id":"data/CN/辽宁省/大连市/长海县","key":"长海县","lang":"zh-hans","lname":"Changhai Xian","zipex":"116500"}
+data/CN/辽宁省/抚顺市={"id":"data/CN/辽宁省/抚顺市","key":"抚顺市","lang":"zh-hans","lname":"Fushun Shi","zipex":"113008","sub_keys":"东洲区~抚顺县~清原满族自治县~顺城区~望花区~新宾满族自治县~新抚区","sub_lnames":"Dongzhou Qu~Fushun Xian~Qingyuan Xian~Shuncheng Qu~Wanghua Qu~Xinbin Xian~Xinfu Qu","sub_zipexs":"113003~113006~113300~113006~113001~113200~113008","sub_lfnames":"~~Qingyuan Manzu Zizhixian~~~Xinbin Manzu Zizhixian~"}
+data/CN/辽宁省/抚顺市/东洲区={"id":"data/CN/辽宁省/抚顺市/东洲区","key":"东洲区","lang":"zh-hans","lname":"Dongzhou Qu","zipex":"113003"}
+data/CN/辽宁省/抚顺市/抚顺县={"id":"data/CN/辽宁省/抚顺市/抚顺县","key":"抚顺县","lang":"zh-hans","lname":"Fushun Xian","zipex":"113006"}
+data/CN/辽宁省/抚顺市/新宾满族自治县={"id":"data/CN/辽宁省/抚顺市/新宾满族自治县","key":"新宾满族自治县","lang":"zh-hans","lname":"Xinbin Xian","zipex":"113200","lfname":"Xinbin Manzu Zizhixian"}
+data/CN/辽宁省/抚顺市/新抚区={"id":"data/CN/辽宁省/抚顺市/新抚区","key":"新抚区","lang":"zh-hans","lname":"Xinfu Qu","zipex":"113008"}
+data/CN/辽宁省/抚顺市/望花区={"id":"data/CN/辽宁省/抚顺市/望花区","key":"望花区","lang":"zh-hans","lname":"Wanghua Qu","zipex":"113001"}
+data/CN/辽宁省/抚顺市/清原满族自治县={"id":"data/CN/辽宁省/抚顺市/清原满族自治县","key":"清原满族自治县","lang":"zh-hans","lname":"Qingyuan Xian","zipex":"113300","lfname":"Qingyuan Manzu Zizhixian"}
+data/CN/辽宁省/抚顺市/顺城区={"id":"data/CN/辽宁省/抚顺市/顺城区","key":"顺城区","lang":"zh-hans","lname":"Shuncheng Qu","zipex":"113006"}
+data/CN/辽宁省/朝阳市={"id":"data/CN/辽宁省/朝阳市","key":"朝阳市","lang":"zh-hans","lname":"Chaoyang Shi","zipex":"122000","sub_keys":"北票市~朝阳县~建平县~喀喇沁左翼蒙古族自治县~凌源市~龙城区~双塔区","sub_lnames":"Beipiao Shi~Chaoyang Xian~Jianping Xian~Harqin Zuoyi Xian~Lingyuan Shi~Longcheng Qu~Shuangta Qu","sub_zipexs":"122100~122000~122400~122300~122500~122000~122000","sub_lfnames":"~~~Harqin Zuoyi Mongolzu Zizhixian~~~"}
+data/CN/辽宁省/朝阳市/凌源市={"id":"data/CN/辽宁省/朝阳市/凌源市","key":"凌源市","lang":"zh-hans","lname":"Lingyuan Shi","zipex":"122500"}
+data/CN/辽宁省/朝阳市/北票市={"id":"data/CN/辽宁省/朝阳市/北票市","key":"北票市","lang":"zh-hans","lname":"Beipiao Shi","zipex":"122100"}
+data/CN/辽宁省/朝阳市/双塔区={"id":"data/CN/辽宁省/朝阳市/双塔区","key":"双塔区","lang":"zh-hans","lname":"Shuangta Qu","zipex":"122000"}
+data/CN/辽宁省/朝阳市/喀喇沁左翼蒙古族自治县={"id":"data/CN/辽宁省/朝阳市/喀喇沁左翼蒙古族自治县","key":"喀喇沁左翼蒙古族自治县","lang":"zh-hans","lname":"Harqin Zuoyi Xian","zipex":"122300","lfname":"Harqin Zuoyi Mongolzu Zizhixian"}
+data/CN/辽宁省/朝阳市/建平县={"id":"data/CN/辽宁省/朝阳市/建平县","key":"建平县","lang":"zh-hans","lname":"Jianping Xian","zipex":"122400"}
+data/CN/辽宁省/朝阳市/朝阳县={"id":"data/CN/辽宁省/朝阳市/朝阳县","key":"朝阳县","lang":"zh-hans","lname":"Chaoyang Xian","zipex":"122000"}
+data/CN/辽宁省/朝阳市/龙城区={"id":"data/CN/辽宁省/朝阳市/龙城区","key":"龙城区","lang":"zh-hans","lname":"Longcheng Qu","zipex":"122000"}
+data/CN/辽宁省/本溪市={"id":"data/CN/辽宁省/本溪市","key":"本溪市","lang":"zh-hans","lname":"Benxi Shi","zipex":"117000","sub_keys":"本溪满族自治县~桓仁满族自治县~明山区~南芬区~平山区~溪湖区","sub_lnames":"Benxi Xian~Huanren Xian~Mingshan Qu~Nanfen Qu~Pingshan Qu~Xihu Qu","sub_zipexs":"117100~117200~117021~117014~117000~117002","sub_lfnames":"Benxi Manzu Zizhixian~Huanren Manzu Zizhixian~~~~"}
+data/CN/辽宁省/本溪市/南芬区={"id":"data/CN/辽宁省/本溪市/南芬区","key":"南芬区","lang":"zh-hans","lname":"Nanfen Qu","zipex":"117014"}
+data/CN/辽宁省/本溪市/平山区={"id":"data/CN/辽宁省/本溪市/平山区","key":"平山区","lang":"zh-hans","lname":"Pingshan Qu","zipex":"117000"}
+data/CN/辽宁省/本溪市/明山区={"id":"data/CN/辽宁省/本溪市/明山区","key":"明山区","lang":"zh-hans","lname":"Mingshan Qu","zipex":"117021"}
+data/CN/辽宁省/本溪市/本溪满族自治县={"id":"data/CN/辽宁省/本溪市/本溪满族自治县","key":"本溪满族自治县","lang":"zh-hans","lname":"Benxi Xian","zipex":"117100","lfname":"Benxi Manzu Zizhixian"}
+data/CN/辽宁省/本溪市/桓仁满族自治县={"id":"data/CN/辽宁省/本溪市/桓仁满族自治县","key":"桓仁满族自治县","lang":"zh-hans","lname":"Huanren Xian","zipex":"117200","lfname":"Huanren Manzu Zizhixian"}
+data/CN/辽宁省/本溪市/溪湖区={"id":"data/CN/辽宁省/本溪市/溪湖区","key":"溪湖区","lang":"zh-hans","lname":"Xihu Qu","zipex":"117002"}
+data/CN/辽宁省/沈阳市={"id":"data/CN/辽宁省/沈阳市","key":"沈阳市","lang":"zh-hans","lname":"Shenyang Shi","zipex":"110013","sub_keys":"大东区~东陵区~法库县~和平区~皇姑区~康平县~辽中县~沈北新区~沈河区~苏家屯区~铁西区~新民市~于洪区","sub_lnames":"Dadong Qu~Dongling Qu~Faku Xian~Heping Qu~Huanggu Qu~Kangping Xian~Liaozhong Xian~Chenbei Xinqu~Shenhe Qu~Sujiatun Qu~Tiexi Qu~Xinmin Shi~Yuhong Qu","sub_zipexs":"110041~110015~110400~110001~110031~110400~110200~110121~110011~110101~110021~110300~110024"}
+data/CN/辽宁省/沈阳市/东陵区={"id":"data/CN/辽宁省/沈阳市/东陵区","key":"东陵区","lang":"zh-hans","lname":"Dongling Qu","zipex":"110015"}
+data/CN/辽宁省/沈阳市/于洪区={"id":"data/CN/辽宁省/沈阳市/于洪区","key":"于洪区","lang":"zh-hans","lname":"Yuhong Qu","zipex":"110024"}
+data/CN/辽宁省/沈阳市/和平区={"id":"data/CN/辽宁省/沈阳市/和平区","key":"和平区","lang":"zh-hans","lname":"Heping Qu","zipex":"110001"}
+data/CN/辽宁省/沈阳市/大东区={"id":"data/CN/辽宁省/沈阳市/大东区","key":"大东区","lang":"zh-hans","lname":"Dadong Qu","zipex":"110041"}
+data/CN/辽宁省/沈阳市/康平县={"id":"data/CN/辽宁省/沈阳市/康平县","key":"康平县","lang":"zh-hans","lname":"Kangping Xian","zipex":"110400"}
+data/CN/辽宁省/沈阳市/新民市={"id":"data/CN/辽宁省/沈阳市/新民市","key":"新民市","lang":"zh-hans","lname":"Xinmin Shi","zipex":"110300"}
+data/CN/辽宁省/沈阳市/沈北新区={"id":"data/CN/辽宁省/沈阳市/沈北新区","key":"沈北新区","lang":"zh-hans","lname":"Chenbei Xinqu","zipex":"110121"}
+data/CN/辽宁省/沈阳市/沈河区={"id":"data/CN/辽宁省/沈阳市/沈河区","key":"沈河区","lang":"zh-hans","lname":"Shenhe Qu","zipex":"110011"}
+data/CN/辽宁省/沈阳市/法库县={"id":"data/CN/辽宁省/沈阳市/法库县","key":"法库县","lang":"zh-hans","lname":"Faku Xian","zipex":"110400"}
+data/CN/辽宁省/沈阳市/皇姑区={"id":"data/CN/辽宁省/沈阳市/皇姑区","key":"皇姑区","lang":"zh-hans","lname":"Huanggu Qu","zipex":"110031"}
+data/CN/辽宁省/沈阳市/苏家屯区={"id":"data/CN/辽宁省/沈阳市/苏家屯区","key":"苏家屯区","lang":"zh-hans","lname":"Sujiatun Qu","zipex":"110101"}
+data/CN/辽宁省/沈阳市/辽中县={"id":"data/CN/辽宁省/沈阳市/辽中县","key":"辽中县","lang":"zh-hans","lname":"Liaozhong Xian","zipex":"110200"}
+data/CN/辽宁省/沈阳市/铁西区={"id":"data/CN/辽宁省/沈阳市/铁西区","key":"铁西区","lang":"zh-hans","lname":"Tiexi Qu","zipex":"110021"}
+data/CN/辽宁省/盘锦市={"id":"data/CN/辽宁省/盘锦市","key":"盘锦市","lang":"zh-hans","lname":"Panjin Shi","zipex":"124010","sub_keys":"大洼县~盘山县~双台子区~兴隆台区","sub_lnames":"Dawa Xian~Panshan Xian~Shuangtaizi Qu~Xinglongtai Qu","sub_zipexs":"124200~124000~124000~124010"}
+data/CN/辽宁省/盘锦市/兴隆台区={"id":"data/CN/辽宁省/盘锦市/兴隆台区","key":"兴隆台区","lang":"zh-hans","lname":"Xinglongtai Qu","zipex":"124010"}
+data/CN/辽宁省/盘锦市/双台子区={"id":"data/CN/辽宁省/盘锦市/双台子区","key":"双台子区","lang":"zh-hans","lname":"Shuangtaizi Qu","zipex":"124000"}
+data/CN/辽宁省/盘锦市/大洼县={"id":"data/CN/辽宁省/盘锦市/大洼县","key":"大洼县","lang":"zh-hans","lname":"Dawa Xian","zipex":"124200"}
+data/CN/辽宁省/盘锦市/盘山县={"id":"data/CN/辽宁省/盘锦市/盘山县","key":"盘山县","lang":"zh-hans","lname":"Panshan Xian","zipex":"124000"}
+data/CN/辽宁省/营口市={"id":"data/CN/辽宁省/营口市","key":"营口市","lang":"zh-hans","lname":"Yingkou Shi","zipex":"115003","sub_keys":"鲅鱼圈区~大石桥市~盖州市~老边区~西市区~站前区","sub_lnames":"Bayuquan Qu~Dashiqiao Shi~Gaizhou Shi~Laobian Qu~Xishi Qu~Zhanqian Qu","sub_zipexs":"115007~115100~115200~115005~115004~115002"}
+data/CN/辽宁省/营口市/大石桥市={"id":"data/CN/辽宁省/营口市/大石桥市","key":"大石桥市","lang":"zh-hans","lname":"Dashiqiao Shi","zipex":"115100"}
+data/CN/辽宁省/营口市/盖州市={"id":"data/CN/辽宁省/营口市/盖州市","key":"盖州市","lang":"zh-hans","lname":"Gaizhou Shi","zipex":"115200"}
+data/CN/辽宁省/营口市/站前区={"id":"data/CN/辽宁省/营口市/站前区","key":"站前区","lang":"zh-hans","lname":"Zhanqian Qu","zipex":"115002"}
+data/CN/辽宁省/营口市/老边区={"id":"data/CN/辽宁省/营口市/老边区","key":"老边区","lang":"zh-hans","lname":"Laobian Qu","zipex":"115005"}
+data/CN/辽宁省/营口市/西市区={"id":"data/CN/辽宁省/营口市/西市区","key":"西市区","lang":"zh-hans","lname":"Xishi Qu","zipex":"115004"}
+data/CN/辽宁省/营口市/鲅鱼圈区={"id":"data/CN/辽宁省/营口市/鲅鱼圈区","key":"鲅鱼圈区","lang":"zh-hans","lname":"Bayuquan Qu","zipex":"115007"}
+data/CN/辽宁省/葫芦岛市={"id":"data/CN/辽宁省/葫芦岛市","key":"葫芦岛市","lang":"zh-hans","lname":"Huludao Shi","zipex":"125000","sub_keys":"建昌县~连山区~龙港区~南票区~绥中县~兴城市","sub_lnames":"Jianchang Xian~Lianshan Qu~Longgang Qu~Nanpiao Qu~Suizhong Xian~Xingcheng Shi","sub_zipexs":"125300~125001~125004~125027~125200~125100"}
+data/CN/辽宁省/葫芦岛市/兴城市={"id":"data/CN/辽宁省/葫芦岛市/兴城市","key":"兴城市","lang":"zh-hans","lname":"Xingcheng Shi","zipex":"125100"}
+data/CN/辽宁省/葫芦岛市/南票区={"id":"data/CN/辽宁省/葫芦岛市/南票区","key":"南票区","lang":"zh-hans","lname":"Nanpiao Qu","zipex":"125027"}
+data/CN/辽宁省/葫芦岛市/建昌县={"id":"data/CN/辽宁省/葫芦岛市/建昌县","key":"建昌县","lang":"zh-hans","lname":"Jianchang Xian","zipex":"125300"}
+data/CN/辽宁省/葫芦岛市/绥中县={"id":"data/CN/辽宁省/葫芦岛市/绥中县","key":"绥中县","lang":"zh-hans","lname":"Suizhong Xian","zipex":"125200"}
+data/CN/辽宁省/葫芦岛市/连山区={"id":"data/CN/辽宁省/葫芦岛市/连山区","key":"连山区","lang":"zh-hans","lname":"Lianshan Qu","zipex":"125001"}
+data/CN/辽宁省/葫芦岛市/龙港区={"id":"data/CN/辽宁省/葫芦岛市/龙港区","key":"龙港区","lang":"zh-hans","lname":"Longgang Qu","zipex":"125004"}
+data/CN/辽宁省/辽阳市={"id":"data/CN/辽宁省/辽阳市","key":"辽阳市","lang":"zh-hans","lname":"Liaoyang Shi","zipex":"111000","sub_keys":"白塔区~灯塔市~弓长岭区~宏伟区~辽阳县~太子河区~文圣区","sub_lnames":"Baita Qu~Dengta Shi~Gongzhangling Qu~Hongwei Qu~Liaoyang Xian~Taizihe Qu~Wensheng Qu","sub_zipexs":"111000~111300~111008~111003~111200~111000~111000"}
+data/CN/辽宁省/辽阳市/太子河区={"id":"data/CN/辽宁省/辽阳市/太子河区","key":"太子河区","lang":"zh-hans","lname":"Taizihe Qu","zipex":"111000"}
+data/CN/辽宁省/辽阳市/宏伟区={"id":"data/CN/辽宁省/辽阳市/宏伟区","key":"宏伟区","lang":"zh-hans","lname":"Hongwei Qu","zipex":"111003"}
+data/CN/辽宁省/辽阳市/弓长岭区={"id":"data/CN/辽宁省/辽阳市/弓长岭区","key":"弓长岭区","lang":"zh-hans","lname":"Gongzhangling Qu","zipex":"111008"}
+data/CN/辽宁省/辽阳市/文圣区={"id":"data/CN/辽宁省/辽阳市/文圣区","key":"文圣区","lang":"zh-hans","lname":"Wensheng Qu","zipex":"111000"}
+data/CN/辽宁省/辽阳市/灯塔市={"id":"data/CN/辽宁省/辽阳市/灯塔市","key":"灯塔市","lang":"zh-hans","lname":"Dengta Shi","zipex":"111300"}
+data/CN/辽宁省/辽阳市/白塔区={"id":"data/CN/辽宁省/辽阳市/白塔区","key":"白塔区","lang":"zh-hans","lname":"Baita Qu","zipex":"111000"}
+data/CN/辽宁省/辽阳市/辽阳县={"id":"data/CN/辽宁省/辽阳市/辽阳县","key":"辽阳县","lang":"zh-hans","lname":"Liaoyang Xian","zipex":"111200"}
+data/CN/辽宁省/铁岭市={"id":"data/CN/辽宁省/铁岭市","key":"铁岭市","lang":"zh-hans","lname":"Tieling Shi","zipex":"112000","sub_keys":"昌图县~调兵山市~开原市~清河区~铁岭县~西丰县~银州区","sub_lnames":"Changtu Xian~Diaobingshan Shi~Kaiyuan Shi~Qinghe Qu~Tieling Xian~Xifeng Xian~Yinzhou Qu","sub_zipexs":"112500~112700~112300~112003~112000~112400~112000"}
+data/CN/辽宁省/铁岭市/开原市={"id":"data/CN/辽宁省/铁岭市/开原市","key":"开原市","lang":"zh-hans","lname":"Kaiyuan Shi","zipex":"112300"}
+data/CN/辽宁省/铁岭市/昌图县={"id":"data/CN/辽宁省/铁岭市/昌图县","key":"昌图县","lang":"zh-hans","lname":"Changtu Xian","zipex":"112500"}
+data/CN/辽宁省/铁岭市/清河区={"id":"data/CN/辽宁省/铁岭市/清河区","key":"清河区","lang":"zh-hans","lname":"Qinghe Qu","zipex":"112003"}
+data/CN/辽宁省/铁岭市/西丰县={"id":"data/CN/辽宁省/铁岭市/西丰县","key":"西丰县","lang":"zh-hans","lname":"Xifeng Xian","zipex":"112400"}
+data/CN/辽宁省/铁岭市/调兵山市={"id":"data/CN/辽宁省/铁岭市/调兵山市","key":"调兵山市","lang":"zh-hans","lname":"Diaobingshan Shi","zipex":"112700"}
+data/CN/辽宁省/铁岭市/铁岭县={"id":"data/CN/辽宁省/铁岭市/铁岭县","key":"铁岭县","lang":"zh-hans","lname":"Tieling Xian","zipex":"112000"}
+data/CN/辽宁省/铁岭市/银州区={"id":"data/CN/辽宁省/铁岭市/银州区","key":"银州区","lang":"zh-hans","lname":"Yinzhou Qu","zipex":"112000"}
+data/CN/辽宁省/锦州市={"id":"data/CN/辽宁省/锦州市","key":"锦州市","lang":"zh-hans","lname":"Jinzhou Shi","zipex":"121000","sub_keys":"北镇市~古塔区~黑山县~凌海市~凌河区~太和区~义县","sub_lnames":"Beizhen Shi~Guta Qu~Heishan Xian~Linghai Shi~Linghe Qu~Taihe Qu~Yi Xian","sub_zipexs":"121300~121001~121400~121200~121000~121011~121100"}
+data/CN/辽宁省/锦州市/义县={"id":"data/CN/辽宁省/锦州市/义县","key":"义县","lang":"zh-hans","lname":"Yi Xian","zipex":"121100"}
+data/CN/辽宁省/锦州市/凌河区={"id":"data/CN/辽宁省/锦州市/凌河区","key":"凌河区","lang":"zh-hans","lname":"Linghe Qu","zipex":"121000"}
+data/CN/辽宁省/锦州市/凌海市={"id":"data/CN/辽宁省/锦州市/凌海市","key":"凌海市","lang":"zh-hans","lname":"Linghai Shi","zipex":"121200"}
+data/CN/辽宁省/锦州市/北镇市={"id":"data/CN/辽宁省/锦州市/北镇市","key":"北镇市","lang":"zh-hans","lname":"Beizhen Shi","zipex":"121300"}
+data/CN/辽宁省/锦州市/古塔区={"id":"data/CN/辽宁省/锦州市/古塔区","key":"古塔区","lang":"zh-hans","lname":"Guta Qu","zipex":"121001"}
+data/CN/辽宁省/锦州市/太和区={"id":"data/CN/辽宁省/锦州市/太和区","key":"太和区","lang":"zh-hans","lname":"Taihe Qu","zipex":"121011"}
+data/CN/辽宁省/锦州市/黑山县={"id":"data/CN/辽宁省/锦州市/黑山县","key":"黑山县","lang":"zh-hans","lname":"Heishan Xian","zipex":"121400"}
+data/CN/辽宁省/阜新市={"id":"data/CN/辽宁省/阜新市","key":"阜新市","lang":"zh-hans","lname":"Fuxin Shi","zipex":"123000","sub_keys":"阜新蒙古族自治县~海州区~清河门区~太平区~细河区~新邱区~彰武县","sub_lnames":"Fuxin Xian~Haizhou Qu~Qinghemen Qu~Taiping Qu~Xihe Qu~Xinqiu Qu~Zhangwu Xian","sub_zipexs":"123100~123000~123006~123003~123000~123005~123200","sub_lfnames":"Fuxin Mongolzu Zizhixian~~~~~~"}
+data/CN/辽宁省/阜新市/太平区={"id":"data/CN/辽宁省/阜新市/太平区","key":"太平区","lang":"zh-hans","lname":"Taiping Qu","zipex":"123003"}
+data/CN/辽宁省/阜新市/彰武县={"id":"data/CN/辽宁省/阜新市/彰武县","key":"彰武县","lang":"zh-hans","lname":"Zhangwu Xian","zipex":"123200"}
+data/CN/辽宁省/阜新市/新邱区={"id":"data/CN/辽宁省/阜新市/新邱区","key":"新邱区","lang":"zh-hans","lname":"Xinqiu Qu","zipex":"123005"}
+data/CN/辽宁省/阜新市/海州区={"id":"data/CN/辽宁省/阜新市/海州区","key":"海州区","lang":"zh-hans","lname":"Haizhou Qu","zipex":"123000"}
+data/CN/辽宁省/阜新市/清河门区={"id":"data/CN/辽宁省/阜新市/清河门区","key":"清河门区","lang":"zh-hans","lname":"Qinghemen Qu","zipex":"123006"}
+data/CN/辽宁省/阜新市/细河区={"id":"data/CN/辽宁省/阜新市/细河区","key":"细河区","lang":"zh-hans","lname":"Xihe Qu","zipex":"123000"}
+data/CN/辽宁省/阜新市/阜新蒙古族自治县={"id":"data/CN/辽宁省/阜新市/阜新蒙古族自治县","key":"阜新蒙古族自治县","lang":"zh-hans","lname":"Fuxin Xian","zipex":"123100","lfname":"Fuxin Mongolzu Zizhixian"}
+data/CN/辽宁省/鞍山市={"id":"data/CN/辽宁省/鞍山市","key":"鞍山市","lang":"zh-hans","lname":"Anshan Shi","zipex":"114001","sub_keys":"海城市~立山区~千山区~台安县~铁东区~铁西区~岫岩满族自治县","sub_lnames":"Haicheng Shi~Lishan Qu~Qianshan Qu~Tai'an Xian~Tiedong Qu~Tiexi Qu~Xiuyan Xian","sub_zipexs":"114200~114031~114041~114100~114001~114014~114300","sub_lfnames":"~~~~~~Xiuyan Manzu Zizhixian"}
+data/CN/辽宁省/鞍山市/千山区={"id":"data/CN/辽宁省/鞍山市/千山区","key":"千山区","lang":"zh-hans","lname":"Qianshan Qu","zipex":"114041"}
+data/CN/辽宁省/鞍山市/台安县={"id":"data/CN/辽宁省/鞍山市/台安县","key":"台安县","lang":"zh-hans","lname":"Tai'an Xian","zipex":"114100"}
+data/CN/辽宁省/鞍山市/岫岩满族自治县={"id":"data/CN/辽宁省/鞍山市/岫岩满族自治县","key":"岫岩满族自治县","lang":"zh-hans","lname":"Xiuyan Xian","zipex":"114300","lfname":"Xiuyan Manzu Zizhixian"}
+data/CN/辽宁省/鞍山市/海城市={"id":"data/CN/辽宁省/鞍山市/海城市","key":"海城市","lang":"zh-hans","lname":"Haicheng Shi","zipex":"114200"}
+data/CN/辽宁省/鞍山市/立山区={"id":"data/CN/辽宁省/鞍山市/立山区","key":"立山区","lang":"zh-hans","lname":"Lishan Qu","zipex":"114031"}
+data/CN/辽宁省/鞍山市/铁东区={"id":"data/CN/辽宁省/鞍山市/铁东区","key":"铁东区","lang":"zh-hans","lname":"Tiedong Qu","zipex":"114001"}
+data/CN/辽宁省/鞍山市/铁西区={"id":"data/CN/辽宁省/鞍山市/铁西区","key":"铁西区","lang":"zh-hans","lname":"Tiexi Qu","zipex":"114014"}
+data/CN/重庆市={"id":"data/CN/重庆市","key":"重庆市","lang":"zh-hans","lname":"Chongqing Shi","isoid":"50","sub_keys":"巴南区~北碚区~璧山县~长寿区~城口县~大渡口区~大足区~垫江县~丰都县~奉节县~涪陵区~合川区~江北区~江津区~九龙坡区~开县~梁平县~南岸区~南川区~彭水苗族土家族自治县~綦江区~黔江区~荣昌县~沙坪坝区~石柱土家族自治县~铜梁县~潼南县~万州区~巫山县~巫溪县~武隆县~秀山土家族苗族自治县~永川区~酉阳土家族苗族自治县~渝北区~渝中区~云阳县~忠县","sub_lnames":"Banan Qu~Beibei Qu~Bishan Xian~Changshou Qu~Chengkou Xian~Dadukou Qu~Dazu Qu~Dianjiang Xian~Fengdu Xian~Fengjie Xian~Fuling Qu~Hechuan Qu~Jiangbei Qu~Jiangjin Qu~Jiulongpo Qu~Kai Xian~Liangping Xian~Nan'an Qu~Nanchuan Qu~Pengshui Xian~Qijiang Qu~Qianjiang Qu~Rongchang Xian~Shapingba Qu~Shizhu Xian~Tongliang Xian~Tongnan Xian~Wanzhou Qu~Wushan Xian~Wuxi Xian~Wulong Xian~Xiushan Xian~Yongchuan Qu~Youyang Xian~Yubei Qu~Yuzhong Qu~Yunyang Xian~Zhong Xian","sub_zipexs":"401320~400700~402760~401220~405900~400080~402360~408300~408200~404600~408000~401520~400020~402260~400050~405400~405200~400064~408400~409600~401420~409700~402460~400030~409100~402560~402660~404000~404700~405800~408500~409900~402160~409800~401120~400010~445000~443000","sub_lfnames":"~~~~~~~~~~~~~~~~~~~Pengshui Miaozu Tujiazu Zizhixian~~~~~Shizhu Tujiazu Zizhixian~~~~~~~Xiushan Tujiazu Miaozu Zizhixian~~Youyang Tujiazu Miaozu Zizhixian~~~~"}
+data/CN/重庆市/万州区={"id":"data/CN/重庆市/万州区","key":"万州区","lang":"zh-hans","lname":"Wanzhou Qu","zipex":"404000"}
+data/CN/重庆市/丰都县={"id":"data/CN/重庆市/丰都县","key":"丰都县","lang":"zh-hans","lname":"Fengdu Xian","zipex":"408200"}
+data/CN/重庆市/九龙坡区={"id":"data/CN/重庆市/九龙坡区","key":"九龙坡区","lang":"zh-hans","lname":"Jiulongpo Qu","zipex":"400050"}
+data/CN/重庆市/云阳县={"id":"data/CN/重庆市/云阳县","key":"云阳县","lang":"zh-hans","lname":"Yunyang Xian","zipex":"445000"}
+data/CN/重庆市/北碚区={"id":"data/CN/重庆市/北碚区","key":"北碚区","lang":"zh-hans","lname":"Beibei Qu","zipex":"400700"}
+data/CN/重庆市/南岸区={"id":"data/CN/重庆市/南岸区","key":"南岸区","lang":"zh-hans","lname":"Nan'an Qu","zipex":"400064"}
+data/CN/重庆市/南川区={"id":"data/CN/重庆市/南川区","key":"南川区","lang":"zh-hans","lname":"Nanchuan Qu","zipex":"408400"}
+data/CN/重庆市/合川区={"id":"data/CN/重庆市/合川区","key":"合川区","lang":"zh-hans","lname":"Hechuan Qu","zipex":"401520"}
+data/CN/重庆市/垫江县={"id":"data/CN/重庆市/垫江县","key":"垫江县","lang":"zh-hans","lname":"Dianjiang Xian","zipex":"408300"}
+data/CN/重庆市/城口县={"id":"data/CN/重庆市/城口县","key":"城口县","lang":"zh-hans","lname":"Chengkou Xian","zipex":"405900"}
+data/CN/重庆市/大渡口区={"id":"data/CN/重庆市/大渡口区","key":"大渡口区","lang":"zh-hans","lname":"Dadukou Qu","zipex":"400080"}
+data/CN/重庆市/大足区={"id":"data/CN/重庆市/大足区","key":"大足区","lang":"zh-hans","lname":"Dazu Qu","zipex":"402360"}
+data/CN/重庆市/奉节县={"id":"data/CN/重庆市/奉节县","key":"奉节县","lang":"zh-hans","lname":"Fengjie Xian","zipex":"404600"}
+data/CN/重庆市/巫山县={"id":"data/CN/重庆市/巫山县","key":"巫山县","lang":"zh-hans","lname":"Wushan Xian","zipex":"404700"}
+data/CN/重庆市/巫溪县={"id":"data/CN/重庆市/巫溪县","key":"巫溪县","lang":"zh-hans","lname":"Wuxi Xian","zipex":"405800"}
+data/CN/重庆市/巴南区={"id":"data/CN/重庆市/巴南区","key":"巴南区","lang":"zh-hans","lname":"Banan Qu","zipex":"401320"}
+data/CN/重庆市/开县={"id":"data/CN/重庆市/开县","key":"开县","lang":"zh-hans","lname":"Kai Xian","zipex":"405400"}
+data/CN/重庆市/彭水苗族土家族自治县={"id":"data/CN/重庆市/彭水苗族土家族自治县","key":"彭水苗族土家族自治县","lang":"zh-hans","lname":"Pengshui Xian","zipex":"409600","lfname":"Pengshui Miaozu Tujiazu Zizhixian"}
+data/CN/重庆市/忠县={"id":"data/CN/重庆市/忠县","key":"忠县","lang":"zh-hans","lname":"Zhong Xian","zipex":"443000"}
+data/CN/重庆市/梁平县={"id":"data/CN/重庆市/梁平县","key":"梁平县","lang":"zh-hans","lname":"Liangping Xian","zipex":"405200"}
+data/CN/重庆市/武隆县={"id":"data/CN/重庆市/武隆县","key":"武隆县","lang":"zh-hans","lname":"Wulong Xian","zipex":"408500"}
+data/CN/重庆市/永川区={"id":"data/CN/重庆市/永川区","key":"永川区","lang":"zh-hans","lname":"Yongchuan Qu","zipex":"402160"}
+data/CN/重庆市/江北区={"id":"data/CN/重庆市/江北区","key":"江北区","lang":"zh-hans","lname":"Jiangbei Qu","zipex":"400020"}
+data/CN/重庆市/江津区={"id":"data/CN/重庆市/江津区","key":"江津区","lang":"zh-hans","lname":"Jiangjin Qu","zipex":"402260"}
+data/CN/重庆市/沙坪坝区={"id":"data/CN/重庆市/沙坪坝区","key":"沙坪坝区","lang":"zh-hans","lname":"Shapingba Qu","zipex":"400030"}
+data/CN/重庆市/涪陵区={"id":"data/CN/重庆市/涪陵区","key":"涪陵区","lang":"zh-hans","lname":"Fuling Qu","zipex":"408000"}
+data/CN/重庆市/渝中区={"id":"data/CN/重庆市/渝中区","key":"渝中区","lang":"zh-hans","lname":"Yuzhong Qu","zipex":"400010"}
+data/CN/重庆市/渝北区={"id":"data/CN/重庆市/渝北区","key":"渝北区","lang":"zh-hans","lname":"Yubei Qu","zipex":"401120"}
+data/CN/重庆市/潼南县={"id":"data/CN/重庆市/潼南县","key":"潼南县","lang":"zh-hans","lname":"Tongnan Xian","zipex":"402660"}
+data/CN/重庆市/璧山县={"id":"data/CN/重庆市/璧山县","key":"璧山县","lang":"zh-hans","lname":"Bishan Xian","zipex":"402760"}
+data/CN/重庆市/石柱土家族自治县={"id":"data/CN/重庆市/石柱土家族自治县","key":"石柱土家族自治县","lang":"zh-hans","lname":"Shizhu Xian","zipex":"409100","lfname":"Shizhu Tujiazu Zizhixian"}
+data/CN/重庆市/秀山土家族苗族自治县={"id":"data/CN/重庆市/秀山土家族苗族自治县","key":"秀山土家族苗族自治县","lang":"zh-hans","lname":"Xiushan Xian","zipex":"409900","lfname":"Xiushan Tujiazu Miaozu Zizhixian"}
+data/CN/重庆市/綦江区={"id":"data/CN/重庆市/綦江区","key":"綦江区","lang":"zh-hans","lname":"Qijiang Qu","zipex":"401420"}
+data/CN/重庆市/荣昌县={"id":"data/CN/重庆市/荣昌县","key":"荣昌县","lang":"zh-hans","lname":"Rongchang Xian","zipex":"402460"}
+data/CN/重庆市/酉阳土家族苗族自治县={"id":"data/CN/重庆市/酉阳土家族苗族自治县","key":"酉阳土家族苗族自治县","lang":"zh-hans","lname":"Youyang Xian","zipex":"409800","lfname":"Youyang Tujiazu Miaozu Zizhixian"}
+data/CN/重庆市/铜梁县={"id":"data/CN/重庆市/铜梁县","key":"铜梁县","lang":"zh-hans","lname":"Tongliang Xian","zipex":"402560"}
+data/CN/重庆市/长寿区={"id":"data/CN/重庆市/长寿区","key":"长寿区","lang":"zh-hans","lname":"Changshou Qu","zipex":"401220"}
+data/CN/重庆市/黔江区={"id":"data/CN/重庆市/黔江区","key":"黔江区","lang":"zh-hans","lname":"Qianjiang Qu","zipex":"409700"}
+data/CN/陕西省={"id":"data/CN/陕西省","key":"陕西省","lang":"zh-hans","lname":"Shaanxi Sheng","isoid":"61","sub_keys":"安康市~宝鸡市~汉中市~商洛市~铜川市~渭南市~西安市~咸阳市~延安市~榆林市","sub_lnames":"Ankang Shi~Baoji Shi~Hanzhong Shi~Shangluo Shi~Tongchuan Shi~Weinan Shi~Xi'an Shi~Xianyang Shi~Yan'an Shi~Yulin Shi","sub_zipexs":"725000~721000~723000~726000~727000~714000~710003~712000~716000~719000","sub_mores":"true~true~true~true~true~true~true~true~true~true"}
+data/CN/陕西省/咸阳市={"id":"data/CN/陕西省/咸阳市","key":"咸阳市","lang":"zh-hans","lname":"Xianyang Shi","zipex":"712000","sub_keys":"彬县~长武县~淳化县~泾阳县~礼泉县~乾县~秦都区~三原县~渭城区~武功县~兴平市~旬邑县~杨凌区~永寿县","sub_lnames":"Bin Xian~Changwu Xian~Chunhua Xian~Jingyang Xian~Liquan Xian~Qian Xian~Qindu Qu~Sanyuan Xian~Weicheng Qu~Wugong Xian~Xingping Shi~Xunyi Xian~Yangling Qu~Yongshou Xian","sub_zipexs":"713500~713600~711200~713700~713200~713300~712000~713800~712000~712200~713100~711300~712100~713400"}
+data/CN/陕西省/咸阳市/三原县={"id":"data/CN/陕西省/咸阳市/三原县","key":"三原县","lang":"zh-hans","lname":"Sanyuan Xian","zipex":"713800"}
+data/CN/陕西省/咸阳市/乾县={"id":"data/CN/陕西省/咸阳市/乾县","key":"乾县","lang":"zh-hans","lname":"Qian Xian","zipex":"713300"}
+data/CN/陕西省/咸阳市/兴平市={"id":"data/CN/陕西省/咸阳市/兴平市","key":"兴平市","lang":"zh-hans","lname":"Xingping Shi","zipex":"713100"}
+data/CN/陕西省/咸阳市/彬县={"id":"data/CN/陕西省/咸阳市/彬县","key":"彬县","lang":"zh-hans","lname":"Bin Xian","zipex":"713500"}
+data/CN/陕西省/咸阳市/旬邑县={"id":"data/CN/陕西省/咸阳市/旬邑县","key":"旬邑县","lang":"zh-hans","lname":"Xunyi Xian","zipex":"711300"}
+data/CN/陕西省/咸阳市/杨凌区={"id":"data/CN/陕西省/咸阳市/杨凌区","key":"杨凌区","lang":"zh-hans","lname":"Yangling Qu","zipex":"712100"}
+data/CN/陕西省/咸阳市/武功县={"id":"data/CN/陕西省/咸阳市/武功县","key":"武功县","lang":"zh-hans","lname":"Wugong Xian","zipex":"712200"}
+data/CN/陕西省/咸阳市/永寿县={"id":"data/CN/陕西省/咸阳市/永寿县","key":"永寿县","lang":"zh-hans","lname":"Yongshou Xian","zipex":"713400"}
+data/CN/陕西省/咸阳市/泾阳县={"id":"data/CN/陕西省/咸阳市/泾阳县","key":"泾阳县","lang":"zh-hans","lname":"Jingyang Xian","zipex":"713700"}
+data/CN/陕西省/咸阳市/淳化县={"id":"data/CN/陕西省/咸阳市/淳化县","key":"淳化县","lang":"zh-hans","lname":"Chunhua Xian","zipex":"711200"}
+data/CN/陕西省/咸阳市/渭城区={"id":"data/CN/陕西省/咸阳市/渭城区","key":"渭城区","lang":"zh-hans","lname":"Weicheng Qu","zipex":"712000"}
+data/CN/陕西省/咸阳市/礼泉县={"id":"data/CN/陕西省/咸阳市/礼泉县","key":"礼泉县","lang":"zh-hans","lname":"Liquan Xian","zipex":"713200"}
+data/CN/陕西省/咸阳市/秦都区={"id":"data/CN/陕西省/咸阳市/秦都区","key":"秦都区","lang":"zh-hans","lname":"Qindu Qu","zipex":"712000"}
+data/CN/陕西省/咸阳市/长武县={"id":"data/CN/陕西省/咸阳市/长武县","key":"长武县","lang":"zh-hans","lname":"Changwu Xian","zipex":"713600"}
+data/CN/陕西省/商洛市={"id":"data/CN/陕西省/商洛市","key":"商洛市","lang":"zh-hans","lname":"Shangluo Shi","zipex":"726000","sub_keys":"丹凤县~洛南县~山阳县~商南县~商州区~镇安县~柞水县","sub_lnames":"Danfeng Xian~Luonan Xian~Shanyang Xian~Shangnan Xian~Shangzhou Qu~Zhen'an Xian~Zhashui Xian","sub_zipexs":"726200~726100~726400~726300~726000~711500~711400"}
+data/CN/陕西省/商洛市/丹凤县={"id":"data/CN/陕西省/商洛市/丹凤县","key":"丹凤县","lang":"zh-hans","lname":"Danfeng Xian","zipex":"726200"}
+data/CN/陕西省/商洛市/商南县={"id":"data/CN/陕西省/商洛市/商南县","key":"商南县","lang":"zh-hans","lname":"Shangnan Xian","zipex":"726300"}
+data/CN/陕西省/商洛市/商州区={"id":"data/CN/陕西省/商洛市/商州区","key":"商州区","lang":"zh-hans","lname":"Shangzhou Qu","zipex":"726000"}
+data/CN/陕西省/商洛市/山阳县={"id":"data/CN/陕西省/商洛市/山阳县","key":"山阳县","lang":"zh-hans","lname":"Shanyang Xian","zipex":"726400"}
+data/CN/陕西省/商洛市/柞水县={"id":"data/CN/陕西省/商洛市/柞水县","key":"柞水县","lang":"zh-hans","lname":"Zhashui Xian","zipex":"711400"}
+data/CN/陕西省/商洛市/洛南县={"id":"data/CN/陕西省/商洛市/洛南县","key":"洛南县","lang":"zh-hans","lname":"Luonan Xian","zipex":"726100"}
+data/CN/陕西省/商洛市/镇安县={"id":"data/CN/陕西省/商洛市/镇安县","key":"镇安县","lang":"zh-hans","lname":"Zhen'an Xian","zipex":"711500"}
+data/CN/陕西省/安康市={"id":"data/CN/陕西省/安康市","key":"安康市","lang":"zh-hans","lname":"Ankang Shi","zipex":"725000","sub_keys":"白河县~汉滨区~汉阴县~岚皋县~宁陕县~平利县~石泉县~旬阳县~镇坪县~紫阳县","sub_lnames":"Baihe Xian~Hanbin Qu~Hanyin Xian~Langao Xian~Ningshan Xian~Pingli Xian~Shiquan Xian~Xunyang Xian~Zhenping Xian~Ziyang Xian","sub_zipexs":"725800~725000~725100~725400~711600~725500~725200~725700~725600~725300"}
+data/CN/陕西省/安康市/宁陕县={"id":"data/CN/陕西省/安康市/宁陕县","key":"宁陕县","lang":"zh-hans","lname":"Ningshan Xian","zipex":"711600"}
+data/CN/陕西省/安康市/岚皋县={"id":"data/CN/陕西省/安康市/岚皋县","key":"岚皋县","lang":"zh-hans","lname":"Langao Xian","zipex":"725400"}
+data/CN/陕西省/安康市/平利县={"id":"data/CN/陕西省/安康市/平利县","key":"平利县","lang":"zh-hans","lname":"Pingli Xian","zipex":"725500"}
+data/CN/陕西省/安康市/旬阳县={"id":"data/CN/陕西省/安康市/旬阳县","key":"旬阳县","lang":"zh-hans","lname":"Xunyang Xian","zipex":"725700"}
+data/CN/陕西省/安康市/汉滨区={"id":"data/CN/陕西省/安康市/汉滨区","key":"汉滨区","lang":"zh-hans","lname":"Hanbin Qu","zipex":"725000"}
+data/CN/陕西省/安康市/汉阴县={"id":"data/CN/陕西省/安康市/汉阴县","key":"汉阴县","lang":"zh-hans","lname":"Hanyin Xian","zipex":"725100"}
+data/CN/陕西省/安康市/白河县={"id":"data/CN/陕西省/安康市/白河县","key":"白河县","lang":"zh-hans","lname":"Baihe Xian","zipex":"725800"}
+data/CN/陕西省/安康市/石泉县={"id":"data/CN/陕西省/安康市/石泉县","key":"石泉县","lang":"zh-hans","lname":"Shiquan Xian","zipex":"725200"}
+data/CN/陕西省/安康市/紫阳县={"id":"data/CN/陕西省/安康市/紫阳县","key":"紫阳县","lang":"zh-hans","lname":"Ziyang Xian","zipex":"725300"}
+data/CN/陕西省/安康市/镇坪县={"id":"data/CN/陕西省/安康市/镇坪县","key":"镇坪县","lang":"zh-hans","lname":"Zhenping Xian","zipex":"725600"}
+data/CN/陕西省/宝鸡市={"id":"data/CN/陕西省/宝鸡市","key":"宝鸡市","lang":"zh-hans","lname":"Baoji Shi","zipex":"721000","sub_keys":"陈仓区~凤县~凤翔县~扶风县~金台区~麟游县~陇县~眉县~岐山县~千阳县~太白县~渭滨区","sub_lnames":"Chencang Qu~Feng Xian~Fengxiang Xian~Fufeng Xian~Jintai Qu~Linyou Xian~Long Xian~Mei Xian~Qishan Xian~Qianyang Xian~Taibai Xian~Weibin Qu","sub_zipexs":"721300~721700~721400~722200~721001~721500~721200~722300~722400~721100~721600~721000"}
+data/CN/陕西省/宝鸡市/凤县={"id":"data/CN/陕西省/宝鸡市/凤县","key":"凤县","lang":"zh-hans","lname":"Feng Xian","zipex":"721700"}
+data/CN/陕西省/宝鸡市/凤翔县={"id":"data/CN/陕西省/宝鸡市/凤翔县","key":"凤翔县","lang":"zh-hans","lname":"Fengxiang Xian","zipex":"721400"}
+data/CN/陕西省/宝鸡市/千阳县={"id":"data/CN/陕西省/宝鸡市/千阳县","key":"千阳县","lang":"zh-hans","lname":"Qianyang Xian","zipex":"721100"}
+data/CN/陕西省/宝鸡市/太白县={"id":"data/CN/陕西省/宝鸡市/太白县","key":"太白县","lang":"zh-hans","lname":"Taibai Xian","zipex":"721600"}
+data/CN/陕西省/宝鸡市/岐山县={"id":"data/CN/陕西省/宝鸡市/岐山县","key":"岐山县","lang":"zh-hans","lname":"Qishan Xian","zipex":"722400"}
+data/CN/陕西省/宝鸡市/扶风县={"id":"data/CN/陕西省/宝鸡市/扶风县","key":"扶风县","lang":"zh-hans","lname":"Fufeng Xian","zipex":"722200"}
+data/CN/陕西省/宝鸡市/渭滨区={"id":"data/CN/陕西省/宝鸡市/渭滨区","key":"渭滨区","lang":"zh-hans","lname":"Weibin Qu","zipex":"721000"}
+data/CN/陕西省/宝鸡市/眉县={"id":"data/CN/陕西省/宝鸡市/眉县","key":"眉县","lang":"zh-hans","lname":"Mei Xian","zipex":"722300"}
+data/CN/陕西省/宝鸡市/金台区={"id":"data/CN/陕西省/宝鸡市/金台区","key":"金台区","lang":"zh-hans","lname":"Jintai Qu","zipex":"721001"}
+data/CN/陕西省/宝鸡市/陇县={"id":"data/CN/陕西省/宝鸡市/陇县","key":"陇县","lang":"zh-hans","lname":"Long Xian","zipex":"721200"}
+data/CN/陕西省/宝鸡市/陈仓区={"id":"data/CN/陕西省/宝鸡市/陈仓区","key":"陈仓区","lang":"zh-hans","lname":"Chencang Qu","zipex":"721300"}
+data/CN/陕西省/宝鸡市/麟游县={"id":"data/CN/陕西省/宝鸡市/麟游县","key":"麟游县","lang":"zh-hans","lname":"Linyou Xian","zipex":"721500"}
+data/CN/陕西省/延安市={"id":"data/CN/陕西省/延安市","key":"延安市","lang":"zh-hans","lname":"Yan'an Shi","zipex":"716000","sub_keys":"安塞县~宝塔区~富县~甘泉县~黄陵县~黄龙县~洛川县~吴起县~延长县~延川县~宜川县~志丹县~子长县","sub_lnames":"Ansai Xian~Baota Qu~Fu Xian~Ganquan Xian~Huangling Xian~Huanglong Xian~Luochuan Xian~Wuqi Xian~Yanzhang Xian~Yanchuan Xian~Yichuan Xian~Zhidan Xian~Zichang Xian","sub_zipexs":"717400~716000~727500~716100~727300~715700~727400~717600~717100~717200~716200~717500~717300"}
+data/CN/陕西省/延安市/吴起县={"id":"data/CN/陕西省/延安市/吴起县","key":"吴起县","lang":"zh-hans","lname":"Wuqi Xian","zipex":"717600"}
+data/CN/陕西省/延安市/子长县={"id":"data/CN/陕西省/延安市/子长县","key":"子长县","lang":"zh-hans","lname":"Zichang Xian","zipex":"717300"}
+data/CN/陕西省/延安市/安塞县={"id":"data/CN/陕西省/延安市/安塞县","key":"安塞县","lang":"zh-hans","lname":"Ansai Xian","zipex":"717400"}
+data/CN/陕西省/延安市/宜川县={"id":"data/CN/陕西省/延安市/宜川县","key":"宜川县","lang":"zh-hans","lname":"Yichuan Xian","zipex":"716200"}
+data/CN/陕西省/延安市/宝塔区={"id":"data/CN/陕西省/延安市/宝塔区","key":"宝塔区","lang":"zh-hans","lname":"Baota Qu","zipex":"716000"}
+data/CN/陕西省/延安市/富县={"id":"data/CN/陕西省/延安市/富县","key":"富县","lang":"zh-hans","lname":"Fu Xian","zipex":"727500"}
+data/CN/陕西省/延安市/延川县={"id":"data/CN/陕西省/延安市/延川县","key":"延川县","lang":"zh-hans","lname":"Yanchuan Xian","zipex":"717200"}
+data/CN/陕西省/延安市/延长县={"id":"data/CN/陕西省/延安市/延长县","key":"延长县","lang":"zh-hans","lname":"Yanzhang Xian","zipex":"717100"}
+data/CN/陕西省/延安市/志丹县={"id":"data/CN/陕西省/延安市/志丹县","key":"志丹县","lang":"zh-hans","lname":"Zhidan Xian","zipex":"717500"}
+data/CN/陕西省/延安市/洛川县={"id":"data/CN/陕西省/延安市/洛川县","key":"洛川县","lang":"zh-hans","lname":"Luochuan Xian","zipex":"727400"}
+data/CN/陕西省/延安市/甘泉县={"id":"data/CN/陕西省/延安市/甘泉县","key":"甘泉县","lang":"zh-hans","lname":"Ganquan Xian","zipex":"716100"}
+data/CN/陕西省/延安市/黄陵县={"id":"data/CN/陕西省/延安市/黄陵县","key":"黄陵县","lang":"zh-hans","lname":"Huangling Xian","zipex":"727300"}
+data/CN/陕西省/延安市/黄龙县={"id":"data/CN/陕西省/延安市/黄龙县","key":"黄龙县","lang":"zh-hans","lname":"Huanglong Xian","zipex":"715700"}
+data/CN/陕西省/榆林市={"id":"data/CN/陕西省/榆林市","key":"榆林市","lang":"zh-hans","lname":"Yulin Shi","zipex":"719000","sub_keys":"定边县~府谷县~横山县~佳县~靖边县~米脂县~清涧县~神木县~绥德县~吴堡县~榆阳区~子洲县","sub_lnames":"Dingbian Xian~Fugu Xian~Hengshan Xian~Jia Xian~Jingbian Xian~Mizhi Xian~Qingjian Xian~Shenmu Xian~Suide Xian~Wubu Xian~Yuyang Qu~Zizhou Xian","sub_zipexs":"718600~719400~719200~719200~718500~718100~718300~719300~718000~718200~719000~718400"}
+data/CN/陕西省/榆林市/佳县={"id":"data/CN/陕西省/榆林市/佳县","key":"佳县","lang":"zh-hans","lname":"Jia Xian","zipex":"719200"}
+data/CN/陕西省/榆林市/吴堡县={"id":"data/CN/陕西省/榆林市/吴堡县","key":"吴堡县","lang":"zh-hans","lname":"Wubu Xian","zipex":"718200"}
+data/CN/陕西省/榆林市/子洲县={"id":"data/CN/陕西省/榆林市/子洲县","key":"子洲县","lang":"zh-hans","lname":"Zizhou Xian","zipex":"718400"}
+data/CN/陕西省/榆林市/定边县={"id":"data/CN/陕西省/榆林市/定边县","key":"定边县","lang":"zh-hans","lname":"Dingbian Xian","zipex":"718600"}
+data/CN/陕西省/榆林市/府谷县={"id":"data/CN/陕西省/榆林市/府谷县","key":"府谷县","lang":"zh-hans","lname":"Fugu Xian","zipex":"719400"}
+data/CN/陕西省/榆林市/榆阳区={"id":"data/CN/陕西省/榆林市/榆阳区","key":"榆阳区","lang":"zh-hans","lname":"Yuyang Qu","zipex":"719000"}
+data/CN/陕西省/榆林市/横山县={"id":"data/CN/陕西省/榆林市/横山县","key":"横山县","lang":"zh-hans","lname":"Hengshan Xian","zipex":"719200"}
+data/CN/陕西省/榆林市/清涧县={"id":"data/CN/陕西省/榆林市/清涧县","key":"清涧县","lang":"zh-hans","lname":"Qingjian Xian","zipex":"718300"}
+data/CN/陕西省/榆林市/神木县={"id":"data/CN/陕西省/榆林市/神木县","key":"神木县","lang":"zh-hans","lname":"Shenmu Xian","zipex":"719300"}
+data/CN/陕西省/榆林市/米脂县={"id":"data/CN/陕西省/榆林市/米脂县","key":"米脂县","lang":"zh-hans","lname":"Mizhi Xian","zipex":"718100"}
+data/CN/陕西省/榆林市/绥德县={"id":"data/CN/陕西省/榆林市/绥德县","key":"绥德县","lang":"zh-hans","lname":"Suide Xian","zipex":"718000"}
+data/CN/陕西省/榆林市/靖边县={"id":"data/CN/陕西省/榆林市/靖边县","key":"靖边县","lang":"zh-hans","lname":"Jingbian Xian","zipex":"718500"}
+data/CN/陕西省/汉中市={"id":"data/CN/陕西省/汉中市","key":"汉中市","lang":"zh-hans","lname":"Hanzhong Shi","zipex":"723000","sub_keys":"城固县~佛坪县~汉台区~留坝县~略阳县~勉县~南郑县~宁强县~西乡县~洋县~镇巴县","sub_lnames":"Chenggu Xian~Foping Xian~Hantai Qu~Liuba Xian~Lüeyang Xian~Mian Xian~Nanzheng Xian~Ningqiang Xian~Xixiang Xian~Yang Xian~Zhenba Xian","sub_zipexs":"723200~723400~723000~724100~724300~724200~723100~724400~723500~723300~723600"}
+data/CN/陕西省/汉中市/佛坪县={"id":"data/CN/陕西省/汉中市/佛坪县","key":"佛坪县","lang":"zh-hans","lname":"Foping Xian","zipex":"723400"}
+data/CN/陕西省/汉中市/勉县={"id":"data/CN/陕西省/汉中市/勉县","key":"勉县","lang":"zh-hans","lname":"Mian Xian","zipex":"724200"}
+data/CN/陕西省/汉中市/南郑县={"id":"data/CN/陕西省/汉中市/南郑县","key":"南郑县","lang":"zh-hans","lname":"Nanzheng Xian","zipex":"723100"}
+data/CN/陕西省/汉中市/城固县={"id":"data/CN/陕西省/汉中市/城固县","key":"城固县","lang":"zh-hans","lname":"Chenggu Xian","zipex":"723200"}
+data/CN/陕西省/汉中市/宁强县={"id":"data/CN/陕西省/汉中市/宁强县","key":"宁强县","lang":"zh-hans","lname":"Ningqiang Xian","zipex":"724400"}
+data/CN/陕西省/汉中市/汉台区={"id":"data/CN/陕西省/汉中市/汉台区","key":"汉台区","lang":"zh-hans","lname":"Hantai Qu","zipex":"723000"}
+data/CN/陕西省/汉中市/洋县={"id":"data/CN/陕西省/汉中市/洋县","key":"洋县","lang":"zh-hans","lname":"Yang Xian","zipex":"723300"}
+data/CN/陕西省/汉中市/留坝县={"id":"data/CN/陕西省/汉中市/留坝县","key":"留坝县","lang":"zh-hans","lname":"Liuba Xian","zipex":"724100"}
+data/CN/陕西省/汉中市/略阳县={"id":"data/CN/陕西省/汉中市/略阳县","key":"略阳县","lang":"zh-hans","lname":"Lüeyang Xian","zipex":"724300"}
+data/CN/陕西省/汉中市/西乡县={"id":"data/CN/陕西省/汉中市/西乡县","key":"西乡县","lang":"zh-hans","lname":"Xixiang Xian","zipex":"723500"}
+data/CN/陕西省/汉中市/镇巴县={"id":"data/CN/陕西省/汉中市/镇巴县","key":"镇巴县","lang":"zh-hans","lname":"Zhenba Xian","zipex":"723600"}
+data/CN/陕西省/渭南市={"id":"data/CN/陕西省/渭南市","key":"渭南市","lang":"zh-hans","lname":"Weinan Shi","zipex":"714000","sub_keys":"白水县~澄城县~大荔县~富平县~韩城市~合阳县~华县~华阴市~临渭区~蒲城县~潼关县","sub_lnames":"Baishui Xian~Chengcheng Xian~Dali Xian~Fuping Xian~Hancheng Shi~Heyang Xian~Hua Xian~Huayin Shi~Linwei Qu~Pucheng Xian~Tongguan Xian","sub_zipexs":"715600~715200~715100~711700~715400~715300~714100~714200~714000~715500~714300"}
+data/CN/陕西省/渭南市/临渭区={"id":"data/CN/陕西省/渭南市/临渭区","key":"临渭区","lang":"zh-hans","lname":"Linwei Qu","zipex":"714000"}
+data/CN/陕西省/渭南市/华县={"id":"data/CN/陕西省/渭南市/华县","key":"华县","lang":"zh-hans","lname":"Hua Xian","zipex":"714100"}
+data/CN/陕西省/渭南市/华阴市={"id":"data/CN/陕西省/渭南市/华阴市","key":"华阴市","lang":"zh-hans","lname":"Huayin Shi","zipex":"714200"}
+data/CN/陕西省/渭南市/合阳县={"id":"data/CN/陕西省/渭南市/合阳县","key":"合阳县","lang":"zh-hans","lname":"Heyang Xian","zipex":"715300"}
+data/CN/陕西省/渭南市/大荔县={"id":"data/CN/陕西省/渭南市/大荔县","key":"大荔县","lang":"zh-hans","lname":"Dali Xian","zipex":"715100"}
+data/CN/陕西省/渭南市/富平县={"id":"data/CN/陕西省/渭南市/富平县","key":"富平县","lang":"zh-hans","lname":"Fuping Xian","zipex":"711700"}
+data/CN/陕西省/渭南市/潼关县={"id":"data/CN/陕西省/渭南市/潼关县","key":"潼关县","lang":"zh-hans","lname":"Tongguan Xian","zipex":"714300"}
+data/CN/陕西省/渭南市/澄城县={"id":"data/CN/陕西省/渭南市/澄城县","key":"澄城县","lang":"zh-hans","lname":"Chengcheng Xian","zipex":"715200"}
+data/CN/陕西省/渭南市/白水县={"id":"data/CN/陕西省/渭南市/白水县","key":"白水县","lang":"zh-hans","lname":"Baishui Xian","zipex":"715600"}
+data/CN/陕西省/渭南市/蒲城县={"id":"data/CN/陕西省/渭南市/蒲城县","key":"蒲城县","lang":"zh-hans","lname":"Pucheng Xian","zipex":"715500"}
+data/CN/陕西省/渭南市/韩城市={"id":"data/CN/陕西省/渭南市/韩城市","key":"韩城市","lang":"zh-hans","lname":"Hancheng Shi","zipex":"715400"}
+data/CN/陕西省/西安市={"id":"data/CN/陕西省/西安市","key":"西安市","lang":"zh-hans","lname":"Xi'an Shi","zipex":"710003","sub_keys":"灞桥区~碑林区~长安区~高陵县~户县~蓝田县~莲湖区~临潼区~未央区~新城区~阎良区~雁塔区~周至县","sub_lnames":"Baqiao Qu~Beilin Qu~Chang'an Qu~Gaoling Xian~Hu Xian~Lantian Xian~Lianhu Qu~Lintong Qu~Weiyang Qu~Xincheng Qu~Yanliang Qu~Yanta Qu~Zhouzhi Xian","sub_zipexs":"710038~710001~710100~710200~710300~710500~710003~710600~710016~710005~710089~710061~710400"}
+data/CN/陕西省/西安市/临潼区={"id":"data/CN/陕西省/西安市/临潼区","key":"临潼区","lang":"zh-hans","lname":"Lintong Qu","zipex":"710600"}
+data/CN/陕西省/西安市/周至县={"id":"data/CN/陕西省/西安市/周至县","key":"周至县","lang":"zh-hans","lname":"Zhouzhi Xian","zipex":"710400"}
+data/CN/陕西省/西安市/户县={"id":"data/CN/陕西省/西安市/户县","key":"户县","lang":"zh-hans","lname":"Hu Xian","zipex":"710300"}
+data/CN/陕西省/西安市/新城区={"id":"data/CN/陕西省/西安市/新城区","key":"新城区","lang":"zh-hans","lname":"Xincheng Qu","zipex":"710005"}
+data/CN/陕西省/西安市/未央区={"id":"data/CN/陕西省/西安市/未央区","key":"未央区","lang":"zh-hans","lname":"Weiyang Qu","zipex":"710016"}
+data/CN/陕西省/西安市/灞桥区={"id":"data/CN/陕西省/西安市/灞桥区","key":"灞桥区","lang":"zh-hans","lname":"Baqiao Qu","zipex":"710038"}
+data/CN/陕西省/西安市/碑林区={"id":"data/CN/陕西省/西安市/碑林区","key":"碑林区","lang":"zh-hans","lname":"Beilin Qu","zipex":"710001"}
+data/CN/陕西省/西安市/莲湖区={"id":"data/CN/陕西省/西安市/莲湖区","key":"莲湖区","lang":"zh-hans","lname":"Lianhu Qu","zipex":"710003"}
+data/CN/陕西省/西安市/蓝田县={"id":"data/CN/陕西省/西安市/蓝田县","key":"蓝田县","lang":"zh-hans","lname":"Lantian Xian","zipex":"710500"}
+data/CN/陕西省/西安市/长安区={"id":"data/CN/陕西省/西安市/长安区","key":"长安区","lang":"zh-hans","lname":"Chang'an Qu","zipex":"710100"}
+data/CN/陕西省/西安市/阎良区={"id":"data/CN/陕西省/西安市/阎良区","key":"阎良区","lang":"zh-hans","lname":"Yanliang Qu","zipex":"710089"}
+data/CN/陕西省/西安市/雁塔区={"id":"data/CN/陕西省/西安市/雁塔区","key":"雁塔区","lang":"zh-hans","lname":"Yanta Qu","zipex":"710061"}
+data/CN/陕西省/西安市/高陵县={"id":"data/CN/陕西省/西安市/高陵县","key":"高陵县","lang":"zh-hans","lname":"Gaoling Xian","zipex":"710200"}
+data/CN/陕西省/铜川市={"id":"data/CN/陕西省/铜川市","key":"铜川市","lang":"zh-hans","lname":"Tongchuan Shi","zipex":"727000","sub_keys":"王益区~耀州区~宜君县~印台区","sub_lnames":"Wangyi Qu~Yaozhou Qu~Yijun Xian~Yintai Qu","sub_zipexs":"727000~727100~727200~727007"}
+data/CN/陕西省/铜川市/印台区={"id":"data/CN/陕西省/铜川市/印台区","key":"印台区","lang":"zh-hans","lname":"Yintai Qu","zipex":"727007"}
+data/CN/陕西省/铜川市/宜君县={"id":"data/CN/陕西省/铜川市/宜君县","key":"宜君县","lang":"zh-hans","lname":"Yijun Xian","zipex":"727200"}
+data/CN/陕西省/铜川市/王益区={"id":"data/CN/陕西省/铜川市/王益区","key":"王益区","lang":"zh-hans","lname":"Wangyi Qu","zipex":"727000"}
+data/CN/陕西省/铜川市/耀州区={"id":"data/CN/陕西省/铜川市/耀州区","key":"耀州区","lang":"zh-hans","lname":"Yaozhou Qu","zipex":"727100"}
+data/CN/青海省={"id":"data/CN/青海省","key":"青海省","lang":"zh-hans","lname":"Qinghai Sheng","isoid":"63","sub_keys":"果洛藏族自治州~海北藏族自治州~海东地区~海南藏族自治州~海西蒙古族藏族自治州~黄南藏族自治州~西宁市~玉树藏族自治州","sub_lnames":"Golog Zhou~Haibei Zhou~Haidong Diqu~Hainan Zhou~Haixi Zhou~Huangnan Zhou~Xining Shi~Yushu Zhou","sub_zipexs":"814000~812200~810600~813000~817000~811300~810000~815000","sub_mores":"true~true~true~true~true~true~true~true","sub_lfnames":"Golog Zangzu Zizhizhou~Haibei Zangzu Zizhizhou~~Hainan Zangzu Zizhizhou~Haixi Mongolzu Zangzu Zizhizhou~Huangnan Zangzu Zizhizhou~~Yushu Zangzu Zizhizhou"}
+data/CN/青海省/果洛藏族自治州={"id":"data/CN/青海省/果洛藏族自治州","key":"果洛藏族自治州","lang":"zh-hans","lname":"Golog Zhou","zipex":"814000","lfname":"Golog Zangzu Zizhizhou","sub_keys":"班玛县~达日县~甘德县~久治县~玛多县~玛沁县","sub_lnames":"Baima Xian~Tarlag Xian~Gadê Xian~Jigzhi Xian~Madoi Xian~Maqên Xian","sub_zipexs":"814300~814200~814100~624700~813500~814000"}
+data/CN/青海省/果洛藏族自治州/久治县={"id":"data/CN/青海省/果洛藏族自治州/久治县","key":"久治县","lang":"zh-hans","lname":"Jigzhi Xian","zipex":"624700"}
+data/CN/青海省/果洛藏族自治州/玛多县={"id":"data/CN/青海省/果洛藏族自治州/玛多县","key":"玛多县","lang":"zh-hans","lname":"Madoi Xian","zipex":"813500"}
+data/CN/青海省/果洛藏族自治州/玛沁县={"id":"data/CN/青海省/果洛藏族自治州/玛沁县","key":"玛沁县","lang":"zh-hans","lname":"Maqên Xian","zipex":"814000"}
+data/CN/青海省/果洛藏族自治州/班玛县={"id":"data/CN/青海省/果洛藏族自治州/班玛县","key":"班玛县","lang":"zh-hans","lname":"Baima Xian","zipex":"814300"}
+data/CN/青海省/果洛藏族自治州/甘德县={"id":"data/CN/青海省/果洛藏族自治州/甘德县","key":"甘德县","lang":"zh-hans","lname":"Gadê Xian","zipex":"814100"}
+data/CN/青海省/果洛藏族自治州/达日县={"id":"data/CN/青海省/果洛藏族自治州/达日县","key":"达日县","lang":"zh-hans","lname":"Tarlag Xian","zipex":"814200"}
+data/CN/青海省/海东地区={"id":"data/CN/青海省/海东地区","key":"海东地区","lang":"zh-hans","lname":"Haidong Diqu","zipex":"810600","sub_keys":"互助土族自治县~化隆回族自治县~乐都县~民和回族土族自治县~平安县~循化撒拉族自治县","sub_lnames":"Huzhu Xian~Hualong Xian~Ledu Xian~Minhe Xian~Ping'an Xian~Xunhua Xian","sub_zipexs":"810500~810900~810700~810800~810600~811100","sub_lfnames":"Huzhu Tuzu Zizhixian~Hualong Huizu Zizhixian~~Minhe Huizu Tuzu Zizhixian~~Xunhua Salarzu Zizhixian"}
+data/CN/青海省/海东地区/乐都县={"id":"data/CN/青海省/海东地区/乐都县","key":"乐都县","lang":"zh-hans","lname":"Ledu Xian","zipex":"810700"}
+data/CN/青海省/海东地区/互助土族自治县={"id":"data/CN/青海省/海东地区/互助土族自治县","key":"互助土族自治县","lang":"zh-hans","lname":"Huzhu Xian","zipex":"810500","lfname":"Huzhu Tuzu Zizhixian"}
+data/CN/青海省/海东地区/化隆回族自治县={"id":"data/CN/青海省/海东地区/化隆回族自治县","key":"化隆回族自治县","lang":"zh-hans","lname":"Hualong Xian","zipex":"810900","lfname":"Hualong Huizu Zizhixian"}
+data/CN/青海省/海东地区/平安县={"id":"data/CN/青海省/海东地区/平安县","key":"平安县","lang":"zh-hans","lname":"Ping'an Xian","zipex":"810600"}
+data/CN/青海省/海东地区/循化撒拉族自治县={"id":"data/CN/青海省/海东地区/循化撒拉族自治县","key":"循化撒拉族自治县","lang":"zh-hans","lname":"Xunhua Xian","zipex":"811100","lfname":"Xunhua Salarzu Zizhixian"}
+data/CN/青海省/海东地区/民和回族土族自治县={"id":"data/CN/青海省/海东地区/民和回族土族自治县","key":"民和回族土族自治县","lang":"zh-hans","lname":"Minhe Xian","zipex":"810800","lfname":"Minhe Huizu Tuzu Zizhixian"}
+data/CN/青海省/海北藏族自治州={"id":"data/CN/青海省/海北藏族自治州","key":"海北藏族自治州","lang":"zh-hans","lname":"Haibei Zhou","zipex":"812200","lfname":"Haibei Zangzu Zizhizhou","sub_keys":"刚察县~海晏县~门源回族自治县~祁连县","sub_lnames":"Gangca Xian~Haiyan Xian~Menyuan Xian~Qilian Xian","sub_zipexs":"812300~812200~810300~810400","sub_lfnames":"~~Menyuan Huizu Zizhixian~"}
+data/CN/青海省/海北藏族自治州/刚察县={"id":"data/CN/青海省/海北藏族自治州/刚察县","key":"刚察县","lang":"zh-hans","lname":"Gangca Xian","zipex":"812300"}
+data/CN/青海省/海北藏族自治州/海晏县={"id":"data/CN/青海省/海北藏族自治州/海晏县","key":"海晏县","lang":"zh-hans","lname":"Haiyan Xian","zipex":"812200"}
+data/CN/青海省/海北藏族自治州/祁连县={"id":"data/CN/青海省/海北藏族自治州/祁连县","key":"祁连县","lang":"zh-hans","lname":"Qilian Xian","zipex":"810400"}
+data/CN/青海省/海北藏族自治州/门源回族自治县={"id":"data/CN/青海省/海北藏族自治州/门源回族自治县","key":"门源回族自治县","lang":"zh-hans","lname":"Menyuan Xian","zipex":"810300","lfname":"Menyuan Huizu Zizhixian"}
+data/CN/青海省/海南藏族自治州={"id":"data/CN/青海省/海南藏族自治州","key":"海南藏族自治州","lang":"zh-hans","lname":"Hainan Zhou","zipex":"813000","lfname":"Hainan Zangzu Zizhizhou","sub_keys":"共和县~贵德县~贵南县~同德县~兴海县","sub_lnames":"Gonghe Xian~Guide Xian~Guinan Xian~Tongde Xian~Xinghai Xian","sub_zipexs":"813000~811700~813100~813200~813300"}
+data/CN/青海省/海南藏族自治州/共和县={"id":"data/CN/青海省/海南藏族自治州/共和县","key":"共和县","lang":"zh-hans","lname":"Gonghe Xian","zipex":"813000"}
+data/CN/青海省/海南藏族自治州/兴海县={"id":"data/CN/青海省/海南藏族自治州/兴海县","key":"兴海县","lang":"zh-hans","lname":"Xinghai Xian","zipex":"813300"}
+data/CN/青海省/海南藏族自治州/同德县={"id":"data/CN/青海省/海南藏族自治州/同德县","key":"同德县","lang":"zh-hans","lname":"Tongde Xian","zipex":"813200"}
+data/CN/青海省/海南藏族自治州/贵南县={"id":"data/CN/青海省/海南藏族自治州/贵南县","key":"贵南县","lang":"zh-hans","lname":"Guinan Xian","zipex":"813100"}
+data/CN/青海省/海南藏族自治州/贵德县={"id":"data/CN/青海省/海南藏族自治州/贵德县","key":"贵德县","lang":"zh-hans","lname":"Guide Xian","zipex":"811700"}
+data/CN/青海省/海西蒙古族藏族自治州={"id":"data/CN/青海省/海西蒙古族藏族自治州","key":"海西蒙古族藏族自治州","lang":"zh-hans","lname":"Haixi Zhou","zipex":"817000","lfname":"Haixi Mongolzu Zangzu Zizhizhou","sub_keys":"德令哈市~都兰县~格尔木市~天峻县~乌兰县","sub_lnames":"Delhi Shi~Dulan Xian~Golmud Shi~Tianjun Xian~Ulan Xian","sub_zipexs":"817000~816100~816000~817200~817100"}
+data/CN/青海省/海西蒙古族藏族自治州/乌兰县={"id":"data/CN/青海省/海西蒙古族藏族自治州/乌兰县","key":"乌兰县","lang":"zh-hans","lname":"Ulan Xian","zipex":"817100"}
+data/CN/青海省/海西蒙古族藏族自治州/天峻县={"id":"data/CN/青海省/海西蒙古族藏族自治州/天峻县","key":"天峻县","lang":"zh-hans","lname":"Tianjun Xian","zipex":"817200"}
+data/CN/青海省/海西蒙古族藏族自治州/德令哈市={"id":"data/CN/青海省/海西蒙古族藏族自治州/德令哈市","key":"德令哈市","lang":"zh-hans","lname":"Delhi Shi","zipex":"817000"}
+data/CN/青海省/海西蒙古族藏族自治州/格尔木市={"id":"data/CN/青海省/海西蒙古族藏族自治州/格尔木市","key":"格尔木市","lang":"zh-hans","lname":"Golmud Shi","zipex":"816000"}
+data/CN/青海省/海西蒙古族藏族自治州/都兰县={"id":"data/CN/青海省/海西蒙古族藏族自治州/都兰县","key":"都兰县","lang":"zh-hans","lname":"Dulan Xian","zipex":"816100"}
+data/CN/青海省/玉树藏族自治州={"id":"data/CN/青海省/玉树藏族自治州","key":"玉树藏族自治州","lang":"zh-hans","lname":"Yushu Zhou","zipex":"815000","lfname":"Yushu Zangzu Zizhizhou","sub_keys":"称多县~囊谦县~曲麻莱县~玉树县~杂多县~治多县","sub_lnames":"Chindu Xian~Nangqên Xian~Qumarlêb Xian~Yushu Xian~Zadoi Xian~Zhidoi Xian","sub_zipexs":"815100~815200~815500~815000~815300~815400"}
+data/CN/青海省/玉树藏族自治州/囊谦县={"id":"data/CN/青海省/玉树藏族自治州/囊谦县","key":"囊谦县","lang":"zh-hans","lname":"Nangqên Xian","zipex":"815200"}
+data/CN/青海省/玉树藏族自治州/曲麻莱县={"id":"data/CN/青海省/玉树藏族自治州/曲麻莱县","key":"曲麻莱县","lang":"zh-hans","lname":"Qumarlêb Xian","zipex":"815500"}
+data/CN/青海省/玉树藏族自治州/杂多县={"id":"data/CN/青海省/玉树藏族自治州/杂多县","key":"杂多县","lang":"zh-hans","lname":"Zadoi Xian","zipex":"815300"}
+data/CN/青海省/玉树藏族自治州/治多县={"id":"data/CN/青海省/玉树藏族自治州/治多县","key":"治多县","lang":"zh-hans","lname":"Zhidoi Xian","zipex":"815400"}
+data/CN/青海省/玉树藏族自治州/玉树县={"id":"data/CN/青海省/玉树藏族自治州/玉树县","key":"玉树县","lang":"zh-hans","lname":"Yushu Xian","zipex":"815000"}
+data/CN/青海省/玉树藏族自治州/称多县={"id":"data/CN/青海省/玉树藏族自治州/称多县","key":"称多县","lang":"zh-hans","lname":"Chindu Xian","zipex":"815100"}
+data/CN/青海省/西宁市={"id":"data/CN/青海省/西宁市","key":"西宁市","lang":"zh-hans","lname":"Xining Shi","zipex":"810000","sub_keys":"城北区~城东区~城西区~城中区~大通回族土族自治县~湟源县~湟中县","sub_lnames":"Chengbei Qu~Chengdong Qu~Chengxi Qu~Chengzhong Qu~Datong Xian~Huangyuan Xian~Huangzhong Xian","sub_zipexs":"810001~810000~810001~810000~810100~812100~811600","sub_lfnames":"~~~~Datong Huizu Tuzu Zizhixian~~"}
+data/CN/青海省/西宁市/城东区={"id":"data/CN/青海省/西宁市/城东区","key":"城东区","lang":"zh-hans","lname":"Chengdong Qu","zipex":"810000"}
+data/CN/青海省/西宁市/城中区={"id":"data/CN/青海省/西宁市/城中区","key":"城中区","lang":"zh-hans","lname":"Chengzhong Qu","zipex":"810000"}
+data/CN/青海省/西宁市/城北区={"id":"data/CN/青海省/西宁市/城北区","key":"城北区","lang":"zh-hans","lname":"Chengbei Qu","zipex":"810001"}
+data/CN/青海省/西宁市/城西区={"id":"data/CN/青海省/西宁市/城西区","key":"城西区","lang":"zh-hans","lname":"Chengxi Qu","zipex":"810001"}
+data/CN/青海省/西宁市/大通回族土族自治县={"id":"data/CN/青海省/西宁市/大通回族土族自治县","key":"大通回族土族自治县","lang":"zh-hans","lname":"Datong Xian","zipex":"810100","lfname":"Datong Huizu Tuzu Zizhixian"}
+data/CN/青海省/西宁市/湟中县={"id":"data/CN/青海省/西宁市/湟中县","key":"湟中县","lang":"zh-hans","lname":"Huangzhong Xian","zipex":"811600"}
+data/CN/青海省/西宁市/湟源县={"id":"data/CN/青海省/西宁市/湟源县","key":"湟源县","lang":"zh-hans","lname":"Huangyuan Xian","zipex":"812100"}
+data/CN/青海省/黄南藏族自治州={"id":"data/CN/青海省/黄南藏族自治州","key":"黄南藏族自治州","lang":"zh-hans","lname":"Huangnan Zhou","zipex":"811300","lfname":"Huangnan Zangzu Zizhizhou","sub_keys":"河南蒙古族自治县~尖扎县~同仁县~泽库县","sub_lnames":"Henan Xian~Jianca Xian~Tongren Xian~Zêkog Xian","sub_zipexs":"811500~811200~811300~811400","sub_lfnames":"Henan Mongolzu Zizhixian~~~"}
+data/CN/青海省/黄南藏族自治州/同仁县={"id":"data/CN/青海省/黄南藏族自治州/同仁县","key":"同仁县","lang":"zh-hans","lname":"Tongren Xian","zipex":"811300"}
+data/CN/青海省/黄南藏族自治州/尖扎县={"id":"data/CN/青海省/黄南藏族自治州/尖扎县","key":"尖扎县","lang":"zh-hans","lname":"Jianca Xian","zipex":"811200"}
+data/CN/青海省/黄南藏族自治州/河南蒙古族自治县={"id":"data/CN/青海省/黄南藏族自治州/河南蒙古族自治县","key":"河南蒙古族自治县","lang":"zh-hans","lname":"Henan Xian","zipex":"811500","lfname":"Henan Mongolzu Zizhixian"}
+data/CN/青海省/黄南藏族自治州/泽库县={"id":"data/CN/青海省/黄南藏族自治州/泽库县","key":"泽库县","lang":"zh-hans","lname":"Zêkog Xian","zipex":"811400"}
+data/CN/香港={"id":"data/CN/香港","key":"香港","lang":"zh-hans","lname":"Hong Kong","isoid":"91","xzip":"999077","xrequire":"ACS","sub_keys":"九龍~香港島~新界","sub_lnames":"Kowloon~Hong Kong Island~New Territories"}
+data/CN/香港/九龍={"id":"data/CN/香港/九龍","key":"九龍","lang":"zh-hans","lname":"Kowloon"}
+data/CN/香港/新界={"id":"data/CN/香港/新界","key":"新界","lang":"zh-hans","lname":"New Territories"}
+data/CN/香港/香港島={"id":"data/CN/香港/香港島","key":"香港島","lang":"zh-hans","lname":"Hong Kong Island"}
+data/CN/黑龙江省={"id":"data/CN/黑龙江省","key":"黑龙江省","lang":"zh-hans","lname":"Heilongjiang Sheng","isoid":"23","sub_keys":"大庆市~大兴安岭地区~哈尔滨市~鹤岗市~黑河市~鸡西市~佳木斯市~牡丹江市~七台河市~齐齐哈尔市~双鸭山市~绥化市~伊春市","sub_lnames":"Daqing Shi~Da Hinggan Ling Diqu~Harbin Shi~Hegang Shi~Heihe Shi~Jixi Shi~Jiamusi Shi~Mudanjiang Shi~Qitaihe Shi~Qiqihar Shi~Shuangyashan Shi~Suihua Shi~Yichun Shi","sub_zipexs":"163311~165000~150010~154100~164300~158100~154002~157000~154600~161005~155100~152000~153000","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true"}
+data/CN/黑龙江省/七台河市={"id":"data/CN/黑龙江省/七台河市","key":"七台河市","lang":"zh-hans","lname":"Qitaihe Shi","zipex":"154600","sub_keys":"勃利县~茄子河区~桃山区~新兴区","sub_lnames":"Boli Xian~Qiezihe Qu~Taoshan Qu~Xinxing Qu","sub_zipexs":"154500~154622~154600~154604"}
+data/CN/黑龙江省/七台河市/勃利县={"id":"data/CN/黑龙江省/七台河市/勃利县","key":"勃利县","lang":"zh-hans","lname":"Boli Xian","zipex":"154500"}
+data/CN/黑龙江省/七台河市/新兴区={"id":"data/CN/黑龙江省/七台河市/新兴区","key":"新兴区","lang":"zh-hans","lname":"Xinxing Qu","zipex":"154604"}
+data/CN/黑龙江省/七台河市/桃山区={"id":"data/CN/黑龙江省/七台河市/桃山区","key":"桃山区","lang":"zh-hans","lname":"Taoshan Qu","zipex":"154600"}
+data/CN/黑龙江省/七台河市/茄子河区={"id":"data/CN/黑龙江省/七台河市/茄子河区","key":"茄子河区","lang":"zh-hans","lname":"Qiezihe Qu","zipex":"154622"}
+data/CN/黑龙江省/伊春市={"id":"data/CN/黑龙江省/伊春市","key":"伊春市","lang":"zh-hans","lname":"Yichun Shi","zipex":"153000","sub_keys":"翠峦区~带岭区~红星区~嘉荫县~金山屯区~美溪区~南岔区~上甘岭区~汤旺河区~铁力市~乌马河区~乌伊岭区~五营区~西林区~新青区~伊春区~友好区","sub_lnames":"Cuiluan Qu~Dailing Qu~Hongxing Qu~Jiayin Xian~Jinshantun Qu~Meixi Qu~Nancha Qu~Shangganling Qu~Tangwanghe Qu~Tieli Shi~Wumahe Qu~Wuyiling Qu~Wuying Qu~Xilin Qu~Xinqing Qu~Yichun Qu~Youhao Qu","sub_zipexs":"153013~153106~153035~153200~152026~153021~153100~153032~153037~152500~153011~153038~153033~153025~153036~153000~153031"}
+data/CN/黑龙江省/伊春市/上甘岭区={"id":"data/CN/黑龙江省/伊春市/上甘岭区","key":"上甘岭区","lang":"zh-hans","lname":"Shangganling Qu","zipex":"153032"}
+data/CN/黑龙江省/伊春市/乌伊岭区={"id":"data/CN/黑龙江省/伊春市/乌伊岭区","key":"乌伊岭区","lang":"zh-hans","lname":"Wuyiling Qu","zipex":"153038"}
+data/CN/黑龙江省/伊春市/乌马河区={"id":"data/CN/黑龙江省/伊春市/乌马河区","key":"乌马河区","lang":"zh-hans","lname":"Wumahe Qu","zipex":"153011"}
+data/CN/黑龙江省/伊春市/五营区={"id":"data/CN/黑龙江省/伊春市/五营区","key":"五营区","lang":"zh-hans","lname":"Wuying Qu","zipex":"153033"}
+data/CN/黑龙江省/伊春市/伊春区={"id":"data/CN/黑龙江省/伊春市/伊春区","key":"伊春区","lang":"zh-hans","lname":"Yichun Qu","zipex":"153000"}
+data/CN/黑龙江省/伊春市/南岔区={"id":"data/CN/黑龙江省/伊春市/南岔区","key":"南岔区","lang":"zh-hans","lname":"Nancha Qu","zipex":"153100"}
+data/CN/黑龙江省/伊春市/友好区={"id":"data/CN/黑龙江省/伊春市/友好区","key":"友好区","lang":"zh-hans","lname":"Youhao Qu","zipex":"153031"}
+data/CN/黑龙江省/伊春市/嘉荫县={"id":"data/CN/黑龙江省/伊春市/嘉荫县","key":"嘉荫县","lang":"zh-hans","lname":"Jiayin Xian","zipex":"153200"}
+data/CN/黑龙江省/伊春市/带岭区={"id":"data/CN/黑龙江省/伊春市/带岭区","key":"带岭区","lang":"zh-hans","lname":"Dailing Qu","zipex":"153106"}
+data/CN/黑龙江省/伊春市/新青区={"id":"data/CN/黑龙江省/伊春市/新青区","key":"新青区","lang":"zh-hans","lname":"Xinqing Qu","zipex":"153036"}
+data/CN/黑龙江省/伊春市/汤旺河区={"id":"data/CN/黑龙江省/伊春市/汤旺河区","key":"汤旺河区","lang":"zh-hans","lname":"Tangwanghe Qu","zipex":"153037"}
+data/CN/黑龙江省/伊春市/红星区={"id":"data/CN/黑龙江省/伊春市/红星区","key":"红星区","lang":"zh-hans","lname":"Hongxing Qu","zipex":"153035"}
+data/CN/黑龙江省/伊春市/美溪区={"id":"data/CN/黑龙江省/伊春市/美溪区","key":"美溪区","lang":"zh-hans","lname":"Meixi Qu","zipex":"153021"}
+data/CN/黑龙江省/伊春市/翠峦区={"id":"data/CN/黑龙江省/伊春市/翠峦区","key":"翠峦区","lang":"zh-hans","lname":"Cuiluan Qu","zipex":"153013"}
+data/CN/黑龙江省/伊春市/西林区={"id":"data/CN/黑龙江省/伊春市/西林区","key":"西林区","lang":"zh-hans","lname":"Xilin Qu","zipex":"153025"}
+data/CN/黑龙江省/伊春市/金山屯区={"id":"data/CN/黑龙江省/伊春市/金山屯区","key":"金山屯区","lang":"zh-hans","lname":"Jinshantun Qu","zipex":"152026"}
+data/CN/黑龙江省/伊春市/铁力市={"id":"data/CN/黑龙江省/伊春市/铁力市","key":"铁力市","lang":"zh-hans","lname":"Tieli Shi","zipex":"152500"}
+data/CN/黑龙江省/佳木斯市={"id":"data/CN/黑龙江省/佳木斯市","key":"佳木斯市","lang":"zh-hans","lname":"Jiamusi Shi","zipex":"154002","sub_keys":"东风区~抚远县~富锦市~桦川县~桦南县~郊区~前进区~汤原县~同江市~向阳区","sub_lnames":"Dongfeng Qu~Fuyuan Xian~Fujin Shi~Huachuan Xian~Huanan Xian~Jiao Qu~Qianjin Qu~Tangyuan Xian~Tongjiang Shi~Xiangyang Qu","sub_zipexs":"154005~156500~156100~154300~154400~154004~154002~154700~156400~154002"}
+data/CN/黑龙江省/佳木斯市/东风区={"id":"data/CN/黑龙江省/佳木斯市/东风区","key":"东风区","lang":"zh-hans","lname":"Dongfeng Qu","zipex":"154005"}
+data/CN/黑龙江省/佳木斯市/前进区={"id":"data/CN/黑龙江省/佳木斯市/前进区","key":"前进区","lang":"zh-hans","lname":"Qianjin Qu","zipex":"154002"}
+data/CN/黑龙江省/佳木斯市/同江市={"id":"data/CN/黑龙江省/佳木斯市/同江市","key":"同江市","lang":"zh-hans","lname":"Tongjiang Shi","zipex":"156400"}
+data/CN/黑龙江省/佳木斯市/向阳区={"id":"data/CN/黑龙江省/佳木斯市/向阳区","key":"向阳区","lang":"zh-hans","lname":"Xiangyang Qu","zipex":"154002"}
+data/CN/黑龙江省/佳木斯市/富锦市={"id":"data/CN/黑龙江省/佳木斯市/富锦市","key":"富锦市","lang":"zh-hans","lname":"Fujin Shi","zipex":"156100"}
+data/CN/黑龙江省/佳木斯市/抚远县={"id":"data/CN/黑龙江省/佳木斯市/抚远县","key":"抚远县","lang":"zh-hans","lname":"Fuyuan Xian","zipex":"156500"}
+data/CN/黑龙江省/佳木斯市/桦南县={"id":"data/CN/黑龙江省/佳木斯市/桦南县","key":"桦南县","lang":"zh-hans","lname":"Huanan Xian","zipex":"154400"}
+data/CN/黑龙江省/佳木斯市/桦川县={"id":"data/CN/黑龙江省/佳木斯市/桦川县","key":"桦川县","lang":"zh-hans","lname":"Huachuan Xian","zipex":"154300"}
+data/CN/黑龙江省/佳木斯市/汤原县={"id":"data/CN/黑龙江省/佳木斯市/汤原县","key":"汤原县","lang":"zh-hans","lname":"Tangyuan Xian","zipex":"154700"}
+data/CN/黑龙江省/佳木斯市/郊区={"id":"data/CN/黑龙江省/佳木斯市/郊区","key":"郊区","lang":"zh-hans","lname":"Jiao Qu","zipex":"154004"}
+data/CN/黑龙江省/双鸭山市={"id":"data/CN/黑龙江省/双鸭山市","key":"双鸭山市","lang":"zh-hans","lname":"Shuangyashan Shi","zipex":"155100","sub_keys":"宝清县~宝山区~集贤县~尖山区~岭东区~饶河县~四方台区~友谊县","sub_lnames":"Baoqing Xian~Baoshan Qu~Jixian Xian~Jianshan Qu~Lingdong Qu~Raohe Xian~Sifangtai Qu~Youyi Xian","sub_zipexs":"155600~155131~155900~155100~155120~155700~155130~155800"}
+data/CN/黑龙江省/双鸭山市/友谊县={"id":"data/CN/黑龙江省/双鸭山市/友谊县","key":"友谊县","lang":"zh-hans","lname":"Youyi Xian","zipex":"155800"}
+data/CN/黑龙江省/双鸭山市/四方台区={"id":"data/CN/黑龙江省/双鸭山市/四方台区","key":"四方台区","lang":"zh-hans","lname":"Sifangtai Qu","zipex":"155130"}
+data/CN/黑龙江省/双鸭山市/宝山区={"id":"data/CN/黑龙江省/双鸭山市/宝山区","key":"宝山区","lang":"zh-hans","lname":"Baoshan Qu","zipex":"155131"}
+data/CN/黑龙江省/双鸭山市/宝清县={"id":"data/CN/黑龙江省/双鸭山市/宝清县","key":"宝清县","lang":"zh-hans","lname":"Baoqing Xian","zipex":"155600"}
+data/CN/黑龙江省/双鸭山市/尖山区={"id":"data/CN/黑龙江省/双鸭山市/尖山区","key":"尖山区","lang":"zh-hans","lname":"Jianshan Qu","zipex":"155100"}
+data/CN/黑龙江省/双鸭山市/岭东区={"id":"data/CN/黑龙江省/双鸭山市/岭东区","key":"岭东区","lang":"zh-hans","lname":"Lingdong Qu","zipex":"155120"}
+data/CN/黑龙江省/双鸭山市/集贤县={"id":"data/CN/黑龙江省/双鸭山市/集贤县","key":"集贤县","lang":"zh-hans","lname":"Jixian Xian","zipex":"155900"}
+data/CN/黑龙江省/双鸭山市/饶河县={"id":"data/CN/黑龙江省/双鸭山市/饶河县","key":"饶河县","lang":"zh-hans","lname":"Raohe Xian","zipex":"155700"}
+data/CN/黑龙江省/哈尔滨市={"id":"data/CN/黑龙江省/哈尔滨市","key":"哈尔滨市","lang":"zh-hans","lname":"Harbin Shi","zipex":"150010","sub_keys":"阿城区~巴彦县~宾县~道里区~道外区~方正县~呼兰区~木兰县~南岗区~平房区~尚志市~双城市~松北区~通河县~五常市~香坊区~延寿县~依兰县","sub_lnames":"Acheng Qu~Bayan Xian~Bin Xian~Daoli Qu~Daowai Qu~Fangzheng Xian~Hulan Qu~Mulan Xian~Nangang Qu~Pingfang Qu~Shangzhi Shi~Shuangcheng Shi~Sonbgei Qu~Tonghe Xian~Wuchang Shi~Xiangfang Qu~Yanshou Xian~Yilan Xian","sub_zipexs":"150300~151800~150400~150010~150020~150800~150500~151900~150006~150060~150600~150100~150056~150900~150200~150036~150700~154800"}
+data/CN/黑龙江省/哈尔滨市/五常市={"id":"data/CN/黑龙江省/哈尔滨市/五常市","key":"五常市","lang":"zh-hans","lname":"Wuchang Shi","zipex":"150200"}
+data/CN/黑龙江省/哈尔滨市/依兰县={"id":"data/CN/黑龙江省/哈尔滨市/依兰县","key":"依兰县","lang":"zh-hans","lname":"Yilan Xian","zipex":"154800"}
+data/CN/黑龙江省/哈尔滨市/南岗区={"id":"data/CN/黑龙江省/哈尔滨市/南岗区","key":"南岗区","lang":"zh-hans","lname":"Nangang Qu","zipex":"150006"}
+data/CN/黑龙江省/哈尔滨市/双城市={"id":"data/CN/黑龙江省/哈尔滨市/双城市","key":"双城市","lang":"zh-hans","lname":"Shuangcheng Shi","zipex":"150100"}
+data/CN/黑龙江省/哈尔滨市/呼兰区={"id":"data/CN/黑龙江省/哈尔滨市/呼兰区","key":"呼兰区","lang":"zh-hans","lname":"Hulan Qu","zipex":"150500"}
+data/CN/黑龙江省/哈尔滨市/宾县={"id":"data/CN/黑龙江省/哈尔滨市/宾县","key":"宾县","lang":"zh-hans","lname":"Bin Xian","zipex":"150400"}
+data/CN/黑龙江省/哈尔滨市/尚志市={"id":"data/CN/黑龙江省/哈尔滨市/尚志市","key":"尚志市","lang":"zh-hans","lname":"Shangzhi Shi","zipex":"150600"}
+data/CN/黑龙江省/哈尔滨市/巴彦县={"id":"data/CN/黑龙江省/哈尔滨市/巴彦县","key":"巴彦县","lang":"zh-hans","lname":"Bayan Xian","zipex":"151800"}
+data/CN/黑龙江省/哈尔滨市/平房区={"id":"data/CN/黑龙江省/哈尔滨市/平房区","key":"平房区","lang":"zh-hans","lname":"Pingfang Qu","zipex":"150060"}
+data/CN/黑龙江省/哈尔滨市/延寿县={"id":"data/CN/黑龙江省/哈尔滨市/延寿县","key":"延寿县","lang":"zh-hans","lname":"Yanshou Xian","zipex":"150700"}
+data/CN/黑龙江省/哈尔滨市/方正县={"id":"data/CN/黑龙江省/哈尔滨市/方正县","key":"方正县","lang":"zh-hans","lname":"Fangzheng Xian","zipex":"150800"}
+data/CN/黑龙江省/哈尔滨市/木兰县={"id":"data/CN/黑龙江省/哈尔滨市/木兰县","key":"木兰县","lang":"zh-hans","lname":"Mulan Xian","zipex":"151900"}
+data/CN/黑龙江省/哈尔滨市/松北区={"id":"data/CN/黑龙江省/哈尔滨市/松北区","key":"松北区","lang":"zh-hans","lname":"Sonbgei Qu","zipex":"150056"}
+data/CN/黑龙江省/哈尔滨市/通河县={"id":"data/CN/黑龙江省/哈尔滨市/通河县","key":"通河县","lang":"zh-hans","lname":"Tonghe Xian","zipex":"150900"}
+data/CN/黑龙江省/哈尔滨市/道外区={"id":"data/CN/黑龙江省/哈尔滨市/道外区","key":"道外区","lang":"zh-hans","lname":"Daowai Qu","zipex":"150020"}
+data/CN/黑龙江省/哈尔滨市/道里区={"id":"data/CN/黑龙江省/哈尔滨市/道里区","key":"道里区","lang":"zh-hans","lname":"Daoli Qu","zipex":"150010"}
+data/CN/黑龙江省/哈尔滨市/阿城区={"id":"data/CN/黑龙江省/哈尔滨市/阿城区","key":"阿城区","lang":"zh-hans","lname":"Acheng Qu","zipex":"150300"}
+data/CN/黑龙江省/哈尔滨市/香坊区={"id":"data/CN/黑龙江省/哈尔滨市/香坊区","key":"香坊区","lang":"zh-hans","lname":"Xiangfang Qu","zipex":"150036"}
+data/CN/黑龙江省/大兴安岭地区={"id":"data/CN/黑龙江省/大兴安岭地区","key":"大兴安岭地区","lang":"zh-hans","lname":"Da Hinggan Ling Diqu","zipex":"165000","sub_keys":"呼玛县~呼中区~加格达奇区~漠河县~松岭区~塔河县~新林区","sub_lnames":"Huma Xian~Huzhong Qu~Jiagedaqi Qu~Mohe Xian~Songling Qu~Tahe Xian~Xinlin Qu","sub_zipexs":"165100~~~165300~~165200~"}
+data/CN/黑龙江省/大兴安岭地区/加格达奇区={"id":"data/CN/黑龙江省/大兴安岭地区/加格达奇区","key":"加格达奇区","lang":"zh-hans","lname":"Jiagedaqi Qu"}
+data/CN/黑龙江省/大兴安岭地区/呼中区={"id":"data/CN/黑龙江省/大兴安岭地区/呼中区","key":"呼中区","lang":"zh-hans","lname":"Huzhong Qu"}
+data/CN/黑龙江省/大兴安岭地区/呼玛县={"id":"data/CN/黑龙江省/大兴安岭地区/呼玛县","key":"呼玛县","lang":"zh-hans","lname":"Huma Xian","zipex":"165100"}
+data/CN/黑龙江省/大兴安岭地区/塔河县={"id":"data/CN/黑龙江省/大兴安岭地区/塔河县","key":"塔河县","lang":"zh-hans","lname":"Tahe Xian","zipex":"165200"}
+data/CN/黑龙江省/大兴安岭地区/新林区={"id":"data/CN/黑龙江省/大兴安岭地区/新林区","key":"新林区","lang":"zh-hans","lname":"Xinlin Qu"}
+data/CN/黑龙江省/大兴安岭地区/松岭区={"id":"data/CN/黑龙江省/大兴安岭地区/松岭区","key":"松岭区","lang":"zh-hans","lname":"Songling Qu"}
+data/CN/黑龙江省/大兴安岭地区/漠河县={"id":"data/CN/黑龙江省/大兴安岭地区/漠河县","key":"漠河县","lang":"zh-hans","lname":"Mohe Xian","zipex":"165300"}
+data/CN/黑龙江省/大庆市={"id":"data/CN/黑龙江省/大庆市","key":"大庆市","lang":"zh-hans","lname":"Daqing Shi","zipex":"163311","sub_keys":"大同区~杜尔伯特蒙古族自治县~红岗区~林甸县~龙凤区~让胡路区~萨尔图区~肇源县~肇州县","sub_lnames":"Datong Qu~Dorbod Xian~Honggang Qu~Lindian Xian~Longfeng Qu~Ranghulu Qu~Sairt Qu~Zhaoyuan Xian~Zhaozhou Xian","sub_zipexs":"163515~166200~163511~166300~163711~163712~163001~166500~166400","sub_lfnames":"~Dorbod Mongolzu Zizhixian~~~~~~~"}
+data/CN/黑龙江省/大庆市/大同区={"id":"data/CN/黑龙江省/大庆市/大同区","key":"大同区","lang":"zh-hans","lname":"Datong Qu","zipex":"163515"}
+data/CN/黑龙江省/大庆市/杜尔伯特蒙古族自治县={"id":"data/CN/黑龙江省/大庆市/杜尔伯特蒙古族自治县","key":"杜尔伯特蒙古族自治县","lang":"zh-hans","lname":"Dorbod Xian","zipex":"166200","lfname":"Dorbod Mongolzu Zizhixian"}
+data/CN/黑龙江省/大庆市/林甸县={"id":"data/CN/黑龙江省/大庆市/林甸县","key":"林甸县","lang":"zh-hans","lname":"Lindian Xian","zipex":"166300"}
+data/CN/黑龙江省/大庆市/红岗区={"id":"data/CN/黑龙江省/大庆市/红岗区","key":"红岗区","lang":"zh-hans","lname":"Honggang Qu","zipex":"163511"}
+data/CN/黑龙江省/大庆市/肇州县={"id":"data/CN/黑龙江省/大庆市/肇州县","key":"肇州县","lang":"zh-hans","lname":"Zhaozhou Xian","zipex":"166400"}
+data/CN/黑龙江省/大庆市/肇源县={"id":"data/CN/黑龙江省/大庆市/肇源县","key":"肇源县","lang":"zh-hans","lname":"Zhaoyuan Xian","zipex":"166500"}
+data/CN/黑龙江省/大庆市/萨尔图区={"id":"data/CN/黑龙江省/大庆市/萨尔图区","key":"萨尔图区","lang":"zh-hans","lname":"Sairt Qu","zipex":"163001"}
+data/CN/黑龙江省/大庆市/让胡路区={"id":"data/CN/黑龙江省/大庆市/让胡路区","key":"让胡路区","lang":"zh-hans","lname":"Ranghulu Qu","zipex":"163712"}
+data/CN/黑龙江省/大庆市/龙凤区={"id":"data/CN/黑龙江省/大庆市/龙凤区","key":"龙凤区","lang":"zh-hans","lname":"Longfeng Qu","zipex":"163711"}
+data/CN/黑龙江省/牡丹江市={"id":"data/CN/黑龙江省/牡丹江市","key":"牡丹江市","lang":"zh-hans","lname":"Mudanjiang Shi","zipex":"157000","sub_keys":"爱民区~东安区~东宁县~海林市~林口县~穆棱市~宁安市~绥芬河市~西安区~阳明区","sub_lnames":"Aimin Qu~Dong'an Qu~Dongning Xian~Hailin Shi~Linkou Xian~Muling Shi~Ning'an Shi~Suifenhe Shi~Xi'an Qu~Yangming Qu","sub_zipexs":"157009~157000~157200~157100~157600~157500~157400~157300~157000~157013"}
+data/CN/黑龙江省/牡丹江市/东宁县={"id":"data/CN/黑龙江省/牡丹江市/东宁县","key":"东宁县","lang":"zh-hans","lname":"Dongning Xian","zipex":"157200"}
+data/CN/黑龙江省/牡丹江市/东安区={"id":"data/CN/黑龙江省/牡丹江市/东安区","key":"东安区","lang":"zh-hans","lname":"Dong'an Qu","zipex":"157000"}
+data/CN/黑龙江省/牡丹江市/宁安市={"id":"data/CN/黑龙江省/牡丹江市/宁安市","key":"宁安市","lang":"zh-hans","lname":"Ning'an Shi","zipex":"157400"}
+data/CN/黑龙江省/牡丹江市/林口县={"id":"data/CN/黑龙江省/牡丹江市/林口县","key":"林口县","lang":"zh-hans","lname":"Linkou Xian","zipex":"157600"}
+data/CN/黑龙江省/牡丹江市/海林市={"id":"data/CN/黑龙江省/牡丹江市/海林市","key":"海林市","lang":"zh-hans","lname":"Hailin Shi","zipex":"157100"}
+data/CN/黑龙江省/牡丹江市/爱民区={"id":"data/CN/黑龙江省/牡丹江市/爱民区","key":"爱民区","lang":"zh-hans","lname":"Aimin Qu","zipex":"157009"}
+data/CN/黑龙江省/牡丹江市/穆棱市={"id":"data/CN/黑龙江省/牡丹江市/穆棱市","key":"穆棱市","lang":"zh-hans","lname":"Muling Shi","zipex":"157500"}
+data/CN/黑龙江省/牡丹江市/绥芬河市={"id":"data/CN/黑龙江省/牡丹江市/绥芬河市","key":"绥芬河市","lang":"zh-hans","lname":"Suifenhe Shi","zipex":"157300"}
+data/CN/黑龙江省/牡丹江市/西安区={"id":"data/CN/黑龙江省/牡丹江市/西安区","key":"西安区","lang":"zh-hans","lname":"Xi'an Qu","zipex":"157000"}
+data/CN/黑龙江省/牡丹江市/阳明区={"id":"data/CN/黑龙江省/牡丹江市/阳明区","key":"阳明区","lang":"zh-hans","lname":"Yangming Qu","zipex":"157013"}
+data/CN/黑龙江省/绥化市={"id":"data/CN/黑龙江省/绥化市","key":"绥化市","lang":"zh-hans","lname":"Suihua Shi","zipex":"152000","sub_keys":"安达市~北林区~海伦市~兰西县~明水县~青冈县~庆安县~绥棱县~望奎县~肇东市","sub_lnames":"Anda Shi~Beilin Qu~Hailun Shi~Lanxi Xian~Mingshui Xian~Qinggang Xian~Qing'an Xian~Suileng Xian~Wangkui Xian~Zhaodong Shi","sub_zipexs":"151400~152000~152300~151500~151700~151600~152400~152200~152101~151100"}
+data/CN/黑龙江省/绥化市/兰西县={"id":"data/CN/黑龙江省/绥化市/兰西县","key":"兰西县","lang":"zh-hans","lname":"Lanxi Xian","zipex":"151500"}
+data/CN/黑龙江省/绥化市/北林区={"id":"data/CN/黑龙江省/绥化市/北林区","key":"北林区","lang":"zh-hans","lname":"Beilin Qu","zipex":"152000"}
+data/CN/黑龙江省/绥化市/安达市={"id":"data/CN/黑龙江省/绥化市/安达市","key":"安达市","lang":"zh-hans","lname":"Anda Shi","zipex":"151400"}
+data/CN/黑龙江省/绥化市/庆安县={"id":"data/CN/黑龙江省/绥化市/庆安县","key":"庆安县","lang":"zh-hans","lname":"Qing'an Xian","zipex":"152400"}
+data/CN/黑龙江省/绥化市/明水县={"id":"data/CN/黑龙江省/绥化市/明水县","key":"明水县","lang":"zh-hans","lname":"Mingshui Xian","zipex":"151700"}
+data/CN/黑龙江省/绥化市/望奎县={"id":"data/CN/黑龙江省/绥化市/望奎县","key":"望奎县","lang":"zh-hans","lname":"Wangkui Xian","zipex":"152101"}
+data/CN/黑龙江省/绥化市/海伦市={"id":"data/CN/黑龙江省/绥化市/海伦市","key":"海伦市","lang":"zh-hans","lname":"Hailun Shi","zipex":"152300"}
+data/CN/黑龙江省/绥化市/绥棱县={"id":"data/CN/黑龙江省/绥化市/绥棱县","key":"绥棱县","lang":"zh-hans","lname":"Suileng Xian","zipex":"152200"}
+data/CN/黑龙江省/绥化市/肇东市={"id":"data/CN/黑龙江省/绥化市/肇东市","key":"肇东市","lang":"zh-hans","lname":"Zhaodong Shi","zipex":"151100"}
+data/CN/黑龙江省/绥化市/青冈县={"id":"data/CN/黑龙江省/绥化市/青冈县","key":"青冈县","lang":"zh-hans","lname":"Qinggang Xian","zipex":"151600"}
+data/CN/黑龙江省/鸡西市={"id":"data/CN/黑龙江省/鸡西市","key":"鸡西市","lang":"zh-hans","lname":"Jixi Shi","zipex":"158100","sub_keys":"城子河区~滴道区~恒山区~虎林市~鸡东县~鸡冠区~梨树区~麻山区~密山市","sub_lnames":"Chengzihe Qu~Keyao Qu~Hengshan Qu~Hulin Shi~Jidong Xian~Jiguan Qu~Lishu Qu~Mashan Qu~Mishan Shi","sub_zipexs":"158170~158150~158130~158400~158200~158100~158160~158180~158300"}
+data/CN/黑龙江省/鸡西市/城子河区={"id":"data/CN/黑龙江省/鸡西市/城子河区","key":"城子河区","lang":"zh-hans","lname":"Chengzihe Qu","zipex":"158170"}
+data/CN/黑龙江省/鸡西市/密山市={"id":"data/CN/黑龙江省/鸡西市/密山市","key":"密山市","lang":"zh-hans","lname":"Mishan Shi","zipex":"158300"}
+data/CN/黑龙江省/鸡西市/恒山区={"id":"data/CN/黑龙江省/鸡西市/恒山区","key":"恒山区","lang":"zh-hans","lname":"Hengshan Qu","zipex":"158130"}
+data/CN/黑龙江省/鸡西市/梨树区={"id":"data/CN/黑龙江省/鸡西市/梨树区","key":"梨树区","lang":"zh-hans","lname":"Lishu Qu","zipex":"158160"}
+data/CN/黑龙江省/鸡西市/滴道区={"id":"data/CN/黑龙江省/鸡西市/滴道区","key":"滴道区","lang":"zh-hans","lname":"Keyao Qu","zipex":"158150"}
+data/CN/黑龙江省/鸡西市/虎林市={"id":"data/CN/黑龙江省/鸡西市/虎林市","key":"虎林市","lang":"zh-hans","lname":"Hulin Shi","zipex":"158400"}
+data/CN/黑龙江省/鸡西市/鸡东县={"id":"data/CN/黑龙江省/鸡西市/鸡东县","key":"鸡东县","lang":"zh-hans","lname":"Jidong Xian","zipex":"158200"}
+data/CN/黑龙江省/鸡西市/鸡冠区={"id":"data/CN/黑龙江省/鸡西市/鸡冠区","key":"鸡冠区","lang":"zh-hans","lname":"Jiguan Qu","zipex":"158100"}
+data/CN/黑龙江省/鸡西市/麻山区={"id":"data/CN/黑龙江省/鸡西市/麻山区","key":"麻山区","lang":"zh-hans","lname":"Mashan Qu","zipex":"158180"}
+data/CN/黑龙江省/鹤岗市={"id":"data/CN/黑龙江省/鹤岗市","key":"鹤岗市","lang":"zh-hans","lname":"Hegang Shi","zipex":"154100","sub_keys":"东山区~工农区~萝北县~南山区~绥滨县~向阳区~兴安区~兴山区","sub_lnames":"Dongshan Qu~Gongnong Qu~Luobei Xian~Nanshan Qu~Suibin Xian~Xiangyang Qu~Xing'an Qu~Xingshan Qu","sub_zipexs":"154106~154101~154200~154104~156200~154100~154102~154105"}
+data/CN/黑龙江省/鹤岗市/东山区={"id":"data/CN/黑龙江省/鹤岗市/东山区","key":"东山区","lang":"zh-hans","lname":"Dongshan Qu","zipex":"154106"}
+data/CN/黑龙江省/鹤岗市/兴安区={"id":"data/CN/黑龙江省/鹤岗市/兴安区","key":"兴安区","lang":"zh-hans","lname":"Xing'an Qu","zipex":"154102"}
+data/CN/黑龙江省/鹤岗市/兴山区={"id":"data/CN/黑龙江省/鹤岗市/兴山区","key":"兴山区","lang":"zh-hans","lname":"Xingshan Qu","zipex":"154105"}
+data/CN/黑龙江省/鹤岗市/南山区={"id":"data/CN/黑龙江省/鹤岗市/南山区","key":"南山区","lang":"zh-hans","lname":"Nanshan Qu","zipex":"154104"}
+data/CN/黑龙江省/鹤岗市/向阳区={"id":"data/CN/黑龙江省/鹤岗市/向阳区","key":"向阳区","lang":"zh-hans","lname":"Xiangyang Qu","zipex":"154100"}
+data/CN/黑龙江省/鹤岗市/工农区={"id":"data/CN/黑龙江省/鹤岗市/工农区","key":"工农区","lang":"zh-hans","lname":"Gongnong Qu","zipex":"154101"}
+data/CN/黑龙江省/鹤岗市/绥滨县={"id":"data/CN/黑龙江省/鹤岗市/绥滨县","key":"绥滨县","lang":"zh-hans","lname":"Suibin Xian","zipex":"156200"}
+data/CN/黑龙江省/鹤岗市/萝北县={"id":"data/CN/黑龙江省/鹤岗市/萝北县","key":"萝北县","lang":"zh-hans","lname":"Luobei Xian","zipex":"154200"}
+data/CN/黑龙江省/黑河市={"id":"data/CN/黑龙江省/黑河市","key":"黑河市","lang":"zh-hans","lname":"Heihe Shi","zipex":"164300","sub_keys":"爱辉区~北安市~嫩江县~孙吴县~五大连池市~逊克县","sub_lnames":"Aihui Qu~Bei'an Shi~Nenjiang Xian~Sunwu Xian~Wudalianchi Shi~Xunke Xian","sub_zipexs":"164300~164000~161400~164200~164100~164400"}
+data/CN/黑龙江省/黑河市/五大连池市={"id":"data/CN/黑龙江省/黑河市/五大连池市","key":"五大连池市","lang":"zh-hans","lname":"Wudalianchi Shi","zipex":"164100"}
+data/CN/黑龙江省/黑河市/北安市={"id":"data/CN/黑龙江省/黑河市/北安市","key":"北安市","lang":"zh-hans","lname":"Bei'an Shi","zipex":"164000"}
+data/CN/黑龙江省/黑河市/嫩江县={"id":"data/CN/黑龙江省/黑河市/嫩江县","key":"嫩江县","lang":"zh-hans","lname":"Nenjiang Xian","zipex":"161400"}
+data/CN/黑龙江省/黑河市/孙吴县={"id":"data/CN/黑龙江省/黑河市/孙吴县","key":"孙吴县","lang":"zh-hans","lname":"Sunwu Xian","zipex":"164200"}
+data/CN/黑龙江省/黑河市/爱辉区={"id":"data/CN/黑龙江省/黑河市/爱辉区","key":"爱辉区","lang":"zh-hans","lname":"Aihui Qu","zipex":"164300"}
+data/CN/黑龙江省/黑河市/逊克县={"id":"data/CN/黑龙江省/黑河市/逊克县","key":"逊克县","lang":"zh-hans","lname":"Xunke Xian","zipex":"164400"}
+data/CN/黑龙江省/齐齐哈尔市={"id":"data/CN/黑龙江省/齐齐哈尔市","key":"齐齐哈尔市","lang":"zh-hans","lname":"Qiqihar Shi","zipex":"161005","sub_keys":"昂昂溪区~拜泉县~富拉尔基区~富裕县~甘南县~建华区~克东县~克山县~龙江县~龙沙区~梅里斯达斡尔族区~讷河市~碾子山区~泰来县~铁锋区~依安县","sub_lnames":"Ang'angxi Qu~Baiquan Xian~Hulan Ergi Qu~Fuyu Xian~Gannan Xian~Jianhua Qu~Kedong Xian~Keshan Xian~Longjiang Xian~Longsha Qu~Meilisi Daurzu Qu~Nehe Shi~Nianzishan Qu~Tailai Xian~Tiefeng Qu~Yi'an Xian","sub_zipexs":"161031~164700~161041~161200~162100~161006~164800~161600~161100~161000~161021~161300~161046~162400~161000~161500"}
+data/CN/黑龙江省/齐齐哈尔市/依安县={"id":"data/CN/黑龙江省/齐齐哈尔市/依安县","key":"依安县","lang":"zh-hans","lname":"Yi'an Xian","zipex":"161500"}
+data/CN/黑龙江省/齐齐哈尔市/克东县={"id":"data/CN/黑龙江省/齐齐哈尔市/克东县","key":"克东县","lang":"zh-hans","lname":"Kedong Xian","zipex":"164800"}
+data/CN/黑龙江省/齐齐哈尔市/克山县={"id":"data/CN/黑龙江省/齐齐哈尔市/克山县","key":"克山县","lang":"zh-hans","lname":"Keshan Xian","zipex":"161600"}
+data/CN/黑龙江省/齐齐哈尔市/富拉尔基区={"id":"data/CN/黑龙江省/齐齐哈尔市/富拉尔基区","key":"富拉尔基区","lang":"zh-hans","lname":"Hulan Ergi Qu","zipex":"161041"}
+data/CN/黑龙江省/齐齐哈尔市/富裕县={"id":"data/CN/黑龙江省/齐齐哈尔市/富裕县","key":"富裕县","lang":"zh-hans","lname":"Fuyu Xian","zipex":"161200"}
+data/CN/黑龙江省/齐齐哈尔市/建华区={"id":"data/CN/黑龙江省/齐齐哈尔市/建华区","key":"建华区","lang":"zh-hans","lname":"Jianhua Qu","zipex":"161006"}
+data/CN/黑龙江省/齐齐哈尔市/拜泉县={"id":"data/CN/黑龙江省/齐齐哈尔市/拜泉县","key":"拜泉县","lang":"zh-hans","lname":"Baiquan Xian","zipex":"164700"}
+data/CN/黑龙江省/齐齐哈尔市/昂昂溪区={"id":"data/CN/黑龙江省/齐齐哈尔市/昂昂溪区","key":"昂昂溪区","lang":"zh-hans","lname":"Ang'angxi Qu","zipex":"161031"}
+data/CN/黑龙江省/齐齐哈尔市/梅里斯达斡尔族区={"id":"data/CN/黑龙江省/齐齐哈尔市/梅里斯达斡尔族区","key":"梅里斯达斡尔族区","lang":"zh-hans","lname":"Meilisi Daurzu Qu","zipex":"161021"}
+data/CN/黑龙江省/齐齐哈尔市/泰来县={"id":"data/CN/黑龙江省/齐齐哈尔市/泰来县","key":"泰来县","lang":"zh-hans","lname":"Tailai Xian","zipex":"162400"}
+data/CN/黑龙江省/齐齐哈尔市/甘南县={"id":"data/CN/黑龙江省/齐齐哈尔市/甘南县","key":"甘南县","lang":"zh-hans","lname":"Gannan Xian","zipex":"162100"}
+data/CN/黑龙江省/齐齐哈尔市/碾子山区={"id":"data/CN/黑龙江省/齐齐哈尔市/碾子山区","key":"碾子山区","lang":"zh-hans","lname":"Nianzishan Qu","zipex":"161046"}
+data/CN/黑龙江省/齐齐哈尔市/讷河市={"id":"data/CN/黑龙江省/齐齐哈尔市/讷河市","key":"讷河市","lang":"zh-hans","lname":"Nehe Shi","zipex":"161300"}
+data/CN/黑龙江省/齐齐哈尔市/铁锋区={"id":"data/CN/黑龙江省/齐齐哈尔市/铁锋区","key":"铁锋区","lang":"zh-hans","lname":"Tiefeng Qu","zipex":"161000"}
+data/CN/黑龙江省/齐齐哈尔市/龙江县={"id":"data/CN/黑龙江省/齐齐哈尔市/龙江县","key":"龙江县","lang":"zh-hans","lname":"Longjiang Xian","zipex":"161100"}
+data/CN/黑龙江省/齐齐哈尔市/龙沙区={"id":"data/CN/黑龙江省/齐齐哈尔市/龙沙区","key":"龙沙区","lang":"zh-hans","lname":"Longsha Qu","zipex":"161000"}
+data/CO={"id":"data/CO","key":"CO","name":"COLOMBIA","fmt":"%N%n%O%n%A%n%C, %S","zip":"\\d{6}","zipex":"111221,130001,760011","posturl":"http://www.codigopostal4-72.com.co/codigosPostales/"}
+data/CR={"id":"data/CR","key":"CR","name":"COSTA RICA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4,5}|\\d{3}-\\d{4}","zipex":"1000,2010,1001","posturl":"https://www.correos.go.cr/nosotros/codigopostal/busqueda.html"}
+data/CS={"id":"data/CS","key":"CS","name":"SERBIA AND MONTENEGRO","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"11001"}
+data/CV={"id":"data/CV","key":"CV","name":"CAPE VERDE","lang":"pt","languages":"pt","fmt":"%N%n%O%n%A%n%Z %C%n%S","zip":"\\d{4}","zipex":"7600","state_name_type":"island","sub_keys":"BOA VISTA~BRAVA~FOGO~MAIO~SAL~SANTIAGO~SANTO ANTÃO~SÃO NICOLAU~SÃO VICENTE","sub_isoids":"BV~BR~~MA~SL~~~SN~SV"}
+data/CV/BOA VISTA={"id":"data/CV/BOA VISTA","key":"BOA VISTA","lang":"pt","isoid":"BV"}
+data/CV/BRAVA={"id":"data/CV/BRAVA","key":"BRAVA","lang":"pt","isoid":"BR"}
+data/CV/FOGO={"id":"data/CV/FOGO","key":"FOGO","lang":"pt"}
+data/CV/MAIO={"id":"data/CV/MAIO","key":"MAIO","lang":"pt","isoid":"MA"}
+data/CV/SAL={"id":"data/CV/SAL","key":"SAL","lang":"pt","isoid":"SL"}
+data/CV/SANTIAGO={"id":"data/CV/SANTIAGO","key":"SANTIAGO","lang":"pt"}
+data/CV/SANTO ANTÃO={"id":"data/CV/SANTO ANTÃO","key":"SANTO ANTÃO","lang":"pt"}
+data/CV/SÃO NICOLAU={"id":"data/CV/SÃO NICOLAU","key":"SÃO NICOLAU","lang":"pt","isoid":"SN"}
+data/CV/SÃO VICENTE={"id":"data/CV/SÃO VICENTE","key":"SÃO VICENTE","lang":"pt","isoid":"SV"}
+data/CX={"id":"data/CX","key":"CX","name":"CHRISTMAS ISLAND","fmt":"%O%n%N%n%A%n%C %S %Z","upper":"CS","zip":"6798"}
+data/CY={"id":"data/CY","key":"CY","name":"CYPRUS","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"2008,3304,1900"}
+data/CZ={"id":"data/CZ","key":"CZ","name":"CZECH REP.","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{3}[ ]?\\d{2}","zipex":"100 00,251 66,530 87,110 00,225 99","posturl":"http://psc.ceskaposta.cz/CleanForm.action"}
+data/DE={"id":"data/DE","key":"DE","name":"GERMANY","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{5}","zipex":"26133,53225","posturl":"http://www.postdirekt.de/plzserver/"}
+data/DJ={"id":"data/DJ","key":"DJ","name":"DJIBOUTI"}
+data/DK={"id":"data/DK","key":"DK","name":"DENMARK","fmt":"%O%n%N%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"8660,1566","posturl":"http://www.postdanmark.dk/da/Privat/Kundeservice/postnummerkort/Sider/Find-postnummer.aspx"}
+data/DM={"id":"data/DM","key":"DM","name":"DOMINICA"}
+data/DO={"id":"data/DO","key":"DO","name":"DOMINICAN REP.","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"11903,10101","posturl":"http://inposdom.gob.do/servicios/codigo-postal.html#buscar_codigo"}
+data/DZ={"id":"data/DZ","key":"DZ","name":"ALGERIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"40304,16027"}
+data/EC={"id":"data/EC","key":"EC","name":"ECUADOR","fmt":"%N%n%O%n%A%n%Z%n%C","upper":"CZ","zip":"([A-Z]\\d{4}[A-Z]|(?:[A-Z]{2})?\\d{6})?","zipex":"EC090112,090105,H0103C,P0133B,P0133A,P0133V"}
+data/EE={"id":"data/EE","key":"EE","name":"ESTONIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"69501,11212,1001","posturl":"http://www.post.ee/?op=sihtnumbriotsing"}
+data/EG={"id":"data/EG","key":"EG","name":"EGYPT","lang":"ar","languages":"ar","fmt":"%N%n%O%n%A%n%C%n%S%n%Z","lfmt":"%N%n%O%n%A%n%C%n%S%n%Z","zip":"\\d{5}","zipex":"12411,11599","sub_keys":"أسوان~أسيوط~الأقصر~الإسكندرية~الإسماعيلية~البحر الأحمر~البحيرة~الجيزة~الدقهلية~السويس~الشرقية~الغربية~الفيوم~القاهرة~القليوبية~المنوفية~المنيا~الوادي الجديد~بني سويف~بورسعيد~جنوب سيناء~دمياط~سوهاج~شمال سيناء~قنا~كفر الشيخ~مطروح","sub_lnames":"Aswan~Asyut~Luxor~Alexandria~Ismailia~Red Sea~Beheira~Giza~Dakahlia~Suez~Al Sharqia~Gharbia~Faiyum~Cairo~Qalyubia~Monufia~Minya~New Valley~Beni Suef~Port Said~South Sinai~Damietta~Sohag~North Sinai~Qena~Kafr el-Sheikh~Matruh","sub_zips":"81~71~85~2[13]~41~84~22~12~35~43~44~31~63~11~13~32~61~72~62~42~46~34~82~45~83~33~51","sub_zipexs":"81000~71000~85000~21000,23000~41000~84000~22000~12000~35000~43000~44000~31000~63000~11000~13000~32000~61000~72000~62000~42000~46000~34000~82000~45000~83000~33000~51000","sub_isoids":"ASN~AST~LX~ALX~IS~BA~BH~GZ~DK~SUZ~SHR~GH~FYM~C~KB~MNF~MN~WAD~BNS~PTS~JS~DT~SHG~SIN~KN~KFS~MT"}
+data/EG/أسوان={"id":"data/EG/أسوان","key":"أسوان","lang":"ar","lname":"Aswan","zip":"81","zipex":"81000","isoid":"ASN"}
+data/EG/أسيوط={"id":"data/EG/أسيوط","key":"أسيوط","lang":"ar","lname":"Asyut","zip":"71","zipex":"71000","isoid":"AST"}
+data/EG/الأقصر={"id":"data/EG/الأقصر","key":"الأقصر","lang":"ar","lname":"Luxor","zip":"85","zipex":"85000","isoid":"LX"}
+data/EG/الإسكندرية={"id":"data/EG/الإسكندرية","key":"الإسكندرية","lang":"ar","lname":"Alexandria","zip":"2[13]","zipex":"21000,23000","isoid":"ALX"}
+data/EG/الإسماعيلية={"id":"data/EG/الإسماعيلية","key":"الإسماعيلية","lang":"ar","lname":"Ismailia","zip":"41","zipex":"41000","isoid":"IS"}
+data/EG/البحر الأحمر={"id":"data/EG/البحر الأحمر","key":"البحر الأحمر","lang":"ar","lname":"Red Sea","zip":"84","zipex":"84000","isoid":"BA"}
+data/EG/البحيرة={"id":"data/EG/البحيرة","key":"البحيرة","lang":"ar","lname":"Beheira","zip":"22","zipex":"22000","isoid":"BH"}
+data/EG/الجيزة={"id":"data/EG/الجيزة","key":"الجيزة","lang":"ar","lname":"Giza","zip":"12","zipex":"12000","isoid":"GZ"}
+data/EG/الدقهلية={"id":"data/EG/الدقهلية","key":"الدقهلية","lang":"ar","lname":"Dakahlia","zip":"35","zipex":"35000","isoid":"DK"}
+data/EG/السويس={"id":"data/EG/السويس","key":"السويس","lang":"ar","lname":"Suez","zip":"43","zipex":"43000","isoid":"SUZ"}
+data/EG/الشرقية={"id":"data/EG/الشرقية","key":"الشرقية","lang":"ar","lname":"Al Sharqia","zip":"44","zipex":"44000","isoid":"SHR"}
+data/EG/الغربية={"id":"data/EG/الغربية","key":"الغربية","lang":"ar","lname":"Gharbia","zip":"31","zipex":"31000","isoid":"GH"}
+data/EG/الفيوم={"id":"data/EG/الفيوم","key":"الفيوم","lang":"ar","lname":"Faiyum","zip":"63","zipex":"63000","isoid":"FYM"}
+data/EG/القاهرة={"id":"data/EG/القاهرة","key":"القاهرة","lang":"ar","lname":"Cairo","zip":"11","zipex":"11000","isoid":"C"}
+data/EG/القليوبية={"id":"data/EG/القليوبية","key":"القليوبية","lang":"ar","lname":"Qalyubia","zip":"13","zipex":"13000","isoid":"KB"}
+data/EG/المنوفية={"id":"data/EG/المنوفية","key":"المنوفية","lang":"ar","lname":"Monufia","zip":"32","zipex":"32000","isoid":"MNF"}
+data/EG/المنيا={"id":"data/EG/المنيا","key":"المنيا","lang":"ar","lname":"Minya","zip":"61","zipex":"61000","isoid":"MN"}
+data/EG/الوادي الجديد={"id":"data/EG/الوادي الجديد","key":"الوادي الجديد","lang":"ar","lname":"New Valley","zip":"72","zipex":"72000","isoid":"WAD"}
+data/EG/بني سويف={"id":"data/EG/بني سويف","key":"بني سويف","lang":"ar","lname":"Beni Suef","zip":"62","zipex":"62000","isoid":"BNS"}
+data/EG/بورسعيد={"id":"data/EG/بورسعيد","key":"بورسعيد","lang":"ar","lname":"Port Said","zip":"42","zipex":"42000","isoid":"PTS"}
+data/EG/جنوب سيناء={"id":"data/EG/جنوب سيناء","key":"جنوب سيناء","lang":"ar","lname":"South Sinai","zip":"46","zipex":"46000","isoid":"JS"}
+data/EG/دمياط={"id":"data/EG/دمياط","key":"دمياط","lang":"ar","lname":"Damietta","zip":"34","zipex":"34000","isoid":"DT"}
+data/EG/سوهاج={"id":"data/EG/سوهاج","key":"سوهاج","lang":"ar","lname":"Sohag","zip":"82","zipex":"82000","isoid":"SHG"}
+data/EG/شمال سيناء={"id":"data/EG/شمال سيناء","key":"شمال سيناء","lang":"ar","lname":"North Sinai","zip":"45","zipex":"45000","isoid":"SIN"}
+data/EG/قنا={"id":"data/EG/قنا","key":"قنا","lang":"ar","lname":"Qena","zip":"83","zipex":"83000","isoid":"KN"}
+data/EG/كفر الشيخ={"id":"data/EG/كفر الشيخ","key":"كفر الشيخ","lang":"ar","lname":"Kafr el-Sheikh","zip":"33","zipex":"33000","isoid":"KFS"}
+data/EG/مطروح={"id":"data/EG/مطروح","key":"مطروح","lang":"ar","lname":"Matruh","zip":"51","zipex":"51000","isoid":"MT"}
+data/EH={"id":"data/EH","key":"EH","name":"WESTERN SAHARA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"70000,72000"}
+data/ER={"id":"data/ER","key":"ER","name":"ERITREA"}
+data/ES={"id":"data/ES","key":"ES","name":"SPAIN","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z %C %S","require":"ACSZ","upper":"CS","zip":"\\d{5}","zipex":"28039,28300,28070","posturl":"http://www.correos.es/contenido/13-MenuRec2/04-MenuRec24/1010_s-CodPostal.asp","sub_keys":"A Coruña~Álava~Albacete~Alicante~Almería~Asturias~Ávila~Badajoz~Barcelona~Burgos~Cáceres~Cádiz~Cantabria~Castellón~Ceuta~Ciudad Real~Córdoba~Cuenca~Girona~Granada~Guadalajara~Guipúzcoa~Huelva~Huesca~Islas Baleares~Jaén~La Rioja~Las Palmas~León~Lleida~Lugo~Madrid~Málaga~Melilla~Murcia~Navarra~Ourense~Palencia~Pontevedra~Salamanca~Santa Cruz de Tenerife~Segovia~Sevilla~Soria~Tarragona~Teruel~Toledo~Valencia~Valladolid~Vizcaya~Zamora~Zaragoza","sub_zips":"15~01~02~03~04~33~05~06~08~09~10~11~39~12~51~13~14~16~17~18~19~20~21~22~07~23~26~35~24~25~27~28~29~52~30~31~32~34~36~37~38~40~41~42~43~44~45~46~47~48~49~50","sub_isoids":"C~VI~AB~A~AL~O~AV~BA~B~BU~CC~CA~S~CS~CE~CR~CO~CU~GI~GR~GU~SS~H~HU~PM~J~LO~GC~LE~L~LU~M~MA~ML~MU~NA~OR~P~PO~SA~TF~SG~SE~SO~T~TE~TO~V~VA~BI~ZA~Z"}
+data/ES/A Coruña={"id":"data/ES/A Coruña","key":"A Coruña","lang":"es","zip":"15","isoid":"C"}
+data/ES/Albacete={"id":"data/ES/Albacete","key":"Albacete","lang":"es","zip":"02","isoid":"AB"}
+data/ES/Alicante={"id":"data/ES/Alicante","key":"Alicante","lang":"es","zip":"03","isoid":"A"}
+data/ES/Almería={"id":"data/ES/Almería","key":"Almería","lang":"es","zip":"04","isoid":"AL"}
+data/ES/Asturias={"id":"data/ES/Asturias","key":"Asturias","lang":"es","zip":"33","isoid":"O"}
+data/ES/Badajoz={"id":"data/ES/Badajoz","key":"Badajoz","lang":"es","zip":"06","isoid":"BA"}
+data/ES/Barcelona={"id":"data/ES/Barcelona","key":"Barcelona","lang":"es","zip":"08","isoid":"B"}
+data/ES/Burgos={"id":"data/ES/Burgos","key":"Burgos","lang":"es","zip":"09","isoid":"BU"}
+data/ES/Cantabria={"id":"data/ES/Cantabria","key":"Cantabria","lang":"es","zip":"39","isoid":"S"}
+data/ES/Castellón={"id":"data/ES/Castellón","key":"Castellón","lang":"es","zip":"12","isoid":"CS"}
+data/ES/Ceuta={"id":"data/ES/Ceuta","key":"Ceuta","lang":"es","zip":"51","isoid":"CE"}
+data/ES/Ciudad Real={"id":"data/ES/Ciudad Real","key":"Ciudad Real","lang":"es","zip":"13","isoid":"CR"}
+data/ES/Cuenca={"id":"data/ES/Cuenca","key":"Cuenca","lang":"es","zip":"16","isoid":"CU"}
+data/ES/Cáceres={"id":"data/ES/Cáceres","key":"Cáceres","lang":"es","zip":"10","isoid":"CC"}
+data/ES/Cádiz={"id":"data/ES/Cádiz","key":"Cádiz","lang":"es","zip":"11","isoid":"CA"}
+data/ES/Córdoba={"id":"data/ES/Córdoba","key":"Córdoba","lang":"es","zip":"14","isoid":"CO"}
+data/ES/Girona={"id":"data/ES/Girona","key":"Girona","lang":"es","zip":"17","isoid":"GI"}
+data/ES/Granada={"id":"data/ES/Granada","key":"Granada","lang":"es","zip":"18","isoid":"GR"}
+data/ES/Guadalajara={"id":"data/ES/Guadalajara","key":"Guadalajara","lang":"es","zip":"19","isoid":"GU"}
+data/ES/Guipúzcoa={"id":"data/ES/Guipúzcoa","key":"Guipúzcoa","lang":"es","zip":"20","isoid":"SS"}
+data/ES/Huelva={"id":"data/ES/Huelva","key":"Huelva","lang":"es","zip":"21","isoid":"H"}
+data/ES/Huesca={"id":"data/ES/Huesca","key":"Huesca","lang":"es","zip":"22","isoid":"HU"}
+data/ES/Islas Baleares={"id":"data/ES/Islas Baleares","key":"Islas Baleares","lang":"es","zip":"07","isoid":"PM"}
+data/ES/Jaén={"id":"data/ES/Jaén","key":"Jaén","lang":"es","zip":"23","isoid":"J"}
+data/ES/La Rioja={"id":"data/ES/La Rioja","key":"La Rioja","lang":"es","zip":"26","isoid":"LO"}
+data/ES/Las Palmas={"id":"data/ES/Las Palmas","key":"Las Palmas","lang":"es","zip":"35","isoid":"GC"}
+data/ES/León={"id":"data/ES/León","key":"León","lang":"es","zip":"24","isoid":"LE"}
+data/ES/Lleida={"id":"data/ES/Lleida","key":"Lleida","lang":"es","zip":"25","isoid":"L"}
+data/ES/Lugo={"id":"data/ES/Lugo","key":"Lugo","lang":"es","zip":"27","isoid":"LU"}
+data/ES/Madrid={"id":"data/ES/Madrid","key":"Madrid","lang":"es","zip":"28","isoid":"M"}
+data/ES/Melilla={"id":"data/ES/Melilla","key":"Melilla","lang":"es","zip":"52","isoid":"ML"}
+data/ES/Murcia={"id":"data/ES/Murcia","key":"Murcia","lang":"es","zip":"30","isoid":"MU"}
+data/ES/Málaga={"id":"data/ES/Málaga","key":"Málaga","lang":"es","zip":"29","isoid":"MA"}
+data/ES/Navarra={"id":"data/ES/Navarra","key":"Navarra","lang":"es","zip":"31","isoid":"NA"}
+data/ES/Ourense={"id":"data/ES/Ourense","key":"Ourense","lang":"es","zip":"32","isoid":"OR"}
+data/ES/Palencia={"id":"data/ES/Palencia","key":"Palencia","lang":"es","zip":"34","isoid":"P"}
+data/ES/Pontevedra={"id":"data/ES/Pontevedra","key":"Pontevedra","lang":"es","zip":"36","isoid":"PO"}
+data/ES/Salamanca={"id":"data/ES/Salamanca","key":"Salamanca","lang":"es","zip":"37","isoid":"SA"}
+data/ES/Santa Cruz de Tenerife={"id":"data/ES/Santa Cruz de Tenerife","key":"Santa Cruz de Tenerife","lang":"es","zip":"38","isoid":"TF"}
+data/ES/Segovia={"id":"data/ES/Segovia","key":"Segovia","lang":"es","zip":"40","isoid":"SG"}
+data/ES/Sevilla={"id":"data/ES/Sevilla","key":"Sevilla","lang":"es","zip":"41","isoid":"SE"}
+data/ES/Soria={"id":"data/ES/Soria","key":"Soria","lang":"es","zip":"42","isoid":"SO"}
+data/ES/Tarragona={"id":"data/ES/Tarragona","key":"Tarragona","lang":"es","zip":"43","isoid":"T"}
+data/ES/Teruel={"id":"data/ES/Teruel","key":"Teruel","lang":"es","zip":"44","isoid":"TE"}
+data/ES/Toledo={"id":"data/ES/Toledo","key":"Toledo","lang":"es","zip":"45","isoid":"TO"}
+data/ES/Valencia={"id":"data/ES/Valencia","key":"Valencia","lang":"es","zip":"46","isoid":"V"}
+data/ES/Valladolid={"id":"data/ES/Valladolid","key":"Valladolid","lang":"es","zip":"47","isoid":"VA"}
+data/ES/Vizcaya={"id":"data/ES/Vizcaya","key":"Vizcaya","lang":"es","zip":"48","isoid":"BI"}
+data/ES/Zamora={"id":"data/ES/Zamora","key":"Zamora","lang":"es","zip":"49","isoid":"ZA"}
+data/ES/Zaragoza={"id":"data/ES/Zaragoza","key":"Zaragoza","lang":"es","zip":"50","isoid":"Z"}
+data/ES/Álava={"id":"data/ES/Álava","key":"Álava","lang":"es","zip":"01","isoid":"VI"}
+data/ES/Ávila={"id":"data/ES/Ávila","key":"Ávila","lang":"es","zip":"05","isoid":"AV"}
+data/ET={"id":"data/ET","key":"ET","name":"ETHIOPIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1000"}
+data/FI={"id":"data/FI","key":"FI","name":"FINLAND","fmt":"%O%n%N%n%A%nFI-%Z %C","require":"ACZ","zip":"\\d{5}","zipex":"00550,00011","posturl":"http://www.verkkoposti.com/e3/postinumeroluettelo","postprefix":"FI-"}
+data/FJ={"id":"data/FJ","key":"FJ","name":"FIJI"}
+data/FK={"id":"data/FK","key":"FK","name":"FALKLAND ISLANDS (MALVINAS)","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"FIQQ 1ZZ","zipex":"FIQQ 1ZZ"}
+data/FM={"id":"data/FM","key":"FM","name":"MICRONESIA (Federated State of)","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"(9694[1-4])([ \\-]\\d{4})?","zipex":"96941,96944","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/FO={"id":"data/FO","key":"FO","name":"FAROE ISLANDS","fmt":"%N%n%O%n%A%nFO%Z %C","zip":"\\d{3}","zipex":"100","posturl":"http://www.postur.fo/","postprefix":"FO"}
+data/FR={"id":"data/FR","key":"FR","name":"FRANCE","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"CX","zip":"\\d{2}[ ]?\\d{3}","zipex":"33380,34092,33506","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/GA={"id":"data/GA","key":"GA","name":"GABON"}
+data/GB={"id":"data/GB","key":"GB","name":"UNITED KINGDOM","fmt":"%N%n%O%n%A%n%C%n%S%n%Z","require":"ACZ","upper":"CZ","zip":"GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\\d{1,4}","zipex":"EC1Y 8SY,GIR 0AA,M2 5BQ,M34 4AB,CR0 2YR,DN16 9AA,W1A 4ZZ,EC1A 1HQ,OX14 4PG,BS18 8HF,NR25 7HG,RH6 OHP,BH23 6AA,B6 5BA,RH6 0HP,SO23 9AP,PO1 3AX,BFPO 61","posturl":"http://www.royalmail.com/postcode-finder","state_name_type":"county"}
+data/GD={"id":"data/GD","key":"GD","name":"GRENADA (WEST INDIES)"}
+data/GE={"id":"data/GE","key":"GE","name":"GEORGIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"0101","posturl":"http://www.georgianpost.ge/index.php?page=10"}
+data/GF={"id":"data/GF","key":"GF","name":"FRENCH GUIANA","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78]3\\d{2}","zipex":"97300","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/GG={"id":"data/GG","key":"GG","name":"CHANNEL ISLANDS","fmt":"%N%n%O%n%A%n%X%n%C%nGUERNSEY%n%Z","require":"ACZ","upper":"CZ","zip":"GY\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}","zipex":"GY1 1AA,GY2 2BT","posturl":"http://www.guernseypost.com/postcode_finder/"}
+data/GH={"id":"data/GH","key":"GH","name":"GHANA"}
+data/GI={"id":"data/GI","key":"GI","name":"GIBRALTAR","fmt":"%N%n%O%n%A","require":"A","zip":"GX11 1AA","zipex":"GX11 1AA"}
+data/GL={"id":"data/GL","key":"GL","name":"GREENLAND","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"39\\d{2}","zipex":"3900,3950,3911"}
+data/GM={"id":"data/GM","key":"GM","name":"GAMBIA"}
+data/GN={"id":"data/GN","key":"GN","name":"GUINEA","fmt":"%N%n%O%n%Z %A %C","zip":"\\d{3}","zipex":"001,200,100"}
+data/GP={"id":"data/GP","key":"GP","name":"GUADELOUPE","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78][01]\\d{2}","zipex":"97100","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/GQ={"id":"data/GQ","key":"GQ","name":"EQUATORIAL GUINEA"}
+data/GR={"id":"data/GR","key":"GR","name":"GREECE","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{3} ?\\d{2}","zipex":"151 24,151 10,101 88","posturl":"http://www.elta.gr/findapostcode.aspx"}
+data/GS={"id":"data/GS","key":"GS","name":"SOUTH GEORGIA","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"SIQQ 1ZZ","zipex":"SIQQ 1ZZ"}
+data/GT={"id":"data/GT","key":"GT","name":"GUATEMALA","fmt":"%N%n%O%n%A%n%Z- %C","zip":"\\d{5}","zipex":"09001,01501"}
+data/GU={"id":"data/GU","key":"GU","name":"GUAM","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"969([12]\\d|3[12])([ \\-]\\d{4})?","zipex":"96910,96931","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/GW={"id":"data/GW","key":"GW","name":"GUINEA-BISSAU","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1000,1011"}
+data/GY={"id":"data/GY","key":"GY","name":"GUYANA"}
+data/HK={"id":"data/HK","key":"HK","name":"HONG KONG","lang":"zh-hant","languages":"zh-hant~en","fmt":"%S%n%A%n%O%n%N","lfmt":"%N%n%O%n%A%n%S","require":"AS","upper":"S","state_name_type":"area","sub_keys":"九龍~香港島~新界","sub_lnames":"Kowloon~Hong Kong Island~New Territories"}
+data/HK--en={"id":"data/HK--en","key":"HK","name":"HONG KONG","lang":"en","fmt":"%S%n%A%n%O%n%N","lfmt":"%N%n%O%n%A%n%S","require":"AS","upper":"S","state_name_type":"area","sub_keys":"Hong Kong Island~Kowloon~New Territories","sub_lnames":"Hong Kong Island~Kowloon~New Territories"}
+data/HK/Hong Kong Island--en={"id":"data/HK/Hong Kong Island--en","key":"Hong Kong Island","lang":"en","lname":"Hong Kong Island"}
+data/HK/Kowloon--en={"id":"data/HK/Kowloon--en","key":"Kowloon","lang":"en","lname":"Kowloon"}
+data/HK/New Territories--en={"id":"data/HK/New Territories--en","key":"New Territories","lang":"en","lname":"New Territories"}
+data/HK/九龍={"id":"data/HK/九龍","key":"九龍","lang":"zh-hant","lname":"Kowloon"}
+data/HK/新界={"id":"data/HK/新界","key":"新界","lang":"zh-hant","lname":"New Territories"}
+data/HK/香港島={"id":"data/HK/香港島","key":"香港島","lang":"zh-hant","lname":"Hong Kong Island"}
+data/HM={"id":"data/HM","key":"HM","name":"HEARD AND MCDONALD ISLANDS","fmt":"%O%n%N%n%A%n%C %S %Z","upper":"CS","zip":"\\d{4}"}
+data/HN={"id":"data/HN","key":"HN","name":"HONDURAS","fmt":"%N%n%O%n%A%n%C, %S%n%Z","require":"ACS","zip":"(?:\\d{5})?"}
+data/HR={"id":"data/HR","key":"HR","name":"CROATIA","fmt":"%N%n%O%n%A%nHR-%Z %C","zip":"\\d{5}","zipex":"10000,21001,10002","posturl":"http://www.posta.hr/default.aspx?pretpum","postprefix":"HR-"}
+data/HT={"id":"data/HT","key":"HT","name":"HAITI","fmt":"%N%n%O%n%A%nHT%Z %C %X","zip":"\\d{4}","zipex":"6120,5310,6110,8510","postprefix":"HT"}
+data/HU={"id":"data/HU","key":"HU","name":"HUNGARY (Rep.)","fmt":"%N%n%O%n%C%n%A%n%Z","upper":"ACNO","zip":"\\d{4}","zipex":"1037,2380,1540","posturl":"http://posta.hu/ugyfelszolgalat/iranyitoszam_kereso"}
+data/ID={"id":"data/ID","key":"ID","name":"INDONESIA","lang":"id","languages":"id","fmt":"%N%n%O%n%A%n%C%n%S %Z","zip":"\\d{5}","zipex":"40115","state_name_type":"district","sub_keys":"Aceh~Bali~Banten~Bengkulu~Daerah Istimewa Yogyakarta~Daerah Khusus Ibukota Jakarta~Gorontalo~Jambi~Jawa Barat~Jawa Tengah~Jawa Timur~Kalimantan Barat~Kalimantan Selatan~Kalimantan Tengah~Kalimantan Timur~Kepulauan Bangka Belitung~Kepulauan Riau~Lampung~Maluku~Maluku Utara~Nusa Tenggara Barat~Nusa Tenggara Timur~Papua~Papua Barat~Riau~Sulawesi Barat~Sulawesi Selatan~Sulawesi Tengah~Sulawesi Tenggara~Sulawesi Utara~Sumatera Barat~Sumatera Selatan~Sumatera Utara","sub_isoids":"AC~BA~BT~BE~YO~JK~GO~JA~JB~JT~JI~KB~KS~KT~KI~BB~KR~LA~MA~MU~NB~NT~PA~PB~RI~SR~SN~ST~SG~SA~SB~SS~SU"}
+data/ID/Aceh={"id":"data/ID/Aceh","key":"Aceh","lang":"id","isoid":"AC"}
+data/ID/Bali={"id":"data/ID/Bali","key":"Bali","lang":"id","isoid":"BA"}
+data/ID/Banten={"id":"data/ID/Banten","key":"Banten","lang":"id","isoid":"BT"}
+data/ID/Bengkulu={"id":"data/ID/Bengkulu","key":"Bengkulu","lang":"id","isoid":"BE"}
+data/ID/Daerah Istimewa Yogyakarta={"id":"data/ID/Daerah Istimewa Yogyakarta","key":"Daerah Istimewa Yogyakarta","lang":"id","isoid":"YO"}
+data/ID/Daerah Khusus Ibukota Jakarta={"id":"data/ID/Daerah Khusus Ibukota Jakarta","key":"Daerah Khusus Ibukota Jakarta","lang":"id","isoid":"JK"}
+data/ID/Gorontalo={"id":"data/ID/Gorontalo","key":"Gorontalo","lang":"id","isoid":"GO"}
+data/ID/Jambi={"id":"data/ID/Jambi","key":"Jambi","lang":"id","isoid":"JA"}
+data/ID/Jawa Barat={"id":"data/ID/Jawa Barat","key":"Jawa Barat","lang":"id","isoid":"JB"}
+data/ID/Jawa Tengah={"id":"data/ID/Jawa Tengah","key":"Jawa Tengah","lang":"id","isoid":"JT"}
+data/ID/Jawa Timur={"id":"data/ID/Jawa Timur","key":"Jawa Timur","lang":"id","isoid":"JI"}
+data/ID/Kalimantan Barat={"id":"data/ID/Kalimantan Barat","key":"Kalimantan Barat","lang":"id","isoid":"KB"}
+data/ID/Kalimantan Selatan={"id":"data/ID/Kalimantan Selatan","key":"Kalimantan Selatan","lang":"id","isoid":"KS"}
+data/ID/Kalimantan Tengah={"id":"data/ID/Kalimantan Tengah","key":"Kalimantan Tengah","lang":"id","isoid":"KT"}
+data/ID/Kalimantan Timur={"id":"data/ID/Kalimantan Timur","key":"Kalimantan Timur","lang":"id","isoid":"KI"}
+data/ID/Kepulauan Bangka Belitung={"id":"data/ID/Kepulauan Bangka Belitung","key":"Kepulauan Bangka Belitung","lang":"id","isoid":"BB"}
+data/ID/Kepulauan Riau={"id":"data/ID/Kepulauan Riau","key":"Kepulauan Riau","lang":"id","isoid":"KR"}
+data/ID/Lampung={"id":"data/ID/Lampung","key":"Lampung","lang":"id","isoid":"LA"}
+data/ID/Maluku={"id":"data/ID/Maluku","key":"Maluku","lang":"id","isoid":"MA"}
+data/ID/Maluku Utara={"id":"data/ID/Maluku Utara","key":"Maluku Utara","lang":"id","isoid":"MU"}
+data/ID/Nusa Tenggara Barat={"id":"data/ID/Nusa Tenggara Barat","key":"Nusa Tenggara Barat","lang":"id","isoid":"NB"}
+data/ID/Nusa Tenggara Timur={"id":"data/ID/Nusa Tenggara Timur","key":"Nusa Tenggara Timur","lang":"id","isoid":"NT"}
+data/ID/Papua={"id":"data/ID/Papua","key":"Papua","lang":"id","isoid":"PA"}
+data/ID/Papua Barat={"id":"data/ID/Papua Barat","key":"Papua Barat","lang":"id","isoid":"PB"}
+data/ID/Riau={"id":"data/ID/Riau","key":"Riau","lang":"id","isoid":"RI"}
+data/ID/Sulawesi Barat={"id":"data/ID/Sulawesi Barat","key":"Sulawesi Barat","lang":"id","isoid":"SR"}
+data/ID/Sulawesi Selatan={"id":"data/ID/Sulawesi Selatan","key":"Sulawesi Selatan","lang":"id","isoid":"SN"}
+data/ID/Sulawesi Tengah={"id":"data/ID/Sulawesi Tengah","key":"Sulawesi Tengah","lang":"id","isoid":"ST"}
+data/ID/Sulawesi Tenggara={"id":"data/ID/Sulawesi Tenggara","key":"Sulawesi Tenggara","lang":"id","isoid":"SG"}
+data/ID/Sulawesi Utara={"id":"data/ID/Sulawesi Utara","key":"Sulawesi Utara","lang":"id","isoid":"SA"}
+data/ID/Sumatera Barat={"id":"data/ID/Sumatera Barat","key":"Sumatera Barat","lang":"id","isoid":"SB"}
+data/ID/Sumatera Selatan={"id":"data/ID/Sumatera Selatan","key":"Sumatera Selatan","lang":"id","isoid":"SS"}
+data/ID/Sumatera Utara={"id":"data/ID/Sumatera Utara","key":"Sumatera Utara","lang":"id","isoid":"SU"}
+data/IE={"id":"data/IE","key":"IE","name":"IRELAND","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C%n%S","state_name_type":"county","sub_keys":"Co. Carlow~Co. Cavan~Co. Clare~Co. Cork~Co. Donegal~Co. Dublin~Co. Galway~Co. Kerry~Co. Kildare~Co. Kilkenny~Co. Laois~Co. Leitrim~Co. Limerick~Co. Longford~Co. Louth~Co. Mayo~Co. Meath~Co. Monaghan~Co. Offaly~Co. Roscommon~Co. Sligo~Co. Tipperary~Co. Waterford~Co. Westmeath~Co. Wexford~Co. Wicklow","sub_isoids":"CW~CN~CE~C~DL~D~G~KY~KE~KK~LS~LM~LK~LD~LH~MO~MH~MN~OY~RN~SO~TA~WD~WH~WX~WW"}
+data/IE/Co. Carlow={"id":"data/IE/Co. Carlow","key":"Co. Carlow","lang":"en","isoid":"CW"}
+data/IE/Co. Cavan={"id":"data/IE/Co. Cavan","key":"Co. Cavan","lang":"en","isoid":"CN"}
+data/IE/Co. Clare={"id":"data/IE/Co. Clare","key":"Co. Clare","lang":"en","isoid":"CE"}
+data/IE/Co. Cork={"id":"data/IE/Co. Cork","key":"Co. Cork","lang":"en","isoid":"C"}
+data/IE/Co. Donegal={"id":"data/IE/Co. Donegal","key":"Co. Donegal","lang":"en","isoid":"DL"}
+data/IE/Co. Dublin={"id":"data/IE/Co. Dublin","key":"Co. Dublin","lang":"en","isoid":"D"}
+data/IE/Co. Galway={"id":"data/IE/Co. Galway","key":"Co. Galway","lang":"en","isoid":"G"}
+data/IE/Co. Kerry={"id":"data/IE/Co. Kerry","key":"Co. Kerry","lang":"en","isoid":"KY"}
+data/IE/Co. Kildare={"id":"data/IE/Co. Kildare","key":"Co. Kildare","lang":"en","isoid":"KE"}
+data/IE/Co. Kilkenny={"id":"data/IE/Co. Kilkenny","key":"Co. Kilkenny","lang":"en","isoid":"KK"}
+data/IE/Co. Laois={"id":"data/IE/Co. Laois","key":"Co. Laois","lang":"en","isoid":"LS"}
+data/IE/Co. Leitrim={"id":"data/IE/Co. Leitrim","key":"Co. Leitrim","lang":"en","isoid":"LM"}
+data/IE/Co. Limerick={"id":"data/IE/Co. Limerick","key":"Co. Limerick","lang":"en","isoid":"LK"}
+data/IE/Co. Longford={"id":"data/IE/Co. Longford","key":"Co. Longford","lang":"en","isoid":"LD"}
+data/IE/Co. Louth={"id":"data/IE/Co. Louth","key":"Co. Louth","lang":"en","isoid":"LH"}
+data/IE/Co. Mayo={"id":"data/IE/Co. Mayo","key":"Co. Mayo","lang":"en","isoid":"MO"}
+data/IE/Co. Meath={"id":"data/IE/Co. Meath","key":"Co. Meath","lang":"en","isoid":"MH"}
+data/IE/Co. Monaghan={"id":"data/IE/Co. Monaghan","key":"Co. Monaghan","lang":"en","isoid":"MN"}
+data/IE/Co. Offaly={"id":"data/IE/Co. Offaly","key":"Co. Offaly","lang":"en","isoid":"OY"}
+data/IE/Co. Roscommon={"id":"data/IE/Co. Roscommon","key":"Co. Roscommon","lang":"en","isoid":"RN"}
+data/IE/Co. Sligo={"id":"data/IE/Co. Sligo","key":"Co. Sligo","lang":"en","isoid":"SO"}
+data/IE/Co. Tipperary={"id":"data/IE/Co. Tipperary","key":"Co. Tipperary","lang":"en","isoid":"TA"}
+data/IE/Co. Waterford={"id":"data/IE/Co. Waterford","key":"Co. Waterford","lang":"en","isoid":"WD"}
+data/IE/Co. Westmeath={"id":"data/IE/Co. Westmeath","key":"Co. Westmeath","lang":"en","isoid":"WH"}
+data/IE/Co. Wexford={"id":"data/IE/Co. Wexford","key":"Co. Wexford","lang":"en","isoid":"WX"}
+data/IE/Co. Wicklow={"id":"data/IE/Co. Wicklow","key":"Co. Wicklow","lang":"en","isoid":"WW"}
+data/IL={"id":"data/IL","key":"IL","name":"ISRAEL","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}(?:\\d{2})?","zipex":"9614303","posturl":"http://www.israelpost.co.il/zipcode.nsf/demozip?openform"}
+data/IM={"id":"data/IM","key":"IM","name":"ISLE OF MAN","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"IM\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}","zipex":"IM2 1AA,IM99 1PS","posturl":"http://www.gov.im/post/postal/fr_main.asp"}
+data/IN={"id":"data/IN","key":"IN","name":"INDIA","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C %Z%n%S","require":"ACSZ","zip":"\\d{6}","zipex":"110034,110001","posturl":"http://www.indiapost.gov.in/pin/pinsearch.aspx","state_name_type":"state","sub_keys":"Andaman and Nicobar Islands~Andhra Pradesh~Arunachal Pradesh~Assam~Bihar~Chandigarh~Chhattisgarh~Dadra and Nagar Haveli~Daman and Diu~Delhi~Goa~Gujarat~Haryana~Himachal Pradesh~Jammu & Kashmir~Jharkhand~Karnataka~Kerala~Lakshadweep~Madhya Pradesh~Maharashtra~Manipur~Meghalaya~Mizoram~Nagaland~Odisha~Puducherry~Punjab~Rajasthan~Sikkim~Tamil Nadu~Tripura~Uttar Pradesh~Uttarakhand~West Bengal","sub_names":"Andaman & Nicobar~Andhra Pradesh~Arunachal Pradesh~Assam~Bihar~Chandigarh~Chhattisgarh~Dadra & Nagar Haveli~Daman & Diu~Delhi~Goa~Gujarat~Haryana~Himachal Pradesh~Jammu & Kashmir~Jharkhand~Karnataka~Kerala~Lakshadweep~Madhya Pradesh~Maharashtra~Manipur~Meghalaya~Mizoram~Nagaland~Odisha~Puducherry~Punjab~Rajasthan~Sikkim~Tamil Nadu~Tripura~Uttar Pradesh~Uttarakhand~West Bengal","sub_zips":"744~5[0-3]~79[0-2]~78~8[0-5]~16|1440[3-9]~49~396~396~11~403~3[6-9]~1[23]~17~1[89]~81[4-9]|82|83[0-5]~5[4-9]|53[7-9]~6[7-9]|6010|607008|777~673~4[5-8]|490~4[0-4]~79[56]~79[34]~796~79[78]~7[5-7]~605~1[456]~3[0-4]~737|750~6[0-6]|536~799~2[0-35-8]|24[0-7]|26[12]~24[46-9]|254|26[23]~7[0-4]","sub_isoids":"AN~AP~AR~AS~BR~CH~CT~DN~DD~DL~GA~GJ~HR~HP~JK~JH~KA~KL~LD~MP~MH~MN~ML~MZ~NL~OR~PY~PB~RJ~SK~TN~TR~UP~UL~WB"}
+data/IN/Andaman and Nicobar Islands={"id":"data/IN/Andaman and Nicobar Islands","key":"Andaman and Nicobar Islands","name":"Andaman & Nicobar","lang":"en","zip":"744","isoid":"AN"}
+data/IN/Andhra Pradesh={"id":"data/IN/Andhra Pradesh","key":"Andhra Pradesh","name":"Andhra Pradesh","lang":"en","zip":"5[0-3]","isoid":"AP"}
+data/IN/Arunachal Pradesh={"id":"data/IN/Arunachal Pradesh","key":"Arunachal Pradesh","name":"Arunachal Pradesh","lang":"en","zip":"79[0-2]","isoid":"AR"}
+data/IN/Assam={"id":"data/IN/Assam","key":"Assam","name":"Assam","lang":"en","zip":"78","isoid":"AS"}
+data/IN/Bihar={"id":"data/IN/Bihar","key":"Bihar","name":"Bihar","lang":"en","zip":"8[0-5]","isoid":"BR"}
+data/IN/Chandigarh={"id":"data/IN/Chandigarh","key":"Chandigarh","name":"Chandigarh","lang":"en","zip":"16|1440[3-9]","isoid":"CH"}
+data/IN/Chhattisgarh={"id":"data/IN/Chhattisgarh","key":"Chhattisgarh","name":"Chhattisgarh","lang":"en","zip":"49","isoid":"CT"}
+data/IN/Dadra and Nagar Haveli={"id":"data/IN/Dadra and Nagar Haveli","key":"Dadra and Nagar Haveli","name":"Dadra & Nagar Haveli","lang":"en","zip":"396","isoid":"DN"}
+data/IN/Daman and Diu={"id":"data/IN/Daman and Diu","key":"Daman and Diu","name":"Daman & Diu","lang":"en","zip":"396","isoid":"DD"}
+data/IN/Delhi={"id":"data/IN/Delhi","key":"Delhi","name":"Delhi","lang":"en","zip":"11","isoid":"DL"}
+data/IN/Goa={"id":"data/IN/Goa","key":"Goa","name":"Goa","lang":"en","zip":"403","isoid":"GA"}
+data/IN/Gujarat={"id":"data/IN/Gujarat","key":"Gujarat","name":"Gujarat","lang":"en","zip":"3[6-9]","isoid":"GJ"}
+data/IN/Haryana={"id":"data/IN/Haryana","key":"Haryana","name":"Haryana","lang":"en","zip":"1[23]","isoid":"HR"}
+data/IN/Himachal Pradesh={"id":"data/IN/Himachal Pradesh","key":"Himachal Pradesh","name":"Himachal Pradesh","lang":"en","zip":"17","isoid":"HP"}
+data/IN/Jammu & Kashmir={"id":"data/IN/Jammu & Kashmir","key":"Jammu & Kashmir","name":"Jammu & Kashmir","lang":"en","zip":"1[89]","isoid":"JK"}
+data/IN/Jharkhand={"id":"data/IN/Jharkhand","key":"Jharkhand","name":"Jharkhand","lang":"en","zip":"81[4-9]|82|83[0-5]","isoid":"JH"}
+data/IN/Karnataka={"id":"data/IN/Karnataka","key":"Karnataka","name":"Karnataka","lang":"en","zip":"5[4-9]|53[7-9]","isoid":"KA"}
+data/IN/Kerala={"id":"data/IN/Kerala","key":"Kerala","name":"Kerala","lang":"en","zip":"6[7-9]|6010|607008|777","isoid":"KL"}
+data/IN/Lakshadweep={"id":"data/IN/Lakshadweep","key":"Lakshadweep","name":"Lakshadweep","lang":"en","zip":"673","isoid":"LD"}
+data/IN/Madhya Pradesh={"id":"data/IN/Madhya Pradesh","key":"Madhya Pradesh","name":"Madhya Pradesh","lang":"en","zip":"4[5-8]|490","isoid":"MP"}
+data/IN/Maharashtra={"id":"data/IN/Maharashtra","key":"Maharashtra","name":"Maharashtra","lang":"en","zip":"4[0-4]","isoid":"MH"}
+data/IN/Manipur={"id":"data/IN/Manipur","key":"Manipur","name":"Manipur","lang":"en","zip":"79[56]","isoid":"MN"}
+data/IN/Meghalaya={"id":"data/IN/Meghalaya","key":"Meghalaya","name":"Meghalaya","lang":"en","zip":"79[34]","isoid":"ML"}
+data/IN/Mizoram={"id":"data/IN/Mizoram","key":"Mizoram","name":"Mizoram","lang":"en","zip":"796","isoid":"MZ"}
+data/IN/Nagaland={"id":"data/IN/Nagaland","key":"Nagaland","name":"Nagaland","lang":"en","zip":"79[78]","isoid":"NL"}
+data/IN/Odisha={"id":"data/IN/Odisha","key":"Odisha","name":"Odisha","lang":"en","zip":"7[5-7]","isoid":"OR"}
+data/IN/Puducherry={"id":"data/IN/Puducherry","key":"Puducherry","name":"Puducherry","lang":"en","zip":"605","isoid":"PY"}
+data/IN/Punjab={"id":"data/IN/Punjab","key":"Punjab","name":"Punjab","lang":"en","zip":"1[456]","isoid":"PB"}
+data/IN/Rajasthan={"id":"data/IN/Rajasthan","key":"Rajasthan","name":"Rajasthan","lang":"en","zip":"3[0-4]","isoid":"RJ"}
+data/IN/Sikkim={"id":"data/IN/Sikkim","key":"Sikkim","name":"Sikkim","lang":"en","zip":"737|750","isoid":"SK"}
+data/IN/Tamil Nadu={"id":"data/IN/Tamil Nadu","key":"Tamil Nadu","name":"Tamil Nadu","lang":"en","zip":"6[0-6]|536","isoid":"TN"}
+data/IN/Tripura={"id":"data/IN/Tripura","key":"Tripura","name":"Tripura","lang":"en","zip":"799","isoid":"TR"}
+data/IN/Uttar Pradesh={"id":"data/IN/Uttar Pradesh","key":"Uttar Pradesh","name":"Uttar Pradesh","lang":"en","zip":"2[0-35-8]|24[0-7]|26[12]","isoid":"UP"}
+data/IN/Uttarakhand={"id":"data/IN/Uttarakhand","key":"Uttarakhand","name":"Uttarakhand","lang":"en","zip":"24[46-9]|254|26[23]","isoid":"UL"}
+data/IN/West Bengal={"id":"data/IN/West Bengal","key":"West Bengal","name":"West Bengal","lang":"en","zip":"7[0-4]","isoid":"WB"}
+data/IO={"id":"data/IO","key":"IO","name":"BRITISH INDIAN OCEAN TERRITORY","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"BBND 1ZZ","zipex":"BBND 1ZZ"}
+data/IQ={"id":"data/IQ","key":"IQ","name":"IRAQ","fmt":"%O%n%N%n%A%n%C, %S%n%Z","require":"ACS","upper":"CS","zip":"\\d{5}"}
+data/IS={"id":"data/IS","key":"IS","name":"ICELAND","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{3}","zipex":"320,121,220,110","posturl":"http://www.postur.is/cgi-bin/hsrun.exe/Distributed/vefur/vefur.htx;start=HS_landakort_postnumer"}
+data/IT={"id":"data/IT","key":"IT","name":"ITALY","lang":"it","languages":"it","fmt":"%N%n%O%n%A%n%Z %C %S","require":"ACSZ","upper":"CS","zip":"\\d{5}","zipex":"00144,47037,39049","posturl":"http://www.poste.it/online/cercacap/","sub_keys":"AG~AL~AN~AR~AP~AT~AV~BA~BT~BL~BN~BG~BI~BO~BZ~BS~BR~CA~CL~CB~CI~CE~CT~CZ~CH~CO~CS~CR~KR~CN~EN~FM~FE~FI~FG~FC~FR~GE~GO~GR~IM~IS~AQ~SP~LT~LE~LC~LI~LO~LU~MC~MN~MS~MT~VS~ME~MI~MO~MB~NA~NO~NU~OG~OT~OR~PD~PA~PR~PV~PG~PU~PE~PC~PI~PT~PN~PZ~PO~RG~RA~RC~RE~RI~RN~RM~RO~SA~SS~SV~SI~SR~SO~TA~TE~TR~TO~TP~TN~TV~TS~UD~AO~VA~VE~VB~VC~VR~VV~VI~VT","sub_names":"Agrigento~Alessandria~Ancona~Arezzo~Ascoli Piceno~Asti~Avellino~Bari~Barletta-Andria-Trani~Belluno~Benevento~Bergamo~Biella~Bologna~Bolzano~Brescia~Brindisi~Cagliari~Caltanissetta~Campobasso~Carbonia-Iglesias~Caserta~Catania~Catanzaro~Chieti~Como~Cosenza~Cremona~Crotone~Cuneo~Enna~Fermo~Ferrara~Firenze~Foggia~Forlì-Cesena~Frosinone~Genova~Gorizia~Grosseto~Imperia~Isernia~L'Aquila~La Spezia~Latina~Lecce~Lecco~Livorno~Lodi~Lucca~Macerata~Mantova~Massa-Carrara~Matera~Medio Campidano~Messina~Milano~Modena~Monza e della Brianza~Napoli~Novara~Nuoro~Ogliastra~Olbia-Tempio~Oristano~Padova~Palermo~Parma~Pavia~Perugia~Pesaro e Urbino~Pescara~Piacenza~Pisa~Pistoia~Pordenone~Potenza~Prato~Ragusa~Ravenna~Reggio Calabria~Reggio nell'Emilia~Rieti~Rimini~Roma~Rovigo~Salerno~Sassari~Savona~Siena~Siracusa~Sondrio~Taranto~Teramo~Terni~Torino~Trapani~Trento~Treviso~Trieste~Udine~Valle d'Aosta~Varese~Venezia~Verbano-Cusio-Ossola~Vercelli~Verona~Vibo Valentia~Vicenza~Viterbo","sub_zips":"92~15~60~52~63~14~83~70~76[01]~32~82~24~13[89]~40~39~25~72~0912[1-9]|0913[0-4]|0901[0289]|0902[03468]|0903[0234]|0904|0803[035]|08043~93~860[1-4]|86100~0901[013-7]~81~95~88[01]~66~22~87~26[01]~88[89]~12|18025~94~638|63900~44~50~71~47[015]~03~16~34[01]7~58~18~860[7-9]|86170~67~19~04~73~23[89]~57~26[89]~55~62~46~54~75~0902[012579]|0903[015-9]|09040~98~20~41~208|20900~80~28[01]~080[1-3]|08100~08037|0804[024-9]~08020|0702|0703[08]~090[7-9]|09170|0801[039]|0803[04]~35~90~43~27~06~61~65~29~56~51~330[7-9]|33170~85~59~97~48~89[01]~42~02~47[89]~00~45~84~070[14]|0703[0-79]|07100~17|12071~53~96~23[01]~74~64~05~10~91~38~31~3401|341[0-689]|34062~330[1-5]|33100~11~21~30~28[89]~13[01]~37~89[89]~36~01"}
+data/IT/AG={"id":"data/IT/AG","key":"AG","name":"Agrigento","lang":"it","zip":"92"}
+data/IT/AL={"id":"data/IT/AL","key":"AL","name":"Alessandria","lang":"it","zip":"15"}
+data/IT/AN={"id":"data/IT/AN","key":"AN","name":"Ancona","lang":"it","zip":"60"}
+data/IT/AO={"id":"data/IT/AO","key":"AO","name":"Valle d'Aosta","lang":"it","zip":"11"}
+data/IT/AP={"id":"data/IT/AP","key":"AP","name":"Ascoli Piceno","lang":"it","zip":"63"}
+data/IT/AQ={"id":"data/IT/AQ","key":"AQ","name":"L'Aquila","lang":"it","zip":"67"}
+data/IT/AR={"id":"data/IT/AR","key":"AR","name":"Arezzo","lang":"it","zip":"52"}
+data/IT/AT={"id":"data/IT/AT","key":"AT","name":"Asti","lang":"it","zip":"14"}
+data/IT/AV={"id":"data/IT/AV","key":"AV","name":"Avellino","lang":"it","zip":"83"}
+data/IT/BA={"id":"data/IT/BA","key":"BA","name":"Bari","lang":"it","zip":"70"}
+data/IT/BG={"id":"data/IT/BG","key":"BG","name":"Bergamo","lang":"it","zip":"24"}
+data/IT/BI={"id":"data/IT/BI","key":"BI","name":"Biella","lang":"it","zip":"13[89]"}
+data/IT/BL={"id":"data/IT/BL","key":"BL","name":"Belluno","lang":"it","zip":"32"}
+data/IT/BN={"id":"data/IT/BN","key":"BN","name":"Benevento","lang":"it","zip":"82"}
+data/IT/BO={"id":"data/IT/BO","key":"BO","name":"Bologna","lang":"it","zip":"40"}
+data/IT/BR={"id":"data/IT/BR","key":"BR","name":"Brindisi","lang":"it","zip":"72"}
+data/IT/BS={"id":"data/IT/BS","key":"BS","name":"Brescia","lang":"it","zip":"25"}
+data/IT/BT={"id":"data/IT/BT","key":"BT","name":"Barletta-Andria-Trani","lang":"it","zip":"76[01]"}
+data/IT/BZ={"id":"data/IT/BZ","key":"BZ","name":"Bolzano","lang":"it","zip":"39"}
+data/IT/CA={"id":"data/IT/CA","key":"CA","name":"Cagliari","lang":"it","zip":"0912[1-9]|0913[0-4]|0901[0289]|0902[03468]|0903[0234]|0904|0803[035]|08043"}
+data/IT/CB={"id":"data/IT/CB","key":"CB","name":"Campobasso","lang":"it","zip":"860[1-4]|86100"}
+data/IT/CE={"id":"data/IT/CE","key":"CE","name":"Caserta","lang":"it","zip":"81"}
+data/IT/CH={"id":"data/IT/CH","key":"CH","name":"Chieti","lang":"it","zip":"66"}
+data/IT/CI={"id":"data/IT/CI","key":"CI","name":"Carbonia-Iglesias","lang":"it","zip":"0901[013-7]"}
+data/IT/CL={"id":"data/IT/CL","key":"CL","name":"Caltanissetta","lang":"it","zip":"93"}
+data/IT/CN={"id":"data/IT/CN","key":"CN","name":"Cuneo","lang":"it","zip":"12|18025"}
+data/IT/CO={"id":"data/IT/CO","key":"CO","name":"Como","lang":"it","zip":"22"}
+data/IT/CR={"id":"data/IT/CR","key":"CR","name":"Cremona","lang":"it","zip":"26[01]"}
+data/IT/CS={"id":"data/IT/CS","key":"CS","name":"Cosenza","lang":"it","zip":"87"}
+data/IT/CT={"id":"data/IT/CT","key":"CT","name":"Catania","lang":"it","zip":"95"}
+data/IT/CZ={"id":"data/IT/CZ","key":"CZ","name":"Catanzaro","lang":"it","zip":"88[01]"}
+data/IT/EN={"id":"data/IT/EN","key":"EN","name":"Enna","lang":"it","zip":"94"}
+data/IT/FC={"id":"data/IT/FC","key":"FC","name":"Forlì-Cesena","lang":"it","zip":"47[015]"}
+data/IT/FE={"id":"data/IT/FE","key":"FE","name":"Ferrara","lang":"it","zip":"44"}
+data/IT/FG={"id":"data/IT/FG","key":"FG","name":"Foggia","lang":"it","zip":"71"}
+data/IT/FI={"id":"data/IT/FI","key":"FI","name":"Firenze","lang":"it","zip":"50"}
+data/IT/FM={"id":"data/IT/FM","key":"FM","name":"Fermo","lang":"it","zip":"638|63900"}
+data/IT/FR={"id":"data/IT/FR","key":"FR","name":"Frosinone","lang":"it","zip":"03"}
+data/IT/GE={"id":"data/IT/GE","key":"GE","name":"Genova","lang":"it","zip":"16"}
+data/IT/GO={"id":"data/IT/GO","key":"GO","name":"Gorizia","lang":"it","zip":"34[01]7"}
+data/IT/GR={"id":"data/IT/GR","key":"GR","name":"Grosseto","lang":"it","zip":"58"}
+data/IT/IM={"id":"data/IT/IM","key":"IM","name":"Imperia","lang":"it","zip":"18"}
+data/IT/IS={"id":"data/IT/IS","key":"IS","name":"Isernia","lang":"it","zip":"860[7-9]|86170"}
+data/IT/KR={"id":"data/IT/KR","key":"KR","name":"Crotone","lang":"it","zip":"88[89]"}
+data/IT/LC={"id":"data/IT/LC","key":"LC","name":"Lecco","lang":"it","zip":"23[89]"}
+data/IT/LE={"id":"data/IT/LE","key":"LE","name":"Lecce","lang":"it","zip":"73"}
+data/IT/LI={"id":"data/IT/LI","key":"LI","name":"Livorno","lang":"it","zip":"57"}
+data/IT/LO={"id":"data/IT/LO","key":"LO","name":"Lodi","lang":"it","zip":"26[89]"}
+data/IT/LT={"id":"data/IT/LT","key":"LT","name":"Latina","lang":"it","zip":"04"}
+data/IT/LU={"id":"data/IT/LU","key":"LU","name":"Lucca","lang":"it","zip":"55"}
+data/IT/MB={"id":"data/IT/MB","key":"MB","name":"Monza e della Brianza","lang":"it","zip":"208|20900"}
+data/IT/MC={"id":"data/IT/MC","key":"MC","name":"Macerata","lang":"it","zip":"62"}
+data/IT/ME={"id":"data/IT/ME","key":"ME","name":"Messina","lang":"it","zip":"98"}
+data/IT/MI={"id":"data/IT/MI","key":"MI","name":"Milano","lang":"it","zip":"20"}
+data/IT/MN={"id":"data/IT/MN","key":"MN","name":"Mantova","lang":"it","zip":"46"}
+data/IT/MO={"id":"data/IT/MO","key":"MO","name":"Modena","lang":"it","zip":"41"}
+data/IT/MS={"id":"data/IT/MS","key":"MS","name":"Massa-Carrara","lang":"it","zip":"54"}
+data/IT/MT={"id":"data/IT/MT","key":"MT","name":"Matera","lang":"it","zip":"75"}
+data/IT/NA={"id":"data/IT/NA","key":"NA","name":"Napoli","lang":"it","zip":"80"}
+data/IT/NO={"id":"data/IT/NO","key":"NO","name":"Novara","lang":"it","zip":"28[01]"}
+data/IT/NU={"id":"data/IT/NU","key":"NU","name":"Nuoro","lang":"it","zip":"080[1-3]|08100"}
+data/IT/OG={"id":"data/IT/OG","key":"OG","name":"Ogliastra","lang":"it","zip":"08037|0804[024-9]"}
+data/IT/OR={"id":"data/IT/OR","key":"OR","name":"Oristano","lang":"it","zip":"090[7-9]|09170|0801[039]|0803[04]"}
+data/IT/OT={"id":"data/IT/OT","key":"OT","name":"Olbia-Tempio","lang":"it","zip":"08020|0702|0703[08]"}
+data/IT/PA={"id":"data/IT/PA","key":"PA","name":"Palermo","lang":"it","zip":"90"}
+data/IT/PC={"id":"data/IT/PC","key":"PC","name":"Piacenza","lang":"it","zip":"29"}
+data/IT/PD={"id":"data/IT/PD","key":"PD","name":"Padova","lang":"it","zip":"35"}
+data/IT/PE={"id":"data/IT/PE","key":"PE","name":"Pescara","lang":"it","zip":"65"}
+data/IT/PG={"id":"data/IT/PG","key":"PG","name":"Perugia","lang":"it","zip":"06"}
+data/IT/PI={"id":"data/IT/PI","key":"PI","name":"Pisa","lang":"it","zip":"56"}
+data/IT/PN={"id":"data/IT/PN","key":"PN","name":"Pordenone","lang":"it","zip":"330[7-9]|33170"}
+data/IT/PO={"id":"data/IT/PO","key":"PO","name":"Prato","lang":"it","zip":"59"}
+data/IT/PR={"id":"data/IT/PR","key":"PR","name":"Parma","lang":"it","zip":"43"}
+data/IT/PT={"id":"data/IT/PT","key":"PT","name":"Pistoia","lang":"it","zip":"51"}
+data/IT/PU={"id":"data/IT/PU","key":"PU","name":"Pesaro e Urbino","lang":"it","zip":"61"}
+data/IT/PV={"id":"data/IT/PV","key":"PV","name":"Pavia","lang":"it","zip":"27"}
+data/IT/PZ={"id":"data/IT/PZ","key":"PZ","name":"Potenza","lang":"it","zip":"85"}
+data/IT/RA={"id":"data/IT/RA","key":"RA","name":"Ravenna","lang":"it","zip":"48"}
+data/IT/RC={"id":"data/IT/RC","key":"RC","name":"Reggio Calabria","lang":"it","zip":"89[01]"}
+data/IT/RE={"id":"data/IT/RE","key":"RE","name":"Reggio nell'Emilia","lang":"it","zip":"42"}
+data/IT/RG={"id":"data/IT/RG","key":"RG","name":"Ragusa","lang":"it","zip":"97"}
+data/IT/RI={"id":"data/IT/RI","key":"RI","name":"Rieti","lang":"it","zip":"02"}
+data/IT/RM={"id":"data/IT/RM","key":"RM","name":"Roma","lang":"it","zip":"00"}
+data/IT/RN={"id":"data/IT/RN","key":"RN","name":"Rimini","lang":"it","zip":"47[89]"}
+data/IT/RO={"id":"data/IT/RO","key":"RO","name":"Rovigo","lang":"it","zip":"45"}
+data/IT/SA={"id":"data/IT/SA","key":"SA","name":"Salerno","lang":"it","zip":"84"}
+data/IT/SI={"id":"data/IT/SI","key":"SI","name":"Siena","lang":"it","zip":"53"}
+data/IT/SO={"id":"data/IT/SO","key":"SO","name":"Sondrio","lang":"it","zip":"23[01]"}
+data/IT/SP={"id":"data/IT/SP","key":"SP","name":"La Spezia","lang":"it","zip":"19"}
+data/IT/SR={"id":"data/IT/SR","key":"SR","name":"Siracusa","lang":"it","zip":"96"}
+data/IT/SS={"id":"data/IT/SS","key":"SS","name":"Sassari","lang":"it","zip":"070[14]|0703[0-79]|07100"}
+data/IT/SV={"id":"data/IT/SV","key":"SV","name":"Savona","lang":"it","zip":"17|12071"}
+data/IT/TA={"id":"data/IT/TA","key":"TA","name":"Taranto","lang":"it","zip":"74"}
+data/IT/TE={"id":"data/IT/TE","key":"TE","name":"Teramo","lang":"it","zip":"64"}
+data/IT/TN={"id":"data/IT/TN","key":"TN","name":"Trento","lang":"it","zip":"38"}
+data/IT/TO={"id":"data/IT/TO","key":"TO","name":"Torino","lang":"it","zip":"10"}
+data/IT/TP={"id":"data/IT/TP","key":"TP","name":"Trapani","lang":"it","zip":"91"}
+data/IT/TR={"id":"data/IT/TR","key":"TR","name":"Terni","lang":"it","zip":"05"}
+data/IT/TS={"id":"data/IT/TS","key":"TS","name":"Trieste","lang":"it","zip":"3401|341[0-689]|34062"}
+data/IT/TV={"id":"data/IT/TV","key":"TV","name":"Treviso","lang":"it","zip":"31"}
+data/IT/UD={"id":"data/IT/UD","key":"UD","name":"Udine","lang":"it","zip":"330[1-5]|33100"}
+data/IT/VA={"id":"data/IT/VA","key":"VA","name":"Varese","lang":"it","zip":"21"}
+data/IT/VB={"id":"data/IT/VB","key":"VB","name":"Verbano-Cusio-Ossola","lang":"it","zip":"28[89]"}
+data/IT/VC={"id":"data/IT/VC","key":"VC","name":"Vercelli","lang":"it","zip":"13[01]"}
+data/IT/VE={"id":"data/IT/VE","key":"VE","name":"Venezia","lang":"it","zip":"30"}
+data/IT/VI={"id":"data/IT/VI","key":"VI","name":"Vicenza","lang":"it","zip":"36"}
+data/IT/VR={"id":"data/IT/VR","key":"VR","name":"Verona","lang":"it","zip":"37"}
+data/IT/VS={"id":"data/IT/VS","key":"VS","name":"Medio Campidano","lang":"it","zip":"0902[012579]|0903[015-9]|09040"}
+data/IT/VT={"id":"data/IT/VT","key":"VT","name":"Viterbo","lang":"it","zip":"01"}
+data/IT/VV={"id":"data/IT/VV","key":"VV","name":"Vibo Valentia","lang":"it","zip":"89[89]"}
+data/JE={"id":"data/JE","key":"JE","name":"CHANNEL ISLANDS","fmt":"%N%n%O%n%A%n%X%n%C%nJERSEY%n%Z","require":"ACZ","upper":"CZ","zip":"JE\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}","zipex":"JE1 1AA,JE2 2BT","posturl":"http://www.jerseypost.com/tools/postcode-address-finder/"}
+data/JM={"id":"data/JM","key":"JM","name":"JAMAICA","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C%n%S %X","require":"ACS","state_name_type":"parish","sub_keys":"CLARENDON~HANOVER~KINGSTON~MANCHESTER~PORTLAND~ST. ANDREW~ST. ANN~ST. CATHERINE~ST. ELIZABETH~ST. JAMES~ST. MARY~ST. THOMAS~TRELAWNY~WESTMORELAND","sub_names":"Clarendon~Hanover~Kingston~Manchester~Portland~St. Andrew~St. Ann~St. Catherine~St. Elizabeth~St. James~St. Mary~St. Thomas~Trelawny~Westmoreland","sub_isoids":"13~09~01~12~04~02~06~14~11~08~05~03~07~10"}
+data/JM/CLARENDON={"id":"data/JM/CLARENDON","key":"CLARENDON","name":"Clarendon","lang":"en","isoid":"13"}
+data/JM/HANOVER={"id":"data/JM/HANOVER","key":"HANOVER","name":"Hanover","lang":"en","isoid":"09"}
+data/JM/KINGSTON={"id":"data/JM/KINGSTON","key":"KINGSTON","name":"Kingston","lang":"en","isoid":"01"}
+data/JM/MANCHESTER={"id":"data/JM/MANCHESTER","key":"MANCHESTER","name":"Manchester","lang":"en","isoid":"12"}
+data/JM/PORTLAND={"id":"data/JM/PORTLAND","key":"PORTLAND","name":"Portland","lang":"en","isoid":"04"}
+data/JM/ST. ANDREW={"id":"data/JM/ST. ANDREW","key":"ST. ANDREW","name":"St. Andrew","lang":"en","isoid":"02"}
+data/JM/ST. ANN={"id":"data/JM/ST. ANN","key":"ST. ANN","name":"St. Ann","lang":"en","isoid":"06"}
+data/JM/ST. CATHERINE={"id":"data/JM/ST. CATHERINE","key":"ST. CATHERINE","name":"St. Catherine","lang":"en","isoid":"14"}
+data/JM/ST. ELIZABETH={"id":"data/JM/ST. ELIZABETH","key":"ST. ELIZABETH","name":"St. Elizabeth","lang":"en","isoid":"11"}
+data/JM/ST. JAMES={"id":"data/JM/ST. JAMES","key":"ST. JAMES","name":"St. James","lang":"en","isoid":"08"}
+data/JM/ST. MARY={"id":"data/JM/ST. MARY","key":"ST. MARY","name":"St. Mary","lang":"en","isoid":"05"}
+data/JM/ST. THOMAS={"id":"data/JM/ST. THOMAS","key":"ST. THOMAS","name":"St. Thomas","lang":"en","isoid":"03"}
+data/JM/TRELAWNY={"id":"data/JM/TRELAWNY","key":"TRELAWNY","name":"Trelawny","lang":"en","isoid":"07"}
+data/JM/WESTMORELAND={"id":"data/JM/WESTMORELAND","key":"WESTMORELAND","name":"Westmoreland","lang":"en","isoid":"10"}
+data/JO={"id":"data/JO","key":"JO","name":"JORDAN","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}","zipex":"11937,11190"}
+data/JP={"id":"data/JP","key":"JP","name":"JAPAN","lang":"ja","languages":"ja","fmt":"〒%Z%n%S%C%n%A%n%O%n%N","lfmt":"%N%n%O%n%A%n%C, %S%n%Z","require":"ACSZ","upper":"S","zip":"\\d{3}-?\\d{4}","zipex":"154-0023,350-1106,951-8073,112-0001,208-0032,231-0012,951-8073","posturl":"http://search.post.japanpost.jp/zipcode/","state_name_type":"prefecture","sub_keys":"北海道~青森県~岩手県~宮城県~秋田県~山形県~福島県~茨城県~栃木県~群馬県~埼玉県~千葉県~東京都~神奈川県~新潟県~富山県~石川県~福井県~山梨県~長野県~岐阜県~静岡県~愛知県~三重県~滋賀県~京都府~大阪府~兵庫県~奈良県~和歌山県~鳥取県~島根県~岡山県~広島県~山口県~徳島県~香川県~愛媛県~高知県~福岡県~佐賀県~長崎県~熊本県~大分県~宮崎県~鹿児島県~沖縄県","sub_lnames":"HOKKAIDO~AOMORI~IWATE~MIYAGI~AKITA~YAMAGATA~FUKUSHIMA~IBARAKI~TOCHIGI~GUNMA~SAITAMA~CHIBA~TOKYO~KANAGAWA~NIIGATA~TOYAMA~ISHIKAWA~FUKUI~YAMANASHI~NAGANO~GIFU~SHIZUOKA~AICHI~MIE~SHIGA~KYOTO~OSAKA~HYOGO~NARA~WAKAYAMA~TOTTORI~SHIMANE~OKAYAMA~HIROSHIMA~YAMAGUCHI~TOKUSHIMA~KAGAWA~EHIME~KOCHI~FUKUOKA~SAGA~NAGASAKI~KUMAMOTO~OITA~MIYAZAKI~KAGOSHIMA~OKINAWA","sub_zips":"0[4-9]|00[1-7]~03|018~02~98~01~99~9[67]~3[01]~32|311|349~37|38[49]~3[3-6]~2[6-9]~1[0-8]|19[0-8]|20~2[1-5]|199~9[45]|389~93~92|939~91|922~40~3[89]|949~50~4[1-9]~4[4-9]|431~51|498|647~52~6[0-2]|520~5[3-9]|618|630~6[5-7]|563~63|64[78]~64|519~68~69|68[45]~7[01]~7[23]~7[45]~77~76~79~78~8[0-3]|871~84~85|81[17]|848~86~87|839~88~89~90","sub_isoids":"01~02~03~04~05~06~07~08~09~10~11~12~13~14~15~16~17~18~19~20~21~22~23~24~25~26~27~28~29~30~31~32~33~34~35~36~37~38~39~40~41~42~43~44~45~46~47"}
+data/JP/三重県={"id":"data/JP/三重県","key":"三重県","lang":"ja","lname":"MIE","zip":"51|498|647","isoid":"24"}
+data/JP/京都府={"id":"data/JP/京都府","key":"京都府","lang":"ja","lname":"KYOTO","zip":"6[0-2]|520","isoid":"26"}
+data/JP/佐賀県={"id":"data/JP/佐賀県","key":"佐賀県","lang":"ja","lname":"SAGA","zip":"84","isoid":"41"}
+data/JP/兵庫県={"id":"data/JP/兵庫県","key":"兵庫県","lang":"ja","lname":"HYOGO","zip":"6[5-7]|563","isoid":"28"}
+data/JP/北海道={"id":"data/JP/北海道","key":"北海道","lang":"ja","lname":"HOKKAIDO","zip":"0[4-9]|00[1-7]","isoid":"01"}
+data/JP/千葉県={"id":"data/JP/千葉県","key":"千葉県","lang":"ja","lname":"CHIBA","zip":"2[6-9]","isoid":"12"}
+data/JP/和歌山県={"id":"data/JP/和歌山県","key":"和歌山県","lang":"ja","lname":"WAKAYAMA","zip":"64|519","isoid":"30"}
+data/JP/埼玉県={"id":"data/JP/埼玉県","key":"埼玉県","lang":"ja","lname":"SAITAMA","zip":"3[3-6]","isoid":"11"}
+data/JP/大分県={"id":"data/JP/大分県","key":"大分県","lang":"ja","lname":"OITA","zip":"87|839","isoid":"44"}
+data/JP/大阪府={"id":"data/JP/大阪府","key":"大阪府","lang":"ja","lname":"OSAKA","zip":"5[3-9]|618|630","isoid":"27"}
+data/JP/奈良県={"id":"data/JP/奈良県","key":"奈良県","lang":"ja","lname":"NARA","zip":"63|64[78]","isoid":"29"}
+data/JP/宮城県={"id":"data/JP/宮城県","key":"宮城県","lang":"ja","lname":"MIYAGI","zip":"98","isoid":"04"}
+data/JP/宮崎県={"id":"data/JP/宮崎県","key":"宮崎県","lang":"ja","lname":"MIYAZAKI","zip":"88","isoid":"45"}
+data/JP/富山県={"id":"data/JP/富山県","key":"富山県","lang":"ja","lname":"TOYAMA","zip":"93","isoid":"16"}
+data/JP/山口県={"id":"data/JP/山口県","key":"山口県","lang":"ja","lname":"YAMAGUCHI","zip":"7[45]","isoid":"35"}
+data/JP/山形県={"id":"data/JP/山形県","key":"山形県","lang":"ja","lname":"YAMAGATA","zip":"99","isoid":"06"}
+data/JP/山梨県={"id":"data/JP/山梨県","key":"山梨県","lang":"ja","lname":"YAMANASHI","zip":"40","isoid":"19"}
+data/JP/岐阜県={"id":"data/JP/岐阜県","key":"岐阜県","lang":"ja","lname":"GIFU","zip":"50","isoid":"21"}
+data/JP/岡山県={"id":"data/JP/岡山県","key":"岡山県","lang":"ja","lname":"OKAYAMA","zip":"7[01]","isoid":"33"}
+data/JP/岩手県={"id":"data/JP/岩手県","key":"岩手県","lang":"ja","lname":"IWATE","zip":"02","isoid":"03"}
+data/JP/島根県={"id":"data/JP/島根県","key":"島根県","lang":"ja","lname":"SHIMANE","zip":"69|68[45]","isoid":"32"}
+data/JP/広島県={"id":"data/JP/広島県","key":"広島県","lang":"ja","lname":"HIROSHIMA","zip":"7[23]","isoid":"34"}
+data/JP/徳島県={"id":"data/JP/徳島県","key":"徳島県","lang":"ja","lname":"TOKUSHIMA","zip":"77","isoid":"36"}
+data/JP/愛媛県={"id":"data/JP/愛媛県","key":"愛媛県","lang":"ja","lname":"EHIME","zip":"79","isoid":"38"}
+data/JP/愛知県={"id":"data/JP/愛知県","key":"愛知県","lang":"ja","lname":"AICHI","zip":"4[4-9]|431","isoid":"23"}
+data/JP/新潟県={"id":"data/JP/新潟県","key":"新潟県","lang":"ja","lname":"NIIGATA","zip":"9[45]|389","isoid":"15"}
+data/JP/東京都={"id":"data/JP/東京都","key":"東京都","lang":"ja","lname":"TOKYO","zip":"1[0-8]|19[0-8]|20","isoid":"13"}
+data/JP/栃木県={"id":"data/JP/栃木県","key":"栃木県","lang":"ja","lname":"TOCHIGI","zip":"32|311|349","isoid":"09"}
+data/JP/沖縄県={"id":"data/JP/沖縄県","key":"沖縄県","lang":"ja","lname":"OKINAWA","zip":"90","isoid":"47"}
+data/JP/滋賀県={"id":"data/JP/滋賀県","key":"滋賀県","lang":"ja","lname":"SHIGA","zip":"52","isoid":"25"}
+data/JP/熊本県={"id":"data/JP/熊本県","key":"熊本県","lang":"ja","lname":"KUMAMOTO","zip":"86","isoid":"43"}
+data/JP/石川県={"id":"data/JP/石川県","key":"石川県","lang":"ja","lname":"ISHIKAWA","zip":"92|939","isoid":"17"}
+data/JP/神奈川県={"id":"data/JP/神奈川県","key":"神奈川県","lang":"ja","lname":"KANAGAWA","zip":"2[1-5]|199","isoid":"14"}
+data/JP/福井県={"id":"data/JP/福井県","key":"福井県","lang":"ja","lname":"FUKUI","zip":"91|922","isoid":"18"}
+data/JP/福岡県={"id":"data/JP/福岡県","key":"福岡県","lang":"ja","lname":"FUKUOKA","zip":"8[0-3]|871","isoid":"40"}
+data/JP/福島県={"id":"data/JP/福島県","key":"福島県","lang":"ja","lname":"FUKUSHIMA","zip":"9[67]","isoid":"07"}
+data/JP/秋田県={"id":"data/JP/秋田県","key":"秋田県","lang":"ja","lname":"AKITA","zip":"01","isoid":"05"}
+data/JP/群馬県={"id":"data/JP/群馬県","key":"群馬県","lang":"ja","lname":"GUNMA","zip":"37|38[49]","isoid":"10"}
+data/JP/茨城県={"id":"data/JP/茨城県","key":"茨城県","lang":"ja","lname":"IBARAKI","zip":"3[01]","isoid":"08"}
+data/JP/長崎県={"id":"data/JP/長崎県","key":"長崎県","lang":"ja","lname":"NAGASAKI","zip":"85|81[17]|848","isoid":"42"}
+data/JP/長野県={"id":"data/JP/長野県","key":"長野県","lang":"ja","lname":"NAGANO","zip":"3[89]|949","isoid":"20"}
+data/JP/青森県={"id":"data/JP/青森県","key":"青森県","lang":"ja","lname":"AOMORI","zip":"03|018","isoid":"02"}
+data/JP/静岡県={"id":"data/JP/静岡県","key":"静岡県","lang":"ja","lname":"SHIZUOKA","zip":"4[1-9]","isoid":"22"}
+data/JP/香川県={"id":"data/JP/香川県","key":"香川県","lang":"ja","lname":"KAGAWA","zip":"76","isoid":"37"}
+data/JP/高知県={"id":"data/JP/高知県","key":"高知県","lang":"ja","lname":"KOCHI","zip":"78","isoid":"39"}
+data/JP/鳥取県={"id":"data/JP/鳥取県","key":"鳥取県","lang":"ja","lname":"TOTTORI","zip":"68","isoid":"31"}
+data/JP/鹿児島県={"id":"data/JP/鹿児島県","key":"鹿児島県","lang":"ja","lname":"KAGOSHIMA","zip":"89","isoid":"46"}
+data/KE={"id":"data/KE","key":"KE","name":"KENYA","fmt":"%N%n%O%n%A%n%C%n%Z","zip":"\\d{5}","zipex":"20100,00100"}
+data/KG={"id":"data/KG","key":"KG","name":"KYRGYZSTAN","fmt":"%Z %C %X%n%A%n%O%n%N","zip":"\\d{6}","zipex":"720001"}
+data/KH={"id":"data/KH","key":"KH","name":"CAMBODIA","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}","zipex":"12203,14206,12000"}
+data/KI={"id":"data/KI","key":"KI","name":"KIRIBATI","fmt":"%N%n%O%n%A%n%S%n%C","upper":"ACNOS","state_name_type":"island"}
+data/KM={"id":"data/KM","key":"KM","name":"COMOROS","upper":"AC"}
+data/KN={"id":"data/KN","key":"KN","name":"SAINT KITTS AND NEVIS","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C, %S","require":"ACS","state_name_type":"island","sub_keys":"NEVIS~ST. KITTS","sub_isoids":"N~K"}
+data/KN/NEVIS={"id":"data/KN/NEVIS","key":"NEVIS","lang":"en","isoid":"N"}
+data/KN/ST. KITTS={"id":"data/KN/ST. KITTS","key":"ST. KITTS","lang":"en","isoid":"K"}
+data/KR={"id":"data/KR","key":"KR","name":"KOREA (REP.)","lang":"ko","languages":"ko","fmt":"%S %C%D%n%A%n%O%n%N%n%Z","lfmt":"%N%n%O%n%A%n%D%n%C%n%S%n%Z","require":"ACSZ","upper":"Z","zip":"\\d{3}[\\-]\\d{3}","zipex":"110-110,699-800","posturl":"http://www.epost.go.kr/search/zipcode/search5.jsp","state_name_type":"do_si","sub_keys":"강원도~경기도~경상남도~경상북도~광주광역시~대구광역시~대전광역시~부산광역시~서울특별시~세종특별자치시~울산광역시~인천광역시~전라남도~전라북도~제주특별자치도~충청남도~충청북도","sub_names":"강원~경기~경남~경북~광주~대구~대전~부산~서울~세종~울산~인천~전남~전북~제주~충남~충북","sub_lnames":"Gangwon~Gyeonggi~Gyeongnam~Gyeongbuk~Gwangju~Daegu~Daejeon~Busan~Seoul~Sejong~Ulsan~Incheon~Jeonnam~Jeonbuk~Jeju~Chungnam~Chungbuk","sub_zips":"2[0-6]|487[\\-]839~4(?:1[0-6]|[2-8])~6[2-7]~7(?:1[2-9]|[3-9])~50[0-36]~7(?:0[0-6]|11)~30[0-25-6]~6[0-1]~1[0-5]~339~68[0-39]~4(?:0[0-79]|17)~5[1-5]~5[6-9]~69[0579]~3(?:[1245]|3[0-8])~3[6-9]","sub_zipexs":"255-815:210-923~427-080:431-088~621-759:668-863~712-861:770-841~501-805:506-358~700-441:711-865~300-091:305-504~609-311:619-872~100-620:151-832~339-014~683-480:689-832~406-131:417-921~516-931:556-891~568-803:595-871~690-808:697-370~314-831:355-770~367-861:395-813","sub_isoids":"42~41~48~47~29~27~30~26~11~~31~28~46~45~49~44~43","sub_mores":"true~true~true~true~true~true~true~true~true~false~true~true~true~true~true~true~true"}
+data/KR/강원도={"id":"data/KR/강원도","key":"강원도","name":"강원","lang":"ko","lname":"Gangwon","zip":"2[0-6]|487[\\-]839","zipex":"255-815:210-923","isoid":"42","sub_keys":"강릉시~고성군~동해시~삼척시~속초시~양구군~양양군~영월군~원주시~인제군~정선군~철원군~춘천시~태백시~평창군~홍천군~화천군~횡성군","sub_lnames":"Gangneung-si~Goseong-gun~Donghae-si~Samcheok-si~Sokcho-si~Yanggu-gun~Yangyang-gun~Yeongwol-gun~Wonju-si~Inje-gun~Jeongseon-gun~Cheorwon-gun~Chuncheon-si~Taebaek-si~Pyeongchang-gun~Hongcheon-gun~Hwacheon-gun~Hoengseong-gun","sub_zips":"210~219~24[05]~245~21[79]~255[\\-]8~215~230~220~25[02]~233~209|269|487[\\-]839~2(?:0[09]|50)~235~232~250~209[\\-]8~225"}
+data/KR/강원도/강릉시={"id":"data/KR/강원도/강릉시","key":"강릉시","lang":"ko","lname":"Gangneung-si","zip":"210"}
+data/KR/강원도/고성군={"id":"data/KR/강원도/고성군","key":"고성군","lang":"ko","lname":"Goseong-gun","zip":"219"}
+data/KR/강원도/동해시={"id":"data/KR/강원도/동해시","key":"동해시","lang":"ko","lname":"Donghae-si","zip":"24[05]"}
+data/KR/강원도/삼척시={"id":"data/KR/강원도/삼척시","key":"삼척시","lang":"ko","lname":"Samcheok-si","zip":"245"}
+data/KR/강원도/속초시={"id":"data/KR/강원도/속초시","key":"속초시","lang":"ko","lname":"Sokcho-si","zip":"21[79]"}
+data/KR/강원도/양구군={"id":"data/KR/강원도/양구군","key":"양구군","lang":"ko","lname":"Yanggu-gun","zip":"255[\\-]8"}
+data/KR/강원도/양양군={"id":"data/KR/강원도/양양군","key":"양양군","lang":"ko","lname":"Yangyang-gun","zip":"215"}
+data/KR/강원도/영월군={"id":"data/KR/강원도/영월군","key":"영월군","lang":"ko","lname":"Yeongwol-gun","zip":"230"}
+data/KR/강원도/원주시={"id":"data/KR/강원도/원주시","key":"원주시","lang":"ko","lname":"Wonju-si","zip":"220"}
+data/KR/강원도/인제군={"id":"data/KR/강원도/인제군","key":"인제군","lang":"ko","lname":"Inje-gun","zip":"25[02]"}
+data/KR/강원도/정선군={"id":"data/KR/강원도/정선군","key":"정선군","lang":"ko","lname":"Jeongseon-gun","zip":"233"}
+data/KR/강원도/철원군={"id":"data/KR/강원도/철원군","key":"철원군","lang":"ko","lname":"Cheorwon-gun","zip":"209|269|487[\\-]839"}
+data/KR/강원도/춘천시={"id":"data/KR/강원도/춘천시","key":"춘천시","lang":"ko","lname":"Chuncheon-si","zip":"2(?:0[09]|50)"}
+data/KR/강원도/태백시={"id":"data/KR/강원도/태백시","key":"태백시","lang":"ko","lname":"Taebaek-si","zip":"235"}
+data/KR/강원도/평창군={"id":"data/KR/강원도/평창군","key":"평창군","lang":"ko","lname":"Pyeongchang-gun","zip":"232"}
+data/KR/강원도/홍천군={"id":"data/KR/강원도/홍천군","key":"홍천군","lang":"ko","lname":"Hongcheon-gun","zip":"250"}
+data/KR/강원도/화천군={"id":"data/KR/강원도/화천군","key":"화천군","lang":"ko","lname":"Hwacheon-gun","zip":"209[\\-]8"}
+data/KR/강원도/횡성군={"id":"data/KR/강원도/횡성군","key":"횡성군","lang":"ko","lname":"Hoengseong-gun","zip":"225"}
+data/KR/경기도={"id":"data/KR/경기도","key":"경기도","name":"경기","lang":"ko","lname":"Gyeonggi","zip":"4(?:1[0-6]|[2-8])","zipex":"427-080:431-088","isoid":"41","sub_keys":"가평군~고양시~과천시~광명시~광주시~구리시~군포시~김포시~남양주시~동두천시~부천시~성남시~수원시~시흥시~안산시~안성시~안양시~양주시~양평군~여주시~연천군~오산시~용인시~의왕시~의정부시~이천시~파주시~평택시~포천시~하남시~화성시","sub_lnames":"Gapyeong-gun~Goyang-si~Gwacheon-si~Gwangmyeong-si~Gwangju-si~Guri-si~Gunpo-si~Gimpo-si~Namyangju-si~Dongducheon-si~Bucheon-si~Seongnam-si~Suwon-si~Siheung-si~Ansan-si~Anseong-si~Anyang-si~Yangju-si~Yangpyeong-gun~Yeoju-si~Yeoncheon-gun~Osan-si~Yongin-si~Uiwang-si~Uijeongbu-si~Icheon-si~Paju-si~Pyeongtaek-si~Pocheon-si~Hanam-si~Hwaseong-si","sub_zips":"477~41[012]~427~423~464~471~435~415~4(?:7[12]|80)~48[236]~42[012]~46[123]~44[0123]~429~42[56]~456~43[01]~4(?:12|8[027])~476~469~48[0267]~447~44[689]~437~480~467~4(?:1[023]|82)~45[019]~48[0267]~465~445","sub_mores":"false~true~false~false~false~false~false~false~false~false~true~true~true~false~true~false~true~false~false~false~false~false~true~false~false~false~false~false~false~false~false"}
+data/KR/경기도/가평군={"id":"data/KR/경기도/가평군","key":"가평군","lang":"ko","lname":"Gapyeong-gun","zip":"477"}
+data/KR/경기도/고양시={"id":"data/KR/경기도/고양시","key":"고양시","lang":"ko","lname":"Goyang-si","zip":"41[012]","sub_keys":"덕양구~일산동구~일산서구","sub_lnames":"Deogyang-gu~Ilsandong-gu~Ilsanseo-gu","sub_zips":"41[02]~410~411"}
+data/KR/경기도/고양시/덕양구={"id":"data/KR/경기도/고양시/덕양구","key":"덕양구","lang":"ko","lname":"Deogyang-gu","zip":"41[02]"}
+data/KR/경기도/고양시/일산동구={"id":"data/KR/경기도/고양시/일산동구","key":"일산동구","lang":"ko","lname":"Ilsandong-gu","zip":"410"}
+data/KR/경기도/고양시/일산서구={"id":"data/KR/경기도/고양시/일산서구","key":"일산서구","lang":"ko","lname":"Ilsanseo-gu","zip":"411"}
+data/KR/경기도/과천시={"id":"data/KR/경기도/과천시","key":"과천시","lang":"ko","lname":"Gwacheon-si","zip":"427"}
+data/KR/경기도/광명시={"id":"data/KR/경기도/광명시","key":"광명시","lang":"ko","lname":"Gwangmyeong-si","zip":"423"}
+data/KR/경기도/광주시={"id":"data/KR/경기도/광주시","key":"광주시","lang":"ko","lname":"Gwangju-si","zip":"464"}
+data/KR/경기도/구리시={"id":"data/KR/경기도/구리시","key":"구리시","lang":"ko","lname":"Guri-si","zip":"471"}
+data/KR/경기도/군포시={"id":"data/KR/경기도/군포시","key":"군포시","lang":"ko","lname":"Gunpo-si","zip":"435"}
+data/KR/경기도/김포시={"id":"data/KR/경기도/김포시","key":"김포시","lang":"ko","lname":"Gimpo-si","zip":"415"}
+data/KR/경기도/남양주시={"id":"data/KR/경기도/남양주시","key":"남양주시","lang":"ko","lname":"Namyangju-si","zip":"4(?:7[12]|80)"}
+data/KR/경기도/동두천시={"id":"data/KR/경기도/동두천시","key":"동두천시","lang":"ko","lname":"Dongducheon-si","zip":"48[236]"}
+data/KR/경기도/부천시={"id":"data/KR/경기도/부천시","key":"부천시","lang":"ko","lname":"Bucheon-si","zip":"42[012]","sub_keys":"소사구~오정구~원미구","sub_lnames":"Sosa-gu~Ojeong-gu~Wonmi-gu","sub_zips":"422~421~420"}
+data/KR/경기도/부천시/소사구={"id":"data/KR/경기도/부천시/소사구","key":"소사구","lang":"ko","lname":"Sosa-gu","zip":"422"}
+data/KR/경기도/부천시/오정구={"id":"data/KR/경기도/부천시/오정구","key":"오정구","lang":"ko","lname":"Ojeong-gu","zip":"421"}
+data/KR/경기도/부천시/원미구={"id":"data/KR/경기도/부천시/원미구","key":"원미구","lang":"ko","lname":"Wonmi-gu","zip":"420"}
+data/KR/경기도/성남시={"id":"data/KR/경기도/성남시","key":"성남시","lang":"ko","lname":"Seongnam-si","zip":"46[123]","sub_keys":"분당구~수정구~중원구","sub_lnames":"Bundang-gu~Sujeong-gu~Jungwon-gu","sub_zips":"463~461~462"}
+data/KR/경기도/성남시/분당구={"id":"data/KR/경기도/성남시/분당구","key":"분당구","lang":"ko","lname":"Bundang-gu","zip":"463"}
+data/KR/경기도/성남시/수정구={"id":"data/KR/경기도/성남시/수정구","key":"수정구","lang":"ko","lname":"Sujeong-gu","zip":"461"}
+data/KR/경기도/성남시/중원구={"id":"data/KR/경기도/성남시/중원구","key":"중원구","lang":"ko","lname":"Jungwon-gu","zip":"462"}
+data/KR/경기도/수원시={"id":"data/KR/경기도/수원시","key":"수원시","lang":"ko","lname":"Suwon-si","zip":"44[0123]","sub_keys":"권선구~영통구~장안구~팔달구","sub_lnames":"Gwonseon-gu~Yeongtong-gu~Jangan-gu~Paldal-gu","sub_zips":"441~443~440~442"}
+data/KR/경기도/수원시/권선구={"id":"data/KR/경기도/수원시/권선구","key":"권선구","lang":"ko","lname":"Gwonseon-gu","zip":"441"}
+data/KR/경기도/수원시/영통구={"id":"data/KR/경기도/수원시/영통구","key":"영통구","lang":"ko","lname":"Yeongtong-gu","zip":"443"}
+data/KR/경기도/수원시/장안구={"id":"data/KR/경기도/수원시/장안구","key":"장안구","lang":"ko","lname":"Jangan-gu","zip":"440"}
+data/KR/경기도/수원시/팔달구={"id":"data/KR/경기도/수원시/팔달구","key":"팔달구","lang":"ko","lname":"Paldal-gu","zip":"442"}
+data/KR/경기도/시흥시={"id":"data/KR/경기도/시흥시","key":"시흥시","lang":"ko","lname":"Siheung-si","zip":"429"}
+data/KR/경기도/안산시={"id":"data/KR/경기도/안산시","key":"안산시","lang":"ko","lname":"Ansan-si","zip":"42[56]","sub_keys":"단원구~상록구","sub_lnames":"Danwon-gu~Sangnok-gu","sub_zips":"425~426"}
+data/KR/경기도/안산시/단원구={"id":"data/KR/경기도/안산시/단원구","key":"단원구","lang":"ko","lname":"Danwon-gu","zip":"425"}
+data/KR/경기도/안산시/상록구={"id":"data/KR/경기도/안산시/상록구","key":"상록구","lang":"ko","lname":"Sangnok-gu","zip":"426"}
+data/KR/경기도/안성시={"id":"data/KR/경기도/안성시","key":"안성시","lang":"ko","lname":"Anseong-si","zip":"456"}
+data/KR/경기도/안양시={"id":"data/KR/경기도/안양시","key":"안양시","lang":"ko","lname":"Anyang-si","zip":"43[01]","sub_keys":"동안구~만안구","sub_lnames":"Dongan-gu~Manan-gu","sub_zips":"431~430"}
+data/KR/경기도/안양시/동안구={"id":"data/KR/경기도/안양시/동안구","key":"동안구","lang":"ko","lname":"Dongan-gu","zip":"431"}
+data/KR/경기도/안양시/만안구={"id":"data/KR/경기도/안양시/만안구","key":"만안구","lang":"ko","lname":"Manan-gu","zip":"430"}
+data/KR/경기도/양주시={"id":"data/KR/경기도/양주시","key":"양주시","lang":"ko","lname":"Yangju-si","zip":"4(?:12|8[027])"}
+data/KR/경기도/양평군={"id":"data/KR/경기도/양평군","key":"양평군","lang":"ko","lname":"Yangpyeong-gun","zip":"476"}
+data/KR/경기도/여주시={"id":"data/KR/경기도/여주시","key":"여주시","lang":"ko","lname":"Yeoju-si","zip":"469"}
+data/KR/경기도/연천군={"id":"data/KR/경기도/연천군","key":"연천군","lang":"ko","lname":"Yeoncheon-gun","zip":"48[0267]"}
+data/KR/경기도/오산시={"id":"data/KR/경기도/오산시","key":"오산시","lang":"ko","lname":"Osan-si","zip":"447"}
+data/KR/경기도/용인시={"id":"data/KR/경기도/용인시","key":"용인시","lang":"ko","lname":"Yongin-si","zip":"44[689]","sub_keys":"기흥구~수지구~처인구","sub_lnames":"Giheung-gu~Suji-gu~Cheoin-gu","sub_zips":"446~448~449"}
+data/KR/경기도/용인시/기흥구={"id":"data/KR/경기도/용인시/기흥구","key":"기흥구","lang":"ko","lname":"Giheung-gu","zip":"446"}
+data/KR/경기도/용인시/수지구={"id":"data/KR/경기도/용인시/수지구","key":"수지구","lang":"ko","lname":"Suji-gu","zip":"448"}
+data/KR/경기도/용인시/처인구={"id":"data/KR/경기도/용인시/처인구","key":"처인구","lang":"ko","lname":"Cheoin-gu","zip":"449"}
+data/KR/경기도/의왕시={"id":"data/KR/경기도/의왕시","key":"의왕시","lang":"ko","lname":"Uiwang-si","zip":"437"}
+data/KR/경기도/의정부시={"id":"data/KR/경기도/의정부시","key":"의정부시","lang":"ko","lname":"Uijeongbu-si","zip":"480"}
+data/KR/경기도/이천시={"id":"data/KR/경기도/이천시","key":"이천시","lang":"ko","lname":"Icheon-si","zip":"467"}
+data/KR/경기도/파주시={"id":"data/KR/경기도/파주시","key":"파주시","lang":"ko","lname":"Paju-si","zip":"4(?:1[023]|82)"}
+data/KR/경기도/평택시={"id":"data/KR/경기도/평택시","key":"평택시","lang":"ko","lname":"Pyeongtaek-si","zip":"45[019]"}
+data/KR/경기도/포천시={"id":"data/KR/경기도/포천시","key":"포천시","lang":"ko","lname":"Pocheon-si","zip":"48[0267]"}
+data/KR/경기도/하남시={"id":"data/KR/경기도/하남시","key":"하남시","lang":"ko","lname":"Hanam-si","zip":"465"}
+data/KR/경기도/화성시={"id":"data/KR/경기도/화성시","key":"화성시","lang":"ko","lname":"Hwaseong-si","zip":"445"}
+data/KR/경상남도={"id":"data/KR/경상남도","key":"경상남도","name":"경남","lang":"ko","lname":"Gyeongnam","zip":"6[2-7]","zipex":"621-759:668-863","isoid":"48","sub_keys":"거제시~거창군~고성군~김해시~남해군~밀양시~사천시~산청군~양산시~의령군~진주시~창녕군~창원시~통영시~하동군~함안군~함양군~합천군","sub_lnames":"Geoje-si~Geochang-gun~Goseong-gun~Gimhae-si~Namhae-gun~Miryang-si~Sacheon-si~Sancheong-gun~Yangsan-si~Uiryeong-gun~Jinju-si~Changnyeong-gun~Changwon-si~Tongyeong-si~Hadong-gun~Haman-gun~Hamyang-gun~Hapcheon-gun","sub_zips":"656~670~638~621~668[\\-]8~627~664~666~626~636~660~635~6(?:3[01]|4[125])~650~667~637~676~678","sub_mores":"false~false~false~false~false~false~false~false~false~false~false~false~true~false~false~false~false~false"}
+data/KR/경상남도/거제시={"id":"data/KR/경상남도/거제시","key":"거제시","lang":"ko","lname":"Geoje-si","zip":"656"}
+data/KR/경상남도/거창군={"id":"data/KR/경상남도/거창군","key":"거창군","lang":"ko","lname":"Geochang-gun","zip":"670"}
+data/KR/경상남도/고성군={"id":"data/KR/경상남도/고성군","key":"고성군","lang":"ko","lname":"Goseong-gun","zip":"638"}
+data/KR/경상남도/김해시={"id":"data/KR/경상남도/김해시","key":"김해시","lang":"ko","lname":"Gimhae-si","zip":"621"}
+data/KR/경상남도/남해군={"id":"data/KR/경상남도/남해군","key":"남해군","lang":"ko","lname":"Namhae-gun","zip":"668[\\-]8"}
+data/KR/경상남도/밀양시={"id":"data/KR/경상남도/밀양시","key":"밀양시","lang":"ko","lname":"Miryang-si","zip":"627"}
+data/KR/경상남도/사천시={"id":"data/KR/경상남도/사천시","key":"사천시","lang":"ko","lname":"Sacheon-si","zip":"664"}
+data/KR/경상남도/산청군={"id":"data/KR/경상남도/산청군","key":"산청군","lang":"ko","lname":"Sancheong-gun","zip":"666"}
+data/KR/경상남도/양산시={"id":"data/KR/경상남도/양산시","key":"양산시","lang":"ko","lname":"Yangsan-si","zip":"626"}
+data/KR/경상남도/의령군={"id":"data/KR/경상남도/의령군","key":"의령군","lang":"ko","lname":"Uiryeong-gun","zip":"636"}
+data/KR/경상남도/진주시={"id":"data/KR/경상남도/진주시","key":"진주시","lang":"ko","lname":"Jinju-si","zip":"660"}
+data/KR/경상남도/창녕군={"id":"data/KR/경상남도/창녕군","key":"창녕군","lang":"ko","lname":"Changnyeong-gun","zip":"635"}
+data/KR/경상남도/창원시={"id":"data/KR/경상남도/창원시","key":"창원시","lang":"ko","lname":"Changwon-si","zip":"6(?:3[01]|4[125])","sub_keys":"마산합포구~마산회원구~성산구~의창구~진해구","sub_lnames":"Masanhappo-gu~Masanhoewon-gu~Seongsan-gu~Uichang-gu~Jinhae-gu","sub_zips":"631~630~642~641~645"}
+data/KR/경상남도/창원시/마산합포구={"id":"data/KR/경상남도/창원시/마산합포구","key":"마산합포구","lang":"ko","lname":"Masanhappo-gu","zip":"631"}
+data/KR/경상남도/창원시/마산회원구={"id":"data/KR/경상남도/창원시/마산회원구","key":"마산회원구","lang":"ko","lname":"Masanhoewon-gu","zip":"630"}
+data/KR/경상남도/창원시/성산구={"id":"data/KR/경상남도/창원시/성산구","key":"성산구","lang":"ko","lname":"Seongsan-gu","zip":"642"}
+data/KR/경상남도/창원시/의창구={"id":"data/KR/경상남도/창원시/의창구","key":"의창구","lang":"ko","lname":"Uichang-gu","zip":"641"}
+data/KR/경상남도/창원시/진해구={"id":"data/KR/경상남도/창원시/진해구","key":"진해구","lang":"ko","lname":"Jinhae-gu","zip":"645"}
+data/KR/경상남도/통영시={"id":"data/KR/경상남도/통영시","key":"통영시","lang":"ko","lname":"Tongyeong-si","zip":"650"}
+data/KR/경상남도/하동군={"id":"data/KR/경상남도/하동군","key":"하동군","lang":"ko","lname":"Hadong-gun","zip":"667"}
+data/KR/경상남도/함안군={"id":"data/KR/경상남도/함안군","key":"함안군","lang":"ko","lname":"Haman-gun","zip":"637"}
+data/KR/경상남도/함양군={"id":"data/KR/경상남도/함양군","key":"함양군","lang":"ko","lname":"Hamyang-gun","zip":"676"}
+data/KR/경상남도/합천군={"id":"data/KR/경상남도/합천군","key":"합천군","lang":"ko","lname":"Hapcheon-gun","zip":"678"}
+data/KR/경상북도={"id":"data/KR/경상북도","key":"경상북도","name":"경북","lang":"ko","lname":"Gyeongbuk","zip":"7(?:1[2-9]|[3-9])","zipex":"712-861:770-841","isoid":"47","sub_keys":"경산시~경주시~고령군~구미시~군위군~김천시~문경시~봉화군~상주시~성주군~안동시~영덕군~영양군~영주시~영천시~예천군~울릉군~울진군~의성군~청도군~청송군~칠곡군~포항시","sub_lnames":"Gyeongsan-si~Gyeongju-si~Goryeong-gun~Gumi-si~Gunwi-gun~Gimcheon-si~Mungyeong-si~Bonghwa-gun~Sangju-si~Seongju-gun~Andong-si~Yeongdeok-gun~Yeongyang-gun~Yeongju-si~Yeongcheon-si~Yecheon-gun~Ulleung-gun~Uljin-gun~Uiseong-gun~Cheongdo-gun~Cheongsong-gun~Chilgok-gun~Pohang-si","sub_zips":"712~780~717~730~716~740~745~755[\\-]8~742~719[\\-]8~760~766~764[\\-]8~750~770~757~799[\\-]8~767~769~714~763~718~79[01]","sub_mores":"false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~false~true"}
+data/KR/경상북도/경산시={"id":"data/KR/경상북도/경산시","key":"경산시","lang":"ko","lname":"Gyeongsan-si","zip":"712"}
+data/KR/경상북도/경주시={"id":"data/KR/경상북도/경주시","key":"경주시","lang":"ko","lname":"Gyeongju-si","zip":"780"}
+data/KR/경상북도/고령군={"id":"data/KR/경상북도/고령군","key":"고령군","lang":"ko","lname":"Goryeong-gun","zip":"717"}
+data/KR/경상북도/구미시={"id":"data/KR/경상북도/구미시","key":"구미시","lang":"ko","lname":"Gumi-si","zip":"730"}
+data/KR/경상북도/군위군={"id":"data/KR/경상북도/군위군","key":"군위군","lang":"ko","lname":"Gunwi-gun","zip":"716"}
+data/KR/경상북도/김천시={"id":"data/KR/경상북도/김천시","key":"김천시","lang":"ko","lname":"Gimcheon-si","zip":"740"}
+data/KR/경상북도/문경시={"id":"data/KR/경상북도/문경시","key":"문경시","lang":"ko","lname":"Mungyeong-si","zip":"745"}
+data/KR/경상북도/봉화군={"id":"data/KR/경상북도/봉화군","key":"봉화군","lang":"ko","lname":"Bonghwa-gun","zip":"755[\\-]8"}
+data/KR/경상북도/상주시={"id":"data/KR/경상북도/상주시","key":"상주시","lang":"ko","lname":"Sangju-si","zip":"742"}
+data/KR/경상북도/성주군={"id":"data/KR/경상북도/성주군","key":"성주군","lang":"ko","lname":"Seongju-gun","zip":"719[\\-]8"}
+data/KR/경상북도/안동시={"id":"data/KR/경상북도/안동시","key":"안동시","lang":"ko","lname":"Andong-si","zip":"760"}
+data/KR/경상북도/영덕군={"id":"data/KR/경상북도/영덕군","key":"영덕군","lang":"ko","lname":"Yeongdeok-gun","zip":"766"}
+data/KR/경상북도/영양군={"id":"data/KR/경상북도/영양군","key":"영양군","lang":"ko","lname":"Yeongyang-gun","zip":"764[\\-]8"}
+data/KR/경상북도/영주시={"id":"data/KR/경상북도/영주시","key":"영주시","lang":"ko","lname":"Yeongju-si","zip":"750"}
+data/KR/경상북도/영천시={"id":"data/KR/경상북도/영천시","key":"영천시","lang":"ko","lname":"Yeongcheon-si","zip":"770"}
+data/KR/경상북도/예천군={"id":"data/KR/경상북도/예천군","key":"예천군","lang":"ko","lname":"Yecheon-gun","zip":"757"}
+data/KR/경상북도/울릉군={"id":"data/KR/경상북도/울릉군","key":"울릉군","lang":"ko","lname":"Ulleung-gun","zip":"799[\\-]8"}
+data/KR/경상북도/울진군={"id":"data/KR/경상북도/울진군","key":"울진군","lang":"ko","lname":"Uljin-gun","zip":"767"}
+data/KR/경상북도/의성군={"id":"data/KR/경상북도/의성군","key":"의성군","lang":"ko","lname":"Uiseong-gun","zip":"769"}
+data/KR/경상북도/청도군={"id":"data/KR/경상북도/청도군","key":"청도군","lang":"ko","lname":"Cheongdo-gun","zip":"714"}
+data/KR/경상북도/청송군={"id":"data/KR/경상북도/청송군","key":"청송군","lang":"ko","lname":"Cheongsong-gun","zip":"763"}
+data/KR/경상북도/칠곡군={"id":"data/KR/경상북도/칠곡군","key":"칠곡군","lang":"ko","lname":"Chilgok-gun","zip":"718"}
+data/KR/경상북도/포항시={"id":"data/KR/경상북도/포항시","key":"포항시","lang":"ko","lname":"Pohang-si","zip":"79[01]","sub_keys":"남구~북구","sub_lnames":"Nam-gu~Buk-gu","sub_zips":"790~791"}
+data/KR/경상북도/포항시/남구={"id":"data/KR/경상북도/포항시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"790"}
+data/KR/경상북도/포항시/북구={"id":"data/KR/경상북도/포항시/북구","key":"북구","lang":"ko","lname":"Buk-gu","zip":"791"}
+data/KR/광주광역시={"id":"data/KR/광주광역시","key":"광주광역시","name":"광주","lang":"ko","lname":"Gwangju","zip":"50[0-36]","zipex":"501-805:506-358","isoid":"29","sub_keys":"광산구~남구~동구~북구~서구","sub_lnames":"Gwangsan-gu~Nam-gu~Dong-gu~Buk-gu~Seo-gu","sub_zips":"506~503~501~500~502"}
+data/KR/광주광역시/광산구={"id":"data/KR/광주광역시/광산구","key":"광산구","lang":"ko","lname":"Gwangsan-gu","zip":"506"}
+data/KR/광주광역시/남구={"id":"data/KR/광주광역시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"503"}
+data/KR/광주광역시/동구={"id":"data/KR/광주광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"501"}
+data/KR/광주광역시/북구={"id":"data/KR/광주광역시/북구","key":"북구","lang":"ko","lname":"Buk-gu","zip":"500"}
+data/KR/광주광역시/서구={"id":"data/KR/광주광역시/서구","key":"서구","lang":"ko","lname":"Seo-gu","zip":"502"}
+data/KR/대구광역시={"id":"data/KR/대구광역시","key":"대구광역시","name":"대구","lang":"ko","lname":"Daegu","zip":"7(?:0[0-6]|11)","zipex":"700-441:711-865","isoid":"27","sub_keys":"남구~달서구~달성군~동구~북구~서구~수성구~중구","sub_lnames":"Nam-gu~Dalseo-gu~Dalseong-gun~Dong-gu~Buk-gu~Seo-gu~Suseong-gu~Jung-gu","sub_zips":"705~704~711~701~702~703~706~700"}
+data/KR/대구광역시/남구={"id":"data/KR/대구광역시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"705"}
+data/KR/대구광역시/달서구={"id":"data/KR/대구광역시/달서구","key":"달서구","lang":"ko","lname":"Dalseo-gu","zip":"704"}
+data/KR/대구광역시/달성군={"id":"data/KR/대구광역시/달성군","key":"달성군","lang":"ko","lname":"Dalseong-gun","zip":"711"}
+data/KR/대구광역시/동구={"id":"data/KR/대구광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"701"}
+data/KR/대구광역시/북구={"id":"data/KR/대구광역시/북구","key":"북구","lang":"ko","lname":"Buk-gu","zip":"702"}
+data/KR/대구광역시/서구={"id":"data/KR/대구광역시/서구","key":"서구","lang":"ko","lname":"Seo-gu","zip":"703"}
+data/KR/대구광역시/수성구={"id":"data/KR/대구광역시/수성구","key":"수성구","lang":"ko","lname":"Suseong-gu","zip":"706"}
+data/KR/대구광역시/중구={"id":"data/KR/대구광역시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"700"}
+data/KR/대전광역시={"id":"data/KR/대전광역시","key":"대전광역시","name":"대전","lang":"ko","lname":"Daejeon","zip":"30[0-25-6]","zipex":"300-091:305-504","isoid":"30","sub_keys":"대덕구~동구~서구~유성구~중구","sub_lnames":"Daedeok-gu~Dong-gu~Seo-gu~Yuseong-gu~Jung-gu","sub_zips":"306~300~302~305~301"}
+data/KR/대전광역시/대덕구={"id":"data/KR/대전광역시/대덕구","key":"대덕구","lang":"ko","lname":"Daedeok-gu","zip":"306"}
+data/KR/대전광역시/동구={"id":"data/KR/대전광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"300"}
+data/KR/대전광역시/서구={"id":"data/KR/대전광역시/서구","key":"서구","lang":"ko","lname":"Seo-gu","zip":"302"}
+data/KR/대전광역시/유성구={"id":"data/KR/대전광역시/유성구","key":"유성구","lang":"ko","lname":"Yuseong-gu","zip":"305"}
+data/KR/대전광역시/중구={"id":"data/KR/대전광역시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"301"}
+data/KR/부산광역시={"id":"data/KR/부산광역시","key":"부산광역시","name":"부산","lang":"ko","lname":"Busan","zip":"6[0-1]","zipex":"609-311:619-872","isoid":"26","sub_keys":"강서구~금정구~기장군~남구~동구~동래구~부산진구~북구~사상구~사하구~서구~수영구~연제구~영도구~중구~해운대구","sub_lnames":"Gangseo-gu~Geumjeong-gu~Gijang-gun~Nam-gu~Dong-gu~Dongnae-gu~Busanjin-gu~Buk-gu~Sasang-gu~Saha-gu~Seo-gu~Suyeong-gu~Yeonje-gu~Yeongdo-gu~Jung-gu~Haeundae-gu","sub_zips":"618~609~619~608~601~607~614~616~617~604~602~613~611~606~600~612"}
+data/KR/부산광역시/강서구={"id":"data/KR/부산광역시/강서구","key":"강서구","lang":"ko","lname":"Gangseo-gu","zip":"618"}
+data/KR/부산광역시/금정구={"id":"data/KR/부산광역시/금정구","key":"금정구","lang":"ko","lname":"Geumjeong-gu","zip":"609"}
+data/KR/부산광역시/기장군={"id":"data/KR/부산광역시/기장군","key":"기장군","lang":"ko","lname":"Gijang-gun","zip":"619"}
+data/KR/부산광역시/남구={"id":"data/KR/부산광역시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"608"}
+data/KR/부산광역시/동구={"id":"data/KR/부산광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"601"}
+data/KR/부산광역시/동래구={"id":"data/KR/부산광역시/동래구","key":"동래구","lang":"ko","lname":"Dongnae-gu","zip":"607"}
+data/KR/부산광역시/부산진구={"id":"data/KR/부산광역시/부산진구","key":"부산진구","lang":"ko","lname":"Busanjin-gu","zip":"614"}
+data/KR/부산광역시/북구={"id":"data/KR/부산광역시/북구","key":"북구","lang":"ko","lname":"Buk-gu","zip":"616"}
+data/KR/부산광역시/사상구={"id":"data/KR/부산광역시/사상구","key":"사상구","lang":"ko","lname":"Sasang-gu","zip":"617"}
+data/KR/부산광역시/사하구={"id":"data/KR/부산광역시/사하구","key":"사하구","lang":"ko","lname":"Saha-gu","zip":"604"}
+data/KR/부산광역시/서구={"id":"data/KR/부산광역시/서구","key":"서구","lang":"ko","lname":"Seo-gu","zip":"602"}
+data/KR/부산광역시/수영구={"id":"data/KR/부산광역시/수영구","key":"수영구","lang":"ko","lname":"Suyeong-gu","zip":"613"}
+data/KR/부산광역시/연제구={"id":"data/KR/부산광역시/연제구","key":"연제구","lang":"ko","lname":"Yeonje-gu","zip":"611"}
+data/KR/부산광역시/영도구={"id":"data/KR/부산광역시/영도구","key":"영도구","lang":"ko","lname":"Yeongdo-gu","zip":"606"}
+data/KR/부산광역시/중구={"id":"data/KR/부산광역시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"600"}
+data/KR/부산광역시/해운대구={"id":"data/KR/부산광역시/해운대구","key":"해운대구","lang":"ko","lname":"Haeundae-gu","zip":"612"}
+data/KR/서울특별시={"id":"data/KR/서울특별시","key":"서울특별시","name":"서울","lang":"ko","lname":"Seoul","zip":"1[0-5]","zipex":"100-620:151-832","isoid":"11","sub_keys":"강남구~강동구~강북구~강서구~관악구~광진구~구로구~금천구~노원구~도봉구~동대문구~동작구~마포구~서대문구~서초구~성동구~성북구~송파구~양천구~영등포구~용산구~은평구~종로구~중구~중랑구","sub_lnames":"Gangnam-gu~Gangdong-gu~Gangbuk-gu~Gangseo-gu~Gwanak-gu~Gwangjin-gu~Guro-gu~Geumcheon-gu~Nowon-gu~Dobong-gu~Dongdaemun-gu~Dongjak-gu~Mapo-gu~Seodaemun-gu~Seocho-gu~Seongdong-gu~Seongbuk-gu~Songpa-gu~Yangcheon-gu~Yeongdeungpo-gu~Yongsan-gu~Eunpyeong-gu~Jongno-gu~Jung-gu~Jungnang-gu","sub_zips":"135~134~142~157~151~143~152~153~139~132~130~156~121~120~137~133~136~138~158~150~140~122~110~100~131"}
+data/KR/서울특별시/강남구={"id":"data/KR/서울특별시/강남구","key":"강남구","lang":"ko","lname":"Gangnam-gu","zip":"135"}
+data/KR/서울특별시/강동구={"id":"data/KR/서울특별시/강동구","key":"강동구","lang":"ko","lname":"Gangdong-gu","zip":"134"}
+data/KR/서울특별시/강북구={"id":"data/KR/서울특별시/강북구","key":"강북구","lang":"ko","lname":"Gangbuk-gu","zip":"142"}
+data/KR/서울특별시/강서구={"id":"data/KR/서울특별시/강서구","key":"강서구","lang":"ko","lname":"Gangseo-gu","zip":"157"}
+data/KR/서울특별시/관악구={"id":"data/KR/서울특별시/관악구","key":"관악구","lang":"ko","lname":"Gwanak-gu","zip":"151"}
+data/KR/서울특별시/광진구={"id":"data/KR/서울특별시/광진구","key":"광진구","lang":"ko","lname":"Gwangjin-gu","zip":"143"}
+data/KR/서울특별시/구로구={"id":"data/KR/서울특별시/구로구","key":"구로구","lang":"ko","lname":"Guro-gu","zip":"152"}
+data/KR/서울특별시/금천구={"id":"data/KR/서울특별시/금천구","key":"금천구","lang":"ko","lname":"Geumcheon-gu","zip":"153"}
+data/KR/서울특별시/노원구={"id":"data/KR/서울특별시/노원구","key":"노원구","lang":"ko","lname":"Nowon-gu","zip":"139"}
+data/KR/서울특별시/도봉구={"id":"data/KR/서울특별시/도봉구","key":"도봉구","lang":"ko","lname":"Dobong-gu","zip":"132"}
+data/KR/서울특별시/동대문구={"id":"data/KR/서울특별시/동대문구","key":"동대문구","lang":"ko","lname":"Dongdaemun-gu","zip":"130"}
+data/KR/서울특별시/동작구={"id":"data/KR/서울특별시/동작구","key":"동작구","lang":"ko","lname":"Dongjak-gu","zip":"156"}
+data/KR/서울특별시/마포구={"id":"data/KR/서울특별시/마포구","key":"마포구","lang":"ko","lname":"Mapo-gu","zip":"121"}
+data/KR/서울특별시/서대문구={"id":"data/KR/서울특별시/서대문구","key":"서대문구","lang":"ko","lname":"Seodaemun-gu","zip":"120"}
+data/KR/서울특별시/서초구={"id":"data/KR/서울특별시/서초구","key":"서초구","lang":"ko","lname":"Seocho-gu","zip":"137"}
+data/KR/서울특별시/성동구={"id":"data/KR/서울특별시/성동구","key":"성동구","lang":"ko","lname":"Seongdong-gu","zip":"133"}
+data/KR/서울특별시/성북구={"id":"data/KR/서울특별시/성북구","key":"성북구","lang":"ko","lname":"Seongbuk-gu","zip":"136"}
+data/KR/서울특별시/송파구={"id":"data/KR/서울특별시/송파구","key":"송파구","lang":"ko","lname":"Songpa-gu","zip":"138"}
+data/KR/서울특별시/양천구={"id":"data/KR/서울특별시/양천구","key":"양천구","lang":"ko","lname":"Yangcheon-gu","zip":"158"}
+data/KR/서울특별시/영등포구={"id":"data/KR/서울특별시/영등포구","key":"영등포구","lang":"ko","lname":"Yeongdeungpo-gu","zip":"150"}
+data/KR/서울특별시/용산구={"id":"data/KR/서울특별시/용산구","key":"용산구","lang":"ko","lname":"Yongsan-gu","zip":"140"}
+data/KR/서울특별시/은평구={"id":"data/KR/서울특별시/은평구","key":"은평구","lang":"ko","lname":"Eunpyeong-gu","zip":"122"}
+data/KR/서울특별시/종로구={"id":"data/KR/서울특별시/종로구","key":"종로구","lang":"ko","lname":"Jongno-gu","zip":"110"}
+data/KR/서울특별시/중구={"id":"data/KR/서울특별시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"100"}
+data/KR/서울특별시/중랑구={"id":"data/KR/서울특별시/중랑구","key":"중랑구","lang":"ko","lname":"Jungnang-gu","zip":"131"}
+data/KR/세종특별자치시={"id":"data/KR/세종특별자치시","key":"세종특별자치시","name":"세종","lang":"ko","lname":"Sejong","zip":"339","zipex":"339-014"}
+data/KR/울산광역시={"id":"data/KR/울산광역시","key":"울산광역시","name":"울산","lang":"ko","lname":"Ulsan","zip":"68[0-39]","zipex":"683-480:689-832","isoid":"31","sub_keys":"남구~동구~북구~울주군~중구","sub_lnames":"Nam-gu~Dong-gu~Buk-gu~Ulju-gun~Jung-gu","sub_zips":"680~682~683~689~681"}
+data/KR/울산광역시/남구={"id":"data/KR/울산광역시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"680"}
+data/KR/울산광역시/동구={"id":"data/KR/울산광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"682"}
+data/KR/울산광역시/북구={"id":"data/KR/울산광역시/북구","key":"북구","lang":"ko","lname":"Buk-gu","zip":"683"}
+data/KR/울산광역시/울주군={"id":"data/KR/울산광역시/울주군","key":"울주군","lang":"ko","lname":"Ulju-gun","zip":"689"}
+data/KR/울산광역시/중구={"id":"data/KR/울산광역시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"681"}
+data/KR/인천광역시={"id":"data/KR/인천광역시","key":"인천광역시","name":"인천","lang":"ko","lname":"Incheon","zip":"4(?:0[0-79]|17)","zipex":"406-131:417-921","isoid":"28","sub_keys":"강화군~계양구~남구~남동구~동구~부평구~서구~연수구~옹진군~중구","sub_lnames":"Ganghwa-gun~Gyeyang-gu~Nam-gu~Namdong-gu~Dong-gu~Bupyeong-gu~Seo-gu~Yeonsu-gu~Ongjin-gun~Jung-gu","sub_zips":"417~407~402~405~401~403~404~406~409~400"}
+data/KR/인천광역시/강화군={"id":"data/KR/인천광역시/강화군","key":"강화군","lang":"ko","lname":"Ganghwa-gun","zip":"417"}
+data/KR/인천광역시/계양구={"id":"data/KR/인천광역시/계양구","key":"계양구","lang":"ko","lname":"Gyeyang-gu","zip":"407"}
+data/KR/인천광역시/남구={"id":"data/KR/인천광역시/남구","key":"남구","lang":"ko","lname":"Nam-gu","zip":"402"}
+data/KR/인천광역시/남동구={"id":"data/KR/인천광역시/남동구","key":"남동구","lang":"ko","lname":"Namdong-gu","zip":"405"}
+data/KR/인천광역시/동구={"id":"data/KR/인천광역시/동구","key":"동구","lang":"ko","lname":"Dong-gu","zip":"401"}
+data/KR/인천광역시/부평구={"id":"data/KR/인천광역시/부평구","key":"부평구","lang":"ko","lname":"Bupyeong-gu","zip":"403"}
+data/KR/인천광역시/서구={"id":"data/KR/인천광역시/서구","key":"서구","lang":"ko","lname":"Seo-gu","zip":"404"}
+data/KR/인천광역시/연수구={"id":"data/KR/인천광역시/연수구","key":"연수구","lang":"ko","lname":"Yeonsu-gu","zip":"406"}
+data/KR/인천광역시/옹진군={"id":"data/KR/인천광역시/옹진군","key":"옹진군","lang":"ko","lname":"Ongjin-gun","zip":"409"}
+data/KR/인천광역시/중구={"id":"data/KR/인천광역시/중구","key":"중구","lang":"ko","lname":"Jung-gu","zip":"400"}
+data/KR/전라남도={"id":"data/KR/전라남도","key":"전라남도","name":"전남","lang":"ko","lname":"Jeonnam","zip":"5[1-5]","zipex":"516-931:556-891","isoid":"46","sub_keys":"강진군~고흥군~곡성군~광양시~구례군~나주시~담양군~목포시~무안군~보성군~순천시~신안군~여수시~영광군~영암군~완도군~장성군~장흥군~진도군~함평군~해남군~화순군","sub_lnames":"Gangjin-gun~Goheung-gun~Gokseong-gun~Gwangyang-si~Gurye-gun~Naju-si~Damyang-gun~Mokpo-si~Muan-gun~Boseong-gun~Suncheon-si~Sinan-gun~Yeosu-si~Yeonggwang-gun~Yeongam-gun~Wando-gun~Jangseong-gun~Jangheung-gun~Jindo-gun~Hampyeong-gun~Haenam-gun~Hwasun-gun","sub_zips":"527~548~516~545~542[\\-]8~520~517~530~534~546~540~53[05]~55[056]~513~526~5(?:27|3[67]|48)~515~529~539~525[\\-]8~536~519"}
+data/KR/전라남도/강진군={"id":"data/KR/전라남도/강진군","key":"강진군","lang":"ko","lname":"Gangjin-gun","zip":"527"}
+data/KR/전라남도/고흥군={"id":"data/KR/전라남도/고흥군","key":"고흥군","lang":"ko","lname":"Goheung-gun","zip":"548"}
+data/KR/전라남도/곡성군={"id":"data/KR/전라남도/곡성군","key":"곡성군","lang":"ko","lname":"Gokseong-gun","zip":"516"}
+data/KR/전라남도/광양시={"id":"data/KR/전라남도/광양시","key":"광양시","lang":"ko","lname":"Gwangyang-si","zip":"545"}
+data/KR/전라남도/구례군={"id":"data/KR/전라남도/구례군","key":"구례군","lang":"ko","lname":"Gurye-gun","zip":"542[\\-]8"}
+data/KR/전라남도/나주시={"id":"data/KR/전라남도/나주시","key":"나주시","lang":"ko","lname":"Naju-si","zip":"520"}
+data/KR/전라남도/담양군={"id":"data/KR/전라남도/담양군","key":"담양군","lang":"ko","lname":"Damyang-gun","zip":"517"}
+data/KR/전라남도/목포시={"id":"data/KR/전라남도/목포시","key":"목포시","lang":"ko","lname":"Mokpo-si","zip":"530"}
+data/KR/전라남도/무안군={"id":"data/KR/전라남도/무안군","key":"무안군","lang":"ko","lname":"Muan-gun","zip":"534"}
+data/KR/전라남도/보성군={"id":"data/KR/전라남도/보성군","key":"보성군","lang":"ko","lname":"Boseong-gun","zip":"546"}
+data/KR/전라남도/순천시={"id":"data/KR/전라남도/순천시","key":"순천시","lang":"ko","lname":"Suncheon-si","zip":"540"}
+data/KR/전라남도/신안군={"id":"data/KR/전라남도/신안군","key":"신안군","lang":"ko","lname":"Sinan-gun","zip":"53[05]"}
+data/KR/전라남도/여수시={"id":"data/KR/전라남도/여수시","key":"여수시","lang":"ko","lname":"Yeosu-si","zip":"55[056]"}
+data/KR/전라남도/영광군={"id":"data/KR/전라남도/영광군","key":"영광군","lang":"ko","lname":"Yeonggwang-gun","zip":"513"}
+data/KR/전라남도/영암군={"id":"data/KR/전라남도/영암군","key":"영암군","lang":"ko","lname":"Yeongam-gun","zip":"526"}
+data/KR/전라남도/완도군={"id":"data/KR/전라남도/완도군","key":"완도군","lang":"ko","lname":"Wando-gun","zip":"5(?:27|3[67]|48)"}
+data/KR/전라남도/장성군={"id":"data/KR/전라남도/장성군","key":"장성군","lang":"ko","lname":"Jangseong-gun","zip":"515"}
+data/KR/전라남도/장흥군={"id":"data/KR/전라남도/장흥군","key":"장흥군","lang":"ko","lname":"Jangheung-gun","zip":"529"}
+data/KR/전라남도/진도군={"id":"data/KR/전라남도/진도군","key":"진도군","lang":"ko","lname":"Jindo-gun","zip":"539"}
+data/KR/전라남도/함평군={"id":"data/KR/전라남도/함평군","key":"함평군","lang":"ko","lname":"Hampyeong-gun","zip":"525[\\-]8"}
+data/KR/전라남도/해남군={"id":"data/KR/전라남도/해남군","key":"해남군","lang":"ko","lname":"Haenam-gun","zip":"536"}
+data/KR/전라남도/화순군={"id":"data/KR/전라남도/화순군","key":"화순군","lang":"ko","lname":"Hwasun-gun","zip":"519"}
+data/KR/전라북도={"id":"data/KR/전라북도","key":"전라북도","name":"전북","lang":"ko","lname":"Jeonbuk","zip":"5[6-9]","zipex":"568-803:595-871","isoid":"45","sub_keys":"고창군~군산시~김제시~남원시~무주군~부안군~순창군~완주군~익산시~임실군~장수군~전주시~정읍시~진안군","sub_lnames":"Gochang-gun~Gunsan-si~Gimje-si~Namwon-si~Muju-gun~Buan-gun~Sunchang-gun~Wanju-gun~Iksan-si~Imsil-gun~Jangsu-gun~Jeonju-si~Jeongeup-si~Jinan-gun","sub_zips":"5(?:79|85)~573~576~590~568~579~595~565~570~566~597[\\-]8~56[01]~580~567","sub_mores":"false~false~false~false~false~false~false~false~false~false~false~true~false~false"}
+data/KR/전라북도/고창군={"id":"data/KR/전라북도/고창군","key":"고창군","lang":"ko","lname":"Gochang-gun","zip":"5(?:79|85)"}
+data/KR/전라북도/군산시={"id":"data/KR/전라북도/군산시","key":"군산시","lang":"ko","lname":"Gunsan-si","zip":"573"}
+data/KR/전라북도/김제시={"id":"data/KR/전라북도/김제시","key":"김제시","lang":"ko","lname":"Gimje-si","zip":"576"}
+data/KR/전라북도/남원시={"id":"data/KR/전라북도/남원시","key":"남원시","lang":"ko","lname":"Namwon-si","zip":"590"}
+data/KR/전라북도/무주군={"id":"data/KR/전라북도/무주군","key":"무주군","lang":"ko","lname":"Muju-gun","zip":"568"}
+data/KR/전라북도/부안군={"id":"data/KR/전라북도/부안군","key":"부안군","lang":"ko","lname":"Buan-gun","zip":"579"}
+data/KR/전라북도/순창군={"id":"data/KR/전라북도/순창군","key":"순창군","lang":"ko","lname":"Sunchang-gun","zip":"595"}
+data/KR/전라북도/완주군={"id":"data/KR/전라북도/완주군","key":"완주군","lang":"ko","lname":"Wanju-gun","zip":"565"}
+data/KR/전라북도/익산시={"id":"data/KR/전라북도/익산시","key":"익산시","lang":"ko","lname":"Iksan-si","zip":"570"}
+data/KR/전라북도/임실군={"id":"data/KR/전라북도/임실군","key":"임실군","lang":"ko","lname":"Imsil-gun","zip":"566"}
+data/KR/전라북도/장수군={"id":"data/KR/전라북도/장수군","key":"장수군","lang":"ko","lname":"Jangsu-gun","zip":"597[\\-]8"}
+data/KR/전라북도/전주시={"id":"data/KR/전라북도/전주시","key":"전주시","lang":"ko","lname":"Jeonju-si","zip":"56[01]","sub_keys":"덕진구~완산구","sub_lnames":"Deokjin-gu~Wansan-gu","sub_zips":"561~560"}
+data/KR/전라북도/전주시/덕진구={"id":"data/KR/전라북도/전주시/덕진구","key":"덕진구","lang":"ko","lname":"Deokjin-gu","zip":"561"}
+data/KR/전라북도/전주시/완산구={"id":"data/KR/전라북도/전주시/완산구","key":"완산구","lang":"ko","lname":"Wansan-gu","zip":"560"}
+data/KR/전라북도/정읍시={"id":"data/KR/전라북도/정읍시","key":"정읍시","lang":"ko","lname":"Jeongeup-si","zip":"580"}
+data/KR/전라북도/진안군={"id":"data/KR/전라북도/진안군","key":"진안군","lang":"ko","lname":"Jinan-gun","zip":"567"}
+data/KR/제주특별자치도={"id":"data/KR/제주특별자치도","key":"제주특별자치도","name":"제주","lang":"ko","lname":"Jeju","zip":"69[0579]","zipex":"690-808:697-370","isoid":"49","sub_keys":"서귀포시~제주시","sub_lnames":"Seogwipo-si~Jeju-si","sub_zips":"69[79]~69[05]"}
+data/KR/제주특별자치도/서귀포시={"id":"data/KR/제주특별자치도/서귀포시","key":"서귀포시","lang":"ko","lname":"Seogwipo-si","zip":"69[79]"}
+data/KR/제주특별자치도/제주시={"id":"data/KR/제주특별자치도/제주시","key":"제주시","lang":"ko","lname":"Jeju-si","zip":"69[05]"}
+data/KR/충청남도={"id":"data/KR/충청남도","key":"충청남도","name":"충남","lang":"ko","lname":"Chungnam","zip":"3(?:[1245]|3[0-8])","zipex":"314-831:355-770","isoid":"44","sub_keys":"계룡시~공주시~금산군~논산시~당진시~보령시~부여군~서산시~서천군~아산시~예산군~천안시~청양군~태안군~홍성군","sub_lnames":"Gyeryong-si~Gongju-si~Geumsan-gun~Nonsan-si~Dangjin-si~Boryeong-si~Buyeo-gun~Seosan-si~Seocheon-gun~Asan-si~Yesan-gun~Cheonan-si~Cheongyang-gun~Taean-gun~Hongseong-gun","sub_zips":"321~314~312~320~343~355~323~356~325~336~340~33[01]~345~357~350","sub_mores":"false~false~false~false~false~false~false~false~false~false~false~true~false~false~false"}
+data/KR/충청남도/계룡시={"id":"data/KR/충청남도/계룡시","key":"계룡시","lang":"ko","lname":"Gyeryong-si","zip":"321"}
+data/KR/충청남도/공주시={"id":"data/KR/충청남도/공주시","key":"공주시","lang":"ko","lname":"Gongju-si","zip":"314"}
+data/KR/충청남도/금산군={"id":"data/KR/충청남도/금산군","key":"금산군","lang":"ko","lname":"Geumsan-gun","zip":"312"}
+data/KR/충청남도/논산시={"id":"data/KR/충청남도/논산시","key":"논산시","lang":"ko","lname":"Nonsan-si","zip":"320"}
+data/KR/충청남도/당진시={"id":"data/KR/충청남도/당진시","key":"당진시","lang":"ko","lname":"Dangjin-si","zip":"343"}
+data/KR/충청남도/보령시={"id":"data/KR/충청남도/보령시","key":"보령시","lang":"ko","lname":"Boryeong-si","zip":"355"}
+data/KR/충청남도/부여군={"id":"data/KR/충청남도/부여군","key":"부여군","lang":"ko","lname":"Buyeo-gun","zip":"323"}
+data/KR/충청남도/서산시={"id":"data/KR/충청남도/서산시","key":"서산시","lang":"ko","lname":"Seosan-si","zip":"356"}
+data/KR/충청남도/서천군={"id":"data/KR/충청남도/서천군","key":"서천군","lang":"ko","lname":"Seocheon-gun","zip":"325"}
+data/KR/충청남도/아산시={"id":"data/KR/충청남도/아산시","key":"아산시","lang":"ko","lname":"Asan-si","zip":"336"}
+data/KR/충청남도/예산군={"id":"data/KR/충청남도/예산군","key":"예산군","lang":"ko","lname":"Yesan-gun","zip":"340"}
+data/KR/충청남도/천안시={"id":"data/KR/충청남도/천안시","key":"천안시","lang":"ko","lname":"Cheonan-si","zip":"33[01]","sub_keys":"동남구~서북구","sub_lnames":"Dongnam-gu~Seobuk-gu","sub_zips":"330~331"}
+data/KR/충청남도/천안시/동남구={"id":"data/KR/충청남도/천안시/동남구","key":"동남구","lang":"ko","lname":"Dongnam-gu","zip":"330"}
+data/KR/충청남도/천안시/서북구={"id":"data/KR/충청남도/천안시/서북구","key":"서북구","lang":"ko","lname":"Seobuk-gu","zip":"331"}
+data/KR/충청남도/청양군={"id":"data/KR/충청남도/청양군","key":"청양군","lang":"ko","lname":"Cheongyang-gun","zip":"345"}
+data/KR/충청남도/태안군={"id":"data/KR/충청남도/태안군","key":"태안군","lang":"ko","lname":"Taean-gun","zip":"357"}
+data/KR/충청남도/홍성군={"id":"data/KR/충청남도/홍성군","key":"홍성군","lang":"ko","lname":"Hongseong-gun","zip":"350"}
+data/KR/충청북도={"id":"data/KR/충청북도","key":"충청북도","name":"충북","lang":"ko","lname":"Chungbuk","zip":"3[6-9]","zipex":"367-861:395-813","isoid":"43","sub_keys":"괴산군~단양군~보은군~영동군~옥천군~음성군~제천시~증평군~진천군~청원군~청주시~충주시","sub_lnames":"Goesan-gun~Danyang-gun~Boeun-gun~Yeongdong-gun~Okcheon-gun~Eumseong-gun~Jecheon-si~Jeungpyeong-gun~Jincheon-gun~Cheongwon-gun~Cheongju-si~Chungju-si","sub_zips":"367~395~376~370~373[\\-]8~369~390~368~365~363~36[01]~380","sub_mores":"false~false~false~false~false~false~false~false~false~false~true~false"}
+data/KR/충청북도/괴산군={"id":"data/KR/충청북도/괴산군","key":"괴산군","lang":"ko","lname":"Goesan-gun","zip":"367"}
+data/KR/충청북도/단양군={"id":"data/KR/충청북도/단양군","key":"단양군","lang":"ko","lname":"Danyang-gun","zip":"395"}
+data/KR/충청북도/보은군={"id":"data/KR/충청북도/보은군","key":"보은군","lang":"ko","lname":"Boeun-gun","zip":"376"}
+data/KR/충청북도/영동군={"id":"data/KR/충청북도/영동군","key":"영동군","lang":"ko","lname":"Yeongdong-gun","zip":"370"}
+data/KR/충청북도/옥천군={"id":"data/KR/충청북도/옥천군","key":"옥천군","lang":"ko","lname":"Okcheon-gun","zip":"373[\\-]8"}
+data/KR/충청북도/음성군={"id":"data/KR/충청북도/음성군","key":"음성군","lang":"ko","lname":"Eumseong-gun","zip":"369"}
+data/KR/충청북도/제천시={"id":"data/KR/충청북도/제천시","key":"제천시","lang":"ko","lname":"Jecheon-si","zip":"390"}
+data/KR/충청북도/증평군={"id":"data/KR/충청북도/증평군","key":"증평군","lang":"ko","lname":"Jeungpyeong-gun","zip":"368"}
+data/KR/충청북도/진천군={"id":"data/KR/충청북도/진천군","key":"진천군","lang":"ko","lname":"Jincheon-gun","zip":"365"}
+data/KR/충청북도/청원군={"id":"data/KR/충청북도/청원군","key":"청원군","lang":"ko","lname":"Cheongwon-gun","zip":"363"}
+data/KR/충청북도/청주시={"id":"data/KR/충청북도/청주시","key":"청주시","lang":"ko","lname":"Cheongju-si","zip":"36[01]","sub_keys":"상당구~흥덕구","sub_lnames":"Sangdang-gu~Heungdeok-gu","sub_zips":"360~361"}
+data/KR/충청북도/청주시/상당구={"id":"data/KR/충청북도/청주시/상당구","key":"상당구","lang":"ko","lname":"Sangdang-gu","zip":"360"}
+data/KR/충청북도/청주시/흥덕구={"id":"data/KR/충청북도/청주시/흥덕구","key":"흥덕구","lang":"ko","lname":"Heungdeok-gu","zip":"361"}
+data/KR/충청북도/충주시={"id":"data/KR/충청북도/충주시","key":"충주시","lang":"ko","lname":"Chungju-si","zip":"380"}
+data/KW={"id":"data/KW","key":"KW","name":"KUWAIT","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"54541,54551,54404,13009"}
+data/KY={"id":"data/KY","key":"KY","name":"CAYMAN ISLANDS","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%S","require":"AS","zip":"KY\\d-\\d{4}","zipex":"KY1-1100,KY1-1702,KY2-2101","posturl":"http://www.caymanpost.gov.ky/portal/page?_pageid=3561,1&_dad=portal&_schema=PORTAL","state_name_type":"island","sub_keys":"CAYMAN BRAC~GRAND CAYMAN~LITTLE CAYMAN"}
+data/KY/CAYMAN BRAC={"id":"data/KY/CAYMAN BRAC","key":"CAYMAN BRAC","lang":"en"}
+data/KY/GRAND CAYMAN={"id":"data/KY/GRAND CAYMAN","key":"GRAND CAYMAN","lang":"en"}
+data/KY/LITTLE CAYMAN={"id":"data/KY/LITTLE CAYMAN","key":"LITTLE CAYMAN","lang":"en"}
+data/KZ={"id":"data/KZ","key":"KZ","name":"KAZAKHSTAN","fmt":"%Z%n%S%n%C%n%A%n%O%n%N","zip":"\\d{6}","zipex":"040900,050012"}
+data/LA={"id":"data/LA","key":"LA","name":"LAO (PEOPLE'S DEM. REP.)","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"01160,01000"}
+data/LB={"id":"data/LB","key":"LB","name":"LEBANON","fmt":"%N%n%O%n%A%n%C %Z","zip":"(\\d{4}([ ]?\\d{4})?)?","zipex":"2038 3054,1107 2810,1000"}
+data/LC={"id":"data/LC","key":"LC","name":"SAINT LUCIA"}
+data/LI={"id":"data/LI","key":"LI","name":"LIECHTENSTEIN","fmt":"%O%n%N%n%A%nFL-%Z %C","require":"ACZ","zip":"(948[5-9])|(949[0-7])","zipex":"9496,9491,9490,9485","posturl":"http://www.post.ch/db/owa/pv_plz_pack/pr_main","postprefix":"FL-"}
+data/LK={"id":"data/LK","key":"LK","name":"SRI LANKA","fmt":"%N%n%O%n%A%n%C%n%Z","zip":"\\d{5}","zipex":"20000,00100","posturl":"http://www.slpost.gov.lk/"}
+data/LR={"id":"data/LR","key":"LR","name":"LIBERIA","fmt":"%N%n%O%n%A%n%Z %C %X","zip":"\\d{4}","zipex":"1000"}
+data/LS={"id":"data/LS","key":"LS","name":"LESOTHO","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{3}","zipex":"100"}
+data/LT={"id":"data/LT","key":"LT","name":"LITHUANIA","fmt":"%O%n%N%n%A%nLT-%Z %C","zip":"\\d{5}","zipex":"04340,03500","posturl":"http://www.post.lt/lt/?id=316","postprefix":"LT-"}
+data/LU={"id":"data/LU","key":"LU","name":"LUXEMBOURG","fmt":"%O%n%N%n%A%nL-%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"4750,2998","posturl":"http://www.pt.lu/portal/services_en_ligne/recherche_codes_postaux","postprefix":"L-"}
+data/LV={"id":"data/LV","key":"LV","name":"LATVIA","fmt":"%N%n%O%n%A%n%C, %Z","zip":"LV-\\d{4}","zipex":"LV-1073,LV-1000","posturl":"http://www.pasts.lv/lv/uzzinas/nodalas/"}
+data/LY={"id":"data/LY","key":"LY","name":"LIBYA"}
+data/MA={"id":"data/MA","key":"MA","name":"MOROCCO","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"53000,10000,20050,16052"}
+data/MC={"id":"data/MC","key":"MC","name":"MONACO","fmt":"%N%n%O%n%A%nMC-%Z %C %X","zip":"980\\d{2}","zipex":"98000,98020,98011,98001","postprefix":"MC-"}
+data/MD={"id":"data/MD","key":"MD","name":"Rep. MOLDOVA","fmt":"%N%n%O%n%A%nMD-%Z %C","zip":"\\d{4}","zipex":"2012,2019","postprefix":"MD-"}
+data/ME={"id":"data/ME","key":"ME","name":"MONTENEGRO","fmt":"%N%n%O%n%A%n%Z %C","zip":"8\\d{4}","zipex":"81257,81258,81258,81217,84314,85366"}
+data/MF={"id":"data/MF","key":"MF","name":"SAINT MARTIN","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78][01]\\d{2}","zipex":"97100","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/MG={"id":"data/MG","key":"MG","name":"MADAGASCAR","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{3}","zipex":"501,101"}
+data/MH={"id":"data/MH","key":"MH","name":"MARSHALL ISLANDS","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"969[67]\\d([ \\-]\\d{4})?","zipex":"96960,96970","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/MK={"id":"data/MK","key":"MK","name":"MACEDONIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1314,1321,1443,1062"}
+data/ML={"id":"data/ML","key":"ML","name":"MALI"}
+data/MN={"id":"data/MN","key":"MN","name":"MONGOLIA","fmt":"%N%n%O%n%A%n%S %C-%X%n%Z","zip":"\\d{5}","zipex":"65030,65270","posturl":"http://www.zipcode.mn/"}
+data/MO={"id":"data/MO","key":"MO","name":"MACAO","fmt":"%A%n%O%n%N","lfmt":"%N%n%O%n%A","require":"A"}
+data/MP={"id":"data/MP","key":"MP","name":"NORTHERN MARIANA ISLANDS","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"9695[012]([ \\-]\\d{4})?","zipex":"96950,96951,96952","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/MQ={"id":"data/MQ","key":"MQ","name":"MARTINIQUE","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78]2\\d{2}","zipex":"97220","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/MR={"id":"data/MR","key":"MR","name":"MAURITANIA","upper":"AC"}
+data/MS={"id":"data/MS","key":"MS","name":"MONTSERRAT"}
+data/MT={"id":"data/MT","key":"MT","name":"MALTA","fmt":"%N%n%O%n%A%n%C %Z","upper":"CZ","zip":"[A-Z]{3}[ ]?\\d{2,4}","zipex":"NXR 01,ZTN 05,GPO 01,BZN 1130,SPB 6031,VCT 1753","posturl":"http://postcodes.maltapost.com/"}
+data/MU={"id":"data/MU","key":"MU","name":"MAURITIUS","fmt":"%N%n%O%n%A%n%Z%n%C","upper":"CZ","zip":"(\\d{3}[A-Z]{2}\\d{3})?","zipex":"742CU001"}
+data/MV={"id":"data/MV","key":"MV","name":"MALDIVES","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}","zipex":"20026","posturl":"http://www.maldivespost.com/?lid=10"}
+data/MW={"id":"data/MW","key":"MW","name":"MALAWI","fmt":"%N%n%O%n%A%n%C %X"}
+data/MX={"id":"data/MX","key":"MX","name":"MEXICO","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%D%n%Z %C, %S","require":"ACZ","upper":"CSZ","zip":"\\d{5}","zipex":"02860,77520,06082","posturl":"http://www.correosdemexico.gob.mx/ServiciosLinea/Paginas/ccpostales.aspx","state_name_type":"state","sub_keys":"AGS~BC~BCS~CAMP~CHIS~CHIH~COAH~COL~D.F.~DGO~MEX~GTO~GRO~HGO~JAL~MICH~MOR~NAY~NL~OAX~PUE~QRO~QROO~SLP~SIN~SON~TAB~TAMPS~TLAX~VER~YUC~ZAC","sub_names":"Aguascalientes~Baja California~Baja California Sur~Campeche~Chiapas~Chihuahua~Coahuila~Colima~Distrito Federal~Durango~Estado de México~Guanajuato~Guerrero~Hidalgo~Jalisco~Michoacán~Morelos~Nayarit~Nuevo León~Oaxaca~Puebla~Querétaro~Quintana Roo~San Luís Potosí~Sinalóa~Sonora~Tabasco~Tamaulipas~Tlaxcala~Veracruz~Yucatán~Zacatecas","sub_zips":"20~2[12]~23~24~29|30~3[1-3]~2[5-7]~28~0|1[0-6]~3[45]~5[0-7]~3[6-8]~39|4[01]~4[23]~4[4-9]~5[89]|6[01]~62~63~6[4-7]~6[89]|7[01]~7[2-5]~76~77~7[89]~8[0-2]~8[3-5]~86~8[7-9]~90~9[1-6]~97~9[89]","sub_zipexs":"20000,20999~21000,22999~23000,23999~24000,24999~29000,30999~31000,33999~25000,27999~28000,28999~00000,16999~34000,35999~50000,57999~36000,38999~39000,41999~42000,43999~44000,49999~58000,61999~62000,62999~63000,63999~64000,67999~68000,71999~72000,75999~76000,76999~77000,77999~78000,79999~80000,82999~83000,85999~86000,86999~87000,89999~90000,90999~91000,96999~97000,97999~98000,99999","sub_isoids":"AGU~BCN~BCS~CAM~CHP~CHH~COA~COL~DIF~DUR~MEX~GUA~GRO~HID~JAL~MIC~MOR~NAY~NLE~OAX~PUE~QUE~ROO~SLP~SIN~SON~TAB~TAM~TLA~VER~YUC~ZAC"}
+data/MX/AGS={"id":"data/MX/AGS","key":"AGS","name":"Aguascalientes","lang":"es","zip":"20","zipex":"20000,20999","isoid":"AGU"}
+data/MX/BC={"id":"data/MX/BC","key":"BC","name":"Baja California","lang":"es","zip":"2[12]","zipex":"21000,22999","isoid":"BCN"}
+data/MX/BCS={"id":"data/MX/BCS","key":"BCS","name":"Baja California Sur","lang":"es","zip":"23","zipex":"23000,23999","isoid":"BCS"}
+data/MX/CAMP={"id":"data/MX/CAMP","key":"CAMP","name":"Campeche","lang":"es","zip":"24","zipex":"24000,24999","isoid":"CAM"}
+data/MX/CHIH={"id":"data/MX/CHIH","key":"CHIH","name":"Chihuahua","lang":"es","zip":"3[1-3]","zipex":"31000,33999","isoid":"CHH"}
+data/MX/CHIS={"id":"data/MX/CHIS","key":"CHIS","name":"Chiapas","lang":"es","zip":"29|30","zipex":"29000,30999","isoid":"CHP"}
+data/MX/COAH={"id":"data/MX/COAH","key":"COAH","name":"Coahuila","lang":"es","zip":"2[5-7]","zipex":"25000,27999","isoid":"COA"}
+data/MX/COL={"id":"data/MX/COL","key":"COL","name":"Colima","lang":"es","zip":"28","zipex":"28000,28999","isoid":"COL"}
+data/MX/D.F.={"id":"data/MX/D.F.","key":"D.F.","name":"Distrito Federal","lang":"es","zip":"0|1[0-6]","zipex":"00000,16999","isoid":"DIF"}
+data/MX/DGO={"id":"data/MX/DGO","key":"DGO","name":"Durango","lang":"es","zip":"3[45]","zipex":"34000,35999","isoid":"DUR"}
+data/MX/GRO={"id":"data/MX/GRO","key":"GRO","name":"Guerrero","lang":"es","zip":"39|4[01]","zipex":"39000,41999","isoid":"GRO"}
+data/MX/GTO={"id":"data/MX/GTO","key":"GTO","name":"Guanajuato","lang":"es","zip":"3[6-8]","zipex":"36000,38999","isoid":"GUA"}
+data/MX/HGO={"id":"data/MX/HGO","key":"HGO","name":"Hidalgo","lang":"es","zip":"4[23]","zipex":"42000,43999","isoid":"HID"}
+data/MX/JAL={"id":"data/MX/JAL","key":"JAL","name":"Jalisco","lang":"es","zip":"4[4-9]","zipex":"44000,49999","isoid":"JAL"}
+data/MX/MEX={"id":"data/MX/MEX","key":"MEX","name":"Estado de México","lang":"es","zip":"5[0-7]","zipex":"50000,57999","isoid":"MEX"}
+data/MX/MICH={"id":"data/MX/MICH","key":"MICH","name":"Michoacán","lang":"es","zip":"5[89]|6[01]","zipex":"58000,61999","isoid":"MIC"}
+data/MX/MOR={"id":"data/MX/MOR","key":"MOR","name":"Morelos","lang":"es","zip":"62","zipex":"62000,62999","isoid":"MOR"}
+data/MX/NAY={"id":"data/MX/NAY","key":"NAY","name":"Nayarit","lang":"es","zip":"63","zipex":"63000,63999","isoid":"NAY"}
+data/MX/NL={"id":"data/MX/NL","key":"NL","name":"Nuevo León","lang":"es","zip":"6[4-7]","zipex":"64000,67999","isoid":"NLE"}
+data/MX/OAX={"id":"data/MX/OAX","key":"OAX","name":"Oaxaca","lang":"es","zip":"6[89]|7[01]","zipex":"68000,71999","isoid":"OAX"}
+data/MX/PUE={"id":"data/MX/PUE","key":"PUE","name":"Puebla","lang":"es","zip":"7[2-5]","zipex":"72000,75999","isoid":"PUE"}
+data/MX/QRO={"id":"data/MX/QRO","key":"QRO","name":"Querétaro","lang":"es","zip":"76","zipex":"76000,76999","isoid":"QUE"}
+data/MX/QROO={"id":"data/MX/QROO","key":"QROO","name":"Quintana Roo","lang":"es","zip":"77","zipex":"77000,77999","isoid":"ROO"}
+data/MX/SIN={"id":"data/MX/SIN","key":"SIN","name":"Sinalóa","lang":"es","zip":"8[0-2]","zipex":"80000,82999","isoid":"SIN"}
+data/MX/SLP={"id":"data/MX/SLP","key":"SLP","name":"San Luís Potosí","lang":"es","zip":"7[89]","zipex":"78000,79999","isoid":"SLP"}
+data/MX/SON={"id":"data/MX/SON","key":"SON","name":"Sonora","lang":"es","zip":"8[3-5]","zipex":"83000,85999","isoid":"SON"}
+data/MX/TAB={"id":"data/MX/TAB","key":"TAB","name":"Tabasco","lang":"es","zip":"86","zipex":"86000,86999","isoid":"TAB"}
+data/MX/TAMPS={"id":"data/MX/TAMPS","key":"TAMPS","name":"Tamaulipas","lang":"es","zip":"8[7-9]","zipex":"87000,89999","isoid":"TAM"}
+data/MX/TLAX={"id":"data/MX/TLAX","key":"TLAX","name":"Tlaxcala","lang":"es","zip":"90","zipex":"90000,90999","isoid":"TLA"}
+data/MX/VER={"id":"data/MX/VER","key":"VER","name":"Veracruz","lang":"es","zip":"9[1-6]","zipex":"91000,96999","isoid":"VER"}
+data/MX/YUC={"id":"data/MX/YUC","key":"YUC","name":"Yucatán","lang":"es","zip":"97","zipex":"97000,97999","isoid":"YUC"}
+data/MX/ZAC={"id":"data/MX/ZAC","key":"ZAC","name":"Zacatecas","lang":"es","zip":"9[89]","zipex":"98000,99999","isoid":"ZAC"}
+data/MY={"id":"data/MY","key":"MY","name":"MALAYSIA","lang":"ms","languages":"ms","fmt":"%N%n%O%n%A%n%Z %C, %S","require":"ACZ","upper":"CS","zip":"\\d{5}","zipex":"43000,50754,88990,50670","posturl":"http://www.pos.com.my/pos/homepage.aspx","state_name_type":"state","sub_keys":"JOHOR~KEDAH~KELANTAN~KUALA LUMPUR~LABUAN~MELAKA~NEGERI SEMBILAN~PAHANG~PERAK~PERLIS~PULAU PINANG~PUTRAJAYA~SABAH~SARAWAK~SELANGOR~TERENGGANU","sub_zips":"8[0-6]~0[5-9]|34950~1[5-9]~5|60~87~7[5-9]~7[0-4]~2[5-8]|39|49|69~3[0-6]|39000~0[12]~1[0-4]~62~8[89]|9[01]~9[3-8]~4[0-8]|6[3-8]~2[0-4]","sub_zipexs":"80000,86999~05000,09999:34950~15000,18599~50000,60000~87000,87999~75000,78399~70000,73599~25000,28999:39000,39999:49000:69000~30000,36899:39000~01000,02799~10000,14999~62000,62999~88000,91999~93000,98999~40000,48999:63000,68199~20000,24999","sub_isoids":"01~02~03~14~15~04~05~06~08~09~07~16~12~13~10~11"}
+data/MY/JOHOR={"id":"data/MY/JOHOR","key":"JOHOR","lang":"ms","zip":"8[0-6]","zipex":"80000,86999","isoid":"01"}
+data/MY/KEDAH={"id":"data/MY/KEDAH","key":"KEDAH","lang":"ms","zip":"0[5-9]|34950","zipex":"05000,09999:34950","isoid":"02"}
+data/MY/KELANTAN={"id":"data/MY/KELANTAN","key":"KELANTAN","lang":"ms","zip":"1[5-9]","zipex":"15000,18599","isoid":"03"}
+data/MY/KUALA LUMPUR={"id":"data/MY/KUALA LUMPUR","key":"KUALA LUMPUR","lang":"ms","zip":"5|60","zipex":"50000,60000","isoid":"14"}
+data/MY/LABUAN={"id":"data/MY/LABUAN","key":"LABUAN","lang":"ms","zip":"87","zipex":"87000,87999","isoid":"15"}
+data/MY/MELAKA={"id":"data/MY/MELAKA","key":"MELAKA","lang":"ms","zip":"7[5-9]","zipex":"75000,78399","isoid":"04"}
+data/MY/NEGERI SEMBILAN={"id":"data/MY/NEGERI SEMBILAN","key":"NEGERI SEMBILAN","lang":"ms","zip":"7[0-4]","zipex":"70000,73599","isoid":"05"}
+data/MY/PAHANG={"id":"data/MY/PAHANG","key":"PAHANG","lang":"ms","zip":"2[5-8]|39|49|69","zipex":"25000,28999:39000,39999:49000:69000","isoid":"06"}
+data/MY/PERAK={"id":"data/MY/PERAK","key":"PERAK","lang":"ms","zip":"3[0-6]|39000","zipex":"30000,36899:39000","isoid":"08"}
+data/MY/PERLIS={"id":"data/MY/PERLIS","key":"PERLIS","lang":"ms","zip":"0[12]","zipex":"01000,02799","isoid":"09"}
+data/MY/PULAU PINANG={"id":"data/MY/PULAU PINANG","key":"PULAU PINANG","lang":"ms","zip":"1[0-4]","zipex":"10000,14999","isoid":"07"}
+data/MY/PUTRAJAYA={"id":"data/MY/PUTRAJAYA","key":"PUTRAJAYA","lang":"ms","zip":"62","zipex":"62000,62999","isoid":"16"}
+data/MY/SABAH={"id":"data/MY/SABAH","key":"SABAH","lang":"ms","zip":"8[89]|9[01]","zipex":"88000,91999","isoid":"12"}
+data/MY/SARAWAK={"id":"data/MY/SARAWAK","key":"SARAWAK","lang":"ms","zip":"9[3-8]","zipex":"93000,98999","isoid":"13"}
+data/MY/SELANGOR={"id":"data/MY/SELANGOR","key":"SELANGOR","lang":"ms","zip":"4[0-8]|6[3-8]","zipex":"40000,48999:63000,68199","isoid":"10"}
+data/MY/TERENGGANU={"id":"data/MY/TERENGGANU","key":"TERENGGANU","lang":"ms","zip":"2[0-4]","zipex":"20000,24999","isoid":"11"}
+data/MZ={"id":"data/MZ","key":"MZ","name":"MOZAMBIQUE","fmt":"%N%n%O%n%A%n%C","zip":"\\d{4}","zipex":"1102,1119,3212"}
+data/NA={"id":"data/NA","key":"NA","name":"NAMIBIA"}
+data/NC={"id":"data/NC","key":"NC","name":"NEW CALEDONIA","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"988\\d{2}","zipex":"98814,98800,98810","posturl":"http://poste.opt.nc/index.php?option=com_content&view=article&id=80&Itemid=131"}
+data/NE={"id":"data/NE","key":"NE","name":"NIGER","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"8001"}
+data/NF={"id":"data/NF","key":"NF","name":"NORFOLK ISLAND","fmt":"%O%n%N%n%A%n%C %S %Z","upper":"CS","zip":"2899"}
+data/NG={"id":"data/NG","key":"NG","name":"NIGERIA","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C %Z%n%S","upper":"CS","zip":"(\\d{6})?","zipex":"930283,300001,931104","posturl":"http://www.nigeriapostcodes.com/views/","state_name_type":"state","sub_keys":"ABIA~ADAMAWA~AKWA IBOM~ANAMBRA~BAUCHI~BAYELSA~BENUE~BORNO~CROSS RIVER~DELTA~EBONYI~EDO~EKITI~ENUGU~FCT-ABUJA~GOMBE~IMO~JIGAWA~KADUNA~KANO~KATSINA~KEBBI~KOGI~KWARA~LAGOS~NASSARAWA~NIGER~OGUN~ONDO~OSUN~OYO~PLATEAU~RIVERS~SOKOTO~TARABA~YOBE~ZAMFARA","sub_isoids":"AB~AD~AK~AN~BA~BY~BE~BO~CR~DE~EB~ED~EK~EN~FC~GO~IM~JI~KD~KN~KT~KE~KO~KW~LA~NA~NI~OG~ON~OS~OY~PL~RI~SO~TA~YO~ZA"}
+data/NG/ABIA={"id":"data/NG/ABIA","key":"ABIA","lang":"en","isoid":"AB"}
+data/NG/ADAMAWA={"id":"data/NG/ADAMAWA","key":"ADAMAWA","lang":"en","isoid":"AD"}
+data/NG/AKWA IBOM={"id":"data/NG/AKWA IBOM","key":"AKWA IBOM","lang":"en","isoid":"AK"}
+data/NG/ANAMBRA={"id":"data/NG/ANAMBRA","key":"ANAMBRA","lang":"en","isoid":"AN"}
+data/NG/BAUCHI={"id":"data/NG/BAUCHI","key":"BAUCHI","lang":"en","isoid":"BA"}
+data/NG/BAYELSA={"id":"data/NG/BAYELSA","key":"BAYELSA","lang":"en","isoid":"BY"}
+data/NG/BENUE={"id":"data/NG/BENUE","key":"BENUE","lang":"en","isoid":"BE"}
+data/NG/BORNO={"id":"data/NG/BORNO","key":"BORNO","lang":"en","isoid":"BO"}
+data/NG/CROSS RIVER={"id":"data/NG/CROSS RIVER","key":"CROSS RIVER","lang":"en","isoid":"CR"}
+data/NG/DELTA={"id":"data/NG/DELTA","key":"DELTA","lang":"en","isoid":"DE"}
+data/NG/EBONYI={"id":"data/NG/EBONYI","key":"EBONYI","lang":"en","isoid":"EB"}
+data/NG/EDO={"id":"data/NG/EDO","key":"EDO","lang":"en","isoid":"ED"}
+data/NG/EKITI={"id":"data/NG/EKITI","key":"EKITI","lang":"en","isoid":"EK"}
+data/NG/ENUGU={"id":"data/NG/ENUGU","key":"ENUGU","lang":"en","isoid":"EN"}
+data/NG/FCT-ABUJA={"id":"data/NG/FCT-ABUJA","key":"FCT-ABUJA","lang":"en","isoid":"FC"}
+data/NG/GOMBE={"id":"data/NG/GOMBE","key":"GOMBE","lang":"en","isoid":"GO"}
+data/NG/IMO={"id":"data/NG/IMO","key":"IMO","lang":"en","isoid":"IM"}
+data/NG/JIGAWA={"id":"data/NG/JIGAWA","key":"JIGAWA","lang":"en","isoid":"JI"}
+data/NG/KADUNA={"id":"data/NG/KADUNA","key":"KADUNA","lang":"en","isoid":"KD"}
+data/NG/KANO={"id":"data/NG/KANO","key":"KANO","lang":"en","isoid":"KN"}
+data/NG/KATSINA={"id":"data/NG/KATSINA","key":"KATSINA","lang":"en","isoid":"KT"}
+data/NG/KEBBI={"id":"data/NG/KEBBI","key":"KEBBI","lang":"en","isoid":"KE"}
+data/NG/KOGI={"id":"data/NG/KOGI","key":"KOGI","lang":"en","isoid":"KO"}
+data/NG/KWARA={"id":"data/NG/KWARA","key":"KWARA","lang":"en","isoid":"KW"}
+data/NG/LAGOS={"id":"data/NG/LAGOS","key":"LAGOS","lang":"en","isoid":"LA"}
+data/NG/NASSARAWA={"id":"data/NG/NASSARAWA","key":"NASSARAWA","lang":"en","isoid":"NA"}
+data/NG/NIGER={"id":"data/NG/NIGER","key":"NIGER","lang":"en","isoid":"NI"}
+data/NG/OGUN={"id":"data/NG/OGUN","key":"OGUN","lang":"en","isoid":"OG"}
+data/NG/ONDO={"id":"data/NG/ONDO","key":"ONDO","lang":"en","isoid":"ON"}
+data/NG/OSUN={"id":"data/NG/OSUN","key":"OSUN","lang":"en","isoid":"OS"}
+data/NG/OYO={"id":"data/NG/OYO","key":"OYO","lang":"en","isoid":"OY"}
+data/NG/PLATEAU={"id":"data/NG/PLATEAU","key":"PLATEAU","lang":"en","isoid":"PL"}
+data/NG/RIVERS={"id":"data/NG/RIVERS","key":"RIVERS","lang":"en","isoid":"RI"}
+data/NG/SOKOTO={"id":"data/NG/SOKOTO","key":"SOKOTO","lang":"en","isoid":"SO"}
+data/NG/TARABA={"id":"data/NG/TARABA","key":"TARABA","lang":"en","isoid":"TA"}
+data/NG/YOBE={"id":"data/NG/YOBE","key":"YOBE","lang":"en","isoid":"YO"}
+data/NG/ZAMFARA={"id":"data/NG/ZAMFARA","key":"ZAMFARA","lang":"en","isoid":"ZA"}
+data/NI={"id":"data/NI","key":"NI","name":"NICARAGUA","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z%n%C, %S","upper":"CS","zip":"\\d{5}","zipex":"52000","posturl":"http://www.correos.gob.ni/index.php/codigo-postal-2","state_name_type":"department","sub_keys":"BOACO~CARAZO~CHINANDEGA~CHONTALES~ESTELI~GRANADA~JINOTEGA~LEON~MADRIZ~MANAGUA~MASAYA~MATAGALPA~NUEVA SEGOVIA~RAAN~RAAS~RIO SAN JUAN~RIVAS","sub_zips":"5[23]~4[45]~2[23]~51~3[01]~4[01]~6[23]~2[01]~3[23]~1[02-6]|99~4[23]~6[01]~3[45]~7[01]~8[01]~9[01]~4[67]","sub_isoids":"BO~CA~CI~CO~ES~GR~JI~LE~MD~MN~MS~MT~NS~AN~AS~SJ~RI"}
+data/NI/BOACO={"id":"data/NI/BOACO","key":"BOACO","lang":"es","zip":"5[23]","isoid":"BO"}
+data/NI/CARAZO={"id":"data/NI/CARAZO","key":"CARAZO","lang":"es","zip":"4[45]","isoid":"CA"}
+data/NI/CHINANDEGA={"id":"data/NI/CHINANDEGA","key":"CHINANDEGA","lang":"es","zip":"2[23]","isoid":"CI"}
+data/NI/CHONTALES={"id":"data/NI/CHONTALES","key":"CHONTALES","lang":"es","zip":"51","isoid":"CO"}
+data/NI/ESTELI={"id":"data/NI/ESTELI","key":"ESTELI","lang":"es","zip":"3[01]","isoid":"ES"}
+data/NI/GRANADA={"id":"data/NI/GRANADA","key":"GRANADA","lang":"es","zip":"4[01]","isoid":"GR"}
+data/NI/JINOTEGA={"id":"data/NI/JINOTEGA","key":"JINOTEGA","lang":"es","zip":"6[23]","isoid":"JI"}
+data/NI/LEON={"id":"data/NI/LEON","key":"LEON","lang":"es","zip":"2[01]","isoid":"LE"}
+data/NI/MADRIZ={"id":"data/NI/MADRIZ","key":"MADRIZ","lang":"es","zip":"3[23]","isoid":"MD"}
+data/NI/MANAGUA={"id":"data/NI/MANAGUA","key":"MANAGUA","lang":"es","zip":"1[02-6]|99","isoid":"MN"}
+data/NI/MASAYA={"id":"data/NI/MASAYA","key":"MASAYA","lang":"es","zip":"4[23]","isoid":"MS"}
+data/NI/MATAGALPA={"id":"data/NI/MATAGALPA","key":"MATAGALPA","lang":"es","zip":"6[01]","isoid":"MT"}
+data/NI/NUEVA SEGOVIA={"id":"data/NI/NUEVA SEGOVIA","key":"NUEVA SEGOVIA","lang":"es","zip":"3[45]","isoid":"NS"}
+data/NI/RAAN={"id":"data/NI/RAAN","key":"RAAN","lang":"es","zip":"7[01]","isoid":"AN"}
+data/NI/RAAS={"id":"data/NI/RAAS","key":"RAAS","lang":"es","zip":"8[01]","isoid":"AS"}
+data/NI/RIO SAN JUAN={"id":"data/NI/RIO SAN JUAN","key":"RIO SAN JUAN","lang":"es","zip":"9[01]","isoid":"SJ"}
+data/NI/RIVAS={"id":"data/NI/RIVAS","key":"RIVAS","lang":"es","zip":"4[67]","isoid":"RI"}
+data/NL={"id":"data/NL","key":"NL","name":"NETHERLANDS","fmt":"%O%n%N%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}[ ]?[A-Z]{2}","zipex":"1234 AB,2490 AA","posturl":"http://www.tntpost.nl/voorthuis/"}
+data/NO={"id":"data/NO","key":"NO","name":"NORWAY","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"0025,0107,6631","posturl":"http://adressesok.posten.no/nb/postal_codes/search"}
+data/NP={"id":"data/NP","key":"NP","name":"NEPAL","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}","zipex":"44601","posturl":"http://www.gpo.gov.np/postalcode.aspx"}
+data/NR={"id":"data/NR","key":"NR","name":"NAURU CENTRAL PACIFIC","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%S","require":"AS","state_name_type":"district","sub_keys":"AIWO DISTRICT~ANABAR DISTRICT~ANETAN DISTRICT~ANIBARE DISTRICT~BAITI DISTRICT~BOE DISTRICT~BUADA DISTRICT~DENIGOMODU DISTRICT~EWA DISTRICT~IJUW DISTRICT~MENENG DISTRICT~NIBOK DISTRICT~UABOE DISTRICT~YAREN DISTRICT","sub_isoids":"01~02~03~04~05~06~07~08~09~10~11~12~13~14"}
+data/NR/AIWO DISTRICT={"id":"data/NR/AIWO DISTRICT","key":"AIWO DISTRICT","lang":"en","isoid":"01"}
+data/NR/ANABAR DISTRICT={"id":"data/NR/ANABAR DISTRICT","key":"ANABAR DISTRICT","lang":"en","isoid":"02"}
+data/NR/ANETAN DISTRICT={"id":"data/NR/ANETAN DISTRICT","key":"ANETAN DISTRICT","lang":"en","isoid":"03"}
+data/NR/ANIBARE DISTRICT={"id":"data/NR/ANIBARE DISTRICT","key":"ANIBARE DISTRICT","lang":"en","isoid":"04"}
+data/NR/BAITI DISTRICT={"id":"data/NR/BAITI DISTRICT","key":"BAITI DISTRICT","lang":"en","isoid":"05"}
+data/NR/BOE DISTRICT={"id":"data/NR/BOE DISTRICT","key":"BOE DISTRICT","lang":"en","isoid":"06"}
+data/NR/BUADA DISTRICT={"id":"data/NR/BUADA DISTRICT","key":"BUADA DISTRICT","lang":"en","isoid":"07"}
+data/NR/DENIGOMODU DISTRICT={"id":"data/NR/DENIGOMODU DISTRICT","key":"DENIGOMODU DISTRICT","lang":"en","isoid":"08"}
+data/NR/EWA DISTRICT={"id":"data/NR/EWA DISTRICT","key":"EWA DISTRICT","lang":"en","isoid":"09"}
+data/NR/IJUW DISTRICT={"id":"data/NR/IJUW DISTRICT","key":"IJUW DISTRICT","lang":"en","isoid":"10"}
+data/NR/MENENG DISTRICT={"id":"data/NR/MENENG DISTRICT","key":"MENENG DISTRICT","lang":"en","isoid":"11"}
+data/NR/NIBOK DISTRICT={"id":"data/NR/NIBOK DISTRICT","key":"NIBOK DISTRICT","lang":"en","isoid":"12"}
+data/NR/UABOE DISTRICT={"id":"data/NR/UABOE DISTRICT","key":"UABOE DISTRICT","lang":"en","isoid":"13"}
+data/NR/YAREN DISTRICT={"id":"data/NR/YAREN DISTRICT","key":"YAREN DISTRICT","lang":"en","isoid":"14"}
+data/NU={"id":"data/NU","key":"NU","name":"NIUE"}
+data/NZ={"id":"data/NZ","key":"NZ","name":"NEW ZEALAND","fmt":"%N%n%O%n%A%n%C %Z","require":"ACZ","zip":"\\d{4}","zipex":"6001,6015,6332,8252,1030","posturl":"http://www.nzpost.co.nz/Cultures/en-NZ/OnlineTools/PostCodeFinder/"}
+data/OM={"id":"data/OM","key":"OM","name":"OMAN","fmt":"%N%n%O%n%A%n%Z%n%C","zip":"(PC )?\\d{3}","zipex":"133,112,111"}
+data/PA={"id":"data/PA","key":"PA","name":"PANAMA (REP.)","fmt":"%N%n%O%n%A%n%C%n%S","upper":"CS"}
+data/PE={"id":"data/PE","key":"PE","name":"PERU","zip":"(?:LIMA \\d|CALLAO 0?)\\d|[0-2]\\d{4}","zipex":"LIMA 23,LIMA 42,CALLAO 2,02001","posturl":"http://www.serpost.com.pe/cpostal/codigo"}
+data/PF={"id":"data/PF","key":"PF","name":"FRENCH POLYNESIA","fmt":"%N%n%O%n%A%n%Z %C %S","require":"ACSZ","upper":"CS","zip":"987\\d{2}","state_name_type":"island"}
+data/PG={"id":"data/PG","key":"PG","name":"PAPUA NEW GUINEA","fmt":"%N%n%O%n%A%n%C %Z %S","require":"ACS","zip":"\\d{3}","zipex":"111"}
+data/PH={"id":"data/PH","key":"PH","name":"PHILIPPINES","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%Z %C%n%S","zip":"\\d{4}","zipex":"1008,1050,1135,1207,2000,1000","posturl":"http://www.philpost.gov.ph/","sub_keys":"Abra~Agusan del Norte~Agusan del Sur~Aklan~Albay~Antique~Apayao~Aurora~Basilan~Bataan~Batanes~Batangas~Benguet~Biliran~Bohol~Bukidnon~Bulacan~Cagayan~Camarines Norte~Camarines Sur~Camiguin~Capiz~Catanduanes~Cavite~Cebu~Compostela Valley~Cotabato~Davao del Norte~Davao del Sur~Davao Oriental~Dinagat Islands~Eastern Samar~Guimaras~Ifugao~Ilocos Norte~Ilocos Sur~Iloilo~Isabela~Kalinga~La Union~Laguna~Lanao del Norte~Lanao del Sur~Leyte~Maguindanao~Marinduque~Masbate~Metro Manila~Mindoro Occidental~Mindoro Oriental~Misamis Occidental~Misamis Oriental~Mountain Province~Negros Occidental~Negros Oriental~Northern Samar~Nueva Ecija~Nueva Vizcaya~Palawan~Pampanga~Pangasinan~Quezon Province~Quirino~Rizal~Romblon~Samar~Sarangani~Siquijor~Sorsogon~South Cotabato~Southern Leyte~Sultan Kudarat~Sulu~Surigao del Norte~Surigao del Sur~Tarlac~Tawi-Tawi~Zambales~Zamboanga del Norte~Zamboanga del Sur~Zamboanga Sibuguey","sub_zips":"28[0-2]~86[01]~85[01]~56[01]~45[01]~57[01]~380[0-68]~320~730~21[01]~390~42[0-3]~26(0|1[0-5])~65(4[3-9]|5)~63[0-3]~87[0-2]~30[0-2]~35[0-2]~46[01]~44[0-3]~910~58[01]~48[01]~41[0-2]~60[0-5]~88[01]~94[01]~81[0-2]~80[01]~82[01]~~68[0-2]~504[4-6]~36[01]~29[0-2]~27[0-3]~50([0-3]|4[0-3])~33[0-3]~38(0[79]|1[0-4])~25[0-2]~40[0-3]~92[0-2]~9(3[0-2]|7[01])~65([0-3]|4[0-2])~96[01]~490~54[0-2]~~51[01]~52[01]~72[01]~90[0-2]~26(1[6-9]|2[0-5])~61[0-3]~62[0-2]~64[0-2]~31[0-3]~37[01]~53[0-2]~20[0-2]~24[0-4]~43[0-4]~340~1[89]~55[01]~67[0-2]~8015~62(2[5-9]|30)~47[01]~95[01]~~98[01]~74[01]~84[02]~83[01]~23[01]~750~22[01]~71[0-2]~70[0-4]~70[0-4]","sub_zipexs":"2800,2826~8600,8611~8500,8513~5600,5616~4500,4517~5700,5717~3800,3806:3808~3200,3207~7300,7306~2100,2114~3900,3905~4200,4234~2600,2615~6543,6550~6300,6347~8700,8723~3000,3024~3500,3528~4600,4612~4400,4436~9100,9104~5800,5816~4800,4810~4100,4126~6000,6053~8800,8810~9400,9417~8100,8120~8000,8015~8200,8210~~6800,6822~5044,5046~3600,3610~2900,2922~2700,2733~5000,5043~3300,3336~3807:3809,3814~2500,2520~4000,4033~9200,9223~9300,9321:9700,9716~6500,6542~9600,9619~4900,4905~5400,5421~~5100,5111~5200,5214~7200,7215~9000,9025~2616,2625~6100,6132~6200,6224~6400,6423~3100,3133~3700,3714~5300,5322~2000,2022~2400,2447~4300,4342~3400,3405~1850,1990~5500,5516~6700,6725~8015~6225,6230~4700,4715~9500,9513~~9800,9811~7400,7416~8400,8427~8300,8319~2300,2318~7500,7509~2200,2213~7100,7124~7000,7043~7000,7043","sub_isoids":"ABR~AGN~AGS~AKL~ALB~ANT~APA~AUR~BAS~BAN~BTN~BTG~BEN~BIL~BOH~BUK~BUL~CAG~CAN~CAS~CAM~CAP~CAT~CAV~CEB~COM~NCO~DAV~DAS~DAO~DIN~EAS~GUI~IFU~ILN~ILS~ILI~ISA~KAL~LUN~LAG~LAN~LAS~LEY~MAG~MAD~MAS~00~MDC~MDR~MSC~MSR~MOU~NEC~NER~NSA~NUE~NUV~PLW~PAM~PAN~QUE~QUI~RIZ~ROM~WSA~SAR~SIG~SOR~SCO~SLE~SUK~SLU~SUN~SUR~TAR~TAW~ZMB~ZAN~ZAS~ZSI"}
+data/PH/Abra={"id":"data/PH/Abra","key":"Abra","lang":"en","zip":"28[0-2]","zipex":"2800,2826","isoid":"ABR"}
+data/PH/Agusan del Norte={"id":"data/PH/Agusan del Norte","key":"Agusan del Norte","lang":"en","zip":"86[01]","zipex":"8600,8611","isoid":"AGN"}
+data/PH/Agusan del Sur={"id":"data/PH/Agusan del Sur","key":"Agusan del Sur","lang":"en","zip":"85[01]","zipex":"8500,8513","isoid":"AGS"}
+data/PH/Aklan={"id":"data/PH/Aklan","key":"Aklan","lang":"en","zip":"56[01]","zipex":"5600,5616","isoid":"AKL"}
+data/PH/Albay={"id":"data/PH/Albay","key":"Albay","lang":"en","zip":"45[01]","zipex":"4500,4517","isoid":"ALB"}
+data/PH/Antique={"id":"data/PH/Antique","key":"Antique","lang":"en","zip":"57[01]","zipex":"5700,5717","isoid":"ANT"}
+data/PH/Apayao={"id":"data/PH/Apayao","key":"Apayao","lang":"en","zip":"380[0-68]","zipex":"3800,3806:3808","isoid":"APA"}
+data/PH/Aurora={"id":"data/PH/Aurora","key":"Aurora","lang":"en","zip":"320","zipex":"3200,3207","isoid":"AUR"}
+data/PH/Basilan={"id":"data/PH/Basilan","key":"Basilan","lang":"en","zip":"730","zipex":"7300,7306","isoid":"BAS"}
+data/PH/Bataan={"id":"data/PH/Bataan","key":"Bataan","lang":"en","zip":"21[01]","zipex":"2100,2114","isoid":"BAN"}
+data/PH/Batanes={"id":"data/PH/Batanes","key":"Batanes","lang":"en","zip":"390","zipex":"3900,3905","isoid":"BTN"}
+data/PH/Batangas={"id":"data/PH/Batangas","key":"Batangas","lang":"en","zip":"42[0-3]","zipex":"4200,4234","isoid":"BTG"}
+data/PH/Benguet={"id":"data/PH/Benguet","key":"Benguet","lang":"en","zip":"26(0|1[0-5])","zipex":"2600,2615","isoid":"BEN"}
+data/PH/Biliran={"id":"data/PH/Biliran","key":"Biliran","lang":"en","zip":"65(4[3-9]|5)","zipex":"6543,6550","isoid":"BIL"}
+data/PH/Bohol={"id":"data/PH/Bohol","key":"Bohol","lang":"en","zip":"63[0-3]","zipex":"6300,6347","isoid":"BOH"}
+data/PH/Bukidnon={"id":"data/PH/Bukidnon","key":"Bukidnon","lang":"en","zip":"87[0-2]","zipex":"8700,8723","isoid":"BUK"}
+data/PH/Bulacan={"id":"data/PH/Bulacan","key":"Bulacan","lang":"en","zip":"30[0-2]","zipex":"3000,3024","isoid":"BUL"}
+data/PH/Cagayan={"id":"data/PH/Cagayan","key":"Cagayan","lang":"en","zip":"35[0-2]","zipex":"3500,3528","isoid":"CAG"}
+data/PH/Camarines Norte={"id":"data/PH/Camarines Norte","key":"Camarines Norte","lang":"en","zip":"46[01]","zipex":"4600,4612","isoid":"CAN"}
+data/PH/Camarines Sur={"id":"data/PH/Camarines Sur","key":"Camarines Sur","lang":"en","zip":"44[0-3]","zipex":"4400,4436","isoid":"CAS"}
+data/PH/Camiguin={"id":"data/PH/Camiguin","key":"Camiguin","lang":"en","zip":"910","zipex":"9100,9104","isoid":"CAM"}
+data/PH/Capiz={"id":"data/PH/Capiz","key":"Capiz","lang":"en","zip":"58[01]","zipex":"5800,5816","isoid":"CAP"}
+data/PH/Catanduanes={"id":"data/PH/Catanduanes","key":"Catanduanes","lang":"en","zip":"48[01]","zipex":"4800,4810","isoid":"CAT"}
+data/PH/Cavite={"id":"data/PH/Cavite","key":"Cavite","lang":"en","zip":"41[0-2]","zipex":"4100,4126","isoid":"CAV"}
+data/PH/Cebu={"id":"data/PH/Cebu","key":"Cebu","lang":"en","zip":"60[0-5]","zipex":"6000,6053","isoid":"CEB"}
+data/PH/Compostela Valley={"id":"data/PH/Compostela Valley","key":"Compostela Valley","lang":"en","zip":"88[01]","zipex":"8800,8810","isoid":"COM"}
+data/PH/Cotabato={"id":"data/PH/Cotabato","key":"Cotabato","lang":"en","zip":"94[01]","zipex":"9400,9417","isoid":"NCO"}
+data/PH/Davao Oriental={"id":"data/PH/Davao Oriental","key":"Davao Oriental","lang":"en","zip":"82[01]","zipex":"8200,8210","isoid":"DAO"}
+data/PH/Davao del Norte={"id":"data/PH/Davao del Norte","key":"Davao del Norte","lang":"en","zip":"81[0-2]","zipex":"8100,8120","isoid":"DAV"}
+data/PH/Davao del Sur={"id":"data/PH/Davao del Sur","key":"Davao del Sur","lang":"en","zip":"80[01]","zipex":"8000,8015","isoid":"DAS"}
+data/PH/Dinagat Islands={"id":"data/PH/Dinagat Islands","key":"Dinagat Islands","lang":"en","isoid":"DIN"}
+data/PH/Eastern Samar={"id":"data/PH/Eastern Samar","key":"Eastern Samar","lang":"en","zip":"68[0-2]","zipex":"6800,6822","isoid":"EAS"}
+data/PH/Guimaras={"id":"data/PH/Guimaras","key":"Guimaras","lang":"en","zip":"504[4-6]","zipex":"5044,5046","isoid":"GUI"}
+data/PH/Ifugao={"id":"data/PH/Ifugao","key":"Ifugao","lang":"en","zip":"36[01]","zipex":"3600,3610","isoid":"IFU"}
+data/PH/Ilocos Norte={"id":"data/PH/Ilocos Norte","key":"Ilocos Norte","lang":"en","zip":"29[0-2]","zipex":"2900,2922","isoid":"ILN"}
+data/PH/Ilocos Sur={"id":"data/PH/Ilocos Sur","key":"Ilocos Sur","lang":"en","zip":"27[0-3]","zipex":"2700,2733","isoid":"ILS"}
+data/PH/Iloilo={"id":"data/PH/Iloilo","key":"Iloilo","lang":"en","zip":"50([0-3]|4[0-3])","zipex":"5000,5043","isoid":"ILI"}
+data/PH/Isabela={"id":"data/PH/Isabela","key":"Isabela","lang":"en","zip":"33[0-3]","zipex":"3300,3336","isoid":"ISA"}
+data/PH/Kalinga={"id":"data/PH/Kalinga","key":"Kalinga","lang":"en","zip":"38(0[79]|1[0-4])","zipex":"3807:3809,3814","isoid":"KAL"}
+data/PH/La Union={"id":"data/PH/La Union","key":"La Union","lang":"en","zip":"25[0-2]","zipex":"2500,2520","isoid":"LUN"}
+data/PH/Laguna={"id":"data/PH/Laguna","key":"Laguna","lang":"en","zip":"40[0-3]","zipex":"4000,4033","isoid":"LAG"}
+data/PH/Lanao del Norte={"id":"data/PH/Lanao del Norte","key":"Lanao del Norte","lang":"en","zip":"92[0-2]","zipex":"9200,9223","isoid":"LAN"}
+data/PH/Lanao del Sur={"id":"data/PH/Lanao del Sur","key":"Lanao del Sur","lang":"en","zip":"9(3[0-2]|7[01])","zipex":"9300,9321:9700,9716","isoid":"LAS"}
+data/PH/Leyte={"id":"data/PH/Leyte","key":"Leyte","lang":"en","zip":"65([0-3]|4[0-2])","zipex":"6500,6542","isoid":"LEY"}
+data/PH/Maguindanao={"id":"data/PH/Maguindanao","key":"Maguindanao","lang":"en","zip":"96[01]","zipex":"9600,9619","isoid":"MAG"}
+data/PH/Marinduque={"id":"data/PH/Marinduque","key":"Marinduque","lang":"en","zip":"490","zipex":"4900,4905","isoid":"MAD"}
+data/PH/Masbate={"id":"data/PH/Masbate","key":"Masbate","lang":"en","zip":"54[0-2]","zipex":"5400,5421","isoid":"MAS"}
+data/PH/Metro Manila={"id":"data/PH/Metro Manila","key":"Metro Manila","lang":"en","isoid":"00"}
+data/PH/Mindoro Occidental={"id":"data/PH/Mindoro Occidental","key":"Mindoro Occidental","lang":"en","zip":"51[01]","zipex":"5100,5111","isoid":"MDC"}
+data/PH/Mindoro Oriental={"id":"data/PH/Mindoro Oriental","key":"Mindoro Oriental","lang":"en","zip":"52[01]","zipex":"5200,5214","isoid":"MDR"}
+data/PH/Misamis Occidental={"id":"data/PH/Misamis Occidental","key":"Misamis Occidental","lang":"en","zip":"72[01]","zipex":"7200,7215","isoid":"MSC"}
+data/PH/Misamis Oriental={"id":"data/PH/Misamis Oriental","key":"Misamis Oriental","lang":"en","zip":"90[0-2]","zipex":"9000,9025","isoid":"MSR"}
+data/PH/Mountain Province={"id":"data/PH/Mountain Province","key":"Mountain Province","lang":"en","zip":"26(1[6-9]|2[0-5])","zipex":"2616,2625","isoid":"MOU"}
+data/PH/Negros Occidental={"id":"data/PH/Negros Occidental","key":"Negros Occidental","lang":"en","zip":"61[0-3]","zipex":"6100,6132","isoid":"NEC"}
+data/PH/Negros Oriental={"id":"data/PH/Negros Oriental","key":"Negros Oriental","lang":"en","zip":"62[0-2]","zipex":"6200,6224","isoid":"NER"}
+data/PH/Northern Samar={"id":"data/PH/Northern Samar","key":"Northern Samar","lang":"en","zip":"64[0-2]","zipex":"6400,6423","isoid":"NSA"}
+data/PH/Nueva Ecija={"id":"data/PH/Nueva Ecija","key":"Nueva Ecija","lang":"en","zip":"31[0-3]","zipex":"3100,3133","isoid":"NUE"}
+data/PH/Nueva Vizcaya={"id":"data/PH/Nueva Vizcaya","key":"Nueva Vizcaya","lang":"en","zip":"37[01]","zipex":"3700,3714","isoid":"NUV"}
+data/PH/Palawan={"id":"data/PH/Palawan","key":"Palawan","lang":"en","zip":"53[0-2]","zipex":"5300,5322","isoid":"PLW"}
+data/PH/Pampanga={"id":"data/PH/Pampanga","key":"Pampanga","lang":"en","zip":"20[0-2]","zipex":"2000,2022","isoid":"PAM"}
+data/PH/Pangasinan={"id":"data/PH/Pangasinan","key":"Pangasinan","lang":"en","zip":"24[0-4]","zipex":"2400,2447","isoid":"PAN"}
+data/PH/Quezon Province={"id":"data/PH/Quezon Province","key":"Quezon Province","lang":"en","zip":"43[0-4]","zipex":"4300,4342","isoid":"QUE"}
+data/PH/Quirino={"id":"data/PH/Quirino","key":"Quirino","lang":"en","zip":"340","zipex":"3400,3405","isoid":"QUI"}
+data/PH/Rizal={"id":"data/PH/Rizal","key":"Rizal","lang":"en","zip":"1[89]","zipex":"1850,1990","isoid":"RIZ"}
+data/PH/Romblon={"id":"data/PH/Romblon","key":"Romblon","lang":"en","zip":"55[01]","zipex":"5500,5516","isoid":"ROM"}
+data/PH/Samar={"id":"data/PH/Samar","key":"Samar","lang":"en","zip":"67[0-2]","zipex":"6700,6725","isoid":"WSA"}
+data/PH/Sarangani={"id":"data/PH/Sarangani","key":"Sarangani","lang":"en","zip":"8015","zipex":"8015","isoid":"SAR"}
+data/PH/Siquijor={"id":"data/PH/Siquijor","key":"Siquijor","lang":"en","zip":"62(2[5-9]|30)","zipex":"6225,6230","isoid":"SIG"}
+data/PH/Sorsogon={"id":"data/PH/Sorsogon","key":"Sorsogon","lang":"en","zip":"47[01]","zipex":"4700,4715","isoid":"SOR"}
+data/PH/South Cotabato={"id":"data/PH/South Cotabato","key":"South Cotabato","lang":"en","zip":"95[01]","zipex":"9500,9513","isoid":"SCO"}
+data/PH/Southern Leyte={"id":"data/PH/Southern Leyte","key":"Southern Leyte","lang":"en","isoid":"SLE"}
+data/PH/Sultan Kudarat={"id":"data/PH/Sultan Kudarat","key":"Sultan Kudarat","lang":"en","zip":"98[01]","zipex":"9800,9811","isoid":"SUK"}
+data/PH/Sulu={"id":"data/PH/Sulu","key":"Sulu","lang":"en","zip":"74[01]","zipex":"7400,7416","isoid":"SLU"}
+data/PH/Surigao del Norte={"id":"data/PH/Surigao del Norte","key":"Surigao del Norte","lang":"en","zip":"84[02]","zipex":"8400,8427","isoid":"SUN"}
+data/PH/Surigao del Sur={"id":"data/PH/Surigao del Sur","key":"Surigao del Sur","lang":"en","zip":"83[01]","zipex":"8300,8319","isoid":"SUR"}
+data/PH/Tarlac={"id":"data/PH/Tarlac","key":"Tarlac","lang":"en","zip":"23[01]","zipex":"2300,2318","isoid":"TAR"}
+data/PH/Tawi-Tawi={"id":"data/PH/Tawi-Tawi","key":"Tawi-Tawi","lang":"en","zip":"750","zipex":"7500,7509","isoid":"TAW"}
+data/PH/Zambales={"id":"data/PH/Zambales","key":"Zambales","lang":"en","zip":"22[01]","zipex":"2200,2213","isoid":"ZMB"}
+data/PH/Zamboanga Sibuguey={"id":"data/PH/Zamboanga Sibuguey","key":"Zamboanga Sibuguey","lang":"en","zip":"70[0-4]","zipex":"7000,7043","isoid":"ZSI"}
+data/PH/Zamboanga del Norte={"id":"data/PH/Zamboanga del Norte","key":"Zamboanga del Norte","lang":"en","zip":"71[0-2]","zipex":"7100,7124","isoid":"ZAN"}
+data/PH/Zamboanga del Sur={"id":"data/PH/Zamboanga del Sur","key":"Zamboanga del Sur","lang":"en","zip":"70[0-4]","zipex":"7000,7043","isoid":"ZAS"}
+data/PK={"id":"data/PK","key":"PK","name":"PAKISTAN","fmt":"%N%n%O%n%A%n%C-%Z","zip":"\\d{5}","zipex":"44000","posturl":"http://www.pakpost.gov.pk/postcode/postcode.html"}
+data/PL={"id":"data/PL","key":"PL","name":"POLAND","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{2}-\\d{3}","zipex":"00-950,05-470,48-300,32-015,00-940","posturl":"http://www.poczta-polska.pl/kody.php"}
+data/PM={"id":"data/PM","key":"PM","name":"ST. PIERRE AND MIQUELON","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78]5\\d{2}","zipex":"97500"}
+data/PN={"id":"data/PN","key":"PN","name":"PITCAIRN","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"PCRN 1ZZ","zipex":"PCRN 1ZZ"}
+data/PR={"id":"data/PR","key":"PR","name":"PUERTO RICO","fmt":"%N%n%O%n%A%n%C PR %Z","require":"ACZ","upper":"ACNO","zip":"00[679]\\d{2}([ \\-]\\d{4})?","zipex":"00930","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","postprefix":"PR"}
+data/PS={"id":"data/PS","key":"PS","name":"PALESTINIAN TERRITORY"}
+data/PT={"id":"data/PT","key":"PT","name":"PORTUGAL","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}-\\d{3}","zipex":"2725-079,1250-096,1201-950,2860-571,1208-148","posturl":"http://www.ctt.pt/feapl_2/app/open/tools.jspx?tool=1"}
+data/PW={"id":"data/PW","key":"PW","name":"PALAU","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"969(39|40)","zipex":"96940","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/PY={"id":"data/PY","key":"PY","name":"PARAGUAY","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1536,1538,1209"}
+data/QA={"id":"data/QA","key":"QA","name":"QATAR","upper":"AC"}
+data/RE={"id":"data/RE","key":"RE","name":"REUNION","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"9[78]4\\d{2}","zipex":"97400","posturl":"http://www.laposte.fr/Particulier/Utiliser-nos-outils-pratiques/Outils-et-documents/Trouvez-un-code-postal"}
+data/RO={"id":"data/RO","key":"RO","name":"ROMANIA","fmt":"%N%n%O%n%A%n%Z %C","upper":"AC","zip":"\\d{6}","zipex":"060274,061357,200716","posturl":"http://www.posta-romana.ro/zip_codes"}
+data/RS={"id":"data/RS","key":"RS","name":"REPUBLIC OF SERBIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5,6}","zipex":"106314","posturl":"http://www.posta.rs/struktura/lat/aplikacije/pronadji/nadji-postu.asp"}
+data/RU={"id":"data/RU","key":"RU","name":"RUSSIAN FEDERATION","fmt":"%Z %C %n%A%n%O%n%N","require":"ACZ","upper":"AC","zip":"\\d{6}","zipex":"125075,247112,103375","posturl":"http://info.russianpost.ru/servlet/department"}
+data/RW={"id":"data/RW","key":"RW","name":"RWANDA","upper":"AC"}
+data/SA={"id":"data/SA","key":"SA","name":"SAUDI ARABIA","fmt":"%N%n%O%n%A%n%C %Z","zip":"\\d{5}","zipex":"11564,11187,11142"}
+data/SB={"id":"data/SB","key":"SB","name":"SOLOMON ISLANDS"}
+data/SC={"id":"data/SC","key":"SC","name":"SEYCHELLES","fmt":"%N%n%O%n%A%n%C%n%S","upper":"S","state_name_type":"island"}
+data/SE={"id":"data/SE","key":"SE","name":"SWEDEN","fmt":"%O%n%N%n%A%nSE-%Z %C","require":"ACZ","zip":"\\d{3}[ ]?\\d{2}","zipex":"11455,12345,10500","posturl":"http://www.posten.se/sv/Kundservice/Sidor/Sok-postnummer-resultat.aspx","postprefix":"SE-"}
+data/SG={"id":"data/SG","key":"SG","name":"REP. OF SINGAPORE","fmt":"%N%n%O%n%A%nSINGAPORE %Z","require":"AZ","zip":"\\d{6}","zipex":"546080,308125,408600","posturl":"http://www.singpost.com.sg/quick_services/index.htm"}
+data/SH={"id":"data/SH","key":"SH","name":"SAINT HELENA","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"(ASCN|STHL) 1ZZ","zipex":"STHL 1ZZ"}
+data/SI={"id":"data/SI","key":"SI","name":"SLOVENIA","fmt":"%N%n%O%n%A%nSI- %Z %C","zip":"\\d{4}","zipex":"4000,1001,2500","postprefix":"SI-"}
+data/SJ={"id":"data/SJ","key":"SJ","name":"SVALBARD AND JAN MAYEN ISLANDS","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{4}","zipex":"9170","posturl":"http://epab.posten.no/"}
+data/SK={"id":"data/SK","key":"SK","name":"SLOVAKIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{3}[ ]?\\d{2}","zipex":"010 01,023 14,972 48,921 01,975 99","posturl":"http://psc.posta.sk"}
+data/SL={"id":"data/SL","key":"SL","name":"SIERRA LEONE"}
+data/SM={"id":"data/SM","key":"SM","name":"SAN MARINO","fmt":"%N%n%O%n%A%n%Z %C","require":"AZ","zip":"4789\\d","zipex":"47890,47891,47895,47899","posturl":"http://www.poste.it/online/cercacap/"}
+data/SN={"id":"data/SN","key":"SN","name":"SENEGAL","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{5}","zipex":"12500,46024,16556,10000"}
+data/SO={"id":"data/SO","key":"SO","name":"SOMALIA","lang":"so","languages":"so","fmt":"%N%n%O%n%A%n%C, %S %Z","require":"ACS","upper":"ACS","zip":"\\d{5}","zipex":"09010,11010","sub_keys":"AD~BK~BN~BR~BY~GG~GD~HR~JD~JH~MD~NG~SG~SD~SH~SL~TG~WG","sub_names":"AWDAL~BAKOOL~BANAADIR~BARI~BAY~GALGUDUUD~GEDO~HIIRAAN~JUBBADA DHEXE~JUBBADA HOOSE~MUDUG~NUGAAL~SANAAG~SHABEELLAHA DHEXE~SHABEELLAHA HOOSE~SOOL~TOGDHEER~WOQOOYI GALBEED","sub_isoids":"AW~BK~BN~BR~BY~GA~GE~HI~JD~JH~MU~NU~SA~SD~SH~SO~TO~WO"}
+data/SO/AD={"id":"data/SO/AD","key":"AD","name":"AWDAL","lang":"so","isoid":"AW"}
+data/SO/BK={"id":"data/SO/BK","key":"BK","name":"BAKOOL","lang":"so","isoid":"BK"}
+data/SO/BN={"id":"data/SO/BN","key":"BN","name":"BANAADIR","lang":"so","isoid":"BN"}
+data/SO/BR={"id":"data/SO/BR","key":"BR","name":"BARI","lang":"so","isoid":"BR"}
+data/SO/BY={"id":"data/SO/BY","key":"BY","name":"BAY","lang":"so","isoid":"BY"}
+data/SO/GD={"id":"data/SO/GD","key":"GD","name":"GEDO","lang":"so","isoid":"GE"}
+data/SO/GG={"id":"data/SO/GG","key":"GG","name":"GALGUDUUD","lang":"so","isoid":"GA"}
+data/SO/HR={"id":"data/SO/HR","key":"HR","name":"HIIRAAN","lang":"so","isoid":"HI"}
+data/SO/JD={"id":"data/SO/JD","key":"JD","name":"JUBBADA DHEXE","lang":"so","isoid":"JD"}
+data/SO/JH={"id":"data/SO/JH","key":"JH","name":"JUBBADA HOOSE","lang":"so","isoid":"JH"}
+data/SO/MD={"id":"data/SO/MD","key":"MD","name":"MUDUG","lang":"so","isoid":"MU"}
+data/SO/NG={"id":"data/SO/NG","key":"NG","name":"NUGAAL","lang":"so","isoid":"NU"}
+data/SO/SD={"id":"data/SO/SD","key":"SD","name":"SHABEELLAHA DHEXE","lang":"so","isoid":"SD"}
+data/SO/SG={"id":"data/SO/SG","key":"SG","name":"SANAAG","lang":"so","isoid":"SA"}
+data/SO/SH={"id":"data/SO/SH","key":"SH","name":"SHABEELLAHA HOOSE","lang":"so","isoid":"SH"}
+data/SO/SL={"id":"data/SO/SL","key":"SL","name":"SOOL","lang":"so","isoid":"SO"}
+data/SO/TG={"id":"data/SO/TG","key":"TG","name":"TOGDHEER","lang":"so","isoid":"TO"}
+data/SO/WG={"id":"data/SO/WG","key":"WG","name":"WOQOOYI GALBEED","lang":"so","isoid":"WO"}
+data/SR={"id":"data/SR","key":"SR","name":"SURINAME","lang":"nl","languages":"nl","fmt":"%N%n%O%n%A%n%C %X%n%S","upper":"AS","sub_keys":"BROKOPONDO~COMMEWIJNE~CORONIE~MAROWIJNE~NICKERIE~PARA~PARAMARIBO~SARAMACCA~SIPALIWINI~WANICA","sub_isoids":"BR~CM~CR~MA~NI~PR~PM~SA~SI~WA"}
+data/SR/BROKOPONDO={"id":"data/SR/BROKOPONDO","key":"BROKOPONDO","lang":"nl","isoid":"BR"}
+data/SR/COMMEWIJNE={"id":"data/SR/COMMEWIJNE","key":"COMMEWIJNE","lang":"nl","isoid":"CM"}
+data/SR/CORONIE={"id":"data/SR/CORONIE","key":"CORONIE","lang":"nl","isoid":"CR"}
+data/SR/MAROWIJNE={"id":"data/SR/MAROWIJNE","key":"MAROWIJNE","lang":"nl","isoid":"MA"}
+data/SR/NICKERIE={"id":"data/SR/NICKERIE","key":"NICKERIE","lang":"nl","isoid":"NI"}
+data/SR/PARA={"id":"data/SR/PARA","key":"PARA","lang":"nl","isoid":"PR"}
+data/SR/PARAMARIBO={"id":"data/SR/PARAMARIBO","key":"PARAMARIBO","lang":"nl","isoid":"PM"}
+data/SR/SARAMACCA={"id":"data/SR/SARAMACCA","key":"SARAMACCA","lang":"nl","isoid":"SA"}
+data/SR/SIPALIWINI={"id":"data/SR/SIPALIWINI","key":"SIPALIWINI","lang":"nl","isoid":"SI"}
+data/SR/WANICA={"id":"data/SR/WANICA","key":"WANICA","lang":"nl","isoid":"WA"}
+data/ST={"id":"data/ST","key":"ST","name":"SAO TOME AND PRINCIPE","fmt":"%N%n%O%n%A%n%C %X"}
+data/SV={"id":"data/SV","key":"SV","name":"EL SALVADOR","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z-%C%n%S","require":"ACS","upper":"CSZ","zip":"CP [1-3][1-7][0-2]\\d","zipex":"CP 1101","sub_keys":"AHUACHAPAN~CABANAS~CALATENANGO~CUSCATLAN~LA LIBERTAD~LA PAZ~LA UNION~MORAZAN~SAN MIGUEL~SAN SALVADOR~SAN VICENTE~SANTA ANA~SONSONATE~USULUTAN","sub_names":"Ahuachapán~Cabañas~Chalatenango~Cuscatlán~La Libertad~La Paz~La Unión~Morazán~San Miguel~San Salvador~San Vicente~Santa Ana~Sonsonate~Usulután","sub_zips":"CP 21~CP 12~CP 13~CP 14~CP 15~CP 16~CP 31~CP 32~CP 33~CP 11~CP 17~CP 22~CP 23~CP 34","sub_zipexs":"CP 2101~CP 1201~CP 1301~CP 1401~CP 1501~CP 1601~CP 3101~CP 3201~CP 3301~CP 1101~CP 1701~CP 2201~CP 2301~CP 3401","sub_isoids":"AH~CA~CH~CU~LI~PA~UN~MO~SM~SS~SV~SA~SO~US"}
+data/SV/AHUACHAPAN={"id":"data/SV/AHUACHAPAN","key":"AHUACHAPAN","name":"Ahuachapán","lang":"es","zip":"CP 21","zipex":"CP 2101","isoid":"AH"}
+data/SV/CABANAS={"id":"data/SV/CABANAS","key":"CABANAS","name":"Cabañas","lang":"es","zip":"CP 12","zipex":"CP 1201","isoid":"CA"}
+data/SV/CALATENANGO={"id":"data/SV/CALATENANGO","key":"CALATENANGO","name":"Chalatenango","lang":"es","zip":"CP 13","zipex":"CP 1301","isoid":"CH"}
+data/SV/CUSCATLAN={"id":"data/SV/CUSCATLAN","key":"CUSCATLAN","name":"Cuscatlán","lang":"es","zip":"CP 14","zipex":"CP 1401","isoid":"CU"}
+data/SV/LA LIBERTAD={"id":"data/SV/LA LIBERTAD","key":"LA LIBERTAD","name":"La Libertad","lang":"es","zip":"CP 15","zipex":"CP 1501","isoid":"LI"}
+data/SV/LA PAZ={"id":"data/SV/LA PAZ","key":"LA PAZ","name":"La Paz","lang":"es","zip":"CP 16","zipex":"CP 1601","isoid":"PA"}
+data/SV/LA UNION={"id":"data/SV/LA UNION","key":"LA UNION","name":"La Unión","lang":"es","zip":"CP 31","zipex":"CP 3101","isoid":"UN"}
+data/SV/MORAZAN={"id":"data/SV/MORAZAN","key":"MORAZAN","name":"Morazán","lang":"es","zip":"CP 32","zipex":"CP 3201","isoid":"MO"}
+data/SV/SAN MIGUEL={"id":"data/SV/SAN MIGUEL","key":"SAN MIGUEL","name":"San Miguel","lang":"es","zip":"CP 33","zipex":"CP 3301","isoid":"SM"}
+data/SV/SAN SALVADOR={"id":"data/SV/SAN SALVADOR","key":"SAN SALVADOR","name":"San Salvador","lang":"es","zip":"CP 11","zipex":"CP 1101","isoid":"SS"}
+data/SV/SAN VICENTE={"id":"data/SV/SAN VICENTE","key":"SAN VICENTE","name":"San Vicente","lang":"es","zip":"CP 17","zipex":"CP 1701","isoid":"SV"}
+data/SV/SANTA ANA={"id":"data/SV/SANTA ANA","key":"SANTA ANA","name":"Santa Ana","lang":"es","zip":"CP 22","zipex":"CP 2201","isoid":"SA"}
+data/SV/SONSONATE={"id":"data/SV/SONSONATE","key":"SONSONATE","name":"Sonsonate","lang":"es","zip":"CP 23","zipex":"CP 2301","isoid":"SO"}
+data/SV/USULUTAN={"id":"data/SV/USULUTAN","key":"USULUTAN","name":"Usulután","lang":"es","zip":"CP 34","zipex":"CP 3401","isoid":"US"}
+data/SZ={"id":"data/SZ","key":"SZ","name":"SWAZILAND","fmt":"%N%n%O%n%A%n%C%n%Z","upper":"ACZ","zip":"[HLMS]\\d{3}","zipex":"H100","posturl":"http://www.sptc.co.sz/swazipost/codes.php"}
+data/TA={"id":"data/TA","key":"TA","name":"TRISTAN DA CUNHA","zip":"TDCU 1ZZ","zipex":"TDCU 1ZZ"}
+data/TC={"id":"data/TC","key":"TC","name":"TURKS AND CAICOS ISLANDS","fmt":"%N%n%O%n%A%n%X%n%C%n%Z","require":"ACZ","upper":"CZ","zip":"TKCA 1ZZ","zipex":"TKCA 1ZZ"}
+data/TD={"id":"data/TD","key":"TD","name":"CHAD"}
+data/TF={"id":"data/TF","key":"TF","name":"FRENCH SOUTHERN TERRITORIES"}
+data/TG={"id":"data/TG","key":"TG","name":"TOGO"}
+data/TH={"id":"data/TH","key":"TH","name":"THAILAND","lang":"th","languages":"th","fmt":"%N%n%O%n%A%n%D %C%n%S %Z","lfmt":"%N%n%O%n%A%n%D, %C%n%S %Z","upper":"S","zip":"\\d{5}","zipex":"10150,10210","sub_keys":"กระบี่~กรุงเทพมหานคร~กาญจนบุรี~กาฬสินธุ์~กำแพงเพชร~ขอนแก่น~จันทบุรี~ฉะเชิงเทรา~ชลบุรี~ชัยนาท~ชัยภูมิ~ชุมพร~เชียงราย~เชียงใหม่~ตรัง~ตราด~ตาก~นครนายก~นครปฐม~นครพนม~นครราชสีมา~นครศรีธรรมราช~นครสวรรค์~นนทบุรี~นราธิวาส~น่าน~บุรีรัมย์~ปทุมธานี~ประจวบคีรีขันธ์~ปราจีนบุรี~ปัตตานี~พระนครศรีอยุธยา~พะเยา~พังงา~พัทลุง~พิจิตร~พิษณุโลก~เพชรบุรี~เพชรบูรณ์~แพร่~ภูเก็ต~มหาสารคาม~มุกดาหาร~แม่ฮ่องสอน~ยโสธร~ยะลา~ร้อยเอ็ด~ระนอง~ระยอง~ราชบุรี~ลพบุรี~ลำปาง~ลำพูน~เลย~ศรีสะเกษ~สกลนคร~สงขลา~สตูล~สมุทรปราการ~สมุทรสงคราม~สมุทรสาคร~สระแก้ว~สระบุรี~สิงห์บุรี~สุโขทัย~สุพรรณบุรี~สุราษฎร์ธานี~สุรินทร์~หนองคาย~หนองบัวลำภู~อ่างทอง~อำนาจเจริญ~อุดรธานี~อุตรดิตถ์~อุทัยธานี~อุบลราชธานี","sub_lnames":"KRABI~BANGKOK~KANCHANABURI~KALASIN~KAMPHAENG PHET~KHON KAEN~CHANTHABURI~CHACHOENGSAO~CHON BURI~CHAI NAT~CHAIYAPHUM~CHUMPON~CHIANG RAI~CHIANG MAI~TRANG~TRAT~TAK~NAKHON NAYOK~NAKHON PATHOM~NAKHON PHANOM~NAKHON RATCHASIMA~NAKHON SI THAMMARAT~NAKHON SAWAN~NONTHABURI~NARATHIWAT~NAN~BURI RAM~PATHUM THANI~PRACHUAP KHIRI KHAN~PRACHIN BURI~PATTANI~PHRA NAKHON SI AYUTTHAYA~PHAYAO~PHANG NGA~PHATTALUNG~PHICHIT~PHITSANULOK~PHETCHABURI~PHETCHABUN~PHRAE~PHUKET~MAHA SARAKHAM~MUKDAHAN~MAE HONG SON~YASOTHON~YALA~ROI ET~RANONG~RAYONG~RATCHABURI~LOP BURI~LAMPANG~LAMPHUN~LOEI~SI SA KET~SAKON NAKHON~SONGKHLA~SATUN~SAMUT PRAKAN~SAMUT SONGKHRAM~SAMUT SAKHON~SA KAEO~SARABURI~SING BURI~SUKHOTHAI~SUPHANBURI~SURAT THANI~SURIN~NONG KHAI~NONG BUA LAM PHU~ANG THONG~AMNAT CHAROEN~UDON THANI~UTTARADIT~UTHAI THANI~UBON RATCHATHANI","sub_zips":"81~10~71~46~62~40~22~24~20~17~36~86~57~50~92~23~63~26~73~48~30~80~60~11~96~55~31~12~77~25~94~13~56~82~93~66~65~76~67~54~83~44~49~58~35~95~45~85~21~70~15~52~51~42~33~47~90~91~10~75~74~27~18~16~64~72~84~32~43~39~14~37~41~53~61~34","sub_isoids":"81~10~71~46~62~40~22~24~20~18~36~86~57~50~92~23~63~26~73~48~30~80~60~12~96~55~31~13~77~25~94~14~56~82~93~66~65~76~67~54~83~44~49~58~35~95~45~85~21~70~16~52~51~42~33~47~90~91~11~75~74~27~19~17~64~72~84~32~43~39~15~37~41~53~61~34"}
+data/TH/กระบี่={"id":"data/TH/กระบี่","key":"กระบี่","lang":"th","lname":"KRABI","zip":"81","isoid":"81"}
+data/TH/กรุงเทพมหานคร={"id":"data/TH/กรุงเทพมหานคร","key":"กรุงเทพมหานคร","lang":"th","lname":"BANGKOK","zip":"10","isoid":"10"}
+data/TH/กาญจนบุรี={"id":"data/TH/กาญจนบุรี","key":"กาญจนบุรี","lang":"th","lname":"KANCHANABURI","zip":"71","isoid":"71"}
+data/TH/กาฬสินธุ์={"id":"data/TH/กาฬสินธุ์","key":"กาฬสินธุ์","lang":"th","lname":"KALASIN","zip":"46","isoid":"46"}
+data/TH/กำแพงเพชร={"id":"data/TH/กำแพงเพชร","key":"กำแพงเพชร","lang":"th","lname":"KAMPHAENG PHET","zip":"62","isoid":"62"}
+data/TH/ขอนแก่น={"id":"data/TH/ขอนแก่น","key":"ขอนแก่น","lang":"th","lname":"KHON KAEN","zip":"40","isoid":"40"}
+data/TH/จันทบุรี={"id":"data/TH/จันทบุรี","key":"จันทบุรี","lang":"th","lname":"CHANTHABURI","zip":"22","isoid":"22"}
+data/TH/ฉะเชิงเทรา={"id":"data/TH/ฉะเชิงเทรา","key":"ฉะเชิงเทรา","lang":"th","lname":"CHACHOENGSAO","zip":"24","isoid":"24"}
+data/TH/ชลบุรี={"id":"data/TH/ชลบุรี","key":"ชลบุรี","lang":"th","lname":"CHON BURI","zip":"20","isoid":"20"}
+data/TH/ชัยนาท={"id":"data/TH/ชัยนาท","key":"ชัยนาท","lang":"th","lname":"CHAI NAT","zip":"17","isoid":"18"}
+data/TH/ชัยภูมิ={"id":"data/TH/ชัยภูมิ","key":"ชัยภูมิ","lang":"th","lname":"CHAIYAPHUM","zip":"36","isoid":"36"}
+data/TH/ชุมพร={"id":"data/TH/ชุมพร","key":"ชุมพร","lang":"th","lname":"CHUMPON","zip":"86","isoid":"86"}
+data/TH/ตรัง={"id":"data/TH/ตรัง","key":"ตรัง","lang":"th","lname":"TRANG","zip":"92","isoid":"92"}
+data/TH/ตราด={"id":"data/TH/ตราด","key":"ตราด","lang":"th","lname":"TRAT","zip":"23","isoid":"23"}
+data/TH/ตาก={"id":"data/TH/ตาก","key":"ตาก","lang":"th","lname":"TAK","zip":"63","isoid":"63"}
+data/TH/นครนายก={"id":"data/TH/นครนายก","key":"นครนายก","lang":"th","lname":"NAKHON NAYOK","zip":"26","isoid":"26"}
+data/TH/นครปฐม={"id":"data/TH/นครปฐม","key":"นครปฐม","lang":"th","lname":"NAKHON PATHOM","zip":"73","isoid":"73"}
+data/TH/นครพนม={"id":"data/TH/นครพนม","key":"นครพนม","lang":"th","lname":"NAKHON PHANOM","zip":"48","isoid":"48"}
+data/TH/นครราชสีมา={"id":"data/TH/นครราชสีมา","key":"นครราชสีมา","lang":"th","lname":"NAKHON RATCHASIMA","zip":"30","isoid":"30"}
+data/TH/นครศรีธรรมราช={"id":"data/TH/นครศรีธรรมราช","key":"นครศรีธรรมราช","lang":"th","lname":"NAKHON SI THAMMARAT","zip":"80","isoid":"80"}
+data/TH/นครสวรรค์={"id":"data/TH/นครสวรรค์","key":"นครสวรรค์","lang":"th","lname":"NAKHON SAWAN","zip":"60","isoid":"60"}
+data/TH/นนทบุรี={"id":"data/TH/นนทบุรี","key":"นนทบุรี","lang":"th","lname":"NONTHABURI","zip":"11","isoid":"12"}
+data/TH/นราธิวาส={"id":"data/TH/นราธิวาส","key":"นราธิวาส","lang":"th","lname":"NARATHIWAT","zip":"96","isoid":"96"}
+data/TH/น่าน={"id":"data/TH/น่าน","key":"น่าน","lang":"th","lname":"NAN","zip":"55","isoid":"55"}
+data/TH/บุรีรัมย์={"id":"data/TH/บุรีรัมย์","key":"บุรีรัมย์","lang":"th","lname":"BURI RAM","zip":"31","isoid":"31"}
+data/TH/ปทุมธานี={"id":"data/TH/ปทุมธานี","key":"ปทุมธานี","lang":"th","lname":"PATHUM THANI","zip":"12","isoid":"13"}
+data/TH/ประจวบคีรีขันธ์={"id":"data/TH/ประจวบคีรีขันธ์","key":"ประจวบคีรีขันธ์","lang":"th","lname":"PRACHUAP KHIRI KHAN","zip":"77","isoid":"77"}
+data/TH/ปราจีนบุรี={"id":"data/TH/ปราจีนบุรี","key":"ปราจีนบุรี","lang":"th","lname":"PRACHIN BURI","zip":"25","isoid":"25"}
+data/TH/ปัตตานี={"id":"data/TH/ปัตตานี","key":"ปัตตานี","lang":"th","lname":"PATTANI","zip":"94","isoid":"94"}
+data/TH/พระนครศรีอยุธยา={"id":"data/TH/พระนครศรีอยุธยา","key":"พระนครศรีอยุธยา","lang":"th","lname":"PHRA NAKHON SI AYUTTHAYA","zip":"13","isoid":"14"}
+data/TH/พะเยา={"id":"data/TH/พะเยา","key":"พะเยา","lang":"th","lname":"PHAYAO","zip":"56","isoid":"56"}
+data/TH/พังงา={"id":"data/TH/พังงา","key":"พังงา","lang":"th","lname":"PHANG NGA","zip":"82","isoid":"82"}
+data/TH/พัทลุง={"id":"data/TH/พัทลุง","key":"พัทลุง","lang":"th","lname":"PHATTALUNG","zip":"93","isoid":"93"}
+data/TH/พิจิตร={"id":"data/TH/พิจิตร","key":"พิจิตร","lang":"th","lname":"PHICHIT","zip":"66","isoid":"66"}
+data/TH/พิษณุโลก={"id":"data/TH/พิษณุโลก","key":"พิษณุโลก","lang":"th","lname":"PHITSANULOK","zip":"65","isoid":"65"}
+data/TH/ภูเก็ต={"id":"data/TH/ภูเก็ต","key":"ภูเก็ต","lang":"th","lname":"PHUKET","zip":"83","isoid":"83"}
+data/TH/มหาสารคาม={"id":"data/TH/มหาสารคาม","key":"มหาสารคาม","lang":"th","lname":"MAHA SARAKHAM","zip":"44","isoid":"44"}
+data/TH/มุกดาหาร={"id":"data/TH/มุกดาหาร","key":"มุกดาหาร","lang":"th","lname":"MUKDAHAN","zip":"49","isoid":"49"}
+data/TH/ยะลา={"id":"data/TH/ยะลา","key":"ยะลา","lang":"th","lname":"YALA","zip":"95","isoid":"95"}
+data/TH/ยโสธร={"id":"data/TH/ยโสธร","key":"ยโสธร","lang":"th","lname":"YASOTHON","zip":"35","isoid":"35"}
+data/TH/ระนอง={"id":"data/TH/ระนอง","key":"ระนอง","lang":"th","lname":"RANONG","zip":"85","isoid":"85"}
+data/TH/ระยอง={"id":"data/TH/ระยอง","key":"ระยอง","lang":"th","lname":"RAYONG","zip":"21","isoid":"21"}
+data/TH/ราชบุรี={"id":"data/TH/ราชบุรี","key":"ราชบุรี","lang":"th","lname":"RATCHABURI","zip":"70","isoid":"70"}
+data/TH/ร้อยเอ็ด={"id":"data/TH/ร้อยเอ็ด","key":"ร้อยเอ็ด","lang":"th","lname":"ROI ET","zip":"45","isoid":"45"}
+data/TH/ลพบุรี={"id":"data/TH/ลพบุรี","key":"ลพบุรี","lang":"th","lname":"LOP BURI","zip":"15","isoid":"16"}
+data/TH/ลำปาง={"id":"data/TH/ลำปาง","key":"ลำปาง","lang":"th","lname":"LAMPANG","zip":"52","isoid":"52"}
+data/TH/ลำพูน={"id":"data/TH/ลำพูน","key":"ลำพูน","lang":"th","lname":"LAMPHUN","zip":"51","isoid":"51"}
+data/TH/ศรีสะเกษ={"id":"data/TH/ศรีสะเกษ","key":"ศรีสะเกษ","lang":"th","lname":"SI SA KET","zip":"33","isoid":"33"}
+data/TH/สกลนคร={"id":"data/TH/สกลนคร","key":"สกลนคร","lang":"th","lname":"SAKON NAKHON","zip":"47","isoid":"47"}
+data/TH/สงขลา={"id":"data/TH/สงขลา","key":"สงขลา","lang":"th","lname":"SONGKHLA","zip":"90","isoid":"90"}
+data/TH/สตูล={"id":"data/TH/สตูล","key":"สตูล","lang":"th","lname":"SATUN","zip":"91","isoid":"91"}
+data/TH/สมุทรปราการ={"id":"data/TH/สมุทรปราการ","key":"สมุทรปราการ","lang":"th","lname":"SAMUT PRAKAN","zip":"10","isoid":"11"}
+data/TH/สมุทรสงคราม={"id":"data/TH/สมุทรสงคราม","key":"สมุทรสงคราม","lang":"th","lname":"SAMUT SONGKHRAM","zip":"75","isoid":"75"}
+data/TH/สมุทรสาคร={"id":"data/TH/สมุทรสาคร","key":"สมุทรสาคร","lang":"th","lname":"SAMUT SAKHON","zip":"74","isoid":"74"}
+data/TH/สระบุรี={"id":"data/TH/สระบุรี","key":"สระบุรี","lang":"th","lname":"SARABURI","zip":"18","isoid":"19"}
+data/TH/สระแก้ว={"id":"data/TH/สระแก้ว","key":"สระแก้ว","lang":"th","lname":"SA KAEO","zip":"27","isoid":"27"}
+data/TH/สิงห์บุรี={"id":"data/TH/สิงห์บุรี","key":"สิงห์บุรี","lang":"th","lname":"SING BURI","zip":"16","isoid":"17"}
+data/TH/สุพรรณบุรี={"id":"data/TH/สุพรรณบุรี","key":"สุพรรณบุรี","lang":"th","lname":"SUPHANBURI","zip":"72","isoid":"72"}
+data/TH/สุราษฎร์ธานี={"id":"data/TH/สุราษฎร์ธานี","key":"สุราษฎร์ธานี","lang":"th","lname":"SURAT THANI","zip":"84","isoid":"84"}
+data/TH/สุรินทร์={"id":"data/TH/สุรินทร์","key":"สุรินทร์","lang":"th","lname":"SURIN","zip":"32","isoid":"32"}
+data/TH/สุโขทัย={"id":"data/TH/สุโขทัย","key":"สุโขทัย","lang":"th","lname":"SUKHOTHAI","zip":"64","isoid":"64"}
+data/TH/หนองคาย={"id":"data/TH/หนองคาย","key":"หนองคาย","lang":"th","lname":"NONG KHAI","zip":"43","isoid":"43"}
+data/TH/หนองบัวลำภู={"id":"data/TH/หนองบัวลำภู","key":"หนองบัวลำภู","lang":"th","lname":"NONG BUA LAM PHU","zip":"39","isoid":"39"}
+data/TH/อำนาจเจริญ={"id":"data/TH/อำนาจเจริญ","key":"อำนาจเจริญ","lang":"th","lname":"AMNAT CHAROEN","zip":"37","isoid":"37"}
+data/TH/อุดรธานี={"id":"data/TH/อุดรธานี","key":"อุดรธานี","lang":"th","lname":"UDON THANI","zip":"41","isoid":"41"}
+data/TH/อุตรดิตถ์={"id":"data/TH/อุตรดิตถ์","key":"อุตรดิตถ์","lang":"th","lname":"UTTARADIT","zip":"53","isoid":"53"}
+data/TH/อุทัยธานี={"id":"data/TH/อุทัยธานี","key":"อุทัยธานี","lang":"th","lname":"UTHAI THANI","zip":"61","isoid":"61"}
+data/TH/อุบลราชธานี={"id":"data/TH/อุบลราชธานี","key":"อุบลราชธานี","lang":"th","lname":"UBON RATCHATHANI","zip":"34","isoid":"34"}
+data/TH/อ่างทอง={"id":"data/TH/อ่างทอง","key":"อ่างทอง","lang":"th","lname":"ANG THONG","zip":"14","isoid":"15"}
+data/TH/เชียงราย={"id":"data/TH/เชียงราย","key":"เชียงราย","lang":"th","lname":"CHIANG RAI","zip":"57","isoid":"57"}
+data/TH/เชียงใหม่={"id":"data/TH/เชียงใหม่","key":"เชียงใหม่","lang":"th","lname":"CHIANG MAI","zip":"50","isoid":"50"}
+data/TH/เพชรบุรี={"id":"data/TH/เพชรบุรี","key":"เพชรบุรี","lang":"th","lname":"PHETCHABURI","zip":"76","isoid":"76"}
+data/TH/เพชรบูรณ์={"id":"data/TH/เพชรบูรณ์","key":"เพชรบูรณ์","lang":"th","lname":"PHETCHABUN","zip":"67","isoid":"67"}
+data/TH/เลย={"id":"data/TH/เลย","key":"เลย","lang":"th","lname":"LOEI","zip":"42","isoid":"42"}
+data/TH/แพร่={"id":"data/TH/แพร่","key":"แพร่","lang":"th","lname":"PHRAE","zip":"54","isoid":"54"}
+data/TH/แม่ฮ่องสอน={"id":"data/TH/แม่ฮ่องสอน","key":"แม่ฮ่องสอน","lang":"th","lname":"MAE HONG SON","zip":"58","isoid":"58"}
+data/TJ={"id":"data/TJ","key":"TJ","name":"TAJIKISTAN","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{6}","zipex":"735450,734025"}
+data/TK={"id":"data/TK","key":"TK","name":"TOKELAU"}
+data/TL={"id":"data/TL","key":"TL","name":"TIMOR-LESTE"}
+data/TM={"id":"data/TM","key":"TM","name":"TURKMENISTAN","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{6}","zipex":"744000"}
+data/TN={"id":"data/TN","key":"TN","name":"TUNISIA","fmt":"%N%n%O%n%A%n%Z %C","zip":"\\d{4}","zipex":"1002,8129,3100,1030","posturl":"http://www.poste.tn/codes.php"}
+data/TO={"id":"data/TO","key":"TO","name":"TONGA"}
+data/TR={"id":"data/TR","key":"TR","name":"TURKEY","fmt":"%N%n%O%n%A%n%Z %C","require":"ACZ","zip":"\\d{5}","zipex":"01960,06101","posturl":"http://postakodu.ptt.gov.tr/"}
+data/TT={"id":"data/TT","key":"TT","name":"TRINIDAD AND TOBAGO"}
+data/TV={"id":"data/TV","key":"TV","name":"TUVALU","lang":"tyv","languages":"tyv","fmt":"%N%n%O%n%A%n%X%n%C%n%S","upper":"ACS","state_name_type":"island","sub_keys":"FUNAFUTI~NANUMANGA~NANUMEA~NIULAKITA~NIUTAO~NUI~NUKUFETAU~NUKULAELAE~VAITUPU","sub_isoids":"FUN~NMG~NMA~~NIT~NUI~NKF~NKL~VAI"}
+data/TV/FUNAFUTI={"id":"data/TV/FUNAFUTI","key":"FUNAFUTI","lang":"tyv","isoid":"FUN"}
+data/TV/NANUMANGA={"id":"data/TV/NANUMANGA","key":"NANUMANGA","lang":"tyv","isoid":"NMG"}
+data/TV/NANUMEA={"id":"data/TV/NANUMEA","key":"NANUMEA","lang":"tyv","isoid":"NMA"}
+data/TV/NIULAKITA={"id":"data/TV/NIULAKITA","key":"NIULAKITA","lang":"tyv"}
+data/TV/NIUTAO={"id":"data/TV/NIUTAO","key":"NIUTAO","lang":"tyv","isoid":"NIT"}
+data/TV/NUI={"id":"data/TV/NUI","key":"NUI","lang":"tyv","isoid":"NUI"}
+data/TV/NUKUFETAU={"id":"data/TV/NUKUFETAU","key":"NUKUFETAU","lang":"tyv","isoid":"NKF"}
+data/TV/NUKULAELAE={"id":"data/TV/NUKULAELAE","key":"NUKULAELAE","lang":"tyv","isoid":"NKL"}
+data/TV/VAITUPU={"id":"data/TV/VAITUPU","key":"VAITUPU","lang":"tyv","isoid":"VAI"}
+data/TW={"id":"data/TW","key":"TW","name":"TAIWAN","lang":"zh-hant","languages":"zh-hant","fmt":"%Z%n%S%C%n%A%n%O%n%N","lfmt":"%N%n%O%n%A%n%C, %S %Z","require":"ACSZ","zip":"\\d{3}(\\d{2})?","zipex":"104,106,10603,40867","posturl":"http://www.post.gov.tw/post/internet/f_searchzone/index.jsp?ID=190102","state_name_type":"county","sub_keys":"台中市~台北市~台東縣~台南市~宜蘭縣~花蓮縣~金門縣~南投縣~屏東縣~苗栗縣~桃園縣~高雄市~基隆市~連江縣~雲林縣~新北市~新竹市~新竹縣~嘉義市~嘉義縣~彰化縣~澎湖縣","sub_lnames":"Taichung City~Taipei City~Taitung County~Tainan City~Yilan County~Hualien County~Kinmen County~Nantou County~Pingtung County~Miaoli County~Taoyuan County~Kaohsiung City~Keelung City~Lienchiang County~Yunlin County~New Taipei City~Hsinchu City~Hsinchu County~Chiayi City~Chiayi County~Changhua County~Penghu County","sub_zips":"4[0-3]~1[01]~9[56]~7[0-4]~2[67]~9[78]~89~5[45]~9[0-4]~3[56]~3[23]~8[02-5]|81[1-579]~20[0-6]~209|21[012]~6[3-5]~20[78]|2[2345]~300~30[2-8]|31~600~60[1-9]|6[12]~5[0123]~88","sub_zipexs":"400,408:411,439~100,119~950,966~700,745~260,272~970,983~890,896~540,558~900,947~350,369~320,338~800,815:817,852~200,206~209,212~630,655~207,208:220,253~~302,315~~602,625~500,530~880,885","sub_isoids":"TXG~TPE~TTT~TNN~ILA~HUA~~NAN~PIF~MIA~TAO~KHH~KEE~~YUN~TPQ~HSZ~HSQ~CYI~CYQ~CHA~PEN","sub_mores":"true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~true~false~true~false~true~true~true"}
+data/TW/南投縣={"id":"data/TW/南投縣","key":"南投縣","lang":"zh-hant","lname":"Nantou County","zip":"5[45]","zipex":"540,558","isoid":"NAN","sub_keys":"中寮鄉~仁愛鄉~水里鄉~名間鄉~竹山鎮~信義鄉~南投市~埔里鎮~草屯鎮~國姓鄉~魚池鄉~鹿谷鄉~集集鎮","sub_lnames":"Jhongliao Township~Ren-ai Township~Shueili Township~Mingjian Township~Jhushan Township~Sinyi Township~Nantou City~Puli Township~Caotun Township~Guosing Township~Yuchih Township~Lugu Township~Jiji Township","sub_zips":"541~546~553~551~557~556~540~545~542~544~555~558~552"}
+data/TW/南投縣/中寮鄉={"id":"data/TW/南投縣/中寮鄉","key":"中寮鄉","lang":"zh-hant","lname":"Jhongliao Township","zip":"541"}
+data/TW/南投縣/仁愛鄉={"id":"data/TW/南投縣/仁愛鄉","key":"仁愛鄉","lang":"zh-hant","lname":"Ren-ai Township","zip":"546"}
+data/TW/南投縣/信義鄉={"id":"data/TW/南投縣/信義鄉","key":"信義鄉","lang":"zh-hant","lname":"Sinyi Township","zip":"556"}
+data/TW/南投縣/南投市={"id":"data/TW/南投縣/南投市","key":"南投市","lang":"zh-hant","lname":"Nantou City","zip":"540"}
+data/TW/南投縣/名間鄉={"id":"data/TW/南投縣/名間鄉","key":"名間鄉","lang":"zh-hant","lname":"Mingjian Township","zip":"551"}
+data/TW/南投縣/國姓鄉={"id":"data/TW/南投縣/國姓鄉","key":"國姓鄉","lang":"zh-hant","lname":"Guosing Township","zip":"544"}
+data/TW/南投縣/埔里鎮={"id":"data/TW/南投縣/埔里鎮","key":"埔里鎮","lang":"zh-hant","lname":"Puli Township","zip":"545"}
+data/TW/南投縣/水里鄉={"id":"data/TW/南投縣/水里鄉","key":"水里鄉","lang":"zh-hant","lname":"Shueili Township","zip":"553"}
+data/TW/南投縣/竹山鎮={"id":"data/TW/南投縣/竹山鎮","key":"竹山鎮","lang":"zh-hant","lname":"Jhushan Township","zip":"557"}
+data/TW/南投縣/草屯鎮={"id":"data/TW/南投縣/草屯鎮","key":"草屯鎮","lang":"zh-hant","lname":"Caotun Township","zip":"542"}
+data/TW/南投縣/集集鎮={"id":"data/TW/南投縣/集集鎮","key":"集集鎮","lang":"zh-hant","lname":"Jiji Township","zip":"552"}
+data/TW/南投縣/魚池鄉={"id":"data/TW/南投縣/魚池鄉","key":"魚池鄉","lang":"zh-hant","lname":"Yuchih Township","zip":"555"}
+data/TW/南投縣/鹿谷鄉={"id":"data/TW/南投縣/鹿谷鄉","key":"鹿谷鄉","lang":"zh-hant","lname":"Lugu Township","zip":"558"}
+data/TW/台中市={"id":"data/TW/台中市","key":"台中市","lang":"zh-hant","lname":"Taichung City","zip":"4[0-3]","zipex":"400,408:411,439","isoid":"TXG","sub_keys":"大甲區~大安區~大肚區~大里區~大雅區~中區~太平區~北屯區~北區~外埔區~石岡區~后里區~西屯區~西區~沙鹿區~和平區~東區~東勢區~南屯區~南區~烏日區~神岡區~梧棲區~清水區~新社區~潭子區~龍井區~豐原區~霧峰區","sub_lnames":"Dajia District~Da-an District~Dadu District~Dali District~Daya District~Central District~Taiping District~Beitun District~North District~Waipu District~Shihgang District~Houli District~Situn District~West District~Shalu District~Heping District~East District~Dongshih District~Nantun District~South District~Wurih District~Shengang District~Wuci District~Cingshuei District~Sinshe District~Tanzih District~Longjing District~Fongyuan District~Wufong District","sub_zips":"437~439~432~412~428~400~411~406~404~438~422~421~407~403~433~424~401~423~408~402~414~429~435~436~426~427~434~420~413"}
+data/TW/台中市/中區={"id":"data/TW/台中市/中區","key":"中區","lang":"zh-hant","lname":"Central District","zip":"400"}
+data/TW/台中市/北區={"id":"data/TW/台中市/北區","key":"北區","lang":"zh-hant","lname":"North District","zip":"404"}
+data/TW/台中市/北屯區={"id":"data/TW/台中市/北屯區","key":"北屯區","lang":"zh-hant","lname":"Beitun District","zip":"406"}
+data/TW/台中市/南區={"id":"data/TW/台中市/南區","key":"南區","lang":"zh-hant","lname":"South District","zip":"402"}
+data/TW/台中市/南屯區={"id":"data/TW/台中市/南屯區","key":"南屯區","lang":"zh-hant","lname":"Nantun District","zip":"408"}
+data/TW/台中市/后里區={"id":"data/TW/台中市/后里區","key":"后里區","lang":"zh-hant","lname":"Houli District","zip":"421"}
+data/TW/台中市/和平區={"id":"data/TW/台中市/和平區","key":"和平區","lang":"zh-hant","lname":"Heping District","zip":"424"}
+data/TW/台中市/外埔區={"id":"data/TW/台中市/外埔區","key":"外埔區","lang":"zh-hant","lname":"Waipu District","zip":"438"}
+data/TW/台中市/大安區={"id":"data/TW/台中市/大安區","key":"大安區","lang":"zh-hant","lname":"Da-an District","zip":"439"}
+data/TW/台中市/大甲區={"id":"data/TW/台中市/大甲區","key":"大甲區","lang":"zh-hant","lname":"Dajia District","zip":"437"}
+data/TW/台中市/大肚區={"id":"data/TW/台中市/大肚區","key":"大肚區","lang":"zh-hant","lname":"Dadu District","zip":"432"}
+data/TW/台中市/大里區={"id":"data/TW/台中市/大里區","key":"大里區","lang":"zh-hant","lname":"Dali District","zip":"412"}
+data/TW/台中市/大雅區={"id":"data/TW/台中市/大雅區","key":"大雅區","lang":"zh-hant","lname":"Daya District","zip":"428"}
+data/TW/台中市/太平區={"id":"data/TW/台中市/太平區","key":"太平區","lang":"zh-hant","lname":"Taiping District","zip":"411"}
+data/TW/台中市/新社區={"id":"data/TW/台中市/新社區","key":"新社區","lang":"zh-hant","lname":"Sinshe District","zip":"426"}
+data/TW/台中市/東勢區={"id":"data/TW/台中市/東勢區","key":"東勢區","lang":"zh-hant","lname":"Dongshih District","zip":"423"}
+data/TW/台中市/東區={"id":"data/TW/台中市/東區","key":"東區","lang":"zh-hant","lname":"East District","zip":"401"}
+data/TW/台中市/梧棲區={"id":"data/TW/台中市/梧棲區","key":"梧棲區","lang":"zh-hant","lname":"Wuci District","zip":"435"}
+data/TW/台中市/沙鹿區={"id":"data/TW/台中市/沙鹿區","key":"沙鹿區","lang":"zh-hant","lname":"Shalu District","zip":"433"}
+data/TW/台中市/清水區={"id":"data/TW/台中市/清水區","key":"清水區","lang":"zh-hant","lname":"Cingshuei District","zip":"436"}
+data/TW/台中市/潭子區={"id":"data/TW/台中市/潭子區","key":"潭子區","lang":"zh-hant","lname":"Tanzih District","zip":"427"}
+data/TW/台中市/烏日區={"id":"data/TW/台中市/烏日區","key":"烏日區","lang":"zh-hant","lname":"Wurih District","zip":"414"}
+data/TW/台中市/石岡區={"id":"data/TW/台中市/石岡區","key":"石岡區","lang":"zh-hant","lname":"Shihgang District","zip":"422"}
+data/TW/台中市/神岡區={"id":"data/TW/台中市/神岡區","key":"神岡區","lang":"zh-hant","lname":"Shengang District","zip":"429"}
+data/TW/台中市/西區={"id":"data/TW/台中市/西區","key":"西區","lang":"zh-hant","lname":"West District","zip":"403"}
+data/TW/台中市/西屯區={"id":"data/TW/台中市/西屯區","key":"西屯區","lang":"zh-hant","lname":"Situn District","zip":"407"}
+data/TW/台中市/豐原區={"id":"data/TW/台中市/豐原區","key":"豐原區","lang":"zh-hant","lname":"Fongyuan District","zip":"420"}
+data/TW/台中市/霧峰區={"id":"data/TW/台中市/霧峰區","key":"霧峰區","lang":"zh-hant","lname":"Wufong District","zip":"413"}
+data/TW/台中市/龍井區={"id":"data/TW/台中市/龍井區","key":"龍井區","lang":"zh-hant","lname":"Longjing District","zip":"434"}
+data/TW/台北市={"id":"data/TW/台北市","key":"台北市","lang":"zh-hant","lname":"Taipei City","zip":"1[01]","zipex":"100,119","isoid":"TPE","sub_keys":"士林區~大同區~大安區~中山區~中正區~內湖區~文山區~北投區~松山區~信義區~南港區~萬華區","sub_lnames":"Shihlin District~Datong District~Da-an District~Jhongshan District~Jhongjheng District~Neihu District~Wunshan District~Beitou District~Songshan District~Sinyi District~Nangang District~Wanhua District","sub_zips":"111~103~106~104~100~114~116~112~105~110~115~108"}
+data/TW/台北市/中山區={"id":"data/TW/台北市/中山區","key":"中山區","lang":"zh-hant","lname":"Jhongshan District","zip":"104"}
+data/TW/台北市/中正區={"id":"data/TW/台北市/中正區","key":"中正區","lang":"zh-hant","lname":"Jhongjheng District","zip":"100"}
+data/TW/台北市/信義區={"id":"data/TW/台北市/信義區","key":"信義區","lang":"zh-hant","lname":"Sinyi District","zip":"110"}
+data/TW/台北市/內湖區={"id":"data/TW/台北市/內湖區","key":"內湖區","lang":"zh-hant","lname":"Neihu District","zip":"114"}
+data/TW/台北市/北投區={"id":"data/TW/台北市/北投區","key":"北投區","lang":"zh-hant","lname":"Beitou District","zip":"112"}
+data/TW/台北市/南港區={"id":"data/TW/台北市/南港區","key":"南港區","lang":"zh-hant","lname":"Nangang District","zip":"115"}
+data/TW/台北市/士林區={"id":"data/TW/台北市/士林區","key":"士林區","lang":"zh-hant","lname":"Shihlin District","zip":"111"}
+data/TW/台北市/大同區={"id":"data/TW/台北市/大同區","key":"大同區","lang":"zh-hant","lname":"Datong District","zip":"103"}
+data/TW/台北市/大安區={"id":"data/TW/台北市/大安區","key":"大安區","lang":"zh-hant","lname":"Da-an District","zip":"106"}
+data/TW/台北市/文山區={"id":"data/TW/台北市/文山區","key":"文山區","lang":"zh-hant","lname":"Wunshan District","zip":"116"}
+data/TW/台北市/松山區={"id":"data/TW/台北市/松山區","key":"松山區","lang":"zh-hant","lname":"Songshan District","zip":"105"}
+data/TW/台北市/萬華區={"id":"data/TW/台北市/萬華區","key":"萬華區","lang":"zh-hant","lname":"Wanhua District","zip":"108"}
+data/TW/台南市={"id":"data/TW/台南市","key":"台南市","lang":"zh-hant","lname":"Tainan City","zip":"7[0-4]","zipex":"700,745","isoid":"TNN","sub_keys":"七股區~下營區~大內區~山上區~中西區~仁德區~六甲區~北門區~北區~左鎮區~永康區~玉井區~白河區~安平區~安定區~安南區~西港區~佳里區~官田區~東山區~東區~南化區~南區~後壁區~柳營區~將軍區~麻豆區~善化區~新化區~新市區~新營區~楠西區~學甲區~龍崎區~歸仁區~關廟區~鹽水區","sub_lnames":"Cigu District~Siaying District~Danei District~Shanshang District~West Central District~Rende District~Lioujia District~Beimen District~North District~Zuojhen District~Yongkang District~Yujing District~Baihe District~Anping District~Anding District~Annan District~Sigang District~Jiali District~Guantian District~Dongshan District~East District~Nanhua District~South District~Houbi District~Liouying District~Jiangjyun District~Madou District~Shanhua District~Sinhua District~Sinshih District~Sinying District~Nansi District~Syuejia District~Longci District~Gueiren District~Guanmiao District~Yanshuei District","sub_zips":"724~735~742~743~700~717~734~727~704~713~710~714~732~708~745~709~723~722~720~733~701~716~702~731~736~725~721~741~712~744~730~715~726~719~711~718~737"}
+data/TW/台南市/七股區={"id":"data/TW/台南市/七股區","key":"七股區","lang":"zh-hant","lname":"Cigu District","zip":"724"}
+data/TW/台南市/下營區={"id":"data/TW/台南市/下營區","key":"下營區","lang":"zh-hant","lname":"Siaying District","zip":"735"}
+data/TW/台南市/中西區={"id":"data/TW/台南市/中西區","key":"中西區","lang":"zh-hant","lname":"West Central District","zip":"700"}
+data/TW/台南市/仁德區={"id":"data/TW/台南市/仁德區","key":"仁德區","lang":"zh-hant","lname":"Rende District","zip":"717"}
+data/TW/台南市/佳里區={"id":"data/TW/台南市/佳里區","key":"佳里區","lang":"zh-hant","lname":"Jiali District","zip":"722"}
+data/TW/台南市/六甲區={"id":"data/TW/台南市/六甲區","key":"六甲區","lang":"zh-hant","lname":"Lioujia District","zip":"734"}
+data/TW/台南市/北區={"id":"data/TW/台南市/北區","key":"北區","lang":"zh-hant","lname":"North District","zip":"704"}
+data/TW/台南市/北門區={"id":"data/TW/台南市/北門區","key":"北門區","lang":"zh-hant","lname":"Beimen District","zip":"727"}
+data/TW/台南市/南化區={"id":"data/TW/台南市/南化區","key":"南化區","lang":"zh-hant","lname":"Nanhua District","zip":"716"}
+data/TW/台南市/南區={"id":"data/TW/台南市/南區","key":"南區","lang":"zh-hant","lname":"South District","zip":"702"}
+data/TW/台南市/善化區={"id":"data/TW/台南市/善化區","key":"善化區","lang":"zh-hant","lname":"Shanhua District","zip":"741"}
+data/TW/台南市/大內區={"id":"data/TW/台南市/大內區","key":"大內區","lang":"zh-hant","lname":"Danei District","zip":"742"}
+data/TW/台南市/學甲區={"id":"data/TW/台南市/學甲區","key":"學甲區","lang":"zh-hant","lname":"Syuejia District","zip":"726"}
+data/TW/台南市/安南區={"id":"data/TW/台南市/安南區","key":"安南區","lang":"zh-hant","lname":"Annan District","zip":"709"}
+data/TW/台南市/安定區={"id":"data/TW/台南市/安定區","key":"安定區","lang":"zh-hant","lname":"Anding District","zip":"745"}
+data/TW/台南市/安平區={"id":"data/TW/台南市/安平區","key":"安平區","lang":"zh-hant","lname":"Anping District","zip":"708"}
+data/TW/台南市/官田區={"id":"data/TW/台南市/官田區","key":"官田區","lang":"zh-hant","lname":"Guantian District","zip":"720"}
+data/TW/台南市/將軍區={"id":"data/TW/台南市/將軍區","key":"將軍區","lang":"zh-hant","lname":"Jiangjyun District","zip":"725"}
+data/TW/台南市/山上區={"id":"data/TW/台南市/山上區","key":"山上區","lang":"zh-hant","lname":"Shanshang District","zip":"743"}
+data/TW/台南市/左鎮區={"id":"data/TW/台南市/左鎮區","key":"左鎮區","lang":"zh-hant","lname":"Zuojhen District","zip":"713"}
+data/TW/台南市/後壁區={"id":"data/TW/台南市/後壁區","key":"後壁區","lang":"zh-hant","lname":"Houbi District","zip":"731"}
+data/TW/台南市/新化區={"id":"data/TW/台南市/新化區","key":"新化區","lang":"zh-hant","lname":"Sinhua District","zip":"712"}
+data/TW/台南市/新市區={"id":"data/TW/台南市/新市區","key":"新市區","lang":"zh-hant","lname":"Sinshih District","zip":"744"}
+data/TW/台南市/新營區={"id":"data/TW/台南市/新營區","key":"新營區","lang":"zh-hant","lname":"Sinying District","zip":"730"}
+data/TW/台南市/東區={"id":"data/TW/台南市/東區","key":"東區","lang":"zh-hant","lname":"East District","zip":"701"}
+data/TW/台南市/東山區={"id":"data/TW/台南市/東山區","key":"東山區","lang":"zh-hant","lname":"Dongshan District","zip":"733"}
+data/TW/台南市/柳營區={"id":"data/TW/台南市/柳營區","key":"柳營區","lang":"zh-hant","lname":"Liouying District","zip":"736"}
+data/TW/台南市/楠西區={"id":"data/TW/台南市/楠西區","key":"楠西區","lang":"zh-hant","lname":"Nansi District","zip":"715"}
+data/TW/台南市/歸仁區={"id":"data/TW/台南市/歸仁區","key":"歸仁區","lang":"zh-hant","lname":"Gueiren District","zip":"711"}
+data/TW/台南市/永康區={"id":"data/TW/台南市/永康區","key":"永康區","lang":"zh-hant","lname":"Yongkang District","zip":"710"}
+data/TW/台南市/玉井區={"id":"data/TW/台南市/玉井區","key":"玉井區","lang":"zh-hant","lname":"Yujing District","zip":"714"}
+data/TW/台南市/白河區={"id":"data/TW/台南市/白河區","key":"白河區","lang":"zh-hant","lname":"Baihe District","zip":"732"}
+data/TW/台南市/西港區={"id":"data/TW/台南市/西港區","key":"西港區","lang":"zh-hant","lname":"Sigang District","zip":"723"}
+data/TW/台南市/關廟區={"id":"data/TW/台南市/關廟區","key":"關廟區","lang":"zh-hant","lname":"Guanmiao District","zip":"718"}
+data/TW/台南市/鹽水區={"id":"data/TW/台南市/鹽水區","key":"鹽水區","lang":"zh-hant","lname":"Yanshuei District","zip":"737"}
+data/TW/台南市/麻豆區={"id":"data/TW/台南市/麻豆區","key":"麻豆區","lang":"zh-hant","lname":"Madou District","zip":"721"}
+data/TW/台南市/龍崎區={"id":"data/TW/台南市/龍崎區","key":"龍崎區","lang":"zh-hant","lname":"Longci District","zip":"719"}
+data/TW/台東縣={"id":"data/TW/台東縣","key":"台東縣","lang":"zh-hant","lname":"Taitung County","zip":"9[56]","zipex":"950,966","isoid":"TTT","sub_keys":"大武鄉~太麻里鄉~台東市~成功鎮~池上鄉~卑南鄉~延平鄉~東河鄉~金峰鄉~長濱鄉~海端鄉~鹿野鄉~達仁鄉~綠島鄉~關山鎮~蘭嶼鄉","sub_lnames":"Dawu Township~Taimali Township~Taitung City~Chenggong Township~Chihshang Township~Beinan Township~Yanping Township~Donghe Township~Jinfong Township~Changbin Township~Haiduan Township~Luye Township~Daren Township~Lyudao Township~Guanshan Township~Lanyu Township","sub_zips":"965~963~950~961~958~954~953~959~964~962~957~955~966~951~956~952"}
+data/TW/台東縣/卑南鄉={"id":"data/TW/台東縣/卑南鄉","key":"卑南鄉","lang":"zh-hant","lname":"Beinan Township","zip":"954"}
+data/TW/台東縣/台東市={"id":"data/TW/台東縣/台東市","key":"台東市","lang":"zh-hant","lname":"Taitung City","zip":"950"}
+data/TW/台東縣/大武鄉={"id":"data/TW/台東縣/大武鄉","key":"大武鄉","lang":"zh-hant","lname":"Dawu Township","zip":"965"}
+data/TW/台東縣/太麻里鄉={"id":"data/TW/台東縣/太麻里鄉","key":"太麻里鄉","lang":"zh-hant","lname":"Taimali Township","zip":"963"}
+data/TW/台東縣/延平鄉={"id":"data/TW/台東縣/延平鄉","key":"延平鄉","lang":"zh-hant","lname":"Yanping Township","zip":"953"}
+data/TW/台東縣/成功鎮={"id":"data/TW/台東縣/成功鎮","key":"成功鎮","lang":"zh-hant","lname":"Chenggong Township","zip":"961"}
+data/TW/台東縣/東河鄉={"id":"data/TW/台東縣/東河鄉","key":"東河鄉","lang":"zh-hant","lname":"Donghe Township","zip":"959"}
+data/TW/台東縣/池上鄉={"id":"data/TW/台東縣/池上鄉","key":"池上鄉","lang":"zh-hant","lname":"Chihshang Township","zip":"958"}
+data/TW/台東縣/海端鄉={"id":"data/TW/台東縣/海端鄉","key":"海端鄉","lang":"zh-hant","lname":"Haiduan Township","zip":"957"}
+data/TW/台東縣/綠島鄉={"id":"data/TW/台東縣/綠島鄉","key":"綠島鄉","lang":"zh-hant","lname":"Lyudao Township","zip":"951"}
+data/TW/台東縣/蘭嶼鄉={"id":"data/TW/台東縣/蘭嶼鄉","key":"蘭嶼鄉","lang":"zh-hant","lname":"Lanyu Township","zip":"952"}
+data/TW/台東縣/達仁鄉={"id":"data/TW/台東縣/達仁鄉","key":"達仁鄉","lang":"zh-hant","lname":"Daren Township","zip":"966"}
+data/TW/台東縣/金峰鄉={"id":"data/TW/台東縣/金峰鄉","key":"金峰鄉","lang":"zh-hant","lname":"Jinfong Township","zip":"964"}
+data/TW/台東縣/長濱鄉={"id":"data/TW/台東縣/長濱鄉","key":"長濱鄉","lang":"zh-hant","lname":"Changbin Township","zip":"962"}
+data/TW/台東縣/關山鎮={"id":"data/TW/台東縣/關山鎮","key":"關山鎮","lang":"zh-hant","lname":"Guanshan Township","zip":"956"}
+data/TW/台東縣/鹿野鄉={"id":"data/TW/台東縣/鹿野鄉","key":"鹿野鄉","lang":"zh-hant","lname":"Luye Township","zip":"955"}
+data/TW/嘉義市={"id":"data/TW/嘉義市","key":"嘉義市","lang":"zh-hant","lname":"Chiayi City","zip":"600","isoid":"CYI"}
+data/TW/嘉義縣={"id":"data/TW/嘉義縣","key":"嘉義縣","lang":"zh-hant","lname":"Chiayi County","zip":"60[1-9]|6[12]","zipex":"602,625","isoid":"CYQ","sub_keys":"大林鎮~大埔鄉~中埔鄉~六腳鄉~太保市~水上鄉~布袋鎮~民雄鄉~朴子市~竹崎鄉~東石鄉~阿里山鄉~梅山鄉~鹿草鄉~番路鄉~新港鄉~溪口鄉~義竹鄉","sub_lnames":"Dalin Township~Dapu Township~Jhongpu Township~Lioujiao Township~Taibao City~Shueishang Township~Budai Township~Minsyong Township~Puzih City~Jhuci Township~Dongshih Township~Alishan Township~Meishan Township~Lucao Township~Fanlu Township~Singang Township~Sikou Township~Yijhu Township","sub_zips":"622~607~606~615~612~608~625~621~613~604~614~605~603~611~602~616~623~624"}
+data/TW/嘉義縣/中埔鄉={"id":"data/TW/嘉義縣/中埔鄉","key":"中埔鄉","lang":"zh-hant","lname":"Jhongpu Township","zip":"606"}
+data/TW/嘉義縣/六腳鄉={"id":"data/TW/嘉義縣/六腳鄉","key":"六腳鄉","lang":"zh-hant","lname":"Lioujiao Township","zip":"615"}
+data/TW/嘉義縣/大埔鄉={"id":"data/TW/嘉義縣/大埔鄉","key":"大埔鄉","lang":"zh-hant","lname":"Dapu Township","zip":"607"}
+data/TW/嘉義縣/大林鎮={"id":"data/TW/嘉義縣/大林鎮","key":"大林鎮","lang":"zh-hant","lname":"Dalin Township","zip":"622"}
+data/TW/嘉義縣/太保市={"id":"data/TW/嘉義縣/太保市","key":"太保市","lang":"zh-hant","lname":"Taibao City","zip":"612"}
+data/TW/嘉義縣/布袋鎮={"id":"data/TW/嘉義縣/布袋鎮","key":"布袋鎮","lang":"zh-hant","lname":"Budai Township","zip":"625"}
+data/TW/嘉義縣/新港鄉={"id":"data/TW/嘉義縣/新港鄉","key":"新港鄉","lang":"zh-hant","lname":"Singang Township","zip":"616"}
+data/TW/嘉義縣/朴子市={"id":"data/TW/嘉義縣/朴子市","key":"朴子市","lang":"zh-hant","lname":"Puzih City","zip":"613"}
+data/TW/嘉義縣/東石鄉={"id":"data/TW/嘉義縣/東石鄉","key":"東石鄉","lang":"zh-hant","lname":"Dongshih Township","zip":"614"}
+data/TW/嘉義縣/梅山鄉={"id":"data/TW/嘉義縣/梅山鄉","key":"梅山鄉","lang":"zh-hant","lname":"Meishan Township","zip":"603"}
+data/TW/嘉義縣/民雄鄉={"id":"data/TW/嘉義縣/民雄鄉","key":"民雄鄉","lang":"zh-hant","lname":"Minsyong Township","zip":"621"}
+data/TW/嘉義縣/水上鄉={"id":"data/TW/嘉義縣/水上鄉","key":"水上鄉","lang":"zh-hant","lname":"Shueishang Township","zip":"608"}
+data/TW/嘉義縣/溪口鄉={"id":"data/TW/嘉義縣/溪口鄉","key":"溪口鄉","lang":"zh-hant","lname":"Sikou Township","zip":"623"}
+data/TW/嘉義縣/番路鄉={"id":"data/TW/嘉義縣/番路鄉","key":"番路鄉","lang":"zh-hant","lname":"Fanlu Township","zip":"602"}
+data/TW/嘉義縣/竹崎鄉={"id":"data/TW/嘉義縣/竹崎鄉","key":"竹崎鄉","lang":"zh-hant","lname":"Jhuci Township","zip":"604"}
+data/TW/嘉義縣/義竹鄉={"id":"data/TW/嘉義縣/義竹鄉","key":"義竹鄉","lang":"zh-hant","lname":"Yijhu Township","zip":"624"}
+data/TW/嘉義縣/阿里山鄉={"id":"data/TW/嘉義縣/阿里山鄉","key":"阿里山鄉","lang":"zh-hant","lname":"Alishan Township","zip":"605"}
+data/TW/嘉義縣/鹿草鄉={"id":"data/TW/嘉義縣/鹿草鄉","key":"鹿草鄉","lang":"zh-hant","lname":"Lucao Township","zip":"611"}
+data/TW/基隆市={"id":"data/TW/基隆市","key":"基隆市","lang":"zh-hant","lname":"Keelung City","zip":"20[0-6]","zipex":"200,206","isoid":"KEE","sub_keys":"七堵區~中山區~中正區~仁愛區~安樂區~信義區~暖暖區","sub_lnames":"Cidu District~Jhongshan District~Jhongjheng District~Ren-ai District~Anle District~Sinyi District~Nuannuan District","sub_zips":"206~203~202~200~204~201~205"}
+data/TW/基隆市/七堵區={"id":"data/TW/基隆市/七堵區","key":"七堵區","lang":"zh-hant","lname":"Cidu District","zip":"206"}
+data/TW/基隆市/中山區={"id":"data/TW/基隆市/中山區","key":"中山區","lang":"zh-hant","lname":"Jhongshan District","zip":"203"}
+data/TW/基隆市/中正區={"id":"data/TW/基隆市/中正區","key":"中正區","lang":"zh-hant","lname":"Jhongjheng District","zip":"202"}
+data/TW/基隆市/仁愛區={"id":"data/TW/基隆市/仁愛區","key":"仁愛區","lang":"zh-hant","lname":"Ren-ai District","zip":"200"}
+data/TW/基隆市/信義區={"id":"data/TW/基隆市/信義區","key":"信義區","lang":"zh-hant","lname":"Sinyi District","zip":"201"}
+data/TW/基隆市/安樂區={"id":"data/TW/基隆市/安樂區","key":"安樂區","lang":"zh-hant","lname":"Anle District","zip":"204"}
+data/TW/基隆市/暖暖區={"id":"data/TW/基隆市/暖暖區","key":"暖暖區","lang":"zh-hant","lname":"Nuannuan District","zip":"205"}
+data/TW/宜蘭縣={"id":"data/TW/宜蘭縣","key":"宜蘭縣","lang":"zh-hant","lname":"Yilan County","zip":"2[67]","zipex":"260,272","isoid":"ILA","sub_keys":"三星鄉~大同鄉~五結鄉~冬山鄉~壯圍鄉~宜蘭市~南澳鄉~員山鄉~頭城鎮~礁溪鄉~羅東鎮~蘇澳鎮","sub_lnames":"Sansing Township~Datong Township~Wujie Township~Dongshan Township~Jhuangwei Township~Yilan City~Nan-ao Township~Yuanshan Township~Toucheng Township~Jiaosi Township~Luodong Township~Su-ao Township","sub_zips":"266~267~268~269~263~260~272~264~261~262~265~270"}
+data/TW/宜蘭縣/三星鄉={"id":"data/TW/宜蘭縣/三星鄉","key":"三星鄉","lang":"zh-hant","lname":"Sansing Township","zip":"266"}
+data/TW/宜蘭縣/五結鄉={"id":"data/TW/宜蘭縣/五結鄉","key":"五結鄉","lang":"zh-hant","lname":"Wujie Township","zip":"268"}
+data/TW/宜蘭縣/冬山鄉={"id":"data/TW/宜蘭縣/冬山鄉","key":"冬山鄉","lang":"zh-hant","lname":"Dongshan Township","zip":"269"}
+data/TW/宜蘭縣/南澳鄉={"id":"data/TW/宜蘭縣/南澳鄉","key":"南澳鄉","lang":"zh-hant","lname":"Nan-ao Township","zip":"272"}
+data/TW/宜蘭縣/員山鄉={"id":"data/TW/宜蘭縣/員山鄉","key":"員山鄉","lang":"zh-hant","lname":"Yuanshan Township","zip":"264"}
+data/TW/宜蘭縣/壯圍鄉={"id":"data/TW/宜蘭縣/壯圍鄉","key":"壯圍鄉","lang":"zh-hant","lname":"Jhuangwei Township","zip":"263"}
+data/TW/宜蘭縣/大同鄉={"id":"data/TW/宜蘭縣/大同鄉","key":"大同鄉","lang":"zh-hant","lname":"Datong Township","zip":"267"}
+data/TW/宜蘭縣/宜蘭市={"id":"data/TW/宜蘭縣/宜蘭市","key":"宜蘭市","lang":"zh-hant","lname":"Yilan City","zip":"260"}
+data/TW/宜蘭縣/礁溪鄉={"id":"data/TW/宜蘭縣/礁溪鄉","key":"礁溪鄉","lang":"zh-hant","lname":"Jiaosi Township","zip":"262"}
+data/TW/宜蘭縣/羅東鎮={"id":"data/TW/宜蘭縣/羅東鎮","key":"羅東鎮","lang":"zh-hant","lname":"Luodong Township","zip":"265"}
+data/TW/宜蘭縣/蘇澳鎮={"id":"data/TW/宜蘭縣/蘇澳鎮","key":"蘇澳鎮","lang":"zh-hant","lname":"Su-ao Township","zip":"270"}
+data/TW/宜蘭縣/頭城鎮={"id":"data/TW/宜蘭縣/頭城鎮","key":"頭城鎮","lang":"zh-hant","lname":"Toucheng Township","zip":"261"}
+data/TW/屏東縣={"id":"data/TW/屏東縣","key":"屏東縣","lang":"zh-hant","lname":"Pingtung County","zip":"9[0-4]","zipex":"900,947","isoid":"PIF","sub_keys":"九如鄉~三地門鄉~內埔鄉~竹田鄉~牡丹鄉~車城鄉~里港鄉~佳冬鄉~來義鄉~東港鎮~枋山鄉~枋寮鄉~林邊鄉~長治鄉~南州鄉~屏東市~恆春鎮~春日鄉~崁頂鄉~泰武鄉~琉球鄉~高樹鄉~新埤鄉~新園鄉~獅子鄉~萬丹鄉~萬巒鄉~滿洲鄉~瑪家鄉~潮州鎮~霧台鄉~麟洛鄉~鹽埔鄉","sub_lnames":"Jiouru Township~Sandimen Township~Neipu Township~Jhutian Township~Mudan Township~Checheng Township~Ligang Township~Jiadong Township~Laiyi Township~Donggang Township~Fangshan Township~Fangliao Township~Linbian Township~Changjhih Township~Nanjhou Township~Pingtung City~Hengchun Township~Chunrih Township~Kanding Township~Taiwu Township~Liouciou Township~Gaoshu Township~Sinpi Township~Sinyuan Township~Shihzih Township~Wandan Township~Wanluan Township~Manjhou Township~Majia Township~Chaojhou Township~Wutai Township~Linluo Township~Yanpu Township","sub_zips":"904~901~912~911~945~944~905~931~922~928~941~940~927~908~926~900~946~942~924~921~929~906~925~932~943~913~923~947~903~920~902~909~907"}
+data/TW/屏東縣/三地門鄉={"id":"data/TW/屏東縣/三地門鄉","key":"三地門鄉","lang":"zh-hant","lname":"Sandimen Township","zip":"901"}
+data/TW/屏東縣/九如鄉={"id":"data/TW/屏東縣/九如鄉","key":"九如鄉","lang":"zh-hant","lname":"Jiouru Township","zip":"904"}
+data/TW/屏東縣/佳冬鄉={"id":"data/TW/屏東縣/佳冬鄉","key":"佳冬鄉","lang":"zh-hant","lname":"Jiadong Township","zip":"931"}
+data/TW/屏東縣/來義鄉={"id":"data/TW/屏東縣/來義鄉","key":"來義鄉","lang":"zh-hant","lname":"Laiyi Township","zip":"922"}
+data/TW/屏東縣/內埔鄉={"id":"data/TW/屏東縣/內埔鄉","key":"內埔鄉","lang":"zh-hant","lname":"Neipu Township","zip":"912"}
+data/TW/屏東縣/南州鄉={"id":"data/TW/屏東縣/南州鄉","key":"南州鄉","lang":"zh-hant","lname":"Nanjhou Township","zip":"926"}
+data/TW/屏東縣/屏東市={"id":"data/TW/屏東縣/屏東市","key":"屏東市","lang":"zh-hant","lname":"Pingtung City","zip":"900"}
+data/TW/屏東縣/崁頂鄉={"id":"data/TW/屏東縣/崁頂鄉","key":"崁頂鄉","lang":"zh-hant","lname":"Kanding Township","zip":"924"}
+data/TW/屏東縣/恆春鎮={"id":"data/TW/屏東縣/恆春鎮","key":"恆春鎮","lang":"zh-hant","lname":"Hengchun Township","zip":"946"}
+data/TW/屏東縣/新園鄉={"id":"data/TW/屏東縣/新園鄉","key":"新園鄉","lang":"zh-hant","lname":"Sinyuan Township","zip":"932"}
+data/TW/屏東縣/新埤鄉={"id":"data/TW/屏東縣/新埤鄉","key":"新埤鄉","lang":"zh-hant","lname":"Sinpi Township","zip":"925"}
+data/TW/屏東縣/春日鄉={"id":"data/TW/屏東縣/春日鄉","key":"春日鄉","lang":"zh-hant","lname":"Chunrih Township","zip":"942"}
+data/TW/屏東縣/東港鎮={"id":"data/TW/屏東縣/東港鎮","key":"東港鎮","lang":"zh-hant","lname":"Donggang Township","zip":"928"}
+data/TW/屏東縣/枋寮鄉={"id":"data/TW/屏東縣/枋寮鄉","key":"枋寮鄉","lang":"zh-hant","lname":"Fangliao Township","zip":"940"}
+data/TW/屏東縣/枋山鄉={"id":"data/TW/屏東縣/枋山鄉","key":"枋山鄉","lang":"zh-hant","lname":"Fangshan Township","zip":"941"}
+data/TW/屏東縣/林邊鄉={"id":"data/TW/屏東縣/林邊鄉","key":"林邊鄉","lang":"zh-hant","lname":"Linbian Township","zip":"927"}
+data/TW/屏東縣/泰武鄉={"id":"data/TW/屏東縣/泰武鄉","key":"泰武鄉","lang":"zh-hant","lname":"Taiwu Township","zip":"921"}
+data/TW/屏東縣/滿洲鄉={"id":"data/TW/屏東縣/滿洲鄉","key":"滿洲鄉","lang":"zh-hant","lname":"Manjhou Township","zip":"947"}
+data/TW/屏東縣/潮州鎮={"id":"data/TW/屏東縣/潮州鎮","key":"潮州鎮","lang":"zh-hant","lname":"Chaojhou Township","zip":"920"}
+data/TW/屏東縣/牡丹鄉={"id":"data/TW/屏東縣/牡丹鄉","key":"牡丹鄉","lang":"zh-hant","lname":"Mudan Township","zip":"945"}
+data/TW/屏東縣/獅子鄉={"id":"data/TW/屏東縣/獅子鄉","key":"獅子鄉","lang":"zh-hant","lname":"Shihzih Township","zip":"943"}
+data/TW/屏東縣/琉球鄉={"id":"data/TW/屏東縣/琉球鄉","key":"琉球鄉","lang":"zh-hant","lname":"Liouciou Township","zip":"929"}
+data/TW/屏東縣/瑪家鄉={"id":"data/TW/屏東縣/瑪家鄉","key":"瑪家鄉","lang":"zh-hant","lname":"Majia Township","zip":"903"}
+data/TW/屏東縣/竹田鄉={"id":"data/TW/屏東縣/竹田鄉","key":"竹田鄉","lang":"zh-hant","lname":"Jhutian Township","zip":"911"}
+data/TW/屏東縣/萬丹鄉={"id":"data/TW/屏東縣/萬丹鄉","key":"萬丹鄉","lang":"zh-hant","lname":"Wandan Township","zip":"913"}
+data/TW/屏東縣/萬巒鄉={"id":"data/TW/屏東縣/萬巒鄉","key":"萬巒鄉","lang":"zh-hant","lname":"Wanluan Township","zip":"923"}
+data/TW/屏東縣/車城鄉={"id":"data/TW/屏東縣/車城鄉","key":"車城鄉","lang":"zh-hant","lname":"Checheng Township","zip":"944"}
+data/TW/屏東縣/里港鄉={"id":"data/TW/屏東縣/里港鄉","key":"里港鄉","lang":"zh-hant","lname":"Ligang Township","zip":"905"}
+data/TW/屏東縣/長治鄉={"id":"data/TW/屏東縣/長治鄉","key":"長治鄉","lang":"zh-hant","lname":"Changjhih Township","zip":"908"}
+data/TW/屏東縣/霧台鄉={"id":"data/TW/屏東縣/霧台鄉","key":"霧台鄉","lang":"zh-hant","lname":"Wutai Township","zip":"902"}
+data/TW/屏東縣/高樹鄉={"id":"data/TW/屏東縣/高樹鄉","key":"高樹鄉","lang":"zh-hant","lname":"Gaoshu Township","zip":"906"}
+data/TW/屏東縣/鹽埔鄉={"id":"data/TW/屏東縣/鹽埔鄉","key":"鹽埔鄉","lang":"zh-hant","lname":"Yanpu Township","zip":"907"}
+data/TW/屏東縣/麟洛鄉={"id":"data/TW/屏東縣/麟洛鄉","key":"麟洛鄉","lang":"zh-hant","lname":"Linluo Township","zip":"909"}
+data/TW/彰化縣={"id":"data/TW/彰化縣","key":"彰化縣","lang":"zh-hant","lname":"Changhua County","zip":"5[0123]","zipex":"500,530","isoid":"CHA","sub_keys":"二水鄉~二林鎮~大村鄉~大城鄉~北斗鎮~永靖鄉~田中鎮~田尾鄉~竹塘鄉~伸港鄉~秀水鄉~和美鎮~社頭鄉~芬園鄉~花壇鄉~芳苑鄉~員林鎮~埔心鄉~埔鹽鄉~埤頭鄉~鹿港鎮~溪州鄉~溪湖鎮~彰化市~福興鄉~線西鄉","sub_lnames":"Ershuei Township~Erlin Township~Dacun Township~Dacheng Township~Beidou Township~Yongjing Township~Tianjhong Township~Tianwei Township~Jhutang Township~Shengang Township~Sioushuei Township~Hemei Township~Shetou Township~Fenyuan Township~Huatan Township~Fangyuan Township~Yuanlin Township~Pusin Township~Puyan Township~Pitou Township~Lugang Township~Sijhou Township~Sihu Township~Changhua City~Fusing Township~Siansi Township","sub_zips":"530~526~515~527~521~512~520~522~525~509~504~508~511~502~503~528~510~513~516~523~505~524~514~500~506~507"}
+data/TW/彰化縣/二林鎮={"id":"data/TW/彰化縣/二林鎮","key":"二林鎮","lang":"zh-hant","lname":"Erlin Township","zip":"526"}
+data/TW/彰化縣/二水鄉={"id":"data/TW/彰化縣/二水鄉","key":"二水鄉","lang":"zh-hant","lname":"Ershuei Township","zip":"530"}
+data/TW/彰化縣/伸港鄉={"id":"data/TW/彰化縣/伸港鄉","key":"伸港鄉","lang":"zh-hant","lname":"Shengang Township","zip":"509"}
+data/TW/彰化縣/北斗鎮={"id":"data/TW/彰化縣/北斗鎮","key":"北斗鎮","lang":"zh-hant","lname":"Beidou Township","zip":"521"}
+data/TW/彰化縣/和美鎮={"id":"data/TW/彰化縣/和美鎮","key":"和美鎮","lang":"zh-hant","lname":"Hemei Township","zip":"508"}
+data/TW/彰化縣/員林鎮={"id":"data/TW/彰化縣/員林鎮","key":"員林鎮","lang":"zh-hant","lname":"Yuanlin Township","zip":"510"}
+data/TW/彰化縣/埔心鄉={"id":"data/TW/彰化縣/埔心鄉","key":"埔心鄉","lang":"zh-hant","lname":"Pusin Township","zip":"513"}
+data/TW/彰化縣/埔鹽鄉={"id":"data/TW/彰化縣/埔鹽鄉","key":"埔鹽鄉","lang":"zh-hant","lname":"Puyan Township","zip":"516"}
+data/TW/彰化縣/埤頭鄉={"id":"data/TW/彰化縣/埤頭鄉","key":"埤頭鄉","lang":"zh-hant","lname":"Pitou Township","zip":"523"}
+data/TW/彰化縣/大城鄉={"id":"data/TW/彰化縣/大城鄉","key":"大城鄉","lang":"zh-hant","lname":"Dacheng Township","zip":"527"}
+data/TW/彰化縣/大村鄉={"id":"data/TW/彰化縣/大村鄉","key":"大村鄉","lang":"zh-hant","lname":"Dacun Township","zip":"515"}
+data/TW/彰化縣/彰化市={"id":"data/TW/彰化縣/彰化市","key":"彰化市","lang":"zh-hant","lname":"Changhua City","zip":"500"}
+data/TW/彰化縣/永靖鄉={"id":"data/TW/彰化縣/永靖鄉","key":"永靖鄉","lang":"zh-hant","lname":"Yongjing Township","zip":"512"}
+data/TW/彰化縣/溪州鄉={"id":"data/TW/彰化縣/溪州鄉","key":"溪州鄉","lang":"zh-hant","lname":"Sijhou Township","zip":"524"}
+data/TW/彰化縣/溪湖鎮={"id":"data/TW/彰化縣/溪湖鎮","key":"溪湖鎮","lang":"zh-hant","lname":"Sihu Township","zip":"514"}
+data/TW/彰化縣/田中鎮={"id":"data/TW/彰化縣/田中鎮","key":"田中鎮","lang":"zh-hant","lname":"Tianjhong Township","zip":"520"}
+data/TW/彰化縣/田尾鄉={"id":"data/TW/彰化縣/田尾鄉","key":"田尾鄉","lang":"zh-hant","lname":"Tianwei Township","zip":"522"}
+data/TW/彰化縣/社頭鄉={"id":"data/TW/彰化縣/社頭鄉","key":"社頭鄉","lang":"zh-hant","lname":"Shetou Township","zip":"511"}
+data/TW/彰化縣/福興鄉={"id":"data/TW/彰化縣/福興鄉","key":"福興鄉","lang":"zh-hant","lname":"Fusing Township","zip":"506"}
+data/TW/彰化縣/秀水鄉={"id":"data/TW/彰化縣/秀水鄉","key":"秀水鄉","lang":"zh-hant","lname":"Sioushuei Township","zip":"504"}
+data/TW/彰化縣/竹塘鄉={"id":"data/TW/彰化縣/竹塘鄉","key":"竹塘鄉","lang":"zh-hant","lname":"Jhutang Township","zip":"525"}
+data/TW/彰化縣/線西鄉={"id":"data/TW/彰化縣/線西鄉","key":"線西鄉","lang":"zh-hant","lname":"Siansi Township","zip":"507"}
+data/TW/彰化縣/芬園鄉={"id":"data/TW/彰化縣/芬園鄉","key":"芬園鄉","lang":"zh-hant","lname":"Fenyuan Township","zip":"502"}
+data/TW/彰化縣/花壇鄉={"id":"data/TW/彰化縣/花壇鄉","key":"花壇鄉","lang":"zh-hant","lname":"Huatan Township","zip":"503"}
+data/TW/彰化縣/芳苑鄉={"id":"data/TW/彰化縣/芳苑鄉","key":"芳苑鄉","lang":"zh-hant","lname":"Fangyuan Township","zip":"528"}
+data/TW/彰化縣/鹿港鎮={"id":"data/TW/彰化縣/鹿港鎮","key":"鹿港鎮","lang":"zh-hant","lname":"Lugang Township","zip":"505"}
+data/TW/新北市={"id":"data/TW/新北市","key":"新北市","lang":"zh-hant","lname":"New Taipei City","zip":"20[78]|2[2345]","zipex":"207,208:220,253","isoid":"TPQ","sub_keys":"八里區~三芝區~三重區~三峽區~土城區~中和區~五股區~平溪區~永和區~石門區~石碇區~汐止區~坪林區~板橋區~林口區~金山區~泰山區~烏來區~貢寮區~淡水區~深坑區~新店區~新莊區~瑞芳區~萬里區~樹林區~雙溪區~蘆洲區~鶯歌區","sub_lnames":"Bali District~Sanjhih District~Sanchong District~Sansia District~Tucheng District~Jhonghe District~Wugu District~Pingsi District~Yonghe District~Shihmen District~Shihding District~Sijhih District~Pinglin District~Banciao District~Linkou District~Jinshan District~Taishan District~Wulai District~Gongliao District~Danshuei District~Shenkeng District~Sindian District~Sinjhuang District~Rueifang District~Wanli District~Shulin District~Shuangsi District~Lujhou District~Yingge District","sub_zips":"249~252~241~237~236~235~248~226~234~253~223~221~232~220~244~208~243~233~228~251~222~231~242~224~207~238~227~247~239"}
+data/TW/新北市/三峽區={"id":"data/TW/新北市/三峽區","key":"三峽區","lang":"zh-hant","lname":"Sansia District","zip":"237"}
+data/TW/新北市/三芝區={"id":"data/TW/新北市/三芝區","key":"三芝區","lang":"zh-hant","lname":"Sanjhih District","zip":"252"}
+data/TW/新北市/三重區={"id":"data/TW/新北市/三重區","key":"三重區","lang":"zh-hant","lname":"Sanchong District","zip":"241"}
+data/TW/新北市/中和區={"id":"data/TW/新北市/中和區","key":"中和區","lang":"zh-hant","lname":"Jhonghe District","zip":"235"}
+data/TW/新北市/五股區={"id":"data/TW/新北市/五股區","key":"五股區","lang":"zh-hant","lname":"Wugu District","zip":"248"}
+data/TW/新北市/八里區={"id":"data/TW/新北市/八里區","key":"八里區","lang":"zh-hant","lname":"Bali District","zip":"249"}
+data/TW/新北市/土城區={"id":"data/TW/新北市/土城區","key":"土城區","lang":"zh-hant","lname":"Tucheng District","zip":"236"}
+data/TW/新北市/坪林區={"id":"data/TW/新北市/坪林區","key":"坪林區","lang":"zh-hant","lname":"Pinglin District","zip":"232"}
+data/TW/新北市/平溪區={"id":"data/TW/新北市/平溪區","key":"平溪區","lang":"zh-hant","lname":"Pingsi District","zip":"226"}
+data/TW/新北市/新店區={"id":"data/TW/新北市/新店區","key":"新店區","lang":"zh-hant","lname":"Sindian District","zip":"231"}
+data/TW/新北市/新莊區={"id":"data/TW/新北市/新莊區","key":"新莊區","lang":"zh-hant","lname":"Sinjhuang District","zip":"242"}
+data/TW/新北市/板橋區={"id":"data/TW/新北市/板橋區","key":"板橋區","lang":"zh-hant","lname":"Banciao District","zip":"220"}
+data/TW/新北市/林口區={"id":"data/TW/新北市/林口區","key":"林口區","lang":"zh-hant","lname":"Linkou District","zip":"244"}
+data/TW/新北市/樹林區={"id":"data/TW/新北市/樹林區","key":"樹林區","lang":"zh-hant","lname":"Shulin District","zip":"238"}
+data/TW/新北市/永和區={"id":"data/TW/新北市/永和區","key":"永和區","lang":"zh-hant","lname":"Yonghe District","zip":"234"}
+data/TW/新北市/汐止區={"id":"data/TW/新北市/汐止區","key":"汐止區","lang":"zh-hant","lname":"Sijhih District","zip":"221"}
+data/TW/新北市/泰山區={"id":"data/TW/新北市/泰山區","key":"泰山區","lang":"zh-hant","lname":"Taishan District","zip":"243"}
+data/TW/新北市/淡水區={"id":"data/TW/新北市/淡水區","key":"淡水區","lang":"zh-hant","lname":"Danshuei District","zip":"251"}
+data/TW/新北市/深坑區={"id":"data/TW/新北市/深坑區","key":"深坑區","lang":"zh-hant","lname":"Shenkeng District","zip":"222"}
+data/TW/新北市/烏來區={"id":"data/TW/新北市/烏來區","key":"烏來區","lang":"zh-hant","lname":"Wulai District","zip":"233"}
+data/TW/新北市/瑞芳區={"id":"data/TW/新北市/瑞芳區","key":"瑞芳區","lang":"zh-hant","lname":"Rueifang District","zip":"224"}
+data/TW/新北市/石碇區={"id":"data/TW/新北市/石碇區","key":"石碇區","lang":"zh-hant","lname":"Shihding District","zip":"223"}
+data/TW/新北市/石門區={"id":"data/TW/新北市/石門區","key":"石門區","lang":"zh-hant","lname":"Shihmen District","zip":"253"}
+data/TW/新北市/萬里區={"id":"data/TW/新北市/萬里區","key":"萬里區","lang":"zh-hant","lname":"Wanli District","zip":"207"}
+data/TW/新北市/蘆洲區={"id":"data/TW/新北市/蘆洲區","key":"蘆洲區","lang":"zh-hant","lname":"Lujhou District","zip":"247"}
+data/TW/新北市/貢寮區={"id":"data/TW/新北市/貢寮區","key":"貢寮區","lang":"zh-hant","lname":"Gongliao District","zip":"228"}
+data/TW/新北市/金山區={"id":"data/TW/新北市/金山區","key":"金山區","lang":"zh-hant","lname":"Jinshan District","zip":"208"}
+data/TW/新北市/雙溪區={"id":"data/TW/新北市/雙溪區","key":"雙溪區","lang":"zh-hant","lname":"Shuangsi District","zip":"227"}
+data/TW/新北市/鶯歌區={"id":"data/TW/新北市/鶯歌區","key":"鶯歌區","lang":"zh-hant","lname":"Yingge District","zip":"239"}
+data/TW/新竹市={"id":"data/TW/新竹市","key":"新竹市","lang":"zh-hant","lname":"Hsinchu City","zip":"300","isoid":"HSZ"}
+data/TW/新竹縣={"id":"data/TW/新竹縣","key":"新竹縣","lang":"zh-hant","lname":"Hsinchu County","zip":"30[2-8]|31","zipex":"302,315","isoid":"HSQ","sub_keys":"五峰鄉~北埔鄉~尖石鄉~竹北市~竹東鎮~芎林鄉~峨眉鄉~湖口鄉~新埔鎮~新豐鄉~橫山鄉~關西鎮~寶山鄉","sub_lnames":"Wufong Township~Beipu Township~Jianshih Township~Jhubei City~Jhudong Township~Cyonglin Township~Emei Township~Hukou Township~Sinpu Township~Sinfong Township~Hengshan Township~Guansi Township~Baoshan Township","sub_zips":"311~314~313~302~310~307~315~303~305~304~312~306~308"}
+data/TW/新竹縣/五峰鄉={"id":"data/TW/新竹縣/五峰鄉","key":"五峰鄉","lang":"zh-hant","lname":"Wufong Township","zip":"311"}
+data/TW/新竹縣/北埔鄉={"id":"data/TW/新竹縣/北埔鄉","key":"北埔鄉","lang":"zh-hant","lname":"Beipu Township","zip":"314"}
+data/TW/新竹縣/寶山鄉={"id":"data/TW/新竹縣/寶山鄉","key":"寶山鄉","lang":"zh-hant","lname":"Baoshan Township","zip":"308"}
+data/TW/新竹縣/尖石鄉={"id":"data/TW/新竹縣/尖石鄉","key":"尖石鄉","lang":"zh-hant","lname":"Jianshih Township","zip":"313"}
+data/TW/新竹縣/峨眉鄉={"id":"data/TW/新竹縣/峨眉鄉","key":"峨眉鄉","lang":"zh-hant","lname":"Emei Township","zip":"315"}
+data/TW/新竹縣/新埔鎮={"id":"data/TW/新竹縣/新埔鎮","key":"新埔鎮","lang":"zh-hant","lname":"Sinpu Township","zip":"305"}
+data/TW/新竹縣/新豐鄉={"id":"data/TW/新竹縣/新豐鄉","key":"新豐鄉","lang":"zh-hant","lname":"Sinfong Township","zip":"304"}
+data/TW/新竹縣/橫山鄉={"id":"data/TW/新竹縣/橫山鄉","key":"橫山鄉","lang":"zh-hant","lname":"Hengshan Township","zip":"312"}
+data/TW/新竹縣/湖口鄉={"id":"data/TW/新竹縣/湖口鄉","key":"湖口鄉","lang":"zh-hant","lname":"Hukou Township","zip":"303"}
+data/TW/新竹縣/竹北市={"id":"data/TW/新竹縣/竹北市","key":"竹北市","lang":"zh-hant","lname":"Jhubei City","zip":"302"}
+data/TW/新竹縣/竹東鎮={"id":"data/TW/新竹縣/竹東鎮","key":"竹東鎮","lang":"zh-hant","lname":"Jhudong Township","zip":"310"}
+data/TW/新竹縣/芎林鄉={"id":"data/TW/新竹縣/芎林鄉","key":"芎林鄉","lang":"zh-hant","lname":"Cyonglin Township","zip":"307"}
+data/TW/新竹縣/關西鎮={"id":"data/TW/新竹縣/關西鎮","key":"關西鎮","lang":"zh-hant","lname":"Guansi Township","zip":"306"}
+data/TW/桃園縣={"id":"data/TW/桃園縣","key":"桃園縣","lang":"zh-hant","lname":"Taoyuan County","zip":"3[23]","zipex":"320,338","isoid":"TAO","sub_keys":"八德市~大園鄉~大溪鎮~中壢市~平鎮市~桃園市~復興鄉~新屋鄉~楊梅鎮~龍潭鄉~龜山鄉~蘆竹鄉~觀音鄉","sub_lnames":"Bade City~Dayuan Township~Dasi Township~Jhongli City~Pingjhen City~Taoyuan City~Fusing Township~Sinwu Township~Yangmei Township~Longtan Township~Gueishan Township~Lujhu Township~Guanyin Township","sub_zips":"334~337~335~320~324~330~336~327~326~325~333~338~328"}
+data/TW/桃園縣/中壢市={"id":"data/TW/桃園縣/中壢市","key":"中壢市","lang":"zh-hant","lname":"Jhongli City","zip":"320"}
+data/TW/桃園縣/八德市={"id":"data/TW/桃園縣/八德市","key":"八德市","lang":"zh-hant","lname":"Bade City","zip":"334"}
+data/TW/桃園縣/大園鄉={"id":"data/TW/桃園縣/大園鄉","key":"大園鄉","lang":"zh-hant","lname":"Dayuan Township","zip":"337"}
+data/TW/桃園縣/大溪鎮={"id":"data/TW/桃園縣/大溪鎮","key":"大溪鎮","lang":"zh-hant","lname":"Dasi Township","zip":"335"}
+data/TW/桃園縣/平鎮市={"id":"data/TW/桃園縣/平鎮市","key":"平鎮市","lang":"zh-hant","lname":"Pingjhen City","zip":"324"}
+data/TW/桃園縣/復興鄉={"id":"data/TW/桃園縣/復興鄉","key":"復興鄉","lang":"zh-hant","lname":"Fusing Township","zip":"336"}
+data/TW/桃園縣/新屋鄉={"id":"data/TW/桃園縣/新屋鄉","key":"新屋鄉","lang":"zh-hant","lname":"Sinwu Township","zip":"327"}
+data/TW/桃園縣/桃園市={"id":"data/TW/桃園縣/桃園市","key":"桃園市","lang":"zh-hant","lname":"Taoyuan City","zip":"330"}
+data/TW/桃園縣/楊梅鎮={"id":"data/TW/桃園縣/楊梅鎮","key":"楊梅鎮","lang":"zh-hant","lname":"Yangmei Township","zip":"326"}
+data/TW/桃園縣/蘆竹鄉={"id":"data/TW/桃園縣/蘆竹鄉","key":"蘆竹鄉","lang":"zh-hant","lname":"Lujhu Township","zip":"338"}
+data/TW/桃園縣/觀音鄉={"id":"data/TW/桃園縣/觀音鄉","key":"觀音鄉","lang":"zh-hant","lname":"Guanyin Township","zip":"328"}
+data/TW/桃園縣/龍潭鄉={"id":"data/TW/桃園縣/龍潭鄉","key":"龍潭鄉","lang":"zh-hant","lname":"Longtan Township","zip":"325"}
+data/TW/桃園縣/龜山鄉={"id":"data/TW/桃園縣/龜山鄉","key":"龜山鄉","lang":"zh-hant","lname":"Gueishan Township","zip":"333"}
+data/TW/澎湖縣={"id":"data/TW/澎湖縣","key":"澎湖縣","lang":"zh-hant","lname":"Penghu County","zip":"88","zipex":"880,885","isoid":"PEN","sub_keys":"七美鄉~白沙鄉~西嶼鄉~馬公市~望安鄉~湖西鄉","sub_lnames":"Cimei Township~Baisha Township~Siyu Township~Magong City~Wang-an Township~Husi Township","sub_zips":"883~884~881~880~882~885"}
+data/TW/澎湖縣/七美鄉={"id":"data/TW/澎湖縣/七美鄉","key":"七美鄉","lang":"zh-hant","lname":"Cimei Township","zip":"883"}
+data/TW/澎湖縣/望安鄉={"id":"data/TW/澎湖縣/望安鄉","key":"望安鄉","lang":"zh-hant","lname":"Wang-an Township","zip":"882"}
+data/TW/澎湖縣/湖西鄉={"id":"data/TW/澎湖縣/湖西鄉","key":"湖西鄉","lang":"zh-hant","lname":"Husi Township","zip":"885"}
+data/TW/澎湖縣/白沙鄉={"id":"data/TW/澎湖縣/白沙鄉","key":"白沙鄉","lang":"zh-hant","lname":"Baisha Township","zip":"884"}
+data/TW/澎湖縣/西嶼鄉={"id":"data/TW/澎湖縣/西嶼鄉","key":"西嶼鄉","lang":"zh-hant","lname":"Siyu Township","zip":"881"}
+data/TW/澎湖縣/馬公市={"id":"data/TW/澎湖縣/馬公市","key":"馬公市","lang":"zh-hant","lname":"Magong City","zip":"880"}
+data/TW/花蓮縣={"id":"data/TW/花蓮縣","key":"花蓮縣","lang":"zh-hant","lname":"Hualien County","zip":"9[78]","zipex":"970,983","isoid":"HUA","sub_keys":"玉里鎮~光復鄉~吉安鄉~秀林鄉~卓溪鄉~花蓮市~富里鄉~新城鄉~瑞穗鄉~萬榮鄉~壽豐鄉~鳳林鎮~豐濱鄉","sub_lnames":"Yuli Township~Guangfu Township~Ji-an Township~Sioulin Township~Jhuosi Township~Hualien City~Fuli Township~Sincheng Township~Rueisuei Township~Wanrong Township~Shoufong Township~Fonglin Township~Fongbin Township","sub_zips":"981~976~973~972~982~970~983~971~978~979~974~975~977"}
+data/TW/花蓮縣/光復鄉={"id":"data/TW/花蓮縣/光復鄉","key":"光復鄉","lang":"zh-hant","lname":"Guangfu Township","zip":"976"}
+data/TW/花蓮縣/卓溪鄉={"id":"data/TW/花蓮縣/卓溪鄉","key":"卓溪鄉","lang":"zh-hant","lname":"Jhuosi Township","zip":"982"}
+data/TW/花蓮縣/吉安鄉={"id":"data/TW/花蓮縣/吉安鄉","key":"吉安鄉","lang":"zh-hant","lname":"Ji-an Township","zip":"973"}
+data/TW/花蓮縣/壽豐鄉={"id":"data/TW/花蓮縣/壽豐鄉","key":"壽豐鄉","lang":"zh-hant","lname":"Shoufong Township","zip":"974"}
+data/TW/花蓮縣/富里鄉={"id":"data/TW/花蓮縣/富里鄉","key":"富里鄉","lang":"zh-hant","lname":"Fuli Township","zip":"983"}
+data/TW/花蓮縣/新城鄉={"id":"data/TW/花蓮縣/新城鄉","key":"新城鄉","lang":"zh-hant","lname":"Sincheng Township","zip":"971"}
+data/TW/花蓮縣/玉里鎮={"id":"data/TW/花蓮縣/玉里鎮","key":"玉里鎮","lang":"zh-hant","lname":"Yuli Township","zip":"981"}
+data/TW/花蓮縣/瑞穗鄉={"id":"data/TW/花蓮縣/瑞穗鄉","key":"瑞穗鄉","lang":"zh-hant","lname":"Rueisuei Township","zip":"978"}
+data/TW/花蓮縣/秀林鄉={"id":"data/TW/花蓮縣/秀林鄉","key":"秀林鄉","lang":"zh-hant","lname":"Sioulin Township","zip":"972"}
+data/TW/花蓮縣/花蓮市={"id":"data/TW/花蓮縣/花蓮市","key":"花蓮市","lang":"zh-hant","lname":"Hualien City","zip":"970"}
+data/TW/花蓮縣/萬榮鄉={"id":"data/TW/花蓮縣/萬榮鄉","key":"萬榮鄉","lang":"zh-hant","lname":"Wanrong Township","zip":"979"}
+data/TW/花蓮縣/豐濱鄉={"id":"data/TW/花蓮縣/豐濱鄉","key":"豐濱鄉","lang":"zh-hant","lname":"Fongbin Township","zip":"977"}
+data/TW/花蓮縣/鳳林鎮={"id":"data/TW/花蓮縣/鳳林鎮","key":"鳳林鎮","lang":"zh-hant","lname":"Fonglin Township","zip":"975"}
+data/TW/苗栗縣={"id":"data/TW/苗栗縣","key":"苗栗縣","lang":"zh-hant","lname":"Miaoli County","zip":"3[56]","zipex":"350,369","isoid":"MIA","sub_keys":"三義鄉~三灣鄉~大湖鄉~公館鄉~竹南鎮~西湖鄉~卓蘭鎮~南庄鄉~後龍鎮~苑裡鎮~苗栗市~泰安鄉~通霄鎮~造橋鄉~獅潭鄉~銅鑼鄉~頭份鎮~頭屋鄉","sub_lnames":"Sanyi Township~Sanwan Township~Dahu Township~Gongguan Township~Jhunan Township~Sihu Township~Jhuolan Township~Nanjhuang Township~Houlong Township~Yuanli Township~Miaoli City~Tai-an Township~Tongsiao Township~Zaociao Township~Shihtan Township~Tongluo Township~Toufen Township~Touwu Township","sub_zips":"367~352~364~363~350~368~369~353~356~358~360~365~357~361~354~366~351~362"}
+data/TW/苗栗縣/三灣鄉={"id":"data/TW/苗栗縣/三灣鄉","key":"三灣鄉","lang":"zh-hant","lname":"Sanwan Township","zip":"352"}
+data/TW/苗栗縣/三義鄉={"id":"data/TW/苗栗縣/三義鄉","key":"三義鄉","lang":"zh-hant","lname":"Sanyi Township","zip":"367"}
+data/TW/苗栗縣/公館鄉={"id":"data/TW/苗栗縣/公館鄉","key":"公館鄉","lang":"zh-hant","lname":"Gongguan Township","zip":"363"}
+data/TW/苗栗縣/卓蘭鎮={"id":"data/TW/苗栗縣/卓蘭鎮","key":"卓蘭鎮","lang":"zh-hant","lname":"Jhuolan Township","zip":"369"}
+data/TW/苗栗縣/南庄鄉={"id":"data/TW/苗栗縣/南庄鄉","key":"南庄鄉","lang":"zh-hant","lname":"Nanjhuang Township","zip":"353"}
+data/TW/苗栗縣/大湖鄉={"id":"data/TW/苗栗縣/大湖鄉","key":"大湖鄉","lang":"zh-hant","lname":"Dahu Township","zip":"364"}
+data/TW/苗栗縣/後龍鎮={"id":"data/TW/苗栗縣/後龍鎮","key":"後龍鎮","lang":"zh-hant","lname":"Houlong Township","zip":"356"}
+data/TW/苗栗縣/泰安鄉={"id":"data/TW/苗栗縣/泰安鄉","key":"泰安鄉","lang":"zh-hant","lname":"Tai-an Township","zip":"365"}
+data/TW/苗栗縣/獅潭鄉={"id":"data/TW/苗栗縣/獅潭鄉","key":"獅潭鄉","lang":"zh-hant","lname":"Shihtan Township","zip":"354"}
+data/TW/苗栗縣/竹南鎮={"id":"data/TW/苗栗縣/竹南鎮","key":"竹南鎮","lang":"zh-hant","lname":"Jhunan Township","zip":"350"}
+data/TW/苗栗縣/苑裡鎮={"id":"data/TW/苗栗縣/苑裡鎮","key":"苑裡鎮","lang":"zh-hant","lname":"Yuanli Township","zip":"358"}
+data/TW/苗栗縣/苗栗市={"id":"data/TW/苗栗縣/苗栗市","key":"苗栗市","lang":"zh-hant","lname":"Miaoli City","zip":"360"}
+data/TW/苗栗縣/西湖鄉={"id":"data/TW/苗栗縣/西湖鄉","key":"西湖鄉","lang":"zh-hant","lname":"Sihu Township","zip":"368"}
+data/TW/苗栗縣/通霄鎮={"id":"data/TW/苗栗縣/通霄鎮","key":"通霄鎮","lang":"zh-hant","lname":"Tongsiao Township","zip":"357"}
+data/TW/苗栗縣/造橋鄉={"id":"data/TW/苗栗縣/造橋鄉","key":"造橋鄉","lang":"zh-hant","lname":"Zaociao Township","zip":"361"}
+data/TW/苗栗縣/銅鑼鄉={"id":"data/TW/苗栗縣/銅鑼鄉","key":"銅鑼鄉","lang":"zh-hant","lname":"Tongluo Township","zip":"366"}
+data/TW/苗栗縣/頭份鎮={"id":"data/TW/苗栗縣/頭份鎮","key":"頭份鎮","lang":"zh-hant","lname":"Toufen Township","zip":"351"}
+data/TW/苗栗縣/頭屋鄉={"id":"data/TW/苗栗縣/頭屋鄉","key":"頭屋鄉","lang":"zh-hant","lname":"Touwu Township","zip":"362"}
+data/TW/連江縣={"id":"data/TW/連江縣","key":"連江縣","lang":"zh-hant","lname":"Lienchiang County","zip":"209|21[012]","zipex":"209,212","sub_keys":"北竿鄉~東引鄉~南竿鄉~莒光鄉","sub_lnames":"Beigan Township~Dongyin Township~Nangan Township~Jyuguang Township","sub_zips":"210~212~209~211"}
+data/TW/連江縣/北竿鄉={"id":"data/TW/連江縣/北竿鄉","key":"北竿鄉","lang":"zh-hant","lname":"Beigan Township","zip":"210"}
+data/TW/連江縣/南竿鄉={"id":"data/TW/連江縣/南竿鄉","key":"南竿鄉","lang":"zh-hant","lname":"Nangan Township","zip":"209"}
+data/TW/連江縣/東引鄉={"id":"data/TW/連江縣/東引鄉","key":"東引鄉","lang":"zh-hant","lname":"Dongyin Township","zip":"212"}
+data/TW/連江縣/莒光鄉={"id":"data/TW/連江縣/莒光鄉","key":"莒光鄉","lang":"zh-hant","lname":"Jyuguang Township","zip":"211"}
+data/TW/金門縣={"id":"data/TW/金門縣","key":"金門縣","lang":"zh-hant","lname":"Kinmen County","zip":"89","zipex":"890,896","sub_keys":"金沙鎮~金城鎮~金湖鎮~金寧鄉~烈嶼鄉~烏坵鄉","sub_lnames":"Jinsha Township~Jincheng Township~Jinhu Township~Jinning Township~Lieyu Township~Wuciou Township","sub_zips":"890~893~891~892~894~896"}
+data/TW/金門縣/烈嶼鄉={"id":"data/TW/金門縣/烈嶼鄉","key":"烈嶼鄉","lang":"zh-hant","lname":"Lieyu Township","zip":"894"}
+data/TW/金門縣/烏坵鄉={"id":"data/TW/金門縣/烏坵鄉","key":"烏坵鄉","lang":"zh-hant","lname":"Wuciou Township","zip":"896"}
+data/TW/金門縣/金城鎮={"id":"data/TW/金門縣/金城鎮","key":"金城鎮","lang":"zh-hant","lname":"Jincheng Township","zip":"893"}
+data/TW/金門縣/金寧鄉={"id":"data/TW/金門縣/金寧鄉","key":"金寧鄉","lang":"zh-hant","lname":"Jinning Township","zip":"892"}
+data/TW/金門縣/金沙鎮={"id":"data/TW/金門縣/金沙鎮","key":"金沙鎮","lang":"zh-hant","lname":"Jinsha Township","zip":"890"}
+data/TW/金門縣/金湖鎮={"id":"data/TW/金門縣/金湖鎮","key":"金湖鎮","lang":"zh-hant","lname":"Jinhu Township","zip":"891"}
+data/TW/雲林縣={"id":"data/TW/雲林縣","key":"雲林縣","lang":"zh-hant","lname":"Yunlin County","zip":"6[3-5]","zipex":"630,655","isoid":"YUN","sub_keys":"二崙鄉~口湖鄉~土庫鎮~大埤鄉~元長鄉~斗六市~斗南鎮~水林鄉~北港鎮~古坑鄉~台西鄉~四湖鄉~西螺鎮~東勢鄉~林內鄉~虎尾鎮~崙背鄉~麥寮鄉~莿桐鄉~褒忠鄉","sub_lnames":"Erlun Township~Kouhu Township~Tuku Township~Dapi Township~Yuanchang Township~Douliou City~Dounan Township~Shueilin Township~Beigang Township~Gukeng Township~Taisi Township~Sihhu Township~Siluo Township~Dongshih Township~Linnei Township~Huwei Township~Lunbei Township~Mailiao Township~Cihtong Township~Baojhong Township","sub_zips":"649~653~633~631~655~640~630~652~651~646~636~654~648~635~643~632~637~638~647~634"}
+data/TW/雲林縣/二崙鄉={"id":"data/TW/雲林縣/二崙鄉","key":"二崙鄉","lang":"zh-hant","lname":"Erlun Township","zip":"649"}
+data/TW/雲林縣/元長鄉={"id":"data/TW/雲林縣/元長鄉","key":"元長鄉","lang":"zh-hant","lname":"Yuanchang Township","zip":"655"}
+data/TW/雲林縣/北港鎮={"id":"data/TW/雲林縣/北港鎮","key":"北港鎮","lang":"zh-hant","lname":"Beigang Township","zip":"651"}
+data/TW/雲林縣/口湖鄉={"id":"data/TW/雲林縣/口湖鄉","key":"口湖鄉","lang":"zh-hant","lname":"Kouhu Township","zip":"653"}
+data/TW/雲林縣/古坑鄉={"id":"data/TW/雲林縣/古坑鄉","key":"古坑鄉","lang":"zh-hant","lname":"Gukeng Township","zip":"646"}
+data/TW/雲林縣/台西鄉={"id":"data/TW/雲林縣/台西鄉","key":"台西鄉","lang":"zh-hant","lname":"Taisi Township","zip":"636"}
+data/TW/雲林縣/四湖鄉={"id":"data/TW/雲林縣/四湖鄉","key":"四湖鄉","lang":"zh-hant","lname":"Sihhu Township","zip":"654"}
+data/TW/雲林縣/土庫鎮={"id":"data/TW/雲林縣/土庫鎮","key":"土庫鎮","lang":"zh-hant","lname":"Tuku Township","zip":"633"}
+data/TW/雲林縣/大埤鄉={"id":"data/TW/雲林縣/大埤鄉","key":"大埤鄉","lang":"zh-hant","lname":"Dapi Township","zip":"631"}
+data/TW/雲林縣/崙背鄉={"id":"data/TW/雲林縣/崙背鄉","key":"崙背鄉","lang":"zh-hant","lname":"Lunbei Township","zip":"637"}
+data/TW/雲林縣/斗六市={"id":"data/TW/雲林縣/斗六市","key":"斗六市","lang":"zh-hant","lname":"Douliou City","zip":"640"}
+data/TW/雲林縣/斗南鎮={"id":"data/TW/雲林縣/斗南鎮","key":"斗南鎮","lang":"zh-hant","lname":"Dounan Township","zip":"630"}
+data/TW/雲林縣/東勢鄉={"id":"data/TW/雲林縣/東勢鄉","key":"東勢鄉","lang":"zh-hant","lname":"Dongshih Township","zip":"635"}
+data/TW/雲林縣/林內鄉={"id":"data/TW/雲林縣/林內鄉","key":"林內鄉","lang":"zh-hant","lname":"Linnei Township","zip":"643"}
+data/TW/雲林縣/水林鄉={"id":"data/TW/雲林縣/水林鄉","key":"水林鄉","lang":"zh-hant","lname":"Shueilin Township","zip":"652"}
+data/TW/雲林縣/莿桐鄉={"id":"data/TW/雲林縣/莿桐鄉","key":"莿桐鄉","lang":"zh-hant","lname":"Cihtong Township","zip":"647"}
+data/TW/雲林縣/虎尾鎮={"id":"data/TW/雲林縣/虎尾鎮","key":"虎尾鎮","lang":"zh-hant","lname":"Huwei Township","zip":"632"}
+data/TW/雲林縣/褒忠鄉={"id":"data/TW/雲林縣/褒忠鄉","key":"褒忠鄉","lang":"zh-hant","lname":"Baojhong Township","zip":"634"}
+data/TW/雲林縣/西螺鎮={"id":"data/TW/雲林縣/西螺鎮","key":"西螺鎮","lang":"zh-hant","lname":"Siluo Township","zip":"648"}
+data/TW/雲林縣/麥寮鄉={"id":"data/TW/雲林縣/麥寮鄉","key":"麥寮鄉","lang":"zh-hant","lname":"Mailiao Township","zip":"638"}
+data/TW/高雄市={"id":"data/TW/高雄市","key":"高雄市","lang":"zh-hant","lname":"Kaohsiung City","zip":"8[02-5]|81[1-579]","zipex":"800,815:817,852","isoid":"KHH","sub_keys":"三民區~大社區~大寮區~大樹區~小港區~仁武區~內門區~六龜區~左營區~永安區~田寮區~甲仙區~杉林區~那瑪夏區~岡山區~東沙島~林園區~阿蓮區~前金區~前鎮區~南沙島~美濃區~苓雅區~茂林區~茄萣區~桃源區~梓官區~鳥松區~湖內區~新興區~楠梓區~路竹區~鼓山區~旗山區~旗津區~鳳山區~橋頭區~燕巢區~彌陀區~鹽埕區","sub_lnames":"Sanmin District~Dashe District~Daliao District~Dashu District~Siaogang District~Renwu District~Neimen District~Liouguei District~Zuoying District~Yong-an District~Tianliao District~Jiasian District~Shanlin District~Namaxia District~Gangshan District~Dongsha Island~Linyuan District~Alian District~Cianjin District~Cianjhen District~Nansha Island~Meinong District~Lingya District~Maolin District~Jiading District~Taoyuan District~Zihguan District~Niaosong District~Hunei District~Sinsing District~Nanzih District~Lujhu District~Gushan District~Cishan District~Cijin District~Fongshan District~Ciaotou District~Yanchao District~Mituo District~Yancheng District","sub_zips":"807~815~831~840~812~814~845~844~813~828~823~847~846~849~820~817~832~822~801~806~819~843~802~851~852~848~826~833~829~800~811~821~804~842~805~830~825~824~827~803"}
+data/TW/高雄市/三民區={"id":"data/TW/高雄市/三民區","key":"三民區","lang":"zh-hant","lname":"Sanmin District","zip":"807"}
+data/TW/高雄市/仁武區={"id":"data/TW/高雄市/仁武區","key":"仁武區","lang":"zh-hant","lname":"Renwu District","zip":"814"}
+data/TW/高雄市/內門區={"id":"data/TW/高雄市/內門區","key":"內門區","lang":"zh-hant","lname":"Neimen District","zip":"845"}
+data/TW/高雄市/六龜區={"id":"data/TW/高雄市/六龜區","key":"六龜區","lang":"zh-hant","lname":"Liouguei District","zip":"844"}
+data/TW/高雄市/前金區={"id":"data/TW/高雄市/前金區","key":"前金區","lang":"zh-hant","lname":"Cianjin District","zip":"801"}
+data/TW/高雄市/前鎮區={"id":"data/TW/高雄市/前鎮區","key":"前鎮區","lang":"zh-hant","lname":"Cianjhen District","zip":"806"}
+data/TW/高雄市/南沙島={"id":"data/TW/高雄市/南沙島","key":"南沙島","lang":"zh-hant","lname":"Nansha Island","zip":"819"}
+data/TW/高雄市/大寮區={"id":"data/TW/高雄市/大寮區","key":"大寮區","lang":"zh-hant","lname":"Daliao District","zip":"831"}
+data/TW/高雄市/大樹區={"id":"data/TW/高雄市/大樹區","key":"大樹區","lang":"zh-hant","lname":"Dashu District","zip":"840"}
+data/TW/高雄市/大社區={"id":"data/TW/高雄市/大社區","key":"大社區","lang":"zh-hant","lname":"Dashe District","zip":"815"}
+data/TW/高雄市/小港區={"id":"data/TW/高雄市/小港區","key":"小港區","lang":"zh-hant","lname":"Siaogang District","zip":"812"}
+data/TW/高雄市/岡山區={"id":"data/TW/高雄市/岡山區","key":"岡山區","lang":"zh-hant","lname":"Gangshan District","zip":"820"}
+data/TW/高雄市/左營區={"id":"data/TW/高雄市/左營區","key":"左營區","lang":"zh-hant","lname":"Zuoying District","zip":"813"}
+data/TW/高雄市/彌陀區={"id":"data/TW/高雄市/彌陀區","key":"彌陀區","lang":"zh-hant","lname":"Mituo District","zip":"827"}
+data/TW/高雄市/新興區={"id":"data/TW/高雄市/新興區","key":"新興區","lang":"zh-hant","lname":"Sinsing District","zip":"800"}
+data/TW/高雄市/旗山區={"id":"data/TW/高雄市/旗山區","key":"旗山區","lang":"zh-hant","lname":"Cishan District","zip":"842"}
+data/TW/高雄市/旗津區={"id":"data/TW/高雄市/旗津區","key":"旗津區","lang":"zh-hant","lname":"Cijin District","zip":"805"}
+data/TW/高雄市/杉林區={"id":"data/TW/高雄市/杉林區","key":"杉林區","lang":"zh-hant","lname":"Shanlin District","zip":"846"}
+data/TW/高雄市/東沙島={"id":"data/TW/高雄市/東沙島","key":"東沙島","lang":"zh-hant","lname":"Dongsha Island","zip":"817"}
+data/TW/高雄市/林園區={"id":"data/TW/高雄市/林園區","key":"林園區","lang":"zh-hant","lname":"Linyuan District","zip":"832"}
+data/TW/高雄市/桃源區={"id":"data/TW/高雄市/桃源區","key":"桃源區","lang":"zh-hant","lname":"Taoyuan District","zip":"848"}
+data/TW/高雄市/梓官區={"id":"data/TW/高雄市/梓官區","key":"梓官區","lang":"zh-hant","lname":"Zihguan District","zip":"826"}
+data/TW/高雄市/楠梓區={"id":"data/TW/高雄市/楠梓區","key":"楠梓區","lang":"zh-hant","lname":"Nanzih District","zip":"811"}
+data/TW/高雄市/橋頭區={"id":"data/TW/高雄市/橋頭區","key":"橋頭區","lang":"zh-hant","lname":"Ciaotou District","zip":"825"}
+data/TW/高雄市/永安區={"id":"data/TW/高雄市/永安區","key":"永安區","lang":"zh-hant","lname":"Yong-an District","zip":"828"}
+data/TW/高雄市/湖內區={"id":"data/TW/高雄市/湖內區","key":"湖內區","lang":"zh-hant","lname":"Hunei District","zip":"829"}
+data/TW/高雄市/燕巢區={"id":"data/TW/高雄市/燕巢區","key":"燕巢區","lang":"zh-hant","lname":"Yanchao District","zip":"824"}
+data/TW/高雄市/田寮區={"id":"data/TW/高雄市/田寮區","key":"田寮區","lang":"zh-hant","lname":"Tianliao District","zip":"823"}
+data/TW/高雄市/甲仙區={"id":"data/TW/高雄市/甲仙區","key":"甲仙區","lang":"zh-hant","lname":"Jiasian District","zip":"847"}
+data/TW/高雄市/美濃區={"id":"data/TW/高雄市/美濃區","key":"美濃區","lang":"zh-hant","lname":"Meinong District","zip":"843"}
+data/TW/高雄市/苓雅區={"id":"data/TW/高雄市/苓雅區","key":"苓雅區","lang":"zh-hant","lname":"Lingya District","zip":"802"}
+data/TW/高雄市/茂林區={"id":"data/TW/高雄市/茂林區","key":"茂林區","lang":"zh-hant","lname":"Maolin District","zip":"851"}
+data/TW/高雄市/茄萣區={"id":"data/TW/高雄市/茄萣區","key":"茄萣區","lang":"zh-hant","lname":"Jiading District","zip":"852"}
+data/TW/高雄市/路竹區={"id":"data/TW/高雄市/路竹區","key":"路竹區","lang":"zh-hant","lname":"Lujhu District","zip":"821"}
+data/TW/高雄市/那瑪夏區={"id":"data/TW/高雄市/那瑪夏區","key":"那瑪夏區","lang":"zh-hant","lname":"Namaxia District","zip":"849"}
+data/TW/高雄市/阿蓮區={"id":"data/TW/高雄市/阿蓮區","key":"阿蓮區","lang":"zh-hant","lname":"Alian District","zip":"822"}
+data/TW/高雄市/鳥松區={"id":"data/TW/高雄市/鳥松區","key":"鳥松區","lang":"zh-hant","lname":"Niaosong District","zip":"833"}
+data/TW/高雄市/鳳山區={"id":"data/TW/高雄市/鳳山區","key":"鳳山區","lang":"zh-hant","lname":"Fongshan District","zip":"830"}
+data/TW/高雄市/鹽埕區={"id":"data/TW/高雄市/鹽埕區","key":"鹽埕區","lang":"zh-hant","lname":"Yancheng District","zip":"803"}
+data/TW/高雄市/鼓山區={"id":"data/TW/高雄市/鼓山區","key":"鼓山區","lang":"zh-hant","lname":"Gushan District","zip":"804"}
+data/TZ={"id":"data/TZ","key":"TZ","name":"TANZANIA (UNITED REP.)","zip":"\\d{4}","zipex":"6090"}
+data/UA={"id":"data/UA","key":"UA","name":"UKRAINE","fmt":"%Z %C%n%A%n%O%n%N","zip":"\\d{5}","zipex":"15432,01055,01001","posturl":"http://services.ukrposhta.com/postindex_new/"}
+data/UG={"id":"data/UG","key":"UG","name":"UGANDA"}
+data/UM={"id":"data/UM","key":"UM","name":"UNITED STATES MINOR OUTLYING ISLANDS","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACS","upper":"ACNOS","zipex":"96898","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/US={"id":"data/US","key":"US","name":"UNITED STATES","lang":"en","languages":"en","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"CS","zip":"\\d{5}([ \\-]\\d{4})?","zipex":"95014,22162-1010","posturl":"https://tools.usps.com/go/ZipLookupAction!input.action","zip_name_type":"zip","state_name_type":"state","sub_keys":"AL~AK~AS~AZ~AR~AA~AE~AP~CA~CO~CT~DE~DC~FL~GA~GU~HI~ID~IL~IN~IA~KS~KY~LA~ME~MH~MD~MA~MI~FM~MN~MS~MO~MT~NE~NV~NH~NJ~NM~NY~NC~ND~MP~OH~OK~OR~PW~PA~PR~RI~SC~SD~TN~TX~UT~VT~VI~VA~WA~WV~WI~WY","sub_names":"Alabama~Alaska~American Samoa~Arizona~Arkansas~Armed Forces (AA)~Armed Forces (AE)~Armed Forces (AP)~California~Colorado~Connecticut~Delaware~District of Columbia~Florida~Georgia~Guam~Hawaii~Idaho~Illinois~Indiana~Iowa~Kansas~Kentucky~Louisiana~Maine~Marshall Islands~Maryland~Massachusetts~Michigan~Micronesia~Minnesota~Mississippi~Missouri~Montana~Nebraska~Nevada~New Hampshire~New Jersey~New Mexico~New York~North Carolina~North Dakota~Northern Mariana Islands~Ohio~Oklahoma~Oregon~Palau~Pennsylvania~Puerto Rico~Rhode Island~South Carolina~South Dakota~Tennessee~Texas~Utah~Vermont~Virgin Islands~Virginia~Washington~West Virginia~Wisconsin~Wyoming","sub_zips":"3[56]~99[5-9]~96799~8[56]~71[6-9]|72~340~09~96[2-6]~9[0-5]|96[01]~8[01]~06~19[7-9]~20[02-5]|569~3[23]|34[1-9]~3[01]|398|39901~969([1-2]\\d|3[12])~967[0-8]|9679[0-8]|968~83[2-9]~6[0-2]~4[67]~5[0-2]~6[67]~4[01]|42[0-7]~70|71[0-5]~039|04~969[67]~20[6-9]|21~01|02[0-7]|05501|05544~4[89]~9694[1-4]~55|56[0-7]~38[6-9]|39[0-7]~6[3-5]~59~6[89]~889|89~03[0-8]~0[78]~87|88[0-4]~1[0-4]|06390|00501|00544~2[78]~58~9695[0-2]~4[3-5]~7[34]~97~969(39|40)~1[5-8]|19[0-6]~00[679]~02[89]~29~57~37|38[0-5]~7[5-9]|885|73301|73344~84~05~008~201|2[23]|24[0-6]~98|99[0-4]~24[7-9]|2[56]~5[34]~82|83[01]|83414","sub_zipexs":"35000,36999~99500,99999~96799~85000,86999~71600,72999~34000,34099~09000,09999~96200,96699~90000,96199~80000,81999~06000,06999~19700,19999~20000,20099:20200,20599:56900,56999~32000,33999:34100,34999~30000,31999:39800,39899:39901~96910,96932~96700,96798:96800,96899~83200,83999~60000,62999~46000,47999~50000,52999~66000,67999~40000,42799~70000,71599~03900,04999~96960,96979~20600,21999~01000,02799:05501:05544~48000,49999~96941,96944~55000,56799~38600,39799~63000,65999~59000,59999~68000,69999~88900,89999~03000,03899~07000,08999~87000,88499~10000,14999:06390:00501:00544~27000,28999~58000,58999~96950,96952~43000,45999~73000,74999~97000,97999~96940~15000,19699~00600,00799:00900,00999~02800,02999~29000,29999~57000,57999~37000,38599~75000,79999:88500,88599:73301:73344~84000,84999~05000,05999~00800,00899~20100,20199:22000,24699~98000,99499~24700,26999~53000,54999~82000,83199:83414"}
+data/US/AA={"id":"data/US/AA","key":"AA","name":"Armed Forces (AA)","lang":"en","zip":"340","zipex":"34000,34099"}
+data/US/AE={"id":"data/US/AE","key":"AE","name":"Armed Forces (AE)","lang":"en","zip":"09","zipex":"09000,09999"}
+data/US/AK={"id":"data/US/AK","key":"AK","name":"Alaska","lang":"en","zip":"99[5-9]","zipex":"99500,99999"}
+data/US/AL={"id":"data/US/AL","key":"AL","name":"Alabama","lang":"en","zip":"3[56]","zipex":"35000,36999"}
+data/US/AP={"id":"data/US/AP","key":"AP","name":"Armed Forces (AP)","lang":"en","zip":"96[2-6]","zipex":"96200,96699"}
+data/US/AR={"id":"data/US/AR","key":"AR","name":"Arkansas","lang":"en","zip":"71[6-9]|72","zipex":"71600,72999"}
+data/US/AS={"id":"data/US/AS","key":"AS","name":"American Samoa","lang":"en","zip":"96799","zipex":"96799"}
+data/US/AZ={"id":"data/US/AZ","key":"AZ","name":"Arizona","lang":"en","zip":"8[56]","zipex":"85000,86999"}
+data/US/CA={"id":"data/US/CA","key":"CA","name":"California","lang":"en","zip":"9[0-5]|96[01]","zipex":"90000,96199"}
+data/US/CO={"id":"data/US/CO","key":"CO","name":"Colorado","lang":"en","zip":"8[01]","zipex":"80000,81999"}
+data/US/CT={"id":"data/US/CT","key":"CT","name":"Connecticut","lang":"en","zip":"06","zipex":"06000,06999"}
+data/US/DC={"id":"data/US/DC","key":"DC","name":"District of Columbia","lang":"en","zip":"20[02-5]|569","zipex":"20000,20099:20200,20599:56900,56999"}
+data/US/DE={"id":"data/US/DE","key":"DE","name":"Delaware","lang":"en","zip":"19[7-9]","zipex":"19700,19999"}
+data/US/FL={"id":"data/US/FL","key":"FL","name":"Florida","lang":"en","zip":"3[23]|34[1-9]","zipex":"32000,33999:34100,34999"}
+data/US/FM={"id":"data/US/FM","key":"FM","name":"Micronesia","lang":"en","zip":"9694[1-4]","zipex":"96941,96944"}
+data/US/GA={"id":"data/US/GA","key":"GA","name":"Georgia","lang":"en","zip":"3[01]|398|39901","zipex":"30000,31999:39800,39899:39901"}
+data/US/GU={"id":"data/US/GU","key":"GU","name":"Guam","lang":"en","zip":"969([1-2]\\d|3[12])","zipex":"96910,96932"}
+data/US/HI={"id":"data/US/HI","key":"HI","name":"Hawaii","lang":"en","zip":"967[0-8]|9679[0-8]|968","zipex":"96700,96798:96800,96899"}
+data/US/IA={"id":"data/US/IA","key":"IA","name":"Iowa","lang":"en","zip":"5[0-2]","zipex":"50000,52999"}
+data/US/ID={"id":"data/US/ID","key":"ID","name":"Idaho","lang":"en","zip":"83[2-9]","zipex":"83200,83999"}
+data/US/IL={"id":"data/US/IL","key":"IL","name":"Illinois","lang":"en","zip":"6[0-2]","zipex":"60000,62999"}
+data/US/IN={"id":"data/US/IN","key":"IN","name":"Indiana","lang":"en","zip":"4[67]","zipex":"46000,47999"}
+data/US/KS={"id":"data/US/KS","key":"KS","name":"Kansas","lang":"en","zip":"6[67]","zipex":"66000,67999"}
+data/US/KY={"id":"data/US/KY","key":"KY","name":"Kentucky","lang":"en","zip":"4[01]|42[0-7]","zipex":"40000,42799"}
+data/US/LA={"id":"data/US/LA","key":"LA","name":"Louisiana","lang":"en","zip":"70|71[0-5]","zipex":"70000,71599"}
+data/US/MA={"id":"data/US/MA","key":"MA","name":"Massachusetts","lang":"en","zip":"01|02[0-7]|05501|05544","zipex":"01000,02799:05501:05544"}
+data/US/MD={"id":"data/US/MD","key":"MD","name":"Maryland","lang":"en","zip":"20[6-9]|21","zipex":"20600,21999"}
+data/US/ME={"id":"data/US/ME","key":"ME","name":"Maine","lang":"en","zip":"039|04","zipex":"03900,04999"}
+data/US/MH={"id":"data/US/MH","key":"MH","name":"Marshall Islands","lang":"en","zip":"969[67]","zipex":"96960,96979"}
+data/US/MI={"id":"data/US/MI","key":"MI","name":"Michigan","lang":"en","zip":"4[89]","zipex":"48000,49999"}
+data/US/MN={"id":"data/US/MN","key":"MN","name":"Minnesota","lang":"en","zip":"55|56[0-7]","zipex":"55000,56799"}
+data/US/MO={"id":"data/US/MO","key":"MO","name":"Missouri","lang":"en","zip":"6[3-5]","zipex":"63000,65999"}
+data/US/MP={"id":"data/US/MP","key":"MP","name":"Northern Mariana Islands","lang":"en","zip":"9695[0-2]","zipex":"96950,96952"}
+data/US/MS={"id":"data/US/MS","key":"MS","name":"Mississippi","lang":"en","zip":"38[6-9]|39[0-7]","zipex":"38600,39799"}
+data/US/MT={"id":"data/US/MT","key":"MT","name":"Montana","lang":"en","zip":"59","zipex":"59000,59999"}
+data/US/NC={"id":"data/US/NC","key":"NC","name":"North Carolina","lang":"en","zip":"2[78]","zipex":"27000,28999"}
+data/US/ND={"id":"data/US/ND","key":"ND","name":"North Dakota","lang":"en","zip":"58","zipex":"58000,58999"}
+data/US/NE={"id":"data/US/NE","key":"NE","name":"Nebraska","lang":"en","zip":"6[89]","zipex":"68000,69999"}
+data/US/NH={"id":"data/US/NH","key":"NH","name":"New Hampshire","lang":"en","zip":"03[0-8]","zipex":"03000,03899"}
+data/US/NJ={"id":"data/US/NJ","key":"NJ","name":"New Jersey","lang":"en","zip":"0[78]","zipex":"07000,08999"}
+data/US/NM={"id":"data/US/NM","key":"NM","name":"New Mexico","lang":"en","zip":"87|88[0-4]","zipex":"87000,88499"}
+data/US/NV={"id":"data/US/NV","key":"NV","name":"Nevada","lang":"en","zip":"889|89","zipex":"88900,89999"}
+data/US/NY={"id":"data/US/NY","key":"NY","name":"New York","lang":"en","zip":"1[0-4]|06390|00501|00544","zipex":"10000,14999:06390:00501:00544"}
+data/US/OH={"id":"data/US/OH","key":"OH","name":"Ohio","lang":"en","zip":"4[3-5]","zipex":"43000,45999"}
+data/US/OK={"id":"data/US/OK","key":"OK","name":"Oklahoma","lang":"en","zip":"7[34]","zipex":"73000,74999"}
+data/US/OR={"id":"data/US/OR","key":"OR","name":"Oregon","lang":"en","zip":"97","zipex":"97000,97999"}
+data/US/PA={"id":"data/US/PA","key":"PA","name":"Pennsylvania","lang":"en","zip":"1[5-8]|19[0-6]","zipex":"15000,19699"}
+data/US/PR={"id":"data/US/PR","key":"PR","name":"Puerto Rico","lang":"en","zip":"00[679]","zipex":"00600,00799:00900,00999"}
+data/US/PW={"id":"data/US/PW","key":"PW","name":"Palau","lang":"en","zip":"969(39|40)","zipex":"96940"}
+data/US/RI={"id":"data/US/RI","key":"RI","name":"Rhode Island","lang":"en","zip":"02[89]","zipex":"02800,02999"}
+data/US/SC={"id":"data/US/SC","key":"SC","name":"South Carolina","lang":"en","zip":"29","zipex":"29000,29999"}
+data/US/SD={"id":"data/US/SD","key":"SD","name":"South Dakota","lang":"en","zip":"57","zipex":"57000,57999"}
+data/US/TN={"id":"data/US/TN","key":"TN","name":"Tennessee","lang":"en","zip":"37|38[0-5]","zipex":"37000,38599"}
+data/US/TX={"id":"data/US/TX","key":"TX","name":"Texas","lang":"en","zip":"7[5-9]|885|73301|73344","zipex":"75000,79999:88500,88599:73301:73344"}
+data/US/UT={"id":"data/US/UT","key":"UT","name":"Utah","lang":"en","zip":"84","zipex":"84000,84999"}
+data/US/VA={"id":"data/US/VA","key":"VA","name":"Virginia","lang":"en","zip":"201|2[23]|24[0-6]","zipex":"20100,20199:22000,24699"}
+data/US/VI={"id":"data/US/VI","key":"VI","name":"Virgin Islands","lang":"en","zip":"008","zipex":"00800,00899"}
+data/US/VT={"id":"data/US/VT","key":"VT","name":"Vermont","lang":"en","zip":"05","zipex":"05000,05999"}
+data/US/WA={"id":"data/US/WA","key":"WA","name":"Washington","lang":"en","zip":"98|99[0-4]","zipex":"98000,99499"}
+data/US/WI={"id":"data/US/WI","key":"WI","name":"Wisconsin","lang":"en","zip":"5[34]","zipex":"53000,54999"}
+data/US/WV={"id":"data/US/WV","key":"WV","name":"West Virginia","lang":"en","zip":"24[7-9]|2[56]","zipex":"24700,26999"}
+data/US/WY={"id":"data/US/WY","key":"WY","name":"Wyoming","lang":"en","zip":"82|83[01]|83414","zipex":"82000,83199:83414"}
+data/UY={"id":"data/UY","key":"UY","name":"URUGUAY","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%Z %C %S","upper":"CS","zip":"\\d{5}","zipex":"11600","posturl":"http://www.correo.com.uy/index.asp?codPag=codPost&switchMapa=codPost","sub_keys":"ARTIGAS~CANELONES~CERRO LARGO~COLONIA~DURAZNO~FLORES~FLORIDA~LAVALLEJA~MALDONADO~MONTEVIDEO~PAYSANDÚ~RÍO NEGRO~RIVERA~ROCHA~SALTO~SAN JOSÉ~SORIANO~TACUAREMBÓ~TREINTA Y TRES","sub_zips":"55~9[01]|1[456]~37~70|75204~97~85~94|9060|97005~30~20~1|91600~60~65|60002~40~27~50~80~75|70003~45~33|30203|30204|30302|37007","sub_isoids":"AR~CA~CL~CO~DU~FS~FD~LA~MA~MO~PA~RN~RV~RO~SA~SJ~SO~TA~TT"}
+data/UY/ARTIGAS={"id":"data/UY/ARTIGAS","key":"ARTIGAS","lang":"es","zip":"55","isoid":"AR"}
+data/UY/CANELONES={"id":"data/UY/CANELONES","key":"CANELONES","lang":"es","zip":"9[01]|1[456]","isoid":"CA"}
+data/UY/CERRO LARGO={"id":"data/UY/CERRO LARGO","key":"CERRO LARGO","lang":"es","zip":"37","isoid":"CL"}
+data/UY/COLONIA={"id":"data/UY/COLONIA","key":"COLONIA","lang":"es","zip":"70|75204","isoid":"CO"}
+data/UY/DURAZNO={"id":"data/UY/DURAZNO","key":"DURAZNO","lang":"es","zip":"97","isoid":"DU"}
+data/UY/FLORES={"id":"data/UY/FLORES","key":"FLORES","lang":"es","zip":"85","isoid":"FS"}
+data/UY/FLORIDA={"id":"data/UY/FLORIDA","key":"FLORIDA","lang":"es","zip":"94|9060|97005","isoid":"FD"}
+data/UY/LAVALLEJA={"id":"data/UY/LAVALLEJA","key":"LAVALLEJA","lang":"es","zip":"30","isoid":"LA"}
+data/UY/MALDONADO={"id":"data/UY/MALDONADO","key":"MALDONADO","lang":"es","zip":"20","isoid":"MA"}
+data/UY/MONTEVIDEO={"id":"data/UY/MONTEVIDEO","key":"MONTEVIDEO","lang":"es","zip":"1|91600","isoid":"MO"}
+data/UY/PAYSANDÚ={"id":"data/UY/PAYSANDÚ","key":"PAYSANDÚ","lang":"es","zip":"60","isoid":"PA"}
+data/UY/RIVERA={"id":"data/UY/RIVERA","key":"RIVERA","lang":"es","zip":"40","isoid":"RV"}
+data/UY/ROCHA={"id":"data/UY/ROCHA","key":"ROCHA","lang":"es","zip":"27","isoid":"RO"}
+data/UY/RÍO NEGRO={"id":"data/UY/RÍO NEGRO","key":"RÍO NEGRO","lang":"es","zip":"65|60002","isoid":"RN"}
+data/UY/SALTO={"id":"data/UY/SALTO","key":"SALTO","lang":"es","zip":"50","isoid":"SA"}
+data/UY/SAN JOSÉ={"id":"data/UY/SAN JOSÉ","key":"SAN JOSÉ","lang":"es","zip":"80","isoid":"SJ"}
+data/UY/SORIANO={"id":"data/UY/SORIANO","key":"SORIANO","lang":"es","zip":"75|70003","isoid":"SO"}
+data/UY/TACUAREMBÓ={"id":"data/UY/TACUAREMBÓ","key":"TACUAREMBÓ","lang":"es","zip":"45","isoid":"TA"}
+data/UY/TREINTA Y TRES={"id":"data/UY/TREINTA Y TRES","key":"TREINTA Y TRES","lang":"es","zip":"33|30203|30204|30302|37007","isoid":"TT"}
+data/UZ={"id":"data/UZ","key":"UZ","name":"UZBEKISTAN","fmt":"%N%n%O%n%A%n%Z %C%n%S","upper":"CS","zip":"\\d{6}","zipex":"702100,700000","posturl":"http://www.pochta.uz/index.php/uz/pochta-indekslari/9"}
+data/VA={"id":"data/VA","key":"VA","name":"VATICAN","fmt":"%N%n%O%n%A%n%Z %C","zip":"00120","zipex":"00120"}
+data/VC={"id":"data/VC","key":"VC","name":"SAINT VINCENT AND THE GRENADINES (ANTILLES)","zip":"VC\\d{4}","zipex":"VC0100,VC0110,VC0400","posturl":"http://www.svgpost.gov.vc/?option=com_content&view=article&id=3&Itemid=16"}
+data/VE={"id":"data/VE","key":"VE","name":"VENEZUELA","lang":"es","languages":"es","fmt":"%N%n%O%n%A%n%C %Z, %S","require":"ACS","upper":"CS","zip":"\\d{4}","zipex":"1010,3001,8011,1020","posturl":"http://www.ipostel.gob.ve/nlinea/codigo_postal.php","sub_keys":"Amazonas~Anzoátegui~Apure~Aragua~Barinas~Bolívar~Carabobo~Cojedes~Delta Amacuro~Dependencias Federales~Distrito Federal~Falcón~Guárico~Lara~Mérida~Miranda~Monagas~Nueva Esparta~Portuguesa~Sucre~Táchira~Trujillo~Vargas~Yaracuy~Zulia","sub_isoids":"Z~B~C~D~E~F~G~H~Y~W~A~I~J~K~L~M~N~O~P~R~S~T~X~U~V"}
+data/VE/Amazonas={"id":"data/VE/Amazonas","key":"Amazonas","lang":"es","isoid":"Z"}
+data/VE/Anzoátegui={"id":"data/VE/Anzoátegui","key":"Anzoátegui","lang":"es","isoid":"B"}
+data/VE/Apure={"id":"data/VE/Apure","key":"Apure","lang":"es","isoid":"C"}
+data/VE/Aragua={"id":"data/VE/Aragua","key":"Aragua","lang":"es","isoid":"D"}
+data/VE/Barinas={"id":"data/VE/Barinas","key":"Barinas","lang":"es","isoid":"E"}
+data/VE/Bolívar={"id":"data/VE/Bolívar","key":"Bolívar","lang":"es","isoid":"F"}
+data/VE/Carabobo={"id":"data/VE/Carabobo","key":"Carabobo","lang":"es","isoid":"G"}
+data/VE/Cojedes={"id":"data/VE/Cojedes","key":"Cojedes","lang":"es","isoid":"H"}
+data/VE/Delta Amacuro={"id":"data/VE/Delta Amacuro","key":"Delta Amacuro","lang":"es","isoid":"Y"}
+data/VE/Dependencias Federales={"id":"data/VE/Dependencias Federales","key":"Dependencias Federales","lang":"es","isoid":"W"}
+data/VE/Distrito Federal={"id":"data/VE/Distrito Federal","key":"Distrito Federal","lang":"es","isoid":"A"}
+data/VE/Falcón={"id":"data/VE/Falcón","key":"Falcón","lang":"es","isoid":"I"}
+data/VE/Guárico={"id":"data/VE/Guárico","key":"Guárico","lang":"es","isoid":"J"}
+data/VE/Lara={"id":"data/VE/Lara","key":"Lara","lang":"es","isoid":"K"}
+data/VE/Miranda={"id":"data/VE/Miranda","key":"Miranda","lang":"es","isoid":"M"}
+data/VE/Monagas={"id":"data/VE/Monagas","key":"Monagas","lang":"es","isoid":"N"}
+data/VE/Mérida={"id":"data/VE/Mérida","key":"Mérida","lang":"es","isoid":"L"}
+data/VE/Nueva Esparta={"id":"data/VE/Nueva Esparta","key":"Nueva Esparta","lang":"es","isoid":"O"}
+data/VE/Portuguesa={"id":"data/VE/Portuguesa","key":"Portuguesa","lang":"es","isoid":"P"}
+data/VE/Sucre={"id":"data/VE/Sucre","key":"Sucre","lang":"es","isoid":"R"}
+data/VE/Trujillo={"id":"data/VE/Trujillo","key":"Trujillo","lang":"es","isoid":"T"}
+data/VE/Táchira={"id":"data/VE/Táchira","key":"Táchira","lang":"es","isoid":"S"}
+data/VE/Vargas={"id":"data/VE/Vargas","key":"Vargas","lang":"es","isoid":"X"}
+data/VE/Yaracuy={"id":"data/VE/Yaracuy","key":"Yaracuy","lang":"es","isoid":"U"}
+data/VE/Zulia={"id":"data/VE/Zulia","key":"Zulia","lang":"es","isoid":"V"}
+data/VG={"id":"data/VG","key":"VG","name":"VIRGIN ISLANDS (BRITISH)","require":"A","zip":"VG\\d{4}","zipex":"VG1110,VG1150,VG1160"}
+data/VI={"id":"data/VI","key":"VI","name":"VIRGIN ISLANDS (U.S.)","fmt":"%N%n%O%n%A%n%C %S %Z","require":"ACSZ","upper":"ACNOS","zip":"008(([0-4]\\d)|(5[01]))([ \\-]\\d{4})?","zipex":"00802-1222,00850-9802","posturl":"http://zip4.usps.com/zip4/welcome.jsp","zip_name_type":"zip","state_name_type":"state"}
+data/VN={"id":"data/VN","key":"VN","name":"VIET NAM","lang":"vi","languages":"vi","fmt":"%N%n%O%n%A%n%C%n%S","lfmt":"%N%n%O%n%A%n%C%n%S","require":"AC","zip":"\\d{6}","zipex":"119415,136065,720344","posturl":"http://postcode.vnpost.vn/services/search.aspx","sub_keys":"An Giang~Bà Rịa–Vũng Tàu~Bắc Giang~Bắc Kạn~Bắc Lieu~Bắc Ninh~Bến Tre~Bình Dương~Bình Định~Bình Phước~Bình Thuận~Cà Mau~Cao Bằng~Cần Thơ~Đà Nẵng~Đắk Lắk~Đăk Nông~Điện Biên~Đồng Nai~Đồng Tháp~Gia Lai~Hà Giang~Hà Nam~Hà Nội~Hà Tây~Hà Tĩnh~Hải Dương~Hải Phòng~Hậu Giang~Hòa Bình~Hưng Yên~Khánh Hòa~Kiên Giang~Kon Tum~Lai Châu~Lạng Sơn~Lào Cai~Lâm Đồng~Long An~Nam Định~Nghệ An~Ninh Bình~Ninh Thuận~Phú Thọ~Phú Yên~Quảng Bình~Quảng Nam~Quảng Ngãi~Quảng Ninh~Quảng Trị~Sóc Trăng~Sơn La~Tây Ninh~Thái Bình~Thái Nguyên~Thanh Hóa~Thành phố Hồ Chí Minh~Thừa Thiên–Huế~Tiền Giang~Trà Vinh~Tuyên Quang~Vĩnh Long~Vĩnh Phúc~Yên Bái","sub_lnames":"AN GIANG PROVINCE~BA RIA-VUNG TAU PROVINCE~BAC GIANG PROVINCE~BAC KAN PROVINCE~BAC LIEU PROVINCE~BAC NINH PROVINCE~BEN TRE PROVINCE~BINH DUONG PROVINCE~BINH DINH PROVINCE~BINH PHUOC PROVINCE~BINH THUAN PROVINCE~CA MAU PROVINCE~CAO BANG PROVINCE~CAN THO CITY~DA NANG CITY~DAK LAK PROVINCE~DAK NONG PROVINCE~DIEN BIEN PROVINCE~DONG NAI PROVINCE~DONG THAP PROVINCE~GIA LAI PROVINCE~HA GIANG PROVINCE~HA NAM PROVINCE~HANOI CITY~HA TAY PROVINCE~HA TINH PROVINCE~HAI DUONG PROVINCE~HAIPHONG CITY~HAU GIANG PROVINCE~HOA BINH PROVINCE~HUNG YEN PROVINCE~KHANH HOA PROVINCE~KIEN GIANG PROVINCE~KON TUM PROVINCE~LAI CHAU PROVINCE~LANG SONG PROVINCE~LAO CAI PROVINCE~LAM DONG PROVINCE~LONG AN PROVINCE~NAM DINH PROVINCE~NGHE AN PROVINCE~NINH BINH PROVINCE~NINH THUAN PROVINCE~PHU THO PROVINCE~PHU YEN PROVINCE~QUANG BINH PROVINCE~QUANG NAM PROVINCE~QUANG NGAI PROVINCE~QUANG NINH PROVINCE~QUANG TRI PROVINCE~SOC TRANG PROVINCE~SON LA PROVINCE~TAY NINH PROVINCE~THAI BINH PROVINCE~THAI NGUYEN PROVINCE~THANH HOA PROVINCE~HO CHI MINH CITY~THUA THIEN-HUE PROVINCE~TIEN GIANG PROVINCE~TRA VINH PROVINCE~TUYEN QUANG PROVINCE~VINH LONG PROVINCE~VINH PHUC PROVINCE~YEN BAI PROVINCE","sub_isoids":"44~43~54~53~55~56~50~57~31~58~40~59~04~48~60~33~72~71~39~45~30~03~63~64~15~23~61~62~73~14~66~34~47~28~01~09~02~35~41~67~22~18~36~68~32~24~27~29~13~25~52~05~37~20~69~21~65~26~46~51~07~49~70~06"}
+data/VN/An Giang={"id":"data/VN/An Giang","key":"An Giang","lang":"vi","lname":"AN GIANG PROVINCE","isoid":"44"}
+data/VN/Bà Rịa–Vũng Tàu={"id":"data/VN/Bà Rịa–Vũng Tàu","key":"Bà Rịa–Vũng Tàu","lang":"vi","lname":"BA RIA-VUNG TAU PROVINCE","isoid":"43"}
+data/VN/Bình Dương={"id":"data/VN/Bình Dương","key":"Bình Dương","lang":"vi","lname":"BINH DUONG PROVINCE","isoid":"57"}
+data/VN/Bình Phước={"id":"data/VN/Bình Phước","key":"Bình Phước","lang":"vi","lname":"BINH PHUOC PROVINCE","isoid":"58"}
+data/VN/Bình Thuận={"id":"data/VN/Bình Thuận","key":"Bình Thuận","lang":"vi","lname":"BINH THUAN PROVINCE","isoid":"40"}
+data/VN/Bình Định={"id":"data/VN/Bình Định","key":"Bình Định","lang":"vi","lname":"BINH DINH PROVINCE","isoid":"31"}
+data/VN/Bắc Giang={"id":"data/VN/Bắc Giang","key":"Bắc Giang","lang":"vi","lname":"BAC GIANG PROVINCE","isoid":"54"}
+data/VN/Bắc Kạn={"id":"data/VN/Bắc Kạn","key":"Bắc Kạn","lang":"vi","lname":"BAC KAN PROVINCE","isoid":"53"}
+data/VN/Bắc Lieu={"id":"data/VN/Bắc Lieu","key":"Bắc Lieu","lang":"vi","lname":"BAC LIEU PROVINCE","isoid":"55"}
+data/VN/Bắc Ninh={"id":"data/VN/Bắc Ninh","key":"Bắc Ninh","lang":"vi","lname":"BAC NINH PROVINCE","isoid":"56"}
+data/VN/Bến Tre={"id":"data/VN/Bến Tre","key":"Bến Tre","lang":"vi","lname":"BEN TRE PROVINCE","isoid":"50"}
+data/VN/Cao Bằng={"id":"data/VN/Cao Bằng","key":"Cao Bằng","lang":"vi","lname":"CAO BANG PROVINCE","isoid":"04"}
+data/VN/Cà Mau={"id":"data/VN/Cà Mau","key":"Cà Mau","lang":"vi","lname":"CA MAU PROVINCE","isoid":"59"}
+data/VN/Cần Thơ={"id":"data/VN/Cần Thơ","key":"Cần Thơ","lang":"vi","lname":"CAN THO CITY","isoid":"48"}
+data/VN/Gia Lai={"id":"data/VN/Gia Lai","key":"Gia Lai","lang":"vi","lname":"GIA LAI PROVINCE","isoid":"30"}
+data/VN/Hà Giang={"id":"data/VN/Hà Giang","key":"Hà Giang","lang":"vi","lname":"HA GIANG PROVINCE","isoid":"03"}
+data/VN/Hà Nam={"id":"data/VN/Hà Nam","key":"Hà Nam","lang":"vi","lname":"HA NAM PROVINCE","isoid":"63"}
+data/VN/Hà Nội={"id":"data/VN/Hà Nội","key":"Hà Nội","lang":"vi","lname":"HANOI CITY","isoid":"64"}
+data/VN/Hà Tây={"id":"data/VN/Hà Tây","key":"Hà Tây","lang":"vi","lname":"HA TAY PROVINCE","isoid":"15"}
+data/VN/Hà Tĩnh={"id":"data/VN/Hà Tĩnh","key":"Hà Tĩnh","lang":"vi","lname":"HA TINH PROVINCE","isoid":"23"}
+data/VN/Hòa Bình={"id":"data/VN/Hòa Bình","key":"Hòa Bình","lang":"vi","lname":"HOA BINH PROVINCE","isoid":"14"}
+data/VN/Hưng Yên={"id":"data/VN/Hưng Yên","key":"Hưng Yên","lang":"vi","lname":"HUNG YEN PROVINCE","isoid":"66"}
+data/VN/Hải Dương={"id":"data/VN/Hải Dương","key":"Hải Dương","lang":"vi","lname":"HAI DUONG PROVINCE","isoid":"61"}
+data/VN/Hải Phòng={"id":"data/VN/Hải Phòng","key":"Hải Phòng","lang":"vi","lname":"HAIPHONG CITY","isoid":"62"}
+data/VN/Hậu Giang={"id":"data/VN/Hậu Giang","key":"Hậu Giang","lang":"vi","lname":"HAU GIANG PROVINCE","isoid":"73"}
+data/VN/Khánh Hòa={"id":"data/VN/Khánh Hòa","key":"Khánh Hòa","lang":"vi","lname":"KHANH HOA PROVINCE","isoid":"34"}
+data/VN/Kiên Giang={"id":"data/VN/Kiên Giang","key":"Kiên Giang","lang":"vi","lname":"KIEN GIANG PROVINCE","isoid":"47"}
+data/VN/Kon Tum={"id":"data/VN/Kon Tum","key":"Kon Tum","lang":"vi","lname":"KON TUM PROVINCE","isoid":"28"}
+data/VN/Lai Châu={"id":"data/VN/Lai Châu","key":"Lai Châu","lang":"vi","lname":"LAI CHAU PROVINCE","isoid":"01"}
+data/VN/Long An={"id":"data/VN/Long An","key":"Long An","lang":"vi","lname":"LONG AN PROVINCE","isoid":"41"}
+data/VN/Lào Cai={"id":"data/VN/Lào Cai","key":"Lào Cai","lang":"vi","lname":"LAO CAI PROVINCE","isoid":"02"}
+data/VN/Lâm Đồng={"id":"data/VN/Lâm Đồng","key":"Lâm Đồng","lang":"vi","lname":"LAM DONG PROVINCE","isoid":"35"}
+data/VN/Lạng Sơn={"id":"data/VN/Lạng Sơn","key":"Lạng Sơn","lang":"vi","lname":"LANG SONG PROVINCE","isoid":"09"}
+data/VN/Nam Định={"id":"data/VN/Nam Định","key":"Nam Định","lang":"vi","lname":"NAM DINH PROVINCE","isoid":"67"}
+data/VN/Nghệ An={"id":"data/VN/Nghệ An","key":"Nghệ An","lang":"vi","lname":"NGHE AN PROVINCE","isoid":"22"}
+data/VN/Ninh Bình={"id":"data/VN/Ninh Bình","key":"Ninh Bình","lang":"vi","lname":"NINH BINH PROVINCE","isoid":"18"}
+data/VN/Ninh Thuận={"id":"data/VN/Ninh Thuận","key":"Ninh Thuận","lang":"vi","lname":"NINH THUAN PROVINCE","isoid":"36"}
+data/VN/Phú Thọ={"id":"data/VN/Phú Thọ","key":"Phú Thọ","lang":"vi","lname":"PHU THO PROVINCE","isoid":"68"}
+data/VN/Phú Yên={"id":"data/VN/Phú Yên","key":"Phú Yên","lang":"vi","lname":"PHU YEN PROVINCE","isoid":"32"}
+data/VN/Quảng Bình={"id":"data/VN/Quảng Bình","key":"Quảng Bình","lang":"vi","lname":"QUANG BINH PROVINCE","isoid":"24"}
+data/VN/Quảng Nam={"id":"data/VN/Quảng Nam","key":"Quảng Nam","lang":"vi","lname":"QUANG NAM PROVINCE","isoid":"27"}
+data/VN/Quảng Ngãi={"id":"data/VN/Quảng Ngãi","key":"Quảng Ngãi","lang":"vi","lname":"QUANG NGAI PROVINCE","isoid":"29"}
+data/VN/Quảng Ninh={"id":"data/VN/Quảng Ninh","key":"Quảng Ninh","lang":"vi","lname":"QUANG NINH PROVINCE","isoid":"13"}
+data/VN/Quảng Trị={"id":"data/VN/Quảng Trị","key":"Quảng Trị","lang":"vi","lname":"QUANG TRI PROVINCE","isoid":"25"}
+data/VN/Sóc Trăng={"id":"data/VN/Sóc Trăng","key":"Sóc Trăng","lang":"vi","lname":"SOC TRANG PROVINCE","isoid":"52"}
+data/VN/Sơn La={"id":"data/VN/Sơn La","key":"Sơn La","lang":"vi","lname":"SON LA PROVINCE","isoid":"05"}
+data/VN/Thanh Hóa={"id":"data/VN/Thanh Hóa","key":"Thanh Hóa","lang":"vi","lname":"THANH HOA PROVINCE","isoid":"21"}
+data/VN/Thành phố Hồ Chí Minh={"id":"data/VN/Thành phố Hồ Chí Minh","key":"Thành phố Hồ Chí Minh","lang":"vi","lname":"HO CHI MINH CITY","isoid":"65"}
+data/VN/Thái Bình={"id":"data/VN/Thái Bình","key":"Thái Bình","lang":"vi","lname":"THAI BINH PROVINCE","isoid":"20"}
+data/VN/Thái Nguyên={"id":"data/VN/Thái Nguyên","key":"Thái Nguyên","lang":"vi","lname":"THAI NGUYEN PROVINCE","isoid":"69"}
+data/VN/Thừa Thiên–Huế={"id":"data/VN/Thừa Thiên–Huế","key":"Thừa Thiên–Huế","lang":"vi","lname":"THUA THIEN-HUE PROVINCE","isoid":"26"}
+data/VN/Tiền Giang={"id":"data/VN/Tiền Giang","key":"Tiền Giang","lang":"vi","lname":"TIEN GIANG PROVINCE","isoid":"46"}
+data/VN/Trà Vinh={"id":"data/VN/Trà Vinh","key":"Trà Vinh","lang":"vi","lname":"TRA VINH PROVINCE","isoid":"51"}
+data/VN/Tuyên Quang={"id":"data/VN/Tuyên Quang","key":"Tuyên Quang","lang":"vi","lname":"TUYEN QUANG PROVINCE","isoid":"07"}
+data/VN/Tây Ninh={"id":"data/VN/Tây Ninh","key":"Tây Ninh","lang":"vi","lname":"TAY NINH PROVINCE","isoid":"37"}
+data/VN/Vĩnh Long={"id":"data/VN/Vĩnh Long","key":"Vĩnh Long","lang":"vi","lname":"VINH LONG PROVINCE","isoid":"49"}
+data/VN/Vĩnh Phúc={"id":"data/VN/Vĩnh Phúc","key":"Vĩnh Phúc","lang":"vi","lname":"VINH PHUC PROVINCE","isoid":"70"}
+data/VN/Yên Bái={"id":"data/VN/Yên Bái","key":"Yên Bái","lang":"vi","lname":"YEN BAI PROVINCE","isoid":"06"}
+data/VN/Điện Biên={"id":"data/VN/Điện Biên","key":"Điện Biên","lang":"vi","lname":"DIEN BIEN PROVINCE","isoid":"71"}
+data/VN/Đà Nẵng={"id":"data/VN/Đà Nẵng","key":"Đà Nẵng","lang":"vi","lname":"DA NANG CITY","isoid":"60"}
+data/VN/Đăk Nông={"id":"data/VN/Đăk Nông","key":"Đăk Nông","lang":"vi","lname":"DAK NONG PROVINCE","isoid":"72"}
+data/VN/Đắk Lắk={"id":"data/VN/Đắk Lắk","key":"Đắk Lắk","lang":"vi","lname":"DAK LAK PROVINCE","isoid":"33"}
+data/VN/Đồng Nai={"id":"data/VN/Đồng Nai","key":"Đồng Nai","lang":"vi","lname":"DONG NAI PROVINCE","isoid":"39"}
+data/VN/Đồng Tháp={"id":"data/VN/Đồng Tháp","key":"Đồng Tháp","lang":"vi","lname":"DONG THAP PROVINCE","isoid":"45"}
+data/VU={"id":"data/VU","key":"VU","name":"VANUATU"}
+data/WF={"id":"data/WF","key":"WF","name":"WALLIS AND FUTUNA ISLANDS","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"986\\d{2}","zipex":"98600"}
+data/WS={"id":"data/WS","key":"WS","name":"SAMOA"}
+data/XK={"id":"data/XK","key":"XK","name":"KOSOVO","fmt":"%N%n%O%n%A%n%Z %C","zip":"[1-7]\\d{4}","zipex":"10000"}
+data/YE={"id":"data/YE","key":"YE","name":"YEMEN","require":"AC"}
+data/YT={"id":"data/YT","key":"YT","name":"MAYOTTE","fmt":"%O%n%N%n%A%n%Z %C %X","require":"ACZ","upper":"ACX","zip":"976\\d{2}","zipex":"97600"}
+data/ZA={"id":"data/ZA","key":"ZA","name":"SOUTH AFRICA","fmt":"%N%n%O%n%A%n%C%n%Z","require":"ACZ","zip":"\\d{4}","zipex":"0083,1451,0001","posturl":"http://www.postoffice.co.za/tools/postalcode.html"}
+data/ZM={"id":"data/ZM","key":"ZM","name":"ZAMBIA","fmt":"%N%n%O%n%A%n%Z %C","require":"AC","zip":"\\d{5}","zipex":"50100,50101"}
+data/ZW={"id":"data/ZW","key":"ZW","name":"ZIMBABWE"}
+data/ZZ={"id":"data/ZZ","fmt":"%N%n%O%n%A%n%C","require":"AC","upper":"C","zip_name_type":"postal","state_name_type":"province"}
+examples={"id":"examples","countries":"AR~BR~CN~JP~KR~RU~TW~US"}
+examples/AR={"id":"examples/AR","types":"local"}
+examples/AR/local={"id":"examples/AR/local","languages":"es"}
+examples/AR/local/_default={"id":"examples/AR/local/es","key":"es","fields":{"city":"Buenos Aires","country":"Argentina","name":"Juan Perez","organization":"Empresa Ejemplo","state":"Capital Federal","street1":"Su Calle 123","street2":"5° Piso","zip":"C1001AFB"}}
+examples/AR/local/es={"id":"examples/AR/local/es","key":"es","fields":{"city":"Buenos Aires","country":"Argentina","name":"Juan Perez","organization":"Empresa Ejemplo","state":"Capital Federal","street1":"Su Calle 123","street2":"5° Piso","zip":"C1001AFB"}}
+examples/BR={"id":"examples/BR","types":"local"}
+examples/BR/local={"id":"examples/BR/local","languages":"pt"}
+examples/BR/local/_default={"id":"examples/BR/local/pt","key":"pt","fields":{"city":"São Paulo","country":"Brasil","name":"Larry Page","organization":"Google Brasil Ltda.","state":"SP","street1":"Av. Brigadeiro Faria Lima nº 3900","street2":"5º andar","street3":"Itaim Bibi","zip":"04538-133"}}
+examples/BR/local/pt={"id":"examples/BR/local/pt","key":"pt","fields":{"city":"São Paulo","country":"Brasil","name":"Larry Page","organization":"Google Brasil Ltda.","state":"SP","street1":"Av. Brigadeiro Faria Lima nº 3900","street2":"5º andar","street3":"Itaim Bibi","zip":"04538-133"}}
+examples/CN={"id":"examples/CN","types":"latin~local"}
+examples/CN/latin={"id":"examples/CN/latin","languages":"zh_Latn"}
+examples/CN/latin/_default={"id":"examples/CN/latin/zh_Latn","key":"zh_Latn","fields":{"city":"Haidian Qu","country":"China","name":"Zhang San","organization":"Beijing Kid Toy Company","state":"Beijing Shi","street1":"#1 Zhongguancun East Road","street2":"Jianshen Building, Rm. 12-345A","zip":"100084"}}
+examples/CN/latin/zh_Latn={"id":"examples/CN/latin/zh_Latn","key":"zh_Latn","fields":{"city":"Haidian Qu","country":"China","name":"Zhang San","organization":"Beijing Kid Toy Company","state":"Beijing Shi","street1":"#1 Zhongguancun East Road","street2":"Jianshen Building, Rm. 12-345A","zip":"100084"}}
+examples/CN/local={"id":"examples/CN/local","languages":"zh_Hans"}
+examples/CN/local/_default={"id":"examples/CN/local/zh_Hans","key":"zh_Hans","fields":{"city":"海淀区","country":"中国","name":"张三","organization":"北京儿童玩具公司","state":"北京市","street1":"中关村东路1号","street2":"建设大厦12层345A","zip":"100084"}}
+examples/CN/local/zh_Hans={"id":"examples/CN/local/zh_Hans","key":"zh_Hans","fields":{"city":"海淀区","country":"中国","name":"张三","organization":"北京儿童玩具公司","state":"北京市","street1":"中关村东路1号","street2":"建设大厦12层345A","zip":"100084"}}
+examples/JP={"id":"examples/JP","types":"latin~local"}
+examples/JP/latin={"id":"examples/JP/latin","languages":"ja_Latn"}
+examples/JP/latin/_default={"id":"examples/JP/latin/ja_Latn","key":"ja_Latn","fields":{"city":"Shibuya-ku","country":"Japan","name":"Miki Murakami","organization":"Google Japan Inc.","state":"Tokyo","street1":"26-1 Sakuragaoka-cho","street2":"Cerulean Tower 6F","zip":"150-8512"}}
+examples/JP/latin/ja_Latn={"id":"examples/JP/latin/ja_Latn","key":"ja_Latn","fields":{"city":"Shibuya-ku","country":"Japan","name":"Miki Murakami","organization":"Google Japan Inc.","state":"Tokyo","street1":"26-1 Sakuragaoka-cho","street2":"Cerulean Tower 6F","zip":"150-8512"}}
+examples/JP/local={"id":"examples/JP/local","languages":"ja"}
+examples/JP/local/_default={"id":"examples/JP/local/ja","key":"ja","fields":{"city":"渋谷区","country":"日本","name":"村上 美紀","organization":"グーグル株式会社","state":"東京都","street1":"桜丘町26-1","street2":"セルリアンタワー6階","zip":"150-8512"}}
+examples/JP/local/ja={"id":"examples/JP/local/ja","key":"ja","fields":{"city":"渋谷区","country":"日本","name":"村上 美紀","organization":"グーグル株式会社","state":"東京都","street1":"桜丘町26-1","street2":"セルリアンタワー6階","zip":"150-8512"}}
+examples/KR={"id":"examples/KR","types":"latin~local"}
+examples/KR/latin={"id":"examples/KR/latin","languages":"ko_Latn"}
+examples/KR/latin/_default={"id":"examples/KR/latin/ko_Latn","key":"ko_Latn","fields":{"city":"Gangnam-Gu","country":"Korea","district":"Yeoksam-Dong","name":"Kim, Google","organization":"Google Korea","state":"Seoul","street1":"737 Gangnam Finance Center","zip":"135-984"}}
+examples/KR/latin/ko_Latn={"id":"examples/KR/latin/ko_Latn","key":"ko_Latn","fields":{"city":"Gangnam-Gu","country":"Korea","district":"Yeoksam-Dong","name":"Kim, Google","organization":"Google Korea","state":"Seoul","street1":"737 Gangnam Finance Center","zip":"135-984"}}
+examples/KR/local={"id":"examples/KR/local","languages":"ko"}
+examples/KR/local/_default={"id":"examples/KR/local/ko","key":"ko","fields":{"city":"강남구","country":"한국","district":"역삼동","name":"김구글","organization":"구글코리아","state":"서울","street1":"역삼동 737번지 강남파이낸스센터","zip":"135-984"}}
+examples/KR/local/ko={"id":"examples/KR/local/ko","key":"ko","fields":{"city":"강남구","country":"한국","district":"역삼동","name":"김구글","organization":"구글코리아","state":"서울","street1":"역삼동 737번지 강남파이낸스센터","zip":"135-984"}}
+examples/RU={"id":"examples/RU","types":"local"}
+examples/RU/local={"id":"examples/RU/local","languages":"ru"}
+examples/RU/local/_default={"id":"examples/RU/local/ru","key":"ru","fields":{"city":"Москва","country":"Российская Федерация","name":"Петров Илья Александрович","organization":"ООО \"Коркунов\"","street1":"ул. Тихвинская 20, офис 45","zip":"127055"}}
+examples/RU/local/ru={"id":"examples/RU/local/ru","key":"ru","fields":{"city":"Москва","country":"Российская Федерация","name":"Петров Илья Александрович","organization":"ООО \"Коркунов\"","street1":"ул. Тихвинская 20, офис 45","zip":"127055"}}
+examples/TW={"id":"examples/TW","types":"latin~local"}
+examples/TW/latin={"id":"examples/TW/latin","languages":"zh_Latn"}
+examples/TW/latin/_default={"id":"examples/TW/latin/zh_Latn","key":"zh_Latn","fields":{"city":"Sinyi District","country":"Taiwan","name":"Lin Yaru","organization":"Taipei Milk Tea Company","state":"Taipei City","street1":"7 Xinyi Road, Sec. 5","street2":"Taipei 101 Tower","street3":"Room 666, Level 88","zip":"110"}}
+examples/TW/latin/zh_Latn={"id":"examples/TW/latin/zh_Latn","key":"zh_Latn","fields":{"city":"Sinyi District","country":"Taiwan","name":"Lin Yaru","organization":"Taipei Milk Tea Company","state":"Taipei City","street1":"7 Xinyi Road, Sec. 5","street2":"Taipei 101 Tower","street3":"Room 666, Level 88","zip":"110"}}
+examples/TW/local={"id":"examples/TW/local","languages":"zh_Hant"}
+examples/TW/local/_default={"id":"examples/TW/local/zh_Hant","key":"zh_Hant","fields":{"city":"信義區","country":"台灣","name":"林雅如","organization":"台北奶茶公司","state":"台北市","street1":"信義路五段7號","street2":"101大樓","street3":"88層666號","zip":"110"}}
+examples/TW/local/zh_Hant={"id":"examples/TW/local/zh_Hant","key":"zh_Hant","fields":{"city":"信義區","country":"台灣","name":"林雅如","organization":"台北奶茶公司","state":"台北市","street1":"信義路五段7號","street2":"101大樓","street3":"88層666號","zip":"110"}}
+examples/US={"id":"examples/US","types":"local"}
+examples/US/local={"id":"examples/US/local","languages":"en"}
+examples/US/local/_default={"id":"examples/US/local/en","key":"en","fields":{"city":"Mountain View","country":"United States","name":"Larry and/or Sergey","organization":"Google, Inc.","state":"California","street1":"Rm. 12-345A","street2":"The Googleplex","street3":"1600 Charleston Rd.","zip":"94037"}}
+examples/US/local/en={"id":"examples/US/local/en","key":"en","fields":{"city":"Mountain View","country":"United States","name":"Larry and/or Sergey","organization":"Google, Inc.","state":"California","street1":"Rm. 12-345A","street2":"The Googleplex","street3":"1600 Charleston Rd.","zip":"94037"}}