From f20f72b20e787843b89a70fc03a55c94bc4994dd Mon Sep 17 00:00:00 2001 From: Denys Ponomarenko Date: Tue, 15 Aug 2023 02:28:15 +0000 Subject: [PATCH 1/5] loading metadata from file added --- cpp/CMakeLists.txt | 2 +- cpp/src/phonenumbers/phonenumberutil.cc | 121 +++++++++++++++--- cpp/src/phonenumbers/phonenumberutil.h | 8 ++ cpp/src/phonenumbers/shortnumberinfo.cc | 48 ++++++- cpp/src/phonenumbers/shortnumberinfo.h | 8 +- cpp/test/phonenumbers/phonenumberutil_test.cc | 11 +- 6 files changed, 171 insertions(+), 27 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index cdd7a0813..1de908571 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -151,7 +151,7 @@ if (USE_BOOST) if (WIN32) set (Boost_USE_STATIC_LIBS ON) endif () - find_package (Boost 1.40.0 COMPONENTS date_time system thread) + find_package (Boost 1.40.0 COMPONENTS date_time system filesystem thread) if (NOT Boost_FOUND) print_error ("Boost Date_Time/System/Thread" "Boost") endif () diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index ec53db1b8..85649c568 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -21,7 +21,7 @@ #include #include #include - +#include #include #include @@ -34,7 +34,6 @@ #include "phonenumbers/matcher_api.h" #include "phonenumbers/metadata.h" #include "phonenumbers/normalize_utf8.h" -#include "phonenumbers/phonemetadata.pb.h" #include "phonenumbers/phonenumber.h" #include "phonenumbers/phonenumber.pb.h" #include "phonenumbers/regex_based_matcher.h" @@ -47,6 +46,8 @@ #include "phonenumbers/utf/unicodetext.h" #include "phonenumbers/utf/utf.h" +#include + namespace i18n { namespace phonenumbers { @@ -121,6 +122,21 @@ const char kPossibleCharsAfterExtLabel[] = "[:\\.\xEF\xBC\x8E]?[ \xC2\xA0\\t,-]*"; const char kOptionalExtSuffix[] = "#?"; +const string METADATA_FILE_NAME = "metadata.dat"; + +#ifdef ISTREAM_DATA_PROVIDER +bool LoadMetadataFromFile(const string& fileName, PhoneMetadataCollection* metadata) { + std::fstream input(fileName.c_str(), std::ios::in | std::ios::binary); + if (!input) { + LOG(ERROR) << "metadata file not found."; + } else if (!metadata->ParseFromIstream(&input)) { + LOG(ERROR) << "Could not parse binary data from file."; + return false; + } + + return true; +} +#else bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { if (!metadata->ParseFromArray(metadata_get(), metadata_size())) { LOG(ERROR) << "Could not parse binary data."; @@ -128,6 +144,7 @@ bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { } return true; } +#endif // ISTREAM_DATA_PROVIDER // Returns a pointer to the description inside the metadata of the appropriate // type. @@ -846,25 +863,62 @@ class PhoneNumberRegExpsAndMappings { DISALLOW_COPY_AND_ASSIGN(PhoneNumberRegExpsAndMappings); }; -// Private constructor. Also takes care of initialisation. -PhoneNumberUtil::PhoneNumberUtil() - : logger_(Logger::set_logger_impl(new NullLogger())), - matcher_api_(new RegexBasedMatcher()), - reg_exps_(new PhoneNumberRegExpsAndMappings), - country_calling_code_to_region_code_map_( - new std::vector()), - nanpa_regions_(new absl::node_hash_set()), - region_to_metadata_map_(new absl::node_hash_map()), - country_code_to_non_geographical_metadata_map_( - new absl::node_hash_map) { - Logger::set_logger_impl(logger_.get()); - // TODO: Update the java version to put the contents of the init - // method inside the constructor as well to keep both in sync. +#ifdef ISTREAM_DATA_PROVIDER +void PhoneNumberUtil::ClearMetadata() { + country_code_to_non_geographical_metadata_map_->clear(); + region_to_metadata_map_->clear(); + + gtl::STLDeleteContainerPairSecondPointers( + country_calling_code_to_region_code_map_->begin(), + country_calling_code_to_region_code_map_->end()); + + country_calling_code_to_region_code_map_->clear(); + nanpa_regions_->clear(); +} + +bool UpdateMetadataFile(const string& filepath) { + + boost::filesystem::path path_to = boost::filesystem::current_path(); + path_to += "/"; + path_to += METADATA_FILE_NAME; + boost::filesystem::path path_bk = path_to; + path_bk += ".bak"; + boost::system::error_code ec; + + boost::filesystem::copy(path_to.string(), path_bk.string(), ec); + if (ec) { + LOG(DFATAL) << "Could not create backup copy of metadata file." << ec.message(); + return false; + } + boost::filesystem::rename(filepath, path_to.string(), ec); + if(ec) { + LOG(DFATAL) << "Could not rename metadata file." << ec.message(); + return false; + } + boost::filesystem::remove(path_bk, ec); + if(ec) { + LOG(DFATAL) << "Could not remove metadata file." << ec.message(); + } + return true; +} + +bool PhoneNumberUtil::ReloadMetadata(const string& filepath) { + ClearMetadata(); PhoneMetadataCollection metadata_collection; - if (!LoadCompiledInMetadata(&metadata_collection)) { - LOG(DFATAL) << "Could not parse compiled-in metadata."; - return; + if (!LoadMetadataFromFile(filepath, &metadata_collection)) { + LOG(DFATAL) << "Could not parse metadata from file."; + return false; + } + LoadMetadataFromCollection(metadata_collection); + if(!UpdateMetadataFile(filepath)){ + LOG(DFATAL) << "Could not update metadata file."; + return false; } + return true; +} +#endif // ISTREAM_DATA_PROVIDER + +void PhoneNumberUtil::LoadMetadataFromCollection(const PhoneMetadataCollection& metadata_collection) { // Storing data in a temporary map to make it easier to find other regions // that share a country calling code when inserting data. std::map* > country_calling_code_to_region_map; @@ -913,6 +967,35 @@ PhoneNumberUtil::PhoneNumberUtil() country_calling_code_to_region_code_map_->end(), OrderByFirst()); } +// Private constructor. Also takes care of initialisation. +PhoneNumberUtil::PhoneNumberUtil() + : logger_(Logger::set_logger_impl(new NullLogger())), + matcher_api_(new RegexBasedMatcher()), + reg_exps_(new PhoneNumberRegExpsAndMappings), + country_calling_code_to_region_code_map_( + new std::vector()), + nanpa_regions_(new absl::node_hash_set()), + region_to_metadata_map_(new absl::node_hash_map()), + country_code_to_non_geographical_metadata_map_( + new absl::node_hash_map) { + Logger::set_logger_impl(logger_.get()); + // TODO: Update the java version to put the contents of the init + // method inside the constructor as well to keep both in sync. + PhoneMetadataCollection metadata_collection; +#ifdef ISTREAM_DATA_PROVIDER + if (!LoadMetadataFromFile(METADATA_FILE_NAME, &metadata_collection)) { + LOG(DFATAL) << "Could not parse metadata from file."; + return; + } +#else + if (!LoadCompiledInMetadata(&metadata_collection)) { + LOG(DFATAL) << "Could not parse compiled-in metadata."; + return; + } +#endif // ISTREAM_DATA_PROVIDER + LoadMetadataFromCollection(metadata_collection); +} + PhoneNumberUtil::~PhoneNumberUtil() { gtl::STLDeleteContainerPairSecondPointers( country_calling_code_to_region_code_map_->begin(), diff --git a/cpp/src/phonenumbers/phonenumberutil.h b/cpp/src/phonenumbers/phonenumberutil.h index 1a3ddd920..cb9e31795 100644 --- a/cpp/src/phonenumbers/phonenumberutil.h +++ b/cpp/src/phonenumbers/phonenumberutil.h @@ -30,6 +30,7 @@ #include "phonenumbers/base/memory/singleton.h" #include "phonenumbers/phonenumber.pb.h" +#include "phonenumbers/phonemetadata.pb.h" #include "absl/container/node_hash_set.h" #include "absl/container/node_hash_map.h" @@ -67,6 +68,11 @@ class PhoneNumberUtil : public Singleton { friend class ShortNumberInfoTest; friend class Singleton; +#ifdef ISTREAM_DATA_PROVIDER + void ClearMetadata(); + public: + bool ReloadMetadata(const string& fileName); +#endif // ISTREAM_DATA_PROVIDER public: ~PhoneNumberUtil(); static const char kRegionCodeForNonGeoEntity[]; @@ -818,10 +824,12 @@ class PhoneNumberUtil : public Singleton { // PhoneMetadata for that country calling code. Examples of the country // calling codes include 800 (International Toll Free Service) and 808 // (International Shared Cost Service). + scoped_ptr > country_code_to_non_geographical_metadata_map_; PhoneNumberUtil(); + void LoadMetadataFromCollection(const PhoneMetadataCollection& metadata_collection); // Returns a regular expression for the possible extensions that may be found // in a number, for use when matching. diff --git a/cpp/src/phonenumbers/shortnumberinfo.cc b/cpp/src/phonenumbers/shortnumberinfo.cc index 8e5d12df9..6c1daeb95 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.cc +++ b/cpp/src/phonenumbers/shortnumberinfo.cc @@ -26,6 +26,7 @@ #include "phonenumbers/regex_based_matcher.h" #include "phonenumbers/region_code.h" #include "phonenumbers/short_metadata.h" +#include namespace i18n { namespace phonenumbers { @@ -34,6 +35,30 @@ using google::protobuf::RepeatedField; using std::map; using std::string; + +#ifdef ISTREAM_DATA_PROVIDER +bool LoadMetadataFromFile(string fileName, PhoneMetadataCollection* metadata) { + std::fstream input(fileName.c_str(), std::ios::in | std::ios::binary); + if (!input) { + LOG(ERROR) << "metadata file not found."; + } else if (!metadata->ParseFromIstream(&input)) { + LOG(ERROR) << "Could not parse binary data from file."; + return false; + } + + return true; +} + +void ShortNumberInfo::ClearMetadata(){ + region_to_short_metadata_map_->clear(); + regions_where_emergency_numbers_must_be_exact_->clear(); +} + +void ShortNumberInfo::ReloadMetadata() { + ClearMetadata(); + LoadMetadata(); +} +#else bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { if (!metadata->ParseFromArray(short_metadata_get(), short_metadata_size())) { LOG(ERROR) << "Could not parse binary data."; @@ -41,17 +66,22 @@ bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { } return true; } +#endif // ISTREAM_DATA_PROVIDER -ShortNumberInfo::ShortNumberInfo() - : phone_util_(*PhoneNumberUtil::GetInstance()), - matcher_api_(new RegexBasedMatcher()), - region_to_short_metadata_map_(new absl::flat_hash_map()), - regions_where_emergency_numbers_must_be_exact_(new absl::flat_hash_set()) { +void ShortNumberInfo::LoadMetadata() { PhoneMetadataCollection metadata_collection; +#ifdef ISTREAM_DATA_PROVIDER + const string metadataInputFile = "metadata_short.dat"; + if (!LoadMetadataFromFile(metadataInputFile, &metadata_collection)) { + LOG(DFATAL) << "Could not parse metadata from file."; + return; + } +#else if (!LoadCompiledInMetadata(&metadata_collection)) { LOG(DFATAL) << "Could not parse compiled-in metadata."; return; } +#endif // ISTREAM_DATA_PROVIDER for (const auto& metadata : metadata_collection.metadata()) { const string& region_code = metadata.id(); region_to_short_metadata_map_->insert(std::make_pair(region_code, metadata)); @@ -61,6 +91,14 @@ ShortNumberInfo::ShortNumberInfo() regions_where_emergency_numbers_must_be_exact_->insert("NI"); } +ShortNumberInfo::ShortNumberInfo() + : phone_util_(*PhoneNumberUtil::GetInstance()), + matcher_api_(new RegexBasedMatcher()), + region_to_short_metadata_map_(new absl::flat_hash_map()), + regions_where_emergency_numbers_must_be_exact_(new absl::flat_hash_set()) { + LoadMetadata(); +} + ShortNumberInfo::~ShortNumberInfo() {} // Returns a pointer to the phone metadata for the appropriate region or NULL diff --git a/cpp/src/phonenumbers/shortnumberinfo.h b/cpp/src/phonenumbers/shortnumberinfo.h index db54b48ed..b67858e08 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.h +++ b/cpp/src/phonenumbers/shortnumberinfo.h @@ -46,7 +46,12 @@ class ShortNumberInfo { public: ShortNumberInfo(); ~ShortNumberInfo(); - +#ifdef ISTREAM_DATA_PROVIDER + private: + void ClearMetadata(); + public: + void ReloadMetadata(); +#endif // ISTREAM_DATA_PROVIDER // Cost categories of short numbers. enum ShortNumberCost { TOLL_FREE, @@ -206,6 +211,7 @@ class ShortNumberInfo { bool MatchesEmergencyNumberHelper(const string& number, const string& region_code, bool allow_prefix_match) const; + void LoadMetadata(); DISALLOW_COPY_AND_ASSIGN(ShortNumberInfo); }; diff --git a/cpp/test/phonenumbers/phonenumberutil_test.cc b/cpp/test/phonenumbers/phonenumberutil_test.cc index 9bc28185e..18cf2db6b 100644 --- a/cpp/test/phonenumbers/phonenumberutil_test.cc +++ b/cpp/test/phonenumbers/phonenumberutil_test.cc @@ -118,7 +118,11 @@ class PhoneNumberUtilTest : public testing::Test { phone_util_.Parse(number_to_parse, RegionCode::ZZ(), &actual_number)); } - const PhoneNumberUtil& phone_util_; + void ReloadMetadata(const string fileName) { + phone_util_.ReloadMetadata(fileName); + } + + PhoneNumberUtil& phone_util_; private: DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest); @@ -159,6 +163,11 @@ TEST_F(PhoneNumberUtilTest, InterchangeInvalidCodepoints) { } } +TEST_F(PhoneNumberUtilTest, ReloadMetadata) { + const string filename = "metadata.dat"; + EXPECT_TRUE(phone_util_.ReloadMetadata(filename)); +} + TEST_F(PhoneNumberUtilTest, GetSupportedRegions) { std::set regions; From 8b88fed563991befb5133eb08ff4a1d3778fe1b3 Mon Sep 17 00:00:00 2001 From: Denys Ponomarenko Date: Wed, 16 Aug 2023 07:57:47 +0000 Subject: [PATCH 2/5] filename parameter addd for ReloadMetadata --- cpp/src/phonenumbers/shortnumberinfo.cc | 76 ++++++++++++++----- cpp/src/phonenumbers/shortnumberinfo.h | 5 +- cpp/test/phonenumbers/shortnumberinfo_test.cc | 7 +- 3 files changed, 67 insertions(+), 21 deletions(-) diff --git a/cpp/src/phonenumbers/shortnumberinfo.cc b/cpp/src/phonenumbers/shortnumberinfo.cc index 6c1daeb95..cd81061c5 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.cc +++ b/cpp/src/phonenumbers/shortnumberinfo.cc @@ -19,9 +19,10 @@ #include #include +#include + #include "phonenumbers/default_logger.h" #include "phonenumbers/matcher_api.h" -#include "phonenumbers/phonemetadata.pb.h" #include "phonenumbers/phonenumberutil.h" #include "phonenumbers/regex_based_matcher.h" #include "phonenumbers/region_code.h" @@ -37,6 +38,9 @@ using std::string; #ifdef ISTREAM_DATA_PROVIDER + +const string METADATA_SHORT_FILE_NAME = "metadata_short.dat"; + bool LoadMetadataFromFile(string fileName, PhoneMetadataCollection* metadata) { std::fstream input(fileName.c_str(), std::ios::in | std::ios::binary); if (!input) { @@ -54,9 +58,45 @@ void ShortNumberInfo::ClearMetadata(){ regions_where_emergency_numbers_must_be_exact_->clear(); } -void ShortNumberInfo::ReloadMetadata() { +bool UpdateShortMetadataFile(const string& filepath) { + + boost::filesystem::path path_to = boost::filesystem::current_path(); + path_to += "/"; + path_to += METADATA_SHORT_FILE_NAME; + boost::filesystem::path path_bk = path_to; + path_bk += ".bak"; + boost::system::error_code ec; + + boost::filesystem::copy(path_to.string(), path_bk.string(), ec); + if (ec) { + LOG(DFATAL) << "Could not create backup copy of metadata file." << ec.message(); + return false; + } + boost::filesystem::rename(filepath, path_to.string(), ec); + if(ec) { + LOG(DFATAL) << "Could not rename metadata file." << ec.message(); + return false; + } + boost::filesystem::remove(path_bk, ec); + if(ec) { + LOG(DFATAL) << "Could not remove metadata file." << ec.message(); + } + return true; +} + +bool ShortNumberInfo::ReloadMetadata(const string& filename) { ClearMetadata(); - LoadMetadata(); + PhoneMetadataCollection metadata_collection; + if (!LoadMetadataFromFile(filename, &metadata_collection)) { + LOG(DFATAL) << "Could not parse metadata from file."; + return false; + } + LoadMetadataFromCollection(metadata_collection); + if(!UpdateShortMetadataFile(filename)){ + LOG(DFATAL) << "Could not update metadata file."; + return false; + } + return true; } #else bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { @@ -68,20 +108,7 @@ bool LoadCompiledInMetadata(PhoneMetadataCollection* metadata) { } #endif // ISTREAM_DATA_PROVIDER -void ShortNumberInfo::LoadMetadata() { - PhoneMetadataCollection metadata_collection; -#ifdef ISTREAM_DATA_PROVIDER - const string metadataInputFile = "metadata_short.dat"; - if (!LoadMetadataFromFile(metadataInputFile, &metadata_collection)) { - LOG(DFATAL) << "Could not parse metadata from file."; - return; - } -#else - if (!LoadCompiledInMetadata(&metadata_collection)) { - LOG(DFATAL) << "Could not parse compiled-in metadata."; - return; - } -#endif // ISTREAM_DATA_PROVIDER +void ShortNumberInfo::LoadMetadataFromCollection(const PhoneMetadataCollection& metadata_collection) { for (const auto& metadata : metadata_collection.metadata()) { const string& region_code = metadata.id(); region_to_short_metadata_map_->insert(std::make_pair(region_code, metadata)); @@ -96,7 +123,20 @@ ShortNumberInfo::ShortNumberInfo() matcher_api_(new RegexBasedMatcher()), region_to_short_metadata_map_(new absl::flat_hash_map()), regions_where_emergency_numbers_must_be_exact_(new absl::flat_hash_set()) { - LoadMetadata(); + + PhoneMetadataCollection metadata_collection; +#ifdef ISTREAM_DATA_PROVIDER + if (!LoadMetadataFromFile(METADATA_SHORT_FILE_NAME, &metadata_collection)) { + LOG(DFATAL) << "Could not parse metadata from file."; + return; + } +#else + if (!LoadCompiledInMetadata(&metadata_collection)) { + LOG(DFATAL) << "Could not parse compiled-in metadata."; + return; + } +#endif // ISTREAM_DATA_PROVIDER + LoadMetadataFromCollection(metadata_collection); } ShortNumberInfo::~ShortNumberInfo() {} diff --git a/cpp/src/phonenumbers/shortnumberinfo.h b/cpp/src/phonenumbers/shortnumberinfo.h index b67858e08..2339ae827 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.h +++ b/cpp/src/phonenumbers/shortnumberinfo.h @@ -23,7 +23,7 @@ #include #include #include - +#include "phonenumbers/phonemetadata.pb.h" #include "phonenumbers/base/basictypes.h" #include "phonenumbers/base/memory/scoped_ptr.h" #include "absl/container/flat_hash_set.h" @@ -43,6 +43,7 @@ class PhoneNumber; class PhoneNumberUtil; class ShortNumberInfo { + void LoadMetadataFromCollection(const PhoneMetadataCollection& metadata_collection); public: ShortNumberInfo(); ~ShortNumberInfo(); @@ -50,7 +51,7 @@ class ShortNumberInfo { private: void ClearMetadata(); public: - void ReloadMetadata(); + bool ReloadMetadata(const string& filename); #endif // ISTREAM_DATA_PROVIDER // Cost categories of short numbers. enum ShortNumberCost { diff --git a/cpp/test/phonenumbers/shortnumberinfo_test.cc b/cpp/test/phonenumbers/shortnumberinfo_test.cc index 83dc4f918..ca5a504e1 100644 --- a/cpp/test/phonenumbers/shortnumberinfo_test.cc +++ b/cpp/test/phonenumbers/shortnumberinfo_test.cc @@ -47,7 +47,7 @@ class ShortNumberInfoTest : public testing::Test { } const PhoneNumberUtil phone_util_; - const ShortNumberInfo short_info_; + ShortNumberInfo short_info_; private: DISALLOW_COPY_AND_ASSIGN(ShortNumberInfoTest); @@ -96,6 +96,11 @@ TEST_F(ShortNumberInfoTest, IsValidShortNumber) { EXPECT_TRUE(short_info_.IsValidShortNumber(shared_number)); } +TEST_F(ShortNumberInfoTest, ReloadMetadata) { + const string filename = "metadata_short.dat"; + EXPECT_TRUE(short_info_.ReloadMetadata(filename)); +} + TEST_F(ShortNumberInfoTest, IsCarrierSpecific) { PhoneNumber carrier_specific_number; carrier_specific_number.set_country_code(1); From ba64edc40818130a2fffabba984b8cc49c495790 Mon Sep 17 00:00:00 2001 From: Denys Ponomarenko Date: Mon, 21 Aug 2023 14:35:25 +0000 Subject: [PATCH 3/5] metadata convertor added --- cpp/CMakeLists.txt | 34 + cpp/metadata.dat | 267 ++++++++ cpp/metadata_short.dat | 605 ++++++++++++++++++ cpp/src/phonenumbers/metadata_convertor.cc | 51 ++ .../phonenumbers/metadata_convertor_short.cc | 51 ++ cpp/test/phonenumbers/phonenumberutil_test.cc | 7 +- cpp/test/phonenumbers/shortnumberinfo_test.cc | 2 + 7 files changed, 1016 insertions(+), 1 deletion(-) create mode 100644 cpp/metadata.dat create mode 100644 cpp/metadata_short.dat create mode 100644 cpp/src/phonenumbers/metadata_convertor.cc create mode 100644 cpp/src/phonenumbers/metadata_convertor_short.cc diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 1de908571..493f39675 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -100,6 +100,11 @@ option (BUILD_TESTING "Build testing" ON) option (BUILD_TOOLS_ONLY "Limit build to targets in ../tools/cpp" OFF) option (USE_STDMUTEX "Use C++ 2011 std::mutex for multi-threading" OFF) option (USE_POSIX_THREAD "Use Posix api for multi-threading" OFF) +option (ISTREAM_DATA_PROVIDER "Use protoduf binary file as input for metadata" OFF) + +if(ISTREAM_DATA_PROVIDER) + add_definitions ("-DISTREAM_DATA_PROVIDER") +endif() if (USE_ALTERNATE_FORMATS) add_definitions ("-DI18N_PHONENUMBERS_USE_ALTERNATE_FORMATS") @@ -553,6 +558,24 @@ if(BUILD_TESTING) "test/phonenumbers/unicodestring_test.cc" "test/phonenumbers/utf/unicodetext_test.cc") + if(ISTREAM_DATA_PROVIDER) + set (METADATA_CONVERTOR_SOURCES_TEST + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/test_metadata.cc") + + set (METADATA_CONVERTOR_SOURCES_LITE + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/lite_metadata.cc") + + set (METADATA_CONVERTOR_SOURCES + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/metadata.cc") + + set (METADATA_CONVERTOR_SOURCES_SHORT + "src/phonenumbers/metadata_convertor_short.cc" + "src/phonenumbers/short_metadata.cc") + endif() + if (BUILD_GEOCODER) set (GEOCODING_TEST_SOURCES "test/phonenumbers/geocoding/area_code_map_test.cc" @@ -572,6 +595,17 @@ if(BUILD_TESTING) # Build the testing binary. include_directories ("test") add_executable (libphonenumber_test ${TEST_SOURCES}) + if(ISTREAM_DATA_PROVIDER) + add_executable(metadata_convertor ${METADATA_CONVERTOR_SOURCES}) + add_executable(metadata_convertor_lite ${METADATA_CONVERTOR_SOURCES_LITE}) + add_executable(metadata_convertor_test ${METADATA_CONVERTOR_SOURCES_TEST}) + add_executable(metadata_convertor_short ${METADATA_CONVERTOR_SOURCES_SHORT}) + + target_link_libraries (metadata_convertor ${PROTOBUF_LIB} phonenumber) + target_link_libraries (metadata_convertor_lite ${PROTOBUF_LIB} phonenumber) + target_link_libraries (metadata_convertor_test ${PROTOBUF_LIB} phonenumber) + target_link_libraries (metadata_convertor_short ${PROTOBUF_LIB} phonenumber) + endif() set (TEST_LIBS phonenumber_testing ${GTEST_LIB}) if (NOT WIN32) diff --git a/cpp/metadata.dat b/cpp/metadata.dat new file mode 100644 index 000000000..5fb4c748f --- /dev/null +++ b/cpp/metadata.dat @@ -0,0 +1,267 @@ + + + \d{6}H\d{6}2123456 H" H* H2 H: HB HJADPZ00 H H H H + + +[1-9]\d{8}H  H H" H* H2 H: HB HJAEPZ00 H H600\d{6}2 600123456 H + + +[1-9]\d{7}HPP +[1-9]\d{7}210123456PP +[1-9]\d{7}210123456PP" H* H2 H: HB HJAMPZ00b0z0 H H H H + +  [29]\d{8}H *2\d(?:[26-9]\d|\d[26-9])\d{5}2 222123456 9[1-3]\d{7}2 923123456" H* H2 H: HB HJAOPZ00b0~0z0~0! +(\d{3})(\d{3})(\d{3})$1 $2 $3 H H H H + +[1-3689]\d{9,10}HHHH H +H $ [1-3]\d{5,9}2 +1234567890HHHH H +$9\d{10}|[1-3]\d{9}2 +9234567890H +H "80\d{8}2 +8034567890H +*6(0\d|10)\d{7}2 +6234567890H +2 H: HB HJARP6Z00b0z0(?:(11|343|3715)15)?9$1* +(\d{2})(\d{4})(\d{4})$1 $2-$311"0$14 +(\d{4})(\d{2})(\d{4})$1 $2-$3 1[02-9]|[23]"0$12 +(\d)(\d{2})(\d{4})(\d{4}) $2 15 $3-$4911"0$1F +(\d)(\d{4})(\d{2})(\d{4})$2 $3-$49(?:1[02-9]|[23])"0$1*0$1 $CC, +(\d{3})(\d{3})(\d{4})$1-$2-$3[68]"0$1* +(\d{2})(\d{4})(\d{4})$1 $2-$311"0$14 +(\d{4})(\d{2})(\d{4})$1 $2-$3 1[02-9]|[23]"0$1- +(\d)(\d{2})(\d{4})(\d{4}) $1 $2 $3 $4911; +(\d)(\d{4})(\d{2})(\d{4}) $1 $2 $3 $49(?:1[02-9]|[23]), +(\d{3})(\d{3})(\d{4})$1-$2-$3[68]"0$1 H H H H + +[1-578]\d{4,14}H H + [2378]\d{8}2 212345678H 4\d{8}2 412345678H " 1800\d{6}2 +1800123456H +*190[0126]\d{6}2 +1900123456H +2 H: HB HJAUP=Z001[12]b0z00011( +(\d{4})(\d{3})(\d{3})$1 $2 $31"$1, +(\d)(\d{4})(\d{4})$1 $2 $3[2-478]"0$1 H H H H + +246\d{7}H +P2 +2464567890P H" H* H2 H: HB HJBBPZ011 H H H H + +\d{8,10}H +P\d{8,10}212345678P H" H* H2 H: HB HJBRP7Z00 H H H H + +#(242|8(00|66|77|88)|900)\d{7}H +Pp`242(?:3(?:02|[236][1-9]|4[0-24-9]|5[0-68]|7[3-57]|9[2-5])|4(?:2[237]|51|64|77)|502|636|702)\d{4}2 +2425027890P'242(357|359|457|557)\d{4}2 +2423577890"!8(00|66|77|88)\d{7}2 +8001234567*900\d{7}2 +90012345672 H: HB HJBSPZ011b1z1 H H H H + + +[1-9]\d{5}H +[1-9]\d{5}2112345 H" H* H2 H: HB HJBYPZ810b8z 80?|99999 +(\d{4})$1[1-8]"8 $1# +(\d{2})(\d{3})$1 $2[1-8]"8$1$ +(\d{3})(\d{3})$1 $2[1-8]"8 $1 H H H H + +226\d{7}H +P226\d{7}2 +2261234567P H" H* H2 H: HB HJCAPZ011 H H H H + +\d{6,10}H +P\d{6,10}2 +2261234567P H" H* H2 H: HB HJCCP=Z00 H H H H + +-)[1-7]\d{6,11}|8[0-357-9]\d{6,9}|9\d{7,10}H  [2-9]\d{10}2912345679*1(?:[38]\d|4[57]|5[0-35-9]|7[0136-8])\d{8}2 13123456789" H* H2 H: HB HJCNPVZ00b0z0R +(\d{3})(\d{5,6})$1 $2[3-9][3-9]\d{2}[19][3-9]\d{2}(?:10|95)"0$1*$CC $1 +(\d{3})(\d{8})$1 $21"$1 H H H H + +(?:60|3\d)\d{8}H +60\d{8}2 +60123456782$3(?:0[0-5]|1\d|2[0-3]|5[01]|70)\d{7}2 +3211234567" H* H2 H: HB HJCOP9b0z0(4(?:[14]4|56)|[579])?) +(\d{3})(\d{7})$1 $26"($1)*0$CC $1# +(\d{3})(\d{7})$1 $23*0$CC $1 H H H H + +\d{8,10}H +P\d{8,10}2 +2261234567P H" H* H2 H: HB HJCXP=Z00 H H H H + +\d{4,14}HHHHHH H +H PPH8(?:[24-6]\d{2}|3[03-9]\d|[789](?:0[2-9]|[1-9]\d))\d{1,8}230123456PP6#1(5\d{9}|7\d{8}|6[02]\d{8}|63\d{7})2 15123456789H +H "800\d{7}2 +8001234567H +*(900([135]\d{6}|9\d{7})2 +9001234567H +H 2 H: HB HJDEP1Z00b0z08 +(\d{3})(\d{3,8})$1 $22|3[3-9]|906|[4-9][1-9]1"0$1, +(\d{2})(\d{4,11})$1/$2 [34]0|[68]9"0$1C +(\d{2})(\d{2})$1 $2[4-9][4-6]|[7-9](?:\d[1-9]|[1-9]\d)"0$1E +(\d{4})(\d{2,7})$1 $2[4-9][4-6]|[7-9](?:\d[1-9]|[1-9]\d)"0$1+ +(\d{3})(\d{1})(\d{6})$1 $2 $3800"0$1- +(\d{3})(\d{3,4})(\d{4})$1 $2 $3900"0$1 H H H H + + +3\d{6}H3\d{6}23123456 H" H* H2 H: HB HJFRP!Z00b0z00 +(\d)(\d{2})(\d{2})(\d{2}) $1 $2 $3 $43"0$1 H H H H + +\d{10}H H +PPP +[1-6]\d{9}2 +3123456789PPP7[1-57-9]\d{8}2 +7123456789H +"80\d{8}2 +8023456789H +* 9[018]\d{8}2 +9023456789H +2'8(?:4[3-5]|7[0-2])\d{7}2 +8433456789H +:70\d{8}2 +7033456789H +B56\d{8}2 +5633456789H +JGBP,Z00b0z06 +(\d{2})(\d{4})(\d{4})$1 $2 $3 [1-59]|[78]0"(0$1)2 +(\d)(\d{3})(\d{3})(\d{3}) $1 $2 $3 $46"(0$1)3 +(\d{4})(\d{3})(\d{3})$1 $2 $3 7[1-57-9]"(0$1)/ +(\d{3})(\d{3})(\d{4})$1 $2 $38[47]"(0$1)76\d{8}2 +7623456789H + H H H + +\d{6,10}H +P\d{6,10}2 +7033456789P H" H* H2 H: HB HJGGP,Z00 H H H H + +[0389]\d{5,10}HH H +H  0\d{9,10}2 +0123456789H +H 3\d{8,9}2 +3123456789H H +"$80(?:0\d{6}|3\d{3})2 800123456HH *!89(?:2\d{3}|9\d{6})2892123HH 2 H: HB HJITP'Z00( +(\d{2})(\d{4})(\d{4})$1 $2 $30[26]/ +(\d{3})(\d{4})(\d{3,4})$1 $2 $3 +0[13-57-9]& +(\d{3})(\d{3})(\d{3,4})$1 $2 $33 +(\d{3})(\d{3,6})$1 $28 H H H H + ++07\d{5}|[1-357-9]\d{3,10}HHHHHH H +H $07\d{5}|[1-357-9]\d{3,10}20712345 H" 0777[01]\d{2}20777012H* H2 H: HB HJJPPQZ010b0z0/ +(\d{2})(\d{4})(\d{4})$1 $2 $3[57-9]0"0$19 +(\d{2})(\d{2})(\d{3})(\d{4}) $1 $2 $3 $4[57-9]0"0$1X +(\d{2})(\d{3})(\d{4})$1 $2 $3 111|222|333(?:111|222|333)1(?:111|222|333)11"0$1P +(\d{4})(\d)(\d{4})$1 $2 $3222|333 2221|3332 +22212|3332 222120|3332"0$1, +(\d{3})(\d{2})(\d{4})$1 $2 $3[23]"0$1! +(\d{3})(\d{4})$1-$2077"0$1 +(\d{4})*$1[23]"$1 H [23]\d{3}22123H H H + +#[1-7]\d{3,9}|8\d{8}HHHHHH H +B6(?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\d{2,3}|[2-9]\d{6,7})222123456"1[0-25-9]\d{7,8}2 +1023456789H H +"80\d{7}2 801234567H * 60[2-9]\d{6}2 602345678H 2 H:50\d{8}2 +5012345678H +B70\d{8}2 +7012345678H +JKRPRZ00(?:[124-68]|[37]\d{2})b0z0(8[1-46-8]|85\d{2})?n +(\d{2})(\d{4})(\d{4})$1-$2-$31(?:0|1[19]|[69]9|5[458])|[57]0%1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"0$1 +(\d{2})(\d{3})(\d{4})$1-$2-$311(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-6][1-9][2-9];1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-6][1-9][2-9]"0$1. +(\d{3})(\d)(\d{4})$1-$2-$31311312"0$16 +(\d{3})(\d{2})(\d{4})$1-$2-$3131 131[13-9]"0$1/ +(\d{3})(\d{3})(\d{4})$1-$2-$313[2-9]"0$14 +(\d{2})(\d{2})(\d{3})(\d{4}) $1-$2-$3-$430"0$1j +(\d)(\d{4})(\d{4})$1-$2-$32(?:[26]|3[0-467])12(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"0$1 +(\d)(\d{3})(\d{4})$1-$2-$32(?:3[0-35-9]|[457-9])I2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"0$1E + (\d)(\d{3})$1-$2 +21[0-46-9]21(?:[0-247-9]|3[124]|6[1269])"0$1; + (\d)(\d{4})$1-$221[36]21(?:3[035-9]|6[03-578])"0$1k +(\d{2})(\d{3})$1-$2 [3-6][1-9]1[3-6][1-9]1(?:[0-46-9])'[3-6][1-9]1(?:[0-247-9]|3[124]|6[1269])"0$1] +(\d{2})(\d{4})$1-$2 [3-6][1-9]1[3-6][1-9]1[36]![3-6][1-9]1(?:3[035-9]|6[03-578])"0$1 H H H H + + [1-9]\d{9,10}H +H P +[2-9]\d{9}2 +2123456789H +P1\d{10}2 11234567890H "800\d{7}2 +8001234567H +*900\d{7}2 +9001234567H +2 H: HB HJMXP4Z00b01z01|04[45](\d{10})1$12 +(\d{3})(\d{3})(\d{4})$1 $2 $3[89]00"01 $10, +(\d{3})(\d{2})(\d{5})$2 $3901"01 $104 +(\d{2})(\d{4})(\d{4})$1 $2 $333|55|81"01 $10T +(\d{3})(\d{3})(\d{4})$1 $2 $3([2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]"01 $10> +(\d)(\d{2})(\d{4})(\d{4}) 045 $2 $3 $4 1(?:33|55|81)"$10Z +(\d)(\d{3})(\d{3})(\d{4}) 045 $2 $3 $4)1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])"$102 +(\d{3})(\d{3})(\d{4})$1 $2 $3[89]00"01 $10# +(\d{3})(\d{2})(\d{5})$2 $39014 +(\d{2})(\d{4})(\d{4})$1 $2 $333|55|81"01 $10T +(\d{3})(\d{3})(\d{4})$1 $2 $3([2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]"01 $107 +(\d)(\d{2})(\d{4})(\d{4}) $1 $2 $3 $4 1(?:33|55|81)S +(\d)(\d{3})(\d{3})(\d{4}) $1 $2 $3 $4)1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9]) H H H H + +![289]\d{7,9}|[3-7]\d{7}HHH H +A124099\d{3}|(?:3[2-79]|[479][2-689]|6[235-9])\d{6}224099123HHeR2(?:[027]\d{7}|9\d{6,7}|1(?:0\d{5,7}|[12]\d{5,6}|[3-9]\d{5})|4[1-9]\d{6}|8\d{7,8})2 201234567HH H +" +800\d{6,7}2 +8001234567H H +* +900\d{6,7}2 +9001234567H H +2 H: HB HJNZP@Z00b0z0/ +(\d)(\d{3})(\d{4})$1-$2 $3 +24|[34679]"0$1- +(\d)(\d{3})(\d{3,5})$1-$2 $32[179]"0$1. +(\d{3})(\d{3})(\d{3,4})$1 $2 $3[89]"0$1 H H H H + + +[1-9]\d{8}H  H,(?:5[01]|6[069]|7[289]|88)\d{7}2 501234567"800\d{6}2 800123456*70\d{7}2 7012345672 H: HB HJPLP0Z00b0z00 +(\d{2})(\d{3})(\d{2})(\d{2}) $1 $2 $3 $4"0$1 H H H H + + +[268]\d{8}H 262\d{6}2 2621612346(?:9[23]|47)\d{6}2 692123456"80\d{7}2 801234567*1$8(?:1[01]|2[0156]|84|9[0-37-9])\d{6}2 8101234562 H: HB HJREPZ00b0z00 +(\d{3})(\d{2})(\d{2})(\d{2}) $1 $2 $3 $4"0$1 H262|6(?:9[23]|47)|8 H H H + + [347-9]\d{9}H + +[348]\d{9}2 +30112345679\d{9}2 +9123456789" H* H2 H: HB HJRUPZ810b8z8 H H H H + + \d{9}H  2 123456789 H" H* H2 H: HB HJSEP.Z00 H H H H + +[13689]\d{7,10}HH +H  [36]\d{7}231234567H [89]\d{7}281234567H" +1?800\d{7}2 +8001234567H +H * 1900\d{7}2 19001234567H 2 H: HB HJSGPAZ 0[0-3][0-9]z777777% +(\d{4})(\d{4})$1 $2 [369]|8[1-9]( +(\d{4})(\d{3})(\d{4})$1 $2 $31[89]& +(\d{3})(\d{3})(\d{4})$1 $2 $3800 H H H H + +8\d{3,7}HHH8\d{5}2812345H8\d{3}28123H"8\d{7}281234567H* H2 H: HB HJTAPZ00 H H H H + +"[13-689]\d{9}|2[0-35-9]\d{8}H +P,[13-689]\d{9}|2[0-35-9]\d{8}2 +1234567890P,[13-689]\d{9}|2[0-35-9]\d{8}2 +1234567890P"#8(?:00|66|77|88)\d{7}2 +8004567890*900\d{7}2 +90045678902 H: HB HJUSPZ011b1j extn. z1 +(\d{3})(\d{4})$1 $2# +(\d{3})(\d{3})(\d{4})$1 $2 $30# +(\d{3})(\d{3})(\d{4})$1 $2 $30 H800\d{7}2 +8004567890 H H + + [69]\d{8}H P 6122\d{5}2 662345678P9[0-57-9]\d{7}2 912345678" H* H2 H: HB HJUZPZ810b8z88~108 +(\d{2})(\d{3})(\d{2})(\d{2}) $1 $2 $3 $4[679]"8 $1 H H H H + + +[268]\d{8}H 2696[0-4]\d{4}2 269601234639\d{6}2 639123456"80\d{7}2 801234567* H2 H: HB HJYTPZ00b0z0 H269|639 H H H + + \d{8}H H H"\d{8}212345678* H2 H: HB HJ001P +(\d{4})(\d{4})$1 $2 H H H H + + \d{9}H  H\d{9}2 123456789" H* H2 H: HB HJ001P +(\d)(\d{4})(\d{4})$1 $2 $3 H H H H + + \d{9}H  H H" H*\d{9}2 1234567892 H: HB HJ001P +(\d)(\d{4})(\d{4})$1 $2 $3 H H H H \ No newline at end of file diff --git a/cpp/metadata_short.dat b/cpp/metadata_short.dat new file mode 100644 index 000000000..f73f1fb83 --- /dev/null +++ b/cpp/metadata_short.dat @@ -0,0 +1,605 @@ + + + 9\d\dH" +9(?:11|99)2911* HJAC +9(?:11|99)2911 +9(?:11|99)2911 H H H +{ + 1\d\dH"11[0268]2110* HJAD11[0268]211011[0268]2110 H H H + + [149]\d{2,3}HH" 112|99[7-9]2112H* HJAE 112|99[7-9]2112H112|445[16]|99[7-9]2112 H H445\d24450H + +[14]\d\d(?:\d{2})?HH" 1(?:0[02]|19)2100H* HJAF 1(?:0[02]|19)2100H1(?:0[02]|19)|404042100 H404\d\d240400H404\d\d240400H + + [19]\d\dH" 9(?:11|88|99)2911* HJAG +9(?:11|99)2911176|9(?:11|88|99)2176 H +1762176 +1762176 + + [19]\d\dH" +9(?:11|88)2911* HJAI +9112911176|9(?:11|88)2176 H +1762176 +1762176 + + [15]\d{2,5}HHHH"0%1(?:1(?:2|6[01]\d\d)|2[7-9]|3[15]|41)2112HH*5\d{4}250000HJAL1(?:12|2[7-9])2112HUN1(?:1(?:6(?:000|1(?:06|11|23))|8\d\d)|65\d|89[12])|5\d{4}|1(?:[1349]\d|2[2-9])2110 H 1232123H +131|5\d{4}2131HH + + [148]\d{2,4}HHH"10[1-3]2101H* HJAM10[1-3]2101H(?:1|8[1-7])\d\d|404042100 H404\d\d240400H404\d\d240400H +x + 1\d\dH"11[235]2112* HJAO11[235]211211[235]2112 H H H + +[01389]\d{1,4}HHHH">4000|1(?:0[0-35-7]|1[0245]|2[015]|3[47]|4[478]|9)|911219HH* HJAR 10[017]|9112100HE?000|1(?:0[0-35-7]|1[02-5]|2[015]|3[47]|4[478]|9)|3372|89338|911219 H893\d\d289300H(?:337|893\d)\d23370HH + +[49]\d\d(?:\d{2})?HH" +9(?:11|88)2911H* HJAS 9112911H40404|9(?:11|88)2911 H H404\d\d240400H + +"[168]\d\d(?:\d(?:\d{2})?)?HHH"921(?:12|2[0238]|3[03]|4[0-247])|1(?:16\d\d|4[58])\d2112* HJAT1(?:[12]2|33|44)2112H_X1(?:1(?:2|6(?:00[06]|1(?:17|23)))|2[0238]|3[03]|4(?:[0-247]|5[05]|84))|(?:61|8108[1-3])02112 H 610|810\d{3}2610HH H + + [0-27]\d{2,7}HHHHHH"+000|1(?:06|12|258885|55\d)|7332000HHH*+1(?:2(?:34|456)|9\d{4,6})21234HHHHHJAU000|1(?:06|12)2000H000|1(?:06|1(?:00|2|9[46])|2(?:014[1-3]|[23]\d|(?:4|5\d)\d{2,3}|68[689]|72(?:20|3\d\d)|8(?:[013-9]\d|2))|555|9\d{4,6})|225|7(?:33|67)2000'1(?:1[09]\d|24733)|225|7672225HHH1(?:258885|55\d)21550HH 19\d{4,6}2190000HHH + + [19]\d\dH"100|9112100* HJAW100|91121001(?:00|18|76)|91[13]2100 H +1762176 +1762176 + +[17]\d\d(?:\d{2})?HH" 1122112H* HJAX 1122112H112|75[12]\d\d2112 H H H + + [148]\d{2,3}HH"1(?:0[1-3]|12)2101H* HJAZ1(?:0[1-3]|12)2101H"1(?:0[1-3]|12)|(?:404|880)02101 H (?:404|880)\d24040H (?:404|880)\d24040H + +1\d{2,5}HHHH"1(?:16\d{3}|2[2-4])2122HH* HJBA12[2-4]2122He^1(?:16(?:00[06]|1(?:1[17]|23))|2(?:0[0-7]|[2-5]|6[0-26])|(?:[3-5]|7\d)\d\d)|1(?:18|2[78])\d\d?2122 H H H + + [2-689]\d\dH" 988|[2359]112211* HJBB[2359]112211 988|[2-689]112211 H[468]112411 H + + [1579]\d{2,4}HHH"10[0-26]|[19]992100H* HJBD10[0-2]|[19]992100H1(?:0(?:[0-369]|5[1-4]|7[0-4]|8[0-29])|1[16-9]|2(?:[134]|2[0-5])|3(?:1\d?|6[3-6])|5[2-9])|5012|786|9594|[19]99|1(?:0(?:50|6\d)|33|4(?:0|1\d))\d2100 H*1(?:11|2[13])|(?:501|959)\d|7862111HH959\d29590H + +"[1-9]\d\d(?:\d(?:\d{2})?)?HHH";41(?:0[0-35-8]|1[0269]|7(?:12|77)|813)|(?:116|8)\d{3}2100*:01(?:2[03]|40)4|(?:1(?:[24]1|3[01])|[2-79]\d\d)\d21204HJBE 1(?:0[01]|12)2100H1(?:0[0-8]|16117|2(?:12|3[0-24])|313|414|5(?:1[05]|5[15]|66|95)|6(?:1[167]|36|6[16])|7(?:[07][017]|1[27-9]|22|33|65)|81[39])|[2-9]\d{3}|11[02679]|1(?:1600|45)0|1(?:[2-4]9|78)9|1[2-4]0[47]2100 H H +[2-9]\d{3}22000H +m +1\dH" 1[78]217* HJBF 1[78]217 1[78]217 H H H + +1\d\d(?:\d{3})?HH""1(?:1(?:2|6\d{3})|50|6[06])2112* HJBG1(?:12|50|6[06])2112H(!1(?:1(?:2|6(?:000|111))|50|6[06])2112 H H H + +[0189]\d\d(?:\d{2})?HH" (?:0[167]|81)\d{3}|[19]992199* 9[148]\d{3}291000HJBH[19]992199HSL1(?:[02]\d|12|4[01]|51|8[18]|9[169])|99[02489]|(?:0[167]|8[158]|9[148])\d{3}2100 H!0[67]\d{3}|88000|98555206000H 88000|98555288000H + + [16-9]\d{2,3}HH" 11[237]|6112112H* HJBI11[237]2112H=61(?:1\d|5[2-9]|6[0-256])|611|7(?:10|77|979)|8[28]8|9002110 H611|7(?:10|77)|888|9002611H +(?:71|90)02710H + + [17]\d{2,3}HH"11[78]|7[3-5]\d\d2117* HJBJ11[78]2117H' 1(?:1[78]|2[02-5]|60)|7[0-5]\d\d2117 H12[02-5]2120H H +d +1\dH"18218* HJBL1821818218 H H H + + [19]\d\dH" +9(?:11|88)2911* HJBM +9112911176|9(?:11|88)2176 H +1762176 +1762176 +x + 9\d\dH"99[135]2991* HJBN99[135]299199[135]2991 H H H + +[14]\d\d(?:\d{2})?HH"11[089]2110H* HJBO11[089]2110H 11[089]|404042110 H H404\d\d240400H + + [19]\d\dH"112|9112112* HJBQ112|91121121(?:12|76)|9112112 H +1762176 +1762176 + + [1-69]\d{2,5}HHHH":/1(?:00|12|28|8[015]|9[0-47-9])|4(?:57|82\d)|9112100HH* HJBR1(?:12|28|9[023])|9112112H1(?:0(?:[02]|3(?:1[2-579]|2[13-9]|3[124-9]|4[1-3578]|5[1-468]|6[139]|8[149]|9[168])|5[0-35-9]|6(?:0|1[0-35-8]?|2[0145]|3[0137]?|4[37-9]?|5[0-35]|6[016]?|7[137]?|8[5-8]|9[1359]))|1[25-8]|2[357-9]|3[024-68]|4[12568]|5\d|6[0-8]|8[015]|9[0-47-9])|2(?:7(?:330|878)|85959?)|(?:32|91)1|4(?:0404?|57|828)|55555|6(?:0\d{4}|10000)|(?:133|411)[12]2100102|273\d\d|3212102HH5(151|(?:278|555)\d\d|4(?:04\d\d?|11\d|57)2151HHH?8285\d{2,3}|321|40404|(?:27[38]\d|482)\d|6(?:0\d|10)\d{3}2321 + + 9\d\dH" 9(?:1[19]|88)2911* HJBS 91[19]2911 9(?:1[19]|88)2911 H H H + +[14]\d\d(?:\d{2})?HH"11[023]2110H* HJBT11[023]2110H 11[0-6]|404042110 H H404\d\d240400H + +[19]\d\d(?:\d{2})?HH"9(?:11|9[7-9])2911H* HJBW9(?:11|9[7-9])2911H+$1(?:1[26]|3123)|9(?:1[14]|9[1-57-9])2112 H131\d\d213100H131\d\d213100H + + 1\d\dH"1(?:0[1-3]|12)2101* HJBY1(?:0[1-3]|12)2101?81(?:0[1-79]|1[246]|35|5[1-35]|6[89]|7[5-7]|8[58]|9[1-7])2101 H H H + + 9\d\d?HH"9(?:0|11|22|66|77|9[09])290* HJBZ 9(?:0|11|90)2909(?:0|11|22|66|77|9[09])290 H H H + +-#[1-9]\d\d(?:\d\d(?:\d(?:\d{2})?)?)?HHHH"112|988|[29]112112H* HJCA112|9112112H81112|30000\d{3}|[1-35-9]\d{4,5}|[2-8]11|9(?:11|88)2112 H [235-7]112211H'300\d{5}|[1-35-9]\d{4,5}210000HHH +{ + [01]\d\dH"000|1122000* HJCC000|1122000000|1122000 H H H + +[14]\d\d(?:\d{2})?HH"1(?:1[348]|77|88)2113H* HJCD1(?:1[348]|77|88)2113H!1(?:1[348]|23|77|88)|404042113 H404\d\d240400H404\d\d240400H + +1\d{2,3}HH"1(?:1[78]|22\d)2117* HJCF1(?:1[78]|220)21171(?:1[478]|220)2114 H H H +y + 1\d\dH"11[178]2111* HJCG 11[78]2117 11[126-8]2111 H H H + + [1-9]\d{2,5}HHHH".!1(?:1(?:[278]|6\d{3})|4[47])|52002112HHH**1(?:14|8[0-2589])\d|543|831112543HHHJCH1(?:1[278]|44)2112Hz1(?:0[78]\d\d|1(?:[278]|45|6(?:000|111))|4(?:[03-57]|1[0145])|6(?:00|[1-46])|8(?:02|1[189]|[25]0|7|8[08]|99))|[2-9]\d{2,4}2112+ 1(?:4[035]|6[1-46])|1(?:41|60)\d2140HH 5(?:200|35)2535HH [2-9]\d{2,4}2200HHH + + [14]\d{2,3}HH"1(?:1[01]|[78]0)2110H* HJCI1(?:1[01]|[78]0)2110H1(?:1[01]|[78]0)|44432110 H444\d24440H444\d24440H +x + 9\d\dH"99[689]2996* HJCK99[689]299699[689]2996 H H H + + [1-9]\d{2,4}HHH"$1(?:213|3[1-3])|434\d|9112131HH*1(?:211|3(?:13|[348]0|5[01]))|(?:1(?:[05]6|[48]1|9[18])|2(?:01\d|[23]2|77|88)|3(?:0[59]|13|3[279]|66)|4(?:[12]4|36\d|4[017]|55)|5(?:00|41\d|5[67]|99)|6(?:07\d|13|22|3[06]|50|69)|787|8(?:[01]1|[48]8)|9(?:01|[12]0|33))\d21060HHJCL 13[1-3]|9112131H1(?:00|21[13]|3(?:13|[348]0|5[01])|4(?:0[02-6]|17|[379])|818|919)|2(?:0(?:01|122)|22[47]|323|777|882)|3(?:0(?:51|99)|132|3(?:29|[37]7)|665)|43656|5(?:(?:00|415)4|5(?:66|77)|995)|6(?:131|222|366|699)|7878|8(?:011|11[28]|482|889)|9(?:01|1)1|13\d|4(?:[13]42|243|4(?:02|15|77)|554)|(?:1(?:[05]6|98)|339|6(?:07|[35])0|9(?:[12]0|33))02100 (?:200|333)\d22000H H13(?:13|[348]0|5[01])|(?:1(?:[05]6|[28]1|4[01]|9[18])|2(?:0(?:0|1\d)|[23]2|77|88)|3(?:0[59]|13|3[2379]|66)|436\d|5(?:00|41\d|5[67]|99)|6(?:07\d|13|22|3[06]|50|69)|787|8(?:[01]1|[48]8)|9(?:01|[12]0|33))\d|4(?:[1-3]4|4[017]|55)\d21060HH + + [18]\d{1,3}HHH"1(?:1[37]|[37])213HH* HJCM1(?:1[37]|[37])213HH1(?:1[37]|[37])|8711213 H871\d28710H871\d28710H + +[19]\d\d(?:\d{2,3})?HHH" 1(?:1[09]|20)2110H* HJCN 1(?:1[09]|20)2110H&1(?:00\d\d|1[029]|20)|95\d{3,4}21101(?:00\d\d|12)|95\d{3,4}2112 H H + +[1-589]\d\d(?:\d{2,3})?HHH"1(?:1[29]|23|32|56)2112H* HJCO1(?:1[29]|23|32|56)2112Hx1(?:06|1[2-9]|2[35-7]|3[27]|4[467]|5[36]|6[4-7]|95)|(?:29002|39003)9|40404|5930\d\d|85432|(?:[2359][57]|8(?:7|9\d))\d{3}2106 H(?:40|85)4\d\d240400H(?:40|85)4\d\d240400H + + [1359]\d{2,3}HH"112|9112112H* HJCR112|9112112H1(?:0(?:00|15|2[2-4679])|1(?:1[0-35-9]|2|37|[46]6|7[57]|8[79]|9[0-379])|2(?:00|[12]2|34|55)|3(?:21|33)|4(?:0[06]|1[4-6])|5(?:15|5[15])|693|7(?:00|1[7-9]|2[02]|[67]7)|975)|3855|5(?:0(?:30|49)|510)|9112112 H H!(?:385|5(?:0[34]|51))\d23850H + +[12]\d\d(?:\d{3,4})?HHH"!10[4-7]|(?:116|204\d)\d{3}2104* HJCU10[4-6]2104H)"1(?:0[4-7]|1(?:6111|8)|40)|20452522104 H H H +x + 1\d\dH"13[0-2]2130* HJCV13[0-2]213013[0-2]2130 H H H + + [19]\d\dH"112|9112112* HJCW112|91121121(?:12|76)|9112112 H +1762176 +1762176 +{ + [01]\d\dH"000|1122000* HJCX000|1122000000|1122000 H H H + +1\d\d(?:\d{3})?HH"1(?:1(?:2|6\d{3})|99)2112* HJCY +1(?:12|99)2112H"1(?:1(?:2|6(?:000|111))|99)2112 H H H + +1\d{2,5}HHHH"1&1(?:1(?:2|6(?:00[06]|1(?:11|23)))|5\d)2112HH* HJCZ 1(?:12|5\d)2112H=61(?:1(?:2|8\d)|(?:2|3\d)\d{2,3}|5\d|99)|1(?:16|4)\d{3}2112 H H H + +1\d\d(?:\d{2,3})?HHH"11(?:[02]|6\d{3})2110HH* HJDE11[02]2110H;411(?:[025]|6(?:00[06]|1(?:1[167]|23))|800\d)|118\d\d2110 H H H +m +1\dH" 1[78]217* HJDJ 1[78]217 1[78]217 H H H + +1\d{2,5}HHHH"11(?:[24]|6\d{3})2112HH* HJDK11[24]2112HRK1(?:1(?:[2-48]|6(?:00[06]|111))|619[0-2]|8(?:01|1[0238]|28|30|5[13]|8[18]))2112 H H H + + [39]\d\dH"333|9(?:11|88|99)2333* HJDM333|9(?:11|99)2333333|9(?:11|88|99)2333 H H H + + [19]\d\dH"112|9(?:11|88)2112* HJDO112|9112112112|9(?:11|88)2112 H H H + + [17]\d{1,3}HHH"1(?:12|[47]|54\d)214* HJDZ 1(?:12|[47])214HH1(?:055|12|[47]|548)|730214 H 7302730H 7302730H + + [19]\d\dH"1(?:0[12]|12)|9112101* HJEC1(?:0[12]|12)|91121011(?:0[12]|12)|9112101 H H H + +1\d{2,5}HHHH"1(?:1(?:[02]|6\d{3})|2(?:05|28)|3(?:014|3(?:21|5\d?)|660)|492|5(?:1[03]|410|501)|6(?:112|333|644)|7(?:012|127|89)|8(?:10|8[57])|9(?:0[134]|14))2110*1(?:18(?:00|[12458]\d?)|2(?:0(?:[02-46-8]\d?|1[0-36])|1(?:[0-4]\d?|6[06])|2(?:[0-4]\d?|5[25])|[367]|4(?:0[04]|[12]\d?|4[24]|54)|55[12457])|3(?:0(?:[02]\d?|1[13578]|3[356])|1[1347]|2[02-5]|3(?:[01347]\d?|2[023]|88)|4(?:[35]\d?|4[34])|5(?:3[134]|5[035])|666)|4(?:2(?:00|4\d?)|4(?:0[01358]|1[024]|50|7\d?)|900)|5(?:0[0-35]|1(?:[1267]\d?|5[0-7]|82)|2(?:[014-6]\d?|22)|330|4(?:[35]\d?|44)|5(?:00|[1-69]\d?)|9(?:[159]\d?|[38]0|77))|6(?:1(?:00|1[19]|[35-9]\d?)|2(?:2[26]|[68]\d?)|3(?:22|36|6[36])|5|6(?:[0-359]\d?|6[0-26])|7(?:00|55|7\d?|8[89])|9(?:00|1\d?|69))|7(?:0(?:[023]\d?|1[0578])|1(?:00|2[034]|[4-9]\d?)|2(?:[07]\d?|20|44)|7(?:[0-57]\d?|9[79])|8(?:0[08]|2\d?|8[0178])|9(?:00|97))|8(?:1[127]|8[1268]|9[269])|9(?:0(?:[02]\d?|69|9[0269])|1[1-3689]|21))2123HHHJEE11[02]2110H1(?:1(?:[02-579]|6(?:000|111)|8(?:[09]\d|[1-8]))|2[36-9]|3[7-9]|4[05-7]|5[6-8]|6[05]|7[3-6]|8[02-7]|9[3-9])|1(?:2[0-245]|3[0-6]|4[1-489]|5[0-59]|6[1-46-9]|7[0-27-9]|8[189]|9[0-2])\d\d?2110 H H1(?:18[1258]|2(?:0(?:1[036]|[46]\d?)|166|21|4(?:0[04]|1\d?|5[47])|[67])|3(?:0(?:1[13-578]|2\d?|3[56])|1[15]|2[045]|3(?:[13]\d?|2[13])|43|5(?:00|3[34]|53))|44(?:0[0135]|14|50|7\d?)|5(?:05|1(?:[12]\d?|5[1246]|8[12])|2(?:[01]\d?|22)|3(?:00|3[03])|4(?:15|5\d?)|500|9(?:5\d?|77|80))|6(?:1[35-8]|226|3(?:22|3[36]|66)|644|7(?:00|7\d?|89)|9(?:00|69))|7(?:01[258]|1(?:00|[15]\d?)|2(?:44|7\d?)|8(?:00|87|9\d?))|8(?:1[128]|8[56]|9(?:[26]\d?|77))|90(?:2\d?|69|92))2126HHH + +[13]\d\d(?:\d{2})?HH" 1(?:2[23]|80)2122H* HJEG 1(?:2[23]|80)2122H$1(?:2[23]|[69]\d{3}|80)|344002122 H344\d\d234400H344\d\d234400H + + 1\d\d?HH" 1(?:[59]|77)215* HJEH 1(?:[59]|77)215 1(?:[59]|77)215 H H H + +[12]\d\d(?:\d{3})?HH"&11[2-46]|(?:12[47]|20[12])\d{3}2112* HJERA:1(?:1[2-46]|24422)|20(?:1(?:606|917)|2914)|(?:1277|2020)992112@91(?:1[2-6]|24422)|20(?:1(?:606|917)|2914)|(?:1277|2020)992112 H H H + +[0-379]\d{2,5}HHHH"H;0(?:16|6[57]|8[58])|1(?:006|12|[3-7]\d\d)|(?:116|20\d)\d{3}2016HHH*SL[12]2\d{1,4}|90(?:5\d|7)|(?:118|2(?:[357]\d|80)|3[357]\d)\d\d|[79]9[57]\d{3}2120JES +08[58]|1122085H0(?:1[0-26]|6[0-257]|8[058]|9[12])|1(?:0[03-57]\d{1,3}|1(?:2|6(?:000|111)|8\d\d)|2\d{1,4}|[3-9]\d\d)|2(?:2\d{1,4}|80\d\d)|90(?:5[124578]|7)|1(?:3[34]|77)|(?:2[01]\d|[79]9[57])\d{3}|[23][357]\d{3}2010*0(?:[16][0-2]|80|9[12])|21\d{4}2010HH!1(?:3[34]|77)|[12]2\d{1,4}2120D7(?:2[0-2]\d|3[357]|[79]9[57])\d{3}|2(?:[2357]\d|80)\d\d222000HH + + 9\d\d?HH"9(?:07|11?|2|39?|9[17])291* HJET9(?:11?|2|39?|9[17])291 9(?:07|11?|2|39?|45|9[17])291 H H H + +[17]\d\d(?:\d{2,3})?HHH"11(?:2|6\d{3})2112HH* HJFI 1122112H3,11(?:2|6(?:00[06]|1(?:1[17]|23)))|75[12]\d\d2112 H H H + +"[0-579]\d(?:\d(?:\d{2})?)?HHH"91[17]2911H* HJFJ91[17]2911HJD0(?:1[34]|8[1-4])|1(?:0[1-3]|[25]9)|2[289]|30|40404|91[137]|[45]4|75222 H H404\d\d240400H +u + [19]\d\dH" +9992999* HJFK +9992999 1\d\d|9992100 H H H + +[39]\d\d(?:\d{3})?HH" 320\d{3}|9112911* HJFM (?:32022|91)12911 (?:32022|91)12911 H H H + +1\d{2,3}HH"1(?:1[24]|81\d)2112* HJFO11[24]2112H.'1(?:1[248]|819)|1(?:4[124]|71|8[7-9])\d2112 H H H + + [1-8]\d{1,5}HHHHH"SM1(?:0(?:07|[13]3)|1[02459]|[578]|9[167])|224|(?:3370|74)0|(?:116\d|3[01])\d\d215*5'366\d\d|3[2-9]\d\d|(?:118|[4-8]\d)\d{3}23200HHHJFR 1(?:12|[578])215HH|1(?:0\d\d|1(?:[02459]|6(?:000|111)|8\d{3})|[578]|9[167])|2(?:0(?:00|2)0|24)|[3-8]\d{4}|3\d{3}|6(?:1[14]|34)|7(?:0[06]|22|40)215D910(?:[134]4|2[23]|5\d|99)|202\d|634|70[06]|(?:106|61)[14]2611HHF7118777|224|6(?:1[14]|34)|7(?:0[06]|22|40)|20(?:0\d|2)\d2224HHHH114|[3-8]\d{4}2114HH + + 1\d(?:\d{2})?HH"18|1(?:3\d|73)\d218* HJGA1(?:3\d\d|730|8)2181(?:3\d\d|730|8)218 H H H + +[1-46-9]\d{2,5}HHHH"B;1(?:05|1(?:[29]|6\d{3})|7[56]\d|8000)|2(?:20\d|48)|4444|9992105* HJGB112|9992112H1(?:0[015]|1(?:[129]|6(?:000|1(?:11|23))|8\d{3})|2(?:[1-3]|50)|33|4(?:1|7\d)|571|7(?:0\d|[56]0)|800\d|9[15])|2(?:0202|1300|2(?:02|11)|3(?:02|336|45)|4(?:25|8))|3[13]3|4(?:0[02]|35[01]|44[45]|5\d)|(?:[68]\d|7[089])\d{3}|15\d|2[02]2|650|789|9(?:01|99)2100 HL?1(?:(?:25|7[56])\d|571)|2(?:02(?:\d{2})?|[13]3\d\d|48)|4444|9012202HHH8,(?:125|2(?:020|13\d)|(?:7[089]|8[01])\d\d)\d21250HH + + [19]\d\dH" +9(?:11|88)2911* HJGD +9112911176|9(?:11|88)2176 H +1762176 +1762176 + +[014]\d\d(?:\d{2})?HH""0(?:11|33)|11[1-3]|[01]222011H* HJGE"0(?:11|33)|11[1-3]|[01]222011H&0(?:11|33)|11[1-3]|40404|[01]222011 H404\d\d240400H404\d\d240400H +p +1\dH" 1[578]215* HJGF 1[578]215 1[578]215 H H H + + [19]\d{2,5}HHHH"112|9992112H* HJGG112|9992112HB;1(?:0[01]|1[12]|23|41|55|9[05])|999|1(?:1[68]\d\d|47|800)\d2100 H H H + +[14589]\d{2,4}HHH" 19[1-3]|9992191H* HJGH 19[1-3]|9992191H$19[1-3]|40404|(?:54|83)00|9992191 H 404\d\d|(?:54|83)0\d25400HH 404\d\d|(?:54|83)0\d25400HH + + [158]\d{2,5}HHHH"L?1(?:00|1[25]|23|4(?:1|7\d)|5[15]|9[02-49])|555|(?:116\d|80)\d\d2100HHH* 8[1-69]\d\d28100HJGI 1(?:12|9[09])2112Hz1(?:00|1(?:[25]|6(?:00[06]|1(?:1[17]|23))|8\d\d)|23|4(?:1|7[014])|5[015]|9[02-49])|555|8[0-79]\d\d|8(?:00|4[0-2]|8[0-589])2100 +150|87\d\d2150HHH=1(?:00|1(?:5|8\d\d)|23|51|9[2-4])|555|8(?:00|4[0-2]|8[0-589])2100HH H +l + 1\d\dH" +1122112* HJGL +1122112 +1122112 H H H + + 1\d\d?HH"1(?:1[6-8]|[6-8])216* HJGM1(?:1[6-8]|[6-8])2161(?:1[6-8]|[6-8])216 H H H + +[14]\d\d(?:\d{2})?HH" H* HJGN H +12\d|404042120 H404\d\d240400H404\d\d240400H +p +1\dH" 1[578]215* HJGP 1[578]215 1[578]215 H H H + +1\d\d(?:\d{2,3})?HHH"*1(?:0[089]|1(?:2|6\d{3})|66|99)2100HH* HJGR1(?:00|12|66|99)2100HB;1(?:0[089]|1(?:2|320|6(?:000|1(?:1[17]|23)))|(?:389|9)9|66)2100113\d\d211300H H H + + [14]\d{2,4}HHH" 1(?:10|2[03])2110H* HJGT 1(?:10|2[03])2110H 110|40404|1(?:2|[57]\d)\d2110 H404\d\d240400H404\d\d240400H +z + 9\d\dH" +9(?:11|88)2911* HJGU +9112911 +9(?:11|88)2911 H H H +x + 1\d\dH"11[378]2113* HJGW11[378]211311[378]2113 H H H + + [019]\d{2,3}HH"91[1-3]2911H* HJGY91[1-3]2911HTM0(?:02|(?:17|80)1|444|7(?:[67]7|9)|9(?:0[78]|[2-47]))|1(?:443|5[568])|91[1-3]2002 H144\d21440H144\d21440H + + [19]\d{2,6}HHHHH" +112|99[29]2112H* HJHK +112|99[29]2112H1(?:0(?:(?:[0136]\d|2[14])\d{0,3}|8[138])|12|2(?:[0-3]\d{0,4}|(?:58|8[13])\d{0,3})|7(?:[135-9]\d{0,4}|219\d{0,2})|8(?:0(?:(?:[13]|60\d)\d|8)|1(?:0\d|[2-8])|2(?:0[5-9]|(?:18|2)2|3|8[128])|(?:(?:3[0-689]\d|7(?:2[1-389]|8[0235-9]|93))\d|8)\d|50[138]|6(?:1(?:11|86)|8)))|99[29]|10[0139]2100 H109|1(?:08|85\d)\d2109HHH 9922992H + +[14]\d\d(?:\d{2})?HH" 1992199H* HJHN 1992199H 199|404042199 H404\d\d240400H404\d\d240400H + + [19]\d{1,5}HHHHH"3%1(?:12|9[2-4])|9[34]|1(?:16\d|39)\d\d293HHHH*118\d\d211800HJHR1(?:12|9[2-4])|9[34]293HHJD1(?:1(?:2|6(?:00[06]|1(?:1[17]|23))|8\d\d)|3977|9(?:[2-5]|87))|9[34]293 H139\d\d213900H139\d\d213900H + +[14]\d\d(?:\d{2})?HH"11[48]2114H* HJHT11[48]2114H 11[48]|404042114 H404\d\d240400H404\d\d240400H + +1\d{2,5}HHHH"2+1(?:0[457]|12|4[0-4]\d)|1(?:16\d|37|45)\d\d2104* HJHU1(?:0[457]|12)2104H1(?:0[457]|1(?:2|6(?:000|1(?:11|23))|800)|2(?:0[0-4]|1[013489]|2[0-5]|3[0-46]|4[0-24-68]|5[0-2568]|6[06]|7[0-25-7]|8[028]|9[08])|37(?:00|37|7[07])|4(?:0[0-5]|1[013-8]|2[034]|3[23]|4[02-9]|5(?:00|41|67))|777|8(?:1[27-9]|2[04]|40|[589]))2104 H-!1(?:4[0-4]|77)\d|1(?:18|2|45)\d\d21200HH184\d21840H + +[178]\d\d(?:\d{2,3})?HHH" 11[02389]2110H* HJID 11[02389]2110H-&1(?:1[02389]|40\d\d|50264)|71400|898872110 H(?:714|898)\d\d271400H714\d\d271400H + + [159]\d{2,5}HHHH"11(?:2|6\d{3})|9992112HH* +5[37]\d{3}253000HJIE112|9992112HHA11(?:2|6(?:00[06]|1(?:1[17]|23)))|999|(?:1(?:18|9)|5[0137]\d)\d\d211251\d{3}251000H51210251210H%51210|(?:118|5[037]\d)\d\d211800H + + [12]\d{2,4}HHH"1(?:0[0-2]|12)2100H* HJIL1(?:0[0-2]|12)2100H?81(?:0[0-2]|1(?:[013-9]\d|2)|[2-9]\d\d)|2407|(?:104|27)002100 H104\d\d210400H104\d\d210400H + +[189]\d\d(?:\d{2,3})?HHH" 9992999H* HJIM 9992999H)"1\d\d(?:\d{3})?|8(?:6444|9887)|9992100 H H8(?:64|98)\d\d286400H + +[12578]\d{2,8}HHHHHHH "1(?:0[0-248]|1[289]|21|[39][89]|4[01]|6(?:1|6\d?)|8[12])|777|800|1[05]5\d|1(?:07|51|94)\d\d?|(?:1(?:[05]5\d|70)\d|261)\d|1(?:0[369]|10|29|3[126]|9[0-256])\d2100HHHH*#11[67]\d{4}|5616156121160000HHJIN#1(?:0[0-28]|12|298)|26112100HH1(?:0(?:[0-248]|3[39]|5(?:010|6)|6[3468]|7(?:[01357]|[28]0?|4[01])|9[0135-9])|1(?:00|[289])|2(?:1|98)|3(?:11|2[0-2]|63|[89])|4[01]|5(?:1(?:0[0-36]|[127])|54)|6(?:1|6[01]?)|7000|8[12]|9(?:0[013-59]|12|25|4[4-9]\d?|50|6[1347]|[89]))|2611|5(?:0(?:0(?:0\d|1|20?)|325|5[2-79]\d{3,5})|1(?:234|555|717|818|96[49])|2(?:0(?:0[01]|[14]0)|151|555|666|888|9(?:06|99\d?))|3(?:0[01]0|131|553|(?:66|77)6)|(?:464|55[05])\d{1,3}|6(?:070|3[68]|43)|717\d)|777|800|5(?:05(?:0|1\d)|221|3(?:03|3[23]))\d{1,4}|5(?:(?:04|88)0|2(?:2[0267]|3[16])|4(?:1[04]|20|3[02])|5(?:3[16]|67)|6(?:06|[67]\d)|787|9(?:64|90))\d\d?|(?:1(?:05[79]|(?:1[67][0-2]|802)\d|55[23])\d|5(?:(?:00(?:0\d|1)|(?:304|616)\d\d)\d|1(?:0[12]|4[2-4])|2(?:2[3589]|3(?:1\d{3}|2)|4[04]|7[78])|4(?:[02]4|32\d{4}|4[04]|99)|5(?:1[25]|[36]5|4[45]|93)|7(?:(?:17\d|57)\d\d|[27]7|88)|8(?:3[4-69]|4[01]|5[58]|88(?:8\d\d|9)|99)|9(?:0(?:0|2\d{3})|55|6[67]|77|88)))\d2100,5(?:14(?:2[5-9]|[34]\d)|757555)251425HHkX1(?:(?:1[67]\d\d|70)\d\d|55330|909)|5(?:300\d|6161(?:17[89]|561))|1(?:[19][89]|21|4[01])2118HHHHHHSB1(?:39|90[019])|5(?:14(?:2[5-9]|[34]\d)|6161(?:17[89]|561)|757555)2139HHHHH + + [1479]\d{2,4}HHH"1(?:0[04]|15|22)2100H* HJIQ1(?:0[04]|15|22)2100H' 1(?:0[04]|15|22)|4432|71117|99882100 H(?:443|711\d|998)\d24430HH(?:443|711\d|998)\d24430HH + + [129]\d{2,5}HHHH"*!1(?:1[0-68]|2[0-59]|9[0-579])|9112110H* HJIR1(?:1[025]|25)|9112110H1(?:1[0-68]|2[0-59]|3[346-8]|4(?:[0147]|[289]0)|5(?:0[14]|1[02479]|2[0-3]|39|[49]0|65)|6(?:[16]6|[27]|90)|8(?:03|1[18]|22|3[37]|4[28]|88|99)|9[0-579])|20(?:[09]0|1(?:[038]|1[079]|26|9[69])|2[01])|9(?:11|9(?:0009|90))2110"1(?:5[0-469]|8[0-489])\d21500H6*(?:1(?:5[0-469]|8[0-489])|99(?:0\d\d|9))\d21500HH990\d{3}2990000H + +1\d\d(?:\d(?:\d{2})?)?HHH" 1(?:12|71\d)2112HH* HJIS 1122112Hha1(?:1(?:[28]|61(?:16|23))|4(?:00|1[145]|4[0146])|55|7(?:00|17|7[07-9])|8(?:[02]0|1[16-9]|88)|900)2112 H 14(?:0\d|41)21400H 1(?:415|90\d)21415H + + [14]\d{2,6}HHHHH"%1(?:1(?:[2358]|6\d{3})|87)2112HH*9+(?:12|4(?:[478](?:[0-4]|[5-9]\d\d)|55))\d\d21200HHHJIT11[2358]2112H1(?:0\d{2,3}|1(?:[2-57-9]|6(?:000|111))|3[39]|4(?:82|9\d{1,3})|5(?:00|1[58]|2[25]|3[03]|44|[59])|60|8[67]|9(?:[01]|2[2-9]|4\d|696))|4(?:2323|5045)|(?:1(?:2|92[01])|4(?:3(?:[01]|[45]\d\d)|[478](?:[0-4]|[5-9]\d\d)|55))\d\d2112 H HG:4(?:3(?:[01]|[45]\d\d)|[478](?:[0-4]|[5-9]\d\d)|5[05])\d\d243000HH + +"[129]\d\d(?:\d(?:\d{2})?)?HHH"112|9992112H* HJJE112|9992112HaZ1(?:00|1(?:2|8\d{3})|23|4(?:[14]|28|7\d)|5\d|7(?:0[12]|[128]|35?)|808|9[0135])|23[2-4]|9992100 H H H + + [19]\d\dH"11[029]|9(?:11|88)2110* HJJM 11[029]|9112110 1(?:1[029]|76)|9(?:11|88)2110 H +1762176 +1762176 + +[19]\d\d(?:\d{2})?HH"&1(?:0[235]|1[2-6]|9[127])|9112102H*9[0-4689]\d{3}290000HJJO1(?:12|9[127])|9112112H921(?:0[2359]|1[0-68]|9[0-24-79])|9[0-4689]\d{3}|9112102 H9[0-4689]\d{3}290000H9[0-4689]\d{3}290000H + + 1\d\dH"11[089]2110* HJJP 11[09]21101(?:0[24]|1[089]|44|89)2102 H H H + + [1-9]\d{2,4}HHH"5.1(?:1(?:[246]|9\d)|5(?:01|2[127]|6[26]\d))|9992112*909\d\d290900HJKE +11[24]|9992112H1(?:0(?:[07-9]|1[0-25]|400)|1(?:[024-6]|9[0-579])|2[1-3]|3[01]|4[14]|5(?:[01][01]|2[0-24-79]|33|4[05]|5[59]|6(?:00|29|6[67]))|(?:6[035]\d|[78])\d|9(?:[02-9]\d\d|19))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99))\d\d|9(?:09\d\d|99)|89882100 H~1(?:(?:04|6[35])\d\d|3[01]|4[14]|5(?:1\d|2[25]))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99)|909)\d\d|898\d2130IB1(?:(?:04|6[035])\d\d|4[14]|5(?:01|55|6[26]\d))|40404|8988|909\d\d2141 + + [14]\d{2,3}HH"10[1-3]2101H* HJKG10[1-3]2101H 10[1-3]|40402101 H404\d24040H404\d24040H + +[146]\d\d(?:\d{2})?HH" 11[7-9]|6662117H* HJKH 11[7-9]|6662117H11[7-9]|40404|6662117 H404\d\d240400H404\d\d240400H + + [179]\d{2,3}HH"19[2-5]|99[2-4]2192H* HJKI19[2-5]|99[2-4]2192H3,1(?:05[0-259]|88|9[2-5])|777|99[2-4]|10[0-8]2100 1032103H H H +m +1\dH" 1[78]217* HJKM 1[78]217 1[78]217 H H H + + [39]\d\dH"333|9(?:11|88|99)2333* HJKN333|9(?:11|99)2333333|9(?:11|88|99)2333 H H H + + [18]\d\dH" +11[29]|8192112* HJKP +11[29]|8192112 +11[29]|8192112 H H H + +1\d{2,4}HHH"!1(?:1[27-9]|28|330|82)2112HH* HJKR11[29]2112Hyr1(?:[016-9]114|3(?:0[01]|2|3[0-35-9]|45?|5[057]|6[569]|7[79]|8[2589]|9[0189]))|1(?:0[015]|1\d|2[01357-9]|41|8[28])2100 H4)1(?:0[01]|1[4-6]|41)|1(?:[06-9]1\d|111)\d2100HH H + +[18]\d\d(?:\d{2})?HH" 1122112H* HJKW 1122112H1[0-7]\d|898872100 H898\d\d289800H H +z + 9\d\dH" +9(?:11|88)2911* HJKY +9112911 +9(?:11|88)2911 H H H + + [134]\d{2,4}HHH"1(?:0[1-3]|12)2101H* HJKZ1(?:0[1-3]|12)2101H#1(?:0[1-4]|12)|(?:3040|404)02101 H(?:304\d|404)\d24040HH(?:304\d|404)\d24040HH +x + 1\d\dH"19[015]2190* HJLA19[015]219019[015]2190 H H H + + [19]\d\dH"1(?:12|40|75)|9992112* HJLB1(?:12|40|75)|99921121(?:12|40|75)|9992112 H H H + + 9\d\dH" 9(?:11|88|99)2911* HJLC +9(?:11|99)2911 9(?:11|88|99)2911 H H H + +1\d{2,3}HH"1(?:1[278]|44)2112H* HJLI1(?:1[278]|44)2112H.'1(?:1(?:[278]|45)|4[3-57]|50|75|81[18])2112 H H H + +1\d{2,3}HH" 11[02689]2110H* HJLK 11[02689]2110H1(?:1[024-9]|3(?:00|1[2-49]|2[23]|3[1-3]|44|5[07]|[67]9|88|9[039])|9(?:0[0-2589]|1[0-357-9]|2[0-25689]|3[0389]|4[0489]|5[014-69]|6[0-2689]|7[03579]|8[02457-9]|9[0-2569]))2110 H H H + + [3489]\d{2,3}HH"355|9112355H* HJLR355|9112355H 355|4040|8(?:400|933)|9112355 H(?:404|8(?:40|93))\d24040H(?:404|8(?:40|93))\d24040H +x + 1\d\dH"11[257]2112* HJLS11[257]211211[257]2112 H H H + +[01]\d(?:\d(?:\d{3})?)?HHH">80(?:11?|22?|33?)|1(?:0[1-3]|1(?:2|6111))|116(?:0\d|12)\d201* HJLT)0(?:11?|22?|33?)|1(?:0[1-3]|12)201HHE?0(?:11?|22?|33?)|1(?:0[1-3]|1(?:[27-9]|6(?:000|1(?:1[17]|23))))201 H H H + +1\d{2,5}HHHH"11(?:[23]|6\d{3})2112HH* HJLU11[23]2112H3,11(?:[23]|6(?:000|111))|1(?:18|[25]\d|3)\d\d2112 H H H + + [018]\d{1,5}HHHHH"%0[1-3]|11(?:[023]|6\d{3})201HHH* 1180|821\d\d21180HHJLV0[1-3]|11[023]201HHHB0[1-4]|1(?:1(?:[02-4]|6(?:000|111)|8[0189])|(?:5|65)5|77)|821[57]4201118121181H165\d21650H H +x + 1\d\dH"19[013]2190* HJLY19[013]219019[013]2190 H H H + + 1\d\d?HH" 1(?:[59]|77)215* HJMA 1(?:[59]|77)215 1(?:[59]|77)215 H H H + + 1\d\d?HH" 1(?:12|[578])215* HJMC 1(?:12|[578])2151(?:12|41|[578])215 H H H + + [19]\d{2,5}HHHH"/$11(?:2|6(?:000|1(?:11|2\d)))|90[1-3]2112HH* HJMD 112|90[1-3]2112Hd]1(?:1(?:2|6(?:00[06]|1(?:1[17]|23))|8\d\d?|99)|90[04-9])|90[1-3]|1(?:4\d\d|6[0-389]|9[1-4])\d2112 H H H + +1\d{2,5}HHHH"1(?:12|2[2-4])2112H* HJME1(?:12|2[2-4])2112Hpi1(?:1(?:(?:[013-57-9]|6\d\d)\d|2)|[249]\d{3}|5999|8(?:0[089]|1[0-8]|888))|1(?:[02-5]\d\d|60[06]|700)|12\d2112 H H H +p +1\dH" 1[578]215* HJMF 1[578]215 1[578]215 H H H + + 1\d\d?HH"1(?:1[78]|[78])217* HJMG1(?:1[78]|[78])2171(?:1[78]|[78])217 H H H +l + 9\d\dH" +9112911* HJMH +9112911 +9112911 H H H + +1\d\d(?:\d(?:\d{2})?)?HHH"$1(?:1(?:2|6\d{3})|9[2-4])2112HH* HJMK1(?:12|9[2-4])2112H2+1(?:1(?:2|8\d)|3\d|9[2-4])|1(?:16|2\d)\d{3}2112 H H H + +[136-8]\d{1,4}HHHH"7+1[578]|(?:352|67)00|7402|(?:677|744|8000)\d215HHH*=1(?:12|800)2\d|3(?:52(?:11|2[02]|3[04-6]|99)|7574)21220HHJML1[578]215H1(?:1(?:[013-9]\d|2)|2(?:1[02-469]|2[13])|[578])|350(?:35|57)|67(?:0[09]|[59]9|77|8[89])|74(?:0[02]|44|55)|800[0-2][12]|3(?:52|[67]\d)\d\d215%37(?:433|575)|7400|8001\d27400HH%3503\d|(?:3[67]\d|800)\d\d235030H7+374(?:0[24-9]|[1-9]\d)|7400|3(?:6\d|75)\d\d27400HH +l + 1\d\dH" +1992199* HJMM +1992199 +1992199 H H H +{ + 1\d\dH"10[0-35]2100* HJMN10[0-35]210010[0-35]2100 H H H +l + 9\d\dH" +9992999* HJMO +9992999 +9992999 H H H +z + 9\d\dH" +9(?:11|88)2911* HJMP +9112911 +9(?:11|88)2911 H H H + + 1\d\d?HH" 1(?:12|[578])215* HJMQ 1(?:12|[578])215 1(?:12|[578])215 H H H +m +1\dH" 1[78]217* HJMR 1[78]217 1[78]217 H H H + + [29]\d\dH" 9(?:11|88|99)2911* HJMS +9(?:11|99)2911211|9(?:11|88|99)2211 H H H + +1\d\d(?:\d{3})?HH"11(?:2|6\d{3})2112* HJMT 1122112H"11(?:2|6(?:000|1(?:11|23)))2112 H H H + + [189]\d{2,4}HHH" 11[45]|99[59]2114H* HJMU 11[45]|99[59]2114H1\d{2,4}|(?:8\d\d|99)\d2100 H H H + + [14]\d{2,3}HH" 1(?:02|1[89])2102H* HJMV 1(?:02|1[89])2102H*#1(?:[0-37-9]|[4-6]\d)\d|4040|1[45]12100 H1[45]12141H H + +[189]\d\d(?:\d{2})?HH" 199|99[7-9]2199H* HJMW 199|99[7-9]2199H199|80400|99[7-9]2199 H804\d\d280400H804\d\d280400H + + [0579]\d{2,4}HHH"0(?:6[0568]|80)|9112060H*(?:530\d|776)\d27760HHJMX0(?:6[0568]|80)|9112060H0[1-9]\d|53053|7766|9112010 H0(?:[249]0|[35][01])2020H H + + [1369]\d{2,4}HHH"112|9992112H* HJMY112|9992112H1(?:0[01348]|1(?:[02]|1[128]|311)|2(?:0[125]|[13-6]|2\d{0,2})|(?:3[1-35-79]|7[45])\d\d?|5(?:454|5\d\d?|77|888|999?)|8(?:18?|2|8[18])|9(?:[124]\d?|68|71|9[0679]))|66628|99[1-469]|13[5-7]|(?:1(?:0[569]|309|5[12]|7[136-9]|9[03])|3[23679]\d\d)\d2100666\d\d266600H H!(?:3[23679]\d|666)\d\d232000H + +1\d{2,3}HH"1(?:1[79]|9[78])2117H* HJMZ1(?:1[79]|9[78])2117H"1(?:[02-5]\d\d|1[79]|9[78])2117 H H H + + [19]\d{2,4}HHH"10111210111H* HJNA10111210111H!(?:10|93)111|(?:1\d|9)\d\d2900 H H H + + [135]\d{1,3}HHH"3-1(?:0(?:00|1[23]|3[0-2]|8\d)|[5-8])|363\d|577215* HJNC1[5-8]215HMG1(?:0(?:0[06]|1[02-46]|20|3[0-25]|42|5[058]|77|88)|[5-8])|3631|5[6-8]\d215 +5(?:67|88)2567H H H + +#[1-3578]\d(?:\d(?:\d{3})?)?HHH"1(?:18|[578])|723\d{3}215* HJNE1(?:18|[578])|723141215KE1(?:0[01]|1[128]|2[034]|3[013]|[46]0|55?|[78])|222|333|555|723141|888215 H@71(?:0[01]|1[12]|2[034]|3[013]|[46]0|55)|222|333|555|8882100H H + + 9\d\dH" 9(?:11|55|77)2911* HJNF 9(?:11|55|77)2911 9(?:11|55|77)2911 H H H + +[14]\d\d(?:\d{2})?HH" 1992199H* HJNG 1992199H 199|407002199 H407\d\d240700H407\d\d240700H + +[12467]\d{2,3}HH"1(?:1[58]|2[08])|737\d2115* HJNI1(?:1[58]|2[08])2115H@91(?:1[58]|200)|4878|7(?:010|373)|12[0158]|(?:19|[267]1)002115 H H H + +#[1349]\d\d(?:\d(?:\d{2})?)?HHH"11(?:2|6\d{3})|9112112HH* HJNL112|9112112Hng1(?:1(?:2|6(?:00[06]|1(?:11|23)))|2(?:0[0-4]|3[34]|44)|3[03-9]\d|400|8(?:[02-9]\d|1[0-79]))|[34]000|9112112 H120\d21200H[34]00\d23000H + +1\d\d(?:\d(?:\d{2})?)?HHH"11(?:[023]|6\d{3})2110HH* HJNO11[023]2110HLE1(?:1(?:[0239]|61(?:1[17]|23))|2[048]|4(?:12|[59])|7[57]|8[5-9]\d|90)2110 H H H + +1\d{2,3}HH"#1(?:0[0-36]|12)|1(?:09|11)\d2100* HJNP1(?:0[0-3]|12)2100H(!1(?:0(?:[0-36]|98)|1(?:1[1-4]|2))2100 H H H + + 1\d\dH"11[0-2]2110* HJNR11[0-2]21101(?:1[0-2]|23|92)2110 H H H +z +  [019]\d\dH" +9992999* HJNU +999299901[05]|101|9992010 H +0102010 H + + \d{3,4}HH" 1112111H* 0182018HJNZ 1112111HPI018|1(?:(?:1|37)1|(?:23|94)4|7[03]7)|[2-57-9]\d{2,3}|6(?:161|26[0-3]|742)2018 H HB;018|(?:1(?:23|37|7[03]|94)|6(?:[12]6|74))\d|[2-57-9]\d{2,3}2018 + +  [19]\d{3}H" +1444|999\d21444* HJOM 1444|999921444RJ1(?:111|222|4(?:4[0-5]|50|66|7[7-9])|51[0-8])|9999|1(?:2[3-5]|3[0-2]|50)\d21111 H H H +w + [19]\d\dH" +9112911* HJPA +9112911 10[2-4]|9112102 H H H + + 1\d\dH" 1(?:05|1[67])2105* HJPE 1(?:05|1[67])2105 1(?:05|1[67])2105 H H H +p +1\dH" 1[578]215* HJPF 1[578]215 1[578]215 H H H + + [01]\d{2,6}HHHHH" +000|11[01]2000H* HJPG +000|11[01]2000H$000|1(?:1[01]|5\d\d|6\d{2,5})2000 H H 16\d{2,5}21600HHHH + + [19]\d\dH" +11[27]|9112112* HJPH +11[27]|9112112 +11[27]|9112112 H H H + +1\d{1,3}HHH"1(?:1(?:2\d?|5)|[56])215* HJPK1(?:1(?:22?|5)|[56])215%1(?:122|3[014]|[56])|11[2457-9]215 H H H + +[19]\d\d(?:\d{2,3})?HHH"!11(?:2|6\d{3})|99[7-9]2112HH* HJPL 112|99[7-9]2112HJC1(?:1(?:2|61(?:11|23)|891[23])|9\d{3})|9(?:8[4-7]|9[1-9])|11[68]0002112 H H H + +[13]\d(?:\d{2})?HH"1[578]215H* HJPM1[578]215H 1[578]|3103215 H310\d23100H H +z + 9\d\dH" +9(?:11|88)2911* HJPR +9112911 +9(?:11|88)2911 H H H + +1\d{2,3}HH"1(?:0[0-2]|66)2100H* HJPS10[0-2]2100H1(?:0[0-2]|122|44|66|99)2100 H112\d21120H H + +1\d\d(?:\d(?:\d{2})?)?HHH"+$11[257]|1(?:16\d\d|5[1589]|8[279])\d2112* HJPT11[25]2112H1(?:0(?:45|5[01])|1(?:[2578]|600[06])|4(?:1[45]|4)|583|6(?:1[0236]|3[02]|9[169]))|1(?:1611|59)1|1[068]78|1[08]9[16]|1(?:0[1-38]|40|5[15]|6[258]|82)02112 H H H +l + 9\d\dH" +9112911* HJPW +9112911 +9112911 H H H + + [19]\d\dH"128|9112128* HJPY128|9112128 1[1-9]\d|9112110 H H H + + [129]\d{2,4}HHH" 99\d2990H* 9002900HJQA 9992999H*#9(?:00|[19]\d)|(?:1|20|9[27]\d)\d\d2100 H H H + + 1\d\d?HH" 1(?:12|[578])215* HJRE 1(?:12|[578])215 1(?:12|[578])215 H H H + + [18]\d{2,5}HHHH"11(?:2|6\d{3})2112HH**(?:1(?:18[39]|[24])|8[48])\d\d21200HHJRO 1122112Hz1(?:1(?:2|6(?:000|1(?:11|23))|8(?:(?:01|8[18])1|119|[23]00|932))|[24]\d\d|9(?:0(?:00|19)|1[19]|21|3[02]|5[178]))|8[48]\d\d2112 H H(?:1[24]|8[48])\d\d21200H + + [19]\d{1,5}HHHHH" +112|9[2-4]292HH* HJRS +112|9[2-4]292HH1[189]\d{1,4}|9[2-4]292 H H H + + [01]\d\d?HH"112|(?:0|10)[1-3]201* HJRU112|(?:0|10)[1-3]201112|(?:0|10)[1-4]201 H H H + + [14]\d\dH"11[1245]2111* HJRW 11[12]2111,%1(?:0[0-2]|1[0-24-6]|2[13]|70|99)|4562100 H H H + + [19]\d{2,5}HHHH"+ 11(?:2|6\d{3})|9(?:11|37|9[7-9])2112HH* HJSA112|9(?:11|9[79])2112Hle1(?:1(?:00|2|6111)|410|9(?:00|1[89]|9(?:099|22|9[0-3])))|9(?:0[24-79]|11|3[379]|40|66|8[5-9]|9[02-9])2112141\d21410H!1(?:10|41)\d|90[24679]2902HH H + + [127-9]\d\dH" +9992999* HJSB +9992999ib1(?:[02]\d|1[12]|[35][01]|[49][1-9]|6[2-9]|7[7-9]|8[0-8])|269|777|835|9(?:[01]1|22|33|55|77|88|99)2100 H H H + + [19]\d{2,3}HH"1(?:1[1468]|60)|9992111H* HJSC 9992999H\U1(?:[06]\d|1[0-246-8]|2[0-8]|3[13]|4[0-2]|5[15]|7[124-6]|8[158]|9[015])|9(?:6\d\d|99)2100 H H H +l + 9\d\dH" +9992999* HJSD +9992999 +9992999 H H H + +[1-37-9]\d{2,5}HHHH"+$11(?:2|(?:3|6\d)\d\d|414|77)|900\d\d2112*11811[89]|72\d{3}272000HHJSE 112|900002112HH11(?:[25]|313|6(?:00[06]|1(?:1[17]|23))|7[0-8])|2(?:2[02358]|33|4[01]|50|6[1-4])|32[13]|8(?:22|88)|9(?:0(?:00|51)0|12)|(?:11(?:4|8[02-46-9])|7\d\d|90[2-4])\d\d|(?:118|90)1(?:[02-9]\d|1[013-9])2112 H?62(?:2[02358]|33|4[01]|50|6[1-4])|32[13]|8(?:22|88)|9122220H7\d{4}270000H + + [179]\d{2,4}HHH"99[359]2993H* HJSG99[359]2993HQJ1(?:(?:[01368]\d|44)\d|[57]\d{2,3}|9(?:0[1-9]|[1-9]\d))|77222|99[02-9]|1002100 H H772\d\d277200H + + [129]\d{2,4}HHH" +9(?:11|99)2911H* HJSH +9(?:11|99)2911H%1\d{2,3}|26[01]\d\d|9(?:11|99)2100 H H H + +1\d{2,5}HHHH"&11(?:(?:0|6\d)\d\d|[23]|8\d\d?)2112* HJSI11[23]2112H{t1(?:1(?:00[146]|[23]|6(?:000|1(?:11|23))|8(?:[08]|99))|9(?:059|1(?:0[12]|16)|5|70|87|9(?:00|[149])))|19(?:08|81)[09]2112 H H H +x + 1\d\dH"11[023]2110* HJSJ11[023]211011[023]2110 H H H + +1\d{2,5}HHHH"$1(?:1(?:2|6\d{3})|5[058])2112HH* HJSK1(?:12|5[058])2112H921(?:1(?:2|6(?:000|111)|8[0-8])|[248]\d{3}|5[0589])2112 H H H + +[069]\d\d(?:\d{2})?HH" +(?:01|99)92019H* HJSL +(?:01|99)92019H(?:01|99)9|604002019 H604\d\d260400H604\d\d260400H +x + 1\d\dH"11[358]2113* HJSM11[358]211311[358]2113 H H H + + [12]\d{1,5}HHHHH"*1(?:515|[78])|2(?:00|1)\d{3}217HHHH*#2(?:0[246]|[468])\d{3}224000HHJSN 1[78]217HC=1(?:1[69]|(?:[246]\d|51)\d)|2(?:0[0-246]|[12468])\d{3}|1[278]2122(?:01|2)\d{3}222000HH 1[46]\d\d21400H 2[468]\d{3}224000H + + +[57-9]\d\dH" 555|888|9992555* HJSO 555|888|9992555555|777|888|9992555 H H H +z +1\d{2,3}HH" 1152115H* HJSR 1152115H1\d{2,3}2100 H H H +l + 9\d\dH" +9992999* HJSS +9992999 +9992999 H H H +l + 1\d\dH" +1122112* HJST +1122112 +1122112 H H H + +[149]\d\d(?:\d{2,3})?HHH" 116\d{3}|9112911HH* HJSV91[13]2911H?81(?:1(?:2|6111)|2[136-8]|3[0-6]|9[05])|40404|9(?:1\d|29)2112 H404\d\d240400H404\d\d240400H +z + 9\d\dH" +9(?:19|88)2919* HJSX +9192919 +9(?:19|88)2919 H H H +x + 1\d\dH"11[023]2110* HJSY11[023]211011[023]2110 H H H +l + 9\d\dH" +9992999* HJSZ +9992999 +9992999 H H H + + 9\d\dH" 9(?:11|88|99)2911* HJTC +9(?:11|99)2911 9(?:11|88|99)2911 H H H +m +1\dH" 1[78]217* HJTD 1[78]217 1[78]217 H H H + +1\d{2,3}HH"1(?:1[78]|7[127])2117H* HJTG1(?:1[78]|7[127])2117H1(?:011|1[078]|7[127])2110 H H H + +1\d{2,3}HH"]V1(?:1(?:00|2[03]|3[3479]|7[67]|9[0246])|578|6(?:44|6[79]|88|9[16])|88\d|9[19])|1[15]552191*%1(?:113|2[23]\d|5(?:09|56))21113HJTH1(?:669|9[19])21911(?:0[0-2]|1(?:0[03]|1[1-35]|2[0358]|3[03-79]|4[02-489]|5[04-9]|6[04-79]|7[03-9]|8[027-9]|9[02-9])|2(?:22|3[89]|66)|3(?:18|2[23]|3[013]|5[56]|6[45]|73)|477|5(?:0\d|4[0-37-9]|5[1-8]|6[01679]|7[12568]|8[0-24589]|9[013589])|6(?:0[0-29]|2[03]|4[3-6]|6[1-9]|7[0257-9]|8[0158]|9[014-9])|7(?:[14]9|7[27]|90)|888|9[19])21001(?:1(?:03|1[15]|2[58]|3[056]|4[02-49]|5[046-9]|7[03-589]|9[57-9])|5(?:0[0-8]|4[0-378]|5[1-478]|7[156])|6(?:20|4[356]|6[1-68]|7[057-9]|8[015]|9[0457-9]))|1(?:1[68]|26|3[1-35]|5[689]|60|7[17])\d21103H114[89]21148H H + + 1\d\dH"1(?:0[1-3]|12)2101* HJTJ1(?:0[1-3]|12)21011(?:0[1-3]|12)2101 H H H + + 1\d\dH" 11[25]2112* HJTL 11[25]2112(!1(?:0[02]|1[25]|2[0138]|72|9[07])2100 H H H +r +0\dH" 0[1-49]201* HJTM 0[1-3]201 0[1-49]201 H H H +x + 1\d\dH"19[078]2190* HJTN19[078]219019[078]2190 H H H + + 9\d\dH"9(?:11|22|33|99)2911* HJTO9(?:11|22|33|99)29119(?:11|22|33|99)2911 H H H + + [1-9]\d{2,4}HHH"7.1(?:1[02]|22|3[126]|4[04]|5[15-9]|6[18]|77|83)2110H* HJTR 1(?:1[02]|55)2110H1(?:1(?:[02-79]|8(?:1[018]|2[0245]|3[2-4]|42|5[058]|6[06]|7[07]|8[01389]|9[089]))|3(?:37|[58]6|65)|471|5(?:07|78)|6(?:[02]6|99)|8(?:63|95))|2(?:077|268|4(?:17|23)|5(?:7[26]|82)|6[14]4|8\d\d|9(?:30|89))|3(?:0(?:05|72)|353|4(?:06|30|64)|502|674|747|851|9(?:1[29]|60))|4(?:0(?:25|3[12]|[47]2)|3(?:3[13]|[89]1)|439|5(?:43|55)|717|832)|5(?:145|290|[4-6]\d\d|772|833|9(?:[06]1|92))|6(?:236|6(?:12|39|8[59])|769)|7890|8(?:688|7(?:28|65)|85[06])|9(?:159|290)|1[2-9]\d2110 (?:285|542)022850H H1(?:3(?:37|[58]6|65)|4(?:4|71)|5(?:07|78)|6(?:[02]6|99)|8(?:3|63|95))|(?:2(?:07|26|4[12]|5[78]|6[14]|8\d|9[38])|3(?:0[07]|[38]5|4[036]|50|67|74|9[16])|4(?:0[2-47]|3[389]|[48]3|5[45]|71)|5(?:14|29|[4-6]\d|77|83|9[069])|6(?:23|6[138]|76)|789|8(?:68|7[26]|85)|9(?:15|29))\d2144HH + + 9\d\dH" 9(?:88|9[09])2988* HJTT 99[09]2990 9(?:88|9[09])2988 H H H +u + [19]\d\dH" +9112911* HJTV +9112911 1\d\d|9112100 H H H + +1\d{2,3}HH"11[0289]|1(?:81|92)\d2110*10[56]2105HJTW11[029]2110H`Y1(?:0[04-6]|1[0237-9]|3[389]|6[05-8]|7[07]|8(?:0|11)|9(?:19|22|5[057]|68|8[05]|9[15689]))2100 1(?:65|9(?:1\d|50|85|98))2165 H H + +[149]\d\d(?:\d{2})?HH"1(?:1[0-79]|9[09])|9992110H* HJTZ 11[0-245]|9992110H1(?:1\d|9[09])|46400|9992110 H464\d\d246400H464\d\d246400H + + [189]\d{2,5}HHHH"$1(?:0[1-3]|1(?:2|6\d{3}))2101HH* HJUA1(?:0[1-3]|12)2101Hg`1(?:0[1-49]|1(?:2|6(?:000|1(?:11|23))|8\d\d?)|(?:[278]|5\d)\d)|[89]00\d\d?|151|1(?:06|4\d|6)\d\d2101 H(?:118|[89]00)\d\d?21180HH H +l + 9\d\dH" +9992999* HJUG +9992999 +9992999 H H H + + [1-9]\d{2,5}HHHH"112|611|9(?:11|33|88)2112H*24280|(?:381|968)35|4(?:3355|7553|8221)|5(?:(?:489|934)2|5928)|72078|(?:323|960)40|(?:276|414)63|(?:2(?:520|744)|7390|9968)9|(?:693|732|976)88|(?:3(?:556|825)|5294|8623|9729)4|(?:3378|4136|7642|8961|9979)6|(?:4(?:6(?:15|32)|827)|(?:591|720)8|9529)7224280HJUS112|9112112HKD11(?:2|5[1-47]|[68]\d|7[0-57]|98)|[2-9]\d{3,5}|[2-8]11|9(?:11|33|88)21122(?:3333|(?:4224|7562|900)2|56447|6688)|3(?:1010|2665|7404)|40404|560560|6(?:0060|22639|5246|7622)|7(?:0701|3822|4666)|8(?:(?:3825|7226)5|4816)|99099223333HH(336\d\d|[2-9]\d{3}|[2356]112211HHH [2-9]\d{4,5}220000HH + + [19]\d{2,3}HH"128|9112128H* HJUY128|9112128H,%1(?:0[4-9]|1[2368]|2[0-3568]|787)|9112104178\d21780H H H + +[04]\d(?:\d(?:\d{2})?)?HHH"0(?:0[1-3]|[1-3]|50)201HH* HJUZ0(?:0[1-3]|[1-3]|50)201HH 0(?:0[1-3]|[1-3]|50)|45400201 H454\d\d245400H454\d\d245400H +{ + 1\d\dH"11[2358]2112* HJVA11[2358]211211[2358]2112 H H H + + 9\d\dH" 9(?:11|88|99)2911* HJVC +9(?:11|99)2911 9(?:11|88|99)2911 H H H + + [19]\d\dH"1(?:12|71)|9112112* HJVE1(?:12|71)|91121121(?:12|71)|9112112 H H H + + 9\d\dH" 9(?:11|88|99)2911* HJVG +9(?:11|99)2911 9(?:11|88|99)2911 H H H +z + 9\d\dH" +9(?:11|88)2911* HJVI +9112911 +9(?:11|88)2911 H H H +x + 1\d\dH"11[3-5]2113* HJVN11[3-5]211311[3-5]2113 H H H +l + 1\d\dH" +1122112* HJVU +1122112 +1122112 H H H +p +1\dH" 1[578]215* HJWF 1[578]215 1[578]215 H H H + + [19]\d\dH"9(?:11|9[4-69])2911* HJWS9(?:11|9[4-69])2911.'1(?:1[12]|2[0-6]|[39]0)|9(?:11|9[4-79])2111 H12[0-6]2120 H + + 1\d\dH"1(?:12|9[2-4])2112* HJXK1(?:12|9[2-4])21121(?:12|9[2-4])2112 H H H +{ + 1\d\dH"19[1459]2191* HJYE19[1459]219119[1459]2191 H H H +~ + 1\d\d?HH" 1(?:12|5)215* HJYT 1(?:12|5)215 1(?:12|5)215 H H H + + [134]\d{2,4}HHH"1(?:01\d\d|12)2112HH* 41(?:348|851)241348HJZA1(?:01(?:11|77)|12)2112HHPI1(?:0(?:1(?:11|77)|20|7)|1[12]|77(?:3[237]|[45]7|6[279]|9[26]))|[34]\d{4}2107I>3(?:078[23]|7(?:064|567)|8126)|4(?:394[16]|7751|8837)|4[23]699230782H 1112111H [34]\d{4}230000H + + [19]\d\dH" 112|99[139]2112* HJZM 112|99[139]2112 112|99[139]2112 H H H + +[139]\d\d(?:\d{2})?HH"#112|9(?:5[023]|61|9[3-59])2112H*3[013-57-9]\d{3}230000HJZW 112|99[3-59]2112H<511[2469]|3[013-57-9]\d{3}|9(?:5[023]|6[0-25]|9[3-59])2112 H 114|9(?:5[023]|6[0-25])2114H H \ No newline at end of file diff --git a/cpp/src/phonenumbers/metadata_convertor.cc b/cpp/src/phonenumbers/metadata_convertor.cc new file mode 100644 index 000000000..a8e012d40 --- /dev/null +++ b/cpp/src/phonenumbers/metadata_convertor.cc @@ -0,0 +1,51 @@ +#include +#include +#include +#include "phonenumbers/phonemetadata.pb.h" +#include "phonenumbers/phonenumber.pb.h" +#include "phonenumbers/metadata.h" + +void usage(std::string prog_name) { + std::cout << prog_name << "[options]" << std::endl << + "Options:" << std::endl << + "-h | --help Print this help" << std::endl << + "-o | --output_file Output file name" << std::endl; +} + +bool LoadCompiledInMetadata(i18n::phonenumbers::PhoneMetadataCollection* metadata) { + if (!metadata->ParseFromArray(i18n::phonenumbers::metadata_get(), i18n::phonenumbers::metadata_size())) { + std::cerr << "Could not parse binary data."; + return false; + } + + return true; +} + +int main(int argc, char *argv[]) { + + if(argc < 3) { + std::cerr << "please provide output file name argument" << std::endl; + usage(argv[0]); + return -1; + } + + if(strncmp(argv[1], "-o", 2) != 0 && strncmp(argv[1], "--output", 8) != 0) { + std::cerr << "please provide output file name argument" << std::endl; + usage(argv[0]); + return -1; + } + + i18n::phonenumbers::PhoneMetadataCollection metadata_collection; + if (!LoadCompiledInMetadata(&metadata_collection)) { + std::cerr << "Could not parse compiled-in metadata." << std::endl; + return -1; + } + + std::fstream output(argv[2], std::ios::out | std::ios::trunc | std::ios::binary); + if (!metadata_collection.SerializeToOstream(&output)) { + std::cerr << "Failed to write metadata output file." << std::endl; + return -1; + } + + return 0; +} diff --git a/cpp/src/phonenumbers/metadata_convertor_short.cc b/cpp/src/phonenumbers/metadata_convertor_short.cc new file mode 100644 index 000000000..eebc6a75f --- /dev/null +++ b/cpp/src/phonenumbers/metadata_convertor_short.cc @@ -0,0 +1,51 @@ +#include +#include +#include +#include "phonenumbers/phonemetadata.pb.h" +#include "phonenumbers/phonenumber.pb.h" +#include "phonenumbers/short_metadata.h" + +void usage(std::string prog_name) { + std::cout << prog_name << "[options]" << std::endl << + "Options:" << std::endl << + "-h | --help Print this help" << std::endl << + "-o | --output_file Output file name" << std::endl; +} + +bool LoadCompiledInMetadataShort(i18n::phonenumbers::PhoneMetadataCollection* metadata) { + if (!metadata->ParseFromArray(i18n::phonenumbers::short_metadata_get(), i18n::phonenumbers::short_metadata_size())) { + std::cerr << "Could not parse binary data."; + return false; + } + + return true; +} + +int main(int argc, char *argv[]) { + + if(argc < 3) { + std::cerr << "please provide output file name argument" << std::endl; + usage(argv[0]); + return -1; + } + + if(strncmp(argv[1], "-o", 2) != 0 && strncmp(argv[1], "--output", 8) != 0) { + std::cerr << "please provide output file name argument" << std::endl; + usage(argv[0]); + return -1; + } + + i18n::phonenumbers::PhoneMetadataCollection short_metadata_collection; + if (!LoadCompiledInMetadataShort(&short_metadata_collection)) { + std::cerr << "Could not parse compiled-in metadata." << std::endl; + return -1; + } + + std::fstream output_short(argv[2], std::ios::out | std::ios::trunc | std::ios::binary); + if (!short_metadata_collection.SerializeToOstream(&output_short)) { + std::cerr << "Failed to write short metadata output file." << std::endl; + return -1; + } + + return 0; +} diff --git a/cpp/test/phonenumbers/phonenumberutil_test.cc b/cpp/test/phonenumbers/phonenumberutil_test.cc index 18cf2db6b..59f5527cf 100644 --- a/cpp/test/phonenumbers/phonenumberutil_test.cc +++ b/cpp/test/phonenumbers/phonenumberutil_test.cc @@ -118,11 +118,14 @@ class PhoneNumberUtilTest : public testing::Test { phone_util_.Parse(number_to_parse, RegionCode::ZZ(), &actual_number)); } +#ifdef ISTREAM_DATA_PROVIDER void ReloadMetadata(const string fileName) { phone_util_.ReloadMetadata(fileName); } - PhoneNumberUtil& phone_util_; +#else + const PhoneNumberUtil& phone_util_; +#endif private: DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest); @@ -163,10 +166,12 @@ TEST_F(PhoneNumberUtilTest, InterchangeInvalidCodepoints) { } } +#ifdef ISTREAM_DATA_PROVIDER TEST_F(PhoneNumberUtilTest, ReloadMetadata) { const string filename = "metadata.dat"; EXPECT_TRUE(phone_util_.ReloadMetadata(filename)); } +#endif TEST_F(PhoneNumberUtilTest, GetSupportedRegions) { std::set regions; diff --git a/cpp/test/phonenumbers/shortnumberinfo_test.cc b/cpp/test/phonenumbers/shortnumberinfo_test.cc index ca5a504e1..de084fd42 100644 --- a/cpp/test/phonenumbers/shortnumberinfo_test.cc +++ b/cpp/test/phonenumbers/shortnumberinfo_test.cc @@ -96,10 +96,12 @@ TEST_F(ShortNumberInfoTest, IsValidShortNumber) { EXPECT_TRUE(short_info_.IsValidShortNumber(shared_number)); } +#ifdef ISTREAM_DATA_PROVIDER TEST_F(ShortNumberInfoTest, ReloadMetadata) { const string filename = "metadata_short.dat"; EXPECT_TRUE(short_info_.ReloadMetadata(filename)); } +#endif TEST_F(ShortNumberInfoTest, IsCarrierSpecific) { PhoneNumber carrier_specific_number; From 200985bdb907c424694c9cb06e5054df6651f062 Mon Sep 17 00:00:00 2001 From: Denys Ponomarenko Date: Fri, 8 Sep 2023 15:28:14 +0000 Subject: [PATCH 4/5] using path to metadata binary files as compile time switch --- cpp/CMakeLists.txt | 1 + cpp/metadata_short.dat | 12 +++++++----- cpp/src/phonenumbers/phonenumberutil.cc | 7 +++++-- cpp/src/phonenumbers/shortnumberinfo.cc | 7 +++++-- cpp/test/phonenumbers/phonenumberutil_test.cc | 5 +++-- cpp/test/phonenumbers/shortnumberinfo_test.cc | 5 +++-- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 493f39675..4b552d9f5 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -104,6 +104,7 @@ option (ISTREAM_DATA_PROVIDER "Use protoduf binary file as input for metadata" O if(ISTREAM_DATA_PROVIDER) add_definitions ("-DISTREAM_DATA_PROVIDER") + add_definitions(-DMETADATA_PATH="${METADATA_PATH}") endif() if (USE_ALTERNATE_FORMATS) diff --git a/cpp/metadata_short.dat b/cpp/metadata_short.dat index f73f1fb83..c8de96c3c 100644 --- a/cpp/metadata_short.dat +++ b/cpp/metadata_short.dat @@ -196,11 +196,10 @@ p   [158]\d{2,5}HHHH"L?1(?:00|1[25]|23|4(?:1|7\d)|5[15]|9[02-49])|555|(?:116\d|80)\d\d2100HHH* 8[1-69]\d\d28100HJGI 1(?:12|9[09])2112Hz1(?:00|1(?:[25]|6(?:00[06]|1(?:1[17]|23))|8\d\d)|23|4(?:1|7[014])|5[015]|9[02-49])|555|8[0-79]\d\d|8(?:00|4[0-2]|8[0-589])2100 150|87\d\d2150HHH=1(?:00|1(?:5|8\d\d)|23|51|9[2-4])|555|8(?:00|4[0-2]|8[0-589])2100HH H -l +q 1\d\dH" 1122112* HJGL -1122112 -1122112 H H H +11221121[1-8]\d2110 H H H  1\d\d?HH"1(?:1[6-8]|[6-8])216* HJGM1(?:1[6-8]|[6-8])2161(?:1[6-8]|[6-8])216 H H H  @@ -260,8 +259,11 @@ x 1762176  [19]\d\d(?:\d{2})?HH"&1(?:0[235]|1[2-6]|9[127])|9112102H*9[0-4689]\d{3}290000HJJO1(?:12|9[127])|9112112H921(?:0[2359]|1[0-68]|9[0-24-79])|9[0-4689]\d{3}|9112102 H9[0-4689]\d{3}290000H9[0-4689]\d{3}290000H - - 1\d\dH"11[089]2110* HJJP 11[09]21101(?:0[24]|1[089]|44|89)2102 H H H + +[01]\d\d(?:\d{7})?HH +"11[089]2110H* HJJP11[09]2110H,%000[259]\d{6}|1(?:0[24]|1[089]|44|89)2102 H H 000[259]\d{6}2 +0002000000H +   [1-9]\d{2,4}HHH"5.1(?:1(?:[246]|9\d)|5(?:01|2[127]|6[26]\d))|9992112*909\d\d290900HJKE 11[24]|9992112H1(?:0(?:[07-9]|1[0-25]|400)|1(?:[024-6]|9[0-579])|2[1-3]|3[01]|4[14]|5(?:[01][01]|2[0-24-79]|33|4[05]|5[59]|6(?:00|29|6[67]))|(?:6[035]\d|[78])\d|9(?:[02-9]\d\d|19))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99))\d\d|9(?:09\d\d|99)|89882100 H~1(?:(?:04|6[35])\d\d|3[01]|4[14]|5(?:1\d|2[25]))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99)|909)\d\d|898\d2130IB1(?:(?:04|6[035])\d\d|4[14]|5(?:01|55|6[26]\d))|40404|8988|909\d\d2141 diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index 85649c568..00e29223a 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -878,7 +878,7 @@ void PhoneNumberUtil::ClearMetadata() { bool UpdateMetadataFile(const string& filepath) { - boost::filesystem::path path_to = boost::filesystem::current_path(); + boost::filesystem::path path_to(METADATA_PATH); path_to += "/"; path_to += METADATA_FILE_NAME; boost::filesystem::path path_bk = path_to; @@ -983,7 +983,10 @@ PhoneNumberUtil::PhoneNumberUtil() // method inside the constructor as well to keep both in sync. PhoneMetadataCollection metadata_collection; #ifdef ISTREAM_DATA_PROVIDER - if (!LoadMetadataFromFile(METADATA_FILE_NAME, &metadata_collection)) { + boost::filesystem::path path_to(METADATA_PATH); + path_to += "/"; + path_to += METADATA_FILE_NAME; + if (!LoadMetadataFromFile(path_to.string(), &metadata_collection)) { LOG(DFATAL) << "Could not parse metadata from file."; return; } diff --git a/cpp/src/phonenumbers/shortnumberinfo.cc b/cpp/src/phonenumbers/shortnumberinfo.cc index cd81061c5..6665e7626 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.cc +++ b/cpp/src/phonenumbers/shortnumberinfo.cc @@ -60,7 +60,7 @@ void ShortNumberInfo::ClearMetadata(){ bool UpdateShortMetadataFile(const string& filepath) { - boost::filesystem::path path_to = boost::filesystem::current_path(); + boost::filesystem::path path_to(METADATA_PATH); path_to += "/"; path_to += METADATA_SHORT_FILE_NAME; boost::filesystem::path path_bk = path_to; @@ -126,7 +126,10 @@ ShortNumberInfo::ShortNumberInfo() PhoneMetadataCollection metadata_collection; #ifdef ISTREAM_DATA_PROVIDER - if (!LoadMetadataFromFile(METADATA_SHORT_FILE_NAME, &metadata_collection)) { + boost::filesystem::path path_to(METADATA_PATH); + path_to += "/"; + path_to += METADATA_SHORT_FILE_NAME; + if (!LoadMetadataFromFile(path_to.string(), &metadata_collection)) { LOG(DFATAL) << "Could not parse metadata from file."; return; } diff --git a/cpp/test/phonenumbers/phonenumberutil_test.cc b/cpp/test/phonenumbers/phonenumberutil_test.cc index 59f5527cf..d0b1a5000 100644 --- a/cpp/test/phonenumbers/phonenumberutil_test.cc +++ b/cpp/test/phonenumbers/phonenumberutil_test.cc @@ -168,8 +168,9 @@ TEST_F(PhoneNumberUtilTest, InterchangeInvalidCodepoints) { #ifdef ISTREAM_DATA_PROVIDER TEST_F(PhoneNumberUtilTest, ReloadMetadata) { - const string filename = "metadata.dat"; - EXPECT_TRUE(phone_util_.ReloadMetadata(filename)); + string path(METADATA_PATH); + path.append("/metadata.dat"); + EXPECT_TRUE(phone_util_.ReloadMetadata(path)); } #endif diff --git a/cpp/test/phonenumbers/shortnumberinfo_test.cc b/cpp/test/phonenumbers/shortnumberinfo_test.cc index de084fd42..ab379acc9 100644 --- a/cpp/test/phonenumbers/shortnumberinfo_test.cc +++ b/cpp/test/phonenumbers/shortnumberinfo_test.cc @@ -98,8 +98,9 @@ TEST_F(ShortNumberInfoTest, IsValidShortNumber) { #ifdef ISTREAM_DATA_PROVIDER TEST_F(ShortNumberInfoTest, ReloadMetadata) { - const string filename = "metadata_short.dat"; - EXPECT_TRUE(short_info_.ReloadMetadata(filename)); + string path(METADATA_PATH); + path.append("/metadata_short.dat"); + EXPECT_TRUE(short_info_.ReloadMetadata(path)); } #endif From 12c112f02a17bdd0d038af1de934b92b4c1c0d00 Mon Sep 17 00:00:00 2001 From: Denys Ponomarenko Date: Thu, 30 Nov 2023 20:04:23 +0000 Subject: [PATCH 5/5] fixing review comments --- cpp/CMakeLists.txt | 78 ++- cpp/metadata.dat | 267 -------- cpp/metadata_short.dat | 607 ------------------ cpp/src/phonenumbers/metadata_convertor.cc | 61 +- .../phonenumbers/metadata_convertor_short.cc | 51 -- cpp/src/phonenumbers/metadataconvertor.h | 25 + cpp/src/phonenumbers/phonenumberutil.cc | 10 +- cpp/src/phonenumbers/shortnumberinfo.h | 1 - 8 files changed, 117 insertions(+), 983 deletions(-) delete mode 100644 cpp/metadata.dat delete mode 100644 cpp/metadata_short.dat delete mode 100644 cpp/src/phonenumbers/metadata_convertor_short.cc create mode 100644 cpp/src/phonenumbers/metadataconvertor.h diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index cbd28632e..3129744fd 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -94,10 +94,13 @@ option (BUILD_TESTING "Build testing" ON) option (BUILD_TOOLS_ONLY "Limit build to targets in ../tools/cpp" OFF) option (USE_STDMUTEX "Use C++ 2011 std::mutex for multi-threading" OFF) option (USE_POSIX_THREAD "Use Posix api for multi-threading" OFF) -option (ISTREAM_DATA_PROVIDER "Use protoduf binary file as input for metadata" OFF) +option (ISTREAM_DATA_PROVIDER "Use protobuf binary file as input for metadata" OFF) if(ISTREAM_DATA_PROVIDER) add_definitions ("-DISTREAM_DATA_PROVIDER") + if(NOT METADATA_PATH) + set(METADATA_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + endif() add_definitions(-DMETADATA_PATH="${METADATA_PATH}") endif() @@ -433,7 +436,7 @@ include_directories ("src") # Collate dependencies #---------------------------------------------------------------- -set (LIBRARY_DEPS ${ICU_LIB} ${PROTOBUF_LIB} absl::node_hash_set absl::strings absl::synchronization) +set (LIBRARY_DEPS ${ICU_LIB} ${PROTOBUF_LIB} absl::node_hash_set absl::strings absl::synchronization absl::flags absl::flags_parse) if (USE_BOOST) list (APPEND LIBRARY_DEPS ${Boost_LIBRARIES}) @@ -513,6 +516,25 @@ if (BUILD_SHARED_LIBS) endif () endif () +if(ISTREAM_DATA_PROVIDER) + if(USE_LITE_METADATA) + set (METADATA_CONVERTOR_SOURCES + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/short_metadata.cc" + "src/phonenumbers/lite_metadata.cc") + else() + set (METADATA_CONVERTOR_SOURCES + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/metadata.cc" + "src/phonenumbers/short_metadata.cc") + endif() +endif() + +if(ISTREAM_DATA_PROVIDER) + add_executable(metadata_convertor ${METADATA_CONVERTOR_SOURCES}) + target_link_libraries (metadata_convertor ${PROTOBUF_LIB} phonenumber) +endif() + #---------------------------------------------------------------- # Build testing library #---------------------------------------------------------------- @@ -553,24 +575,6 @@ if(BUILD_TESTING) "test/phonenumbers/unicodestring_test.cc" "test/phonenumbers/utf/unicodetext_test.cc") - if(ISTREAM_DATA_PROVIDER) - set (METADATA_CONVERTOR_SOURCES_TEST - "src/phonenumbers/metadata_convertor.cc" - "src/phonenumbers/test_metadata.cc") - - set (METADATA_CONVERTOR_SOURCES_LITE - "src/phonenumbers/metadata_convertor.cc" - "src/phonenumbers/lite_metadata.cc") - - set (METADATA_CONVERTOR_SOURCES - "src/phonenumbers/metadata_convertor.cc" - "src/phonenumbers/metadata.cc") - - set (METADATA_CONVERTOR_SOURCES_SHORT - "src/phonenumbers/metadata_convertor_short.cc" - "src/phonenumbers/short_metadata.cc") - endif() - if (BUILD_GEOCODER) set (GEOCODING_TEST_SOURCES "test/phonenumbers/geocoding/area_code_map_test.cc" @@ -581,6 +585,16 @@ if(BUILD_TESTING) list (APPEND TEST_SOURCES ${GEOCODING_TEST_SOURCES}) endif () + if(ISTREAM_DATA_PROVIDER) + set (METADATA_CONVERTOR_TEST_SOURCES + "src/phonenumbers/metadata_convertor.cc" + "src/phonenumbers/short_metadata.cc" + "src/phonenumbers/test_metadata.cc") + + add_executable(metadata_convertor_test ${METADATA_CONVERTOR_TEST_SOURCES}) + target_link_libraries (metadata_convertor_test ${PROTOBUF_LIB} phonenumber) + endif() + if (USE_ICU_REGEXP) # Add the phone number matcher tests. list (APPEND TEST_SOURCES "test/phonenumbers/phonenumbermatch_test.cc") @@ -590,17 +604,6 @@ if(BUILD_TESTING) # Build the testing binary. include_directories ("test") add_executable (libphonenumber_test ${TEST_SOURCES}) - if(ISTREAM_DATA_PROVIDER) - add_executable(metadata_convertor ${METADATA_CONVERTOR_SOURCES}) - add_executable(metadata_convertor_lite ${METADATA_CONVERTOR_SOURCES_LITE}) - add_executable(metadata_convertor_test ${METADATA_CONVERTOR_SOURCES_TEST}) - add_executable(metadata_convertor_short ${METADATA_CONVERTOR_SOURCES_SHORT}) - - target_link_libraries (metadata_convertor ${PROTOBUF_LIB} phonenumber) - target_link_libraries (metadata_convertor_lite ${PROTOBUF_LIB} phonenumber) - target_link_libraries (metadata_convertor_test ${PROTOBUF_LIB} phonenumber) - target_link_libraries (metadata_convertor_short ${PROTOBUF_LIB} phonenumber) - endif() set (TEST_LIBS phonenumber_testing ${GTEST_LIB}) if (NOT WIN32) @@ -632,6 +635,19 @@ if(BUILD_TESTING) endif () endif() +# Generate metadata protobuf files +add_custom_command( + OUTPUT ${METADATA_PATH}/metadata.dat + COMMAND metadata_convertor_test "--output_file" ${METADATA_PATH}/metadata.dat + COMMENT "generate metadata .dat files" + VERBATIM +) + +add_custom_target( + "generate_metadata_files" ALL + DEPENDS ${METADATA_PATH}/metadata.dat +) + #---------------------------------------------------------------- # Install built libraries #---------------------------------------------------------------- diff --git a/cpp/metadata.dat b/cpp/metadata.dat deleted file mode 100644 index 5fb4c748f..000000000 --- a/cpp/metadata.dat +++ /dev/null @@ -1,267 +0,0 @@ - - - \d{6}H\d{6}2123456 H" H* H2 H: HB HJADPZ00 H H H H - - -[1-9]\d{8}H  H H" H* H2 H: HB HJAEPZ00 H H600\d{6}2 600123456 H - - -[1-9]\d{7}HPP -[1-9]\d{7}210123456PP -[1-9]\d{7}210123456PP" H* H2 H: HB HJAMPZ00b0z0 H H H H - -  [29]\d{8}H *2\d(?:[26-9]\d|\d[26-9])\d{5}2 222123456 9[1-3]\d{7}2 923123456" H* H2 H: HB HJAOPZ00b0~0z0~0! -(\d{3})(\d{3})(\d{3})$1 $2 $3 H H H H - -[1-3689]\d{9,10}HHHH H -H $ [1-3]\d{5,9}2 -1234567890HHHH H -$9\d{10}|[1-3]\d{9}2 -9234567890H -H "80\d{8}2 -8034567890H -*6(0\d|10)\d{7}2 -6234567890H -2 H: HB HJARP6Z00b0z0(?:(11|343|3715)15)?9$1* -(\d{2})(\d{4})(\d{4})$1 $2-$311"0$14 -(\d{4})(\d{2})(\d{4})$1 $2-$3 1[02-9]|[23]"0$12 -(\d)(\d{2})(\d{4})(\d{4}) $2 15 $3-$4911"0$1F -(\d)(\d{4})(\d{2})(\d{4})$2 $3-$49(?:1[02-9]|[23])"0$1*0$1 $CC, -(\d{3})(\d{3})(\d{4})$1-$2-$3[68]"0$1* -(\d{2})(\d{4})(\d{4})$1 $2-$311"0$14 -(\d{4})(\d{2})(\d{4})$1 $2-$3 1[02-9]|[23]"0$1- -(\d)(\d{2})(\d{4})(\d{4}) $1 $2 $3 $4911; -(\d)(\d{4})(\d{2})(\d{4}) $1 $2 $3 $49(?:1[02-9]|[23]), -(\d{3})(\d{3})(\d{4})$1-$2-$3[68]"0$1 H H H H - -[1-578]\d{4,14}H H - [2378]\d{8}2 212345678H 4\d{8}2 412345678H " 1800\d{6}2 -1800123456H -*190[0126]\d{6}2 -1900123456H -2 H: HB HJAUP=Z001[12]b0z00011( -(\d{4})(\d{3})(\d{3})$1 $2 $31"$1, -(\d)(\d{4})(\d{4})$1 $2 $3[2-478]"0$1 H H H H - -246\d{7}H -P2 -2464567890P H" H* H2 H: HB HJBBPZ011 H H H H - -\d{8,10}H -P\d{8,10}212345678P H" H* H2 H: HB HJBRP7Z00 H H H H - -#(242|8(00|66|77|88)|900)\d{7}H -Pp`242(?:3(?:02|[236][1-9]|4[0-24-9]|5[0-68]|7[3-57]|9[2-5])|4(?:2[237]|51|64|77)|502|636|702)\d{4}2 -2425027890P'242(357|359|457|557)\d{4}2 -2423577890"!8(00|66|77|88)\d{7}2 -8001234567*900\d{7}2 -90012345672 H: HB HJBSPZ011b1z1 H H H H - - -[1-9]\d{5}H -[1-9]\d{5}2112345 H" H* H2 H: HB HJBYPZ810b8z 80?|99999 -(\d{4})$1[1-8]"8 $1# -(\d{2})(\d{3})$1 $2[1-8]"8$1$ -(\d{3})(\d{3})$1 $2[1-8]"8 $1 H H H H - -226\d{7}H -P226\d{7}2 -2261234567P H" H* H2 H: HB HJCAPZ011 H H H H - -\d{6,10}H -P\d{6,10}2 -2261234567P H" H* H2 H: HB HJCCP=Z00 H H H H - --)[1-7]\d{6,11}|8[0-357-9]\d{6,9}|9\d{7,10}H  [2-9]\d{10}2912345679*1(?:[38]\d|4[57]|5[0-35-9]|7[0136-8])\d{8}2 13123456789" H* H2 H: HB HJCNPVZ00b0z0R -(\d{3})(\d{5,6})$1 $2[3-9][3-9]\d{2}[19][3-9]\d{2}(?:10|95)"0$1*$CC $1 -(\d{3})(\d{8})$1 $21"$1 H H H H - -(?:60|3\d)\d{8}H -60\d{8}2 -60123456782$3(?:0[0-5]|1\d|2[0-3]|5[01]|70)\d{7}2 -3211234567" H* H2 H: HB HJCOP9b0z0(4(?:[14]4|56)|[579])?) -(\d{3})(\d{7})$1 $26"($1)*0$CC $1# -(\d{3})(\d{7})$1 $23*0$CC $1 H H H H - -\d{8,10}H -P\d{8,10}2 -2261234567P H" H* H2 H: HB HJCXP=Z00 H H H H - -\d{4,14}HHHHHH H -H PPH8(?:[24-6]\d{2}|3[03-9]\d|[789](?:0[2-9]|[1-9]\d))\d{1,8}230123456PP6#1(5\d{9}|7\d{8}|6[02]\d{8}|63\d{7})2 15123456789H -H "800\d{7}2 -8001234567H -*(900([135]\d{6}|9\d{7})2 -9001234567H -H 2 H: HB HJDEP1Z00b0z08 -(\d{3})(\d{3,8})$1 $22|3[3-9]|906|[4-9][1-9]1"0$1, -(\d{2})(\d{4,11})$1/$2 [34]0|[68]9"0$1C -(\d{2})(\d{2})$1 $2[4-9][4-6]|[7-9](?:\d[1-9]|[1-9]\d)"0$1E -(\d{4})(\d{2,7})$1 $2[4-9][4-6]|[7-9](?:\d[1-9]|[1-9]\d)"0$1+ -(\d{3})(\d{1})(\d{6})$1 $2 $3800"0$1- -(\d{3})(\d{3,4})(\d{4})$1 $2 $3900"0$1 H H H H - - -3\d{6}H3\d{6}23123456 H" H* H2 H: HB HJFRP!Z00b0z00 -(\d)(\d{2})(\d{2})(\d{2}) $1 $2 $3 $43"0$1 H H H H - -\d{10}H H -PPP -[1-6]\d{9}2 -3123456789PPP7[1-57-9]\d{8}2 -7123456789H -"80\d{8}2 -8023456789H -* 9[018]\d{8}2 -9023456789H -2'8(?:4[3-5]|7[0-2])\d{7}2 -8433456789H -:70\d{8}2 -7033456789H -B56\d{8}2 -5633456789H -JGBP,Z00b0z06 -(\d{2})(\d{4})(\d{4})$1 $2 $3 [1-59]|[78]0"(0$1)2 -(\d)(\d{3})(\d{3})(\d{3}) $1 $2 $3 $46"(0$1)3 -(\d{4})(\d{3})(\d{3})$1 $2 $3 7[1-57-9]"(0$1)/ -(\d{3})(\d{3})(\d{4})$1 $2 $38[47]"(0$1)76\d{8}2 -7623456789H - H H H - -\d{6,10}H -P\d{6,10}2 -7033456789P H" H* H2 H: HB HJGGP,Z00 H H H H - -[0389]\d{5,10}HH H -H  0\d{9,10}2 -0123456789H -H 3\d{8,9}2 -3123456789H H -"$80(?:0\d{6}|3\d{3})2 800123456HH *!89(?:2\d{3}|9\d{6})2892123HH 2 H: HB HJITP'Z00( -(\d{2})(\d{4})(\d{4})$1 $2 $30[26]/ -(\d{3})(\d{4})(\d{3,4})$1 $2 $3 -0[13-57-9]& -(\d{3})(\d{3})(\d{3,4})$1 $2 $33 -(\d{3})(\d{3,6})$1 $28 H H H H - -+07\d{5}|[1-357-9]\d{3,10}HHHHHH H -H $07\d{5}|[1-357-9]\d{3,10}20712345 H" 0777[01]\d{2}20777012H* H2 H: HB HJJPPQZ010b0z0/ -(\d{2})(\d{4})(\d{4})$1 $2 $3[57-9]0"0$19 -(\d{2})(\d{2})(\d{3})(\d{4}) $1 $2 $3 $4[57-9]0"0$1X -(\d{2})(\d{3})(\d{4})$1 $2 $3 111|222|333(?:111|222|333)1(?:111|222|333)11"0$1P -(\d{4})(\d)(\d{4})$1 $2 $3222|333 2221|3332 -22212|3332 222120|3332"0$1, -(\d{3})(\d{2})(\d{4})$1 $2 $3[23]"0$1! -(\d{3})(\d{4})$1-$2077"0$1 -(\d{4})*$1[23]"$1 H [23]\d{3}22123H H H - -#[1-7]\d{3,9}|8\d{8}HHHHHH H -B6(?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\d{2,3}|[2-9]\d{6,7})222123456"1[0-25-9]\d{7,8}2 -1023456789H H -"80\d{7}2 801234567H * 60[2-9]\d{6}2 602345678H 2 H:50\d{8}2 -5012345678H -B70\d{8}2 -7012345678H -JKRPRZ00(?:[124-68]|[37]\d{2})b0z0(8[1-46-8]|85\d{2})?n -(\d{2})(\d{4})(\d{4})$1-$2-$31(?:0|1[19]|[69]9|5[458])|[57]0%1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"0$1 -(\d{2})(\d{3})(\d{4})$1-$2-$311(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-6][1-9][2-9];1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-6][1-9][2-9]"0$1. -(\d{3})(\d)(\d{4})$1-$2-$31311312"0$16 -(\d{3})(\d{2})(\d{4})$1-$2-$3131 131[13-9]"0$1/ -(\d{3})(\d{3})(\d{4})$1-$2-$313[2-9]"0$14 -(\d{2})(\d{2})(\d{3})(\d{4}) $1-$2-$3-$430"0$1j -(\d)(\d{4})(\d{4})$1-$2-$32(?:[26]|3[0-467])12(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"0$1 -(\d)(\d{3})(\d{4})$1-$2-$32(?:3[0-35-9]|[457-9])I2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"0$1E - (\d)(\d{3})$1-$2 -21[0-46-9]21(?:[0-247-9]|3[124]|6[1269])"0$1; - (\d)(\d{4})$1-$221[36]21(?:3[035-9]|6[03-578])"0$1k -(\d{2})(\d{3})$1-$2 [3-6][1-9]1[3-6][1-9]1(?:[0-46-9])'[3-6][1-9]1(?:[0-247-9]|3[124]|6[1269])"0$1] -(\d{2})(\d{4})$1-$2 [3-6][1-9]1[3-6][1-9]1[36]![3-6][1-9]1(?:3[035-9]|6[03-578])"0$1 H H H H - - [1-9]\d{9,10}H -H P -[2-9]\d{9}2 -2123456789H -P1\d{10}2 11234567890H "800\d{7}2 -8001234567H -*900\d{7}2 -9001234567H -2 H: HB HJMXP4Z00b01z01|04[45](\d{10})1$12 -(\d{3})(\d{3})(\d{4})$1 $2 $3[89]00"01 $10, -(\d{3})(\d{2})(\d{5})$2 $3901"01 $104 -(\d{2})(\d{4})(\d{4})$1 $2 $333|55|81"01 $10T -(\d{3})(\d{3})(\d{4})$1 $2 $3([2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]"01 $10> -(\d)(\d{2})(\d{4})(\d{4}) 045 $2 $3 $4 1(?:33|55|81)"$10Z -(\d)(\d{3})(\d{3})(\d{4}) 045 $2 $3 $4)1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])"$102 -(\d{3})(\d{3})(\d{4})$1 $2 $3[89]00"01 $10# -(\d{3})(\d{2})(\d{5})$2 $39014 -(\d{2})(\d{4})(\d{4})$1 $2 $333|55|81"01 $10T -(\d{3})(\d{3})(\d{4})$1 $2 $3([2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]"01 $107 -(\d)(\d{2})(\d{4})(\d{4}) $1 $2 $3 $4 1(?:33|55|81)S -(\d)(\d{3})(\d{3})(\d{4}) $1 $2 $3 $4)1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9]) H H H H - -![289]\d{7,9}|[3-7]\d{7}HHH H -A124099\d{3}|(?:3[2-79]|[479][2-689]|6[235-9])\d{6}224099123HHeR2(?:[027]\d{7}|9\d{6,7}|1(?:0\d{5,7}|[12]\d{5,6}|[3-9]\d{5})|4[1-9]\d{6}|8\d{7,8})2 201234567HH H -" -800\d{6,7}2 -8001234567H H -* -900\d{6,7}2 -9001234567H H -2 H: HB HJNZP@Z00b0z0/ -(\d)(\d{3})(\d{4})$1-$2 $3 -24|[34679]"0$1- -(\d)(\d{3})(\d{3,5})$1-$2 $32[179]"0$1. -(\d{3})(\d{3})(\d{3,4})$1 $2 $3[89]"0$1 H H H H - - -[1-9]\d{8}H  H,(?:5[01]|6[069]|7[289]|88)\d{7}2 501234567"800\d{6}2 800123456*70\d{7}2 7012345672 H: HB HJPLP0Z00b0z00 -(\d{2})(\d{3})(\d{2})(\d{2}) $1 $2 $3 $4"0$1 H H H H - - -[268]\d{8}H 262\d{6}2 2621612346(?:9[23]|47)\d{6}2 692123456"80\d{7}2 801234567*1$8(?:1[01]|2[0156]|84|9[0-37-9])\d{6}2 8101234562 H: HB HJREPZ00b0z00 -(\d{3})(\d{2})(\d{2})(\d{2}) $1 $2 $3 $4"0$1 H262|6(?:9[23]|47)|8 H H H - - [347-9]\d{9}H - -[348]\d{9}2 -30112345679\d{9}2 -9123456789" H* H2 H: HB HJRUPZ810b8z8 H H H H - - \d{9}H  2 123456789 H" H* H2 H: HB HJSEP.Z00 H H H H - -[13689]\d{7,10}HH -H  [36]\d{7}231234567H [89]\d{7}281234567H" -1?800\d{7}2 -8001234567H -H * 1900\d{7}2 19001234567H 2 H: HB HJSGPAZ 0[0-3][0-9]z777777% -(\d{4})(\d{4})$1 $2 [369]|8[1-9]( -(\d{4})(\d{3})(\d{4})$1 $2 $31[89]& -(\d{3})(\d{3})(\d{4})$1 $2 $3800 H H H H - -8\d{3,7}HHH8\d{5}2812345H8\d{3}28123H"8\d{7}281234567H* H2 H: HB HJTAPZ00 H H H H - -"[13-689]\d{9}|2[0-35-9]\d{8}H -P,[13-689]\d{9}|2[0-35-9]\d{8}2 -1234567890P,[13-689]\d{9}|2[0-35-9]\d{8}2 -1234567890P"#8(?:00|66|77|88)\d{7}2 -8004567890*900\d{7}2 -90045678902 H: HB HJUSPZ011b1j extn. z1 -(\d{3})(\d{4})$1 $2# -(\d{3})(\d{3})(\d{4})$1 $2 $30# -(\d{3})(\d{3})(\d{4})$1 $2 $30 H800\d{7}2 -8004567890 H H - - [69]\d{8}H P 6122\d{5}2 662345678P9[0-57-9]\d{7}2 912345678" H* H2 H: HB HJUZPZ810b8z88~108 -(\d{2})(\d{3})(\d{2})(\d{2}) $1 $2 $3 $4[679]"8 $1 H H H H - - -[268]\d{8}H 2696[0-4]\d{4}2 269601234639\d{6}2 639123456"80\d{7}2 801234567* H2 H: HB HJYTPZ00b0z0 H269|639 H H H - - \d{8}H H H"\d{8}212345678* H2 H: HB HJ001P -(\d{4})(\d{4})$1 $2 H H H H - - \d{9}H  H\d{9}2 123456789" H* H2 H: HB HJ001P -(\d)(\d{4})(\d{4})$1 $2 $3 H H H H - - \d{9}H  H H" H*\d{9}2 1234567892 H: HB HJ001P -(\d)(\d{4})(\d{4})$1 $2 $3 H H H H \ No newline at end of file diff --git a/cpp/metadata_short.dat b/cpp/metadata_short.dat deleted file mode 100644 index c8de96c3c..000000000 --- a/cpp/metadata_short.dat +++ /dev/null @@ -1,607 +0,0 @@ - - - 9\d\dH" -9(?:11|99)2911* HJAC -9(?:11|99)2911 -9(?:11|99)2911 H H H -{ - 1\d\dH"11[0268]2110* HJAD11[0268]211011[0268]2110 H H H - - [149]\d{2,3}HH" 112|99[7-9]2112H* HJAE 112|99[7-9]2112H112|445[16]|99[7-9]2112 H H445\d24450H - -[14]\d\d(?:\d{2})?HH" 1(?:0[02]|19)2100H* HJAF 1(?:0[02]|19)2100H1(?:0[02]|19)|404042100 H404\d\d240400H404\d\d240400H - - [19]\d\dH" 9(?:11|88|99)2911* HJAG -9(?:11|99)2911176|9(?:11|88|99)2176 H -1762176 -1762176 - - [19]\d\dH" -9(?:11|88)2911* HJAI -9112911176|9(?:11|88)2176 H -1762176 -1762176 - - [15]\d{2,5}HHHH"0%1(?:1(?:2|6[01]\d\d)|2[7-9]|3[15]|41)2112HH*5\d{4}250000HJAL1(?:12|2[7-9])2112HUN1(?:1(?:6(?:000|1(?:06|11|23))|8\d\d)|65\d|89[12])|5\d{4}|1(?:[1349]\d|2[2-9])2110 H 1232123H -131|5\d{4}2131HH - - [148]\d{2,4}HHH"10[1-3]2101H* HJAM10[1-3]2101H(?:1|8[1-7])\d\d|404042100 H404\d\d240400H404\d\d240400H -x - 1\d\dH"11[235]2112* HJAO11[235]211211[235]2112 H H H - -[01389]\d{1,4}HHHH">4000|1(?:0[0-35-7]|1[0245]|2[015]|3[47]|4[478]|9)|911219HH* HJAR 10[017]|9112100HE?000|1(?:0[0-35-7]|1[02-5]|2[015]|3[47]|4[478]|9)|3372|89338|911219 H893\d\d289300H(?:337|893\d)\d23370HH - -[49]\d\d(?:\d{2})?HH" -9(?:11|88)2911H* HJAS 9112911H40404|9(?:11|88)2911 H H404\d\d240400H - -"[168]\d\d(?:\d(?:\d{2})?)?HHH"921(?:12|2[0238]|3[03]|4[0-247])|1(?:16\d\d|4[58])\d2112* HJAT1(?:[12]2|33|44)2112H_X1(?:1(?:2|6(?:00[06]|1(?:17|23)))|2[0238]|3[03]|4(?:[0-247]|5[05]|84))|(?:61|8108[1-3])02112 H 610|810\d{3}2610HH H - - [0-27]\d{2,7}HHHHHH"+000|1(?:06|12|258885|55\d)|7332000HHH*+1(?:2(?:34|456)|9\d{4,6})21234HHHHHJAU000|1(?:06|12)2000H000|1(?:06|1(?:00|2|9[46])|2(?:014[1-3]|[23]\d|(?:4|5\d)\d{2,3}|68[689]|72(?:20|3\d\d)|8(?:[013-9]\d|2))|555|9\d{4,6})|225|7(?:33|67)2000'1(?:1[09]\d|24733)|225|7672225HHH1(?:258885|55\d)21550HH 19\d{4,6}2190000HHH - - [19]\d\dH"100|9112100* HJAW100|91121001(?:00|18|76)|91[13]2100 H -1762176 -1762176 - -[17]\d\d(?:\d{2})?HH" 1122112H* HJAX 1122112H112|75[12]\d\d2112 H H H - - [148]\d{2,3}HH"1(?:0[1-3]|12)2101H* HJAZ1(?:0[1-3]|12)2101H"1(?:0[1-3]|12)|(?:404|880)02101 H (?:404|880)\d24040H (?:404|880)\d24040H - -1\d{2,5}HHHH"1(?:16\d{3}|2[2-4])2122HH* HJBA12[2-4]2122He^1(?:16(?:00[06]|1(?:1[17]|23))|2(?:0[0-7]|[2-5]|6[0-26])|(?:[3-5]|7\d)\d\d)|1(?:18|2[78])\d\d?2122 H H H - - [2-689]\d\dH" 988|[2359]112211* HJBB[2359]112211 988|[2-689]112211 H[468]112411 H - - [1579]\d{2,4}HHH"10[0-26]|[19]992100H* HJBD10[0-2]|[19]992100H1(?:0(?:[0-369]|5[1-4]|7[0-4]|8[0-29])|1[16-9]|2(?:[134]|2[0-5])|3(?:1\d?|6[3-6])|5[2-9])|5012|786|9594|[19]99|1(?:0(?:50|6\d)|33|4(?:0|1\d))\d2100 H*1(?:11|2[13])|(?:501|959)\d|7862111HH959\d29590H - -"[1-9]\d\d(?:\d(?:\d{2})?)?HHH";41(?:0[0-35-8]|1[0269]|7(?:12|77)|813)|(?:116|8)\d{3}2100*:01(?:2[03]|40)4|(?:1(?:[24]1|3[01])|[2-79]\d\d)\d21204HJBE 1(?:0[01]|12)2100H1(?:0[0-8]|16117|2(?:12|3[0-24])|313|414|5(?:1[05]|5[15]|66|95)|6(?:1[167]|36|6[16])|7(?:[07][017]|1[27-9]|22|33|65)|81[39])|[2-9]\d{3}|11[02679]|1(?:1600|45)0|1(?:[2-4]9|78)9|1[2-4]0[47]2100 H H -[2-9]\d{3}22000H -m -1\dH" 1[78]217* HJBF 1[78]217 1[78]217 H H H - -1\d\d(?:\d{3})?HH""1(?:1(?:2|6\d{3})|50|6[06])2112* HJBG1(?:12|50|6[06])2112H(!1(?:1(?:2|6(?:000|111))|50|6[06])2112 H H H - -[0189]\d\d(?:\d{2})?HH" (?:0[167]|81)\d{3}|[19]992199* 9[148]\d{3}291000HJBH[19]992199HSL1(?:[02]\d|12|4[01]|51|8[18]|9[169])|99[02489]|(?:0[167]|8[158]|9[148])\d{3}2100 H!0[67]\d{3}|88000|98555206000H 88000|98555288000H - - [16-9]\d{2,3}HH" 11[237]|6112112H* HJBI11[237]2112H=61(?:1\d|5[2-9]|6[0-256])|611|7(?:10|77|979)|8[28]8|9002110 H611|7(?:10|77)|888|9002611H -(?:71|90)02710H - - [17]\d{2,3}HH"11[78]|7[3-5]\d\d2117* HJBJ11[78]2117H' 1(?:1[78]|2[02-5]|60)|7[0-5]\d\d2117 H12[02-5]2120H H -d -1\dH"18218* HJBL1821818218 H H H - - [19]\d\dH" -9(?:11|88)2911* HJBM -9112911176|9(?:11|88)2176 H -1762176 -1762176 -x - 9\d\dH"99[135]2991* HJBN99[135]299199[135]2991 H H H - -[14]\d\d(?:\d{2})?HH"11[089]2110H* HJBO11[089]2110H 11[089]|404042110 H H404\d\d240400H - - [19]\d\dH"112|9112112* HJBQ112|91121121(?:12|76)|9112112 H -1762176 -1762176 - - [1-69]\d{2,5}HHHH":/1(?:00|12|28|8[015]|9[0-47-9])|4(?:57|82\d)|9112100HH* HJBR1(?:12|28|9[023])|9112112H1(?:0(?:[02]|3(?:1[2-579]|2[13-9]|3[124-9]|4[1-3578]|5[1-468]|6[139]|8[149]|9[168])|5[0-35-9]|6(?:0|1[0-35-8]?|2[0145]|3[0137]?|4[37-9]?|5[0-35]|6[016]?|7[137]?|8[5-8]|9[1359]))|1[25-8]|2[357-9]|3[024-68]|4[12568]|5\d|6[0-8]|8[015]|9[0-47-9])|2(?:7(?:330|878)|85959?)|(?:32|91)1|4(?:0404?|57|828)|55555|6(?:0\d{4}|10000)|(?:133|411)[12]2100102|273\d\d|3212102HH5(151|(?:278|555)\d\d|4(?:04\d\d?|11\d|57)2151HHH?8285\d{2,3}|321|40404|(?:27[38]\d|482)\d|6(?:0\d|10)\d{3}2321 - - 9\d\dH" 9(?:1[19]|88)2911* HJBS 91[19]2911 9(?:1[19]|88)2911 H H H - -[14]\d\d(?:\d{2})?HH"11[023]2110H* HJBT11[023]2110H 11[0-6]|404042110 H H404\d\d240400H - -[19]\d\d(?:\d{2})?HH"9(?:11|9[7-9])2911H* HJBW9(?:11|9[7-9])2911H+$1(?:1[26]|3123)|9(?:1[14]|9[1-57-9])2112 H131\d\d213100H131\d\d213100H - - 1\d\dH"1(?:0[1-3]|12)2101* HJBY1(?:0[1-3]|12)2101?81(?:0[1-79]|1[246]|35|5[1-35]|6[89]|7[5-7]|8[58]|9[1-7])2101 H H H - - 9\d\d?HH"9(?:0|11|22|66|77|9[09])290* HJBZ 9(?:0|11|90)2909(?:0|11|22|66|77|9[09])290 H H H - --#[1-9]\d\d(?:\d\d(?:\d(?:\d{2})?)?)?HHHH"112|988|[29]112112H* HJCA112|9112112H81112|30000\d{3}|[1-35-9]\d{4,5}|[2-8]11|9(?:11|88)2112 H [235-7]112211H'300\d{5}|[1-35-9]\d{4,5}210000HHH -{ - [01]\d\dH"000|1122000* HJCC000|1122000000|1122000 H H H - -[14]\d\d(?:\d{2})?HH"1(?:1[348]|77|88)2113H* HJCD1(?:1[348]|77|88)2113H!1(?:1[348]|23|77|88)|404042113 H404\d\d240400H404\d\d240400H - -1\d{2,3}HH"1(?:1[78]|22\d)2117* HJCF1(?:1[78]|220)21171(?:1[478]|220)2114 H H H -y - 1\d\dH"11[178]2111* HJCG 11[78]2117 11[126-8]2111 H H H - - [1-9]\d{2,5}HHHH".!1(?:1(?:[278]|6\d{3})|4[47])|52002112HHH**1(?:14|8[0-2589])\d|543|831112543HHHJCH1(?:1[278]|44)2112Hz1(?:0[78]\d\d|1(?:[278]|45|6(?:000|111))|4(?:[03-57]|1[0145])|6(?:00|[1-46])|8(?:02|1[189]|[25]0|7|8[08]|99))|[2-9]\d{2,4}2112+ 1(?:4[035]|6[1-46])|1(?:41|60)\d2140HH 5(?:200|35)2535HH [2-9]\d{2,4}2200HHH - - [14]\d{2,3}HH"1(?:1[01]|[78]0)2110H* HJCI1(?:1[01]|[78]0)2110H1(?:1[01]|[78]0)|44432110 H444\d24440H444\d24440H -x - 9\d\dH"99[689]2996* HJCK99[689]299699[689]2996 H H H - - [1-9]\d{2,4}HHH"$1(?:213|3[1-3])|434\d|9112131HH*1(?:211|3(?:13|[348]0|5[01]))|(?:1(?:[05]6|[48]1|9[18])|2(?:01\d|[23]2|77|88)|3(?:0[59]|13|3[279]|66)|4(?:[12]4|36\d|4[017]|55)|5(?:00|41\d|5[67]|99)|6(?:07\d|13|22|3[06]|50|69)|787|8(?:[01]1|[48]8)|9(?:01|[12]0|33))\d21060HHJCL 13[1-3]|9112131H1(?:00|21[13]|3(?:13|[348]0|5[01])|4(?:0[02-6]|17|[379])|818|919)|2(?:0(?:01|122)|22[47]|323|777|882)|3(?:0(?:51|99)|132|3(?:29|[37]7)|665)|43656|5(?:(?:00|415)4|5(?:66|77)|995)|6(?:131|222|366|699)|7878|8(?:011|11[28]|482|889)|9(?:01|1)1|13\d|4(?:[13]42|243|4(?:02|15|77)|554)|(?:1(?:[05]6|98)|339|6(?:07|[35])0|9(?:[12]0|33))02100 (?:200|333)\d22000H H13(?:13|[348]0|5[01])|(?:1(?:[05]6|[28]1|4[01]|9[18])|2(?:0(?:0|1\d)|[23]2|77|88)|3(?:0[59]|13|3[2379]|66)|436\d|5(?:00|41\d|5[67]|99)|6(?:07\d|13|22|3[06]|50|69)|787|8(?:[01]1|[48]8)|9(?:01|[12]0|33))\d|4(?:[1-3]4|4[017]|55)\d21060HH - - [18]\d{1,3}HHH"1(?:1[37]|[37])213HH* HJCM1(?:1[37]|[37])213HH1(?:1[37]|[37])|8711213 H871\d28710H871\d28710H - -[19]\d\d(?:\d{2,3})?HHH" 1(?:1[09]|20)2110H* HJCN 1(?:1[09]|20)2110H&1(?:00\d\d|1[029]|20)|95\d{3,4}21101(?:00\d\d|12)|95\d{3,4}2112 H H - -[1-589]\d\d(?:\d{2,3})?HHH"1(?:1[29]|23|32|56)2112H* HJCO1(?:1[29]|23|32|56)2112Hx1(?:06|1[2-9]|2[35-7]|3[27]|4[467]|5[36]|6[4-7]|95)|(?:29002|39003)9|40404|5930\d\d|85432|(?:[2359][57]|8(?:7|9\d))\d{3}2106 H(?:40|85)4\d\d240400H(?:40|85)4\d\d240400H - - [1359]\d{2,3}HH"112|9112112H* HJCR112|9112112H1(?:0(?:00|15|2[2-4679])|1(?:1[0-35-9]|2|37|[46]6|7[57]|8[79]|9[0-379])|2(?:00|[12]2|34|55)|3(?:21|33)|4(?:0[06]|1[4-6])|5(?:15|5[15])|693|7(?:00|1[7-9]|2[02]|[67]7)|975)|3855|5(?:0(?:30|49)|510)|9112112 H H!(?:385|5(?:0[34]|51))\d23850H - -[12]\d\d(?:\d{3,4})?HHH"!10[4-7]|(?:116|204\d)\d{3}2104* HJCU10[4-6]2104H)"1(?:0[4-7]|1(?:6111|8)|40)|20452522104 H H H -x - 1\d\dH"13[0-2]2130* HJCV13[0-2]213013[0-2]2130 H H H - - [19]\d\dH"112|9112112* HJCW112|91121121(?:12|76)|9112112 H -1762176 -1762176 -{ - [01]\d\dH"000|1122000* HJCX000|1122000000|1122000 H H H - -1\d\d(?:\d{3})?HH"1(?:1(?:2|6\d{3})|99)2112* HJCY -1(?:12|99)2112H"1(?:1(?:2|6(?:000|111))|99)2112 H H H - -1\d{2,5}HHHH"1&1(?:1(?:2|6(?:00[06]|1(?:11|23)))|5\d)2112HH* HJCZ 1(?:12|5\d)2112H=61(?:1(?:2|8\d)|(?:2|3\d)\d{2,3}|5\d|99)|1(?:16|4)\d{3}2112 H H H - -1\d\d(?:\d{2,3})?HHH"11(?:[02]|6\d{3})2110HH* HJDE11[02]2110H;411(?:[025]|6(?:00[06]|1(?:1[167]|23))|800\d)|118\d\d2110 H H H -m -1\dH" 1[78]217* HJDJ 1[78]217 1[78]217 H H H - -1\d{2,5}HHHH"11(?:[24]|6\d{3})2112HH* HJDK11[24]2112HRK1(?:1(?:[2-48]|6(?:00[06]|111))|619[0-2]|8(?:01|1[0238]|28|30|5[13]|8[18]))2112 H H H - - [39]\d\dH"333|9(?:11|88|99)2333* HJDM333|9(?:11|99)2333333|9(?:11|88|99)2333 H H H - - [19]\d\dH"112|9(?:11|88)2112* HJDO112|9112112112|9(?:11|88)2112 H H H - - [17]\d{1,3}HHH"1(?:12|[47]|54\d)214* HJDZ 1(?:12|[47])214HH1(?:055|12|[47]|548)|730214 H 7302730H 7302730H - - [19]\d\dH"1(?:0[12]|12)|9112101* HJEC1(?:0[12]|12)|91121011(?:0[12]|12)|9112101 H H H - -1\d{2,5}HHHH"1(?:1(?:[02]|6\d{3})|2(?:05|28)|3(?:014|3(?:21|5\d?)|660)|492|5(?:1[03]|410|501)|6(?:112|333|644)|7(?:012|127|89)|8(?:10|8[57])|9(?:0[134]|14))2110*1(?:18(?:00|[12458]\d?)|2(?:0(?:[02-46-8]\d?|1[0-36])|1(?:[0-4]\d?|6[06])|2(?:[0-4]\d?|5[25])|[367]|4(?:0[04]|[12]\d?|4[24]|54)|55[12457])|3(?:0(?:[02]\d?|1[13578]|3[356])|1[1347]|2[02-5]|3(?:[01347]\d?|2[023]|88)|4(?:[35]\d?|4[34])|5(?:3[134]|5[035])|666)|4(?:2(?:00|4\d?)|4(?:0[01358]|1[024]|50|7\d?)|900)|5(?:0[0-35]|1(?:[1267]\d?|5[0-7]|82)|2(?:[014-6]\d?|22)|330|4(?:[35]\d?|44)|5(?:00|[1-69]\d?)|9(?:[159]\d?|[38]0|77))|6(?:1(?:00|1[19]|[35-9]\d?)|2(?:2[26]|[68]\d?)|3(?:22|36|6[36])|5|6(?:[0-359]\d?|6[0-26])|7(?:00|55|7\d?|8[89])|9(?:00|1\d?|69))|7(?:0(?:[023]\d?|1[0578])|1(?:00|2[034]|[4-9]\d?)|2(?:[07]\d?|20|44)|7(?:[0-57]\d?|9[79])|8(?:0[08]|2\d?|8[0178])|9(?:00|97))|8(?:1[127]|8[1268]|9[269])|9(?:0(?:[02]\d?|69|9[0269])|1[1-3689]|21))2123HHHJEE11[02]2110H1(?:1(?:[02-579]|6(?:000|111)|8(?:[09]\d|[1-8]))|2[36-9]|3[7-9]|4[05-7]|5[6-8]|6[05]|7[3-6]|8[02-7]|9[3-9])|1(?:2[0-245]|3[0-6]|4[1-489]|5[0-59]|6[1-46-9]|7[0-27-9]|8[189]|9[0-2])\d\d?2110 H H1(?:18[1258]|2(?:0(?:1[036]|[46]\d?)|166|21|4(?:0[04]|1\d?|5[47])|[67])|3(?:0(?:1[13-578]|2\d?|3[56])|1[15]|2[045]|3(?:[13]\d?|2[13])|43|5(?:00|3[34]|53))|44(?:0[0135]|14|50|7\d?)|5(?:05|1(?:[12]\d?|5[1246]|8[12])|2(?:[01]\d?|22)|3(?:00|3[03])|4(?:15|5\d?)|500|9(?:5\d?|77|80))|6(?:1[35-8]|226|3(?:22|3[36]|66)|644|7(?:00|7\d?|89)|9(?:00|69))|7(?:01[258]|1(?:00|[15]\d?)|2(?:44|7\d?)|8(?:00|87|9\d?))|8(?:1[128]|8[56]|9(?:[26]\d?|77))|90(?:2\d?|69|92))2126HHH - -[13]\d\d(?:\d{2})?HH" 1(?:2[23]|80)2122H* HJEG 1(?:2[23]|80)2122H$1(?:2[23]|[69]\d{3}|80)|344002122 H344\d\d234400H344\d\d234400H - - 1\d\d?HH" 1(?:[59]|77)215* HJEH 1(?:[59]|77)215 1(?:[59]|77)215 H H H - -[12]\d\d(?:\d{3})?HH"&11[2-46]|(?:12[47]|20[12])\d{3}2112* HJERA:1(?:1[2-46]|24422)|20(?:1(?:606|917)|2914)|(?:1277|2020)992112@91(?:1[2-6]|24422)|20(?:1(?:606|917)|2914)|(?:1277|2020)992112 H H H - -[0-379]\d{2,5}HHHH"H;0(?:16|6[57]|8[58])|1(?:006|12|[3-7]\d\d)|(?:116|20\d)\d{3}2016HHH*SL[12]2\d{1,4}|90(?:5\d|7)|(?:118|2(?:[357]\d|80)|3[357]\d)\d\d|[79]9[57]\d{3}2120JES -08[58]|1122085H0(?:1[0-26]|6[0-257]|8[058]|9[12])|1(?:0[03-57]\d{1,3}|1(?:2|6(?:000|111)|8\d\d)|2\d{1,4}|[3-9]\d\d)|2(?:2\d{1,4}|80\d\d)|90(?:5[124578]|7)|1(?:3[34]|77)|(?:2[01]\d|[79]9[57])\d{3}|[23][357]\d{3}2010*0(?:[16][0-2]|80|9[12])|21\d{4}2010HH!1(?:3[34]|77)|[12]2\d{1,4}2120D7(?:2[0-2]\d|3[357]|[79]9[57])\d{3}|2(?:[2357]\d|80)\d\d222000HH - - 9\d\d?HH"9(?:07|11?|2|39?|9[17])291* HJET9(?:11?|2|39?|9[17])291 9(?:07|11?|2|39?|45|9[17])291 H H H - -[17]\d\d(?:\d{2,3})?HHH"11(?:2|6\d{3})2112HH* HJFI 1122112H3,11(?:2|6(?:00[06]|1(?:1[17]|23)))|75[12]\d\d2112 H H H - -"[0-579]\d(?:\d(?:\d{2})?)?HHH"91[17]2911H* HJFJ91[17]2911HJD0(?:1[34]|8[1-4])|1(?:0[1-3]|[25]9)|2[289]|30|40404|91[137]|[45]4|75222 H H404\d\d240400H -u - [19]\d\dH" -9992999* HJFK -9992999 1\d\d|9992100 H H H - -[39]\d\d(?:\d{3})?HH" 320\d{3}|9112911* HJFM (?:32022|91)12911 (?:32022|91)12911 H H H - -1\d{2,3}HH"1(?:1[24]|81\d)2112* HJFO11[24]2112H.'1(?:1[248]|819)|1(?:4[124]|71|8[7-9])\d2112 H H H - - [1-8]\d{1,5}HHHHH"SM1(?:0(?:07|[13]3)|1[02459]|[578]|9[167])|224|(?:3370|74)0|(?:116\d|3[01])\d\d215*5'366\d\d|3[2-9]\d\d|(?:118|[4-8]\d)\d{3}23200HHHJFR 1(?:12|[578])215HH|1(?:0\d\d|1(?:[02459]|6(?:000|111)|8\d{3})|[578]|9[167])|2(?:0(?:00|2)0|24)|[3-8]\d{4}|3\d{3}|6(?:1[14]|34)|7(?:0[06]|22|40)215D910(?:[134]4|2[23]|5\d|99)|202\d|634|70[06]|(?:106|61)[14]2611HHF7118777|224|6(?:1[14]|34)|7(?:0[06]|22|40)|20(?:0\d|2)\d2224HHHH114|[3-8]\d{4}2114HH - - 1\d(?:\d{2})?HH"18|1(?:3\d|73)\d218* HJGA1(?:3\d\d|730|8)2181(?:3\d\d|730|8)218 H H H - -[1-46-9]\d{2,5}HHHH"B;1(?:05|1(?:[29]|6\d{3})|7[56]\d|8000)|2(?:20\d|48)|4444|9992105* HJGB112|9992112H1(?:0[015]|1(?:[129]|6(?:000|1(?:11|23))|8\d{3})|2(?:[1-3]|50)|33|4(?:1|7\d)|571|7(?:0\d|[56]0)|800\d|9[15])|2(?:0202|1300|2(?:02|11)|3(?:02|336|45)|4(?:25|8))|3[13]3|4(?:0[02]|35[01]|44[45]|5\d)|(?:[68]\d|7[089])\d{3}|15\d|2[02]2|650|789|9(?:01|99)2100 HL?1(?:(?:25|7[56])\d|571)|2(?:02(?:\d{2})?|[13]3\d\d|48)|4444|9012202HHH8,(?:125|2(?:020|13\d)|(?:7[089]|8[01])\d\d)\d21250HH - - [19]\d\dH" -9(?:11|88)2911* HJGD -9112911176|9(?:11|88)2176 H -1762176 -1762176 - -[014]\d\d(?:\d{2})?HH""0(?:11|33)|11[1-3]|[01]222011H* HJGE"0(?:11|33)|11[1-3]|[01]222011H&0(?:11|33)|11[1-3]|40404|[01]222011 H404\d\d240400H404\d\d240400H -p -1\dH" 1[578]215* HJGF 1[578]215 1[578]215 H H H - - [19]\d{2,5}HHHH"112|9992112H* HJGG112|9992112HB;1(?:0[01]|1[12]|23|41|55|9[05])|999|1(?:1[68]\d\d|47|800)\d2100 H H H - -[14589]\d{2,4}HHH" 19[1-3]|9992191H* HJGH 19[1-3]|9992191H$19[1-3]|40404|(?:54|83)00|9992191 H 404\d\d|(?:54|83)0\d25400HH 404\d\d|(?:54|83)0\d25400HH - - [158]\d{2,5}HHHH"L?1(?:00|1[25]|23|4(?:1|7\d)|5[15]|9[02-49])|555|(?:116\d|80)\d\d2100HHH* 8[1-69]\d\d28100HJGI 1(?:12|9[09])2112Hz1(?:00|1(?:[25]|6(?:00[06]|1(?:1[17]|23))|8\d\d)|23|4(?:1|7[014])|5[015]|9[02-49])|555|8[0-79]\d\d|8(?:00|4[0-2]|8[0-589])2100 -150|87\d\d2150HHH=1(?:00|1(?:5|8\d\d)|23|51|9[2-4])|555|8(?:00|4[0-2]|8[0-589])2100HH H -q - 1\d\dH" -1122112* HJGL -11221121[1-8]\d2110 H H H - - 1\d\d?HH"1(?:1[6-8]|[6-8])216* HJGM1(?:1[6-8]|[6-8])2161(?:1[6-8]|[6-8])216 H H H - -[14]\d\d(?:\d{2})?HH" H* HJGN H -12\d|404042120 H404\d\d240400H404\d\d240400H -p -1\dH" 1[578]215* HJGP 1[578]215 1[578]215 H H H - -1\d\d(?:\d{2,3})?HHH"*1(?:0[089]|1(?:2|6\d{3})|66|99)2100HH* HJGR1(?:00|12|66|99)2100HB;1(?:0[089]|1(?:2|320|6(?:000|1(?:1[17]|23)))|(?:389|9)9|66)2100113\d\d211300H H H - - [14]\d{2,4}HHH" 1(?:10|2[03])2110H* HJGT 1(?:10|2[03])2110H 110|40404|1(?:2|[57]\d)\d2110 H404\d\d240400H404\d\d240400H -z - 9\d\dH" -9(?:11|88)2911* HJGU -9112911 -9(?:11|88)2911 H H H -x - 1\d\dH"11[378]2113* HJGW11[378]211311[378]2113 H H H - - [019]\d{2,3}HH"91[1-3]2911H* HJGY91[1-3]2911HTM0(?:02|(?:17|80)1|444|7(?:[67]7|9)|9(?:0[78]|[2-47]))|1(?:443|5[568])|91[1-3]2002 H144\d21440H144\d21440H - - [19]\d{2,6}HHHHH" -112|99[29]2112H* HJHK -112|99[29]2112H1(?:0(?:(?:[0136]\d|2[14])\d{0,3}|8[138])|12|2(?:[0-3]\d{0,4}|(?:58|8[13])\d{0,3})|7(?:[135-9]\d{0,4}|219\d{0,2})|8(?:0(?:(?:[13]|60\d)\d|8)|1(?:0\d|[2-8])|2(?:0[5-9]|(?:18|2)2|3|8[128])|(?:(?:3[0-689]\d|7(?:2[1-389]|8[0235-9]|93))\d|8)\d|50[138]|6(?:1(?:11|86)|8)))|99[29]|10[0139]2100 H109|1(?:08|85\d)\d2109HHH 9922992H - -[14]\d\d(?:\d{2})?HH" 1992199H* HJHN 1992199H 199|404042199 H404\d\d240400H404\d\d240400H - - [19]\d{1,5}HHHHH"3%1(?:12|9[2-4])|9[34]|1(?:16\d|39)\d\d293HHHH*118\d\d211800HJHR1(?:12|9[2-4])|9[34]293HHJD1(?:1(?:2|6(?:00[06]|1(?:1[17]|23))|8\d\d)|3977|9(?:[2-5]|87))|9[34]293 H139\d\d213900H139\d\d213900H - -[14]\d\d(?:\d{2})?HH"11[48]2114H* HJHT11[48]2114H 11[48]|404042114 H404\d\d240400H404\d\d240400H - -1\d{2,5}HHHH"2+1(?:0[457]|12|4[0-4]\d)|1(?:16\d|37|45)\d\d2104* HJHU1(?:0[457]|12)2104H1(?:0[457]|1(?:2|6(?:000|1(?:11|23))|800)|2(?:0[0-4]|1[013489]|2[0-5]|3[0-46]|4[0-24-68]|5[0-2568]|6[06]|7[0-25-7]|8[028]|9[08])|37(?:00|37|7[07])|4(?:0[0-5]|1[013-8]|2[034]|3[23]|4[02-9]|5(?:00|41|67))|777|8(?:1[27-9]|2[04]|40|[589]))2104 H-!1(?:4[0-4]|77)\d|1(?:18|2|45)\d\d21200HH184\d21840H - -[178]\d\d(?:\d{2,3})?HHH" 11[02389]2110H* HJID 11[02389]2110H-&1(?:1[02389]|40\d\d|50264)|71400|898872110 H(?:714|898)\d\d271400H714\d\d271400H - - [159]\d{2,5}HHHH"11(?:2|6\d{3})|9992112HH* -5[37]\d{3}253000HJIE112|9992112HHA11(?:2|6(?:00[06]|1(?:1[17]|23)))|999|(?:1(?:18|9)|5[0137]\d)\d\d211251\d{3}251000H51210251210H%51210|(?:118|5[037]\d)\d\d211800H - - [12]\d{2,4}HHH"1(?:0[0-2]|12)2100H* HJIL1(?:0[0-2]|12)2100H?81(?:0[0-2]|1(?:[013-9]\d|2)|[2-9]\d\d)|2407|(?:104|27)002100 H104\d\d210400H104\d\d210400H - -[189]\d\d(?:\d{2,3})?HHH" 9992999H* HJIM 9992999H)"1\d\d(?:\d{3})?|8(?:6444|9887)|9992100 H H8(?:64|98)\d\d286400H - -[12578]\d{2,8}HHHHHHH "1(?:0[0-248]|1[289]|21|[39][89]|4[01]|6(?:1|6\d?)|8[12])|777|800|1[05]5\d|1(?:07|51|94)\d\d?|(?:1(?:[05]5\d|70)\d|261)\d|1(?:0[369]|10|29|3[126]|9[0-256])\d2100HHHH*#11[67]\d{4}|5616156121160000HHJIN#1(?:0[0-28]|12|298)|26112100HH1(?:0(?:[0-248]|3[39]|5(?:010|6)|6[3468]|7(?:[01357]|[28]0?|4[01])|9[0135-9])|1(?:00|[289])|2(?:1|98)|3(?:11|2[0-2]|63|[89])|4[01]|5(?:1(?:0[0-36]|[127])|54)|6(?:1|6[01]?)|7000|8[12]|9(?:0[013-59]|12|25|4[4-9]\d?|50|6[1347]|[89]))|2611|5(?:0(?:0(?:0\d|1|20?)|325|5[2-79]\d{3,5})|1(?:234|555|717|818|96[49])|2(?:0(?:0[01]|[14]0)|151|555|666|888|9(?:06|99\d?))|3(?:0[01]0|131|553|(?:66|77)6)|(?:464|55[05])\d{1,3}|6(?:070|3[68]|43)|717\d)|777|800|5(?:05(?:0|1\d)|221|3(?:03|3[23]))\d{1,4}|5(?:(?:04|88)0|2(?:2[0267]|3[16])|4(?:1[04]|20|3[02])|5(?:3[16]|67)|6(?:06|[67]\d)|787|9(?:64|90))\d\d?|(?:1(?:05[79]|(?:1[67][0-2]|802)\d|55[23])\d|5(?:(?:00(?:0\d|1)|(?:304|616)\d\d)\d|1(?:0[12]|4[2-4])|2(?:2[3589]|3(?:1\d{3}|2)|4[04]|7[78])|4(?:[02]4|32\d{4}|4[04]|99)|5(?:1[25]|[36]5|4[45]|93)|7(?:(?:17\d|57)\d\d|[27]7|88)|8(?:3[4-69]|4[01]|5[58]|88(?:8\d\d|9)|99)|9(?:0(?:0|2\d{3})|55|6[67]|77|88)))\d2100,5(?:14(?:2[5-9]|[34]\d)|757555)251425HHkX1(?:(?:1[67]\d\d|70)\d\d|55330|909)|5(?:300\d|6161(?:17[89]|561))|1(?:[19][89]|21|4[01])2118HHHHHHSB1(?:39|90[019])|5(?:14(?:2[5-9]|[34]\d)|6161(?:17[89]|561)|757555)2139HHHHH - - [1479]\d{2,4}HHH"1(?:0[04]|15|22)2100H* HJIQ1(?:0[04]|15|22)2100H' 1(?:0[04]|15|22)|4432|71117|99882100 H(?:443|711\d|998)\d24430HH(?:443|711\d|998)\d24430HH - - [129]\d{2,5}HHHH"*!1(?:1[0-68]|2[0-59]|9[0-579])|9112110H* HJIR1(?:1[025]|25)|9112110H1(?:1[0-68]|2[0-59]|3[346-8]|4(?:[0147]|[289]0)|5(?:0[14]|1[02479]|2[0-3]|39|[49]0|65)|6(?:[16]6|[27]|90)|8(?:03|1[18]|22|3[37]|4[28]|88|99)|9[0-579])|20(?:[09]0|1(?:[038]|1[079]|26|9[69])|2[01])|9(?:11|9(?:0009|90))2110"1(?:5[0-469]|8[0-489])\d21500H6*(?:1(?:5[0-469]|8[0-489])|99(?:0\d\d|9))\d21500HH990\d{3}2990000H - -1\d\d(?:\d(?:\d{2})?)?HHH" 1(?:12|71\d)2112HH* HJIS 1122112Hha1(?:1(?:[28]|61(?:16|23))|4(?:00|1[145]|4[0146])|55|7(?:00|17|7[07-9])|8(?:[02]0|1[16-9]|88)|900)2112 H 14(?:0\d|41)21400H 1(?:415|90\d)21415H - - [14]\d{2,6}HHHHH"%1(?:1(?:[2358]|6\d{3})|87)2112HH*9+(?:12|4(?:[478](?:[0-4]|[5-9]\d\d)|55))\d\d21200HHHJIT11[2358]2112H1(?:0\d{2,3}|1(?:[2-57-9]|6(?:000|111))|3[39]|4(?:82|9\d{1,3})|5(?:00|1[58]|2[25]|3[03]|44|[59])|60|8[67]|9(?:[01]|2[2-9]|4\d|696))|4(?:2323|5045)|(?:1(?:2|92[01])|4(?:3(?:[01]|[45]\d\d)|[478](?:[0-4]|[5-9]\d\d)|55))\d\d2112 H HG:4(?:3(?:[01]|[45]\d\d)|[478](?:[0-4]|[5-9]\d\d)|5[05])\d\d243000HH - -"[129]\d\d(?:\d(?:\d{2})?)?HHH"112|9992112H* HJJE112|9992112HaZ1(?:00|1(?:2|8\d{3})|23|4(?:[14]|28|7\d)|5\d|7(?:0[12]|[128]|35?)|808|9[0135])|23[2-4]|9992100 H H H - - [19]\d\dH"11[029]|9(?:11|88)2110* HJJM 11[029]|9112110 1(?:1[029]|76)|9(?:11|88)2110 H -1762176 -1762176 - -[19]\d\d(?:\d{2})?HH"&1(?:0[235]|1[2-6]|9[127])|9112102H*9[0-4689]\d{3}290000HJJO1(?:12|9[127])|9112112H921(?:0[2359]|1[0-68]|9[0-24-79])|9[0-4689]\d{3}|9112102 H9[0-4689]\d{3}290000H9[0-4689]\d{3}290000H - -[01]\d\d(?:\d{7})?HH -"11[089]2110H* HJJP11[09]2110H,%000[259]\d{6}|1(?:0[24]|1[089]|44|89)2102 H H 000[259]\d{6}2 -0002000000H - - - [1-9]\d{2,4}HHH"5.1(?:1(?:[246]|9\d)|5(?:01|2[127]|6[26]\d))|9992112*909\d\d290900HJKE -11[24]|9992112H1(?:0(?:[07-9]|1[0-25]|400)|1(?:[024-6]|9[0-579])|2[1-3]|3[01]|4[14]|5(?:[01][01]|2[0-24-79]|33|4[05]|5[59]|6(?:00|29|6[67]))|(?:6[035]\d|[78])\d|9(?:[02-9]\d\d|19))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99))\d\d|9(?:09\d\d|99)|89882100 H~1(?:(?:04|6[35])\d\d|3[01]|4[14]|5(?:1\d|2[25]))|(?:(?:2[0-79]|[37][0-29]|4[0-4]|6[2357]|8\d)\d|5(?:[0-7]\d|99)|909)\d\d|898\d2130IB1(?:(?:04|6[035])\d\d|4[14]|5(?:01|55|6[26]\d))|40404|8988|909\d\d2141 - - [14]\d{2,3}HH"10[1-3]2101H* HJKG10[1-3]2101H 10[1-3]|40402101 H404\d24040H404\d24040H - -[146]\d\d(?:\d{2})?HH" 11[7-9]|6662117H* HJKH 11[7-9]|6662117H11[7-9]|40404|6662117 H404\d\d240400H404\d\d240400H - - [179]\d{2,3}HH"19[2-5]|99[2-4]2192H* HJKI19[2-5]|99[2-4]2192H3,1(?:05[0-259]|88|9[2-5])|777|99[2-4]|10[0-8]2100 1032103H H H -m -1\dH" 1[78]217* HJKM 1[78]217 1[78]217 H H H - - [39]\d\dH"333|9(?:11|88|99)2333* HJKN333|9(?:11|99)2333333|9(?:11|88|99)2333 H H H - - [18]\d\dH" -11[29]|8192112* HJKP -11[29]|8192112 -11[29]|8192112 H H H - -1\d{2,4}HHH"!1(?:1[27-9]|28|330|82)2112HH* HJKR11[29]2112Hyr1(?:[016-9]114|3(?:0[01]|2|3[0-35-9]|45?|5[057]|6[569]|7[79]|8[2589]|9[0189]))|1(?:0[015]|1\d|2[01357-9]|41|8[28])2100 H4)1(?:0[01]|1[4-6]|41)|1(?:[06-9]1\d|111)\d2100HH H - -[18]\d\d(?:\d{2})?HH" 1122112H* HJKW 1122112H1[0-7]\d|898872100 H898\d\d289800H H -z - 9\d\dH" -9(?:11|88)2911* HJKY -9112911 -9(?:11|88)2911 H H H - - [134]\d{2,4}HHH"1(?:0[1-3]|12)2101H* HJKZ1(?:0[1-3]|12)2101H#1(?:0[1-4]|12)|(?:3040|404)02101 H(?:304\d|404)\d24040HH(?:304\d|404)\d24040HH -x - 1\d\dH"19[015]2190* HJLA19[015]219019[015]2190 H H H - - [19]\d\dH"1(?:12|40|75)|9992112* HJLB1(?:12|40|75)|99921121(?:12|40|75)|9992112 H H H - - 9\d\dH" 9(?:11|88|99)2911* HJLC -9(?:11|99)2911 9(?:11|88|99)2911 H H H - -1\d{2,3}HH"1(?:1[278]|44)2112H* HJLI1(?:1[278]|44)2112H.'1(?:1(?:[278]|45)|4[3-57]|50|75|81[18])2112 H H H - -1\d{2,3}HH" 11[02689]2110H* HJLK 11[02689]2110H1(?:1[024-9]|3(?:00|1[2-49]|2[23]|3[1-3]|44|5[07]|[67]9|88|9[039])|9(?:0[0-2589]|1[0-357-9]|2[0-25689]|3[0389]|4[0489]|5[014-69]|6[0-2689]|7[03579]|8[02457-9]|9[0-2569]))2110 H H H - - [3489]\d{2,3}HH"355|9112355H* HJLR355|9112355H 355|4040|8(?:400|933)|9112355 H(?:404|8(?:40|93))\d24040H(?:404|8(?:40|93))\d24040H -x - 1\d\dH"11[257]2112* HJLS11[257]211211[257]2112 H H H - -[01]\d(?:\d(?:\d{3})?)?HHH">80(?:11?|22?|33?)|1(?:0[1-3]|1(?:2|6111))|116(?:0\d|12)\d201* HJLT)0(?:11?|22?|33?)|1(?:0[1-3]|12)201HHE?0(?:11?|22?|33?)|1(?:0[1-3]|1(?:[27-9]|6(?:000|1(?:1[17]|23))))201 H H H - -1\d{2,5}HHHH"11(?:[23]|6\d{3})2112HH* HJLU11[23]2112H3,11(?:[23]|6(?:000|111))|1(?:18|[25]\d|3)\d\d2112 H H H - - [018]\d{1,5}HHHHH"%0[1-3]|11(?:[023]|6\d{3})201HHH* 1180|821\d\d21180HHJLV0[1-3]|11[023]201HHHB0[1-4]|1(?:1(?:[02-4]|6(?:000|111)|8[0189])|(?:5|65)5|77)|821[57]4201118121181H165\d21650H H -x - 1\d\dH"19[013]2190* HJLY19[013]219019[013]2190 H H H - - 1\d\d?HH" 1(?:[59]|77)215* HJMA 1(?:[59]|77)215 1(?:[59]|77)215 H H H - - 1\d\d?HH" 1(?:12|[578])215* HJMC 1(?:12|[578])2151(?:12|41|[578])215 H H H - - [19]\d{2,5}HHHH"/$11(?:2|6(?:000|1(?:11|2\d)))|90[1-3]2112HH* HJMD 112|90[1-3]2112Hd]1(?:1(?:2|6(?:00[06]|1(?:1[17]|23))|8\d\d?|99)|90[04-9])|90[1-3]|1(?:4\d\d|6[0-389]|9[1-4])\d2112 H H H - -1\d{2,5}HHHH"1(?:12|2[2-4])2112H* HJME1(?:12|2[2-4])2112Hpi1(?:1(?:(?:[013-57-9]|6\d\d)\d|2)|[249]\d{3}|5999|8(?:0[089]|1[0-8]|888))|1(?:[02-5]\d\d|60[06]|700)|12\d2112 H H H -p -1\dH" 1[578]215* HJMF 1[578]215 1[578]215 H H H - - 1\d\d?HH"1(?:1[78]|[78])217* HJMG1(?:1[78]|[78])2171(?:1[78]|[78])217 H H H -l - 9\d\dH" -9112911* HJMH -9112911 -9112911 H H H - -1\d\d(?:\d(?:\d{2})?)?HHH"$1(?:1(?:2|6\d{3})|9[2-4])2112HH* HJMK1(?:12|9[2-4])2112H2+1(?:1(?:2|8\d)|3\d|9[2-4])|1(?:16|2\d)\d{3}2112 H H H - -[136-8]\d{1,4}HHHH"7+1[578]|(?:352|67)00|7402|(?:677|744|8000)\d215HHH*=1(?:12|800)2\d|3(?:52(?:11|2[02]|3[04-6]|99)|7574)21220HHJML1[578]215H1(?:1(?:[013-9]\d|2)|2(?:1[02-469]|2[13])|[578])|350(?:35|57)|67(?:0[09]|[59]9|77|8[89])|74(?:0[02]|44|55)|800[0-2][12]|3(?:52|[67]\d)\d\d215%37(?:433|575)|7400|8001\d27400HH%3503\d|(?:3[67]\d|800)\d\d235030H7+374(?:0[24-9]|[1-9]\d)|7400|3(?:6\d|75)\d\d27400HH -l - 1\d\dH" -1992199* HJMM -1992199 -1992199 H H H -{ - 1\d\dH"10[0-35]2100* HJMN10[0-35]210010[0-35]2100 H H H -l - 9\d\dH" -9992999* HJMO -9992999 -9992999 H H H -z - 9\d\dH" -9(?:11|88)2911* HJMP -9112911 -9(?:11|88)2911 H H H - - 1\d\d?HH" 1(?:12|[578])215* HJMQ 1(?:12|[578])215 1(?:12|[578])215 H H H -m -1\dH" 1[78]217* HJMR 1[78]217 1[78]217 H H H - - [29]\d\dH" 9(?:11|88|99)2911* HJMS -9(?:11|99)2911211|9(?:11|88|99)2211 H H H - -1\d\d(?:\d{3})?HH"11(?:2|6\d{3})2112* HJMT 1122112H"11(?:2|6(?:000|1(?:11|23)))2112 H H H - - [189]\d{2,4}HHH" 11[45]|99[59]2114H* HJMU 11[45]|99[59]2114H1\d{2,4}|(?:8\d\d|99)\d2100 H H H - - [14]\d{2,3}HH" 1(?:02|1[89])2102H* HJMV 1(?:02|1[89])2102H*#1(?:[0-37-9]|[4-6]\d)\d|4040|1[45]12100 H1[45]12141H H - -[189]\d\d(?:\d{2})?HH" 199|99[7-9]2199H* HJMW 199|99[7-9]2199H199|80400|99[7-9]2199 H804\d\d280400H804\d\d280400H - - [0579]\d{2,4}HHH"0(?:6[0568]|80)|9112060H*(?:530\d|776)\d27760HHJMX0(?:6[0568]|80)|9112060H0[1-9]\d|53053|7766|9112010 H0(?:[249]0|[35][01])2020H H - - [1369]\d{2,4}HHH"112|9992112H* HJMY112|9992112H1(?:0[01348]|1(?:[02]|1[128]|311)|2(?:0[125]|[13-6]|2\d{0,2})|(?:3[1-35-79]|7[45])\d\d?|5(?:454|5\d\d?|77|888|999?)|8(?:18?|2|8[18])|9(?:[124]\d?|68|71|9[0679]))|66628|99[1-469]|13[5-7]|(?:1(?:0[569]|309|5[12]|7[136-9]|9[03])|3[23679]\d\d)\d2100666\d\d266600H H!(?:3[23679]\d|666)\d\d232000H - -1\d{2,3}HH"1(?:1[79]|9[78])2117H* HJMZ1(?:1[79]|9[78])2117H"1(?:[02-5]\d\d|1[79]|9[78])2117 H H H - - [19]\d{2,4}HHH"10111210111H* HJNA10111210111H!(?:10|93)111|(?:1\d|9)\d\d2900 H H H - - [135]\d{1,3}HHH"3-1(?:0(?:00|1[23]|3[0-2]|8\d)|[5-8])|363\d|577215* HJNC1[5-8]215HMG1(?:0(?:0[06]|1[02-46]|20|3[0-25]|42|5[058]|77|88)|[5-8])|3631|5[6-8]\d215 -5(?:67|88)2567H H H - -#[1-3578]\d(?:\d(?:\d{3})?)?HHH"1(?:18|[578])|723\d{3}215* HJNE1(?:18|[578])|723141215KE1(?:0[01]|1[128]|2[034]|3[013]|[46]0|55?|[78])|222|333|555|723141|888215 H@71(?:0[01]|1[12]|2[034]|3[013]|[46]0|55)|222|333|555|8882100H H - - 9\d\dH" 9(?:11|55|77)2911* HJNF 9(?:11|55|77)2911 9(?:11|55|77)2911 H H H - -[14]\d\d(?:\d{2})?HH" 1992199H* HJNG 1992199H 199|407002199 H407\d\d240700H407\d\d240700H - -[12467]\d{2,3}HH"1(?:1[58]|2[08])|737\d2115* HJNI1(?:1[58]|2[08])2115H@91(?:1[58]|200)|4878|7(?:010|373)|12[0158]|(?:19|[267]1)002115 H H H - -#[1349]\d\d(?:\d(?:\d{2})?)?HHH"11(?:2|6\d{3})|9112112HH* HJNL112|9112112Hng1(?:1(?:2|6(?:00[06]|1(?:11|23)))|2(?:0[0-4]|3[34]|44)|3[03-9]\d|400|8(?:[02-9]\d|1[0-79]))|[34]000|9112112 H120\d21200H[34]00\d23000H - -1\d\d(?:\d(?:\d{2})?)?HHH"11(?:[023]|6\d{3})2110HH* HJNO11[023]2110HLE1(?:1(?:[0239]|61(?:1[17]|23))|2[048]|4(?:12|[59])|7[57]|8[5-9]\d|90)2110 H H H - -1\d{2,3}HH"#1(?:0[0-36]|12)|1(?:09|11)\d2100* HJNP1(?:0[0-3]|12)2100H(!1(?:0(?:[0-36]|98)|1(?:1[1-4]|2))2100 H H H - - 1\d\dH"11[0-2]2110* HJNR11[0-2]21101(?:1[0-2]|23|92)2110 H H H -z -  [019]\d\dH" -9992999* HJNU -999299901[05]|101|9992010 H -0102010 H - - \d{3,4}HH" 1112111H* 0182018HJNZ 1112111HPI018|1(?:(?:1|37)1|(?:23|94)4|7[03]7)|[2-57-9]\d{2,3}|6(?:161|26[0-3]|742)2018 H HB;018|(?:1(?:23|37|7[03]|94)|6(?:[12]6|74))\d|[2-57-9]\d{2,3}2018 - -  [19]\d{3}H" -1444|999\d21444* HJOM 1444|999921444RJ1(?:111|222|4(?:4[0-5]|50|66|7[7-9])|51[0-8])|9999|1(?:2[3-5]|3[0-2]|50)\d21111 H H H -w - [19]\d\dH" -9112911* HJPA -9112911 10[2-4]|9112102 H H H - - 1\d\dH" 1(?:05|1[67])2105* HJPE 1(?:05|1[67])2105 1(?:05|1[67])2105 H H H -p -1\dH" 1[578]215* HJPF 1[578]215 1[578]215 H H H - - [01]\d{2,6}HHHHH" -000|11[01]2000H* HJPG -000|11[01]2000H$000|1(?:1[01]|5\d\d|6\d{2,5})2000 H H 16\d{2,5}21600HHHH - - [19]\d\dH" -11[27]|9112112* HJPH -11[27]|9112112 -11[27]|9112112 H H H - -1\d{1,3}HHH"1(?:1(?:2\d?|5)|[56])215* HJPK1(?:1(?:22?|5)|[56])215%1(?:122|3[014]|[56])|11[2457-9]215 H H H - -[19]\d\d(?:\d{2,3})?HHH"!11(?:2|6\d{3})|99[7-9]2112HH* HJPL 112|99[7-9]2112HJC1(?:1(?:2|61(?:11|23)|891[23])|9\d{3})|9(?:8[4-7]|9[1-9])|11[68]0002112 H H H - -[13]\d(?:\d{2})?HH"1[578]215H* HJPM1[578]215H 1[578]|3103215 H310\d23100H H -z - 9\d\dH" -9(?:11|88)2911* HJPR -9112911 -9(?:11|88)2911 H H H - -1\d{2,3}HH"1(?:0[0-2]|66)2100H* HJPS10[0-2]2100H1(?:0[0-2]|122|44|66|99)2100 H112\d21120H H - -1\d\d(?:\d(?:\d{2})?)?HHH"+$11[257]|1(?:16\d\d|5[1589]|8[279])\d2112* HJPT11[25]2112H1(?:0(?:45|5[01])|1(?:[2578]|600[06])|4(?:1[45]|4)|583|6(?:1[0236]|3[02]|9[169]))|1(?:1611|59)1|1[068]78|1[08]9[16]|1(?:0[1-38]|40|5[15]|6[258]|82)02112 H H H -l - 9\d\dH" -9112911* HJPW -9112911 -9112911 H H H - - [19]\d\dH"128|9112128* HJPY128|9112128 1[1-9]\d|9112110 H H H - - [129]\d{2,4}HHH" 99\d2990H* 9002900HJQA 9992999H*#9(?:00|[19]\d)|(?:1|20|9[27]\d)\d\d2100 H H H - - 1\d\d?HH" 1(?:12|[578])215* HJRE 1(?:12|[578])215 1(?:12|[578])215 H H H - - [18]\d{2,5}HHHH"11(?:2|6\d{3})2112HH**(?:1(?:18[39]|[24])|8[48])\d\d21200HHJRO 1122112Hz1(?:1(?:2|6(?:000|1(?:11|23))|8(?:(?:01|8[18])1|119|[23]00|932))|[24]\d\d|9(?:0(?:00|19)|1[19]|21|3[02]|5[178]))|8[48]\d\d2112 H H(?:1[24]|8[48])\d\d21200H - - [19]\d{1,5}HHHHH" -112|9[2-4]292HH* HJRS -112|9[2-4]292HH1[189]\d{1,4}|9[2-4]292 H H H - - [01]\d\d?HH"112|(?:0|10)[1-3]201* HJRU112|(?:0|10)[1-3]201112|(?:0|10)[1-4]201 H H H - - [14]\d\dH"11[1245]2111* HJRW 11[12]2111,%1(?:0[0-2]|1[0-24-6]|2[13]|70|99)|4562100 H H H - - [19]\d{2,5}HHHH"+ 11(?:2|6\d{3})|9(?:11|37|9[7-9])2112HH* HJSA112|9(?:11|9[79])2112Hle1(?:1(?:00|2|6111)|410|9(?:00|1[89]|9(?:099|22|9[0-3])))|9(?:0[24-79]|11|3[379]|40|66|8[5-9]|9[02-9])2112141\d21410H!1(?:10|41)\d|90[24679]2902HH H - - [127-9]\d\dH" -9992999* HJSB -9992999ib1(?:[02]\d|1[12]|[35][01]|[49][1-9]|6[2-9]|7[7-9]|8[0-8])|269|777|835|9(?:[01]1|22|33|55|77|88|99)2100 H H H - - [19]\d{2,3}HH"1(?:1[1468]|60)|9992111H* HJSC 9992999H\U1(?:[06]\d|1[0-246-8]|2[0-8]|3[13]|4[0-2]|5[15]|7[124-6]|8[158]|9[015])|9(?:6\d\d|99)2100 H H H -l - 9\d\dH" -9992999* HJSD -9992999 -9992999 H H H - -[1-37-9]\d{2,5}HHHH"+$11(?:2|(?:3|6\d)\d\d|414|77)|900\d\d2112*11811[89]|72\d{3}272000HHJSE 112|900002112HH11(?:[25]|313|6(?:00[06]|1(?:1[17]|23))|7[0-8])|2(?:2[02358]|33|4[01]|50|6[1-4])|32[13]|8(?:22|88)|9(?:0(?:00|51)0|12)|(?:11(?:4|8[02-46-9])|7\d\d|90[2-4])\d\d|(?:118|90)1(?:[02-9]\d|1[013-9])2112 H?62(?:2[02358]|33|4[01]|50|6[1-4])|32[13]|8(?:22|88)|9122220H7\d{4}270000H - - [179]\d{2,4}HHH"99[359]2993H* HJSG99[359]2993HQJ1(?:(?:[01368]\d|44)\d|[57]\d{2,3}|9(?:0[1-9]|[1-9]\d))|77222|99[02-9]|1002100 H H772\d\d277200H - - [129]\d{2,4}HHH" -9(?:11|99)2911H* HJSH -9(?:11|99)2911H%1\d{2,3}|26[01]\d\d|9(?:11|99)2100 H H H - -1\d{2,5}HHHH"&11(?:(?:0|6\d)\d\d|[23]|8\d\d?)2112* HJSI11[23]2112H{t1(?:1(?:00[146]|[23]|6(?:000|1(?:11|23))|8(?:[08]|99))|9(?:059|1(?:0[12]|16)|5|70|87|9(?:00|[149])))|19(?:08|81)[09]2112 H H H -x - 1\d\dH"11[023]2110* HJSJ11[023]211011[023]2110 H H H - -1\d{2,5}HHHH"$1(?:1(?:2|6\d{3})|5[058])2112HH* HJSK1(?:12|5[058])2112H921(?:1(?:2|6(?:000|111)|8[0-8])|[248]\d{3}|5[0589])2112 H H H - -[069]\d\d(?:\d{2})?HH" -(?:01|99)92019H* HJSL -(?:01|99)92019H(?:01|99)9|604002019 H604\d\d260400H604\d\d260400H -x - 1\d\dH"11[358]2113* HJSM11[358]211311[358]2113 H H H - - [12]\d{1,5}HHHHH"*1(?:515|[78])|2(?:00|1)\d{3}217HHHH*#2(?:0[246]|[468])\d{3}224000HHJSN 1[78]217HC=1(?:1[69]|(?:[246]\d|51)\d)|2(?:0[0-246]|[12468])\d{3}|1[278]2122(?:01|2)\d{3}222000HH 1[46]\d\d21400H 2[468]\d{3}224000H - - -[57-9]\d\dH" 555|888|9992555* HJSO 555|888|9992555555|777|888|9992555 H H H -z -1\d{2,3}HH" 1152115H* HJSR 1152115H1\d{2,3}2100 H H H -l - 9\d\dH" -9992999* HJSS -9992999 -9992999 H H H -l - 1\d\dH" -1122112* HJST -1122112 -1122112 H H H - -[149]\d\d(?:\d{2,3})?HHH" 116\d{3}|9112911HH* HJSV91[13]2911H?81(?:1(?:2|6111)|2[136-8]|3[0-6]|9[05])|40404|9(?:1\d|29)2112 H404\d\d240400H404\d\d240400H -z - 9\d\dH" -9(?:19|88)2919* HJSX -9192919 -9(?:19|88)2919 H H H -x - 1\d\dH"11[023]2110* HJSY11[023]211011[023]2110 H H H -l - 9\d\dH" -9992999* HJSZ -9992999 -9992999 H H H - - 9\d\dH" 9(?:11|88|99)2911* HJTC -9(?:11|99)2911 9(?:11|88|99)2911 H H H -m -1\dH" 1[78]217* HJTD 1[78]217 1[78]217 H H H - -1\d{2,3}HH"1(?:1[78]|7[127])2117H* HJTG1(?:1[78]|7[127])2117H1(?:011|1[078]|7[127])2110 H H H - -1\d{2,3}HH"]V1(?:1(?:00|2[03]|3[3479]|7[67]|9[0246])|578|6(?:44|6[79]|88|9[16])|88\d|9[19])|1[15]552191*%1(?:113|2[23]\d|5(?:09|56))21113HJTH1(?:669|9[19])21911(?:0[0-2]|1(?:0[03]|1[1-35]|2[0358]|3[03-79]|4[02-489]|5[04-9]|6[04-79]|7[03-9]|8[027-9]|9[02-9])|2(?:22|3[89]|66)|3(?:18|2[23]|3[013]|5[56]|6[45]|73)|477|5(?:0\d|4[0-37-9]|5[1-8]|6[01679]|7[12568]|8[0-24589]|9[013589])|6(?:0[0-29]|2[03]|4[3-6]|6[1-9]|7[0257-9]|8[0158]|9[014-9])|7(?:[14]9|7[27]|90)|888|9[19])21001(?:1(?:03|1[15]|2[58]|3[056]|4[02-49]|5[046-9]|7[03-589]|9[57-9])|5(?:0[0-8]|4[0-378]|5[1-478]|7[156])|6(?:20|4[356]|6[1-68]|7[057-9]|8[015]|9[0457-9]))|1(?:1[68]|26|3[1-35]|5[689]|60|7[17])\d21103H114[89]21148H H - - 1\d\dH"1(?:0[1-3]|12)2101* HJTJ1(?:0[1-3]|12)21011(?:0[1-3]|12)2101 H H H - - 1\d\dH" 11[25]2112* HJTL 11[25]2112(!1(?:0[02]|1[25]|2[0138]|72|9[07])2100 H H H -r -0\dH" 0[1-49]201* HJTM 0[1-3]201 0[1-49]201 H H H -x - 1\d\dH"19[078]2190* HJTN19[078]219019[078]2190 H H H - - 9\d\dH"9(?:11|22|33|99)2911* HJTO9(?:11|22|33|99)29119(?:11|22|33|99)2911 H H H - - [1-9]\d{2,4}HHH"7.1(?:1[02]|22|3[126]|4[04]|5[15-9]|6[18]|77|83)2110H* HJTR 1(?:1[02]|55)2110H1(?:1(?:[02-79]|8(?:1[018]|2[0245]|3[2-4]|42|5[058]|6[06]|7[07]|8[01389]|9[089]))|3(?:37|[58]6|65)|471|5(?:07|78)|6(?:[02]6|99)|8(?:63|95))|2(?:077|268|4(?:17|23)|5(?:7[26]|82)|6[14]4|8\d\d|9(?:30|89))|3(?:0(?:05|72)|353|4(?:06|30|64)|502|674|747|851|9(?:1[29]|60))|4(?:0(?:25|3[12]|[47]2)|3(?:3[13]|[89]1)|439|5(?:43|55)|717|832)|5(?:145|290|[4-6]\d\d|772|833|9(?:[06]1|92))|6(?:236|6(?:12|39|8[59])|769)|7890|8(?:688|7(?:28|65)|85[06])|9(?:159|290)|1[2-9]\d2110 (?:285|542)022850H H1(?:3(?:37|[58]6|65)|4(?:4|71)|5(?:07|78)|6(?:[02]6|99)|8(?:3|63|95))|(?:2(?:07|26|4[12]|5[78]|6[14]|8\d|9[38])|3(?:0[07]|[38]5|4[036]|50|67|74|9[16])|4(?:0[2-47]|3[389]|[48]3|5[45]|71)|5(?:14|29|[4-6]\d|77|83|9[069])|6(?:23|6[138]|76)|789|8(?:68|7[26]|85)|9(?:15|29))\d2144HH - - 9\d\dH" 9(?:88|9[09])2988* HJTT 99[09]2990 9(?:88|9[09])2988 H H H -u - [19]\d\dH" -9112911* HJTV -9112911 1\d\d|9112100 H H H - -1\d{2,3}HH"11[0289]|1(?:81|92)\d2110*10[56]2105HJTW11[029]2110H`Y1(?:0[04-6]|1[0237-9]|3[389]|6[05-8]|7[07]|8(?:0|11)|9(?:19|22|5[057]|68|8[05]|9[15689]))2100 1(?:65|9(?:1\d|50|85|98))2165 H H - -[149]\d\d(?:\d{2})?HH"1(?:1[0-79]|9[09])|9992110H* HJTZ 11[0-245]|9992110H1(?:1\d|9[09])|46400|9992110 H464\d\d246400H464\d\d246400H - - [189]\d{2,5}HHHH"$1(?:0[1-3]|1(?:2|6\d{3}))2101HH* HJUA1(?:0[1-3]|12)2101Hg`1(?:0[1-49]|1(?:2|6(?:000|1(?:11|23))|8\d\d?)|(?:[278]|5\d)\d)|[89]00\d\d?|151|1(?:06|4\d|6)\d\d2101 H(?:118|[89]00)\d\d?21180HH H -l - 9\d\dH" -9992999* HJUG -9992999 -9992999 H H H - - [1-9]\d{2,5}HHHH"112|611|9(?:11|33|88)2112H*24280|(?:381|968)35|4(?:3355|7553|8221)|5(?:(?:489|934)2|5928)|72078|(?:323|960)40|(?:276|414)63|(?:2(?:520|744)|7390|9968)9|(?:693|732|976)88|(?:3(?:556|825)|5294|8623|9729)4|(?:3378|4136|7642|8961|9979)6|(?:4(?:6(?:15|32)|827)|(?:591|720)8|9529)7224280HJUS112|9112112HKD11(?:2|5[1-47]|[68]\d|7[0-57]|98)|[2-9]\d{3,5}|[2-8]11|9(?:11|33|88)21122(?:3333|(?:4224|7562|900)2|56447|6688)|3(?:1010|2665|7404)|40404|560560|6(?:0060|22639|5246|7622)|7(?:0701|3822|4666)|8(?:(?:3825|7226)5|4816)|99099223333HH(336\d\d|[2-9]\d{3}|[2356]112211HHH [2-9]\d{4,5}220000HH - - [19]\d{2,3}HH"128|9112128H* HJUY128|9112128H,%1(?:0[4-9]|1[2368]|2[0-3568]|787)|9112104178\d21780H H H - -[04]\d(?:\d(?:\d{2})?)?HHH"0(?:0[1-3]|[1-3]|50)201HH* HJUZ0(?:0[1-3]|[1-3]|50)201HH 0(?:0[1-3]|[1-3]|50)|45400201 H454\d\d245400H454\d\d245400H -{ - 1\d\dH"11[2358]2112* HJVA11[2358]211211[2358]2112 H H H - - 9\d\dH" 9(?:11|88|99)2911* HJVC -9(?:11|99)2911 9(?:11|88|99)2911 H H H - - [19]\d\dH"1(?:12|71)|9112112* HJVE1(?:12|71)|91121121(?:12|71)|9112112 H H H - - 9\d\dH" 9(?:11|88|99)2911* HJVG -9(?:11|99)2911 9(?:11|88|99)2911 H H H -z - 9\d\dH" -9(?:11|88)2911* HJVI -9112911 -9(?:11|88)2911 H H H -x - 1\d\dH"11[3-5]2113* HJVN11[3-5]211311[3-5]2113 H H H -l - 1\d\dH" -1122112* HJVU -1122112 -1122112 H H H -p -1\dH" 1[578]215* HJWF 1[578]215 1[578]215 H H H - - [19]\d\dH"9(?:11|9[4-69])2911* HJWS9(?:11|9[4-69])2911.'1(?:1[12]|2[0-6]|[39]0)|9(?:11|9[4-79])2111 H12[0-6]2120 H - - 1\d\dH"1(?:12|9[2-4])2112* HJXK1(?:12|9[2-4])21121(?:12|9[2-4])2112 H H H -{ - 1\d\dH"19[1459]2191* HJYE19[1459]219119[1459]2191 H H H -~ - 1\d\d?HH" 1(?:12|5)215* HJYT 1(?:12|5)215 1(?:12|5)215 H H H - - [134]\d{2,4}HHH"1(?:01\d\d|12)2112HH* 41(?:348|851)241348HJZA1(?:01(?:11|77)|12)2112HHPI1(?:0(?:1(?:11|77)|20|7)|1[12]|77(?:3[237]|[45]7|6[279]|9[26]))|[34]\d{4}2107I>3(?:078[23]|7(?:064|567)|8126)|4(?:394[16]|7751|8837)|4[23]699230782H 1112111H [34]\d{4}230000H - - [19]\d\dH" 112|99[139]2112* HJZM 112|99[139]2112 112|99[139]2112 H H H - -[139]\d\d(?:\d{2})?HH"#112|9(?:5[023]|61|9[3-59])2112H*3[013-57-9]\d{3}230000HJZW 112|99[3-59]2112H<511[2469]|3[013-57-9]\d{3}|9(?:5[023]|6[0-25]|9[3-59])2112 H 114|9(?:5[023]|6[0-25])2114H H \ No newline at end of file diff --git a/cpp/src/phonenumbers/metadata_convertor.cc b/cpp/src/phonenumbers/metadata_convertor.cc index a8e012d40..beebe7e67 100644 --- a/cpp/src/phonenumbers/metadata_convertor.cc +++ b/cpp/src/phonenumbers/metadata_convertor.cc @@ -1,50 +1,67 @@ #include #include #include +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" #include "phonenumbers/phonemetadata.pb.h" #include "phonenumbers/phonenumber.pb.h" -#include "phonenumbers/metadata.h" +#include "phonenumbers/metadataconvertor.h" +#include "phonenumbers/short_metadata.h" -void usage(std::string prog_name) { - std::cout << prog_name << "[options]" << std::endl << - "Options:" << std::endl << - "-h | --help Print this help" << std::endl << - "-o | --output_file Output file name" << std::endl; -} +ABSL_FLAG(std::string, output_file, "metadata.dat", "output file name"); -bool LoadCompiledInMetadata(i18n::phonenumbers::PhoneMetadataCollection* metadata) { - if (!metadata->ParseFromArray(i18n::phonenumbers::metadata_get(), i18n::phonenumbers::metadata_size())) { +bool LoadCompiledInMetadataShort(i18n::phonenumbers::PhoneMetadataCollection* metadata) { + if (!metadata->ParseFromArray(i18n::phonenumbers::short_metadata_get(), i18n::phonenumbers::short_metadata_size())) { std::cerr << "Could not parse binary data."; return false; } - + return true; } +std::string get_short_file_name(const std::string& filename) { + std::string::size_type idx = filename.rfind('.'); + if(idx != std::string::npos){ + std::string ext = filename.substr(idx+1); + std::string name = filename.substr(0, idx); + + std::string short_name = name + "_short." + ext; + return short_name; + } + return filename + "_short"; +} + int main(int argc, char *argv[]) { - if(argc < 3) { - std::cerr << "please provide output file name argument" << std::endl; - usage(argv[0]); + absl::ParseCommandLine(argc, argv); + + std::string output_file = absl::GetFlag(FLAGS_output_file); + + i18n::phonenumbers::PhoneMetadataCollection metadata_collection; + + MetadataConvertor convertor; + if (!convertor.LoadCompiledInMetadata(&metadata_collection)) { + std::cerr << "Could not parse compiled-in metadata." << std::endl; return -1; } - if(strncmp(argv[1], "-o", 2) != 0 && strncmp(argv[1], "--output", 8) != 0) { - std::cerr << "please provide output file name argument" << std::endl; - usage(argv[0]); + std::fstream output(output_file, std::ios::out | std::ios::trunc | std::ios::binary); + if (!metadata_collection.SerializeToOstream(&output)) { + std::cerr << "Failed to write metadata output file." << std::endl; return -1; } - i18n::phonenumbers::PhoneMetadataCollection metadata_collection; - if (!LoadCompiledInMetadata(&metadata_collection)) { + i18n::phonenumbers::PhoneMetadataCollection short_metadata_collection; + std::string short_output_file = get_short_file_name(output_file); + if (!LoadCompiledInMetadataShort(&short_metadata_collection)) { std::cerr << "Could not parse compiled-in metadata." << std::endl; return -1; } - std::fstream output(argv[2], std::ios::out | std::ios::trunc | std::ios::binary); - if (!metadata_collection.SerializeToOstream(&output)) { - std::cerr << "Failed to write metadata output file." << std::endl; - return -1; + std::fstream output_short(short_output_file, std::ios::out | std::ios::trunc | std::ios::binary); + if (!short_metadata_collection.SerializeToOstream(&output_short)) { + std::cerr << "Failed to write metadata output file." << std::endl; + return -1; } return 0; diff --git a/cpp/src/phonenumbers/metadata_convertor_short.cc b/cpp/src/phonenumbers/metadata_convertor_short.cc deleted file mode 100644 index eebc6a75f..000000000 --- a/cpp/src/phonenumbers/metadata_convertor_short.cc +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include -#include "phonenumbers/phonemetadata.pb.h" -#include "phonenumbers/phonenumber.pb.h" -#include "phonenumbers/short_metadata.h" - -void usage(std::string prog_name) { - std::cout << prog_name << "[options]" << std::endl << - "Options:" << std::endl << - "-h | --help Print this help" << std::endl << - "-o | --output_file Output file name" << std::endl; -} - -bool LoadCompiledInMetadataShort(i18n::phonenumbers::PhoneMetadataCollection* metadata) { - if (!metadata->ParseFromArray(i18n::phonenumbers::short_metadata_get(), i18n::phonenumbers::short_metadata_size())) { - std::cerr << "Could not parse binary data."; - return false; - } - - return true; -} - -int main(int argc, char *argv[]) { - - if(argc < 3) { - std::cerr << "please provide output file name argument" << std::endl; - usage(argv[0]); - return -1; - } - - if(strncmp(argv[1], "-o", 2) != 0 && strncmp(argv[1], "--output", 8) != 0) { - std::cerr << "please provide output file name argument" << std::endl; - usage(argv[0]); - return -1; - } - - i18n::phonenumbers::PhoneMetadataCollection short_metadata_collection; - if (!LoadCompiledInMetadataShort(&short_metadata_collection)) { - std::cerr << "Could not parse compiled-in metadata." << std::endl; - return -1; - } - - std::fstream output_short(argv[2], std::ios::out | std::ios::trunc | std::ios::binary); - if (!short_metadata_collection.SerializeToOstream(&output_short)) { - std::cerr << "Failed to write short metadata output file." << std::endl; - return -1; - } - - return 0; -} diff --git a/cpp/src/phonenumbers/metadataconvertor.h b/cpp/src/phonenumbers/metadataconvertor.h new file mode 100644 index 000000000..999409a23 --- /dev/null +++ b/cpp/src/phonenumbers/metadataconvertor.h @@ -0,0 +1,25 @@ +#ifndef I18N_PHONENUMBERS_METADATACONVERTOR_H_ +#define I18N_PHONENUMBERS_METADATACONVERTOR_H_ + +#ifdef USE_LITE_METADATA +#include "phonenumbers/metadata_lite.h" +#else +#include "phonenumbers/metadata.h" +#endif + +class MetadataConvertor { + public: + bool LoadCompiledInMetadata(i18n::phonenumbers::PhoneMetadataCollection* metadata)const { + if (!metadata->ParseFromArray(i18n::phonenumbers::metadata_get(), i18n::phonenumbers::metadata_size())) { + std::cerr << "ShortNumberConvertor : Could not parse binary data."; + return false; + } + + return true; + } + + public: + MetadataConvertor(){} + ~MetadataConvertor(){} +}; +#endif // I18N_PHONENUMBERS_METADATACONVERTOR_H_ diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index 00e29223a..e696a0f05 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -46,8 +47,6 @@ #include "phonenumbers/utf/unicodetext.h" #include "phonenumbers/utf/utf.h" -#include - namespace i18n { namespace phonenumbers { @@ -879,12 +878,15 @@ void PhoneNumberUtil::ClearMetadata() { bool UpdateMetadataFile(const string& filepath) { boost::filesystem::path path_to(METADATA_PATH); - path_to += "/"; - path_to += METADATA_FILE_NAME; + path_to /= METADATA_FILE_NAME; boost::filesystem::path path_bk = path_to; path_bk += ".bak"; boost::system::error_code ec; + if (path_to.string() == filepath) { + return true; + } + boost::filesystem::copy(path_to.string(), path_bk.string(), ec); if (ec) { LOG(DFATAL) << "Could not create backup copy of metadata file." << ec.message(); diff --git a/cpp/src/phonenumbers/shortnumberinfo.h b/cpp/src/phonenumbers/shortnumberinfo.h index 2339ae827..19cf404dc 100644 --- a/cpp/src/phonenumbers/shortnumberinfo.h +++ b/cpp/src/phonenumbers/shortnumberinfo.h @@ -212,7 +212,6 @@ class ShortNumberInfo { bool MatchesEmergencyNumberHelper(const string& number, const string& region_code, bool allow_prefix_match) const; - void LoadMetadata(); DISALLOW_COPY_AND_ASSIGN(ShortNumberInfo); };