From 256bb28e4feffe5821fd2039b4c8ad10f1fe16ee Mon Sep 17 00:00:00 2001 From: Joshua Provoste <8358462+JoshuaProvoste@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:44:49 -0300 Subject: [PATCH 1/2] Security: Fix Reflected XSS and implement CSRF protection in migrator tool --- .../com/google/phonenumbers/ServletMain.java | 27 +++++- .../src/main/webapp/index.jsp | 83 +++++++++---------- 2 files changed, 63 insertions(+), 47 deletions(-) diff --git a/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java b/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java index 52e75ddd19..a1b7ed2e49 100644 --- a/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java +++ b/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java @@ -38,6 +38,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.StringTokenizer; +import java.util.UUID; @WebServlet(name = "Migrate", value = "/migrate") public class ServletMain extends HttpServlet { @@ -67,6 +68,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S String file = ""; String fileName = ""; String customRecipe = ""; + String sessionToken = (String) req.getSession().getAttribute("csrf_token"); + boolean isTokenValid = false; try { upload.setSizeMax(MAX_UPLOAD_SIZE); @@ -79,9 +82,11 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S || item.getFieldName().equals("fileCountryCode"))) { countryCode = Streams.asString(in); - } else if (item.isFormField() && item.getFieldName().equals("number")) { - number = Streams.asString(in); - + } else if (item.isFormField() && item.getFieldName().equals("csrf_token")) { + String providedToken = Streams.asString(in); + if (sessionToken != null && sessionToken.equals(providedToken)) { + isTokenValid = true; + } } else if (item.getFieldName().equals("file")) { fileName = item.getName(); try { @@ -102,6 +107,11 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S e.printStackTrace(); } + if (!isTokenValid) { + resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid or missing CSRF token."); + return; + } + if (!number.isEmpty() && !countryCode.isEmpty()) { /* number and country code are being set again to allow users to see their inputs after the http request has @@ -131,6 +141,17 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se matcher.removeFrom(req.getParameter("fileName")); String fileContent = req.getParameter("fileContent"); + if (fileContent == null) { + String csrfToken = (String) req.getSession().getAttribute("csrf_token"); + if (csrfToken == null) { + csrfToken = UUID.randomUUID().toString(); + req.getSession().setAttribute("csrf_token", csrfToken); + } + req.setAttribute("csrf_token", csrfToken); + req.getRequestDispatcher("index.jsp").forward(req, resp); + return; + } + resp.setContentType("text/plain"); resp.setHeader("Content-Disposition", "attachment; filename=" + fileName); try { diff --git a/migrator/migrator-servlet/src/main/webapp/index.jsp b/migrator/migrator-servlet/src/main/webapp/index.jsp index 73205b5215..abc8a6355a 100644 --- a/migrator/migrator-servlet/src/main/webapp/index.jsp +++ b/migrator/migrator-servlet/src/main/webapp/index.jsp @@ -5,6 +5,7 @@ <%@ page import="com.google.phonenumbers.migrator.MigrationResult" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% final String E164_NUMBERS_LINK = "https://support.twilio.com/hc/en-us/articles/223183008-Formatting-International-Phone-Numbers"; final String COUNTRY_CODE_LINK = "https://countrycode.org/"; @@ -140,62 +141,55 @@
- <% - if (request.getAttribute("numberError") == null && request.getAttribute("number") != null) { - if (request.getAttribute("validMigration") != null) { - out.print("

Valid +" + request.getAttribute("numberCountryCode") + " Phone Number Produced!

"); - out.print("

The stale number '" + request.getAttribute("number") + "' was successfully migrated into the" + - " phone number: +" + request.getAttribute("validMigration") + "

"); - } else if (request.getAttribute("invalidMigration") != null) { - out.print("

Invalid +" + request.getAttribute("numberCountryCode") + " Migration

"); - out.print("

The stale number '" + request.getAttribute("number") + "' was migrated into the phone number:" + - " +" + request.getAttribute("invalidMigration") + ". However this was not seen as valid using our internal" + - " metadata for country code +" + request.getAttribute("numberCountryCode") + ".

"); - } else if (request.getAttribute("alreadyValidNumber") != null) { - out.print("

Already Valid +" + request.getAttribute("numberCountryCode") + " Phone Number!

"); - out.print("

The entered phone number was already seen as being in a valid, dialable format based on our" + - " metadata for country code +" + request.getAttribute("numberCountryCode") + ". Here is the number in" + - " its clean E.164 format: +" + request.getAttribute("alreadyValidNumber") + "

"); - } else { - out.print("

Non-migratable +" + request.getAttribute("numberCountryCode") + " Phone Number

"); - out.print("

The phone number '" + request.getAttribute("number") + "' was not seen as a valid number and" + - " no migration recipe could be found for country code +" + request.getAttribute("numberCountryCode") + - " to migrate it. This may be because you have entered a country code which does not correctly correspond" + - " to the given phone number or the specified number has never been valid.

"); - } - out.print("

Think there's an issue? File one here following the given guidelines.

"); - } else if (request.getAttribute("fileError") == null && request.getAttribute("fileName") != null) { - out.print("

'" + request.getAttribute("fileName") + "' Migration Report for Country Code: +" + request.getAttribute("fileCountryCode") + "

"); - out.print("

Below is a chart showing the ratio of numbers from the entered file that were able to be migrated" + - " using '+" + request.getAttribute("fileCountryCode") + "' migration recipes. To understand more," + - " select a given segment from the chart below.

"); - out.print("
"); - - out.print("
"); - out.print(""); - out.print(""); - out.print(""); - out.print(""); - out.print("
"); - } - %> + + + +

Valid + Phone Number Produced!

+

The stale number '' was successfully migrated into the phone number: +

+
+ +

Invalid + Migration

+

The stale number '' was migrated into the phone number: +. However this was not seen as valid using our internal metadata for country code +.

+
+ +

Already Valid + Phone Number!

+

The entered phone number was already seen as being in a valid, dialable format based on our metadata for country code +. Here is the number in its clean E.164 format: +

+
+ +

Non-migratable + Phone Number

+

The phone number '' was not seen as a valid number and no migration recipe could be found for country code + to migrate it. This may be because you have entered a country code which does not correctly correspond to the given phone number or the specified number has never been valid.

+
+
+

Think there's an issue? File one here following the given guidelines.

+
+ +

'' Migration Report for Country Code: +

+

Below is a chart showing the ratio of numbers from the entered file that were able to be migrated using '+' migration recipes. To understand more, select a given segment from the chart below.

+
+
+ + + + +
+

Single Number Migration

-
<%=request.getAttribute("numberError") == null ? "" : request.getAttribute("numberError")%>
+
+

Enter a phone number in E.164 format. Inputted numbers can include spaces, curved brackets and hyphens

"/> + value=""/>

Enter the BCP-47 country code in which the specified E.164 phone number belongs to

"/> + value=""/>

@@ -210,8 +204,9 @@

File Migration

-
<%=request.getAttribute("fileError") == null ? "" : request.getAttribute("fileError")%>
+
+

Upload a file containing one E.164 phone number per line. Numbers can include spaces, curved brackets and hyphens

From a682c21c841e9c90518d2156d0557992f0a6c827 Mon Sep 17 00:00:00 2001 From: Joshua Provoste <8358462+JoshuaProvoste@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:58:12 -0300 Subject: [PATCH 2/2] Testing: Add JUnit tests for CSRF validation and refactor ServletMain for testability --- .../.gradle/8.9/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.9/checksums/md5-checksums.bin | Bin 0 -> 27797 bytes .../.gradle/8.9/checksums/sha1-checksums.bin | Bin 0 -> 76541 bytes .../8.9/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/8.9/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.9/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes java/demoapp/.gradle/8.9/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + java/demoapp/.gradle/vcs-1/gc.properties | 0 .../com/google/phonenumbers/ServletMain.java | 41 +- .../google/phonenumbers/ServletMainTest.java | 95 + .../phonenumbers/BuildMetadataFromXml.java | 783 ++++ .../com/google/i18n/phonenumbers/Command.java | 51 + .../i18n/phonenumbers/CommandDispatcher.java | 78 + .../i18n/phonenumbers/CopyrightNotice.java | 66 + .../google/i18n/phonenumbers/FileUtils.java | 52 + .../i18n/phonenumbers/MetadataFilter.java | 356 ++ .../AlternateFormatsCountryCodeSet.java | 82 + .../i18n/phonenumbers/AsYouTypeFormatter.java | 668 +++ .../CountryCodeToRegionCodeMap.java | 942 +++++ .../i18n/phonenumbers/MetadataLoader.java | 39 + .../MissingMetadataException.java | 9 + .../phonenumbers/NumberParseException.java | 77 + .../i18n/phonenumbers/PhoneNumberMatch.java | 123 + .../i18n/phonenumbers/PhoneNumberMatcher.java | 732 ++++ .../i18n/phonenumbers/PhoneNumberUtil.java | 3683 +++++++++++++++++ .../i18n/phonenumbers/Phonemetadata.java | 1188 ++++++ .../google/i18n/phonenumbers/Phonenumber.java | 286 ++ .../i18n/phonenumbers/ShortNumberInfo.java | 569 +++ .../ShortNumbersRegionCodeSet.java | 277 ++ .../data/PhoneNumberAlternateFormatsProto_255 | Bin 0 -> 144 bytes .../data/PhoneNumberAlternateFormatsProto_27 | Bin 0 -> 101 bytes .../data/PhoneNumberAlternateFormatsProto_30 | Bin 0 -> 96 bytes .../data/PhoneNumberAlternateFormatsProto_31 | Bin 0 -> 237 bytes .../data/PhoneNumberAlternateFormatsProto_34 | Bin 0 -> 196 bytes .../data/PhoneNumberAlternateFormatsProto_350 | Bin 0 -> 85 bytes .../data/PhoneNumberAlternateFormatsProto_351 | Bin 0 -> 201 bytes .../data/PhoneNumberAlternateFormatsProto_352 | Bin 0 -> 96 bytes .../data/PhoneNumberAlternateFormatsProto_358 | Bin 0 -> 272 bytes .../data/PhoneNumberAlternateFormatsProto_359 | Bin 0 -> 204 bytes .../data/PhoneNumberAlternateFormatsProto_36 | Bin 0 -> 132 bytes .../data/PhoneNumberAlternateFormatsProto_372 | Bin 0 -> 188 bytes .../data/PhoneNumberAlternateFormatsProto_373 | Bin 0 -> 158 bytes .../data/PhoneNumberAlternateFormatsProto_380 | Bin 0 -> 333 bytes .../data/PhoneNumberAlternateFormatsProto_381 | Bin 0 -> 279 bytes .../data/PhoneNumberAlternateFormatsProto_385 | Bin 0 -> 239 bytes .../data/PhoneNumberAlternateFormatsProto_39 | Bin 0 -> 206 bytes .../data/PhoneNumberAlternateFormatsProto_43 | Bin 0 -> 963 bytes .../data/PhoneNumberAlternateFormatsProto_44 | Bin 0 -> 363 bytes .../data/PhoneNumberAlternateFormatsProto_49 | Bin 0 -> 12140 bytes .../data/PhoneNumberAlternateFormatsProto_505 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_506 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_52 | Bin 0 -> 214 bytes .../data/PhoneNumberAlternateFormatsProto_54 | Bin 0 -> 434 bytes .../data/PhoneNumberAlternateFormatsProto_55 | Bin 0 -> 118 bytes .../data/PhoneNumberAlternateFormatsProto_58 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_595 | Bin 0 -> 300 bytes .../data/PhoneNumberAlternateFormatsProto_61 | Bin 0 -> 214 bytes .../data/PhoneNumberAlternateFormatsProto_62 | Bin 0 -> 378 bytes .../data/PhoneNumberAlternateFormatsProto_64 | Bin 0 -> 151 bytes .../data/PhoneNumberAlternateFormatsProto_66 | Bin 0 -> 85 bytes .../data/PhoneNumberAlternateFormatsProto_675 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_676 | Bin 0 -> 89 bytes .../data/PhoneNumberAlternateFormatsProto_679 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_7 | Bin 0 -> 645 bytes .../data/PhoneNumberAlternateFormatsProto_81 | Bin 0 -> 227 bytes .../data/PhoneNumberAlternateFormatsProto_84 | Bin 0 -> 195 bytes .../data/PhoneNumberAlternateFormatsProto_855 | Bin 0 -> 104 bytes .../data/PhoneNumberAlternateFormatsProto_856 | Bin 0 -> 162 bytes .../data/PhoneNumberAlternateFormatsProto_90 | Bin 0 -> 178 bytes .../data/PhoneNumberAlternateFormatsProto_91 | Bin 0 -> 1783 bytes .../data/PhoneNumberAlternateFormatsProto_94 | Bin 0 -> 180 bytes .../data/PhoneNumberAlternateFormatsProto_95 | Bin 0 -> 93 bytes .../data/PhoneNumberAlternateFormatsProto_971 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_972 | Bin 0 -> 108 bytes .../data/PhoneNumberAlternateFormatsProto_995 | Bin 0 -> 352 bytes .../data/PhoneNumberMetadataProto_800 | Bin 0 -> 308 bytes .../data/PhoneNumberMetadataProto_808 | Bin 0 -> 293 bytes .../data/PhoneNumberMetadataProto_870 | Bin 0 -> 363 bytes .../data/PhoneNumberMetadataProto_878 | Bin 0 -> 299 bytes .../data/PhoneNumberMetadataProto_881 | Bin 0 -> 370 bytes .../data/PhoneNumberMetadataProto_882 | Bin 0 -> 988 bytes .../data/PhoneNumberMetadataProto_883 | Bin 0 -> 666 bytes .../data/PhoneNumberMetadataProto_888 | Bin 0 -> 291 bytes .../data/PhoneNumberMetadataProto_979 | Bin 0 -> 312 bytes .../data/PhoneNumberMetadataProto_AC | Bin 0 -> 327 bytes .../data/PhoneNumberMetadataProto_AD | Bin 0 -> 485 bytes .../data/PhoneNumberMetadataProto_AE | Bin 0 -> 666 bytes .../data/PhoneNumberMetadataProto_AF | Bin 0 -> 462 bytes .../data/PhoneNumberMetadataProto_AG | Bin 0 -> 767 bytes .../data/PhoneNumberMetadataProto_AI | Bin 0 -> 736 bytes .../data/PhoneNumberMetadataProto_AL | Bin 0 -> 789 bytes .../data/PhoneNumberMetadataProto_AM | Bin 0 -> 715 bytes .../data/PhoneNumberMetadataProto_AO | Bin 0 -> 347 bytes .../data/PhoneNumberMetadataProto_AR | Bin 0 -> 8316 bytes .../data/PhoneNumberMetadataProto_AS | Bin 0 -> 717 bytes .../data/PhoneNumberMetadataProto_AT | Bin 0 -> 2082 bytes .../data/PhoneNumberMetadataProto_AU | Bin 0 -> 1967 bytes .../data/PhoneNumberMetadataProto_AW | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_AX | Bin 0 -> 700 bytes .../data/PhoneNumberMetadataProto_AZ | Bin 0 -> 1016 bytes .../data/PhoneNumberMetadataProto_BA | Bin 0 -> 994 bytes .../data/PhoneNumberMetadataProto_BB | Bin 0 -> 995 bytes .../data/PhoneNumberMetadataProto_BD | Bin 0 -> 2129 bytes .../data/PhoneNumberMetadataProto_BE | Bin 0 -> 804 bytes .../data/PhoneNumberMetadataProto_BF | Bin 0 -> 447 bytes .../data/PhoneNumberMetadataProto_BG | Bin 0 -> 1488 bytes .../data/PhoneNumberMetadataProto_BH | Bin 0 -> 576 bytes .../data/PhoneNumberMetadataProto_BI | Bin 0 -> 365 bytes .../data/PhoneNumberMetadataProto_BJ | Bin 0 -> 469 bytes .../data/PhoneNumberMetadataProto_BL | Bin 0 -> 532 bytes .../data/PhoneNumberMetadataProto_BM | Bin 0 -> 691 bytes .../data/PhoneNumberMetadataProto_BN | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_BO | Bin 0 -> 725 bytes .../data/PhoneNumberMetadataProto_BQ | Bin 0 -> 395 bytes .../data/PhoneNumberMetadataProto_BR | Bin 0 -> 1685 bytes .../data/PhoneNumberMetadataProto_BS | Bin 0 -> 963 bytes .../data/PhoneNumberMetadataProto_BT | Bin 0 -> 636 bytes .../data/PhoneNumberMetadataProto_BW | Bin 0 -> 812 bytes .../data/PhoneNumberMetadataProto_BY | Bin 0 -> 1245 bytes .../data/PhoneNumberMetadataProto_BZ | Bin 0 -> 474 bytes .../data/PhoneNumberMetadataProto_CA | Bin 0 -> 1092 bytes .../data/PhoneNumberMetadataProto_CC | Bin 0 -> 833 bytes .../data/PhoneNumberMetadataProto_CD | Bin 0 -> 676 bytes .../data/PhoneNumberMetadataProto_CF | Bin 0 -> 377 bytes .../data/PhoneNumberMetadataProto_CG | Bin 0 -> 462 bytes .../data/PhoneNumberMetadataProto_CH | Bin 0 -> 713 bytes .../data/PhoneNumberMetadataProto_CI | Bin 0 -> 456 bytes .../data/PhoneNumberMetadataProto_CK | Bin 0 -> 327 bytes .../data/PhoneNumberMetadataProto_CL | Bin 0 -> 2245 bytes .../data/PhoneNumberMetadataProto_CM | Bin 0 -> 465 bytes .../data/PhoneNumberMetadataProto_CN | Bin 0 -> 13352 bytes .../data/PhoneNumberMetadataProto_CO | Bin 0 -> 1043 bytes .../data/PhoneNumberMetadataProto_CR | Bin 0 -> 630 bytes .../data/PhoneNumberMetadataProto_CU | Bin 0 -> 642 bytes .../data/PhoneNumberMetadataProto_CV | Bin 0 -> 437 bytes .../data/PhoneNumberMetadataProto_CW | Bin 0 -> 560 bytes .../data/PhoneNumberMetadataProto_CX | Bin 0 -> 851 bytes .../data/PhoneNumberMetadataProto_CY | Bin 0 -> 431 bytes .../data/PhoneNumberMetadataProto_CZ | Bin 0 -> 818 bytes .../data/PhoneNumberMetadataProto_DE | Bin 0 -> 4848 bytes .../data/PhoneNumberMetadataProto_DJ | Bin 0 -> 345 bytes .../data/PhoneNumberMetadataProto_DK | Bin 0 -> 783 bytes .../data/PhoneNumberMetadataProto_DM | Bin 0 -> 730 bytes .../data/PhoneNumberMetadataProto_DO | Bin 0 -> 1001 bytes .../data/PhoneNumberMetadataProto_DZ | Bin 0 -> 677 bytes .../data/PhoneNumberMetadataProto_EC | Bin 0 -> 759 bytes .../data/PhoneNumberMetadataProto_EE | Bin 0 -> 1056 bytes .../data/PhoneNumberMetadataProto_EG | Bin 0 -> 661 bytes .../data/PhoneNumberMetadataProto_EH | Bin 0 -> 419 bytes .../data/PhoneNumberMetadataProto_ER | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_ES | Bin 0 -> 859 bytes .../data/PhoneNumberMetadataProto_ET | Bin 0 -> 936 bytes .../data/PhoneNumberMetadataProto_FI | Bin 0 -> 1485 bytes .../data/PhoneNumberMetadataProto_FJ | Bin 0 -> 482 bytes .../data/PhoneNumberMetadataProto_FK | Bin 0 -> 269 bytes .../data/PhoneNumberMetadataProto_FM | Bin 0 -> 465 bytes .../data/PhoneNumberMetadataProto_FO | Bin 0 -> 445 bytes .../data/PhoneNumberMetadataProto_FR | Bin 0 -> 886 bytes .../data/PhoneNumberMetadataProto_GA | Bin 0 -> 587 bytes .../data/PhoneNumberMetadataProto_GB | Bin 0 -> 2871 bytes .../data/PhoneNumberMetadataProto_GD | Bin 0 -> 796 bytes .../data/PhoneNumberMetadataProto_GE | Bin 0 -> 1163 bytes .../data/PhoneNumberMetadataProto_GF | Bin 0 -> 623 bytes .../data/PhoneNumberMetadataProto_GG | Bin 0 -> 685 bytes .../data/PhoneNumberMetadataProto_GH | Bin 0 -> 781 bytes .../data/PhoneNumberMetadataProto_GI | Bin 0 -> 416 bytes .../data/PhoneNumberMetadataProto_GL | Bin 0 -> 389 bytes .../data/PhoneNumberMetadataProto_GM | Bin 0 -> 453 bytes .../data/PhoneNumberMetadataProto_GN | Bin 0 -> 490 bytes .../data/PhoneNumberMetadataProto_GP | Bin 0 -> 705 bytes .../data/PhoneNumberMetadataProto_GQ | Bin 0 -> 468 bytes .../data/PhoneNumberMetadataProto_GR | Bin 0 -> 1058 bytes .../data/PhoneNumberMetadataProto_GT | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_GU | Bin 0 -> 1078 bytes .../data/PhoneNumberMetadataProto_GW | Bin 0 -> 404 bytes .../data/PhoneNumberMetadataProto_GY | Bin 0 -> 529 bytes .../data/PhoneNumberMetadataProto_HK | Bin 0 -> 1559 bytes .../data/PhoneNumberMetadataProto_HN | Bin 0 -> 754 bytes .../data/PhoneNumberMetadataProto_HR | Bin 0 -> 933 bytes .../data/PhoneNumberMetadataProto_HT | Bin 0 -> 413 bytes .../data/PhoneNumberMetadataProto_HU | Bin 0 -> 722 bytes .../data/PhoneNumberMetadataProto_ID | Bin 0 -> 2116 bytes .../data/PhoneNumberMetadataProto_IE | Bin 0 -> 1307 bytes .../data/PhoneNumberMetadataProto_IL | Bin 0 -> 1221 bytes .../data/PhoneNumberMetadataProto_IM | Bin 0 -> 626 bytes .../data/PhoneNumberMetadataProto_IN | Bin 0 -> 8916 bytes .../data/PhoneNumberMetadataProto_IO | Bin 0 -> 296 bytes .../data/PhoneNumberMetadataProto_IQ | Bin 0 -> 530 bytes .../data/PhoneNumberMetadataProto_IR | Bin 0 -> 1075 bytes .../data/PhoneNumberMetadataProto_IS | Bin 0 -> 868 bytes .../data/PhoneNumberMetadataProto_IT | Bin 0 -> 2394 bytes .../data/PhoneNumberMetadataProto_JE | Bin 0 -> 788 bytes .../data/PhoneNumberMetadataProto_JM | Bin 0 -> 991 bytes .../data/PhoneNumberMetadataProto_JO | Bin 0 -> 1127 bytes .../data/PhoneNumberMetadataProto_JP | Bin 0 -> 6698 bytes .../data/PhoneNumberMetadataProto_KE | Bin 0 -> 660 bytes .../data/PhoneNumberMetadataProto_KG | Bin 0 -> 838 bytes .../data/PhoneNumberMetadataProto_KH | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_KI | Bin 0 -> 678 bytes .../data/PhoneNumberMetadataProto_KM | Bin 0 -> 343 bytes .../data/PhoneNumberMetadataProto_KN | Bin 0 -> 709 bytes .../data/PhoneNumberMetadataProto_KP | Bin 0 -> 563 bytes .../data/PhoneNumberMetadataProto_KR | Bin 0 -> 2031 bytes .../data/PhoneNumberMetadataProto_KW | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_KY | Bin 0 -> 868 bytes .../data/PhoneNumberMetadataProto_KZ | Bin 0 -> 911 bytes .../data/PhoneNumberMetadataProto_LA | Bin 0 -> 585 bytes .../data/PhoneNumberMetadataProto_LB | Bin 0 -> 596 bytes .../data/PhoneNumberMetadataProto_LC | Bin 0 -> 767 bytes .../data/PhoneNumberMetadataProto_LI | Bin 0 -> 856 bytes .../data/PhoneNumberMetadataProto_LK | Bin 0 -> 522 bytes .../data/PhoneNumberMetadataProto_LR | Bin 0 -> 583 bytes .../data/PhoneNumberMetadataProto_LS | Bin 0 -> 342 bytes .../data/PhoneNumberMetadataProto_LT | Bin 0 -> 645 bytes .../data/PhoneNumberMetadataProto_LU | Bin 0 -> 1357 bytes .../data/PhoneNumberMetadataProto_LV | Bin 0 -> 447 bytes .../data/PhoneNumberMetadataProto_LY | Bin 0 -> 532 bytes .../data/PhoneNumberMetadataProto_MA | Bin 0 -> 698 bytes .../data/PhoneNumberMetadataProto_MC | Bin 0 -> 780 bytes .../data/PhoneNumberMetadataProto_MD | Bin 0 -> 579 bytes .../data/PhoneNumberMetadataProto_ME | Bin 0 -> 596 bytes .../data/PhoneNumberMetadataProto_MF | Bin 0 -> 551 bytes .../data/PhoneNumberMetadataProto_MG | Bin 0 -> 450 bytes .../data/PhoneNumberMetadataProto_MH | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_MK | Bin 0 -> 837 bytes .../data/PhoneNumberMetadataProto_ML | Bin 0 -> 604 bytes .../data/PhoneNumberMetadataProto_MM | Bin 0 -> 2192 bytes .../data/PhoneNumberMetadataProto_MN | Bin 0 -> 848 bytes .../data/PhoneNumberMetadataProto_MO | Bin 0 -> 503 bytes .../data/PhoneNumberMetadataProto_MP | Bin 0 -> 834 bytes .../data/PhoneNumberMetadataProto_MQ | Bin 0 -> 645 bytes .../data/PhoneNumberMetadataProto_MR | Bin 0 -> 387 bytes .../data/PhoneNumberMetadataProto_MS | Bin 0 -> 677 bytes .../data/PhoneNumberMetadataProto_MT | Bin 0 -> 584 bytes .../data/PhoneNumberMetadataProto_MU | Bin 0 -> 746 bytes .../data/PhoneNumberMetadataProto_MV | Bin 0 -> 550 bytes .../data/PhoneNumberMetadataProto_MW | Bin 0 -> 508 bytes .../data/PhoneNumberMetadataProto_MX | Bin 0 -> 1438 bytes .../data/PhoneNumberMetadataProto_MY | Bin 0 -> 1506 bytes .../data/PhoneNumberMetadataProto_MZ | Bin 0 -> 438 bytes .../data/PhoneNumberMetadataProto_NA | Bin 0 -> 908 bytes .../data/PhoneNumberMetadataProto_NC | Bin 0 -> 480 bytes .../data/PhoneNumberMetadataProto_NE | Bin 0 -> 522 bytes .../data/PhoneNumberMetadataProto_NF | Bin 0 -> 406 bytes .../data/PhoneNumberMetadataProto_NG | Bin 0 -> 785 bytes .../data/PhoneNumberMetadataProto_NI | Bin 0 -> 421 bytes .../data/PhoneNumberMetadataProto_NL | Bin 0 -> 1698 bytes .../data/PhoneNumberMetadataProto_NO | Bin 0 -> 670 bytes .../data/PhoneNumberMetadataProto_NP | Bin 0 -> 826 bytes .../data/PhoneNumberMetadataProto_NR | Bin 0 -> 368 bytes .../data/PhoneNumberMetadataProto_NU | Bin 0 -> 332 bytes .../data/PhoneNumberMetadataProto_NZ | Bin 0 -> 1088 bytes .../data/PhoneNumberMetadataProto_OM | Bin 0 -> 527 bytes .../data/PhoneNumberMetadataProto_PA | Bin 0 -> 981 bytes .../data/PhoneNumberMetadataProto_PE | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_PF | Bin 0 -> 551 bytes .../data/PhoneNumberMetadataProto_PG | Bin 0 -> 549 bytes .../data/PhoneNumberMetadataProto_PH | Bin 0 -> 1193 bytes .../data/PhoneNumberMetadataProto_PK | Bin 0 -> 1841 bytes .../data/PhoneNumberMetadataProto_PL | Bin 0 -> 1217 bytes .../data/PhoneNumberMetadataProto_PM | Bin 0 -> 586 bytes .../data/PhoneNumberMetadataProto_PR | Bin 0 -> 644 bytes .../data/PhoneNumberMetadataProto_PS | Bin 0 -> 546 bytes .../data/PhoneNumberMetadataProto_PT | Bin 0 -> 833 bytes .../data/PhoneNumberMetadataProto_PW | Bin 0 -> 454 bytes .../data/PhoneNumberMetadataProto_PY | Bin 0 -> 1810 bytes .../data/PhoneNumberMetadataProto_QA | Bin 0 -> 501 bytes .../data/PhoneNumberMetadataProto_RE | Bin 0 -> 614 bytes .../data/PhoneNumberMetadataProto_RO | Bin 0 -> 736 bytes .../data/PhoneNumberMetadataProto_RS | Bin 0 -> 737 bytes .../data/PhoneNumberMetadataProto_RU | Bin 0 -> 2091 bytes .../data/PhoneNumberMetadataProto_RW | Bin 0 -> 513 bytes .../data/PhoneNumberMetadataProto_SA | Bin 0 -> 626 bytes .../data/PhoneNumberMetadataProto_SB | Bin 0 -> 530 bytes .../data/PhoneNumberMetadataProto_SC | Bin 0 -> 413 bytes .../data/PhoneNumberMetadataProto_SD | Bin 0 -> 359 bytes .../data/PhoneNumberMetadataProto_SE | Bin 0 -> 2963 bytes .../data/PhoneNumberMetadataProto_SG | Bin 0 -> 986 bytes .../data/PhoneNumberMetadataProto_SH | Bin 0 -> 323 bytes .../data/PhoneNumberMetadataProto_SI | Bin 0 -> 790 bytes .../data/PhoneNumberMetadataProto_SJ | Bin 0 -> 516 bytes .../data/PhoneNumberMetadataProto_SK | Bin 0 -> 1318 bytes .../data/PhoneNumberMetadataProto_SL | Bin 0 -> 380 bytes .../data/PhoneNumberMetadataProto_SM | Bin 0 -> 598 bytes .../data/PhoneNumberMetadataProto_SN | Bin 0 -> 567 bytes .../data/PhoneNumberMetadataProto_SO | Bin 0 -> 782 bytes .../data/PhoneNumberMetadataProto_SR | Bin 0 -> 514 bytes .../data/PhoneNumberMetadataProto_SS | Bin 0 -> 344 bytes .../data/PhoneNumberMetadataProto_ST | Bin 0 -> 338 bytes .../data/PhoneNumberMetadataProto_SV | Bin 0 -> 584 bytes .../data/PhoneNumberMetadataProto_SX | Bin 0 -> 698 bytes .../data/PhoneNumberMetadataProto_SY | Bin 0 -> 502 bytes .../data/PhoneNumberMetadataProto_SZ | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_TA | Bin 0 -> 245 bytes .../data/PhoneNumberMetadataProto_TC | Bin 0 -> 739 bytes .../data/PhoneNumberMetadataProto_TD | Bin 0 -> 396 bytes .../data/PhoneNumberMetadataProto_TG | Bin 0 -> 379 bytes .../data/PhoneNumberMetadataProto_TH | Bin 0 -> 643 bytes .../data/PhoneNumberMetadataProto_TJ | Bin 0 -> 694 bytes .../data/PhoneNumberMetadataProto_TK | Bin 0 -> 299 bytes .../data/PhoneNumberMetadataProto_TL | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_TM | Bin 0 -> 567 bytes .../data/PhoneNumberMetadataProto_TN | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_TO | Bin 0 -> 603 bytes .../data/PhoneNumberMetadataProto_TR | Bin 0 -> 1383 bytes .../data/PhoneNumberMetadataProto_TT | Bin 0 -> 841 bytes .../data/PhoneNumberMetadataProto_TV | Bin 0 -> 410 bytes .../data/PhoneNumberMetadataProto_TW | Bin 0 -> 1375 bytes .../data/PhoneNumberMetadataProto_TZ | Bin 0 -> 612 bytes .../data/PhoneNumberMetadataProto_UA | Bin 0 -> 998 bytes .../data/PhoneNumberMetadataProto_UG | Bin 0 -> 669 bytes .../data/PhoneNumberMetadataProto_US | Bin 0 -> 2128 bytes .../data/PhoneNumberMetadataProto_UY | Bin 0 -> 841 bytes .../data/PhoneNumberMetadataProto_UZ | Bin 0 -> 1617 bytes .../data/PhoneNumberMetadataProto_VA | Bin 0 -> 711 bytes .../data/PhoneNumberMetadataProto_VC | Bin 0 -> 802 bytes .../data/PhoneNumberMetadataProto_VE | Bin 0 -> 492 bytes .../data/PhoneNumberMetadataProto_VG | Bin 0 -> 757 bytes .../data/PhoneNumberMetadataProto_VI | Bin 0 -> 918 bytes .../data/PhoneNumberMetadataProto_VN | Bin 0 -> 1328 bytes .../data/PhoneNumberMetadataProto_VU | Bin 0 -> 471 bytes .../data/PhoneNumberMetadataProto_WF | Bin 0 -> 474 bytes .../data/PhoneNumberMetadataProto_WS | Bin 0 -> 497 bytes .../data/PhoneNumberMetadataProto_XK | Bin 0 -> 593 bytes .../data/PhoneNumberMetadataProto_YE | Bin 0 -> 514 bytes .../data/PhoneNumberMetadataProto_YT | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_ZA | Bin 0 -> 1130 bytes .../data/PhoneNumberMetadataProto_ZM | Bin 0 -> 585 bytes .../data/PhoneNumberMetadataProto_ZW | Bin 0 -> 1985 bytes .../data/ShortNumberMetadataProto_AC | Bin 0 -> 212 bytes .../data/ShortNumberMetadataProto_AD | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_AE | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_AF | Bin 0 -> 287 bytes .../data/ShortNumberMetadataProto_AG | Bin 0 -> 237 bytes .../data/ShortNumberMetadataProto_AI | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_AL | Bin 0 -> 390 bytes .../data/ShortNumberMetadataProto_AM | Bin 0 -> 276 bytes .../data/ShortNumberMetadataProto_AO | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_AR | Bin 0 -> 385 bytes .../data/ShortNumberMetadataProto_AS | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_AT | Bin 0 -> 433 bytes .../data/ShortNumberMetadataProto_AU | Bin 0 -> 551 bytes .../data/ShortNumberMetadataProto_AW | Bin 0 -> 231 bytes .../data/ShortNumberMetadataProto_AX | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_AZ | Bin 0 -> 301 bytes .../data/ShortNumberMetadataProto_BA | Bin 0 -> 332 bytes .../data/ShortNumberMetadataProto_BB | Bin 0 -> 231 bytes .../data/ShortNumberMetadataProto_BD | Bin 0 -> 436 bytes .../data/ShortNumberMetadataProto_BE | Bin 0 -> 544 bytes .../data/ShortNumberMetadataProto_BF | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_BG | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_BH | Bin 0 -> 386 bytes .../data/ShortNumberMetadataProto_BI | Bin 0 -> 323 bytes .../data/ShortNumberMetadataProto_BJ | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_BL | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_BM | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_BN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_BO | Bin 0 -> 250 bytes .../data/ShortNumberMetadataProto_BQ | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_BR | Bin 0 -> 761 bytes .../data/ShortNumberMetadataProto_BS | Bin 0 -> 214 bytes .../data/ShortNumberMetadataProto_BT | Bin 0 -> 250 bytes .../data/ShortNumberMetadataProto_BW | Bin 0 -> 306 bytes .../data/ShortNumberMetadataProto_BY | Bin 0 -> 269 bytes .../data/ShortNumberMetadataProto_BZ | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_CA | Bin 0 -> 320 bytes .../data/ShortNumberMetadataProto_CC | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_CD | Bin 0 -> 302 bytes .../data/ShortNumberMetadataProto_CF | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_CG | Bin 0 -> 204 bytes .../data/ShortNumberMetadataProto_CH | Bin 0 -> 525 bytes .../data/ShortNumberMetadataProto_CI | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_CK | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_CL | Bin 0 -> 1068 bytes .../data/ShortNumberMetadataProto_CM | Bin 0 -> 288 bytes .../data/ShortNumberMetadataProto_CN | Bin 0 -> 404 bytes .../data/ShortNumberMetadataProto_CO | Bin 0 -> 423 bytes .../data/ShortNumberMetadataProto_CR | Bin 0 -> 449 bytes .../data/ShortNumberMetadataProto_CU | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_CV | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_CW | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_CX | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_CY | Bin 0 -> 258 bytes .../data/ShortNumberMetadataProto_CZ | Bin 0 -> 315 bytes .../data/ShortNumberMetadataProto_DE | Bin 0 -> 524 bytes .../data/ShortNumberMetadataProto_DJ | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_DK | Bin 0 -> 309 bytes .../data/ShortNumberMetadataProto_DM | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_DO | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_DZ | Bin 0 -> 277 bytes .../data/ShortNumberMetadataProto_EC | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_EE | Bin 0 -> 1774 bytes .../data/ShortNumberMetadataProto_EG | Bin 0 -> 298 bytes .../data/ShortNumberMetadataProto_EH | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_ER | Bin 0 -> 348 bytes .../data/ShortNumberMetadataProto_ES | Bin 0 -> 728 bytes .../data/ShortNumberMetadataProto_ET | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_FI | Bin 0 -> 314 bytes .../data/ShortNumberMetadataProto_FJ | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_FK | Bin 0 -> 200 bytes .../data/ShortNumberMetadataProto_FM | Bin 0 -> 237 bytes .../data/ShortNumberMetadataProto_FO | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_FR | Bin 0 -> 609 bytes .../data/ShortNumberMetadataProto_GA | Bin 0 -> 239 bytes .../data/ShortNumberMetadataProto_GB | Bin 0 -> 660 bytes .../data/ShortNumberMetadataProto_GD | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_GE | Bin 0 -> 324 bytes .../data/ShortNumberMetadataProto_GF | Bin 0 -> 337 bytes .../data/ShortNumberMetadataProto_GG | Bin 0 -> 284 bytes .../data/ShortNumberMetadataProto_GH | Bin 0 -> 325 bytes .../data/ShortNumberMetadataProto_GI | Bin 0 -> 530 bytes .../data/ShortNumberMetadataProto_GL | Bin 0 -> 196 bytes .../data/ShortNumberMetadataProto_GM | Bin 0 -> 235 bytes .../data/ShortNumberMetadataProto_GN | Bin 0 -> 235 bytes .../data/ShortNumberMetadataProto_GP | Bin 0 -> 329 bytes .../data/ShortNumberMetadataProto_GR | Bin 0 -> 339 bytes .../data/ShortNumberMetadataProto_GT | Bin 0 -> 290 bytes .../data/ShortNumberMetadataProto_GU | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_GW | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_GY | Bin 0 -> 321 bytes .../data/ShortNumberMetadataProto_HK | Bin 0 -> 560 bytes .../data/ShortNumberMetadataProto_HN | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_HR | Bin 0 -> 450 bytes .../data/ShortNumberMetadataProto_HT | Bin 0 -> 266 bytes .../data/ShortNumberMetadataProto_HU | Bin 0 -> 554 bytes .../data/ShortNumberMetadataProto_ID | Bin 0 -> 313 bytes .../data/ShortNumberMetadataProto_IE | Bin 0 -> 390 bytes .../data/ShortNumberMetadataProto_IL | Bin 0 -> 323 bytes .../data/ShortNumberMetadataProto_IM | Bin 0 -> 280 bytes .../data/ShortNumberMetadataProto_IN | Bin 0 -> 1604 bytes .../data/ShortNumberMetadataProto_IQ | Bin 0 -> 335 bytes .../data/ShortNumberMetadataProto_IR | Bin 0 -> 583 bytes .../data/ShortNumberMetadataProto_IS | Bin 0 -> 375 bytes .../data/ShortNumberMetadataProto_IT | Bin 0 -> 603 bytes .../data/ShortNumberMetadataProto_JE | Bin 0 -> 326 bytes .../data/ShortNumberMetadataProto_JM | Bin 0 -> 251 bytes .../data/ShortNumberMetadataProto_JO | Bin 0 -> 376 bytes .../data/ShortNumberMetadataProto_JP | Bin 0 -> 309 bytes .../data/ShortNumberMetadataProto_KE | Bin 0 -> 727 bytes .../data/ShortNumberMetadataProto_KG | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_KH | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_KI | Bin 0 -> 288 bytes .../data/ShortNumberMetadataProto_KM | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_KN | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_KP | Bin 0 -> 215 bytes .../data/ShortNumberMetadataProto_KR | Bin 0 -> 502 bytes .../data/ShortNumberMetadataProto_KW | Bin 0 -> 243 bytes .../data/ShortNumberMetadataProto_KY | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_KZ | Bin 0 -> 333 bytes .../data/ShortNumberMetadataProto_LA | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_LB | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_LC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_LI | Bin 0 -> 267 bytes .../data/ShortNumberMetadataProto_LK | Bin 0 -> 388 bytes .../data/ShortNumberMetadataProto_LR | Bin 0 -> 300 bytes .../data/ShortNumberMetadataProto_LS | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_LT | Bin 0 -> 366 bytes .../data/ShortNumberMetadataProto_LU | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_LV | Bin 0 -> 379 bytes .../data/ShortNumberMetadataProto_LY | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_MA | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_MC | Bin 0 -> 226 bytes .../data/ShortNumberMetadataProto_MD | Bin 0 -> 355 bytes .../data/ShortNumberMetadataProto_ME | Bin 0 -> 341 bytes .../data/ShortNumberMetadataProto_MF | Bin 0 -> 329 bytes .../data/ShortNumberMetadataProto_MG | Bin 0 -> 229 bytes .../data/ShortNumberMetadataProto_MH | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MK | Bin 0 -> 304 bytes .../data/ShortNumberMetadataProto_ML | Bin 0 -> 594 bytes .../data/ShortNumberMetadataProto_MM | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MN | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_MO | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MP | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_MQ | Bin 0 -> 353 bytes .../data/ShortNumberMetadataProto_MR | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_MS | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_MT | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_MU | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_MV | Bin 0 -> 277 bytes .../data/ShortNumberMetadataProto_MW | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_MX | Bin 0 -> 324 bytes .../data/ShortNumberMetadataProto_MY | Bin 0 -> 511 bytes .../data/ShortNumberMetadataProto_MZ | Bin 0 -> 256 bytes .../data/ShortNumberMetadataProto_NA | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_NC | Bin 0 -> 340 bytes .../data/ShortNumberMetadataProto_NE | Bin 0 -> 385 bytes .../data/ShortNumberMetadataProto_NF | Bin 0 -> 221 bytes .../data/ShortNumberMetadataProto_NG | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_NI | Bin 0 -> 297 bytes .../data/ShortNumberMetadataProto_NL | Bin 0 -> 384 bytes .../data/ShortNumberMetadataProto_NO | Bin 0 -> 330 bytes .../data/ShortNumberMetadataProto_NP | Bin 0 -> 271 bytes .../data/ShortNumberMetadataProto_NR | Bin 0 -> 213 bytes .../data/ShortNumberMetadataProto_NU | Bin 0 -> 212 bytes .../data/ShortNumberMetadataProto_NZ | Bin 0 -> 350 bytes .../data/ShortNumberMetadataProto_OM | Bin 0 -> 285 bytes .../data/ShortNumberMetadataProto_PA | Bin 0 -> 202 bytes .../data/ShortNumberMetadataProto_PE | Bin 0 -> 221 bytes .../data/ShortNumberMetadataProto_PF | Bin 0 -> 195 bytes .../data/ShortNumberMetadataProto_PG | Bin 0 -> 293 bytes .../data/ShortNumberMetadataProto_PH | Bin 0 -> 215 bytes .../data/ShortNumberMetadataProto_PK | Bin 0 -> 265 bytes .../data/ShortNumberMetadataProto_PL | Bin 0 -> 320 bytes .../data/ShortNumberMetadataProto_PM | Bin 0 -> 370 bytes .../data/ShortNumberMetadataProto_PR | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_PS | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_PT | Bin 0 -> 404 bytes .../data/ShortNumberMetadataProto_PW | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_PY | Bin 0 -> 359 bytes .../data/ShortNumberMetadataProto_QA | Bin 0 -> 257 bytes .../data/ShortNumberMetadataProto_RE | Bin 0 -> 223 bytes .../data/ShortNumberMetadataProto_RO | Bin 0 -> 436 bytes .../data/ShortNumberMetadataProto_RS | Bin 0 -> 257 bytes .../data/ShortNumberMetadataProto_RU | Bin 0 -> 238 bytes .../data/ShortNumberMetadataProto_RW | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_SA | Bin 0 -> 411 bytes .../data/ShortNumberMetadataProto_SB | Bin 0 -> 295 bytes .../data/ShortNumberMetadataProto_SC | Bin 0 -> 310 bytes .../data/ShortNumberMetadataProto_SD | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_SE | Bin 0 -> 558 bytes .../data/ShortNumberMetadataProto_SG | Bin 0 -> 312 bytes .../data/ShortNumberMetadataProto_SH | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_SI | Bin 0 -> 357 bytes .../data/ShortNumberMetadataProto_SJ | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_SK | Bin 0 -> 301 bytes .../data/ShortNumberMetadataProto_SL | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_SM | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_SN | Bin 0 -> 417 bytes .../data/ShortNumberMetadataProto_SO | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_SR | Bin 0 -> 211 bytes .../data/ShortNumberMetadataProto_SS | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_ST | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_SV | Bin 0 -> 327 bytes .../data/ShortNumberMetadataProto_SX | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_SY | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_SZ | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_TC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_TD | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_TG | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_TH | Bin 0 -> 854 bytes .../data/ShortNumberMetadataProto_TJ | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_TL | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_TM | Bin 0 -> 197 bytes .../data/ShortNumberMetadataProto_TN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_TO | Bin 0 -> 230 bytes .../data/ShortNumberMetadataProto_TR | Bin 0 -> 1027 bytes .../data/ShortNumberMetadataProto_TT | Bin 0 -> 214 bytes .../data/ShortNumberMetadataProto_TV | Bin 0 -> 200 bytes .../data/ShortNumberMetadataProto_TW | Bin 0 -> 354 bytes .../data/ShortNumberMetadataProto_TZ | Bin 0 -> 302 bytes .../data/ShortNumberMetadataProto_UA | Bin 0 -> 382 bytes .../data/ShortNumberMetadataProto_UG | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_US | Bin 0 -> 794 bytes .../data/ShortNumberMetadataProto_UY | Bin 0 -> 278 bytes .../data/ShortNumberMetadataProto_UZ | Bin 0 -> 322 bytes .../data/ShortNumberMetadataProto_VA | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_VC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_VE | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_VG | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_VI | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_VN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_VU | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_WF | Bin 0 -> 195 bytes .../data/ShortNumberMetadataProto_WS | Bin 0 -> 267 bytes .../data/ShortNumberMetadataProto_XK | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_YE | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_YT | Bin 0 -> 211 bytes .../data/ShortNumberMetadataProto_ZA | Bin 0 -> 443 bytes .../data/ShortNumberMetadataProto_ZM | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_ZW | Bin 0 -> 357 bytes .../internal/GeoEntityUtility.java | 56 + .../phonenumbers/internal/MatcherApi.java | 32 + .../internal/RegexBasedMatcher.java | 57 + .../phonenumbers/internal/RegexCache.java | 78 + .../DefaultMetadataDependenciesProvider.java | 115 + .../init/ClassPathResourceMetadataLoader.java | 42 + .../metadata/init/MetadataParser.java | 108 + .../BlockingMetadataBootstrappingGuard.java | 78 + .../source/CompositeMetadataContainer.java | 69 + .../source/FormattingMetadataSource.java | 37 + .../source/FormattingMetadataSourceImpl.java | 57 + .../source/MapBackedMetadataContainer.java | 74 + .../source/MetadataBootstrappingGuard.java | 35 + .../metadata/source/MetadataContainer.java | 32 + .../metadata/source/MetadataSource.java | 21 + .../metadata/source/MetadataSourceImpl.java | 72 + .../source/MultiFileModeFileNameProvider.java | 58 + .../NonGeographicalEntityMetadataSource.java | 47 + .../source/PhoneMetadataFileNameProvider.java | 36 + .../metadata/source/RegionMetadataSource.java | 40 + .../source/RegionMetadataSourceImpl.java | 62 + .../SingleFileModeFileNameProvider.java | 35 + .../AlternateFormatsCountryCodeSet.java | 82 + .../i18n/phonenumbers/AsYouTypeFormatter.java | 668 +++ .../CountryCodeToRegionCodeMap.java | 942 +++++ .../i18n/phonenumbers/MetadataLoader.java | 39 + .../MissingMetadataException.java | 9 + .../phonenumbers/NumberParseException.java | 77 + .../i18n/phonenumbers/PhoneNumberMatch.java | 123 + .../i18n/phonenumbers/PhoneNumberMatcher.java | 732 ++++ .../i18n/phonenumbers/PhoneNumberUtil.java | 3683 +++++++++++++++++ .../i18n/phonenumbers/Phonemetadata.java | 1188 ++++++ .../google/i18n/phonenumbers/Phonenumber.java | 286 ++ .../i18n/phonenumbers/ShortNumberInfo.java | 569 +++ .../ShortNumbersRegionCodeSet.java | 277 ++ .../PhoneNumberMetadataForGoldenTests.xml | 192 + .../ShortNumberMetadataForGoldenTests.xml | 117 + .../buildtools/testdata/expected_metadata.js | 159 + .../testdata/expected_shortnumbermetadata.js | 88 + .../data/PhoneNumberAlternateFormatsProto_255 | Bin 0 -> 144 bytes .../data/PhoneNumberAlternateFormatsProto_27 | Bin 0 -> 101 bytes .../data/PhoneNumberAlternateFormatsProto_30 | Bin 0 -> 96 bytes .../data/PhoneNumberAlternateFormatsProto_31 | Bin 0 -> 237 bytes .../data/PhoneNumberAlternateFormatsProto_34 | Bin 0 -> 196 bytes .../data/PhoneNumberAlternateFormatsProto_350 | Bin 0 -> 85 bytes .../data/PhoneNumberAlternateFormatsProto_351 | Bin 0 -> 201 bytes .../data/PhoneNumberAlternateFormatsProto_352 | Bin 0 -> 96 bytes .../data/PhoneNumberAlternateFormatsProto_358 | Bin 0 -> 272 bytes .../data/PhoneNumberAlternateFormatsProto_359 | Bin 0 -> 204 bytes .../data/PhoneNumberAlternateFormatsProto_36 | Bin 0 -> 132 bytes .../data/PhoneNumberAlternateFormatsProto_372 | Bin 0 -> 188 bytes .../data/PhoneNumberAlternateFormatsProto_373 | Bin 0 -> 158 bytes .../data/PhoneNumberAlternateFormatsProto_380 | Bin 0 -> 333 bytes .../data/PhoneNumberAlternateFormatsProto_381 | Bin 0 -> 279 bytes .../data/PhoneNumberAlternateFormatsProto_385 | Bin 0 -> 239 bytes .../data/PhoneNumberAlternateFormatsProto_39 | Bin 0 -> 206 bytes .../data/PhoneNumberAlternateFormatsProto_43 | Bin 0 -> 963 bytes .../data/PhoneNumberAlternateFormatsProto_44 | Bin 0 -> 363 bytes .../data/PhoneNumberAlternateFormatsProto_49 | Bin 0 -> 12140 bytes .../data/PhoneNumberAlternateFormatsProto_505 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_506 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_52 | Bin 0 -> 214 bytes .../data/PhoneNumberAlternateFormatsProto_54 | Bin 0 -> 434 bytes .../data/PhoneNumberAlternateFormatsProto_55 | Bin 0 -> 118 bytes .../data/PhoneNumberAlternateFormatsProto_58 | Bin 0 -> 92 bytes .../data/PhoneNumberAlternateFormatsProto_595 | Bin 0 -> 300 bytes .../data/PhoneNumberAlternateFormatsProto_61 | Bin 0 -> 214 bytes .../data/PhoneNumberAlternateFormatsProto_62 | Bin 0 -> 378 bytes .../data/PhoneNumberAlternateFormatsProto_64 | Bin 0 -> 151 bytes .../data/PhoneNumberAlternateFormatsProto_66 | Bin 0 -> 85 bytes .../data/PhoneNumberAlternateFormatsProto_675 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_676 | Bin 0 -> 89 bytes .../data/PhoneNumberAlternateFormatsProto_679 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_7 | Bin 0 -> 645 bytes .../data/PhoneNumberAlternateFormatsProto_81 | Bin 0 -> 227 bytes .../data/PhoneNumberAlternateFormatsProto_84 | Bin 0 -> 195 bytes .../data/PhoneNumberAlternateFormatsProto_855 | Bin 0 -> 104 bytes .../data/PhoneNumberAlternateFormatsProto_856 | Bin 0 -> 162 bytes .../data/PhoneNumberAlternateFormatsProto_90 | Bin 0 -> 178 bytes .../data/PhoneNumberAlternateFormatsProto_91 | Bin 0 -> 1783 bytes .../data/PhoneNumberAlternateFormatsProto_94 | Bin 0 -> 180 bytes .../data/PhoneNumberAlternateFormatsProto_95 | Bin 0 -> 93 bytes .../data/PhoneNumberAlternateFormatsProto_971 | Bin 0 -> 95 bytes .../data/PhoneNumberAlternateFormatsProto_972 | Bin 0 -> 108 bytes .../data/PhoneNumberAlternateFormatsProto_995 | Bin 0 -> 352 bytes .../data/PhoneNumberMetadataProto_800 | Bin 0 -> 308 bytes .../data/PhoneNumberMetadataProto_808 | Bin 0 -> 293 bytes .../data/PhoneNumberMetadataProto_870 | Bin 0 -> 363 bytes .../data/PhoneNumberMetadataProto_878 | Bin 0 -> 299 bytes .../data/PhoneNumberMetadataProto_881 | Bin 0 -> 370 bytes .../data/PhoneNumberMetadataProto_882 | Bin 0 -> 988 bytes .../data/PhoneNumberMetadataProto_883 | Bin 0 -> 666 bytes .../data/PhoneNumberMetadataProto_888 | Bin 0 -> 291 bytes .../data/PhoneNumberMetadataProto_979 | Bin 0 -> 312 bytes .../data/PhoneNumberMetadataProto_AC | Bin 0 -> 327 bytes .../data/PhoneNumberMetadataProto_AD | Bin 0 -> 485 bytes .../data/PhoneNumberMetadataProto_AE | Bin 0 -> 666 bytes .../data/PhoneNumberMetadataProto_AF | Bin 0 -> 462 bytes .../data/PhoneNumberMetadataProto_AG | Bin 0 -> 767 bytes .../data/PhoneNumberMetadataProto_AI | Bin 0 -> 736 bytes .../data/PhoneNumberMetadataProto_AL | Bin 0 -> 789 bytes .../data/PhoneNumberMetadataProto_AM | Bin 0 -> 715 bytes .../data/PhoneNumberMetadataProto_AO | Bin 0 -> 347 bytes .../data/PhoneNumberMetadataProto_AR | Bin 0 -> 8316 bytes .../data/PhoneNumberMetadataProto_AS | Bin 0 -> 717 bytes .../data/PhoneNumberMetadataProto_AT | Bin 0 -> 2082 bytes .../data/PhoneNumberMetadataProto_AU | Bin 0 -> 1967 bytes .../data/PhoneNumberMetadataProto_AW | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_AX | Bin 0 -> 700 bytes .../data/PhoneNumberMetadataProto_AZ | Bin 0 -> 1016 bytes .../data/PhoneNumberMetadataProto_BA | Bin 0 -> 994 bytes .../data/PhoneNumberMetadataProto_BB | Bin 0 -> 995 bytes .../data/PhoneNumberMetadataProto_BD | Bin 0 -> 2129 bytes .../data/PhoneNumberMetadataProto_BE | Bin 0 -> 804 bytes .../data/PhoneNumberMetadataProto_BF | Bin 0 -> 447 bytes .../data/PhoneNumberMetadataProto_BG | Bin 0 -> 1488 bytes .../data/PhoneNumberMetadataProto_BH | Bin 0 -> 576 bytes .../data/PhoneNumberMetadataProto_BI | Bin 0 -> 365 bytes .../data/PhoneNumberMetadataProto_BJ | Bin 0 -> 469 bytes .../data/PhoneNumberMetadataProto_BL | Bin 0 -> 532 bytes .../data/PhoneNumberMetadataProto_BM | Bin 0 -> 691 bytes .../data/PhoneNumberMetadataProto_BN | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_BO | Bin 0 -> 725 bytes .../data/PhoneNumberMetadataProto_BQ | Bin 0 -> 395 bytes .../data/PhoneNumberMetadataProto_BR | Bin 0 -> 1685 bytes .../data/PhoneNumberMetadataProto_BS | Bin 0 -> 963 bytes .../data/PhoneNumberMetadataProto_BT | Bin 0 -> 636 bytes .../data/PhoneNumberMetadataProto_BW | Bin 0 -> 812 bytes .../data/PhoneNumberMetadataProto_BY | Bin 0 -> 1245 bytes .../data/PhoneNumberMetadataProto_BZ | Bin 0 -> 474 bytes .../data/PhoneNumberMetadataProto_CA | Bin 0 -> 1092 bytes .../data/PhoneNumberMetadataProto_CC | Bin 0 -> 833 bytes .../data/PhoneNumberMetadataProto_CD | Bin 0 -> 676 bytes .../data/PhoneNumberMetadataProto_CF | Bin 0 -> 377 bytes .../data/PhoneNumberMetadataProto_CG | Bin 0 -> 462 bytes .../data/PhoneNumberMetadataProto_CH | Bin 0 -> 713 bytes .../data/PhoneNumberMetadataProto_CI | Bin 0 -> 456 bytes .../data/PhoneNumberMetadataProto_CK | Bin 0 -> 327 bytes .../data/PhoneNumberMetadataProto_CL | Bin 0 -> 2245 bytes .../data/PhoneNumberMetadataProto_CM | Bin 0 -> 465 bytes .../data/PhoneNumberMetadataProto_CN | Bin 0 -> 13352 bytes .../data/PhoneNumberMetadataProto_CO | Bin 0 -> 1043 bytes .../data/PhoneNumberMetadataProto_CR | Bin 0 -> 630 bytes .../data/PhoneNumberMetadataProto_CU | Bin 0 -> 642 bytes .../data/PhoneNumberMetadataProto_CV | Bin 0 -> 437 bytes .../data/PhoneNumberMetadataProto_CW | Bin 0 -> 560 bytes .../data/PhoneNumberMetadataProto_CX | Bin 0 -> 851 bytes .../data/PhoneNumberMetadataProto_CY | Bin 0 -> 431 bytes .../data/PhoneNumberMetadataProto_CZ | Bin 0 -> 818 bytes .../data/PhoneNumberMetadataProto_DE | Bin 0 -> 4848 bytes .../data/PhoneNumberMetadataProto_DJ | Bin 0 -> 345 bytes .../data/PhoneNumberMetadataProto_DK | Bin 0 -> 783 bytes .../data/PhoneNumberMetadataProto_DM | Bin 0 -> 730 bytes .../data/PhoneNumberMetadataProto_DO | Bin 0 -> 1001 bytes .../data/PhoneNumberMetadataProto_DZ | Bin 0 -> 677 bytes .../data/PhoneNumberMetadataProto_EC | Bin 0 -> 759 bytes .../data/PhoneNumberMetadataProto_EE | Bin 0 -> 1056 bytes .../data/PhoneNumberMetadataProto_EG | Bin 0 -> 661 bytes .../data/PhoneNumberMetadataProto_EH | Bin 0 -> 419 bytes .../data/PhoneNumberMetadataProto_ER | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_ES | Bin 0 -> 859 bytes .../data/PhoneNumberMetadataProto_ET | Bin 0 -> 936 bytes .../data/PhoneNumberMetadataProto_FI | Bin 0 -> 1485 bytes .../data/PhoneNumberMetadataProto_FJ | Bin 0 -> 482 bytes .../data/PhoneNumberMetadataProto_FK | Bin 0 -> 269 bytes .../data/PhoneNumberMetadataProto_FM | Bin 0 -> 465 bytes .../data/PhoneNumberMetadataProto_FO | Bin 0 -> 445 bytes .../data/PhoneNumberMetadataProto_FR | Bin 0 -> 886 bytes .../data/PhoneNumberMetadataProto_GA | Bin 0 -> 587 bytes .../data/PhoneNumberMetadataProto_GB | Bin 0 -> 2871 bytes .../data/PhoneNumberMetadataProto_GD | Bin 0 -> 796 bytes .../data/PhoneNumberMetadataProto_GE | Bin 0 -> 1163 bytes .../data/PhoneNumberMetadataProto_GF | Bin 0 -> 623 bytes .../data/PhoneNumberMetadataProto_GG | Bin 0 -> 685 bytes .../data/PhoneNumberMetadataProto_GH | Bin 0 -> 781 bytes .../data/PhoneNumberMetadataProto_GI | Bin 0 -> 416 bytes .../data/PhoneNumberMetadataProto_GL | Bin 0 -> 389 bytes .../data/PhoneNumberMetadataProto_GM | Bin 0 -> 453 bytes .../data/PhoneNumberMetadataProto_GN | Bin 0 -> 490 bytes .../data/PhoneNumberMetadataProto_GP | Bin 0 -> 705 bytes .../data/PhoneNumberMetadataProto_GQ | Bin 0 -> 468 bytes .../data/PhoneNumberMetadataProto_GR | Bin 0 -> 1058 bytes .../data/PhoneNumberMetadataProto_GT | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_GU | Bin 0 -> 1078 bytes .../data/PhoneNumberMetadataProto_GW | Bin 0 -> 404 bytes .../data/PhoneNumberMetadataProto_GY | Bin 0 -> 529 bytes .../data/PhoneNumberMetadataProto_HK | Bin 0 -> 1559 bytes .../data/PhoneNumberMetadataProto_HN | Bin 0 -> 754 bytes .../data/PhoneNumberMetadataProto_HR | Bin 0 -> 933 bytes .../data/PhoneNumberMetadataProto_HT | Bin 0 -> 413 bytes .../data/PhoneNumberMetadataProto_HU | Bin 0 -> 722 bytes .../data/PhoneNumberMetadataProto_ID | Bin 0 -> 2116 bytes .../data/PhoneNumberMetadataProto_IE | Bin 0 -> 1307 bytes .../data/PhoneNumberMetadataProto_IL | Bin 0 -> 1221 bytes .../data/PhoneNumberMetadataProto_IM | Bin 0 -> 626 bytes .../data/PhoneNumberMetadataProto_IN | Bin 0 -> 8916 bytes .../data/PhoneNumberMetadataProto_IO | Bin 0 -> 296 bytes .../data/PhoneNumberMetadataProto_IQ | Bin 0 -> 530 bytes .../data/PhoneNumberMetadataProto_IR | Bin 0 -> 1075 bytes .../data/PhoneNumberMetadataProto_IS | Bin 0 -> 868 bytes .../data/PhoneNumberMetadataProto_IT | Bin 0 -> 2394 bytes .../data/PhoneNumberMetadataProto_JE | Bin 0 -> 788 bytes .../data/PhoneNumberMetadataProto_JM | Bin 0 -> 991 bytes .../data/PhoneNumberMetadataProto_JO | Bin 0 -> 1127 bytes .../data/PhoneNumberMetadataProto_JP | Bin 0 -> 6698 bytes .../data/PhoneNumberMetadataProto_KE | Bin 0 -> 660 bytes .../data/PhoneNumberMetadataProto_KG | Bin 0 -> 838 bytes .../data/PhoneNumberMetadataProto_KH | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_KI | Bin 0 -> 678 bytes .../data/PhoneNumberMetadataProto_KM | Bin 0 -> 343 bytes .../data/PhoneNumberMetadataProto_KN | Bin 0 -> 709 bytes .../data/PhoneNumberMetadataProto_KP | Bin 0 -> 563 bytes .../data/PhoneNumberMetadataProto_KR | Bin 0 -> 2031 bytes .../data/PhoneNumberMetadataProto_KW | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_KY | Bin 0 -> 868 bytes .../data/PhoneNumberMetadataProto_KZ | Bin 0 -> 911 bytes .../data/PhoneNumberMetadataProto_LA | Bin 0 -> 585 bytes .../data/PhoneNumberMetadataProto_LB | Bin 0 -> 596 bytes .../data/PhoneNumberMetadataProto_LC | Bin 0 -> 767 bytes .../data/PhoneNumberMetadataProto_LI | Bin 0 -> 856 bytes .../data/PhoneNumberMetadataProto_LK | Bin 0 -> 522 bytes .../data/PhoneNumberMetadataProto_LR | Bin 0 -> 583 bytes .../data/PhoneNumberMetadataProto_LS | Bin 0 -> 342 bytes .../data/PhoneNumberMetadataProto_LT | Bin 0 -> 645 bytes .../data/PhoneNumberMetadataProto_LU | Bin 0 -> 1357 bytes .../data/PhoneNumberMetadataProto_LV | Bin 0 -> 447 bytes .../data/PhoneNumberMetadataProto_LY | Bin 0 -> 532 bytes .../data/PhoneNumberMetadataProto_MA | Bin 0 -> 698 bytes .../data/PhoneNumberMetadataProto_MC | Bin 0 -> 780 bytes .../data/PhoneNumberMetadataProto_MD | Bin 0 -> 579 bytes .../data/PhoneNumberMetadataProto_ME | Bin 0 -> 596 bytes .../data/PhoneNumberMetadataProto_MF | Bin 0 -> 551 bytes .../data/PhoneNumberMetadataProto_MG | Bin 0 -> 450 bytes .../data/PhoneNumberMetadataProto_MH | Bin 0 -> 382 bytes .../data/PhoneNumberMetadataProto_MK | Bin 0 -> 837 bytes .../data/PhoneNumberMetadataProto_ML | Bin 0 -> 604 bytes .../data/PhoneNumberMetadataProto_MM | Bin 0 -> 2192 bytes .../data/PhoneNumberMetadataProto_MN | Bin 0 -> 848 bytes .../data/PhoneNumberMetadataProto_MO | Bin 0 -> 503 bytes .../data/PhoneNumberMetadataProto_MP | Bin 0 -> 834 bytes .../data/PhoneNumberMetadataProto_MQ | Bin 0 -> 645 bytes .../data/PhoneNumberMetadataProto_MR | Bin 0 -> 387 bytes .../data/PhoneNumberMetadataProto_MS | Bin 0 -> 677 bytes .../data/PhoneNumberMetadataProto_MT | Bin 0 -> 584 bytes .../data/PhoneNumberMetadataProto_MU | Bin 0 -> 746 bytes .../data/PhoneNumberMetadataProto_MV | Bin 0 -> 550 bytes .../data/PhoneNumberMetadataProto_MW | Bin 0 -> 508 bytes .../data/PhoneNumberMetadataProto_MX | Bin 0 -> 1438 bytes .../data/PhoneNumberMetadataProto_MY | Bin 0 -> 1506 bytes .../data/PhoneNumberMetadataProto_MZ | Bin 0 -> 438 bytes .../data/PhoneNumberMetadataProto_NA | Bin 0 -> 908 bytes .../data/PhoneNumberMetadataProto_NC | Bin 0 -> 480 bytes .../data/PhoneNumberMetadataProto_NE | Bin 0 -> 522 bytes .../data/PhoneNumberMetadataProto_NF | Bin 0 -> 406 bytes .../data/PhoneNumberMetadataProto_NG | Bin 0 -> 785 bytes .../data/PhoneNumberMetadataProto_NI | Bin 0 -> 421 bytes .../data/PhoneNumberMetadataProto_NL | Bin 0 -> 1698 bytes .../data/PhoneNumberMetadataProto_NO | Bin 0 -> 670 bytes .../data/PhoneNumberMetadataProto_NP | Bin 0 -> 826 bytes .../data/PhoneNumberMetadataProto_NR | Bin 0 -> 368 bytes .../data/PhoneNumberMetadataProto_NU | Bin 0 -> 332 bytes .../data/PhoneNumberMetadataProto_NZ | Bin 0 -> 1088 bytes .../data/PhoneNumberMetadataProto_OM | Bin 0 -> 527 bytes .../data/PhoneNumberMetadataProto_PA | Bin 0 -> 981 bytes .../data/PhoneNumberMetadataProto_PE | Bin 0 -> 758 bytes .../data/PhoneNumberMetadataProto_PF | Bin 0 -> 551 bytes .../data/PhoneNumberMetadataProto_PG | Bin 0 -> 549 bytes .../data/PhoneNumberMetadataProto_PH | Bin 0 -> 1193 bytes .../data/PhoneNumberMetadataProto_PK | Bin 0 -> 1841 bytes .../data/PhoneNumberMetadataProto_PL | Bin 0 -> 1217 bytes .../data/PhoneNumberMetadataProto_PM | Bin 0 -> 586 bytes .../data/PhoneNumberMetadataProto_PR | Bin 0 -> 644 bytes .../data/PhoneNumberMetadataProto_PS | Bin 0 -> 546 bytes .../data/PhoneNumberMetadataProto_PT | Bin 0 -> 833 bytes .../data/PhoneNumberMetadataProto_PW | Bin 0 -> 454 bytes .../data/PhoneNumberMetadataProto_PY | Bin 0 -> 1810 bytes .../data/PhoneNumberMetadataProto_QA | Bin 0 -> 501 bytes .../data/PhoneNumberMetadataProto_RE | Bin 0 -> 614 bytes .../data/PhoneNumberMetadataProto_RO | Bin 0 -> 736 bytes .../data/PhoneNumberMetadataProto_RS | Bin 0 -> 737 bytes .../data/PhoneNumberMetadataProto_RU | Bin 0 -> 2091 bytes .../data/PhoneNumberMetadataProto_RW | Bin 0 -> 513 bytes .../data/PhoneNumberMetadataProto_SA | Bin 0 -> 626 bytes .../data/PhoneNumberMetadataProto_SB | Bin 0 -> 530 bytes .../data/PhoneNumberMetadataProto_SC | Bin 0 -> 413 bytes .../data/PhoneNumberMetadataProto_SD | Bin 0 -> 359 bytes .../data/PhoneNumberMetadataProto_SE | Bin 0 -> 2963 bytes .../data/PhoneNumberMetadataProto_SG | Bin 0 -> 986 bytes .../data/PhoneNumberMetadataProto_SH | Bin 0 -> 323 bytes .../data/PhoneNumberMetadataProto_SI | Bin 0 -> 790 bytes .../data/PhoneNumberMetadataProto_SJ | Bin 0 -> 516 bytes .../data/PhoneNumberMetadataProto_SK | Bin 0 -> 1318 bytes .../data/PhoneNumberMetadataProto_SL | Bin 0 -> 380 bytes .../data/PhoneNumberMetadataProto_SM | Bin 0 -> 598 bytes .../data/PhoneNumberMetadataProto_SN | Bin 0 -> 567 bytes .../data/PhoneNumberMetadataProto_SO | Bin 0 -> 782 bytes .../data/PhoneNumberMetadataProto_SR | Bin 0 -> 514 bytes .../data/PhoneNumberMetadataProto_SS | Bin 0 -> 344 bytes .../data/PhoneNumberMetadataProto_ST | Bin 0 -> 338 bytes .../data/PhoneNumberMetadataProto_SV | Bin 0 -> 584 bytes .../data/PhoneNumberMetadataProto_SX | Bin 0 -> 698 bytes .../data/PhoneNumberMetadataProto_SY | Bin 0 -> 502 bytes .../data/PhoneNumberMetadataProto_SZ | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_TA | Bin 0 -> 245 bytes .../data/PhoneNumberMetadataProto_TC | Bin 0 -> 739 bytes .../data/PhoneNumberMetadataProto_TD | Bin 0 -> 396 bytes .../data/PhoneNumberMetadataProto_TG | Bin 0 -> 379 bytes .../data/PhoneNumberMetadataProto_TH | Bin 0 -> 643 bytes .../data/PhoneNumberMetadataProto_TJ | Bin 0 -> 694 bytes .../data/PhoneNumberMetadataProto_TK | Bin 0 -> 299 bytes .../data/PhoneNumberMetadataProto_TL | Bin 0 -> 455 bytes .../data/PhoneNumberMetadataProto_TM | Bin 0 -> 567 bytes .../data/PhoneNumberMetadataProto_TN | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_TO | Bin 0 -> 603 bytes .../data/PhoneNumberMetadataProto_TR | Bin 0 -> 1383 bytes .../data/PhoneNumberMetadataProto_TT | Bin 0 -> 841 bytes .../data/PhoneNumberMetadataProto_TV | Bin 0 -> 410 bytes .../data/PhoneNumberMetadataProto_TW | Bin 0 -> 1375 bytes .../data/PhoneNumberMetadataProto_TZ | Bin 0 -> 612 bytes .../data/PhoneNumberMetadataProto_UA | Bin 0 -> 998 bytes .../data/PhoneNumberMetadataProto_UG | Bin 0 -> 669 bytes .../data/PhoneNumberMetadataProto_US | Bin 0 -> 2128 bytes .../data/PhoneNumberMetadataProto_UY | Bin 0 -> 841 bytes .../data/PhoneNumberMetadataProto_UZ | Bin 0 -> 1617 bytes .../data/PhoneNumberMetadataProto_VA | Bin 0 -> 711 bytes .../data/PhoneNumberMetadataProto_VC | Bin 0 -> 802 bytes .../data/PhoneNumberMetadataProto_VE | Bin 0 -> 492 bytes .../data/PhoneNumberMetadataProto_VG | Bin 0 -> 757 bytes .../data/PhoneNumberMetadataProto_VI | Bin 0 -> 918 bytes .../data/PhoneNumberMetadataProto_VN | Bin 0 -> 1328 bytes .../data/PhoneNumberMetadataProto_VU | Bin 0 -> 471 bytes .../data/PhoneNumberMetadataProto_WF | Bin 0 -> 474 bytes .../data/PhoneNumberMetadataProto_WS | Bin 0 -> 497 bytes .../data/PhoneNumberMetadataProto_XK | Bin 0 -> 593 bytes .../data/PhoneNumberMetadataProto_YE | Bin 0 -> 514 bytes .../data/PhoneNumberMetadataProto_YT | Bin 0 -> 463 bytes .../data/PhoneNumberMetadataProto_ZA | Bin 0 -> 1130 bytes .../data/PhoneNumberMetadataProto_ZM | Bin 0 -> 585 bytes .../data/PhoneNumberMetadataProto_ZW | Bin 0 -> 1985 bytes .../data/ShortNumberMetadataProto_AC | Bin 0 -> 212 bytes .../data/ShortNumberMetadataProto_AD | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_AE | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_AF | Bin 0 -> 287 bytes .../data/ShortNumberMetadataProto_AG | Bin 0 -> 237 bytes .../data/ShortNumberMetadataProto_AI | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_AL | Bin 0 -> 390 bytes .../data/ShortNumberMetadataProto_AM | Bin 0 -> 276 bytes .../data/ShortNumberMetadataProto_AO | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_AR | Bin 0 -> 385 bytes .../data/ShortNumberMetadataProto_AS | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_AT | Bin 0 -> 433 bytes .../data/ShortNumberMetadataProto_AU | Bin 0 -> 551 bytes .../data/ShortNumberMetadataProto_AW | Bin 0 -> 231 bytes .../data/ShortNumberMetadataProto_AX | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_AZ | Bin 0 -> 301 bytes .../data/ShortNumberMetadataProto_BA | Bin 0 -> 332 bytes .../data/ShortNumberMetadataProto_BB | Bin 0 -> 231 bytes .../data/ShortNumberMetadataProto_BD | Bin 0 -> 436 bytes .../data/ShortNumberMetadataProto_BE | Bin 0 -> 544 bytes .../data/ShortNumberMetadataProto_BF | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_BG | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_BH | Bin 0 -> 386 bytes .../data/ShortNumberMetadataProto_BI | Bin 0 -> 323 bytes .../data/ShortNumberMetadataProto_BJ | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_BL | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_BM | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_BN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_BO | Bin 0 -> 250 bytes .../data/ShortNumberMetadataProto_BQ | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_BR | Bin 0 -> 761 bytes .../data/ShortNumberMetadataProto_BS | Bin 0 -> 214 bytes .../data/ShortNumberMetadataProto_BT | Bin 0 -> 250 bytes .../data/ShortNumberMetadataProto_BW | Bin 0 -> 306 bytes .../data/ShortNumberMetadataProto_BY | Bin 0 -> 269 bytes .../data/ShortNumberMetadataProto_BZ | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_CA | Bin 0 -> 320 bytes .../data/ShortNumberMetadataProto_CC | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_CD | Bin 0 -> 302 bytes .../data/ShortNumberMetadataProto_CF | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_CG | Bin 0 -> 204 bytes .../data/ShortNumberMetadataProto_CH | Bin 0 -> 525 bytes .../data/ShortNumberMetadataProto_CI | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_CK | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_CL | Bin 0 -> 1068 bytes .../data/ShortNumberMetadataProto_CM | Bin 0 -> 288 bytes .../data/ShortNumberMetadataProto_CN | Bin 0 -> 404 bytes .../data/ShortNumberMetadataProto_CO | Bin 0 -> 423 bytes .../data/ShortNumberMetadataProto_CR | Bin 0 -> 449 bytes .../data/ShortNumberMetadataProto_CU | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_CV | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_CW | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_CX | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_CY | Bin 0 -> 258 bytes .../data/ShortNumberMetadataProto_CZ | Bin 0 -> 315 bytes .../data/ShortNumberMetadataProto_DE | Bin 0 -> 524 bytes .../data/ShortNumberMetadataProto_DJ | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_DK | Bin 0 -> 309 bytes .../data/ShortNumberMetadataProto_DM | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_DO | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_DZ | Bin 0 -> 277 bytes .../data/ShortNumberMetadataProto_EC | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_EE | Bin 0 -> 1774 bytes .../data/ShortNumberMetadataProto_EG | Bin 0 -> 298 bytes .../data/ShortNumberMetadataProto_EH | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_ER | Bin 0 -> 348 bytes .../data/ShortNumberMetadataProto_ES | Bin 0 -> 728 bytes .../data/ShortNumberMetadataProto_ET | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_FI | Bin 0 -> 314 bytes .../data/ShortNumberMetadataProto_FJ | Bin 0 -> 317 bytes .../data/ShortNumberMetadataProto_FK | Bin 0 -> 200 bytes .../data/ShortNumberMetadataProto_FM | Bin 0 -> 237 bytes .../data/ShortNumberMetadataProto_FO | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_FR | Bin 0 -> 609 bytes .../data/ShortNumberMetadataProto_GA | Bin 0 -> 239 bytes .../data/ShortNumberMetadataProto_GB | Bin 0 -> 660 bytes .../data/ShortNumberMetadataProto_GD | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_GE | Bin 0 -> 324 bytes .../data/ShortNumberMetadataProto_GF | Bin 0 -> 337 bytes .../data/ShortNumberMetadataProto_GG | Bin 0 -> 284 bytes .../data/ShortNumberMetadataProto_GH | Bin 0 -> 325 bytes .../data/ShortNumberMetadataProto_GI | Bin 0 -> 530 bytes .../data/ShortNumberMetadataProto_GL | Bin 0 -> 196 bytes .../data/ShortNumberMetadataProto_GM | Bin 0 -> 235 bytes .../data/ShortNumberMetadataProto_GN | Bin 0 -> 235 bytes .../data/ShortNumberMetadataProto_GP | Bin 0 -> 329 bytes .../data/ShortNumberMetadataProto_GR | Bin 0 -> 339 bytes .../data/ShortNumberMetadataProto_GT | Bin 0 -> 290 bytes .../data/ShortNumberMetadataProto_GU | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_GW | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_GY | Bin 0 -> 321 bytes .../data/ShortNumberMetadataProto_HK | Bin 0 -> 560 bytes .../data/ShortNumberMetadataProto_HN | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_HR | Bin 0 -> 450 bytes .../data/ShortNumberMetadataProto_HT | Bin 0 -> 266 bytes .../data/ShortNumberMetadataProto_HU | Bin 0 -> 554 bytes .../data/ShortNumberMetadataProto_ID | Bin 0 -> 313 bytes .../data/ShortNumberMetadataProto_IE | Bin 0 -> 390 bytes .../data/ShortNumberMetadataProto_IL | Bin 0 -> 323 bytes .../data/ShortNumberMetadataProto_IM | Bin 0 -> 280 bytes .../data/ShortNumberMetadataProto_IN | Bin 0 -> 1604 bytes .../data/ShortNumberMetadataProto_IQ | Bin 0 -> 335 bytes .../data/ShortNumberMetadataProto_IR | Bin 0 -> 583 bytes .../data/ShortNumberMetadataProto_IS | Bin 0 -> 375 bytes .../data/ShortNumberMetadataProto_IT | Bin 0 -> 603 bytes .../data/ShortNumberMetadataProto_JE | Bin 0 -> 326 bytes .../data/ShortNumberMetadataProto_JM | Bin 0 -> 251 bytes .../data/ShortNumberMetadataProto_JO | Bin 0 -> 376 bytes .../data/ShortNumberMetadataProto_JP | Bin 0 -> 309 bytes .../data/ShortNumberMetadataProto_KE | Bin 0 -> 727 bytes .../data/ShortNumberMetadataProto_KG | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_KH | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_KI | Bin 0 -> 288 bytes .../data/ShortNumberMetadataProto_KM | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_KN | Bin 0 -> 233 bytes .../data/ShortNumberMetadataProto_KP | Bin 0 -> 215 bytes .../data/ShortNumberMetadataProto_KR | Bin 0 -> 502 bytes .../data/ShortNumberMetadataProto_KW | Bin 0 -> 243 bytes .../data/ShortNumberMetadataProto_KY | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_KZ | Bin 0 -> 333 bytes .../data/ShortNumberMetadataProto_LA | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_LB | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_LC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_LI | Bin 0 -> 267 bytes .../data/ShortNumberMetadataProto_LK | Bin 0 -> 388 bytes .../data/ShortNumberMetadataProto_LR | Bin 0 -> 300 bytes .../data/ShortNumberMetadataProto_LS | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_LT | Bin 0 -> 366 bytes .../data/ShortNumberMetadataProto_LU | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_LV | Bin 0 -> 379 bytes .../data/ShortNumberMetadataProto_LY | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_MA | Bin 0 -> 220 bytes .../data/ShortNumberMetadataProto_MC | Bin 0 -> 226 bytes .../data/ShortNumberMetadataProto_MD | Bin 0 -> 355 bytes .../data/ShortNumberMetadataProto_ME | Bin 0 -> 341 bytes .../data/ShortNumberMetadataProto_MF | Bin 0 -> 329 bytes .../data/ShortNumberMetadataProto_MG | Bin 0 -> 229 bytes .../data/ShortNumberMetadataProto_MH | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MK | Bin 0 -> 304 bytes .../data/ShortNumberMetadataProto_ML | Bin 0 -> 594 bytes .../data/ShortNumberMetadataProto_MM | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MN | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_MO | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_MP | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_MQ | Bin 0 -> 353 bytes .../data/ShortNumberMetadataProto_MR | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_MS | Bin 0 -> 225 bytes .../data/ShortNumberMetadataProto_MT | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_MU | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_MV | Bin 0 -> 277 bytes .../data/ShortNumberMetadataProto_MW | Bin 0 -> 282 bytes .../data/ShortNumberMetadataProto_MX | Bin 0 -> 324 bytes .../data/ShortNumberMetadataProto_MY | Bin 0 -> 511 bytes .../data/ShortNumberMetadataProto_MZ | Bin 0 -> 256 bytes .../data/ShortNumberMetadataProto_NA | Bin 0 -> 244 bytes .../data/ShortNumberMetadataProto_NC | Bin 0 -> 340 bytes .../data/ShortNumberMetadataProto_NE | Bin 0 -> 385 bytes .../data/ShortNumberMetadataProto_NF | Bin 0 -> 221 bytes .../data/ShortNumberMetadataProto_NG | Bin 0 -> 254 bytes .../data/ShortNumberMetadataProto_NI | Bin 0 -> 297 bytes .../data/ShortNumberMetadataProto_NL | Bin 0 -> 384 bytes .../data/ShortNumberMetadataProto_NO | Bin 0 -> 330 bytes .../data/ShortNumberMetadataProto_NP | Bin 0 -> 271 bytes .../data/ShortNumberMetadataProto_NR | Bin 0 -> 213 bytes .../data/ShortNumberMetadataProto_NU | Bin 0 -> 212 bytes .../data/ShortNumberMetadataProto_NZ | Bin 0 -> 350 bytes .../data/ShortNumberMetadataProto_OM | Bin 0 -> 285 bytes .../data/ShortNumberMetadataProto_PA | Bin 0 -> 202 bytes .../data/ShortNumberMetadataProto_PE | Bin 0 -> 221 bytes .../data/ShortNumberMetadataProto_PF | Bin 0 -> 195 bytes .../data/ShortNumberMetadataProto_PG | Bin 0 -> 293 bytes .../data/ShortNumberMetadataProto_PH | Bin 0 -> 215 bytes .../data/ShortNumberMetadataProto_PK | Bin 0 -> 265 bytes .../data/ShortNumberMetadataProto_PL | Bin 0 -> 320 bytes .../data/ShortNumberMetadataProto_PM | Bin 0 -> 370 bytes .../data/ShortNumberMetadataProto_PR | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_PS | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_PT | Bin 0 -> 404 bytes .../data/ShortNumberMetadataProto_PW | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_PY | Bin 0 -> 359 bytes .../data/ShortNumberMetadataProto_QA | Bin 0 -> 257 bytes .../data/ShortNumberMetadataProto_RE | Bin 0 -> 223 bytes .../data/ShortNumberMetadataProto_RO | Bin 0 -> 436 bytes .../data/ShortNumberMetadataProto_RS | Bin 0 -> 257 bytes .../data/ShortNumberMetadataProto_RU | Bin 0 -> 238 bytes .../data/ShortNumberMetadataProto_RW | Bin 0 -> 236 bytes .../data/ShortNumberMetadataProto_SA | Bin 0 -> 411 bytes .../data/ShortNumberMetadataProto_SB | Bin 0 -> 295 bytes .../data/ShortNumberMetadataProto_SC | Bin 0 -> 310 bytes .../data/ShortNumberMetadataProto_SD | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_SE | Bin 0 -> 558 bytes .../data/ShortNumberMetadataProto_SG | Bin 0 -> 312 bytes .../data/ShortNumberMetadataProto_SH | Bin 0 -> 255 bytes .../data/ShortNumberMetadataProto_SI | Bin 0 -> 357 bytes .../data/ShortNumberMetadataProto_SJ | Bin 0 -> 252 bytes .../data/ShortNumberMetadataProto_SK | Bin 0 -> 301 bytes .../data/ShortNumberMetadataProto_SL | Bin 0 -> 279 bytes .../data/ShortNumberMetadataProto_SM | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_SN | Bin 0 -> 417 bytes .../data/ShortNumberMetadataProto_SO | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_SR | Bin 0 -> 211 bytes .../data/ShortNumberMetadataProto_SS | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_ST | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_SV | Bin 0 -> 327 bytes .../data/ShortNumberMetadataProto_SX | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_SY | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_SZ | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_TC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_TD | Bin 0 -> 192 bytes .../data/ShortNumberMetadataProto_TG | Bin 0 -> 253 bytes .../data/ShortNumberMetadataProto_TH | Bin 0 -> 854 bytes .../data/ShortNumberMetadataProto_TJ | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_TL | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_TM | Bin 0 -> 197 bytes .../data/ShortNumberMetadataProto_TN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_TO | Bin 0 -> 230 bytes .../data/ShortNumberMetadataProto_TR | Bin 0 -> 1027 bytes .../data/ShortNumberMetadataProto_TT | Bin 0 -> 214 bytes .../data/ShortNumberMetadataProto_TV | Bin 0 -> 200 bytes .../data/ShortNumberMetadataProto_TW | Bin 0 -> 354 bytes .../data/ShortNumberMetadataProto_TZ | Bin 0 -> 302 bytes .../data/ShortNumberMetadataProto_UA | Bin 0 -> 382 bytes .../data/ShortNumberMetadataProto_UG | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_US | Bin 0 -> 794 bytes .../data/ShortNumberMetadataProto_UY | Bin 0 -> 278 bytes .../data/ShortNumberMetadataProto_UZ | Bin 0 -> 322 bytes .../data/ShortNumberMetadataProto_VA | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_VC | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_VE | Bin 0 -> 227 bytes .../data/ShortNumberMetadataProto_VG | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_VI | Bin 0 -> 205 bytes .../data/ShortNumberMetadataProto_VN | Bin 0 -> 203 bytes .../data/ShortNumberMetadataProto_VU | Bin 0 -> 191 bytes .../data/ShortNumberMetadataProto_WF | Bin 0 -> 195 bytes .../data/ShortNumberMetadataProto_WS | Bin 0 -> 267 bytes .../data/ShortNumberMetadataProto_XK | Bin 0 -> 224 bytes .../data/ShortNumberMetadataProto_YE | Bin 0 -> 206 bytes .../data/ShortNumberMetadataProto_YT | Bin 0 -> 211 bytes .../data/ShortNumberMetadataProto_ZA | Bin 0 -> 443 bytes .../data/ShortNumberMetadataProto_ZM | Bin 0 -> 218 bytes .../data/ShortNumberMetadataProto_ZW | Bin 0 -> 357 bytes .../internal/GeoEntityUtility.java | 56 + .../phonenumbers/internal/MatcherApi.java | 32 + .../internal/RegexBasedMatcher.java | 57 + .../phonenumbers/internal/RegexCache.java | 78 + .../DefaultMetadataDependenciesProvider.java | 115 + .../init/ClassPathResourceMetadataLoader.java | 42 + .../metadata/init/MetadataParser.java | 108 + .../BlockingMetadataBootstrappingGuard.java | 78 + .../source/CompositeMetadataContainer.java | 69 + .../source/FormattingMetadataSource.java | 37 + .../source/FormattingMetadataSourceImpl.java | 57 + .../source/MapBackedMetadataContainer.java | 74 + .../source/MetadataBootstrappingGuard.java | 35 + .../metadata/source/MetadataContainer.java | 32 + .../metadata/source/MetadataSource.java | 21 + .../metadata/source/MetadataSourceImpl.java | 72 + .../source/MultiFileModeFileNameProvider.java | 58 + .../NonGeographicalEntityMetadataSource.java | 47 + .../source/PhoneMetadataFileNameProvider.java | 36 + .../metadata/source/RegionMetadataSource.java | 40 + .../source/RegionMetadataSourceImpl.java | 62 + .../SingleFileModeFileNameProvider.java | 35 + 1175 files changed, 21905 insertions(+), 7 deletions(-) create mode 100644 java/demoapp/.gradle/8.9/checksums/checksums.lock create mode 100644 java/demoapp/.gradle/8.9/checksums/md5-checksums.bin create mode 100644 java/demoapp/.gradle/8.9/checksums/sha1-checksums.bin create mode 100644 java/demoapp/.gradle/8.9/dependencies-accessors/gc.properties create mode 100644 java/demoapp/.gradle/8.9/executionHistory/executionHistory.lock create mode 100644 java/demoapp/.gradle/8.9/fileChanges/last-build.bin create mode 100644 java/demoapp/.gradle/8.9/fileHashes/fileHashes.lock create mode 100644 java/demoapp/.gradle/8.9/gc.properties create mode 100644 java/demoapp/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 java/demoapp/.gradle/buildOutputCleanup/cache.properties create mode 100644 java/demoapp/.gradle/vcs-1/gc.properties create mode 100644 migrator/migrator-servlet/src/test/java/com/google/phonenumbers/ServletMainTest.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/BuildMetadataFromXml.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/Command.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CommandDispatcher.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CopyrightNotice.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/FileUtils.java create mode 100644 tools/java/common/target/test-classes/com/google/i18n/phonenumbers/MetadataFilter.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MetadataLoader.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MissingMetadataException.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/NumberParseException.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonemetadata.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonenumber.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumberInfo.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_34 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_359 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_36 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_385 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_39 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_44 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_61 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_62 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_64 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_91 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_94 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_95 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_971 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_XK create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/GeoEntityUtility.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/MatcherApi.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexCache.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java create mode 100644 tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MetadataLoader.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MissingMetadataException.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/NumberParseException.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonemetadata.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonenumber.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumberInfo.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/PhoneNumberMetadataForGoldenTests.xml create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/ShortNumberMetadataForGoldenTests.xml create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_metadata.js create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_shortnumbermetadata.js create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_34 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_359 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_36 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_385 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_39 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_44 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_61 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_62 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_64 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_91 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_94 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_95 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_971 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ET create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ME create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NP create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_QA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_RW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TD create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TL create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UY create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_UZ create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VG create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VI create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_XK create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZA create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZW create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/GeoEntityUtility.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/MatcherApi.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexCache.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java create mode 100644 tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java diff --git a/java/demoapp/.gradle/8.9/checksums/checksums.lock b/java/demoapp/.gradle/8.9/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..7df0626edf64e7b382edd2bd48a531a9129e00ad GIT binary patch literal 17 VcmZSn@chZj9}>q38Nh&9697tP1=|1s literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/checksums/md5-checksums.bin b/java/demoapp/.gradle/8.9/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..089ec7f5c95bbca6a606751ca2ea26aaf8adfc2d GIT binary patch literal 27797 zcmeI4cRZF~{P1ttdqq@6>uW^FXvj?VNLKdVDWyTAgpjf-B|B0|J7q*94J4y9l*&w! zq=by;T=zNG^?UuU+w-D|(zMc2=Ip=fMb>}KQ3Ppr(4i(D(6run5mi`?* z1N02gGeFM(Jp=R%&@({K06hcr4A3(`&j39G^bF85K+ga@1N02gGeFM(Jp=R%{Qr^x z8_*FB*clPI1=u&d2PhOpF7Qo7)E&pe%{>;z@W&px`0o#nmWRZAFx*)Jx$OYXqec8e zBhHI_gWP&G&SUeUA0}PN+5ovtCC=mRR;&tIs+kJ8Zxq4f<(G6v{hfu}+Y#p{LMhzG z!{S^acOJp{N$q|Y>kYn((fx-Bp0D3Bw3A|w?lVg87t0*&&Zl04+&UTO$@*I&qkmOZ zLGDyX@Yfd4;}@nmL2mjG=cz`Q`+vE;LHF@sCwTn=S+BXW-{?MnaDJw`XX?>D`>T*! zEW&wufMH;ax|j~+t~~?~%i|Nhk@ysHhd`X4yI#xlCfLLRa*rUKXAIu3s~Y|!47tmF zoM$=@#<;g`s)gLq8|T?C`GkLm<)HirX5u`r%)vUb_Zl;-AE1HreAl>+OqNK*1N{je zv$&#P{OdAU-{KmdYU?q#D0|J9_32*h9D zKWOz9^|y2T+yuGdMVz-SDvA|J8|Q?4>pp^St0)$#-kbrsSscM11qEI(Z}o%Rn`q~2 zm1SjB)wY`nT_3EJ?@%iT-{T+~`>vp&|yk)fv40XT28Z65oQokem16 z{0rao=JC>Pwvc;2B)E83-X7>k5nO&IAZVLa2jpAd;k-LYQbhKv(;vv)LkON- zf5+0)1MOF~(Kzo}Xb>wa!-%)X0_S~~et9!p?X-sXF~5WJfk(cMkJWRi1Sy@FhYFiNL3%KZ>);fUn8v$%j;K&_Q@Td1m9^q`C`mx z7S?yzfOCbwb#`Mv!_c{J?M(0vCzm4)i%>qTp5k1w@IkwWu^~ElT$bTnDOc3PG)(v| zy#LlqIA1H&65f&9`2lk4T7o--Z;5Cw9faJSm*74cwFV>C*F$cpfpcYndku?@yQ1gn zfL%CO`=@k>*Y4^Ntna@M=j-H$gl0T6(L8rEAo!NQt3CuCbA$D5C2+p+YqGY=jU@E^ zW=4#oy4DrJ)ul}+pO!@2O#;V8wVRiq=M9Tb_$58zzSA@VfuXTL1S{TAU||LfoIaBr@Iko)uF-0*r|dZhfC z2asEj;oRu$#))Hhzp*PYw?nH|=58N}-wr?XcVJa~qlbKHsj!Nis2=KY*B zw61OJ@cJfY?0K5QA{XI(jMQ;%=8!BUX})1UOfu??>5os+Uo&6ee zyF)lX$n{M+KT>HY%fHJt94ES#u_8%Xg z%bgT~R->C~$-2kQEYnme6ozbt^O6ZLCbJ^=y5@fy&wpQF`Mv!er_Rl%AziI{xzJd7 z2^rF~1|{_sO9)R$D$}OKk|i2Ps-Yo;ev2<#LuvUGXo7a>^*N%3=_pYF2V1DQ#G3w#>7gll1HsVZ$>iB)2f_V*6CK}!ymri`m=mI z@5C(><0p*4ioI)3igCW%XnL1lQkm;txfFY|aqzYS)^i#3Ha%Y|tuZTeD|_U(o0;OB zL@A0(vH)ro$}TIGGg6FKRyXrxFE7#Y@@$Z8f4k-%iqQ*O#d4a~(C`cOx-`epeBD7p zENNo01jRt_X7XY0tdL?Xm%JDe6Pls&Rc-(CgaxwTp41VvhB4T%wbI!c7^{XwBV!FTSit|24d(C#DIaxqaJ$6+IeTi8jtVrS8=%45LTfx_s9dqHuUlkc zP<%)Dk5{$OSPlLz4pvy?z=hl@2`O>mIS%diH%}xVjCq3`QTu`3^5Ot7$wpB$Z+FCn zo+GmQ&C2I>?H2(fYuao9D;9x5VZz?GCdH^ZvmoZn!>_NLm*+Gk`!Re%F)XM8h4BKd zap`kF?9AZ)+kf_V8;7tTT7e7@3oATV!G#pVMBR9CoT20ywP3^0qG>BvWNf7h6ag?k zWMk>CQmq%cE4TXi$xMG;coLsi=>09uc3PuJ{thE!6;+_D z?xHoGeeHfS=RY&lYP>Z65$7Z~G-O7h!GVn=DTZ*~=tFNC);->Q!fa1$T)~@5)K;N4 zRXMTQLNWqU_e>eEXfX$eHi+jxPX7-XrZ5I)GOh7s_b6)wqj!c}$d=Q>t|N2E0R6!V zyB4^RV)RBu9p3o7yEHF0hFMzxtAWicMscb@(ZCJ@l9BXtg)gf};(&a`{^MN#qOtu7 zn~C3{5skfJNHP|F|IU^7mN7ciHtL&%Xd|`;F$2BJw<(I&h|Z|8xUZi5Mo#hI&YzVv zV$fhkdkO1VS|gM-=+vxd*jb({h4y)UEnxSj#=zDEC=2(33#nE9Vp0`BviX69-YQD< z2l`e61MG=%98`g#j=k|pGPWB%EjZuv^nUlYRbvk-j9pQy(7wx)PHX5sFU*SaVylX2 zIDBVO;K@c9V|6x+@!%${At~0uQIzrO&Gn%}yU)Ac+6N7JTWBz0@9U9Tb;;4t=5XJ8 z8PTnh`y3pXfHy+1eym12oYXy9Ly_Z6dqH#Yq)Cm$)O(9Bcy_>N}DgkBn`|z;Z_F$LXEEnVSQe zc+VWWero(t7kFTyjz^@_Boz=Y6KU&`8f12X676&^4)^jFBXebBM#`yV8 zhtv1lbD6&nayLbVo%2F5u#*N9b_sAH^;|CXbljbN@yB65R;xjSU!T_K+#KttXZ6hSSFUjHhom!8sOK-B!7|TY z(lwIwnAeW0SiU|^?b@cZBFJcf2Ky)47@lnGD_`mrMjr|2zi`4jjREx>?V@|v(i-Vq zYR;-N4PJW=ji2TAYj=V%WYEsQ3|29@=UufIkA%O#AEZx{)vI^~~Qcg@)W#ECT3xDY%dfRk6n6uODv46kk`ZJ0Wg1 z1`T;$sz70$=Q;7+g5qz6F*B5$%~Mw^`o=#aBLy1lAQR*m!j`p<9(1b82i#u1|C|{w zS|9SypuyBZYYgSw7`M%sGVXPF{Jyq~1>}gj@1j+!mPl*7IIzQHS;aU{j9w~JER&oc z>N$8O#R}Uwa3S^lk6=~Hp7a$N!#4jCZ{KH_gN7{j1Oti)cupZ3RjiCBMjYC>Z-x{b z?m1-(YEoyS1y!IdpP)64i0S*3UTBFeBsYplDV+jK@ zkqX|%m+Z)pga#|vBgw5w&dJOeabZ;9k{Wo+H2P;48R+E1vQ0KjH(yea&eqB6YRq_b zsB8jc6KmBPT^NH~o7PyRl;jiQI1w~uy7I|f{q#j-tcM0u2(6Jl_Ilz8lUU64gHP^P zwhdvQ4Z!&!f~{6i7J$=%+$x=a`~|tX+L{+OW^hOx;Nw7s5mlftx6v9Q``?{kfADA4 z9~ZTzn4Rh|s8zDam}iGOWv;GTK9@8my+SG{w_Y9WQ=nDmqK?SGT1T2CnJ;z@EIsa5 z^>O!)TrmNY)hGto8?mDD30z1to@KGvM z3DV8i$7P4eWGSVVq}&lQkC7pJ8ffYYFk_-RLI`Mh+Vf=^<#avVpIpR~QxRCnMBIdhxr^oWQJGJlLzCFY#2aS!URDr@FMr(-NDN_1q z+i`rj_R_!74ZSO2KNPE>p{_`4bR9S5;>hUMtDEwz*>wy1cR;Z5P(&+=DU{ZT32r^p z<$SmE+70u(s^*>Gvoh7dvI+{vJZJ4gpVp@q&$JpUm))eM2AK6&QJ?2Dkf{~7 z+k4?bq)_~V+3~kGN{~?ojfL}!M`y&M)=nm&L<`382!W?Zz^P1a)i^W^UxKfs?ABTH zexKnFD7)1rnqQ*%7_2?2fpW#&LuKC^!B#u=T8Pzw$zG~KJVAK?)%?8=l?)!Y+~5r z^#sL%_ zu&a`d)Tl*+3T$2j71N;(MeDl2T&1?^E>)n26wn&0W<+v!mzLROUi~Mr+}#~}vc$3* z2Mv}CTBE0lM<+$n{cet*y|}*D?HOcXIRb?p^o!i8*{lq1tpNMnlLy5eK8#|Yva#{d zeoGZ7{Mb4n^Ux36 zpvPDYonjb+O^ep>KHyO>y>vQlS0bh0B=_PrXy`UTW05(n!Cr8WU1h88JG+Dd&;7>) zFCZi6{~qIZ?U|)r3I>{Y_IVXAE`1;bjm>({U%xgW)g4C6hHGO&G=&NJ|qX9Fib z)(<@mXfR`|mz1kZ=D{<8ekZFVg!e1lnQp`OU0~>A>l+l-c}6gwjgjyC=y>bq!_$iU zWA}q|12YWK(^Bj_PcqNC6^`fQHFaXt0HY zucR2?CC=H&Kh&YPU3%ZEeB1W~G)&h(W05VbQ8}!vkkF>4Wc#__@FZXLP1p|&M`*BP z`!6ZRHR+<1LreFL3FX^uDe|_%`T<5z1AO+x3McmIh-56KG^a>^)!(F)v)sh0!SOq4 z71&d-!W;%JBxCGq(~%$dvfVtDIB)cSS@Q0G8%)?bAsJnkl`}WxL<_`j94Qah7DqGD z>=hOPJORXj3(1hWSdp?U-tx>}zy7#IR^#Yt$qcRYFD10brPFC?QwNikm5(GTUJI{G zfvqxQ#3E2A^7i0Dit#+UyLy^S^@UT5vRT+m@la@>NkU>!(1t1Pf5N>Bvi!G+YS`+^%! z{VH0`qU^Jx+~%Afn1PsK4t8v;u!31bHXf+Bzl~(!?&k|wvi0d1mOf;F=M$_j&U31H zyXS^}i<$P`5STQ)GiT;HG`5OBgALnLNUciV_rz*rTY#j&U_#FpcY_dQU{CmU1#Fu>3|0?rF;wp%Mv1&Y*TTBCYI!-QWj=!<~CG0o=#_So(N467+< zu+6jk@UogU)t|leaUzy!sBBK&3$+SO6LxGyl3Hau7b&1!>XIoLGB$Sp@f64^mR(C; z7=y!`*04FTA&a5Kw{odw;*nTptTEJnz)z42?0adA^D8p19#hz}t^b7OkzVzwLS$g` z2^6&?a3Qs-Z}#358+m7siK5WY%!{#qsSJx@BTE%1YU#9w)ViaJCKl4CWaP9M+_fkv_uj7?O5!h&U)WW4S5xVt3XaaZQqCR@gXS>U9>`e6#e znzUrr`Y$+nYG_&|tw<@0$Mu!eH<9 literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/checksums/sha1-checksums.bin b/java/demoapp/.gradle/8.9/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..84278300c5b92b19c49c9376d3e2b9a2c677861a GIT binary patch literal 76541 zcmeGFc{o+w|HqG?Vi0a5Cp2n6N+aMo=irxG5B>M*PmH)K|-!_254)<{^H55P$en zkb$^MDC9Av1W%}UiM!ixX##otErRcMpGqFxHZKJ7x^Tps!jfJX1y@7vH$d=25&xah zhed`V_tr(+Bqi(3)boEJua!YO%lv6Cg{cbia&g4#pYgWa?MbI`>bxHWPs(V?G`XIn z3%O7v;@#t|YDsU+VL!=737+hf=Ak#4qz3t^Lc}-o2Vcny7KHsQ_Cx$g;+3qEMH(=E zlN-VJILOEb&DYL>JYx*;J&Iy)62|^Oo@#^m`Pt`I7x-L&{fnUSqz&`h&+~pP0OL~( zi1@Vea!z%XvagV5vJyOf&d-(Q{v}0_M+qaYA1mIXFQ5$jm$-^}anC;0nl~$8e8qEu zXH*yN<^8;=4)PuBh<|9%l3wYZ0lEJ-g70N|mYy2+YzXp_X2g}RF=wy+GYEMlKjL0n zZx@|CnhLp}KH@tmJn50C9+2;JLVRC$ObB>#9w*KCS zV2TsuXbYi75MFkSpriOo0}ouK7sfn%UgTq?01FS7Uf}|K>fF+IX#OYH%}$vbBs^C`|8<) zk24;vtDKX&TxX~D`oQ>LW)y$&4VP=G=qwti3Y|v0ok`y3Z{v3uzde)S`!6JARgIp4 zn6hCI@utO9YReY3!GCbDnBWHky1j@*v{#Yp>4k2{E;VJYhNF-FeG`b#2eVeipS8ydbzvD)ic$ zWiUQk7V-C|9hyga=RzK-Lh!>SuT1L2%UvKpY>9YNsQiQHy89qcMC-HA?R}Eh{WVu1 z-^NPB7kBf`{T^9@*S&)e30|^N;!d)p#T^)LoridLOW&L4N+%%STY&fr=f}@lsmwG^ zohOd?yA_=mpYFx$vrQ$zkGRPm49fVS0OO_O5N~w0&3IeG3j5DtCwLhXSJx|to^_C) zx{tU=>f=JTSUmoqAL2>#F20i(l7{gPFA=Z&EOjkP=Og4<4T%4vHAh4+I1}=4)PH$I ztM}^E#Z8b$m=f{jqvCfn9IWv=T(_3sM?D06Pql6=gYkP%-i}6_pP883YXP~%AtJtl z?YQCDJ}sPYL*uN_%lKw&<=z3~J<#eBJ0rfhOE{D95`Ae(dMryMKB9;`@G}3!%$Ne4Tn~x$sF2iKzZ8HVAYXZSfev^*R{IJ6a@*_b6ufD#n zyj7u89`cY3g4aZ?`qf`$vXI893#1YM=lph-lF#tmMV*JnU(+l7X7&5PB-oDwy1#0s z{yyH&@0103;2_aYt)u%F6$#9KHg zJr+yjbut%S$J1kdRS!n4!0SS(MAxNGTlbVszwIs9PpJpdPhHKs%WoUB@*zJgO7JsG zm+H1%P=@;y#Y+}(>0>8cuL}6V`0Xe^X96zquNLgT0eK295r4M*Dt~)(4&Hw#svGq| zJkNIguEf{>1{8lz;Iy9I`L&$1ey9tph_VLWUknie4 zJh4AZ^~hiR{I*Y-;O9k*#V(hqJcsciV~8JO;yom|zzXs>OT=GM#pb5i!hWdoIRw9; z?7d3pTRN=U)Fo>XH|O8VH0X_=_s-r#e0#~nOQ)(-ko6-7jw9&AYxzya$fc7>)Dt?nc88kL`X!o_U<;=khJq<5gX?___4( zC4x802wJ2$uRjgr?a=yf_8I+FBV&f2Lo)18e0`W{LBTIc7$4h@c;kBohxoCVkeBfi zyhToM;rwIuHIN^WK|J`^)^i?m_mhYIr%HCd4zN$NBHqI75C2jpxQJD|Hp|`ooa# z`j@MSX0gj(&!chbf(fFZ8v)Cb3UaSpf$^b=h^JMYZhCD2>jqUGU9TJCswG^^Pw{`} zEgRL7n+t%R9i#cj zA3~mmu46~d)sdR=2pOEm5%IUybMbvUH}r|dsnTe_yJdIqQqbHc_?$}>L;L%!w6!5? z%6i|zc$q@fPxc~(Yj=Lax<{2l_v5W=jUB}nyrR&zsE3HZt-i=LH&X)N$34+Hzr8W# zp5oP;t6}_xC=?%BADpx^$PDrX)K6!%_b#KhrFeaIK)#)KKA%y%+sX#x15rPB_{82` zJZZoJxg(nI9m`p-+EQ)dIgOIMlJLFLs5y98)Lan8yIvspUCrf`H9C7_AwQ6f_;{Gh z&FbI6kb9gWcsECjWcn&&AjCUG_)ld;N5gm*v@hH%@{?v2 zw}APl1RNsb?+Z-|72cPbq{UO`lp(%JG{C|0HC{K2(SCRT&Sh5_LSBl-`QTbmV7bM8 zf5=k?QT*3E!=90+VBV;*LIi&pc<7PbIjwS9JXN?8@ec>G*dByYVL$2oh)*n@m6)?r z3dYNg68s;lmvd~(A`)QyNp#=+Ugd0mA{sw$9J`A61Z(Hk zf;&fHyy{ggj?G?+b(#;GzWzK?HG|7U}>J&fOj=G7+=Inei{ zMHBM$dcwC)acXmrwasJ5-Bl1T9V}97Ep&q14V_#1?$mX=ZT9hkJWrO0e-k7nB0uE% z1M*mOz1|dbWiK-)1Yp-!)!hiCkZ92)PSdhlA`@BRfN4 zBw+s{Pl@=!Ykn@Vi7lI9d=jdML+r;`l+Oh2fbnv|MEp?kyt&03o|hpP(noy6cS(PZ zWhv~Z3gvld;_a+WpX;D6C83Onf6sNwN3HZGejcz#^Lj7vWa$pU2M1t3B~~cjK$|UD z={SDB_>KKcdU ze}fbV{&85$-`D(ZG3>|u8^K3boc>ayZj0Y{C8-4e)Do2B;(Z=J$EKtCj-KdxBbsP{ zpFf=oiTKfrUUjeIKIOsw<3tJm)xkro=$-fy$oJhR_%|)Wy*OmBtf{)8D956e2(ip}&p*)PQT+v0jH82Nq%ODgV`PA;NJ3n6E z($M-GPc^lg^`Ko5#s{MPcRbU^-mTDB3vy$0zl?u5@uPBzc<$R^fchWrdcgB=i#Ckk z>rL8?UnL8WhaoBg0I^x;zaz^im;Gu?y&u^ACp^% z8$XmSDB6$#dFD&R_bB~x7C4Hp=YoEM|5-KWzs9S!mKIN)i|WRoov}Xce;(rJlijC@ z_`j--`FR_!;pghiP=ZrVT3&d*G6S9iDe(sgPBpwyK>4DNKVP3|LOdo^gY#_hgAii@6kNO-9}zWKJZqD@#QuIm(i1r3wz;;?=R(7 z5ce=SDe1VF3&w{lBi_=W?fHgc1$pWZf-hWe$Nh)rIez|(NI-o5n^(`ekC?!CCzQ{H zkM7QPzBud)c{)00%KnsoNZFEz-`59Kh<+B`%<5d3ynF?W-}s2&a$#Yvjao$?ArFZ_hC;Lr92J#cAZYZh`w;l2s$M4@9EutUAyqsSXWjuJjGDZ8o;@|I! z`5t`>!uvT+#49aPPUiKmu!lT15%FM?iLP(He<0t=PjF?ObuVoK?D2VR(?mRQrNg(+ zk@z{^y9V(c{(H2>6X5$FN@WbmECzY(EP}7*=In{D3~7VhvtP|#4^Y7Smn7oX zTJFB6nH+#WFV}G*{xO16H*qb#-iA+JIAi(Wu#T&!EG66D9diGK9<*XwIa1cg9e7KM26D&5Z-wds)iSR#I5 zm)KKExFzHjm52`t2&p9X;`?uvF~RlcPfbdEKiduCPoedue}rl1?Zg=Ve$S$lh+pR% zdyx0Fe-Vt&)Fk+NyKZW@<}EyL)mn%TjYUOm;@$=0v(b5b{nXi2v)>is&xxtxM7*JV z(B-Xa9T7185X!%y{;iMk(z3&l7o$3FR6CFxtEhAta#xg3qmP$Em>VyTLSA!$=-+s& z;P?B+%y>Q7iuO(8v%e&j1H-?`v+mX59-IXk@JZ5h)5;mCT=MHirDaRNzHsb{u05>owFB9S!nEl+@lZiLirO5 zjof=6KiNibi{C$|z7DX4Lmnnba7&p)?M;by*cTHB<1LR8{n%N}r;OlmG?_ZuH<$a55Gwi<(t#fw^rH*0 z-N&t@_`M3`Ssw`Qp;9_)&u0%N$ZgO%@hD=^k(jNz335A06#sF>qb<^LOk#?EeU=Z^7RaN?a4~kb0UU(zqF=_-4S6}h=<5nxY&hJ3+;a&b0m0SF?V7%Q`6#rf$ zg5`^CJmjZQ{&&oatlhhCawX(OD4!9>`l`eOWAHkB0NuZllCiduON#MxY=9ime`Ma3 zDE3c6+hIRdafsg;ys+FwP95_4M+D!+J-nnWRt2w@PDR{h^p78-8&J3&UORgd>4eliU? zTi>pted1dAvX|QBdeCd(aoh{5Jak@UDhmzb-XC1q?nS1u(C~c^N61L!NOfM?7Ms0mPx7tWDlLm=s;awraj$r&QpLXL z=0&Em(D29C0V9>Z(b!?5r|E5)F-9WuHqXv9QcVS?PHbNC>!24Gwi@ZY$W#^@0k_Ci zvdahO_)3n9w&!O>{#qxx@{YdP2HXp;$Q;;{KAjht%0go^eqLv!8voL<#{B3k%N30- zb`m!qxY#aB1iK10uO(%0glyREPv=FZvd{=*CRg26C^gG(_|$iFeSG*4zqJQ{3p@sI zm@qH7DX8M8neIiV0$%w2&q($7S54WSv9D%X5d{mo(&gX&UGZoYp2INc#lj$mWGdi= zpRpLJ8t*O1XuERE|CU~-(kZQtE@lMi=+$hAO_C>0V?i;6+>P6bd61&wIa5u60?~Embo1C7IVeF3CAOz;lSN zd3J0)(ya}qyxK&Wi7KC( zGisv|o#NX4>b5oRWeZgtm!^A>sel)#1XyFFieA$szs!8z3ZFXGed!wKHP-1B;cG)4 z-$B{1lQ7-9$W*|~g=R%zq#Bg&zI{F>@MC+;K59$g%Hk-WGdi= zpJ^DW0tIdQ`*lCP{B+`7O#PF>5v#jRQqW5Qf5K$Lc4WGF3C(F*zi{Q#)&>y?qgSj^ z#ynrj#PQ7ID~by{htR3Wyub+Yw~GJ8>t7WkuLmcJ>;itQ-kaV#P%tvI_x!i?bZ`Qq z7EPKnv4fF;#)7?}q8s6z(>s3}YqH$6x0wA%Lf-pr(nJ*I^64rPuVOI5 zEl~Aey#7@&@=}rE+$5dzT!@2d@6o4O0c*crFa%GEv=ItJui2-jkFeyf%;=wtyBaLt zB6saLb8++egg#KAF_i+odKY8odAe+nd4Un`{O?{s1$HE?G4g79QKPr^qUg?*`;5D} zzjfQV`tBOTuNQWmK%282e9(=MM1^HOlO|%Q>Zh>0uvu(=D`-~H=GCo%FMdAI0&j(} zY{-3qDlTjl(|M7pfEQMCL1U!)zL}Rvl~r)>imkJ_56m6+)vT8XD~YxaN1;ln9emSy zk*KhF;U@=1D)pw2+xOc=2tV_ss zoc*=U`+!0twxX~*B?gXgO~P~)nHLygJyiV%FKk}8ijmi&Pv`#rU`_QoDwkT z2VD+HRM@=mvnV5#*wOZbybG;u*BQ(ADQxBw>PA8A&UMC`3BofnA;^Lj?E zQc7Ccdi|$vetnGe$BzN-TfW^%0ec87hlikw^}=*7G8ORZBUkyS>5hCpKc_ywv&dc6 z$ERuQfg2ZbFKjOXjrlP6pqm$&3V6Mvi5RNRY(9T;+pfq!8D&lZlQcWO=VSN5&O@7* zFI3IK_Axpyr#V&GBeQoLxx4?k1Iz8(Ukyy&bKxp8T$Mdt^92N|3}4OUSuQuSH)!nZ(RhR3)H=Wo1P@8)u`*}Rrsw!%yJObabFX9KaiFTDopo(+t|E>Zf{6nrH z8{xkyMkCy{|GtvSv8Y<(>?H2&Xf+edPrRVY&~msRdT|>~A0deft{cub-MV;&(iUE zdjc2n;q$`Q1ZcB!!3SLqNmSUp0%#(Js-~Vd+r4D-zYHb1Wwb22SP70Fs&HQNx1ox& zce)pu3V4ANI@TDezPZHYm(4HK;SWfXtKI3KxmkaR=l|DB0DIp?H?L!kA{zf3v#;r} zZhUZhi4lik>S}OxX>|jf_^>8~{alq!Mdk%Y7)BFO{)^YYDn?#XJ5LI+jokkpd|)Gs z%=|ekJeZ$L!4WFjLob#a(?>|A0$$jz02(9J>vScWoktL3TZwrIGP0xxXM z4?`90r(<;4AW>m!Ba2+MzVUeSd9KBNoGvN+UYd>$vAO?%lMt;Qu7N6nC*YgTi$sNa z?ITz5?}_%(STS#_b8|>h{f6}_e|ax~JD+xcMdKr6aAqS@0j~mbRc!n1@?2#NgHHKW zrfo`Qo#}P@w$MxdIaF~nIEy~aX&(`K@>{&-Vv!r4FeS*oof*4RK;~JNL6uqv_@>Lo zo6DP|G~aofH#+{(+M8pjCt?o9?vzYbZCe5Sm=9$)tw&mr~>1vE}ji|MmLrUG8~X(EOyryHd=&D+_* zZz{1f`DO_$U$}(@tUFo-=z=OX2K$$i1f{Q8?dX8O`uWLajl;>I-*vz{6ilVS0aaXS z(?_`HzWlD?;i^kF!!CQM2F&g?Upw&*SFM05{`J#UWL{uiU{}Z5fARWP#mI{+8$d<8 zKV*;%sn=@e>$Lek*KIoYsmMEnS1Mf${B(kr4JJ53$wBZ9oqY6 zHGa-^UnMhjf7^pq7rMdw49rVT6MC_FO!p#FS!iH4KGqniCNy8P)@T3zxKZ1e?{(L+ z+k=js*u9M1mEZ{&Yy1pq6p0F~`5=64Fj6`D2F=Y9+b!0wCVj$jV%ACLbLa2CdC7M} zFD?e>LoyZcnoF*Fk)!dtCGxJc;b4j0?(>7eF8D6ERe6_#pKx^ zwXyG&*E`5Zrp9dAaHS*S)O^-;c#Tr*z_amqx)+%Wc!4)DSYu(J8eVg+O4}m+#r$V4 zZOwB0FFRKyp8)d$_ZKqNAH zcQo<$L)T;O2dQ=zcn&{7760AoUSulZ1)kBd#z@tm`PqK)1SKr-v1Ib>xmWj|EBXVT z46%7Fm7<9#?90J7T@J}q!0R-*s>anU_Q<@YS|(*V7Q57!Sj<<-NW#7Bp^Ep{bT2ZM zg+>Todl{+x*5r&!D=N#soEPpOZ1QDaz)%P{**@!{{v1XG_O@q#S%8%tMN5gI?spME#D0tX0QC4u>Q`|r7b`O?n)6O zsA2-AO!~}|d4Ul+{bw(5FNZjjdu9C!pXh4ek;)z@Eqmrj{=4r=Vc6RqY=q!kk2Tf@ z;Dc^$kf<;(Z<>gq>Xn>|sO!6&LAU4MKPvWqpT{-XoQ~&E9#=6qZ;+{gmp{3xrl?W6 zk>#`dJ;A$a{U6O$?^By2Y4frWb-`8G6`-3Ji3*!n9=S@#{?;nHofUfgG4uTSGe=i( zg!H;hOX09WL_2;VR!}jFJAwu7gIDE_qs__QPj3h_aajP zuMTpRPhkj`n1YFT>R@fwTEi=S)Uy?pzzft3@e!!f1N$`nyhv2w{tEm5qtYHcp?k+z zH8>@KqvUwaX3d1gWrPQAMMmvVE4I=F(L2 zp=!P8bQOsgHo|ZJ+3WwP7H}TcOJ3;DuhfVww0V#@|JQcl1uC0bGgOIUZ(``Y$W*{9m|W$>;_g!I z5y%y*MrGA{-IIMwnG>(`>M~HZ_Rn-LG8OQ8Os>-1%dhe2-lOg%W>H=9U$|!a&AkLh zhRtgQCsZ*rIE#|0EHomO$yMV)E*zOE^I|@wxwCc3bKI#p-uVh%uO%O#ik$;|)8&vv z1+G_Q5V>lnT7YXyLZ!yLKSJt?GCG;ci}tR8^IAom4;id^GL?l!6nJBSH5LY{mY@@= zT(6!@hAR5FJv(`i*`dJ}%mceql-Qw)(a)DjRA64wRC3j?7%lcY@wTywLRXA59xjUZ zj`jf=2VQ0=*P%)fJ8RSBkVJ)f>5!|IDZdZ?%62AhciOVV1~J1!y1!(x_fgoqw4iEL z)^slt73PJVPC#R%8voX!ozH4@w9r0MS3-E+hX9q6A8{`~s1j%Z-*odLQDI(S_rn?^ zRs9dGkzL0=k2_!aSaIgKbkd>JSBk(3ta%OW=MA8-ZUG;3USulZ1x}Y(W2E}L!=9s? z-(q4)*7UvLWLsX|Ic{*BXkNIAjUPzqyvS4*8ZlTjXpB^~qm~;y1{|!y4!)3k%kul! z#r*3_px0_MsNxa_-*jGND&Q4Ct~wy7AaU`_b8q+0O6)LOev{*ZgduU$VK7O)>RX4#EiNL$Gv?~X6nOq zVjbdZp8v&kFA^2zg`bERsl4=oa+SlfmREhhYCmkOJAHj*zCq~tuB>y= zO9emoD%wo z@pmaQZPUHTRKN>VZmcmq@kL;Bma6G7| z+#}nBdx7@>SX+)=0lImSs4y=Pnuwu_SMIq_;Hk?;SaMgK-?mHlq4OeB0Wa*0 z5@?K6hh-)kH9JN&$g-Vycf;t)4z2df;9VZ(r3=<0);QLJ4>~V074Yh!i5RM?nqKPN z-(EQpv_;fTHZ|_Xy|YaC`(8c#DhpvxZ**Q{DhrMH#n6k9YV_j(2me7!)8$snE>nMe zSgi4Yw&uaS^zf%PM)M+50k4DP^J==ys+i)Y{b0`dIU931WePF|rG{V*^=?Czu*LLw zk*Ry6rh*>I_Sk-J>82;WucKEL#{F?TX_G~ zp%AyAtZ>6Vl@HHX7yQECW9vVJDlYEnUSulZq;4X4^Na}`{T;NLl3*VoL`|6L4w z)&tjTofcHFV&@LJwLzu=UikZ7MyegUa`AE(pRZ8)X(-O+6nFEJW+>QMF|YO5nFcg= z1~rOI1-$l=t6mxl3~#tO!l^qZ`1YWKv{K@5(<0mpzbh9u0yW*d$W*|q9eOcR?L8gm z_tav?LXlqo&*~i+TSfF&c|tEEP=m3StOh>lyvS4*8oO0!B8IB=a;=aZ-)>HsW@|K* zepZl}Yw-em)&q5ZWjIu^t4{YKQGt4xxR6|R@%ho;J(ew(m3SJl%^-1-w3zs|LERKhR9+ zDbn9M_s;_knq5~ETM|8 z<$qRzt4#bC2pFjp>`$zA49fbu{?fx8qD~bbshJ-Rz-*XsKreO%r!O)U@WOu50~#Y$ zt)tKY=TLIR$qFUv?)h#X8>XQ>0V?i;Dx`pVWe`eyR}FuP2z3uQQcXE@A%(FM@E#w>!sxa zN63ji4baVtLK zs&!3<+eIE6R5Y;Tjg9ubx^W|$;%t~hb7rVgbeir(rUG88$yHDGF8olRJfLH#?yz>@ z3I$<(i?yI?V%N(YKRNU<*kQ?3z$*ZHF;d0eQVtHiYtqs@aJSjPWb0z!R&rH&+i|Tl)0FDG!aXgUR-R4zV2b^HX|#2Sd$EA3O20P9RKN=x8EA}D zhi)=&PY6AD`^u;5e1AgPjy0-Y{DbH4AE?qy0^fA&kW2-%9FjlTCrzXaJ}#nMd6$TQaUd(m4!ws?!`#8a6#Yp?)k}cg$GTNE-ZBA-+bh) z4?eG5v;i{wxgMDcc$Jf@ZXD$A9~xm0N+=tFgUBxy!fF?V9#_fG8OQ`&V`^cQgODAROG)LTJ2}V8qL8w(zfmHS#alL zUKaRM8@oD?(#?xZWudVLenECq=9=9|a$D zUSulZg`X-JsdUoUS^af+^^=8Ck?W8WbA~d^n+Ux&;Lore*eQ(8i%bQ)zF^}6&w310 zhOb{9SmJgkP)$Tw@N#VWi0^hee9dprgDNiUDTmIBOl6^wHiuj#7I86h;_QXqfBM{y zU*fUPbZ_d+1oHx?N}FF$#lhelMWOQqA8Kb=8u;bMnL44?nd(JnBlW+XH@Ph^=`mUZ~;%CqH^GG8OQuC0B83 z_wC@ixbbmXkV8h#1H*g2tUnLpImBucXe+Y72i?3#R9Ft5(nJhZ%l~nIw*8NlxR&Sn zEb(f&5jz$&TigpiFH0Tr%;FYdOu96Jw+jxTQiMsZh2diFgOLnwb7zXM)%?s?ASbLTVKIn2tqQboJ z6~#y;bo$G$+UvP1gg?i$WO=UTdUkoW0Q9nxr&&=}BLs74X_S0lgThwnn6ShbTQ>Ie+P?o%MQ_Uq#Zl;q}l4 zJF9`lk_JBLa!97K(8zS6i5RLZMr1Y|A87DU?>DX0# zQvt7wxEBLe^FzZ|RrQnYW8*(s#CG<^F1vhr7VZ@SRg3?b?nR~oUT?@%Hrih=wDxb@ z)^I!7UHn_{&hd+3;0cO0uQgD`hOH609FnPk*IRN`b;ZZdrlhL30~Zo(g&IeA=U4>1 zz`a7Dialw%7nurpfoh61MymHoo0L>e%=^*zE-v@EV3F?GBUyMov<1&$SmVJ)N;fYu zm4yaY(6Gix#oCsXr@6|x+*;+tke54*%9bFakDy|%GXHJf?57nurp`I4(nbw8p~M;6~woIkPFS8k_~sC772 zH?TF|4^`~gIgxH&WGdj*O|H6ZJmFR9X7WrW(81K;-C*CjZQ@|nVqSKapo$IKpXt2F zR2CZ98sw^iNB(!C7u4?>?zi8Qw!%cMQs?;&+zUPvF>RBa?nR~oUhy<9hN{#??s+Sd zv=y6@&l+Bw0ZreshG>KU7c=TWGdi=osz+!l9B3bXlDV>4Q0n!p6THo z(Hn9TZ@PiEJD8U}+=)16=S=tFd-dtM@M)nUcHYF|;B(L39F|*-zk#s_l>jv1&|TA2 zWL{u|@ZHyc@VP)*u8oW4|~TgIemOy^JpVvrtM>NIV4j7uX1u# zUz_&@^%(!zer5t6q(46UeXdX$oIPndWTL64*BG2d$yC4#o}(D5UVFUyVxy?@boS2& z`e-@3_EV;+G|p7SH0cX~#q%iO;JMuv^hxrnCP|6Uk; z(`DmHN`U8BWy^)GV>jAYNAOZEb*}?^KBjWmLQ_$6J^ptUm>0HhfyPJ`v(LzBzA~q( zsB`u{(eAjol+*X{>*WYm7HHh3&A=z!2+35y>pHp0ebalh;x3aC%{}k#Eogh5ZoM!A zJcVNOvcs+uXeBJ*gU*Xg1-$SY#YnX@s($hwt8yZL-kKaI!QY~hd8Ing%N~E?ScqM1 zIxjL6@OliQL1U!4`G8~hnzADeSLcfzR4uiNIkdZeJ?;hGOM%99!yA0kd6BIs;02%P z8LlWYFQ9r(?nSl^feKzPhU>6TFJ`@+=!$m_uN`^Z61y(o(i;bmGwgaf%Fw(hh0fFG zMWzB?*t>Gj7^ytCM0~}Mw*FXnPWffs6Y7J7eTS2vmjkx`z#qGP!6#h~$yC7W8@XyC zWYLXMtw9GlfOp095E`To*b zTcYM%1Ww7cdl^<6iaCROnM`G&v5y0KF;Zo{%fDh|z?vwc#$|M0W5d^{?LNzJuQsSE zuA4qDG8OOwyC2pVsoqb0ND}UM-?ZeH_Hw255gkMM-k_q<=9LUpu1~=?-Sr|<0k65_ zDh`)V^X^u?3AJvL+P=kKP;=RtIpBPOJ%71fhAJxSbT1MWcuv_TO|F`&um6nyc|vT$ z8w;NN0P9$`{0&%*!o2oF)lt3aUO|+9hJOyR3p7L?m)P)QyOH+hQEY@*#fDXsb;xPD zYSGf$%yIX49bdX0f4NKb*ol?rnm{zBa>jlJ0RCA2aJq_QgxI`R(o_^iBP8=eDu!NU z^Fk_y^YSp|+fKj{6&c~Gt27n$tlV^!b^Q9v z0#VPM{%gf53Ju9C7j7V$FVpZz*L{QC>bB%SO&UIfp0wCkl! zQ&Aerr+bm9fR`P)>aSZtZI|kvZN?U9(iaqd_Mgr>4LoSo2HzdD!5%|DulBo-UTJs> zA5;99Ix?$5$0)z~8rV^3D)7bvv{_r1Pgjw7fe|{=R1`*DmR^mT2~W;D9m+PnW3(^! zz{g>`BhbqUyRSe?z7Ia=GQVQIiNTZ5h*Gu06IG|m&u-dy!VlcL*a)2$(L_{}o6}Wf zUSNdyPgMVl7g90wBFiCAVJ9Jy9JZ-_Jz>XI)c8TTf=j#c%=rkrdmrGuT-|6YO4oVt zO_vQa74X7N44^SmY0KzH+?~7fZf9-aK^&4ne1rq|r1Nr_*Rt}t zxUWSeIe^h}HhLEeyoFCSVHL3W%f5Ty8Yo?+nZ{tO4 z@U<~aQ!zbMpYBz4h|(QAyv)XZ_(n@uS}{v@roahYRZUY-pSS$)Dlo$B|b_EF7HvQC^%BQZI<3?{++ItH(J0u zJlc8V7fr>xBVzizNW8Fmh(&`A7!tew{wrY)U7DcR7=!(bM1_qogx}&ud?H3niu8jCGbs`jXm-6|NJiJSbW9x>DN0(zRi1gYy_ucTE%`% zQ&D9ZoKncVzz7TfyBAOuk$dIDhiS%)+b)uRA@D{b)h>2#L1QOALN1z$`6RZo=;n3b ztJynNdVAOAFyRE@zrx!+Eg!tbv!O&&u^1emt|IdSBP^q-{*xC_VJ8OggAqnvy)KvX zJmpzSKBc@-;{0iCOg**~)C*eX!4&|Fi-`?<(#^}mh>1(y^TgxJEq6YaFPD2Ddp7Gg zR5``aR6Ki`rmOaeZ9Kdq=_Ge88&{mnw`93pFD1Z!jCnc2ip}c=p4I8S$VLd}b&Tfq zpGF8&px%S_pGF8&Cuu5%Bg}4QjeOyM>X=Bt@;hRmq#t}6{5T)X3!FtgvAqPmxn0cQ zy^YS!CvQqu`H$M}%rsb3WYuZ2((X3QhAZ}rN1-^>cYsg2%FuaI-fplkEa7vtUS;Ftfna+$FGnM&5(m$; z^s11p{v1)+wNB#)3-y_*^VtRGQw5;PWhYI={D#5li_8nm3#@&tG4djr7q&J)4aORy zc?E<&(>Tt;Sxue&rAh0zGf>IP83lLN!LA-zRuPF=`1b;II#&eYR?bZooq*TU=Ngq<_Mzc|wZ zYBBv)=6kY=Z?r@-RCn%()t=m2+`ep&)$kntrKu<>LDN-@y@m=ZeP5zw6yjW3uxvb|sTg{Z%?qfW&{PcPMK(g9g4tj=LLr&SCwdhzM|N`$ zM<|H4^V$FDsDkryg?EaQZo>3=eO{WRYdp2gm-=<~EcN8oezQj7%Av~f7Hxz=i;Mqv z6&T?=auwMKfePCdC=`Yxyt3U)V)2d<@&0z#%xXS|k7^QQ>)=)P!uDhE$7R@hq^lbw zD(rfF{l6;kAhC=a>x5~Sv7f)l1T4%H;#Yb^mePVLZ})<4Ir!(9&zTI&WMC!(GZ~o4 zz)S{aGBA^YnGDQiU?u}I8JNkyOa^8$Fq46q49sL;CId4Wn90CQ24*ralYyBG%w%9D z12Y+z$-qnoW->67ftd`fhtPX_Rv2FW#7%-en8+$Kbyebf}Nu%qyfSqEym5;3QJ75S)e8+rLbQ z{{rNj2>h3YtDR-x$9Nscb4Q7Pz+(ANK{&e;{EceLMm5B(zAqAWzu^qyqi-VqP@jd@ zUI_lyCdIc0@yFs$FRKFZzu_jlkl?IRq2CLZ?E3}#u}VXHU3Tr4rD9W%?>dEe>DG&{ z)c1kkqQsipZ^Zv`b+|1blnr^PH^JGO3;4V)8DPJ02HO4+#M?y+w@u}N-^IdOegMJQ zZ6#lSGw#LzHV6wj#61Sr`Xs)sf$`hh5I-w>{2EhoHRRilBR;f7(4Wg1{7x^{j;tg& zhnjhaS=m#3oMxvHKM{D^FN~jw7EWClhIsc~mVK^HjWkXvbVIy%iNfoPkD_3_v>?Gb z^{WrA&B)h=@c|x)r#CTgYDs{panliylLXtpylog$j!wF zK8u5^c=LjX2WXrsdjWB+58*FG6ks?dstIwE?B3?|mGHMhDaOf&7jfUqkm9@q1zXT{ z=l1lnU*Md71o9-5f9@@t_eN{v!r$DYBz`0M;ZDvr{YTev4K1E3hkSXqRirvL5ATQl zoYN)Zc}^Vo;B{^T_{}1$d8{S)Y?F-QXqU=x$d7svoVP6P?3Www%pu>~jd;@yjj?}D zZG^n2jNp8ljV#jonS+q~TM?X}v#9x<=tKM$cMhTT%)hzO{nWu(;J3xFW;cf7Pbb`e zbv>;Y^0PSv7jTvR=VE6W_M7scwQ)6#Q+BN-;^)YCFu&%CQia?x4)LGoFLlo@*#&vrC4viuT+Im-+k@XT!8}_e05^j-@gHxnLfdV=O1Y0$a;(Cxf-p15r4tDob$r?y3M#s z#EVqhSsS*0{6y=9D#Sx@(RDhi6>|>8(m2J}mCH-Oyx-}tXb?|ApG z(}BDIt;6}0p*Rcv5IjGAs1D3uc80^!i-!fqm!tb)zIyUlW!V!m$jb}}-}(JdcPJRP z!uymeg6fR;xwO&pXJ_#B8SO&EODHbtb+yyQe%lwcY*fc2Hv38qsVv8S(-SneY!v@~ z{7?9g(Q}Z;6Zo$rC2!Ardo_6)r;67T|3H#0(Jr8)GY!V)Az#Uh)zxi0NAUb?4kF^E zQn-vqp0pi?@mAslmzGPq)RE|nU&o#8h+k!O*vrnd62?dR5qyEP;&~lb6+Ayj^AL9% zc_I108^7-5HUyW^lZ^{|;VKOKDZhfahsjAv$HiQbhbtrA(xC16hGGSI>JNf1TyMwy zhv)e|$RiRE-~Z;-v+g4%kUOC~FMM=&w)4edU&zx9iFn!by=}dIX38{9l~hFhr}RV0 zmc%+3e^7b>HFmd9F0Y}pifNA|KjihLh2m9L}4Qzh&W9~(^1 zDS8RVPubH&a0TAM1GT2_nPLAWXunVp88$pYNx^wQCyLj3y`jYQ{$m)w8`UL+Eq?;j zsB@$sFCIYg(S^?U-_DALe2*96xxrKHi~N>Do{H{Yh4I6$Bh>^IA-B3h#4k09mIxkg zhQD=6F^fd}&Oi5LziG(8_!BP)uBblTcF1QO?)#J+EyVM3eod6|EP?T+sE#S#D$xz* zH`z_&)Olz;ihsW^=6m!l2=5=ATa=b4C-eGO*h8M1Nc681Y%-$` zCcqw_?>0>$UO8~3!?(|oPB7lP2Js#Kd$h(AVBMxv#vuOK)jj^UFkY9e(REx_arxm! z6QcsyPlON=uc9IHXjLgIUQcq(5ib?pXcjpauUAgeh`*{ixlKzHueUbO5g*v@-+rKq z4IgJe!BvIsMLjNk4u8v;;%bVxbCf~!-G=utJ|+NhU#+W#qqX2S=dtEqjCk&V{!mQ< z%o}xXGr`pa&fgYJ_i%;r`%(XD7n8KZ)OR#NegM@y_3PJvOo*j^h5R(?U%m6r`I~VT z`1UlGdDKcXUruZOx*h{s>i{&V^? z{@k%|6XL&BVt5@+eSrP%D0#iI;yzg>?ulik3rDQ%E z_Cpmy_m_r!n*z`B!(uQ#b`}x8nwzsHzA^;j;Tb<|I1`N4R5v@dI}Jt?Tr za0g${?hlE0&G+lWIJ|O&U_2WBU(Lzho`@$+c>OQDMZ~WWNcp03SL_OmcO60e>+2&@ zCI)*U54lQkZJF`j-a|e3xjoSe@uA6>ccqUX!T8N+zt;Zv&CpC{dkW;WX#ZWy9qy&f zAAldMLnMiQ)>`hqsF@s~3FGTH5&sy$shhYK-}lW>K6O@XxinCV{r8Qq7I=n;*D*c( zK3P=dDGgKQT@W97_l9YcY8j1FPOA`Hw?1I&akGUXFkTMbce+>J?AjD(g|BmYSt4Ff zb7`p74i)^oRDD|U zKWo&c!*TjpB7R|)*i%ZlCFB*Ahz|+~sU-E{=bS2Ig6q$pnw0o{wj0Ku+JyKKrlGeJ zW3wT*=p^_$=h%b1ul=)*|B9A77Gq zbHyaQzSM>P@}aS)s7>7Xc{|$y#ZR4GHTzwmJM>KzC%B<}(B-Xa9TAWpLhHd$|JKKN zY1v`Oi}i_kquPPoSVg7Fkh`MmV)XHH2y^4*QOIj95b?&^XZtGc<>9_bl~G1~tKj$h z#>{yA+=|XK#%F&?DhGzmg8f*bbC+>LZ=(>KI2H0V4b)HDIi5w0U*Y+LVnX1*#zX%c zZjw3IPm8CDDG>j_WDeh(()+JDVLuV*el*GDY&m+l1AnfGOGfbzel?Vbx50HzDgQxm zQ*qVT1rrDHJQOZQ+=H#|LdpI?*uM|z$F!02i1vs`CFCYpG&t~K|DLhy{>5W5g5NM6!HA@K!D-_ufoUl-dL#Cw+2jmaOx z>&a#+!8hzyKVab{a2@tjHi&quKoQ3!Gbb9SilY0}N-U>|{gD;?dxI#s!bH5)MWOri z3y0zJ4s}is!L4=9JY>G=0naUzATPvEy*TH$%YQ!Xe=(}()&rLwJ;-jwpL6G;dTX=% z=HX~h6+t-89aTg>Hn+T}iz?bllZTq^&o;|YxS97R0KPeqezgP-$_A_#6j zJMUeJ@)i8Pu6$2$2lEZbSc;8D;CRHk5Pu#ry2#r!5%zDxOmN3Vve^Y4e8hR6m*7sy zZ8x$C)&#(K6SV$a_&(d~$;u@|?psF0yXa7@dYwJtx~0xX{kyDVjYue7g|EXv10vp4 zt>=#0@8!X;A7@lI+-A2{SZ@q|33;Lz5%0Ffi9f1u-%rR-`yswjbjzAuqQ;QhqCB`A z@qXDnHHPmO5vX3dwIycfNPNS6^VNuc+)Y=l`ku{(@8dyv|MDCu?^|4(VgGgLess4` z>S)cV&W8Lb%Cq}69f5k)8*m*`?7LAv?LKZL#qU*MeAWkod#IGo+Vk0i>Hlf(%%iDV z`#641#~3A1Ql^`PD2kM!fryfnBttSgC}gNejv;aj2_Z!#k@=>pZY6PPFx5>`(iKIQ z#7nJ|Cf;Z7XP@1B&)LsfwcdZvSxbAZZ_nrX{(isxJkNg4-g~VB^)2LhbIRgdEjM+E z2h_L9lkEp}+IIOR210!YSqB&OTPhQ~r?H?O`;^_@#gbLoF#FnisE1jQ`sOqbwFN=M zcq{ut>dtP@od4N-25(PS=p^-Ble%0Uy@Ts5ttgSy14SJYjox&_{(~Y&z0l9=PG-Ln z>_B1$0-v?1$~wr;>VhN1RpaV)pgLoUOZ=yEN+mahw>pUU8)Uc|?)czV|)s z$NG1+?(P(-aZg2YF7%Zl>*>x~p1yGD;0oBDMb0A+kMMS(<~g@vdj)=WKOV;lod%?H zx54%a3)#A-!0@4d7@x34VhUoM{A4|6}? z)i2U5XJJ1TBBXv$q@6aYnE1YSnjHVk!u|8t<@6JA%J{R}dzr6K&MR|)`zu=hM^gW^ z=47v7lR50aoLo=5_eAMAq`QBGdLen;@jhkH&bqpU*hkrYV)x@cB5pcO+ndG?|Mhwi0u1xMfcZGzd%ll5i`9hb;Bio;U;rn;kGh+Qb zkj&P7bF#+HZD;Yr{%zbyeY~?W+p3kA@2pa`?pLEXZG7V671;hPxt{yAoMcuW@mquI zbQN-c<@Y}7^!9@-#QhMLZ|r^oL@t@;z8Rkd`w1rV4cMYm;_Jb5fx4{(yM3UL(c|ZB z7wVy2Iz;NTYnr|U2(yg-})!n{K8B^H;>RC(K?ZdZP8f~i!)4_GRoII&d&^^c8x(`ELrI@X= z_>P|!3;eK^Xiu&WEcFnUSU@vzeh-t^Yu3Zrg}$o6#P!r&n(XJ{eK)fidg?HqP33Go zBBidcW;kCS>d~QWoqeRyWD4Q`@&4sifL8%t1$Y(URe)CkUIlm+;8lQE0bT`o72s8X zR{>rHcopDPfLDS4rvh34UI_k_us=ypmB+GTHVm7ife+h~9n~4;mNMWjApUDX4BTbr z=d<9*@v8)>8~9rP8lGhzDb!c3tu-e!XmU2Vw~hY>N;yu^m>t~IzV3H6ho|>C&aaby zB$d0wBvz=T3wqhfU|z1mIHg*Ry+80{ z5rW@MNQQTHDI>hMju{to%cmeDOMriQ_l(sNl}6wlB0R5r+>5azk=qNE*LN?fyl4;V z?kkEn^!NqMO+07smwBl;+8~5G z|7``L8a0qoH3UbF2=6=ebu2PgR~nSO>)GVo6sc?&7)Ipv5~t|WSS>jyloyC_=1+TJ zc|nTO3o&{zY6|W}IeJlJ15i_OigIks%*?)jXE0qX`?kSeA!(f|YX^%4qK36FuP#3*&;S+q01>rX|WX;_pO^&vUH-<$MUT(OT{pdw*uUP%`*54|_#+o%( zy=1-i(#a8>1)ingt4$V8@iUUSsaGEwUp2BCOXO;!_n%(qQKsVE2v!%IO2;XYe(VV& zM_wo|keBMudjSeQt)cYVc;#$q=~n%Zb`$;H%3c2YF$wVlAVO@7f?j-2uxC0P5k4*q za_6(pzjo?f>ut~6PqCS`4?#ZoYC}Bf@sZ@F+D~X0%<(=TvXh}rw`$4|zj4p^6;X{| zJTIETYHkYQg^fevY1YqpeW$3r5Y_nZMOlsHGgHQ;H7dH@`Z^k)_l;GaoF7<-S7SpQ z@%+^|k~=R1g?Z_K*5G3t3I5@z{0yBJ1>d$VtZ|xtc_ccba#2rP!6{h7?br+fpD7gM z5JdqmBQ)hN8FaMvbtg@{XH7sv{=6KqBgO9jI$wMju=hYXB1BQZ%LMnLq=uwd9P0k< zShJ#0*|RHwAlg z$`K*L3#+^t9wCj&3$<aSl|C=1)y1Ub9*5u z%*z%FjYdhy37nTxW8U*muFgnxGF7c#Q!*R8fr71v_BJ>qFxCT(9C@KA;N^g(G&Wg@ z9=VzCUzIq&H>$O4^iI%aFp}`K*B7T4CfJd~3q=7hS2Xo%x0GT3=63xZZ?`QU+Ys$= zt_FJ}0MF|nPSG4QxxG*n@bW}cQS;SIMFB739Wp9vho&Cm!A9n zOUKQOss*oX8_~(yaCvT;4e^b`4ekMGZ)3T=5ESNxwFVz5N+e2ukM8Gxw(=WxBouw~ z={)r4r3S3wc4bJ-dJB#m^9w}*FEC@U4;2;bdFi6AY_@Uez+4-XJ42?!QsZDxjnCyJ zkopR~`*C_LJN)!>$HEmR3FhaXYiFBj8l%b(bkcWM|0Sk9|A zcaaciJze7gBeZ{sQvym9dr>~E#m-sb{o>;fV!OLqHpQ9GH~=b+uWZEkN`XtO zgeTEndQGPM9*brwdf1M;+LuA_CiGnyuc0ud>B*_YKhG? ze$Aju7i(&MT{SdR&y;xDOn9~7l$6kFaO4=hhzPNnl8sZ85xxnx%(H&~t-hlv^6$Q$ zF@bNgwa;J;?XY}kG(lmCeN?KHnCJTbm3Kv#?omr_3R-n4vicaLwz=RGy+sooIU+>l zg+-WyQz%$V8}Dz?eks%nY1#!iJJcA}d{{zFt_0H*{ER&nPg z-ND68@GNL%Hh-3JV22k_^v70)iwQtMJA zYN(4x$k(%;JFjmaqE0w%YPT$LbsW{uzVf)q`xLQTb^uoi@Zk$r#HgR~ z0@O`NQF%Fk8ORgNw3T-?{yHJ^<~n1`Ae~s}9q{##KKIILKy!@w#C4fIYnC$w-Jdj? z$L8E>{y6UG2&w_r4VM<&i(a?jhbe5P+(J{`PaGLTA9^2nsmJzTV!GaVuI(KTEAN0q zG-1CyZZ8xCyq@D2B^BWC`Pmu$G2h&z9JP#!qQdBSQ*1p1qj#G=q^|Gc_Cis>>kFDf zRUS~_PA71sth~(v+lZ1Lzq`Zlo<(RhSS#IeR{N8vJn;s0DY!GpdA<-7sC=pl9wCj2 r%3;PA3Rb6h%f_7<)_#!_$4E-CgI=y+j9?#8iuDjdVP0U2e5d{ku4}2v literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/dependencies-accessors/gc.properties b/java/demoapp/.gradle/8.9/dependencies-accessors/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/java/demoapp/.gradle/8.9/executionHistory/executionHistory.lock b/java/demoapp/.gradle/8.9/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..a87d2fec63e011ed63f85177a97f0e05b1312f2b GIT binary patch literal 17 TcmZSPw4S2cYJ6=n0~7!NBsK#g literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/fileChanges/last-build.bin b/java/demoapp/.gradle/8.9/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/fileHashes/fileHashes.lock b/java/demoapp/.gradle/8.9/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..7e84b7612e89734dd702a97e983ac907a05c99a3 GIT binary patch literal 17 TcmZR6_A0aZ%nj8!3{U_7LA3=H literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/8.9/gc.properties b/java/demoapp/.gradle/8.9/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/java/demoapp/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/java/demoapp/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..db102ef1993fbcf4d4a584634cd387308f706c88 GIT binary patch literal 17 UcmZRM+nL*VjwkIn0|YPv05YZo5dZ)H literal 0 HcmV?d00001 diff --git a/java/demoapp/.gradle/buildOutputCleanup/cache.properties b/java/demoapp/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000000..cea8d84fb6 --- /dev/null +++ b/java/demoapp/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Thu Apr 02 09:44:30 CLST 2026 +gradle.version=8.9 diff --git a/java/demoapp/.gradle/vcs-1/gc.properties b/java/demoapp/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java b/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java index a1b7ed2e49..ccf44b4c17 100644 --- a/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java +++ b/migrator/migrator-servlet/src/main/java/com/google/phonenumbers/ServletMain.java @@ -107,7 +107,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S e.printStackTrace(); } - if (!isTokenValid) { + if (!isTokenValid(req)) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid or missing CSRF token."); return; } @@ -142,12 +142,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se String fileContent = req.getParameter("fileContent"); if (fileContent == null) { - String csrfToken = (String) req.getSession().getAttribute("csrf_token"); - if (csrfToken == null) { - csrfToken = UUID.randomUUID().toString(); - req.getSession().setAttribute("csrf_token", csrfToken); - } - req.setAttribute("csrf_token", csrfToken); + req.setAttribute("csrf_token", getOrGenerateCsrfToken(req)); req.getRequestDispatcher("index.jsp").forward(req, resp); return; } @@ -279,4 +274,36 @@ public static ImmutableList getMigrationResultOutputList(ImmutableList sessionAttributes; + private Map requestAttributes; + + @Before + public void setUp() { + servlet = new ServletMain(); + sessionAttributes = new HashMap<>(); + requestAttributes = new HashMap<>(); + } + + @Test + public void testGetOrGenerateCsrfToken_NewSession() { + HttpServletRequest mockRequest = createMockRequest(); + + String token = servlet.getOrGenerateCsrfToken(mockRequest); + + assertNotNull(token); + assertEquals(token, sessionAttributes.get("csrf_token")); + } + + @Test + public void testGetOrGenerateCsrfToken_ExistingSession() { + String existingToken = UUID.randomUUID().toString(); + sessionAttributes.put("csrf_token", existingToken); + HttpServletRequest mockRequest = createMockRequest(); + + String token = servlet.getOrGenerateCsrfToken(mockRequest); + + assertEquals(existingToken, token); + } + + @Test + public void testIsTokenValid_NoSessionToken() { + HttpServletRequest mockRequest = createMockRequest(); + // No token in session + + assertFalse(servlet.isTokenValid(mockRequest)); + } + + // Note: Testing isTokenValid with a real multipart request would require + // complex mocking of ServletFileUpload and FileItemIterator. + // For the purpose of this PR, we've extracted the logic to ensure + // the core session-handling part is testable. + + private HttpServletRequest createMockRequest() { + return (HttpServletRequest) java.lang.reflect.Proxy.newProxyInstance( + HttpServletRequest.class.getClassLoader(), + new Class[] { HttpServletRequest.class }, + (proxy, method, args) -> { + if (method.getName().equals("getSession")) { + return createMockSession(); + } else if (method.getName().equals("setAttribute")) { + requestAttributes.put((String) args[0], args[1]); + return null; + } else if (method.getName().equals("getAttribute")) { + return requestAttributes.get(args[0]); + } + return null; + }); + } + + private HttpSession createMockSession() { + return (HttpSession) java.lang.reflect.Proxy.newProxyInstance( + HttpSession.class.getClassLoader(), + new Class[] { HttpSession.class }, + (proxy, method, args) -> { + if (method.getName().equals("getAttribute")) { + return sessionAttributes.get(args[0]); + } else if (method.getName().equals("setAttribute")) { + sessionAttributes.put((String) args[0], args[1]); + return null; + } + return null; + }); + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/BuildMetadataFromXml.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/BuildMetadataFromXml.java new file mode 100644 index 0000000000..c6ce40b700 --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/BuildMetadataFromXml.java @@ -0,0 +1,783 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * Library to build phone number metadata from the XML format. + * + * @author Shaopeng Jia + */ +public class BuildMetadataFromXml { + private static final Logger logger = Logger.getLogger(BuildMetadataFromXml.class.getName()); + + // String constants used to fetch the XML nodes and attributes. + private static final String CARRIER_CODE_FORMATTING_RULE = "carrierCodeFormattingRule"; + private static final String CARRIER_SPECIFIC = "carrierSpecific"; + private static final String COUNTRY_CODE = "countryCode"; + private static final String EMERGENCY = "emergency"; + private static final String EXAMPLE_NUMBER = "exampleNumber"; + private static final String FIXED_LINE = "fixedLine"; + private static final String FORMAT = "format"; + private static final String GENERAL_DESC = "generalDesc"; + private static final String INTERNATIONAL_PREFIX = "internationalPrefix"; + private static final String INTL_FORMAT = "intlFormat"; + private static final String LEADING_DIGITS = "leadingDigits"; + private static final String MAIN_COUNTRY_FOR_CODE = "mainCountryForCode"; + private static final String MOBILE = "mobile"; + private static final String MOBILE_NUMBER_PORTABLE_REGION = "mobileNumberPortableRegion"; + private static final String NATIONAL_NUMBER_PATTERN = "nationalNumberPattern"; + private static final String NATIONAL_PREFIX = "nationalPrefix"; + private static final String NATIONAL_PREFIX_FORMATTING_RULE = "nationalPrefixFormattingRule"; + private static final String NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING = + "nationalPrefixOptionalWhenFormatting"; + private static final String NATIONAL_PREFIX_FOR_PARSING = "nationalPrefixForParsing"; + private static final String NATIONAL_PREFIX_TRANSFORM_RULE = "nationalPrefixTransformRule"; + private static final String NO_INTERNATIONAL_DIALLING = "noInternationalDialling"; + private static final String NUMBER_FORMAT = "numberFormat"; + private static final String PAGER = "pager"; + private static final String PATTERN = "pattern"; + private static final String PERSONAL_NUMBER = "personalNumber"; + private static final String POSSIBLE_LENGTHS = "possibleLengths"; + private static final String NATIONAL = "national"; + private static final String LOCAL_ONLY = "localOnly"; + private static final String PREFERRED_EXTN_PREFIX = "preferredExtnPrefix"; + private static final String PREFERRED_INTERNATIONAL_PREFIX = "preferredInternationalPrefix"; + private static final String PREMIUM_RATE = "premiumRate"; + private static final String SHARED_COST = "sharedCost"; + private static final String SHORT_CODE = "shortCode"; + private static final String SMS_SERVICES = "smsServices"; + private static final String STANDARD_RATE = "standardRate"; + private static final String TOLL_FREE = "tollFree"; + private static final String UAN = "uan"; + private static final String VOICEMAIL = "voicemail"; + private static final String VOIP = "voip"; + + private static final Set PHONE_NUMBER_DESCS_WITHOUT_MATCHING_TYPES = + new HashSet(Arrays.asList(new String[]{NO_INTERNATIONAL_DIALLING})); + + // Build the PhoneMetadataCollection from the input XML file. + public static PhoneMetadataCollection buildPhoneMetadataCollection(String inputXmlFile, + boolean liteBuild, boolean specialBuild) throws Exception { + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = builderFactory.newDocumentBuilder(); + File xmlFile = new File(inputXmlFile); + Document document = builder.parse(xmlFile); + // TODO: Look for other uses of these constants and possibly pull them out into a separate + // constants file. + boolean isShortNumberMetadata = inputXmlFile.contains("ShortNumberMetadata"); + boolean isAlternateFormatsMetadata = inputXmlFile.contains("PhoneNumberAlternateFormats"); + return buildPhoneMetadataCollection(document, liteBuild, specialBuild, + isShortNumberMetadata, isAlternateFormatsMetadata); + } + + // @VisibleForTesting + static PhoneMetadataCollection buildPhoneMetadataCollection(Document document, + boolean liteBuild, boolean specialBuild, boolean isShortNumberMetadata, + boolean isAlternateFormatsMetadata) throws Exception { + document.getDocumentElement().normalize(); + Element rootElement = document.getDocumentElement(); + NodeList territory = rootElement.getElementsByTagName("territory"); + PhoneMetadataCollection.Builder metadataCollection = PhoneMetadataCollection.newBuilder(); + int numOfTerritories = territory.getLength(); + // TODO: Infer filter from a single flag. + MetadataFilter metadataFilter = getMetadataFilter(liteBuild, specialBuild); + for (int i = 0; i < numOfTerritories; i++) { + Element territoryElement = (Element) territory.item(i); + String regionCode = ""; + // For the main metadata file this should always be set, but for other supplementary data + // files the country calling code may be all that is needed. + if (territoryElement.hasAttribute("id")) { + regionCode = territoryElement.getAttribute("id"); + } + PhoneMetadata.Builder metadata = loadCountryMetadata(regionCode, territoryElement, + isShortNumberMetadata, isAlternateFormatsMetadata); + metadataFilter.filterMetadata(metadata); + metadataCollection.addMetadata(metadata.build()); + } + return metadataCollection.build(); + } + + // Build a mapping from a country calling code to the region codes which denote the country/region + // represented by that country code. In the case of multiple countries sharing a calling code, + // such as the NANPA countries, the one indicated with "isMainCountryForCode" in the metadata + // should be first. + public static Map> buildCountryCodeToRegionCodeMap( + PhoneMetadataCollection metadataCollection) { + Map> countryCodeToRegionCodeMap = new TreeMap>(); + for (PhoneMetadata metadata : metadataCollection.getMetadataList()) { + String regionCode = metadata.getId(); + int countryCode = metadata.getCountryCode(); + if (countryCodeToRegionCodeMap.containsKey(countryCode)) { + if (metadata.getMainCountryForCode()) { + countryCodeToRegionCodeMap.get(countryCode).add(0, regionCode); + } else { + countryCodeToRegionCodeMap.get(countryCode).add(regionCode); + } + } else { + // For most countries, there will be only one region code for the country calling code. + List listWithRegionCode = new ArrayList(1); + if (!regionCode.equals("")) { // For alternate formats, there are no region codes at all. + listWithRegionCode.add(regionCode); + } + countryCodeToRegionCodeMap.put(countryCode, listWithRegionCode); + } + } + return countryCodeToRegionCodeMap; + } + + // Build a list of region codes from the metadata + public static List buildRegionCodeList( + PhoneMetadataCollection metadataCollection) { + List regionCodeList = new ArrayList(); + for (PhoneMetadata metadata : metadataCollection.getMetadataList()) { + String regionCode = metadata.getId(); + regionCodeList.add(regionCode); + } + return regionCodeList; + } + + private static String validateRE(String regex) { + return validateRE(regex, false); + } + + // @VisibleForTesting + static String validateRE(String regex, boolean removeWhitespace) { + // Removes all the whitespace and newline from the regexp. Not using pattern compile options to + // make it work across programming languages. + String compressedRegex = removeWhitespace ? regex.replaceAll("\\s", "") : regex; + Pattern.compile(compressedRegex); + // We don't ever expect to see | followed by a ) in our metadata - this would be an indication + // of a bug. If one wants to make something optional, we prefer ? to using an empty group. + int errorIndex = compressedRegex.indexOf("|)"); + if (errorIndex >= 0) { + logger.log(Level.SEVERE, "Error with original regex: " + regex + + "\n| should not be followed directly by ) in phone number regular expressions."); + throw new PatternSyntaxException("| followed by )", compressedRegex, errorIndex); + } + // return the regex if it is of correct syntax, i.e. compile did not fail with a + // PatternSyntaxException. + return compressedRegex; + } + + /** + * Returns the national prefix of the provided country element. + */ + // @VisibleForTesting + static String getNationalPrefix(Element element) { + return element.hasAttribute(NATIONAL_PREFIX) ? element.getAttribute(NATIONAL_PREFIX) : ""; + } + + // @VisibleForTesting + static PhoneMetadata.Builder loadTerritoryTagMetadata(String regionCode, Element element, + String nationalPrefix) { + PhoneMetadata.Builder metadata = PhoneMetadata.newBuilder(); + metadata.setId(regionCode); + if (element.hasAttribute(COUNTRY_CODE)) { + metadata.setCountryCode(Integer.parseInt(element.getAttribute(COUNTRY_CODE))); + } + if (element.hasAttribute(LEADING_DIGITS)) { + metadata.setLeadingDigits(validateRE(element.getAttribute(LEADING_DIGITS))); + } + if (element.hasAttribute(INTERNATIONAL_PREFIX)) { + metadata.setInternationalPrefix(validateRE(element.getAttribute(INTERNATIONAL_PREFIX))); + } + if (element.hasAttribute(PREFERRED_INTERNATIONAL_PREFIX)) { + metadata.setPreferredInternationalPrefix( + element.getAttribute(PREFERRED_INTERNATIONAL_PREFIX)); + } + if (element.hasAttribute(NATIONAL_PREFIX_FOR_PARSING)) { + metadata.setNationalPrefixForParsing( + validateRE(element.getAttribute(NATIONAL_PREFIX_FOR_PARSING), true)); + if (element.hasAttribute(NATIONAL_PREFIX_TRANSFORM_RULE)) { + metadata.setNationalPrefixTransformRule( + validateRE(element.getAttribute(NATIONAL_PREFIX_TRANSFORM_RULE))); + } + } + if (!nationalPrefix.isEmpty()) { + metadata.setNationalPrefix(nationalPrefix); + if (!metadata.hasNationalPrefixForParsing()) { + metadata.setNationalPrefixForParsing(nationalPrefix); + } + } + if (element.hasAttribute(PREFERRED_EXTN_PREFIX)) { + metadata.setPreferredExtnPrefix(element.getAttribute(PREFERRED_EXTN_PREFIX)); + } + if (element.hasAttribute(MAIN_COUNTRY_FOR_CODE)) { + metadata.setMainCountryForCode(true); + } + if (element.hasAttribute(MOBILE_NUMBER_PORTABLE_REGION)) { + metadata.setMobileNumberPortableRegion(true); + } + return metadata; + } + + /** + * Extracts the pattern for international format. If there is no intlFormat, default to using the + * national format. If the intlFormat is set to "NA" the intlFormat should be ignored. + * + * @throws RuntimeException if multiple intlFormats have been encountered. + * @return whether an international number format is defined. + */ + // @VisibleForTesting + static boolean loadInternationalFormat(PhoneMetadata.Builder metadata, + Element numberFormatElement, + NumberFormat nationalFormat) { + NumberFormat.Builder intlFormat = NumberFormat.newBuilder(); + NodeList intlFormatPattern = numberFormatElement.getElementsByTagName(INTL_FORMAT); + boolean hasExplicitIntlFormatDefined = false; + + if (intlFormatPattern.getLength() > 1) { + logger.log(Level.SEVERE, + "A maximum of one intlFormat pattern for a numberFormat element should be defined."); + String countryId = metadata.getId().length() > 0 ? metadata.getId() + : Integer.toString(metadata.getCountryCode()); + throw new RuntimeException("Invalid number of intlFormat patterns for country: " + countryId); + } else if (intlFormatPattern.getLength() == 0) { + // Default to use the same as the national pattern if none is defined. + intlFormat.mergeFrom(nationalFormat); + } else { + intlFormat.setPattern(numberFormatElement.getAttribute(PATTERN)); + setLeadingDigitsPatterns(numberFormatElement, intlFormat); + String intlFormatPatternValue = intlFormatPattern.item(0).getFirstChild().getNodeValue(); + if (!intlFormatPatternValue.equals("NA")) { + intlFormat.setFormat(intlFormatPatternValue); + } + hasExplicitIntlFormatDefined = true; + } + + if (intlFormat.hasFormat()) { + metadata.addIntlNumberFormat(intlFormat.build()); + } + return hasExplicitIntlFormatDefined; + } + + /** + * Extracts the pattern for the national format. + * + * @throws RuntimeException if multiple or no formats have been encountered. + */ + // @VisibleForTesting + static void loadNationalFormat(PhoneMetadata.Builder metadata, Element numberFormatElement, + NumberFormat.Builder format) { + setLeadingDigitsPatterns(numberFormatElement, format); + format.setPattern(validateRE(numberFormatElement.getAttribute(PATTERN))); + + NodeList formatPattern = numberFormatElement.getElementsByTagName(FORMAT); + int numFormatPatterns = formatPattern.getLength(); + if (numFormatPatterns != 1) { + logger.log(Level.SEVERE, "One format pattern for a numberFormat element should be defined."); + String countryId = metadata.getId().length() > 0 ? metadata.getId() + : Integer.toString(metadata.getCountryCode()); + throw new RuntimeException("Invalid number of format patterns (" + numFormatPatterns + + ") for country: " + countryId); + } + format.setFormat(formatPattern.item(0).getFirstChild().getNodeValue()); + } + + /** + * Extracts the available formats from the provided DOM element. If it does not contain any + * nationalPrefixFormattingRule, the one passed-in is retained; similarly for + * nationalPrefixOptionalWhenFormatting. The nationalPrefix, nationalPrefixFormattingRule and + * nationalPrefixOptionalWhenFormatting values are provided from the parent (territory) element. + */ + // @VisibleForTesting + static void loadAvailableFormats(PhoneMetadata.Builder metadata, + Element element, String nationalPrefix, + String nationalPrefixFormattingRule, + boolean nationalPrefixOptionalWhenFormatting) { + String carrierCodeFormattingRule = ""; + if (element.hasAttribute(CARRIER_CODE_FORMATTING_RULE)) { + carrierCodeFormattingRule = validateRE( + getDomesticCarrierCodeFormattingRuleFromElement(element, nationalPrefix)); + } + NodeList numberFormatElements = element.getElementsByTagName(NUMBER_FORMAT); + boolean hasExplicitIntlFormatDefined = false; + + int numOfFormatElements = numberFormatElements.getLength(); + if (numOfFormatElements > 0) { + for (int i = 0; i < numOfFormatElements; i++) { + Element numberFormatElement = (Element) numberFormatElements.item(i); + NumberFormat.Builder format = NumberFormat.newBuilder(); + + if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_FORMATTING_RULE)) { + format.setNationalPrefixFormattingRule( + getNationalPrefixFormattingRuleFromElement(numberFormatElement, nationalPrefix)); + } else if (!nationalPrefixFormattingRule.equals("")) { + format.setNationalPrefixFormattingRule(nationalPrefixFormattingRule); + } + if (numberFormatElement.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)) { + format.setNationalPrefixOptionalWhenFormatting( + Boolean.valueOf(numberFormatElement.getAttribute( + NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING))); + } else if (format.getNationalPrefixOptionalWhenFormatting() + != nationalPrefixOptionalWhenFormatting) { + // Inherit from the parent field if it is not already the same as the default. + format.setNationalPrefixOptionalWhenFormatting(nationalPrefixOptionalWhenFormatting); + } + if (numberFormatElement.hasAttribute(CARRIER_CODE_FORMATTING_RULE)) { + format.setDomesticCarrierCodeFormattingRule(validateRE( + getDomesticCarrierCodeFormattingRuleFromElement(numberFormatElement, + nationalPrefix))); + } else if (!carrierCodeFormattingRule.equals("")) { + format.setDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule); + } + loadNationalFormat(metadata, numberFormatElement, format); + metadata.addNumberFormat(format); + + if (loadInternationalFormat(metadata, numberFormatElement, format.build())) { + hasExplicitIntlFormatDefined = true; + } + } + // Only a small number of regions need to specify the intlFormats in the xml. For the majority + // of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat + // metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that + // actually differ in some way to the national formats. + if (!hasExplicitIntlFormatDefined) { + metadata.clearIntlNumberFormat(); + } + } + } + + // @VisibleForTesting + static void setLeadingDigitsPatterns(Element numberFormatElement, NumberFormat.Builder format) { + NodeList leadingDigitsPatternNodes = numberFormatElement.getElementsByTagName(LEADING_DIGITS); + int numOfLeadingDigitsPatterns = leadingDigitsPatternNodes.getLength(); + if (numOfLeadingDigitsPatterns > 0) { + for (int i = 0; i < numOfLeadingDigitsPatterns; i++) { + format.addLeadingDigitsPattern( + validateRE((leadingDigitsPatternNodes.item(i)).getFirstChild().getNodeValue(), true)); + } + } + } + + // @VisibleForTesting + static String getNationalPrefixFormattingRuleFromElement(Element element, + String nationalPrefix) { + String nationalPrefixFormattingRule = element.getAttribute(NATIONAL_PREFIX_FORMATTING_RULE); + // Replace $NP with national prefix and $FG with the first group ($1). + nationalPrefixFormattingRule = + nationalPrefixFormattingRule.replaceFirst("\\$NP", nationalPrefix) + .replaceFirst("\\$FG", "\\$1"); + return nationalPrefixFormattingRule; + } + + // @VisibleForTesting + static String getDomesticCarrierCodeFormattingRuleFromElement(Element element, + String nationalPrefix) { + String carrierCodeFormattingRule = element.getAttribute(CARRIER_CODE_FORMATTING_RULE); + // Replace $FG with the first group ($1) and $NP with the national prefix. + carrierCodeFormattingRule = carrierCodeFormattingRule.replaceFirst("\\$FG", "\\$1") + .replaceFirst("\\$NP", nationalPrefix); + return carrierCodeFormattingRule; + } + + /** + * Checks if the possible lengths provided as a sorted set are equal to the possible lengths + * stored already in the description pattern. Note that possibleLengths may be empty but must not + * be null, and the PhoneNumberDesc passed in should also not be null. + */ + private static boolean arePossibleLengthsEqual(TreeSet possibleLengths, + PhoneNumberDesc desc) { + if (possibleLengths.size() != desc.getPossibleLengthCount()) { + return false; + } + // Note that both should be sorted already, and we know they are the same length. + int i = 0; + for (Integer length : possibleLengths) { + if (length != desc.getPossibleLength(i)) { + return false; + } + i++; + } + return true; + } + + /** + * Processes a phone number description element from the XML file and returns it as a + * PhoneNumberDesc. If the description element is a fixed line or mobile number, the parent + * description will be used to fill in the whole element if necessary, or any components that are + * missing. For all other types, the parent description will only be used to fill in missing + * components if the type has a partial definition. For example, if no "tollFree" element exists, + * we assume there are no toll free numbers for that locale, and return a phone number description + * with no national number data and [-1] for the possible lengths. Note that the parent + * description must therefore already be processed before this method is called on any child + * elements. + * + * @param parentDesc a generic phone number description that will be used to fill in missing + * parts of the description, or null if this is the root node. This must be processed before + * this is run on any child elements. + * @param countryElement the XML element representing all the country information + * @param numberType the name of the number type, corresponding to the appropriate tag in the XML + * file with information about that type + * @return complete description of that phone number type + */ + // @VisibleForTesting + static PhoneNumberDesc.Builder processPhoneNumberDescElement(PhoneNumberDesc.Builder parentDesc, + Element countryElement, + String numberType) { + NodeList phoneNumberDescList = countryElement.getElementsByTagName(numberType); + PhoneNumberDesc.Builder numberDesc = PhoneNumberDesc.newBuilder(); + if (phoneNumberDescList.getLength() == 0) { + // -1 will never match a possible phone number length, so is safe to use to ensure this never + // matches. We don't leave it empty, since for compression reasons, we use the empty list to + // mean that the generalDesc possible lengths apply. + numberDesc.addPossibleLength(-1); + return numberDesc; + } + if (phoneNumberDescList.getLength() > 0) { + if (phoneNumberDescList.getLength() > 1) { + throw new RuntimeException( + String.format("Multiple elements with type %s found.", numberType)); + } + Element element = (Element) phoneNumberDescList.item(0); + if (parentDesc != null) { + // New way of handling possible number lengths. We don't do this for the general + // description, since these tags won't be present; instead we will calculate its values + // based on the values for all the other number type descriptions (see + // setPossibleLengthsGeneralDesc). + TreeSet lengths = new TreeSet(); + TreeSet localOnlyLengths = new TreeSet(); + populatePossibleLengthSets(element, lengths, localOnlyLengths); + setPossibleLengths(lengths, localOnlyLengths, parentDesc.build(), numberDesc); + } + + NodeList validPattern = element.getElementsByTagName(NATIONAL_NUMBER_PATTERN); + if (validPattern.getLength() > 0) { + numberDesc.setNationalNumberPattern( + validateRE(validPattern.item(0).getFirstChild().getNodeValue(), true)); + } + + NodeList exampleNumber = element.getElementsByTagName(EXAMPLE_NUMBER); + if (exampleNumber.getLength() > 0) { + numberDesc.setExampleNumber(exampleNumber.item(0).getFirstChild().getNodeValue()); + } + } + return numberDesc; + } + + // @VisibleForTesting + static void setRelevantDescPatterns(PhoneMetadata.Builder metadata, Element element, + boolean isShortNumberMetadata) { + PhoneNumberDesc.Builder generalDesc = processPhoneNumberDescElement(null, element, + GENERAL_DESC); + // Calculate the possible lengths for the general description. This will be based on the + // possible lengths of the child elements. + setPossibleLengthsGeneralDesc(generalDesc, metadata.getId(), element, isShortNumberMetadata); + metadata.setGeneralDesc(generalDesc); + + if (!isShortNumberMetadata) { + // Set fields used by regular length phone numbers. + metadata.setFixedLine(processPhoneNumberDescElement(generalDesc, element, FIXED_LINE)); + metadata.setMobile(processPhoneNumberDescElement(generalDesc, element, MOBILE)); + metadata.setSharedCost(processPhoneNumberDescElement(generalDesc, element, SHARED_COST)); + metadata.setVoip(processPhoneNumberDescElement(generalDesc, element, VOIP)); + metadata.setPersonalNumber(processPhoneNumberDescElement(generalDesc, element, + PERSONAL_NUMBER)); + metadata.setPager(processPhoneNumberDescElement(generalDesc, element, PAGER)); + metadata.setUan(processPhoneNumberDescElement(generalDesc, element, UAN)); + metadata.setVoicemail(processPhoneNumberDescElement(generalDesc, element, VOICEMAIL)); + metadata.setNoInternationalDialling(processPhoneNumberDescElement(generalDesc, element, + NO_INTERNATIONAL_DIALLING)); + boolean mobileAndFixedAreSame = metadata.getMobile().getNationalNumberPattern() + .equals(metadata.getFixedLine().getNationalNumberPattern()); + if (metadata.getSameMobileAndFixedLinePattern() != mobileAndFixedAreSame) { + // Set this if it is not the same as the default. + metadata.setSameMobileAndFixedLinePattern(mobileAndFixedAreSame); + } + metadata.setTollFree(processPhoneNumberDescElement(generalDesc, element, TOLL_FREE)); + metadata.setPremiumRate(processPhoneNumberDescElement(generalDesc, element, PREMIUM_RATE)); + } else { + // Set fields used by short numbers. + metadata.setStandardRate(processPhoneNumberDescElement(generalDesc, element, STANDARD_RATE)); + metadata.setShortCode(processPhoneNumberDescElement(generalDesc, element, SHORT_CODE)); + metadata.setCarrierSpecific(processPhoneNumberDescElement(generalDesc, element, + CARRIER_SPECIFIC)); + metadata.setEmergency(processPhoneNumberDescElement(generalDesc, element, EMERGENCY)); + metadata.setTollFree(processPhoneNumberDescElement(generalDesc, element, TOLL_FREE)); + metadata.setPremiumRate(processPhoneNumberDescElement(generalDesc, element, PREMIUM_RATE)); + metadata.setSmsServices(processPhoneNumberDescElement(generalDesc, element, SMS_SERVICES)); + } + } + + /** + * Parses a possible length string into a set of the integers that are covered. + * + * @param possibleLengthString a string specifying the possible lengths of phone numbers. Follows + * this syntax: ranges or elements are separated by commas, and ranges are specified in + * [min-max] notation, inclusive. For example, [3-5],7,9,[11-14] should be parsed to + * 3,4,5,7,9,11,12,13,14. + */ + private static Set parsePossibleLengthStringToSet(String possibleLengthString) { + if (possibleLengthString.length() == 0) { + throw new RuntimeException("Empty possibleLength string found."); + } + String[] lengths = possibleLengthString.split(","); + Set lengthSet = new TreeSet(); + for (int i = 0; i < lengths.length; i++) { + String lengthSubstring = lengths[i]; + if (lengthSubstring.length() == 0) { + throw new RuntimeException(String.format("Leading, trailing or adjacent commas in possible " + + "length string %s, these should only separate numbers or ranges.", + possibleLengthString)); + } else if (lengthSubstring.charAt(0) == '[') { + if (lengthSubstring.charAt(lengthSubstring.length() - 1) != ']') { + throw new RuntimeException(String.format("Missing end of range character in possible " + + "length string %s.", possibleLengthString)); + } + // Strip the leading and trailing [], and split on the -. + String[] minMax = lengthSubstring.substring(1, lengthSubstring.length() - 1).split("-"); + if (minMax.length != 2) { + throw new RuntimeException(String.format("Ranges must have exactly one - character: " + + "missing for %s.", possibleLengthString)); + } + int min = Integer.parseInt(minMax[0]); + int max = Integer.parseInt(minMax[1]); + // We don't even accept [6-7] since we prefer the shorter 6,7 variant; for a range to be in + // use the hyphen needs to replace at least one digit. + if (max - min < 2) { + throw new RuntimeException(String.format("The first number in a range should be two or " + + "more digits lower than the second. Culprit possibleLength string: %s", + possibleLengthString)); + } + for (int j = min; j <= max; j++) { + if (!lengthSet.add(j)) { + throw new RuntimeException(String.format("Duplicate length element found (%d) in " + + "possibleLength string %s", j, possibleLengthString)); + } + } + } else { + int length = Integer.parseInt(lengthSubstring); + if (!lengthSet.add(length)) { + throw new RuntimeException(String.format("Duplicate length element found (%d) in " + + "possibleLength string %s", length, possibleLengthString)); + } + } + } + return lengthSet; + } + + /** + * Reads the possible lengths present in the metadata and splits them into two sets: one for + * full-length numbers, one for local numbers. + * + * @param data one or more phone number descriptions, represented as XML nodes + * @param lengths a set to which to add possible lengths of full phone numbers + * @param localOnlyLengths a set to which to add possible lengths of phone numbers only diallable + * locally (e.g. within a province) + */ + private static void populatePossibleLengthSets(Element data, TreeSet lengths, + TreeSet localOnlyLengths) { + NodeList possibleLengths = data.getElementsByTagName(POSSIBLE_LENGTHS); + for (int i = 0; i < possibleLengths.getLength(); i++) { + Element element = (Element) possibleLengths.item(i); + String nationalLengths = element.getAttribute(NATIONAL); + // We don't add to the phone metadata yet, since we want to sort length elements found under + // different nodes first, make sure there are no duplicates between them and that the + // localOnly lengths don't overlap with the others. + Set thisElementLengths = parsePossibleLengthStringToSet(nationalLengths); + if (element.hasAttribute(LOCAL_ONLY)) { + String localLengths = element.getAttribute(LOCAL_ONLY); + Set thisElementLocalOnlyLengths = parsePossibleLengthStringToSet(localLengths); + Set intersection = new HashSet(thisElementLengths); + intersection.retainAll(thisElementLocalOnlyLengths); + if (!intersection.isEmpty()) { + throw new RuntimeException(String.format( + "Possible length(s) found specified as a normal and local-only length: %s", + intersection)); + } + // We check again when we set these lengths on the metadata itself in setPossibleLengths + // that the elements in localOnly are not also in lengths. For e.g. the generalDesc, it + // might have a local-only length for one type that is a normal length for another type. We + // don't consider this an error, but we do want to remove the local-only lengths. + localOnlyLengths.addAll(thisElementLocalOnlyLengths); + } + // It is okay if at this time we have duplicates, because the same length might be possible + // for e.g. fixed-line and for mobile numbers, and this method operates potentially on + // multiple phoneNumberDesc XML elements. + lengths.addAll(thisElementLengths); + } + } + + /** + * Sets possible lengths in the general description, derived from certain child elements. + */ + // @VisibleForTesting + static void setPossibleLengthsGeneralDesc(PhoneNumberDesc.Builder generalDesc, String metadataId, + Element data, boolean isShortNumberMetadata) { + TreeSet lengths = new TreeSet(); + TreeSet localOnlyLengths = new TreeSet(); + // The general description node should *always* be present if metadata for other types is + // present, aside from in some unit tests. + // (However, for e.g. formatting metadata in PhoneNumberAlternateFormats, no PhoneNumberDesc + // elements are present). + NodeList generalDescNodes = data.getElementsByTagName(GENERAL_DESC); + if (generalDescNodes.getLength() > 0) { + Element generalDescNode = (Element) generalDescNodes.item(0); + populatePossibleLengthSets(generalDescNode, lengths, localOnlyLengths); + if (!lengths.isEmpty() || !localOnlyLengths.isEmpty()) { + // We shouldn't have anything specified at the "general desc" level: we are going to + // calculate this ourselves from child elements. + throw new RuntimeException(String.format("Found possible lengths specified at general " + + "desc: this should be derived from child elements. Affected country: %s", + metadataId)); + } + } + if (!isShortNumberMetadata) { + // Make a copy here since we want to remove some nodes, but we don't want to do that on our + // actual data. + Element allDescData = (Element) data.cloneNode(true /* deep copy */); + for (String tag : PHONE_NUMBER_DESCS_WITHOUT_MATCHING_TYPES) { + NodeList nodesToRemove = allDescData.getElementsByTagName(tag); + if (nodesToRemove.getLength() > 0) { + // We check when we process phone number descriptions that there are only one of each + // type, so this is safe to do. + allDescData.removeChild(nodesToRemove.item(0)); + } + } + populatePossibleLengthSets(allDescData, lengths, localOnlyLengths); + } else { + // For short number metadata, we want to copy the lengths from the "short code" section only. + // This is because it's the more detailed validation pattern, it's not a sub-type of short + // codes. The other lengths will be checked later to see that they are a sub-set of these + // possible lengths. + NodeList shortCodeDescList = data.getElementsByTagName(SHORT_CODE); + if (shortCodeDescList.getLength() > 0) { + Element shortCodeDesc = (Element) shortCodeDescList.item(0); + populatePossibleLengthSets(shortCodeDesc, lengths, localOnlyLengths); + } + if (localOnlyLengths.size() > 0) { + throw new RuntimeException("Found local-only lengths in short-number metadata"); + } + } + setPossibleLengths(lengths, localOnlyLengths, null, generalDesc); + } + + /** + * Sets the possible length fields in the metadata from the sets of data passed in. Checks that + * the length is covered by the "parent" phone number description element if one is present, and + * if the lengths are exactly the same as this, they are not filled in for efficiency reasons. + * + * @param parentDesc the "general description" element or null if desc is the generalDesc itself + * @param desc the PhoneNumberDesc object that we are going to set lengths for + */ + private static void setPossibleLengths(TreeSet lengths, + TreeSet localOnlyLengths, PhoneNumberDesc parentDesc, PhoneNumberDesc.Builder desc) { + // We clear these fields since the metadata tends to inherit from the parent element for other + // fields (via a mergeFrom). + desc.clearPossibleLength(); + desc.clearPossibleLengthLocalOnly(); + // Only add the lengths to this sub-type if they aren't exactly the same as the possible + // lengths in the general desc (for metadata size reasons). + if (parentDesc == null || !arePossibleLengthsEqual(lengths, parentDesc)) { + for (Integer length : lengths) { + if (parentDesc == null || parentDesc.getPossibleLengthList().contains(length)) { + desc.addPossibleLength(length); + } else { + // We shouldn't have possible lengths defined in a child element that are not covered by + // the general description. We check this here even though the general description is + // derived from child elements because it is only derived from a subset, and we need to + // ensure *all* child elements have a valid possible length. + throw new RuntimeException(String.format( + "Out-of-range possible length found (%d), parent lengths %s.", + length, parentDesc.getPossibleLengthList())); + } + } + } + // We check that the local-only length isn't also a normal possible length (only relevant for + // the general-desc, since within elements such as fixed-line we would throw an exception if we + // saw this) before adding it to the collection of possible local-only lengths. + for (Integer length : localOnlyLengths) { + if (!lengths.contains(length)) { + // We check it is covered by either of the possible length sets of the parent + // PhoneNumberDesc, because for example 7 might be a valid localOnly length for mobile, but + // a valid national length for fixedLine, so the generalDesc would have the 7 removed from + // localOnly. + if (parentDesc == null || parentDesc.getPossibleLengthLocalOnlyList().contains(length) + || parentDesc.getPossibleLengthList().contains(length)) { + desc.addPossibleLengthLocalOnly(length); + } else { + throw new RuntimeException(String.format( + "Out-of-range local-only possible length found (%d), parent length %s.", + length, parentDesc.getPossibleLengthLocalOnlyList())); + } + } + } + } + + // @VisibleForTesting + static PhoneMetadata.Builder loadCountryMetadata(String regionCode, + Element element, + boolean isShortNumberMetadata, + boolean isAlternateFormatsMetadata) { + String nationalPrefix = getNationalPrefix(element); + PhoneMetadata.Builder metadata = loadTerritoryTagMetadata(regionCode, element, nationalPrefix); + String nationalPrefixFormattingRule = + getNationalPrefixFormattingRuleFromElement(element, nationalPrefix); + loadAvailableFormats(metadata, element, nationalPrefix, + nationalPrefixFormattingRule, + element.hasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)); + if (!isAlternateFormatsMetadata) { + // The alternate formats metadata does not need most of the patterns to be set. + setRelevantDescPatterns(metadata, element, isShortNumberMetadata); + } + return metadata; + } + + /** + * Processes the custom build flags and gets a {@code MetadataFilter} which may be used to + * filter {@code PhoneMetadata} objects. Incompatible flag combinations throw RuntimeException. + * + * @param liteBuild The liteBuild flag value as given by the command-line + * @param specialBuild The specialBuild flag value as given by the command-line + */ + // @VisibleForTesting + static MetadataFilter getMetadataFilter(boolean liteBuild, boolean specialBuild) { + if (specialBuild) { + if (liteBuild) { + throw new RuntimeException("liteBuild and specialBuild may not both be set"); + } + return MetadataFilter.forSpecialBuild(); + } + if (liteBuild) { + return MetadataFilter.forLiteBuild(); + } + return MetadataFilter.emptyFilter(); + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/Command.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/Command.java new file mode 100644 index 0000000000..b54ef73398 --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/Command.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +/** + * Abstract class defining a common interface for commands provided by build tools (e.g: commands to + * generate code or to download source files). + * + *

Subclass it to create a new command (e.g: code generation step). + * + * @author Philippe Liard + */ +public abstract class Command { + // The arguments provided to this command. The first one is the name of the command. + private String[] args; + + /** + * Entry point of the command called by the CommandDispatcher when requested. This method must be + * implemented by subclasses. + */ + public abstract boolean start(); + + /** + * The name of the command is used by the CommandDispatcher to execute the requested command. The + * Dispatcher will pass along all command-line arguments to this command, so args[0] will be + * always the command name. + */ + public abstract String getCommandName(); + + public String[] getArgs() { + return args; + } + + public void setArgs(String[] args) { + this.args = args; + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CommandDispatcher.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CommandDispatcher.java new file mode 100644 index 0000000000..2806ba3ea5 --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CommandDispatcher.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +/** + * This class is designed to execute a requested command among a set of provided commands. + * The dispatching is performed according to the requested command name, which is provided as the + * first string of the 'args' array. The 'args' array also contains the command arguments available + * from position 1 to end. The verification of the arguments' consistency is under the + * responsibility of the command since the dispatcher can't be aware of its underlying goals. + * + * @see Command + * @author Philippe Liard + */ +public class CommandDispatcher { + // Command line arguments passed to the command which will be executed. Note that the first one is + // the name of the command. + private final String[] args; + // Supported commands by this dispatcher. + private final Command[] commands; + + public CommandDispatcher(String[] args, Command[] commands) { + this.args = args; + this.commands = commands; + } + + /** + * Executes the command named `args[0]` if any. If the requested command (in args[0]) is not + * supported, display a help message. + * + *

Note that the command name comparison is case sensitive. + */ + public boolean start() { + if (args.length != 0) { + String requestedCommand = args[0]; + + for (Command command : commands) { + if (command.getCommandName().equals(requestedCommand)) { + command.setArgs(args); + return command.start(); + } + } + } + displayUsage(); + return false; + } + + /** + * Displays a message containing the list of the supported commands by this dispatcher. + */ + private void displayUsage() { + StringBuilder msg = new StringBuilder("Usage: java -jar /path/to/jar [ "); + int i = 0; + + for (Command command : commands) { + msg.append(command.getCommandName()); + if (i++ != commands.length - 1) { + msg.append(" | "); + } + } + msg.append(" ] args"); + System.err.println(msg.toString()); + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CopyrightNotice.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CopyrightNotice.java new file mode 100644 index 0000000000..d8cd9e2f1a --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/CopyrightNotice.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import java.io.IOException; +import java.io.Writer; +import java.util.Formatter; + +/** + * Class containing the Apache copyright notice used by code generators. + * + * @author Philippe Liard + */ +public class CopyrightNotice { + + private static final String TEXT_OPENING = + "/*\n"; + + private static final String TEXT_OPENING_FOR_JAVASCRIPT = + "/**\n" + + " * @license\n"; + + private static final String TEXT = + " * Copyright (C) %d The Libphonenumber Authors\n" + + " *\n" + + " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" + + " * you may not use this file except in compliance with the License.\n" + + " * You may obtain a copy of the License at\n" + + " *\n" + + " * http://www.apache.org/licenses/LICENSE-2.0\n" + + " *\n" + + " * Unless required by applicable law or agreed to in writing, software\n" + + " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" + + " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + + " * See the License for the specific language governing permissions and\n" + + " * limitations under the License.\n" + + " */\n\n"; + + static final void writeTo(Writer writer, int year) throws IOException { + writeTo(writer, year, false); + } + + static final void writeTo(Writer writer, int year, boolean isJavascript) throws IOException { + if (isJavascript) { + writer.write(TEXT_OPENING_FOR_JAVASCRIPT); + } else { + writer.write(TEXT_OPENING); + } + Formatter formatter = new Formatter(writer); + formatter.format(TEXT, year); + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/FileUtils.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/FileUtils.java new file mode 100644 index 0000000000..41a11eedd1 --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/FileUtils.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * under the License. + */ + +package com.google.i18n.phonenumbers; + +import java.io.Closeable; +import java.io.IOException; + +/** + * Helper class containing methods designed to ease file manipulation and generation. + * + * @author Philippe Liard + */ +public class FileUtils { + /** + * Silently closes a resource (i.e: don't throw any exception). + */ + private static void close(Closeable closeable) { + if (closeable == null) { + return; + } + try { + closeable.close(); + } catch (IOException e) { + System.err.println(e.getMessage()); + } + } + + /** + * Silently closes multiple resources. This method doesn't throw any exception when an error + * occurs when a resource is being closed. + */ + public static void closeFiles(Closeable ... closeables) { + for (Closeable closeable : closeables) { + close(closeable); + } + } +} diff --git a/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/MetadataFilter.java b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/MetadataFilter.java new file mode 100644 index 0000000000..a783025f33 --- /dev/null +++ b/tools/java/common/target/test-classes/com/google/i18n/phonenumbers/MetadataFilter.java @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2016 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import java.util.Arrays; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * Class to encapsulate the metadata filtering logic and restrict visibility into raw data + * structures. + * + *

+ * WARNING: This is an internal API which is under development and subject to backwards-incompatible + * changes without notice. Any changes are not guaranteed to be reflected in the versioning scheme + * of the public API, nor in release notes. + */ +final class MetadataFilter { + // The following 3 sets comprise all the PhoneMetadata fields as defined at phonemetadata.proto + // which may be excluded from customized serializations of the binary metadata. Fields that are + // core to the library functionality may not be listed here. + // excludableParentFields are PhoneMetadata fields of type PhoneNumberDesc. + // excludableChildFields are PhoneNumberDesc fields of primitive type. + // excludableChildlessFields are PhoneMetadata fields of primitive type. + // Currently we support only one non-primitive type and the depth of the "family tree" is 2, + // meaning a field may have only direct descendants, who may not have descendants of their own. If + // this changes, the blacklist handling in this class should also change. + // @VisibleForTesting + static final TreeSet excludableParentFields = new TreeSet(Arrays.asList( + "fixedLine", + "mobile", + "tollFree", + "premiumRate", + "sharedCost", + "personalNumber", + "voip", + "pager", + "uan", + "emergency", + "voicemail", + "shortCode", + "standardRate", + "carrierSpecific", + "smsServices", + "noInternationalDialling")); + + // Note: If this set changes, the descHasData implementation must change in PhoneNumberUtil. + // The current implementation assumes that all PhoneNumberDesc fields are present here, since it + // "clears" a PhoneNumberDesc field by simply clearing all of the fields under it. See the comment + // above, about all 3 sets, for more about these fields. + // @VisibleForTesting + static final TreeSet excludableChildFields = new TreeSet(Arrays.asList( + "nationalNumberPattern", + "possibleLength", + "possibleLengthLocalOnly", + "exampleNumber")); + + // @VisibleForTesting + static final TreeSet excludableChildlessFields = new TreeSet(Arrays.asList( + "preferredInternationalPrefix", + "nationalPrefix", + "preferredExtnPrefix", + "nationalPrefixTransformRule", + "sameMobileAndFixedLinePattern", + "mainCountryForCode", + "mobileNumberPortableRegion")); + + private final TreeMap> blacklist; + + // Note: If changing the blacklist here or the name of the method, update documentation about + // affected methods at the same time: + // https://github.com/google/libphonenumber/blob/master/FAQ.md#what-is-the-metadatalitejsmetadata_lite-option + static MetadataFilter forLiteBuild() { + // "exampleNumber" is a blacklist. + return new MetadataFilter(parseFieldMapFromString("exampleNumber")); + } + + static MetadataFilter forSpecialBuild() { + // "mobile" is a whitelist. + return new MetadataFilter(computeComplement(parseFieldMapFromString("mobile"))); + } + + static MetadataFilter emptyFilter() { + // Empty blacklist, meaning we filter nothing. + return new MetadataFilter(new TreeMap>()); + } + + // @VisibleForTesting + MetadataFilter(TreeMap> blacklist) { + this.blacklist = blacklist; + } + + @Override + public boolean equals(Object obj) { + return blacklist.equals(((MetadataFilter) obj).blacklist); + } + + @Override + public int hashCode() { + return blacklist.hashCode(); + } + + /** + * Clears certain fields in {@code metadata} as defined by the {@code MetadataFilter} instance. + * Note that this changes the mutable {@code metadata} object, and is not thread-safe. If this + * method does not return successfully, do not assume {@code metadata} has not changed. + * + * @param metadata The {@code PhoneMetadata} object to be filtered + */ + void filterMetadata(PhoneMetadata.Builder metadata) { + // TODO: Consider clearing if the filtered PhoneNumberDesc is empty. + if (metadata.hasFixedLine()) { + metadata.setFixedLine(getFiltered("fixedLine", metadata.getFixedLine())); + } + if (metadata.hasMobile()) { + metadata.setMobile(getFiltered("mobile", metadata.getMobile())); + } + if (metadata.hasTollFree()) { + metadata.setTollFree(getFiltered("tollFree", metadata.getTollFree())); + } + if (metadata.hasPremiumRate()) { + metadata.setPremiumRate(getFiltered("premiumRate", metadata.getPremiumRate())); + } + if (metadata.hasSharedCost()) { + metadata.setSharedCost(getFiltered("sharedCost", metadata.getSharedCost())); + } + if (metadata.hasPersonalNumber()) { + metadata.setPersonalNumber(getFiltered("personalNumber", metadata.getPersonalNumber())); + } + if (metadata.hasVoip()) { + metadata.setVoip(getFiltered("voip", metadata.getVoip())); + } + if (metadata.hasPager()) { + metadata.setPager(getFiltered("pager", metadata.getPager())); + } + if (metadata.hasUan()) { + metadata.setUan(getFiltered("uan", metadata.getUan())); + } + if (metadata.hasEmergency()) { + metadata.setEmergency(getFiltered("emergency", metadata.getEmergency())); + } + if (metadata.hasVoicemail()) { + metadata.setVoicemail(getFiltered("voicemail", metadata.getVoicemail())); + } + if (metadata.hasShortCode()) { + metadata.setShortCode(getFiltered("shortCode", metadata.getShortCode())); + } + if (metadata.hasStandardRate()) { + metadata.setStandardRate(getFiltered("standardRate", metadata.getStandardRate())); + } + if (metadata.hasCarrierSpecific()) { + metadata.setCarrierSpecific(getFiltered("carrierSpecific", metadata.getCarrierSpecific())); + } + if (metadata.hasSmsServices()) { + metadata.setSmsServices(getFiltered("smsServices", metadata.getSmsServices())); + } + if (metadata.hasNoInternationalDialling()) { + metadata.setNoInternationalDialling(getFiltered("noInternationalDialling", + metadata.getNoInternationalDialling())); + } + + if (shouldDrop("preferredInternationalPrefix")) { + metadata.clearPreferredInternationalPrefix(); + } + if (shouldDrop("nationalPrefix")) { + metadata.clearNationalPrefix(); + } + if (shouldDrop("preferredExtnPrefix")) { + metadata.clearPreferredExtnPrefix(); + } + if (shouldDrop("nationalPrefixTransformRule")) { + metadata.clearNationalPrefixTransformRule(); + } + if (shouldDrop("sameMobileAndFixedLinePattern")) { + metadata.clearSameMobileAndFixedLinePattern(); + } + if (shouldDrop("mainCountryForCode")) { + metadata.clearMainCountryForCode(); + } + if (shouldDrop("mobileNumberPortableRegion")) { + metadata.clearMobileNumberPortableRegion(); + } + } + + /** + * The input blacklist or whitelist string is expected to be of the form "a(b,c):d(e):f", where + * b and c are children of a, e is a child of d, and f is either a parent field, a child field, or + * a childless field. Order and whitespace don't matter. We throw RuntimeException for any + * duplicates, malformed strings, or strings where field tokens do not correspond to strings in + * the sets of excludable fields. We also throw RuntimeException for empty strings since such + * strings should be treated as a special case by the flag checking code and not passed here. + */ + // @VisibleForTesting + static TreeMap> parseFieldMapFromString(String string) { + if (string == null) { + throw new RuntimeException("Null string should not be passed to parseFieldMapFromString"); + } + // Remove whitespace. + string = string.replaceAll("\\s", ""); + if (string.isEmpty()) { + throw new RuntimeException("Empty string should not be passed to parseFieldMapFromString"); + } + + TreeMap> fieldMap = new TreeMap>(); + TreeSet wildcardChildren = new TreeSet(); + for (String group : string.split(":", -1)) { + int leftParenIndex = group.indexOf('('); + int rightParenIndex = group.indexOf(')'); + if (leftParenIndex < 0 && rightParenIndex < 0) { + if (excludableParentFields.contains(group)) { + if (fieldMap.containsKey(group)) { + throw new RuntimeException(group + " given more than once in " + string); + } + fieldMap.put(group, new TreeSet(excludableChildFields)); + } else if (excludableChildlessFields.contains(group)) { + if (fieldMap.containsKey(group)) { + throw new RuntimeException(group + " given more than once in " + string); + } + fieldMap.put(group, new TreeSet()); + } else if (excludableChildFields.contains(group)) { + if (wildcardChildren.contains(group)) { + throw new RuntimeException(group + " given more than once in " + string); + } + wildcardChildren.add(group); + } else { + throw new RuntimeException(group + " is not a valid token"); + } + } else if (leftParenIndex > 0 && rightParenIndex == group.length() - 1) { + // We don't check for duplicate parentheses or illegal characters since these will be caught + // as not being part of valid field tokens. + String parent = group.substring(0, leftParenIndex); + if (!excludableParentFields.contains(parent)) { + throw new RuntimeException(parent + " is not a valid parent token"); + } + if (fieldMap.containsKey(parent)) { + throw new RuntimeException(parent + " given more than once in " + string); + } + TreeSet children = new TreeSet(); + for (String child : group.substring(leftParenIndex + 1, rightParenIndex).split(",", -1)) { + if (!excludableChildFields.contains(child)) { + throw new RuntimeException(child + " is not a valid child token"); + } + if (!children.add(child)) { + throw new RuntimeException(child + " given more than once in " + group); + } + } + fieldMap.put(parent, children); + } else { + throw new RuntimeException("Incorrect location of parantheses in " + group); + } + } + for (String wildcardChild : wildcardChildren) { + for (String parent : excludableParentFields) { + TreeSet children = fieldMap.get(parent); + if (children == null) { + children = new TreeSet(); + fieldMap.put(parent, children); + } + if (!children.add(wildcardChild) + && fieldMap.get(parent).size() != excludableChildFields.size()) { + // The map already contains parent -> wildcardChild but not all possible children. + // So wildcardChild was given explicitly as a child of parent, which is a duplication + // since it's also given as a wildcard child. + throw new RuntimeException( + wildcardChild + " is present by itself so remove it from " + parent + "'s group"); + } + } + } + return fieldMap; + } + + // Does not check that legal tokens are used, assuming that fieldMap is constructed using + // parseFieldMapFromString(String) which does check. If fieldMap contains illegal tokens or parent + // fields with no children or other unexpected state, the behavior of this function is undefined. + // @VisibleForTesting + static TreeMap> computeComplement( + TreeMap> fieldMap) { + TreeMap> complement = new TreeMap>(); + for (String parent : excludableParentFields) { + if (!fieldMap.containsKey(parent)) { + complement.put(parent, new TreeSet(excludableChildFields)); + } else { + TreeSet otherChildren = fieldMap.get(parent); + // If the other map has all the children for this parent then we don't want to include the + // parent as a key. + if (otherChildren.size() != excludableChildFields.size()) { + TreeSet children = new TreeSet(); + for (String child : excludableChildFields) { + if (!otherChildren.contains(child)) { + children.add(child); + } + } + complement.put(parent, children); + } + } + } + for (String childlessField : excludableChildlessFields) { + if (!fieldMap.containsKey(childlessField)) { + complement.put(childlessField, new TreeSet()); + } + } + return complement; + } + + // @VisibleForTesting + boolean shouldDrop(String parent, String child) { + if (!excludableParentFields.contains(parent)) { + throw new RuntimeException(parent + " is not an excludable parent field"); + } + if (!excludableChildFields.contains(child)) { + throw new RuntimeException(child + " is not an excludable child field"); + } + return blacklist.containsKey(parent) && blacklist.get(parent).contains(child); + } + + // @VisibleForTesting + boolean shouldDrop(String childlessField) { + if (!excludableChildlessFields.contains(childlessField)) { + throw new RuntimeException(childlessField + " is not an excludable childless field"); + } + return blacklist.containsKey(childlessField); + } + + private PhoneNumberDesc getFiltered(String type, PhoneNumberDesc desc) { + PhoneNumberDesc.Builder builder = PhoneNumberDesc.newBuilder().mergeFrom(desc); + if (shouldDrop(type, "nationalNumberPattern")) { + builder.clearNationalNumberPattern(); + } + if (shouldDrop(type, "possibleLength")) { + builder.clearPossibleLength(); + } + if (shouldDrop(type, "possibleLengthLocalOnly")) { + builder.clearPossibleLengthLocalOnly(); + } + if (shouldDrop(type, "exampleNumber")) { + builder.clearExampleNumber(); + } + return builder.build(); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java new file mode 100644 index 0000000000..3975c2d3a0 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2012 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.HashSet; +import java.util.Set; + +public class AlternateFormatsCountryCodeSet { + // A set of all country codes for which data is available. + public static Set getCountryCodeSet() { + // The capacity is set to 61 as there are 46 different entries, + // and this offers a load factor of roughly 0.75. + Set countryCodeSet = new HashSet(61); + + countryCodeSet.add(7); + countryCodeSet.add(27); + countryCodeSet.add(30); + countryCodeSet.add(31); + countryCodeSet.add(34); + countryCodeSet.add(36); + countryCodeSet.add(39); + countryCodeSet.add(43); + countryCodeSet.add(44); + countryCodeSet.add(49); + countryCodeSet.add(52); + countryCodeSet.add(54); + countryCodeSet.add(55); + countryCodeSet.add(58); + countryCodeSet.add(61); + countryCodeSet.add(62); + countryCodeSet.add(64); + countryCodeSet.add(66); + countryCodeSet.add(81); + countryCodeSet.add(84); + countryCodeSet.add(90); + countryCodeSet.add(91); + countryCodeSet.add(94); + countryCodeSet.add(95); + countryCodeSet.add(255); + countryCodeSet.add(350); + countryCodeSet.add(351); + countryCodeSet.add(352); + countryCodeSet.add(358); + countryCodeSet.add(359); + countryCodeSet.add(372); + countryCodeSet.add(373); + countryCodeSet.add(380); + countryCodeSet.add(381); + countryCodeSet.add(385); + countryCodeSet.add(505); + countryCodeSet.add(506); + countryCodeSet.add(595); + countryCodeSet.add(675); + countryCodeSet.add(676); + countryCodeSet.add(679); + countryCodeSet.add(855); + countryCodeSet.add(856); + countryCodeSet.add(971); + countryCodeSet.add(972); + countryCodeSet.add(995); + + return countryCodeSet; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java new file mode 100644 index 0000000000..be11be57ea --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java @@ -0,0 +1,668 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.RegexCache; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A formatter which formats phone numbers as they are entered. + * + *

An AsYouTypeFormatter can be created by invoking + * {@link PhoneNumberUtil#getAsYouTypeFormatter}. After that, digits can be added by invoking + * {@link #inputDigit} on the formatter instance, and the partially formatted phone number will be + * returned each time a digit is added. {@link #clear} can be invoked before formatting a new + * number. + * + *

See the unittests for more details on how the formatter is to be used. + * + * @author Shaopeng Jia + */ +public class AsYouTypeFormatter { + private String currentOutput = ""; + private StringBuilder formattingTemplate = new StringBuilder(); + // The pattern from numberFormat that is currently used to create formattingTemplate. + private String currentFormattingPattern = ""; + private StringBuilder accruedInput = new StringBuilder(); + private StringBuilder accruedInputWithoutFormatting = new StringBuilder(); + // This indicates whether AsYouTypeFormatter is currently doing the formatting. + private boolean ableToFormat = true; + // Set to true when users enter their own formatting. AsYouTypeFormatter will do no formatting at + // all when this is set to true. + private boolean inputHasFormatting = false; + // This is set to true when we know the user is entering a full national significant number, since + // we have either detected a national prefix or an international dialing prefix. When this is + // true, we will no longer use local number formatting patterns. + private boolean isCompleteNumber = false; + private boolean isExpectingCountryCallingCode = false; + private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + private String defaultCountry; + + // Character used when appropriate to separate a prefix, such as a long NDD or a country calling + // code, from the national number. + private static final char SEPARATOR_BEFORE_NATIONAL_NUMBER = ' '; + private static final PhoneMetadata EMPTY_METADATA = + PhoneMetadata.newBuilder().setId("").setInternationalPrefix("NA").build(); + private PhoneMetadata defaultMetadata; + private PhoneMetadata currentMetadata; + + // A pattern that is used to determine if a numberFormat under availableFormats is eligible to be + // used by the AYTF. It is eligible when the format element under numberFormat contains groups of + // the dollar sign followed by a single digit, separated by valid phone number punctuation. This + // prevents invalid punctuation (such as the star sign in Israeli star numbers) getting into the + // output of the AYTF. We require that the first group is present in the output pattern to ensure + // no data is lost while formatting; when we format as you type, this should always be the case. + private static final Pattern ELIGIBLE_FORMAT_PATTERN = + Pattern.compile("[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*" + + "\\$1" + "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*(\\$\\d" + + "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*)*"); + // A set of characters that, if found in a national prefix formatting rules, are an indicator to + // us that we should separate the national prefix from the number when formatting. + private static final Pattern NATIONAL_PREFIX_SEPARATORS_PATTERN = Pattern.compile("[- ]"); + + // This is the minimum length of national number accrued that is required to trigger the + // formatter. The first element of the leadingDigitsPattern of each numberFormat contains a + // regular expression that matches up to this number of digits. + private static final int MIN_LEADING_DIGITS_LENGTH = 3; + + // The digits that have not been entered yet will be represented by a \u2008, the punctuation + // space. + private static final String DIGIT_PLACEHOLDER = "\u2008"; + private static final Pattern DIGIT_PATTERN = Pattern.compile(DIGIT_PLACEHOLDER); + private int lastMatchPosition = 0; + // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as + // found in the original sequence of characters the user entered. + private int originalPosition = 0; + // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as + // found in accruedInputWithoutFormatting. + private int positionToRemember = 0; + // This contains anything that has been entered so far preceding the national significant number, + // and it is formatted (e.g. with space inserted). For example, this can contain IDD, country + // code, and/or NDD, etc. + private StringBuilder prefixBeforeNationalNumber = new StringBuilder(); + private boolean shouldAddSpaceAfterNationalPrefix = false; + // This contains the national prefix that has been extracted. It contains only digits without + // formatting. + private String extractedNationalPrefix = ""; + private StringBuilder nationalNumber = new StringBuilder(); + private List possibleFormats = new ArrayList(); + + // A cache for frequently used country-specific regular expressions. + private RegexCache regexCache = new RegexCache(64); + + /** + * Constructs an as-you-type formatter. Should be obtained from {@link + * PhoneNumberUtil#getAsYouTypeFormatter}. + * + * @param regionCode the country/region where the phone number is being entered + */ + AsYouTypeFormatter(String regionCode) { + defaultCountry = regionCode; + currentMetadata = getMetadataForRegion(defaultCountry); + defaultMetadata = currentMetadata; + } + + // The metadata needed by this class is the same for all regions sharing the same country calling + // code. Therefore, we return the metadata for "main" region for this country calling code. + private PhoneMetadata getMetadataForRegion(String regionCode) { + int countryCallingCode = phoneUtil.getCountryCodeForRegion(regionCode); + String mainCountry = phoneUtil.getRegionCodeForCountryCode(countryCallingCode); + PhoneMetadata metadata = phoneUtil.getMetadataForRegion(mainCountry); + if (metadata != null) { + return metadata; + } + // Set to a default instance of the metadata. This allows us to function with an incorrect + // region code, even if formatting only works for numbers specified with "+". + return EMPTY_METADATA; + } + + // Returns true if a new template is created as opposed to reusing the existing template. + private boolean maybeCreateNewTemplate() { + // When there are multiple available formats, the formatter uses the first format where a + // formatting template could be created. + Iterator it = possibleFormats.iterator(); + while (it.hasNext()) { + NumberFormat numberFormat = it.next(); + String pattern = numberFormat.getPattern(); + if (currentFormattingPattern.equals(pattern)) { + return false; + } + if (createFormattingTemplate(numberFormat)) { + currentFormattingPattern = pattern; + shouldAddSpaceAfterNationalPrefix = + NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( + numberFormat.getNationalPrefixFormattingRule()).find(); + // With a new formatting template, the matched position using the old template needs to be + // reset. + lastMatchPosition = 0; + return true; + } else { // Remove the current number format from possibleFormats. + it.remove(); + } + } + ableToFormat = false; + return false; + } + + private void getAvailableFormats(String leadingDigits) { + // First decide whether we should use international or national number rules. + boolean isInternationalNumber = isCompleteNumber && extractedNationalPrefix.length() == 0; + List formatList = + (isInternationalNumber && currentMetadata.getIntlNumberFormatCount() > 0) + ? currentMetadata.getIntlNumberFormatList() + : currentMetadata.getNumberFormatList(); + for (NumberFormat format : formatList) { + // Discard a few formats that we know are not relevant based on the presence of the national + // prefix. + if (extractedNationalPrefix.length() > 0 + && PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + format.getNationalPrefixFormattingRule()) + && !format.getNationalPrefixOptionalWhenFormatting() + && !format.hasDomesticCarrierCodeFormattingRule()) { + // If it is a national number that had a national prefix, any rules that aren't valid with a + // national prefix should be excluded. A rule that has a carrier-code formatting rule is + // kept since the national prefix might actually be an extracted carrier code - we don't + // distinguish between these when extracting it in the AYTF. + continue; + } else if (extractedNationalPrefix.length() == 0 + && !isCompleteNumber + && !PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + format.getNationalPrefixFormattingRule()) + && !format.getNationalPrefixOptionalWhenFormatting()) { + // This number was entered without a national prefix, and this formatting rule requires one, + // so we discard it. + continue; + } + if (ELIGIBLE_FORMAT_PATTERN.matcher(format.getFormat()).matches()) { + possibleFormats.add(format); + } + } + narrowDownPossibleFormats(leadingDigits); + } + + private void narrowDownPossibleFormats(String leadingDigits) { + int indexOfLeadingDigitsPattern = leadingDigits.length() - MIN_LEADING_DIGITS_LENGTH; + Iterator it = possibleFormats.iterator(); + while (it.hasNext()) { + NumberFormat format = it.next(); + if (format.getLeadingDigitsPatternCount() == 0) { + // Keep everything that isn't restricted by leading digits. + continue; + } + int lastLeadingDigitsPattern = + Math.min(indexOfLeadingDigitsPattern, format.getLeadingDigitsPatternCount() - 1); + Pattern leadingDigitsPattern = regexCache.getPatternForRegex( + format.getLeadingDigitsPattern(lastLeadingDigitsPattern)); + Matcher m = leadingDigitsPattern.matcher(leadingDigits); + if (!m.lookingAt()) { + it.remove(); + } + } + } + + private boolean createFormattingTemplate(NumberFormat format) { + String numberPattern = format.getPattern(); + formattingTemplate.setLength(0); + String tempTemplate = getFormattingTemplate(numberPattern, format.getFormat()); + if (tempTemplate.length() > 0) { + formattingTemplate.append(tempTemplate); + return true; + } + return false; + } + + // Gets a formatting template which can be used to efficiently format a partial number where + // digits are added one by one. + private String getFormattingTemplate(String numberPattern, String numberFormat) { + // Creates a phone number consisting only of the digit 9 that matches the + // numberPattern by applying the pattern to the longestPhoneNumber string. + String longestPhoneNumber = "999999999999999"; + Matcher m = regexCache.getPatternForRegex(numberPattern).matcher(longestPhoneNumber); + m.find(); // this will always succeed + String aPhoneNumber = m.group(); + // No formatting template can be created if the number of digits entered so far is longer than + // the maximum the current formatting rule can accommodate. + if (aPhoneNumber.length() < nationalNumber.length()) { + return ""; + } + // Formats the number according to numberFormat + String template = aPhoneNumber.replaceAll(numberPattern, numberFormat); + // Replaces each digit with character DIGIT_PLACEHOLDER + template = template.replaceAll("9", DIGIT_PLACEHOLDER); + return template; + } + + /** + * Clears the internal state of the formatter, so it can be reused. + */ + public void clear() { + currentOutput = ""; + accruedInput.setLength(0); + accruedInputWithoutFormatting.setLength(0); + formattingTemplate.setLength(0); + lastMatchPosition = 0; + currentFormattingPattern = ""; + prefixBeforeNationalNumber.setLength(0); + extractedNationalPrefix = ""; + nationalNumber.setLength(0); + ableToFormat = true; + inputHasFormatting = false; + positionToRemember = 0; + originalPosition = 0; + isCompleteNumber = false; + isExpectingCountryCallingCode = false; + possibleFormats.clear(); + shouldAddSpaceAfterNationalPrefix = false; + if (!currentMetadata.equals(defaultMetadata)) { + currentMetadata = getMetadataForRegion(defaultCountry); + } + } + + /** + * Formats a phone number on-the-fly as each digit is entered. + * + * @param nextChar the most recently entered digit of a phone number. Formatting characters are + * allowed, but as soon as they are encountered this method formats the number as entered and + * not "as you type" anymore. Full width digits and Arabic-indic digits are allowed, and will + * be shown as they are. + * @return the partially formatted phone number. + */ + public String inputDigit(char nextChar) { + currentOutput = inputDigitWithOptionToRememberPosition(nextChar, false); + return currentOutput; + } + + /** + * Same as {@link #inputDigit}, but remembers the position where {@code nextChar} is inserted, so + * that it can be retrieved later by using {@link #getRememberedPosition}. The remembered + * position will be automatically adjusted if additional formatting characters are later + * inserted/removed in front of {@code nextChar}. + */ + public String inputDigitAndRememberPosition(char nextChar) { + currentOutput = inputDigitWithOptionToRememberPosition(nextChar, true); + return currentOutput; + } + + @SuppressWarnings("fallthrough") + private String inputDigitWithOptionToRememberPosition(char nextChar, boolean rememberPosition) { + accruedInput.append(nextChar); + if (rememberPosition) { + originalPosition = accruedInput.length(); + } + // We do formatting on-the-fly only when each character entered is either a digit, or a plus + // sign (accepted at the start of the number only). + if (!isDigitOrLeadingPlusSign(nextChar)) { + ableToFormat = false; + inputHasFormatting = true; + } else { + nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition); + } + if (!ableToFormat) { + // When we are unable to format because of reasons other than that formatting chars have been + // entered, it can be due to really long IDDs or NDDs. If that is the case, we might be able + // to do formatting again after extracting them. + if (inputHasFormatting) { + return accruedInput.toString(); + } else if (attemptToExtractIdd()) { + if (attemptToExtractCountryCallingCode()) { + return attemptToChoosePatternWithPrefixExtracted(); + } + } else if (ableToExtractLongerNdd()) { + // Add an additional space to separate long NDD and national significant number for + // readability. We don't set shouldAddSpaceAfterNationalPrefix to true, since we don't want + // this to change later when we choose formatting templates. + prefixBeforeNationalNumber.append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + return attemptToChoosePatternWithPrefixExtracted(); + } + return accruedInput.toString(); + } + + // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus + // sign is counted as a digit as well for this purpose) have been entered. + switch (accruedInputWithoutFormatting.length()) { + case 0: + case 1: + case 2: + return accruedInput.toString(); + case 3: + if (attemptToExtractIdd()) { + isExpectingCountryCallingCode = true; + } else { // No IDD or plus sign is found, might be entering in national format. + extractedNationalPrefix = removeNationalPrefixFromNationalNumber(); + return attemptToChooseFormattingPattern(); + } + // fall through + default: + if (isExpectingCountryCallingCode) { + if (attemptToExtractCountryCallingCode()) { + isExpectingCountryCallingCode = false; + } + return prefixBeforeNationalNumber + nationalNumber.toString(); + } + if (possibleFormats.size() > 0) { // The formatting patterns are already chosen. + String tempNationalNumber = inputDigitHelper(nextChar); + // See if the accrued digits can be formatted properly already. If not, use the results + // from inputDigitHelper, which does formatting based on the formatting pattern chosen. + String formattedNumber = attemptToFormatAccruedDigits(); + if (formattedNumber.length() > 0) { + return formattedNumber; + } + narrowDownPossibleFormats(nationalNumber.toString()); + if (maybeCreateNewTemplate()) { + return inputAccruedNationalNumber(); + } + return ableToFormat + ? appendNationalNumber(tempNationalNumber) + : accruedInput.toString(); + } else { + return attemptToChooseFormattingPattern(); + } + } + } + + private String attemptToChoosePatternWithPrefixExtracted() { + ableToFormat = true; + isExpectingCountryCallingCode = false; + possibleFormats.clear(); + lastMatchPosition = 0; + formattingTemplate.setLength(0); + currentFormattingPattern = ""; + return attemptToChooseFormattingPattern(); + } + + // @VisibleForTesting + String getExtractedNationalPrefix() { + return extractedNationalPrefix; + } + + // Some national prefixes are a substring of others. If extracting the shorter NDD doesn't result + // in a number we can format, we try to see if we can extract a longer version here. + private boolean ableToExtractLongerNdd() { + if (extractedNationalPrefix.length() > 0) { + // Put the extracted NDD back to the national number before attempting to extract a new NDD. + nationalNumber.insert(0, extractedNationalPrefix); + // Remove the previously extracted NDD from prefixBeforeNationalNumber. We cannot simply set + // it to empty string because people sometimes incorrectly enter national prefix after the + // country code, e.g. +44 (0)20-1234-5678. + int indexOfPreviousNdd = prefixBeforeNationalNumber.lastIndexOf(extractedNationalPrefix); + prefixBeforeNationalNumber.setLength(indexOfPreviousNdd); + } + return !extractedNationalPrefix.equals(removeNationalPrefixFromNationalNumber()); + } + + private boolean isDigitOrLeadingPlusSign(char nextChar) { + return Character.isDigit(nextChar) + || (accruedInput.length() == 1 + && PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(Character.toString(nextChar)).matches()); + } + + /** + * Checks to see if there is an exact pattern match for these digits. If so, we should use this + * instead of any other formatting template whose leadingDigitsPattern also matches the input. + */ + String attemptToFormatAccruedDigits() { + for (NumberFormat numberFormat : possibleFormats) { + Matcher m = regexCache.getPatternForRegex(numberFormat.getPattern()).matcher(nationalNumber); + if (m.matches()) { + shouldAddSpaceAfterNationalPrefix = + NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( + numberFormat.getNationalPrefixFormattingRule()).find(); + String formattedNumber = m.replaceAll(numberFormat.getFormat()); + // Check that we did not remove nor add any extra digits when we matched + // this formatting pattern. This usually happens after we entered the last + // digit during AYTF. Eg: In case of MX, we swallow mobile token (1) when + // formatted but AYTF should retain all the number entered and not change + // in order to match a format (of same leading digits and length) display + // in that way. + String fullOutput = appendNationalNumber(formattedNumber); + String formattedNumberDigitsOnly = PhoneNumberUtil.normalizeDiallableCharsOnly(fullOutput); + if (formattedNumberDigitsOnly.contentEquals(accruedInputWithoutFormatting)) { + // If it's the same (i.e entered number and format is same), then it's + // safe to return this in formatted number as nothing is lost / added. + return fullOutput; + } + } + } + return ""; + } + + /** + * Returns the current position in the partially formatted phone number of the character which was + * previously passed in as the parameter of {@link #inputDigitAndRememberPosition}. + */ + public int getRememberedPosition() { + if (!ableToFormat) { + return originalPosition; + } + int accruedInputIndex = 0; + int currentOutputIndex = 0; + while (accruedInputIndex < positionToRemember && currentOutputIndex < currentOutput.length()) { + if (accruedInputWithoutFormatting.charAt(accruedInputIndex) + == currentOutput.charAt(currentOutputIndex)) { + accruedInputIndex++; + } + currentOutputIndex++; + } + return currentOutputIndex; + } + + /** + * Combines the national number with any prefix (IDD/+ and country code or national prefix) that + * was collected. A space will be inserted between them if the current formatting template + * indicates this to be suitable. + */ + private String appendNationalNumber(String nationalNumber) { + int prefixBeforeNationalNumberLength = prefixBeforeNationalNumber.length(); + if (shouldAddSpaceAfterNationalPrefix && prefixBeforeNationalNumberLength > 0 + && prefixBeforeNationalNumber.charAt(prefixBeforeNationalNumberLength - 1) + != SEPARATOR_BEFORE_NATIONAL_NUMBER) { + // We want to add a space after the national prefix if the national prefix formatting rule + // indicates that this would normally be done, with the exception of the case where we already + // appended a space because the NDD was surprisingly long. + return new String(prefixBeforeNationalNumber) + SEPARATOR_BEFORE_NATIONAL_NUMBER + + nationalNumber; + } else { + return prefixBeforeNationalNumber + nationalNumber; + } + } + + /** + * Attempts to set the formatting template and returns a string which contains the formatted + * version of the digits entered so far. + */ + private String attemptToChooseFormattingPattern() { + // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits of national + // number (excluding national prefix) have been entered. + if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) { + + getAvailableFormats(nationalNumber.toString()); + // See if the accrued digits can be formatted properly already. + String formattedNumber = attemptToFormatAccruedDigits(); + if (formattedNumber.length() > 0) { + return formattedNumber; + } + return maybeCreateNewTemplate() ? inputAccruedNationalNumber() : accruedInput.toString(); + } else { + return appendNationalNumber(nationalNumber.toString()); + } + } + + /** + * Invokes inputDigitHelper on each digit of the national number accrued, and returns a formatted + * string in the end. + */ + private String inputAccruedNationalNumber() { + int lengthOfNationalNumber = nationalNumber.length(); + if (lengthOfNationalNumber > 0) { + String tempNationalNumber = ""; + for (int i = 0; i < lengthOfNationalNumber; i++) { + tempNationalNumber = inputDigitHelper(nationalNumber.charAt(i)); + } + return ableToFormat ? appendNationalNumber(tempNationalNumber) : accruedInput.toString(); + } else { + return prefixBeforeNationalNumber.toString(); + } + } + + /** + * Returns true if the current country is a NANPA country and the national number begins with + * the national prefix. + */ + private boolean isNanpaNumberWithNationalPrefix() { + // For NANPA numbers beginning with 1[2-9], treat the 1 as the national prefix. The reason is + // that national significant numbers in NANPA always start with [2-9] after the national prefix. + // Numbers beginning with 1[01] can only be short/emergency numbers, which don't need the + // national prefix. + return (currentMetadata.getCountryCode() == 1) && (nationalNumber.charAt(0) == '1') + && (nationalNumber.charAt(1) != '0') && (nationalNumber.charAt(1) != '1'); + } + + // Returns the national prefix extracted, or an empty string if it is not present. + private String removeNationalPrefixFromNationalNumber() { + int startOfNationalNumber = 0; + if (isNanpaNumberWithNationalPrefix()) { + startOfNationalNumber = 1; + prefixBeforeNationalNumber.append('1').append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + isCompleteNumber = true; + } else if (currentMetadata.hasNationalPrefixForParsing()) { + Pattern nationalPrefixForParsing = + regexCache.getPatternForRegex(currentMetadata.getNationalPrefixForParsing()); + Matcher m = nationalPrefixForParsing.matcher(nationalNumber); + // Since some national prefix patterns are entirely optional, check that a national prefix + // could actually be extracted. + if (m.lookingAt() && m.end() > 0) { + // When the national prefix is detected, we use international formatting rules instead of + // national ones, because national formatting rules could contain local formatting rules + // for numbers entered without area code. + isCompleteNumber = true; + startOfNationalNumber = m.end(); + prefixBeforeNationalNumber.append(nationalNumber.substring(0, startOfNationalNumber)); + } + } + String nationalPrefix = nationalNumber.substring(0, startOfNationalNumber); + nationalNumber.delete(0, startOfNationalNumber); + return nationalPrefix; + } + + /** + * Extracts IDD and plus sign to prefixBeforeNationalNumber when they are available, and places + * the remaining input into nationalNumber. + * + * @return true when accruedInputWithoutFormatting begins with the plus sign or valid IDD for + * defaultCountry. + */ + private boolean attemptToExtractIdd() { + Pattern internationalPrefix = + regexCache.getPatternForRegex("\\" + PhoneNumberUtil.PLUS_SIGN + "|" + + currentMetadata.getInternationalPrefix()); + Matcher iddMatcher = internationalPrefix.matcher(accruedInputWithoutFormatting); + if (iddMatcher.lookingAt()) { + isCompleteNumber = true; + int startOfCountryCallingCode = iddMatcher.end(); + nationalNumber.setLength(0); + nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCallingCode)); + prefixBeforeNationalNumber.setLength(0); + prefixBeforeNationalNumber.append( + accruedInputWithoutFormatting.substring(0, startOfCountryCallingCode)); + if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) { + prefixBeforeNationalNumber.append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + } + return true; + } + return false; + } + + /** + * Extracts the country calling code from the beginning of nationalNumber to + * prefixBeforeNationalNumber when they are available, and places the remaining input into + * nationalNumber. + * + * @return true when a valid country calling code can be found. + */ + private boolean attemptToExtractCountryCallingCode() { + if (nationalNumber.length() == 0) { + return false; + } + StringBuilder numberWithoutCountryCallingCode = new StringBuilder(); + int countryCode = phoneUtil.extractCountryCode(nationalNumber, numberWithoutCountryCallingCode); + if (countryCode == 0) { + return false; + } + nationalNumber.setLength(0); + nationalNumber.append(numberWithoutCountryCallingCode); + String newRegionCode = phoneUtil.getRegionCodeForCountryCode(countryCode); + if (PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(newRegionCode)) { + currentMetadata = phoneUtil.getMetadataForNonGeographicalRegion(countryCode); + } else if (!newRegionCode.equals(defaultCountry)) { + currentMetadata = getMetadataForRegion(newRegionCode); + } + String countryCodeString = Integer.toString(countryCode); + prefixBeforeNationalNumber.append(countryCodeString).append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + // When we have successfully extracted the IDD, the previously extracted NDD should be cleared + // because it is no longer valid. + extractedNationalPrefix = ""; + return true; + } + + // Accrues digits and the plus sign to accruedInputWithoutFormatting for later use. If nextChar + // contains a digit in non-ASCII format (e.g. the full-width version of digits), it is first + // normalized to the ASCII version. The return value is nextChar itself, or its normalized + // version, if nextChar is a digit in non-ASCII format. This method assumes its input is either a + // digit or the plus sign. + private char normalizeAndAccrueDigitsAndPlusSign(char nextChar, boolean rememberPosition) { + char normalizedChar; + if (nextChar == PhoneNumberUtil.PLUS_SIGN) { + normalizedChar = nextChar; + accruedInputWithoutFormatting.append(nextChar); + } else { + int radix = 10; + normalizedChar = Character.forDigit(Character.digit(nextChar, radix), radix); + accruedInputWithoutFormatting.append(normalizedChar); + nationalNumber.append(normalizedChar); + } + if (rememberPosition) { + positionToRemember = accruedInputWithoutFormatting.length(); + } + return normalizedChar; + } + + private String inputDigitHelper(char nextChar) { + // Note that formattingTemplate is not guaranteed to have a value, it could be empty, e.g. + // when the next digit is entered after extracting an IDD or NDD. + Matcher digitMatcher = DIGIT_PATTERN.matcher(formattingTemplate); + if (digitMatcher.find(lastMatchPosition)) { + String tempTemplate = digitMatcher.replaceFirst(Character.toString(nextChar)); + formattingTemplate.replace(0, tempTemplate.length(), tempTemplate); + lastMatchPosition = digitMatcher.start(); + return formattingTemplate.substring(0, lastMatchPosition + 1); + } else { + if (possibleFormats.size() == 1) { + // More digits are entered than we could handle, and there are no other valid patterns to + // try. + ableToFormat = false; + } // else, we just reset the formatting pattern. + currentFormattingPattern = ""; + return accruedInput.toString(); + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java new file mode 100644 index 0000000000..06571d15f0 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java @@ -0,0 +1,942 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CountryCodeToRegionCodeMap { + // A mapping from a country code to the region codes which denote the + // country/region represented by that country code. In the case of multiple + // countries sharing a calling code, such as the NANPA countries, the one + // indicated with "isMainCountryForCode" in the metadata should be first. + public static Map> getCountryCodeToRegionCodeMap() { + // The capacity is set to 286 as there are 215 different entries, + // and this offers a load factor of roughly 0.75. + Map> countryCodeToRegionCodeMap = + new HashMap>(286); + + ArrayList listWithRegionCode; + + listWithRegionCode = new ArrayList(25); + listWithRegionCode.add("US"); + listWithRegionCode.add("AG"); + listWithRegionCode.add("AI"); + listWithRegionCode.add("AS"); + listWithRegionCode.add("BB"); + listWithRegionCode.add("BM"); + listWithRegionCode.add("BS"); + listWithRegionCode.add("CA"); + listWithRegionCode.add("DM"); + listWithRegionCode.add("DO"); + listWithRegionCode.add("GD"); + listWithRegionCode.add("GU"); + listWithRegionCode.add("JM"); + listWithRegionCode.add("KN"); + listWithRegionCode.add("KY"); + listWithRegionCode.add("LC"); + listWithRegionCode.add("MP"); + listWithRegionCode.add("MS"); + listWithRegionCode.add("PR"); + listWithRegionCode.add("SX"); + listWithRegionCode.add("TC"); + listWithRegionCode.add("TT"); + listWithRegionCode.add("VC"); + listWithRegionCode.add("VG"); + listWithRegionCode.add("VI"); + countryCodeToRegionCodeMap.put(1, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("RU"); + listWithRegionCode.add("KZ"); + countryCodeToRegionCodeMap.put(7, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EG"); + countryCodeToRegionCodeMap.put(20, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZA"); + countryCodeToRegionCodeMap.put(27, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GR"); + countryCodeToRegionCodeMap.put(30, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NL"); + countryCodeToRegionCodeMap.put(31, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BE"); + countryCodeToRegionCodeMap.put(32, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FR"); + countryCodeToRegionCodeMap.put(33, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ES"); + countryCodeToRegionCodeMap.put(34, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HU"); + countryCodeToRegionCodeMap.put(36, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("IT"); + listWithRegionCode.add("VA"); + countryCodeToRegionCodeMap.put(39, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RO"); + countryCodeToRegionCodeMap.put(40, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CH"); + countryCodeToRegionCodeMap.put(41, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AT"); + countryCodeToRegionCodeMap.put(43, listWithRegionCode); + + listWithRegionCode = new ArrayList(4); + listWithRegionCode.add("GB"); + listWithRegionCode.add("GG"); + listWithRegionCode.add("IM"); + listWithRegionCode.add("JE"); + countryCodeToRegionCodeMap.put(44, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DK"); + countryCodeToRegionCodeMap.put(45, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SE"); + countryCodeToRegionCodeMap.put(46, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("NO"); + listWithRegionCode.add("SJ"); + countryCodeToRegionCodeMap.put(47, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PL"); + countryCodeToRegionCodeMap.put(48, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DE"); + countryCodeToRegionCodeMap.put(49, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PE"); + countryCodeToRegionCodeMap.put(51, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MX"); + countryCodeToRegionCodeMap.put(52, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CU"); + countryCodeToRegionCodeMap.put(53, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AR"); + countryCodeToRegionCodeMap.put(54, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BR"); + countryCodeToRegionCodeMap.put(55, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CL"); + countryCodeToRegionCodeMap.put(56, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CO"); + countryCodeToRegionCodeMap.put(57, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VE"); + countryCodeToRegionCodeMap.put(58, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MY"); + countryCodeToRegionCodeMap.put(60, listWithRegionCode); + + listWithRegionCode = new ArrayList(3); + listWithRegionCode.add("AU"); + listWithRegionCode.add("CC"); + listWithRegionCode.add("CX"); + countryCodeToRegionCodeMap.put(61, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ID"); + countryCodeToRegionCodeMap.put(62, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PH"); + countryCodeToRegionCodeMap.put(63, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NZ"); + countryCodeToRegionCodeMap.put(64, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SG"); + countryCodeToRegionCodeMap.put(65, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TH"); + countryCodeToRegionCodeMap.put(66, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("JP"); + countryCodeToRegionCodeMap.put(81, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KR"); + countryCodeToRegionCodeMap.put(82, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VN"); + countryCodeToRegionCodeMap.put(84, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CN"); + countryCodeToRegionCodeMap.put(86, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TR"); + countryCodeToRegionCodeMap.put(90, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IN"); + countryCodeToRegionCodeMap.put(91, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PK"); + countryCodeToRegionCodeMap.put(92, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AF"); + countryCodeToRegionCodeMap.put(93, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LK"); + countryCodeToRegionCodeMap.put(94, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MM"); + countryCodeToRegionCodeMap.put(95, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IR"); + countryCodeToRegionCodeMap.put(98, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SS"); + countryCodeToRegionCodeMap.put(211, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("MA"); + listWithRegionCode.add("EH"); + countryCodeToRegionCodeMap.put(212, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DZ"); + countryCodeToRegionCodeMap.put(213, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TN"); + countryCodeToRegionCodeMap.put(216, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LY"); + countryCodeToRegionCodeMap.put(218, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GM"); + countryCodeToRegionCodeMap.put(220, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SN"); + countryCodeToRegionCodeMap.put(221, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MR"); + countryCodeToRegionCodeMap.put(222, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ML"); + countryCodeToRegionCodeMap.put(223, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GN"); + countryCodeToRegionCodeMap.put(224, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CI"); + countryCodeToRegionCodeMap.put(225, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BF"); + countryCodeToRegionCodeMap.put(226, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NE"); + countryCodeToRegionCodeMap.put(227, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TG"); + countryCodeToRegionCodeMap.put(228, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BJ"); + countryCodeToRegionCodeMap.put(229, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MU"); + countryCodeToRegionCodeMap.put(230, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LR"); + countryCodeToRegionCodeMap.put(231, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SL"); + countryCodeToRegionCodeMap.put(232, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GH"); + countryCodeToRegionCodeMap.put(233, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NG"); + countryCodeToRegionCodeMap.put(234, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TD"); + countryCodeToRegionCodeMap.put(235, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CF"); + countryCodeToRegionCodeMap.put(236, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CM"); + countryCodeToRegionCodeMap.put(237, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CV"); + countryCodeToRegionCodeMap.put(238, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ST"); + countryCodeToRegionCodeMap.put(239, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GQ"); + countryCodeToRegionCodeMap.put(240, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GA"); + countryCodeToRegionCodeMap.put(241, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CG"); + countryCodeToRegionCodeMap.put(242, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CD"); + countryCodeToRegionCodeMap.put(243, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AO"); + countryCodeToRegionCodeMap.put(244, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GW"); + countryCodeToRegionCodeMap.put(245, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IO"); + countryCodeToRegionCodeMap.put(246, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AC"); + countryCodeToRegionCodeMap.put(247, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SC"); + countryCodeToRegionCodeMap.put(248, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SD"); + countryCodeToRegionCodeMap.put(249, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RW"); + countryCodeToRegionCodeMap.put(250, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ET"); + countryCodeToRegionCodeMap.put(251, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SO"); + countryCodeToRegionCodeMap.put(252, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DJ"); + countryCodeToRegionCodeMap.put(253, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KE"); + countryCodeToRegionCodeMap.put(254, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TZ"); + countryCodeToRegionCodeMap.put(255, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UG"); + countryCodeToRegionCodeMap.put(256, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BI"); + countryCodeToRegionCodeMap.put(257, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MZ"); + countryCodeToRegionCodeMap.put(258, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZM"); + countryCodeToRegionCodeMap.put(260, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MG"); + countryCodeToRegionCodeMap.put(261, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("RE"); + listWithRegionCode.add("YT"); + countryCodeToRegionCodeMap.put(262, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZW"); + countryCodeToRegionCodeMap.put(263, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NA"); + countryCodeToRegionCodeMap.put(264, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MW"); + countryCodeToRegionCodeMap.put(265, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LS"); + countryCodeToRegionCodeMap.put(266, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BW"); + countryCodeToRegionCodeMap.put(267, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SZ"); + countryCodeToRegionCodeMap.put(268, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KM"); + countryCodeToRegionCodeMap.put(269, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("SH"); + listWithRegionCode.add("TA"); + countryCodeToRegionCodeMap.put(290, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ER"); + countryCodeToRegionCodeMap.put(291, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AW"); + countryCodeToRegionCodeMap.put(297, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FO"); + countryCodeToRegionCodeMap.put(298, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GL"); + countryCodeToRegionCodeMap.put(299, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GI"); + countryCodeToRegionCodeMap.put(350, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PT"); + countryCodeToRegionCodeMap.put(351, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LU"); + countryCodeToRegionCodeMap.put(352, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IE"); + countryCodeToRegionCodeMap.put(353, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IS"); + countryCodeToRegionCodeMap.put(354, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AL"); + countryCodeToRegionCodeMap.put(355, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MT"); + countryCodeToRegionCodeMap.put(356, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CY"); + countryCodeToRegionCodeMap.put(357, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("FI"); + listWithRegionCode.add("AX"); + countryCodeToRegionCodeMap.put(358, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BG"); + countryCodeToRegionCodeMap.put(359, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LT"); + countryCodeToRegionCodeMap.put(370, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LV"); + countryCodeToRegionCodeMap.put(371, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EE"); + countryCodeToRegionCodeMap.put(372, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MD"); + countryCodeToRegionCodeMap.put(373, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AM"); + countryCodeToRegionCodeMap.put(374, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BY"); + countryCodeToRegionCodeMap.put(375, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AD"); + countryCodeToRegionCodeMap.put(376, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MC"); + countryCodeToRegionCodeMap.put(377, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SM"); + countryCodeToRegionCodeMap.put(378, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UA"); + countryCodeToRegionCodeMap.put(380, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RS"); + countryCodeToRegionCodeMap.put(381, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ME"); + countryCodeToRegionCodeMap.put(382, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("XK"); + countryCodeToRegionCodeMap.put(383, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HR"); + countryCodeToRegionCodeMap.put(385, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SI"); + countryCodeToRegionCodeMap.put(386, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BA"); + countryCodeToRegionCodeMap.put(387, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MK"); + countryCodeToRegionCodeMap.put(389, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CZ"); + countryCodeToRegionCodeMap.put(420, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SK"); + countryCodeToRegionCodeMap.put(421, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LI"); + countryCodeToRegionCodeMap.put(423, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FK"); + countryCodeToRegionCodeMap.put(500, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BZ"); + countryCodeToRegionCodeMap.put(501, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GT"); + countryCodeToRegionCodeMap.put(502, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SV"); + countryCodeToRegionCodeMap.put(503, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HN"); + countryCodeToRegionCodeMap.put(504, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NI"); + countryCodeToRegionCodeMap.put(505, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CR"); + countryCodeToRegionCodeMap.put(506, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PA"); + countryCodeToRegionCodeMap.put(507, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PM"); + countryCodeToRegionCodeMap.put(508, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HT"); + countryCodeToRegionCodeMap.put(509, listWithRegionCode); + + listWithRegionCode = new ArrayList(3); + listWithRegionCode.add("GP"); + listWithRegionCode.add("BL"); + listWithRegionCode.add("MF"); + countryCodeToRegionCodeMap.put(590, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BO"); + countryCodeToRegionCodeMap.put(591, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GY"); + countryCodeToRegionCodeMap.put(592, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EC"); + countryCodeToRegionCodeMap.put(593, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GF"); + countryCodeToRegionCodeMap.put(594, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PY"); + countryCodeToRegionCodeMap.put(595, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MQ"); + countryCodeToRegionCodeMap.put(596, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SR"); + countryCodeToRegionCodeMap.put(597, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UY"); + countryCodeToRegionCodeMap.put(598, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("CW"); + listWithRegionCode.add("BQ"); + countryCodeToRegionCodeMap.put(599, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TL"); + countryCodeToRegionCodeMap.put(670, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NF"); + countryCodeToRegionCodeMap.put(672, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BN"); + countryCodeToRegionCodeMap.put(673, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NR"); + countryCodeToRegionCodeMap.put(674, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PG"); + countryCodeToRegionCodeMap.put(675, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TO"); + countryCodeToRegionCodeMap.put(676, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SB"); + countryCodeToRegionCodeMap.put(677, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VU"); + countryCodeToRegionCodeMap.put(678, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FJ"); + countryCodeToRegionCodeMap.put(679, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PW"); + countryCodeToRegionCodeMap.put(680, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("WF"); + countryCodeToRegionCodeMap.put(681, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CK"); + countryCodeToRegionCodeMap.put(682, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NU"); + countryCodeToRegionCodeMap.put(683, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("WS"); + countryCodeToRegionCodeMap.put(685, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KI"); + countryCodeToRegionCodeMap.put(686, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NC"); + countryCodeToRegionCodeMap.put(687, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TV"); + countryCodeToRegionCodeMap.put(688, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PF"); + countryCodeToRegionCodeMap.put(689, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TK"); + countryCodeToRegionCodeMap.put(690, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FM"); + countryCodeToRegionCodeMap.put(691, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MH"); + countryCodeToRegionCodeMap.put(692, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(800, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(808, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KP"); + countryCodeToRegionCodeMap.put(850, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HK"); + countryCodeToRegionCodeMap.put(852, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MO"); + countryCodeToRegionCodeMap.put(853, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KH"); + countryCodeToRegionCodeMap.put(855, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LA"); + countryCodeToRegionCodeMap.put(856, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(870, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(878, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BD"); + countryCodeToRegionCodeMap.put(880, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(881, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(882, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(883, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TW"); + countryCodeToRegionCodeMap.put(886, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(888, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MV"); + countryCodeToRegionCodeMap.put(960, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LB"); + countryCodeToRegionCodeMap.put(961, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("JO"); + countryCodeToRegionCodeMap.put(962, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SY"); + countryCodeToRegionCodeMap.put(963, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IQ"); + countryCodeToRegionCodeMap.put(964, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KW"); + countryCodeToRegionCodeMap.put(965, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SA"); + countryCodeToRegionCodeMap.put(966, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("YE"); + countryCodeToRegionCodeMap.put(967, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("OM"); + countryCodeToRegionCodeMap.put(968, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PS"); + countryCodeToRegionCodeMap.put(970, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AE"); + countryCodeToRegionCodeMap.put(971, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IL"); + countryCodeToRegionCodeMap.put(972, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BH"); + countryCodeToRegionCodeMap.put(973, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("QA"); + countryCodeToRegionCodeMap.put(974, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BT"); + countryCodeToRegionCodeMap.put(975, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MN"); + countryCodeToRegionCodeMap.put(976, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NP"); + countryCodeToRegionCodeMap.put(977, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(979, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TJ"); + countryCodeToRegionCodeMap.put(992, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TM"); + countryCodeToRegionCodeMap.put(993, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AZ"); + countryCodeToRegionCodeMap.put(994, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GE"); + countryCodeToRegionCodeMap.put(995, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KG"); + countryCodeToRegionCodeMap.put(996, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UZ"); + countryCodeToRegionCodeMap.put(998, listWithRegionCode); + + return countryCodeToRegionCodeMap; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MetadataLoader.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MetadataLoader.java new file mode 100644 index 0000000000..44fa0dc445 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MetadataLoader.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import java.io.InputStream; + +/** + * Interface for clients to specify a customized phone metadata loader, useful for Android apps to + * load Android resources since the library loads Java resources by default, e.g. with + * + * AssetManager. Note that implementation owners have the responsibility to ensure this is + * thread-safe. + */ +public interface MetadataLoader { + /** + * Returns an input stream corresponding to the metadata to load. This method may be called + * concurrently so implementations must be thread-safe. + * + * @param metadataFileName file name (including path) of metadata to load. File path is an + * absolute class path like /com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto + * @return the input stream for the metadata file. The library will close this stream + * after it is done. Return null in case the metadata file could not be found + */ + public InputStream loadMetadata(String metadataFileName); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MissingMetadataException.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MissingMetadataException.java new file mode 100644 index 0000000000..c2a8544ca3 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/MissingMetadataException.java @@ -0,0 +1,9 @@ +package com.google.i18n.phonenumbers; + +/** Exception class for cases when expected metadata cannot be found. */ +public final class MissingMetadataException extends IllegalStateException { + + public MissingMetadataException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/NumberParseException.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/NumberParseException.java new file mode 100644 index 0000000000..ef3dfa11b8 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/NumberParseException.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +/** + * Generic exception class for errors encountered when parsing phone numbers. + */ +@SuppressWarnings("serial") +public class NumberParseException extends Exception { + + /** + * The reason that a string could not be interpreted as a phone number. + */ + public enum ErrorType { + /** + * The country code supplied did not belong to a supported country or non-geographical entity. + */ + INVALID_COUNTRY_CODE, + /** + * This indicates the string passed is not a valid number. Either the string had less than 3 + * digits in it or had an invalid phone-context parameter. More specifically, the number failed + * to match the regular expression VALID_PHONE_NUMBER, RFC3966_GLOBAL_NUMBER_DIGITS, or + * RFC3966_DOMAINNAME in PhoneNumberUtil.java. + */ + NOT_A_NUMBER, + /** + * This indicates the string started with an international dialing prefix, but after this was + * stripped from the number, had less digits than any valid phone number (including country + * code) could have. + */ + TOO_SHORT_AFTER_IDD, + /** + * This indicates the string, after any country code has been stripped, had less digits than any + * valid phone number could have. + */ + TOO_SHORT_NSN, + /** + * This indicates the string had more digits than any valid phone number could have. + */ + TOO_LONG, + } + + private ErrorType errorType; + private String message; + + public NumberParseException(ErrorType errorType, String message) { + super(message); + this.message = message; + this.errorType = errorType; + } + + /** + * Returns the error type of the exception that has been thrown. + */ + public ErrorType getErrorType() { + return errorType; + } + + @Override + public String toString() { + return "Error type: " + errorType + ". " + message; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java new file mode 100644 index 0000000000..de95eac96d --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +import java.util.Arrays; + +/** + * The immutable match of a phone number within a piece of text. Matches may be found using + * {@link PhoneNumberUtil#findNumbers}. + * + *

A match consists of the {@linkplain #number() phone number} as well as the + * {@linkplain #start() start} and {@linkplain #end() end} offsets of the corresponding subsequence + * of the searched text. Use {@link #rawString()} to obtain a copy of the matched subsequence. + * + *

The following annotated example clarifies the relationship between the searched text, the + * match offsets, and the parsed number: + + *

+ * CharSequence text = "Call me at +1 425 882-8080 for details.";
+ * String country = "US";
+ * PhoneNumberUtil util = PhoneNumberUtil.getInstance();
+ *
+ * // Find the first phone number match:
+ * PhoneNumberMatch m = util.findNumbers(text, country).iterator().next();
+ *
+ * // rawString() contains the phone number as it appears in the text.
+ * "+1 425 882-8080".equals(m.rawString());
+ *
+ * // start() and end() define the range of the matched subsequence.
+ * CharSequence subsequence = text.subSequence(m.start(), m.end());
+ * "+1 425 882-8080".contentEquals(subsequence);
+ *
+ * // number() returns the the same result as PhoneNumberUtil.{@link PhoneNumberUtil#parse parse()}
+ * // invoked on rawString().
+ * util.parse(m.rawString(), country).equals(m.number());
+ * 
+ */ +public final class PhoneNumberMatch { + /** The start index into the text. */ + private final int start; + /** The raw substring matched. */ + private final String rawString; + /** The matched phone number. */ + private final PhoneNumber number; + + /** + * Creates a new match. + * + * @param start the start index into the target text + * @param rawString the matched substring of the target text + * @param number the matched phone number + */ + PhoneNumberMatch(int start, String rawString, PhoneNumber number) { + if (start < 0) { + throw new IllegalArgumentException("Start index must be >= 0."); + } + if (rawString == null || number == null) { + throw new NullPointerException(); + } + this.start = start; + this.rawString = rawString; + this.number = number; + } + + /** Returns the phone number matched by the receiver. */ + public PhoneNumber number() { + return number; + } + + /** Returns the start index of the matched phone number within the searched text. */ + public int start() { + return start; + } + + /** Returns the exclusive end index of the matched phone number within the searched text. */ + public int end() { + return start + rawString.length(); + } + + /** Returns the raw string matched as a phone number in the searched text. */ + public String rawString() { + return rawString; + } + + @Override + public int hashCode() { + return Arrays.hashCode(new Object[]{start, rawString, number}); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof PhoneNumberMatch)) { + return false; + } + PhoneNumberMatch other = (PhoneNumberMatch) obj; + return rawString.equals(other.rawString) && (start == other.start) + && number.equals(other.number); + } + + @Override + public String toString() { + return "PhoneNumberMatch [" + start() + "," + end() + ") " + rawString; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java new file mode 100644 index 0000000000..b812551db0 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java @@ -0,0 +1,732 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.PhoneNumberUtil.Leniency; +import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType; +import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.internal.RegexCache; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import java.lang.Character.UnicodeBlock; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A stateful class that finds and extracts telephone numbers from {@linkplain CharSequence text}. + * Instances can be created using the {@linkplain PhoneNumberUtil#findNumbers factory methods} in + * {@link PhoneNumberUtil}. + * + *

Vanity numbers (phone numbers using alphabetic digits such as 1-800-SIX-FLAGS are + * not found. + * + *

This class is not thread-safe. + */ +final class PhoneNumberMatcher implements Iterator { + /** + * The phone number pattern used by {@link #find}, similar to + * {@code PhoneNumberUtil.VALID_PHONE_NUMBER}, but with the following differences: + *

    + *
  • All captures are limited in order to place an upper bound to the text matched by the + * pattern. + *
      + *
    • Leading punctuation / plus signs are limited. + *
    • Consecutive occurrences of punctuation are limited. + *
    • Number of digits is limited. + *
    + *
  • No whitespace is allowed at the start or end. + *
  • No alpha digits (vanity numbers such as 1-800-SIX-FLAGS) are currently supported. + *
+ */ + private static final Pattern PATTERN; + /** + * Matches strings that look like publication pages. Example: + *
Computing Complete Answers to Queries in the Presence of Limited Access Patterns.
+   * Chen Li. VLDB J. 12(3): 211-227 (2003).
+ * + * The string "211-227 (2003)" is not a telephone number. + */ + private static final Pattern PUB_PAGES = Pattern.compile("\\d{1,5}-+\\d{1,5}\\s{0,4}\\(\\d{1,4}"); + + /** + * Matches strings that look like dates using "/" as a separator. Examples: 3/10/2011, 31/10/96 or + * 08/31/95. + */ + private static final Pattern SLASH_SEPARATED_DATES = + Pattern.compile("(?:(?:[0-3]?\\d/[01]?\\d)|(?:[01]?\\d/[0-3]?\\d))/(?:[12]\\d)?\\d{2}"); + + /** + * Matches timestamps. Examples: "2012-01-02 08:00". Note that the reg-ex does not include the + * trailing ":\d\d" -- that is covered by TIME_STAMPS_SUFFIX. + */ + private static final Pattern TIME_STAMPS = + Pattern.compile("[12]\\d{3}[-/]?[01]\\d[-/]?[0-3]\\d +[0-2]\\d$"); + private static final Pattern TIME_STAMPS_SUFFIX = Pattern.compile(":[0-5]\\d"); + + /** + * Pattern to check that brackets match. Opening brackets should be closed within a phone number. + * This also checks that there is something inside the brackets. Having no brackets at all is also + * fine. + */ + private static final Pattern MATCHING_BRACKETS; + + /** + * Patterns used to extract phone numbers from a larger phone-number-like pattern. These are + * ordered according to specificity. For example, white-space is last since that is frequently + * used in numbers, not just to separate two numbers. We have separate patterns since we don't + * want to break up the phone-number-like text on more than one different kind of symbol at one + * time, although symbols of the same type (e.g. space) can be safely grouped together. + * + * Note that if there is a match, we will always check any text found up to the first match as + * well. + */ + private static final Pattern[] INNER_MATCHES = { + // Breaks on the slash - e.g. "651-234-2345/332-445-1234" + Pattern.compile("/+(.*)"), + // Note that the bracket here is inside the capturing group, since we consider it part of the + // phone number. Will match a pattern like "(650) 223 3345 (754) 223 3321". + Pattern.compile("(\\([^(]*)"), + // Breaks on a hyphen - e.g. "12345 - 332-445-1234 is my number." + // We require a space on either side of the hyphen for it to be considered a separator. + Pattern.compile("(?:\\p{Z}-|-\\p{Z})\\p{Z}*(.+)"), + // Various types of wide hyphens. Note we have decided not to enforce a space here, since it's + // possible that it's supposed to be used to break two numbers without spaces, and we haven't + // seen many instances of it used within a number. + Pattern.compile("[\u2012-\u2015\uFF0D]\\p{Z}*(.+)"), + // Breaks on a full stop - e.g. "12345. 332-445-1234 is my number." + Pattern.compile("\\.+\\p{Z}*([^.]+)"), + // Breaks on space - e.g. "3324451234 8002341234" + Pattern.compile("\\p{Z}+(\\P{Z}+)") + }; + + /** + * Punctuation that may be at the start of a phone number - brackets and plus signs. + */ + private static final Pattern LEAD_CLASS; + + static { + /* Builds the MATCHING_BRACKETS and PATTERN regular expressions. The building blocks below exist + * to make the pattern more easily understood. */ + + String openingParens = "(\\[\uFF08\uFF3B"; + String closingParens = ")\\]\uFF09\uFF3D"; + String nonParens = "[^" + openingParens + closingParens + "]"; + + /* Limit on the number of pairs of brackets in a phone number. */ + String bracketPairLimit = limit(0, 3); + /* + * An opening bracket at the beginning may not be closed, but subsequent ones should be. It's + * also possible that the leading bracket was dropped, so we shouldn't be surprised if we see a + * closing bracket first. We limit the sets of brackets in a phone number to four. + */ + MATCHING_BRACKETS = Pattern.compile( + "(?:[" + openingParens + "])?" + "(?:" + nonParens + "+" + "[" + closingParens + "])?" + + nonParens + "+" + + "(?:[" + openingParens + "]" + nonParens + "+[" + closingParens + "])" + bracketPairLimit + + nonParens + "*"); + + /* Limit on the number of leading (plus) characters. */ + String leadLimit = limit(0, 2); + /* Limit on the number of consecutive punctuation characters. */ + String punctuationLimit = limit(0, 4); + /* The maximum number of digits allowed in a digit-separated block. As we allow all digits in a + * single block, set high enough to accommodate the entire national number and the international + * country code. */ + int digitBlockLimit = + PhoneNumberUtil.MAX_LENGTH_FOR_NSN + PhoneNumberUtil.MAX_LENGTH_COUNTRY_CODE; + /* Limit on the number of blocks separated by punctuation. Uses digitBlockLimit since some + * formats use spaces to separate each digit. */ + String blockLimit = limit(0, digitBlockLimit); + + /* A punctuation sequence allowing white space. */ + String punctuation = "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]" + punctuationLimit; + /* A digits block without punctuation. */ + String digitSequence = "\\p{Nd}" + limit(1, digitBlockLimit); + + String leadClassChars = openingParens + PhoneNumberUtil.PLUS_CHARS; + String leadClass = "[" + leadClassChars + "]"; + LEAD_CLASS = Pattern.compile(leadClass); + + /* Phone number pattern allowing optional punctuation. */ + PATTERN = Pattern.compile( + "(?:" + leadClass + punctuation + ")" + leadLimit + + digitSequence + "(?:" + punctuation + digitSequence + ")" + blockLimit + + "(?:" + PhoneNumberUtil.EXTN_PATTERNS_FOR_MATCHING + ")?", + PhoneNumberUtil.REGEX_FLAGS); + } + + /** Returns a regular expression quantifier with an upper and lower limit. */ + private static String limit(int lower, int upper) { + if ((lower < 0) || (upper <= 0) || (upper < lower)) { + throw new IllegalArgumentException(); + } + return "{" + lower + "," + upper + "}"; + } + + /** The potential states of a PhoneNumberMatcher. */ + private enum State { + NOT_READY, READY, DONE + } + + /** The phone number utility. */ + private final PhoneNumberUtil phoneUtil; + /** The text searched for phone numbers. */ + private final CharSequence text; + /** + * The region (country) to assume for phone numbers without an international prefix, possibly + * null. + */ + private final String preferredRegion; + /** The degree of validation requested. */ + private final Leniency leniency; + /** The maximum number of retries after matching an invalid number. */ + private long maxTries; + + /** The iteration tristate. */ + private State state = State.NOT_READY; + /** The last successful match, null unless in {@link State#READY}. */ + private PhoneNumberMatch lastMatch = null; + /** The next index to start searching at. Undefined in {@link State#DONE}. */ + private int searchIndex = 0; + + // A cache for frequently used country-specific regular expressions. Set to 32 to cover ~2-3 + // countries being used for the same doc with ~10 patterns for each country. Some pages will have + // a lot more countries in use, but typically fewer numbers for each so expanding the cache for + // that use-case won't have a lot of benefit. + private final RegexCache regexCache = new RegexCache(32); + + /** + * Creates a new instance. See the factory methods in {@link PhoneNumberUtil} on how to obtain a + * new instance. + * + * @param util the phone number util to use + * @param text the character sequence that we will search, null for no text + * @param country the country to assume for phone numbers not written in international format + * (with a leading plus, or with the international dialing prefix of the specified region). + * May be null or "ZZ" if only numbers with a leading plus should be + * considered. + * @param leniency the leniency to use when evaluating candidate phone numbers + * @param maxTries the maximum number of invalid numbers to try before giving up on the text. + * This is to cover degenerate cases where the text has a lot of false positives in it. Must + * be {@code >= 0}. + */ + PhoneNumberMatcher(PhoneNumberUtil util, CharSequence text, String country, Leniency leniency, + long maxTries) { + + if ((util == null) || (leniency == null)) { + throw new NullPointerException(); + } + if (maxTries < 0) { + throw new IllegalArgumentException(); + } + this.phoneUtil = util; + this.text = (text != null) ? text : ""; + this.preferredRegion = country; + this.leniency = leniency; + this.maxTries = maxTries; + } + + /** + * Attempts to find the next subsequence in the searched sequence on or after {@code searchIndex} + * that represents a phone number. Returns the next match, null if none was found. + * + * @param index the search index to start searching at + * @return the phone number match found, null if none can be found + */ + private PhoneNumberMatch find(int index) { + Matcher matcher = PATTERN.matcher(text); + while ((maxTries > 0) && matcher.find(index)) { + int start = matcher.start(); + CharSequence candidate = text.subSequence(start, matcher.end()); + + // Check for extra numbers at the end. + // TODO: This is the place to start when trying to support extraction of multiple phone number + // from split notations (+41 79 123 45 67 / 68). + candidate = trimAfterFirstMatch(PhoneNumberUtil.SECOND_NUMBER_START_PATTERN, candidate); + + PhoneNumberMatch match = extractMatch(candidate, start); + if (match != null) { + return match; + } + + index = start + candidate.length(); + maxTries--; + } + + return null; + } + + /** + * Trims away any characters after the first match of {@code pattern} in {@code candidate}, + * returning the trimmed version. + */ + private static CharSequence trimAfterFirstMatch(Pattern pattern, CharSequence candidate) { + Matcher trailingCharsMatcher = pattern.matcher(candidate); + if (trailingCharsMatcher.find()) { + candidate = candidate.subSequence(0, trailingCharsMatcher.start()); + } + return candidate; + } + + /** + * Helper method to determine if a character is a Latin-script letter or not. For our purposes, + * combining marks should also return true since we assume they have been added to a preceding + * Latin character. + */ + // @VisibleForTesting + static boolean isLatinLetter(char letter) { + // Combining marks are a subset of non-spacing-mark. + if (!Character.isLetter(letter) && Character.getType(letter) != Character.NON_SPACING_MARK) { + return false; + } + UnicodeBlock block = UnicodeBlock.of(letter); + return block.equals(UnicodeBlock.BASIC_LATIN) + || block.equals(UnicodeBlock.LATIN_1_SUPPLEMENT) + || block.equals(UnicodeBlock.LATIN_EXTENDED_A) + || block.equals(UnicodeBlock.LATIN_EXTENDED_ADDITIONAL) + || block.equals(UnicodeBlock.LATIN_EXTENDED_B) + || block.equals(UnicodeBlock.COMBINING_DIACRITICAL_MARKS); + } + + private static boolean isInvalidPunctuationSymbol(char character) { + return character == '%' || Character.getType(character) == Character.CURRENCY_SYMBOL; + } + + /** + * Attempts to extract a match from a {@code candidate} character sequence. + * + * @param candidate the candidate text that might contain a phone number + * @param offset the offset of {@code candidate} within {@link #text} + * @return the match found, null if none can be found + */ + private PhoneNumberMatch extractMatch(CharSequence candidate, int offset) { + // Skip a match that is more likely to be a date. + if (SLASH_SEPARATED_DATES.matcher(candidate).find()) { + return null; + } + + // Skip potential time-stamps. + if (TIME_STAMPS.matcher(candidate).find()) { + String followingText = text.toString().substring(offset + candidate.length()); + if (TIME_STAMPS_SUFFIX.matcher(followingText).lookingAt()) { + return null; + } + } + + // Try to come up with a valid match given the entire candidate. + PhoneNumberMatch match = parseAndVerify(candidate, offset); + if (match != null) { + return match; + } + + // If that failed, try to find an "inner match" - there might be a phone number within this + // candidate. + return extractInnerMatch(candidate, offset); + } + + /** + * Attempts to extract a match from {@code candidate} if the whole candidate does not qualify as a + * match. + * + * @param candidate the candidate text that might contain a phone number + * @param offset the current offset of {@code candidate} within {@link #text} + * @return the match found, null if none can be found + */ + private PhoneNumberMatch extractInnerMatch(CharSequence candidate, int offset) { + for (Pattern possibleInnerMatch : INNER_MATCHES) { + Matcher groupMatcher = possibleInnerMatch.matcher(candidate); + boolean isFirstMatch = true; + while (groupMatcher.find() && maxTries > 0) { + if (isFirstMatch) { + // We should handle any group before this one too. + CharSequence group = trimAfterFirstMatch( + PhoneNumberUtil.UNWANTED_END_CHAR_PATTERN, + candidate.subSequence(0, groupMatcher.start())); + PhoneNumberMatch match = parseAndVerify(group, offset); + if (match != null) { + return match; + } + maxTries--; + isFirstMatch = false; + } + CharSequence group = trimAfterFirstMatch( + PhoneNumberUtil.UNWANTED_END_CHAR_PATTERN, groupMatcher.group(1)); + PhoneNumberMatch match = parseAndVerify(group, offset + groupMatcher.start(1)); + if (match != null) { + return match; + } + maxTries--; + } + } + return null; + } + + /** + * Parses a phone number from the {@code candidate} using {@link PhoneNumberUtil#parse} and + * verifies it matches the requested {@link #leniency}. If parsing and verification succeed, a + * corresponding {@link PhoneNumberMatch} is returned, otherwise this method returns null. + * + * @param candidate the candidate match + * @param offset the offset of {@code candidate} within {@link #text} + * @return the parsed and validated phone number match, or null + */ + private PhoneNumberMatch parseAndVerify(CharSequence candidate, int offset) { + try { + // Check the candidate doesn't contain any formatting which would indicate that it really + // isn't a phone number. + if (!MATCHING_BRACKETS.matcher(candidate).matches() || PUB_PAGES.matcher(candidate).find()) { + return null; + } + + // If leniency is set to VALID or stricter, we also want to skip numbers that are surrounded + // by Latin alphabetic characters, to skip cases like abc8005001234 or 8005001234def. + if (leniency.compareTo(Leniency.VALID) >= 0) { + // If the candidate is not at the start of the text, and does not start with phone-number + // punctuation, check the previous character. + if (offset > 0 && !LEAD_CLASS.matcher(candidate).lookingAt()) { + char previousChar = text.charAt(offset - 1); + // We return null if it is a latin letter or an invalid punctuation symbol. + if (isInvalidPunctuationSymbol(previousChar) || isLatinLetter(previousChar)) { + return null; + } + } + int lastCharIndex = offset + candidate.length(); + if (lastCharIndex < text.length()) { + char nextChar = text.charAt(lastCharIndex); + if (isInvalidPunctuationSymbol(nextChar) || isLatinLetter(nextChar)) { + return null; + } + } + } + + PhoneNumber number = phoneUtil.parseAndKeepRawInput(candidate, preferredRegion); + + if (leniency.verify(number, candidate, phoneUtil, this)) { + // We used parseAndKeepRawInput to create this number, but for now we don't return the extra + // values parsed. TODO: stop clearing all values here and switch all users over + // to using rawInput() rather than the rawString() of PhoneNumberMatch. + number.clearCountryCodeSource(); + number.clearRawInput(); + number.clearPreferredDomesticCarrierCode(); + return new PhoneNumberMatch(offset, candidate.toString(), number); + } + } catch (NumberParseException e) { + // ignore and continue + } + return null; + } + + /** + * Small helper interface such that the number groups can be checked according to different + * criteria, both for our default way of performing formatting and for any alternate formats we + * may want to check. + */ + interface NumberGroupingChecker { + /** + * Returns true if the groups of digits found in our candidate phone number match our + * expectations. + * + * @param number the original number we found when parsing + * @param normalizedCandidate the candidate number, normalized to only contain ASCII digits, + * but with non-digits (spaces etc) retained + * @param expectedNumberGroups the groups of digits that we would expect to see if we + * formatted this number + */ + boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, String[] expectedNumberGroups); + } + + static boolean allNumberGroupsRemainGrouped(PhoneNumberUtil util, + PhoneNumber number, + StringBuilder normalizedCandidate, + String[] formattedNumberGroups) { + int fromIndex = 0; + if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + // First skip the country code if the normalized candidate contained it. + String countryCode = Integer.toString(number.getCountryCode()); + fromIndex = normalizedCandidate.indexOf(countryCode) + countryCode.length(); + } + // Check each group of consecutive digits are not broken into separate groupings in the + // {@code normalizedCandidate} string. + for (int i = 0; i < formattedNumberGroups.length; i++) { + // Fails if the substring of {@code normalizedCandidate} starting from {@code fromIndex} + // doesn't contain the consecutive digits in formattedNumberGroups[i]. + fromIndex = normalizedCandidate.indexOf(formattedNumberGroups[i], fromIndex); + if (fromIndex < 0) { + return false; + } + // Moves {@code fromIndex} forward. + fromIndex += formattedNumberGroups[i].length(); + if (i == 0 && fromIndex < normalizedCandidate.length()) { + // We are at the position right after the NDC. We get the region used for formatting + // information based on the country code in the phone number, rather than the number itself, + // as we do not need to distinguish between different countries with the same country + // calling code and this is faster. + String region = util.getRegionCodeForCountryCode(number.getCountryCode()); + if (util.getNddPrefixForRegion(region, true) != null + && Character.isDigit(normalizedCandidate.charAt(fromIndex))) { + // This means there is no formatting symbol after the NDC. In this case, we only + // accept the number if there is no formatting symbol at all in the number, except + // for extensions. This is only important for countries with national prefixes. + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + return normalizedCandidate.substring(fromIndex - formattedNumberGroups[i].length()) + .startsWith(nationalSignificantNumber); + } + } + } + // The check here makes sure that we haven't mistakenly already used the extension to + // match the last group of the subscriber number. Note the extension cannot have + // formatting in-between digits. + return normalizedCandidate.substring(fromIndex).contains(number.getExtension()); + } + + static boolean allNumberGroupsAreExactlyPresent(PhoneNumberUtil util, + PhoneNumber number, + StringBuilder normalizedCandidate, + String[] formattedNumberGroups) { + String[] candidateGroups = + PhoneNumberUtil.NON_DIGITS_PATTERN.split(normalizedCandidate.toString()); + // Set this to the last group, skipping it if the number has an extension. + int candidateNumberGroupIndex = + number.hasExtension() ? candidateGroups.length - 2 : candidateGroups.length - 1; + // First we check if the national significant number is formatted as a block. + // We use contains and not equals, since the national significant number may be present with + // a prefix such as a national number prefix, or the country code itself. + if (candidateGroups.length == 1 + || candidateGroups[candidateNumberGroupIndex].contains( + util.getNationalSignificantNumber(number))) { + return true; + } + // Starting from the end, go through in reverse, excluding the first group, and check the + // candidate and number groups are the same. + for (int formattedNumberGroupIndex = (formattedNumberGroups.length - 1); + formattedNumberGroupIndex > 0 && candidateNumberGroupIndex >= 0; + formattedNumberGroupIndex--, candidateNumberGroupIndex--) { + if (!candidateGroups[candidateNumberGroupIndex].equals( + formattedNumberGroups[formattedNumberGroupIndex])) { + return false; + } + } + // Now check the first group. There may be a national prefix at the start, so we only check + // that the candidate group ends with the formatted number group. + return (candidateNumberGroupIndex >= 0 + && candidateGroups[candidateNumberGroupIndex].endsWith(formattedNumberGroups[0])); + } + + /** + * Helper method to get the national-number part of a number, formatted without any national + * prefix, and return it as a set of digit blocks that would be formatted together following + * standard formatting rules. + */ + private static String[] getNationalNumberGroups(PhoneNumberUtil util, PhoneNumber number) { + // This will be in the format +CC-DG1-DG2-DGX;ext=EXT where DG1..DGX represents groups of + // digits. + String rfc3966Format = util.format(number, PhoneNumberFormat.RFC3966); + // We remove the extension part from the formatted string before splitting it into different + // groups. + int endIndex = rfc3966Format.indexOf(';'); + if (endIndex < 0) { + endIndex = rfc3966Format.length(); + } + // The country-code will have a '-' following it. + int startIndex = rfc3966Format.indexOf('-') + 1; + return rfc3966Format.substring(startIndex, endIndex).split("-"); + } + + /** + * Helper method to get the national-number part of a number, formatted without any national + * prefix, and return it as a set of digit blocks that should be formatted together according to + * the formatting pattern passed in. + */ + private static String[] getNationalNumberGroups(PhoneNumberUtil util, PhoneNumber number, + NumberFormat formattingPattern) { + // If a format is provided, we format the NSN only, and split that according to the separator. + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + return util.formatNsnUsingPattern(nationalSignificantNumber, + formattingPattern, PhoneNumberFormat.RFC3966).split("-"); + } + + boolean checkNumberGroupingIsValid( + PhoneNumber number, CharSequence candidate, PhoneNumberUtil util, + NumberGroupingChecker checker) { + StringBuilder normalizedCandidate = + PhoneNumberUtil.normalizeDigits(candidate, true /* keep non-digits */); + String[] formattedNumberGroups = getNationalNumberGroups(util, number); + if (checker.checkGroups(util, number, normalizedCandidate, formattedNumberGroups)) { + return true; + } + // If this didn't pass, see if there are any alternate formats that match, and try them instead. + PhoneMetadata alternateFormats = + DefaultMetadataDependenciesProvider.getInstance() + .getAlternateFormatsMetadataSource() + .getFormattingMetadataForCountryCallingCode(number.getCountryCode()); + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + if (alternateFormats != null) { + for (NumberFormat alternateFormat : alternateFormats.getNumberFormatList()) { + if (alternateFormat.getLeadingDigitsPatternCount() > 0) { + // There is only one leading digits pattern for alternate formats. + Pattern pattern = + regexCache.getPatternForRegex(alternateFormat.getLeadingDigitsPattern(0)); + if (!pattern.matcher(nationalSignificantNumber).lookingAt()) { + // Leading digits don't match; try another one. + continue; + } + } + formattedNumberGroups = getNationalNumberGroups(util, number, alternateFormat); + if (checker.checkGroups(util, number, normalizedCandidate, formattedNumberGroups)) { + return true; + } + } + } + return false; + } + + static boolean containsMoreThanOneSlashInNationalNumber(PhoneNumber number, String candidate) { + int firstSlashInBodyIndex = candidate.indexOf('/'); + if (firstSlashInBodyIndex < 0) { + // No slashes, this is okay. + return false; + } + // Now look for a second one. + int secondSlashInBodyIndex = candidate.indexOf('/', firstSlashInBodyIndex + 1); + if (secondSlashInBodyIndex < 0) { + // Only one slash, this is okay. + return false; + } + + // If the first slash is after the country calling code, this is permitted. + boolean candidateHasCountryCode = + (number.getCountryCodeSource() == CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN + || number.getCountryCodeSource() == CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + if (candidateHasCountryCode + && PhoneNumberUtil.normalizeDigitsOnly(candidate.substring(0, firstSlashInBodyIndex)) + .equals(Integer.toString(number.getCountryCode()))) { + // Any more slashes and this is illegal. + return candidate.substring(secondSlashInBodyIndex + 1).contains("/"); + } + return true; + } + + static boolean containsOnlyValidXChars( + PhoneNumber number, String candidate, PhoneNumberUtil util) { + // The characters 'x' and 'X' can be (1) a carrier code, in which case they always precede the + // national significant number or (2) an extension sign, in which case they always precede the + // extension number. We assume a carrier code is more than 1 digit, so the first case has to + // have more than 1 consecutive 'x' or 'X', whereas the second case can only have exactly 1 'x' + // or 'X'. We ignore the character if it appears as the last character of the string. + for (int index = 0; index < candidate.length() - 1; index++) { + char charAtIndex = candidate.charAt(index); + if (charAtIndex == 'x' || charAtIndex == 'X') { + char charAtNextIndex = candidate.charAt(index + 1); + if (charAtNextIndex == 'x' || charAtNextIndex == 'X') { + // This is the carrier code case, in which the 'X's always precede the national + // significant number. + index++; + if (util.isNumberMatch(number, candidate.substring(index)) != MatchType.NSN_MATCH) { + return false; + } + // This is the extension sign case, in which the 'x' or 'X' should always precede the + // extension number. + } else if (!PhoneNumberUtil.normalizeDigitsOnly(candidate.substring(index)).equals( + number.getExtension())) { + return false; + } + } + } + return true; + } + + static boolean isNationalPrefixPresentIfRequired(PhoneNumber number, PhoneNumberUtil util) { + // First, check how we deduced the country code. If it was written in international format, then + // the national prefix is not required. + if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + return true; + } + String phoneNumberRegion = + util.getRegionCodeForCountryCode(number.getCountryCode()); + PhoneMetadata metadata = util.getMetadataForRegion(phoneNumberRegion); + if (metadata == null) { + return true; + } + // Check if a national prefix should be present when formatting this number. + String nationalNumber = util.getNationalSignificantNumber(number); + NumberFormat formatRule = + util.chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber); + // To do this, we check that a national prefix formatting rule was present and that it wasn't + // just the first-group symbol ($1) with punctuation. + if ((formatRule != null) && formatRule.getNationalPrefixFormattingRule().length() > 0) { + if (formatRule.getNationalPrefixOptionalWhenFormatting()) { + // The national-prefix is optional in these cases, so we don't need to check if it was + // present. + return true; + } + if (PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + formatRule.getNationalPrefixFormattingRule())) { + // National Prefix not needed for this number. + return true; + } + // Normalize the remainder. + String rawInputCopy = PhoneNumberUtil.normalizeDigitsOnly(number.getRawInput()); + StringBuilder rawInput = new StringBuilder(rawInputCopy); + // Check if we found a national prefix and/or carrier code at the start of the raw input, and + // return the result. + return util.maybeStripNationalPrefixAndCarrierCode(rawInput, metadata, null); + } + return true; + } + + @Override + public boolean hasNext() { + if (state == State.NOT_READY) { + lastMatch = find(searchIndex); + if (lastMatch == null) { + state = State.DONE; + } else { + searchIndex = lastMatch.end(); + state = State.READY; + } + } + return state == State.READY; + } + + @Override + public PhoneNumberMatch next() { + // Check the state and find the next match as a side-effect if necessary. + if (!hasNext()) { + throw new NoSuchElementException(); + } + + // Don't retain that memory any longer than necessary. + PhoneNumberMatch result = lastMatch; + lastMatch = null; + state = State.NOT_READY; + return result; + } + + /** + * Always throws {@link UnsupportedOperationException} as removal is not supported. + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java new file mode 100644 index 0000000000..fd8f1a3067 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -0,0 +1,3683 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; +import com.google.i18n.phonenumbers.internal.MatcherApi; +import com.google.i18n.phonenumbers.internal.RegexBasedMatcher; +import com.google.i18n.phonenumbers.internal.RegexCache; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility for international phone numbers. Functionality includes formatting, parsing and + * validation. + * + *

If you use this library, and want to be notified about important changes, please sign up to + * our mailing list. + * + * NOTE: A lot of methods in this class require Region Code strings. These must be provided using + * CLDR two-letter region-code format. These should be in upper-case. The list of the codes + * can be found here: + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + */ +public class PhoneNumberUtil { + private static final Logger logger = Logger.getLogger(PhoneNumberUtil.class.getName()); + + /** Flags to use when compiling regular expressions for phone numbers. */ + static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; + // The minimum and maximum length of the national significant number. + private static final int MIN_LENGTH_FOR_NSN = 2; + // The ITU says the maximum length should be 15, but we have found longer numbers in Germany. + static final int MAX_LENGTH_FOR_NSN = 17; + // The maximum length of the country calling code. + static final int MAX_LENGTH_COUNTRY_CODE = 3; + // We don't allow input strings for parsing to be longer than 250 chars. This prevents malicious + // input from overflowing the regular-expression engine. + private static final int MAX_INPUT_STRING_LENGTH = 250; + + // Region-code for the unknown region. + private static final String UNKNOWN_REGION = "ZZ"; + + private static final int NANPA_COUNTRY_CODE = 1; + + // Map of country calling codes that use a mobile token before the area code. One example of when + // this is relevant is when determining the length of the national destination code, which should + // be the length of the area code plus the length of the mobile token. + private static final Map MOBILE_TOKEN_MAPPINGS; + + // Set of country codes that have geographically assigned mobile numbers (see GEO_MOBILE_COUNTRIES + // below) which are not based on *area codes*. For example, in China mobile numbers start with a + // carrier indicator, and beyond that are geographically assigned: this carrier indicator is not + // considered to be an area code. + private static final Set GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES; + + // Set of country codes that doesn't have national prefix, but it has area codes. + private static final Set COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES; + + // Set of country calling codes that have geographically assigned mobile numbers. This may not be + // complete; we add calling codes case by case, as we find geographical mobile numbers or hear + // from user reports. Note that countries like the US, where we can't distinguish between + // fixed-line or mobile numbers, are not listed here, since we consider FIXED_LINE_OR_MOBILE to be + // a possibly geographically-related type anyway (like FIXED_LINE). + private static final Set GEO_MOBILE_COUNTRIES; + + // The PLUS_SIGN signifies the international prefix. + static final char PLUS_SIGN = '+'; + + private static final char STAR_SIGN = '*'; + + private static final String RFC3966_EXTN_PREFIX = ";ext="; + private static final String RFC3966_PREFIX = "tel:"; + private static final String RFC3966_PHONE_CONTEXT = ";phone-context="; + private static final String RFC3966_ISDN_SUBADDRESS = ";isub="; + + // A map that contains characters that are essential when dialling. That means any of the + // characters in this map must not be removed from a number when dialling, otherwise the call + // will not reach the intended destination. + private static final Map DIALLABLE_CHAR_MAPPINGS; + + // Only upper-case variants of alpha characters are stored. + private static final Map ALPHA_MAPPINGS; + + // For performance reasons, amalgamate both into one map. + private static final Map ALPHA_PHONE_MAPPINGS; + + // Separate map of all symbols that we wish to retain when formatting alpha numbers. This + // includes digits, ASCII letters and number grouping symbols such as "-" and " ". + private static final Map ALL_PLUS_NUMBER_GROUPING_SYMBOLS; + + static { + HashMap mobileTokenMap = new HashMap<>(); + mobileTokenMap.put(54, "9"); + MOBILE_TOKEN_MAPPINGS = Collections.unmodifiableMap(mobileTokenMap); + + HashSet geoMobileCountriesWithoutMobileAreaCodes = new HashSet<>(); + geoMobileCountriesWithoutMobileAreaCodes.add(86); // China + GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES = + Collections.unmodifiableSet(geoMobileCountriesWithoutMobileAreaCodes); + + HashSet countriesWithoutNationalPrefixWithAreaCodes = new HashSet<>(); + countriesWithoutNationalPrefixWithAreaCodes.add(52); // Mexico + COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES = + Collections.unmodifiableSet(countriesWithoutNationalPrefixWithAreaCodes); + + HashSet geoMobileCountries = new HashSet<>(); + geoMobileCountries.add(52); // Mexico + geoMobileCountries.add(54); // Argentina + geoMobileCountries.add(55); // Brazil + geoMobileCountries.add(62); // Indonesia: some prefixes only (fixed CMDA wireless) + geoMobileCountries.addAll(geoMobileCountriesWithoutMobileAreaCodes); + GEO_MOBILE_COUNTRIES = Collections.unmodifiableSet(geoMobileCountries); + + // Simple ASCII digits map used to populate ALPHA_PHONE_MAPPINGS and + // ALL_PLUS_NUMBER_GROUPING_SYMBOLS. + HashMap asciiDigitMappings = new HashMap<>(); + asciiDigitMappings.put('0', '0'); + asciiDigitMappings.put('1', '1'); + asciiDigitMappings.put('2', '2'); + asciiDigitMappings.put('3', '3'); + asciiDigitMappings.put('4', '4'); + asciiDigitMappings.put('5', '5'); + asciiDigitMappings.put('6', '6'); + asciiDigitMappings.put('7', '7'); + asciiDigitMappings.put('8', '8'); + asciiDigitMappings.put('9', '9'); + + HashMap alphaMap = new HashMap<>(40); + alphaMap.put('A', '2'); + alphaMap.put('B', '2'); + alphaMap.put('C', '2'); + alphaMap.put('D', '3'); + alphaMap.put('E', '3'); + alphaMap.put('F', '3'); + alphaMap.put('G', '4'); + alphaMap.put('H', '4'); + alphaMap.put('I', '4'); + alphaMap.put('J', '5'); + alphaMap.put('K', '5'); + alphaMap.put('L', '5'); + alphaMap.put('M', '6'); + alphaMap.put('N', '6'); + alphaMap.put('O', '6'); + alphaMap.put('P', '7'); + alphaMap.put('Q', '7'); + alphaMap.put('R', '7'); + alphaMap.put('S', '7'); + alphaMap.put('T', '8'); + alphaMap.put('U', '8'); + alphaMap.put('V', '8'); + alphaMap.put('W', '9'); + alphaMap.put('X', '9'); + alphaMap.put('Y', '9'); + alphaMap.put('Z', '9'); + ALPHA_MAPPINGS = Collections.unmodifiableMap(alphaMap); + + HashMap combinedMap = new HashMap<>(100); + combinedMap.putAll(ALPHA_MAPPINGS); + combinedMap.putAll(asciiDigitMappings); + ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap); + + HashMap diallableCharMap = new HashMap<>(); + diallableCharMap.putAll(asciiDigitMappings); + diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); + diallableCharMap.put('*', '*'); + diallableCharMap.put('#', '#'); + DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); + + HashMap allPlusNumberGroupings = new HashMap<>(); + // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. + for (char c : ALPHA_MAPPINGS.keySet()) { + allPlusNumberGroupings.put(Character.toLowerCase(c), c); + allPlusNumberGroupings.put(c, c); + } + allPlusNumberGroupings.putAll(asciiDigitMappings); + // Put grouping symbols. + allPlusNumberGroupings.put('-', '-'); + allPlusNumberGroupings.put('\uFF0D', '-'); + allPlusNumberGroupings.put('\u2010', '-'); + allPlusNumberGroupings.put('\u2011', '-'); + allPlusNumberGroupings.put('\u2012', '-'); + allPlusNumberGroupings.put('\u2013', '-'); + allPlusNumberGroupings.put('\u2014', '-'); + allPlusNumberGroupings.put('\u2015', '-'); + allPlusNumberGroupings.put('\u2212', '-'); + allPlusNumberGroupings.put('/', '/'); + allPlusNumberGroupings.put('\uFF0F', '/'); + allPlusNumberGroupings.put(' ', ' '); + allPlusNumberGroupings.put('\u3000', ' '); + allPlusNumberGroupings.put('\u2060', ' '); + allPlusNumberGroupings.put('.', '.'); + allPlusNumberGroupings.put('\uFF0E', '.'); + ALL_PLUS_NUMBER_GROUPING_SYMBOLS = Collections.unmodifiableMap(allPlusNumberGroupings); + } + + // Pattern that makes it easy to distinguish whether a region has a single international dialing + // prefix or not. If a region has a single international prefix (e.g. 011 in USA), it will be + // represented as a string that contains a sequence of ASCII digits, and possibly a tilde, which + // signals waiting for the tone. If there are multiple available international prefixes in a + // region, they will be represented as a regex string that always contains one or more characters + // that are not ASCII digits or a tilde. + private static final Pattern SINGLE_INTERNATIONAL_PREFIX = + Pattern.compile("[\\d]+(?:[~\u2053\u223C\uFF5E][\\d]+)?"); + + // Regular expression of acceptable punctuation found in phone numbers, used to find numbers in + // text and to decide what is a viable phone number. This excludes diallable characters. + // This consists of dash characters, white space characters, full stops, slashes, + // square brackets, parentheses and tildes. It also includes the letter 'x' as that is found as a + // placeholder for carrier information in some phone numbers. Full-width variants are also + // present. + static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " + + "\u00A0\u00AD\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E"; + + private static final String DIGITS = "\\p{Nd}"; + // We accept alpha characters in phone numbers, ASCII only, upper and lower case. + private static final String VALID_ALPHA = + Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()).replaceAll("[, \\[\\]]", "") + + Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()) + .toLowerCase().replaceAll("[, \\[\\]]", ""); + static final String PLUS_CHARS = "+\uFF0B"; + static final Pattern PLUS_CHARS_PATTERN = Pattern.compile("[" + PLUS_CHARS + "]+"); + private static final Pattern SEPARATOR_PATTERN = Pattern.compile("[" + VALID_PUNCTUATION + "]+"); + private static final Pattern CAPTURING_DIGIT_PATTERN = Pattern.compile("(" + DIGITS + ")"); + + // Regular expression of acceptable characters that may start a phone number for the purposes of + // parsing. This allows us to strip away meaningless prefixes to phone numbers that may be + // mistakenly given to us. This consists of digits, the plus symbol and arabic-indic digits. This + // does not contain alpha characters, although they may be used later in the number. It also does + // not include other punctuation, as this will be stripped later during parsing and is of no + // information value when parsing a number. + private static final String VALID_START_CHAR = "[" + PLUS_CHARS + DIGITS + "]"; + private static final Pattern VALID_START_CHAR_PATTERN = Pattern.compile(VALID_START_CHAR); + + // Regular expression of characters typically used to start a second phone number for the purposes + // of parsing. This allows us to strip off parts of the number that are actually the start of + // another number, such as for: (530) 583-6985 x302/x2303 -> the second extension here makes this + // actually two phone numbers, (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second + // extension so that the first number is parsed correctly. + private static final String SECOND_NUMBER_START = "[\\\\/] *x"; + static final Pattern SECOND_NUMBER_START_PATTERN = Pattern.compile(SECOND_NUMBER_START); + + // Regular expression of trailing characters that we want to remove. We remove all characters that + // are not alpha or numerical characters. The hash character is retained here, as it may signify + // the previous block was an extension. + private static final String UNWANTED_END_CHARS = "[[\\P{N}&&\\P{L}]&&[^#]]+$"; + static final Pattern UNWANTED_END_CHAR_PATTERN = Pattern.compile(UNWANTED_END_CHARS); + + // We use this pattern to check if the phone number has at least three letters in it - if so, then + // we treat it as a number where some phone-number digits are represented by letters. + private static final Pattern VALID_ALPHA_PHONE_PATTERN = Pattern.compile("(?:.*?[A-Za-z]){3}.*"); + + // Regular expression of viable phone numbers. This is location independent. Checks we have at + // least three leading digits, and only valid punctuation, alpha characters and + // digits in the phone number. Does not include extension data. + // The symbol 'x' is allowed here as valid punctuation since it is often used as a placeholder for + // carrier codes, for example in Brazilian phone numbers. We also allow multiple "+" characters at + // the start. + // Corresponds to the following: + // [digits]{minLengthNsn}| + // plus_sign*(([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])* + // + // The first reg-ex is to allow short numbers (two digits long) to be parsed if they are entered + // as "15" etc, but only if there is no punctuation in them. The second expression restricts the + // number of digits to three or more, but then allows them to be in international form, and to + // have alpha-characters and punctuation. + // + // Note VALID_PUNCTUATION starts with a -, so must be the first in the range. + private static final String VALID_PHONE_NUMBER = + DIGITS + "{" + MIN_LENGTH_FOR_NSN + "}" + "|" + + "[" + PLUS_CHARS + "]*+(?:[" + VALID_PUNCTUATION + STAR_SIGN + "]*" + DIGITS + "){3,}[" + + VALID_PUNCTUATION + STAR_SIGN + VALID_ALPHA + DIGITS + "]*"; + + // Default extension prefix to use when formatting. This will be put in front of any extension + // component of the number, after the main national number is formatted. For example, if you wish + // the default extension formatting to be " extn: 3456", then you should specify " extn: " here + // as the default extension prefix. This can be overridden by region-specific preferences. + private static final String DEFAULT_EXTN_PREFIX = " ext. "; + + // Regexp of all possible ways to write extensions, for use when parsing. This will be run as a + // case-insensitive regexp match. Wide character versions are also provided after each ASCII + // version. + private static final String EXTN_PATTERNS_FOR_PARSING = createExtnPattern(true); + static final String EXTN_PATTERNS_FOR_MATCHING = createExtnPattern(false); + + // Regular expression of valid global-number-digits for the phone-context parameter, following the + // syntax defined in RFC3966. + private static final String RFC3966_VISUAL_SEPARATOR = "[\\-\\.\\(\\)]?"; + private static final String RFC3966_PHONE_DIGIT = + "(" + DIGITS + "|" + RFC3966_VISUAL_SEPARATOR + ")"; + private static final String RFC3966_GLOBAL_NUMBER_DIGITS = + "^\\" + PLUS_SIGN + RFC3966_PHONE_DIGIT + "*" + DIGITS + RFC3966_PHONE_DIGIT + "*$"; + static final Pattern RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN = + Pattern.compile(RFC3966_GLOBAL_NUMBER_DIGITS); + + // Regular expression of valid domainname for the phone-context parameter, following the syntax + // defined in RFC3966. + private static final String ALPHANUM = VALID_ALPHA + DIGITS; + private static final String RFC3966_DOMAINLABEL = + "[" + ALPHANUM + "]+((\\-)*[" + ALPHANUM + "])*"; + private static final String RFC3966_TOPLABEL = + "[" + VALID_ALPHA + "]+((\\-)*[" + ALPHANUM + "])*"; + private static final String RFC3966_DOMAINNAME = + "^(" + RFC3966_DOMAINLABEL + "\\.)*" + RFC3966_TOPLABEL + "\\.?$"; + static final Pattern RFC3966_DOMAINNAME_PATTERN = Pattern.compile(RFC3966_DOMAINNAME); + + /** + * Helper method for constructing regular expressions for parsing. Creates an expression that + * captures up to maxLength digits. + */ + private static String extnDigits(int maxLength) { + return "(" + DIGITS + "{1," + maxLength + "})"; + } + + /** + * Helper initialiser method to create the regular-expression pattern to match extensions. + * Note that there are currently six capturing groups for the extension itself. If this number is + * changed, MaybeStripExtension needs to be updated. + */ + private static String createExtnPattern(boolean forParsing) { + // We cap the maximum length of an extension based on the ambiguity of the way the extension is + // prefixed. As per ITU, the officially allowed length for extensions is actually 40, but we + // don't support this since we haven't seen real examples and this introduces many false + // interpretations as the extension labels are not standardized. + int extLimitAfterExplicitLabel = 20; + int extLimitAfterLikelyLabel = 15; + int extLimitAfterAmbiguousChar = 9; + int extLimitWhenNotSure = 6; + + String possibleSeparatorsBetweenNumberAndExtLabel = "[ \u00A0\\t,]*"; + // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas. + String possibleCharsAfterExtLabel = "[:\\.\uFF0E]?[ \u00A0\\t,-]*"; + String optionalExtnSuffix = "#?"; + + // Here the extension is called out in more explicit way, i.e mentioning it obvious patterns + // like "ext.". Canonical-equivalence doesn't seem to be an option with Android java, so we + // allow two options for representing the accented o - the character itself, and one in the + // unicode decomposed form with the combining acute accent. + String explicitExtLabels = + "(?:e?xt(?:ensi(?:o\u0301?|\u00F3))?n?|\uFF45?\uFF58\uFF54\uFF4E?|\u0434\u043E\u0431|anexo)"; + // One-character symbols that can be used to indicate an extension, and less commonly used + // or more ambiguous extension labels. + String ambiguousExtLabels = "(?:[x\uFF58#\uFF03~\uFF5E]|int|\uFF49\uFF4E\uFF54)"; + // When extension is not separated clearly. + String ambiguousSeparator = "[- ]+"; + + String rfcExtn = RFC3966_EXTN_PREFIX + extnDigits(extLimitAfterExplicitLabel); + String explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + + possibleCharsAfterExtLabel + extnDigits(extLimitAfterExplicitLabel) + + optionalExtnSuffix; + String ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + + possibleCharsAfterExtLabel + extnDigits(extLimitAfterAmbiguousChar) + optionalExtnSuffix; + String americanStyleExtnWithSuffix = ambiguousSeparator + extnDigits(extLimitWhenNotSure) + "#"; + + // The first regular expression covers RFC 3966 format, where the extension is added using + // ";ext=". The second more generic where extension is mentioned with explicit labels like + // "ext:". In both the above cases we allow more numbers in extension than any other extension + // labels. The third one captures when single character extension labels or less commonly used + // labels are used. In such cases we capture fewer extension digits in order to reduce the + // chance of falsely interpreting two numbers beside each other as a number + extension. The + // fourth one covers the special case of American numbers where the extension is written with a + // hash at the end, such as "- 503#". + String extensionPattern = + rfcExtn + "|" + + explicitExtn + "|" + + ambiguousExtn + "|" + + americanStyleExtnWithSuffix; + // Additional pattern that is supported when parsing extensions, not when matching. + if (forParsing) { + // This is same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching comma as + // extension label may have it. + String possibleSeparatorsNumberExtLabelNoComma = "[ \u00A0\\t]*"; + // ",," is commonly used for auto dialling the extension when connected. First comma is matched + // through possibleSeparatorsBetweenNumberAndExtLabel, so we do not repeat it here. Semi-colon + // works in Iphone and Android also to pop up a button with the extension number following. + String autoDiallingAndExtLabelsFound = "(?:,{2}|;)"; + + String autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + + extnDigits(extLimitAfterLikelyLabel) + optionalExtnSuffix; + String onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + + "(?:,)+" + possibleCharsAfterExtLabel + extnDigits(extLimitAfterAmbiguousChar) + + optionalExtnSuffix; + // Here the first pattern is exclusively for extension autodialling formats which are used + // when dialling and in this case we accept longer extensions. However, the second pattern + // is more liberal on the number of commas that acts as extension labels, so we have a strict + // cap on the number of digits in such extensions. + return extensionPattern + "|" + + autoDiallingExtn + "|" + + onlyCommasExtn; + } + return extensionPattern; + } + + // Regexp of all known extension prefixes used by different regions followed by 1 or more valid + // digits, for use when parsing. + private static final Pattern EXTN_PATTERN = + Pattern.compile("(?:" + EXTN_PATTERNS_FOR_PARSING + ")$", REGEX_FLAGS); + + // We append optionally the extension pattern to the end here, as a valid phone number may + // have an extension prefix appended, followed by 1 or more digits. + private static final Pattern VALID_PHONE_NUMBER_PATTERN = + Pattern.compile(VALID_PHONE_NUMBER + "(?:" + EXTN_PATTERNS_FOR_PARSING + ")?", REGEX_FLAGS); + + static final Pattern NON_DIGITS_PATTERN = Pattern.compile("(\\D+)"); + + // The FIRST_GROUP_PATTERN was originally set to $1 but there are some countries for which the + // first group is not used in the national pattern (e.g. Argentina) so the $1 group does not match + // correctly. Therefore, we use \d, so that the first group actually used in the pattern will be + // matched. + private static final Pattern FIRST_GROUP_PATTERN = Pattern.compile("(\\$\\d)"); + // Constants used in the formatting rules to represent the national prefix, first group and + // carrier code respectively. + private static final String NP_STRING = "$NP"; + private static final String FG_STRING = "$FG"; + private static final String CC_STRING = "$CC"; + + // A pattern that is used to determine if the national prefix formatting rule has the first group + // only, i.e., does not start with the national prefix. Note that the pattern explicitly allows + // for unbalanced parentheses. + private static final Pattern FIRST_GROUP_ONLY_PREFIX_PATTERN = Pattern.compile("\\(?\\$1\\)?"); + + private static PhoneNumberUtil instance = null; + + public static final String REGION_CODE_FOR_NON_GEO_ENTITY = "001"; + + /** + * INTERNATIONAL and NATIONAL formats are consistent with the definition in ITU-T Recommendation + * E.123. However we follow local conventions such as using '-' instead of whitespace as + * separators. For example, the number of the Google Switzerland office will be written as + * "+41 44 668 1800" in INTERNATIONAL format, and as "044 668 1800" in NATIONAL format. E164 + * format is as per INTERNATIONAL format but with no formatting applied, e.g. "+41446681800". + * RFC3966 is as per INTERNATIONAL format, but with all spaces and other separating symbols + * replaced with a hyphen, and with any phone number extension appended with ";ext=". It also + * will have a prefix of "tel:" added, e.g. "tel:+41-44-668-1800". + * + * Note: If you are considering storing the number in a neutral format, you are highly advised to + * use the PhoneNumber class. + */ + public enum PhoneNumberFormat { + E164, + INTERNATIONAL, + NATIONAL, + RFC3966 + } + + /** + * Type of phone numbers. + */ + public enum PhoneNumberType { + FIXED_LINE, + MOBILE, + // In some regions (e.g. the USA), it is impossible to distinguish between fixed-line and + // mobile numbers by looking at the phone number itself. + FIXED_LINE_OR_MOBILE, + // Freephone lines + TOLL_FREE, + PREMIUM_RATE, + // The cost of this call is shared between the caller and the recipient, and is hence typically + // less than PREMIUM_RATE calls. See // http://en.wikipedia.org/wiki/Shared_Cost_Service for + // more information. + SHARED_COST, + // Voice over IP numbers. This includes TSoIP (Telephony Service over IP). + VOIP, + // A personal number is associated with a particular person, and may be routed to either a + // MOBILE or FIXED_LINE number. Some more information can be found here: + // http://en.wikipedia.org/wiki/Personal_Numbers + PERSONAL_NUMBER, + PAGER, + // Used for "Universal Access Numbers" or "Company Numbers". They may be further routed to + // specific offices, but allow one number to be used for a company. + UAN, + // Used for "Voice Mail Access Numbers". + VOICEMAIL, + // A phone number is of type UNKNOWN when it does not fit any of the known patterns for a + // specific region. + UNKNOWN + } + + /** + * Types of phone number matches. See detailed description beside the isNumberMatch() method. + */ + public enum MatchType { + NOT_A_NUMBER, + NO_MATCH, + SHORT_NSN_MATCH, + NSN_MATCH, + EXACT_MATCH, + } + + /** + * Possible outcomes when testing if a PhoneNumber is possible. + */ + public enum ValidationResult { + /** The number length matches that of valid numbers for this region. */ + IS_POSSIBLE, + /** + * The number length matches that of local numbers for this region only (i.e. numbers that may + * be able to be dialled within an area, but do not have all the information to be dialled from + * anywhere inside or outside the country). + */ + IS_POSSIBLE_LOCAL_ONLY, + /** The number has an invalid country calling code. */ + INVALID_COUNTRY_CODE, + /** The number is shorter than all valid numbers for this region. */ + TOO_SHORT, + /** + * The number is longer than the shortest valid numbers for this region, shorter than the + * longest valid numbers for this region, and does not itself have a number length that matches + * valid numbers for this region. This can also be returned in the case where + * isPossibleNumberForTypeWithReason was called, and there are no numbers of this type at all + * for this region. + */ + INVALID_LENGTH, + /** The number is longer than all valid numbers for this region. */ + TOO_LONG, + } + + /** + * Leniency when {@linkplain PhoneNumberUtil#findNumbers finding} potential phone numbers in text + * segments. The levels here are ordered in increasing strictness. + */ + public enum Leniency { + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber) + * possible}, but not necessarily {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. + */ + POSSIBLE { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + return util.isPossibleNumber(number); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber) + * possible} and {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. Numbers written + * in national format must have their national-prefix present if it is usually written for a + * number of this type. + */ + VALID { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidate.toString(), util)) { + return false; + } + return PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid} and + * are grouped in a possible way for this locale. For example, a US number written as + * "65 02 53 00 00" and "650253 0000" are not accepted at this leniency level, whereas + * "650 253 0000", "650 2530000" or "6502530000" are. + * Numbers with more than one '/' symbol in the national significant number are also dropped at + * this level. + *

+ * Warning: This level might result in lower coverage especially for regions outside of country + * code "+1". If you are not sure about which level to use, email the discussion group + * libphonenumber-discuss@googlegroups.com. + */ + STRICT_GROUPING { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + String candidateString = candidate.toString(); + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidateString, util) + || PhoneNumberMatcher.containsMoreThanOneSlashInNationalNumber(number, candidateString) + || !PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util)) { + return false; + } + return matcher.checkNumberGroupingIsValid( + number, candidate, util, new PhoneNumberMatcher.NumberGroupingChecker() { + @Override + public boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, + String[] expectedNumberGroups) { + return PhoneNumberMatcher.allNumberGroupsRemainGrouped( + util, number, normalizedCandidate, expectedNumberGroups); + } + }); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid} and + * are grouped in the same way that we would have formatted it, or as a single block. For + * example, a US number written as "650 2530000" is not accepted at this leniency level, whereas + * "650 253 0000" or "6502530000" are. + * Numbers with more than one '/' symbol are also dropped at this level. + *

+ * Warning: This level might result in lower coverage especially for regions outside of country + * code "+1". If you are not sure about which level to use, email the discussion group + * libphonenumber-discuss@googlegroups.com. + */ + EXACT_GROUPING { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + String candidateString = candidate.toString(); + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidateString, util) + || PhoneNumberMatcher.containsMoreThanOneSlashInNationalNumber(number, candidateString) + || !PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util)) { + return false; + } + return matcher.checkNumberGroupingIsValid( + number, candidate, util, new PhoneNumberMatcher.NumberGroupingChecker() { + @Override + public boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, + String[] expectedNumberGroups) { + return PhoneNumberMatcher.allNumberGroupsAreExactlyPresent( + util, number, normalizedCandidate, expectedNumberGroups); + } + }); + } + }; + + /** Returns true if {@code number} is a verified number according to this leniency. */ + abstract boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher); + } + + // A source of metadata for different regions. + private final MetadataSource metadataSource; + + // A mapping from a country calling code to the region codes which denote the region represented + // by that country calling code. In the case of multiple regions sharing a calling code, such as + // the NANPA regions, the one indicated with "isMainCountryForCode" in the metadata should be + // first. + private final Map> countryCallingCodeToRegionCodeMap; + + // An API for validation checking. + private final MatcherApi matcherApi = RegexBasedMatcher.create(); + + // The set of regions that share country calling code 1. + // There are roughly 26 regions. + // We set the initial capacity of the HashSet to 35 to offer a load factor of roughly 0.75. + private final Set nanpaRegions = new HashSet<>(35); + + // A cache for frequently used region-specific regular expressions. + // The initial capacity is set to 100 as this seems to be an optimal value for Android, based on + // performance measurements. + private final RegexCache regexCache = new RegexCache(100); + + // The set of regions the library supports. + // There are roughly 240 of them and we set the initial capacity of the HashSet to 320 to offer a + // load factor of roughly 0.75. + private final Set supportedRegions = new HashSet<>(320); + + // The set of country calling codes that map to the non-geo entity region ("001"). This set + // currently contains < 12 elements so the default capacity of 16 (load factor=0.75) is fine. + private final Set countryCodesForNonGeographicalRegion = new HashSet<>(); + + /** + * This class implements a singleton, the constructor is only visible to facilitate testing. + */ + // @VisibleForTesting + PhoneNumberUtil(MetadataSource metadataSource, + Map> countryCallingCodeToRegionCodeMap) { + this.metadataSource = metadataSource; + this.countryCallingCodeToRegionCodeMap = countryCallingCodeToRegionCodeMap; + for (Map.Entry> entry : countryCallingCodeToRegionCodeMap.entrySet()) { + List regionCodes = entry.getValue(); + // We can assume that if the country calling code maps to the non-geo entity region code then + // that's the only region code it maps to. + if (regionCodes.size() == 1 && REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCodes.get(0))) { + // This is the subset of all country codes that map to the non-geo entity region code. + countryCodesForNonGeographicalRegion.add(entry.getKey()); + } else { + // The supported regions set does not include the "001" non-geo entity region code. + supportedRegions.addAll(regionCodes); + } + } + // If the non-geo entity still got added to the set of supported regions it must be because + // there are entries that list the non-geo entity alongside normal regions (which is wrong). + // If we discover this, remove the non-geo entity from the set of supported regions and log. + if (supportedRegions.remove(REGION_CODE_FOR_NON_GEO_ENTITY)) { + logger.log(Level.WARNING, "invalid metadata (country calling code was mapped to the non-geo " + + "entity as well as specific region(s))"); + } + nanpaRegions.addAll(countryCallingCodeToRegionCodeMap.get(NANPA_COUNTRY_CODE)); + } + + /** + * Attempts to extract a possible number from the string passed in. This currently strips all + * leading characters that cannot be used to start a phone number. Characters that can be used to + * start a phone number are defined in the VALID_START_CHAR_PATTERN. If none of these characters + * are found in the number passed in, an empty string is returned. This function also attempts to + * strip off any alternative extensions or endings if two or more are present, such as in the case + * of: (530) 583-6985 x302/x2303. The second extension here makes this actually two phone numbers, + * (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second extension so that the first + * number is parsed correctly. + * + * @param number the string that might contain a phone number + * @return the number, stripped of any non-phone-number prefix (such as "Tel:") or an empty + * string if no character used to start phone numbers (such as + or any digit) is found in the + * number + */ + static CharSequence extractPossibleNumber(CharSequence number) { + Matcher m = VALID_START_CHAR_PATTERN.matcher(number); + if (m.find()) { + number = number.subSequence(m.start(), number.length()); + // Remove trailing non-alpha non-numerical characters. + Matcher trailingCharsMatcher = UNWANTED_END_CHAR_PATTERN.matcher(number); + if (trailingCharsMatcher.find()) { + number = number.subSequence(0, trailingCharsMatcher.start()); + } + // Check for extra numbers at the end. + Matcher secondNumber = SECOND_NUMBER_START_PATTERN.matcher(number); + if (secondNumber.find()) { + number = number.subSequence(0, secondNumber.start()); + } + return number; + } else { + return ""; + } + } + + /** + * Checks to see if the string of characters could possibly be a phone number at all. At the + * moment, checks to see that the string begins with at least 2 digits, ignoring any punctuation + * commonly found in phone numbers. + * This method does not require the number to be normalized in advance - but does assume that + * leading non-number symbols have been removed, such as by the method extractPossibleNumber. + * + * @param number string to be checked for viability as a phone number + * @return true if the number could be a phone number of some sort, otherwise false + */ + // @VisibleForTesting + static boolean isViablePhoneNumber(CharSequence number) { + if (number.length() < MIN_LENGTH_FOR_NSN) { + return false; + } + Matcher m = VALID_PHONE_NUMBER_PATTERN.matcher(number); + return m.matches(); + } + + /** + * Normalizes a string of characters representing a phone number. This performs the following + * conversions: + * - Punctuation is stripped. + * For ALPHA/VANITY numbers: + * - Letters are converted to their numeric representation on a telephone keypad. The keypad + * used here is the one defined in ITU Recommendation E.161. This is only done if there are 3 + * or more letters in the number, to lessen the risk that such letters are typos. + * For other numbers: + * - Wide-ascii digits are converted to normal ASCII (European) digits. + * - Arabic-Indic numerals are converted to European numerals. + * - Spurious alpha characters are stripped. + * + * @param number a StringBuilder of characters representing a phone number that will be + * normalized in place + */ + static StringBuilder normalize(StringBuilder number) { + Matcher m = VALID_ALPHA_PHONE_PATTERN.matcher(number); + if (m.matches()) { + number.replace(0, number.length(), normalizeHelper(number, ALPHA_PHONE_MAPPINGS, true)); + } else { + number.replace(0, number.length(), normalizeDigitsOnly(number)); + } + return number; + } + + /** + * Normalizes a string of characters representing a phone number. This converts wide-ascii and + * arabic-indic numerals to European numerals, and strips punctuation and alpha characters. + * + * @param number a string of characters representing a phone number + * @return the normalized string version of the phone number + */ + public static String normalizeDigitsOnly(CharSequence number) { + return normalizeDigits(number, false /* strip non-digits */).toString(); + } + + static StringBuilder normalizeDigits(CharSequence number, boolean keepNonDigits) { + StringBuilder normalizedDigits = new StringBuilder(number.length()); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + int digit = Character.digit(c, 10); + if (digit != -1) { + normalizedDigits.append(digit); + } else if (keepNonDigits) { + normalizedDigits.append(c); + } + } + return normalizedDigits; + } + + /** + * Normalizes a string of characters representing a phone number. This strips all characters which + * are not diallable on a mobile phone keypad (including all non-ASCII digits). + * + * @param number a string of characters representing a phone number + * @return the normalized string version of the phone number + */ + public static String normalizeDiallableCharsOnly(CharSequence number) { + return normalizeHelper(number, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */); + } + + /** + * Converts all alpha characters in a number to their respective digits on a keypad, but retains + * existing formatting. + */ + public static String convertAlphaCharactersInNumber(CharSequence number) { + return normalizeHelper(number, ALPHA_PHONE_MAPPINGS, false); + } + + /** + * Gets the length of the geographical area code from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into geographical area code and subscriber number. It + * works in such a way that the resultant subscriber number should be diallable, at least on some + * devices. An example of how this could be used: + * + *

{@code
+   * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+   * PhoneNumber number = phoneUtil.parse("16502530000", "US");
+   * String nationalSignificantNumber = phoneUtil.getNationalSignificantNumber(number);
+   * String areaCode;
+   * String subscriberNumber;
+   *
+   * int areaCodeLength = phoneUtil.getLengthOfGeographicalAreaCode(number);
+   * if (areaCodeLength > 0) {
+   *   areaCode = nationalSignificantNumber.substring(0, areaCodeLength);
+   *   subscriberNumber = nationalSignificantNumber.substring(areaCodeLength);
+   * } else {
+   *   areaCode = "";
+   *   subscriberNumber = nationalSignificantNumber;
+   * }
+   * }
+ * + * N.B.: area code is a very ambiguous concept, so the I18N team generally recommends against + * using it for most purposes, but recommends using the more general {@code national_number} + * instead. Read the following carefully before deciding to use this method: + *
    + *
  • geographical area codes change over time, and this method honors those changes; + * therefore, it doesn't guarantee the stability of the result it produces. + *
  • subscriber numbers may not be diallable from all devices (notably mobile devices, which + * typically requires the full national_number to be dialled in most regions). + *
  • most non-geographical numbers have no area codes, including numbers from non-geographical + * entities + *
  • some geographical numbers have no area codes. + *
+ * @param number the PhoneNumber object for which clients + * want to know the length of the area code + * @return the length of area code of the PhoneNumber object + * passed in + */ + public int getLengthOfGeographicalAreaCode(PhoneNumber number) { + PhoneMetadata metadata = getMetadataForRegion(getRegionCodeForNumber(number)); + if (metadata == null) { + return 0; + } + + PhoneNumberType type = getNumberType(number); + int countryCallingCode = number.getCountryCode(); + // If a country doesn't use a national prefix, and this number doesn't have an Italian leading + // zero, we assume it is a closed dialling plan with no area codes. + // Note:this is our general assumption, but there are exceptions which are tracked in + // COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES. + if (!metadata.hasNationalPrefix() && !number.isItalianLeadingZero() + && !COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES.contains(countryCallingCode)) { + return 0; + } + + if (type == PhoneNumberType.MOBILE + // Note this is a rough heuristic; it doesn't cover Indonesia well, for example, where area + // codes are present for some mobile phones but not for others. We have no better way of + // representing this in the metadata at this point. + && GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES.contains(countryCallingCode)) { + return 0; + } + + if (!isNumberGeographical(type, countryCallingCode)) { + return 0; + } + + return getLengthOfNationalDestinationCode(number); + } + + /** + * Gets the length of the national destination code (NDC) from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into NDC and subscriber number. The NDC of a phone + * number is normally the first group of digit(s) right after the country calling code when the + * number is formatted in the international format, if there is a subscriber number part that + * follows. + * + * N.B.: similar to an area code, not all numbers have an NDC! + * + * An example of how this could be used: + * + *
{@code
+   * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+   * PhoneNumber number = phoneUtil.parse("18002530000", "US");
+   * String nationalSignificantNumber = phoneUtil.getNationalSignificantNumber(number);
+   * String nationalDestinationCode;
+   * String subscriberNumber;
+   *
+   * int nationalDestinationCodeLength = phoneUtil.getLengthOfNationalDestinationCode(number);
+   * if (nationalDestinationCodeLength > 0) {
+   *   nationalDestinationCode = nationalSignificantNumber.substring(0,
+   *       nationalDestinationCodeLength);
+   *   subscriberNumber = nationalSignificantNumber.substring(nationalDestinationCodeLength);
+   * } else {
+   *   nationalDestinationCode = "";
+   *   subscriberNumber = nationalSignificantNumber;
+   * }
+   * }
+ * + * Refer to the unittests to see the difference between this function and + * {@link #getLengthOfGeographicalAreaCode}. + * + * @param number the PhoneNumber object for which clients + * want to know the length of the NDC + * @return the length of NDC of the PhoneNumber object + * passed in, which could be zero + */ + public int getLengthOfNationalDestinationCode(PhoneNumber number) { + PhoneNumber copiedProto; + if (number.hasExtension()) { + // We don't want to alter the proto given to us, but we don't want to include the extension + // when we format it, so we copy it and clear the extension here. + copiedProto = new PhoneNumber(); + copiedProto.mergeFrom(number); + copiedProto.clearExtension(); + } else { + copiedProto = number; + } + + String nationalSignificantNumber = format(copiedProto, + PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL); + String[] numberGroups = NON_DIGITS_PATTERN.split(nationalSignificantNumber); + // The pattern will start with "+COUNTRY_CODE " so the first group will always be the empty + // string (before the + symbol) and the second group will be the country calling code. The third + // group will be area code if it is not the last group. + if (numberGroups.length <= 3) { + return 0; + } + + if (getNumberType(number) == PhoneNumberType.MOBILE) { + // For example Argentinian mobile numbers, when formatted in the international format, are in + // the form of +54 9 NDC XXXX.... As a result, we take the length of the third group (NDC) and + // add the length of the second group (which is the mobile token), which also forms part of + // the national significant number. This assumes that the mobile token is always formatted + // separately from the rest of the phone number. + String mobileToken = getCountryMobileToken(number.getCountryCode()); + if (!mobileToken.equals("")) { + return numberGroups[2].length() + numberGroups[3].length(); + } + } + return numberGroups[2].length(); + } + + /** + * Returns the mobile token for the provided country calling code if it has one, otherwise + * returns an empty string. A mobile token is a number inserted before the area code when dialing + * a mobile number from that country from abroad. + * + * @param countryCallingCode the country calling code for which we want the mobile token + * @return the mobile token, as a string, for the given country calling code + */ + public static String getCountryMobileToken(int countryCallingCode) { + if (MOBILE_TOKEN_MAPPINGS.containsKey(countryCallingCode)) { + return MOBILE_TOKEN_MAPPINGS.get(countryCallingCode); + } + return ""; + } + + /** + * Normalizes a string of characters representing a phone number by replacing all characters found + * in the accompanying map with the values therein, and stripping all other characters if + * removeNonMatches is true. + * + * @param number a string of characters representing a phone number + * @param normalizationReplacements a mapping of characters to what they should be replaced by in + * the normalized version of the phone number + * @param removeNonMatches indicates whether characters that are not able to be replaced should + * be stripped from the number. If this is false, they will be left unchanged in the number. + * @return the normalized string version of the phone number + */ + private static String normalizeHelper(CharSequence number, + Map normalizationReplacements, + boolean removeNonMatches) { + StringBuilder normalizedNumber = new StringBuilder(number.length()); + for (int i = 0; i < number.length(); i++) { + char character = number.charAt(i); + Character newDigit = normalizationReplacements.get(Character.toUpperCase(character)); + if (newDigit != null) { + normalizedNumber.append(newDigit); + } else if (!removeNonMatches) { + normalizedNumber.append(character); + } + // If neither of the above are true, we remove this character. + } + return normalizedNumber.toString(); + } + + /** + * Sets or resets the PhoneNumberUtil singleton instance. If set to null, the next call to + * {@code getInstance()} will load (and return) the default instance. + */ + // @VisibleForTesting + static synchronized void setInstance(PhoneNumberUtil util) { + instance = util; + } + + /** + * Returns all regions the library has metadata for. + * + * @return an unordered set of the two-letter region codes for every geographical region the + * library supports + */ + public Set getSupportedRegions() { + return Collections.unmodifiableSet(supportedRegions); + } + + /** + * Returns all global network calling codes the library has metadata for. + * + * @return an unordered set of the country calling codes for every non-geographical entity the + * library supports + */ + public Set getSupportedGlobalNetworkCallingCodes() { + return Collections.unmodifiableSet(countryCodesForNonGeographicalRegion); + } + + /** + * Returns all country calling codes the library has metadata for, covering both non-geographical + * entities (global network calling codes) and those used for geographical entities. This could be + * used to populate a drop-down box of country calling codes for a phone-number widget, for + * instance. + * + * @return an unordered set of the country calling codes for every geographical and + * non-geographical entity the library supports + */ + public Set getSupportedCallingCodes() { + return Collections.unmodifiableSet(countryCallingCodeToRegionCodeMap.keySet()); + } + + /** + * Returns true if there is any possible number data set for a particular PhoneNumberDesc. + */ + private static boolean descHasPossibleNumberData(PhoneNumberDesc desc) { + // If this is empty, it means numbers of this type inherit from the "general desc" -> the value + // "-1" means that no numbers exist for this type. + return desc.getPossibleLengthCount() != 1 || desc.getPossibleLength(0) != -1; + } + + // Note: descHasData must account for any of MetadataFilter's excludableChildFields potentially + // being absent from the metadata. It must check them all. For any changes in descHasData, ensure + // that all the excludableChildFields are still being checked. If your change is safe simply + // mention why during a review without needing to change MetadataFilter. + /** + * Returns true if there is any data set for a particular PhoneNumberDesc. + */ + private static boolean descHasData(PhoneNumberDesc desc) { + // Checking most properties since we don't know what's present, since a custom build may have + // stripped just one of them (e.g. liteBuild strips exampleNumber). We don't bother checking the + // possibleLengthsLocalOnly, since if this is the only thing that's present we don't really + // support the type at all: no type-specific methods will work with only this data. + return desc.hasExampleNumber() + || descHasPossibleNumberData(desc) + || desc.hasNationalNumberPattern(); + } + + /** + * Returns the types we have metadata for based on the PhoneMetadata object passed in, which must + * be non-null. + */ + private Set getSupportedTypesForMetadata(PhoneMetadata metadata) { + Set types = new TreeSet<>(); + for (PhoneNumberType type : PhoneNumberType.values()) { + if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE || type == PhoneNumberType.UNKNOWN) { + // Never return FIXED_LINE_OR_MOBILE (it is a convenience type, and represents that a + // particular number type can't be determined) or UNKNOWN (the non-type). + continue; + } + if (descHasData(getNumberDescByType(metadata, type))) { + types.add(type); + } + } + return Collections.unmodifiableSet(types); + } + + /** + * Returns the types for a given region which the library has metadata for. Will not include + * FIXED_LINE_OR_MOBILE (if numbers in this region could be classified as FIXED_LINE_OR_MOBILE, + * both FIXED_LINE and MOBILE would be present) and UNKNOWN. + * + * No types will be returned for invalid or unknown region codes. + */ + public Set getSupportedTypesForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return Collections.unmodifiableSet(new TreeSet()); + } + PhoneMetadata metadata = getMetadataForRegion(regionCode); + return getSupportedTypesForMetadata(metadata); + } + + /** + * Returns the types for a country-code belonging to a non-geographical entity which the library + * has metadata for. Will not include FIXED_LINE_OR_MOBILE (if numbers for this non-geographical + * entity could be classified as FIXED_LINE_OR_MOBILE, both FIXED_LINE and MOBILE would be + * present) and UNKNOWN. + * + * No types will be returned for country calling codes that do not map to a known non-geographical + * entity. + */ + public Set getSupportedTypesForNonGeoEntity(int countryCallingCode) { + PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode); + if (metadata == null) { + logger.log(Level.WARNING, "Unknown country calling code for a non-geographical entity " + + "provided: " + countryCallingCode); + return Collections.unmodifiableSet(new TreeSet()); + } + return getSupportedTypesForMetadata(metadata); + } + + /** + * Gets a {@link PhoneNumberUtil} instance to carry out international phone number formatting, + * parsing, or validation. The instance is loaded with all phone number metadata. + * + *

The {@link PhoneNumberUtil} is implemented as a singleton. Therefore, calling getInstance + * multiple times will only result in one instance being created. + * + * @return a PhoneNumberUtil instance + */ + public static synchronized PhoneNumberUtil getInstance() { + if (instance == null) { + MetadataLoader metadataLoader = DefaultMetadataDependenciesProvider.getInstance() + .getMetadataLoader(); + setInstance(createInstance(metadataLoader)); + } + return instance; + } + + /** + * Create a new {@link PhoneNumberUtil} instance to carry out international phone number + * formatting, parsing, or validation. The instance is loaded with all metadata by + * using the metadataLoader specified. + * + *

This method should only be used in the rare case in which you want to manage your own + * metadata loading. Calling this method multiple times is very expensive, as each time + * a new instance is created from scratch. When in doubt, use {@link #getInstance}. + * + * @param metadataLoader customized metadata loader. This should not be null + * @return a PhoneNumberUtil instance + */ + public static PhoneNumberUtil createInstance(MetadataLoader metadataLoader) { + if (metadataLoader == null) { + throw new IllegalArgumentException("metadataLoader could not be null."); + } + return createInstance(new MetadataSourceImpl( + DefaultMetadataDependenciesProvider.getInstance().getPhoneNumberMetadataFileNameProvider(), + metadataLoader, + DefaultMetadataDependenciesProvider.getInstance().getMetadataParser() + )); + } + + /** + * Create a new {@link PhoneNumberUtil} instance to carry out international phone number + * formatting, parsing, or validation. The instance is loaded with all metadata by + * using the metadataSource specified. + * + *

This method should only be used in the rare case in which you want to manage your own + * metadata loading. Calling this method multiple times is very expensive, as each time + * a new instance is created from scratch. When in doubt, use {@link #getInstance}. + * + * @param metadataSource customized metadata source. This should not be null + * @return a PhoneNumberUtil instance + */ + private static PhoneNumberUtil createInstance(MetadataSource metadataSource) { + if (metadataSource == null) { + throw new IllegalArgumentException("metadataSource could not be null."); + } + return new PhoneNumberUtil(metadataSource, + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap()); + } + + /** + * Helper function to check if the national prefix formatting rule has the first group only, i.e., + * does not start with the national prefix. + */ + static boolean formattingRuleHasFirstGroupOnly(String nationalPrefixFormattingRule) { + return nationalPrefixFormattingRule.length() == 0 + || FIRST_GROUP_ONLY_PREFIX_PATTERN.matcher(nationalPrefixFormattingRule).matches(); + } + + /** + * Tests whether a phone number has a geographical association. It checks if the number is + * associated with a certain region in the country to which it belongs. Note that this doesn't + * verify if the number is actually in use. + */ + public boolean isNumberGeographical(PhoneNumber phoneNumber) { + return isNumberGeographical(getNumberType(phoneNumber), phoneNumber.getCountryCode()); + } + + /** + * Overload of isNumberGeographical(PhoneNumber), since calculating the phone number type is + * expensive; if we have already done this, we don't want to do it again. + */ + public boolean isNumberGeographical(PhoneNumberType phoneNumberType, int countryCallingCode) { + return phoneNumberType == PhoneNumberType.FIXED_LINE + || phoneNumberType == PhoneNumberType.FIXED_LINE_OR_MOBILE + || (GEO_MOBILE_COUNTRIES.contains(countryCallingCode) + && phoneNumberType == PhoneNumberType.MOBILE); + } + + /** + * Helper function to check region code is not unknown or null. + */ + private boolean isValidRegionCode(String regionCode) { + return regionCode != null && supportedRegions.contains(regionCode); + } + + /** + * Helper function to check the country calling code is valid. + */ + private boolean hasValidCountryCallingCode(int countryCallingCode) { + return countryCallingCodeToRegionCodeMap.containsKey(countryCallingCode); + } + + /** + * Formats a phone number in the specified format using default rules. Note that this does not + * promise to produce a phone number that the user can dial from where they are - although we do + * format in either 'national' or 'international' format depending on what the client asks for, we + * do not currently support a more abbreviated format, such as for users in the same "area" who + * could potentially dial the number without area code. Note that if the phone number has a + * country calling code of 0 or an otherwise invalid country calling code, we cannot work out + * which formatting rules to apply so we return the national significant number with no formatting + * applied. + * + * @param number the phone number to be formatted + * @param numberFormat the format the phone number should be formatted into + * @return the formatted phone number + */ + public String format(PhoneNumber number, PhoneNumberFormat numberFormat) { + if (number.getNationalNumber() == 0) { + // Unparseable numbers that kept their raw input just use that. + // This is the only case where a number can be formatted as E164 without a + // leading '+' symbol (but the original number wasn't parseable anyway). + String rawInput = number.getRawInput(); + if (rawInput.length() > 0 || !number.hasCountryCode()) { + return rawInput; + } + } + StringBuilder formattedNumber = new StringBuilder(20); + format(number, numberFormat, formattedNumber); + return formattedNumber.toString(); + } + + /** + * Same as {@link #format(PhoneNumber, PhoneNumberFormat)}, but accepts a mutable StringBuilder as + * a parameter to decrease object creation when invoked many times. + */ + public void format(PhoneNumber number, PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + // Clear the StringBuilder first. + formattedNumber.setLength(0); + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + + if (numberFormat == PhoneNumberFormat.E164) { + // Early exit for E164 case (even if the country calling code is invalid) since no formatting + // of the national number needs to be applied. Extensions are not formatted. + formattedNumber.append(nationalSignificantNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, PhoneNumberFormat.E164, + formattedNumber); + return; + } + if (!hasValidCountryCallingCode(countryCallingCode)) { + formattedNumber.append(nationalSignificantNumber); + return; + } + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid (which means that the + // region code cannot be ZZ and must be one of our supported region codes). + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + formattedNumber.append(formatNsn(nationalSignificantNumber, metadata, numberFormat)); + maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber); + } + + /** + * Formats a phone number in the specified format using client-defined formatting rules. Note that + * if the phone number has a country calling code of zero or an otherwise invalid country calling + * code, we cannot work out things like whether there should be a national prefix applied, or how + * to format extensions, so we return the national significant number with no formatting applied. + * + * @param number the phone number to be formatted + * @param numberFormat the format the phone number should be formatted into + * @param userDefinedFormats formatting rules specified by clients + * @return the formatted phone number + */ + public String formatByPattern(PhoneNumber number, + PhoneNumberFormat numberFormat, + List userDefinedFormats) { + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + + StringBuilder formattedNumber = new StringBuilder(20); + + NumberFormat formattingPattern = + chooseFormattingPatternForNumber(userDefinedFormats, nationalSignificantNumber); + if (formattingPattern == null) { + // If no pattern above is matched, we format the number as a whole. + formattedNumber.append(nationalSignificantNumber); + } else { + NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); + // Before we do a replacement of the national prefix pattern $NP with the national prefix, we + // need to copy the rule so that subsequent replacements for different numbers have the + // appropriate national prefix. + numFormatCopy.mergeFrom(formattingPattern); + String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule(); + if (nationalPrefixFormattingRule.length() > 0) { + String nationalPrefix = metadata.getNationalPrefix(); + if (nationalPrefix.length() > 0) { + // Replace $NP with national prefix and $FG with the first group ($1). + nationalPrefixFormattingRule = + nationalPrefixFormattingRule.replace(NP_STRING, nationalPrefix); + nationalPrefixFormattingRule = nationalPrefixFormattingRule.replace(FG_STRING, "$1"); + numFormatCopy.setNationalPrefixFormattingRule(nationalPrefixFormattingRule); + } else { + // We don't want to have a rule for how to format the national prefix if there isn't one. + numFormatCopy.clearNationalPrefixFormattingRule(); + } + } + formattedNumber.append( + formatNsnUsingPattern(nationalSignificantNumber, numFormatCopy.build(), numberFormat)); + } + maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber); + return formattedNumber.toString(); + } + + /** + * Formats a phone number in national format for dialing using the carrier as specified in the + * {@code carrierCode}. The {@code carrierCode} will always be used regardless of whether the + * phone number already has a preferred domestic carrier code stored. If {@code carrierCode} + * contains an empty string, returns the number in national format without any carrier code. + * + * @param number the phone number to be formatted + * @param carrierCode the carrier selection code to be used + * @return the formatted phone number in national format for dialing using the carrier as + * specified in the {@code carrierCode} + */ + public String formatNationalNumberWithCarrierCode(PhoneNumber number, CharSequence carrierCode) { + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + + StringBuilder formattedNumber = new StringBuilder(20); + formattedNumber.append(formatNsn(nationalSignificantNumber, metadata, + PhoneNumberFormat.NATIONAL, carrierCode)); + maybeAppendFormattedExtension(number, metadata, PhoneNumberFormat.NATIONAL, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, PhoneNumberFormat.NATIONAL, + formattedNumber); + return formattedNumber.toString(); + } + + private PhoneMetadata getMetadataForRegionOrCallingCode( + int countryCallingCode, String regionCode) { + return REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode) + ? getMetadataForNonGeographicalRegion(countryCallingCode) + : getMetadataForRegion(regionCode); + } + + /** + * Formats a phone number in national format for dialing using the carrier as specified in the + * preferredDomesticCarrierCode field of the PhoneNumber object passed in. If that is missing, + * use the {@code fallbackCarrierCode} passed in instead. If there is no + * {@code preferredDomesticCarrierCode}, and the {@code fallbackCarrierCode} contains an empty + * string, return the number in national format without any carrier code. + * + *

Use {@link #formatNationalNumberWithCarrierCode} instead if the carrier code passed in + * should take precedence over the number's {@code preferredDomesticCarrierCode} when formatting. + * + * @param number the phone number to be formatted + * @param fallbackCarrierCode the carrier selection code to be used, if none is found in the + * phone number itself + * @return the formatted phone number in national format for dialing using the number's + * {@code preferredDomesticCarrierCode}, or the {@code fallbackCarrierCode} passed in if + * none is found + */ + public String formatNationalNumberWithPreferredCarrierCode(PhoneNumber number, + CharSequence fallbackCarrierCode) { + return formatNationalNumberWithCarrierCode(number, + // Historically, we set this to an empty string when parsing with raw input if none was + // found in the input string. However, this doesn't result in a number we can dial. For this + // reason, we treat the empty string the same as if it isn't set at all. + number.getPreferredDomesticCarrierCode().length() > 0 + ? number.getPreferredDomesticCarrierCode() + : fallbackCarrierCode); + } + + /** + * Returns a number formatted in such a way that it can be dialed from a mobile phone in a + * specific region. If the number cannot be reached from the region (e.g. some countries block + * toll-free numbers from being called outside of the country), the method returns an empty + * string. + * + * @param number the phone number to be formatted + * @param regionCallingFrom the region where the call is being placed + * @param withFormatting whether the number should be returned with formatting symbols, such as + * spaces and dashes. + * @return the formatted phone number + */ + public String formatNumberForMobileDialing(PhoneNumber number, String regionCallingFrom, + boolean withFormatting) { + int countryCallingCode = number.getCountryCode(); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return number.hasRawInput() ? number.getRawInput() : ""; + } + + String formattedNumber = ""; + // Clear the extension, as that part cannot normally be dialed together with the main number. + PhoneNumber numberNoExt = new PhoneNumber().mergeFrom(number).clearExtension(); + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + PhoneNumberType numberType = getNumberType(numberNoExt); + boolean isValidNumber = (numberType != PhoneNumberType.UNKNOWN); + if (regionCallingFrom.equals(regionCode)) { + boolean isFixedLineOrMobile = + (numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) + || (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE); + // Carrier codes may be needed in some countries. We handle this here. + if (regionCode.equals("BR") && isFixedLineOrMobile) { + // Historically, we set this to an empty string when parsing with raw input if none was + // found in the input string. However, this doesn't result in a number we can dial. For this + // reason, we treat the empty string the same as if it isn't set at all. + formattedNumber = numberNoExt.getPreferredDomesticCarrierCode().length() > 0 + ? formattedNumber = formatNationalNumberWithPreferredCarrierCode(numberNoExt, "") + // Brazilian fixed line and mobile numbers need to be dialed with a carrier code when + // called within Brazil. Without that, most of the carriers won't connect the call. + // Because of that, we return an empty string here. + : ""; + } else if (countryCallingCode == NANPA_COUNTRY_CODE) { + // For NANPA countries, we output international format for numbers that can be dialed + // internationally, since that always works, except for numbers which might potentially be + // short numbers, which are always dialled in national format. + PhoneMetadata regionMetadata = getMetadataForRegion(regionCallingFrom); + if (canBeInternationallyDialled(numberNoExt) + && testNumberLength(getNationalSignificantNumber(numberNoExt), regionMetadata) + != ValidationResult.TOO_SHORT) { + formattedNumber = format(numberNoExt, PhoneNumberFormat.INTERNATIONAL); + } else { + formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL); + } + } else { + // For non-geographical countries, and Mexican, Chilean, and Uzbek fixed line and mobile + // numbers, we output international format for numbers that can be dialed internationally as + // that always works. + if ((regionCode.equals(REGION_CODE_FOR_NON_GEO_ENTITY) + // MX fixed line and mobile numbers should always be formatted in international format, + // even when dialed within MX. For national format to work, a carrier code needs to be + // used, and the correct carrier code depends on if the caller and callee are from the + // same local area. It is trickier to get that to work correctly than using + // international format, which is tested to work fine on all carriers. + // CL fixed line numbers need the national prefix when dialing in the national format, + // but don't have it when used for display. The reverse is true for mobile numbers. As + // a result, we output them in the international format to make it work. + // UZ mobile and fixed-line numbers have to be formatted in international format or + // prefixed with special codes like 03, 04 (for fixed-line) and 05 (for mobile) for + // dialling successfully from mobile devices. As we do not have complete information on + // special codes and to be consistent with formatting across all phone types we return + // the number in international format here. + || ((regionCode.equals("MX") || regionCode.equals("CL") + || regionCode.equals("UZ")) && isFixedLineOrMobile)) + && canBeInternationallyDialled(numberNoExt)) { + formattedNumber = format(numberNoExt, PhoneNumberFormat.INTERNATIONAL); + } else { + formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL); + } + } + } else if (isValidNumber && canBeInternationallyDialled(numberNoExt)) { + // We assume that short numbers are not diallable from outside their region, so if a number + // is not a valid regular length phone number, we treat it as if it cannot be internationally + // dialled. + return withFormatting ? format(numberNoExt, PhoneNumberFormat.INTERNATIONAL) + : format(numberNoExt, PhoneNumberFormat.E164); + } + return withFormatting ? formattedNumber + : normalizeDiallableCharsOnly(formattedNumber); + } + + /** + * Formats a phone number for out-of-country dialing purposes. If no regionCallingFrom is + * supplied, we format the number in its INTERNATIONAL format. If the country calling code is the + * same as that of the region where the number is from, then NATIONAL formatting will be applied. + * + *

If the number itself has a country calling code of zero or an otherwise invalid country + * calling code, then we return the number with no formatting applied. + * + *

Note this function takes care of the case for calling inside of NANPA and between Russia and + * Kazakhstan (who share the same country calling code). In those cases, no international prefix + * is used. For regions which have multiple international prefixes, the number in its + * INTERNATIONAL format will be returned instead. + * + * @param number the phone number to be formatted + * @param regionCallingFrom the region where the call is being placed + * @return the formatted phone number + */ + public String formatOutOfCountryCallingNumber(PhoneNumber number, + String regionCallingFrom) { + if (!isValidRegionCode(regionCallingFrom)) { + logger.log(Level.WARNING, + "Trying to format number from invalid region " + + regionCallingFrom + + ". International formatting applied."); + return format(number, PhoneNumberFormat.INTERNATIONAL); + } + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + if (countryCallingCode == NANPA_COUNTRY_CODE) { + if (isNANPACountry(regionCallingFrom)) { + // For NANPA regions, return the national format for these regions but prefix it with the + // country calling code. + return countryCallingCode + " " + format(number, PhoneNumberFormat.NATIONAL); + } + } else if (countryCallingCode == getCountryCodeForValidRegion(regionCallingFrom)) { + // If regions share a country calling code, the country calling code need not be dialled. + // This also applies when dialling within a region, so this if clause covers both these cases. + // Technically this is the case for dialling from La Reunion to other overseas departments of + // France (French Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover this + // edge case for now and for those cases return the version including country calling code. + // Details here: http://www.petitfute.com/voyage/225-info-pratiques-reunion + return format(number, PhoneNumberFormat.NATIONAL); + } + // Metadata cannot be null because we checked 'isValidRegionCode()' above. + PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom); + String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix(); + + // In general, if there is a preferred international prefix, use that. Otherwise, for regions + // that have multiple international prefixes, the international format of the number is + // returned since we would not know which one to use. + String internationalPrefixForFormatting = ""; + if (metadataForRegionCallingFrom.hasPreferredInternationalPrefix()) { + internationalPrefixForFormatting = + metadataForRegionCallingFrom.getPreferredInternationalPrefix(); + } else if (SINGLE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches()) { + internationalPrefixForFormatting = internationalPrefix; + } + + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadataForRegion = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + String formattedNationalNumber = + formatNsn(nationalSignificantNumber, metadataForRegion, PhoneNumberFormat.INTERNATIONAL); + StringBuilder formattedNumber = new StringBuilder(formattedNationalNumber); + maybeAppendFormattedExtension(number, metadataForRegion, PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + if (internationalPrefixForFormatting.length() > 0) { + formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, " ") + .insert(0, internationalPrefixForFormatting); + } else { + prefixNumberWithCountryCallingCode(countryCallingCode, + PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + } + return formattedNumber.toString(); + } + + /** + * Formats a phone number using the original phone number format (e.g. INTERNATIONAL or NATIONAL) + * that the number is parsed from, provided that the number has been parsed with {@link + * parseAndKeepRawInput}. Otherwise the number will be formatted in NATIONAL format. + * + *

The original format is embedded in the country_code_source field of the PhoneNumber object + * passed in, which is only set when parsing keeps the raw input. When we don't have a formatting + * pattern for the number, the method falls back to returning the raw input. + * + *

Note this method guarantees no digit will be inserted, removed or modified as a result of + * formatting. + * + * @param number the phone number that needs to be formatted in its original number format + * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number has + * one + * @return the formatted phone number in its original number format + */ + public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) { + NumberFormat formatRule = chooseFormattingPatternForNumber(number); + if (number.hasRawInput() && formatRule == null) { + // We check if we have the formatting pattern because without that, we might format the number + // as a group without national prefix. + return number.getRawInput(); + } + if (!number.hasCountryCodeSource()) { + return format(number, PhoneNumberFormat.NATIONAL); + } + String formattedNumber; + switch (number.getCountryCodeSource()) { + case FROM_NUMBER_WITH_PLUS_SIGN: + formattedNumber = format(number, PhoneNumberFormat.INTERNATIONAL); + break; + case FROM_NUMBER_WITH_IDD: + formattedNumber = formatOutOfCountryCallingNumber(number, regionCallingFrom); + break; + case FROM_NUMBER_WITHOUT_PLUS_SIGN: + formattedNumber = format(number, PhoneNumberFormat.INTERNATIONAL).substring(1); + break; + case FROM_DEFAULT_COUNTRY: + // Fall-through to default case. + default: + String regionCode = getRegionCodeForCountryCode(number.getCountryCode()); + // We strip non-digits from the NDD here, and from the raw input later, so that we can + // compare them easily. + String nationalPrefix = getNddPrefixForRegion(regionCode, true /* strip non-digits */); + String nationalFormat = format(number, PhoneNumberFormat.NATIONAL); + if (nationalPrefix == null || nationalPrefix.length() == 0) { + // If the region doesn't have a national prefix at all, we can safely return the national + // format without worrying about a national prefix being added. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we check if the original number was entered with a national prefix. + if (rawInputContainsNationalPrefix( + number.getRawInput(), nationalPrefix, regionCode)) { + // If so, we can safely return the national format. + formattedNumber = nationalFormat; + break; + } + // The format rule could still be null here if the national number was 0 and there was no + // raw input (this should not be possible for numbers generated by the phonenumber library + // as they would also not have a country calling code and we would have exited earlier). + if (formatRule == null) { + formattedNumber = nationalFormat; + break; + } + // When the format we apply to this number doesn't contain national prefix, we can just + // return the national format. + // TODO: Refactor the code below with the code in + // isNationalPrefixPresentIfRequired. + String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule(); + // We assume that the first-group symbol will never be _before_ the national prefix. + int indexOfFirstGroup = candidateNationalPrefixRule.indexOf("$1"); + if (indexOfFirstGroup <= 0) { + formattedNumber = nationalFormat; + break; + } + candidateNationalPrefixRule = + candidateNationalPrefixRule.substring(0, indexOfFirstGroup); + candidateNationalPrefixRule = normalizeDigitsOnly(candidateNationalPrefixRule); + if (candidateNationalPrefixRule.length() == 0) { + // National prefix not used when formatting this number. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we need to remove the national prefix from our output. + NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); + numFormatCopy.mergeFrom(formatRule); + numFormatCopy.clearNationalPrefixFormattingRule(); + List numberFormats = new ArrayList<>(1); + numberFormats.add(numFormatCopy.build()); + formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats); + break; + } + String rawInput = number.getRawInput(); + // If no digit is inserted/removed/modified as a result of our formatting, we return the + // formatted phone number; otherwise we return the raw input the user entered. + if (formattedNumber != null && rawInput.length() > 0) { + String normalizedFormattedNumber = normalizeDiallableCharsOnly(formattedNumber); + String normalizedRawInput = normalizeDiallableCharsOnly(rawInput); + if (!normalizedFormattedNumber.equals(normalizedRawInput)) { + formattedNumber = rawInput; + } + } + return formattedNumber; + } + + // Check if rawInput, which is assumed to be in the national format, has a national prefix. The + // national prefix is assumed to be in digits-only form. + private boolean rawInputContainsNationalPrefix(String rawInput, String nationalPrefix, + String regionCode) { + String normalizedNationalNumber = normalizeDigitsOnly(rawInput); + if (normalizedNationalNumber.startsWith(nationalPrefix)) { + try { + // Some Japanese numbers (e.g. 00777123) might be mistaken to contain the national prefix + // when written without it (e.g. 0777123) if we just do prefix matching. To tackle that, we + // check the validity of the number if the assumed national prefix is removed (777123 won't + // be valid in Japan). + return isValidNumber( + parse(normalizedNationalNumber.substring(nationalPrefix.length()), regionCode)); + } catch (NumberParseException e) { + return false; + } + } + return false; + } + + private NumberFormat chooseFormattingPatternForNumber(PhoneNumber number) { + int countryCallingCode = number.getCountryCode(); + String phoneNumberRegion = getRegionCodeForCountryCode(countryCallingCode); + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, phoneNumberRegion); + if (metadata == null) { + return null; + } + String nationalNumber = getNationalSignificantNumber(number); + return chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber); + } + + NumberFormat chooseFormattingPatternForNumber(List availableFormats, + String nationalNumber) { + for (NumberFormat numFormat : availableFormats) { + int size = numFormat.getLeadingDigitsPatternCount(); + if (size == 0 || regexCache.getPatternForRegex( + // We always use the last leading_digits_pattern, as it is the most detailed. + numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) { + Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber); + if (m.matches()) { + return numFormat; + } + } + } + return null; + } + + /** + * Formats a phone number for out-of-country dialing purposes. + * + * Note that in this version, if the number was entered originally using alpha characters and + * this version of the number is stored in raw_input, this representation of the number will be + * used rather than the digit representation. Grouping information, as specified by characters + * such as "-" and " ", will be retained. + * + *

Caveats:

+ *
    + *
  • This will not produce good results if the country calling code is both present in the raw + * input _and_ is the start of the national number. This is not a problem in the regions + * which typically use alpha numbers. + *
  • This will also not produce good results if the raw input has any grouping information + * within the first three digits of the national number, and if the function needs to strip + * preceding digits/words in the raw input before these digits. Normally people group the + * first three digits together so this is not a huge problem - and will be fixed if it + * proves to be so. + *
+ * + * @param number the phone number that needs to be formatted + * @param regionCallingFrom the region where the call is being placed + * @return the formatted phone number + */ + public String formatOutOfCountryKeepingAlphaChars(PhoneNumber number, + String regionCallingFrom) { + String rawInput = number.getRawInput(); + // If there is no raw input, then we can't keep alpha characters because there aren't any. + // In this case, we return formatOutOfCountryCallingNumber. + if (rawInput.length() == 0) { + return formatOutOfCountryCallingNumber(number, regionCallingFrom); + } + int countryCode = number.getCountryCode(); + if (!hasValidCountryCallingCode(countryCode)) { + return rawInput; + } + // Strip any prefix such as country calling code, IDD, that was present. We do this by comparing + // the number in raw_input with the parsed number. + // To do this, first we normalize punctuation. We retain number grouping symbols such as " " + // only. + rawInput = normalizeHelper(rawInput, ALL_PLUS_NUMBER_GROUPING_SYMBOLS, true); + // Now we trim everything before the first three digits in the parsed number. We choose three + // because all valid alpha numbers have 3 digits at the start - if it does not, then we don't + // trim anything at all. Similarly, if the national number was less than three digits, we don't + // trim anything at all. + String nationalNumber = getNationalSignificantNumber(number); + if (nationalNumber.length() > 3) { + int firstNationalNumberDigit = rawInput.indexOf(nationalNumber.substring(0, 3)); + if (firstNationalNumberDigit != -1) { + rawInput = rawInput.substring(firstNationalNumberDigit); + } + } + PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom); + if (countryCode == NANPA_COUNTRY_CODE) { + if (isNANPACountry(regionCallingFrom)) { + return countryCode + " " + rawInput; + } + } else if (metadataForRegionCallingFrom != null + && countryCode == getCountryCodeForValidRegion(regionCallingFrom)) { + NumberFormat formattingPattern = + chooseFormattingPatternForNumber(metadataForRegionCallingFrom.getNumberFormatList(), + nationalNumber); + if (formattingPattern == null) { + // If no pattern above is matched, we format the original input. + return rawInput; + } + NumberFormat.Builder newFormat = NumberFormat.newBuilder(); + newFormat.mergeFrom(formattingPattern); + // The first group is the first group of digits that the user wrote together. + newFormat.setPattern("(\\d+)(.*)"); + // Here we just concatenate them back together after the national prefix has been fixed. + newFormat.setFormat("$1$2"); + // Now we format using this pattern instead of the default pattern, but with the national + // prefix prefixed if necessary. + // This will not work in the cases where the pattern (and not the leading digits) decide + // whether a national prefix needs to be used, since we have overridden the pattern to match + // anything, but that is not the case in the metadata to date. + return formatNsnUsingPattern(rawInput, newFormat.build(), PhoneNumberFormat.NATIONAL); + } + String internationalPrefixForFormatting = ""; + // If an unsupported region-calling-from is entered, or a country with multiple international + // prefixes, the international format of the number is returned, unless there is a preferred + // international prefix. + if (metadataForRegionCallingFrom != null) { + String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix(); + internationalPrefixForFormatting = + SINGLE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches() + ? internationalPrefix + : metadataForRegionCallingFrom.getPreferredInternationalPrefix(); + } + StringBuilder formattedNumber = new StringBuilder(rawInput); + String regionCode = getRegionCodeForCountryCode(countryCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadataForRegion = getMetadataForRegionOrCallingCode(countryCode, regionCode); + // Strip any extension + maybeStripExtension(formattedNumber); + // Append the formatted extension + maybeAppendFormattedExtension( + number, metadataForRegion, PhoneNumberFormat.INTERNATIONAL, formattedNumber); + if (internationalPrefixForFormatting.length() > 0) { + formattedNumber.insert(0, " ").insert(0, countryCode).insert(0, " ") + .insert(0, internationalPrefixForFormatting); + } else { + // Invalid region entered as country-calling-from (so no metadata was found for it) or the + // region chosen has multiple international dialling prefixes. + if (!isValidRegionCode(regionCallingFrom)) { + logger.log(Level.WARNING, + "Trying to format number from invalid region " + + regionCallingFrom + + ". International formatting applied."); + } + prefixNumberWithCountryCallingCode(countryCode, + PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + } + return formattedNumber.toString(); + } + + /** + * Gets the national significant number of a phone number. Note a national significant number + * doesn't contain a national prefix or any formatting. + * + * @param number the phone number for which the national significant number is needed + * @return the national significant number of the PhoneNumber object passed in + */ + public String getNationalSignificantNumber(PhoneNumber number) { + // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix. + StringBuilder nationalNumber = new StringBuilder(); + if (number.isItalianLeadingZero() && number.getNumberOfLeadingZeros() > 0) { + char[] zeros = new char[number.getNumberOfLeadingZeros()]; + Arrays.fill(zeros, '0'); + nationalNumber.append(new String(zeros)); + } + nationalNumber.append(number.getNationalNumber()); + return nationalNumber.toString(); + } + + /** + * A helper function that is used by format and formatByPattern. + */ + private void prefixNumberWithCountryCallingCode(int countryCallingCode, + PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + switch (numberFormat) { + case E164: + formattedNumber.insert(0, countryCallingCode).insert(0, PLUS_SIGN); + return; + case INTERNATIONAL: + formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, PLUS_SIGN); + return; + case RFC3966: + formattedNumber.insert(0, "-").insert(0, countryCallingCode).insert(0, PLUS_SIGN) + .insert(0, RFC3966_PREFIX); + return; + case NATIONAL: + default: + return; + } + } + + // Simple wrapper of formatNsn for the common case of no carrier code. + private String formatNsn(String number, PhoneMetadata metadata, PhoneNumberFormat numberFormat) { + return formatNsn(number, metadata, numberFormat, null); + } + + // Note in some regions, the national number can be written in two completely different ways + // depending on whether it forms part of the NATIONAL format or INTERNATIONAL format. The + // numberFormat parameter here is used to specify which format to use for those cases. If a + // carrierCode is specified, this will be inserted into the formatted string to replace $CC. + private String formatNsn(String number, + PhoneMetadata metadata, + PhoneNumberFormat numberFormat, + CharSequence carrierCode) { + List intlNumberFormats = metadata.getIntlNumberFormatList(); + // When the intlNumberFormats exists, we use that to format national number for the + // INTERNATIONAL format instead of using the numberDesc.numberFormats. + List availableFormats = + (intlNumberFormats.size() == 0 || numberFormat == PhoneNumberFormat.NATIONAL) + ? metadata.getNumberFormatList() + : metadata.getIntlNumberFormatList(); + NumberFormat formattingPattern = chooseFormattingPatternForNumber(availableFormats, number); + return (formattingPattern == null) + ? number + : formatNsnUsingPattern(number, formattingPattern, numberFormat, carrierCode); + } + + // Simple wrapper of formatNsnUsingPattern for the common case of no carrier code. + String formatNsnUsingPattern(String nationalNumber, + NumberFormat formattingPattern, + PhoneNumberFormat numberFormat) { + return formatNsnUsingPattern(nationalNumber, formattingPattern, numberFormat, null); + } + + // Note that carrierCode is optional - if null or an empty string, no carrier code replacement + // will take place. + private String formatNsnUsingPattern(String nationalNumber, + NumberFormat formattingPattern, + PhoneNumberFormat numberFormat, + CharSequence carrierCode) { + String numberFormatRule = formattingPattern.getFormat(); + Matcher m = + regexCache.getPatternForRegex(formattingPattern.getPattern()).matcher(nationalNumber); + String formattedNationalNumber = ""; + if (numberFormat == PhoneNumberFormat.NATIONAL + && carrierCode != null && carrierCode.length() > 0 + && formattingPattern.getDomesticCarrierCodeFormattingRule().length() > 0) { + // Replace the $CC in the formatting rule with the desired carrier code. + String carrierCodeFormattingRule = formattingPattern.getDomesticCarrierCodeFormattingRule(); + carrierCodeFormattingRule = carrierCodeFormattingRule.replace(CC_STRING, carrierCode); + // Now replace the $FG in the formatting rule with the first group and the carrier code + // combined in the appropriate way. + numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule) + .replaceFirst(carrierCodeFormattingRule); + formattedNationalNumber = m.replaceAll(numberFormatRule); + } else { + // Use the national prefix formatting rule instead. + String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule(); + if (numberFormat == PhoneNumberFormat.NATIONAL + && nationalPrefixFormattingRule != null + && nationalPrefixFormattingRule.length() > 0) { + Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule); + formattedNationalNumber = + m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule)); + } else { + formattedNationalNumber = m.replaceAll(numberFormatRule); + } + } + if (numberFormat == PhoneNumberFormat.RFC3966) { + // Strip any leading punctuation. + Matcher matcher = SEPARATOR_PATTERN.matcher(formattedNationalNumber); + if (matcher.lookingAt()) { + formattedNationalNumber = matcher.replaceFirst(""); + } + // Replace the rest with a dash between each number group. + formattedNationalNumber = matcher.reset(formattedNationalNumber).replaceAll("-"); + } + return formattedNationalNumber; + } + + /** + * Gets a valid number for the specified region. + * + * @param regionCode the region for which an example number is needed + * @return a valid fixed-line number for the specified region. Returns null when the metadata + * does not contain such information, or the region 001 is passed in. For 001 (representing + * non-geographical numbers), call {@link #getExampleNumberForNonGeoEntity} instead. + */ + public PhoneNumber getExampleNumber(String regionCode) { + return getExampleNumberForType(regionCode, PhoneNumberType.FIXED_LINE); + } + + /** + * Gets an invalid number for the specified region. This is useful for unit-testing purposes, + * where you want to test what will happen with an invalid number. Note that the number that is + * returned will always be able to be parsed and will have the correct country code. It may also + * be a valid *short* number/code for this region. Validity checking such numbers is handled with + * {@link com.google.i18n.phonenumbers.ShortNumberInfo}. + * + * @param regionCode the region for which an example number is needed + * @return an invalid number for the specified region. Returns null when an unsupported region or + * the region 001 (Earth) is passed in. + */ + public PhoneNumber getInvalidExampleNumber(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return null; + } + // We start off with a valid fixed-line number since every country supports this. Alternatively + // we could start with a different number type, since fixed-line numbers typically have a wide + // breadth of valid number lengths and we may have to make it very short before we get an + // invalid number. + PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), + PhoneNumberType.FIXED_LINE); + if (!desc.hasExampleNumber()) { + // This shouldn't happen; we have a test for this. + return null; + } + String exampleNumber = desc.getExampleNumber(); + // Try and make the number invalid. We do this by changing the length. We try reducing the + // length of the number, since currently no region has a number that is the same length as + // MIN_LENGTH_FOR_NSN. This is probably quicker than making the number longer, which is another + // alternative. We could also use the possible number pattern to extract the possible lengths of + // the number to make this faster, but this method is only for unit-testing so simplicity is + // preferred to performance. We don't want to return a number that can't be parsed, so we check + // the number is long enough. We try all possible lengths because phone number plans often have + // overlapping prefixes so the number 123456 might be valid as a fixed-line number, and 12345 as + // a mobile number. It would be faster to loop in a different order, but we prefer numbers that + // look closer to real numbers (and it gives us a variety of different lengths for the resulting + // phone numbers - otherwise they would all be MIN_LENGTH_FOR_NSN digits long.) + for (int phoneNumberLength = exampleNumber.length() - 1; + phoneNumberLength >= MIN_LENGTH_FOR_NSN; + phoneNumberLength--) { + String numberToTry = exampleNumber.substring(0, phoneNumberLength); + try { + PhoneNumber possiblyValidNumber = parse(numberToTry, regionCode); + if (!isValidNumber(possiblyValidNumber)) { + return possiblyValidNumber; + } + } catch (NumberParseException e) { + // Shouldn't happen: we have already checked the length, we know example numbers have + // only valid digits, and we know the region code is fine. + } + } + // We have a test to check that this doesn't happen for any of our supported regions. + return null; + } + + /** + * Gets a valid number for the specified region and number type. + * + * @param regionCode the region for which an example number is needed + * @param type the type of number that is needed + * @return a valid number for the specified region and type. Returns null when the metadata + * does not contain such information or if an invalid region or region 001 was entered. + * For 001 (representing non-geographical numbers), call + * {@link #getExampleNumberForNonGeoEntity} instead. + */ + public PhoneNumber getExampleNumberForType(String regionCode, PhoneNumberType type) { + // Check the region code is valid. + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return null; + } + PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type); + try { + if (desc.hasExampleNumber()) { + return parse(desc.getExampleNumber(), regionCode); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + return null; + } + + /** + * Gets a valid number for the specified number type (it may belong to any country). + * + * @param type the type of number that is needed + * @return a valid number for the specified type. Returns null when the metadata + * does not contain such information. This should only happen when no numbers of this type are + * allocated anywhere in the world anymore. + */ + public PhoneNumber getExampleNumberForType(PhoneNumberType type) { + for (String regionCode : getSupportedRegions()) { + PhoneNumber exampleNumber = getExampleNumberForType(regionCode, type); + if (exampleNumber != null) { + return exampleNumber; + } + } + // If there wasn't an example number for a region, try the non-geographical entities. + for (int countryCallingCode : getSupportedGlobalNetworkCallingCodes()) { + PhoneNumberDesc desc = getNumberDescByType( + getMetadataForNonGeographicalRegion(countryCallingCode), type); + try { + if (desc.hasExampleNumber()) { + return parse("+" + countryCallingCode + desc.getExampleNumber(), UNKNOWN_REGION); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + } + // There are no example numbers of this type for any country in the library. + return null; + } + + /** + * Gets a valid number for the specified country calling code for a non-geographical entity. + * + * @param countryCallingCode the country calling code for a non-geographical entity + * @return a valid number for the non-geographical entity. Returns null when the metadata + * does not contain such information, or the country calling code passed in does not belong + * to a non-geographical entity. + */ + public PhoneNumber getExampleNumberForNonGeoEntity(int countryCallingCode) { + PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode); + if (metadata != null) { + // For geographical entities, fixed-line data is always present. However, for non-geographical + // entities, this is not the case, so we have to go through different types to find the + // example number. We don't check fixed-line or personal number since they aren't used by + // non-geographical entities (if this changes, a unit-test will catch this.) + for (PhoneNumberDesc desc : Arrays.asList(metadata.getMobile(), metadata.getTollFree(), + metadata.getSharedCost(), metadata.getVoip(), metadata.getVoicemail(), + metadata.getUan(), metadata.getPremiumRate())) { + try { + if (desc != null && desc.hasExampleNumber()) { + return parse("+" + countryCallingCode + desc.getExampleNumber(), UNKNOWN_REGION); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + } + } else { + logger.log(Level.WARNING, + "Invalid or unknown country calling code provided: " + countryCallingCode); + } + return null; + } + + /** + * Appends the formatted extension of a phone number to formattedNumber, if the phone number had + * an extension specified. + */ + private void maybeAppendFormattedExtension(PhoneNumber number, PhoneMetadata metadata, + PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + if (number.hasExtension() && number.getExtension().length() > 0) { + if (numberFormat == PhoneNumberFormat.RFC3966) { + formattedNumber.append(RFC3966_EXTN_PREFIX).append(number.getExtension()); + } else { + if (metadata.hasPreferredExtnPrefix()) { + formattedNumber.append(metadata.getPreferredExtnPrefix()).append(number.getExtension()); + } else { + formattedNumber.append(DEFAULT_EXTN_PREFIX).append(number.getExtension()); + } + } + } + } + + PhoneNumberDesc getNumberDescByType(PhoneMetadata metadata, PhoneNumberType type) { + switch (type) { + case PREMIUM_RATE: + return metadata.getPremiumRate(); + case TOLL_FREE: + return metadata.getTollFree(); + case MOBILE: + return metadata.getMobile(); + case FIXED_LINE: + case FIXED_LINE_OR_MOBILE: + return metadata.getFixedLine(); + case SHARED_COST: + return metadata.getSharedCost(); + case VOIP: + return metadata.getVoip(); + case PERSONAL_NUMBER: + return metadata.getPersonalNumber(); + case PAGER: + return metadata.getPager(); + case UAN: + return metadata.getUan(); + case VOICEMAIL: + return metadata.getVoicemail(); + default: + return metadata.getGeneralDesc(); + } + } + + /** + * Gets the type of a valid phone number. + * + * @param number the phone number that we want to know the type + * @return the type of the phone number, or UNKNOWN if it is invalid + */ + public PhoneNumberType getNumberType(PhoneNumber number) { + String regionCode = getRegionCodeForNumber(number); + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(number.getCountryCode(), regionCode); + if (metadata == null) { + return PhoneNumberType.UNKNOWN; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return getNumberTypeHelper(nationalSignificantNumber, metadata); + } + + private PhoneNumberType getNumberTypeHelper(String nationalNumber, PhoneMetadata metadata) { + if (!isNumberMatchingDesc(nationalNumber, metadata.getGeneralDesc())) { + return PhoneNumberType.UNKNOWN; + } + + if (isNumberMatchingDesc(nationalNumber, metadata.getPremiumRate())) { + return PhoneNumberType.PREMIUM_RATE; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getTollFree())) { + return PhoneNumberType.TOLL_FREE; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getSharedCost())) { + return PhoneNumberType.SHARED_COST; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getVoip())) { + return PhoneNumberType.VOIP; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getPersonalNumber())) { + return PhoneNumberType.PERSONAL_NUMBER; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getPager())) { + return PhoneNumberType.PAGER; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getUan())) { + return PhoneNumberType.UAN; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getVoicemail())) { + return PhoneNumberType.VOICEMAIL; + } + + boolean isFixedLine = isNumberMatchingDesc(nationalNumber, metadata.getFixedLine()); + if (isFixedLine) { + if (metadata.getSameMobileAndFixedLinePattern()) { + return PhoneNumberType.FIXED_LINE_OR_MOBILE; + } else if (isNumberMatchingDesc(nationalNumber, metadata.getMobile())) { + return PhoneNumberType.FIXED_LINE_OR_MOBILE; + } + return PhoneNumberType.FIXED_LINE; + } + // Otherwise, test to see if the number is mobile. Only do this if certain that the patterns for + // mobile and fixed line aren't the same. + if (!metadata.getSameMobileAndFixedLinePattern() + && isNumberMatchingDesc(nationalNumber, metadata.getMobile())) { + return PhoneNumberType.MOBILE; + } + return PhoneNumberType.UNKNOWN; + } + + /** + * Returns the metadata for the given region code or {@code null} if the region code is invalid or + * unknown. + * + * @throws MissingMetadataException if the region code is valid, but metadata cannot be found. + */ + PhoneMetadata getMetadataForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + return null; + } + PhoneMetadata phoneMetadata = metadataSource.getMetadataForRegion(regionCode); + ensureMetadataIsNonNull(phoneMetadata, "Missing metadata for region code " + regionCode); + return phoneMetadata; + } + + /** + * Returns the metadata for the given country calling code or {@code null} if the country calling + * code is invalid or unknown. + * + * @throws MissingMetadataException if the country calling code is valid, but metadata cannot be + * found. + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (!countryCodesForNonGeographicalRegion.contains(countryCallingCode)) { + return null; + } + PhoneMetadata phoneMetadata = metadataSource.getMetadataForNonGeographicalRegion( + countryCallingCode); + ensureMetadataIsNonNull(phoneMetadata, + "Missing metadata for country code " + countryCallingCode); + return phoneMetadata; + } + + private static void ensureMetadataIsNonNull(PhoneMetadata phoneMetadata, String message) { + if (phoneMetadata == null) { + throw new MissingMetadataException(message); + } + } + + boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) { + // Check if any possible number lengths are present; if so, we use them to avoid checking the + // validation pattern if they don't match. If they are absent, this means they match the general + // description, which we have already checked before checking a specific number type. + int actualLength = nationalNumber.length(); + List possibleLengths = numberDesc.getPossibleLengthList(); + if (possibleLengths.size() > 0 && !possibleLengths.contains(actualLength)) { + return false; + } + return matcherApi.matchNationalNumber(nationalNumber, numberDesc, false); + } + + /** + * Tests whether a phone number matches a valid pattern. Note this doesn't verify the number + * is actually in use, which is impossible to tell by just looking at a number itself. It only + * verifies whether the parsed, canonicalised number is valid: not whether a particular series of + * digits entered by the user is diallable from the region provided when parsing. For example, the + * number +41 (0) 78 927 2696 can be parsed into a number with country code "41" and national + * significant number "789272696". This is valid, while the original string is not diallable. + * + * @param number the phone number that we want to validate + * @return a boolean that indicates whether the number is of a valid pattern + */ + public boolean isValidNumber(PhoneNumber number) { + String regionCode = getRegionCodeForNumber(number); + return isValidNumberForRegion(number, regionCode); + } + + /** + * Tests whether a phone number is valid for a certain region. Note this doesn't verify the number + * is actually in use, which is impossible to tell by just looking at a number itself. If the + * country calling code is not the same as the country calling code for the region, this + * immediately exits with false. After this, the specific number pattern rules for the region are + * examined. This is useful for determining for example whether a particular number is valid for + * Canada, rather than just a valid NANPA number. + * Warning: In most cases, you want to use {@link #isValidNumber} instead. For example, this + * method will mark numbers from British Crown dependencies such as the Isle of Man as invalid for + * the region "GB" (United Kingdom), since it has its own region code, "IM", which may be + * undesirable. + * + * @param number the phone number that we want to validate + * @param regionCode the region that we want to validate the phone number for + * @return a boolean that indicates whether the number is of a valid pattern + */ + public boolean isValidNumberForRegion(PhoneNumber number, String regionCode) { + int countryCode = number.getCountryCode(); + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); + if ((metadata == null) + || (!REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode) + && countryCode != getCountryCodeForValidRegion(regionCode))) { + // Either the region code was invalid, or the country calling code for this number does not + // match that of the region code. + return false; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return getNumberTypeHelper(nationalSignificantNumber, metadata) != PhoneNumberType.UNKNOWN; + } + + /** + * Returns the region where a phone number is from. This could be used for geocoding at the region + * level. Only guarantees correct results for valid, full numbers (not short-codes, or invalid + * numbers). + * + * @param number the phone number whose origin we want to know + * @return the region where the phone number is from, or null if no region matches this calling + * code + */ + public String getRegionCodeForNumber(PhoneNumber number) { + int countryCode = number.getCountryCode(); + List regions = countryCallingCodeToRegionCodeMap.get(countryCode); + if (regions == null) { + logger.log(Level.INFO, "Missing/invalid country_code (" + countryCode + ")"); + return null; + } + if (regions.size() == 1) { + return regions.get(0); + } else { + return getRegionCodeForNumberFromRegionList(number, regions); + } + } + + private String getRegionCodeForNumberFromRegionList(PhoneNumber number, + List regionCodes) { + String nationalNumber = getNationalSignificantNumber(number); + for (String regionCode : regionCodes) { + // If leadingDigits is present, use this. Otherwise, do full validation. + // Metadata cannot be null because the region codes come from the country calling code map. + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata.hasLeadingDigits()) { + if (regexCache.getPatternForRegex(metadata.getLeadingDigits()) + .matcher(nationalNumber).lookingAt()) { + return regionCode; + } + } else if (getNumberTypeHelper(nationalNumber, metadata) != PhoneNumberType.UNKNOWN) { + return regionCode; + } + } + return null; + } + + /** + * Returns the region code that matches the specific country calling code. In the case of no + * region code being found, ZZ will be returned. In the case of multiple regions, the one + * designated in the metadata as the "main" region for this calling code will be returned. If the + * countryCallingCode entered is valid but doesn't match a specific region (such as in the case of + * non-geographical calling codes like 800) the value "001" will be returned (corresponding to + * the value for World in the UN M.49 schema). + */ + public String getRegionCodeForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return regionCodes == null ? UNKNOWN_REGION : regionCodes.get(0); + } + + /** + * Returns a list with the region codes that match the specific country calling code. For + * non-geographical country calling codes, the region code 001 is returned. Also, in the case + * of no region code being found, an empty list is returned. + */ + public List getRegionCodesForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return Collections.unmodifiableList(regionCodes == null ? new ArrayList(0) + : regionCodes); + } + + /** + * Returns the country calling code for a specific region. For example, this would be 1 for the + * United States, and 64 for New Zealand. + * + * @param regionCode the region that we want to get the country calling code for + * @return the country calling code for the region denoted by regionCode + */ + public int getCountryCodeForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, + "Invalid or missing region code (" + + ((regionCode == null) ? "null" : regionCode) + + ") provided."); + return 0; + } + return getCountryCodeForValidRegion(regionCode); + } + + /** + * Returns the country calling code for a specific region. For example, this would be 1 for the + * United States, and 64 for New Zealand. Assumes the region is already valid. + * + * @param regionCode the region that we want to get the country calling code for + * @return the country calling code for the region denoted by regionCode + * @throws IllegalArgumentException if the region is invalid + */ + private int getCountryCodeForValidRegion(String regionCode) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + throw new IllegalArgumentException("Invalid region code: " + regionCode); + } + return metadata.getCountryCode(); + } + + /** + * Returns the national dialling prefix for a specific region. For example, this would be 1 for + * the United States, and 0 for New Zealand. Set stripNonDigits to true to strip symbols like "~" + * (which indicates a wait for a dialling tone) from the prefix returned. If no national prefix is + * present, we return null. + * + *

Warning: Do not use this method for do-your-own formatting - for some regions, the + * national dialling prefix is used only for certain types of numbers. Use the library's + * formatting functions to prefix the national prefix when required. + * + * @param regionCode the region that we want to get the dialling prefix for + * @param stripNonDigits true to strip non-digits from the national dialling prefix + * @return the dialling prefix for the region denoted by regionCode + */ + public String getNddPrefixForRegion(String regionCode, boolean stripNonDigits) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + logger.log(Level.WARNING, + "Invalid or missing region code (" + + ((regionCode == null) ? "null" : regionCode) + + ") provided."); + return null; + } + String nationalPrefix = metadata.getNationalPrefix(); + // If no national prefix was found, we return null. + if (nationalPrefix.length() == 0) { + return null; + } + if (stripNonDigits) { + // Note: if any other non-numeric symbols are ever used in national prefixes, these would have + // to be removed here as well. + nationalPrefix = nationalPrefix.replace("~", ""); + } + return nationalPrefix; + } + + /** + * Checks if this is a region under the North American Numbering Plan Administration (NANPA). + * + * @return true if regionCode is one of the regions under NANPA + */ + public boolean isNANPACountry(String regionCode) { + return nanpaRegions.contains(regionCode); + } + + /** + * Checks if the number is a valid vanity (alpha) number such as 800 MICROSOFT. A valid vanity + * number will start with at least 3 digits and will have three or more alpha characters. This + * does not do region-specific checks - to work out if this number is actually valid for a region, + * it should be parsed and methods such as {@link #isPossibleNumberWithReason} and + * {@link #isValidNumber} should be used. + * + * @param number the number that needs to be checked + * @return true if the number is a valid vanity number + */ + public boolean isAlphaNumber(CharSequence number) { + if (!isViablePhoneNumber(number)) { + // Number is too short, or doesn't match the basic phone number pattern. + return false; + } + StringBuilder strippedNumber = new StringBuilder(number); + maybeStripExtension(strippedNumber); + return VALID_ALPHA_PHONE_PATTERN.matcher(strippedNumber).matches(); + } + + /** + * Convenience wrapper around {@link #isPossibleNumberWithReason}. Instead of returning the reason + * for failure, this method returns true if the number is either a possible fully-qualified number + * (containing the area code and country code), or if the number could be a possible local number + * (with a country code, but missing an area code). Local numbers are considered possible if they + * could be possibly dialled in this format: if the area code is needed for a call to connect, the + * number is not considered possible without it. + * + * @param number the number that needs to be checked + * @return true if the number is possible + */ + public boolean isPossibleNumber(PhoneNumber number) { + ValidationResult result = isPossibleNumberWithReason(number); + return result == ValidationResult.IS_POSSIBLE + || result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + /** + * Convenience wrapper around {@link #isPossibleNumberForTypeWithReason}. Instead of returning the + * reason for failure, this method returns true if the number is either a possible fully-qualified + * number (containing the area code and country code), or if the number could be a possible local + * number (with a country code, but missing an area code). Local numbers are considered possible + * if they could be possibly dialled in this format: if the area code is needed for a call to + * connect, the number is not considered possible without it. + * + * @param number the number that needs to be checked + * @param type the type we are interested in + * @return true if the number is possible for this particular type + */ + public boolean isPossibleNumberForType(PhoneNumber number, PhoneNumberType type) { + ValidationResult result = isPossibleNumberForTypeWithReason(number, type); + return result == ValidationResult.IS_POSSIBLE + || result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + /** + * Helper method to check a number against possible lengths for this region, based on the metadata + * being passed in, and determine whether it matches, or is too short or too long. + */ + private ValidationResult testNumberLength(CharSequence number, PhoneMetadata metadata) { + return testNumberLength(number, metadata, PhoneNumberType.UNKNOWN); + } + + /** + * Helper method to check a number against possible lengths for this number type, and determine + * whether it matches, or is too short or too long. + */ + private ValidationResult testNumberLength( + CharSequence number, PhoneMetadata metadata, PhoneNumberType type) { + PhoneNumberDesc descForType = getNumberDescByType(metadata, type); + // There should always be "possibleLengths" set for every element. This is declared in the XML + // schema which is verified by PhoneNumberMetadataSchemaTest. + // For size efficiency, where a sub-description (e.g. fixed-line) has the same possibleLengths + // as the parent, this is missing, so we fall back to the general desc (where no numbers of the + // type exist at all, there is one possible length (-1) which is guaranteed not to match the + // length of any real phone number). + List possibleLengths = descForType.getPossibleLengthList().isEmpty() + ? metadata.getGeneralDesc().getPossibleLengthList() : descForType.getPossibleLengthList(); + + List localLengths = descForType.getPossibleLengthLocalOnlyList(); + + if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE) { + if (!descHasPossibleNumberData(getNumberDescByType(metadata, PhoneNumberType.FIXED_LINE))) { + // The rare case has been encountered where no fixedLine data is available (true for some + // non-geographical entities), so we just check mobile. + return testNumberLength(number, metadata, PhoneNumberType.MOBILE); + } else { + PhoneNumberDesc mobileDesc = getNumberDescByType(metadata, PhoneNumberType.MOBILE); + if (descHasPossibleNumberData(mobileDesc)) { + // Merge the mobile data in if there was any. We have to make a copy to do this. + possibleLengths = new ArrayList<>(possibleLengths); + // Note that when adding the possible lengths from mobile, we have to again check they + // aren't empty since if they are this indicates they are the same as the general desc and + // should be obtained from there. + possibleLengths.addAll(mobileDesc.getPossibleLengthCount() == 0 + ? metadata.getGeneralDesc().getPossibleLengthList() + : mobileDesc.getPossibleLengthList()); + // The current list is sorted; we need to merge in the new list and re-sort (duplicates + // are okay). Sorting isn't so expensive because the lists are very small. + Collections.sort(possibleLengths); + + if (localLengths.isEmpty()) { + localLengths = mobileDesc.getPossibleLengthLocalOnlyList(); + } else { + localLengths = new ArrayList<>(localLengths); + localLengths.addAll(mobileDesc.getPossibleLengthLocalOnlyList()); + Collections.sort(localLengths); + } + } + } + } + + // If the type is not supported at all (indicated by the possible lengths containing -1 at this + // point) we return invalid length. + if (possibleLengths.get(0) == -1) { + return ValidationResult.INVALID_LENGTH; + } + + int actualLength = number.length(); + // This is safe because there is never an overlap beween the possible lengths and the local-only + // lengths; this is checked at build time. + if (localLengths.contains(actualLength)) { + return ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + int minimumLength = possibleLengths.get(0); + if (minimumLength == actualLength) { + return ValidationResult.IS_POSSIBLE; + } else if (minimumLength > actualLength) { + return ValidationResult.TOO_SHORT; + } else if (possibleLengths.get(possibleLengths.size() - 1) < actualLength) { + return ValidationResult.TOO_LONG; + } + // We skip the first element; we've already checked it. + return possibleLengths.subList(1, possibleLengths.size()).contains(actualLength) + ? ValidationResult.IS_POSSIBLE : ValidationResult.INVALID_LENGTH; + } + + /** + * Check whether a phone number is a possible number. It provides a more lenient check than + * {@link #isValidNumber} in the following sense: + *

    + *
  1. It only checks the length of phone numbers. In particular, it doesn't check starting + * digits of the number. + *
  2. It doesn't attempt to figure out the type of the number, but uses general rules which + * applies to all types of phone numbers in a region. Therefore, it is much faster than + * isValidNumber. + *
  3. For some numbers (particularly fixed-line), many regions have the concept of area code, + * which together with subscriber number constitute the national significant number. It is + * sometimes okay to dial only the subscriber number when dialing in the same area. This + * function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is + * passed in. On the other hand, because isValidNumber validates using information on both + * starting digits (for fixed line numbers, that would most likely be area codes) and + * length (obviously includes the length of area codes for fixed line numbers), it will + * return false for the subscriber-number-only version. + *
+ * + *

There is a known issue with this + * method: if a number is possible only in a certain region among several regions that share the + * same country calling code, this method will consider only the "main" region. For example, + * +1310xxxx are valid numbers in Canada. However, they are not possible in the US. As a result, + * this method will return IS_POSSIBLE_LOCAL_ONLY for +1310xxxx. + * + * @param number the number that needs to be checked + * @return a ValidationResult object which indicates whether the number is possible + */ + public ValidationResult isPossibleNumberWithReason(PhoneNumber number) { + return isPossibleNumberForTypeWithReason(number, PhoneNumberType.UNKNOWN); + } + + /** + * Check whether a phone number is a possible number of a particular type. For types that don't + * exist in a particular region, this will return a result that isn't so useful; it is recommended + * that you use {@link #getSupportedTypesForRegion} or {@link #getSupportedTypesForNonGeoEntity} + * respectively before calling this method to determine whether you should call it for this number + * at all. + * + * This provides a more lenient check than {@link #isValidNumber} in the following sense: + * + *

    + *
  1. It only checks the length of phone numbers. In particular, it doesn't check starting + * digits of the number. + *
  2. For some numbers (particularly fixed-line), many regions have the concept of area code, + * which together with subscriber number constitute the national significant number. It is + * sometimes okay to dial only the subscriber number when dialing in the same area. This + * function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is + * passed in. On the other hand, because isValidNumber validates using information on both + * starting digits (for fixed line numbers, that would most likely be area codes) and + * length (obviously includes the length of area codes for fixed line numbers), it will + * return false for the subscriber-number-only version. + *
+ * + *

There is a known issue with this + * method: if a number is possible only in a certain region among several regions that share the + * same country calling code, this method will consider only the "main" region. For example, + * +1310xxxx are valid numbers in Canada. However, they are not possible in the US. As a result, + * this method will return IS_POSSIBLE_LOCAL_ONLY for +1310xxxx. + * + * @param number the number that needs to be checked + * @param type the type we are interested in + * @return a ValidationResult object which indicates whether the number is possible + */ + public ValidationResult isPossibleNumberForTypeWithReason( + PhoneNumber number, PhoneNumberType type) { + String nationalNumber = getNationalSignificantNumber(number); + int countryCode = number.getCountryCode(); + // Note: For regions that share a country calling code, like NANPA numbers, we just use the + // rules from the default region (US in this case) since the getRegionCodeForNumber will not + // work if the number is possible but not valid. There is in fact one country calling code (290) + // where the possible number pattern differs between various regions (Saint Helena and Tristan + // da Cuñha), but this is handled by putting all possible lengths for any country with this + // country calling code in the metadata for the default region in this case. + if (!hasValidCountryCallingCode(countryCode)) { + return ValidationResult.INVALID_COUNTRY_CODE; + } + String regionCode = getRegionCodeForCountryCode(countryCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); + return testNumberLength(nationalNumber, metadata, type); + } + + /** + * Check whether a phone number is a possible number given a number in the form of a string, and + * the region where the number could be dialed from. It provides a more lenient check than + * {@link #isValidNumber}. See {@link #isPossibleNumber(PhoneNumber)} for details. + * + *

This method first parses the number, then invokes {@link #isPossibleNumber(PhoneNumber)} + * with the resultant PhoneNumber object. + * + * @param number the number that needs to be checked + * @param regionDialingFrom the region that we are expecting the number to be dialed from. + * Note this is different from the region where the number belongs. For example, the number + * +1 650 253 0000 is a number that belongs to US. When written in this form, it can be + * dialed from any region. When it is written as 00 1 650 253 0000, it can be dialed from any + * region which uses an international dialling prefix of 00. When it is written as + * 650 253 0000, it can only be dialed from within the US, and when written as 253 0000, it + * can only be dialed from within a smaller area in the US (Mountain View, CA, to be more + * specific). + * @return true if the number is possible + */ + public boolean isPossibleNumber(CharSequence number, String regionDialingFrom) { + try { + return isPossibleNumber(parse(number, regionDialingFrom)); + } catch (NumberParseException e) { + return false; + } + } + + /** + * Attempts to extract a valid number from a phone number that is too long to be valid, and resets + * the PhoneNumber object passed in to that valid version. If no valid number could be extracted, + * the PhoneNumber object passed in will not be modified. + * @param number a PhoneNumber object which contains a number that is too long to be valid + * @return true if a valid phone number can be successfully extracted + */ + public boolean truncateTooLongNumber(PhoneNumber number) { + if (isValidNumber(number)) { + return true; + } + PhoneNumber numberCopy = new PhoneNumber(); + numberCopy.mergeFrom(number); + long nationalNumber = number.getNationalNumber(); + do { + nationalNumber /= 10; + numberCopy.setNationalNumber(nationalNumber); + if (isPossibleNumberWithReason(numberCopy) == ValidationResult.TOO_SHORT + || nationalNumber == 0) { + return false; + } + } while (!isValidNumber(numberCopy)); + number.setNationalNumber(nationalNumber); + return true; + } + + /** + * Gets an {@link com.google.i18n.phonenumbers.AsYouTypeFormatter} for the specific region. + * + * @param regionCode the region where the phone number is being entered + * @return an {@link com.google.i18n.phonenumbers.AsYouTypeFormatter} object, which can be used + * to format phone numbers in the specific region "as you type" + */ + public AsYouTypeFormatter getAsYouTypeFormatter(String regionCode) { + return new AsYouTypeFormatter(regionCode); + } + + // Extracts country calling code from fullNumber, returns it and places the remaining number in + // nationalNumber. It assumes that the leading plus sign or IDD has already been removed. Returns + // 0 if fullNumber doesn't start with a valid country calling code, and leaves nationalNumber + // unmodified. + int extractCountryCode(StringBuilder fullNumber, StringBuilder nationalNumber) { + if ((fullNumber.length() == 0) || (fullNumber.charAt(0) == '0')) { + // Country codes do not begin with a '0'. + return 0; + } + int potentialCountryCode; + int numberLength = fullNumber.length(); + for (int i = 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++) { + potentialCountryCode = Integer.parseInt(fullNumber.substring(0, i)); + if (countryCallingCodeToRegionCodeMap.containsKey(potentialCountryCode)) { + nationalNumber.append(fullNumber.substring(i)); + return potentialCountryCode; + } + } + return 0; + } + + /** + * Tries to extract a country calling code from a number. This method will return zero if no + * country calling code is considered to be present. Country calling codes are extracted in the + * following ways: + *

    + *
  • by stripping the international dialing prefix of the region the person is dialing from, + * if this is present in the number, and looking at the next digits + *
  • by stripping the '+' sign if present and then looking at the next digits + *
  • by comparing the start of the number and the country calling code of the default region. + * If the number is not considered possible for the numbering plan of the default region + * initially, but starts with the country calling code of this region, validation will be + * reattempted after stripping this country calling code. If this number is considered a + * possible number, then the first digits will be considered the country calling code and + * removed as such. + *
+ * It will throw a NumberParseException if the number starts with a '+' but the country calling + * code supplied after this does not match that of any known region. + * + * @param number non-normalized telephone number that we wish to extract a country calling + * code from - may begin with '+' + * @param defaultRegionMetadata metadata about the region this number may be from + * @param nationalNumber a string buffer to store the national significant number in, in the case + * that a country calling code was extracted. The number is appended to any existing contents. + * If no country calling code was extracted, this will be left unchanged. + * @param keepRawInput true if the country_code_source and preferred_carrier_code fields of + * phoneNumber should be populated. + * @param phoneNumber the PhoneNumber object where the country_code and country_code_source need + * to be populated. Note the country_code is always populated, whereas country_code_source is + * only populated when keepCountryCodeSource is true. + * @return the country calling code extracted or 0 if none could be extracted + */ + // @VisibleForTesting + int maybeExtractCountryCode(CharSequence number, PhoneMetadata defaultRegionMetadata, + StringBuilder nationalNumber, boolean keepRawInput, + PhoneNumber phoneNumber) + throws NumberParseException { + if (number.length() == 0) { + return 0; + } + StringBuilder fullNumber = new StringBuilder(number); + // Set the default prefix to be something that will never match. + String possibleCountryIddPrefix = "NonMatch"; + if (defaultRegionMetadata != null) { + possibleCountryIddPrefix = defaultRegionMetadata.getInternationalPrefix(); + } + + CountryCodeSource countryCodeSource = + maybeStripInternationalPrefixAndNormalize(fullNumber, possibleCountryIddPrefix); + if (keepRawInput) { + phoneNumber.setCountryCodeSource(countryCodeSource); + } + if (countryCodeSource != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (fullNumber.length() <= MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, + "Phone number had an IDD, but after this was not " + + "long enough to be a viable phone number."); + } + int potentialCountryCode = extractCountryCode(fullNumber, nationalNumber); + if (potentialCountryCode != 0) { + phoneNumber.setCountryCode(potentialCountryCode); + return potentialCountryCode; + } + + // If this fails, they must be using a strange country calling code that we don't recognize, + // or that doesn't exist. + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Country calling code supplied was not recognised."); + } else if (defaultRegionMetadata != null) { + // Check to see if the number starts with the country calling code for the default region. If + // so, we remove the country calling code, and do some checks on the validity of the number + // before and after. + int defaultCountryCode = defaultRegionMetadata.getCountryCode(); + String defaultCountryCodeString = String.valueOf(defaultCountryCode); + String normalizedNumber = fullNumber.toString(); + if (normalizedNumber.startsWith(defaultCountryCodeString)) { + StringBuilder potentialNationalNumber = + new StringBuilder(normalizedNumber.substring(defaultCountryCodeString.length())); + PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc(); + maybeStripNationalPrefixAndCarrierCode( + potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */); + // If the number was not valid before but is valid now, or if it was too long before, we + // consider the number with the country calling code stripped to be a better result and + // keep that instead. + if ((!matcherApi.matchNationalNumber(fullNumber, generalDesc, false) + && matcherApi.matchNationalNumber(potentialNationalNumber, generalDesc, false)) + || testNumberLength(fullNumber, defaultRegionMetadata) == ValidationResult.TOO_LONG) { + nationalNumber.append(potentialNationalNumber); + if (keepRawInput) { + phoneNumber.setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + } + phoneNumber.setCountryCode(defaultCountryCode); + return defaultCountryCode; + } + } + } + // No country calling code present. + phoneNumber.setCountryCode(0); + return 0; + } + + /** + * Strips the IDD from the start of the number if present. Helper function used by + * maybeStripInternationalPrefixAndNormalize. + */ + private boolean parsePrefixAsIdd(Pattern iddPattern, StringBuilder number) { + Matcher m = iddPattern.matcher(number); + if (m.lookingAt()) { + int matchEnd = m.end(); + // Only strip this if the first digit after the match is not a 0, since country calling codes + // cannot begin with 0. + Matcher digitMatcher = CAPTURING_DIGIT_PATTERN.matcher(number.substring(matchEnd)); + if (digitMatcher.find()) { + String normalizedGroup = normalizeDigitsOnly(digitMatcher.group(1)); + if (normalizedGroup.equals("0")) { + return false; + } + } + number.delete(0, matchEnd); + return true; + } + return false; + } + + /** + * Strips any international prefix (such as +, 00, 011) present in the number provided, normalizes + * the resulting number, and indicates if an international prefix was present. + * + * @param number the non-normalized telephone number that we wish to strip any international + * dialing prefix from + * @param possibleIddPrefix the international direct dialing prefix from the region we + * think this number may be dialed in + * @return the corresponding CountryCodeSource if an international dialing prefix could be + * removed from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if the number did + * not seem to be in international format + */ + // @VisibleForTesting + CountryCodeSource maybeStripInternationalPrefixAndNormalize( + StringBuilder number, + String possibleIddPrefix) { + if (number.length() == 0) { + return CountryCodeSource.FROM_DEFAULT_COUNTRY; + } + // Check to see if the number begins with one or more plus signs. + Matcher m = PLUS_CHARS_PATTERN.matcher(number); + if (m.lookingAt()) { + number.delete(0, m.end()); + // Can now normalize the rest of the number since we've consumed the "+" sign at the start. + normalize(number); + return CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN; + } + // Attempt to parse the first digits as an international prefix. + Pattern iddPattern = regexCache.getPatternForRegex(possibleIddPrefix); + normalize(number); + return parsePrefixAsIdd(iddPattern, number) + ? CountryCodeSource.FROM_NUMBER_WITH_IDD + : CountryCodeSource.FROM_DEFAULT_COUNTRY; + } + + /** + * Strips any national prefix (such as 0, 1) present in the number provided. + * + * @param number the normalized telephone number that we wish to strip any national + * dialing prefix from + * @param metadata the metadata for the region that we think this number is from + * @param carrierCode a place to insert the carrier code if one is extracted + * @return true if a national prefix or carrier code (or both) could be extracted + */ + // @VisibleForTesting + boolean maybeStripNationalPrefixAndCarrierCode( + StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) { + int numberLength = number.length(); + String possibleNationalPrefix = metadata.getNationalPrefixForParsing(); + if (numberLength == 0 || possibleNationalPrefix.length() == 0) { + // Early return for numbers of zero length. + return false; + } + // Attempt to parse the first digits as a national prefix. + Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number); + if (prefixMatcher.lookingAt()) { + PhoneNumberDesc generalDesc = metadata.getGeneralDesc(); + // Check if the original number is viable. + boolean isViableOriginalNumber = matcherApi.matchNationalNumber(number, generalDesc, false); + // prefixMatcher.group(numOfGroups) == null implies nothing was captured by the capturing + // groups in possibleNationalPrefix; therefore, no transformation is necessary, and we just + // remove the national prefix. + int numOfGroups = prefixMatcher.groupCount(); + String transformRule = metadata.getNationalPrefixTransformRule(); + if (transformRule == null || transformRule.length() == 0 + || prefixMatcher.group(numOfGroups) == null) { + // If the original number was viable, and the resultant number is not, we return. + if (isViableOriginalNumber + && !matcherApi.matchNationalNumber( + number.substring(prefixMatcher.end()), generalDesc, false)) { + return false; + } + if (carrierCode != null && numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) { + carrierCode.append(prefixMatcher.group(1)); + } + number.delete(0, prefixMatcher.end()); + return true; + } else { + // Check that the resultant number is still viable. If not, return. Check this by copying + // the string buffer and making the transformation on the copy first. + StringBuilder transformedNumber = new StringBuilder(number); + transformedNumber.replace(0, numberLength, prefixMatcher.replaceFirst(transformRule)); + if (isViableOriginalNumber + && !matcherApi.matchNationalNumber(transformedNumber.toString(), generalDesc, false)) { + return false; + } + if (carrierCode != null && numOfGroups > 1) { + carrierCode.append(prefixMatcher.group(1)); + } + number.replace(0, number.length(), transformedNumber.toString()); + return true; + } + } + return false; + } + + /** + * Strips any extension (as in, the part of the number dialled after the call is connected, + * usually indicated with extn, ext, x or similar) from the end of the number, and returns it. + * + * @param number the non-normalized telephone number that we wish to strip the extension from + * @return the phone extension + */ + // @VisibleForTesting + String maybeStripExtension(StringBuilder number) { + Matcher m = EXTN_PATTERN.matcher(number); + // If we find a potential extension, and the number preceding this is a viable number, we assume + // it is an extension. + if (m.find() && isViablePhoneNumber(number.substring(0, m.start()))) { + // The numbers are captured into groups in the regular expression. + for (int i = 1, length = m.groupCount(); i <= length; i++) { + if (m.group(i) != null) { + // We go through the capturing groups until we find one that captured some digits. If none + // did, then we will return the empty string. + String extension = m.group(i); + number.delete(m.start(), number.length()); + return extension; + } + } + } + return ""; + } + + /** + * Checks to see that the region code used is valid, or if it is not valid, that the number to + * parse starts with a + symbol so that we can attempt to infer the region from the number. + * Returns false if it cannot use the region provided and the region cannot be inferred. + */ + private boolean checkRegionForParsing(CharSequence numberToParse, String defaultRegion) { + if (!isValidRegionCode(defaultRegion)) { + // If the number is null or empty, we can't infer the region. + if ((numberToParse == null) || (numberToParse.length() == 0) + || !PLUS_CHARS_PATTERN.matcher(numberToParse).lookingAt()) { + return false; + } + } + return true; + } + + /** + * Parses a string and returns it as a phone number in proto buffer format. The method is quite + * lenient and looks for a number in the input text (raw input) and does not check whether the + * string is definitely only a phone number. To do this, it ignores punctuation and white-space, + * as well as any text before the number (e.g. a leading "Tel: ") and trims the non-number bits. + * It will accept a number in any format (E164, national, international etc), assuming it can be + * interpreted with the defaultRegion supplied. It also attempts to convert any alpha characters + * into digits if it thinks this is a vanity number of the type "1800 MICROSOFT". + * + *

This method will throw a {@link com.google.i18n.phonenumbers.NumberParseException} if the + * number is not considered to be a possible number. Note that validation of whether the number + * is actually a valid number for a particular region is not performed. This can be done + * separately with {@link #isValidNumber}. + * + *

Note this method canonicalizes the phone number such that different representations can be + * easily compared, no matter what form it was originally entered in (e.g. national, + * international). If you want to record context about the number being parsed, such as the raw + * input that was entered, how the country code was derived etc. then call {@link + * #parseAndKeepRawInput} instead. + * + * @param numberToParse number that we are attempting to parse. This can contain formatting such + * as +, ( and -, as well as a phone number extension. It can also be provided in RFC3966 + * format. + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. If the number + * is guaranteed to start with a '+' followed by the country calling code, then RegionCode.ZZ + * or null can be supplied. + * @return a phone number proto buffer filled with the parsed number + * @throws NumberParseException if the string is not considered to be a viable phone number (e.g. + * too few or too many digits) or if no default region was supplied and the number is not in + * international format (does not start with +) + */ + public PhoneNumber parse(CharSequence numberToParse, String defaultRegion) + throws NumberParseException { + PhoneNumber phoneNumber = new PhoneNumber(); + parse(numberToParse, defaultRegion, phoneNumber); + return phoneNumber; + } + + /** + * Same as {@link #parse(CharSequence, String)}, but accepts mutable PhoneNumber as a + * parameter to decrease object creation when invoked many times. + */ + public void parse(CharSequence numberToParse, String defaultRegion, PhoneNumber phoneNumber) + throws NumberParseException { + parseHelper(numberToParse, defaultRegion, false, true, phoneNumber); + } + + /** + * Parses a string and returns it in proto buffer format. This method differs from {@link #parse} + * in that it always populates the raw_input field of the protocol buffer with numberToParse as + * well as the country_code_source field. + * + * @param numberToParse number that we are attempting to parse. This can contain formatting such + * as +, ( and -, as well as a phone number extension. + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country calling code + * for the number in this case would be stored as that of the default region supplied. + * @return a phone number proto buffer filled with the parsed number + * @throws NumberParseException if the string is not considered to be a viable phone number or if + * no default region was supplied + */ + public PhoneNumber parseAndKeepRawInput(CharSequence numberToParse, String defaultRegion) + throws NumberParseException { + PhoneNumber phoneNumber = new PhoneNumber(); + parseAndKeepRawInput(numberToParse, defaultRegion, phoneNumber); + return phoneNumber; + } + + /** + * Same as{@link #parseAndKeepRawInput(CharSequence, String)}, but accepts a mutable + * PhoneNumber as a parameter to decrease object creation when invoked many times. + */ + public void parseAndKeepRawInput(CharSequence numberToParse, String defaultRegion, + PhoneNumber phoneNumber) + throws NumberParseException { + parseHelper(numberToParse, defaultRegion, true, true, phoneNumber); + } + + /** + * Returns an iterable over all {@link PhoneNumberMatch PhoneNumberMatches} in {@code text}. This + * is a shortcut for {@link #findNumbers(CharSequence, String, Leniency, long) + * getMatcher(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE)}. + * + * @param text the text to search for phone numbers, null for no text + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. May be null if + * only international numbers are expected. + */ + public Iterable findNumbers(CharSequence text, String defaultRegion) { + return findNumbers(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE); + } + + /** + * Returns an iterable over all {@link PhoneNumberMatch PhoneNumberMatches} in {@code text}. + * + * @param text the text to search for phone numbers, null for no text + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. May be null if + * only international numbers are expected. + * @param leniency the leniency to use when evaluating candidate phone numbers + * @param maxTries the maximum number of invalid numbers to try before giving up on the text. + * This is to cover degenerate cases where the text has a lot of false positives in it. Must + * be {@code >= 0}. + */ + public Iterable findNumbers( + final CharSequence text, final String defaultRegion, final Leniency leniency, + final long maxTries) { + + return new Iterable() { + @Override + public Iterator iterator() { + return new PhoneNumberMatcher( + PhoneNumberUtil.this, text, defaultRegion, leniency, maxTries); + } + }; + } + + /** + * A helper function to set the values related to leading zeros in a PhoneNumber. + */ + static void setItalianLeadingZerosForPhoneNumber(CharSequence nationalNumber, + PhoneNumber phoneNumber) { + if (nationalNumber.length() > 1 && nationalNumber.charAt(0) == '0') { + phoneNumber.setItalianLeadingZero(true); + int numberOfLeadingZeros = 1; + // Note that if the national number is all "0"s, the last "0" is not counted as a leading + // zero. + while (numberOfLeadingZeros < nationalNumber.length() - 1 + && nationalNumber.charAt(numberOfLeadingZeros) == '0') { + numberOfLeadingZeros++; + } + if (numberOfLeadingZeros != 1) { + phoneNumber.setNumberOfLeadingZeros(numberOfLeadingZeros); + } + } + } + + /** + * Parses a string and fills up the phoneNumber. This method is the same as the public + * parse() method, with the exception that it allows the default region to be null, for use by + * isNumberMatch(). checkRegion should be set to false if it is permitted for the default region + * to be null or unknown ("ZZ"). + * + * Note if any new field is added to this method that should always be filled in, even when + * keepRawInput is false, it should also be handled in the copyCoreFieldsOnly() method. + */ + private void parseHelper(CharSequence numberToParse, String defaultRegion, + boolean keepRawInput, boolean checkRegion, PhoneNumber phoneNumber) + throws NumberParseException { + if (numberToParse == null) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The phone number supplied was null."); + } else if (numberToParse.length() > MAX_INPUT_STRING_LENGTH) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_LONG, + "The string supplied was too long to parse."); + } + + StringBuilder nationalNumber = new StringBuilder(); + String numberBeingParsed = numberToParse.toString(); + buildNationalNumberForParsing(numberBeingParsed, nationalNumber); + + if (!isViablePhoneNumber(nationalNumber)) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The string supplied did not seem to be a phone number."); + } + + // Check the region supplied is valid, or that the extracted number starts with some sort of + + // sign so the number's region can be determined. + if (checkRegion && !checkRegionForParsing(nationalNumber, defaultRegion)) { + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Missing or invalid default region."); + } + + if (keepRawInput) { + phoneNumber.setRawInput(numberBeingParsed); + } + // Attempt to parse extension first, since it doesn't require region-specific data and we want + // to have the non-normalised number here. + String extension = maybeStripExtension(nationalNumber); + if (extension.length() > 0) { + phoneNumber.setExtension(extension); + } + + PhoneMetadata regionMetadata = getMetadataForRegion(defaultRegion); + // Check to see if the number is given in international format so we know whether this number is + // from the default region or not. + StringBuilder normalizedNationalNumber = new StringBuilder(); + int countryCode = 0; + try { + // TODO: This method should really just take in the string buffer that has already + // been created, and just remove the prefix, rather than taking in a string and then + // outputting a string buffer. + countryCode = maybeExtractCountryCode(nationalNumber, regionMetadata, + normalizedNationalNumber, keepRawInput, phoneNumber); + } catch (NumberParseException e) { + Matcher matcher = PLUS_CHARS_PATTERN.matcher(nationalNumber); + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE + && matcher.lookingAt()) { + // Strip the plus-char, and try again. + countryCode = maybeExtractCountryCode(nationalNumber.substring(matcher.end()), + regionMetadata, normalizedNationalNumber, + keepRawInput, phoneNumber); + if (countryCode == 0) { + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Could not interpret numbers after plus-sign."); + } + } else { + throw new NumberParseException(e.getErrorType(), e.getMessage()); + } + } + if (countryCode != 0) { + String phoneNumberRegion = getRegionCodeForCountryCode(countryCode); + if (!phoneNumberRegion.equals(defaultRegion)) { + // Metadata cannot be null because the country calling code is valid. + regionMetadata = getMetadataForRegionOrCallingCode(countryCode, phoneNumberRegion); + } + } else { + // If no extracted country calling code, use the region supplied instead. The national number + // is just the normalized version of the number we were given to parse. + normalizedNationalNumber.append(normalize(nationalNumber)); + if (defaultRegion != null) { + countryCode = regionMetadata.getCountryCode(); + phoneNumber.setCountryCode(countryCode); + } else if (keepRawInput) { + phoneNumber.clearCountryCodeSource(); + } + } + if (normalizedNationalNumber.length() < MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_NSN, + "The string supplied is too short to be a phone number."); + } + if (regionMetadata != null) { + StringBuilder carrierCode = new StringBuilder(); + StringBuilder potentialNationalNumber = new StringBuilder(normalizedNationalNumber); + maybeStripNationalPrefixAndCarrierCode(potentialNationalNumber, regionMetadata, carrierCode); + // We require that the NSN remaining after stripping the national prefix and carrier code be + // long enough to be a possible length for the region. Otherwise, we don't do the stripping, + // since the original number could be a valid short number. + ValidationResult validationResult = testNumberLength(potentialNationalNumber, regionMetadata); + if (validationResult != ValidationResult.TOO_SHORT + && validationResult != ValidationResult.IS_POSSIBLE_LOCAL_ONLY + && validationResult != ValidationResult.INVALID_LENGTH) { + normalizedNationalNumber = potentialNationalNumber; + if (keepRawInput && carrierCode.length() > 0) { + phoneNumber.setPreferredDomesticCarrierCode(carrierCode.toString()); + } + } + } + int lengthOfNationalNumber = normalizedNationalNumber.length(); + if (lengthOfNationalNumber < MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_NSN, + "The string supplied is too short to be a phone number."); + } + if (lengthOfNationalNumber > MAX_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_LONG, + "The string supplied is too long to be a phone number."); + } + setItalianLeadingZerosForPhoneNumber(normalizedNationalNumber, phoneNumber); + phoneNumber.setNationalNumber(Long.parseLong(normalizedNationalNumber.toString())); + } + + /** + * Extracts the value of the phone-context parameter of numberToExtractFrom where the index of + * ";phone-context=" is the parameter indexOfPhoneContext, following the syntax defined in + * RFC3966. + * + * @return the extracted string (possibly empty), or null if no phone-context parameter is found. + */ + private String extractPhoneContext(String numberToExtractFrom, int indexOfPhoneContext) { + // If no phone-context parameter is present + if (indexOfPhoneContext == -1) { + return null; + } + + int phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length(); + // If phone-context parameter is empty + if (phoneContextStart >= numberToExtractFrom.length()) { + return ""; + } + + int phoneContextEnd = numberToExtractFrom.indexOf(';', phoneContextStart); + // If phone-context is not the last parameter + if (phoneContextEnd != -1) { + return numberToExtractFrom.substring(phoneContextStart, phoneContextEnd); + } else { + return numberToExtractFrom.substring(phoneContextStart); + } + } + + /** + * Returns whether the value of phoneContext follows the syntax defined in RFC3966. + */ + private boolean isPhoneContextValid(String phoneContext) { + if (phoneContext == null) { + return true; + } + if (phoneContext.length() == 0) { + return false; + } + + // Does phone-context value match pattern of global-number-digits or domainname + return RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN.matcher(phoneContext).matches() + || RFC3966_DOMAINNAME_PATTERN.matcher(phoneContext).matches(); + } + + /** + * Converts numberToParse to a form that we can parse and write it to nationalNumber if it is + * written in RFC3966; otherwise extract a possible number out of it and write to nationalNumber. + */ + private void buildNationalNumberForParsing(String numberToParse, StringBuilder nationalNumber) + throws NumberParseException { + int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT); + + String phoneContext = extractPhoneContext(numberToParse, indexOfPhoneContext); + if (!isPhoneContextValid(phoneContext)) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The phone-context value is invalid."); + } + if (phoneContext != null) { + // If the phone context contains a phone number prefix, we need to capture it, whereas domains + // will be ignored. + if (phoneContext.charAt(0) == PLUS_SIGN) { + // Additional parameters might follow the phone context. If so, we will remove them here + // because the parameters after phone context are not important for parsing the phone + // number. + nationalNumber.append(phoneContext); + } + + // Now append everything between the "tel:" prefix and the phone-context. This should include + // the national number, an optional extension or isdn-subaddress component. Note we also + // handle the case when "tel:" is missing, as we have seen in some of the phone number inputs. + // In that case, we append everything from the beginning. + int indexOfRfc3966Prefix = numberToParse.indexOf(RFC3966_PREFIX); + int indexOfNationalNumber = + (indexOfRfc3966Prefix >= 0) ? indexOfRfc3966Prefix + RFC3966_PREFIX.length() : 0; + nationalNumber.append(numberToParse.substring(indexOfNationalNumber, indexOfPhoneContext)); + } else { + // Extract a possible number from the string passed in (this strips leading characters that + // could not be the start of a phone number.) + nationalNumber.append(extractPossibleNumber(numberToParse)); + } + + // Delete the isdn-subaddress and everything after it if it is present. Note extension won't + // appear at the same time with isdn-subaddress according to paragraph 5.3 of the RFC3966 spec, + int indexOfIsdn = nationalNumber.indexOf(RFC3966_ISDN_SUBADDRESS); + if (indexOfIsdn > 0) { + nationalNumber.delete(indexOfIsdn, nationalNumber.length()); + } + // If both phone context and isdn-subaddress are absent but other parameters are present, the + // parameters are left in nationalNumber. This is because we are concerned about deleting + // content from a potential number string when there is no strong evidence that the number is + // actually written in RFC3966. + } + + /** + * Returns a new phone number containing only the fields needed to uniquely identify a phone + * number, rather than any fields that capture the context in which the phone number was created. + * These fields correspond to those set in parse() rather than parseAndKeepRawInput(). + */ + private static PhoneNumber copyCoreFieldsOnly(PhoneNumber phoneNumberIn) { + PhoneNumber phoneNumber = new PhoneNumber(); + phoneNumber.setCountryCode(phoneNumberIn.getCountryCode()); + phoneNumber.setNationalNumber(phoneNumberIn.getNationalNumber()); + if (phoneNumberIn.getExtension().length() > 0) { + phoneNumber.setExtension(phoneNumberIn.getExtension()); + } + if (phoneNumberIn.isItalianLeadingZero()) { + phoneNumber.setItalianLeadingZero(true); + // This field is only relevant if there are leading zeros at all. + phoneNumber.setNumberOfLeadingZeros(phoneNumberIn.getNumberOfLeadingZeros()); + } + return phoneNumber; + } + + /** + * Takes two phone numbers and compares them for equality. + * + *

Returns EXACT_MATCH if the country_code, NSN, presence of a leading zero for Italian numbers + * and any extension present are the same. + * Returns NSN_MATCH if either or both has no region specified, and the NSNs and extensions are + * the same. + * Returns SHORT_NSN_MATCH if either or both has no region specified, or the region specified is + * the same, and one NSN could be a shorter version of the other number. This includes the case + * where one has an extension specified, and the other does not. + * Returns NO_MATCH otherwise. + * For example, the numbers +1 345 657 1234 and 657 1234 are a SHORT_NSN_MATCH. + * The numbers +1 345 657 1234 and 345 657 are a NO_MATCH. + * + * @param firstNumberIn first number to compare + * @param secondNumberIn second number to compare + * + * @return NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH or EXACT_MATCH depending on the level of equality + * of the two numbers, described in the method definition. + */ + public MatchType isNumberMatch(PhoneNumber firstNumberIn, PhoneNumber secondNumberIn) { + // We only care about the fields that uniquely define a number, so we copy these across + // explicitly. + PhoneNumber firstNumber = copyCoreFieldsOnly(firstNumberIn); + PhoneNumber secondNumber = copyCoreFieldsOnly(secondNumberIn); + // Early exit if both had extensions and these are different. + if (firstNumber.hasExtension() && secondNumber.hasExtension() + && !firstNumber.getExtension().equals(secondNumber.getExtension())) { + return MatchType.NO_MATCH; + } + int firstNumberCountryCode = firstNumber.getCountryCode(); + int secondNumberCountryCode = secondNumber.getCountryCode(); + // Both had country_code specified. + if (firstNumberCountryCode != 0 && secondNumberCountryCode != 0) { + if (firstNumber.exactlySameAs(secondNumber)) { + return MatchType.EXACT_MATCH; + } else if (firstNumberCountryCode == secondNumberCountryCode + && isNationalNumberSuffixOfTheOther(firstNumber, secondNumber)) { + // A SHORT_NSN_MATCH occurs if there is a difference because of the presence or absence of + // an 'Italian leading zero', the presence or absence of an extension, or one NSN being a + // shorter variant of the other. + return MatchType.SHORT_NSN_MATCH; + } + // This is not a match. + return MatchType.NO_MATCH; + } + // Checks cases where one or both country_code fields were not specified. To make equality + // checks easier, we first set the country_code fields to be equal. + firstNumber.setCountryCode(secondNumberCountryCode); + // If all else was the same, then this is an NSN_MATCH. + if (firstNumber.exactlySameAs(secondNumber)) { + return MatchType.NSN_MATCH; + } + if (isNationalNumberSuffixOfTheOther(firstNumber, secondNumber)) { + return MatchType.SHORT_NSN_MATCH; + } + return MatchType.NO_MATCH; + } + + // Returns true when one national number is the suffix of the other or both are the same. + private boolean isNationalNumberSuffixOfTheOther(PhoneNumber firstNumber, + PhoneNumber secondNumber) { + String firstNumberNationalNumber = String.valueOf(firstNumber.getNationalNumber()); + String secondNumberNationalNumber = String.valueOf(secondNumber.getNationalNumber()); + // Note that endsWith returns true if the numbers are equal. + return firstNumberNationalNumber.endsWith(secondNumberNationalNumber) + || secondNumberNationalNumber.endsWith(firstNumberNationalNumber); + } + + /** + * Takes two phone numbers as strings and compares them for equality. This is a convenience + * wrapper for {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known. + * + * @param firstNumber first number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @param secondNumber second number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details. + */ + public MatchType isNumberMatch(CharSequence firstNumber, CharSequence secondNumber) { + try { + PhoneNumber firstNumberAsProto = parse(firstNumber, UNKNOWN_REGION); + return isNumberMatch(firstNumberAsProto, secondNumber); + } catch (NumberParseException e) { + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + try { + PhoneNumber secondNumberAsProto = parse(secondNumber, UNKNOWN_REGION); + return isNumberMatch(secondNumberAsProto, firstNumber); + } catch (NumberParseException e2) { + if (e2.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + try { + PhoneNumber firstNumberProto = new PhoneNumber(); + PhoneNumber secondNumberProto = new PhoneNumber(); + parseHelper(firstNumber, null, false, false, firstNumberProto); + parseHelper(secondNumber, null, false, false, secondNumberProto); + return isNumberMatch(firstNumberProto, secondNumberProto); + } catch (NumberParseException e3) { + // Fall through and return MatchType.NOT_A_NUMBER. + } + } + } + } + } + // One or more of the phone numbers we are trying to match is not a viable phone number. + return MatchType.NOT_A_NUMBER; + } + + /** + * Takes two phone numbers and compares them for equality. This is a convenience wrapper for + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known. + * + * @param firstNumber first number to compare in proto buffer format + * @param secondNumber second number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details. + */ + public MatchType isNumberMatch(PhoneNumber firstNumber, CharSequence secondNumber) { + // First see if the second number has an implicit country calling code, by attempting to parse + // it. + try { + PhoneNumber secondNumberAsProto = parse(secondNumber, UNKNOWN_REGION); + return isNumberMatch(firstNumber, secondNumberAsProto); + } catch (NumberParseException e) { + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + // The second number has no country calling code. EXACT_MATCH is no longer possible. + // We parse it as if the region was the same as that for the first number, and if + // EXACT_MATCH is returned, we replace this with NSN_MATCH. + String firstNumberRegion = getRegionCodeForCountryCode(firstNumber.getCountryCode()); + try { + if (!firstNumberRegion.equals(UNKNOWN_REGION)) { + PhoneNumber secondNumberWithFirstNumberRegion = parse(secondNumber, firstNumberRegion); + MatchType match = isNumberMatch(firstNumber, secondNumberWithFirstNumberRegion); + if (match == MatchType.EXACT_MATCH) { + return MatchType.NSN_MATCH; + } + return match; + } else { + // If the first number didn't have a valid country calling code, then we parse the + // second number without one as well. + PhoneNumber secondNumberProto = new PhoneNumber(); + parseHelper(secondNumber, null, false, false, secondNumberProto); + return isNumberMatch(firstNumber, secondNumberProto); + } + } catch (NumberParseException e2) { + // Fall-through to return NOT_A_NUMBER. + } + } + } + // One or more of the phone numbers we are trying to match is not a viable phone number. + return MatchType.NOT_A_NUMBER; + } + + /** + * Returns true if the number can be dialled from outside the region, or unknown. If the number + * can only be dialled from within the region, returns false. Does not check the number is a valid + * number. Note that, at the moment, this method does not handle short numbers (which are + * currently all presumed to not be diallable from outside their country). + * + * @param number the phone-number for which we want to know whether it is diallable from + * outside the region + */ + public boolean canBeInternationallyDialled(PhoneNumber number) { + PhoneMetadata metadata = getMetadataForRegion(getRegionCodeForNumber(number)); + if (metadata == null) { + // Note numbers belonging to non-geographical entities (e.g. +800 numbers) are always + // internationally diallable, and will be caught here. + return true; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return !isNumberMatchingDesc(nationalSignificantNumber, metadata.getNoInternationalDialling()); + } + + /** + * Returns true if the supplied region supports mobile number portability. Returns false for + * invalid, unknown or regions that don't support mobile number portability. + * + * @param regionCode the region for which we want to know whether it supports mobile number + * portability or not + */ + public boolean isMobileNumberPortableRegion(String regionCode) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return false; + } + return metadata.getMobileNumberPortableRegion(); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonemetadata.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonemetadata.java new file mode 100644 index 0000000000..914c796368 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonemetadata.java @@ -0,0 +1,1188 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Definition of the class representing metadata for international telephone numbers. This class is + * hand created based on the class file compiled from phonemetadata.proto. Please refer to that file + * for detailed descriptions of the meaning of each field. + * + *

WARNING: This API isn't stable. It is considered libphonenumber-internal and can change at any + * time. We only declare it as public for easy inclusion in our build tools not in this package. + * Clients should not refer to this file, we do not commit to support backwards-compatibility or to + * warn about breaking changes. + */ + +package com.google.i18n.phonenumbers; + +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; + +public final class Phonemetadata { + private Phonemetadata() {} + public static class NumberFormat implements Externalizable { + private static final long serialVersionUID = 1; + public NumberFormat() {} + + /** + * Provides a dummy builder to 'emulate' the API of the code generated by the latest version of + * Protocol Buffers. This lets BuildMetadataFromXml class to build with both this hand created + * class and the one generated by the latest version of Protocol Buffers. + */ + public static final class Builder extends NumberFormat { + public NumberFormat build() { + return this; + } + + public Builder mergeFrom(NumberFormat other) { + if (other.hasPattern()) { + setPattern(other.getPattern()); + } + if (other.hasFormat()) { + setFormat(other.getFormat()); + } + for (int i = 0; i < other.leadingDigitsPatternSize(); i++) { + addLeadingDigitsPattern(other.getLeadingDigitsPattern(i)); + } + if (other.hasNationalPrefixFormattingRule()) { + setNationalPrefixFormattingRule(other.getNationalPrefixFormattingRule()); + } + if (other.hasDomesticCarrierCodeFormattingRule()) { + setDomesticCarrierCodeFormattingRule(other.getDomesticCarrierCodeFormattingRule()); + } + if (other.hasNationalPrefixOptionalWhenFormatting()) { + setNationalPrefixOptionalWhenFormatting(other.getNationalPrefixOptionalWhenFormatting()); + } + return this; + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + // required string pattern = 1; + private boolean hasPattern; + private String pattern_ = ""; + public boolean hasPattern() { return hasPattern; } + public String getPattern() { return pattern_; } + public NumberFormat setPattern(String value) { + hasPattern = true; + pattern_ = value; + return this; + } + + // required string format = 2; + private boolean hasFormat; + private String format_ = ""; + public boolean hasFormat() { return hasFormat; } + public String getFormat() { return format_; } + public NumberFormat setFormat(String value) { + hasFormat = true; + format_ = value; + return this; + } + + // repeated string leading_digits_pattern = 3; + private java.util.List leadingDigitsPattern_ = new java.util.ArrayList(); + public java.util.List leadingDigitPatterns() { + return leadingDigitsPattern_; + } + @Deprecated + public int leadingDigitsPatternSize() { return getLeadingDigitsPatternCount(); } + public int getLeadingDigitsPatternCount() { return leadingDigitsPattern_.size(); } + public String getLeadingDigitsPattern(int index) { + return leadingDigitsPattern_.get(index); + } + public NumberFormat addLeadingDigitsPattern(String value) { + if (value == null) { + throw new NullPointerException(); + } + leadingDigitsPattern_.add(value); + return this; + } + + // optional string national_prefix_formatting_rule = 4; + private boolean hasNationalPrefixFormattingRule; + private String nationalPrefixFormattingRule_ = ""; + public boolean hasNationalPrefixFormattingRule() { return hasNationalPrefixFormattingRule; } + public String getNationalPrefixFormattingRule() { return nationalPrefixFormattingRule_; } + public NumberFormat setNationalPrefixFormattingRule(String value) { + hasNationalPrefixFormattingRule = true; + nationalPrefixFormattingRule_ = value; + return this; + } + public NumberFormat clearNationalPrefixFormattingRule() { + hasNationalPrefixFormattingRule = false; + nationalPrefixFormattingRule_ = ""; + return this; + } + + // optional bool national_prefix_optional_when_formatting = 6 [default = false]; + private boolean hasNationalPrefixOptionalWhenFormatting; + private boolean nationalPrefixOptionalWhenFormatting_ = false; + public boolean hasNationalPrefixOptionalWhenFormatting() { + return hasNationalPrefixOptionalWhenFormatting; } + public boolean getNationalPrefixOptionalWhenFormatting() { + return nationalPrefixOptionalWhenFormatting_; } + public NumberFormat setNationalPrefixOptionalWhenFormatting(boolean value) { + hasNationalPrefixOptionalWhenFormatting = true; + nationalPrefixOptionalWhenFormatting_ = value; + return this; + } + + // optional string domestic_carrier_code_formatting_rule = 5; + private boolean hasDomesticCarrierCodeFormattingRule; + private String domesticCarrierCodeFormattingRule_ = ""; + public boolean hasDomesticCarrierCodeFormattingRule() { + return hasDomesticCarrierCodeFormattingRule; } + public String getDomesticCarrierCodeFormattingRule() { + return domesticCarrierCodeFormattingRule_; } + public NumberFormat setDomesticCarrierCodeFormattingRule(String value) { + hasDomesticCarrierCodeFormattingRule = true; + domesticCarrierCodeFormattingRule_ = value; + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeUTF(pattern_); + objectOutput.writeUTF(format_); + int leadingDigitsPatternSize = leadingDigitsPatternSize(); + objectOutput.writeInt(leadingDigitsPatternSize); + for (int i = 0; i < leadingDigitsPatternSize; i++) { + objectOutput.writeUTF(leadingDigitsPattern_.get(i)); + } + + objectOutput.writeBoolean(hasNationalPrefixFormattingRule); + if (hasNationalPrefixFormattingRule) { + objectOutput.writeUTF(nationalPrefixFormattingRule_); + } + objectOutput.writeBoolean(hasDomesticCarrierCodeFormattingRule); + if (hasDomesticCarrierCodeFormattingRule) { + objectOutput.writeUTF(domesticCarrierCodeFormattingRule_); + } + objectOutput.writeBoolean(nationalPrefixOptionalWhenFormatting_); + } + + public void readExternal(ObjectInput objectInput) throws IOException { + setPattern(objectInput.readUTF()); + setFormat(objectInput.readUTF()); + int leadingDigitsPatternSize = objectInput.readInt(); + for (int i = 0; i < leadingDigitsPatternSize; i++) { + leadingDigitsPattern_.add(objectInput.readUTF()); + } + if (objectInput.readBoolean()) { + setNationalPrefixFormattingRule(objectInput.readUTF()); + } + if (objectInput.readBoolean()) { + setDomesticCarrierCodeFormattingRule(objectInput.readUTF()); + } + setNationalPrefixOptionalWhenFormatting(objectInput.readBoolean()); + } + } + + public static class PhoneNumberDesc implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneNumberDesc() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneNumberDesc { + public PhoneNumberDesc build() { + return this; + } + + public Builder mergeFrom(PhoneNumberDesc other) { + if (other.hasNationalNumberPattern()) { + setNationalNumberPattern(other.getNationalNumberPattern()); + } + for (int i = 0; i < other.getPossibleLengthCount(); i++) { + addPossibleLength(other.getPossibleLength(i)); + } + for (int i = 0; i < other.getPossibleLengthLocalOnlyCount(); i++) { + addPossibleLengthLocalOnly(other.getPossibleLengthLocalOnly(i)); + } + if (other.hasExampleNumber()) { + setExampleNumber(other.getExampleNumber()); + } + return this; + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + // optional string national_number_pattern = 2; + private boolean hasNationalNumberPattern; + private String nationalNumberPattern_ = ""; + public boolean hasNationalNumberPattern() { return hasNationalNumberPattern; } + public String getNationalNumberPattern() { return nationalNumberPattern_; } + public PhoneNumberDesc setNationalNumberPattern(String value) { + hasNationalNumberPattern = true; + nationalNumberPattern_ = value; + return this; + } + public PhoneNumberDesc clearNationalNumberPattern() { + hasNationalNumberPattern = false; + nationalNumberPattern_ = ""; + return this; + } + + // repeated int32 possible_length = 9; + private java.util.List possibleLength_ = new java.util.ArrayList(); + public java.util.List getPossibleLengthList() { + return possibleLength_; + } + public int getPossibleLengthCount() { return possibleLength_.size(); } + public int getPossibleLength(int index) { + return possibleLength_.get(index); + } + public PhoneNumberDesc addPossibleLength(int value) { + possibleLength_.add(value); + return this; + } + public PhoneNumberDesc clearPossibleLength() { + possibleLength_.clear(); + return this; + } + + // repeated int32 possible_length_local_only = 10; + private java.util.List possibleLengthLocalOnly_ = new java.util.ArrayList(); + public java.util.List getPossibleLengthLocalOnlyList() { + return possibleLengthLocalOnly_; + } + public int getPossibleLengthLocalOnlyCount() { return possibleLengthLocalOnly_.size(); } + public int getPossibleLengthLocalOnly(int index) { + return possibleLengthLocalOnly_.get(index); + } + public PhoneNumberDesc addPossibleLengthLocalOnly(int value) { + possibleLengthLocalOnly_.add(value); + return this; + } + public PhoneNumberDesc clearPossibleLengthLocalOnly() { + possibleLengthLocalOnly_.clear(); + return this; + } + + // optional string example_number = 6; + private boolean hasExampleNumber; + private String exampleNumber_ = ""; + public boolean hasExampleNumber() { return hasExampleNumber; } + public String getExampleNumber() { return exampleNumber_; } + public PhoneNumberDesc setExampleNumber(String value) { + hasExampleNumber = true; + exampleNumber_ = value; + return this; + } + public PhoneNumberDesc clearExampleNumber() { + hasExampleNumber = false; + exampleNumber_ = ""; + return this; + } + + public boolean exactlySameAs(PhoneNumberDesc other) { + return nationalNumberPattern_.equals(other.nationalNumberPattern_) && + possibleLength_.equals(other.possibleLength_) && + possibleLengthLocalOnly_.equals(other.possibleLengthLocalOnly_) && + exampleNumber_.equals(other.exampleNumber_); + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeBoolean(hasNationalNumberPattern); + if (hasNationalNumberPattern) { + objectOutput.writeUTF(nationalNumberPattern_); + } + + int possibleLengthSize = getPossibleLengthCount(); + objectOutput.writeInt(possibleLengthSize); + for (int i = 0; i < possibleLengthSize; i++) { + objectOutput.writeInt(possibleLength_.get(i)); + } + + int possibleLengthLocalOnlySize = getPossibleLengthLocalOnlyCount(); + objectOutput.writeInt(possibleLengthLocalOnlySize); + for (int i = 0; i < possibleLengthLocalOnlySize; i++) { + objectOutput.writeInt(possibleLengthLocalOnly_.get(i)); + } + + objectOutput.writeBoolean(hasExampleNumber); + if (hasExampleNumber) { + objectOutput.writeUTF(exampleNumber_); + } + } + + public void readExternal(ObjectInput objectInput) throws IOException { + if (objectInput.readBoolean()) { + setNationalNumberPattern(objectInput.readUTF()); + } + + int possibleLengthSize = objectInput.readInt(); + for (int i = 0; i < possibleLengthSize; i++) { + possibleLength_.add(objectInput.readInt()); + } + + int possibleLengthLocalOnlySize = objectInput.readInt(); + for (int i = 0; i < possibleLengthLocalOnlySize; i++) { + possibleLengthLocalOnly_.add(objectInput.readInt()); + } + + if (objectInput.readBoolean()) { + setExampleNumber(objectInput.readUTF()); + } + } + } + + public static class PhoneMetadata implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneMetadata() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneMetadata { + public PhoneMetadata build() { + return this; + } + + public Builder setId(String value) { + super.setId(value); + return this; + } + + public Builder setInternationalPrefix(String value) { + super.setInternationalPrefix(value); + return this; + } + } + public static Builder newBuilder() { + return new Builder(); + } + + // optional PhoneNumberDesc general_desc = 1; + private boolean hasGeneralDesc; + private PhoneNumberDesc generalDesc_ = null; + public boolean hasGeneralDesc() { return hasGeneralDesc; } + public PhoneNumberDesc getGeneralDesc() { return generalDesc_; } + public PhoneNumberDesc getGeneralDescBuilder() { + if (generalDesc_ == null) { + generalDesc_ = new PhoneNumberDesc(); + } + return generalDesc_ ; + } + public PhoneMetadata setGeneralDesc(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasGeneralDesc = true; + generalDesc_ = value; + return this; + } + + // optional PhoneNumberDesc fixed_line = 2; + private boolean hasFixedLine; + private PhoneNumberDesc fixedLine_ = null; + public boolean hasFixedLine() { return hasFixedLine; } + public PhoneNumberDesc getFixedLine() { return fixedLine_; } + public PhoneMetadata setFixedLine(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasFixedLine = true; + fixedLine_ = value; + return this; + } + + // optional PhoneNumberDesc mobile = 3; + private boolean hasMobile; + private PhoneNumberDesc mobile_ = null; + public boolean hasMobile() { return hasMobile; } + public PhoneNumberDesc getMobile() { return mobile_; } + public PhoneMetadata setMobile(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasMobile = true; + mobile_ = value; + return this; + } + + // optional PhoneNumberDesc toll_free = 4; + private boolean hasTollFree; + private PhoneNumberDesc tollFree_ = null; + public boolean hasTollFree() { return hasTollFree; } + public PhoneNumberDesc getTollFree() { return tollFree_; } + public PhoneMetadata setTollFree(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasTollFree = true; + tollFree_ = value; + return this; + } + + // optional PhoneNumberDesc premium_rate = 5; + private boolean hasPremiumRate; + private PhoneNumberDesc premiumRate_ = null; + public boolean hasPremiumRate() { return hasPremiumRate; } + public PhoneNumberDesc getPremiumRate() { return premiumRate_; } + public PhoneMetadata setPremiumRate(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPremiumRate = true; + premiumRate_ = value; + return this; + } + + // optional PhoneNumberDesc shared_cost = 6; + private boolean hasSharedCost; + private PhoneNumberDesc sharedCost_ = null; + public boolean hasSharedCost() { return hasSharedCost; } + public PhoneNumberDesc getSharedCost() { return sharedCost_; } + public PhoneMetadata setSharedCost(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasSharedCost = true; + sharedCost_ = value; + return this; + } + + // optional PhoneNumberDesc personal_number = 7; + private boolean hasPersonalNumber; + private PhoneNumberDesc personalNumber_ = null; + public boolean hasPersonalNumber() { return hasPersonalNumber; } + public PhoneNumberDesc getPersonalNumber() { return personalNumber_; } + public PhoneMetadata setPersonalNumber(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPersonalNumber = true; + personalNumber_ = value; + return this; + } + + // optional PhoneNumberDesc voip = 8; + private boolean hasVoip; + private PhoneNumberDesc voip_ = null; + public boolean hasVoip() { return hasVoip; } + public PhoneNumberDesc getVoip() { return voip_; } + public PhoneMetadata setVoip(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasVoip = true; + voip_ = value; + return this; + } + + // optional PhoneNumberDesc pager = 21; + private boolean hasPager; + private PhoneNumberDesc pager_ = null; + public boolean hasPager() { return hasPager; } + public PhoneNumberDesc getPager() { return pager_; } + public PhoneMetadata setPager(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPager = true; + pager_ = value; + return this; + } + + // optional PhoneNumberDesc uan = 25; + private boolean hasUan; + private PhoneNumberDesc uan_ = null; + public boolean hasUan() { return hasUan; } + public PhoneNumberDesc getUan() { return uan_; } + public PhoneMetadata setUan(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasUan = true; + uan_ = value; + return this; + } + + // optional PhoneNumberDesc emergency = 27; + private boolean hasEmergency; + private PhoneNumberDesc emergency_ = null; + public boolean hasEmergency() { return hasEmergency; } + public PhoneNumberDesc getEmergency() { return emergency_; } + public PhoneMetadata setEmergency(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasEmergency = true; + emergency_ = value; + return this; + } + + // optional PhoneNumberDesc voicemail = 28; + private boolean hasVoicemail; + private PhoneNumberDesc voicemail_ = null; + public boolean hasVoicemail() { return hasVoicemail; } + public PhoneNumberDesc getVoicemail() { return voicemail_; } + public PhoneMetadata setVoicemail(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasVoicemail = true; + voicemail_ = value; + return this; + } + + // optional PhoneNumberDesc short_code = 29; + private boolean hasShortCode; + private PhoneNumberDesc shortCode_ = null; + public boolean hasShortCode() { return hasShortCode; } + public PhoneNumberDesc getShortCode() { return shortCode_; } + public PhoneMetadata setShortCode(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasShortCode = true; + shortCode_ = value; + return this; + } + + // optional PhoneNumberDesc standard_rate = 30; + private boolean hasStandardRate; + private PhoneNumberDesc standardRate_ = null; + public boolean hasStandardRate() { return hasStandardRate; } + public PhoneNumberDesc getStandardRate() { return standardRate_; } + public PhoneMetadata setStandardRate(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasStandardRate = true; + standardRate_ = value; + return this; + } + + // optional PhoneNumberDesc carrier_specific = 31; + private boolean hasCarrierSpecific; + private PhoneNumberDesc carrierSpecific_ = null; + public boolean hasCarrierSpecific() { return hasCarrierSpecific; } + public PhoneNumberDesc getCarrierSpecific() { return carrierSpecific_; } + public PhoneMetadata setCarrierSpecific(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasCarrierSpecific = true; + carrierSpecific_ = value; + return this; + } + + // optional PhoneNumberDesc sms_services = 33; + private boolean hasSmsServices; + private PhoneNumberDesc smsServices_ = null; + public boolean hasSmsServices() { return hasSmsServices; } + public PhoneNumberDesc getSmsServices() { return smsServices_; } + public PhoneMetadata setSmsServices(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasSmsServices = true; + smsServices_ = value; + return this; + } + + // optional PhoneNumberDesc noInternationalDialling = 24; + private boolean hasNoInternationalDialling; + private PhoneNumberDesc noInternationalDialling_ = null; + public boolean hasNoInternationalDialling() { return hasNoInternationalDialling; } + public PhoneNumberDesc getNoInternationalDialling() { return noInternationalDialling_; } + public PhoneMetadata setNoInternationalDialling(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasNoInternationalDialling = true; + noInternationalDialling_ = value; + return this; + } + + // required string id = 9; + private boolean hasId; + private String id_ = ""; + public boolean hasId() { return hasId; } + public String getId() { return id_; } + public PhoneMetadata setId(String value) { + hasId = true; + id_ = value; + return this; + } + + // optional int32 country_code = 10; + private boolean hasCountryCode; + private int countryCode_ = 0; + public boolean hasCountryCode() { return hasCountryCode; } + public int getCountryCode() { return countryCode_; } + public PhoneMetadata setCountryCode(int value) { + hasCountryCode = true; + countryCode_ = value; + return this; + } + + // optional string international_prefix = 11; + private boolean hasInternationalPrefix; + private String internationalPrefix_ = ""; + public boolean hasInternationalPrefix() { return hasInternationalPrefix; } + public String getInternationalPrefix() { return internationalPrefix_; } + public PhoneMetadata setInternationalPrefix(String value) { + hasInternationalPrefix = true; + internationalPrefix_ = value; + return this; + } + + // optional string preferred_international_prefix = 17; + private boolean hasPreferredInternationalPrefix; + private String preferredInternationalPrefix_ = ""; + public boolean hasPreferredInternationalPrefix() { return hasPreferredInternationalPrefix; } + public String getPreferredInternationalPrefix() { return preferredInternationalPrefix_; } + public PhoneMetadata setPreferredInternationalPrefix(String value) { + hasPreferredInternationalPrefix = true; + preferredInternationalPrefix_ = value; + return this; + } + public PhoneMetadata clearPreferredInternationalPrefix() { + hasPreferredInternationalPrefix = false; + preferredInternationalPrefix_ = ""; + return this; + } + + // optional string national_prefix = 12; + private boolean hasNationalPrefix; + private String nationalPrefix_ = ""; + public boolean hasNationalPrefix() { return hasNationalPrefix; } + public String getNationalPrefix() { return nationalPrefix_; } + public PhoneMetadata setNationalPrefix(String value) { + hasNationalPrefix = true; + nationalPrefix_ = value; + return this; + } + public PhoneMetadata clearNationalPrefix() { + hasNationalPrefix = false; + nationalPrefix_ = ""; + return this; + } + + // optional string preferred_extn_prefix = 13; + private boolean hasPreferredExtnPrefix; + private String preferredExtnPrefix_ = ""; + public boolean hasPreferredExtnPrefix() { return hasPreferredExtnPrefix; } + public String getPreferredExtnPrefix() { return preferredExtnPrefix_; } + public PhoneMetadata setPreferredExtnPrefix(String value) { + hasPreferredExtnPrefix = true; + preferredExtnPrefix_ = value; + return this; + } + public PhoneMetadata clearPreferredExtnPrefix() { + hasPreferredExtnPrefix = false; + preferredExtnPrefix_ = ""; + return this; + } + + // optional string national_prefix_for_parsing = 15; + private boolean hasNationalPrefixForParsing; + private String nationalPrefixForParsing_ = ""; + public boolean hasNationalPrefixForParsing() { return hasNationalPrefixForParsing; } + public String getNationalPrefixForParsing() { return nationalPrefixForParsing_; } + public PhoneMetadata setNationalPrefixForParsing(String value) { + hasNationalPrefixForParsing = true; + nationalPrefixForParsing_ = value; + return this; + } + + // optional string national_prefix_transform_rule = 16; + private boolean hasNationalPrefixTransformRule; + private String nationalPrefixTransformRule_ = ""; + public boolean hasNationalPrefixTransformRule() { return hasNationalPrefixTransformRule; } + public String getNationalPrefixTransformRule() { return nationalPrefixTransformRule_; } + public PhoneMetadata setNationalPrefixTransformRule(String value) { + hasNationalPrefixTransformRule = true; + nationalPrefixTransformRule_ = value; + return this; + } + public PhoneMetadata clearNationalPrefixTransformRule() { + hasNationalPrefixTransformRule = false; + nationalPrefixTransformRule_ = ""; + return this; + } + + // optional bool same_mobile_and_fixed_line_pattern = 18 [default = false]; + private boolean hasSameMobileAndFixedLinePattern; + private boolean sameMobileAndFixedLinePattern_ = false; + public boolean hasSameMobileAndFixedLinePattern() { return hasSameMobileAndFixedLinePattern; } + public boolean getSameMobileAndFixedLinePattern() { return sameMobileAndFixedLinePattern_; } + public PhoneMetadata setSameMobileAndFixedLinePattern(boolean value) { + hasSameMobileAndFixedLinePattern = true; + sameMobileAndFixedLinePattern_ = value; + return this; + } + public PhoneMetadata clearSameMobileAndFixedLinePattern() { + hasSameMobileAndFixedLinePattern = false; + sameMobileAndFixedLinePattern_ = false; + return this; + } + + // repeated NumberFormat number_format = 19; + private java.util.List numberFormat_ = new java.util.ArrayList(); + @Deprecated + public java.util.List numberFormats() { + return getNumberFormatList(); + } + public java.util.List getNumberFormatList() { + return numberFormat_; + } + @Deprecated + public int numberFormatSize() { return getNumberFormatCount(); } + public int getNumberFormatCount() { return numberFormat_.size(); } + public NumberFormat getNumberFormat(int index) { + return numberFormat_.get(index); + } + public PhoneMetadata addNumberFormat(NumberFormat value) { + if (value == null) { + throw new NullPointerException(); + } + numberFormat_.add(value); + return this; + } + + // repeated NumberFormat intl_number_format = 20; + private java.util.List intlNumberFormat_ = + new java.util.ArrayList(); + @Deprecated + public java.util.List intlNumberFormats() { + return getIntlNumberFormatList(); + } + public java.util.List getIntlNumberFormatList() { + return intlNumberFormat_; + } + @Deprecated + public int intlNumberFormatSize() { return getIntlNumberFormatCount(); } + public int getIntlNumberFormatCount() { return intlNumberFormat_.size(); } + public NumberFormat getIntlNumberFormat(int index) { + return intlNumberFormat_.get(index); + } + + public PhoneMetadata addIntlNumberFormat(NumberFormat value) { + if (value == null) { + throw new NullPointerException(); + } + intlNumberFormat_.add(value); + return this; + } + public PhoneMetadata clearIntlNumberFormat() { + intlNumberFormat_.clear(); + return this; + } + + // optional bool main_country_for_code = 22 [default = false]; + private boolean hasMainCountryForCode; + private boolean mainCountryForCode_ = false; + public boolean hasMainCountryForCode() { return hasMainCountryForCode; } + public boolean isMainCountryForCode() { return mainCountryForCode_; } + // Method that lets this class have the same interface as the one generated by Protocol Buffers + // which is used by C++ build tools. + public boolean getMainCountryForCode() { return mainCountryForCode_; } + public PhoneMetadata setMainCountryForCode(boolean value) { + hasMainCountryForCode = true; + mainCountryForCode_ = value; + return this; + } + public PhoneMetadata clearMainCountryForCode() { + hasMainCountryForCode = false; + mainCountryForCode_ = false; + return this; + } + + // optional string leading_digits = 23; + private boolean hasLeadingDigits; + private String leadingDigits_ = ""; + public boolean hasLeadingDigits() { return hasLeadingDigits; } + public String getLeadingDigits() { return leadingDigits_; } + public PhoneMetadata setLeadingDigits(String value) { + hasLeadingDigits = true; + leadingDigits_ = value; + return this; + } + + // optional bool mobile_number_portable_region = 32 [default = false]; + private boolean hasMobileNumberPortableRegion; + private boolean mobileNumberPortableRegion_ = false; + public boolean hasMobileNumberPortableRegion() { return hasMobileNumberPortableRegion; } + @Deprecated + public boolean isMobileNumberPortableRegion() { return getMobileNumberPortableRegion(); } + public boolean getMobileNumberPortableRegion() { return mobileNumberPortableRegion_; } + public PhoneMetadata setMobileNumberPortableRegion(boolean value) { + hasMobileNumberPortableRegion = true; + mobileNumberPortableRegion_ = value; + return this; + } + public PhoneMetadata clearMobileNumberPortableRegion() { + hasMobileNumberPortableRegion = false; + mobileNumberPortableRegion_ = false; + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeBoolean(hasGeneralDesc); + if (hasGeneralDesc) { + generalDesc_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasFixedLine); + if (hasFixedLine) { + fixedLine_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasMobile); + if (hasMobile) { + mobile_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasTollFree); + if (hasTollFree) { + tollFree_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPremiumRate); + if (hasPremiumRate) { + premiumRate_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasSharedCost); + if (hasSharedCost) { + sharedCost_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPersonalNumber); + if (hasPersonalNumber) { + personalNumber_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasVoip); + if (hasVoip) { + voip_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPager); + if (hasPager) { + pager_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasUan); + if (hasUan) { + uan_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasEmergency); + if (hasEmergency) { + emergency_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasVoicemail); + if (hasVoicemail) { + voicemail_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasShortCode); + if (hasShortCode) { + shortCode_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasStandardRate); + if (hasStandardRate) { + standardRate_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasCarrierSpecific); + if (hasCarrierSpecific) { + carrierSpecific_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasSmsServices); + if (hasSmsServices) { + smsServices_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasNoInternationalDialling); + if (hasNoInternationalDialling) { + noInternationalDialling_.writeExternal(objectOutput); + } + + objectOutput.writeUTF(id_); + objectOutput.writeInt(countryCode_); + objectOutput.writeUTF(internationalPrefix_); + + objectOutput.writeBoolean(hasPreferredInternationalPrefix); + if (hasPreferredInternationalPrefix) { + objectOutput.writeUTF(preferredInternationalPrefix_); + } + + objectOutput.writeBoolean(hasNationalPrefix); + if (hasNationalPrefix) { + objectOutput.writeUTF(nationalPrefix_); + } + + objectOutput.writeBoolean(hasPreferredExtnPrefix); + if (hasPreferredExtnPrefix) { + objectOutput.writeUTF(preferredExtnPrefix_); + } + + objectOutput.writeBoolean(hasNationalPrefixForParsing); + if (hasNationalPrefixForParsing) { + objectOutput.writeUTF(nationalPrefixForParsing_); + } + + objectOutput.writeBoolean(hasNationalPrefixTransformRule); + if (hasNationalPrefixTransformRule) { + objectOutput.writeUTF(nationalPrefixTransformRule_); + } + + objectOutput.writeBoolean(sameMobileAndFixedLinePattern_); + + int numberFormatSize = numberFormatSize(); + objectOutput.writeInt(numberFormatSize); + for (int i = 0; i < numberFormatSize; i++) { + numberFormat_.get(i).writeExternal(objectOutput); + } + + int intlNumberFormatSize = intlNumberFormatSize(); + objectOutput.writeInt(intlNumberFormatSize); + for (int i = 0; i < intlNumberFormatSize; i++) { + intlNumberFormat_.get(i).writeExternal(objectOutput); + } + + objectOutput.writeBoolean(mainCountryForCode_); + + objectOutput.writeBoolean(hasLeadingDigits); + if (hasLeadingDigits) { + objectOutput.writeUTF(leadingDigits_); + } + + objectOutput.writeBoolean(mobileNumberPortableRegion_); + } + + public void readExternal(ObjectInput objectInput) throws IOException { + boolean hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setGeneralDesc(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setFixedLine(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setMobile(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setTollFree(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPremiumRate(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setSharedCost(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPersonalNumber(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setVoip(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPager(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setUan(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setEmergency(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setVoicemail(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setShortCode(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setStandardRate(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setCarrierSpecific(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setSmsServices(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setNoInternationalDialling(desc); + } + + setId(objectInput.readUTF()); + setCountryCode(objectInput.readInt()); + setInternationalPrefix(objectInput.readUTF()); + + boolean hasString = objectInput.readBoolean(); + if (hasString) { + setPreferredInternationalPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setPreferredExtnPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefixForParsing(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefixTransformRule(objectInput.readUTF()); + } + + setSameMobileAndFixedLinePattern(objectInput.readBoolean()); + + int nationalFormatSize = objectInput.readInt(); + for (int i = 0; i < nationalFormatSize; i++) { + NumberFormat numFormat = new NumberFormat(); + numFormat.readExternal(objectInput); + numberFormat_.add(numFormat); + } + + int intlNumberFormatSize = objectInput.readInt(); + for (int i = 0; i < intlNumberFormatSize; i++) { + NumberFormat numFormat = new NumberFormat(); + numFormat.readExternal(objectInput); + intlNumberFormat_.add(numFormat); + } + + setMainCountryForCode(objectInput.readBoolean()); + + hasString = objectInput.readBoolean(); + if (hasString) { + setLeadingDigits(objectInput.readUTF()); + } + + setMobileNumberPortableRegion(objectInput.readBoolean()); + } + } + + public static class PhoneMetadataCollection implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneMetadataCollection() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneMetadataCollection { + public PhoneMetadataCollection build() { + return this; + } + } + public static Builder newBuilder() { + return new Builder(); + } + + // repeated PhoneMetadata metadata = 1; + private java.util.List metadata_ = new java.util.ArrayList(); + + public java.util.List getMetadataList() { + return metadata_; + } + public int getMetadataCount() { return metadata_.size(); } + + public PhoneMetadataCollection addMetadata(PhoneMetadata value) { + if (value == null) { + throw new NullPointerException(); + } + metadata_.add(value); + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + int size = getMetadataCount(); + objectOutput.writeInt(size); + for (int i = 0; i < size; i++) { + metadata_.get(i).writeExternal(objectOutput); + } + } + + public void readExternal(ObjectInput objectInput) throws IOException { + int size = objectInput.readInt(); + for (int i = 0; i < size; i++) { + PhoneMetadata metadata = new PhoneMetadata(); + metadata.readExternal(objectInput); + metadata_.add(metadata); + } + } + + public PhoneMetadataCollection clear() { + metadata_.clear(); + return this; + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonenumber.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonenumber.java new file mode 100644 index 0000000000..fe88a465c6 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/Phonenumber.java @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Definition of the class representing international telephone numbers. This class is hand-created + * based on the class file compiled from phonenumber.proto. Please refer to that file for detailed + * descriptions of the meaning of each field. + */ + +package com.google.i18n.phonenumbers; + +import java.io.Serializable; + +public final class Phonenumber { + private Phonenumber() {} + public static class PhoneNumber implements Serializable { + private static final long serialVersionUID = 1L; + public enum CountryCodeSource { + FROM_NUMBER_WITH_PLUS_SIGN, + FROM_NUMBER_WITH_IDD, + FROM_NUMBER_WITHOUT_PLUS_SIGN, + FROM_DEFAULT_COUNTRY, + UNSPECIFIED + } + + public PhoneNumber() { + countryCodeSource_ = CountryCodeSource.UNSPECIFIED; + } + + // required int32 country_code = 1; + private boolean hasCountryCode; + private int countryCode_ = 0; + public boolean hasCountryCode() { return hasCountryCode; } + public int getCountryCode() { return countryCode_; } + public PhoneNumber setCountryCode(int value) { + hasCountryCode = true; + countryCode_ = value; + return this; + } + public PhoneNumber clearCountryCode() { + hasCountryCode = false; + countryCode_ = 0; + return this; + } + + // required uint64 national_number = 2; + private boolean hasNationalNumber; + private long nationalNumber_ = 0L; + public boolean hasNationalNumber() { return hasNationalNumber; } + public long getNationalNumber() { return nationalNumber_; } + public PhoneNumber setNationalNumber(long value) { + hasNationalNumber = true; + nationalNumber_ = value; + return this; + } + public PhoneNumber clearNationalNumber() { + hasNationalNumber = false; + nationalNumber_ = 0L; + return this; + } + + // optional string extension = 3; + private boolean hasExtension; + private java.lang.String extension_ = ""; + public boolean hasExtension() { return hasExtension; } + public String getExtension() { return extension_; } + public PhoneNumber setExtension(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasExtension = true; + extension_ = value; + return this; + } + public PhoneNumber clearExtension() { + hasExtension = false; + extension_ = ""; + return this; + } + + // optional bool italian_leading_zero = 4; + private boolean hasItalianLeadingZero; + private boolean italianLeadingZero_ = false; + public boolean hasItalianLeadingZero() { return hasItalianLeadingZero; } + public boolean isItalianLeadingZero() { return italianLeadingZero_; } + public PhoneNumber setItalianLeadingZero(boolean value) { + hasItalianLeadingZero = true; + italianLeadingZero_ = value; + return this; + } + public PhoneNumber clearItalianLeadingZero() { + hasItalianLeadingZero = false; + italianLeadingZero_ = false; + return this; + } + + // optional int32 number_of_leading_zeros = 8 [default = 1]; + private boolean hasNumberOfLeadingZeros; + private int numberOfLeadingZeros_ = 1; + public boolean hasNumberOfLeadingZeros() { return hasNumberOfLeadingZeros; } + public int getNumberOfLeadingZeros() { return numberOfLeadingZeros_; } + public PhoneNumber setNumberOfLeadingZeros(int value) { + hasNumberOfLeadingZeros = true; + numberOfLeadingZeros_ = value; + return this; + } + public PhoneNumber clearNumberOfLeadingZeros() { + hasNumberOfLeadingZeros = false; + numberOfLeadingZeros_ = 1; + return this; + } + + // optional string raw_input = 5; + private boolean hasRawInput; + private String rawInput_ = ""; + public boolean hasRawInput() { return hasRawInput; } + public String getRawInput() { return rawInput_; } + public PhoneNumber setRawInput(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasRawInput = true; + rawInput_ = value; + return this; + } + public PhoneNumber clearRawInput() { + hasRawInput = false; + rawInput_ = ""; + return this; + } + + // optional CountryCodeSource country_code_source = 6; + private boolean hasCountryCodeSource; + private CountryCodeSource countryCodeSource_; + public boolean hasCountryCodeSource() { return hasCountryCodeSource; } + public CountryCodeSource getCountryCodeSource() { return countryCodeSource_; } + public PhoneNumber setCountryCodeSource(CountryCodeSource value) { + if (value == null) { + throw new NullPointerException(); + } + hasCountryCodeSource = true; + countryCodeSource_ = value; + return this; + } + public PhoneNumber clearCountryCodeSource() { + hasCountryCodeSource = false; + countryCodeSource_ = CountryCodeSource.UNSPECIFIED; + return this; + } + + // optional string preferred_domestic_carrier_code = 7; + private boolean hasPreferredDomesticCarrierCode; + private java.lang.String preferredDomesticCarrierCode_ = ""; + public boolean hasPreferredDomesticCarrierCode() { return hasPreferredDomesticCarrierCode; } + public String getPreferredDomesticCarrierCode() { return preferredDomesticCarrierCode_; } + public PhoneNumber setPreferredDomesticCarrierCode(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasPreferredDomesticCarrierCode = true; + preferredDomesticCarrierCode_ = value; + return this; + } + public PhoneNumber clearPreferredDomesticCarrierCode() { + hasPreferredDomesticCarrierCode = false; + preferredDomesticCarrierCode_ = ""; + return this; + } + + public final PhoneNumber clear() { + clearCountryCode(); + clearNationalNumber(); + clearExtension(); + clearItalianLeadingZero(); + clearNumberOfLeadingZeros(); + clearRawInput(); + clearCountryCodeSource(); + clearPreferredDomesticCarrierCode(); + return this; + } + + public PhoneNumber mergeFrom(PhoneNumber other) { + if (other.hasCountryCode()) { + setCountryCode(other.getCountryCode()); + } + if (other.hasNationalNumber()) { + setNationalNumber(other.getNationalNumber()); + } + if (other.hasExtension()) { + setExtension(other.getExtension()); + } + if (other.hasItalianLeadingZero()) { + setItalianLeadingZero(other.isItalianLeadingZero()); + } + if (other.hasNumberOfLeadingZeros()) { + setNumberOfLeadingZeros(other.getNumberOfLeadingZeros()); + } + if (other.hasRawInput()) { + setRawInput(other.getRawInput()); + } + if (other.hasCountryCodeSource()) { + setCountryCodeSource(other.getCountryCodeSource()); + } + if (other.hasPreferredDomesticCarrierCode()) { + setPreferredDomesticCarrierCode(other.getPreferredDomesticCarrierCode()); + } + return this; + } + + public boolean exactlySameAs(PhoneNumber other) { + if (other == null) { + return false; + } + if (this == other) { + return true; + } + return (countryCode_ == other.countryCode_ && nationalNumber_ == other.nationalNumber_ && + extension_.equals(other.extension_) && italianLeadingZero_ == other.italianLeadingZero_ && + numberOfLeadingZeros_ == other.numberOfLeadingZeros_ && + rawInput_.equals(other.rawInput_) && countryCodeSource_ == other.countryCodeSource_ && + preferredDomesticCarrierCode_.equals(other.preferredDomesticCarrierCode_) && + hasPreferredDomesticCarrierCode() == other.hasPreferredDomesticCarrierCode()); + } + + @Override + public boolean equals(Object that) { + return (that instanceof PhoneNumber) && exactlySameAs((PhoneNumber) that); + } + + @Override + public int hashCode() { + // Simplified rendition of the hashCode function automatically generated from the proto + // compiler with java_generate_equals_and_hash set to true. We are happy with unset values to + // be considered equal to their explicitly-set equivalents, so don't check if any value is + // unknown. The only exception to this is the preferred domestic carrier code. + int hash = 41; + hash = (53 * hash) + getCountryCode(); + hash = (53 * hash) + Long.valueOf(getNationalNumber()).hashCode(); + hash = (53 * hash) + getExtension().hashCode(); + hash = (53 * hash) + (isItalianLeadingZero() ? 1231 : 1237); + hash = (53 * hash) + getNumberOfLeadingZeros(); + hash = (53 * hash) + getRawInput().hashCode(); + hash = (53 * hash) + getCountryCodeSource().hashCode(); + hash = (53 * hash) + getPreferredDomesticCarrierCode().hashCode(); + hash = (53 * hash) + (hasPreferredDomesticCarrierCode() ? 1231 : 1237); + return hash; + } + + @Override + public String toString() { + StringBuilder outputString = new StringBuilder(); + outputString.append("Country Code: ").append(countryCode_); + outputString.append(" National Number: ").append(nationalNumber_); + if (hasItalianLeadingZero() && isItalianLeadingZero()) { + outputString.append(" Leading Zero(s): true"); + } + if (hasNumberOfLeadingZeros()) { + outputString.append(" Number of leading zeros: ").append(numberOfLeadingZeros_); + } + if (hasExtension()) { + outputString.append(" Extension: ").append(extension_); + } + if (hasCountryCodeSource()) { + outputString.append(" Country Code Source: ").append(countryCodeSource_); + } + if (hasPreferredDomesticCarrierCode()) { + outputString.append(" Preferred Domestic Carrier Code: "). + append(preferredDomesticCarrierCode_); + } + return outputString.toString(); + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumberInfo.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumberInfo.java new file mode 100644 index 0000000000..7ce2972bac --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumberInfo.java @@ -0,0 +1,569 @@ +/* + * Copyright (C) 2013 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.internal.MatcherApi; +import com.google.i18n.phonenumbers.internal.RegexBasedMatcher; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Methods for getting information about short phone numbers, such as short codes and emergency + * numbers. Note that most commercial short numbers are not handled here, but by the + * {@link PhoneNumberUtil}. + * + * @author Shaopeng Jia + * @author David Yonge-Mallo + */ +public class ShortNumberInfo { + private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); + + private static final ShortNumberInfo INSTANCE = + new ShortNumberInfo( + RegexBasedMatcher.create(), + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource()); + + // In these countries, if extra digits are added to an emergency number, it no longer connects + // to the emergency service. + private static final Set REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = new HashSet<>(); + static { + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("BR"); + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("CL"); + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("NI"); + } + + /** Cost categories of short numbers. */ + public enum ShortNumberCost { + TOLL_FREE, + STANDARD_RATE, + PREMIUM_RATE, + UNKNOWN_COST + } + + /** Returns the singleton instance of the ShortNumberInfo. */ + public static ShortNumberInfo getInstance() { + return INSTANCE; + } + + // MatcherApi supports the basic matching method for checking if a given national number matches + // a national number pattern defined in the given {@code PhoneNumberDesc}. + private final MatcherApi matcherApi; + + // A mapping from a country calling code to the region codes which denote the region represented + // by that country calling code. In the case of multiple regions sharing a calling code, such as + // the NANPA regions, the one indicated with "isMainCountryForCode" in the metadata should be + // first. + private final Map> countryCallingCodeToRegionCodeMap; + + private final RegionMetadataSource shortNumberMetadataSource; + + // @VisibleForTesting + ShortNumberInfo(MatcherApi matcherApi, + RegionMetadataSource shortNumberMetadataSource) { + this.matcherApi = matcherApi; + this.shortNumberMetadataSource = shortNumberMetadataSource; + // TODO: Create ShortNumberInfo for a given map + this.countryCallingCodeToRegionCodeMap = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); + } + + /** + * Returns a list with the region codes that match the specific country calling code. For + * non-geographical country calling codes, the region code 001 is returned. Also, in the case + * of no region code being found, an empty list is returned. + */ + private List getRegionCodesForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return Collections.unmodifiableList(regionCodes == null ? new ArrayList(0) + : regionCodes); + } + + /** + * Helper method to check that the country calling code of the number matches the region it's + * being dialed from. + */ + private boolean regionDialingFromMatchesNumber(PhoneNumber number, + String regionDialingFrom) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + return regionCodes.contains(regionDialingFrom); + } + + /** + * A thin wrapper around {@code shortNumberMetadataSource} which catches {@link + * IllegalArgumentException} for invalid region code and instead returns {@code null} + */ + private PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { + if (regionCode == null) { + return null; + } + try { + return shortNumberMetadataSource.getMetadataForRegion(regionCode); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** + * Check whether a short number is a possible number when dialed from the given region. This + * provides a more lenient check than {@link #isValidShortNumberForRegion}. + * + * @param number the short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the number is a possible short number + */ + public boolean isPossibleShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + int numberLength = getNationalSignificantNumber(number).length(); + return phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(numberLength); + } + + /** + * Check whether a short number is a possible number. If a country calling code is shared by + * multiple regions, this returns true if it's possible in any of them. This provides a more + * lenient check than {@link #isValidShortNumber}. See {@link + * #isPossibleShortNumberForRegion(PhoneNumber, String)} for details. + * + * @param number the short number to check + * @return whether the number is a possible short number + */ + public boolean isPossibleShortNumber(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + int shortNumberLength = getNationalSignificantNumber(number).length(); + for (String region : regionCodes) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(region); + if (phoneMetadata == null) { + continue; + } + if (phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(shortNumberLength)) { + return true; + } + } + return false; + } + + /** + * Tests whether a short number matches a valid pattern in a region. Note that this doesn't verify + * the number is actually in use, which is impossible to tell by just looking at the number + * itself. + * + * @param number the short number for which we want to test the validity + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number matches a valid pattern + */ + public boolean isValidShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + String shortNumber = getNationalSignificantNumber(number); + PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc(); + if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { + return false; + } + PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode(); + return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); + } + + /** + * Tests whether a short number matches a valid pattern. If a country calling code is shared by + * multiple regions, this returns true if it's valid in any of them. Note that this doesn't verify + * the number is actually in use, which is impossible to tell by just looking at the number + * itself. See {@link #isValidShortNumberForRegion(PhoneNumber, String)} for details. + * + * @param number the short number for which we want to test the validity + * @return whether the short number matches a valid pattern + */ + public boolean isValidShortNumber(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); + if (regionCodes.size() > 1 && regionCode != null) { + // If a matching region had been found for the phone number from among two or more regions, + // then we have already implicitly verified its validity for that region. + return true; + } + return isValidShortNumberForRegion(number, regionCode); + } + + /** + * Gets the expected cost category of a short number when dialed from a region (however, nothing + * is implied about its validity). If it is important that the number is valid, then its validity + * must first be checked using {@link #isValidShortNumberForRegion}. Note that emergency numbers + * are always considered toll-free. Example usage: + *

{@code
+   * // The region for which the number was parsed and the region we subsequently check against
+   * // need not be the same. Here we parse the number in the US and check it for Canada.
+   * PhoneNumber number = phoneUtil.parse("110", "US");
+   * ...
+   * String regionCode = "CA";
+   * ShortNumberInfo shortInfo = ShortNumberInfo.getInstance();
+   * if (shortInfo.isValidShortNumberForRegion(shortNumber, regionCode)) {
+   *   ShortNumberCost cost = shortInfo.getExpectedCostForRegion(number, regionCode);
+   *   // Do something with the cost information here.
+   * }}
+ * + * @param number the short number for which we want to know the expected cost category + * @param regionDialingFrom the region from which the number is dialed + * @return the expected cost category for that region of the short number. Returns UNKNOWN_COST if + * the number does not match a cost category. Note that an invalid number may match any cost + * category. + */ + public ShortNumberCost getExpectedCostForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return ShortNumberCost.UNKNOWN_COST; + } + // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return ShortNumberCost.UNKNOWN_COST; + } + + String shortNumber = getNationalSignificantNumber(number); + + // The possible lengths are not present for a particular sub-type if they match the general + // description; for this reason, we check the possible lengths against the general description + // first to allow an early exit if possible. + if (!phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(shortNumber.length())) { + return ShortNumberCost.UNKNOWN_COST; + } + + // The cost categories are tested in order of decreasing expense, since if for some reason the + // patterns overlap the most expensive matching cost category should be returned. + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) { + return ShortNumberCost.PREMIUM_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) { + return ShortNumberCost.STANDARD_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) { + return ShortNumberCost.TOLL_FREE; + } + if (isEmergencyNumber(shortNumber, regionDialingFrom)) { + // Emergency numbers are implicitly toll-free. + return ShortNumberCost.TOLL_FREE; + } + return ShortNumberCost.UNKNOWN_COST; + } + + /** + * Gets the expected cost category of a short number (however, nothing is implied about its + * validity). If the country calling code is unique to a region, this method behaves exactly the + * same as {@link #getExpectedCostForRegion(PhoneNumber, String)}. However, if the country + * calling code is shared by multiple regions, then it returns the highest cost in the sequence + * PREMIUM_RATE, UNKNOWN_COST, STANDARD_RATE, TOLL_FREE. The reason for the position of + * UNKNOWN_COST in this order is that if a number is UNKNOWN_COST in one region but STANDARD_RATE + * or TOLL_FREE in another, its expected cost cannot be estimated as one of the latter since it + * might be a PREMIUM_RATE number. + *

+ * For example, if a number is STANDARD_RATE in the US, but TOLL_FREE in Canada, the expected + * cost returned by this method will be STANDARD_RATE, since the NANPA countries share the same + * country calling code. + *

+ * Note: If the region from which the number is dialed is known, it is highly preferable to call + * {@link #getExpectedCostForRegion(PhoneNumber, String)} instead. + * + * @param number the short number for which we want to know the expected cost category + * @return the highest expected cost category of the short number in the region(s) with the given + * country calling code + */ + public ShortNumberCost getExpectedCost(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + if (regionCodes.size() == 0) { + return ShortNumberCost.UNKNOWN_COST; + } + if (regionCodes.size() == 1) { + return getExpectedCostForRegion(number, regionCodes.get(0)); + } + ShortNumberCost cost = ShortNumberCost.TOLL_FREE; + for (String regionCode : regionCodes) { + ShortNumberCost costForRegion = getExpectedCostForRegion(number, regionCode); + switch (costForRegion) { + case PREMIUM_RATE: + return ShortNumberCost.PREMIUM_RATE; + case UNKNOWN_COST: + cost = ShortNumberCost.UNKNOWN_COST; + break; + case STANDARD_RATE: + if (cost != ShortNumberCost.UNKNOWN_COST) { + cost = ShortNumberCost.STANDARD_RATE; + } + break; + case TOLL_FREE: + // Do nothing. + break; + default: + logger.log(Level.SEVERE, "Unrecognised cost for region: " + costForRegion); + } + } + return cost; + } + + // Helper method to get the region code for a given phone number, from a list of possible region + // codes. If the list contains more than one region, the first region for which the number is + // valid is returned. + private String getRegionCodeForShortNumberFromRegionList(PhoneNumber number, + List regionCodes) { + if (regionCodes.size() == 0) { + return null; + } else if (regionCodes.size() == 1) { + return regionCodes.get(0); + } + String nationalNumber = getNationalSignificantNumber(number); + for (String regionCode : regionCodes) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata != null + && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { + // The number is valid for this region. + return regionCode; + } + } + return null; + } + + /** + * Gets a valid short number for the specified region. + * + * @param regionCode the region for which an example short number is needed + * @return a valid short number for the specified region. Returns an empty string when the + * metadata does not contain such information. + */ + // @VisibleForTesting + String getExampleShortNumber(String regionCode) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata == null) { + return ""; + } + PhoneNumberDesc desc = phoneMetadata.getShortCode(); + if (desc.hasExampleNumber()) { + return desc.getExampleNumber(); + } + return ""; + } + + /** + * Gets a valid short number for the specified cost category. + * + * @param regionCode the region for which an example short number is needed + * @param cost the cost category of number that is needed + * @return a valid short number for the specified region and cost category. Returns an empty + * string when the metadata does not contain such information, or the cost is UNKNOWN_COST. + */ + // @VisibleForTesting + String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata == null) { + return ""; + } + PhoneNumberDesc desc = null; + switch (cost) { + case TOLL_FREE: + desc = phoneMetadata.getTollFree(); + break; + case STANDARD_RATE: + desc = phoneMetadata.getStandardRate(); + break; + case PREMIUM_RATE: + desc = phoneMetadata.getPremiumRate(); + break; + default: + // UNKNOWN_COST numbers are computed by the process of elimination from the other cost + // categories. + } + if (desc != null && desc.hasExampleNumber()) { + return desc.getExampleNumber(); + } + return ""; + } + + /** + * Returns true if the given number, exactly as dialed, might be used to connect to an emergency + * service in the given region. + *

+ * This method accepts a string, rather than a PhoneNumber, because it needs to distinguish + * cases such as "+1 911" and "911", where the former may not connect to an emergency service in + * all cases but the latter would. This method takes into account cases where the number might + * contain formatting, or might have additional digits appended (when it is okay to do that in + * the specified region). + * + * @param number the phone number to test + * @param regionCode the region where the phone number is being dialed + * @return whether the number might be used to connect to an emergency service in the given region + */ + public boolean connectsToEmergencyNumber(String number, String regionCode) { + return matchesEmergencyNumberHelper(number, regionCode, true /* allows prefix match */); + } + + /** + * Returns true if the given number exactly matches an emergency service number in the given + * region. + *

+ * This method takes into account cases where the number might contain formatting, but doesn't + * allow additional digits to be appended. Note that {@code isEmergencyNumber(number, region)} + * implies {@code connectsToEmergencyNumber(number, region)}. + * + * @param number the phone number to test + * @param regionCode the region where the phone number is being dialed + * @return whether the number exactly matches an emergency services number in the given region + */ + public boolean isEmergencyNumber(CharSequence number, String regionCode) { + return matchesEmergencyNumberHelper(number, regionCode, false /* doesn't allow prefix match */); + } + + private boolean matchesEmergencyNumberHelper(CharSequence number, String regionCode, + boolean allowPrefixMatch) { + CharSequence possibleNumber = PhoneNumberUtil.extractPossibleNumber(number); + if (PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(possibleNumber).lookingAt()) { + // Returns false if the number starts with a plus sign. We don't believe dialing the country + // code before emergency numbers (e.g. +1911) works, but later, if that proves to work, we can + // add additional logic here to handle it. + return false; + } + PhoneMetadata metadata = getShortNumberMetadataForRegion(regionCode); + if (metadata == null || !metadata.hasEmergency()) { + return false; + } + + String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(possibleNumber); + boolean allowPrefixMatchForRegion = + allowPrefixMatch && !REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode); + return matcherApi.matchNationalNumber(normalizedNumber, metadata.getEmergency(), + allowPrefixMatchForRegion); + } + + /** + * Given a valid short number, determines whether it is carrier-specific (however, nothing is + * implied about its validity). Carrier-specific numbers may connect to a different end-point, or + * not connect at all, depending on the user's carrier. If it is important that the number is + * valid, then its validity must first be checked using {@link #isValidShortNumber} or + * {@link #isValidShortNumberForRegion}. + * + * @param number the valid short number to check + * @return whether the short number is carrier-specific, assuming the input was a valid short + * number + */ + public boolean isCarrierSpecific(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); + String nationalNumber = getNationalSignificantNumber(number); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + return (phoneMetadata != null) + && (matchesPossibleNumberAndNationalNumber(nationalNumber, + phoneMetadata.getCarrierSpecific())); + } + + /** + * Given a valid short number, determines whether it is carrier-specific when dialed from the + * given region (however, nothing is implied about its validity). Carrier-specific numbers may + * connect to a different end-point, or not connect at all, depending on the user's carrier. If + * it is important that the number is valid, then its validity must first be checked using + * {@link #isValidShortNumber} or {@link #isValidShortNumberForRegion}. Returns false if the + * number doesn't match the region provided. + * + * @param number the valid short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number is carrier-specific in the provided region, assuming the + * input was a valid short number + */ + public boolean isCarrierSpecificForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + String nationalNumber = getNationalSignificantNumber(number); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + return (phoneMetadata != null) + && (matchesPossibleNumberAndNationalNumber(nationalNumber, + phoneMetadata.getCarrierSpecific())); + } + + /** + * Given a valid short number, determines whether it is an SMS service (however, nothing is + * implied about its validity). An SMS service is where the primary or only intended usage is to + * receive and/or send text messages (SMSs). This includes MMS as MMS numbers downgrade to SMS if + * the other party isn't MMS-capable. If it is important that the number is valid, then its + * validity must first be checked using {@link #isValidShortNumber} or {@link + * #isValidShortNumberForRegion}. Returns false if the number doesn't match the region provided. + * + * @param number the valid short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number is an SMS service in the provided region, assuming the input + * was a valid short number + */ + public boolean isSmsServiceForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + return phoneMetadata != null + && matchesPossibleNumberAndNationalNumber(getNationalSignificantNumber(number), + phoneMetadata.getSmsServices()); + } + + /** + * Gets the national significant number of the a phone number. Note a national significant number + * doesn't contain a national prefix or any formatting. + *

+ * This is a temporary duplicate of the {@code getNationalSignificantNumber} method from + * {@code PhoneNumberUtil}. Ultimately a canonical static version should exist in a separate + * utility class (to prevent {@code ShortNumberInfo} needing to depend on PhoneNumberUtil). + * + * @param number the phone number for which the national significant number is needed + * @return the national significant number of the PhoneNumber object passed in + */ + private static String getNationalSignificantNumber(PhoneNumber number) { + // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix. + StringBuilder nationalNumber = new StringBuilder(); + if (number.isItalianLeadingZero()) { + char[] zeros = new char[number.getNumberOfLeadingZeros()]; + Arrays.fill(zeros, '0'); + nationalNumber.append(new String(zeros)); + } + nationalNumber.append(number.getNationalNumber()); + return nationalNumber.toString(); + } + + // TODO: Once we have benchmarked ShortNumberInfo, consider if it is worth keeping + // this performance optimization. + private boolean matchesPossibleNumberAndNationalNumber(String number, + PhoneNumberDesc numberDesc) { + if (numberDesc.getPossibleLengthCount() > 0 + && !numberDesc.getPossibleLengthList().contains(number.length())) { + return false; + } + return matcherApi.matchNationalNumber(number, numberDesc, false); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java new file mode 100644 index 0000000000..e2046b0cd3 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java @@ -0,0 +1,277 @@ +/* + * Copyright (C) 2013 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.HashSet; +import java.util.Set; + +public class ShortNumbersRegionCodeSet { + // A set of all region codes for which data is available. + public static Set getRegionCodeSet() { + // The capacity is set to 321 as there are 241 different entries, + // and this offers a load factor of roughly 0.75. + Set regionCodeSet = new HashSet(321); + + regionCodeSet.add("AC"); + regionCodeSet.add("AD"); + regionCodeSet.add("AE"); + regionCodeSet.add("AF"); + regionCodeSet.add("AG"); + regionCodeSet.add("AI"); + regionCodeSet.add("AL"); + regionCodeSet.add("AM"); + regionCodeSet.add("AO"); + regionCodeSet.add("AR"); + regionCodeSet.add("AS"); + regionCodeSet.add("AT"); + regionCodeSet.add("AU"); + regionCodeSet.add("AW"); + regionCodeSet.add("AX"); + regionCodeSet.add("AZ"); + regionCodeSet.add("BA"); + regionCodeSet.add("BB"); + regionCodeSet.add("BD"); + regionCodeSet.add("BE"); + regionCodeSet.add("BF"); + regionCodeSet.add("BG"); + regionCodeSet.add("BH"); + regionCodeSet.add("BI"); + regionCodeSet.add("BJ"); + regionCodeSet.add("BL"); + regionCodeSet.add("BM"); + regionCodeSet.add("BN"); + regionCodeSet.add("BO"); + regionCodeSet.add("BQ"); + regionCodeSet.add("BR"); + regionCodeSet.add("BS"); + regionCodeSet.add("BT"); + regionCodeSet.add("BW"); + regionCodeSet.add("BY"); + regionCodeSet.add("BZ"); + regionCodeSet.add("CA"); + regionCodeSet.add("CC"); + regionCodeSet.add("CD"); + regionCodeSet.add("CF"); + regionCodeSet.add("CG"); + regionCodeSet.add("CH"); + regionCodeSet.add("CI"); + regionCodeSet.add("CK"); + regionCodeSet.add("CL"); + regionCodeSet.add("CM"); + regionCodeSet.add("CN"); + regionCodeSet.add("CO"); + regionCodeSet.add("CR"); + regionCodeSet.add("CU"); + regionCodeSet.add("CV"); + regionCodeSet.add("CW"); + regionCodeSet.add("CX"); + regionCodeSet.add("CY"); + regionCodeSet.add("CZ"); + regionCodeSet.add("DE"); + regionCodeSet.add("DJ"); + regionCodeSet.add("DK"); + regionCodeSet.add("DM"); + regionCodeSet.add("DO"); + regionCodeSet.add("DZ"); + regionCodeSet.add("EC"); + regionCodeSet.add("EE"); + regionCodeSet.add("EG"); + regionCodeSet.add("EH"); + regionCodeSet.add("ER"); + regionCodeSet.add("ES"); + regionCodeSet.add("ET"); + regionCodeSet.add("FI"); + regionCodeSet.add("FJ"); + regionCodeSet.add("FK"); + regionCodeSet.add("FM"); + regionCodeSet.add("FO"); + regionCodeSet.add("FR"); + regionCodeSet.add("GA"); + regionCodeSet.add("GB"); + regionCodeSet.add("GD"); + regionCodeSet.add("GE"); + regionCodeSet.add("GF"); + regionCodeSet.add("GG"); + regionCodeSet.add("GH"); + regionCodeSet.add("GI"); + regionCodeSet.add("GL"); + regionCodeSet.add("GM"); + regionCodeSet.add("GN"); + regionCodeSet.add("GP"); + regionCodeSet.add("GR"); + regionCodeSet.add("GT"); + regionCodeSet.add("GU"); + regionCodeSet.add("GW"); + regionCodeSet.add("GY"); + regionCodeSet.add("HK"); + regionCodeSet.add("HN"); + regionCodeSet.add("HR"); + regionCodeSet.add("HT"); + regionCodeSet.add("HU"); + regionCodeSet.add("ID"); + regionCodeSet.add("IE"); + regionCodeSet.add("IL"); + regionCodeSet.add("IM"); + regionCodeSet.add("IN"); + regionCodeSet.add("IQ"); + regionCodeSet.add("IR"); + regionCodeSet.add("IS"); + regionCodeSet.add("IT"); + regionCodeSet.add("JE"); + regionCodeSet.add("JM"); + regionCodeSet.add("JO"); + regionCodeSet.add("JP"); + regionCodeSet.add("KE"); + regionCodeSet.add("KG"); + regionCodeSet.add("KH"); + regionCodeSet.add("KI"); + regionCodeSet.add("KM"); + regionCodeSet.add("KN"); + regionCodeSet.add("KP"); + regionCodeSet.add("KR"); + regionCodeSet.add("KW"); + regionCodeSet.add("KY"); + regionCodeSet.add("KZ"); + regionCodeSet.add("LA"); + regionCodeSet.add("LB"); + regionCodeSet.add("LC"); + regionCodeSet.add("LI"); + regionCodeSet.add("LK"); + regionCodeSet.add("LR"); + regionCodeSet.add("LS"); + regionCodeSet.add("LT"); + regionCodeSet.add("LU"); + regionCodeSet.add("LV"); + regionCodeSet.add("LY"); + regionCodeSet.add("MA"); + regionCodeSet.add("MC"); + regionCodeSet.add("MD"); + regionCodeSet.add("ME"); + regionCodeSet.add("MF"); + regionCodeSet.add("MG"); + regionCodeSet.add("MH"); + regionCodeSet.add("MK"); + regionCodeSet.add("ML"); + regionCodeSet.add("MM"); + regionCodeSet.add("MN"); + regionCodeSet.add("MO"); + regionCodeSet.add("MP"); + regionCodeSet.add("MQ"); + regionCodeSet.add("MR"); + regionCodeSet.add("MS"); + regionCodeSet.add("MT"); + regionCodeSet.add("MU"); + regionCodeSet.add("MV"); + regionCodeSet.add("MW"); + regionCodeSet.add("MX"); + regionCodeSet.add("MY"); + regionCodeSet.add("MZ"); + regionCodeSet.add("NA"); + regionCodeSet.add("NC"); + regionCodeSet.add("NE"); + regionCodeSet.add("NF"); + regionCodeSet.add("NG"); + regionCodeSet.add("NI"); + regionCodeSet.add("NL"); + regionCodeSet.add("NO"); + regionCodeSet.add("NP"); + regionCodeSet.add("NR"); + regionCodeSet.add("NU"); + regionCodeSet.add("NZ"); + regionCodeSet.add("OM"); + regionCodeSet.add("PA"); + regionCodeSet.add("PE"); + regionCodeSet.add("PF"); + regionCodeSet.add("PG"); + regionCodeSet.add("PH"); + regionCodeSet.add("PK"); + regionCodeSet.add("PL"); + regionCodeSet.add("PM"); + regionCodeSet.add("PR"); + regionCodeSet.add("PS"); + regionCodeSet.add("PT"); + regionCodeSet.add("PW"); + regionCodeSet.add("PY"); + regionCodeSet.add("QA"); + regionCodeSet.add("RE"); + regionCodeSet.add("RO"); + regionCodeSet.add("RS"); + regionCodeSet.add("RU"); + regionCodeSet.add("RW"); + regionCodeSet.add("SA"); + regionCodeSet.add("SB"); + regionCodeSet.add("SC"); + regionCodeSet.add("SD"); + regionCodeSet.add("SE"); + regionCodeSet.add("SG"); + regionCodeSet.add("SH"); + regionCodeSet.add("SI"); + regionCodeSet.add("SJ"); + regionCodeSet.add("SK"); + regionCodeSet.add("SL"); + regionCodeSet.add("SM"); + regionCodeSet.add("SN"); + regionCodeSet.add("SO"); + regionCodeSet.add("SR"); + regionCodeSet.add("SS"); + regionCodeSet.add("ST"); + regionCodeSet.add("SV"); + regionCodeSet.add("SX"); + regionCodeSet.add("SY"); + regionCodeSet.add("SZ"); + regionCodeSet.add("TC"); + regionCodeSet.add("TD"); + regionCodeSet.add("TG"); + regionCodeSet.add("TH"); + regionCodeSet.add("TJ"); + regionCodeSet.add("TL"); + regionCodeSet.add("TM"); + regionCodeSet.add("TN"); + regionCodeSet.add("TO"); + regionCodeSet.add("TR"); + regionCodeSet.add("TT"); + regionCodeSet.add("TV"); + regionCodeSet.add("TW"); + regionCodeSet.add("TZ"); + regionCodeSet.add("UA"); + regionCodeSet.add("UG"); + regionCodeSet.add("US"); + regionCodeSet.add("UY"); + regionCodeSet.add("UZ"); + regionCodeSet.add("VA"); + regionCodeSet.add("VC"); + regionCodeSet.add("VE"); + regionCodeSet.add("VG"); + regionCodeSet.add("VI"); + regionCodeSet.add("VN"); + regionCodeSet.add("VU"); + regionCodeSet.add("WF"); + regionCodeSet.add("WS"); + regionCodeSet.add("XK"); + regionCodeSet.add("YE"); + regionCodeSet.add("YT"); + regionCodeSet.add("ZA"); + regionCodeSet.add("ZM"); + regionCodeSet.add("ZW"); + + return regionCodeSet; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 new file mode 100644 index 0000000000000000000000000000000000000000..1510187d4619de019bd61e1eba2efe3b4fe29a2a GIT binary patch literal 144 zcmZ4UmVvdri-CcG5s0yX|43p?45At_Db+@`njp#;LYdTRGH|FEDySGKs2BqkGcvG5 Uo0-Rgv>~eoDuZgmr5a)p02s6u8~^|S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 new file mode 100644 index 0000000000000000000000000000000000000000..3d86d493cb82039fed3c17ab65205220b90ba4ac GIT binary patch literal 101 zcmZ4UmVvcAo`HdZ5s0w>X(Ta522qWelxpKzO;n13L&Z=*#YjQL7^s+$f!)F^+ECXr H7NHXWV#Ew; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 new file mode 100644 index 0000000000000000000000000000000000000000..72ac06a4a280cc8db6afd530ee999667ff28e6f5 GIT binary patch literal 96 zcmZ4UmVvcAih+TF5s0w>IV3Sg22qWelxpKzO(e>sR+E84#ZW=TNI}IIsF;y~$;c3) F2>=+L3km=L literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 new file mode 100644 index 0000000000000000000000000000000000000000..c5abeb6858f2938ec3c3edbc0e7500e5f48d8f6b GIT binary patch literal 237 zcmZvVK?=e!5JjhgAh>o{FpGe8QRqx2NpqH%op*3ydL!@Us&{avRp`Qj@aBi)zt;@= z#~T0|Ie+H7x!b|%db>Yq>J+@fO&uI88cW7HdE5YF9-J?g1RP3r8pBvBFH5OjDLK|L vvyZYRR86b3(zlU(T>?1%B*yaMxnRc7%Wul$lX{R?Ef{-=USo)ccny3^5hl-(sijjhfF;FohgF>{au6b;Y zg+a8j8IZO#h&D8`u#ByV1`^SRx)!k@BV|BF7@?R16ZM K4ABIc0s#QSwj+oD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 new file mode 100644 index 0000000000000000000000000000000000000000..a404c3e8917facf05b2c48dba91a51cdb17cef1e GIT binary patch literal 85 zcmZ4UmVve0pMima5r{DXV;qtgBLkmCOiHy$ttOOWU{x_xP%#23VPs$gQBVK?e9;I} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 new file mode 100644 index 0000000000000000000000000000000000000000..7496756575d77478fd3477c16bc09efd3e02ab6a GIT binary patch literal 201 zcmZ4UmVveWFarYvBM@T(#&{$#W(HA>n3QVcT1`}nfkVYmLB&Wx#TclVk%84H+R!K# wq)!H<&Im<0ln103xM8{!R7}7c*})oXEJ0eqHlb=Y0qQ}ui4m+6q?~~P0O;Z&$p8QV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 new file mode 100644 index 0000000000000000000000000000000000000000..684e8e1e610b0f646a732ba5e8152b633b71b7d7 GIT binary patch literal 96 zcmZ4UmVvcAih+TF5r{DXV*-*GBZH_$OiHy;ttN;vhEoh2DuxOwMhYs%K*fv FO#mqf3rYY0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 new file mode 100644 index 0000000000000000000000000000000000000000..c6148a86282efddb8c80b5d2096514ced85ac906 GIT binary patch literal 272 zcmZ4UmVvd3fq{{o0Z0HbCSXiM5@Ti%(TGXW1mbGrS_q|MQme_pp<<|@Vx*vA3{=a= zARldHYGx4|ZK!JzTVt$YZ)E^vTE^CZNzEEdkb&YLGmM~S;4{k5C>E;Sq{cAX7-Wu- fWsRvpjd`@8X)MSnA()eZE`hp?36(lhx1|f}@6ipzmHmLi60BRZ$=Kufz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 new file mode 100644 index 0000000000000000000000000000000000000000..6e38688c0780f6f0faeaf62634af2633e987efd0 GIT binary patch literal 188 zcmZ4UmVvc=8v_FaBM@T(#u6kkW(FaRm=sMQt~RcPQ4Aa^h6*Z13M$4xm5dCGW*`ls jAT>r1HBbtu15GJgw27{{Wh}aSsL?=exYdL7FfafBYh4|r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 new file mode 100644 index 0000000000000000000000000000000000000000..7207f15f7e50a46da9c839781cfa288c96d1d062 GIT binary patch literal 158 zcmZ4UmVvc=1_J{FBM@T(#!@6PCI%Uen3QUxT1~7J1GkEyf{KxXim`%<2~Zm&1Ba1O iO|-F@c`V2fQ6x>q5F>yT0|!hKSO-fqR5eHk0|Nk~HyLpN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 new file mode 100644 index 0000000000000000000000000000000000000000..426f6f89c71879e5d42d7b6e9353d611db6a2d80 GIT binary patch literal 333 zcmcgoF%H5o40Mo~_yR+R49yU!iIXN_Vc`!9#v88y_eXq% z{{S!-P|)6%k(IWCV}H9p@0RR>6w8mVdW-?Qf3-_X372eG{~rk u6p}A2#kucHA*v@-7Q)e2c2cBK@Qp>?sY)(R_gGY!Gp(a+68$&I@}dtSUPpWY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 new file mode 100644 index 0000000000000000000000000000000000000000..2d5605b80e871697d88b11c4c465b7744876670a GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z0HbCSa^Z5@Ti%)rd){HmcPGQO0nJfkVYmLB&Wx#TclVkwGKc z&@8sbDB3{R$VAsXw#FF9vWTtGu(vXbHny+?3Rr4J8|hlcf{d0yG7)Mp!h8m9n86Av YCSbEw4aqSW>QsdJm+$k3MxhlD#k#Sj0}v1 zAPtge>Wm=DffNHbOu2%J36c&`kf{h|AReaSJkdtFW|pxv=Fw*6u^@Ypb>ViB8AvGv F001IPTWt3^E!qDb*&mnjp#uonqitF;q}7Qcy8gP%!~&V`Pvs z(6G0PHZ;~XHMfk7HqtdQ)3u1Lv4}P@1~D{2MvG#aXk4qwzyULgSaU#TF)#oC^ZO*6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 new file mode 100644 index 0000000000000000000000000000000000000000..175243cfdcf27612da995f7d9db157e6cf4e757e GIT binary patch literal 963 zcmb`GUrNL<5XMtvMUY*5^Ffh5RM=tyn@s-I7Y~vx`{F5dypbpHPTs*ux{2K2aPqunt?CgUvR?(hW55==JyV>raTiUPimJW41IK}L;k#(c$2I@wWs$!Ll z;&s+&ZYgV(veNr=6LzlaM@f$R#iYCFoGpLTKw)rIXf1b(9-G{4$0b=Uw0m1r8#km$ za{{91<9<<@>+o1&Q?RTXGsSgXR51gIf$l}tO%;jVacYwz8J_g)woi{BQMVS2L`#wO z25Djf3=Iu~6yb75tCAFT&syhnbc}BaHtq6s2C}z7y}hEGB6n# zfHWbi1uBASK~t+~s9|qqSQBleYi1d1s99rVP!nxzVHsOv4it|z)HOBN1#--cOf*48 z%76?pf|vz063PQo4BRkRD5#hK6{9)?;R5Uq(E>RH;*4kmBao%h<`%J_mqE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 new file mode 100644 index 0000000000000000000000000000000000000000..b5335e7ed241cdd1d673e68aa9b43c5558a15b93 GIT binary patch literal 12140 zcmeHN&5k2A5bl{_rA0_1_J9xqts)VLZ8VYWw)>9@4`TYpktblhZ^U~bae@N}9)fq^ z`^xslo$iF}ZYHD2^c=>W?y7Rx<*!_J)o=e6FMchGPYV29@!#}MXRpfQ%Qrv$d|$mS z*_hbe*|%l!a;;bEYPB{XzbbBxQ`O+D@~-KIo+7@@IHQ0`Q`{ygtF>LNYs$L*yL$8E z56an1GkA?hr%b)+2VeE2XE)(j>#9vV;0=kxf2TLLX+h|8)sn;D!Padz_!dvKyzBS` z$-UFI2EPSA7)%ZA*^nCFjBW6-7EQDjnHy7g5ZbUCkq8I)LiaRNXMEq690WudE)-D~1Ls%U`bOcaOb&iG7_jyoUR7dCyfO|} z@wS0FwjV%S@i#tHl?QvLr8kZplr>ry0TvA;owq$0`4wviFMCIO29`kL>IPpeI<(NR zru=9@+8%tycNJF$?ZSb9n!Q_3eW;cJRpT(x=tFqBRtUR+kjTLV3<;)=1JmmaOc90= zO!^KF#b+6g2%I5Ssr^#TQXlgW$YXw&2BUUAz zKqh`L*Xw}A&aRi(a=Z`@uZOd1DDHn&!)$@fxc}npntmfV9AhCa!8t&jUBA^K{qU`v z+eMF>MsWgkcqhY4zAks+jNeoDa`xF2L?_3sN19xxV1Sl@*BmT|Zak0*wL ztAQ`|u@O1l+f$FfWhWi2|FrG{6lQnQXMq550&?zU;C%KY=>mgu9z&<+w;dQHG|Zph zme@%1s^p=rXC5y$5-0GiFKE7xEB}aQ&*jGTA4|OSpy1%%bov0P{rCV0dR@YmWxNxZ z-dn~qb8MC~Gwh8!cU+e9%KZ%2_K&wOJnJn%&dlTcqV2`j^tk-jMYw-)0^97zN%B|7 z#Yp1kBzY_zRVb|t2|SI|OUN_zI6^ZwcFZ<`dr!$t?MZI!yIR6|n%l)AB(NSgdzB+0 z9-_DR`%@(RqnSWsy6qw$abh%_1O;6E54SCd6JP>($>;9L=jMpmLLr@=cXP7Kx%ooR z&6gY>i4*wW!UjqE#UN>Pzj{AkRj@!|fx?BB_tc|80y9l5U)@V81;Mc~cA^Ht~8EVHc)KC$I;jpfUaXHJaC@fG?%|OH%pyCL9VgQb6KG0?r zWEc=%aKspVm?EhMLpd0G*p^~NTcy+8McC@H%p?)k4y4`zY;xv!g3x+8=7JNrxjP10 zUoZepm@=aj1tbF#~o26mV$v%#pZIpf{vPGKDb^I}9yf9f>GE bx~2JgHwn{)k=S01WNWn}JdTxXpeX(Wc(5Kx literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 new file mode 100644 index 0000000000000000000000000000000000000000..2f7b212cf0000736997016e74517125e528e55d7 GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5r{DX<4+_pMg}2`m=sMQt~Ra(Qzo^V3>+$k3MxhlD#k#Sj0}uM G2n_)LF$#hJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 new file mode 100644 index 0000000000000000000000000000000000000000..2b6dd359432caf2b435a052bd2ac8bcd001db17e GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5r{DX<1ZvJMg~!hn3QUhT1^mT1g97{R16hVj1*LikrV@&02{Om AdjJ3c literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 new file mode 100644 index 0000000000000000000000000000000000000000..e23beaabe1fc78c5c0bff875741e6fa8585f21c5 GIT binary patch literal 214 zcmZ4UmVveW0s{jBBM@T&CP-pT49XfYDb+@`n)oONJ{3a+6(a=|V+9ox1r<}E0gMdX z#>O?K(WYjxH5P^-6Jt<8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 new file mode 100644 index 0000000000000000000000000000000000000000..ff52ce4cc116a9c4ac073a59def98d25a0a2daf6 GIT binary patch literal 434 zcmZvYK~BUl3`IRiNF%XkF}p6hm@Fb?Y$s`F!#PmMj#EH5&`8{a({KmA%?ykLm0Gv< z|37|x|D@X&qRol$!2Qovu6j3gzkhmu)wf_pehO{p!!+|W3&b1x;Qhm~vGl~F_-pP% zTZu~#W3@(N$;En!b6NVRJQg#AFa&dHjHbF$V_o}@mf?00KEuc!tEJkA1qJ??F{$kk zb2aT*;%@da>5M?=H~Otj_&tY~NYw5|++k gqaYu@VFj`sdd=CA*vT0L>Wlp{paopt#I_;&0_sF!5dZ)H literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 new file mode 100644 index 0000000000000000000000000000000000000000..21d60dc6d353f0e6d7683829196522ea17460ac4 GIT binary patch literal 118 zcmZ4UmVvdrfPsO55s0w>b0jfF20o3Llxm||O%P>KtI5EsVyK{E1XRMvpcHLrWMXC> hTVot;sB3C&5nE##ZD_1(8e0=>VHpb)vy4R;1ptbn5rhB$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 new file mode 100644 index 0000000000000000000000000000000000000000..2eafd93ee453c0a381f85bf4d514a8dfd216a98c GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5s0w>DsR+E84#ZW=TNI}IINimQK0PdFx AyZ`_I literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 new file mode 100644 index 0000000000000000000000000000000000000000..9b3af0a9ae1e6608d73575ef18879d964ec38242 GIT binary patch literal 300 zcmZXOF%H5o3`Jc~B__ne!c>V4twe^zi5p=i80_OmOUB)7qwWO^fomf&;RP=ahXWn+LWAQ;sT>6tOD75tCAFRI3T1jCD*P3?Rk8p<<|@Vx*vA3{=j@ zz+)6`Xk-#w6K!l3YX~wx6j>icmnmUgGDx~$mO||YYUYMnsi0zl$5vyw4v=Y>ZsoLy rHqLUbS+~+nngkCfeMi*BMfb<(H54m1_-+VVOSR6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 new file mode 100644 index 0000000000000000000000000000000000000000..3dd783aed6e51f7160e18b194895205254e4e563 GIT binary patch literal 85 ycmZ4UmVve0pMima5s0w>CnPaO20o3LlxmY&O(?~{s$!_1Vgyve$iN7qpa1}N&j>XD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 new file mode 100644 index 0000000000000000000000000000000000000000..7355c1babc9f6ea3d95181fce5663a8ccc33a6e1 GIT binary patch literal 95 zcmZ4UmVvcAl7WGN5r{DX(_$nsMg~!hn3QVcT1^mT1fhUD1`ZWN1r;L&6=R@cMg~T6 GgdPAaa|>Yr literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 new file mode 100644 index 0000000000000000000000000000000000000000..64625de9379b05fb0a77191a5de6def3e345c080 GIT binary patch literal 89 zcmZ4UmVvcAn1O+T5r{DX(-I^xMg~5On3QUxT1^mTTC2&xs$!_1Vgyve$iNzHs%sgG GPz?aRjS0a3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 new file mode 100644 index 0000000000000000000000000000000000000000..a501a87f0864bc7448270397a370834509105c9a GIT binary patch literal 95 zcmZ4UmVvcAl7WGN5r{DX({dy+Mg~!hn3QUxT1^mT455HL1`ZWN1r;L&6=R@cMg~T6 GgdPAbN(*EF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 new file mode 100644 index 0000000000000000000000000000000000000000..f74102b958962790d5543d96f4a3e6c4d1bacf7a GIT binary patch literal 645 zcmb`FF>b>!3`Lm&NeUFm)~OvdXov>`HYv$=mz<&#qphcC)f@F{y+cXbP8_&n1PFvF z`G3A||NO%C6X2l$z()2zYrp92;Q4s|_zK^Z7P=I8^sV#gJjvw^3{0UPa_Nqzw^lYc zHN}*%1V(L_p0UeSK|N=rTo~&iV^yiwLAB$kEd{owZNl%fu)di}$04eY`Cvf~L#~+O z7Q7;uCm*Wu$ua~{s6Z2jUWI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 new file mode 100644 index 0000000000000000000000000000000000000000..db17512850bde51ff2433916e0380a8cbfb4f8c0 GIT binary patch literal 227 zcmZ4UmVveWE&~GtBM@T&fkccnjp#uLYdTRGH|FEDySGKs2BqkGcxdM w*jpJI)tH*sSXyctfb`2?YJ=(qQViTM-3lruI1E6x7ib~WdV=}Fs901s&={{R30 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 new file mode 100644 index 0000000000000000000000000000000000000000..3db56a25636a6978d91f3ba7abb4c713e5b075a0 GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBM@T&AxL7(45At_Db>ccny3^5hl-(sijjhfF;Foh1EU#8j|@nS m5kx7JLTF^*hUrjHF#&60HHtQ|hy`f`+hIb;4nvSq2mk=vtsm$B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 new file mode 100644 index 0000000000000000000000000000000000000000..07537c978e6c38b383214cd1ef204c4bb60300b3 GIT binary patch literal 104 zcmZ4UmVvcAiGhKE5r{DXb2yS1BZHhqOiHy;ttJ*q$GBFLfm_8;LB&Wx#aKbb1W6;1 F2>{L@4gvrG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 new file mode 100644 index 0000000000000000000000000000000000000000..7a56715715baf0ee3ccc15b6920c485ef07294fa GIT binary patch literal 162 zcmZ4UmVvc=4g&)NBM@T(<_IJ)W(HA>n3QVcT1_O%q*jxGL&Z=*#YjQL7^WDk&IqCo Zr~srKt2#cA3{;&3&>&W@K`>JwGytN(7?S`1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 new file mode 100644 index 0000000000000000000000000000000000000000..ecd338a121e69a468ce625dcc40c9e69067a5c8a GIT binary patch literal 178 zcmZ4UmVvc=4FdxMBM@T&QAlD;45At_Db>ccnn;vMttJD9ilKsvk%EdbP%$HeM6{8v zNo?2|Hm7_cAk<$z&V^M}llUEpA`NA}sVXR)t*Ks8X~BNGyL z1UB+E5nC-~9`LIe(!N9s5#h;`9kWS>Q=(Y5V#)cMSFwpn_W_JV#vyA;+LhQPrXiG5 zVpQfaCju9g-UTwEvY9bk!YV{oj=bZT2PGq0S3aN#u9HSV zH3}Azwo^vF4%wm~5*s$NaDlZ;4*p>AC=VS}2h>Ip5iCq7+*o2# zaR9qzN;)ca$=#wWj(cSO6W9AzX*<_;{=Z>xALnlvh``1BdAepPDXu6BmSaf~CN5{1 z`i~|JO}d)v!ya`cbK62%mlbz&OLK6TQ1tsO1}ouV$(pCMq;aG{krfUqR43>!M1~K* x6Fv|4Zx1(@vfj^J(QnuE%9)^?d%Yv|fZ|A!k)M_I8$26jY3XiWwOg HO%ZwkHj@j9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 new file mode 100644 index 0000000000000000000000000000000000000000..dfa294c22981a45f82237c54afe0ee7487bbd81d GIT binary patch literal 108 zcmZ4UmVvcAje&uI5r{DX^BE*DMg~cZm=sMQt~Ra(Q$}!#fm_8;LB&Wx#aKbb1gM9R Pfj!zt*Tljy7GVGY5!w#2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 new file mode 100644 index 0000000000000000000000000000000000000000..152bf34840843c8fc8ed1b1cf8f91f855ccd00f6 GIT binary patch literal 352 zcmZ4UmVvd3fq^lc0Z0HbCSZPyB*w-dqY;x*ZCtAfqKwcf25uEY1r;L&6=MYz6QDLm z1}0-8kah)xavVDOkaQ}jm?CTDL$cDWR+E7htQ4$*HQLz3A{JzWD3T(m^MDis2h3PB dwoZbLiVv6BwR7;><204m>0RW^(KQRCR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 new file mode 100644 index 0000000000000000000000000000000000000000..76b8bf2c7d5510d107c76bf4b571342b902fc0f6 GIT binary patch literal 308 zcmZ4UmVvd3fq_w*0Z1@1G6-wfTNxPCL>uZ_#>S**#-vo6)q{ukD!A7B)$G~i0V93D0tN;=Q0+3@E8Td4S-ZiP! Wgi;KwDuxOwMqnwXm=usY2mk<1D?Tg$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 new file mode 100644 index 0000000000000000000000000000000000000000..c43d67c80718d9a4ed555e932d4b6daa0757c746 GIT binary patch literal 293 zcmZ4UmVvd3fq_wm0Z1@1GH^v3>RQIeq*R;Nf<%Cr1Bf9k2FCwDKn54xSf~*khDOFF zre@|AAZy4q9PCCU&0wQY&0}CTFfe3bVAcQ$0|Cf7Mg~3&pf62oHK7y(tBRq5iV;|f L6&wg4r4RrB1jsqt literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 new file mode 100644 index 0000000000000000000000000000000000000000..45c6e6c557600b2a4ddc1ece996125db13602459 GIT binary patch literal 363 zcma)&Jr2S!427Sm_^HGQdxbi*L!~BZ>WYPfgf0ki2xxD_)i?t<{Q=PdVabjxKYw}2 z{ek%vpcAAJVZ+DsO{unV+SrV1>8e&{Gs#eLEh);bJSF;;uuBemXKYzF%!Mm#opzfI zyE3ahg*~NLBQ&|vrm!VXL0&)~?(dec(4#*O^8UnHsQ;r+U(s)S#M=OZJXb()@v|Wa a+eB_PZTfv+6{{%LQEWs=SPmaJt^qHs!$>Cp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 new file mode 100644 index 0000000000000000000000000000000000000000..ada9c95fe886ef1aed66dc83a5fe78da3252229c GIT binary patch literal 299 zcmZ4UmVvd3fq_wp0Z1@1GH@6g#H3Uk8q|XLK+FTg5EcXDe;}Yb7u8Cr@jQkGhDOFF zre@|AmIfea;IN+fBpVpJUr%mxOA3=GV9AYmW?8OX>WssZ$<{9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 new file mode 100644 index 0000000000000000000000000000000000000000..78b32568347c0182ef7f31153c930bcc60426798 GIT binary patch literal 370 zcmZ4UmVvd3fq^lT0Z1@1GKiSPq*Pnh)m4Ux3C?lYaU0IT8Q_f*K?!Ot zP2HJ!^XBKgf2!GwQqvEmR8>{#AsR~ir&r(I?e1~gjqB=NjwXn;=`zgGIw#+hb$mV$Qk4uasj!7AVvB4!s*pYJrY~6aA78DG6!Mxy$))dxycPo)YaL+pv(Vk zqu$z7_a%UB1{o(VNh`HL4r7VO*+<2kRx9;pke#H0sEM0|sZfgAP)Je@xs+K{=i8Kh z)a>ABqV_4b(YP(F0a_c96pfBOF1IlnjR`Y5%rwNo-%r5kY{i#bIO{CgL50*_79u7d zsGSkkwv#U8RO*s~mbRU5+Hkse>>hA#qigy-7lM9sV7h?I4OBh1_=0ux$ub8Y;9I+3wNdF#%JtApob{`7d7D^i0cEMfsO%O7P{4%0Ktk)B+U6= z0FV-nw=)WuQM8nV|K@<7HbcPw3=`u8eOS#=?5(Vgez(OkSF9?#XlzMZXi$~pK1wqo X9v8^+JxY*F^zR7f(QNSsC89syIm6Px literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 new file mode 100644 index 0000000000000000000000000000000000000000..56b7d6609081904ef3bcb94cc1fbc2a33a297199 GIT binary patch literal 666 zcmb_YOHRWu6nt(J)Ka#;$z6g%yz| zw)1AjGkO1@{FP|&Mnpmgy4yS*J#TH>bc18rbp5Vk6)??#C9ndnfi-XgK$l*hc>et; z=mmi^pj6W#6Dv93WNL+!hZY%|P9bJYS_d2_YVX3}wFL#b-d1%;I`(Q?L#E?wx5v(S zrN^Dc%(gP}U3G|+r#dUgO0hQ9{oQo_Bcgn!pbSn#+4Ja~#yQ<@aHk3KY|+&|NLrR$ zl)5NQa(eV^FGqJgc8#vLXD%ntnN@~LzmV;Zdlwp!Cu2;b|7n>SUm*&cHu4`X2AMw6 T`ny_DT95_hUK^K$QB3p&4tS0l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 new file mode 100644 index 0000000000000000000000000000000000000000..634ecce02e03787620a90dfdae168bcb00fb444c GIT binary patch literal 291 zcmZ4UmVvd3fq_wq0Z1@1GO)#@R2v%Bf_Om84a5)@1LJ=npfeZQIZ&&)4ULRVOwG(K zEDa37PDFAT7Pm4m8vxZYFjs)JL%hPsAgTfMrE#q$5@lMe$-tpvsGwq`pkfSF45a`d C4>{og literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 new file mode 100644 index 0000000000000000000000000000000000000000..89f33ec6caa6bce22af9f02e31b2ec9bf60c8798 GIT binary patch literal 312 zcmZ4UmVvd3fq_w<0Z1@1GH^#58k<_i#-vnR)PjV7m=j8KfO!mz|A7D~1d+tU#V`z} zhl7!U)6mG+#MI2(!V+Wy9z#fxMRy;}J|yEAm<~P2$AU(tY;UfZs6j4y-%O}CO6M~oq zxlT-)ftc7rLBc}MWcJB=9qW|9n+HGAOI4~wz*KBSR4lRaky64rWBqFF-MDClT*VDT zHco{2zvFkY)5FW9nV%+!yv-JV2lAA1)-v^I904^=+%41(^*l_FVj6b;ETF^E7Q^z6 Wu@+$Zsq>KYo!mS$K$zGH+KxLm*iv@@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE new file mode 100644 index 0000000000000000000000000000000000000000..3ec15121100d9e03c070cf8d4bdad81afb79abe5 GIT binary patch literal 666 zcmaKpK~97)6oy}!!C@4W$r$&uU@;_;l+qS(V_bNO4!b#p!XdneH}NcN(ooCG}HLW60O-Xt(h~699p9x=OOWlk2n4b{~R&g z!c;ArqNRMwpEe856g@r>t==h;61WIICfBq(;%?QD^TH37Q=FBDO!Uf<2~$(Y55F~(YJZf@`IB3Eg-j{C#@AcOaAe|Ro03cy}Z?-k%?11JcD&CTyp z9i@_!td}?{kCdlNxhredU=aHd6M@eYpGgXGgqC*0C@pGjNzF&%QS>A7aUDkYcS@R4 zZd8!>l9CWf&cZCENUg3#B!?uPB|+1=dLNaU8FDVs>{%4zGphIUiKPei;4Mc~OxU0j zqXu;MN|H5*OOK+Xj5hk&IZ@A)Q0gf@k#--odv)W7Bn*ykL8FsQCqu81j|D;6bVc_x4r$ZG4|W;{`Ca1czD!7mJ5VeD%NI^)nbV#I#i%9nPPlG5qgLk`}0)`uLA8HQ38Q_g~BSJ)kC9ikK z@6Eh*8I6#FkYovQrPUhnkR16CK`t}d$BA4yC&LkWd`r7Ja%pZCM#H(6;7n(el8=%V zN$(24*0T2;0>{WHan4+dX@r~*l@6kyYF(_Qt|x(egF=%(tvHvkq@IYnb`)T{Lj?Vo|5G)<5O zgXhisKZdVwiav>^D0*M=UUfo-G)-@UELnDE)-bYKJNmul{vU3_`2m>-l1-W zm?IX57_mesM1+p?Zk=|OKA5I&B^@$XG*#*kB{tEoY=X6^h}l6y2v!=>gK!SE-(dsn zz_9~XW96x+4sI01#$?v{ynv4<&n-Jpz(UG z-M4SGPk#TT`jx2qAR?s{-E|N5NpD;nr|m9#p9AM%=(oGKuonodfmN^?c8MZ-MhzaF zcw_vOoxrm}#3ZwEVagVa5eaO=IAsq%OgSKmU4$E^UO;9t(#cCFS*I?F8qL~R=L7n+ zptcrt+B%{0IAM-4j|hPAblAdy(qTB2Hj#PR0Ru^>@P_5_ymR*s+a*+hnIj>blYKYyYI!B*oV2>Y9U1HAhxsX=Dsl1JcF#9|)k@ zX~hM52+1a}ymX&qLSbfp4zMVd~O8 zr!kLH=k`rAg(Q{nJnQ{(O>x}k5OQ=)mMWL{*5uGn9(5y6rncX^>?VgcA96?ylHTbWOp?Qh5mBYEirXraUUNaO;mYlBVofJ-CC{kmQDyn@VV{*wNrLb`pFZT05uH*ckLQGyt%rW`kidkfO zd>o5@mG=+|x%I_?Xm*jb_y&C&D7#uJU8s3-)+XMyR;|ESubQIQyV2Z5q*wbC=Yr2k zKFH4@$BCFr?UsgGGHhMvJei+5C|o^AQrI)-k6nQwj6i(X~b-uJRv3Q5`= z^`N0?Go>j|5};>pnz_VD>BSRLi!dP|NCd1wPW7RnfWZtjlj8Jja=BJsN2?h11~Qg}fnPP3aP0!7)z#Ckb3Vk>4Y%lIAur^>E9c_#?BXuK7~ElS*NF)sBH zT$8#P>h4i)hPgGxiZd{v6*~qS znJ1SG@Obvc>>gP#d)F+4zJB>N0;xJ{TNc**J4@}3zIg%hT{cwfcG(6EqsMOvQFBMM zDo)Nu8`Fe=XCr9l6v**j>K{b}G zIJL}7X}}<#!N&H^IEYQsq41_w^9?;6&N=`XOGUhO;woC;#D0=K(9`1_gVXPK3)#Z9 zn|cEQbU#`Uog{wCT1Rhk?3!L`ufJjF}LoP70|2 zs}L$q3h789p^xXc`Z%)sWYaz0xb4Ox^04~GHU`emB(L4tIgP`R_Ji7ZgwS{@6JnRBssZcMG`Gx`>s|##gFDR06p8d=YaIaZ#Mx9dQ^R4B#(VEw=YLO zwO;k@O8)K`pPK5oMYWv%mw^;ea~(`I*M>zq9iXZ(0qubWhRgjwi&yf2ZnrI9m^x#S z{mxjn*NnA7+iOz5?-=O0DPVnnvwTVFR;gnBf-*+jW4bOQ*q!Ab zYa!DJ%>8trY8~TovWfx!D8^#1Qe>ej@-j#_tk<`a0` ybEv=k2q^xf>mTD#`h91mHK*v)1$Z#}q$NgYF0vq)(+^+0CwIDJq#k9Xs{aJoKP+be literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS new file mode 100644 index 0000000000000000000000000000000000000000..ce57e4b5c892727fc0a14dc2bfb55e7b7dac199d GIT binary patch literal 717 zcmaJCn3i`Ma$KWCyfHS~6CshlAT5@bZ z&5XzM^7cu~7ox>G5p`Whx7){u8p}BBhrOf{q_@@#`$K+J0OopLSAf$!5Fl_4l5}P9 zUP6!x3Ay~n`v8~1AO?t?ky_HWI<3w&jr8q~*q)}OT^uF! zW=={XSLijgJNiOLnl+@v)vINK#v1a~k(^z}ibfd0OcEqKz6I@!e>;PW8gx63^>%xvAY^@z3?F@?= z53!E0jeJ@2ubNS{n&v#GM}{ z$N_K>v5vNz{a(`#4ik8M=y`;T4W*o&MP6FSJ1A%-1-@C($+fUxTq(}Fw>9Wgd4b?9 zWL}!PsV@nA(^bASQ@yKM*OL1|@#Jw_d_mwWSh7Psr|kNN*824e=!_hbcyjSgf z#Yn7a#c{P=pI5J{`o}Ld`=-=X;n7;F&vyCvAyw-cPv3&jp)(=uEZQZnn9_NlhFT zSE@XMHY$s>H{>!u~bY;oS;K47nLlp}-?VPdiy-7{CX zZ~J6@P1z;O{16DL4W$&;4ZX!g7ah-GpM1dKW@~cCu=q(3DmJNtGe)6Ri6g8b5{|`a zG>{0;Vm^p&@PI@=WLy&=jvYZjg@BMUa@jFZf@D7`dZq|P$reS~vBRWCI0A;?)-_3h zt`nzbWW6SG#z<09rpizPsbN($7OTkpTB{ppoey;rTlCJ?02C1>7WE)jFXVO1%#(@d zddSp~tAbN%ky8!&OJA`>ju?bzDHTjlq9goGIEwtnw$dvjac(3K2rsbMhwM4n%%N6| zW`KKVJ2V%_1(JjNy=r%)y0Rp=LVH3H5_V2Q4or)O$;6YAp0@03Vnv-zQ2YM+_FT67RbjkOdo}m6YINZW|(SE8&W>_qX|j z)fE&;10C%^;3F{kF7HQ&6!E}!WQXrbU>(QQ(Kl7$8?)xyzL0c8#yN;RA*j!%FL3`+ zkroaehc*ije8mI?w6cw$qHg*IjS(QXt%17LYC3MZLQ1ce7A?&?mw6{qJeyK{|`pciU_{!>%@ z5yOZN8ZY1zXYY=np~d7)QaJ~AmQB$;Y-ia_EtuUCa1X!YyPzTL(*T#~MSKyonk~VZ u(YStkdRRg%^zHIEFmvkQR{E#P{D8vd)au2s6ATQM*~$N0&i|G(t@Iy`T8y;- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW new file mode 100644 index 0000000000000000000000000000000000000000..1671079ae482c488f9d16956be3cf6f0f2313e15 GIT binary patch literal 463 zcmaixF>b>!3`MB`sWTM_(4k`o578iik|o>fQuGc5I>_35iiW;X&XL>n3@s_wNeT}! zAPeSy=KqvV-?04xP-ozmQt*6udrdBwF6LnzM(PpuFdqFRIB#oPWXwaRhcq>Fg>F!K53`!;W)t26#>@KqDa$$*mpx z+0S;~K4|?yw0b9^rfKL=597ghX)4B5%}wR@{?79-4r7VTZN2qV2~b?8RP|?N_wbv{ zz4d+C7qwEy} z#wP0l(SQh93l{N+!e8Yjmt9gt8=2fZlya3 z_TRzv;uA*{xa9L+v!Pc#vx-ykoRyXdNy!q>FQ-%~V^uD*!T4dCE=+CFoOSQy0^6y3 z^fM#}Oh^?ojIC@m)WIn(I>{2Tz<@Hn18`n=-J_5O^^IaxM{wN6?3S4C&S>@U1pAo` tb4dvlGArxlg@}%40}@#q*cm)a2qngnghJakv|?_kVHCpW=fI&NeF2&~h-Lr) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ new file mode 100644 index 0000000000000000000000000000000000000000..21bb446caf7953f239f26dbfefd80c4c9da884f7 GIT binary patch literal 1016 zcmd^7%TB{E5L~yE5>?`W!~uyzg>q;P73)WwgbU&~aDD5IKLGcS_$uy*Pk>oB2^E3^ zT(J^6-kq5pXZ`$2vqz%o8xbj`=*s$fvwiZrw7R_s+PJ#u;%1vXr?#z-X?B9dTlDK3 zJbD1y03Mxb6C~=uCJNkTAtPxMcnz`SEj~;eD*-wI)fohg4u~h`5lq4ftlip2lY+6) zR)Y0XUxs*?D=M_HcwFsa<626)v24&ja&m!POmL*@n3}*%OkF2Z`6#_s;drmoKxW>y zU(;>-nO=0vh8Yk$n1P#O9|cUDk$T7I#s9v|r##Tg%6S^)X>xau2ENdQ8F1B40y?7e zRd!j)Vs^tqC#7DNW?5Q*6wQKOcTotJ-@bG?j9S3c3*wHrr+WkI8=DuVD^}~N#3d0s$;8ckF92#f(j$G(#AR%zVp(`j7y$H4fJXxMt_@{^=20r zbZ$_1m8l-w%MfM2!EDcC6k$-1JJ6zyQd@r%*6v~GrSwry*n0KcpTsvF{>WMWSPHst zq``^1j^mjgSBHE$%G!0wM5*8@MFh<^Y7dWz6M$?v!*87<(lmK~f}b~u|=ttrCydM!xx@!2A=uHB4{d0b&6UK)Oj?V h+H>3;^X5Qw(B501`KY}tZI&0ffI$=glYeJf`~ceU#Lxf$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB new file mode 100644 index 0000000000000000000000000000000000000000..5cd771bf54fabab7db1a0be251c6899ead88be6e GIT binary patch literal 995 zcmah{Id0rQ5FA<%1Z<+%fHNx)0|ImP98L@<^cQBC?E@TJtwitfi=6oZeuGrixCGKYob0=#aJ^PsfvX@8{#`zCI9u`>;Q+0C$go zN({rN(gD9u4~hy$@E*0TT8CfqI%`G+z?he^YQ*3);?nU!2=zKr#srm&j<6(rusH;_ z8MP#9)ow#tU$vx}v@&V&BDJf@9k4!!n6ebm`@E6i0^Ar;cqq-FB-NHD)WwKsLAC5e zA%GlDpwNdbb=Ai9xCpzOZC2sPFha)X=#5Nzg-jGrIw13&L%i3NG-nmjQnXfWZMOY5 zOgZ=CG>7JWd^yNFwBjti7W%Q{LGU#N05~_AFi*JnhkkuG);u(3^X45J;O8Is&9rE~!j+#*=AMU>sP24cvu}9W7NQA)YVPyyBqU`B49%n%3=SJL z2p30)>}7Hi8uNb?6bQi})P|EY7%4z6Ig9*DVp7;l`b)1*TYzGZno8X>%;bQB58yDe zy_JfHLcn0;_jvn&q{}~Ynry2@*G(@r8HwMSxHorqG|*l65b&7zbA7w(irmaM8YXuM Nwl{&T+XXx-(=)W`+Ohxu literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD new file mode 100644 index 0000000000000000000000000000000000000000..5c4cb85a70c51ff733ac32c48fd3505cc656622f GIT binary patch literal 2129 zcmaKuO^)P55QXiTX&8ndafn`wr7Dpb`De2kf!J^cw|9L2c1VzQBbHo?Gr;#Et4it? znv$~Z%8Yyw@!~~P|Mk!G@W(X0oA}K0JpH=IbFSO*^!(>`>FXZO&A+tMdg;4ezm4~C zz;-(OYvr}H@m?+fKCr%EeaU*y`ik{|C07sg$4@_IR*Fy0PtQGDT6!_F1=s1q0Z+Ru zpZc1T?bTti(+yTgd#Oh^%S#uE*>2_NwWP%XPWf^(&9>)ufW7rqPGlaeu~D$s-L|DlLi3Ufpvhr$W^ZLV~+qid8=fT&}egVvJ%mpNjiYz)ld-@Pte+q}`KVc;-Ds zfyQ$Zc_H#>JQ|U05j+qAY!G3@NLA$2g#!i~!ib{%tSlg2Rakil04G(!ItUI063$s5 zu&*eRAj#=Wy6)c7B?4`r=$J{Ldb^CAgkTtZ1_sj7;|j^3@HeGFa==y`i)#!* zCca{6P>QfJ=(Re**2Ss_lWNo)l*FaGdXW~icjZH2bU}rU_z0+O7|K`LbMA~IXK`==}L%r7ZLs!XqsS^Mtlf(Yoyd^Ntzv1#7^^#2HS0D zg}RZQ1F1ZyvvOTYzyPTuZRUiGq*k#7PlK=wq6kZaZZ#&Q64oA}(wRbbtJUElfH)dN zfYj9ck!*#Lr6(W~wJ)Q^??~71bVArF_Kx+4Ys4oFsVV^$JzJoO(q*S^$5u-4v|^Jk z*>%oP@TNoWiqR9`(6W*z?#`piC~rV6k@{r~1|_K?aY-GITV8z}Y9dbWt;HBEWyY`y zMRSb7+H20b*G8i&m7dj|i$rpr!VYmAuk-W)4S`f@TS5DJ4Md}v-sEp)`54A-4dH62 z-D&=pk6zs9GhgTFhfOR8Qlq%ugDUQxRO?JH?AmV%R z|1wQ)f1BQffcbp=Bg=Qw_aE`j?}#4xR4>c)@EFgJ<|%%cA~l6h+Ju74)7$VEIq^$r zTuP_*^3vbxq+P>Q!$c(-6PAIc0o3|_tF?E420z=({2@<-%nuGNEqyiVMU0IhFlJMi z*rc*lxOf#8*D^irZ6J+tB8lm4eb{?63hLvE~3yb~yz&H{xoX0p7U(O{wH~ zY`=N)jqC3py8a}ZKN68ritbD|eEBg3UA8?!H{xK1vA|ejh>SiwhpO}Y`Gh{K@caN z?ZI>DylXFMWIyqxwtn%GAazRW-=(5g=RwH9I^Rd!tTwpnScS?8ueP!>K3ZV*vEc~b zM)m-4k=1$4a--*!FTl|3?H$`0&6puq+m9%(=zfhZ>#>lj+Dur{BG*}7WqAz|{uZEn zj%~q;=A3J6J|H0_o#w)VR=eCRHz|FEXM@L)UeDg(>8Rqi@L`&I+-&aXG<{Ng>p4wV KW}gWp^z;WOlbl!p literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF new file mode 100644 index 0000000000000000000000000000000000000000..8375abe516e2a10c57abe5f928a1232c88cf10b7 GIT binary patch literal 447 zcmcJMF^&Q;3`L!h(2m3&VT&nJFvUoojFW6=kSMr>iD)>*Zn)9bdmwtw0CpH53R)~V zQR4sotmN+kiyr{<53(2opNx)%nD@uuc+xw`R#K~QaI4K4B`FopZptOF7ja39V;EBI z3u%>oNLds#goh-GB&x!Tf+rF}@i;f=d*PAtY8Yr8QX1VvLbVFzQ8{#P=^2ObTsY{Q zY7NiUh-&mfM+bA2n47-qSRd($RJnC|z@gdh1c_*%*E?$p2BU}?wBy3S6W OB{3NIm_KLs%XR|_&|yCS literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG new file mode 100644 index 0000000000000000000000000000000000000000..503a5581609c245b207b25d9109a57eddb155748 GIT binary patch literal 1488 zcmeHHO-_U`6n>p?1k~uppY0^Fm@!OJN}h4w-F5gs5Yb3_HSwl%@rQdQz1&3CzALq z=m`Ou-9JF^g=SI$F1i;Z6N*+o`8CbboNY<)fJ&fN5?BNX2!kCuEkZC$H+-#pzbiPT~VS7hh8%ijW(ok zF%}Ei?<*$g3?o~+mXo|Ld#=#W+!KFrw7VI26K9w@^^wyS4eg|D2I@G~zF>Qnq8{+v V=;0>u6A&NaO8>7@&>y`{@eN!K83q6V literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH new file mode 100644 index 0000000000000000000000000000000000000000..0483e11c7e59bac89cadbb05e823e95f216a8d5b GIT binary patch literal 576 zcmb7?JyOIl426|2J8S_IoPc7Bb&(l4{*gn&3>8;koOC$@1u-|;tL#xY13Z~!cYzAe zD7GU#>64P(JFQ-cS|OsQY3M3j7rS8^=SAN19c&F#FTHFZ?k&tAD8#A6%vN_9XEV+v zsyo{VaS6=z&Nw5ypNjV-gd$mxy`*HykmE3^nIceT76=ip6|60ij6v4LD@I)nt*tQI z-g&@0D@fIKqP!(#?t*6jW>GINoC7GR3=nLEa+#e{XmJPy!kD1@ThGN~y=&y}T~#dc zoGDeJ5W#edib>EJcS$jR1`emd%jAE1lh?+OMtf~OuntZC<61x0nYgB^k7GV+AD@UW l_S7=h0$(vV+d67<*l4w}cbgtQG^M`;MyvzwJFmx+@Dmi=cb5PF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI new file mode 100644 index 0000000000000000000000000000000000000000..0ee448eac39c261ec4e1499334a316ea258b9e4d GIT binary patch literal 365 zcmZ4UmVvd3fq^lF0Z1@1G6-wfTSXh0na9SY)EFCT#-vo6)qU5Cc2ifHReEuDUbm-5~j!8($oyB2W)?2hs;C+p7FE4(33e!5N{^D8z?Dk(MeGX*9>G#8rQ?K}Hd2w4 z&P|k+O`b$)Ru&a&rmXo(%M6oD$|&HIf*)Pe|6hcqHT&FH@~M;Fga;=fmr9+<*aBg0 zY29I}520Jcq~j?j1_S4GCio7Hlw9t@fo(v#x(z2USP10{?TgqK2@w#`GH*B8{R_hC Mi|Y&XrVrNm0+BOS+5i9m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL new file mode 100644 index 0000000000000000000000000000000000000000..706168429c8b493295b88bbd287a551d300503dc GIT binary patch literal 532 zcmaJ;OHRZv40T3gF&gf`cDktKw2hO%0*N)^0%=zC6ocnRT#Ylpb6U`JLsVO-a9tA@!STGTSd(G3<>(kP577_f1ju(FNrSXj^$mDffw>R0)5-WumHIOD zQZ*aCpy~^IBLO-0Q`I8Tq<3nzTFGqes3kM=Mtu*BMu8r=m6x`b0C}ebUuI*S#;=3q z8%Piv54mrw?P&k&=xpBbjkyGyQxu3!6~c6irdw>k7n!51@c*N?x49v2Qd;`cLx-1F Ry!RU&n9=UG)U>Y2{Q#aoZCd~U literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM new file mode 100644 index 0000000000000000000000000000000000000000..dc8bf14fb14594c03fb04f815763af05ba100f90 GIT binary patch literal 691 zcmaiyO-{ow5QWD@Ri#RZHCyPSUPSWG*m2k(vF8MCc0C0hE`+!g2jC3w#z`rl3M?gd zM(>;FnaS%rEuV-MFGOUFq3iAa9kZ93%DCI__A)qUcl$&CtO7jid0#9< zlANXQr4(C3Hz465A9?t%i*w=2`VxhmRUv*YpIVU|jVYov&$SXdY=Y1k|Nb7=4}^Eh$vwYifV= z!2sIT(4|m)P*!3M5g`B5u7pPDocf}(BXerRpPy~g-_%X~lc2@Jqh_QF=RG!~udD58 T9Cjn#&=P;g#w$84=n*lW44;%q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN new file mode 100644 index 0000000000000000000000000000000000000000..2e5a9d8c56641d3f3ef6a6d83cd13e6c2729efb8 GIT binary patch literal 382 zcmb7AI}XAy41K9oRYHiFk)cC7RJ8dtg$0QNaDlX2ufPJ$Vc5AEX8=27Xcr_bIhOt2 z^C!<2(iFUZdsQpx&j+8d4It-IjnyQl_SQ;vn zL@}%nCXh*`O=~-9vSpog9jn5ieq^?uvuzXjJRIUp7Tf%j3ard`t>q>rZt}BtxO+A_ oke3Q1=L?WLkkmCJ!2~u19ix27LHiPE-t2NoAbmpo+sLKx0o6}S{Qv*} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO new file mode 100644 index 0000000000000000000000000000000000000000..028a73feadb6ff6e2c948053327dbc6a0e17e781 GIT binary patch literal 725 zcmaKqO-{ow5QWEuswovq)^w3Yvp{mjKXKR~(F61VX?8sYxHsY;EVv41fcIReXeDZC z5_|m3^UT<9pE7+BnS6+dF-Go_we5EI8uoeh^f>5)kKMT49^Bfz1#o z@1T{o-I2zuZS$ZZF}NQf(&R|5W+3o54^LtQr`h#6YSUx~k1HA;vj{W|dPGC^nge9J zF{cO>4N&Pp4qDQ5%y`TmF=-@;MT9So(59j<+9ea_=VR)bVTZF>pl5+BiUpS9j8v+v zIv*m+oU;;e-Cqu1)g6!y%q?3u*uow4*eq~!?iH5eV!kjqDQ8_+8kq(AdjaS91^bg< z5&BQ^{D=Zy$`&{MyuoK9H`bzccoxkQRE))EW><$bWv*ng!X^xjX=GZr%Ua<#vKZ6_ x-iME4iK^G@W!>V@5Ke$6Tw&{)ojpPBh`4=`)x*ytpepLi+LbVqPGaE0_y$=-j++1g literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ new file mode 100644 index 0000000000000000000000000000000000000000..b2aa5b880acb65d9447cbc3d4c1702772bc20bf6 GIT binary patch literal 395 zcmcJLF%H5o3`LzvRd-H72PC^`nv?~Jg_(&V&DK*uSU3+?;|%a)5HPS3$&Q`a?_0j! zs6G;z3&9yfi{)k=ZJ#9jX>O*1$>)1(a9`kvp4mFUW>x?77VzsYK^P%3Wla zvSUyR$QFpEu lF>}Xxss1a~^?WI*uDZ84RogvLb)bq_r};QTH5Tp@Jpg3dRMP+e literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR new file mode 100644 index 0000000000000000000000000000000000000000..4722a6b8845f299c085e57235f0fafc5505a6fd0 GIT binary patch literal 1685 zcmds1%Wf1g5VSW5>}~`H6okZS4dY-)0iH8I!>{oTQ0>{r z1R;U~Cr0x4)vm6tZu{#uarQ}wQ-M!PDL!QCT!_Q%-RIPj9*g%`W2H;H)Q=@w$D_zQ z+_zZUUR@rnO77WI)x9(Vma&&;E3`G*IT||??{F@Y3pfC;X(%R>aj_qY#oY72XR@6i zO00cMgUSZ;N`OJo7?S&?6l)@5oe!~3fWLkWJkG?DcKn(BV&{Tc^SDML#W_(5J8$r{ z?zIM~(8m3leYD`V!scWO%V*iA;djPZ~nCY{%j-*W7OJiqWdrs7oK5Vzu2^ zY{m6^3QU#N0fnX0+A#-KO33f{cuRBEft4)7)thG@FgV$W>VvK$=Z~p75eRir?yaybW1cUbtT23F&xoT zvEmKehEZXSuq4HMnrQeAMQO72k?YlFZMuLJ&@r9|z64ws4En4IR1;qwwneTCl|Y(Z zJZA@PRJ%@`HPlt-3vq!QPH6@0xlIn>GbFR5K8_4M z;C=WoJ3BkGuWxGoL#fqorIglMeR=r)%}39TO5Y#$2d>td{oy(P6aen+@x1|D{Q?vP z0k=hs52-h|)XuTl#Yg!fe5KMkw-9sZf@ADln_pte-Ed5f3B^e`P)wbjXWy&~om-@C zQ3@m~GiYin6;*k5EX9bpDB|Q2fg7#1kQE}OTq;DqTtrgKkdzxGFcF%A2CC1Z-4bYu zb_<#%s1)h2p*X_?v=>PnTEH_#Oy@9%lqBMu4N5}nY3TErLor;Ag8}23^@8;v4ATf1 zr`{fds>380;;W2g?HG1aS`J}IAWmqQ8D>ClMQqRM+K^(c7bZ&J`ix9JAmQB>|4*pl z=3iX$AyNOKQ_>?k^qIq86!Aq4!w5OcXkv;vIlM$`8=iGkzv7z7O=#hAGL+NhOv4lgZ_`-c{=eIre?W2e;`q&p|2^8y}!^gkpI B+42AY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT new file mode 100644 index 0000000000000000000000000000000000000000..3a2a40c44ad2980c981dd26b68553b8d8c6ab19e GIT binary patch literal 636 zcmc(cK~BRk5JkUJg+@i{qQH(t7Fo25NVT2V5gR1Vz|MHb4Z4HmM%;yyaEA8JK!jA- zA|g%3_Wb|GnY?|Vd;y9B0Ambpl8r-tdVY=5m|UyNFtJ!LmW)b-j0?&Uw)b}~`8MP+ z`7Wovjd|>o^E?Q&cg!(4NrPK=(oG>b^{O=j32aS0aF?0O11IS>+8;|%cZq#r6^6w4F) z`T5zJk58Jt5ltV6NGU~n`~0M%)&)Mhwkx<-yFI=`(@W6SO}E>Z#Nk8eQ8$InVGGz2 z#!U1M0t@q5*FJWofw#UZDeKV2t||^mgP;p_>PiSDH;IYctc^ooQxy*g>hRZQV;iVJ zbsbO~ka5WPh+4D|4^Zt{aul3T05$+x#9cs-Y!EAv8+fo)Jb~v46pSapWp2GT)_IJu z<|fu~^EyJ>X<&x)uz)XG!|2cee+Rtm4m&%pOhDsW6fHR|^a1#J0&G~}rGPX7q`?;s zUqm9Q^RJ@EHld+`@oIT>*a(DH#lp9vV0WDFBsiI2z<>F#`~4z;CNHnhbxRYiIW1>K zt1X7IeZ?;H70ov0eq)hTG)V#!gc}h4Ct{VY$NR!0hMxsft}pn;A~;$I?fu3H^9{e% Z6B?vk^e0-03?V+t7%Q%bRbzNM literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY new file mode 100644 index 0000000000000000000000000000000000000000..b5615e3466e304879b9a5e114606766d2236207c GIT binary patch literal 1245 zcmZuxOK#gR5G4~Uu^pi3rpTs1z0kr6B7lEU-2~_zx+rMvdLuFoJ;H#_8R*JTVfXwC|)2! zV|zNm>XFMhk{gn#U6)(dRONtxWUMEb8*R;QzuQ;Yj2r+4a$Cr;zJ_d%z_uGACa|g_ zY?cX+07LbFSQ&>F0H`d^s-l9q8d6LZT(a_^x@##`+8gIpt2K(*f|A7epdui5A1l*35DXkYqEd*l+*bfq(zeS6wxRcc@{(d5mDa{O9~$KTirA>t^uCCq z9Mo}qtnu#0V79zr(FX?!IbEe#8rPnc36-3Wc;}G!*N=?smEvwz7->D#2GLyJJLv?% zy7=`6nGWI-rAe`f&veL$6otxBJ#f&K__C#z_0@QYqSTwxz$t-LjNFtO_uE;Z8RE^o z>npKj#HO@oK;H<2AUZ}6a*dFhAs0gP6ek@pMj=@mz`Hqq{sNX-KQ{Nn3oH`;cId^2cY``S F=6?a02H*ey literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ new file mode 100644 index 0000000000000000000000000000000000000000..feac3a5b88f166cb625f77da3cb15d6539df648e GIT binary patch literal 474 zcmb`Dy$*sf6oqd|2r(pX4(<#xG^w{xh>MAvuV7{4DFoigm+?Uyo%P&`k`PBpPJizG zdQQvrPVt3E-3WtHwA$=_MUa!%FTRllR{0 zvTml%Sgxju<&hQlLfjQ3?pP$uyk%P;V(Glmw$v2@x^m9BFSmH#xT`)$xTK;~>f!}S z0;wlHS%knpZRcJ;>?t~&kolmJGO1x+E=abnyutjzuV`1zACLWWA36`K1T zC>q*CO&-aT6*-|~R4uJfbn(cBCq%6TRO;+V8ZBD_TJ|VAF=`$YxuXqqjk!&adf71c znUDr@L*tUoU@cZIC<(2T5rl-!jD|WJ;(!!1O@r`Q1Sv-F{(9ea(d}|c>rb1zEul)v zrMCXRUiyQH7y?p4&L{=7qBZpXvT%-~^$;X3*(ln(5yFcSTP1VX%4MuyY&I~9Jry&U z`H1vfX-fXoWzFRgn=JJH!ECpW{cbQL&{BWYr%YQzh-NPHjINt=qlj|7RUNPU7|!FGgGHklm*(d4Fy#)})@~vc^e^5sVT!~N4hic&BxFv) zQrkT1w&xPQO);$FT7qFun1d5xV=U}oJPyn5g$Ky_&DSpreHCIPV>>=pyxR5~G5Ph4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC new file mode 100644 index 0000000000000000000000000000000000000000..226552455f37f4043235bb21ccf04ca4039afab7 GIT binary patch literal 833 zcmZ8gTTUD?5VQ$NScLe>5m1CBR&v`OKO!MMIEHb)I0f{4avQFeGlVKHJKAKVmfP*> zu6CE_{g3(jV$7FnjIq|5d%1o1)&0J-@$~#!SM0Ec)jeoMIHdhND67*hsUAQoz$|xV zMUiix_8sd5YzMo9UBO6U-YRM?r17+%Q8at4%_)OYwPdFuM5pbD5>gKhpO_x%2)cMJ z2m~g1&Buk&suyBacEnbbLcg)Qww8vTraHI)h0PehzU*pPAFAc z_cF9bu*ZyxBcJYIiDgw{<`Jd&%cZsY^E)~o_ zq|Uj_E;Vf3o}o+5l(R(6C1C!LhNNq0o}8I_Y~?p-JAvK_r{w(v!oxb%O}tuSeuTCX z;UxBX4x^^ja?_FgaVv@wWB=l#Ly3P1N3*~nT*5q*)9>`07CaW-YF0mLz$r*7GOxto zX~BQDQ?HZbdHNsZ?C}wid&3^_O!v7$i`f*nLt}zoQYcm)87d|CwK~AXn)AbAJ*cj4 S`*M8oH|j0^lp7)2@%sSnIH|n= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD new file mode 100644 index 0000000000000000000000000000000000000000..dea8bcb416740fafb42ddfe8bcd43a830078db71 GIT binary patch literal 676 zcmcJNO-{ow5QWF4p)E-4*s%zbRW*x9wi7!x8y55yZgxEdBq!ktT#Xe6fam-XO18B! z{>%5?%qaQzq~w)|zY`H-jCT9yCp%8sW-V|uIFCaB!H8hhJ0}UqjNon8eEXMMHN0sWpiKmRY1cLF>}mH zjJDp72HnLsM%>_4oGx)Zw_eCb{N;e_FXB=HXTuc9Yr5Z~OWkI(rD!wS2$c$*iUJTL z?i`~lDHKk3Gtz)eIil z%g*HnlM?_Qfde9}YUgazovWeGcUw=cZMxo?HJ9ul413BhG%Oh*Z>Sv;u?Z;|YpAR? z%q^VPRESg*c_B{ghy=YmTkIgr-fM&k2ZU5=!pjbTAN-GJxM!plq`vha*&n!ag+y!V h1mlm&`5GG5KNHNA$rNR(%v8k#2vbkCsN3f_rw6xbN&^4@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG new file mode 100644 index 0000000000000000000000000000000000000000..f12515e161326738700dd5744289720497a8efbf GIT binary patch literal 462 zcmbu5L23gr3`OOkfd&eNLZHhmW|1rmvS#dYy6K{n9>O!bIYsNaQLd5Wbdw7tU!D|_ zLRS^YM*h!VLi=x8d=i-h;V_1tMWi3U!jw0!FWiqg@)mVBsg7JCm83_2$ypzF19Y!? z2}4ULPMX#SVDBsePA;+aLk=m}-Jpi;lo{{IwKl*2jRa-O*(YzKlH4h(?2S2x*}Kze z$ea*!UqcU((MEKha6M0CzRdIM%RkDpjH~v=>ei2{w-3A=sbW^8L`6@Ve%vClf}e}- cYqzdtT{mD1nW*SW8JU^pFZ3?448^z{XFxk$$N&HU literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH new file mode 100644 index 0000000000000000000000000000000000000000..ddbc79cac14e6eb9a888fe580a128755d7272098 GIT binary patch literal 713 zcmaKqOHRWu5QfL8kWy$_AR#s^B9TSAsN}cDY*?`24kkNJ0qKo61Q+5A@H3i7wn=KsCxvW(fF*}qpBW79{?abFFMN5CE42>)u)~CX z?vmHi+;$W1zm4IH2dxG zL}jh2T35A!2o2*TExH}0poOdzoVPhZAI0@MOms1XSG7G5@J|KwnAJ$Qn_T%P=yC$8 NYS*y@j|}YbzHhVVcZ&c3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI new file mode 100644 index 0000000000000000000000000000000000000000..eacc997bbaf8dbfd810464237f094f88e1cf0c70 GIT binary patch literal 456 zcmcJLF%H5o3`Lzv4A2uGF?8tA43$zRX<8NrCU&-vjZ@I{M%;n3Z~)E#c7$k=Sg~X$ zvH#DDa(%$!0w8WcMF?1Wh2eA_`jH!yD@q>05v$$SHJq!u8MO`A#jZ5+%` H(?o+8nYUmK literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK new file mode 100644 index 0000000000000000000000000000000000000000..0b268b4bd6b920958c2d2997e01bddfb96f36e7c GIT binary patch literal 327 zcmZ4UmVvd3fq~JE0Z1@1GVnwj>6)5b#Kxplo795DfS47CL9z_e8unI3F)201(T2vl z=CL&<(T2LFv6?`&#vrv|z{tRAWN2h;0#wcwjcgK3)*LJg;xYaQ0;n*pxL^+;*#x#1 zOu#K?U~=|mU|?Fsz+_+mb`3-gp9auhMzxwC%D7gOfmOv&LB$9t$H>4A4J5c~1^`wV BKm-5) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL new file mode 100644 index 0000000000000000000000000000000000000000..0b4069634ef21efe81d70cd76ea47e3476183f9d GIT binary patch literal 2245 zcmeHI%dXQf5VdoADeV;qAt8i>L>F1qQY-lt$6>>QEq{<^*MC3)XTy?jVasRn4RB`M zJlcCNumnLQH;#SIcsyrj`sJIr{vgCc;E_^_SH?Q6566$8PXVuHXLO%hyKg#t#U8LL zj1|Tj;|7C?pY8U|YtuyA>V4>vbH=y20!xAB`h;CZ5Gv@@1gnz62dy8DsnWplLaUt* zHJz3WY&o)#Y-{LMVZnNuMcRt6o`Tl+@u98g3+AwpqGkeY!c3EoF`C$2s(I^hoDSSq zHEc3A01F&lHw`$L$12D%W5^ysMko22iqC=fgDI0?d;xfYaAejLG6k)ltu#8JFZe9 zjuo0Whm#mTXD+=za1#LgGJU+ihjwm-Q%=ayD)0W(C*1ArJHVpgqDxdSRPll99rcwn z9(hg)-=J=_37qoUAk~$oBlua1<(4Z)iJ~-ElHx_KJ|dGjqtL>dPNzB&<1xXjUJb14 z(rikLjY3>m(})Frf)tBwX%tqU5zb}!^b!x5wJ9ASQanIci@L!)UYv)jNbbyf(%eMe0`J-;JHyW6*3 zP?Sc0us@^SMoSV?yqsZ9;h%ylZUz-LB?VN9BAhZ~^9vo3P)UY*~69sXDTCZ**M DxJ~32 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM new file mode 100644 index 0000000000000000000000000000000000000000..0dea728944e3d9163ea38b3073f4112c9d467ae6 GIT binary patch literal 465 zcmb_ZF%H5o40IwPsE}Y_Wr#$ERsyMY+BC2*F!O@ajaNYXBObzMcmtdR1413K?u0`rS~Tq2)A<_uE(Aosu6vX;d;(A40;D;o`yF%VTqY>ND0r+ZN|?D| zS5_X-l_1N8UE6u24Og2jB)YQ6i#8ji`})nUK~KKt5OoMmLdYXRG)X;SlEe}Ibp7o$ z(4O?+i023CJeP7bP0JKN!hJRvXle^%*;r?634$UWf)EYh!<0`Sntd^its;3W>%yj_ HLp1dQanf5! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN new file mode 100644 index 0000000000000000000000000000000000000000..43dc62fb8e0be5f9a67641c5bc7c13794047cf19 GIT binary patch literal 13352 zcmeHN%WfP+6z%rdPGUz8358_A!V-f>3y)OQ)lY=*BCHWBB-9?U@fHwUQo|SV11$I& z*6i5BIrmn#yL;O9;0F+UqO@nGx}Nua?yX<`i1vPpqTLAp;y8}Jdv)?D{@cd5MN!pD zpPrs2r)Q^UzQD(uYUM3HtXcWSro|H9ixv8xp2?p#=_)x%PJC71MSfhYJenJ~$jcgC zebpFzUDQiXl^@qDEV_^95uV3*p5QsabBO0Do*g`Uc=oZi-KX4^;d~}t$b6WwvDFey zrm>h6zwj6PO?(>q$!b{4Vc%?;?CzUxLJUQ>jK^R4%9NF_@tYr6B4m)A%dxESX?GrU z;`|0}PWt&e=d#Dysy}0IGLA4tDBJ7GC2i_t6RvUj(wBMWtK4$k@)+dDxNP{QTO0I{ z)kkYPcCfx|EU1?F3_ly2FRgcAAsTYN=h()TOKtSI^mnAQuh~2CCC9lMPQGPFMyh3Ork+nYQFB?^>|}6;Hq# zk`E-$if)V$d0haNjdF1A2#0XF&uWkEpaWWpO3uYkrHE~0T@Zm(0u^Kt992daO-8Zx zCB|1x>M)2@bJP+vXN@bC=&MT=IADg~TnNil1{6$n(}^!+m|cLgAYkfrA7lgRYb+>I zQdLsy2k)=~$-xyCy2QeXS{B%a9zqsXKHw0p0R1sKUyzrWD4ak}jfpC3l|8^z^iYyg zdz=^nncDIdx^i>|2JvLFVayQ(!Yo{lZ4Frt7K#q=9F%K(g5|Ub9m}Z=9m~OBRnv~; z+3K9-Zj$8~qk0A5NrH8lvL2n~h@%5*pix;~lojmT7q-j{)s{jUcHDpqa#o6Ulh;eU zm-B%|sSuJUM+<}nqbi!M7!S=9z8qTDE>L5I7dSWm(>&Ou@>N1Dhd!V$cSZX~+lGM$ zm1(zzafcQHA-a>d3(zK_-(y?QC}cSd^tWOHEvE#vYT8*fGFey#$}j5$ThW;)Pi=rE zi*%_rPzE{$=;Ti1pQZQD3r?q$4BC3wRk0C;%J9|VuQ8ce>LtQ zMgR`f8%z>K??z8vLBQz9lW1pd(KL(RYaJa;1E}2O#WH%)Hd6Avt7)v|#mmu)ynBPm zCT4#w{prU%JfRv6n}+$@=Co~h(I;(xO1DwV7CZ!2QfDfH40iEI&v+o%r1Nv_&F#@V z#jCxTzHH#u8%sOLsi`=@i44>R#&X~|T6HP=enJ%{IM}heY^*0epKzI$n9`5^fH?Ne z)Wcn6@+AO~$Rw{3m?T2n_?t21_#6I>jt24p{bekL#*UZ}$_XnpCg-{x8oA*ApDm)% z+>qAdbS`(WHvT~^K4>SwWlPY`u#?h!Ie05^(ePPb^K*&tjtF4FRHtCPu)Yj1(Wrm;t_9MyQ8xfxON< z9NuAm*#wtgpQHfX;Op7D|JnND@Jvdq1~8{E5I(jIRS=8@NNzIFQWFn2j6zhpKSQ7h z^a1#X{E2veMW0G@99rUAPMK!H0S?eFm9nZf8f1hnx)p+G^u&Y&d!RfC6<{dWMh%fKkOc@I&hIOdz2e)nj6zKxPr#zMuuYqcGC!XZ~_gb z0HkGens(WmQ$_sOfaRb$<(^y&>kA;bvWiB>)gtSsuvBoj)4T+>!l zMp*yfbcVsNT&yhwj^Z7WzY_1*cZ~3$nz>;wftSIDDs1i?=x+S913y#HhY1*1TuHyQ zC~__7f(}g5-Zh5ohaqAFm`(f#C{mIv10<%5{PX6&7^veqv#S1n!P|x8cvPK&{?NQhJgh zp-j_rGyNg6=p|ViBt{LB3Qcm!8-!3$HfB85M@lXR^Kn{~ZpWt@CCuW@&h?w9G_Js4 zNh!jgS6ox6#N#ptqeQLK5APKK7{Xp~6h8Ww2=p=r^D2nT+dBeCo4{Bz>k=*pgwza* z`?-uiulO?~kdX*l*%zzdxQur@a?}caRl@Q!1+;eNXJQ0;4CSSiUYZc4#k%8p;M|2g z->FcF9AqJfM7@CXar6i@%gbtgdwo&6aP+FWtj4yOyR9n{ zoY2JrUi5FOA(ReRd2U(EQRmv$74N35C`N$MNn1eDOLIwrt2QIIelHWF+nnfS*N|>Q z!>0lEHYa*{s5MPB#Wf+PcY8Te7=hXE59OAq&~TU-?O}*M_UM6!K4#s*+_wehZV~Pf G;rCw3 z7VNO(#2L@L_j#PxH???HYOXM}*2=6m53Wu%^+P`t{jjUYgb?>b3bu<9=|<$9VJq)E^s4pMKG~#d@xxPErXUTUAS!5Tb|MvO4_y;{T+dd-PsXLOpc9?-( zbjjC63cf*;prQ$nTUrMzk@O|2*oZ9tr|Wh8HHzt_7KT@*!j@JuS4&RLuw%|>#^N+% zUZX!+&DVwttI6MODR)B~m4_NEVUCpV%=%V$mD0b-nAB3xIPYuEqt}z#BKvQX-A) z@x0Gu=KX_KuSE3=5mi-1efRV*?GHI{zdyW9b4DJu9j1iT%-JxHQn51#HKIYR5kjX< zD~^5$0=9G3LT0c%9i|Z4IqMh`2YX_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU new file mode 100644 index 0000000000000000000000000000000000000000..795fd072187a2a76c829d86c3c12754f5b442f84 GIT binary patch literal 642 zcmb7>O-_VB5QVE5P%;yZi5GCe0?bT8|1-03;TdK&4LdHO!i~I|XV6!TgAQ?HCk55j z-+NUJ?;n)C5+yH0B!r;H^63!N&UZu8_HAFa{hJ>LRE+PCJLKAMW=AMe#1-Nikt5cK z1i|$TesqGJ4oY`}3C+G^JF|remnCZ2p%FH9P_`R<1Av){P(khtE2Xj+$WLb$df4-t zTM5d&RN7eQ(exgMw(SSUW5=FRA)w$P3AFv8^QNxR(z7Wed2 za)_>tsYQ1OTw>~xT%2{D5>zl-%hEt>2Q6u}wUXY)u~b` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX new file mode 100644 index 0000000000000000000000000000000000000000..bbd0e4d82b5c895516baf88ec215d93b35c3ea18 GIT binary patch literal 851 zcmZ8gOKuf05VVs3c@fHrBScXwWhA%%MvAgv#|e;}VU<%r&pEgRSK|y&<;NR67^&s9 zySlpE?fLo3y!mF#<0E8#uDa717~I#PZNz^bJy0K@=&U#qBT1W*oB}mJEwi({U|6u zVI#CvGxzvWrAEeDrO_dsUwHHvyF0;GHxdF^mY%WN;m5z%pp>RSw{SNJC&_`j@yq`dL zSm(SGua=k}F>Q%(5_Mj|IAuK_TLQxU1*|7$?Xw)CVP zI9+q!Peo(QV!84Dy^Rhmyw6jl^?YQAFB|)mdfOe|C+abala6F#Fw>Uub8Siext`4p OOhtoetjAa#3+V|`Jx7%Q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ new file mode 100644 index 0000000000000000000000000000000000000000..686d18a65a69f0c27f86d0a6dfb56c9ef6038648 GIT binary patch literal 818 zcmaJubv*GYK-&UW}B?2H`|@-Q^4fcQucsNQFGK4szhC*m`o4g zDzJ2v%D5(Usg2U|Y@*bd_hJl2u>=-#C6#WCbsh>Y4idr&h{(W6L}PLeENoXZzwHwa ztcbGlUCMaQ+oh-{%TxMRtVK>5H`-oYvy@UFXOz4y4=xZr@{uS~-+Mo}w6L^a|O2yHVCeN?Mp{eV(>>EOTylXMZ!q2yK62wm+Hb^(6Ys%^ zhsZO)@2mN%1)nCp2^2VM1?A!y#UsYA^*Rg5yu)Dr_-EKp= zEopf9>YFj9oiE)``sxdlt80aWVSP>R~g6h##y|x5LR~7`DSL$e%Ej!YSh+ zJUH)14HEIYHDy$Yte9aEl7JFv@R-g^u-1qQRpY>1pI z$mCr~wG;xo7A;0UuLU>>2w{Ow>cL;7PU&dV$%159!FL4(y3*kyf0jdCREU1GHJBvJ zs)b=Jz;VDr>PT+hkVe&^-M>p^oUD~WRaNdh`q0GGb{voI11R_x$%57bSqH*)G58W= z4PRp;n3@+1Y6o;pWa4$E=<5 zy&NUwq67DD2M^!pcr)L4KF^k*QBkpc4u8S)l8L5W^(TM2;jFqZg9m`I!u^TPs5;XrTze(m(p6QgcP5I zoQGj%l|-1*$4ac*eES^}!ELwJs)ewL85GFD@IoaL+i+4JX-? z2Cyr4;x7YF&Sc&}+s3|b+)2}9_kfQqx8^jiPI13?x^X`&DjKDt=uVT6jxit#aSRDr znuU|y8EFv`5-#Y3?H%%+gC<4wOPBsXc|)o_v3L8+LijsKY7*ybs|BS;MDIM zZRN!hPgCNJ4%JcOH=_yO0)oPj@GoMiJBcV7qdO_2JrwNhxtC~yQMZ^)iNeVw0w(?v z_3F2SC?Zn*Ds?6TIEClNR0FD;)KZKD47?f0XRkXXn>Lw5xSEr?v+V&FS@SH?r)VR&&FO&cyGezEi(lGl|V?^jM8@eucE7^&;k_E07A zmPU94sM@D!RLm(#bXI{nfr`F$49|o!1!_aGQ z-^cVkv}`Ned2IZ5;5Y6O#@^0{dv0xD^g1l6=D4emJcBu*PMtE+y|H8D}#Gi;H(SI|KDmhKEegs|547S~j6w6LRkPf9yMlB}2C& w+MbR3#_~ZL%Y9GzpY;?(VDtMdC-;qoA3sxbxNj_bDZO)J(Qkzh+*7K*02#Ifs{jB1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ new file mode 100644 index 0000000000000000000000000000000000000000..c4174f1e2c08c499b09ec4e4882a064f16212a01 GIT binary patch literal 345 zcmZ4UmVvd3fq^lA0Z1@1GVp8ITN%Zq)R>!V#-vo6)q;e9m;;DG3K+zUfC>zwjdV?8 zYs{lfOk+XHOhL-PfRTa2$k5o#z`(#5sF>Z{9A*ei*4*5}*wDbh5M(F=<9{H4%Fv1n zc0Q6#V0*y?+;Rpc7cZd5Uj`-v1CR_DFfzz!03B~stBI9j;8rnIP%%%sLNl`LefvI= z{P{)OccQy{B2r4xLoq|H$J0kVa|LscDcJGw@@z26IQU%4guYh7kkGB0odLVlU72ic z9!);g7VzaF_s8R@B~($&SYocaxtVJGMbo+}DTFt8G_?o?d111P!Zs0PzxakEiw%{%!{)pG(eDWmKPWxnQn>U zi9^gV%feT;ECAxKP{7e?9Jc4fmZ4~G&19_e0k=`XFmlGtMg&5VmIE`wxd|qB(Jby{ z&gy*Ruz?G6CL_nen-*g&p>8~#6H|EZ(kS{@iPE?x+T|NGUr=VKZ;WLp|NoR9?@CLQ t<*~}s=JgGgfi~mFhzvzf2ZT3g{pUiD{nYiQ>uuLN5EO0YM_bq^`~c>Tv#S6A literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM new file mode 100644 index 0000000000000000000000000000000000000000..d6b4f64fc29358f65715ea6630c77831657a5988 GIT binary patch literal 730 zcmaJJ5VeD%NRbdVH7Vj^CI7}B8X8(o;B2?2NQN768IHgKI0L-#CQ3jMOJ0wy zH*em&*|$%%+$*(sS4wHE)&2JAu~8X!({AFNGFNNOZaU;w0bs9>=L&EYfIx!BCgPL~ zN4YlZMvl!6o`yOaCW|wJjdt7pFEhnPwoiF2bNgC)2gaB|HJ zW#nverhi$zrz7h_fhcP^1dfrrP|lf4F(^{e>LHy}LDsrh>m`#C6y2i#KT&u;p?W)C zSQ3aWA0&Xn(q8Hvs8oh0P)8y_N6GJN$B(2FEa(i(ig>rtlR z+G~jQbJ9SVMm1*kpUF4yb+kL_!d$vExa6DbW8=_#Kw`vPuh~T~Ld?oVMymALh^yEB r16-gx_-BS%JiiE|y0OmT(DJ$4LV2EtW;X1!TH>eKI7yus@OaVR*M*%k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO new file mode 100644 index 0000000000000000000000000000000000000000..8d9d06cbbbc1b25f313749bad64b56dd26d2d72f GIT binary patch literal 1001 zcmah{J&qPJ3{6;}l~zzta0jLs$@y`Tp`oFmqoT?;-FFJsdm|172jC3wUNXaq6sY;o9ErOgTu@LKJ%#=2YU5>tg`u{3c>N3`WW%{}WRE7Koo22)R~?mdtUqyb?K zBo!dxFYWNAN^Is$OM^{u&Er;ZQ<9;GuvVNKPLi+_=^+<711il8WD#F*r30+UqGTM| z*8)iGA!aauNCpwxXQO!rN8S6ZZo*_3V&|E=mU}Z7aeLL8c$=Dpm zp=Z%^(ec!nJsC`MEJj;nCTAE|UWmVamkiox2+X|~QS%fLC%{=?b&2{Jy#p%Mf1I4S zbU^llktXS$cELxbk@tK7OZVXQZB>@eCOOf0qb>!t(FsLYRm(MB{9jip*&o2=C=Tq;+RDaBe@;@SCrR;TPlzj3X8@&Et; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC new file mode 100644 index 0000000000000000000000000000000000000000..726b61cde515862b92407e9f53d582c803e07102 GIT binary patch literal 759 zcmcJMJ5Iwu6h+@Sv2ch02?=N@QcPh>u{0n5hK2&M0BXlwRsrK3u{GEN+&6Y2196F^ zH{WybyCc7UQ2a_1eG-ung6{Qh|K_$@^*()kXiZ*s-tG1oPU{}b5|yAwH_*UE8?MSGcoPjumf*2uDk9 z56_izgIx{3TiqxXa(dm?O&2yn5dl7gg=)>x=U-k5dhTssnJT*dAYU-ryPl!j)Eg@2vA7BL64gqhzQVSBq`hHnmvM z)Kw6Vkn{B1QJh2-*AG**{Df;--85Yz;Av`Ts8Iqz15LsMf3Ys~1Hsjoh$QgUM2A^8 zYc9qzdnW=VtGv(HsS~2&1M#OY(}phsE)0&e5ljKkATfo*Tq+y8I=~L}PYAO;i%5=> zXT5i8!B}q;?GUAALqgSWvSF3*Gm_Dg9MVMof+mP4M6R_~SIo8mMk9R z`VST_?De~3pp}nW27(byTxw|~_67A{6Z)`Ta)_nXduW!&v`TEFgQ7e>0`Xn#jA68_ z3-#e%LOUL4gStH0+oOYXr%dr^ZyQavM&7Wsr4E>UGdSsuF{GByp%3fYEzN1V^&_(}Z=9I42+ua7(yTW%Hn&oPhYy1&3(w7&d@%xPGDb3fV9Q; z@ZOVd-}H1QGFQSdhMvdJbD8D~f64~kq6MRu;CSRLU=UEtP>VGWZtnv)?{CLLM31&l z!mNxx=To0cSCaxmRDGP`VDPajhDIRnaKUY(-FmNlt?R literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER new file mode 100644 index 0000000000000000000000000000000000000000..9ac4c6955a3d5c41937d106f80e7c97e97f91dce GIT binary patch literal 382 zcmcJLI}XAy42GSewuq5|xe^^(38cJJu`qD~)-+qMz(Ug-aW&2Wb|?$5@=Lap*#6?= zc8B~5z%GD}F<5!wy3h}!o#+IuoMVA`*fqz4AoD^R+lA<*4m=tYtryycHg^5c4=n;T z0Z0TX7?hoITv>^f4H29ddljPls>g=X38}QP)C%l@qD3P8XZwl%aT{c(Gmfx@jB_k! ivwKyp8+_zk=9*lwac;;7(2)JM?Hq()f1w zb|v}v4a+Zp#RmWgA>clmeMn7v@I6;(u4ys`$6y26-RlcR-22qYD2dv|It!|%ZQ3pn zYmlO{kqq2^#`HG{)q?>?rqCb>?a-^&ryUc>PlZoS(1Mx%S zbPe-Q0V^Y~#pcx7<#(T`bFaLN4WW4Zq{=fCh>YZM1FIc1)qMp;DXAo25zsJ}0XqSf z(S;NkdSs32tN8|ZrQDYFwp2tBa68;8^PeWfdXQZ<*qmkCQfK8d|IsW2DE`q*`~qda BtD67- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET new file mode 100644 index 0000000000000000000000000000000000000000..7988307b136d6887d5c57d34b47631367a8cd08a GIT binary patch literal 936 zcmcIjJ5Iwu5M3uiAtgon6fUxbrTwo>Lxs2io#QU2fXP|709WG#6!6|`0145ulI`{Q z{bsUxeKS{2#;jkAF$DtC_IP@(XMV)By*xL7u5J{G+w4OE@_3TS zH#aCzM(!3XS&Lzyns^j*#okJ})EoNygYw43S_uH~@_zPUNC>JZF+wP%*{4z$DFt5( z2x>%ZNJCkGLJ#Be1I!tW3qBUOO05d!b{riXnV%O_+>i?C%n&4Ji%L^=0RK+1A012H|kd+U* zZNnisQiX#7TLW+~70wA&frSAX(GaTpK%N zYQ-6`JSB;zgo`I-)0wU33Nd9ItB2~G1_dymY0fyUq=y2s0f3mBDSqKvWh^pHRwf=U zT9hvfcxH literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI new file mode 100644 index 0000000000000000000000000000000000000000..0a0c7a07098347f590a29d7322a88358669e641e GIT binary patch literal 1485 zcmd5+OKub~5Va>vW)cVji4D6fMkp3;tZyDh(i$fhVyU-PQ)4DmEAMR zKqRt>L`&|EUG?6pS9X8@sn%bWdZKV?t<}5CgY{ud)2GijZY~iIrk;5&S8uN~8#hEO z6`N^rVMtSlfN?HJt0}%8XFzQ+))=Q4o8|iq&vT5Y7|$?-P`&4Dfr#``7;PUa5vMv+ zvJo-+<&vO*NXR6*6K;bHKndA>gi5P3wrs5PA%gGHB^Q=7smP&@aVnk!%Qf-$;fQd- zatqW5tn-nmW>p0z2)J9SL?fWZBl;qTIMoE-B(IPlK8Y_991g*C;ukJ?!IIn_`l;17 z(^R1=fzUDWRVYgo_fo2o{akz|+nQ$kICsTRHiMTgqQ3|Y6k1A-aEOat9FMI-R7{d> zkfstrGkEF9t%)KU(zi@pE%>vHx~$cWAyAo2#!e+=>^s5WWgG1EgCV5`4&ndQ1~nE| zFY22#)U*^_w~drsCDz;O!$*kyqAZe#t~{!d)H~T zBGO6|D#T5$joMs^>2s%6JH~`or_oC*v^t?W^H;!jZ~t*fxP!4`!BQ^-+s<8mNaxgg z$Co=(d0tn+Qhv!eI2}x&Oc8xP;MRQ8@@2=jeEbCTj|JqFlw8mhaR3OJt-sBGDa1>D z=$VcM=y)KyKwwqr`g9!h1}Zt>bj#uH+EKTdlYIovdhbd)Aj#Q&fMbv2%ztVMekspc Lj&KymjCA-n1sNsm literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ new file mode 100644 index 0000000000000000000000000000000000000000..303845b68e600d3cd2df8a7e2a0f6871ed8a9989 GIT binary patch literal 482 zcmb`DJx&8b423-_MIl6@qb9`)Ws8-(Gvk>J4IKqnm~59*klFLla3K!C8Q|F@6oHbJ zJUJWyP%-JUwG>ue4$vYZc!)YM9LmmWFP&_{A`H jy2ZJpMLTR-Z$__A^T%kk{`ORI0bCidX@fEDr!~6*vJq*R;Kf<%Cr6^KD{4BS8|6NDT@n1R*U(8$;X zD9ssdY6jN`lQacOf(`f&1W;ih#YhV-*u6+bgY8ANoPo*B8)*9%1||aouxpSB0DUVn A-~a#s literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM new file mode 100644 index 0000000000000000000000000000000000000000..6fd391e565c4888edbc2093e76078dc671782d19 GIT binary patch literal 465 zcmcJLF%H5o3`LzvRW~+vh7Qeu2nab%?&}L)2&^p<^Yt@HeFq zn%X{~S6dfihdNp`(P1l-fX7DX^|oUQcO?WRL^c5xX;hlb&p7=zPCIiFS3KF?3;gSu sZ}>sV+#D7-6o(@~af1ReZ!>FFO}>##$xIT;T5W30H36k3>%yXi7p7Tdz5oCK literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO new file mode 100644 index 0000000000000000000000000000000000000000..6637ff15c844b6f1ee385f19468211d88431f9de GIT binary patch literal 445 zcmaJ;F;2uV5L`#PAW_iJP*5Oo#RVzSt`j>p4aG^<@&LzOUID%zQSvR`0JFX;aspw= zR$l zvBL=PJ;2FMISJ&710g2ye-PwMxCxxBn@+=rwPs)o3^X4jtEvpWgRbkRTx=3sKjOT= z%)G3;L{@E$K;|3k?D6u~&@D85;(qYCgzzhoKPCECrQXwONCjUqs5!jC#}hTo>HuR! l)36jo$gHC~rJ!}S!?pTjN6l7hVN)Lkop!t5Kh$D{{s0~}QYHWZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR new file mode 100644 index 0000000000000000000000000000000000000000..3d3ebbb4ffd2da92f80aae34d7e4994aca774302 GIT binary patch literal 886 zcmd6kOHRW;42C`F0~JtDz#^5hXcrOl&I}t?Z~(+^nq9YC046u$YMcRVPfCJ%0V1W7 z+P}Zw_I!T9>K$P51^_|`xK65#{qgh>28!Uj!IyIIw10fiK1pRzkzGWkark*awI4EO zlQLMEb&{>?NMxCo9R>pHI->F;V579L&UYaq{2t3aA!Ms9iVLCs$zy-yF!zSU{X0xJCWMD(Ibv$25iNGfQPJJP!CD34( zOBh$h_c}9R!e0zj&o3C+K_w;1#rQ*_C0y-!RR^dVg#iJTl9bs}+zf~DfK{XFMzcbY z5bkCIU3Aj{H!QCkQ#ZC01p!N0vq_Dm44w)IHvNO`th{a<6V`aQUF-!cBvSyYf6#>Z E0kedxR9J@5h;I|)L83kM>v z?48}6iN}{KmTy4y0>Bu9`{wB(O4#>@V^VDo$5S|`=(ZW)kzEyI#aJ`)3^q};*Qso# zlEGTkdv%>>(<6Dgq)?@O^pqfb3I&v{?~@9Jc7Z}|*4@o?2RV`k=?ZC)|KK-PxS9V* zk+1ZPx@0q`dVMDHj!Go=!bzipB`L^YVwm#rlG)h7hf;41Dyx}xf!l^2Fi!3~+i+vG owyw5aZGBN%7Do*hQl{^I9UH-)(xZp#sRzui zIqo>V;&{s;Umdp`Z#eD&y8Y|@FF%L#_jZT*EmnKhXW$1F!|!pqE4bBe>!uRdn^#Wm@YxHPVr1Zx)_e6Z146|SOg z4Jb2TKm%GSu-Fu)bCZZ8W=hFxoo5}aSdLgE7oUqFt+@`yM!%V`MqycH(RT$PY7y6v zEX*1QFDn9cfvccN2u0#vgrrari2kN@BS!+*rWb zlocnQV-W@<_CvHJazi31nQI%=M6r^>E~2OkGv<+KGpba?w1|L8r&MJJJ#$lrW1V`O zkxooUIYCv;=B*p#SdCB_dhPNLSW_A0!f>tVE}o6>WNxJwT;buoEjvZ}6r0iarsimu zbPADy!9sMc&VoI4&z>>KtHz@%)tKr^R1GOpcqJbch13HAjxq?;G*g3rN(Y_u!CKI~ zLC8q_oN;KzffmSQXHC_#BZja+s>-tNX-R$hLY_&ycJ(6nSgIXzvmqb~osEJ8eXb@K zYU<{+WumeHOnL6TZLg{vM(d0n?Xwz#tfIHDxM+6ljU_mbcBYPzGzKCvZz21=t|cl* zMv?ZL`dkWVUWmUoR~2Hjvn5W;SZmc@@z5i$Q>N5y&11jBrL0BFQdyHtj%>>0tp=i~ z0Vt|zr?zf+G)1w-vz1AbSXW{pER_^?y+D>qQ=rn5P0_k9$(lk3jDloP1!JP<>KecbiH_!C zPG4~xXSinfFU zy@(PDirPwgg^7TGbIFw^1xw|S>_;}s5x0w@oBrdc8{V$&u8B|A+xW8t&Mw##cE^`C zw7|KdzuVM+!B$Iz5<}qn(Mo7L2>Mi2Z%}%5OWEcX6HLR8B<#JJY@#+23yhbAN|K$4 z^_pDGXLa8p62%x;MfP7LQ_7L3<#-{0iD0LbChqFDUwQK6uDr*5@{_xI_+xVSehXA6 zdYSWO^7VT{Fwop1kH`Q3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD new file mode 100644 index 0000000000000000000000000000000000000000..b3057866dc88a7cab231a5edf9247616dd95c2d1 GIT binary patch literal 796 zcmaiyO-{ow5QS~3s!}Dyf)#7Js27p^Gj?n?Y>+sF>s=-8K&Ln2QXGIYz#Au30r6ug zO+9(z_wr3%-qiA0sl~NYN^7ldw)b~52Cgx;-F~;{Vy)Tj593h;xYqN11-W{H6b&9% zsCMv;Q!(62HJ8RY874feHnq&5#sNiwk{ZVvv4K^whEu31V+U=_oXK#umP^RuP2w#} z{8w77;p$UyJ`gfIP8r0;RzHk5)KyF3M!?>C4U6$YwS$nidIVS zsCIJduOORV#ekyV6or{tjNRB0P&s7xrtK;=Y-cB({K@EE7O{qCW^*Pq&WJD z^STYa(pH2o18GQ>%62u z8h^9IDD0h+pnysN5lqD`I8h1Uig3jmxkV@NB)Af$gNP)I+OC&|pz*Bn+v)_3Jj840 z5gatl5Ge^)VlI>`qpguWqO(rxSyRs$nkR>Rz5T`${uiNm$T)nk9* zSwjCct$D~)XMGLE_Aj7qruij&{cX7^r*OP3|02bze|$1#{llz?fV0b&LN?~jV_z5d z=a0GH``te5_ECAwDw8#9+Iv{KZ+0%&v$3QQ^EmOApIME*LgzTzRS5=z zo}}sxYs-*iZ*#H9^)VNRmChx|u7m&*-s-_PEm*_Y+61j^G=m(JHlRNM3R4x`s|BqA z3%RQ{E0>L(5fGt{glnW?E6}*pEJ4aDvB()<7=kCfVNe6)iUwlkr*5g=_~L|C4peKg@S9+ad7J5VaSPh;1k+Xpm@9WCbhv|Dj2lBTzW*atfHe4JB9O4DiOAgrH#U*w*aK z``G^c64!4+bRR+pDW!N?Z(g)Znu_&t%yqYax6^<*OqAM!0<2~lHfXs*ED<+|9w8A6 z0Et@$DaOwbemeX+)kx8Eh4CS#jQYn2TznDK$!0K8*1G6enfy;bNcxC6ZLISFy$?wh zl~`(oNTr%g-e?REw}B?kw4R72=1T}y%;+n{qDET>%19NZ0Y+&~F+bxv?}FRy0oEbd zG@D^D`3RfXzL4J-yy0_LMwXM#{Wtx;EvWI~zZxG7Y7=l?V_>ntQSfFy5^5<}A5E%c zaABd6b>yJmx>(5cbiv|0L9(0x|p*E$xeKbfGWZ9!{ zB-oX8X5;~Pd9st3S7u*BEEcIE^@&FYWnF*t`;%4hzb*&od;fs+J1v+|rlyxvEa`fO zO>={mPdjK@)n;2;q!eA1qn3kiY!dge*PnV-P_*RQz_k&S9f?QabpdZ{SJ>xr7ehJ} K$tC6bs~5apP`$lJ%#I@!Yd@6D%= zCv5Hj%mE#Y!6Cn#g?0wZMrqsiuH{A757p>#@|fH+;W!bc5oK$gX_Td#w#0Y3>pz-_ z4zWbRIVauDU{zD$q4p&g7*U|C2;M5bv|BL61LjlqBAefTrqoB8u)s9>tcj)iUn}gn tYUQ!jX^SfueP&{!W;R@Nq7JN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM new file mode 100644 index 0000000000000000000000000000000000000000..5e62ed5a374e28ab915f87f7d544b2c5672618c2 GIT binary patch literal 453 zcmcJMyNv=d5QfJ{DZo5jws&df8w+{Ul94Bm2;YD bX6R$rp1|ss7E4|4w|zj;P}e@`Rf+8vvIJz4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN new file mode 100644 index 0000000000000000000000000000000000000000..a5be8c84397409e6ad2828ee42192017caaccb31 GIT binary patch literal 490 zcma)1F>b>!45W+(NKkanlEH(AcnBbhvXpcw(4|{HAZzn0TKY$QRQrIup*^YfQe?1z zqbQPhCw^RM^G0O82*DWIN9V@rJRXx?0_;%&w?2XIIoh}W%Y?q zGMr-8A+cl)iO-j;DV{UyC9y}+E05E!tS_<#D6&YlVx4Cv9^wxnS!jj4*q6C#ZD5XCf%hFbM>p?2Y6*-Hvj+t literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP new file mode 100644 index 0000000000000000000000000000000000000000..3c4e10e9cca020f65ba0f85845bf27d4cf1aaed9 GIT binary patch literal 705 zcmb7CJ5B>J5FIa~h=Mo)5-GOG7AuXt{?bs=A$rFZk+=hKZo~n&6lZ`p&L&DIkg(RX z}{^x=$ifO3{7b#GCET?d$sSAv<4E%`uhDc0e@j1%|!AmJ9R-luIxy zJL}QMQnR)t^JwgtN;U8#I3bCn%hTuroQz;g!4H{%NFb>(G|Sloz1bdkt?;&`XyFnY z)@HJxe+8>=^a8CKN0W{4OsMV3P;JwN4ys1N&nzBMommSBB=KlPP>?o(lhN$MMGPF)@qt)(|SQ_5}(7?g+T zSRkz0AiBNymm*W}hw^_{Z{P8Zyh&;1q=&kv7yKK~)G-6DW+R}E?$#il_Jh34?-wn5 kz3R=XpH{sET+yvGfMH{5GIT{(+-qe1Sw_Xv%~n?Z0H?^6CjbBd literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ new file mode 100644 index 0000000000000000000000000000000000000000..3f6a6da63213c8d1e02c1ba9a86641fca3639e5d GIT binary patch literal 468 zcmbV}F>b>!3`Hp;2AU;6hOR{h5Ak3?7A?o>(y?=A*_%(1NH@w&a+UzSLHo%7jWc8^ z0m(4={{N74zEXK4G8e*T481w$#`)CewEuYLaZcW+IE2a8=pM3ASZgfdsbP+`aa|Lp zagJS&{nX{eBIe}B8M1iLDf+4sA+4F&hSqThlPze(B1(CLFF*_g^F6@LU}4wZ?EI1% zti4m=85RC02{1n>O_C%1_gC*@Ay%tLKPo=I(D|mqTA64S^t#7oajqXf^is9E%Izu! ZW~hvg{UnObg6nflrE&_bBB|JpFQW%Lrv}%-kNoK2;mbbUd}BN2K!%#v9Bn z<_+d8rf7V(0Gs0pP(Ime4n7{r)T)aU7I|tOAx$l?G_`~fP|k(rGL6kG3XR+VV0D2d zCrtd4fpo6M`a_&r;hIF>5wVX$9vfgg#~mV;At6tE06eVlYGrFc$p8`zixmw<;Nk^` zE07$4)-TBQD2``@Gw@(c^iyXCSc=1KcX}QUu5dhhvH?t|!KFW`elQ^6t~VP+!K9Trq&$6kW}# z3_vec^jQnIPdo>pII*#<+BAh0q<7M5?^&Dw`tK6EPx`CZPWob#wuZkLtG}1aLEZLE z%p&Ibn${AuB;DyyjL1H9_52Nqdv&EXD>63f<0A~(d1UaHpx*Dy!_GeJ9AJamSkn>- zA39i^M|CYQ!92+ag1)fmOSX^4lShxC^N>P}h|*T}z;tGvjUK2hKHOqp4Y2dd$6I{2 a__BzK@+EJfplg&P64|&;tbq~mNt1a5P^V- zk;Wc-zW2uR{z&{ThZNMTSE&ecuZg$VK;p2=4YxblNu z#8*E~5~>dfF-oc~O@oB~Hzvu|Zt$yA;}8dl_|tKlh;$hwA>*st#9Ua(1>z$rPLd0V z&d0{gz*Q6SIAw9w*pw$+A6TX4hA2d^5KaY838*;8h^(s)MNroNoHmk`>pG2YA>Li7Pbu=~g{F zvm2)xny-^+*f0(Ur$}`4XhYli9yq8y4JtXIQj?OQI tJQvuTfneIwfJiAX6$_ov5)YRBBB`Q0sCw9Z4n3J%-Bgh{U;T9~PEERAi|qYH9#)r`Jz zs7|6d&76Rx(gt>-srF2p=7BvD9;oet5Wxu=acrCt>V(v!yI*=&X-qq7wXx1)gc0gs zsy4liG(rOEfZ;iwn{v{_Rf(v}TH+uR<-!?WYlv)aoHLhltpaaV-O5^iw$ew#T#^GW zOCt4!vjUf)qJ1#o@0*b7rT^9T{r@W6$(IV+JiXvEpXo+xBTzqz?oNH$L7ZO(+8)i} OXaOqP;1uia literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK new file mode 100644 index 0000000000000000000000000000000000000000..3520b154d58c9f8f5492ce6cb2b5ca92e2ff1376 GIT binary patch literal 1559 zcmZux%Z?K<5cFiTkSG%3g17+6A%`6)5q>|oEJq}++`PH%SAZk&DSQCG#+f5jwI`2V zWhBRr-PK*Lu9@F|)a`er<_ga+4C-U9dgtS=>>nO~#BDmXf`#Ye?*3D?yR?@bcNnps z4uHMDxSi&gm=_pJj1>lxs-HkwqK%Wh%~mZ-q-YKYau#CQqqg;kXUDZ?{j zd6@UDhD4Sv;&0fGV+%ag)evPs6$p~_BspM^7#0g_tn(oz-1isLVGvlF^<#Cri1IAq z0ux0>utJi5SjGL=(zNTr<6Iw`HXs8ua-n*XOimE31k4#o=Cgo60372_j4kDn6_{6J zC*cY>V<(8nBq)OPJ>fOB!bD|KvN^6qx_}ir2oAZFNdVS4W|^*qAlL6ifgOtnM4@z$ zK8Oe8Za(Hy8`zP4he>Dl6aciL+L+nEb5gX2H|i;I4c0*>5 zFb~gL7f!8Hi>x(0dJLiE(A_1rdk~!WzGw=H!eT3NY;%~*)*nX1)3?vPE504n3fQSy zrhC-z4-Xgg^k;g_ATij=^~K=0V5An5)Z_9rch$~w52mM#`no5xnMh0i%SwOgHG`q4 z9|U4m$Epq9G7bhTO?*IOb{f{9WvFSY0U%XN^B(Ci$;8p&tpXP6Cwv5EONsIcr`-!l zB57UvgVrSpSjz$%-%-vxm`rD5fnql>=%MVvE=z1eyKy?G1GJ*9w7Uala&Oxml zy_o{C+>gFN>RB7F62RV^9u=_C_y#t`Sc7B9w8khSk5VCclt{MTJ0D`onEbAP8~9gL zJAw*O=ha%jeiX*Y2SGRAuP`D1z{82?k@}b8PcEVV%@lr`yL-sL(`2nU;bo$WYng;T oZM2!4nLSF1&Q5%9XB-b-sb_ zOAAGOB)E_WO528~g34|mJ#K<@X-=dzr3%;4m}qVEKDNQ~9%adWO&{B4+~u@87Fo4= z=!>?i$p?&-o>Y?u1OWFgNM&p?$iX0F?4TXj8cl+5=49frS0uji90Ubj`Cu&5lDB-% zZh(?|GjvM%k#m*`x^|lR{Db*)8V4ACWi>Z!hBM1gaw$72&7PhCd8e6_fQ#XaK^fg{ z&`bB_$*b;5$_uqF^tz}460}HO2%5`6p>W4wpiVe?`D53riRNq!h< o=u&S%JR2%^(FYB)FC~ihQpOU0C+m-ml4;{;|88_#pRFeG0}%bLeEAZHL)U7wdTPKul3!>{lkHH{8 zR9Z^TNwg!4lZrZ$Ojjn7t0`G3!39c1Vg0W<8L91&xmv=zcdrUKemQb+`XZ>rb0@P6w>A|Gu+W*vp=+m zqnT3brk1K&ZEC%#4LSq~1$T|Kn_9K_vEpVuH)jme1qPS?*E6`j|1+8O4VmX_b0wb6 N5CxUVA8(0=_yPPpgBSn+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID new file mode 100644 index 0000000000000000000000000000000000000000..0a67a1a27a6e58adef0a984abd2931e31f6608fb GIT binary patch literal 2116 zcmeHH%Wl*_5FBsVkWB(fkWhq#P!2|lC9gD3&zJ*TkPzSC^=)k8@PF%3me)Lp#SM~Jx>vu8#EW{&$t0)TbLCQ`o+kUnF($>lj@&4T#I84*W0G}Hw z+?ydvNyHF0;7}`xFP%gEfOHqI$FMWl0(K6g?-KR|_7rvnyN2DsX0SQzltjMiPH9UT zz79idREt-%XB0*sTLDiXkZ@lZ>SUOSL;lD1UFdn9lF+K^q+&A<0H14h8!@?%=Uq-|lW97Fq@4q|ych zcY_X~!61Pgo>PP*9LK|v5eN*3v99p}fl5lYEJ%}zD>X!)Km1T}0F?KT8ZadZkY>U%Ya+Slh0O44P*U&TV7;;dA6rM@c-5QUg2N9Z+Ibq2Y*9V#(Tu!OnHe}pu`su1&g zS*mIiG-h@+_I?_4f(v9R(iFo sG}$*gbyD=8+zCbtb;Zks*{YeOp|%HM7?pG_{*TGOACph^?*~PQpF}Q_DgXcg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE new file mode 100644 index 0000000000000000000000000000000000000000..9d9c82c169ac1637ce710e1d9912084c1217f362 GIT binary patch literal 1307 zcma)6OO6vU5VgZJ`S4lI2(f`IdXbhAWV`LQn++=#Y`B2O3#2&(xUa$qxEg1GSGK$3 z%n*r|oVJ~M^(M>j>CHscg6HaI(a z9mfeMg08VPSX-{B`~Pa5J$B+>ykSeyp0PeX{-OK^=|=v1Ah66jeZbGBAW zs$LstzjNSHD*8l)eB=W`I2Kil&DI%_;s*e>(g{%qksS!y(ftzjUQ(6PtCI_`8lQqB zx#IXtuwackV_!<=%^0qbR8ltfQpqeA*Nc#~9UwNDP*-G!9AW8_@jrNIL*3jsNzH$1 zf^-=}L0_FyQlJlGK&-~Rpj`40jX;~JuXG_~pCWKp`5Y34EFol9dP~e$vmMTuBClw= zY6;r<g{=G#*nds@PjFCAR*kGXgKRNwoX6Pt06afH#%G!jYhlFt_>F8a3Rb!A~<@ zrMaUtGd>gJbeRNy0{j(QS?GO+(xBykP;BLDy$MnrEqqTayz$nBOP1osS>mNO#z{{W gRI*?9PgjM%J^Pn^KfC^7c75OKY`j}E5gFru0dY$6V*mgE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL new file mode 100644 index 0000000000000000000000000000000000000000..024675b99e8e1ac0c9ab3a2a8b5c473f3f635d9d GIT binary patch literal 1221 zcmZuwOODhq6m)t%{R0+AEQSSQ5uu6Hk^Jm9wr4YIByM1`f;%9Aa};jC2{;2+;S5ma zbV7GCQNK>&RMo3jPJaAWH(!;yRyeAvQjL84{H-7FA0KeG2RAm4IXOSzE{r)z+l9y* zKZ0t zHb#u?T<;d9oleE$J29e9V}CiLi-g==*gpE8Ob{&32de?f&_(29`W+wylsuFz*$GXZXFBs4=%%0G3dc)pxn4^FQFi%{k?P+d84#QR&lS~c*&N&M* z7$O(ap^W{;=`GRXQV8&F(j0R#S#>R*y2gBH*LQLvzjyyD!7N_i5P2{QBEYS_Ztkm}SB!PIRiid$A`df` Y>dR_WiuqV`Eq$MmJi_qGX>vZAACMk;nE(I) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN new file mode 100644 index 0000000000000000000000000000000000000000..9e10ced9a4a7a30ab62f229a1060266fcc8644bc GIT binary patch literal 8916 zcmeI1yN(>k8HIahDUl*2Ly6$P3J7@(s0|KKm%b`-1W_i*CW59Jqd z$0uH>3?d{uNfBn}}r+WYKuj;cOtLj6=ox%Ct2Z|-J9Vjrf|?B_IuDdwgd_H!czS*Q+JKngnZH2&6YF5#)JE2|hWT7_(c3NL{g5#i9CU zM5$6Hqe$(YD@KMXeKKvWfRHI>J)^y7Rb90J7rDoH-4SmrLZdR_yx~nvn=`K(o^A&K zHyi@T8;$~qfaa!p**7up8&d`#zozy|1N7r8RHS@uoxB|eHzzZW+~sI!3a++N@Byd_ zHc--yYTF|~$rI4&0$NEnGWYixA}VJG8A0`t?$N(flL~v(fjo8yFmwlCEznXbQ|-0B z7ZRv_RyYBf6uBt@a?+deb~>%H_Ar#G?b0~eQ`?OPMk2v{={Hq?YKTrp9R=8yupyZ= z!GMK!U=4^7BH%`+q7WvO)r2)?^+|B5=o3fHBZbE`Mv=*pngDtpf*Yevu8->h<+DzB zSPYbpDQJzQ(L=!moXW0x0Nw%9q9cpiK>Y>v8hS8)Sb`&~0vZ_TUP8b_X`v<%mLNFe z2B+7`MMT*vh;wWO!e9_!2|+>uIBkrgcWn%!Ewi!ctR)uB$(BbrU#Pe_Eq&%tlJ z781yWt8)bgZj~=3$*DCK$to2F&eaQIFc)H(An&PKzjRCP#h1zS9*><$!dJH`42z3u)3eP-Bd4PbEZ=0$f%b* z9&>0@7cO;JU{eipV|7vv7m6AM;Q^yhJ3y7?)*SOdzW& zU?(tPBoY1nV?~k0p08zKb65NHrp2JoZsY6Qgo)eghTv4s6d{RzBbi)8mlFf47nXm0 zn~Q%${2-hbz01iUa53Vh`VI~(jKS-b2`@AmlIG=hPnJF+Lomu}$)f32Rl#b2FbRxN z|5kswcO+fL3ad6PaAIKcn!L0(U8lvEZg(qOXeO0`oIWZnH=DoyBtI9QUP$>$_O9XL zrz~7(aXk(H2mxQ{33vpMT*1JLs!25bjDX+Izt5O=7gg|Aac=FSnmo7T+_$xfI}f7B z^_)gFP;;Mn-0V01JSM>{cF!IuF3Xuy023>#)uR&g&>rdMWrqO4r9WYgE_O-UViGcb z*R7CtGt37)qw49Bj$NBKa$26WQ5HOEORbl~fowx=wCL2{*-9PZ4_eZ^$0W7vuMGkZ zFvh|a(|j!{!k&J={o_-b$%rY1x==7Co~>mpnru63kUeLz*EZ6Wf%nRpTIDSHIrj0S z0+8_t_7s9fZjXiFcWjjmXTs!Bxu7TxPr%mF@1=G$x@@_pJvj zth6vUzdUr$16x%sMWrze$wIe5dldFPcyqc#<$?IKX72HB2>s@FkGIb`^j=!qK0c{= ziS)ACa(BJCQdnp*rC4@u27yzi40{o|K9FS<z5BU zjPf@E>i(EmwbUA^wsk`sK0!j&RPa$d@K6d*q(Y>PQ4u(FZRq-}JhVJH;*W{8wlC_Q zPqR&VOyocPKIO9MekHC68(mIEQYxz7!Hj93Lx=v_I_uGG^?CG4R6Q?e z)6{Q2>NSTt214BEy)j9A~a{~uZZMIMfX-yrbB`b9Gz zMJ_MCz(2A6C)R(}&g_55`WN>3;lE-G0_Xpad1C$k6#H{G;1_8Yw|HXxg*ZR4etj}N zC9enCDgIdggSK*6KhejuPsaN1CH#QE_V4Uh9>YDKSbzCfAk$p}*B3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO new file mode 100644 index 0000000000000000000000000000000000000000..9a9d77e5a02b133b070d4b9a7248c3c40d936df8 GIT binary patch literal 296 zcmZ4UmVvd3fq_w;0Z1@1GO!uPq*R;Lf_Om84#XgF26kg}ptvbW91OrB29|~f24G1G z3`q+ELnC7okQoe&|A7Fii&k8)YmsaM+Y2V(mNPJU`U6G2F)$ezfMmdck%3PG=yu~; aO%P>LtI5EsVyK{E1e9cCU^IrR0#X2_TsLw6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ new file mode 100644 index 0000000000000000000000000000000000000000..d0d8e4cfaa02dbcfe0b3b3abbc127c1cf2fb4347 GIT binary patch literal 530 zcmcIhJ5Iwu6r8mcFrh<2R7fdYB$6%d$KFlSP*YN`xAQ3y`$jni*WnB>&j}XdQ(|eJ z-}BDQ8?8@oSR8=t27poukL#zs8A8{0{if@WVH~2ZeUi4?jwIzoL5N^UWW*J5O*y^v<*v-7@%R3)wcqZjP#_!g@Y(w_^!V7yvrZws6QiPe~Zp|Aej&7V@&A35PnpJ66 nrIXN5Mj_Xw;qV|tdnR7^uKKB1O#fyO#|G-hq^vDTU|lMHRXy?jCD`8k$+wwIB!EPOIfNNhG{86cP;i8YDM6evMMN~g z`w{2{Gj|)&}O^8_vLwg}@SY02@v4Lu6U382~ep56sM(UNb6c z<(33y)CvkcQeq}c4Wgy#IHE@*M&vrc%yF>oY(Eye_5!AR{^G+$4>I;`Olz)N0XR>v zoN&P{(MV4Pr&Kn)qTC`097C^RwJoghY*R6PY4YxC}=7udv ziSv2Li@p&Cf;b&&?5@#d^!c#6Mr1|s9t4k M`ujg-;S@0a2ZYDxkN^Mx literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS new file mode 100644 index 0000000000000000000000000000000000000000..b1f7eb02926ff847a732e8e5dd5906db87f77a84 GIT binary patch literal 868 zcmZvbJ#HH@5QT>d1UoPfeAE;Z8Mc;1!r_*UIQObk>vv#{>?}{@@2C#->afX zDiHtQMbTefe5?w4g`>4J6A`8C6oqEt6vbv95&5|jyxENRa+*D_ND`h;tDfr&xF2}V zm}LF))5)8N+4Hr-`Vw!fesuNB$H{e3%7L?7yCmep3_p04EH!j2H=2v){>f~gj$}Bz`d3`s=GI5K?Nwzz?*?C+!*^WO1 YW$*qHh2zj-lk1_q*@Yo@+)j`C3E#l7sQ>@~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT new file mode 100644 index 0000000000000000000000000000000000000000..a07ef182836f16712f0250b83592eb0112d1e5af GIT binary patch literal 2394 zcmeHH%Wl*#6m^D{KB+(zR7ePQQA8unNPZ?Zn=TRi?%eDu@ekDbBltAF0nWM3Of#)2 zB(@OAN@AaL@3}93|EYGrDYc{UG)<$f_08>FSQ;}HgRi(WdMxhp>QmOMIAEujog`mz zYzvOODk#V*>ljPC|IlD{U4pMZ(V1Cx zu;-}6F6oT`gO#-jM3ij%A)8egiZjLI%MYc?#)WPuG22z>hql<8TR>|R6VFzt%f=2R z`$!|8bfl!A^!O#yZ~JnD;n-*E;S!GMnP9k$rY&KPrw5xyPjV4?KjFgfj;*K&nCX_MnV3Cv3M$X$T928;8=god!rD0fx!3lBd8H2cNCs}mNBQsol3OPp>X z>2@=kjXHA9)P!pzh8ndWJu@yM=|(C8;+Jdud{hgq36$qp9b5wHmtkzx;(`_y>II|K zC1H|~b9FZTV$(|dU?|yZG_Xf@x8b7v1e=nq9KYnT9oy=IxZMkLeqq6E)UM998)!vf zuEHGdl^JZIK4{z-b@uAjBD13%2LPi6l^hcl{s5!;sqr!{h^fss-fNde5G( z0@46io|DPz%ke{kJdx<8Am`c}^(-b&7iY6PINrMxMeR#E&MzE5Xd1~#2^-2fC+pOJ z`GE3<`Nn|c4i{Kkvg5twX|6h5TX@>(>7&FM(foR*c~ZJ5VeB{Qm7~q5><*=BGP#6@z^v}G+cmUvt25V0K<*A8fSnvUO)+SSZl96 zes4Z+{PylnpPf57cg}h5-F4)Ycl(#}s++spF|pKXx7S7i#`pxhO%MErFSd4&s?N7ph@6&{+P55p=nD3?`juBV?so2vfBp>`Qr@URw7L#4kVF(en&zB{UChCGVE@I@htw`?Y)my6Bwo literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM new file mode 100644 index 0000000000000000000000000000000000000000..4b97837fcab2c80f9e168bd1741fb53bf77e8397 GIT binary patch literal 991 zcmaJ=J8s-C6r^GV3oPIRxOQU|0vZfyV7zTH9cmJ(vT@J^?(Xv*XMaIMNRGtXHZ@=w3z}-tN zIZGA*;*%j15qO54WMUSZn@lNB^DY} z(?fpNNti9)JVNR>50OW2|~ima6lBnz$ki{w_0^8RB%Art<`{5>oSgH zoXD7qtapRkqh}3Ke28HFj65LQnSx+vs%KujC86HMO4>pb&m(0>o4$I9!#65JF;XLe z+;RbYB_##4I~zZx!psyluELTO(l0YFDdPVb1Wy793~o6o5sT4MGF8jjO0il;=)qo2 z`K$mW*jJIjNX>}7hAaMw!u=W5rTc@$1I_YFsY_(9)EPA}>0Zew1Yi0sSYqCrX+}$1 z04DVTAG_=jHgNnGL9dSD0M-)gSei)w+s%eO8xG*~Ztj3IlheX3mj?WfwjD7992wASjw;nPR_n$L9@dpSLu({m5LM_+mh`16|22wh=pF&;1k z_@frUthIfx&AO41;oPz3F*4uH9z!~UHDHxW9eZp(9?RGhHn74@%b1(>VeA9rN7IG3 zxnlv+*$x^fAhL+bh#j1fB#_n^7^WG3GC_Dl7&^dCf&obZ2L9f7B8mnH3T)bUVKzeJ z2|RI_HJC$gE}=dxVy+aL4QCvhF8PA1*)+nkha)oE9)js{7V&_(=4WGxR$E~9g#xhW zljN7FKi`H_#X}(pyF+w>G%SXADeQ!HEHGuCD4Md$cXExr)T&k|PNaZ0G9o3@qO4Y*zbJM0U9GG|xSl5lt<}2&1TgSP z$t#|X+V0)s-aqaGB2d}p13RG>tu_a{cLv+L8%TP}0Br;$h;>6xX?2HK{D1rP#9%-1 amp?;S#V&!16?h=xUn}bt%as`1@b??+Oy(j0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP new file mode 100644 index 0000000000000000000000000000000000000000..1568a8f57e218726f58217603aa1984b291e1f48 GIT binary patch literal 6698 zcmeHKyKW>!6s;cHtZjCe1qmTCge>G1Gg7^)nq)HqA`oQl&ioZ@O~kj55%OEaWDDoq z>Yn!)cGo8>nnoF|d$Z_ zO6xM7-`%$)T7vN!*Cnp2@%#I@KgIP7*K=GS;Cg}ULtIp&UPF@M)ms-9c__Abi#QaA zTQ?NnTmI@p9`Fsv5w|pygd2`Kv7n_nwm#`y9O}cn`{MB&k3-7v0<2m@bbQneZ3*LX zrjt0Pw<0;?Fv(%{7}oe|4J42=%VA8y=&EMllemN`Cij{Sw56MrP)AReYThbj4FbV% zsYYEnW1SB%Wklw4Fh*^9z3>A6K)8U6mzRzwnaB;c4KJQ3-$a~($tPOb#Y@BHx@_d5Ui6rCkoVsU_o8U zjnL#p1?6Mx&m=He*XjrR!Q)cBaL&kJfgr zY};f!Q$MikZA59IBv9u8WgbvwQHtCx2uj~|Qlu%CE}|4nu>#TGzpJhfqF*+fHYv3B~Qj&qHjyYFH|oIp!hs#Z$&Sj(h|~F?H$#lWXOUm zOF@<{f;!O>X#$fuR?40|4IQh4M4IIT^tNaLgZlL!F|$LI*xUdg3DyB?=`1_R+gQCy zt^mVs0mB1CoB0Jq<2D*57)(grq@JlyoiuCPYiYrND6%7sQhhldA%aXZI&k%mzky}Y z8w9u#zln)w&G*cLVcr1%Br#{m7vUBMXpIX8_&9W6i>JgWJ_A%)&pCl(jHQx$<9H0y z7EW*m=H6mp$vh!@fEZCiROGTaj?O&KyoYQArd}v zCBDS`93IW`O$D^`LK~sk^L3-|qcj!Pw0b^+b;)oj^@x4Kq zFy7##gd5mK5LmYeK{e1UJifHEpT@{S0K73^2)HE(-VZaC7+V8vIA+_ukPFEI`XGhb zhnZq!v~^4~6A~zzF-~W+1IjTDxnktlPh=Krq^6j}GKXAd8ZIrE4MZ9SppA$Dhmyv2 z0%sZY?bJ~UvR73J2p&ozG;lHl?SGL%ie(QWBm{i0kkf&wHfSVpLeeWvSfWwDBjy3M z9;9$aq>xFowMpLjhy;icnj&ot%piaXZ3F?42rF^2M#mUHkkkjeLv=I$# z#&u<(Ll%P>j85xg-)gc!w@TkTat9c?DsbS z;R=CUr7qTQ;SNuXjJi5JtT;sDYeuCf{A)-&20@w)yhxeK-pVw(5Lp~R0Dl~7FWbnJ zCcw-b=`d9E*6=jD;HtuO46qUX+mmoy-^Q7}Kde9N4T=*(3vVa#VioG^7YCK+JIhMk zC+o%T)wBZ4cLmNimrtyTvM_*%yhm-o?wPrl9#}hf<-;1hsH|+-+($+&`yB7p*Vh%( zrX$mKyXT1P<*;d!c+xNrdpi%7_#I-<(CNTcerG}2Ck73P<2)T9=DYQQ@WA{X*^jxE zOA|nOomTUAc!M~t=BvWntk$vccB}QYnm@Ffa|pf34u*m8&Re-O0a+$7F*o0aXpD@x z(`tTN%}=YjEKK#~o7FPD*t1CL+o61WjMeeCs9jf3%t(*bH|E>tig= Gs`(QdEnZ&$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE new file mode 100644 index 0000000000000000000000000000000000000000..8e10e28d41cbe61c4019ecf76bcfa99c3692acd4 GIT binary patch literal 660 zcmbV~JyOFk5QSHX0|`YY9c>C1@k~6dek|KGR8&;dvbvlC-3Hyp;WV65&s+_sXFn!HP3pK}SsvRl1y_4OSac&w z3+NJBLmTJ{5<_}Kr3=P2F*QNgZ6A{ltX_#G{k{xxM_@Hq-ji+lS9zPDz!4=G@fh~l8uX1t4((Du-bJD z7XzETS1;`sGnoaiX?a`rP Soz3^9&HhE``tKry(DW1i34a>^ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG new file mode 100644 index 0000000000000000000000000000000000000000..41797005fc4ba12f271bffd2dd6057eb60149115 GIT binary patch literal 838 zcmb_ayH3ME5WGtiL=uSxQPHGu5lgXjzPFJOB?X^wxXV|-`j7Z5T6#K|T{})BT24CO z?d{Ay#{2Q5R&PozAC*#CYjvAnkMG?;#k$aRJ&ZiSwZL9uZ>IYS=M@O*+qHK8^bm?^ z62qy31tVs$60X)GP+cRG8wg&9-C|q#d~9-0uC#!VPgFugkeWEAwQvA}xD;_oeNBFR z4<#}oGBli^9taBE_!>_@w1HZ00;xZ^2LtJSwVunyt z&c&c2t`CKD#qh5YMdM{1C}^FGne%V5F{m{j5~E}RfyW8KFZu^-a{Zer%3Oq&MDm%l zsm04P#_m%si~(Fv9|kSe%^qd@q2?nDwOUo}uCj1pK4p4}^RdT_LNW-U)zVZg+;>cH qBkz2uYoYHdClR(X+B{S_&&>NjOi6AJ2&1+q{;u*8LZ6ASv3>#eIkn^f literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH new file mode 100644 index 0000000000000000000000000000000000000000..0156233aca0810f4f25bc03fdca6ab2677aa5aba GIT binary patch literal 758 zcmbVKOHRWu5FMu~gl-XZ%OZ5ZN(nleF;@uNyP!b+VlwGV<)~0p5iHp&MG16jl>}!aj(zoA^NB zLF=}DY-d3Sfgj=o)!GE-L+l~*WnxoFM{cRG_Q{6<>atH#v9cVvpDgW?nvM}mN|`QT zKcYJy#~1w=7C2<*81R|a$^3aN3znVZxw6!QY=YcgX=5Q6a@Q(KiPqdhL*CTDGD^Vs z77(nsY61assrqBgZx9sCkV5i?kAuQX;(xzi!9Va(b$5%WbWgRENm+~xAR(uP>nmDs rFd03z?9A-87B^fs>Z;LKjVUsh<#`HP$VMS?!R4qrMt#EwuAIMju#cYA literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI new file mode 100644 index 0000000000000000000000000000000000000000..e1beb0cdd92eb7c77be4ffdc9db6277a7b345ae2 GIT binary patch literal 678 zcma)4K~BUl40I}0+Fx)b5|tb$O}kt;Bc71vwy%J!#7Fo6;w!v_H^A8G9zX&S)m3AU zJu_BcKWKa;8eWLVIY&3wcef=jbvw0Ocv_CtZ>OhxZkm@Vty-B`lktq60Wl&D2%SLB z222WzB}~T(bjvfcEG0;7LCTzK6Dcc-B~Ei?_H6+|mhGf{fw}$Bk*ZGPwg!*k?0s7y zbvC6Ys%xP!28jup-ht1;TsTxC0>iGY>*A{yvplj9Ss^mRaq_JecyvF zCr8t+Ht>KcWkBIZCuLX#v_&iF3|vB=VNQXOiYC*cq^M!{ZSKUS&+2?h_wEq3b4P~- z*37B;cAq%?1F%5u}WxN`9yLslveDJ7{>g$B*o*902MHBn@5}InuFv`LGmB~ zQp3W?z;14CXk=_+3RJ`iGz4x0R1Lea5kwlS__VGgjNHpNwU#bX8N0dM_6hI9y>q`_sC|L5@ z-kTZE&ED$=Ee}MCHzG2|(Czl&zU4aY_Pf1|&e`4mxxDC0%=K|y0ZOs*2yoCjN@Oe1 z1xYw^b3PB_B*j_D-11N+)k&(OL$y|h)=&tMeTWHq+gUHwRzc0V@lYpWhK~Zpa6zPS z4x=v+xvRL}If+qHf(ZChiqvXbfFqdTlL@$3SLcFWpBdb1eD0qp)K94H{u4ttn!Uq!FG;!un~=YxQW;igutm4SOaH zd6G0*JI5_KH0X7-Klwr%x;3N}nh(8Ev4sd?`X{c8AT+E}wS#2NL0mlcet$!E@J|LU j9-mZ^uAKK+j6QC*a9-x7*^PKZOZ+1nuhe+}kBa#MKyH{! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP new file mode 100644 index 0000000000000000000000000000000000000000..a12d7deeebd5058676aafab4511ccd637fc0151a GIT binary patch literal 563 zcmcIhOHRZv40T!+su3$BR%~X`#dJoM;(VHh4F_O@*k-z$Q$TtnuErVQIY2?f8cVSg z`}sZBeSM?mnW)+mky46oCx1M>j7#3#-*G&iaxz1hd*s3bNQKklY`*Rnh?i)j5%|*L zvjIBW#Bt6pu}AR9hB=Rk;X|^>OkOBQp%fF^LZzrRY^?KR0O=LS#Dkr`)fHf(Oo}!f zS76D!!{maRxc_*bQx_pc2Vb|5rMFTt*X+K#uK*>)Bnv`mU>-7y~50R9HMr9T5V$2BB5@SOXUDLLo&mq zY}xBAQlyIjij?>`Z{EC-e*6+g--I|6xTKWgi&DMbbi?Pb-(#com~L+0_1X-{;f)<@ z+{2i9Z8x4VT?xofDXM9|Y`2Ze0ZOG%D`Jkwv&J~Wc!jYl&&QZgFitVfFwQX+Wsuww z?8FC4wn5xFl;gNJD>nUKXxOrB(xVr7grwsjsHK50NJ zM_JS+LW9&{;fFdI16lBb8sx%rBsN#(9-% z4v{Z~{EdqXHe&5^Gr<7QBtNx}8Y>pi%Tw&1x?IR_n z_69bvscn<@DTEYb>bg34?DQ%OD(^sM9|!E!DQ1~?#5u+zICp6(nJxtNm3D1Qak37x zlJm9{Z?~Nw*h4dX?gctA>k7i@*&Xqr)%$yF+zXqL@L@S0;SEdT@Uu&u2GW+T2`TgS z2!p?Bkdg|wOLfC~=zR|d^2>zj>RXaT&gBinbYm?JDvcKlvDQ=qP1Z2hwAA9{aotL> zz)xWDQ{^KUL@;B`$u=#Zjw-#W4A7*wLh8L=7H|N8uB+NtslV$(8aY|$U$^}CH0ZGnz+W-In literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW new file mode 100644 index 0000000000000000000000000000000000000000..27e1c8cf14d240225d1ca528496ac17418ec6229 GIT binary patch literal 758 zcmb`FJx&8L5QWE!qNGCffJBjkm5AiOvAs03NF0E|ahFrT?2Whv$H^JsjW-3Ll&s|4 z_4v&<<7a;yY4t`l9Er#nLpQGM5AQt7{nKOhoTj!vNOU8DX@+LNSYvE3G=rXfR|e=* zsS~#gyjv3ED2$M;HpC{??_yFQtENfDC$~}IQQ-!ogAHxG50O(YXzCh-=sI6vTEeno zT(!uTR5>+3L|gG5bkA*+j2W}!JW45*3qom0@9m^KHAt<~UM1}hN^lTZE6xGx02N<- zYFw7oq`=?WdE!QV3TP= z&7}#i)Uf<33EgxrtuR*3yT;Z!H4X=}KAq&rS3NWsjA&P=)nvZ#=udb4pQe9VXYe$< zyb@h}(qL^budjiw?)ya;^%EZAJko0G?zSF_hHh~laQk%IxZx~L_YAhEgf4sD+|&7Y M@~ZmCO-21N-@`VmFaQ7m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY new file mode 100644 index 0000000000000000000000000000000000000000..95bed5e01fd738d871f9cf873441f99291758251 GIT binary patch literal 868 zcmaJ~iebGNORNH@Qc3P9it z8heO~rlh4fjWJ@2J@2B%rb(PumKRMu=Bdt$mR=?-wK{FM5>ek%Mv>kSZq4b8uuljG zAoJo#CXoyW30+#V1C0=Z4>5t%<4P)q?pZsrKo3({G<2EL;*^|yFO`v%M_PGg(F*P* z&DwAU$oM@{Q7E7Yme^%*p5;p}F~p6_&DPZrLvw~SXqJtQV(6tDdqFe1CW0PvsSSNx zgC!1gEi_@v-yc2+KoBmEprOeN1~)Y5f2KDP6Zk~lUDySTr3gHXD9;p!8O{yO2&nBe zKPF-!WJna_9W;!VRq~DNYF-!mwt^;FJG)Id&7q^-$o5BGFn3VHQ-Fbi*pCnEJN5FH yLY(OG`8ZyYv2U`C+mn>D`v*jYce literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ new file mode 100644 index 0000000000000000000000000000000000000000..346ae181e9df519aa5c3e71a15dbefef98d637d0 GIT binary patch literal 911 zcmZ`&%TdEH5S0iaj1SCkpojS28U0t{LIHGuk{eZk!jWpIfsUvF-b%I;L-5Sn*6w?6 zpH}wAmsr0Dv3eImNGZi_+&#Z)dnlRW9*j2D&aR9Wf`KM*?pv$>$l~vLd;(x2R#7V{F5??NWP}KA#|ul6KfRQ}5C8xG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA new file mode 100644 index 0000000000000000000000000000000000000000..39c98b7375bdf8eaed44a1b91266da0a5c4bf1b2 GIT binary patch literal 585 zcmcJNu};J=42GQ+P&p#HNeG3{ZgriqKHQ9#`xbh#N(?sdB&3$}#oOW^suF&N~W@ zXs6e9D%idiAQ$XdJWE)2$|v)IrJGXje~#bLzf_~@;U1%Vq{=y@o9U*RHC-(6GCZ!- z$?T}HzO~$1Db1hnMk{5iDd4jhs-5+CczK|oFkdt}+hbZA3dzV{%7X@eD3A0fnZX-{+AC6A3QM+=*a;01E%X$=boUD4{D@ERAl?A8adJ8W4OTYJ z+OsobZ{9!Y>WwISCL(60`(VB5hvRAVQw*j~-)_QohR6{GLcsLu504Md#x7{(hS&$) z0A8WCnIg7=X_OPLXn$nEcSA4&jXqe_`avk{Qrn8wJeYE0Y~8dDVh$8|>ev}5M3D~K z2)V;7K0zYZ#fNH!N_<>$6@DcXa{j_dDoi&h5vp-MCu4a&BU91qvw^(Re<8XRv0?pB zN+Nk-Y0frF*~=5r?t?O|0q5luH^+D9ygK`?3atNl7cwi*#@4&VP4q aZ3ELzmj;D*LTb;Xi^PWeI{h+YC5>jrF^Ad1#4Fm`jlO)X1 zO9rhp+76>|^IIC7)uBt=_mK~HC!PKI71PX$5R=26n%+?14LYS8QGaPWmY>(-DGwLr>6#uPzJ z|HPFMgocI7JqqH_ZGRlbe#X|p-x=oQ?iMH3oca(jS^b@F;9MUuF3qhaShK)`S_h?0 I19+U+4@8-$wg3PC literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI new file mode 100644 index 0000000000000000000000000000000000000000..db5e577972f161632f5d6948cec8179381889a71 GIT binary patch literal 856 zcmb7CyH3O~5Zr{vL5GA8ROpIGT#A#{kN81DL4|}w1C=k`eFf}&4-LP@H^8ik4iFR& zW$oCW*%|NV<(2jxiFWRYsA(EHFCmSq^;6o&;_9+k7j-F_du$FHpjyNXafnb3JpgDC zY{V2BN3n&iAH{(e@VOk2LvrZF)s%i@aZX}khsjycBupy7VDtT3E5UPZanRR{$ zF+uJgNdf||FT*mAGOX6%h;FL#vfcn**uX@I3W=;~B`U<}4i?_Z5I)sZ2ug<`@Q0XI zBQe`zwFDp}2A!cMdFydv%@l|SoQqsxpbfZ`0mVAlFn;VMgkoG6!CtMa+UEuHl%TqJ z!!u=8*k6|o9i^!1Hc5)Vso>ZqW3_E(A!|8m6{OTQZ*QfQul?0}2I!UqT;?{}oMzbGzKiX!eqM{o;8Z?c+5r4}SzsFAqODY$YWD)%U=NM=; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR new file mode 100644 index 0000000000000000000000000000000000000000..c69e3ae3e9d7eccfeaa48128108882e34e979f06 GIT binary patch literal 583 zcmb7AyH3L}6unLaO&O88cgWBnRdTLh5d+LfOsr0}di2q{Z8{k~0DUbn)DA%!1 z&P#s#psQD+;(>^iQgnBCypL>M82T|8le(_y$5WURa0V3Z(GLRo35pW4!Bm(nMm*>m zJSgOVkzd$U+_JIG2N0g%HNVWrXmoPUr2xoB-3}@AV}oF<2(%Jxb&5U=jRdJu)dMJGWETVDe;|Mw zPc<&s8%RcjEdmp8+ZdR9f`PVkF)$ezfUSq9;nM(m*`!tzN-?mi7%He30p)<90SYmT ISh!*a089x#RsaA1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT new file mode 100644 index 0000000000000000000000000000000000000000..521df976c220ab63f1c96d27ce32b3c492cf695d GIT binary patch literal 645 zcmZvaJ5Izf6h)s$6NnUvf=`1eQlvjHL%aWZovXp}S(3r~bf&lM3-c`j6M z0x7@n!a*sykV+d%%9Wuco03kGW}U1YdKA<<=`G<9Gei3QK$QuSLx?;t>kJ)Mv~=h$ zliVq(vJ|5)y6hTIc{c>)ml?}~(@6mPrf1m+gA{4(Kan;Y`Rq1E_Rm9L_xeVm@32E8 zoTb;^qYJrW54Y`M>}X7K&L1^*P&T}7MBPYY7+h=NvA2Ovy2ZZX9sPUQ7-A90|05RO z_5*2qtQ$_!O_GkZA-c#lx#LdSsM0OrIz;1n??Sij%j$83`dlr%q&u>O^Ul~0uO)4q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU new file mode 100644 index 0000000000000000000000000000000000000000..63217e0cfaf158c619ca578178c1e88b90d57db7 GIT binary patch literal 1357 zcmcgsy>8nu5T=YcwVT3Qrxt+*6|fKoAt{lfx}-tYt_2FP0y5+&($gE|)%py{cPGoH zE2rrc0|!#a{@*ZuE$6MFKPV5l5MyQzCxUw@6Z zc8%0f74>E9F)wAk?E$nvFyb6>ig<_M+!FB~afVXr&eft~n4faHxfCjIC+(*2*4jr-%_B*VPsH)Y?7n6hU+CH(Rt;g){r^eX9eUbth;Mh^XZ1|yCS1^@s6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV new file mode 100644 index 0000000000000000000000000000000000000000..07323a7ed384570b2b85388c76081ff3c59c053f GIT binary patch literal 447 zcmb7BF^YI!;JL-aHJZZV`4P9t)ekzRGS)C?H}=Ou|R9&dFC0{OUl<61R_U)B4p!Qyo1D^6Z03C=gUpq$nc zxy-o|_l?9it|jyJQjkQlP`GPokg_nlt%ckg)OBm1>7xW0M+uiQS^%DBa7!zBxC zUSEKG(nf30#WFByOZ!7J?s*DRPdjOpv?vMM=3+5wX|QZOJ2hUq<~?K_YVKYw{bff7 g$wpsx{h4SlO($(9T_=4fLo?mAzwsi%n4ksx0eI<*Jpcdz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC new file mode 100644 index 0000000000000000000000000000000000000000..34a35da4cda7d42a6de2d75c6953ddd06d336956 GIT binary patch literal 780 zcmdUtF;2rU7=?c)t(2+~5(9{V!Gnhesge`hvBSc^%n96Vy+liLBd*37;Qg*aQM0lT z>5pUkd+*tfKR#)FCMruJ5<<}Z?&Uce8~S04ogWUz`fz;r6J`rkh1#H)r3awF>#>jR z-uiu?VaKpQF^rF@@0-?G*Fo}R+1_@{jxIJ3vA>%}jGOC3*27@aUGzS{;g&-+LiJ^7 z%QT(SlK2ZxwqdV7>88!iyi$;$ZHU?rSQfU!S*UaZIJvi1^iNc1jbV{rEL+jt4gxdP zv!_|5=u~aVUSA1c9!*Qqn+k(FVP{NlC literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD new file mode 100644 index 0000000000000000000000000000000000000000..bd5d32062472b43964db925b9c3b26cbfe485830 GIT binary patch literal 579 zcmZXSK~BRk5Jkr=MG->mkk}w~kwqg>$)3SZ(hVE7oWRYlS6~Cqjkp?TfIm*sl3>Ld zW#<1k);M3^wD}-f9f-&nLl3)`LuB#$x;vgyY}(FN$J1x%wT@k2tCF4|#KY0;+b#)0 z-FA>BkE}@Yk$v4&YW8Z*%TU40j^)_{@#q8Ra)KqmT1OW^J2#v>f!*XO8f%wGq^9z1 zYoql6XPB=OkPHojPGqhJUH;Q0)AIoT$g_D) zpw-(ei0`zr7IHJbRJ5kM9mvvG8hl^TrgYnqQ8IL;H)UvTONZ}!Rq!Aj^$1jC{kD|B X!klDo8MPPZ!g7r}#gB0|frIA1YnWwj literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME new file mode 100644 index 0000000000000000000000000000000000000000..94f2430774f63e9e8f65116cb7aa15364c596f81 GIT binary patch literal 596 zcmZ{hO-{ow5QWDCX`I0L+KBLt;5nT$P} z=kJa3{z0o3qUwo=lu~rJ-9H$fvh89&4u^I)yoPy7EO{4abXABNaU}}GC3G|tSvFl7 zCyRaN&Wt!l9J6uA?c`8r)LcMSql(;4{#gAkio`5kt>C>t1tib{R8(6w*7*>Dz7K^L zJMjw|8#hit4EXVn9v9SsbrD0mPP~})5zhPLz=a5y;OfMTmkqjado;VOeL%0z8j`bs z-gzyLm?iazC7a^?=TXs3Oj&nMjQ<`}z%gk~G4bgwimqdX>>pJ$(PF?;+8F~>JwL+L s8&%9`SIg(vx!%H)nOjMANjo>UR5yClm`!8LL@WHMepGb9jTT{9UvYnI>Hq)$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF new file mode 100644 index 0000000000000000000000000000000000000000..dc4373bbb2b7b45e373ddfe30d151261c3d1e96b GIT binary patch literal 551 zcmaJ+lRZ~Dc?*+x}JMOPChso31;ugF$th5sLY{H_b~ ZA!VdrJutmI>k~M@gsA0iOGE3L+&9HYa^e60 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG new file mode 100644 index 0000000000000000000000000000000000000000..53d307b1f5cc813e9868ee5feebdc42c59e2240b GIT binary patch literal 450 zcma)3J8r`;45iWphLI%)$lyVPJp_=Ses-6RnR)_6TTao)H|hm?sGgxA9j9oE4j~{> zl-`Gg-al#cMx;K7H>Idfu=#Yp43k{&s+U~xGaX?f5=KF|slc=^&p4fnOD^W(lXZb} zNQh%DFDEkC@icjoS^O2E3iOvBSx;p8Nf~}1S|+kb`WKl07IrcbC5E2JKoWRL0r)b?Jx8V?6h%>+&=hMQD zDC2SF^XAQDKE7zPCt5!fQI=(N6HMuR(|5zcAH@dAAuGrwz|M*Os za+aK+(y`#t>g^Ty@3hhy;n{RZ(3);{AO^wKB*jNXc~NZ(vn?zlGI})FvcMi|AVaji z_gEeIu32TY)TEn_ ztU%$VOJ0iZo3|R>b#`=1R@<9TS<4*%cCCJ0plc%o*RzP5&hsL=&gB}g6w$)Ax zP3LRiE{WTb_RN?kmziz#Il$=F_HLDEvLnE6w3q0Xcc>}P@L_rAJ}xh?Xc~J SwhJOQaC?3LTB+B+RDS`%+)CEUv>Wax4ZnK>t1#|ecyM#_`Caud^O~EB)$?3k1 zn8k*p4C6vnd38SJSvu36hwDs_)c|mab8eSPByJ&~#Gyrx3TJmDD0LEa#moT{L)@}c zUJASJ2uAV>+XUuyU*{(Q39nIP#-GD)iv%gwAf`@yPUeC9SJbMl{63`H3}klgW}Cwn z*K`oHtWfbzW%J}FFOl@D#77l0VgSI5-=l(LthJ5Db#LvYW{L)J{3PNN-Gp+#K&6}e-pk*)M{3s&g!rDtVke%<-#Q5tBjuSVWLX_EFeM^^AhTi z76j#!)vFjZ6f!V%!EZ6? zc@38Hd0?}k?_T*3Qyxa9&fmge3}`e|1`HeS9AvGB5vksYBdC(@hb_bdigKSBQj<*$ z>#&*}##V5FF%FoyV6!hijyB0?W(tX08#(J;&1IMuO+va(eNm_@MocC`NhfR8DYx@E z$Dq5KL(7cBewv({G&dXsRE3TN##Gm!(a6VZQ*$ztwCn%l(T6F0X4`kyK1SvVGhx-% z)D;TJzwGclKr@zy4MKPE;RAw?-Gy_g_v=4tUU%QWBO}&Bc(fP2+gSy>L6v{>_Q*Cry6S*bwiGe`~K9S-C}H`jLmnCJ|S})KO$a32NeEV7d-_wc!^3 zha+Bq3QD|Xm_9>%(S2Jyzcq^PH&KSqY9{pX>kr=TqJKX>y{s-5c0*C+r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN new file mode 100644 index 0000000000000000000000000000000000000000..1039995371cc5df8b473abc4f296b241d00d1816 GIT binary patch literal 848 zcma)4OHRWu5FNJ-3SA&Jutp+_1|^a|v7I0xmaO0cZgxEdbvO}+;Ub&?-ndpN6-bTZ z%-DYO=FMc@KdE>nnm-Yd5Q46Q(&Kuw_02HFVA~;WCfv@kO009NW!^7f3#>E5(i?~B zpjyK*wsBKjJ>KKxa~Ku1ucHmd^<%x>tT)l)R5C!e7BSHW>H9JEvW`mkH9*@ADt6%} z=oXh93<$uZ+RpU@Q*B-2St36yb1zF!X^qmRvkn3u1|6g_sU(}k*&yv0U65`VkzI3g zhFB(!1H0%z%E0^ri(3Gv?EB1{_Fs6|Ne~jJZUxnb0$#}7hoJ>st&m(#^?~W8n#xMuRQjeespf+JkrH626b>#J z3{*B$BydLZOu?l~zBM}#4@-RrTmH<_o;3wz)}w$K-R3FLKK?r>v^oKVpJB$|Ic=__ PfpaKw!E}2l*F^LUF|@7b literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO new file mode 100644 index 0000000000000000000000000000000000000000..b7e0c23fb3d2991783c52f0f5aac7e95d06f26fc GIT binary patch literal 503 zcmb_ZOHRWu5FH0aEt{U83naQ|7Ln}nr!E^#fLO6|yvr%5b0e+>S14}=R8koVCUS5gr-l(%y m<7Me+v&Sb2%OEem4Ak%3!;W!e$SCic0NypBFO2_qF{5t)LuHr% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP new file mode 100644 index 0000000000000000000000000000000000000000..c7659bad3ecb5a74906474577226430167fa90b1 GIT binary patch literal 834 zcmd5)J5B>J5VeV-NRbdVH7Vj^rCI+?!wHb+9e1fX0!(hir8od*fH&S<1QCK3OS|^W zzS)`go?qV7`bnu(QA%m8)pZTI9gffC#QVG3n7EK3#OWjeJllES0InWmBET#jSKW{r zhse45AveR$)^TvTv6s&ddFLe`B(xj?=WIA4ik=g3wuTcxA(tlLp|s2;7lZa*+RKs= zHd<}b*g79#%KvAKn+z^Q46fb_zZf|sVOcH6fJR(sfX6ly*|C!Vh08+pBMSKi)%m|; z$wB0Q4PAM3MX8VIQEBSbMV6pv4@VA_rn52K4=G6b9Pd1)WQ#(NpM5FnHWBTBE=QC;?VkhUfVQ$0YxM_=Ngo+AkH80YkULDIu8XRAz{h8 zT6=b9M*Hze*Y8A4AtGZ8Jp@j6z1jL*Sw25yFHIb|MEcO@oFE0MFHTyKEa0b>aDp#%we^x*82a#YHC49$EJ z$98ZdnD3P|Wl=(mP~A#2T{KCO;n;KoR_;AowsJl=GFOPl;Cak;P+@z!NA76%2vPrJ zzHkm-KTAW8YR9Ee9p+C@7oTDNFNzzyAI-v?bJ^zWBevXiMZbj7U&mHQdl?v3u~IKr=abPI1@ME4DcMP86R{Vd+R}TK9uSZXYz+f zx%H*7&R1wzC)uEttJD$lUB#*s(U_T-!*w#9U_2$9hamAnjL6@v>3?6+$tWGO8)cU( lULKTb%}5H~1*SE_{%4_;EDLE0X$$GlAZW>ZsN>j<@&=X=Oi%y- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS new file mode 100644 index 0000000000000000000000000000000000000000..1a8393a0b1e6d5603bd3f4a3c70c8ef61a7860ec GIT binary patch literal 677 zcmaJJ5FH0akyZ*N5-p^Ni%9;jO~VPOD81X|6l8J}j=-fj0B3+V-i-(dV#({@ zdoyp|?Ar$|Ux*g3M5L6W+wJ2+jd>jQ!=6(LT#V7f{?H!w z2v8vVkWT55zsttBmRY!K)bb|^_a{`-{fQwPDe*nJSuUs{AxAY+CXRTJL%W4t5iYd7 zMnUq1r#}D2`v8^fKnw_WM&cx;!4TZeGBuZ$Bev3nw2LFm(t2`=qpOJ5(CESJKsYvO zaLHBcgv-7<^aqYzwkyI2F}lyvJ5t|9Ts*c;pP?K0CxaGG&k~WYjI~&le6F{mzV%FR R*eY7$=h#?bP6Kej)GDhIfh5!V@G<$2%M475Ev~V| zpwzi&HI>F_h(7w}`-tu#U{jKvAYWEtTbZREu)zq8{py6>fD+ilx=9 z*Rwn0Ilq0<;)Q7TPDI8Sy4~F0mDKHO-tM=1yWPKbLoM9IHt(=$2jJ$2C1Qm*M@T0< zp^>H8h1fO%uD&=Vwni=ckaR|6lsV$0cE0w`)}(;YBx&lrt*vm^j5Z%@D4zSB6)92J zXNUtk8Cs#t$UPX4pt)uwNyO-s3Wz|tB%Ib*LemObE-u6nsQdos z0v)gpIcy2V`7o+UqQ)S^2UWreI%0y7o9uY>E=wbecYoBYZ-$oHiS~$=WpDsZL*a_h*s9)Ap|_^o*pM-N=&97Lm%`0p!bJkm`idV1K*E06IfDo6dMYr z!ZR@)g(0TT#j!xlx**lkIOSvpk5kMAIqPxCCA3=B+`_Y}pkP%>It<1R&Xe>VNq9^i zb4k@gGxdiN0ux4JtZ9a7`=nW23fNG&LNG8WE`zB21FBZOXmL{Af%xxLz>RP3VRISH z;*7qv`mMas4CKozz{Lk#85S)zY5~%iYK%4s*E^cn&6*ECYgj4UtD)NNPM^o%+cVf1 TdadkM4O`_Z;WE)rF}kg9+8kv+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW new file mode 100644 index 0000000000000000000000000000000000000000..7ff74bab1a24773dbcc31da387a661b202b99e0a GIT binary patch literal 508 zcmcJMJ&wXK5QS%gAVhRX6iBO83KviyWo*D?8%{t?k)+Ehz_}4uqv8PY>=6D$yCXeM zY`t%u<($scKM?VSurSl_Z2MP;-sDwTJ0s58d08KA;{%-7ygGdEqfHP_9;(#Bl4e~ImKoJ9|ouDodkTl{a z?1)R&L201?J0Ly8leNtbp~?B;j<6TLHv5v1Am;1rl+VF$JTv$tA(ty^3Dgf(iifZ^ z2c}iV`YAB!Knlc{U30U(=uq5hBpckC?otgF%9ko>%Y{!$+d>>bY{ojlgyOWhFJeJP zImiLIs5Df27Kxme+W_HMIz3h!I$QKFuzwu8-l4f#N~Mi;KA?}!$j?6hcknNDQ0rX> z#T8GOlsU$Oj^o-c;$Ejk-AlQDBnW`%D^YDE9)arV1Z56T?lcWdpJ{m5s&@=7%G2@l z@3H%v2r;|6huMlb9-4lr#7s)UIL^ey3LA3UR?Hd&1H8`Ab4|P6w*1)LN7Rj4HhS3* iQ;ADsaDVVT{>d3hNL=bic$p6UZ+=Slhi literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY new file mode 100644 index 0000000000000000000000000000000000000000..efad3c5bc2b26c10be4d4b4406442c84542dc680 GIT binary patch literal 1506 zcmZ`(TaFVk5cFgrY!v6L0|J%wMj+59{2B<8Tem09EbD zEXtBd&N!WFcXd^Je*QMke;D)3;L~-Tc`y6JL%tu6_3q0jzdzIx`f=JJI2-}F!n(%V zVBKJ?u+~^FnEXAsp;(y!4lN&NxMF*sa7OjI%To>5xB;8UP3W;p*o8DqbtvM3!ZV7G z2*-itYnabU8Alc04n}&Ck4C4OMD!-Ds5(mqfoA|47!-k3! z{6diJj7YQv-B5;hB!rE?07X^7S+%6v`@^gk&z{YIaJ1VY zg35SCbi!#XE~%%*4^#6hz$+d`|LLxmI*WGysK)VRaq#A9!Sk_o{*0rHC}9K z;enSx_v;C_bFTlPZ&qKwA^h2_tOdNAzldC$*LR?S_27^C2*;hd-b%l9AGaQe&aCl* z!ANxG%5DXbw?w;!o|F9jdD_Z+(805KSMc7_sx~swV>paG`*-=XT}Q#YhBF%5oFHQ< zzYs=AGC8k|2K@qlch=oZn>jDF$$snmZO}e%m6GQ>F54YK=FLC4T$E=eaVe(>k2NmP KlLgNrruz$taZl6$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ new file mode 100644 index 0000000000000000000000000000000000000000..c45028701b38b112ac35001fa5963e159d9a571c GIT binary patch literal 438 zcmb`DO$x#=5QQfJp@O&*w=ODJP)H{IiEccB7clLvr_lCBdNj|VZ`xW!TpF0nBz*5p zGPeg!E=1~1*p#CA=6K-7mvvIs*P_L(Mns4yLKs>zm|$I+S7qH~!R)wdLgA}mQS6;4 zGf^spC{aXgExRouu2lzYfKf$2^Iz z*7;l}3Du5a8iZpI&(*R=Hz+Vma1tv=bR%d!jld^Pl4qR&9Xkv#2&;IsK-X@z0x?(C zYQb|R9@9_ZOY{C=OS1HUN+NtJb_)JcjPT2zo>HgcOL zO{#?9kah2&`TtAV5J5jS+OdEh#TNeZa;1 z1~*wL)p5Y_=@lu`pxWgaS`??)m@?o$3(o5d#M(UukVVPX0TjRJV802eIGJ}mx@cY> ze+~UANaZ(MoPSB0scFsNz7*s~pzmc)WzRTK_izvUo;qs*H}gx8Kj_abe0ewM#~(h_ zFWt?OZgiNtqfiZ>%_Ke`?fFJ{%kG;Ku^#K3Ts4aFAai%@lx0>R9*?! zg{C1!MT}?+5-pWB6|$Dd^45`XXpn`wKd`d{IKxTC-lGzxPz#k(Q~!1`b?ua*DS#(oqyq(vOO1fDBQ;1gJ1i>9OMf@=CwelL*aYLn|t QZX$l}KtIc|jrMj%`yp+0R?Mn4H zmwG`hcxt{Que3wyD)Bx8qcvy2l4(-l$_1q*+JTJB()zlLUJT s)Q@@?%`jTf6eLmTw;S#%`3`jPB^gH7R9Bg?ylOIQD?ij0Ds_(b2_ZRYWdHyG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF new file mode 100644 index 0000000000000000000000000000000000000000..923bb18283295fcc36e0a527cad9850b2bb00368 GIT binary patch literal 406 zcmcJLF%H5o3`LzlDj_5gH$bREGa$urT3Qx1MlMjgaSBL}z#TXMSK|y|2No(;EICf> z{~Rax2beQ}x&kjs!K6j%j;Bl6OM*T7M8joR6}v66yDH))`Z`i$BeibrnX!zKU}AzA z1sS@kat)&kK?94+x)Ws>Dyc?KK{!xPHrb>$|2Ym@|F{kGVGp2hpq)#z%nNxcKOoI- ra|I*HQAiE5f|I_t5<+jmtsQ01My} zSiyxJwS-Mjy7tgU6QnYwZ(|iy>Dt%?sjISam{?3KRu?n~9NBP+061lG6_jdejMAp6 z8zj8K-%1^12`APokC4$I@^Sa|b)`fHJ9*dWg2j z-Z&|lR4B!~{urjp)}F!jNqplNAD(dwXL~9y#dPe{Z`UlZPw!7t1zNm3WAaH$DLwc? z4ku zuQwW=h}4A;l%n}+vo=9%j@FeS9gbafE)eUp0N@k2Kxt&r_R`L#Xkv}6YS(xS_gLe^ zqb_~o=w(&G4O&)n6?Nqj*HPCye&7L^i1hte^a?%oq7tor!Yzu+d<*1^b-_T4(wfX12;|i$2kCX%c6|$uwsX}K*zf*I0Az9EjR{OLmUBKl{=nf zKrrly)b6tLUe)V*Wqdn* zz$oW&jahqQq-?C`gubFVU)E^^0c8y~KTw3UT!e%N%A~prQUq%g6`<%jBgsYT`+2WXX9W;(fWJv9t3YP{ zjgu7DA-O{Sz>fk}e}0RM&>ekAnoh_n&QBQq{Rvkg{0ol;{ zpcYw;dU$B=gA^Z5CI3z9iS<~atc^zCqzz&7{vEC_MWaZZtQXR?7OOk*cIrg4(|91o zR%3|KtZdy#kY@xiQ%9TK6SCdu+Z{dv%@@OrMmqv>CUj@XBq`y{w=sD)UobBF5C7Swij)wxyYfiz@910MfiPSA^^cnMJKkl>1;Duxm*F6s0sc4@QY)4$ zur$de`Sa%6llMgsxamt|?r?)WYXmm(O{R}~c*dlg_Jz|B}Ag)nL zFH#vLKMmn%;q)ZF%EUcA~)xAB~m!fbNSVAoHn- z!YoL1RS0qO<3iEa^w#+yF#H?>x-tXGx)UbrwnsUrOEwgDWn+SpO@X-!LvPwnIDp(4 zK%8SXd0-x=aawj%q{|_oW^amwrA|rCAQidM$lk>$`ECv;wPX*GPQ@Vw6 g(NG03bSrK8MR4k7(QR9d>AEZ4lo-OQ{+oNEZ-SelN&o-= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR new file mode 100644 index 0000000000000000000000000000000000000000..20864a9a5976068dddf447c6831893d1baf05e76 GIT binary patch literal 368 zcmcIfI}XAy40S4%GI0im3N-^#o7yd5;RXz>En6k-0O@6zxf*AHm-M4@03tb#{rsNu zUT=!;MCwMklp>v-j>Z_r%nnZxcW67^cCM-_SJ$<()}nlH?+J(m;ip-Q3f{)>9F^AIYs9SQS_uJ&%_O% z+Qd8-Cd&vE1IaQlGO(B%7#acP#Xts`nt{!UHq^C@g&PG@2UN%ow7>+U7R>z*1W*Z( zEG@V|J5h`V^U#Et{6c|#UCqE`U;vT<14afu4X{TwL6k|YCIhRAp@NDLP?C{>(E_Rp GNC5y0us>x0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ new file mode 100644 index 0000000000000000000000000000000000000000..34fd143c18f677ec7b2535fa79d18385e9c3dbb7 GIT binary patch literal 1088 zcmZ`&OKub~5Va>vW+n?1ArzEd7PE+@X~}=PvmiMEVvXq?cR+&jjkp?TfLC_YbTW!1 zce(5H>Q$Bf>$lkc5aNx%l2VG##n?PfU%&kvD+LW1>iy#bq&>N+9;w(gG^;$V&GXaIX3 zG#3;(JTupb>R*Y=TK7Q2J#eaGT&LZ#p{r2pqVq&fQ;d`n<*b;Ct2D0Ac`9cO1G90- z00$xeVDW)lxl0_Mm>c(m>%rlWW=e^b>xdV>Qhdyva^%iiOAd|lMf)&OC_X$N2alX* zHEL#W(H+L)g;`|BNmFh_Ryn(weHP+k^XUr|PvWZehD(!^|#xU&<&s|PlwZ*Q_X{(Bj-wYY}0&#(85SIuF z$d!xsZeU|!46>|?k;Zk_b-f=z>F1Q7z&YnQ0QoUm*CUrgDY5WND!4DHB|MFExA8fl z9cF1Ws-I>}PUnIHqHKhNCd^0SLB5+rx=1r8<{gWhg8cXMwD}J`sU9D2p|4V@mU(2a-znM^3<^zo^Vz~eS literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA new file mode 100644 index 0000000000000000000000000000000000000000..014e949f77e1d80146c20255f0e2f98c810446f3 GIT binary patch literal 981 zcmbW0Pj1yP5XPO?R(+xpJJxiOMU5~T|Bb^2aRc^#-n~=6Pt7bM8M0sDE zk9F;q15k~y=l~i>rwp)Q2MH7~TaFqCvYO-;a&P3I5Tl5o5X(t?kr+WSNKODkc~oXO z4}{1BtU{*c(utSV@*=5?v>0-sIG6+{N;#B9HR1^4 z5LM(I{qO)uL9n{2UKRkl=utle;VKqcifuH66G>jutJvA=Q-J4X%xSjQryTo%CI;~a_H$GowW zG0v5&jbkMla=`&2cLyI3Dg6n7bLN7sw*@8FviAZf)4!@;R#D4fDDpS19WDz0_o_|0 zNLKRScysvn75rc3K%{zdyE1Pdv~5{A&JyD1pFiJT7Ei-d3V9W XANdk`oc;YA?&pY*$xKy3^_uLp?;Yoj7(_5Cc2Ao2{&{BI-O5yjq_D{&QL>MInlF zKHqo0@2~oOr2La8I}(u)f^N5u4?(xJA7a1T%iaFqMwBwF0&9KRuMn@%Kwsdew+&4@ zM2qG@2E_uMcMymUb?usn&`bquaW13hf(puZz6XsANmpa9LkgyssXH+^4z?SVlsr{C zvYwvw+Mo?zZJG``LDz1GE|?aX52nUI=;+voz+xZlCwUN5XlURCd4iyc82I>WEuu48?WGCSfL&X6jhCjrcjWR(wX z7p!Pk=Ar;naTKwzZ1O@%h~~bjv(SR7)cBI}wLulAh3AH|a)eo5M>EgNgPXa3A+#_n za{pd+j1X>47lIk;ESCn3?nRd(=RtJ?XfqX2{<@+4ysg2S-(KT##y6UuB}uBZKDHY+{i`jm`}|n^)jF@DA-)0Z4PLbX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG new file mode 100644 index 0000000000000000000000000000000000000000..95fd8f4392666af0476ab84abe7d33a09f9cb5ec GIT binary patch literal 549 zcmaJ;yH3O~5L`!`F47??3JMB}EAAvBt=|qpqNJra?)VDM`5Ib&jc)XjrN9=B@NM|$nG$LDrldPY>=@45)j}QfV z1QMUkJeX2lHa?c>vvsA8A_^w>Sr22W$!9i$3%Ji^L;@j#xNNO9*7*R{Ye+^g6Ns*f zoPv}WbStf>kNgMk(L(e63t0q_7L2e+ePhX`iTv}c=*FNtqa*1hW*=q;ZgH^4o9LUo zqMeDEwM=jY#A4#i!?}qSU(~%kW8fdOW3JjUMq!Jhj=6P#t)r_0O5)MvaMO`CdwsVz Zt;b89DxNU3xeKFV0b0Rc$V&-kUO!l$W~TrE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH new file mode 100644 index 0000000000000000000000000000000000000000..e3ce4c51a64173df98441e8bfd50fc5099635d8f GIT binary patch literal 1193 zcmb_b&2AGh5FV!uO`CuaQjee<_K+2cwD$P7mr9&C!rAdHJOKwJ@V*L9z^m~L@XhW< z4K2Af%Eb0~=9_OmPk#NT`FEmA!bd4Z?>F~%+3Z58X@6+;-HAyN2DsmarAx?smq?E*o}GNN9|_W7hECCS{FfpcaILf{7&9+@#Lwu^g%`Mac&lh1jWV zh+j#>ln@1n)E|6gGr&I6@iEqa;A!^hBi#2i>pFz1=|>_LwA?^*7({Pr-sp8>;762E zG~aZMZgG4q0k$9F?AD(~&gcWnvvTEBt#7N96Q%=mkl7VDv%x;#%2|sckfA6tjLuXK zhi?si9Wgq91fb{%20`pa&snWMX!Hl7NE@K6G(f0VKIoA626KF&Fly^4$GRIUDUEpz#Dbw4Y dO;Hj_?kp~N*yz16L+N%`@3S`U z(9vYt8$A?T=P+@+9zP;G6$5Cm6p-zp3c+lR<`Aj69a{L6lno*>a!gv|qkzPtc0g%M zSOdF&tzc`|3)mTq*3Mziu>o;|RQR)|c&m`J>q|fi8~a)dm146EeetN!M+Tq-7f?=# z7^S|n+4!C+i+$-#4MU{t+kyQN!)5CNpdLAZ?Ra~t_>i4%DJd^Rim9`Y6clM40;XEQ zA!2)l!?YX+es~9pi(;8>cu+Y2wNxjCM1Yuqz$bDBEUVl4!afpL3)sXH>3ZS^97?gW z#yTHjn>z6I)}frN57x694nrfM1r~nd+ zM1o5L5c|NP=|%@$sW5_Ix4R#=3P2}3je!EX|a;4x~u^s{3d^qn@z3A1`9}1Nu!Iow;pXnv=Xg9FPu=nKJxn>Nei-rBPY7YxQ+Jn> z_Uv;L(l)T?uq|u{yMkTAn2>%T$;fQO%IKyHmrA;iW7gRGFlK|@j@jZY>*04v+ulb+ zJY2>F_(D>)4`Yt-1VjdWyRidVl6sYxRrv;YQI`j7rV`$Dkk!CgEDI$;S4tb}e24?| z-fL!1Nh;Gj2t1x3jyu5Jn6+C6eTYMgPm<+_qz#LWaqd~6J@dQu0PtT&DZ%6qfm_E) z9@+&Z2+mj_Uj@mhSU(rz87~$*s}2h^0K1D)G3zA;?zuKjB=HA}|M10Z4fm#~s9DXh zX5a{K0kN}Go{-C1W*Od|6Ci^#{v%@nl>#aqMN9d4kVeg?kMKxpq~u6hTiV`$*i9WZ zt%6HXqXrJWWWSlZWur~2_N^|6ol;rL>@DM7GXSGoZOEcsf$v)bNJF17sZTnbioQHK zWhwhjRrXrd;j$n!sVe^5q_tOd@#5<*daqSBLw-Epb{=rKOgP#j@$fL~{F3P1<9=3O mP(?4+?(SQ@1VL|?caP`(&r4>yx~x_2!Cu^xAQ2f{miP-+<@R9! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM new file mode 100644 index 0000000000000000000000000000000000000000..592f052a1e49d8cc192337133e5e117f4944bb31 GIT binary patch literal 586 zcmbV}Jx;_h5QS&5+7+v%gpMLbirpfT|7|Eh8~};lY`3R?2ur#q9 zzxTbd{Q5@gXQJkwh?to!a!kjk(@PqMZ2D_i`VnUhYJ=LML`gQO9I7CU!~X6j8(a5- z%euE7XM@kGcM+=tI8HcaFm0Sw+E{RIqe^f)D19}ANj--u)4Nom(%Ay(J%|p-bF?Nj zWCqD(ROy>(o0O7Z=b_uBtWCLMT*!1)1@RJpV927N{=1!<|KL&c_<)diYLtSUr;jLC zbh*cc%y{@c(OIY4&a|B^?XAnJF|Aam@uPTb_54gT4@U{O67Hl~rtH2_+Rl|APTwKo GCi(>QkaHCP literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR new file mode 100644 index 0000000000000000000000000000000000000000..253a5eda92e6cede00714e0346f2791c22583fc2 GIT binary patch literal 644 zcmbVKOHRZv40Q&fkt(r-3$P)JN^TP8!-gv$w(0D8imB&DT#5s52Cy@o0XjlRSZb3v z@A)||d3}fLJ-}uL0Amc?Jv=>D%4IiBUy73a3DsKtkkE-9 z>W!QzdUe6|Aieoo{5rMB2r4xU0~b$k%#HrF7xs9V1{XS6}J5XB!x04hYCnRS1{5&Q0Bn3 z?P@>HmVMIp1?-;U>K6BIkVM6_P(=OxRZM+Ss?-L`ubx`v7gok{kL~Gz` z{RouO^>LUg=-e!EvP(r-X$~bH$_9j@%g-OADAlDw<>m*ynlSB5%58bXZf$#BlGpJ8 D!YE*G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT new file mode 100644 index 0000000000000000000000000000000000000000..1cb1fb6fe6ccbfb3fd69bfdf4debeb0a8c895ed5 GIT binary patch literal 833 zcmZ8g%TC=e5OqMPT)OF|T~;hEh%6$FJ${VYuw%`Foo|GY?pILfkNRuJskq4o*hT~;#GJ>>H8+(LN9aU0UZ|nNY2bVk_^VJMO=_!6h&l+` zlv3qUu}L)ND4I-7t8+r~)fP8-SXUgUu5c4G#Sg+CLZA~+pfn-nR+KvGbGf(Idw0EOzy@>SbaeGbgRi&`^9g>1p+Y0| KmuOM+HT(kw45gR= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW new file mode 100644 index 0000000000000000000000000000000000000000..3783c6a81e28bdc3f04c831052890907c29e5f0c GIT binary patch literal 454 zcmcIgJ5t0j43&2#Y{vy?D7IJ^nQ>&2eBC?nA*9I1*<7$-DdxfX9+Y zde3^#etn1T2_U?Ir4Zoicy}`)^|H+CylSSRV@h#epJ{W7#oofn@L*iDC`FlLf2=za6dtRn8Zxa+Th6;m7Nb@;G#2L7vT-}OtW>9+JO4!iqDfZYpRq+uFxX^u|3 a%cJ?vTl9mr2;E`0KA>R%I(zx}!-Y@7(_#z& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY new file mode 100644 index 0000000000000000000000000000000000000000..b1f8f3e7c83f8bf60bf087f93d36529926e9a8e0 GIT binary patch literal 1810 zcmeHHOK#gR5GCa}jcOn$3KZRRkpf;=fDQ0BB$Y*ag#uj_w01s4OW&wBD|&|Z%}5Cp z8E6jB8lXu^Z|1%E>Bld%{-)HG!cS|h9*U2LJRDEoX`jzE;1KyhJ)h2%H`-fsuDeh7 z?s%$H4Dg-c(ivW^r}YZ^4OWZw8f$~4vDV;GKVj{Q%l%M8ae*mov^5ob@I%eKMR7{| zG*ZE!*l>uft-2y7#?w%Hz-j2J2gc^=i;YSAdcsb&7Tk}gt_B9c90-RO#e$2CLxMF4 z!y&ML1m$q*YQ#gJSyTuj53$ySrvY&XH~~5`e?kO_AYIZ?GiA;R?IY)8g*DGdBY8ls zv}&DoK2S^(a!I+(dbtK%;f6bq zTW6jo4$VzM(^4C-7mu3HUzKXUsKyw))6*X#Th;C+?oKsZE5;k78U2G&+JQlD7~;>J zY^YqP)?0hGbppOFjumUQGGczqC^v%XIrQU;t*zC12RGe5S{$CD$cWlM@(~q;C?m$n;yDfp3pOJ;}xy>QQy*+G;c^}oPIkDLd>msu}c! zQ!9i{2<1^!S+<6abscywz;fJB2hFK4i-1en;>)J&P+Uy8gLIF5pR$)DpK?GADMysf zM_6X`E;N_^xO24P-80;80{UFid^Z>La_ez@7vf-GaFN^?#2Nv~s}RkP%6&lp2y4(B zOij<|sLN4{_m*W=b(tNhPdtmSA}vF3Q6eBRQeXoeU&cCEk9cJO{-1$H@QUzWcI#69 z*e};|yMr8_pU~Km4q5}Q*4KhOosq}QtrWX2blaG^v329>rUPElaj=ZZDZ0{)5d}G< EFR77w{r~^~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO new file mode 100644 index 0000000000000000000000000000000000000000..c2a71717e723ce7856c4949171af0cad8e2c0ce8 GIT binary patch literal 736 zcmaJUNB#g}1Bi7&j01t{b`` zwo+C&Gz`RHP#Of$1i5v-=bK%v;Weg4@7BrJ9MxpTf&o1wdJC;^HnxSA-d_Jtq-*sj4s65A^|Jo zG0T{Rlz~sc13V#zK@Lhbn6%_(z~H+P;^f_XtXzuIq}3qK(pMUWgi!p@bs=tcoiPn& zFXusAjd~i*G+KbLi#PzBJw?1Egu4YEgW(=65?QYZ(oSswb zo{2217xMR5JXu%-mTIT*_RvzOg>_pr|8F67EO=TaUl1QCyHCN%vHoET=RsGBA4?`h zK=uwC0RFP|j93OWCe*xyO<=d?`VxDR0c<34Dl7w3=u!L}?+|$}=Pc8CI8+cv2TXQ21e40oA9PNyZ!(bhPjvnuasG0V Y;h^**iGO;*@BEd>>Dve+;X6G128Q>}VgLXD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW new file mode 100644 index 0000000000000000000000000000000000000000..9538d1a644f415e23ed425aafea3af5a3772a861 GIT binary patch literal 513 zcmbV|zYc;h5XP?<6NqutMF)lsFqj;NP;l`bTpWOnr|{1k`D*UQMZbcAF$~5_u3vlk zeRpjyR~jFP)QzwxMT=m&;q+99smi*nPeqnj%wbs{(=!kU=^{O(HPF1}rI0vDGk7|* zCCHP6BZ=2Z3VLe5nN<$%Xly@)Yv$l2{tzLUcYT)h@cj%XR+HF6FIg(f=kwfH*r^%{6%hR!S`(6(K literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA new file mode 100644 index 0000000000000000000000000000000000000000..f8c860238a7d08a9abb5795cf460878e9e5c86fc GIT binary patch literal 626 zcma)$O-{ow5Jtx-6-gKDVBJL)4N@fkWa5|&>KRzN*>%Gez_}6U;5M8AzKMfG3rMvz zo@D0f`Fs1I^$St)Ohig4y4yWIM8o6ZmL+XqRE63IiMj?)Y``19HrlQo z#^j=7>0NYfkKRYy@|b+InEO#|z1YMcw%MepGRC@&dp|&W&pt#A3t*lSOC)W?7bKUT zcfU+fRs6$JBL8=Gc|~%A*Jvvku#)S--*fs8 z0ToYsqSZSUS_4=3P+8fiQ=w64vzwi19;5ad=iHUlm<;8f1swssjcidMQd R7xR3|FXI3GgG8B+`U30*Z^{4w literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB new file mode 100644 index 0000000000000000000000000000000000000000..539014c75ca0e94696cf539f798059c0de11288e GIT binary patch literal 530 zcmaixJx;_h5QWE)tQ8b=+i$VOM#7T+;@C7uT!C_Mw>>>L$JvgnaRzwfjaDE)L>bLE z_I&gF^7c;pg=n}UBBc~`am}F4!Cp8nHphQMx_c-#LzEF14`_IM^av z<7=DPhT0MqVXh+pK>!LN02De}=K~neG575T7T&}euo-iaGT24hTj`U$eDrKxkRqH% zaTJ9z(L@oBW^0mAG76DakaHbHM!$zBfP~E)Jv2m!xON<}-1CP_mqli8_`tKaO8=ir z;3jtdSKQ?O#dVjy;QQ?F0%&-A!0$MbwlJf1QRibf2VBB0qoipWN$=fm@3E(7w_3Zp N+AW36`Qpz7L!WnAZUF!Q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC new file mode 100644 index 0000000000000000000000000000000000000000..0340ea64c9368c016d5aed6130555754fa949240 GIT binary patch literal 413 zcma)&I}XAy42B&fRK#OJNURJUV5pS1PMWeXa0JG*TTcP$EjR{OV`l>=rHIEuBqxgf z{r=-zt}r|Th%@je1T5COtwXY9T{Yg&rfN>Q4Kkg1i@$w=hEp>M+Ju((NL^|yo7EG8XZ1LDr>srtMMSeAuiEw!HKG2~1A zn&hcS4E@n6&i&>T#9!txIP5ulgRxZ7^GF%i0tQk>qsY(KRkPtZrQae-R0tvKJy zlkBvyH7T8oc>d z%WYN5Ly!lTo~ms$u<%>>xu336oM*VsaXrAbz$H|R%qtYB;z2q2v^i%t}V{c zmKsNmV;vj#@L`=t3rL9v_|;&*P^Jq-mcSH7Fa=lwWGpa_yx_*tz2yxMzSXV>LJAmH zkso8x4WqGmdGsk9No&8xdq5eq>RgeB0}qykKan)+0}J|wBMmQ=5YXgAEHR+QgrqnY zCmitSApzs?mPAd!@0m#e*uSe>13Bt{$7$R%V?YETn>|(6Ky-v3@~=iX$7MPO*x{p2rOJ6OfsEN4+Hf@K-)X_ zb34DYlL)`@;SHpR(n!CA_#EekR2Q0x5c)Gajq0M(p{B=Y$lmzYIJB?|EmVP4fqlc8 zlD!BrQw!srmL-tDjZl)Wo}oJW{1I>7s-v<5I7?qNTBxU2aBH@?9B)wW^sLU7x>%aa zrG;6hj!c=U<8rC-^oSM%&NMx5v}hQ1fi0G1{upOkZ_O0Aorxi8F;QE9XJ_5^9iy zMi)bxlN_*f9Htw?SNNAI%snXKER}rA1rpHH&WwK(G9BF#uV}{&P|H6XUG(#JeWc4p#+ZiS*JxObWrs6itsZf zn#Tbx43ZU7xAyPT*mhtv4t=~!rNhEubSs_qi55?s{A!M9FMU1fa(DSU^E7ryT)vkU4 D!V0~Y literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH new file mode 100644 index 0000000000000000000000000000000000000000..2c6bbd1f8da3f6c756abfe28153731783aa0cd38 GIT binary patch literal 323 zcma)&u?hk)42ILgBCd{(PC6X4xwf9SxVk&GZhZ<*-^f?<8T3yO5fQQQhcx;4llFQe zdm=IeAs9pR)o#cf)3MZZzbPfU575&R$KTAwYgFZX!bKfh0?}4-vrb?dY7x4fUA>ho$r!wrOL&&PnqTTz(=Q*dTXcU~fa@9(VwH?M^#KB^sq7?&10Tg*9Y2 z{c{xb4B0MjwrD9}tGEl#!%d-;wPWc?BM5m(BVw8weQ{3bzLIGTK$~sFGqgPY{R~-$ z8-#G|_~O%JE;&l)>@UdK%M%#h=|;+=Bot|#yiXyd7%M?%QVJ3hO!)8`)Afoc)K~1x z+V>SrO0_ICl7ePv0gXgKBUvhht}<+gcBj~}izys{^JCh99rz-1FH4i@=l?#11IHaW gcDi;1gGxBM*z+t)o2jPw*?6ylCMzhd5X(z^1JL}LlK=n! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ new file mode 100644 index 0000000000000000000000000000000000000000..a475b19afc8c41b8a9829a4d1ad79a7a97f179f7 GIT binary patch literal 516 zcmZvYF;2uV5Jkt4A|fp<&7J^?h_PeGV;Xu|N+(@T!Fq4R)i?nK{BhW5(Z5h zulf9<_JhcL6E(C|G4b-bp8xpI|qnKj)GXlmSGRUew<5oh_D72 zZlo8nu5I)LQ9K%2|v_aD#gMny>fEXnykrKP)0XlZ1y?M#Ow{((fpV zQL4@bBIwK?-F-hN%D;Y7{!FwaTtW!C^Ll4nci10KZ5OaGac=uLZ<`LO3&a^>g;*oF zn4az*ziWiDTo~)Bt_;}0?W>(Rc(rSR5nAO+3|1=am;>gxPj$z+I=rQp%G-uXEAS@( zW%tMZF|sl-t+iIVs*PqZdvA|30mMkan~FuUS?7y$6fp{1vp6laIN#@0-<40=pL<`-w7tYv}d zLT|3@+n>6Uq-FqkJ35s8`~g8Plt~FDG5j#e8GXJ-I}s<{#i4qryOPcewJr3vsE{Kl z(@M}n77D8`liZ<1Kj0X?E6HdxIZkvrS@3~NU>6JqJ{}k&kF;RPXaVoEN_&;t?Hd0tQy>!5)E?HJgE(Pfp`;Q=U>z|~M8)yxOdkj-1>9esah`+HF&zloz2yW-29-&ZJ_6XTpBC>yb)Mx#et9H0<1L}?Ui6>Cj%H(j@mpsbcVKN$FEt}9J&CWIA(j>S3vehe2FLU1{h~osM}g{ zE!i{Uan!FL+I$dIFGOUFp@-euYmzZchhvV?9*&>mNk_;nQb8mF5F>5k&P_RRn_X~O z+acL5PB|t)X|uOhH3rovVQ4FC**fV5NIj0akL}Qvjn3xCO7L^Sc!v8Cgqy&;oTF9r zJmz;Hq~3=J|JNcR^#7py0Ot;{HR@u`>%nAx5ogWue=~){Uzhshb`I WLnbJ%kS^#IcTL*hpNLagSU!J|#%urp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO new file mode 100644 index 0000000000000000000000000000000000000000..c4a80bded3448080ead9957c020e3025c76f0305 GIT binary patch literal 782 zcmcIiJx{|h5Iv`)EkdeTm=IEj42?u2f7@YUVrF1;v*lNS^N;vz`~xI-=M+IJ7>RT~ z`|jR*=lEXVsD36|)I=nNAeoHyT|ex{mpJ95v=8MF_|Q3yd)^uwdG99R&R|Q}3buxw z!cJ8ccMmcdnJf3Gk?={gC`U9R7C!O`w<$gNfEKu1+BpjK1?=d4 zg4RKmF1$dF#0Ng!pg&&z<9JH_iyBo=j|jh0B_+zmVd2UpZFab%o?3QxYN>A2w$Vrl zTF!r*>sFlhNLP(2xw^axr!J5xXion?-z4RRKcD#s8IF+~Jb=cZZf(Y64P1J~`eyF( z+tIo-yKM|g1Z^;6o&vl#;%Xd#3jUep8AXgVwj+Pv z%*c6prT&RXy%83r=xTd+Tbz!ym85gsAKGko`@?fQ0_cz%*e zjK~FYWi7C#kgVaban?E?pk6~w#pK$iVqIW2qtYyzbYo3ADH^80T7)-b^EJ+IAe(Ps zUIpe)K<0Qy@Igi+_4A4PF|ExVlg$0Ey{xv#D8r4`v8ycCK>srQY0?k2DY-w%|Q4KPff$={OK+T~Q7wiQjo51#h z3Ap79Ou@lGk;@EB1_nUoj8FoiQd9%z2jf~zREmK^#ZW=TNI}IIsEUz+1r%nC49o^9 Jh9F&F008gDLURBB literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST new file mode 100644 index 0000000000000000000000000000000000000000..63ffc4404b42c8197bd4d376f9aee36f8e12b339 GIT binary patch literal 338 zcmcIfF%H5o474k%Ztw+$BDDij;wDnf!psa?+O4mERwFh-di2$iQN_zt_*+cvQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV new file mode 100644 index 0000000000000000000000000000000000000000..95054b58ac376e29d25badc17ba0f926cb803e9e GIT binary patch literal 584 zcmbV}!A`?442GSKu?i#(2<|&nVmVZD({xF9*+U@hlJ?f8V96WtYMeR3?+nmZ?L;Lz zsr~u4-M)X&@{Oq26OmGiUV`arHxAR$rMTJeJP%XsnKdFdA&^fk_yV?qm9Tr52++ZR zaXlOdZmp~PF@^?ym~`|%abr7w78mU{MX3b36*dOv$H288CD|nrhe<13O4FFuc3X#r zcj0f|8RYmx0ebR`J&ry_kFgqA&x&RNlNIv#idMj+1{IIkIa3!a&v`(ZhXkoFJaWmC z{`YlWd_|9n*8`e-Qo)@2iCfUa2J^N_%VCqIW!0=JgOsA1fX^*dW{|wX+@5~CP|uf2 Rzi^oa*HsJTOj9a|z5&2WaQ6TJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX new file mode 100644 index 0000000000000000000000000000000000000000..9d1c0e242ca0cde34e2c12d2c658bc36bc9e0a0c GIT binary patch literal 698 zcmaiyO-{ow5QXics!|bW0EsSYq)7I7>^N*V1REqLyPg83H)6w)H~?pWH%^eC;>S|r zc=W#cdGYg`Sw9-HdNIaWYt3a(A&rNpe3bp&ZB1nw592`w?;WE3QDu0x%f10*u9ShA zD|Ka(QsXemP<_giLadN31vl1gRnC-hUjW}MaHyUpA=FCMN6tNRliz){ eYtDQK*sQ+J_wyBWI|J6dZ5(BoY-8N}FPfSPGKAyIC4qdMaexaSE_+#4R{a&H(eQ)e1$lSb87( z&AfTGKTo)P2h<64N@1Jqy^m9Vefv1p!cCNPtSoo5HElEJSB%#r;mKKIhQnCP{_(-m zk`1Jl4nMe5-h=1YJV1KI9TbFl%WbBCwJjAc%;rP`O%b#jHxl& zSc+&F2}Dn!VJ9PpP~TjVuq5t3w&$(?P(%0p0<6B!8AG_5ogh1G_q@5QT7sX$AykcZ lZ+E@h^mcq*PmZx{WSxb*I>P6yrE)-D(egM@xWeNZQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ new file mode 100644 index 0000000000000000000000000000000000000000..ce335be555c6cd04b58a67ab17db2bbc4758f052 GIT binary patch literal 455 zcma)&!41MN3`OlqKr2v3KpZ&GL!~s3hH_yDZnWH(0_aA}z(&jf-=ciJ8V`X-u_0F6z^4y(;b8@2dT&FeX7UuR#Tf5D_7yhhk8>(xwjN17SP} zLQJ8xna}Ke0dVL`mlmCr&xLV0sOaTD1zIJkH%cK4y?>@&(2BAmP8<;5u;c(AlG-cN zz<&rl-TJ@!zx7o8mvc;Pv&HWt3XBm_S3vPh$DA}9^`_ZmYVpX_FO3XdK&4#WMRB1@ Fn(n->NRR*k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA new file mode 100644 index 0000000000000000000000000000000000000000..248ff7c0c84f2d8e26d703243faa9f341570847f GIT binary patch literal 245 zcmZ4UmVveWJp%&+BO@aNn?+1YwQ((o2gEEu3=&5YhKMk*SXf$Gf|M{Y{s#i6D4n=q iw;@>!b_SS$yM=)%#1ZH=B?cw~1F+)|1S12Z1p@%MAu)>p literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC new file mode 100644 index 0000000000000000000000000000000000000000..75da36f588701a135553662a4fcb4661e6649209 GIT binary patch literal 739 zcmah{J5EC}5VV7$NRd*|AW>0}A}%7W|27Q;SD<+LsUS2sX_;8Nmj z9m_s|7s&`G2uFtS7FsQV2FyAiz@>=`j&Ii0fkU&~TnEFx-yWI|144c{m&|!PCA%$1 zL&V;52pl7eqRge3=C&2p9MVw?)GP}TM8uQ}gsf2FpD4tSs9wbfhHRwrx9CJTCa59d zjz;5693_ZDkBS?O#=S8dCPFT!c+?8412G`k4-zME2tFV>$u!;RMzNPBq-}(K)l9Z? zblp1{ccI^;kG+wqQMC%Dk z`Y!1?1QduyD%4$~h|ylE5WQWVkG(goV~Sngl+_HGC9Ovd|gLS3K3d>5DRmbv`M{Vi%nC9{V{ftt+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG new file mode 100644 index 0000000000000000000000000000000000000000..23c0f80878fc1056bc983b125e86ca3c540d650b GIT binary patch literal 379 zcmcJLI}XAy42Er_N);Rdh7K9pp;GF+2n!<@U<=te0VAY0;#jPl0h~~w4y;)6Bep*O zN$yXmt^jxe4v4S}ijNd;0d>7Y$a#v~goH=XMkG#M<0 zP!rKWN*l)4OuHa^+WMG07s~cNX2Q-1FNY72SKy0n+V!tvdE`u~=$7ymhsE*0od+zW g%#&gWo0cz6WA`(`N(_ylMyN(;1`w+9wG++h4Py09UH||9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH new file mode 100644 index 0000000000000000000000000000000000000000..d8f9f301a652d68edf8df4093a01da589dadbf83 GIT binary patch literal 643 zcmZXR%}#|d5QST=KS1KfMBUy6iT5U#WZFUtZcJSH0PYGqp2Az+$XD|j^bAx)Y%=uk zoNuPX$EUb_7a~CjDW!NkJUgF({r+?Fjh=B1L3~9C3qS zh#)YOC-w#14Z(nfWyQcg)R=4^oHwQGnQ9p(5e&m3)k>SHwhkz5-3%)muzVFQ^%(fL z3f3!z`BjM###I59H4)Z;cE3ChRq-2_^a;ev8>GnjayG)2sg`J6C@aCv`8=wolP?Tj zOs^60cMGlc)S!*%VZ8q-&_;yg7OYKww_E0PyOAVsuQ+)T*F@+`+ruMi{;+ZFHWaest`;eScgDC>0Ej0gJSMdd=7^! zgZ76kydr+k4qN{<&G&xdlznrzm{alcjDPY)Wv`W>s(;rir$SfJ?KWSq#K72@S<+Rl zH?`T+7L0;QYc*BqJge@QWalH7XYP+g(6w8xJO%4wR%Rz~k51>Z8-62r6wBj~iz8y4 N7@tdvaboVi{Q?xekD&kn literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK new file mode 100644 index 0000000000000000000000000000000000000000..f6092ebf3de4ec441bf761262fc7d1b7a3399ef8 GIT binary patch literal 299 zcmZ4UmVvd3fq_wp0Z1@1GVn$l>6)0w#-vmm>zLI71zDh&6-cuIF*^{0lrl(Y*jpKa zRL9mt8=C-iXaY4E>6n5vfdL}}i?N}BA;?g3usTe6b0bRwMv!90|3CoMMJp}?noVGP Y!35lL2Br{i1_q{03`_*%Q#wdDCsn1t8%>T#5s52Kep3Dm+?7 z8e22|e*fd-<&D}$qUxH6gb;Mm?QWCNJnj$EVATHb#B)AEZjc$G2QUU{!8pJ-qnd24 z?c`IhUC>jdv2|*iUoew-j%y147 zf1mM-VqUmBGl_S^=gEJStt=2YF^5!J6$N7D;x;&a|agcM7Tnyxy$*UswC zjZUT6N~@*Q(gPP%87t_di(6?F8kbq-iu%V5zojjHS{T>rvy~~&irV5143lHP?}2B1EdgLEniOMk28 zJ`C``k7!j*7yT7e2I}h=e@_>2k6HZ?b*w)OWHwM!b3x2k`^T|9-a=fh>UQ&^)!QqO jFIq8crG}x$Jw~=ur^($CHLdJgyK5b2c;uhInq^2=cidT7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO new file mode 100644 index 0000000000000000000000000000000000000000..5a0b0a8f6a513a920ea02d891ff889aa2299d154 GIT binary patch literal 603 zcmaKqO-{rx427MdYQzSP0E<~nB`T$E+%{}D01G6$>yPIo2d0)^bX{S8z=Y5GWHuE0upLi8OKgmlT+QU?aa)-Qgoh~RYmRYx15FMvPjS8rUesJNC!yaNOD|x)O*UP2H-VqmYe9Nz(-V48nzs7HXH~Wz$ zEfP}CtTeGTo;UA#W}KhDX!)J!72#7#k#@WNL+DGy!n|eMm(AU$WNRPuZok`?&KQle zwg*5^=dcUd8`xWzq@f?cSiy0VlMT5f8?kXAV(Yy4WEa}OnRRIn!Q!{B4u|j-NHan^ ztBV^V$72a?yabHrPPp_zo`M*WMv5*h+s66O#t!oCePE<9%q8${F96pUFRsMCZgb&e z2GwnLB{dFLFFtYYyIi{DKr)x$n8TZy1RU!q>C6y^9ag(-dVN_}& z&71{Eu7Hdwb~&EZ{g@Q}m{`S2>Nh^wNE>c_Cta|d*yiE_k2jS=*jyR}p*oTTkX7`f z<|jdLPdpOj+5WWv^ZljBE9YdEoD7Q4$)I3!4mZOF-;vzmRM8Fe;h#z`YNulmEkH~?pWH{(`%S^6WN%Ui?oSKoED{>2VT$q_KFd+{n-3)3AD(9?qK7hD& zV&?9oep-N{fQZLw2{IBm5ETK=P%cz>nMIEX5Iv%}r(Wf)XWmEf7Gp#oap}g8_Y?xf zNGVayRElm+&O4@a4Jcv@7_`Tf3-sT?)<3flKW9ntUl{zsZhu5J+G7G5xIFe#9E=>q zLZa{?!UOr%T0CJuE|>W}u=@_cfMb4uPEG4w>J*x)aBzz|XpA$3s&#jbqH8!$iaPn) zU1Di)i90LT!}I-M$Nsk~UNz#vm)}eF=@v~&wqChJ*x^egunX+X;eg1XR>oSq27cV{ YyV?9ZprLw4c2H|D>@1`E00fcY8>?fuFaQ7m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV new file mode 100644 index 0000000000000000000000000000000000000000..47f5bcb8670b588cf267e4d97a5381aca3cec85f GIT binary patch literal 410 zcmcJKu?@m75Jmqva%d0@3s9s;3M9t~icG^2h$f-S6p#$T9uzFb4Dc@?lptD8`o6RL z^lV@6uqQw+;39%$y4(7$YTBmlg3FrrT=qPQ7|X=Wj8PbKUpv1JM?!@{!YIVSdYAj+ z?W<~+6B_#rsgFw#2gOSjKprd|2H$_S-|8Q?!R!x!xxqL$yhfJ@iIne0OBw(G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW new file mode 100644 index 0000000000000000000000000000000000000000..10970e4122f2cf871752a7347a6a923ddc661d22 GIT binary patch literal 1375 zcmah}NsbgT5VU7u77idZEH_4?k=jz1ccmom=2T$GR4ICKPk9ZS5;0+L&wM=&p z5~a#^mn$P9a&i6qtt<|qH%2rVb zI2JA`N1sR@9Jl`jwzOVpbw$*Z^C2dT(R)Po)>>9hC>|CWA3q|(1lNG`)G)Nn$PDP4 zY~c;5aExQi79~V$;do4lR}&7Xcf>;knGV^>gb*|N1;=x`u#t5$PU!#O;y;*wbx{gX ziBSjo$|F;kY(H^fSVX3D6TQsPEq#F8mRNRP=+~p6)iv-_oibA>z0dz5aPmG%64NQ$ z*AbSCMcp1$0v$$ECttrQb^2YsoQ@Z!jQigg1F*KR54= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ new file mode 100644 index 0000000000000000000000000000000000000000..670561c94fc161abc8b25ba972b01e5694deb4e8 GIT binary patch literal 612 zcmZvY!A^uQ5Qe9^n{{L2!NhnlF?-;!97v|6l;Xvg@MPh}Q@HR(zM9Xl{?mf6DoGj2 z{Qoz9`}sxN52C9;L`o@oJifjJQx(2z`@!m=;k@ln^(bwuJ(dXR)&vtpsh57!-WXHb z%GDl{C!k!=MOhV1H`IZ3iH{%LY;i^>k5D}ameD6C6K9EMP8vvd4bOq*cC%{VdrY-F zIE;(4Ep=$bQ)eY8y4$@!nf e*u`?U!q>oWBR;ZKg>n&NVxs(s;p&AcHllAff@}-` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA new file mode 100644 index 0000000000000000000000000000000000000000..72e05da79778955661cd196deac0362ca9b18fd4 GIT binary patch literal 998 zcmb7DOHRWu5FPgelttNq*s`buk*IL|OAHId30QSyyg=d<;BX?Y#1S|HyqVBK09C@$ zB(Y}Rn>U}lywUWLX#7eF6FcB;2XhauzlDVHihlLc7dYPv+GNn z>SddYOSR><$F<2Nq}n(ia|OzVc@&I!1{{iJwyuqJJ~W`aXre}Z=nC`3;x%||VA=+> z)`K|W;}2T!&%FMkI%u^PVc_%UffdL>7(9I(G9E;P87t-f2!qE+94jaFj`PVdyegWv zEXp^+BB|EJvZ^+&Rc+;w27OB-!9xU%RyR;mXr#5Gv3|x=X#nxyGohn1lxw?c_@cc< zeX=ko3yYu;UGZ#kGBHb=rAsnCX*A}C!N~+2`fNDHhZ201jLUR81bYEC{oJ?U)|s5- zaG^3uV_#zCIue~3Z;~Vtx SaGY{G|BavUAG`sfb2uL-1<&jN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG new file mode 100644 index 0000000000000000000000000000000000000000..84eb43935a1c1387aac508a72481f53153fa8281 GIT binary patch literal 669 zcmbVJJ5Izf5FKwetRev|B@`((MWpdRp`qjiR9<&ma{zE|!7;cRXMi^etTu=WE91nI z_vXFvynj&rLbQ1!BBd1F4$Oz+YnaOZ;Xau$b4k|4d^mPU$4Ov_22mku#06ppGCdmx z36F7HET<4NNF^Y{oVYhxvfR7eNijQX%$&qpB#KGCAAw35pyFq22}w(~6C(hDCu}cP zWUXu{YOFTa`49&<8lp*V$kLIYN|csZyM9=-Si>R2IOH-y%lZK_z=ogN=(UMw^{#L` z@Mguv$$)^6Utkcu98Z{4p^^1BMr^B3Ecux4^S{U6g468j_Ow5wFbX7R2eq3#pV=M+-f9eG-e>^aE?}VlT4KPIb3u|&gYWk+^xB0 P;l?$0E7Lsz#Td~SVj6@) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US new file mode 100644 index 0000000000000000000000000000000000000000..65e034d428d6214b5425c35073b239f7bb8dff6e GIT binary patch literal 2128 zcmeHIOO6vU6m(}84T=O33l{8<$RfRH$)D#>vw=GxR;G8{0STNla1k!W0XPFxJ@Zf`6@bSxhXaPey@CClxb-Y2?=Ij2= zYoDe1yfjQD`!<&_B3ClfM@{4#kFTw63K7fARZH~ds|{0RWDC_v#3>Y9}v=Q>iY2T*OLHJQqZPY)n9sj^yP?D>BPh@KPKv z7(vR1m`SXFlOljpEFDPz6fY>DR3vyyHjaA&#c65WA+bUb0}OX6*g*-U3!#)6l}g-> zU=W5_h-Y1>Pw`MPC%F)8qFiIkE1D#7aeAgyUHI5lVpTv3T3sb2iXM0t$_*n_S8ioR zONxaf#0W6QX9ZJ12-da2K8d;#kVWzo3s}t^C-k=`$EW!!m-1zifFcAM0tdQs3P<55 zR>^kLR@ELwdupHF3})*gQjFI5@X)LO+N){;4-NbO8`iwi`v(6AO{B%xQffK3QZ5@F z9ltFW*H&W61@`@9w)Wy$FbeCpQF>E;;=>8t+t=DA(hs~C44BH5R zWx0leBCT|e*FbP#Yqj=auZK)fBWrrr<#0S08ChVAS{7`y^I-iyM-UWNQg+r$3x##X z2i2$K1AupEJC<@ze9mRm=-k!2dX3@mN{WrZh6E|ZZR!hdMoK}V;zWDS zuK##I84*IhMAB7)rqb)4F;{nTeWA!}#!0@DwLRZ!LzLS_+5unOhBKZI0(4Qek2;d| U(_Z`}f9qN7qr{0B49Px3U!XUSt^fc4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ new file mode 100644 index 0000000000000000000000000000000000000000..e7f52e54b53945342d912b93511798e5e6445b29 GIT binary patch literal 1617 zcmcJPJ#y4Q6oe%kigJ+?5jfZY1*)2VNmNk;oPmT{WqS%3--vr~6Ee;KU%%0=eF3)C zD{J(A`gQly&p*TK@5AtF;4_Zn@b1IskHNJVTg~&fpD)w-@?&|@Q~n+lrnpap<$S)J zFRk#eS5|1T`jGaPs-L-JE-^3b-b$KUxQ4hnFH~;HPc2^$iK4yVbE9LKpPl_}NvRCXTId*+|5`j~qaU)Emc*4)Qy_YRH%z)ZA^f4k#^Irq&1L699LM`##PY2n z@20?7o!HyzL79@{(=*{J&Gba9;D)C?ie$m#W|HFS^Oq zyaevP*f5*G1Y?zg#L44kX4AblS*dn7>BV5|uXvQsb01GW+8fx7PF2Pm3)vNCiB4vmH-f@$7$Pnn`ldIxiL{KrfMgkFYnvinl264T|GWI2MK>xhm;M=TRUvCQ> zv)dP&YKe|Ll1*XP$L|fkGuRxqfGuHMj+VM@6DKsQmLUc%L8NFd;ij?91AegCtP=}_ zDw~^O9XL+~I~8Qk3e$#|z}-g;!F)~&jwRa@!?l?MGmBae6p(iYVqm3UVuIW7fwOj9 zaq!S8tg;skyM0}}{Hc*0aR@Ll=SrKcYrA?#VI#sADTxCQ(t;~gXBp=`6FDi3avtMQ zQ>Ft!*@W)$Ib0mUJC?!6C`o1|75_KOgd-4e^67Ex(vx9=+)(dN9aY#N^@E2O*yGpe v@{n(NHX=3gMZ!K;9Pfdmg|%krwKjsw>n}(3_JTi8RB6pSXOE(ZTnY6Hv0izz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC new file mode 100644 index 0000000000000000000000000000000000000000..1b04808283669f5c8697c2ff8e2445b88eab71ca GIT binary patch literal 802 zcmah{OHKnZ3{9x2N|mavyQYg~Q7Qiq3s`UmB$UpsrvP&!F2w;j13V`)RE&yQ1@9@l?Q9%O9tD$aja*CZogP!)X3)}_oFnfE{LooSl(VW9t$|vc zsDax$YYj>vrVLseNOd&|_9?3M^o7M2R`4TORtOtV&+=8>D>a4q(X5b^HEeg)Wo1Ch z^LXdMk}QCpXK?{hqt{k;let!))>TM`l3`H0tH)qR<#4phJ+}&4z^GEy@HQxZUzMwN5YuT&p z&dko{c%GB7`E)L6idprjhJ}H+-I{lx(F~-))uxQe zPJW2FBCSg^ zGrP0nd;L($qf(1^rIglM-EJT5eU4lykNd;^z{Og#Kb(daA>dl~eFeI*po+j3o^~!Z z(r9=XB4>Od&k0BwjTDJeM3xj{WioD!UK&ZhcZ!ThH*JBH2JjR`%fojSD%J5VeV-NRbdVH7Vj^CI7}B8fq>;<7}5xgvk-;I0l#E0Gt8dc(WiPpvTg# z?eQD?&3p6mrj`e#7Eekkt+l#tRL0%@u^xGQcN-#CYb^HpC;)ux)4T#)J%?xk^Y{Q_ zXW2KKhB9(&v5uUx;UM>Tj?r)wZ1Vxfk#h@iIOhal+cmv}1m%2}~=~38C%}#4G zSt|*-oa5m#u;>dP#kH@b?zC-Aq9>Y$t2}IJdJstip%1DtleJ7<`lO@X%nO!xYEa2H z=OvfJ++}~uMZXGhrpxzj?=7W2W$UMBkc)?VM6_C1=P+scU2RWw!ZfpCr_~bOxxqXS H;1N+D36s*q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN new file mode 100644 index 0000000000000000000000000000000000000000..33692697f96d4407625286e60b9ea6cde978eba0 GIT binary patch literal 1328 zcmd^9%TB{E5L_2ZTaXYJZU`!r1C?6IuQ)ar{(uwe#pK3Ufb&QE8s7l3j#HW<4xEX! z-E}=XGrOt!{z21MqGQ4%grId)x_y3m3tfuJ)SJKu&j-g zpi`}+(#F=Vf#eeuYlMy(?5Pf`a zqoBEKbRMwW4zBTaPrAKdtEt=(6@8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU new file mode 100644 index 0000000000000000000000000000000000000000..151e425973ddbdc39a5dba862a72d0050a07723a GIT binary patch literal 471 zcmaKpO-{o=423uvuy}x12pVTq8-Xn9jX*ba8CoVnNwR>87oEf?~-r521wH*7X~e+1zT;|ishV*fWROk3l@9{;zhxQ!~8i42rD)oo3QG9 zoyspgeqd;|sc}p}yOBo50PlF9ueyPU$ZZ!MtYT78ZSuXrOlFZ(k<1B3KWBBBRy9-B U49ti44;$t^Et1+Xg<(<`Z@Au69{>OV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS new file mode 100644 index 0000000000000000000000000000000000000000..0efa97a1c12f868ef48ee6ccf2a0dd0cddbc83ae GIT binary patch literal 497 zcmb_ZK~BRk5L~BCQz3--01}5BYKcgRUE3*_K7s>>kQ=X{_K(WHxbOy;*$9LXM=Z@| z?aa)s*XMVsUqsBCAQ&Tdcf6lm7w0@aJ)c6ci2IVKG|tE(vZz@o5Uhb3*Z>W10nkQn z;xu#zDtyU{W0-U77dLP!;7ch+YUc*$A#6cT(E8AgXn|7Sr8yte%2KbDssFBMq)F88 z101$v-z%A&0PGFP2FEO+yALcTN)Yoe+uvS)*h}^JfUCcX>9sn;N}8Qs%1YG^I52XF q`Ey!2LUOLj@WtxqE)^?vJKVNT*=s%sSy%k+78c&^C&wfbmh}m!7G9|U literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK new file mode 100644 index 0000000000000000000000000000000000000000..eb7e6292d323781c7cddd61e1756c787677b9ce6 GIT binary patch literal 593 zcmbV}%}#_c6oqdQ5_F7-3-_~N0SROJ159z_*2EVuf!XmC+Qt|1)qDm$_d-y~tZZ_C zmhYU?v>%_8y%Hr)M5L6W(vH*HvGy@I`7kDi^6{Y=r*R5{?@wA+_|Zo28I(hp&=s_U zt|3mMd*{J*wb2q_*&AG6Axv{X-Ni7NLw}OAN^I<;+wLZ%vL z1p}3PEsf77k`OdcgK&nS7PL~Gz`c`%vMO^Fk6vEo-7 zE6NJ9FRW}T+%(3_mB9Gd`&(eRT%Fb2mviC z&Dvg#J=W~|iLTy=_)NH%>0$l+WRvXn&2E2?oTA;xfV9gX%z!zt0G0p)*Jz^`>7yBm zAt#G=G$f3Q)(z2Zx_(GLI^QA&)EZlTA5s^6DJ8mqT4h_+s(??eqQf+|&WE-W2;N9E z)=RIeiPDv#DZhE s4J~TBs@wmG7(cAP4?T1XGM3sWT;2Hk+ zGv{x5`Xn-6gkTKW$l1-yF`RUNculN%UM%w1^GQ^k#iyg3ngDBu)ugnaBtyc52QRVe z7&NqVRhbtpF;#9xz6tv7T#E@Lh;E0*{nZye;Ms^LRY{NK;KX+&)k6UBia?yurDJ-NNo*oGCs( zefmf+ZLO}(YEspcPEl!q*r~#0iaw;V5=z*Ji^V16vAW}_`eLjLa4UpIt|(z#0he2& z4O!{pbiBG8WpOsT;@BA(2p>9BUuEZT{i#6Yj)P5xvjyN za+?{XYSB<;oTGS`urG+W_{wK-cz3S;71#JzgI0ab<1Pim)UgWiZD7k)@V4 zdyAZH%X!?{i)rr~_*`Q-UL;*%R7;_j(OG@_ihpUN$K=in4Q&$VS#$7zb7WfLK^9&9 E0jzJ}{{R30 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM new file mode 100644 index 0000000000000000000000000000000000000000..52e4c4a5be5a556d5125a63dfdf726bb5ac147ef GIT binary patch literal 585 zcmcJMO-{ow5QS&brqmK*$AT4IWYH{;{DbY7O}PLU!1b=DfaFG8jWfWr>r`Ze*kCCc zdFFfX#qq}{wQoetGZ8T}-49Y8Pw#FT_lGB~#%O&=$J6LckG7vOhDX%8frzfPit1qi z1|0@@WoW}Bv{KqUTIa#t!7|#Aq6Iv9l#nj2RV9M8X9Wb?`D4nkxC*rDJU96Zt4wp? zFI%Q7XXX=BfpF$eUga=9yi3wDj+)mO#ILE55;)gahE{a5N3fatTBz;RuG1JXwfJ!% pW$bnd&Fr?YyUrAR9rciyRzVb0txnEE-_VL=xmWnCq%u%K8x!s&MySKId*-y4h<7`GS)j0=oQ zKszh|<}vVw$EUtn{Im$)wiEMs9X`^Wk84l1Z;Mpc9(=D+m8b^)IBO7le8O6s?S&f- zkUR9l%DD8<(odu%6|K4^4uOb<6pz;SfE~PEf_hz`v;Jr8<@ zAKJ%JRLcucK$sPIKz)Ycvz+#dOl1o6g1Q!+DNh8LMx;H_6>`+WmW?KP?Z^XMjX2;8 zMWIJp+VB$}$pu*kIL<<$L;@^?tQwkB$_^Ro#5YorsWxGdjF`MAs*y{D($AGdgI9VK2d9ouPu{3TE<^3Q zI!8rrndv_~oT%ZiEGP3zWrBS30&++XuE*F@>ZLHkJe=(qd0Aldw&t1#%&+_V(m%A( z1TOx0wtx8Z4;a2S2j_4$Z9nvOYks^R#nlgpW6jl_e{&}a<#+PKwU~IHm|Wad7DO*f zbC`Bt28)|;6-qC-vQ5HDBCy~gfCC;DGFZP_ZcpaI-FbNU3100P0C~VQG&c(1&0SCo zmvp&ne19fQ*)y<*>OL2fquNHN`y_TSze+^%2h)_0&84~ER)+;Z8EOVx5<$#w8voXc zqTYM(q(NGcgGICfM0^B6v()=VKHcKo)nu;j5wt~2FB!uI4%dpS=V4D}59ZZb%$t08 zmZ*byAXv|i!RF`LFL8@lGqfvq$x${hT^4KRZ$$9G&e^Y)4vN+E}i%W zTQCJ-S$ZI6dln0E6miF^89w11!9CCLWPXrEJ;Dabf_AX+SmWKY5{e c1LJ=nfQjQ*Pl{n^W}|T#7?>QL5tgE`0JiKNApigX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD new file mode 100644 index 0000000000000000000000000000000000000000..614e70c775d69f0db6fb213c11a87342b28978e3 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNt6@w^ObUnt#LPep0zh#NL&InTBQuLwhzLlY+0f7cq>6#@ aKM=sg@u?=>AT)E)xC{(TjxGobQCI-JZydM) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE new file mode 100644 index 0000000000000000000000000000000000000000..e9968bba15eb506a5d12ac42a692131eb08cb457 GIT binary patch literal 255 zcmZ4UmVveWCj$cmBO@aNPqd+lWo%4JwULf-El`XJh?#+y1&BcasD#_l(5S}JGTL0% zG8QBP#2^(w1~X6w#ARUo4+J0v1Q65&GFBL5tci(fw4qrnlJQ^@uo{hK6VM1&p!S#) Ypbn4}*u{(tEI=^>pg$a4A#TAS0m|VbKL7v# literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF new file mode 100644 index 0000000000000000000000000000000000000000..0bc1491690bf4e4563d50767f7173469b7448c5d GIT binary patch literal 287 zcmZ4UmVvd3fq_ws0Z1@1G6+Q*n#9JW#H480Tg9YQ8`Wys17(Gy!ffxjU3V98I zDh#3xjACmHEj2-6Knzj?WH1{V7=XA8jQ@cE#DD-Iw1JEkMlrg^!~h84Mqo1>sD~Y> e2IOp@I*`p^hcYs-g7g{?kOq3s(G6xk8VvxVRwJPR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG new file mode 100644 index 0000000000000000000000000000000000000000..0cb86c9099cdfeea84aab1c048b6a4e9640ff056 GIT binary patch literal 237 zcmZ4UmVveWIRgU&BO@aNN3@}3Y)nc_3WyKH%s>nRKq+2J4SOp?!x{^V8cRz}h%iVI zv!$USNGSv3e;|N~gSBu$wP2_RnI~vyZdQZKOrRW^nLr)PKv9_a5FS=R1_mZacbGaf F8UWZ!9Jc@f literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI new file mode 100644 index 0000000000000000000000000000000000000000..0b4d4fee130f01bd3222480fd5538009b8242e81 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNN3@}3Y)nc_3WyKH%s>nRKq)Ru4SOp?!x{?^cdgKNbI|7clwb6lJ*)SK|yY;{<-X(s=EC%#5!$ zssBX6MR0^5tE}C4Je}>cV`%|YbFPt>00Wa7{rLGN%=_FZmX4?BmbYKS=!rDmYQ*dt zK#sB-q*67kFFUBTMHW4BOOU#25WG`iT@-BQBvk-Ng$rpo^!v2Y!wQz2@1}QEw-lrA zCSN_|d^cpZG5RE3CbOn?fOm)(j8mjU5oo9<;f|P!tXg6Xcp0$-AMcuUCPwf1=lNe1 MnkeoMh35b904f4FHUIzs literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM new file mode 100644 index 0000000000000000000000000000000000000000..cbecebe4fa44c2af7f86decabdf58bd328bc6213 GIT binary patch literal 276 zcmZ4UmVvd3fq{{m0Z1@1GVnwjnpnifq*NQ}nA8Hrn4y>jNV5Vl2mqC_8yZ9#>Key_ zct8wN1!OQA8W@7O42=JQ0K|X*yc$5piD}qd8P-?;jWmzdj7f<}sWCACLb!gA$p&a9 igA4_#0jUP614)A2$H>46(rZ9Knt_4I(HCYu8Vvxg*B|o$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO new file mode 100644 index 0000000000000000000000000000000000000000..9565c322368522c9ef21d291782ab0ecd027f738 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InzW7AlO07#nI(9j5^h=K7x Z5WvLoC??t%G*i*I3=B+;{s`+(SO8Dt93cPz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR new file mode 100644 index 0000000000000000000000000000000000000000..a056cd23739ceb9f777aa27d611e8843303f588b GIT binary patch literal 385 zcmZ{g%?-jZ427NkhyxO=K_x2LO{z9rDpugy_SPW~gpF8@8Q?iBCyJ%mk@Ni7&hth2 zjmTUH&KTPDEVlLIFx}``m2~N7)b3`?W9Ww_xbSLh)v~}5xL3*xSJ%$P#1lv0# z9eg_mUj#3LQpJ6dWGE4DBJmB=%WP<{6_5plxlUC&25M4a))Bh(5z7A~Sld*g_13lv xHFjH@0{9Jt!!%5>CsEwpP>w7!p7+=tJjD%D5oNlUe%T_;@XXlue2Hy--3I^`I_&@e literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS new file mode 100644 index 0000000000000000000000000000000000000000..b25ab705de64c105de775f4f0686c959d5ae1343 GIT binary patch literal 252 zcmZ4UmVveW8v_FaBO@b&P_&6(7~%#D5&%uZAvFL1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT new file mode 100644 index 0000000000000000000000000000000000000000..ffce32def9ba45d51bbc20c21d1c8861f1fbe76f GIT binary patch literal 433 zcmZutK~6*=3^Q|(@8e>wHfPXRzOzxAP)PgU>no?T zTaM28Plx2ayQ?g@^fun*Y5hR)8fW)&FSu`TEPxe$e0gS3sU)#w@Z`VjOtox?OGB*reOS>RVZj?Elj2IKK4L1(&AskF!3Nl*fldv9m+;- h18dL4FI@Biz7?8ZGxeOauZ8e}Dq+yo>)V9?P2Z`DNHPEb literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU new file mode 100644 index 0000000000000000000000000000000000000000..e64990eaef9f1e10af8926f2bad8ca3a4ffb9ae1 GIT binary patch literal 551 zcmZuuOHRWu6tvs4zyib;7F`pmk^FbU25|^hPIfs3yezp5SK|)MgtP>ymPV2NX5M=< z`TAD7ccnH5rIglM-4@fhJoMv-JLU46Kyxt0h<$o_Hc6}#7u&Xt z5@SEslD!9s4NgrcR$6T#g7$$r2lyZ%rdm3T4#zarU~%5Xxms1$`M^$G;O^f7RBC_& zmq8?bu1Q?hh?A~_G}OWcj19#$evslk{0p9f(8HXCpCq* i*Aj7MV`RoR_7o~=?8r{%f2h^ocF4v+|N4f?rSk*7u~9bw literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW new file mode 100644 index 0000000000000000000000000000000000000000..960a9b259095c91ce523b1491e42ddceef3fad1e GIT binary patch literal 231 zcmZ4UmVveWAp-*gBO@aNN3@}3Y)nc_3WyKH%s>nRKq+=Z1A`h%LqmuFNSYZa0#d}l z_#X&h;&>E;j1e)^u(tx5WN1-iZl(z|Fxt>K7N!@gnLtg((T3`#DS|*)TpdrqL@1s6_#0nl6nL3$iRTD z%_=0MLqvFpK*kSwJa!lpjE`yN!8S3m(>k$Kf~ml*vfP6+!^SOAK^ BA6WnZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD new file mode 100644 index 0000000000000000000000000000000000000000..2d91d8a2e3647caa1b21b25f2482958a6a1ae35e GIT binary patch literal 436 zcmZ{gK~BUl3`J9Bx&)5EmP%BLlO~<883}QVG`pSx%o#WcT#Ylp^GsniSaKcP|NFcC z{Br$^bKQsI({=8;N}5Ys*4OYby;0n4z9;s$8Ms^V)sG=Jtx{SkR>cj?V<+BQ>bh^t z9%qAib0+@Jv+3`0e|+>f8ZnoqsmeGtoyiFYlP+ygsgg(9!Jrap1zL$tq$10D)Li43 zDWn=e61@bS4_Qkp)3&_+$|bLPSz$+=Yy)M)Ff8le{+IrYeeZ052UO*0&Y$r`xE-NAN3U6-vie2xI_yKR?4KPl-5(g|fjUA6Y z<9>dJ`*R3)&mn|i7{ZJ4xU}QxczQj&ZO28f@emKF*loVY_W|w(P-Ya9(wL@kZpKPd zmSz=M7OOSd%qg0OTx^cV(G1y4#?<@OloY#EaSUcsyTuoNOm^ET(w8Y6WXPZ2)G&P%)ah77s z6s`0$m)a~9E6N2J7p+tq_#)3L75g+1OUVjAGizE_B`ySuFzyS3E^|g)h%8T$dIZ6_ wEmr5acryf~xwfve%j(PXaQK1syf5W%ID|(aw`u+azb#FO2*3aR!!iHZFSUVcE&u=k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF new file mode 100644 index 0000000000000000000000000000000000000000..73cbb89a45eff75fd6ff327dec9406867835b06f GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYn4T%gaK+`*bL2>=y^Ed&4n literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH new file mode 100644 index 0000000000000000000000000000000000000000..4c048fb12f85e94fea7085b10fa4ae5cb3a65f06 GIT binary patch literal 386 zcmZ{gF%H5o3`G;Fvali~Za_D?G$m$1Vq)M1X|`ShaBsxbI0O8o6(AuZIYa#X|99>W zQ(ld+7lX@Mvkb&uV%K;5=CJSjTRl_<^k%36Rie@Xx&}aj+g()870~UVfhCHJ2q06i z2+)NDZah@Mq+wJRvZfR!qC5a@{+>@r@|!f0-66$LCdF6BKUs(9yIp7?~P7M--;enZAZBd_Ke^bK069eBxP=6&*bs`aRp z?i3EK)jpA{WA2BWJvDa>3!ns6fD|}8qGTJN*%8SE5C)o($jVdc7fPB>LA3dbFjxr0 z($VqUQ9p2-EaKTEQ`^?%N;25X(y;d&eXKYn8*<=i%+Ftv%_14Lhd(uxVUo@N01~)c Ugm{8$CARauCrpaVbxK>@Z;a?I82|tP literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ new file mode 100644 index 0000000000000000000000000000000000000000..cc5edf442b02f2ad5d74777392e116029331d845 GIT binary patch literal 317 zcmZvYK?=e!5JeNKpm+@z3KlZcCav8FF1^CEyPiVhjl7y?&_A)=gbw_H8UFki^8T33 z!x&o|G;7UXs2Te4$>-{Y)e0)0HKYZ{fsWUXgzHeYL#!mA2XSFI#YU>q z#5SFNQS&|}?P!kCWJpQViIO@cIUm)fEEdPe2a`C#y*P{s9@~rZ-2&hFjF0FoO<_5i OU1r7~-0u3Wh57+|Rx@D$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL new file mode 100644 index 0000000000000000000000000000000000000000..8a9eeb543c405761880012beb0052c71f10e4c88 GIT binary patch literal 317 zcmZ{eJr2S!427LiSeO~O0U0Xgr<8=H5;HeQy5$s5Zp76%13V|83nJ2U68qVopD$Y9 zh(u2aLeM^FJH>Pu&oR~OZXR-!BMd93fm&z-@j=f{yV;^csaXfr4bD$8Ce+yb^^>4R zJGi$tn11kpWRHM{=b_$OqZB`RD9kxoCX{Z@9~T%nRKq)Ru4SOp?!x{?(4;!;o7hnh-N;>XrLC5n}OOu Wl3-UdGO&V-G5|W>$scAO8Vvvr-5~z} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ new file mode 100644 index 0000000000000000000000000000000000000000..e33f379a9dc253e3402b49cde6bdb6d7072c38ff GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@}3Y)nc_3WyKH%s>nRKq+=ZL!%l?LqmuFNSYZa0#d}l v_#X&h;&>E;jNvoXu(tx5WNxNO&@`ZOW1FCF>Nf#orDH8m%3Yqmlik+a&S`{Cz!P{f)Uq*L@!wYh%U#u z?i)af6M9uxEeNEh-tzWdxdKuJTa~Pq8m;CvuUj;a3H~Z_7l0Ba@NyZDlzokcAaOby1R&}~tZIol;`M!~ zFuoWHP2ndKL@s(ffs@K-DSar0l!C;2&g>MVRDUe?0v`lQ?rz2mgj^zuT*b>Ue4u0o t3b>+qjG&(VHA4@S25i%c>9kY@*q2Vw22L;P1KSrytFt`(e!7Id*f;lpns@*J literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS new file mode 100644 index 0000000000000000000000000000000000000000..ed383266f43a14f06aea99a05d501f44f38734c7 GIT binary patch literal 214 zcmZ4UmVveW0s{jBBO@aNt7S||ObUnt#LPep0zh$IOAUJ~!)Qax*cuB9O^7f^5woSC nAxJ3$<9{H4iG#JUS%THW#2{)(Gz-mWG%f=JlT$Fvd^8#WUtb?h literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT new file mode 100644 index 0000000000000000000000000000000000000000..47a4c6c19a18cf055c63a6f52905b95c3fcbe5aa GIT binary patch literal 250 zcmZ4UmVveW3j+fKBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(Al?7~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW new file mode 100644 index 0000000000000000000000000000000000000000..346bfb444c64f8ad4696016f8e78eaa62b6eeda9 GIT binary patch literal 306 zcma)1I}XAy40Wg?HU`eXK!!?vDIbNU5|>~|vgH)e-iWJl26#@z0s~mGW%)h7XWt)U zuOh|?i!ri}2sxEhw!pB4?iIFA%rnXOpHgo*5 zr{Wu^c=U%n_VB$Mt69V@(+}w=#$})HRN+F*MSIh=Wuy z8yXmb)G{#s2LhNlVLc#2EntS4TLMjuHZn1btuZ#OF$Gy;8e3x)Z2=TFk2cjckFBwY dHnoVYu>?w)$Ktmh%{6FT1_malNQ5&{SOAZ9EU^Fp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ new file mode 100644 index 0000000000000000000000000000000000000000..255205afa858bf4eb9d5ccddd53c677b0ef81f91 GIT binary patch literal 244 zcmZ4UmVveW9RmXcBO@aNn`KN&Oo}~_#{|X9KpF&qk`k60_ErWphK4mpMm1(;HRk3u ymeB^5v6>JSKs5|ZmIjPq)&GG2CJffh1J`V6fU1FPqtR?a;{v_l6oqgC3JU-@vnNmh literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA new file mode 100644 index 0000000000000000000000000000000000000000..3a78361e8851946009a09b6d51fdeb001e64c13d GIT binary patch literal 320 zcmZusK@Ng25Zp?t@uDZcU?hRWEfQKU#Q2QDt*?OcBfsVwbQYBZGRbte-QC&g<4L+B zQWfD)iVmK0*EXREr~2B2-ekp))+i=lYQ!}tK>v=}L}zXE#>&+H}%e+60-cH&ChmeHmty_p>dKTY=LL P6=^;Lc)s6$yJqnXp(85O literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC new file mode 100644 index 0000000000000000000000000000000000000000..500a225897cf0f29b198d7125e5233f87ac1e884 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNN3?-qY)nc_3WyKH%s>nRKq+DjZ48>JXj}#cCTC}abto(V=t~^E literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD new file mode 100644 index 0000000000000000000000000000000000000000..1b326c9ef03fd90d69a8c46daeb10b3cb77633f0 GIT binary patch literal 302 zcmZ4UmVvd3fq_w#0Z1@1G6+Q*n#9JW#H480Tg9YQ8`Wys17(Gy!ffxjU3Iz>; zDh#8IO)O$-%*|^oEHpvlKnzj`WH1{V8iTkDjQ@cE#DD-IwSugWLbAfh7-~z6i2)G8 mO~YmnP%Ar74agTjbs$H8-Ob3r3esypKpN;mHyl;$_ou(vXdHn)haF*1rt z(S%3_jH#hno2h>DjYRM@BNNy(hgMA?akzGD}U8y?rMG2G9WYz zbT$xW%r`G+|2r*<4pt&ksC5|Ij8N=lEb23P7MNHeicEOGXEH`W*<)PIK?><;24H`h z&?JW~Jht%a`Z0WO>I@A*SX;|_=XD^s2fW4J;;J^7;NnKWM4lSOeC|OK1)$ST{BQDG OeD$BSuWxm*|Bo*fGPwGHSDbnqYVsW zYog69VhuDw!axjC24pZB8XADO42=JQ0K|X*;&g&65Jk73#>B+L7;X+W8-Ti4fr?^M bfT}>2gPqIBzycIAz$XXvptC2;WHcH8Sll8! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK new file mode 100644 index 0000000000000000000000000000000000000000..c4e5176fd756ab813dacb3b4e274afa6d88f61b2 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt7S||ObUnt#LPep0zh$gOUr083(HuD07#nI($Wm1h=K7x Z5WvLoC??t%G*i*I3=B-p-U#bZSOA#~9J&Ai literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL new file mode 100644 index 0000000000000000000000000000000000000000..87c02839b2e9d93624c1fc105ecc5b371a94b1aa GIT binary patch literal 1068 zcmcJOJ&qJH5QW{lvk`CrLNY9|QvKL&n}mRbfE#$6%^g;P;zpc^l$bNXE4Kx!Wkg0x zZnev<=c>=Izy1h!pF%hVJlnQ~=bi7{IA1=?oAd>-+ckW{9fm*H_L5(}dn>G_*smj6 z(saI9W5)UohUXok;g*$=^6f}rQ=}rZYpR1Rcj6JFc@U#h9>qGA*jncbX+fA6>Roh* z?Yq?)rwaAlhRrHu$5$yR#6?&}GA+nSkl%;p94)&JS#qh|3!<$>D<0huf{Y0Ip@QvX z1#5f7S+0i?c@~9(n*i@YYeA zaAzG?3C+f+liZ^|-hmGtN2^>Ri&`h8qcj%5TzW!_Dhgtb3^6B97#VDl!is(|mF8+= z2aEzvNlPx1mTz}pIi@);1zI4`u*cuuxnP!0IGM%*NcM4og*VIu;i=j#yH^ z8Yp__ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM new file mode 100644 index 0000000000000000000000000000000000000000..762582408929fcbf875fb797a4efcf351272c34c GIT binary patch literal 288 zcmZ4UmVvd3fq_w+0Z1@1GH^#5TExbrR2%9T*8+u@ftU$OvjAxj0IK3Q)UdZQj5aop ztpO35Kv9q?m`Vml1|~yeMzG@lKmcMu0I_;OmWZHPQe$CmXb3k5iw!_MtUxs}DL_Ra Y%fSw2WMBb`8Q_xxI^5Y8W-uBJ0On{RPyhe` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN new file mode 100644 index 0000000000000000000000000000000000000000..062fdcaff698929146f78f68ae56b34871571b33 GIT binary patch literal 404 zcmZutOK!qI44r|74dM!{83`oY`G~OTqRUFXz$Ckz0?Y}x3RmL{?Rx>D3Sr5yHF>|8 z>n#+=5aK1^6JuCrZToIG*|t98=mR}}%mQT+A1T@8p5 zVTd1-?TmkYpWKizbpw@I3?%~b<_#DO%~sLry^qLUWzrcXr^`XMP{XB1qv;u*XS1)L IC;esq0SN6wLI3~& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO new file mode 100644 index 0000000000000000000000000000000000000000..51b6508a15a05934d6c29000040d50539b9a94b2 GIT binary patch literal 423 zcma)2v26n}4AjT?lxb3Ag$T$45-G~BG%hkg2H>mvA&i7xB@=ix&yXBp!-bK;6i89v z9go!U6vnR*hM#~i4B9l|B4}`->6#xJL literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR new file mode 100644 index 0000000000000000000000000000000000000000..796fb16da903fc7f90246255b2641d871e5f60b2 GIT binary patch literal 449 zcmaKpK~6*=42HoO^~pJZc38Z3w?diwI2>QoLw-Z?3fe(?$O4`lqNJV3GRV5v>`=AT`A>vxw)ppe z;VyLl^cYQ1i8V=DN^N}vwFXICGB15-(%e)^9aWof8@dWy+RZTSX=4bb0dG;}pc%D9 znsd-%ZHaX#Nm(lRYvZ5x85%^M}Ap;FsuL3=aY%J7>B%27)Pg(A9h9P`D0 mj^f8;@a#Jytlu=rWdIby;RuGA=e)h!!xHfe&oA3Ff308Som7_q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU new file mode 100644 index 0000000000000000000000000000000000000000..2d18cf7da9c4a666aaddc8139ca1b1918afeb5e9 GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z1@1GKfSQ8pXz>#H480Tg9YQ8|#?VYT5(kn4y>rNV5Ym2mqB! z85%^J=$gmY0F@gWn$;K?n8c)Lf;84b)Bsg6FdG_}FoHGw2LhNlSU)>hzgaBEG$01q z0@VOAUC9t=EYt!J)6CG&u*O2O#>7AqWRt0psS!v62w=4Z%~CWj0|S$DC`2~~2>^zv BEEWI& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV new file mode 100644 index 0000000000000000000000000000000000000000..f97fc8ac85f4ec9eec84d562d8e255b61b079f29 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL*r-zU87it07#nI(AWT^h=K7x Z5WvLoC??t%G*i*I3=B-pVF>F`SO7!v91j2h literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW new file mode 100644 index 0000000000000000000000000000000000000000..2c8cb661785fc0c666498d0b0f5885451271827f GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@}3Y)nc_3WyKH%s>nRKq+=ZL!%l?LqmuFNSYZa0#d}l v_#X&h;&>E;jNvoXu(tx5WNxNO&@`ZOWnRKq+DjZ48>JXj}#cCg%u*bto(V>O&mT literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY new file mode 100644 index 0000000000000000000000000000000000000000..7feb7f8711b2d70b79780f3d50a8e83c0a2aaf63 GIT binary patch literal 258 zcmZ4UmVveW4+8@OBO@aNzhO*DOp1oRRZL2?ajm93P?!mbnSq!Mh(Q3TO4Jaj0)&lf z%peMDEG;!5(m(|a%!Y;OxiLD=M4eJ1Ws<6pB*{S^qJG8VuXga7~l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE new file mode 100644 index 0000000000000000000000000000000000000000..2895ccce16545b8d583880543584374e231e1a9d GIT binary patch literal 524 zcmb_ZOHRZv40YzWMcjf&jAX}Y(jp`_aEdg$o&r2eZZlV#Gr)5PR>KlkZW8Cc=a=Ms zq5V72W=ljN1iEW-%;h-tdHG0>!wKab(zkuwBM(RqpzlQIybwngti;Vm#k{)HG9KSP__m($3qUgB0UXpaC~2|R6pvhseoWfjeQe(`GWQa zP%pU()WeJFHT$g5Q+#4RnfKZEMF2P_J@(meLy@Et2(k~6!jL3-=`tcm8L2p3YQ*1V PX1mQOzjM0${ImW6x5hC+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM new file mode 100644 index 0000000000000000000000000000000000000000..c5264b25edc727cbeaeeee6cbb57c1f2e046897e GIT binary patch literal 233 zcmZ4UmVveWF#`hwBO@aNN3^kJY)nc_3WyKH%s>nRKq*0EW8)f24SOp?!x{^V8cRz} qh!jX6Gf)nsoPqH_5WvL2+W3&PVdx>lTr_LYxC{(TF1`r+QCI*kSR_;c literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO new file mode 100644 index 0000000000000000000000000000000000000000..ca339572e30507bae0d0144a91c9e302bad2b9f1 GIT binary patch literal 220 zcmZ4UmVveW8Uq6ZBO@aNN3@}3Y)nc_3WyKH%s>nRKq)>$L!%l?4SOp?!x{?nRKq)~(4SOqtXhWme8bc$^8cRb% nh!jX6v!Q_@NI3)Je;|N~6Qzv|qtR?a<1#QXxjG}9fWiU*sevTk literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE new file mode 100644 index 0000000000000000000000000000000000000000..e1448ef23787a52d0f9e940fa097741939f627fc GIT binary patch literal 1774 zcmaKs-EG`J41`a1Y@`$mh=BcoNl`O}AEZ~o!&v;L|JM=RWk zuX76oTy9~TThvdV>^u0DpI;v5R*IWj+C$5_U0pm{@~&m)d8d#MEymbNN^@H+Lufv% zZQJLz>40ln&Fe9@U2m(8>1aO9a|Z^r)2;Vznr?m@K;3b!RUcB`4#Qv=2?KmdWwB@j z%MuG|drM2w*;cAkOgDJnW4VS*tj4ke-at4oP{FRG8hFaU&)KR9t8vjw+940_ylzK} zHD;@-M#vWgDigQE784GIp=yIxRpipBMfVgU6gv|cN`DZ9E zw%W_xF&d?Eq5=%Ygb%bS2xMLWxP>zvJ}t%G1VS-V;~JUzS1wV%lwAk=$g0ow1cBQ@ z?R6fL@26pAhs>ClaYqe=8VbQO1}Jg@Iw{P@W|mDm2D|5GZVOk2gwR*ECXvpz6E*3$ zhR_-D4ggacS&e2zAxHD+a-azYAfeTC4Xe6NO`!K7SLz~8W!USgQl`J^;5#U~Rp%}5 zfUv85(=}QVy?oIow*#aNq#c-LEjzDVe+N}amWEpJrhhs0+O6h=5X~7l_TFpchwM8J z4ztM4-~9ti;O6JMr|E;t@}#4G?=h%wRwsrvRMPTusCuAUC6;>U!B5 z(K-})KH3z6e&Ek|_6Tc0OC!Q)x|mdpjnz2(X?DtIS6UuhFh(uQ=iQgRgiL9}6Sr24 zC!fb2&dgL2)KmEFE;Y*M-qr)bHA;s w4o=r8I9$OdU)!$div_sIdZ(Py%Jm%|Cw51~JR}c<{|LUIpF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG new file mode 100644 index 0000000000000000000000000000000000000000..9ff6e65376d98f4dec40ef1f4a641ffc4e3569bb GIT binary patch literal 298 zcmZ4UmVvd3fq_wx0Z1@1G6+Q*8pp<@#H480Tg9YQ8`Wys17(Gy!ffxjU3V98I zDvY9yjALso3^YMvKnzj?WH1{V8G*PAjQ@cE#DD-Iw1JG4Ll_-xW^M^|PPK6@$d(#o q6B7dixM|qz0cvLlssi}{s1D=^u$vhfSiyP;NCSQ9>JBp>jRpX)KqsI8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH new file mode 100644 index 0000000000000000000000000000000000000000..80c491c970c6b633d60d8e14621e3fd0d4d788f6 GIT binary patch literal 220 zcmZ4UmVveW8Uq6ZBO@aNn_)~!Oo}~_#{|X9KpF&ql01eQ_EyoRma#SF=9&;upg04Q fp(!I+#eX1x2@}vjl5uFJqj7;wb@f14i^2i`^P(U5 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER new file mode 100644 index 0000000000000000000000000000000000000000..e298284dcf8b1de241cb5065126c4876ddfe9fd7 GIT binary patch literal 348 zcmbtQF%AMD5Ckv!06$OPiDO719p@>e$9YjRHXC37c0ef*4@90%W{eq3VsC8BtczMzT_b`j1|pVK z^+xr1HJPZ0zdmdXvw}&P0izzXBa4Y6quMjpV$WJR*L|9QN#wd2GX3MV%KH0?zqwp{ HmR0`%pGZEO literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES new file mode 100644 index 0000000000000000000000000000000000000000..c4b40539def8e788254a3f2368e3a1d8ebbd958f GIT binary patch literal 728 zcmZXSO-{o=4235xWx;|2Z~`J)$@b)D!U9(8*s+{s*HeIdBaVW^Nw@>g<0R#$(li~{ zde7f;-oL``HH6J)2%)N~aGmK8`(YZ7Z?bPss9xY~=jRU3OC0;4`GIa9@3~VU?Q+{s znsS?_S{Y@cPFXa^Ll3d>SgZAxW?Ud2P27YR@giJ>EpZ3!=gcw*`gq@*bTFrOJZeAd zBo$P0ge$6vYK`*++NfkO3^vo^WFrTtvylI+!WETym08MvK8iI_YK`xs@F5ZD04JHa zNfS^}a9RSc4mRlwohcsNl=tyef)MRW90VV(HF+2-83MAjEg&OW>xsPR<DE)wa3ik98Q?oDOU0L*#P*Bx^Lmqe z5U~&zX4*w*`!u9s-(Ax%>Y;x64!vp)hkcDO0pE%M)ZBmtiQ)=jaDkXA5oM&rAIJ`q zaMxN$tZNr=C>3-rzp0oVLJUox?HMs|S!?foE~y^R@S59G6z#pawmGKxVWy45iGsaS WC$cX9aH1iEg||hD@7(T&|IrsAm@g*) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ new file mode 100644 index 0000000000000000000000000000000000000000..0275a2d27ac61982e901f23da990b6be66d06f25 GIT binary patch literal 317 zcmaJ+yAi@L43(1$?7#%L$eq9Em?jNJ!3vJLOaW#iR$~Tuf-1is@s@Jk9&@u&ArM=~0iUXd%sFJ6HjlHrW=NSOSO?!D+L#5|VlX;(YM0UdWCH zlWp;V>riYTSXYZ51K)EkE^^k@6*pwA-qc|5sx06W(jjuFDgK604knW9dp4Gun?zjQ160x2^v)Bpeg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK new file mode 100644 index 0000000000000000000000000000000000000000..5c16cb200e72d259e5ff5c3524ffe73f1fadd796 GIT binary patch literal 200 zcmZ4UmVveW5Ca1PBO@aNN3@}3Y)nc_3WyKH%s>nRKq+QROG^j`Bn9Gu6fiLU2LhNl g4uv4?oQ5D{Yfud_G%!Fj1V5L7fyvDqVHpYw06kG0N&o-= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM new file mode 100644 index 0000000000000000000000000000000000000000..e06e4c19fbdafd3fc3d3e254f0c6ccf71bc8d6c0 GIT binary patch literal 237 zcmZ4UmVveWIRgU&BO@b&P_(gSY)nc_iiW*aOiHzJt)@Lth6#w7ftU@5K>(mHyl;$_ou(vXdHZqB=u>h*n zgh&9T7?=$WjTphI{sRF_9IT1W5Uc}a0uX~tgsKObs17sH0%WA6W(|mM5^V^w!rZXN fBHCQnGFCGt1*8iEu-b%XF&Y=>6E}Z|ZVVCtx}PWR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR new file mode 100644 index 0000000000000000000000000000000000000000..4fde5fe011c3d50183f57b7e3b995bef76c87110 GIT binary patch literal 609 zcmZuvK~BUl3{2ZyPQU|r0g-kkJ4ut4%ieeZC!{pDzGBz?5ntmEj8iJ1vXQLT$#^{D zjc9hzSfBHaOP0N<2)%mQ!JQ}1X5LXZ8LarOGzb9I2pC$_7y=a;$E4Jl z8*9d-KxBY&3`~X=j9^v&fdD29)dbN2)?-j(p$U@(Yl0YyPX(H>__;u5yF0=xK%)V) C*Ct>9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB new file mode 100644 index 0000000000000000000000000000000000000000..6eb65ad4695e28e4b0ca2c751236b7db3636928a GIT binary patch literal 660 zcmZuvO-{xj5T)ObF1>~%-H1^Q)CH zhXD{0iO7n>wIdw+Xr;%Hlu`o$j5#uet|ES6?D5**mf3B|nxQmm0XuE~S=(pgP#OiU z9F!ALjWCPz)=J!XDHAC4MFMzvFFgV*^wv@Ys?f=v6ZSYF2!k)lOd3d zF-g)!3_t8{QZnQP3y=<&`ib=O0Of>QLiG7b&;N{Xf4qmX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD new file mode 100644 index 0000000000000000000000000000000000000000..e5cee36f6479daa218367034ea056d7e1e69f066 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNN3@}3Y)nc_3WyKH%s>nRKq)Ru4SOp?!x{?!3?4w>O&K6r^IwFlrv6^b3%nlfW(PMP52emeR%Uw8cwlb8Tlp(<33YEX2**(uizV@L)p>0?q(w*6>>@DTtaEF{KR zr8-bH#_2S!w-vQauv6 zE#YyFHc4X1!_Du*9it^!eYJ+JKm(j>5w9^u>p*j%s4%sb+zYVcgV_Z;cah!o%!#F_ vB=JT4L0i!fG$szEu_!fS*n8|j$T0!5jjm<33)0x<{x6>=L|MjPrH z$JSU{T7pD?7^D)&U^cWg1aTP{{{sPt0RaRxfsB=f8Eawygf$xWR;DI37RH(e22hK@ tW?{7is9OZ6CnhB(1xa5_3Qz|V5X0Ti$iQN1Vqid`a-bpZ9uSXUkN`Z6D?|VQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI new file mode 100644 index 0000000000000000000000000000000000000000..2ae84745e1368ac9633b928a053bb06b53bd43b3 GIT binary patch literal 530 zcmZ{hU24QI4211ux6r?PG|+(LMu}4>`&fDg+iy9=R=rWL)-$vtX9Izy2FG$V8GTZ| zf86oxTyyK3^WM9M#1czhKEtzo;oSkdy_`p!H`ulyJ@M1&l}I@SDH>jMz@2rUNlmdm%PBmoHzIC>|M)5Fu#w9`*8+I6?zB_#d&v#P*`XTkH)~k zDxplxuZ|G5%)vD0jT6#}IwBxSG#0I&C!UPI>oi)qZr4j99t{s#h>I1Ys% h?Hq>DhPoE9V3Wbh!DbksnSr0nz`*40gRl#Q1pp2m8eaea literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM new file mode 100644 index 0000000000000000000000000000000000000000..1b2a03a672ae14e6deeaf48046532a995cca4cc9 GIT binary patch literal 235 zcmZ4UmVveWDFXuoBO@aNn_)~!Oo}~_#{|X9KpF&ql7faB_Ev_`X1W%!HDFQ`A_bIW hU@|mg1S|Uw1TbM@bdhc_nmuS-pv&ET5e`6M0RYPfBkBME literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN new file mode 100644 index 0000000000000000000000000000000000000000..fa8954a2cba0d2327ee6e16c4d16787c91e59844 GIT binary patch literal 235 zcmZ4UmVveWDFXuoBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDL4XlV{09PT zT&!Y1v$+h7Vp3{M41f@<1V}J4FdG^fpc}`?zz$Rcas^lk)LupgR*+r;ph@_ofv$D; JgPD&;0|0|SBEbLv literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP new file mode 100644 index 0000000000000000000000000000000000000000..43e217f2ab2ac403be3cf5212ff49b34dcf8b8e6 GIT binary patch literal 329 zcmZ{eI}XAy5JcA@q~QeI02h(`As^F(j+Wkb=Tktq5m)03Flz@Sgs`;!&Fs9rKWKd+ z5=X)&1Z};xF{Ise2x&R4<|ZdO!LUMAs2bIvcyW*R-7v=4qD!e+d)4-%i!vnW?0@%= zph|b>*jR7&y#pwF1U#Gxy|zXvzH)F=g0oOkN&;){3ku}m;s+g)oH2~nqgSSdu<$Ta Y1{OdbCZnEM%OAu3Ju$=SoPEFB3z#Z1d;kCd literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR new file mode 100644 index 0000000000000000000000000000000000000000..1ac216e648f2b6e7d9e8c2ec10ea5a45e457093c GIT binary patch literal 339 zcmZusF%H5o40Ku*R(Js`kr?bm3JnY$kr-LqZhZxqAMrKb0Oz($;a%W#&Z>sJ@ z?n*eEqpfs9H|(2JH$1{2K7E6Sa*hglg)o4-6Y#j@I`?X2&;%7Unv&-1!731@9#xJ? zVRmTAeE=&aVAy6H#wwWdQybOPG%0Q8d9gDF)?`K)Vq|IM*lUR1dqo@Ttl4J_H9sR} cACA@{(Y}jYTV>xvQQ>xBbK$zU+>HJQUpT5X;Q#;t literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT new file mode 100644 index 0000000000000000000000000000000000000000..ede385ac4d0a57df9f3a253cb70b47216e191554 GIT binary patch literal 290 zcmZ4UmVvd3fq_wy0Z1@1GH^#5n#9JWR2%7-)B=T=p_m0ovjQ;)09ElCYS>#D8q^p? z8yLrGg2aFrq!!3vHZ(KbjB27y&4CWmj7fnT mgv|<|PIjQ4m=v%&ko{oiGBU7&%rYP#&A`Cq9s)BTjRpYsha{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FJrrg*8Vvx6_Z)8k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW new file mode 100644 index 0000000000000000000000000000000000000000..2bef055ca2fe5b0ba01bc0c595f3c6ee04bc78d1 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoebBkDr07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B-};Rx$cSO8t?97+HH literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY new file mode 100644 index 0000000000000000000000000000000000000000..db33cceaccaa0d2aa9a3d19ba1572523b6b525a3 GIT binary patch literal 321 zcmaJ-!41MN3`}S%J`6%6D#fYWBz$=CVgQup#}r^TVl`%fODpvO2uo+#=W}f5@l?%K zDIFA?)@qY1#XMeaZr9zxt$+%sfnt!XBPD7%mkcOX1XUy|snRc431(Xwx*rYYxs%-< z_SOkJc?s5#Ftd2%Y4F)gG!ly>`H&^KmVGux2o!TCed>phAz7B1=3*gh-N!B!|^r4E12pd3OF^ksPq|TN=7#NEl1>1)1 z6T=qk`0tEqxaIq&M?zpW;*_CBrSX1_5Jp2PP1k@96_c96js8r$!Ls5N6qdrA}%UXG#Q;(89B_-~UC(YN|0Y07AHOYz6^UvIEtC90pVevIXoEMg~@p QUIPNsKo5BM!OTaa0q7td4gdfE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR new file mode 100644 index 0000000000000000000000000000000000000000..ddbf4654c87fc83bf3fefb7349856c936cc93538 GIT binary patch literal 450 zcmaJ-JC4FI5Ve7@9Tgol5|)TGj)N1^Y`gVVD>?3Rie};#VnsRXDU(t4P+DA$9%9?hj{F3*-zrM=r+iC2k2UZ0+vzXe$n}D(hr$yE<_$ z`mSdeOxJfkW@UH65zLIC)hsxmY)FO$$+jGQ*@^&no_2*>^3UF!JfV^`tpC%1me5U< zDpQH#AJCA0ved#d2u7n~FKvqCM;FmHi7RIex8lUWQqyq26dWHCw+&j^wWyI8Oy$=d fG1RpBur7@MLZc>LFj}BW1X=Ieu<`YsabAxH{FFp% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT new file mode 100644 index 0000000000000000000000000000000000000000..ac6f5cd0784d17aeb3f92e7fd30d6e8dd0529596 GIT binary patch literal 266 zcmZ4UmVvd3fq{{c0Yoq|2t^y3#Kxq=q-fY%#iUdl)oR)UWtf1N8Hibd7zBU{*$fS% zO)O$T93Tcs0vXJPh9)2`1LJ=n05Ko{pL&pCJP^ZbObmb!t_hoQK*j7pH6RxP)q(5+ WyNQv36{OdIfHcr29w9LE(P#h?p&qON literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU new file mode 100644 index 0000000000000000000000000000000000000000..f23d173a1a79e1964bbfd2e811a4cce94a671f79 GIT binary patch literal 554 zcmZuvOHRcw3{2k#vEmMIM+B8@Cu#E7u;l`*((HN)FgN06h%>-AEeND%$x7qjOvZix zbjKIxb|>fDFbwXR=jB!I(;Myw_b}DW+oEj`Iv!Yv(0k+(`(8|A%lBM~gdgGQ+3pwY8wD3?1^@s6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID new file mode 100644 index 0000000000000000000000000000000000000000..64b6a35effdcae83e14ebda9e147617eea42948f GIT binary patch literal 313 zcmaiuJr2S!422!4fS8!L0wNNFod%M!bYbBPZMU2P!i~5ZXMkt^rXrr?(h82w2tfpwX(WxorqL HMOhUAABQ9KchP1n$LgS6Rns@O3phckr(}bCy|9+n@ zRo|4-4~37`YLz6!z8mgt7dV@vXP>jixj?fZU5ji_N0;|d`-jOfMl32c9~7ZhGZ6>v zG9-VXtuG+#X{NNQgSXc5PRj=BkB`QLKG4vE+w&I)thLGR`^*HA!dbg-FYPtgaWrC+ZDu C+%oO} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL new file mode 100644 index 0000000000000000000000000000000000000000..8529cf27a0dc6c39e88adc8161513e5c764e7bd8 GIT binary patch literal 323 zcma)1TM7a(3`|`YKLpQV!G$yyR`=NdQUPRuL_k~y#{WP7Vn6^+#UNvp3=vj>EUd8rT5o1zVp3yiVPURW1F;2c v5YPrg0|PW0(7B8Zd=L|W`ZYmD1GR$GfLsq`uv(az7#J`xFnRid1h4=A8l@)w literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN new file mode 100644 index 0000000000000000000000000000000000000000..5f0744e87623de3fb5ec990e5132eef0976ea829 GIT binary patch literal 1604 zcmZ{kJ#G|15QTTW7(+rtKt{?)Ua9|khQtyX2{BUdWP1u+%Sku_SK|(RuY1?542<0N zxTpT!t5@~&*XH)yX7gghv)yhtZ<-Ie&g&LBU0g2-&xzn^_r1GxEQ6{jhAeaAD8Ecr zT1uS)sx`)BxBxGFg7s%_;oWAS7fD5cqMAVzNAP!(XntCvuo1kQu$|Fp{ zSLI_)B<~T5dPRpSSVx;|;REgUai2vrSToTQMW{cS%A1c#r7F>2VW5(uj#_2G5jNtR zTi91QKgRof8bCr!mUFi1QG}muDJ@-K^$=Y`&8OAjfIehgO0jvySUHLO-Qq30d+^GXf%$K2fD5uF!m9Oq9`S7Ub1GTdAWNKpM)Vh`Dx@)V(-mx|$4^ z8*KJDk@;x*>;hH-snYaDcz)bdKROYSA`4642Hp3lG9CJ0KBE+F0)@jNOM+m>su0#Vl$A)w~D(~|a@ z@v%p8%XDbghgn1z(UqaAKoCvI-i0k C(`k_a literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ new file mode 100644 index 0000000000000000000000000000000000000000..63477f21f3aab8f05a857d27d1d977fb9056e47e GIT binary patch literal 335 zcmZ4UmVvd3fq~JD0Z1@1GVn$lnwVS0#-vmm>6p|41(~6k1xT|3F$e(F2^ebFTNy+f zn8el?n${Q@X@Z1-7^ED?U^X-`0C5=@{{sPt0RhD61X-YfZb6NSiLp_QxuKz%Xfy!ZWGz|% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR new file mode 100644 index 0000000000000000000000000000000000000000..3451a0026cf64d4e64b44603c09a3940a35dac00 GIT binary patch literal 583 zcmZ`%J5t0j40ZN56jW5SbcA7NB>&c;fSQ)pahFrD;zk^ZOK=8wN-|3mG~SmGh2}<9 zr#_;ysnyUlh}H;z1oM=LNX)Ij3}YTs=Wb0W!61UF#WuK6Ka4=y6zyTK*>NJmU>;0! rm4QxCr(qmMm3|i3ECSPO{)t?P0Cx`d@aC}`A5cc%FL`}KbuE4YV<~Hg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS new file mode 100644 index 0000000000000000000000000000000000000000..96668f323558080ab20286ff4fd60d6b0d839393 GIT binary patch literal 375 zcmZutI}XAy3{5C7!O9uPfMkcHDJ-3t8QTs>ojCxQ8*w$x0MBU_1eWah^Zab*`7(=} zG4^U;tTh|%$9~+l$71gO;ab<-BB0@OHi#q|Q+-e(#(FWQl}34snps5r=wk5~HM2Ns>BBy92U~Qji}q zzD7!##>s(57tQi_!F*L7)Q=Ka!MbF*XwHEMkhQKAID&7w{2Rj&e{nibV}9%h(&0FV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT new file mode 100644 index 0000000000000000000000000000000000000000..2a1f7ab7a679f108c1fd4cc7ccaff9206541b2e6 GIT binary patch literal 603 zcmb7CNlwHt5OiiHfW!}Y0Twfo+gp;kaOR4*d3?(&pz|Z1#20u2RAmtdE?}wSrK`Gn z$@`~iUya#48)KTLF}Foxy^L@Em?u27us!Usp0BW9!?=LHll#Xrt@x1osu|2MS?xOu zzz#+-Nv1J-5f9D-DPAL4vFj^$cZyX@It`G%j8;>!mZvqqramh-<{;iV#$*aNB8xb$ zFbb|>bbl~AHy0EpT~a-z4oaHoaZW|VS`8)Ojal_x2N2}QO41BcDJ;(ypDK_p02z_+ zP_1UCeaT(b0np-PhB1D;jGBjx*o^9f51L#|R&iq@knzMX{;;u2OlueZ(jHd3^>#jf nVXcq!{9GGzW*-02DK6D*5S%7|hjj>T3}_yP{PZ%*{r-FdY2bC) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE new file mode 100644 index 0000000000000000000000000000000000000000..4d01e44e08f01ecb4e6002d1369b3125b3b1f4f7 GIT binary patch literal 326 zcmaJ+%MHRX40R}<9hiU|kP@d=6C{)q7e*k-EmKf;BUWPuuxYvUP)pDDv;3Tw*Bf?E z0CfdUO2IK%3?n;NFfAa4B6tQ;i*ti9}a1zSQW^* zhvm18At^{c*TIdN&{4~SWZOdMsn1nYmn-$M%&rS@@`YR%HF@JHBx7AyM49l+s>$Kc Tgt#+i;clG*Z0@)J9~SisfFL=N literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM new file mode 100644 index 0000000000000000000000000000000000000000..bcb6c85a3f1b855220f6ff5c55388faaab783989 GIT binary patch literal 251 zcmZ4UmVveWD+2=qBO@aNN3@}3Y)nc_3WyKH%s>nRKq(&!XzLXK&DC>f=q)LY;LAWtl>bN%!cM>$mW@w PVHIRxVDj>XsY9ayz=j}P literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO new file mode 100644 index 0000000000000000000000000000000000000000..ec29ccde960558b7836def23b40843a65daecc9c GIT binary patch literal 376 zcma)1F%E+;3`{_*9oV~3hH=8V>iH#O=FEaAVBry1VLjI85W%ByA(97dLlp@?G)&py zLk<>s~=T8KM{WQrrRmSptd>KQ%~tSmQb=VhuK?B`NcjxpiA( W)?O*`#aJ(Q)!h4;?0QSCzvB({BRBB? literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP new file mode 100644 index 0000000000000000000000000000000000000000..485360c217faf77eb1745d84741ba3550c79ce1e GIT binary patch literal 309 zcmZvXJrcqo5QP`xPqeb|5XlV1!jKqj(p%YwbezJF8+kR)pl>Im1-dgI?83f%@OaYZ zPNXzpQHo9jn=!-?tNs$=)adhE_qbbw0+e764nP8uoiPJ@k!35&ez|8uwt88<)xxyJ{S6*4=F0qW&sne KuD6dzw!Z;o#4CCL literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE new file mode 100644 index 0000000000000000000000000000000000000000..d33355e193f5b41c8b52ba98d10b4cc08888c34e GIT binary patch literal 727 zcmbu7O-{rx424sM3JGx#DiLJor)k(AA+h2JX?8sY7*51lxCuu<@SIdIf+d}1TD$g_ zmzTW0oAJ?@lQ(0`Fbw9Ru+4Sdp4?S*D@8eGgQQf3Lq6h z38IAySr@AWqDh)Ka>1%Re26L6NyS-T#TR1K6$V~qYuHjw5y7HXyhi~67fVDq>s%x* zV`X!ySQip=As?|yDQT$_p1HwXvk)QYUWcrb6WXa3YY})-GQhUtsiL2$|&Wk#Ln*wHl$`1Oyat7QLxb|2bLnSq!Eh(Q3Tg5A&{+ECXx7Q_Q$ zkSvhFY-nHz;xaJ)2LccS0`O`88OH-PuExZ`!~m`fn|VORtUyIEDL_>qtH5qzWMBbl P#3u*zg||D*WHcH8`S=^B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH new file mode 100644 index 0000000000000000000000000000000000000000..b9610350a9603d76d936bd44c9a9afa683d8196c GIT binary patch literal 282 zcmZ4UmVvd3fq_ww0Z1@1G6+W-nwZ7Lq{O6X*jvS$*485L literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI new file mode 100644 index 0000000000000000000000000000000000000000..a381e3fe0450cab86f5f25b7ed8f38cb315fb26d GIT binary patch literal 288 zcmZ4UmVvd3fq_w+0Z1@1GVnwjnp?)kq*NQ}7}o;Dn1GlWh*^Lb1b|BT4K1UMbWLMx zEJ3tMEJzfHL8^cZW;?mny#@wA-9XA1D1zc317kD?p>ct}^!9`rgiZkf;v^|S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM new file mode 100644 index 0000000000000000000000000000000000000000..9c4a073760b40810e975ce3324b48591f824b439 GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYrK6C7NM{JpbinRKq*0EW8)f24SOp?!x{^V8cRz} qh!jX6Gf)nsoPqH_5WvL2+W3&PVdx>lTr_LYxC{(T-hK%CQCI*lA0%7= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP new file mode 100644 index 0000000000000000000000000000000000000000..093275551b18bfe2d6f69054e146e937332fa41f GIT binary patch literal 215 zcmZ4UmVveWA_D^hBO@aNN3@|uY)nc_3WyKH%s>nRKq)Rm!)PPR*cuB%ONbaq1+$@{ f5l9^a<9{H4iQ`vKieYGGqj4D+n7jiJmZGo#>V6;r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR new file mode 100644 index 0000000000000000000000000000000000000000..6c770c97d034bc688ec19bc613e500e2c11f210d GIT binary patch literal 502 zcmZuuOHRZv3{4mY%^ryzd%7r!lQ>P;^Z@MGrrGrrGwwmS16P|fz;mXR5WE>qOcpwmr6=zLQ%$BbLpDIusrD3c@Q38$*XQ)Xit`DrrktgBe zc&L&JC)^AL0LjI3MjU}a?1Z@x*Lk_bRWhiwdXg9=rS5iHe6C$5DyuqN1>+HqZQ#~r zB*~~mdu*n?IrpbGRQ|eCfT6@bp~?-}$ct+&ft!e+4X%A;I^#A1&|34TJk02YVyapt VukC&N5!RfD*{Olz{X@b3*bl&|TkZe= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW new file mode 100644 index 0000000000000000000000000000000000000000..c37942e118523671a410ce97fd23e7346263a13b GIT binary patch literal 243 zcmZ4UmVveWEdv7sBO@b&P_&^%Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(Jpem5- afa*Y!VD~UGumVLfR0Cb@9S$=OjRpWb8XtQA literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY new file mode 100644 index 0000000000000000000000000000000000000000..3353ad9369485258334c83c04f3cdd3b8011451a GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FI}&C%8Vvx7yBv1_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ new file mode 100644 index 0000000000000000000000000000000000000000..03d7639434bf76081ef8855c2b64e3ad2d4ebba3 GIT binary patch literal 333 zcmZ4UmVvd3fq~J50Z1@1GVnwj>YBvHq*NQ}nA8Hrn4y>jNV5Vl2mqCd7;4yC835H9 z$JQ7cY1SAS8pWglrI>&iqy?m$fsujP(7=!p%=`}oAO-{gP2fW{0Vobq2+|AH2eL*H zrpN?tjbRPYW@7^rgBlY96HNnB7tjQLi0YUWuyVK?;of0nU;&zAK)gzzAHAa> Hc4CkKOARXJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA new file mode 100644 index 0000000000000000000000000000000000000000..bcfc00618ad2e8a139877c68fe7b1aa95bd0f293 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL(6CbL(^D@07#nI(9!^;h=K7x Z5WvLoC??t%G*i*I3=B*@jtJ{eSO8r&96SI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB new file mode 100644 index 0000000000000000000000000000000000000000..628496307edc9debfa5d5ac17961aa8f57a4f3f6 GIT binary patch literal 236 zcmZ4UmVveW83O|YBO@aNN3@}3Y)nc_3WyKH%s>nRKq)~(4SOp?qZ$)~8go<48cRz{ nh!jX6v!S68NI3)Je;|N~6Qzv|qtR?a<1#QX`8Xk*fWiU*#~>vg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC new file mode 100644 index 0000000000000000000000000000000000000000..bd295e7dfe2bc287cba26909b4aef8ccdfd9fbcf GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4K#DMjM%1#MYRY zXo3WR7^DcuU^X-~0&y7_{{sPt0RhD50~xLkHXLXH)O=IT8k1;aT~qVe8dHNBbJH3N b!)QZ`Sdgt?fYnAc2cU6*p7Qa8=|`ghA?GMt literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK new file mode 100644 index 0000000000000000000000000000000000000000..bef8687933b8ba2ef8d6d8d0f8f0d78e38e45d6c GIT binary patch literal 388 zcmah_!41MN3`{9VunCojWG89U@L>Shz~sjiG%SQzjTzwF3LX^_mYnlB_QlTQX;xQb zs=?r>DzoPEWpF!x17E;v_!6#$>kYGz>-vG?eCI$vImd3`KPz%6jU^N`5 nQv|Hu1ga0HO;a-_1*ik$46u6{8CXCDlb{snVV@v~!!bwzw>%~o literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS new file mode 100644 index 0000000000000000000000000000000000000000..228c9d47fae21c536553a457b3dc2ae0cc30b4b3 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InzQ}bAe07#nI(9j5^h=K7x Z5WvLoC??t%G*i*I3=B*@!3gV6SO8ZI96SI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT new file mode 100644 index 0000000000000000000000000000000000000000..9ca9325385c5188e72199318f80ccfa7daec0e2c GIT binary patch literal 366 zcmaKmJr2S!426>-xB??99xBC&)B=kyz{r+nE0+LsBd*37;3aLA3e{5l9RECh?~mC& zjInovWUbjp$7vXka+%XJyhune-rzN}?w~nvadKE@7WG~<1R-TKT;w*SQhM!}nb7Ah zPli$1(=bjB@Gy;ITim{g+AijYRdY{R&PWw&^2$`QdI*f@`}Ul)5II*sIdY%W2SQYe Qe{c)d#TPW!TRmUs4{nY?^Z)<= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU new file mode 100644 index 0000000000000000000000000000000000000000..febd5a97db8d4aced8b555db8e8b0997f07e5462 GIT binary patch literal 279 zcmZurI}XAy6nl@-iV2BZ5UE36q9Vk?1z4GyZaD>{H|o_m1K5-S6)e4vBl|hiL+YD| zZUs$MHkR@|wA~24Mpd6#V>T!PvYpxfeCk6S$^nKrI=rt?)W3Bqm03_w(I>!V2JDR) xz2FqkgN1tDZoh6L#Cu=N%(=oyJC;6lL&_z(lvAda_#3xKUr>Dba-H2j{RK%hDYF0o literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV new file mode 100644 index 0000000000000000000000000000000000000000..812f9222e9cee2b86909cb330821db7a81df960c GIT binary patch literal 379 zcmZWkI}XAy40Q@+LhRgtN+8*7lNJ^vW@eT)TTj3U>5aG=XMpE4Wxsv8i^2i`^THqc literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC new file mode 100644 index 0000000000000000000000000000000000000000..0fb1738c6d40595389ec5019b584a90b87d32130 GIT binary patch literal 226 zcmZ4UmVveW4g&)NBO@aNn_)~!Oo}~_#{|X9KpF&qlDvi*_Ev^QHPNQ#7O|QTVW0#9 nlc6aiSjm4NfC&@Q0WwekYM_ZB5oV%UfyMsKLa literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD new file mode 100644 index 0000000000000000000000000000000000000000..703bf720525776290518f8643e4159e32fae9919 GIT binary patch literal 355 zcmaJ+F%H5o3`{6x;TsG@qEeie(y*|w@&OWWc?Fms@ipE6c0y6r0ZX>y_%3&OzEpiv zN?#Qht<^e!$C&PJw}0@}lC%2un)`}Vf{`15?dj;K=W4AbnE=SeWQ-wi12io%bipZ4 zWU5vbfYUrG{pOHE3DM@&geWK>szMS?%pw!nV0$de0S-v6W$7WNm`>ztLVhW_&q{<<(kkM4uQh`F=5v6&>Ke{sf z^c;={u!6CT?gs4>_c6z;VrEhtsPzd>n~^*3Jv&fMFb*^ujCP5gb4qcU6b$JOWGH)Z b`ox1VxT2W9&VG5Gd|?8Gm>u^Y{iHqst|U9B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF new file mode 100644 index 0000000000000000000000000000000000000000..7106c2f843cfd76e68521b4c000399aa7bfb3e55 GIT binary patch literal 329 zcmZ{e%MHRX5JcA@fDe)UAs=%ICvH?=`{pVjbVO^^0JC;LLI_Li-^|Y2`-9dO zB5@>aLeSQ08$;Snhme-zYHo6p6AUX-BO@aNn_)~!Oo}~_#{|X9KpF&qlKh4m_Ev_`<`%IvAVL!&0hD53 fGBjrdEBX%vFk!-aNHrAA4m2*%&A#pk%TZVW;oBnF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH new file mode 100644 index 0000000000000000000000000000000000000000..e42f2eea2588bd4d943902e3082fe740dd9bd20e GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG85l2P6gJffO(>{s#h>I1YtG TX-6{+jmyBmSzP1^|Mb BG5r7l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML new file mode 100644 index 0000000000000000000000000000000000000000..9b903bad8d2eaf34337be96c0d2e70f0a98f206e GIT binary patch literal 594 zcmZutOH#uy40TG&l0BRNPsxmA`4h8Y%?zBt^{%HV;sTt7t8oXOoUACBaiYl5`+fho z!^OGXt8;FeCU@6Z^1SrZ`GcS0C%Su_9nQ^GAMmvY!$)qZEL|U8o+Sm%#S>|X6s(g= zK^=7=B7Zt#!w?L~5C_WScAS9280TP@jWE?x z?NwoOX-ma;iR%>v!*@#F95tFlZ)_%TiILan8MA+BHBZQ64L}tK&e}njs7n#1l4e8gf EUrixo_W%F@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM new file mode 100644 index 0000000000000000000000000000000000000000..922ffccc4adc0d97a1b442d8efd4bb78e40eeae5 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLrY5t2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6#@ aKM=sg@u?=>AT)E)xC{(TzJ3S`QCI-2+#II> literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO new file mode 100644 index 0000000000000000000000000000000000000000..cab7cbe5ae77a068cd7f93cffc20f8ced4a99f37 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBmH289Ixdm|Y~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP new file mode 100644 index 0000000000000000000000000000000000000000..577d33c7b19869e9323600414dc1196554f287a3 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FHvnch8Vvx76&!E? literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ new file mode 100644 index 0000000000000000000000000000000000000000..f4965bc7cca9baf5a091b80fba923ff1854ce878 GIT binary patch literal 353 zcmZus%MOAt5ZodX6XV&NXE~7cAqrmj0uSCy3OBw&;E((@zd>gZ2qbRP?RIx&I(@xm z{S;9TK~hQ%-ngo)kHvMK8r#JM7f>N~fV~>(2qy#Ny#deI)~A=Oid*NkfmT^#O7xs1 zN&=IDvvuB{&iRN_!0`plLua*SN$K4}8a;}Qfr8G8`t$ck^WmsBDA&Ev?c0;U;z@-bcK`KovlCd1w5%SiU0rr literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR new file mode 100644 index 0000000000000000000000000000000000000000..bd9cbf662d289492fcc3e523c59bf776f5f81c48 GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYkY$c7NM{Jptu>q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS new file mode 100644 index 0000000000000000000000000000000000000000..f4dd3eca9fa8c0a7bcb24dc89ff2b2040b78c68b GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@Y;Y)nc_3WyKH%s>nRKq+2J4SOp?!x{^V8cRz}h%iVI vv!$USNGSv3e;|N~gSBu$wP2_RnI~ujGz^!SKshus@pBm%n0$i~cB8NWbuJ WkV+81YBZWnXk4JneM2C+F-QPyl_e4Y literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU new file mode 100644 index 0000000000000000000000000000000000000000..56c4fd644154094740ba45dcc4d7f011ecbf2cb0 GIT binary patch literal 254 zcmZ4UmVveW2Ll5GBO@aNPqd+hWo%4JwULfVEl`XZidld(D-eSKP#LeGVYG>9Y>lO5 zw5eq*NDPQUYJm)9Lqih~mx1v=5P%pEK!i4s(c*?s+iNuJtt?_vVp4#%XvU<#jR9I< TV1Q-;el7z8lW!fGT(mHSDbnjA{&{ zEi7X-L1I7*QUhc#8yXmaxD1T{fdIsS03x)3j8+C29c`d%Y_4k=TN7=fYX)?RW=u+r piGhg$&_WZ_SVOpxAj=HUECZUs23LmSE)zpEr9i*=hQSO&qXAhiCQSeU literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW new file mode 100644 index 0000000000000000000000000000000000000000..27ed1791cb9e773a63c529399433b3449c2f278e GIT binary patch literal 282 zcmZ4UmVvd3fq_ww0Z1@1G6+W-T3E)$q{O6X*jvS!3f}P07zzQ~lfHcr!zTptZVUPe8cOz&3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX new file mode 100644 index 0000000000000000000000000000000000000000..f5b17552ef36a8142f8a104f0961c04f95ceaba7 GIT binary patch literal 324 zcma)$F%H5o3`HHuLf(+eNt8O6i5U*kW*%`kUE#9C{$3~o~h4yan{hEJFUyZyUh zaPM@#JcJfVV(Ds03yh!9G}o?ki>dqdw4N4C zXvGvY?dd#gDaD8{UJH6u7G*7sO7~h(z{QB?FPe+aq_u?%Oz$=4%(jU;5eg|u!?|v^ zck;=q5~?O(7z-#lp#%s4xHJ}nG9n=NBMn3g!34qq>!D#1Zdwm+L=|nDzG#Z+JDj~B V8oBMkzm|nV2+mzSJ{iCt_6243Vsroi literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ new file mode 100644 index 0000000000000000000000000000000000000000..fcce2b377366e6c513680a841fbbb159b991fc69 GIT binary patch literal 256 zcmZ4UmVveW7Xt$WBO@aNhha=gwULf-Es)Oy#LPg<0>mHylol}5u(vXdHn)tev5Ypi zh}8rM12IS$kil$dXb$2sF#ZPu5CZ~;(+RRb8e~DVfsw9hY)nc_N)4J_VB@gbgJvxn N7w8$^D41)|XaGSoC}#iw literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA new file mode 100644 index 0000000000000000000000000000000000000000..c69a95ec37bb6742cb170f1073e2c6c5bfee5cf0 GIT binary patch literal 244 zcmZ4UmVveW9RmXcBO@aNceJ5pY)neEk&a0%P>30dS%5Sv5Q6|v6|13vp`js&4a8t^ zm>5Waf$={OfEW;fR|Cj6DGhroLxUPiV@;r`H6Tt*N{yvvOiD}&+zbY0O9KNm)A4f| M7?}JVVfxW%06XI%*8l(j literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC new file mode 100644 index 0000000000000000000000000000000000000000..d1ae2941e41924c648d4bb27ae2da8cb43e63f6f GIT binary patch literal 340 zcmZWkOAZ1d422nWVLXVFNWy0d#ElCVE=;@tu;UbCy^&Y*3|c^q8Jo0)e%^b%KiG0& zjGq|=&eLDdNzq#E2oC7mkh*>!Ph+{`!$cDWQcG52UrWy+tStx_0#jxhZXI^LkcM|bs0zF; z*tf(qF4WBr6&jcjg_sS_8D+^rVjyrKu_KF3Vw4#srskL|dmov~2F^J~M49-!jYx6` lVJ5rSM@-te$v+Rn-|B;G7R$GhuhwAgLR)TjIZx(`{sFjAMrHs2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF new file mode 100644 index 0000000000000000000000000000000000000000..851a2b4956cf5131e27b2c1be38c630391166de1 GIT binary patch literal 221 zcmZ4UmVveWIs*d(BO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F+V(;9PgO^7f^5woSC fAxJ3$<9{H4i4)X9qLFAepm7-(nEc!jR->>0ibEjj literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG new file mode 100644 index 0000000000000000000000000000000000000000..7229d6a28c9d099dbce23b3a4556482436b0d2e0 GIT binary patch literal 254 zcmZ4UmVveW2Ll5GBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(YN|0YFgGxOE5~LKP$fH1706*gbs$^7PGMwV R1?wds4fKGYJIs7E8UX4}9T)%r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI new file mode 100644 index 0000000000000000000000000000000000000000..62dd13c116fcfdefccc035bd75970a9ea886b1ae GIT binary patch literal 297 zcmZusF%H5o3`{7jh>4kzNDOw;l9Yv+g%70N`U)^V;%mGC&MinNVCgK`x$|A_53{%! zV>brPTC>dT>wWCI;p%tchV2ZffH|NA(weu&1Lr37;xnb*Ner3taUo;{ob&5$MY>7!i3{DuD8J0iWK^*2Qksu=Ov^J!B5 F^cRcUF_i!S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL new file mode 100644 index 0000000000000000000000000000000000000000..4c9128189c146aa44c7c2be49ffd1e140584214c GIT binary patch literal 384 zcmZut!41MN40M13Z@w%*9+m7Q0?MZgAQnjbtHcOMG~I~Rm;ug7e_+Y3{A{}a^6~-oX#WHp-(<~)DSE>_O;$6 z1?F@HC9*360r%AOP%4`N7t7hvU#sv@iQ{g_)`;{4;Bkc+1KXB8Kd{Gcyu|IAH~*F| Do+Uga literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO new file mode 100644 index 0000000000000000000000000000000000000000..7f0731331e02fd1114ea94cdfde9151ff3f1c0cc GIT binary patch literal 330 zcmZusyAi@L47CY?f{rQh9fjmLB%$GGDPRD{U8VqKBUWPucru~k^6q5)-jn3#%anIx z?AhS4)@&ki>W7El*CR?xSTXq$eg#v2xnib1)>V5j)B?Gz#K9);!A$@g05TScLDoR^fviykD*{>t mwaL-~Vv}LCp{_}6jgh7%NIeK(wF}K^G%nC%egP2O7$gASrYW)j literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR new file mode 100644 index 0000000000000000000000000000000000000000..317c9d3fce467811d554ea1eb0b1681d2fcb5305 GIT binary patch literal 213 zcmZ4UmVveWJOcv*BO@aNt6@w^ObUnt#LPep0zh$gL&InTU87it07#nI(9i&+h=K7x r5WvLoC3j31k~k6lN-fho**sfyplvrUH!y0QV>wrT_o{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ new file mode 100644 index 0000000000000000000000000000000000000000..e922a873ad8c45978c937219ae8e4d7cc34f57b2 GIT binary patch literal 350 zcmaJ+K@I{T41`^cUy)=t*-`{o51zev^CHV_U!mO}`8D65EyTodu%S>oWoCH3)cUTJ zzAE0dR-0*lVCNRTHk>Wzic^Bo767E;6od=u2r$6D0!ru4Ga)?l6v6g%;01)i0C8oJ zMrRy_IA98fqV0E~9}|1C9WLZ$+5=f1haM9JXN}mAC|<;&(r*qavf32dk6@E$Vq>Pc*3XogwS2p|+`g^q`~cx`HO>G4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM new file mode 100644 index 0000000000000000000000000000000000000000..3fff62fbcb4d4887213f3d7492e0d830b9de8294 GIT binary patch literal 285 zcmaKmF%H5o3`HGOhB9*qI#j9?r^PJnNQeWZ*?J0UZp76%1K2nRKq+QRLqiA$Bn9Gu6fiLU2LhNl k4uv4?+=d3xM!F`kHK@iI8W^D&gP+U5z!cz!unvU<05UZj`v3p{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE new file mode 100644 index 0000000000000000000000000000000000000000..f660b534d65eae75c2a3a473f272d4e7bcd6071f GIT binary patch literal 221 zcmZ4UmVveWIs*d(BO@aNt6@w^ObUnt#LPep0zh$ILk)W?1JfGAXfyLzO^7f^5woFz fDM%>;<9{H4i4)X9qLFAepm7-(m;zi8R->>0cTgb8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF new file mode 100644 index 0000000000000000000000000000000000000000..b431f93433325eb32d4a28372897862c6643c9f1 GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBO@aNvtdjMhzZ0@KnwyvQ8vS9Q*(=02p=TNWM~Rf!oc_+2w=iE Ul@e(Lnu%y!po0S35LThE00vqbR{#J2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG new file mode 100644 index 0000000000000000000000000000000000000000..022009b726388ef4bcb25d794ff4f75b0f563c10 GIT binary patch literal 293 zcmZ4UmVvd3fq_wm0Z1@1GH^#57{nRKq)Rm!)PP(*cwYiLx>ni1+$@{ f5l9^a<9{H4iQ`vKieYGGqj4D+m;yWymZGo#-RK|W literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK new file mode 100644 index 0000000000000000000000000000000000000000..228f85a6b21aaf1b00df041979c6b1d6a35ba8c2 GIT binary patch literal 265 zcmZ4UmVvd3fq{_$2pAa|88{4MQmPGgjB9~>W*}yQ(kwt41b|9J4K?hoK-efI#lFT= zvnJZqELIaD4Kj(z&=g|ae;|MfgLR6)bsFK&2r^$Dtjfr!#yHx*&?FXOe2t-Dw2_Ia Zxvpg_%t&lDp;?T^1$rmI8>StN1^~phDIov= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL new file mode 100644 index 0000000000000000000000000000000000000000..96ad400ae37e373bbf652bba971e8d28086b8e18 GIT binary patch literal 320 zcmaJ+I}XAy40Wi=!iqQpm8cXasA*U_urjbG*?Ni+Zp76%13dR5p$=Gju`R#n=e*uj z4n)ck9;Ij>*r(XX{@7h&|1c-}tUAn!871--kO2L_45G;mxL{`QgR6bQa07^FBr7VI zjY3Q6gOFkh?AT%SBNUbhX%dOcRZM21vE*!Qm0Qoj*aX+b9ke!_YnQSQj615#9GW(1 UttY!>>*|#MEk1Li_@% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM new file mode 100644 index 0000000000000000000000000000000000000000..b07b532a37c7e0663ea791898de2d7a0f3cfbb29 GIT binary patch literal 370 zcmZXP!41MN3`LVt5E2tG01`b^vJ+ZTE}a00d(vAjtU${~ti}xR-GpAS^zyegEQQMgQJ<3_Gd3!=t3OrGh^mY3Y#4ffmGs;Ha8cScoNr2e-Kh2irY06 Gf9Drba5Odm literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR new file mode 100644 index 0000000000000000000000000000000000000000..03bbbbd9c7a5e80130a5e760075ebade03eff3d0 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yPAP8nS8Vvx7kQ{XY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS new file mode 100644 index 0000000000000000000000000000000000000000..3a437d58e3d697e05c7ceb9643c1d615627fd9a7 GIT binary patch literal 255 zcmZ4UmVveWCj$cmBO@aNhha=gwULf-Es)Oy#LPg<0>mHyl;$(ku(vXZHqbSStuZsx z1PKB$ND+|1Y-nHr;xaJ)2LccS0)YD14I!F<0%#gQrb-~0YG`CsV`2g{yvEWJWIh;R iH5;gr)zHu=CIzSjWGL8~j0`M5F-&JL1q4Hk!XN?46(ODg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT new file mode 100644 index 0000000000000000000000000000000000000000..be530d73a6c0fad2b37ebac9ccb6ee4e82e6258c GIT binary patch literal 404 zcmZusv2nvN45T8*BY1)oVUat4A}Pv^R!EVKLZ>NWcmlT>BdcYGDZXWXpttj&zsDL(GxNz&=ZSqf+k%=Gf}0CUbH1@Orp_i zDud?MpfF_7p;8c?DrYRU;W;yFnmj9mpvYM4QpAQfOH}z~fJCHb3tG^`y97_RqQ$?q Q?p)qIoqKqF+t7dN4`lgH@c;k- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW new file mode 100644 index 0000000000000000000000000000000000000000..dfa8e34031eed862ecc56df949ff82e3622bbd5d GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG85l2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6cCQE289IxQvMk7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY new file mode 100644 index 0000000000000000000000000000000000000000..f8618ca22b03009e28aeb3193f6f84c7dc29cad1 GIT binary patch literal 359 zcmbVH!41MN40NbyN8rH%R4P(jQi<^C3Vcx#UYUX>8?hQQz`3pZC=w4&I>%1p^ZEIr z?Sn|&2|+2^Ic`m7gO5HQ`iqalsWG|k@m$O-aaN!J9Tm6dWSOM`ZA%4`WA6bJvx|5aply}0l9`2tTbBEE%NtFV9u9*&_#ZO~kKQ&hNY!Hh_?N zN1~H4RV~e`99pue9;TM&WnRXddyTm*Bxhc`k&Af8a%nalq3+s6|5C8YIa>!|qKPKN z90u+9uml4N185_$sF31mJcSh}b`3*Gh6-jCnAR-KjulT77`aDmk2CUkyb!;*yy2nRASpw`XhS0t(^!ZINS@iy&=91G zf$={Oz{J6-*}$sN)PjsrHPo=TGKeb>!45X5{OQ$TEGgd$ikh0^1U5dV;qwLN3M9X}l@5tBshUO?aQ$v7~NZyf0 zU4NP^kF8D- zuoc|tg%)Tnk^({se=vVkL$@tT_ZHw+x?`PAmFiQ^KGdDrFk3{T^}>aUl;o36HBhyL zmYLgbim~eBocb2c&4uR9Up?C}*eM?%+0ki{UX(4812xjiI2R@LQy^)B97EEsNMgu{ b<810P26P7azP|sW@1XpD{nh7(S0C67s{27! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB new file mode 100644 index 0000000000000000000000000000000000000000..46fc12706d4e8cafd16d81a1c432d71fed3a18af GIT binary patch literal 295 zcmaJ*I}XAy40WiOxC1jCD#Z?IViqK>!02W{Jq7ZSxEf~w8`Px|Sn}uj`STu6*xmuc z9xQ|aJ3%S~w`rbcZ<%-IZpL=Z`~^-q@&O1hv!(xI(ARHxIG-evU01Y6O(o?f5v@3K z6ST)V3VABxGPFt@YU`Co)>4Yrl$AeMu%QxZN}97#TB|bmiwaYRF|O48hX9-FW!Ycl EH>IyNqyPW_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC new file mode 100644 index 0000000000000000000000000000000000000000..b3b13e738d8ef54c4eca633ded18bba87e75c8cf GIT binary patch literal 310 zcmaJ+I}XAy3{5CZj9h|BM2gci)GQ1f0WrDRI0cv+aW&2W&q6R12}>`wpPxUuKiuNt zoDU9<_iib~bv$3wrn`Zf0Szz*%%E7&dcPx~T!yM8w#v*_0ZfUYAtFnif5I$y8=9M6 zu`#HeY^=nBQ*S_P^u0{Az_K2aSrB`@r*Id?RPbf Rig9w({}i7;9zOjO{{kN*HPrwB literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD new file mode 100644 index 0000000000000000000000000000000000000000..9c84b486ed2715cb71668a004bfb782a5d0c8e03 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6zqbq289Ixda)To literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE new file mode 100644 index 0000000000000000000000000000000000000000..2624935a08dc4cf971581effb67c753fa1c63cda GIT binary patch literal 558 zcmbVIK~BUl3{1OpB~FMxfJ7uJ*-qM|TsZLpj%jXv1#5o9Blr++fN@%J;YK7Utu-?q z&&QV=-kj_2opW8+xtqdcNaIr1?IMrUJK9&M)A0^?&nP=U-!VTtKZ)WBImb2tbg+p=vgqXwKNk zM6F0C_M|M{c5joTW{8b(MtB&~l31vqQ}$u)W5$HAZI928KXa#H7@qSOhi;Xo;bL S0h%TFxeN?U!5%QDpwR#*S0>*8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI new file mode 100644 index 0000000000000000000000000000000000000000..68f0d5610bb29297a42477fa8b06b4d9a55c223f GIT binary patch literal 357 zcmZusF&4rg3A50$~4HWNBSJq(0Ku+zIW|6~*5Q8wsLuFIl}KQ$#BY>7 zO5x1H&V+$hiK?ZdQ?D@af}{67i-^mq@mmdX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL new file mode 100644 index 0000000000000000000000000000000000000000..53fc6e66dff5219ac7e54430ef05ac648528d322 GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z1@1G6+W-m|4cgq{O6X*jvS|PwQUGKy8yH%GxD1T{fdIsS077~|h6*4ItuZq&F))B@#%3%~13OR^ c$hAOqAUnbCV`N|j>m?u!^i{AA%zQK&0H-w}c>n+a literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM new file mode 100644 index 0000000000000000000000000000000000000000..9ce5a90dbfa7daac96137e85a1e2f5ff0f2c8f28 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoeQ;S%L07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B-cz6k43SO8l|97X^D literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN new file mode 100644 index 0000000000000000000000000000000000000000..424f4f8f876bcc427facd5b907a847044533deea GIT binary patch literal 417 zcmZ`#OAf*y5QSPyOcR%`Jb)&eFk@-e#CQWYE-Aa7Lh&9R!mD`)-_Wu!QIdffnD-f8 zZ)I*u>8HY`wW>UE==wWt+yhqzQ6MIWa;&E~WubdXtMk#3i@x25b!1f5Mp}blCvbrX z{0pj8K`p?G)b6=%LiBY5f(#RgC?_SY4A<6L)JfBjh)Ir+P9z`{J14P2zBz=5Br$h= zbmC_;=k0dTBOF;VlIMX^*b*IsZJzv5mHylx8+GGzGDM7$gH^fJ8uC l2FCwD0AfG@PQ@T&kZl1g2bp7FfMyPUF3^3!K``6UXaF^98=n9G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS new file mode 100644 index 0000000000000000000000000000000000000000..23d11a49916b7a566ad9020726fee94a22433f81 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6da7O289Ixd>I*0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST new file mode 100644 index 0000000000000000000000000000000000000000..1d52d4ed86b5ccf0c1acd127c50d5d9df039f9b4 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLqj772P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6dZ!E289IxJ1H2z literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV new file mode 100644 index 0000000000000000000000000000000000000000..b37645ec17691fcc33492b387537ffbbfabe81a1 GIT binary patch literal 327 zcmaivK@P$o5Jd-@){R^5Ac;*FsHC{ChcIyi>^Oze8+kR)pns|>W8x!@>Er7g1BD~m+jPE6E^~|iR1?&4UR~Jq1a}CiPvaW-{szKmXstsCfM6hDE cUthy`4PK^O5F(idY%4zI&ozcSUxfdm7k?`)TmS$7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX new file mode 100644 index 0000000000000000000000000000000000000000..1c247755b99702cd2c9578a79ad7ecbc82bb7351 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L(3Wq3r&a^NCmT{p(RKi i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yPI09xk8VvxU3mmQh literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY new file mode 100644 index 0000000000000000000000000000000000000000..b71062fa2dae57a8dcb7b441b9ec3e9095ddcfc5 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InTBjZ?z07#nI(9i&+h=K7x Z5WvLoC??t%G*i*I3=B-ckqGNhSO7@v94G() literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ new file mode 100644 index 0000000000000000000000000000000000000000..7284651d5722da3c9c421b5414ec1b736cd4fa13 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6dZ-H289Ixe8Cx5 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC new file mode 100644 index 0000000000000000000000000000000000000000..7f9f221e452e48ce5d0f8c5ecac4ec6c3e8b0b5e GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4KmHylomA9u(vXdHn)haF^@Jh zGLO{+i32f69gx9nXlM@NGBExJ0uTcNh|~(QLJVYufuUiIVYC6NJz%52b{L@9fu9TX LNr*elC1^ANN^T~M literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH new file mode 100644 index 0000000000000000000000000000000000000000..5ec30571cbafb3e9f6248bff0e9a822f30c97953 GIT binary patch literal 854 zcmZWnOHN!d5cFd}WR(l#0vu&ICA?M5AaHp^Me}!|xxyIoK_p|)I|HI?`2+eCB+BBBEkJ57K zV{bmh-0euEj*Pe%M{e}j3a8Lj>-j=^hb>J~PifT$f;q`9!1*RdxsZx_yN74~;T&%EC^U>kX zyq8|YP!~c94NAvtM*xQqP=t9o+o5=nx}>nS05Y|dSuFy#s2#DCr4d?z>U7pjAO=1F zmApVDq>LA!x)2i)fGbMN&W3w>@VurIo4Sc3q*y>P&BDkRDrGWt*-=2UN$fkK0w?J? zsW~*bKX=l5bo$>M5OTb(Ap-Dd9fhsN0g`>o2e!I{@Z^9UVLIr7$C3<#ierIMuo>JI zE>Z9Z(A6+;)DI<}giIZARmDyrLmHz(M!VN&6COY(dloL;o-dH}b&b42*R4q8;J$fd TWwhBo@X^3`_4KfeZ@>QmUNF00 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ new file mode 100644 index 0000000000000000000000000000000000000000..de63252fc77a968c6909ab8255e93423d6d0dfe9 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNt6@w^ObUnt#LPep0zh#-Lk)W?gJ?rtV-#&*XlxN%V{TMq8Es%5s|hm)WWIp`n)&#-3=B*m JJ}~`gGys1vBR~KE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM new file mode 100644 index 0000000000000000000000000000000000000000..7623973b28042cfe236e94b782cc70eca6cc4795 GIT binary patch literal 197 zcmZ4UmVvc=KLY~;BO@aNvq4M>hzZ0@KnwyvQFeo9LtPWgScm{fn#sTrq=td8q5^DyUk!W0?lR|tEcA>BUFa;Wp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN new file mode 100644 index 0000000000000000000000000000000000000000..192ca3302c3204069bf7f1bf7d00f1a663381b8d GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL(6CbbBkDr07#nI(9!^;h=K7x Z5WvLoC??t%G*i*I3=B*mehBMOSO9Dl9Bcpp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO new file mode 100644 index 0000000000000000000000000000000000000000..4a340a72c07513566f7076e9a4aa40458fb53853 GIT binary patch literal 230 zcmZ4UmVveW0RsaABO@aNt7S||ObUnt#LPep0zh#AOAUJ~L&F*)qZ(u58cRz}hzv*_ jv!$USNHqiFe;|N~6QhfCgVF3k<1#QXh4>>JfWiU*a^fSZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR new file mode 100644 index 0000000000000000000000000000000000000000..0847c59312fd7667713e7796cc79dd6e80e2751d GIT binary patch literal 1027 zcmaKrO|BF%41{}_#|}6Lkr)&waemlv2gEMZyEz4z8*vlP!UfpC=kz>~;E9%^PA9g@ zuB!g}eS7|C+s;3>Z9AP#+lwiev0rbW)0^^zv-5pD@P5wnhp@Nu`u#hZG3}O;cRETJdMSx^qHuR;wDUG%@8cHfudtJ*J0ay@FaJE^A&zVl^Ua zp-xOzTd`K)QDr5|Oiphk-w{1O>C#}gS=#P}9Air6fB}WTJXTL78@yVh&7KML8KtPD z5y`z&l&8hk64y+~t@8$M0?k=S8G<|s)dx%}{8_88(mFLh}^nQ+|-%*(`lWfawl>Y)uM` zJaT{hF7C_fydH$ReE@>xMe?0vyu9p%ng_F#3E_H!s%I?!)$Y8Vr4$Z7e&Fb-=NILk B>Z||& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT new file mode 100644 index 0000000000000000000000000000000000000000..bbf62cfc01b1c64d161b82efa4dd98b5e1ad569d GIT binary patch literal 214 zcmZ4UmVveW0s{jBBO@aNt7S||ObUnt#LPep0zh$IOAUJ~3yT`dXambwO^7f^5woR* p1xP6a<9{H4iG#JUS%MYA#6W5-4M;Q#&1f_(0|Qe?2+Vvm8UTAgAD93D literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV new file mode 100644 index 0000000000000000000000000000000000000000..4625d190d1bb35fe0cd636283f0a85b00bf1280d GIT binary patch literal 200 zcmZ4UmVveW5Ca1PBO@aNN3@}3Y)nc_3WyKH%s>nRKq+QRLqiA$Bn9Gu6fiLU2LhNl g4uv4?oQ5D{Yfud_G%!Fj1V5L7fhi;mVHpYw02!|w6951J literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW new file mode 100644 index 0000000000000000000000000000000000000000..17b8ee5a5ad3df9fb2f10089d5d394c661761691 GIT binary patch literal 354 zcmZWl+YQ1n3`}`1zy}*piAr`#(u5zDKtffTzfJ*WBUWPuIEOE&C0n-ceCOo(GRvDW zRc}zL%4~QT@Al9>Fwc;4B07#@tvE0M`5*yZ wmYCRitk!k$*As9l>7_fh^6tAljN(WFrtnMkPTygwH=;=Vjrgm}wE)xd0U~KQW&i*H literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ new file mode 100644 index 0000000000000000000000000000000000000000..1118137e0c313630b1a32d88b2153665bbbd21d8 GIT binary patch literal 302 zcmah^K?(vf3`|^#Cr^U-0l_^8%~F+k*-v<~?X9oS^+$fqH|V6RCl?G%NXSekc|6Ho ziFiXu%(RRWG^divwm+qE>+Wrj(F|w+2Uvi)5-=qC-BI(P(Q9r8Rka~tWE72vx0d*Y zuwo487h>Wr?4h2Lna8?%r1IS#4#E2my)K$`fN&0`Jpq#0*Rz>i)&Cje+4E(*@+ZFm D1>5IZgYqjX8Zh9YXZd(rcmm-pJ&#=!C0#MhqX%DueUEZ^#jw|T$!5GwM2+>8p zRtZ_sI4b=FBzXgEmcMPBXoV{s#h>I1YtG TX-6{+jmyBm6zYz!289Ixdn*}7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US new file mode 100644 index 0000000000000000000000000000000000000000..2c5228726391b2b79e765f8c14a24f4b1191c202 GIT binary patch literal 794 zcmZuvJ5HQI4E{IEhK7cMiVHAOko+3Ym?lkb5T#nS;}l?y!7aENJtd$21(Ya^#`Eyo zpZ)x@?CzIkd%i5oX0ut&_Iw?O+q(z((I3G(0d3#!9q#X-T2Q@UmUQNftDiTxRCCT& zGEmvzv4sv)U&UlnLQg03eKzfB_0`^U^bS)IZrQ=Zwiy{}O|pl~mP2UF)m#+j)NFMo z!_(NBYsm!Eg>sm|LW43YQk2X?!IF&OZ5}<9c6Y?>2rFSZy_^q;W@{)#NMrRJZjv(` zna7CcC9UKg#649Syo^@t9$d+`nE{_|yrWUb0gc@XL%j>X)50&9SJ6L+mGl=g`~d(o z#Ks}_KGBvOd%EuU22k0{u~mvz)n^{QXvQ(xMM%YIoEMlNz(X$FoLGm|=MKVPMBW{x1MwA?}~waPif8 E14P16#@ aKM=sg@u?=>AT)E)xC{(TVU7q3QCI-Qs~pw< literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC new file mode 100644 index 0000000000000000000000000000000000000000..cce977b1a94f2e64d3a53b5e28da5c1269b68461 GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4KnRKq)>$4SOp?qZ)HV%^FKXLx?y? j6|{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yP%oAof8Vvx7P8@Oo literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN new file mode 100644 index 0000000000000000000000000000000000000000..3246aa77cea80f484d798ea60b482fcd41abe68d GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoeUDH^I07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B+RehBMOSO81#94P<* literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU new file mode 100644 index 0000000000000000000000000000000000000000..3e5597175382cc9e663f5c6cfca978b714af92e8 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLqj772P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6c&oG289IxJB%2_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF new file mode 100644 index 0000000000000000000000000000000000000000..d2cf29bf73665f66f1945238d4c65622c6e853fe GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBO@aNvtdjMhzZ0@KnwyvQ8vS9Q*(=02p=TNWM~Rf!oc_+2w=iE Ul@e(Lnu%y!po7BQ5LThE00#*gUH||9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS new file mode 100644 index 0000000000000000000000000000000000000000..6eac506ea908accfad42247b601ecbdce3afce64 GIT binary patch literal 267 zcmZ4UmVvd3fq{{U0Z1@1GH^s2TE@nt#H4`uK+FupAOMu&x74t=GBm8Qj5g6Vvy9b* zNPv_vTN)aI6f-dX2LhNl5t=~8svClgjW#rjtucx=&^3##i8i*3HPEaiw5tgH{0OqkFTmS$7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE new file mode 100644 index 0000000000000000000000000000000000000000..86864619cac48504e40a61468567cf548bc47a57 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNt6@w^ObUnt#LPep0zh#NL(6DG6I07rhzLlY+0fDuq>6#@ aKM=sg@u?=>AT)E)xC{(Tk*){}QCI-nm>mrO literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT new file mode 100644 index 0000000000000000000000000000000000000000..23e960b5049f92a0a39e29010c5b59595a1c973c GIT binary patch literal 211 zcmZ4UmVveWECT}rBO@aNn_)~!Oo}~_#{|X9KpF&qlAMMb_Ev^QHKv*nA)p`wlc6ai cSo%K@z=ZLsCf*=4bJ4g!7ec|656>r0(>%>W!NGY0Q+R=_*%1YB z2Uak0kus8E_JRzIQU&it@wh62CX$@p|FT;Db)gl$Bm^&-)+lrcXxSEG?$UVdSyBtR zcBw6-?wquB%4Np21+?rlq@N;EeJ)6bj{YZ>F+sXeNKROlD>q77W+W*kBFM_8T6G%O jwuT`>Nf&{A&=%4yfl&_vx7VHg&h*}6uWv8P|8af*ZI?f{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM new file mode 100644 index 0000000000000000000000000000000000000000..84d736c22180e9b564c4473f434e38830f7b9ff8 GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNN3@}3Y)nc_3WyKH%s>nRKq+oRL!%l?%VA single country calling code could map to several different regions. It is considered that + * {@code countryCallingCode} belongs to a geo entity if all of these regions are geo entities + * + *

Note that this method will not throw an exception even when the underlying mapping for the + * {@code countryCallingCode} does not exist, instead it will return {@code false} + */ + public static boolean isGeoEntity(int countryCallingCode) { + List regionCodesForCountryCallingCode = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); + + return regionCodesForCountryCallingCode != null + && !regionCodesForCountryCallingCode.contains(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + private GeoEntityUtility() {} +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/MatcherApi.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/MatcherApi.java new file mode 100644 index 0000000000..d2c32b9eaf --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/MatcherApi.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; + +/** + * Internal phonenumber matching API used to isolate the underlying implementation of the + * matcher and allow different implementations to be swapped in easily. + */ +public interface MatcherApi { + /** + * Returns whether the given national number (a string containing only decimal digits) matches + * the national number pattern defined in the given {@code PhoneNumberDesc} message. + */ + boolean matchNationalNumber(CharSequence number, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java new file mode 100644 index 0000000000..ed18ed0948 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Implementation of the matcher API using the regular expressions in the PhoneNumberDesc + * proto message to match numbers. + */ +public final class RegexBasedMatcher implements MatcherApi { + public static MatcherApi create() { + return new RegexBasedMatcher(); + } + + private final RegexCache regexCache = new RegexCache(100); + + private RegexBasedMatcher() {} + + // @Override + public boolean matchNationalNumber(CharSequence number, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch) { + String nationalNumberPattern = numberDesc.getNationalNumberPattern(); + // We don't want to consider it a prefix match when matching non-empty input against an empty + // pattern. + if (nationalNumberPattern.length() == 0) { + return false; + } + return match(number, regexCache.getPatternForRegex(nationalNumberPattern), allowPrefixMatch); + } + + private static boolean match(CharSequence number, Pattern pattern, boolean allowPrefixMatch) { + Matcher matcher = pattern.matcher(number); + if (!matcher.lookingAt()) { + return false; + } else { + return (matcher.matches()) ? true : allowPrefixMatch; + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexCache.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexCache.java new file mode 100644 index 0000000000..f29005e23b --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/internal/RegexCache.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * LRU Cache for compiled regular expressions used by the libphonenumbers libary. + * + * @author Shaopeng Jia + */ +public class RegexCache { + private LRUCache cache; + + public RegexCache(int size) { + cache = new LRUCache(size); + } + + public Pattern getPatternForRegex(String regex) { + Pattern pattern = cache.get(regex); + if (pattern == null) { + pattern = Pattern.compile(regex); + cache.put(regex, pattern); + } + return pattern; + } + + // @VisibleForTesting + boolean containsRegex(String regex) { + return cache.containsKey(regex); + } + + private static class LRUCache { + // LinkedHashMap offers a straightforward implementation of LRU cache. + private LinkedHashMap map; + private int size; + + @SuppressWarnings("serial") + public LRUCache(int size) { + this.size = size; + // Using access-order instead of insertion-order. + map = new LinkedHashMap(size * 4 / 3 + 1, 0.75f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > LRUCache.this.size; + } + }; + } + + public synchronized V get(K key) { + return map.get(key); + } + + public synchronized void put(K key, V value) { + map.put(key, value); + } + + public synchronized boolean containsKey(K key) { + return map.containsKey(key); + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java new file mode 100644 index 0000000000..6bf4df9413 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.ClassPathResourceMetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MultiFileModeFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.PhoneMetadataFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSourceImpl; + +/** + * Provides metadata init and source dependencies when metadata is stored in multi-file mode and + * loaded as a classpath resource. + */ +public final class DefaultMetadataDependenciesProvider { + + private static final DefaultMetadataDependenciesProvider INSTANCE = new DefaultMetadataDependenciesProvider(); + + public static DefaultMetadataDependenciesProvider getInstance() { + return INSTANCE; + } + + private DefaultMetadataDependenciesProvider() { + } + + private final MetadataParser metadataParser = MetadataParser.newLenientParser(); + private final MetadataLoader metadataLoader = new ClassPathResourceMetadataLoader(); + + private final PhoneMetadataFileNameProvider phoneNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto"); + private final MetadataSource phoneNumberMetadataSource = + new MetadataSourceImpl( + phoneNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider shortNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto"); + private final RegionMetadataSource shortNumberMetadataSource = + new RegionMetadataSourceImpl( + shortNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider alternateFormatsMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"); + private final FormattingMetadataSource alternateFormatsMetadataSource = + new FormattingMetadataSourceImpl( + alternateFormatsMetadataFileNameProvider, + metadataLoader, + metadataParser); + + public MetadataParser getMetadataParser() { + return metadataParser; + } + + public MetadataLoader getMetadataLoader() { + return metadataLoader; + } + + public PhoneMetadataFileNameProvider getPhoneNumberMetadataFileNameProvider() { + return phoneNumberMetadataFileNameProvider; + } + + public MetadataSource getPhoneNumberMetadataSource() { + return phoneNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getShortNumberMetadataFileNameProvider() { + return shortNumberMetadataFileNameProvider; + } + + public RegionMetadataSource getShortNumberMetadataSource() { + return shortNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getAlternateFormatsMetadataFileNameProvider() { + return alternateFormatsMetadataFileNameProvider; + } + + public FormattingMetadataSource getAlternateFormatsMetadataSource() { + return alternateFormatsMetadataSource; + } + + public String getCarrierDataDirectory() { + return "/com/google/i18n/phonenumbers/carrier/data/"; + } + + public String getGeocodingDataDirectory() { + return "/com/google/i18n/phonenumbers/geocoding/data/"; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java new file mode 100644 index 0000000000..76122b8ad8 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.MetadataLoader; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A {@link MetadataLoader} implementation that reads phone number metadata files as classpath + * resources. + */ +public final class ClassPathResourceMetadataLoader implements MetadataLoader { + + private static final Logger logger = + Logger.getLogger(ClassPathResourceMetadataLoader.class.getName()); + + @Override + public InputStream loadMetadata(String metadataFileName) { + InputStream inputStream = + ClassPathResourceMetadataLoader.class.getResourceAsStream(metadataFileName); + if (inputStream == null) { + logger.log(Level.WARNING, String.format("File %s not found", metadataFileName)); + } + return inputStream; + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java new file mode 100644 index 0000000000..e923dfadf7 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Exposes single method for parsing {@link InputStream} content into {@link Collection} of {@link + * PhoneMetadata} + */ +public final class MetadataParser { + + private static final Logger logger = Logger.getLogger(MetadataParser.class.getName()); + + /** + * Creates new instance in lenient mode, see {@link MetadataParser#parse(InputStream)} for more + * info. + */ + public static MetadataParser newLenientParser() { + return new MetadataParser(false); + } + + /** + * Creates new instance in strict mode, see {@link MetadataParser#parse(InputStream)} for more + * info + */ + public static MetadataParser newStrictParser() { + return new MetadataParser(true); + } + + private final boolean strictMode; + + private MetadataParser(boolean strictMode) { + this.strictMode = strictMode; + } + + /** + * Parses given {@link InputStream} into a {@link Collection} of {@link PhoneMetadata}. + * + * @throws IllegalArgumentException if {@code source} is {@code null} and strict mode is on + * @return parsed {@link PhoneMetadata}, or empty {@link Collection} if {@code source} is {@code + * null} and lenient mode is on + */ + public Collection parse(InputStream source) { + if (source == null) { + return handleNullSource(); + } + ObjectInputStream ois = null; + try { + ois = new ObjectInputStream(source); + PhoneMetadataCollection phoneMetadataCollection = new PhoneMetadataCollection(); + phoneMetadataCollection.readExternal(ois); + List phoneMetadata = phoneMetadataCollection.getMetadataList(); + // Sanity check; this should not happen if provided InputStream is valid + if (phoneMetadata.isEmpty()) { + throw new IllegalStateException("Empty metadata"); + } + return phoneMetadataCollection.getMetadataList(); + } catch (IOException e) { + throw new IllegalStateException("Unable to parse metadata file", e); + } finally { + if (ois != null) { + // This will close all underlying streams as well, including source. + close(ois); + } else { + close(source); + } + } + } + + private List handleNullSource() { + if (strictMode) { + throw new IllegalArgumentException("Source cannot be null"); + } + return Collections.emptyList(); + } + + private void close(InputStream inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.log(Level.WARNING, "Error closing input stream (ignored)", e); + } + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java new file mode 100644 index 0000000000..d621e0cf5f --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import java.io.InputStream; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A blocking implementation of {@link MetadataBootstrappingGuard}. Can be used for both single-file + * (bulk) and multi-file metadata + * + * @param needs to extend {@link MetadataContainer} + */ +final class BlockingMetadataBootstrappingGuard + implements MetadataBootstrappingGuard { + + private final MetadataLoader metadataLoader; + private final MetadataParser metadataParser; + private final T metadataContainer; + private final Map loadedFiles; // identity map + + BlockingMetadataBootstrappingGuard( + MetadataLoader metadataLoader, MetadataParser metadataParser, T metadataContainer) { + this.metadataLoader = metadataLoader; + this.metadataParser = metadataParser; + this.metadataContainer = metadataContainer; + this.loadedFiles = new ConcurrentHashMap<>(); + } + + @Override + public T getOrBootstrap(String phoneMetadataFile) { + if (!loadedFiles.containsKey(phoneMetadataFile)) { + bootstrapMetadata(phoneMetadataFile); + } + return metadataContainer; + } + + private synchronized void bootstrapMetadata(String phoneMetadataFile) { + // Additional check is needed because multiple threads could pass the first check when calling + // getOrBootstrap() at the same time for unloaded metadata file + if (loadedFiles.containsKey(phoneMetadataFile)) { + return; + } + Collection phoneMetadata = read(phoneMetadataFile); + for (PhoneMetadata metadata : phoneMetadata) { + metadataContainer.accept(metadata); + } + loadedFiles.put(phoneMetadataFile, phoneMetadataFile); + } + + private Collection read(String phoneMetadataFile) { + try { + InputStream metadataStream = metadataLoader.loadMetadata(phoneMetadataFile); + return metadataParser.parse(metadataStream); + } catch (IllegalArgumentException | IllegalStateException e) { + throw new IllegalStateException("Failed to read file " + phoneMetadataFile, e); + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java new file mode 100644 index 0000000000..7275749578 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * Implementation of {@link MetadataContainer} which is a composition of different {@link + * MapBackedMetadataContainer}s. It adds items to a single simpler container at a time depending on + * the content of {@link PhoneMetadata}. + */ +final class CompositeMetadataContainer implements MetadataContainer { + + private final MapBackedMetadataContainer metadataByCountryCode = + MapBackedMetadataContainer.byCountryCallingCode(); + private final MapBackedMetadataContainer metadataByRegionCode = + MapBackedMetadataContainer.byRegionCode(); + + /** + * Intended to be called for geographical regions only. For non-geographical entities, use {@link + * CompositeMetadataContainer#getMetadataBy(int)} + */ + PhoneMetadata getMetadataBy(String regionCode) { + return metadataByRegionCode.getMetadataBy(regionCode); + } + + /** + * Intended to be called for non-geographical entities only, such as 800 (country code assigned to + * the Universal International Freephone Service). For geographical regions, use {@link + * CompositeMetadataContainer#getMetadataBy(String)} + */ + PhoneMetadata getMetadataBy(int countryCallingCode) { + return metadataByCountryCode.getMetadataBy(countryCallingCode); + } + + /** + * If the metadata belongs to a specific geographical region (it has a region code other than + * {@link GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}), it will be added to a {@link + * MapBackedMetadataContainer} which stores metadata by region code. Otherwise, it will be added + * to a {@link MapBackedMetadataContainer} which stores metadata by country calling code. This + * means that {@link CompositeMetadataContainer#getMetadataBy(int)} will not work for country + * calling codes such as 41 (country calling code for Switzerland), only for country calling codes + * such as 800 (country code assigned to the Universal International Freephone Service) + */ + @Override + public void accept(PhoneMetadata phoneMetadata) { + String regionCode = metadataByRegionCode.getKeyProvider().getKeyOf(phoneMetadata); + if (GeoEntityUtility.isGeoEntity(regionCode)) { + metadataByRegionCode.accept(phoneMetadata); + } else { + metadataByCountryCode.accept(phoneMetadata); + } + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java new file mode 100644 index 0000000000..f4f332cb21 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** A source of formatting phone metadata. */ +public interface FormattingMetadataSource { + + /** + * Returns formatting phone metadata for provided country calling code. + * + *

This method is similar to the one in {@link + * NonGeographicalEntityMetadataSource#getMetadataForNonGeographicalRegion(int)}, except that it + * will not fail for geographical regions, it can be used for both geo- and non-geo entities. + * + *

In case the provided {@code countryCallingCode} maps to several different regions, only one + * would contain formatting metadata. + * + * @return the phone metadata for provided {@code countryCallingCode}, or null if there is none. + */ + PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java new file mode 100644 index 0000000000..d6a819099f --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link FormattingMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class FormattingMetadataSourceImpl implements FormattingMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard> bootstrappingGuard; + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byCountryCallingCode())); + } + + @Override + public PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode) { + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java new file mode 100644 index 0000000000..639280d87c --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * A {@link MetadataContainer} implementation backed by a {@link ConcurrentHashMap} with generic + * keys. + */ +final class MapBackedMetadataContainer implements MetadataContainer { + + static MapBackedMetadataContainer byRegionCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider() { + @Override + public String getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getId(); + } + }); + } + + static MapBackedMetadataContainer byCountryCallingCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider() { + @Override + public Integer getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getCountryCode(); + } + }); + } + + private final ConcurrentMap metadataMap; + + private final KeyProvider keyProvider; + + private MapBackedMetadataContainer(KeyProvider keyProvider) { + this.metadataMap = new ConcurrentHashMap<>(); + this.keyProvider = keyProvider; + } + + PhoneMetadata getMetadataBy(T key) { + return key != null ? metadataMap.get(key) : null; + } + + KeyProvider getKeyProvider() { + return keyProvider; + } + + @Override + public void accept(PhoneMetadata phoneMetadata) { + metadataMap.put(keyProvider.getKeyOf(phoneMetadata), phoneMetadata); + } + + interface KeyProvider { + T getKeyOf(PhoneMetadata phoneMetadata); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java new file mode 100644 index 0000000000..9380c5954d --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Guard that ensures that metadata bootstrapping process (loading and parsing) is triggered only + * once per metadata file. + * + * @param needs to extend {@link MetadataContainer} + */ +public interface MetadataBootstrappingGuard { + + /** + * If metadata from the provided file has not yet been read, invokes loading and parsing from the + * provided file and adds the result to guarded {@link MetadataContainer}. + * + * @param phoneMetadataFile to read from + * @return guarded {@link MetadataContainer} + */ + T getOrBootstrap(String phoneMetadataFile); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java new file mode 100644 index 0000000000..3f6b21ed0e --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A container for {@link PhoneMetadata} + */ +interface MetadataContainer { + + /** + * Adds {@link PhoneMetadata} to the container. It depends on the implementation of the interface + * what this means, for example {@link MapBackedMetadataContainer} simply adds the provided + * metadata into the backing map. Implementing classes should ensure thread-safety. + */ + void accept(PhoneMetadata phoneMetadata); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java new file mode 100644 index 0000000000..d353ce9694 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** A source of phone metadata split by different regions. */ +public interface MetadataSource extends RegionMetadataSource, NonGeographicalEntityMetadataSource { +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java new file mode 100644 index 0000000000..c3d1c7360b --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link MetadataSource} guarded by {@link MetadataBootstrappingGuard}. + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class MetadataSourceImpl implements MetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard bootstrappingGuard; + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, new CompositeMetadataContainer())); + } + + @Override + public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (GeoEntityUtility.isGeoEntity(countryCallingCode)) { + throw new IllegalArgumentException( + countryCallingCode + " calling code belongs to a geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java new file mode 100644 index 0000000000..c8a3270a6d --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + + +/** + * {@link PhoneMetadataFileNameProvider} implementation which appends key as a suffix to the + * predefined metadata file name base. + */ +public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileNamePrefix; + + public MultiFileModeFileNameProvider(String phoneMetadataFileNameBase) { + this.phoneMetadataFileNamePrefix = phoneMetadataFileNameBase + "_"; + } + + @Override + public String getFor(Object key) { + String keyAsString = key.toString(); + if (!isAlphanumeric(keyAsString)) { + throw new IllegalArgumentException("Invalid key: " + keyAsString); + } + return phoneMetadataFileNamePrefix + key; + } + + private boolean isAlphanumeric(String key) { + if (key == null || key.length() == 0) { + return false; + } + // String#length doesn't actually return the number of + // code points in the String, it returns the number + // of char values. + int size = key.length(); + for (int charIdx = 0; charIdx < size; ) { + final int codePoint = key.codePointAt(charIdx); + if (!Character.isLetterOrDigit(codePoint)) { + return false; + } + charIdx += Character.charCount(codePoint); + } + return true; + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java new file mode 100644 index 0000000000..70db06df03 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A source of phone metadata for non-geographical entities. + * + *

Non-geographical entities are phone number ranges that have a country calling code, but either + * do not belong to an actual country (some international services), or belong to a region which has + * a different country calling code from the country it is part of. Examples of such ranges are + * those starting with: + * + *

+ */ +public interface NonGeographicalEntityMetadataSource { + + /** + * Gets phone metadata for a non-geographical entity. + * + * @param countryCallingCode the country calling code. + * @return the phone metadata for that entity, or null if there is none. + * @throws IllegalArgumentException if provided {@code countryCallingCode} does not belong to a + * non-geographical entity + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java new file mode 100644 index 0000000000..c3d16887fb --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Abstraction responsible for inferring the metadata file name. + * + *

Two implementations are available: + * + *

    + *
  • {@link SingleFileModeFileNameProvider} for single-file metadata. + *
  • {@link MultiFileModeFileNameProvider} for multi-file metadata. + *
+ */ +public interface PhoneMetadataFileNameProvider { + + /** + * Returns phone metadata file path for the given key. Assumes that key.toString() is + * well-defined. + */ + String getFor(Object key); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java new file mode 100644 index 0000000000..3cf15c206a --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * A source of phone metadata split by geographical regions. + */ +public interface RegionMetadataSource { + + /** + * Returns phone metadata for provided geographical region. + * + *

The {@code regionCode} must be different from {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}, which has a special meaning and is used to + * mark non-geographical regions (see {@link NonGeographicalEntityMetadataSource} for more + * information). + * + * @return the phone metadata for provided {@code regionCode}, or null if there is none. + * @throws IllegalArgumentException if provided {@code regionCode} is {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES} + */ + PhoneMetadata getMetadataForRegion(String regionCode); +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java new file mode 100644 index 0000000000..0078dd9454 --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link RegionMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class RegionMetadataSourceImpl implements RegionMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard> + bootstrappingGuard; + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byRegionCode())); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java new file mode 100644 index 0000000000..1d3d1eb81b --- /dev/null +++ b/tools/java/java-build/target/classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * {@link PhoneMetadataFileNameProvider} implementation that returns the same metadata file name for + * each key + */ +public final class SingleFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileName; + + public SingleFileModeFileNameProvider(String phoneMetadataFileName) { + this.phoneMetadataFileName = phoneMetadataFileName; + } + + @Override + public String getFor(Object key) { + return phoneMetadataFileName; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java new file mode 100644 index 0000000000..3975c2d3a0 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AlternateFormatsCountryCodeSet.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2012 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.HashSet; +import java.util.Set; + +public class AlternateFormatsCountryCodeSet { + // A set of all country codes for which data is available. + public static Set getCountryCodeSet() { + // The capacity is set to 61 as there are 46 different entries, + // and this offers a load factor of roughly 0.75. + Set countryCodeSet = new HashSet(61); + + countryCodeSet.add(7); + countryCodeSet.add(27); + countryCodeSet.add(30); + countryCodeSet.add(31); + countryCodeSet.add(34); + countryCodeSet.add(36); + countryCodeSet.add(39); + countryCodeSet.add(43); + countryCodeSet.add(44); + countryCodeSet.add(49); + countryCodeSet.add(52); + countryCodeSet.add(54); + countryCodeSet.add(55); + countryCodeSet.add(58); + countryCodeSet.add(61); + countryCodeSet.add(62); + countryCodeSet.add(64); + countryCodeSet.add(66); + countryCodeSet.add(81); + countryCodeSet.add(84); + countryCodeSet.add(90); + countryCodeSet.add(91); + countryCodeSet.add(94); + countryCodeSet.add(95); + countryCodeSet.add(255); + countryCodeSet.add(350); + countryCodeSet.add(351); + countryCodeSet.add(352); + countryCodeSet.add(358); + countryCodeSet.add(359); + countryCodeSet.add(372); + countryCodeSet.add(373); + countryCodeSet.add(380); + countryCodeSet.add(381); + countryCodeSet.add(385); + countryCodeSet.add(505); + countryCodeSet.add(506); + countryCodeSet.add(595); + countryCodeSet.add(675); + countryCodeSet.add(676); + countryCodeSet.add(679); + countryCodeSet.add(855); + countryCodeSet.add(856); + countryCodeSet.add(971); + countryCodeSet.add(972); + countryCodeSet.add(995); + + return countryCodeSet; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java new file mode 100644 index 0000000000..be11be57ea --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/AsYouTypeFormatter.java @@ -0,0 +1,668 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.RegexCache; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A formatter which formats phone numbers as they are entered. + * + *

An AsYouTypeFormatter can be created by invoking + * {@link PhoneNumberUtil#getAsYouTypeFormatter}. After that, digits can be added by invoking + * {@link #inputDigit} on the formatter instance, and the partially formatted phone number will be + * returned each time a digit is added. {@link #clear} can be invoked before formatting a new + * number. + * + *

See the unittests for more details on how the formatter is to be used. + * + * @author Shaopeng Jia + */ +public class AsYouTypeFormatter { + private String currentOutput = ""; + private StringBuilder formattingTemplate = new StringBuilder(); + // The pattern from numberFormat that is currently used to create formattingTemplate. + private String currentFormattingPattern = ""; + private StringBuilder accruedInput = new StringBuilder(); + private StringBuilder accruedInputWithoutFormatting = new StringBuilder(); + // This indicates whether AsYouTypeFormatter is currently doing the formatting. + private boolean ableToFormat = true; + // Set to true when users enter their own formatting. AsYouTypeFormatter will do no formatting at + // all when this is set to true. + private boolean inputHasFormatting = false; + // This is set to true when we know the user is entering a full national significant number, since + // we have either detected a national prefix or an international dialing prefix. When this is + // true, we will no longer use local number formatting patterns. + private boolean isCompleteNumber = false; + private boolean isExpectingCountryCallingCode = false; + private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + private String defaultCountry; + + // Character used when appropriate to separate a prefix, such as a long NDD or a country calling + // code, from the national number. + private static final char SEPARATOR_BEFORE_NATIONAL_NUMBER = ' '; + private static final PhoneMetadata EMPTY_METADATA = + PhoneMetadata.newBuilder().setId("").setInternationalPrefix("NA").build(); + private PhoneMetadata defaultMetadata; + private PhoneMetadata currentMetadata; + + // A pattern that is used to determine if a numberFormat under availableFormats is eligible to be + // used by the AYTF. It is eligible when the format element under numberFormat contains groups of + // the dollar sign followed by a single digit, separated by valid phone number punctuation. This + // prevents invalid punctuation (such as the star sign in Israeli star numbers) getting into the + // output of the AYTF. We require that the first group is present in the output pattern to ensure + // no data is lost while formatting; when we format as you type, this should always be the case. + private static final Pattern ELIGIBLE_FORMAT_PATTERN = + Pattern.compile("[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*" + + "\\$1" + "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*(\\$\\d" + + "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]*)*"); + // A set of characters that, if found in a national prefix formatting rules, are an indicator to + // us that we should separate the national prefix from the number when formatting. + private static final Pattern NATIONAL_PREFIX_SEPARATORS_PATTERN = Pattern.compile("[- ]"); + + // This is the minimum length of national number accrued that is required to trigger the + // formatter. The first element of the leadingDigitsPattern of each numberFormat contains a + // regular expression that matches up to this number of digits. + private static final int MIN_LEADING_DIGITS_LENGTH = 3; + + // The digits that have not been entered yet will be represented by a \u2008, the punctuation + // space. + private static final String DIGIT_PLACEHOLDER = "\u2008"; + private static final Pattern DIGIT_PATTERN = Pattern.compile(DIGIT_PLACEHOLDER); + private int lastMatchPosition = 0; + // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as + // found in the original sequence of characters the user entered. + private int originalPosition = 0; + // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as + // found in accruedInputWithoutFormatting. + private int positionToRemember = 0; + // This contains anything that has been entered so far preceding the national significant number, + // and it is formatted (e.g. with space inserted). For example, this can contain IDD, country + // code, and/or NDD, etc. + private StringBuilder prefixBeforeNationalNumber = new StringBuilder(); + private boolean shouldAddSpaceAfterNationalPrefix = false; + // This contains the national prefix that has been extracted. It contains only digits without + // formatting. + private String extractedNationalPrefix = ""; + private StringBuilder nationalNumber = new StringBuilder(); + private List possibleFormats = new ArrayList(); + + // A cache for frequently used country-specific regular expressions. + private RegexCache regexCache = new RegexCache(64); + + /** + * Constructs an as-you-type formatter. Should be obtained from {@link + * PhoneNumberUtil#getAsYouTypeFormatter}. + * + * @param regionCode the country/region where the phone number is being entered + */ + AsYouTypeFormatter(String regionCode) { + defaultCountry = regionCode; + currentMetadata = getMetadataForRegion(defaultCountry); + defaultMetadata = currentMetadata; + } + + // The metadata needed by this class is the same for all regions sharing the same country calling + // code. Therefore, we return the metadata for "main" region for this country calling code. + private PhoneMetadata getMetadataForRegion(String regionCode) { + int countryCallingCode = phoneUtil.getCountryCodeForRegion(regionCode); + String mainCountry = phoneUtil.getRegionCodeForCountryCode(countryCallingCode); + PhoneMetadata metadata = phoneUtil.getMetadataForRegion(mainCountry); + if (metadata != null) { + return metadata; + } + // Set to a default instance of the metadata. This allows us to function with an incorrect + // region code, even if formatting only works for numbers specified with "+". + return EMPTY_METADATA; + } + + // Returns true if a new template is created as opposed to reusing the existing template. + private boolean maybeCreateNewTemplate() { + // When there are multiple available formats, the formatter uses the first format where a + // formatting template could be created. + Iterator it = possibleFormats.iterator(); + while (it.hasNext()) { + NumberFormat numberFormat = it.next(); + String pattern = numberFormat.getPattern(); + if (currentFormattingPattern.equals(pattern)) { + return false; + } + if (createFormattingTemplate(numberFormat)) { + currentFormattingPattern = pattern; + shouldAddSpaceAfterNationalPrefix = + NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( + numberFormat.getNationalPrefixFormattingRule()).find(); + // With a new formatting template, the matched position using the old template needs to be + // reset. + lastMatchPosition = 0; + return true; + } else { // Remove the current number format from possibleFormats. + it.remove(); + } + } + ableToFormat = false; + return false; + } + + private void getAvailableFormats(String leadingDigits) { + // First decide whether we should use international or national number rules. + boolean isInternationalNumber = isCompleteNumber && extractedNationalPrefix.length() == 0; + List formatList = + (isInternationalNumber && currentMetadata.getIntlNumberFormatCount() > 0) + ? currentMetadata.getIntlNumberFormatList() + : currentMetadata.getNumberFormatList(); + for (NumberFormat format : formatList) { + // Discard a few formats that we know are not relevant based on the presence of the national + // prefix. + if (extractedNationalPrefix.length() > 0 + && PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + format.getNationalPrefixFormattingRule()) + && !format.getNationalPrefixOptionalWhenFormatting() + && !format.hasDomesticCarrierCodeFormattingRule()) { + // If it is a national number that had a national prefix, any rules that aren't valid with a + // national prefix should be excluded. A rule that has a carrier-code formatting rule is + // kept since the national prefix might actually be an extracted carrier code - we don't + // distinguish between these when extracting it in the AYTF. + continue; + } else if (extractedNationalPrefix.length() == 0 + && !isCompleteNumber + && !PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + format.getNationalPrefixFormattingRule()) + && !format.getNationalPrefixOptionalWhenFormatting()) { + // This number was entered without a national prefix, and this formatting rule requires one, + // so we discard it. + continue; + } + if (ELIGIBLE_FORMAT_PATTERN.matcher(format.getFormat()).matches()) { + possibleFormats.add(format); + } + } + narrowDownPossibleFormats(leadingDigits); + } + + private void narrowDownPossibleFormats(String leadingDigits) { + int indexOfLeadingDigitsPattern = leadingDigits.length() - MIN_LEADING_DIGITS_LENGTH; + Iterator it = possibleFormats.iterator(); + while (it.hasNext()) { + NumberFormat format = it.next(); + if (format.getLeadingDigitsPatternCount() == 0) { + // Keep everything that isn't restricted by leading digits. + continue; + } + int lastLeadingDigitsPattern = + Math.min(indexOfLeadingDigitsPattern, format.getLeadingDigitsPatternCount() - 1); + Pattern leadingDigitsPattern = regexCache.getPatternForRegex( + format.getLeadingDigitsPattern(lastLeadingDigitsPattern)); + Matcher m = leadingDigitsPattern.matcher(leadingDigits); + if (!m.lookingAt()) { + it.remove(); + } + } + } + + private boolean createFormattingTemplate(NumberFormat format) { + String numberPattern = format.getPattern(); + formattingTemplate.setLength(0); + String tempTemplate = getFormattingTemplate(numberPattern, format.getFormat()); + if (tempTemplate.length() > 0) { + formattingTemplate.append(tempTemplate); + return true; + } + return false; + } + + // Gets a formatting template which can be used to efficiently format a partial number where + // digits are added one by one. + private String getFormattingTemplate(String numberPattern, String numberFormat) { + // Creates a phone number consisting only of the digit 9 that matches the + // numberPattern by applying the pattern to the longestPhoneNumber string. + String longestPhoneNumber = "999999999999999"; + Matcher m = regexCache.getPatternForRegex(numberPattern).matcher(longestPhoneNumber); + m.find(); // this will always succeed + String aPhoneNumber = m.group(); + // No formatting template can be created if the number of digits entered so far is longer than + // the maximum the current formatting rule can accommodate. + if (aPhoneNumber.length() < nationalNumber.length()) { + return ""; + } + // Formats the number according to numberFormat + String template = aPhoneNumber.replaceAll(numberPattern, numberFormat); + // Replaces each digit with character DIGIT_PLACEHOLDER + template = template.replaceAll("9", DIGIT_PLACEHOLDER); + return template; + } + + /** + * Clears the internal state of the formatter, so it can be reused. + */ + public void clear() { + currentOutput = ""; + accruedInput.setLength(0); + accruedInputWithoutFormatting.setLength(0); + formattingTemplate.setLength(0); + lastMatchPosition = 0; + currentFormattingPattern = ""; + prefixBeforeNationalNumber.setLength(0); + extractedNationalPrefix = ""; + nationalNumber.setLength(0); + ableToFormat = true; + inputHasFormatting = false; + positionToRemember = 0; + originalPosition = 0; + isCompleteNumber = false; + isExpectingCountryCallingCode = false; + possibleFormats.clear(); + shouldAddSpaceAfterNationalPrefix = false; + if (!currentMetadata.equals(defaultMetadata)) { + currentMetadata = getMetadataForRegion(defaultCountry); + } + } + + /** + * Formats a phone number on-the-fly as each digit is entered. + * + * @param nextChar the most recently entered digit of a phone number. Formatting characters are + * allowed, but as soon as they are encountered this method formats the number as entered and + * not "as you type" anymore. Full width digits and Arabic-indic digits are allowed, and will + * be shown as they are. + * @return the partially formatted phone number. + */ + public String inputDigit(char nextChar) { + currentOutput = inputDigitWithOptionToRememberPosition(nextChar, false); + return currentOutput; + } + + /** + * Same as {@link #inputDigit}, but remembers the position where {@code nextChar} is inserted, so + * that it can be retrieved later by using {@link #getRememberedPosition}. The remembered + * position will be automatically adjusted if additional formatting characters are later + * inserted/removed in front of {@code nextChar}. + */ + public String inputDigitAndRememberPosition(char nextChar) { + currentOutput = inputDigitWithOptionToRememberPosition(nextChar, true); + return currentOutput; + } + + @SuppressWarnings("fallthrough") + private String inputDigitWithOptionToRememberPosition(char nextChar, boolean rememberPosition) { + accruedInput.append(nextChar); + if (rememberPosition) { + originalPosition = accruedInput.length(); + } + // We do formatting on-the-fly only when each character entered is either a digit, or a plus + // sign (accepted at the start of the number only). + if (!isDigitOrLeadingPlusSign(nextChar)) { + ableToFormat = false; + inputHasFormatting = true; + } else { + nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition); + } + if (!ableToFormat) { + // When we are unable to format because of reasons other than that formatting chars have been + // entered, it can be due to really long IDDs or NDDs. If that is the case, we might be able + // to do formatting again after extracting them. + if (inputHasFormatting) { + return accruedInput.toString(); + } else if (attemptToExtractIdd()) { + if (attemptToExtractCountryCallingCode()) { + return attemptToChoosePatternWithPrefixExtracted(); + } + } else if (ableToExtractLongerNdd()) { + // Add an additional space to separate long NDD and national significant number for + // readability. We don't set shouldAddSpaceAfterNationalPrefix to true, since we don't want + // this to change later when we choose formatting templates. + prefixBeforeNationalNumber.append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + return attemptToChoosePatternWithPrefixExtracted(); + } + return accruedInput.toString(); + } + + // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus + // sign is counted as a digit as well for this purpose) have been entered. + switch (accruedInputWithoutFormatting.length()) { + case 0: + case 1: + case 2: + return accruedInput.toString(); + case 3: + if (attemptToExtractIdd()) { + isExpectingCountryCallingCode = true; + } else { // No IDD or plus sign is found, might be entering in national format. + extractedNationalPrefix = removeNationalPrefixFromNationalNumber(); + return attemptToChooseFormattingPattern(); + } + // fall through + default: + if (isExpectingCountryCallingCode) { + if (attemptToExtractCountryCallingCode()) { + isExpectingCountryCallingCode = false; + } + return prefixBeforeNationalNumber + nationalNumber.toString(); + } + if (possibleFormats.size() > 0) { // The formatting patterns are already chosen. + String tempNationalNumber = inputDigitHelper(nextChar); + // See if the accrued digits can be formatted properly already. If not, use the results + // from inputDigitHelper, which does formatting based on the formatting pattern chosen. + String formattedNumber = attemptToFormatAccruedDigits(); + if (formattedNumber.length() > 0) { + return formattedNumber; + } + narrowDownPossibleFormats(nationalNumber.toString()); + if (maybeCreateNewTemplate()) { + return inputAccruedNationalNumber(); + } + return ableToFormat + ? appendNationalNumber(tempNationalNumber) + : accruedInput.toString(); + } else { + return attemptToChooseFormattingPattern(); + } + } + } + + private String attemptToChoosePatternWithPrefixExtracted() { + ableToFormat = true; + isExpectingCountryCallingCode = false; + possibleFormats.clear(); + lastMatchPosition = 0; + formattingTemplate.setLength(0); + currentFormattingPattern = ""; + return attemptToChooseFormattingPattern(); + } + + // @VisibleForTesting + String getExtractedNationalPrefix() { + return extractedNationalPrefix; + } + + // Some national prefixes are a substring of others. If extracting the shorter NDD doesn't result + // in a number we can format, we try to see if we can extract a longer version here. + private boolean ableToExtractLongerNdd() { + if (extractedNationalPrefix.length() > 0) { + // Put the extracted NDD back to the national number before attempting to extract a new NDD. + nationalNumber.insert(0, extractedNationalPrefix); + // Remove the previously extracted NDD from prefixBeforeNationalNumber. We cannot simply set + // it to empty string because people sometimes incorrectly enter national prefix after the + // country code, e.g. +44 (0)20-1234-5678. + int indexOfPreviousNdd = prefixBeforeNationalNumber.lastIndexOf(extractedNationalPrefix); + prefixBeforeNationalNumber.setLength(indexOfPreviousNdd); + } + return !extractedNationalPrefix.equals(removeNationalPrefixFromNationalNumber()); + } + + private boolean isDigitOrLeadingPlusSign(char nextChar) { + return Character.isDigit(nextChar) + || (accruedInput.length() == 1 + && PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(Character.toString(nextChar)).matches()); + } + + /** + * Checks to see if there is an exact pattern match for these digits. If so, we should use this + * instead of any other formatting template whose leadingDigitsPattern also matches the input. + */ + String attemptToFormatAccruedDigits() { + for (NumberFormat numberFormat : possibleFormats) { + Matcher m = regexCache.getPatternForRegex(numberFormat.getPattern()).matcher(nationalNumber); + if (m.matches()) { + shouldAddSpaceAfterNationalPrefix = + NATIONAL_PREFIX_SEPARATORS_PATTERN.matcher( + numberFormat.getNationalPrefixFormattingRule()).find(); + String formattedNumber = m.replaceAll(numberFormat.getFormat()); + // Check that we did not remove nor add any extra digits when we matched + // this formatting pattern. This usually happens after we entered the last + // digit during AYTF. Eg: In case of MX, we swallow mobile token (1) when + // formatted but AYTF should retain all the number entered and not change + // in order to match a format (of same leading digits and length) display + // in that way. + String fullOutput = appendNationalNumber(formattedNumber); + String formattedNumberDigitsOnly = PhoneNumberUtil.normalizeDiallableCharsOnly(fullOutput); + if (formattedNumberDigitsOnly.contentEquals(accruedInputWithoutFormatting)) { + // If it's the same (i.e entered number and format is same), then it's + // safe to return this in formatted number as nothing is lost / added. + return fullOutput; + } + } + } + return ""; + } + + /** + * Returns the current position in the partially formatted phone number of the character which was + * previously passed in as the parameter of {@link #inputDigitAndRememberPosition}. + */ + public int getRememberedPosition() { + if (!ableToFormat) { + return originalPosition; + } + int accruedInputIndex = 0; + int currentOutputIndex = 0; + while (accruedInputIndex < positionToRemember && currentOutputIndex < currentOutput.length()) { + if (accruedInputWithoutFormatting.charAt(accruedInputIndex) + == currentOutput.charAt(currentOutputIndex)) { + accruedInputIndex++; + } + currentOutputIndex++; + } + return currentOutputIndex; + } + + /** + * Combines the national number with any prefix (IDD/+ and country code or national prefix) that + * was collected. A space will be inserted between them if the current formatting template + * indicates this to be suitable. + */ + private String appendNationalNumber(String nationalNumber) { + int prefixBeforeNationalNumberLength = prefixBeforeNationalNumber.length(); + if (shouldAddSpaceAfterNationalPrefix && prefixBeforeNationalNumberLength > 0 + && prefixBeforeNationalNumber.charAt(prefixBeforeNationalNumberLength - 1) + != SEPARATOR_BEFORE_NATIONAL_NUMBER) { + // We want to add a space after the national prefix if the national prefix formatting rule + // indicates that this would normally be done, with the exception of the case where we already + // appended a space because the NDD was surprisingly long. + return new String(prefixBeforeNationalNumber) + SEPARATOR_BEFORE_NATIONAL_NUMBER + + nationalNumber; + } else { + return prefixBeforeNationalNumber + nationalNumber; + } + } + + /** + * Attempts to set the formatting template and returns a string which contains the formatted + * version of the digits entered so far. + */ + private String attemptToChooseFormattingPattern() { + // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits of national + // number (excluding national prefix) have been entered. + if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) { + + getAvailableFormats(nationalNumber.toString()); + // See if the accrued digits can be formatted properly already. + String formattedNumber = attemptToFormatAccruedDigits(); + if (formattedNumber.length() > 0) { + return formattedNumber; + } + return maybeCreateNewTemplate() ? inputAccruedNationalNumber() : accruedInput.toString(); + } else { + return appendNationalNumber(nationalNumber.toString()); + } + } + + /** + * Invokes inputDigitHelper on each digit of the national number accrued, and returns a formatted + * string in the end. + */ + private String inputAccruedNationalNumber() { + int lengthOfNationalNumber = nationalNumber.length(); + if (lengthOfNationalNumber > 0) { + String tempNationalNumber = ""; + for (int i = 0; i < lengthOfNationalNumber; i++) { + tempNationalNumber = inputDigitHelper(nationalNumber.charAt(i)); + } + return ableToFormat ? appendNationalNumber(tempNationalNumber) : accruedInput.toString(); + } else { + return prefixBeforeNationalNumber.toString(); + } + } + + /** + * Returns true if the current country is a NANPA country and the national number begins with + * the national prefix. + */ + private boolean isNanpaNumberWithNationalPrefix() { + // For NANPA numbers beginning with 1[2-9], treat the 1 as the national prefix. The reason is + // that national significant numbers in NANPA always start with [2-9] after the national prefix. + // Numbers beginning with 1[01] can only be short/emergency numbers, which don't need the + // national prefix. + return (currentMetadata.getCountryCode() == 1) && (nationalNumber.charAt(0) == '1') + && (nationalNumber.charAt(1) != '0') && (nationalNumber.charAt(1) != '1'); + } + + // Returns the national prefix extracted, or an empty string if it is not present. + private String removeNationalPrefixFromNationalNumber() { + int startOfNationalNumber = 0; + if (isNanpaNumberWithNationalPrefix()) { + startOfNationalNumber = 1; + prefixBeforeNationalNumber.append('1').append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + isCompleteNumber = true; + } else if (currentMetadata.hasNationalPrefixForParsing()) { + Pattern nationalPrefixForParsing = + regexCache.getPatternForRegex(currentMetadata.getNationalPrefixForParsing()); + Matcher m = nationalPrefixForParsing.matcher(nationalNumber); + // Since some national prefix patterns are entirely optional, check that a national prefix + // could actually be extracted. + if (m.lookingAt() && m.end() > 0) { + // When the national prefix is detected, we use international formatting rules instead of + // national ones, because national formatting rules could contain local formatting rules + // for numbers entered without area code. + isCompleteNumber = true; + startOfNationalNumber = m.end(); + prefixBeforeNationalNumber.append(nationalNumber.substring(0, startOfNationalNumber)); + } + } + String nationalPrefix = nationalNumber.substring(0, startOfNationalNumber); + nationalNumber.delete(0, startOfNationalNumber); + return nationalPrefix; + } + + /** + * Extracts IDD and plus sign to prefixBeforeNationalNumber when they are available, and places + * the remaining input into nationalNumber. + * + * @return true when accruedInputWithoutFormatting begins with the plus sign or valid IDD for + * defaultCountry. + */ + private boolean attemptToExtractIdd() { + Pattern internationalPrefix = + regexCache.getPatternForRegex("\\" + PhoneNumberUtil.PLUS_SIGN + "|" + + currentMetadata.getInternationalPrefix()); + Matcher iddMatcher = internationalPrefix.matcher(accruedInputWithoutFormatting); + if (iddMatcher.lookingAt()) { + isCompleteNumber = true; + int startOfCountryCallingCode = iddMatcher.end(); + nationalNumber.setLength(0); + nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCallingCode)); + prefixBeforeNationalNumber.setLength(0); + prefixBeforeNationalNumber.append( + accruedInputWithoutFormatting.substring(0, startOfCountryCallingCode)); + if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) { + prefixBeforeNationalNumber.append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + } + return true; + } + return false; + } + + /** + * Extracts the country calling code from the beginning of nationalNumber to + * prefixBeforeNationalNumber when they are available, and places the remaining input into + * nationalNumber. + * + * @return true when a valid country calling code can be found. + */ + private boolean attemptToExtractCountryCallingCode() { + if (nationalNumber.length() == 0) { + return false; + } + StringBuilder numberWithoutCountryCallingCode = new StringBuilder(); + int countryCode = phoneUtil.extractCountryCode(nationalNumber, numberWithoutCountryCallingCode); + if (countryCode == 0) { + return false; + } + nationalNumber.setLength(0); + nationalNumber.append(numberWithoutCountryCallingCode); + String newRegionCode = phoneUtil.getRegionCodeForCountryCode(countryCode); + if (PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY.equals(newRegionCode)) { + currentMetadata = phoneUtil.getMetadataForNonGeographicalRegion(countryCode); + } else if (!newRegionCode.equals(defaultCountry)) { + currentMetadata = getMetadataForRegion(newRegionCode); + } + String countryCodeString = Integer.toString(countryCode); + prefixBeforeNationalNumber.append(countryCodeString).append(SEPARATOR_BEFORE_NATIONAL_NUMBER); + // When we have successfully extracted the IDD, the previously extracted NDD should be cleared + // because it is no longer valid. + extractedNationalPrefix = ""; + return true; + } + + // Accrues digits and the plus sign to accruedInputWithoutFormatting for later use. If nextChar + // contains a digit in non-ASCII format (e.g. the full-width version of digits), it is first + // normalized to the ASCII version. The return value is nextChar itself, or its normalized + // version, if nextChar is a digit in non-ASCII format. This method assumes its input is either a + // digit or the plus sign. + private char normalizeAndAccrueDigitsAndPlusSign(char nextChar, boolean rememberPosition) { + char normalizedChar; + if (nextChar == PhoneNumberUtil.PLUS_SIGN) { + normalizedChar = nextChar; + accruedInputWithoutFormatting.append(nextChar); + } else { + int radix = 10; + normalizedChar = Character.forDigit(Character.digit(nextChar, radix), radix); + accruedInputWithoutFormatting.append(normalizedChar); + nationalNumber.append(normalizedChar); + } + if (rememberPosition) { + positionToRemember = accruedInputWithoutFormatting.length(); + } + return normalizedChar; + } + + private String inputDigitHelper(char nextChar) { + // Note that formattingTemplate is not guaranteed to have a value, it could be empty, e.g. + // when the next digit is entered after extracting an IDD or NDD. + Matcher digitMatcher = DIGIT_PATTERN.matcher(formattingTemplate); + if (digitMatcher.find(lastMatchPosition)) { + String tempTemplate = digitMatcher.replaceFirst(Character.toString(nextChar)); + formattingTemplate.replace(0, tempTemplate.length(), tempTemplate); + lastMatchPosition = digitMatcher.start(); + return formattingTemplate.substring(0, lastMatchPosition + 1); + } else { + if (possibleFormats.size() == 1) { + // More digits are entered than we could handle, and there are no other valid patterns to + // try. + ableToFormat = false; + } // else, we just reset the formatting pattern. + currentFormattingPattern = ""; + return accruedInput.toString(); + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java new file mode 100644 index 0000000000..06571d15f0 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java @@ -0,0 +1,942 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CountryCodeToRegionCodeMap { + // A mapping from a country code to the region codes which denote the + // country/region represented by that country code. In the case of multiple + // countries sharing a calling code, such as the NANPA countries, the one + // indicated with "isMainCountryForCode" in the metadata should be first. + public static Map> getCountryCodeToRegionCodeMap() { + // The capacity is set to 286 as there are 215 different entries, + // and this offers a load factor of roughly 0.75. + Map> countryCodeToRegionCodeMap = + new HashMap>(286); + + ArrayList listWithRegionCode; + + listWithRegionCode = new ArrayList(25); + listWithRegionCode.add("US"); + listWithRegionCode.add("AG"); + listWithRegionCode.add("AI"); + listWithRegionCode.add("AS"); + listWithRegionCode.add("BB"); + listWithRegionCode.add("BM"); + listWithRegionCode.add("BS"); + listWithRegionCode.add("CA"); + listWithRegionCode.add("DM"); + listWithRegionCode.add("DO"); + listWithRegionCode.add("GD"); + listWithRegionCode.add("GU"); + listWithRegionCode.add("JM"); + listWithRegionCode.add("KN"); + listWithRegionCode.add("KY"); + listWithRegionCode.add("LC"); + listWithRegionCode.add("MP"); + listWithRegionCode.add("MS"); + listWithRegionCode.add("PR"); + listWithRegionCode.add("SX"); + listWithRegionCode.add("TC"); + listWithRegionCode.add("TT"); + listWithRegionCode.add("VC"); + listWithRegionCode.add("VG"); + listWithRegionCode.add("VI"); + countryCodeToRegionCodeMap.put(1, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("RU"); + listWithRegionCode.add("KZ"); + countryCodeToRegionCodeMap.put(7, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EG"); + countryCodeToRegionCodeMap.put(20, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZA"); + countryCodeToRegionCodeMap.put(27, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GR"); + countryCodeToRegionCodeMap.put(30, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NL"); + countryCodeToRegionCodeMap.put(31, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BE"); + countryCodeToRegionCodeMap.put(32, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FR"); + countryCodeToRegionCodeMap.put(33, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ES"); + countryCodeToRegionCodeMap.put(34, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HU"); + countryCodeToRegionCodeMap.put(36, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("IT"); + listWithRegionCode.add("VA"); + countryCodeToRegionCodeMap.put(39, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RO"); + countryCodeToRegionCodeMap.put(40, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CH"); + countryCodeToRegionCodeMap.put(41, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AT"); + countryCodeToRegionCodeMap.put(43, listWithRegionCode); + + listWithRegionCode = new ArrayList(4); + listWithRegionCode.add("GB"); + listWithRegionCode.add("GG"); + listWithRegionCode.add("IM"); + listWithRegionCode.add("JE"); + countryCodeToRegionCodeMap.put(44, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DK"); + countryCodeToRegionCodeMap.put(45, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SE"); + countryCodeToRegionCodeMap.put(46, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("NO"); + listWithRegionCode.add("SJ"); + countryCodeToRegionCodeMap.put(47, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PL"); + countryCodeToRegionCodeMap.put(48, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DE"); + countryCodeToRegionCodeMap.put(49, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PE"); + countryCodeToRegionCodeMap.put(51, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MX"); + countryCodeToRegionCodeMap.put(52, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CU"); + countryCodeToRegionCodeMap.put(53, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AR"); + countryCodeToRegionCodeMap.put(54, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BR"); + countryCodeToRegionCodeMap.put(55, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CL"); + countryCodeToRegionCodeMap.put(56, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CO"); + countryCodeToRegionCodeMap.put(57, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VE"); + countryCodeToRegionCodeMap.put(58, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MY"); + countryCodeToRegionCodeMap.put(60, listWithRegionCode); + + listWithRegionCode = new ArrayList(3); + listWithRegionCode.add("AU"); + listWithRegionCode.add("CC"); + listWithRegionCode.add("CX"); + countryCodeToRegionCodeMap.put(61, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ID"); + countryCodeToRegionCodeMap.put(62, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PH"); + countryCodeToRegionCodeMap.put(63, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NZ"); + countryCodeToRegionCodeMap.put(64, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SG"); + countryCodeToRegionCodeMap.put(65, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TH"); + countryCodeToRegionCodeMap.put(66, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("JP"); + countryCodeToRegionCodeMap.put(81, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KR"); + countryCodeToRegionCodeMap.put(82, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VN"); + countryCodeToRegionCodeMap.put(84, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CN"); + countryCodeToRegionCodeMap.put(86, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TR"); + countryCodeToRegionCodeMap.put(90, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IN"); + countryCodeToRegionCodeMap.put(91, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PK"); + countryCodeToRegionCodeMap.put(92, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AF"); + countryCodeToRegionCodeMap.put(93, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LK"); + countryCodeToRegionCodeMap.put(94, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MM"); + countryCodeToRegionCodeMap.put(95, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IR"); + countryCodeToRegionCodeMap.put(98, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SS"); + countryCodeToRegionCodeMap.put(211, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("MA"); + listWithRegionCode.add("EH"); + countryCodeToRegionCodeMap.put(212, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DZ"); + countryCodeToRegionCodeMap.put(213, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TN"); + countryCodeToRegionCodeMap.put(216, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LY"); + countryCodeToRegionCodeMap.put(218, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GM"); + countryCodeToRegionCodeMap.put(220, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SN"); + countryCodeToRegionCodeMap.put(221, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MR"); + countryCodeToRegionCodeMap.put(222, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ML"); + countryCodeToRegionCodeMap.put(223, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GN"); + countryCodeToRegionCodeMap.put(224, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CI"); + countryCodeToRegionCodeMap.put(225, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BF"); + countryCodeToRegionCodeMap.put(226, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NE"); + countryCodeToRegionCodeMap.put(227, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TG"); + countryCodeToRegionCodeMap.put(228, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BJ"); + countryCodeToRegionCodeMap.put(229, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MU"); + countryCodeToRegionCodeMap.put(230, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LR"); + countryCodeToRegionCodeMap.put(231, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SL"); + countryCodeToRegionCodeMap.put(232, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GH"); + countryCodeToRegionCodeMap.put(233, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NG"); + countryCodeToRegionCodeMap.put(234, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TD"); + countryCodeToRegionCodeMap.put(235, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CF"); + countryCodeToRegionCodeMap.put(236, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CM"); + countryCodeToRegionCodeMap.put(237, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CV"); + countryCodeToRegionCodeMap.put(238, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ST"); + countryCodeToRegionCodeMap.put(239, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GQ"); + countryCodeToRegionCodeMap.put(240, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GA"); + countryCodeToRegionCodeMap.put(241, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CG"); + countryCodeToRegionCodeMap.put(242, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CD"); + countryCodeToRegionCodeMap.put(243, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AO"); + countryCodeToRegionCodeMap.put(244, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GW"); + countryCodeToRegionCodeMap.put(245, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IO"); + countryCodeToRegionCodeMap.put(246, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AC"); + countryCodeToRegionCodeMap.put(247, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SC"); + countryCodeToRegionCodeMap.put(248, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SD"); + countryCodeToRegionCodeMap.put(249, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RW"); + countryCodeToRegionCodeMap.put(250, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ET"); + countryCodeToRegionCodeMap.put(251, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SO"); + countryCodeToRegionCodeMap.put(252, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("DJ"); + countryCodeToRegionCodeMap.put(253, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KE"); + countryCodeToRegionCodeMap.put(254, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TZ"); + countryCodeToRegionCodeMap.put(255, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UG"); + countryCodeToRegionCodeMap.put(256, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BI"); + countryCodeToRegionCodeMap.put(257, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MZ"); + countryCodeToRegionCodeMap.put(258, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZM"); + countryCodeToRegionCodeMap.put(260, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MG"); + countryCodeToRegionCodeMap.put(261, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("RE"); + listWithRegionCode.add("YT"); + countryCodeToRegionCodeMap.put(262, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ZW"); + countryCodeToRegionCodeMap.put(263, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NA"); + countryCodeToRegionCodeMap.put(264, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MW"); + countryCodeToRegionCodeMap.put(265, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LS"); + countryCodeToRegionCodeMap.put(266, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BW"); + countryCodeToRegionCodeMap.put(267, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SZ"); + countryCodeToRegionCodeMap.put(268, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KM"); + countryCodeToRegionCodeMap.put(269, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("SH"); + listWithRegionCode.add("TA"); + countryCodeToRegionCodeMap.put(290, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ER"); + countryCodeToRegionCodeMap.put(291, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AW"); + countryCodeToRegionCodeMap.put(297, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FO"); + countryCodeToRegionCodeMap.put(298, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GL"); + countryCodeToRegionCodeMap.put(299, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GI"); + countryCodeToRegionCodeMap.put(350, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PT"); + countryCodeToRegionCodeMap.put(351, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LU"); + countryCodeToRegionCodeMap.put(352, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IE"); + countryCodeToRegionCodeMap.put(353, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IS"); + countryCodeToRegionCodeMap.put(354, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AL"); + countryCodeToRegionCodeMap.put(355, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MT"); + countryCodeToRegionCodeMap.put(356, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CY"); + countryCodeToRegionCodeMap.put(357, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("FI"); + listWithRegionCode.add("AX"); + countryCodeToRegionCodeMap.put(358, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BG"); + countryCodeToRegionCodeMap.put(359, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LT"); + countryCodeToRegionCodeMap.put(370, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LV"); + countryCodeToRegionCodeMap.put(371, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EE"); + countryCodeToRegionCodeMap.put(372, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MD"); + countryCodeToRegionCodeMap.put(373, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AM"); + countryCodeToRegionCodeMap.put(374, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BY"); + countryCodeToRegionCodeMap.put(375, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AD"); + countryCodeToRegionCodeMap.put(376, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MC"); + countryCodeToRegionCodeMap.put(377, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SM"); + countryCodeToRegionCodeMap.put(378, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UA"); + countryCodeToRegionCodeMap.put(380, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("RS"); + countryCodeToRegionCodeMap.put(381, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("ME"); + countryCodeToRegionCodeMap.put(382, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("XK"); + countryCodeToRegionCodeMap.put(383, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HR"); + countryCodeToRegionCodeMap.put(385, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SI"); + countryCodeToRegionCodeMap.put(386, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BA"); + countryCodeToRegionCodeMap.put(387, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MK"); + countryCodeToRegionCodeMap.put(389, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CZ"); + countryCodeToRegionCodeMap.put(420, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SK"); + countryCodeToRegionCodeMap.put(421, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LI"); + countryCodeToRegionCodeMap.put(423, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FK"); + countryCodeToRegionCodeMap.put(500, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BZ"); + countryCodeToRegionCodeMap.put(501, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GT"); + countryCodeToRegionCodeMap.put(502, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SV"); + countryCodeToRegionCodeMap.put(503, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HN"); + countryCodeToRegionCodeMap.put(504, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NI"); + countryCodeToRegionCodeMap.put(505, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CR"); + countryCodeToRegionCodeMap.put(506, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PA"); + countryCodeToRegionCodeMap.put(507, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PM"); + countryCodeToRegionCodeMap.put(508, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HT"); + countryCodeToRegionCodeMap.put(509, listWithRegionCode); + + listWithRegionCode = new ArrayList(3); + listWithRegionCode.add("GP"); + listWithRegionCode.add("BL"); + listWithRegionCode.add("MF"); + countryCodeToRegionCodeMap.put(590, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BO"); + countryCodeToRegionCodeMap.put(591, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GY"); + countryCodeToRegionCodeMap.put(592, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("EC"); + countryCodeToRegionCodeMap.put(593, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GF"); + countryCodeToRegionCodeMap.put(594, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PY"); + countryCodeToRegionCodeMap.put(595, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MQ"); + countryCodeToRegionCodeMap.put(596, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SR"); + countryCodeToRegionCodeMap.put(597, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UY"); + countryCodeToRegionCodeMap.put(598, listWithRegionCode); + + listWithRegionCode = new ArrayList(2); + listWithRegionCode.add("CW"); + listWithRegionCode.add("BQ"); + countryCodeToRegionCodeMap.put(599, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TL"); + countryCodeToRegionCodeMap.put(670, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NF"); + countryCodeToRegionCodeMap.put(672, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BN"); + countryCodeToRegionCodeMap.put(673, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NR"); + countryCodeToRegionCodeMap.put(674, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PG"); + countryCodeToRegionCodeMap.put(675, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TO"); + countryCodeToRegionCodeMap.put(676, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SB"); + countryCodeToRegionCodeMap.put(677, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("VU"); + countryCodeToRegionCodeMap.put(678, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FJ"); + countryCodeToRegionCodeMap.put(679, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PW"); + countryCodeToRegionCodeMap.put(680, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("WF"); + countryCodeToRegionCodeMap.put(681, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("CK"); + countryCodeToRegionCodeMap.put(682, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NU"); + countryCodeToRegionCodeMap.put(683, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("WS"); + countryCodeToRegionCodeMap.put(685, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KI"); + countryCodeToRegionCodeMap.put(686, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NC"); + countryCodeToRegionCodeMap.put(687, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TV"); + countryCodeToRegionCodeMap.put(688, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PF"); + countryCodeToRegionCodeMap.put(689, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TK"); + countryCodeToRegionCodeMap.put(690, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("FM"); + countryCodeToRegionCodeMap.put(691, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MH"); + countryCodeToRegionCodeMap.put(692, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(800, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(808, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KP"); + countryCodeToRegionCodeMap.put(850, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("HK"); + countryCodeToRegionCodeMap.put(852, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MO"); + countryCodeToRegionCodeMap.put(853, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KH"); + countryCodeToRegionCodeMap.put(855, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LA"); + countryCodeToRegionCodeMap.put(856, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(870, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(878, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BD"); + countryCodeToRegionCodeMap.put(880, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(881, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(882, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(883, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TW"); + countryCodeToRegionCodeMap.put(886, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(888, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MV"); + countryCodeToRegionCodeMap.put(960, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("LB"); + countryCodeToRegionCodeMap.put(961, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("JO"); + countryCodeToRegionCodeMap.put(962, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SY"); + countryCodeToRegionCodeMap.put(963, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IQ"); + countryCodeToRegionCodeMap.put(964, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KW"); + countryCodeToRegionCodeMap.put(965, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("SA"); + countryCodeToRegionCodeMap.put(966, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("YE"); + countryCodeToRegionCodeMap.put(967, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("OM"); + countryCodeToRegionCodeMap.put(968, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("PS"); + countryCodeToRegionCodeMap.put(970, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AE"); + countryCodeToRegionCodeMap.put(971, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("IL"); + countryCodeToRegionCodeMap.put(972, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BH"); + countryCodeToRegionCodeMap.put(973, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("QA"); + countryCodeToRegionCodeMap.put(974, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("BT"); + countryCodeToRegionCodeMap.put(975, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("MN"); + countryCodeToRegionCodeMap.put(976, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("NP"); + countryCodeToRegionCodeMap.put(977, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(979, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TJ"); + countryCodeToRegionCodeMap.put(992, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("TM"); + countryCodeToRegionCodeMap.put(993, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("AZ"); + countryCodeToRegionCodeMap.put(994, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("GE"); + countryCodeToRegionCodeMap.put(995, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("KG"); + countryCodeToRegionCodeMap.put(996, listWithRegionCode); + + listWithRegionCode = new ArrayList(1); + listWithRegionCode.add("UZ"); + countryCodeToRegionCodeMap.put(998, listWithRegionCode); + + return countryCodeToRegionCodeMap; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MetadataLoader.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MetadataLoader.java new file mode 100644 index 0000000000..44fa0dc445 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MetadataLoader.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import java.io.InputStream; + +/** + * Interface for clients to specify a customized phone metadata loader, useful for Android apps to + * load Android resources since the library loads Java resources by default, e.g. with + * + * AssetManager. Note that implementation owners have the responsibility to ensure this is + * thread-safe. + */ +public interface MetadataLoader { + /** + * Returns an input stream corresponding to the metadata to load. This method may be called + * concurrently so implementations must be thread-safe. + * + * @param metadataFileName file name (including path) of metadata to load. File path is an + * absolute class path like /com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto + * @return the input stream for the metadata file. The library will close this stream + * after it is done. Return null in case the metadata file could not be found + */ + public InputStream loadMetadata(String metadataFileName); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MissingMetadataException.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MissingMetadataException.java new file mode 100644 index 0000000000..c2a8544ca3 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/MissingMetadataException.java @@ -0,0 +1,9 @@ +package com.google.i18n.phonenumbers; + +/** Exception class for cases when expected metadata cannot be found. */ +public final class MissingMetadataException extends IllegalStateException { + + public MissingMetadataException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/NumberParseException.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/NumberParseException.java new file mode 100644 index 0000000000..ef3dfa11b8 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/NumberParseException.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +/** + * Generic exception class for errors encountered when parsing phone numbers. + */ +@SuppressWarnings("serial") +public class NumberParseException extends Exception { + + /** + * The reason that a string could not be interpreted as a phone number. + */ + public enum ErrorType { + /** + * The country code supplied did not belong to a supported country or non-geographical entity. + */ + INVALID_COUNTRY_CODE, + /** + * This indicates the string passed is not a valid number. Either the string had less than 3 + * digits in it or had an invalid phone-context parameter. More specifically, the number failed + * to match the regular expression VALID_PHONE_NUMBER, RFC3966_GLOBAL_NUMBER_DIGITS, or + * RFC3966_DOMAINNAME in PhoneNumberUtil.java. + */ + NOT_A_NUMBER, + /** + * This indicates the string started with an international dialing prefix, but after this was + * stripped from the number, had less digits than any valid phone number (including country + * code) could have. + */ + TOO_SHORT_AFTER_IDD, + /** + * This indicates the string, after any country code has been stripped, had less digits than any + * valid phone number could have. + */ + TOO_SHORT_NSN, + /** + * This indicates the string had more digits than any valid phone number could have. + */ + TOO_LONG, + } + + private ErrorType errorType; + private String message; + + public NumberParseException(ErrorType errorType, String message) { + super(message); + this.message = message; + this.errorType = errorType; + } + + /** + * Returns the error type of the exception that has been thrown. + */ + public ErrorType getErrorType() { + return errorType; + } + + @Override + public String toString() { + return "Error type: " + errorType + ". " + message; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java new file mode 100644 index 0000000000..de95eac96d --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatch.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +import java.util.Arrays; + +/** + * The immutable match of a phone number within a piece of text. Matches may be found using + * {@link PhoneNumberUtil#findNumbers}. + * + *

A match consists of the {@linkplain #number() phone number} as well as the + * {@linkplain #start() start} and {@linkplain #end() end} offsets of the corresponding subsequence + * of the searched text. Use {@link #rawString()} to obtain a copy of the matched subsequence. + * + *

The following annotated example clarifies the relationship between the searched text, the + * match offsets, and the parsed number: + + *

+ * CharSequence text = "Call me at +1 425 882-8080 for details.";
+ * String country = "US";
+ * PhoneNumberUtil util = PhoneNumberUtil.getInstance();
+ *
+ * // Find the first phone number match:
+ * PhoneNumberMatch m = util.findNumbers(text, country).iterator().next();
+ *
+ * // rawString() contains the phone number as it appears in the text.
+ * "+1 425 882-8080".equals(m.rawString());
+ *
+ * // start() and end() define the range of the matched subsequence.
+ * CharSequence subsequence = text.subSequence(m.start(), m.end());
+ * "+1 425 882-8080".contentEquals(subsequence);
+ *
+ * // number() returns the the same result as PhoneNumberUtil.{@link PhoneNumberUtil#parse parse()}
+ * // invoked on rawString().
+ * util.parse(m.rawString(), country).equals(m.number());
+ * 
+ */ +public final class PhoneNumberMatch { + /** The start index into the text. */ + private final int start; + /** The raw substring matched. */ + private final String rawString; + /** The matched phone number. */ + private final PhoneNumber number; + + /** + * Creates a new match. + * + * @param start the start index into the target text + * @param rawString the matched substring of the target text + * @param number the matched phone number + */ + PhoneNumberMatch(int start, String rawString, PhoneNumber number) { + if (start < 0) { + throw new IllegalArgumentException("Start index must be >= 0."); + } + if (rawString == null || number == null) { + throw new NullPointerException(); + } + this.start = start; + this.rawString = rawString; + this.number = number; + } + + /** Returns the phone number matched by the receiver. */ + public PhoneNumber number() { + return number; + } + + /** Returns the start index of the matched phone number within the searched text. */ + public int start() { + return start; + } + + /** Returns the exclusive end index of the matched phone number within the searched text. */ + public int end() { + return start + rawString.length(); + } + + /** Returns the raw string matched as a phone number in the searched text. */ + public String rawString() { + return rawString; + } + + @Override + public int hashCode() { + return Arrays.hashCode(new Object[]{start, rawString, number}); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof PhoneNumberMatch)) { + return false; + } + PhoneNumberMatch other = (PhoneNumberMatch) obj; + return rawString.equals(other.rawString) && (start == other.start) + && number.equals(other.number); + } + + @Override + public String toString() { + return "PhoneNumberMatch [" + start() + "," + end() + ") " + rawString; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java new file mode 100644 index 0000000000..b812551db0 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberMatcher.java @@ -0,0 +1,732 @@ +/* + * Copyright (C) 2011 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.PhoneNumberUtil.Leniency; +import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType; +import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.internal.RegexCache; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import java.lang.Character.UnicodeBlock; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A stateful class that finds and extracts telephone numbers from {@linkplain CharSequence text}. + * Instances can be created using the {@linkplain PhoneNumberUtil#findNumbers factory methods} in + * {@link PhoneNumberUtil}. + * + *

Vanity numbers (phone numbers using alphabetic digits such as 1-800-SIX-FLAGS are + * not found. + * + *

This class is not thread-safe. + */ +final class PhoneNumberMatcher implements Iterator { + /** + * The phone number pattern used by {@link #find}, similar to + * {@code PhoneNumberUtil.VALID_PHONE_NUMBER}, but with the following differences: + *

    + *
  • All captures are limited in order to place an upper bound to the text matched by the + * pattern. + *
      + *
    • Leading punctuation / plus signs are limited. + *
    • Consecutive occurrences of punctuation are limited. + *
    • Number of digits is limited. + *
    + *
  • No whitespace is allowed at the start or end. + *
  • No alpha digits (vanity numbers such as 1-800-SIX-FLAGS) are currently supported. + *
+ */ + private static final Pattern PATTERN; + /** + * Matches strings that look like publication pages. Example: + *
Computing Complete Answers to Queries in the Presence of Limited Access Patterns.
+   * Chen Li. VLDB J. 12(3): 211-227 (2003).
+ * + * The string "211-227 (2003)" is not a telephone number. + */ + private static final Pattern PUB_PAGES = Pattern.compile("\\d{1,5}-+\\d{1,5}\\s{0,4}\\(\\d{1,4}"); + + /** + * Matches strings that look like dates using "/" as a separator. Examples: 3/10/2011, 31/10/96 or + * 08/31/95. + */ + private static final Pattern SLASH_SEPARATED_DATES = + Pattern.compile("(?:(?:[0-3]?\\d/[01]?\\d)|(?:[01]?\\d/[0-3]?\\d))/(?:[12]\\d)?\\d{2}"); + + /** + * Matches timestamps. Examples: "2012-01-02 08:00". Note that the reg-ex does not include the + * trailing ":\d\d" -- that is covered by TIME_STAMPS_SUFFIX. + */ + private static final Pattern TIME_STAMPS = + Pattern.compile("[12]\\d{3}[-/]?[01]\\d[-/]?[0-3]\\d +[0-2]\\d$"); + private static final Pattern TIME_STAMPS_SUFFIX = Pattern.compile(":[0-5]\\d"); + + /** + * Pattern to check that brackets match. Opening brackets should be closed within a phone number. + * This also checks that there is something inside the brackets. Having no brackets at all is also + * fine. + */ + private static final Pattern MATCHING_BRACKETS; + + /** + * Patterns used to extract phone numbers from a larger phone-number-like pattern. These are + * ordered according to specificity. For example, white-space is last since that is frequently + * used in numbers, not just to separate two numbers. We have separate patterns since we don't + * want to break up the phone-number-like text on more than one different kind of symbol at one + * time, although symbols of the same type (e.g. space) can be safely grouped together. + * + * Note that if there is a match, we will always check any text found up to the first match as + * well. + */ + private static final Pattern[] INNER_MATCHES = { + // Breaks on the slash - e.g. "651-234-2345/332-445-1234" + Pattern.compile("/+(.*)"), + // Note that the bracket here is inside the capturing group, since we consider it part of the + // phone number. Will match a pattern like "(650) 223 3345 (754) 223 3321". + Pattern.compile("(\\([^(]*)"), + // Breaks on a hyphen - e.g. "12345 - 332-445-1234 is my number." + // We require a space on either side of the hyphen for it to be considered a separator. + Pattern.compile("(?:\\p{Z}-|-\\p{Z})\\p{Z}*(.+)"), + // Various types of wide hyphens. Note we have decided not to enforce a space here, since it's + // possible that it's supposed to be used to break two numbers without spaces, and we haven't + // seen many instances of it used within a number. + Pattern.compile("[\u2012-\u2015\uFF0D]\\p{Z}*(.+)"), + // Breaks on a full stop - e.g. "12345. 332-445-1234 is my number." + Pattern.compile("\\.+\\p{Z}*([^.]+)"), + // Breaks on space - e.g. "3324451234 8002341234" + Pattern.compile("\\p{Z}+(\\P{Z}+)") + }; + + /** + * Punctuation that may be at the start of a phone number - brackets and plus signs. + */ + private static final Pattern LEAD_CLASS; + + static { + /* Builds the MATCHING_BRACKETS and PATTERN regular expressions. The building blocks below exist + * to make the pattern more easily understood. */ + + String openingParens = "(\\[\uFF08\uFF3B"; + String closingParens = ")\\]\uFF09\uFF3D"; + String nonParens = "[^" + openingParens + closingParens + "]"; + + /* Limit on the number of pairs of brackets in a phone number. */ + String bracketPairLimit = limit(0, 3); + /* + * An opening bracket at the beginning may not be closed, but subsequent ones should be. It's + * also possible that the leading bracket was dropped, so we shouldn't be surprised if we see a + * closing bracket first. We limit the sets of brackets in a phone number to four. + */ + MATCHING_BRACKETS = Pattern.compile( + "(?:[" + openingParens + "])?" + "(?:" + nonParens + "+" + "[" + closingParens + "])?" + + nonParens + "+" + + "(?:[" + openingParens + "]" + nonParens + "+[" + closingParens + "])" + bracketPairLimit + + nonParens + "*"); + + /* Limit on the number of leading (plus) characters. */ + String leadLimit = limit(0, 2); + /* Limit on the number of consecutive punctuation characters. */ + String punctuationLimit = limit(0, 4); + /* The maximum number of digits allowed in a digit-separated block. As we allow all digits in a + * single block, set high enough to accommodate the entire national number and the international + * country code. */ + int digitBlockLimit = + PhoneNumberUtil.MAX_LENGTH_FOR_NSN + PhoneNumberUtil.MAX_LENGTH_COUNTRY_CODE; + /* Limit on the number of blocks separated by punctuation. Uses digitBlockLimit since some + * formats use spaces to separate each digit. */ + String blockLimit = limit(0, digitBlockLimit); + + /* A punctuation sequence allowing white space. */ + String punctuation = "[" + PhoneNumberUtil.VALID_PUNCTUATION + "]" + punctuationLimit; + /* A digits block without punctuation. */ + String digitSequence = "\\p{Nd}" + limit(1, digitBlockLimit); + + String leadClassChars = openingParens + PhoneNumberUtil.PLUS_CHARS; + String leadClass = "[" + leadClassChars + "]"; + LEAD_CLASS = Pattern.compile(leadClass); + + /* Phone number pattern allowing optional punctuation. */ + PATTERN = Pattern.compile( + "(?:" + leadClass + punctuation + ")" + leadLimit + + digitSequence + "(?:" + punctuation + digitSequence + ")" + blockLimit + + "(?:" + PhoneNumberUtil.EXTN_PATTERNS_FOR_MATCHING + ")?", + PhoneNumberUtil.REGEX_FLAGS); + } + + /** Returns a regular expression quantifier with an upper and lower limit. */ + private static String limit(int lower, int upper) { + if ((lower < 0) || (upper <= 0) || (upper < lower)) { + throw new IllegalArgumentException(); + } + return "{" + lower + "," + upper + "}"; + } + + /** The potential states of a PhoneNumberMatcher. */ + private enum State { + NOT_READY, READY, DONE + } + + /** The phone number utility. */ + private final PhoneNumberUtil phoneUtil; + /** The text searched for phone numbers. */ + private final CharSequence text; + /** + * The region (country) to assume for phone numbers without an international prefix, possibly + * null. + */ + private final String preferredRegion; + /** The degree of validation requested. */ + private final Leniency leniency; + /** The maximum number of retries after matching an invalid number. */ + private long maxTries; + + /** The iteration tristate. */ + private State state = State.NOT_READY; + /** The last successful match, null unless in {@link State#READY}. */ + private PhoneNumberMatch lastMatch = null; + /** The next index to start searching at. Undefined in {@link State#DONE}. */ + private int searchIndex = 0; + + // A cache for frequently used country-specific regular expressions. Set to 32 to cover ~2-3 + // countries being used for the same doc with ~10 patterns for each country. Some pages will have + // a lot more countries in use, but typically fewer numbers for each so expanding the cache for + // that use-case won't have a lot of benefit. + private final RegexCache regexCache = new RegexCache(32); + + /** + * Creates a new instance. See the factory methods in {@link PhoneNumberUtil} on how to obtain a + * new instance. + * + * @param util the phone number util to use + * @param text the character sequence that we will search, null for no text + * @param country the country to assume for phone numbers not written in international format + * (with a leading plus, or with the international dialing prefix of the specified region). + * May be null or "ZZ" if only numbers with a leading plus should be + * considered. + * @param leniency the leniency to use when evaluating candidate phone numbers + * @param maxTries the maximum number of invalid numbers to try before giving up on the text. + * This is to cover degenerate cases where the text has a lot of false positives in it. Must + * be {@code >= 0}. + */ + PhoneNumberMatcher(PhoneNumberUtil util, CharSequence text, String country, Leniency leniency, + long maxTries) { + + if ((util == null) || (leniency == null)) { + throw new NullPointerException(); + } + if (maxTries < 0) { + throw new IllegalArgumentException(); + } + this.phoneUtil = util; + this.text = (text != null) ? text : ""; + this.preferredRegion = country; + this.leniency = leniency; + this.maxTries = maxTries; + } + + /** + * Attempts to find the next subsequence in the searched sequence on or after {@code searchIndex} + * that represents a phone number. Returns the next match, null if none was found. + * + * @param index the search index to start searching at + * @return the phone number match found, null if none can be found + */ + private PhoneNumberMatch find(int index) { + Matcher matcher = PATTERN.matcher(text); + while ((maxTries > 0) && matcher.find(index)) { + int start = matcher.start(); + CharSequence candidate = text.subSequence(start, matcher.end()); + + // Check for extra numbers at the end. + // TODO: This is the place to start when trying to support extraction of multiple phone number + // from split notations (+41 79 123 45 67 / 68). + candidate = trimAfterFirstMatch(PhoneNumberUtil.SECOND_NUMBER_START_PATTERN, candidate); + + PhoneNumberMatch match = extractMatch(candidate, start); + if (match != null) { + return match; + } + + index = start + candidate.length(); + maxTries--; + } + + return null; + } + + /** + * Trims away any characters after the first match of {@code pattern} in {@code candidate}, + * returning the trimmed version. + */ + private static CharSequence trimAfterFirstMatch(Pattern pattern, CharSequence candidate) { + Matcher trailingCharsMatcher = pattern.matcher(candidate); + if (trailingCharsMatcher.find()) { + candidate = candidate.subSequence(0, trailingCharsMatcher.start()); + } + return candidate; + } + + /** + * Helper method to determine if a character is a Latin-script letter or not. For our purposes, + * combining marks should also return true since we assume they have been added to a preceding + * Latin character. + */ + // @VisibleForTesting + static boolean isLatinLetter(char letter) { + // Combining marks are a subset of non-spacing-mark. + if (!Character.isLetter(letter) && Character.getType(letter) != Character.NON_SPACING_MARK) { + return false; + } + UnicodeBlock block = UnicodeBlock.of(letter); + return block.equals(UnicodeBlock.BASIC_LATIN) + || block.equals(UnicodeBlock.LATIN_1_SUPPLEMENT) + || block.equals(UnicodeBlock.LATIN_EXTENDED_A) + || block.equals(UnicodeBlock.LATIN_EXTENDED_ADDITIONAL) + || block.equals(UnicodeBlock.LATIN_EXTENDED_B) + || block.equals(UnicodeBlock.COMBINING_DIACRITICAL_MARKS); + } + + private static boolean isInvalidPunctuationSymbol(char character) { + return character == '%' || Character.getType(character) == Character.CURRENCY_SYMBOL; + } + + /** + * Attempts to extract a match from a {@code candidate} character sequence. + * + * @param candidate the candidate text that might contain a phone number + * @param offset the offset of {@code candidate} within {@link #text} + * @return the match found, null if none can be found + */ + private PhoneNumberMatch extractMatch(CharSequence candidate, int offset) { + // Skip a match that is more likely to be a date. + if (SLASH_SEPARATED_DATES.matcher(candidate).find()) { + return null; + } + + // Skip potential time-stamps. + if (TIME_STAMPS.matcher(candidate).find()) { + String followingText = text.toString().substring(offset + candidate.length()); + if (TIME_STAMPS_SUFFIX.matcher(followingText).lookingAt()) { + return null; + } + } + + // Try to come up with a valid match given the entire candidate. + PhoneNumberMatch match = parseAndVerify(candidate, offset); + if (match != null) { + return match; + } + + // If that failed, try to find an "inner match" - there might be a phone number within this + // candidate. + return extractInnerMatch(candidate, offset); + } + + /** + * Attempts to extract a match from {@code candidate} if the whole candidate does not qualify as a + * match. + * + * @param candidate the candidate text that might contain a phone number + * @param offset the current offset of {@code candidate} within {@link #text} + * @return the match found, null if none can be found + */ + private PhoneNumberMatch extractInnerMatch(CharSequence candidate, int offset) { + for (Pattern possibleInnerMatch : INNER_MATCHES) { + Matcher groupMatcher = possibleInnerMatch.matcher(candidate); + boolean isFirstMatch = true; + while (groupMatcher.find() && maxTries > 0) { + if (isFirstMatch) { + // We should handle any group before this one too. + CharSequence group = trimAfterFirstMatch( + PhoneNumberUtil.UNWANTED_END_CHAR_PATTERN, + candidate.subSequence(0, groupMatcher.start())); + PhoneNumberMatch match = parseAndVerify(group, offset); + if (match != null) { + return match; + } + maxTries--; + isFirstMatch = false; + } + CharSequence group = trimAfterFirstMatch( + PhoneNumberUtil.UNWANTED_END_CHAR_PATTERN, groupMatcher.group(1)); + PhoneNumberMatch match = parseAndVerify(group, offset + groupMatcher.start(1)); + if (match != null) { + return match; + } + maxTries--; + } + } + return null; + } + + /** + * Parses a phone number from the {@code candidate} using {@link PhoneNumberUtil#parse} and + * verifies it matches the requested {@link #leniency}. If parsing and verification succeed, a + * corresponding {@link PhoneNumberMatch} is returned, otherwise this method returns null. + * + * @param candidate the candidate match + * @param offset the offset of {@code candidate} within {@link #text} + * @return the parsed and validated phone number match, or null + */ + private PhoneNumberMatch parseAndVerify(CharSequence candidate, int offset) { + try { + // Check the candidate doesn't contain any formatting which would indicate that it really + // isn't a phone number. + if (!MATCHING_BRACKETS.matcher(candidate).matches() || PUB_PAGES.matcher(candidate).find()) { + return null; + } + + // If leniency is set to VALID or stricter, we also want to skip numbers that are surrounded + // by Latin alphabetic characters, to skip cases like abc8005001234 or 8005001234def. + if (leniency.compareTo(Leniency.VALID) >= 0) { + // If the candidate is not at the start of the text, and does not start with phone-number + // punctuation, check the previous character. + if (offset > 0 && !LEAD_CLASS.matcher(candidate).lookingAt()) { + char previousChar = text.charAt(offset - 1); + // We return null if it is a latin letter or an invalid punctuation symbol. + if (isInvalidPunctuationSymbol(previousChar) || isLatinLetter(previousChar)) { + return null; + } + } + int lastCharIndex = offset + candidate.length(); + if (lastCharIndex < text.length()) { + char nextChar = text.charAt(lastCharIndex); + if (isInvalidPunctuationSymbol(nextChar) || isLatinLetter(nextChar)) { + return null; + } + } + } + + PhoneNumber number = phoneUtil.parseAndKeepRawInput(candidate, preferredRegion); + + if (leniency.verify(number, candidate, phoneUtil, this)) { + // We used parseAndKeepRawInput to create this number, but for now we don't return the extra + // values parsed. TODO: stop clearing all values here and switch all users over + // to using rawInput() rather than the rawString() of PhoneNumberMatch. + number.clearCountryCodeSource(); + number.clearRawInput(); + number.clearPreferredDomesticCarrierCode(); + return new PhoneNumberMatch(offset, candidate.toString(), number); + } + } catch (NumberParseException e) { + // ignore and continue + } + return null; + } + + /** + * Small helper interface such that the number groups can be checked according to different + * criteria, both for our default way of performing formatting and for any alternate formats we + * may want to check. + */ + interface NumberGroupingChecker { + /** + * Returns true if the groups of digits found in our candidate phone number match our + * expectations. + * + * @param number the original number we found when parsing + * @param normalizedCandidate the candidate number, normalized to only contain ASCII digits, + * but with non-digits (spaces etc) retained + * @param expectedNumberGroups the groups of digits that we would expect to see if we + * formatted this number + */ + boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, String[] expectedNumberGroups); + } + + static boolean allNumberGroupsRemainGrouped(PhoneNumberUtil util, + PhoneNumber number, + StringBuilder normalizedCandidate, + String[] formattedNumberGroups) { + int fromIndex = 0; + if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + // First skip the country code if the normalized candidate contained it. + String countryCode = Integer.toString(number.getCountryCode()); + fromIndex = normalizedCandidate.indexOf(countryCode) + countryCode.length(); + } + // Check each group of consecutive digits are not broken into separate groupings in the + // {@code normalizedCandidate} string. + for (int i = 0; i < formattedNumberGroups.length; i++) { + // Fails if the substring of {@code normalizedCandidate} starting from {@code fromIndex} + // doesn't contain the consecutive digits in formattedNumberGroups[i]. + fromIndex = normalizedCandidate.indexOf(formattedNumberGroups[i], fromIndex); + if (fromIndex < 0) { + return false; + } + // Moves {@code fromIndex} forward. + fromIndex += formattedNumberGroups[i].length(); + if (i == 0 && fromIndex < normalizedCandidate.length()) { + // We are at the position right after the NDC. We get the region used for formatting + // information based on the country code in the phone number, rather than the number itself, + // as we do not need to distinguish between different countries with the same country + // calling code and this is faster. + String region = util.getRegionCodeForCountryCode(number.getCountryCode()); + if (util.getNddPrefixForRegion(region, true) != null + && Character.isDigit(normalizedCandidate.charAt(fromIndex))) { + // This means there is no formatting symbol after the NDC. In this case, we only + // accept the number if there is no formatting symbol at all in the number, except + // for extensions. This is only important for countries with national prefixes. + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + return normalizedCandidate.substring(fromIndex - formattedNumberGroups[i].length()) + .startsWith(nationalSignificantNumber); + } + } + } + // The check here makes sure that we haven't mistakenly already used the extension to + // match the last group of the subscriber number. Note the extension cannot have + // formatting in-between digits. + return normalizedCandidate.substring(fromIndex).contains(number.getExtension()); + } + + static boolean allNumberGroupsAreExactlyPresent(PhoneNumberUtil util, + PhoneNumber number, + StringBuilder normalizedCandidate, + String[] formattedNumberGroups) { + String[] candidateGroups = + PhoneNumberUtil.NON_DIGITS_PATTERN.split(normalizedCandidate.toString()); + // Set this to the last group, skipping it if the number has an extension. + int candidateNumberGroupIndex = + number.hasExtension() ? candidateGroups.length - 2 : candidateGroups.length - 1; + // First we check if the national significant number is formatted as a block. + // We use contains and not equals, since the national significant number may be present with + // a prefix such as a national number prefix, or the country code itself. + if (candidateGroups.length == 1 + || candidateGroups[candidateNumberGroupIndex].contains( + util.getNationalSignificantNumber(number))) { + return true; + } + // Starting from the end, go through in reverse, excluding the first group, and check the + // candidate and number groups are the same. + for (int formattedNumberGroupIndex = (formattedNumberGroups.length - 1); + formattedNumberGroupIndex > 0 && candidateNumberGroupIndex >= 0; + formattedNumberGroupIndex--, candidateNumberGroupIndex--) { + if (!candidateGroups[candidateNumberGroupIndex].equals( + formattedNumberGroups[formattedNumberGroupIndex])) { + return false; + } + } + // Now check the first group. There may be a national prefix at the start, so we only check + // that the candidate group ends with the formatted number group. + return (candidateNumberGroupIndex >= 0 + && candidateGroups[candidateNumberGroupIndex].endsWith(formattedNumberGroups[0])); + } + + /** + * Helper method to get the national-number part of a number, formatted without any national + * prefix, and return it as a set of digit blocks that would be formatted together following + * standard formatting rules. + */ + private static String[] getNationalNumberGroups(PhoneNumberUtil util, PhoneNumber number) { + // This will be in the format +CC-DG1-DG2-DGX;ext=EXT where DG1..DGX represents groups of + // digits. + String rfc3966Format = util.format(number, PhoneNumberFormat.RFC3966); + // We remove the extension part from the formatted string before splitting it into different + // groups. + int endIndex = rfc3966Format.indexOf(';'); + if (endIndex < 0) { + endIndex = rfc3966Format.length(); + } + // The country-code will have a '-' following it. + int startIndex = rfc3966Format.indexOf('-') + 1; + return rfc3966Format.substring(startIndex, endIndex).split("-"); + } + + /** + * Helper method to get the national-number part of a number, formatted without any national + * prefix, and return it as a set of digit blocks that should be formatted together according to + * the formatting pattern passed in. + */ + private static String[] getNationalNumberGroups(PhoneNumberUtil util, PhoneNumber number, + NumberFormat formattingPattern) { + // If a format is provided, we format the NSN only, and split that according to the separator. + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + return util.formatNsnUsingPattern(nationalSignificantNumber, + formattingPattern, PhoneNumberFormat.RFC3966).split("-"); + } + + boolean checkNumberGroupingIsValid( + PhoneNumber number, CharSequence candidate, PhoneNumberUtil util, + NumberGroupingChecker checker) { + StringBuilder normalizedCandidate = + PhoneNumberUtil.normalizeDigits(candidate, true /* keep non-digits */); + String[] formattedNumberGroups = getNationalNumberGroups(util, number); + if (checker.checkGroups(util, number, normalizedCandidate, formattedNumberGroups)) { + return true; + } + // If this didn't pass, see if there are any alternate formats that match, and try them instead. + PhoneMetadata alternateFormats = + DefaultMetadataDependenciesProvider.getInstance() + .getAlternateFormatsMetadataSource() + .getFormattingMetadataForCountryCallingCode(number.getCountryCode()); + String nationalSignificantNumber = util.getNationalSignificantNumber(number); + if (alternateFormats != null) { + for (NumberFormat alternateFormat : alternateFormats.getNumberFormatList()) { + if (alternateFormat.getLeadingDigitsPatternCount() > 0) { + // There is only one leading digits pattern for alternate formats. + Pattern pattern = + regexCache.getPatternForRegex(alternateFormat.getLeadingDigitsPattern(0)); + if (!pattern.matcher(nationalSignificantNumber).lookingAt()) { + // Leading digits don't match; try another one. + continue; + } + } + formattedNumberGroups = getNationalNumberGroups(util, number, alternateFormat); + if (checker.checkGroups(util, number, normalizedCandidate, formattedNumberGroups)) { + return true; + } + } + } + return false; + } + + static boolean containsMoreThanOneSlashInNationalNumber(PhoneNumber number, String candidate) { + int firstSlashInBodyIndex = candidate.indexOf('/'); + if (firstSlashInBodyIndex < 0) { + // No slashes, this is okay. + return false; + } + // Now look for a second one. + int secondSlashInBodyIndex = candidate.indexOf('/', firstSlashInBodyIndex + 1); + if (secondSlashInBodyIndex < 0) { + // Only one slash, this is okay. + return false; + } + + // If the first slash is after the country calling code, this is permitted. + boolean candidateHasCountryCode = + (number.getCountryCodeSource() == CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN + || number.getCountryCodeSource() == CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + if (candidateHasCountryCode + && PhoneNumberUtil.normalizeDigitsOnly(candidate.substring(0, firstSlashInBodyIndex)) + .equals(Integer.toString(number.getCountryCode()))) { + // Any more slashes and this is illegal. + return candidate.substring(secondSlashInBodyIndex + 1).contains("/"); + } + return true; + } + + static boolean containsOnlyValidXChars( + PhoneNumber number, String candidate, PhoneNumberUtil util) { + // The characters 'x' and 'X' can be (1) a carrier code, in which case they always precede the + // national significant number or (2) an extension sign, in which case they always precede the + // extension number. We assume a carrier code is more than 1 digit, so the first case has to + // have more than 1 consecutive 'x' or 'X', whereas the second case can only have exactly 1 'x' + // or 'X'. We ignore the character if it appears as the last character of the string. + for (int index = 0; index < candidate.length() - 1; index++) { + char charAtIndex = candidate.charAt(index); + if (charAtIndex == 'x' || charAtIndex == 'X') { + char charAtNextIndex = candidate.charAt(index + 1); + if (charAtNextIndex == 'x' || charAtNextIndex == 'X') { + // This is the carrier code case, in which the 'X's always precede the national + // significant number. + index++; + if (util.isNumberMatch(number, candidate.substring(index)) != MatchType.NSN_MATCH) { + return false; + } + // This is the extension sign case, in which the 'x' or 'X' should always precede the + // extension number. + } else if (!PhoneNumberUtil.normalizeDigitsOnly(candidate.substring(index)).equals( + number.getExtension())) { + return false; + } + } + } + return true; + } + + static boolean isNationalPrefixPresentIfRequired(PhoneNumber number, PhoneNumberUtil util) { + // First, check how we deduced the country code. If it was written in international format, then + // the national prefix is not required. + if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + return true; + } + String phoneNumberRegion = + util.getRegionCodeForCountryCode(number.getCountryCode()); + PhoneMetadata metadata = util.getMetadataForRegion(phoneNumberRegion); + if (metadata == null) { + return true; + } + // Check if a national prefix should be present when formatting this number. + String nationalNumber = util.getNationalSignificantNumber(number); + NumberFormat formatRule = + util.chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber); + // To do this, we check that a national prefix formatting rule was present and that it wasn't + // just the first-group symbol ($1) with punctuation. + if ((formatRule != null) && formatRule.getNationalPrefixFormattingRule().length() > 0) { + if (formatRule.getNationalPrefixOptionalWhenFormatting()) { + // The national-prefix is optional in these cases, so we don't need to check if it was + // present. + return true; + } + if (PhoneNumberUtil.formattingRuleHasFirstGroupOnly( + formatRule.getNationalPrefixFormattingRule())) { + // National Prefix not needed for this number. + return true; + } + // Normalize the remainder. + String rawInputCopy = PhoneNumberUtil.normalizeDigitsOnly(number.getRawInput()); + StringBuilder rawInput = new StringBuilder(rawInputCopy); + // Check if we found a national prefix and/or carrier code at the start of the raw input, and + // return the result. + return util.maybeStripNationalPrefixAndCarrierCode(rawInput, metadata, null); + } + return true; + } + + @Override + public boolean hasNext() { + if (state == State.NOT_READY) { + lastMatch = find(searchIndex); + if (lastMatch == null) { + state = State.DONE; + } else { + searchIndex = lastMatch.end(); + state = State.READY; + } + } + return state == State.READY; + } + + @Override + public PhoneNumberMatch next() { + // Check the state and find the next match as a side-effect if necessary. + if (!hasNext()) { + throw new NoSuchElementException(); + } + + // Don't retain that memory any longer than necessary. + PhoneNumberMatch result = lastMatch; + lastMatch = null; + state = State.NOT_READY; + return result; + } + + /** + * Always throws {@link UnsupportedOperationException} as removal is not supported. + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java new file mode 100644 index 0000000000..fd8f1a3067 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -0,0 +1,3683 @@ +/* + * Copyright (C) 2009 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource; +import com.google.i18n.phonenumbers.internal.MatcherApi; +import com.google.i18n.phonenumbers.internal.RegexBasedMatcher; +import com.google.i18n.phonenumbers.internal.RegexCache; +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility for international phone numbers. Functionality includes formatting, parsing and + * validation. + * + *

If you use this library, and want to be notified about important changes, please sign up to + * our mailing list. + * + * NOTE: A lot of methods in this class require Region Code strings. These must be provided using + * CLDR two-letter region-code format. These should be in upper-case. The list of the codes + * can be found here: + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + */ +public class PhoneNumberUtil { + private static final Logger logger = Logger.getLogger(PhoneNumberUtil.class.getName()); + + /** Flags to use when compiling regular expressions for phone numbers. */ + static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; + // The minimum and maximum length of the national significant number. + private static final int MIN_LENGTH_FOR_NSN = 2; + // The ITU says the maximum length should be 15, but we have found longer numbers in Germany. + static final int MAX_LENGTH_FOR_NSN = 17; + // The maximum length of the country calling code. + static final int MAX_LENGTH_COUNTRY_CODE = 3; + // We don't allow input strings for parsing to be longer than 250 chars. This prevents malicious + // input from overflowing the regular-expression engine. + private static final int MAX_INPUT_STRING_LENGTH = 250; + + // Region-code for the unknown region. + private static final String UNKNOWN_REGION = "ZZ"; + + private static final int NANPA_COUNTRY_CODE = 1; + + // Map of country calling codes that use a mobile token before the area code. One example of when + // this is relevant is when determining the length of the national destination code, which should + // be the length of the area code plus the length of the mobile token. + private static final Map MOBILE_TOKEN_MAPPINGS; + + // Set of country codes that have geographically assigned mobile numbers (see GEO_MOBILE_COUNTRIES + // below) which are not based on *area codes*. For example, in China mobile numbers start with a + // carrier indicator, and beyond that are geographically assigned: this carrier indicator is not + // considered to be an area code. + private static final Set GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES; + + // Set of country codes that doesn't have national prefix, but it has area codes. + private static final Set COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES; + + // Set of country calling codes that have geographically assigned mobile numbers. This may not be + // complete; we add calling codes case by case, as we find geographical mobile numbers or hear + // from user reports. Note that countries like the US, where we can't distinguish between + // fixed-line or mobile numbers, are not listed here, since we consider FIXED_LINE_OR_MOBILE to be + // a possibly geographically-related type anyway (like FIXED_LINE). + private static final Set GEO_MOBILE_COUNTRIES; + + // The PLUS_SIGN signifies the international prefix. + static final char PLUS_SIGN = '+'; + + private static final char STAR_SIGN = '*'; + + private static final String RFC3966_EXTN_PREFIX = ";ext="; + private static final String RFC3966_PREFIX = "tel:"; + private static final String RFC3966_PHONE_CONTEXT = ";phone-context="; + private static final String RFC3966_ISDN_SUBADDRESS = ";isub="; + + // A map that contains characters that are essential when dialling. That means any of the + // characters in this map must not be removed from a number when dialling, otherwise the call + // will not reach the intended destination. + private static final Map DIALLABLE_CHAR_MAPPINGS; + + // Only upper-case variants of alpha characters are stored. + private static final Map ALPHA_MAPPINGS; + + // For performance reasons, amalgamate both into one map. + private static final Map ALPHA_PHONE_MAPPINGS; + + // Separate map of all symbols that we wish to retain when formatting alpha numbers. This + // includes digits, ASCII letters and number grouping symbols such as "-" and " ". + private static final Map ALL_PLUS_NUMBER_GROUPING_SYMBOLS; + + static { + HashMap mobileTokenMap = new HashMap<>(); + mobileTokenMap.put(54, "9"); + MOBILE_TOKEN_MAPPINGS = Collections.unmodifiableMap(mobileTokenMap); + + HashSet geoMobileCountriesWithoutMobileAreaCodes = new HashSet<>(); + geoMobileCountriesWithoutMobileAreaCodes.add(86); // China + GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES = + Collections.unmodifiableSet(geoMobileCountriesWithoutMobileAreaCodes); + + HashSet countriesWithoutNationalPrefixWithAreaCodes = new HashSet<>(); + countriesWithoutNationalPrefixWithAreaCodes.add(52); // Mexico + COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES = + Collections.unmodifiableSet(countriesWithoutNationalPrefixWithAreaCodes); + + HashSet geoMobileCountries = new HashSet<>(); + geoMobileCountries.add(52); // Mexico + geoMobileCountries.add(54); // Argentina + geoMobileCountries.add(55); // Brazil + geoMobileCountries.add(62); // Indonesia: some prefixes only (fixed CMDA wireless) + geoMobileCountries.addAll(geoMobileCountriesWithoutMobileAreaCodes); + GEO_MOBILE_COUNTRIES = Collections.unmodifiableSet(geoMobileCountries); + + // Simple ASCII digits map used to populate ALPHA_PHONE_MAPPINGS and + // ALL_PLUS_NUMBER_GROUPING_SYMBOLS. + HashMap asciiDigitMappings = new HashMap<>(); + asciiDigitMappings.put('0', '0'); + asciiDigitMappings.put('1', '1'); + asciiDigitMappings.put('2', '2'); + asciiDigitMappings.put('3', '3'); + asciiDigitMappings.put('4', '4'); + asciiDigitMappings.put('5', '5'); + asciiDigitMappings.put('6', '6'); + asciiDigitMappings.put('7', '7'); + asciiDigitMappings.put('8', '8'); + asciiDigitMappings.put('9', '9'); + + HashMap alphaMap = new HashMap<>(40); + alphaMap.put('A', '2'); + alphaMap.put('B', '2'); + alphaMap.put('C', '2'); + alphaMap.put('D', '3'); + alphaMap.put('E', '3'); + alphaMap.put('F', '3'); + alphaMap.put('G', '4'); + alphaMap.put('H', '4'); + alphaMap.put('I', '4'); + alphaMap.put('J', '5'); + alphaMap.put('K', '5'); + alphaMap.put('L', '5'); + alphaMap.put('M', '6'); + alphaMap.put('N', '6'); + alphaMap.put('O', '6'); + alphaMap.put('P', '7'); + alphaMap.put('Q', '7'); + alphaMap.put('R', '7'); + alphaMap.put('S', '7'); + alphaMap.put('T', '8'); + alphaMap.put('U', '8'); + alphaMap.put('V', '8'); + alphaMap.put('W', '9'); + alphaMap.put('X', '9'); + alphaMap.put('Y', '9'); + alphaMap.put('Z', '9'); + ALPHA_MAPPINGS = Collections.unmodifiableMap(alphaMap); + + HashMap combinedMap = new HashMap<>(100); + combinedMap.putAll(ALPHA_MAPPINGS); + combinedMap.putAll(asciiDigitMappings); + ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap); + + HashMap diallableCharMap = new HashMap<>(); + diallableCharMap.putAll(asciiDigitMappings); + diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); + diallableCharMap.put('*', '*'); + diallableCharMap.put('#', '#'); + DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); + + HashMap allPlusNumberGroupings = new HashMap<>(); + // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. + for (char c : ALPHA_MAPPINGS.keySet()) { + allPlusNumberGroupings.put(Character.toLowerCase(c), c); + allPlusNumberGroupings.put(c, c); + } + allPlusNumberGroupings.putAll(asciiDigitMappings); + // Put grouping symbols. + allPlusNumberGroupings.put('-', '-'); + allPlusNumberGroupings.put('\uFF0D', '-'); + allPlusNumberGroupings.put('\u2010', '-'); + allPlusNumberGroupings.put('\u2011', '-'); + allPlusNumberGroupings.put('\u2012', '-'); + allPlusNumberGroupings.put('\u2013', '-'); + allPlusNumberGroupings.put('\u2014', '-'); + allPlusNumberGroupings.put('\u2015', '-'); + allPlusNumberGroupings.put('\u2212', '-'); + allPlusNumberGroupings.put('/', '/'); + allPlusNumberGroupings.put('\uFF0F', '/'); + allPlusNumberGroupings.put(' ', ' '); + allPlusNumberGroupings.put('\u3000', ' '); + allPlusNumberGroupings.put('\u2060', ' '); + allPlusNumberGroupings.put('.', '.'); + allPlusNumberGroupings.put('\uFF0E', '.'); + ALL_PLUS_NUMBER_GROUPING_SYMBOLS = Collections.unmodifiableMap(allPlusNumberGroupings); + } + + // Pattern that makes it easy to distinguish whether a region has a single international dialing + // prefix or not. If a region has a single international prefix (e.g. 011 in USA), it will be + // represented as a string that contains a sequence of ASCII digits, and possibly a tilde, which + // signals waiting for the tone. If there are multiple available international prefixes in a + // region, they will be represented as a regex string that always contains one or more characters + // that are not ASCII digits or a tilde. + private static final Pattern SINGLE_INTERNATIONAL_PREFIX = + Pattern.compile("[\\d]+(?:[~\u2053\u223C\uFF5E][\\d]+)?"); + + // Regular expression of acceptable punctuation found in phone numbers, used to find numbers in + // text and to decide what is a viable phone number. This excludes diallable characters. + // This consists of dash characters, white space characters, full stops, slashes, + // square brackets, parentheses and tildes. It also includes the letter 'x' as that is found as a + // placeholder for carrier information in some phone numbers. Full-width variants are also + // present. + static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " + + "\u00A0\u00AD\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E"; + + private static final String DIGITS = "\\p{Nd}"; + // We accept alpha characters in phone numbers, ASCII only, upper and lower case. + private static final String VALID_ALPHA = + Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()).replaceAll("[, \\[\\]]", "") + + Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()) + .toLowerCase().replaceAll("[, \\[\\]]", ""); + static final String PLUS_CHARS = "+\uFF0B"; + static final Pattern PLUS_CHARS_PATTERN = Pattern.compile("[" + PLUS_CHARS + "]+"); + private static final Pattern SEPARATOR_PATTERN = Pattern.compile("[" + VALID_PUNCTUATION + "]+"); + private static final Pattern CAPTURING_DIGIT_PATTERN = Pattern.compile("(" + DIGITS + ")"); + + // Regular expression of acceptable characters that may start a phone number for the purposes of + // parsing. This allows us to strip away meaningless prefixes to phone numbers that may be + // mistakenly given to us. This consists of digits, the plus symbol and arabic-indic digits. This + // does not contain alpha characters, although they may be used later in the number. It also does + // not include other punctuation, as this will be stripped later during parsing and is of no + // information value when parsing a number. + private static final String VALID_START_CHAR = "[" + PLUS_CHARS + DIGITS + "]"; + private static final Pattern VALID_START_CHAR_PATTERN = Pattern.compile(VALID_START_CHAR); + + // Regular expression of characters typically used to start a second phone number for the purposes + // of parsing. This allows us to strip off parts of the number that are actually the start of + // another number, such as for: (530) 583-6985 x302/x2303 -> the second extension here makes this + // actually two phone numbers, (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second + // extension so that the first number is parsed correctly. + private static final String SECOND_NUMBER_START = "[\\\\/] *x"; + static final Pattern SECOND_NUMBER_START_PATTERN = Pattern.compile(SECOND_NUMBER_START); + + // Regular expression of trailing characters that we want to remove. We remove all characters that + // are not alpha or numerical characters. The hash character is retained here, as it may signify + // the previous block was an extension. + private static final String UNWANTED_END_CHARS = "[[\\P{N}&&\\P{L}]&&[^#]]+$"; + static final Pattern UNWANTED_END_CHAR_PATTERN = Pattern.compile(UNWANTED_END_CHARS); + + // We use this pattern to check if the phone number has at least three letters in it - if so, then + // we treat it as a number where some phone-number digits are represented by letters. + private static final Pattern VALID_ALPHA_PHONE_PATTERN = Pattern.compile("(?:.*?[A-Za-z]){3}.*"); + + // Regular expression of viable phone numbers. This is location independent. Checks we have at + // least three leading digits, and only valid punctuation, alpha characters and + // digits in the phone number. Does not include extension data. + // The symbol 'x' is allowed here as valid punctuation since it is often used as a placeholder for + // carrier codes, for example in Brazilian phone numbers. We also allow multiple "+" characters at + // the start. + // Corresponds to the following: + // [digits]{minLengthNsn}| + // plus_sign*(([punctuation]|[star])*[digits]){3,}([punctuation]|[star]|[digits]|[alpha])* + // + // The first reg-ex is to allow short numbers (two digits long) to be parsed if they are entered + // as "15" etc, but only if there is no punctuation in them. The second expression restricts the + // number of digits to three or more, but then allows them to be in international form, and to + // have alpha-characters and punctuation. + // + // Note VALID_PUNCTUATION starts with a -, so must be the first in the range. + private static final String VALID_PHONE_NUMBER = + DIGITS + "{" + MIN_LENGTH_FOR_NSN + "}" + "|" + + "[" + PLUS_CHARS + "]*+(?:[" + VALID_PUNCTUATION + STAR_SIGN + "]*" + DIGITS + "){3,}[" + + VALID_PUNCTUATION + STAR_SIGN + VALID_ALPHA + DIGITS + "]*"; + + // Default extension prefix to use when formatting. This will be put in front of any extension + // component of the number, after the main national number is formatted. For example, if you wish + // the default extension formatting to be " extn: 3456", then you should specify " extn: " here + // as the default extension prefix. This can be overridden by region-specific preferences. + private static final String DEFAULT_EXTN_PREFIX = " ext. "; + + // Regexp of all possible ways to write extensions, for use when parsing. This will be run as a + // case-insensitive regexp match. Wide character versions are also provided after each ASCII + // version. + private static final String EXTN_PATTERNS_FOR_PARSING = createExtnPattern(true); + static final String EXTN_PATTERNS_FOR_MATCHING = createExtnPattern(false); + + // Regular expression of valid global-number-digits for the phone-context parameter, following the + // syntax defined in RFC3966. + private static final String RFC3966_VISUAL_SEPARATOR = "[\\-\\.\\(\\)]?"; + private static final String RFC3966_PHONE_DIGIT = + "(" + DIGITS + "|" + RFC3966_VISUAL_SEPARATOR + ")"; + private static final String RFC3966_GLOBAL_NUMBER_DIGITS = + "^\\" + PLUS_SIGN + RFC3966_PHONE_DIGIT + "*" + DIGITS + RFC3966_PHONE_DIGIT + "*$"; + static final Pattern RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN = + Pattern.compile(RFC3966_GLOBAL_NUMBER_DIGITS); + + // Regular expression of valid domainname for the phone-context parameter, following the syntax + // defined in RFC3966. + private static final String ALPHANUM = VALID_ALPHA + DIGITS; + private static final String RFC3966_DOMAINLABEL = + "[" + ALPHANUM + "]+((\\-)*[" + ALPHANUM + "])*"; + private static final String RFC3966_TOPLABEL = + "[" + VALID_ALPHA + "]+((\\-)*[" + ALPHANUM + "])*"; + private static final String RFC3966_DOMAINNAME = + "^(" + RFC3966_DOMAINLABEL + "\\.)*" + RFC3966_TOPLABEL + "\\.?$"; + static final Pattern RFC3966_DOMAINNAME_PATTERN = Pattern.compile(RFC3966_DOMAINNAME); + + /** + * Helper method for constructing regular expressions for parsing. Creates an expression that + * captures up to maxLength digits. + */ + private static String extnDigits(int maxLength) { + return "(" + DIGITS + "{1," + maxLength + "})"; + } + + /** + * Helper initialiser method to create the regular-expression pattern to match extensions. + * Note that there are currently six capturing groups for the extension itself. If this number is + * changed, MaybeStripExtension needs to be updated. + */ + private static String createExtnPattern(boolean forParsing) { + // We cap the maximum length of an extension based on the ambiguity of the way the extension is + // prefixed. As per ITU, the officially allowed length for extensions is actually 40, but we + // don't support this since we haven't seen real examples and this introduces many false + // interpretations as the extension labels are not standardized. + int extLimitAfterExplicitLabel = 20; + int extLimitAfterLikelyLabel = 15; + int extLimitAfterAmbiguousChar = 9; + int extLimitWhenNotSure = 6; + + String possibleSeparatorsBetweenNumberAndExtLabel = "[ \u00A0\\t,]*"; + // Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas. + String possibleCharsAfterExtLabel = "[:\\.\uFF0E]?[ \u00A0\\t,-]*"; + String optionalExtnSuffix = "#?"; + + // Here the extension is called out in more explicit way, i.e mentioning it obvious patterns + // like "ext.". Canonical-equivalence doesn't seem to be an option with Android java, so we + // allow two options for representing the accented o - the character itself, and one in the + // unicode decomposed form with the combining acute accent. + String explicitExtLabels = + "(?:e?xt(?:ensi(?:o\u0301?|\u00F3))?n?|\uFF45?\uFF58\uFF54\uFF4E?|\u0434\u043E\u0431|anexo)"; + // One-character symbols that can be used to indicate an extension, and less commonly used + // or more ambiguous extension labels. + String ambiguousExtLabels = "(?:[x\uFF58#\uFF03~\uFF5E]|int|\uFF49\uFF4E\uFF54)"; + // When extension is not separated clearly. + String ambiguousSeparator = "[- ]+"; + + String rfcExtn = RFC3966_EXTN_PREFIX + extnDigits(extLimitAfterExplicitLabel); + String explicitExtn = possibleSeparatorsBetweenNumberAndExtLabel + explicitExtLabels + + possibleCharsAfterExtLabel + extnDigits(extLimitAfterExplicitLabel) + + optionalExtnSuffix; + String ambiguousExtn = possibleSeparatorsBetweenNumberAndExtLabel + ambiguousExtLabels + + possibleCharsAfterExtLabel + extnDigits(extLimitAfterAmbiguousChar) + optionalExtnSuffix; + String americanStyleExtnWithSuffix = ambiguousSeparator + extnDigits(extLimitWhenNotSure) + "#"; + + // The first regular expression covers RFC 3966 format, where the extension is added using + // ";ext=". The second more generic where extension is mentioned with explicit labels like + // "ext:". In both the above cases we allow more numbers in extension than any other extension + // labels. The third one captures when single character extension labels or less commonly used + // labels are used. In such cases we capture fewer extension digits in order to reduce the + // chance of falsely interpreting two numbers beside each other as a number + extension. The + // fourth one covers the special case of American numbers where the extension is written with a + // hash at the end, such as "- 503#". + String extensionPattern = + rfcExtn + "|" + + explicitExtn + "|" + + ambiguousExtn + "|" + + americanStyleExtnWithSuffix; + // Additional pattern that is supported when parsing extensions, not when matching. + if (forParsing) { + // This is same as possibleSeparatorsBetweenNumberAndExtLabel, but not matching comma as + // extension label may have it. + String possibleSeparatorsNumberExtLabelNoComma = "[ \u00A0\\t]*"; + // ",," is commonly used for auto dialling the extension when connected. First comma is matched + // through possibleSeparatorsBetweenNumberAndExtLabel, so we do not repeat it here. Semi-colon + // works in Iphone and Android also to pop up a button with the extension number following. + String autoDiallingAndExtLabelsFound = "(?:,{2}|;)"; + + String autoDiallingExtn = possibleSeparatorsNumberExtLabelNoComma + + autoDiallingAndExtLabelsFound + possibleCharsAfterExtLabel + + extnDigits(extLimitAfterLikelyLabel) + optionalExtnSuffix; + String onlyCommasExtn = possibleSeparatorsNumberExtLabelNoComma + + "(?:,)+" + possibleCharsAfterExtLabel + extnDigits(extLimitAfterAmbiguousChar) + + optionalExtnSuffix; + // Here the first pattern is exclusively for extension autodialling formats which are used + // when dialling and in this case we accept longer extensions. However, the second pattern + // is more liberal on the number of commas that acts as extension labels, so we have a strict + // cap on the number of digits in such extensions. + return extensionPattern + "|" + + autoDiallingExtn + "|" + + onlyCommasExtn; + } + return extensionPattern; + } + + // Regexp of all known extension prefixes used by different regions followed by 1 or more valid + // digits, for use when parsing. + private static final Pattern EXTN_PATTERN = + Pattern.compile("(?:" + EXTN_PATTERNS_FOR_PARSING + ")$", REGEX_FLAGS); + + // We append optionally the extension pattern to the end here, as a valid phone number may + // have an extension prefix appended, followed by 1 or more digits. + private static final Pattern VALID_PHONE_NUMBER_PATTERN = + Pattern.compile(VALID_PHONE_NUMBER + "(?:" + EXTN_PATTERNS_FOR_PARSING + ")?", REGEX_FLAGS); + + static final Pattern NON_DIGITS_PATTERN = Pattern.compile("(\\D+)"); + + // The FIRST_GROUP_PATTERN was originally set to $1 but there are some countries for which the + // first group is not used in the national pattern (e.g. Argentina) so the $1 group does not match + // correctly. Therefore, we use \d, so that the first group actually used in the pattern will be + // matched. + private static final Pattern FIRST_GROUP_PATTERN = Pattern.compile("(\\$\\d)"); + // Constants used in the formatting rules to represent the national prefix, first group and + // carrier code respectively. + private static final String NP_STRING = "$NP"; + private static final String FG_STRING = "$FG"; + private static final String CC_STRING = "$CC"; + + // A pattern that is used to determine if the national prefix formatting rule has the first group + // only, i.e., does not start with the national prefix. Note that the pattern explicitly allows + // for unbalanced parentheses. + private static final Pattern FIRST_GROUP_ONLY_PREFIX_PATTERN = Pattern.compile("\\(?\\$1\\)?"); + + private static PhoneNumberUtil instance = null; + + public static final String REGION_CODE_FOR_NON_GEO_ENTITY = "001"; + + /** + * INTERNATIONAL and NATIONAL formats are consistent with the definition in ITU-T Recommendation + * E.123. However we follow local conventions such as using '-' instead of whitespace as + * separators. For example, the number of the Google Switzerland office will be written as + * "+41 44 668 1800" in INTERNATIONAL format, and as "044 668 1800" in NATIONAL format. E164 + * format is as per INTERNATIONAL format but with no formatting applied, e.g. "+41446681800". + * RFC3966 is as per INTERNATIONAL format, but with all spaces and other separating symbols + * replaced with a hyphen, and with any phone number extension appended with ";ext=". It also + * will have a prefix of "tel:" added, e.g. "tel:+41-44-668-1800". + * + * Note: If you are considering storing the number in a neutral format, you are highly advised to + * use the PhoneNumber class. + */ + public enum PhoneNumberFormat { + E164, + INTERNATIONAL, + NATIONAL, + RFC3966 + } + + /** + * Type of phone numbers. + */ + public enum PhoneNumberType { + FIXED_LINE, + MOBILE, + // In some regions (e.g. the USA), it is impossible to distinguish between fixed-line and + // mobile numbers by looking at the phone number itself. + FIXED_LINE_OR_MOBILE, + // Freephone lines + TOLL_FREE, + PREMIUM_RATE, + // The cost of this call is shared between the caller and the recipient, and is hence typically + // less than PREMIUM_RATE calls. See // http://en.wikipedia.org/wiki/Shared_Cost_Service for + // more information. + SHARED_COST, + // Voice over IP numbers. This includes TSoIP (Telephony Service over IP). + VOIP, + // A personal number is associated with a particular person, and may be routed to either a + // MOBILE or FIXED_LINE number. Some more information can be found here: + // http://en.wikipedia.org/wiki/Personal_Numbers + PERSONAL_NUMBER, + PAGER, + // Used for "Universal Access Numbers" or "Company Numbers". They may be further routed to + // specific offices, but allow one number to be used for a company. + UAN, + // Used for "Voice Mail Access Numbers". + VOICEMAIL, + // A phone number is of type UNKNOWN when it does not fit any of the known patterns for a + // specific region. + UNKNOWN + } + + /** + * Types of phone number matches. See detailed description beside the isNumberMatch() method. + */ + public enum MatchType { + NOT_A_NUMBER, + NO_MATCH, + SHORT_NSN_MATCH, + NSN_MATCH, + EXACT_MATCH, + } + + /** + * Possible outcomes when testing if a PhoneNumber is possible. + */ + public enum ValidationResult { + /** The number length matches that of valid numbers for this region. */ + IS_POSSIBLE, + /** + * The number length matches that of local numbers for this region only (i.e. numbers that may + * be able to be dialled within an area, but do not have all the information to be dialled from + * anywhere inside or outside the country). + */ + IS_POSSIBLE_LOCAL_ONLY, + /** The number has an invalid country calling code. */ + INVALID_COUNTRY_CODE, + /** The number is shorter than all valid numbers for this region. */ + TOO_SHORT, + /** + * The number is longer than the shortest valid numbers for this region, shorter than the + * longest valid numbers for this region, and does not itself have a number length that matches + * valid numbers for this region. This can also be returned in the case where + * isPossibleNumberForTypeWithReason was called, and there are no numbers of this type at all + * for this region. + */ + INVALID_LENGTH, + /** The number is longer than all valid numbers for this region. */ + TOO_LONG, + } + + /** + * Leniency when {@linkplain PhoneNumberUtil#findNumbers finding} potential phone numbers in text + * segments. The levels here are ordered in increasing strictness. + */ + public enum Leniency { + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber) + * possible}, but not necessarily {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. + */ + POSSIBLE { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + return util.isPossibleNumber(number); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber) + * possible} and {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. Numbers written + * in national format must have their national-prefix present if it is usually written for a + * number of this type. + */ + VALID { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidate.toString(), util)) { + return false; + } + return PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid} and + * are grouped in a possible way for this locale. For example, a US number written as + * "65 02 53 00 00" and "650253 0000" are not accepted at this leniency level, whereas + * "650 253 0000", "650 2530000" or "6502530000" are. + * Numbers with more than one '/' symbol in the national significant number are also dropped at + * this level. + *

+ * Warning: This level might result in lower coverage especially for regions outside of country + * code "+1". If you are not sure about which level to use, email the discussion group + * libphonenumber-discuss@googlegroups.com. + */ + STRICT_GROUPING { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + String candidateString = candidate.toString(); + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidateString, util) + || PhoneNumberMatcher.containsMoreThanOneSlashInNationalNumber(number, candidateString) + || !PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util)) { + return false; + } + return matcher.checkNumberGroupingIsValid( + number, candidate, util, new PhoneNumberMatcher.NumberGroupingChecker() { + @Override + public boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, + String[] expectedNumberGroups) { + return PhoneNumberMatcher.allNumberGroupsRemainGrouped( + util, number, normalizedCandidate, expectedNumberGroups); + } + }); + } + }, + /** + * Phone numbers accepted are {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid} and + * are grouped in the same way that we would have formatted it, or as a single block. For + * example, a US number written as "650 2530000" is not accepted at this leniency level, whereas + * "650 253 0000" or "6502530000" are. + * Numbers with more than one '/' symbol are also dropped at this level. + *

+ * Warning: This level might result in lower coverage especially for regions outside of country + * code "+1". If you are not sure about which level to use, email the discussion group + * libphonenumber-discuss@googlegroups.com. + */ + EXACT_GROUPING { + @Override + boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher) { + String candidateString = candidate.toString(); + if (!util.isValidNumber(number) + || !PhoneNumberMatcher.containsOnlyValidXChars(number, candidateString, util) + || PhoneNumberMatcher.containsMoreThanOneSlashInNationalNumber(number, candidateString) + || !PhoneNumberMatcher.isNationalPrefixPresentIfRequired(number, util)) { + return false; + } + return matcher.checkNumberGroupingIsValid( + number, candidate, util, new PhoneNumberMatcher.NumberGroupingChecker() { + @Override + public boolean checkGroups(PhoneNumberUtil util, PhoneNumber number, + StringBuilder normalizedCandidate, + String[] expectedNumberGroups) { + return PhoneNumberMatcher.allNumberGroupsAreExactlyPresent( + util, number, normalizedCandidate, expectedNumberGroups); + } + }); + } + }; + + /** Returns true if {@code number} is a verified number according to this leniency. */ + abstract boolean verify( + PhoneNumber number, + CharSequence candidate, + PhoneNumberUtil util, + PhoneNumberMatcher matcher); + } + + // A source of metadata for different regions. + private final MetadataSource metadataSource; + + // A mapping from a country calling code to the region codes which denote the region represented + // by that country calling code. In the case of multiple regions sharing a calling code, such as + // the NANPA regions, the one indicated with "isMainCountryForCode" in the metadata should be + // first. + private final Map> countryCallingCodeToRegionCodeMap; + + // An API for validation checking. + private final MatcherApi matcherApi = RegexBasedMatcher.create(); + + // The set of regions that share country calling code 1. + // There are roughly 26 regions. + // We set the initial capacity of the HashSet to 35 to offer a load factor of roughly 0.75. + private final Set nanpaRegions = new HashSet<>(35); + + // A cache for frequently used region-specific regular expressions. + // The initial capacity is set to 100 as this seems to be an optimal value for Android, based on + // performance measurements. + private final RegexCache regexCache = new RegexCache(100); + + // The set of regions the library supports. + // There are roughly 240 of them and we set the initial capacity of the HashSet to 320 to offer a + // load factor of roughly 0.75. + private final Set supportedRegions = new HashSet<>(320); + + // The set of country calling codes that map to the non-geo entity region ("001"). This set + // currently contains < 12 elements so the default capacity of 16 (load factor=0.75) is fine. + private final Set countryCodesForNonGeographicalRegion = new HashSet<>(); + + /** + * This class implements a singleton, the constructor is only visible to facilitate testing. + */ + // @VisibleForTesting + PhoneNumberUtil(MetadataSource metadataSource, + Map> countryCallingCodeToRegionCodeMap) { + this.metadataSource = metadataSource; + this.countryCallingCodeToRegionCodeMap = countryCallingCodeToRegionCodeMap; + for (Map.Entry> entry : countryCallingCodeToRegionCodeMap.entrySet()) { + List regionCodes = entry.getValue(); + // We can assume that if the country calling code maps to the non-geo entity region code then + // that's the only region code it maps to. + if (regionCodes.size() == 1 && REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCodes.get(0))) { + // This is the subset of all country codes that map to the non-geo entity region code. + countryCodesForNonGeographicalRegion.add(entry.getKey()); + } else { + // The supported regions set does not include the "001" non-geo entity region code. + supportedRegions.addAll(regionCodes); + } + } + // If the non-geo entity still got added to the set of supported regions it must be because + // there are entries that list the non-geo entity alongside normal regions (which is wrong). + // If we discover this, remove the non-geo entity from the set of supported regions and log. + if (supportedRegions.remove(REGION_CODE_FOR_NON_GEO_ENTITY)) { + logger.log(Level.WARNING, "invalid metadata (country calling code was mapped to the non-geo " + + "entity as well as specific region(s))"); + } + nanpaRegions.addAll(countryCallingCodeToRegionCodeMap.get(NANPA_COUNTRY_CODE)); + } + + /** + * Attempts to extract a possible number from the string passed in. This currently strips all + * leading characters that cannot be used to start a phone number. Characters that can be used to + * start a phone number are defined in the VALID_START_CHAR_PATTERN. If none of these characters + * are found in the number passed in, an empty string is returned. This function also attempts to + * strip off any alternative extensions or endings if two or more are present, such as in the case + * of: (530) 583-6985 x302/x2303. The second extension here makes this actually two phone numbers, + * (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second extension so that the first + * number is parsed correctly. + * + * @param number the string that might contain a phone number + * @return the number, stripped of any non-phone-number prefix (such as "Tel:") or an empty + * string if no character used to start phone numbers (such as + or any digit) is found in the + * number + */ + static CharSequence extractPossibleNumber(CharSequence number) { + Matcher m = VALID_START_CHAR_PATTERN.matcher(number); + if (m.find()) { + number = number.subSequence(m.start(), number.length()); + // Remove trailing non-alpha non-numerical characters. + Matcher trailingCharsMatcher = UNWANTED_END_CHAR_PATTERN.matcher(number); + if (trailingCharsMatcher.find()) { + number = number.subSequence(0, trailingCharsMatcher.start()); + } + // Check for extra numbers at the end. + Matcher secondNumber = SECOND_NUMBER_START_PATTERN.matcher(number); + if (secondNumber.find()) { + number = number.subSequence(0, secondNumber.start()); + } + return number; + } else { + return ""; + } + } + + /** + * Checks to see if the string of characters could possibly be a phone number at all. At the + * moment, checks to see that the string begins with at least 2 digits, ignoring any punctuation + * commonly found in phone numbers. + * This method does not require the number to be normalized in advance - but does assume that + * leading non-number symbols have been removed, such as by the method extractPossibleNumber. + * + * @param number string to be checked for viability as a phone number + * @return true if the number could be a phone number of some sort, otherwise false + */ + // @VisibleForTesting + static boolean isViablePhoneNumber(CharSequence number) { + if (number.length() < MIN_LENGTH_FOR_NSN) { + return false; + } + Matcher m = VALID_PHONE_NUMBER_PATTERN.matcher(number); + return m.matches(); + } + + /** + * Normalizes a string of characters representing a phone number. This performs the following + * conversions: + * - Punctuation is stripped. + * For ALPHA/VANITY numbers: + * - Letters are converted to their numeric representation on a telephone keypad. The keypad + * used here is the one defined in ITU Recommendation E.161. This is only done if there are 3 + * or more letters in the number, to lessen the risk that such letters are typos. + * For other numbers: + * - Wide-ascii digits are converted to normal ASCII (European) digits. + * - Arabic-Indic numerals are converted to European numerals. + * - Spurious alpha characters are stripped. + * + * @param number a StringBuilder of characters representing a phone number that will be + * normalized in place + */ + static StringBuilder normalize(StringBuilder number) { + Matcher m = VALID_ALPHA_PHONE_PATTERN.matcher(number); + if (m.matches()) { + number.replace(0, number.length(), normalizeHelper(number, ALPHA_PHONE_MAPPINGS, true)); + } else { + number.replace(0, number.length(), normalizeDigitsOnly(number)); + } + return number; + } + + /** + * Normalizes a string of characters representing a phone number. This converts wide-ascii and + * arabic-indic numerals to European numerals, and strips punctuation and alpha characters. + * + * @param number a string of characters representing a phone number + * @return the normalized string version of the phone number + */ + public static String normalizeDigitsOnly(CharSequence number) { + return normalizeDigits(number, false /* strip non-digits */).toString(); + } + + static StringBuilder normalizeDigits(CharSequence number, boolean keepNonDigits) { + StringBuilder normalizedDigits = new StringBuilder(number.length()); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + int digit = Character.digit(c, 10); + if (digit != -1) { + normalizedDigits.append(digit); + } else if (keepNonDigits) { + normalizedDigits.append(c); + } + } + return normalizedDigits; + } + + /** + * Normalizes a string of characters representing a phone number. This strips all characters which + * are not diallable on a mobile phone keypad (including all non-ASCII digits). + * + * @param number a string of characters representing a phone number + * @return the normalized string version of the phone number + */ + public static String normalizeDiallableCharsOnly(CharSequence number) { + return normalizeHelper(number, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */); + } + + /** + * Converts all alpha characters in a number to their respective digits on a keypad, but retains + * existing formatting. + */ + public static String convertAlphaCharactersInNumber(CharSequence number) { + return normalizeHelper(number, ALPHA_PHONE_MAPPINGS, false); + } + + /** + * Gets the length of the geographical area code from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into geographical area code and subscriber number. It + * works in such a way that the resultant subscriber number should be diallable, at least on some + * devices. An example of how this could be used: + * + *

{@code
+   * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+   * PhoneNumber number = phoneUtil.parse("16502530000", "US");
+   * String nationalSignificantNumber = phoneUtil.getNationalSignificantNumber(number);
+   * String areaCode;
+   * String subscriberNumber;
+   *
+   * int areaCodeLength = phoneUtil.getLengthOfGeographicalAreaCode(number);
+   * if (areaCodeLength > 0) {
+   *   areaCode = nationalSignificantNumber.substring(0, areaCodeLength);
+   *   subscriberNumber = nationalSignificantNumber.substring(areaCodeLength);
+   * } else {
+   *   areaCode = "";
+   *   subscriberNumber = nationalSignificantNumber;
+   * }
+   * }
+ * + * N.B.: area code is a very ambiguous concept, so the I18N team generally recommends against + * using it for most purposes, but recommends using the more general {@code national_number} + * instead. Read the following carefully before deciding to use this method: + *
    + *
  • geographical area codes change over time, and this method honors those changes; + * therefore, it doesn't guarantee the stability of the result it produces. + *
  • subscriber numbers may not be diallable from all devices (notably mobile devices, which + * typically requires the full national_number to be dialled in most regions). + *
  • most non-geographical numbers have no area codes, including numbers from non-geographical + * entities + *
  • some geographical numbers have no area codes. + *
+ * @param number the PhoneNumber object for which clients + * want to know the length of the area code + * @return the length of area code of the PhoneNumber object + * passed in + */ + public int getLengthOfGeographicalAreaCode(PhoneNumber number) { + PhoneMetadata metadata = getMetadataForRegion(getRegionCodeForNumber(number)); + if (metadata == null) { + return 0; + } + + PhoneNumberType type = getNumberType(number); + int countryCallingCode = number.getCountryCode(); + // If a country doesn't use a national prefix, and this number doesn't have an Italian leading + // zero, we assume it is a closed dialling plan with no area codes. + // Note:this is our general assumption, but there are exceptions which are tracked in + // COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES. + if (!metadata.hasNationalPrefix() && !number.isItalianLeadingZero() + && !COUNTRIES_WITHOUT_NATIONAL_PREFIX_WITH_AREA_CODES.contains(countryCallingCode)) { + return 0; + } + + if (type == PhoneNumberType.MOBILE + // Note this is a rough heuristic; it doesn't cover Indonesia well, for example, where area + // codes are present for some mobile phones but not for others. We have no better way of + // representing this in the metadata at this point. + && GEO_MOBILE_COUNTRIES_WITHOUT_MOBILE_AREA_CODES.contains(countryCallingCode)) { + return 0; + } + + if (!isNumberGeographical(type, countryCallingCode)) { + return 0; + } + + return getLengthOfNationalDestinationCode(number); + } + + /** + * Gets the length of the national destination code (NDC) from the + * PhoneNumber object passed in, so that clients could use it + * to split a national significant number into NDC and subscriber number. The NDC of a phone + * number is normally the first group of digit(s) right after the country calling code when the + * number is formatted in the international format, if there is a subscriber number part that + * follows. + * + * N.B.: similar to an area code, not all numbers have an NDC! + * + * An example of how this could be used: + * + *
{@code
+   * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+   * PhoneNumber number = phoneUtil.parse("18002530000", "US");
+   * String nationalSignificantNumber = phoneUtil.getNationalSignificantNumber(number);
+   * String nationalDestinationCode;
+   * String subscriberNumber;
+   *
+   * int nationalDestinationCodeLength = phoneUtil.getLengthOfNationalDestinationCode(number);
+   * if (nationalDestinationCodeLength > 0) {
+   *   nationalDestinationCode = nationalSignificantNumber.substring(0,
+   *       nationalDestinationCodeLength);
+   *   subscriberNumber = nationalSignificantNumber.substring(nationalDestinationCodeLength);
+   * } else {
+   *   nationalDestinationCode = "";
+   *   subscriberNumber = nationalSignificantNumber;
+   * }
+   * }
+ * + * Refer to the unittests to see the difference between this function and + * {@link #getLengthOfGeographicalAreaCode}. + * + * @param number the PhoneNumber object for which clients + * want to know the length of the NDC + * @return the length of NDC of the PhoneNumber object + * passed in, which could be zero + */ + public int getLengthOfNationalDestinationCode(PhoneNumber number) { + PhoneNumber copiedProto; + if (number.hasExtension()) { + // We don't want to alter the proto given to us, but we don't want to include the extension + // when we format it, so we copy it and clear the extension here. + copiedProto = new PhoneNumber(); + copiedProto.mergeFrom(number); + copiedProto.clearExtension(); + } else { + copiedProto = number; + } + + String nationalSignificantNumber = format(copiedProto, + PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL); + String[] numberGroups = NON_DIGITS_PATTERN.split(nationalSignificantNumber); + // The pattern will start with "+COUNTRY_CODE " so the first group will always be the empty + // string (before the + symbol) and the second group will be the country calling code. The third + // group will be area code if it is not the last group. + if (numberGroups.length <= 3) { + return 0; + } + + if (getNumberType(number) == PhoneNumberType.MOBILE) { + // For example Argentinian mobile numbers, when formatted in the international format, are in + // the form of +54 9 NDC XXXX.... As a result, we take the length of the third group (NDC) and + // add the length of the second group (which is the mobile token), which also forms part of + // the national significant number. This assumes that the mobile token is always formatted + // separately from the rest of the phone number. + String mobileToken = getCountryMobileToken(number.getCountryCode()); + if (!mobileToken.equals("")) { + return numberGroups[2].length() + numberGroups[3].length(); + } + } + return numberGroups[2].length(); + } + + /** + * Returns the mobile token for the provided country calling code if it has one, otherwise + * returns an empty string. A mobile token is a number inserted before the area code when dialing + * a mobile number from that country from abroad. + * + * @param countryCallingCode the country calling code for which we want the mobile token + * @return the mobile token, as a string, for the given country calling code + */ + public static String getCountryMobileToken(int countryCallingCode) { + if (MOBILE_TOKEN_MAPPINGS.containsKey(countryCallingCode)) { + return MOBILE_TOKEN_MAPPINGS.get(countryCallingCode); + } + return ""; + } + + /** + * Normalizes a string of characters representing a phone number by replacing all characters found + * in the accompanying map with the values therein, and stripping all other characters if + * removeNonMatches is true. + * + * @param number a string of characters representing a phone number + * @param normalizationReplacements a mapping of characters to what they should be replaced by in + * the normalized version of the phone number + * @param removeNonMatches indicates whether characters that are not able to be replaced should + * be stripped from the number. If this is false, they will be left unchanged in the number. + * @return the normalized string version of the phone number + */ + private static String normalizeHelper(CharSequence number, + Map normalizationReplacements, + boolean removeNonMatches) { + StringBuilder normalizedNumber = new StringBuilder(number.length()); + for (int i = 0; i < number.length(); i++) { + char character = number.charAt(i); + Character newDigit = normalizationReplacements.get(Character.toUpperCase(character)); + if (newDigit != null) { + normalizedNumber.append(newDigit); + } else if (!removeNonMatches) { + normalizedNumber.append(character); + } + // If neither of the above are true, we remove this character. + } + return normalizedNumber.toString(); + } + + /** + * Sets or resets the PhoneNumberUtil singleton instance. If set to null, the next call to + * {@code getInstance()} will load (and return) the default instance. + */ + // @VisibleForTesting + static synchronized void setInstance(PhoneNumberUtil util) { + instance = util; + } + + /** + * Returns all regions the library has metadata for. + * + * @return an unordered set of the two-letter region codes for every geographical region the + * library supports + */ + public Set getSupportedRegions() { + return Collections.unmodifiableSet(supportedRegions); + } + + /** + * Returns all global network calling codes the library has metadata for. + * + * @return an unordered set of the country calling codes for every non-geographical entity the + * library supports + */ + public Set getSupportedGlobalNetworkCallingCodes() { + return Collections.unmodifiableSet(countryCodesForNonGeographicalRegion); + } + + /** + * Returns all country calling codes the library has metadata for, covering both non-geographical + * entities (global network calling codes) and those used for geographical entities. This could be + * used to populate a drop-down box of country calling codes for a phone-number widget, for + * instance. + * + * @return an unordered set of the country calling codes for every geographical and + * non-geographical entity the library supports + */ + public Set getSupportedCallingCodes() { + return Collections.unmodifiableSet(countryCallingCodeToRegionCodeMap.keySet()); + } + + /** + * Returns true if there is any possible number data set for a particular PhoneNumberDesc. + */ + private static boolean descHasPossibleNumberData(PhoneNumberDesc desc) { + // If this is empty, it means numbers of this type inherit from the "general desc" -> the value + // "-1" means that no numbers exist for this type. + return desc.getPossibleLengthCount() != 1 || desc.getPossibleLength(0) != -1; + } + + // Note: descHasData must account for any of MetadataFilter's excludableChildFields potentially + // being absent from the metadata. It must check them all. For any changes in descHasData, ensure + // that all the excludableChildFields are still being checked. If your change is safe simply + // mention why during a review without needing to change MetadataFilter. + /** + * Returns true if there is any data set for a particular PhoneNumberDesc. + */ + private static boolean descHasData(PhoneNumberDesc desc) { + // Checking most properties since we don't know what's present, since a custom build may have + // stripped just one of them (e.g. liteBuild strips exampleNumber). We don't bother checking the + // possibleLengthsLocalOnly, since if this is the only thing that's present we don't really + // support the type at all: no type-specific methods will work with only this data. + return desc.hasExampleNumber() + || descHasPossibleNumberData(desc) + || desc.hasNationalNumberPattern(); + } + + /** + * Returns the types we have metadata for based on the PhoneMetadata object passed in, which must + * be non-null. + */ + private Set getSupportedTypesForMetadata(PhoneMetadata metadata) { + Set types = new TreeSet<>(); + for (PhoneNumberType type : PhoneNumberType.values()) { + if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE || type == PhoneNumberType.UNKNOWN) { + // Never return FIXED_LINE_OR_MOBILE (it is a convenience type, and represents that a + // particular number type can't be determined) or UNKNOWN (the non-type). + continue; + } + if (descHasData(getNumberDescByType(metadata, type))) { + types.add(type); + } + } + return Collections.unmodifiableSet(types); + } + + /** + * Returns the types for a given region which the library has metadata for. Will not include + * FIXED_LINE_OR_MOBILE (if numbers in this region could be classified as FIXED_LINE_OR_MOBILE, + * both FIXED_LINE and MOBILE would be present) and UNKNOWN. + * + * No types will be returned for invalid or unknown region codes. + */ + public Set getSupportedTypesForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return Collections.unmodifiableSet(new TreeSet()); + } + PhoneMetadata metadata = getMetadataForRegion(regionCode); + return getSupportedTypesForMetadata(metadata); + } + + /** + * Returns the types for a country-code belonging to a non-geographical entity which the library + * has metadata for. Will not include FIXED_LINE_OR_MOBILE (if numbers for this non-geographical + * entity could be classified as FIXED_LINE_OR_MOBILE, both FIXED_LINE and MOBILE would be + * present) and UNKNOWN. + * + * No types will be returned for country calling codes that do not map to a known non-geographical + * entity. + */ + public Set getSupportedTypesForNonGeoEntity(int countryCallingCode) { + PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode); + if (metadata == null) { + logger.log(Level.WARNING, "Unknown country calling code for a non-geographical entity " + + "provided: " + countryCallingCode); + return Collections.unmodifiableSet(new TreeSet()); + } + return getSupportedTypesForMetadata(metadata); + } + + /** + * Gets a {@link PhoneNumberUtil} instance to carry out international phone number formatting, + * parsing, or validation. The instance is loaded with all phone number metadata. + * + *

The {@link PhoneNumberUtil} is implemented as a singleton. Therefore, calling getInstance + * multiple times will only result in one instance being created. + * + * @return a PhoneNumberUtil instance + */ + public static synchronized PhoneNumberUtil getInstance() { + if (instance == null) { + MetadataLoader metadataLoader = DefaultMetadataDependenciesProvider.getInstance() + .getMetadataLoader(); + setInstance(createInstance(metadataLoader)); + } + return instance; + } + + /** + * Create a new {@link PhoneNumberUtil} instance to carry out international phone number + * formatting, parsing, or validation. The instance is loaded with all metadata by + * using the metadataLoader specified. + * + *

This method should only be used in the rare case in which you want to manage your own + * metadata loading. Calling this method multiple times is very expensive, as each time + * a new instance is created from scratch. When in doubt, use {@link #getInstance}. + * + * @param metadataLoader customized metadata loader. This should not be null + * @return a PhoneNumberUtil instance + */ + public static PhoneNumberUtil createInstance(MetadataLoader metadataLoader) { + if (metadataLoader == null) { + throw new IllegalArgumentException("metadataLoader could not be null."); + } + return createInstance(new MetadataSourceImpl( + DefaultMetadataDependenciesProvider.getInstance().getPhoneNumberMetadataFileNameProvider(), + metadataLoader, + DefaultMetadataDependenciesProvider.getInstance().getMetadataParser() + )); + } + + /** + * Create a new {@link PhoneNumberUtil} instance to carry out international phone number + * formatting, parsing, or validation. The instance is loaded with all metadata by + * using the metadataSource specified. + * + *

This method should only be used in the rare case in which you want to manage your own + * metadata loading. Calling this method multiple times is very expensive, as each time + * a new instance is created from scratch. When in doubt, use {@link #getInstance}. + * + * @param metadataSource customized metadata source. This should not be null + * @return a PhoneNumberUtil instance + */ + private static PhoneNumberUtil createInstance(MetadataSource metadataSource) { + if (metadataSource == null) { + throw new IllegalArgumentException("metadataSource could not be null."); + } + return new PhoneNumberUtil(metadataSource, + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap()); + } + + /** + * Helper function to check if the national prefix formatting rule has the first group only, i.e., + * does not start with the national prefix. + */ + static boolean formattingRuleHasFirstGroupOnly(String nationalPrefixFormattingRule) { + return nationalPrefixFormattingRule.length() == 0 + || FIRST_GROUP_ONLY_PREFIX_PATTERN.matcher(nationalPrefixFormattingRule).matches(); + } + + /** + * Tests whether a phone number has a geographical association. It checks if the number is + * associated with a certain region in the country to which it belongs. Note that this doesn't + * verify if the number is actually in use. + */ + public boolean isNumberGeographical(PhoneNumber phoneNumber) { + return isNumberGeographical(getNumberType(phoneNumber), phoneNumber.getCountryCode()); + } + + /** + * Overload of isNumberGeographical(PhoneNumber), since calculating the phone number type is + * expensive; if we have already done this, we don't want to do it again. + */ + public boolean isNumberGeographical(PhoneNumberType phoneNumberType, int countryCallingCode) { + return phoneNumberType == PhoneNumberType.FIXED_LINE + || phoneNumberType == PhoneNumberType.FIXED_LINE_OR_MOBILE + || (GEO_MOBILE_COUNTRIES.contains(countryCallingCode) + && phoneNumberType == PhoneNumberType.MOBILE); + } + + /** + * Helper function to check region code is not unknown or null. + */ + private boolean isValidRegionCode(String regionCode) { + return regionCode != null && supportedRegions.contains(regionCode); + } + + /** + * Helper function to check the country calling code is valid. + */ + private boolean hasValidCountryCallingCode(int countryCallingCode) { + return countryCallingCodeToRegionCodeMap.containsKey(countryCallingCode); + } + + /** + * Formats a phone number in the specified format using default rules. Note that this does not + * promise to produce a phone number that the user can dial from where they are - although we do + * format in either 'national' or 'international' format depending on what the client asks for, we + * do not currently support a more abbreviated format, such as for users in the same "area" who + * could potentially dial the number without area code. Note that if the phone number has a + * country calling code of 0 or an otherwise invalid country calling code, we cannot work out + * which formatting rules to apply so we return the national significant number with no formatting + * applied. + * + * @param number the phone number to be formatted + * @param numberFormat the format the phone number should be formatted into + * @return the formatted phone number + */ + public String format(PhoneNumber number, PhoneNumberFormat numberFormat) { + if (number.getNationalNumber() == 0) { + // Unparseable numbers that kept their raw input just use that. + // This is the only case where a number can be formatted as E164 without a + // leading '+' symbol (but the original number wasn't parseable anyway). + String rawInput = number.getRawInput(); + if (rawInput.length() > 0 || !number.hasCountryCode()) { + return rawInput; + } + } + StringBuilder formattedNumber = new StringBuilder(20); + format(number, numberFormat, formattedNumber); + return formattedNumber.toString(); + } + + /** + * Same as {@link #format(PhoneNumber, PhoneNumberFormat)}, but accepts a mutable StringBuilder as + * a parameter to decrease object creation when invoked many times. + */ + public void format(PhoneNumber number, PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + // Clear the StringBuilder first. + formattedNumber.setLength(0); + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + + if (numberFormat == PhoneNumberFormat.E164) { + // Early exit for E164 case (even if the country calling code is invalid) since no formatting + // of the national number needs to be applied. Extensions are not formatted. + formattedNumber.append(nationalSignificantNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, PhoneNumberFormat.E164, + formattedNumber); + return; + } + if (!hasValidCountryCallingCode(countryCallingCode)) { + formattedNumber.append(nationalSignificantNumber); + return; + } + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid (which means that the + // region code cannot be ZZ and must be one of our supported region codes). + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + formattedNumber.append(formatNsn(nationalSignificantNumber, metadata, numberFormat)); + maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber); + } + + /** + * Formats a phone number in the specified format using client-defined formatting rules. Note that + * if the phone number has a country calling code of zero or an otherwise invalid country calling + * code, we cannot work out things like whether there should be a national prefix applied, or how + * to format extensions, so we return the national significant number with no formatting applied. + * + * @param number the phone number to be formatted + * @param numberFormat the format the phone number should be formatted into + * @param userDefinedFormats formatting rules specified by clients + * @return the formatted phone number + */ + public String formatByPattern(PhoneNumber number, + PhoneNumberFormat numberFormat, + List userDefinedFormats) { + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + + StringBuilder formattedNumber = new StringBuilder(20); + + NumberFormat formattingPattern = + chooseFormattingPatternForNumber(userDefinedFormats, nationalSignificantNumber); + if (formattingPattern == null) { + // If no pattern above is matched, we format the number as a whole. + formattedNumber.append(nationalSignificantNumber); + } else { + NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); + // Before we do a replacement of the national prefix pattern $NP with the national prefix, we + // need to copy the rule so that subsequent replacements for different numbers have the + // appropriate national prefix. + numFormatCopy.mergeFrom(formattingPattern); + String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule(); + if (nationalPrefixFormattingRule.length() > 0) { + String nationalPrefix = metadata.getNationalPrefix(); + if (nationalPrefix.length() > 0) { + // Replace $NP with national prefix and $FG with the first group ($1). + nationalPrefixFormattingRule = + nationalPrefixFormattingRule.replace(NP_STRING, nationalPrefix); + nationalPrefixFormattingRule = nationalPrefixFormattingRule.replace(FG_STRING, "$1"); + numFormatCopy.setNationalPrefixFormattingRule(nationalPrefixFormattingRule); + } else { + // We don't want to have a rule for how to format the national prefix if there isn't one. + numFormatCopy.clearNationalPrefixFormattingRule(); + } + } + formattedNumber.append( + formatNsnUsingPattern(nationalSignificantNumber, numFormatCopy.build(), numberFormat)); + } + maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber); + return formattedNumber.toString(); + } + + /** + * Formats a phone number in national format for dialing using the carrier as specified in the + * {@code carrierCode}. The {@code carrierCode} will always be used regardless of whether the + * phone number already has a preferred domestic carrier code stored. If {@code carrierCode} + * contains an empty string, returns the number in national format without any carrier code. + * + * @param number the phone number to be formatted + * @param carrierCode the carrier selection code to be used + * @return the formatted phone number in national format for dialing using the carrier as + * specified in the {@code carrierCode} + */ + public String formatNationalNumberWithCarrierCode(PhoneNumber number, CharSequence carrierCode) { + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + + // Note getRegionCodeForCountryCode() is used because formatting information for regions which + // share a country calling code is contained by only one region for performance reasons. For + // example, for NANPA regions it will be contained in the metadata for US. + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + + StringBuilder formattedNumber = new StringBuilder(20); + formattedNumber.append(formatNsn(nationalSignificantNumber, metadata, + PhoneNumberFormat.NATIONAL, carrierCode)); + maybeAppendFormattedExtension(number, metadata, PhoneNumberFormat.NATIONAL, formattedNumber); + prefixNumberWithCountryCallingCode(countryCallingCode, PhoneNumberFormat.NATIONAL, + formattedNumber); + return formattedNumber.toString(); + } + + private PhoneMetadata getMetadataForRegionOrCallingCode( + int countryCallingCode, String regionCode) { + return REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode) + ? getMetadataForNonGeographicalRegion(countryCallingCode) + : getMetadataForRegion(regionCode); + } + + /** + * Formats a phone number in national format for dialing using the carrier as specified in the + * preferredDomesticCarrierCode field of the PhoneNumber object passed in. If that is missing, + * use the {@code fallbackCarrierCode} passed in instead. If there is no + * {@code preferredDomesticCarrierCode}, and the {@code fallbackCarrierCode} contains an empty + * string, return the number in national format without any carrier code. + * + *

Use {@link #formatNationalNumberWithCarrierCode} instead if the carrier code passed in + * should take precedence over the number's {@code preferredDomesticCarrierCode} when formatting. + * + * @param number the phone number to be formatted + * @param fallbackCarrierCode the carrier selection code to be used, if none is found in the + * phone number itself + * @return the formatted phone number in national format for dialing using the number's + * {@code preferredDomesticCarrierCode}, or the {@code fallbackCarrierCode} passed in if + * none is found + */ + public String formatNationalNumberWithPreferredCarrierCode(PhoneNumber number, + CharSequence fallbackCarrierCode) { + return formatNationalNumberWithCarrierCode(number, + // Historically, we set this to an empty string when parsing with raw input if none was + // found in the input string. However, this doesn't result in a number we can dial. For this + // reason, we treat the empty string the same as if it isn't set at all. + number.getPreferredDomesticCarrierCode().length() > 0 + ? number.getPreferredDomesticCarrierCode() + : fallbackCarrierCode); + } + + /** + * Returns a number formatted in such a way that it can be dialed from a mobile phone in a + * specific region. If the number cannot be reached from the region (e.g. some countries block + * toll-free numbers from being called outside of the country), the method returns an empty + * string. + * + * @param number the phone number to be formatted + * @param regionCallingFrom the region where the call is being placed + * @param withFormatting whether the number should be returned with formatting symbols, such as + * spaces and dashes. + * @return the formatted phone number + */ + public String formatNumberForMobileDialing(PhoneNumber number, String regionCallingFrom, + boolean withFormatting) { + int countryCallingCode = number.getCountryCode(); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return number.hasRawInput() ? number.getRawInput() : ""; + } + + String formattedNumber = ""; + // Clear the extension, as that part cannot normally be dialed together with the main number. + PhoneNumber numberNoExt = new PhoneNumber().mergeFrom(number).clearExtension(); + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + PhoneNumberType numberType = getNumberType(numberNoExt); + boolean isValidNumber = (numberType != PhoneNumberType.UNKNOWN); + if (regionCallingFrom.equals(regionCode)) { + boolean isFixedLineOrMobile = + (numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) + || (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE); + // Carrier codes may be needed in some countries. We handle this here. + if (regionCode.equals("BR") && isFixedLineOrMobile) { + // Historically, we set this to an empty string when parsing with raw input if none was + // found in the input string. However, this doesn't result in a number we can dial. For this + // reason, we treat the empty string the same as if it isn't set at all. + formattedNumber = numberNoExt.getPreferredDomesticCarrierCode().length() > 0 + ? formattedNumber = formatNationalNumberWithPreferredCarrierCode(numberNoExt, "") + // Brazilian fixed line and mobile numbers need to be dialed with a carrier code when + // called within Brazil. Without that, most of the carriers won't connect the call. + // Because of that, we return an empty string here. + : ""; + } else if (countryCallingCode == NANPA_COUNTRY_CODE) { + // For NANPA countries, we output international format for numbers that can be dialed + // internationally, since that always works, except for numbers which might potentially be + // short numbers, which are always dialled in national format. + PhoneMetadata regionMetadata = getMetadataForRegion(regionCallingFrom); + if (canBeInternationallyDialled(numberNoExt) + && testNumberLength(getNationalSignificantNumber(numberNoExt), regionMetadata) + != ValidationResult.TOO_SHORT) { + formattedNumber = format(numberNoExt, PhoneNumberFormat.INTERNATIONAL); + } else { + formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL); + } + } else { + // For non-geographical countries, and Mexican, Chilean, and Uzbek fixed line and mobile + // numbers, we output international format for numbers that can be dialed internationally as + // that always works. + if ((regionCode.equals(REGION_CODE_FOR_NON_GEO_ENTITY) + // MX fixed line and mobile numbers should always be formatted in international format, + // even when dialed within MX. For national format to work, a carrier code needs to be + // used, and the correct carrier code depends on if the caller and callee are from the + // same local area. It is trickier to get that to work correctly than using + // international format, which is tested to work fine on all carriers. + // CL fixed line numbers need the national prefix when dialing in the national format, + // but don't have it when used for display. The reverse is true for mobile numbers. As + // a result, we output them in the international format to make it work. + // UZ mobile and fixed-line numbers have to be formatted in international format or + // prefixed with special codes like 03, 04 (for fixed-line) and 05 (for mobile) for + // dialling successfully from mobile devices. As we do not have complete information on + // special codes and to be consistent with formatting across all phone types we return + // the number in international format here. + || ((regionCode.equals("MX") || regionCode.equals("CL") + || regionCode.equals("UZ")) && isFixedLineOrMobile)) + && canBeInternationallyDialled(numberNoExt)) { + formattedNumber = format(numberNoExt, PhoneNumberFormat.INTERNATIONAL); + } else { + formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL); + } + } + } else if (isValidNumber && canBeInternationallyDialled(numberNoExt)) { + // We assume that short numbers are not diallable from outside their region, so if a number + // is not a valid regular length phone number, we treat it as if it cannot be internationally + // dialled. + return withFormatting ? format(numberNoExt, PhoneNumberFormat.INTERNATIONAL) + : format(numberNoExt, PhoneNumberFormat.E164); + } + return withFormatting ? formattedNumber + : normalizeDiallableCharsOnly(formattedNumber); + } + + /** + * Formats a phone number for out-of-country dialing purposes. If no regionCallingFrom is + * supplied, we format the number in its INTERNATIONAL format. If the country calling code is the + * same as that of the region where the number is from, then NATIONAL formatting will be applied. + * + *

If the number itself has a country calling code of zero or an otherwise invalid country + * calling code, then we return the number with no formatting applied. + * + *

Note this function takes care of the case for calling inside of NANPA and between Russia and + * Kazakhstan (who share the same country calling code). In those cases, no international prefix + * is used. For regions which have multiple international prefixes, the number in its + * INTERNATIONAL format will be returned instead. + * + * @param number the phone number to be formatted + * @param regionCallingFrom the region where the call is being placed + * @return the formatted phone number + */ + public String formatOutOfCountryCallingNumber(PhoneNumber number, + String regionCallingFrom) { + if (!isValidRegionCode(regionCallingFrom)) { + logger.log(Level.WARNING, + "Trying to format number from invalid region " + + regionCallingFrom + + ". International formatting applied."); + return format(number, PhoneNumberFormat.INTERNATIONAL); + } + int countryCallingCode = number.getCountryCode(); + String nationalSignificantNumber = getNationalSignificantNumber(number); + if (!hasValidCountryCallingCode(countryCallingCode)) { + return nationalSignificantNumber; + } + if (countryCallingCode == NANPA_COUNTRY_CODE) { + if (isNANPACountry(regionCallingFrom)) { + // For NANPA regions, return the national format for these regions but prefix it with the + // country calling code. + return countryCallingCode + " " + format(number, PhoneNumberFormat.NATIONAL); + } + } else if (countryCallingCode == getCountryCodeForValidRegion(regionCallingFrom)) { + // If regions share a country calling code, the country calling code need not be dialled. + // This also applies when dialling within a region, so this if clause covers both these cases. + // Technically this is the case for dialling from La Reunion to other overseas departments of + // France (French Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover this + // edge case for now and for those cases return the version including country calling code. + // Details here: http://www.petitfute.com/voyage/225-info-pratiques-reunion + return format(number, PhoneNumberFormat.NATIONAL); + } + // Metadata cannot be null because we checked 'isValidRegionCode()' above. + PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom); + String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix(); + + // In general, if there is a preferred international prefix, use that. Otherwise, for regions + // that have multiple international prefixes, the international format of the number is + // returned since we would not know which one to use. + String internationalPrefixForFormatting = ""; + if (metadataForRegionCallingFrom.hasPreferredInternationalPrefix()) { + internationalPrefixForFormatting = + metadataForRegionCallingFrom.getPreferredInternationalPrefix(); + } else if (SINGLE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches()) { + internationalPrefixForFormatting = internationalPrefix; + } + + String regionCode = getRegionCodeForCountryCode(countryCallingCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadataForRegion = + getMetadataForRegionOrCallingCode(countryCallingCode, regionCode); + String formattedNationalNumber = + formatNsn(nationalSignificantNumber, metadataForRegion, PhoneNumberFormat.INTERNATIONAL); + StringBuilder formattedNumber = new StringBuilder(formattedNationalNumber); + maybeAppendFormattedExtension(number, metadataForRegion, PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + if (internationalPrefixForFormatting.length() > 0) { + formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, " ") + .insert(0, internationalPrefixForFormatting); + } else { + prefixNumberWithCountryCallingCode(countryCallingCode, + PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + } + return formattedNumber.toString(); + } + + /** + * Formats a phone number using the original phone number format (e.g. INTERNATIONAL or NATIONAL) + * that the number is parsed from, provided that the number has been parsed with {@link + * parseAndKeepRawInput}. Otherwise the number will be formatted in NATIONAL format. + * + *

The original format is embedded in the country_code_source field of the PhoneNumber object + * passed in, which is only set when parsing keeps the raw input. When we don't have a formatting + * pattern for the number, the method falls back to returning the raw input. + * + *

Note this method guarantees no digit will be inserted, removed or modified as a result of + * formatting. + * + * @param number the phone number that needs to be formatted in its original number format + * @param regionCallingFrom the region whose IDD needs to be prefixed if the original number has + * one + * @return the formatted phone number in its original number format + */ + public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) { + NumberFormat formatRule = chooseFormattingPatternForNumber(number); + if (number.hasRawInput() && formatRule == null) { + // We check if we have the formatting pattern because without that, we might format the number + // as a group without national prefix. + return number.getRawInput(); + } + if (!number.hasCountryCodeSource()) { + return format(number, PhoneNumberFormat.NATIONAL); + } + String formattedNumber; + switch (number.getCountryCodeSource()) { + case FROM_NUMBER_WITH_PLUS_SIGN: + formattedNumber = format(number, PhoneNumberFormat.INTERNATIONAL); + break; + case FROM_NUMBER_WITH_IDD: + formattedNumber = formatOutOfCountryCallingNumber(number, regionCallingFrom); + break; + case FROM_NUMBER_WITHOUT_PLUS_SIGN: + formattedNumber = format(number, PhoneNumberFormat.INTERNATIONAL).substring(1); + break; + case FROM_DEFAULT_COUNTRY: + // Fall-through to default case. + default: + String regionCode = getRegionCodeForCountryCode(number.getCountryCode()); + // We strip non-digits from the NDD here, and from the raw input later, so that we can + // compare them easily. + String nationalPrefix = getNddPrefixForRegion(regionCode, true /* strip non-digits */); + String nationalFormat = format(number, PhoneNumberFormat.NATIONAL); + if (nationalPrefix == null || nationalPrefix.length() == 0) { + // If the region doesn't have a national prefix at all, we can safely return the national + // format without worrying about a national prefix being added. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we check if the original number was entered with a national prefix. + if (rawInputContainsNationalPrefix( + number.getRawInput(), nationalPrefix, regionCode)) { + // If so, we can safely return the national format. + formattedNumber = nationalFormat; + break; + } + // The format rule could still be null here if the national number was 0 and there was no + // raw input (this should not be possible for numbers generated by the phonenumber library + // as they would also not have a country calling code and we would have exited earlier). + if (formatRule == null) { + formattedNumber = nationalFormat; + break; + } + // When the format we apply to this number doesn't contain national prefix, we can just + // return the national format. + // TODO: Refactor the code below with the code in + // isNationalPrefixPresentIfRequired. + String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule(); + // We assume that the first-group symbol will never be _before_ the national prefix. + int indexOfFirstGroup = candidateNationalPrefixRule.indexOf("$1"); + if (indexOfFirstGroup <= 0) { + formattedNumber = nationalFormat; + break; + } + candidateNationalPrefixRule = + candidateNationalPrefixRule.substring(0, indexOfFirstGroup); + candidateNationalPrefixRule = normalizeDigitsOnly(candidateNationalPrefixRule); + if (candidateNationalPrefixRule.length() == 0) { + // National prefix not used when formatting this number. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we need to remove the national prefix from our output. + NumberFormat.Builder numFormatCopy = NumberFormat.newBuilder(); + numFormatCopy.mergeFrom(formatRule); + numFormatCopy.clearNationalPrefixFormattingRule(); + List numberFormats = new ArrayList<>(1); + numberFormats.add(numFormatCopy.build()); + formattedNumber = formatByPattern(number, PhoneNumberFormat.NATIONAL, numberFormats); + break; + } + String rawInput = number.getRawInput(); + // If no digit is inserted/removed/modified as a result of our formatting, we return the + // formatted phone number; otherwise we return the raw input the user entered. + if (formattedNumber != null && rawInput.length() > 0) { + String normalizedFormattedNumber = normalizeDiallableCharsOnly(formattedNumber); + String normalizedRawInput = normalizeDiallableCharsOnly(rawInput); + if (!normalizedFormattedNumber.equals(normalizedRawInput)) { + formattedNumber = rawInput; + } + } + return formattedNumber; + } + + // Check if rawInput, which is assumed to be in the national format, has a national prefix. The + // national prefix is assumed to be in digits-only form. + private boolean rawInputContainsNationalPrefix(String rawInput, String nationalPrefix, + String regionCode) { + String normalizedNationalNumber = normalizeDigitsOnly(rawInput); + if (normalizedNationalNumber.startsWith(nationalPrefix)) { + try { + // Some Japanese numbers (e.g. 00777123) might be mistaken to contain the national prefix + // when written without it (e.g. 0777123) if we just do prefix matching. To tackle that, we + // check the validity of the number if the assumed national prefix is removed (777123 won't + // be valid in Japan). + return isValidNumber( + parse(normalizedNationalNumber.substring(nationalPrefix.length()), regionCode)); + } catch (NumberParseException e) { + return false; + } + } + return false; + } + + private NumberFormat chooseFormattingPatternForNumber(PhoneNumber number) { + int countryCallingCode = number.getCountryCode(); + String phoneNumberRegion = getRegionCodeForCountryCode(countryCallingCode); + PhoneMetadata metadata = + getMetadataForRegionOrCallingCode(countryCallingCode, phoneNumberRegion); + if (metadata == null) { + return null; + } + String nationalNumber = getNationalSignificantNumber(number); + return chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber); + } + + NumberFormat chooseFormattingPatternForNumber(List availableFormats, + String nationalNumber) { + for (NumberFormat numFormat : availableFormats) { + int size = numFormat.getLeadingDigitsPatternCount(); + if (size == 0 || regexCache.getPatternForRegex( + // We always use the last leading_digits_pattern, as it is the most detailed. + numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) { + Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber); + if (m.matches()) { + return numFormat; + } + } + } + return null; + } + + /** + * Formats a phone number for out-of-country dialing purposes. + * + * Note that in this version, if the number was entered originally using alpha characters and + * this version of the number is stored in raw_input, this representation of the number will be + * used rather than the digit representation. Grouping information, as specified by characters + * such as "-" and " ", will be retained. + * + *

Caveats:

+ *
    + *
  • This will not produce good results if the country calling code is both present in the raw + * input _and_ is the start of the national number. This is not a problem in the regions + * which typically use alpha numbers. + *
  • This will also not produce good results if the raw input has any grouping information + * within the first three digits of the national number, and if the function needs to strip + * preceding digits/words in the raw input before these digits. Normally people group the + * first three digits together so this is not a huge problem - and will be fixed if it + * proves to be so. + *
+ * + * @param number the phone number that needs to be formatted + * @param regionCallingFrom the region where the call is being placed + * @return the formatted phone number + */ + public String formatOutOfCountryKeepingAlphaChars(PhoneNumber number, + String regionCallingFrom) { + String rawInput = number.getRawInput(); + // If there is no raw input, then we can't keep alpha characters because there aren't any. + // In this case, we return formatOutOfCountryCallingNumber. + if (rawInput.length() == 0) { + return formatOutOfCountryCallingNumber(number, regionCallingFrom); + } + int countryCode = number.getCountryCode(); + if (!hasValidCountryCallingCode(countryCode)) { + return rawInput; + } + // Strip any prefix such as country calling code, IDD, that was present. We do this by comparing + // the number in raw_input with the parsed number. + // To do this, first we normalize punctuation. We retain number grouping symbols such as " " + // only. + rawInput = normalizeHelper(rawInput, ALL_PLUS_NUMBER_GROUPING_SYMBOLS, true); + // Now we trim everything before the first three digits in the parsed number. We choose three + // because all valid alpha numbers have 3 digits at the start - if it does not, then we don't + // trim anything at all. Similarly, if the national number was less than three digits, we don't + // trim anything at all. + String nationalNumber = getNationalSignificantNumber(number); + if (nationalNumber.length() > 3) { + int firstNationalNumberDigit = rawInput.indexOf(nationalNumber.substring(0, 3)); + if (firstNationalNumberDigit != -1) { + rawInput = rawInput.substring(firstNationalNumberDigit); + } + } + PhoneMetadata metadataForRegionCallingFrom = getMetadataForRegion(regionCallingFrom); + if (countryCode == NANPA_COUNTRY_CODE) { + if (isNANPACountry(regionCallingFrom)) { + return countryCode + " " + rawInput; + } + } else if (metadataForRegionCallingFrom != null + && countryCode == getCountryCodeForValidRegion(regionCallingFrom)) { + NumberFormat formattingPattern = + chooseFormattingPatternForNumber(metadataForRegionCallingFrom.getNumberFormatList(), + nationalNumber); + if (formattingPattern == null) { + // If no pattern above is matched, we format the original input. + return rawInput; + } + NumberFormat.Builder newFormat = NumberFormat.newBuilder(); + newFormat.mergeFrom(formattingPattern); + // The first group is the first group of digits that the user wrote together. + newFormat.setPattern("(\\d+)(.*)"); + // Here we just concatenate them back together after the national prefix has been fixed. + newFormat.setFormat("$1$2"); + // Now we format using this pattern instead of the default pattern, but with the national + // prefix prefixed if necessary. + // This will not work in the cases where the pattern (and not the leading digits) decide + // whether a national prefix needs to be used, since we have overridden the pattern to match + // anything, but that is not the case in the metadata to date. + return formatNsnUsingPattern(rawInput, newFormat.build(), PhoneNumberFormat.NATIONAL); + } + String internationalPrefixForFormatting = ""; + // If an unsupported region-calling-from is entered, or a country with multiple international + // prefixes, the international format of the number is returned, unless there is a preferred + // international prefix. + if (metadataForRegionCallingFrom != null) { + String internationalPrefix = metadataForRegionCallingFrom.getInternationalPrefix(); + internationalPrefixForFormatting = + SINGLE_INTERNATIONAL_PREFIX.matcher(internationalPrefix).matches() + ? internationalPrefix + : metadataForRegionCallingFrom.getPreferredInternationalPrefix(); + } + StringBuilder formattedNumber = new StringBuilder(rawInput); + String regionCode = getRegionCodeForCountryCode(countryCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadataForRegion = getMetadataForRegionOrCallingCode(countryCode, regionCode); + // Strip any extension + maybeStripExtension(formattedNumber); + // Append the formatted extension + maybeAppendFormattedExtension( + number, metadataForRegion, PhoneNumberFormat.INTERNATIONAL, formattedNumber); + if (internationalPrefixForFormatting.length() > 0) { + formattedNumber.insert(0, " ").insert(0, countryCode).insert(0, " ") + .insert(0, internationalPrefixForFormatting); + } else { + // Invalid region entered as country-calling-from (so no metadata was found for it) or the + // region chosen has multiple international dialling prefixes. + if (!isValidRegionCode(regionCallingFrom)) { + logger.log(Level.WARNING, + "Trying to format number from invalid region " + + regionCallingFrom + + ". International formatting applied."); + } + prefixNumberWithCountryCallingCode(countryCode, + PhoneNumberFormat.INTERNATIONAL, + formattedNumber); + } + return formattedNumber.toString(); + } + + /** + * Gets the national significant number of a phone number. Note a national significant number + * doesn't contain a national prefix or any formatting. + * + * @param number the phone number for which the national significant number is needed + * @return the national significant number of the PhoneNumber object passed in + */ + public String getNationalSignificantNumber(PhoneNumber number) { + // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix. + StringBuilder nationalNumber = new StringBuilder(); + if (number.isItalianLeadingZero() && number.getNumberOfLeadingZeros() > 0) { + char[] zeros = new char[number.getNumberOfLeadingZeros()]; + Arrays.fill(zeros, '0'); + nationalNumber.append(new String(zeros)); + } + nationalNumber.append(number.getNationalNumber()); + return nationalNumber.toString(); + } + + /** + * A helper function that is used by format and formatByPattern. + */ + private void prefixNumberWithCountryCallingCode(int countryCallingCode, + PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + switch (numberFormat) { + case E164: + formattedNumber.insert(0, countryCallingCode).insert(0, PLUS_SIGN); + return; + case INTERNATIONAL: + formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, PLUS_SIGN); + return; + case RFC3966: + formattedNumber.insert(0, "-").insert(0, countryCallingCode).insert(0, PLUS_SIGN) + .insert(0, RFC3966_PREFIX); + return; + case NATIONAL: + default: + return; + } + } + + // Simple wrapper of formatNsn for the common case of no carrier code. + private String formatNsn(String number, PhoneMetadata metadata, PhoneNumberFormat numberFormat) { + return formatNsn(number, metadata, numberFormat, null); + } + + // Note in some regions, the national number can be written in two completely different ways + // depending on whether it forms part of the NATIONAL format or INTERNATIONAL format. The + // numberFormat parameter here is used to specify which format to use for those cases. If a + // carrierCode is specified, this will be inserted into the formatted string to replace $CC. + private String formatNsn(String number, + PhoneMetadata metadata, + PhoneNumberFormat numberFormat, + CharSequence carrierCode) { + List intlNumberFormats = metadata.getIntlNumberFormatList(); + // When the intlNumberFormats exists, we use that to format national number for the + // INTERNATIONAL format instead of using the numberDesc.numberFormats. + List availableFormats = + (intlNumberFormats.size() == 0 || numberFormat == PhoneNumberFormat.NATIONAL) + ? metadata.getNumberFormatList() + : metadata.getIntlNumberFormatList(); + NumberFormat formattingPattern = chooseFormattingPatternForNumber(availableFormats, number); + return (formattingPattern == null) + ? number + : formatNsnUsingPattern(number, formattingPattern, numberFormat, carrierCode); + } + + // Simple wrapper of formatNsnUsingPattern for the common case of no carrier code. + String formatNsnUsingPattern(String nationalNumber, + NumberFormat formattingPattern, + PhoneNumberFormat numberFormat) { + return formatNsnUsingPattern(nationalNumber, formattingPattern, numberFormat, null); + } + + // Note that carrierCode is optional - if null or an empty string, no carrier code replacement + // will take place. + private String formatNsnUsingPattern(String nationalNumber, + NumberFormat formattingPattern, + PhoneNumberFormat numberFormat, + CharSequence carrierCode) { + String numberFormatRule = formattingPattern.getFormat(); + Matcher m = + regexCache.getPatternForRegex(formattingPattern.getPattern()).matcher(nationalNumber); + String formattedNationalNumber = ""; + if (numberFormat == PhoneNumberFormat.NATIONAL + && carrierCode != null && carrierCode.length() > 0 + && formattingPattern.getDomesticCarrierCodeFormattingRule().length() > 0) { + // Replace the $CC in the formatting rule with the desired carrier code. + String carrierCodeFormattingRule = formattingPattern.getDomesticCarrierCodeFormattingRule(); + carrierCodeFormattingRule = carrierCodeFormattingRule.replace(CC_STRING, carrierCode); + // Now replace the $FG in the formatting rule with the first group and the carrier code + // combined in the appropriate way. + numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule) + .replaceFirst(carrierCodeFormattingRule); + formattedNationalNumber = m.replaceAll(numberFormatRule); + } else { + // Use the national prefix formatting rule instead. + String nationalPrefixFormattingRule = formattingPattern.getNationalPrefixFormattingRule(); + if (numberFormat == PhoneNumberFormat.NATIONAL + && nationalPrefixFormattingRule != null + && nationalPrefixFormattingRule.length() > 0) { + Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule); + formattedNationalNumber = + m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule)); + } else { + formattedNationalNumber = m.replaceAll(numberFormatRule); + } + } + if (numberFormat == PhoneNumberFormat.RFC3966) { + // Strip any leading punctuation. + Matcher matcher = SEPARATOR_PATTERN.matcher(formattedNationalNumber); + if (matcher.lookingAt()) { + formattedNationalNumber = matcher.replaceFirst(""); + } + // Replace the rest with a dash between each number group. + formattedNationalNumber = matcher.reset(formattedNationalNumber).replaceAll("-"); + } + return formattedNationalNumber; + } + + /** + * Gets a valid number for the specified region. + * + * @param regionCode the region for which an example number is needed + * @return a valid fixed-line number for the specified region. Returns null when the metadata + * does not contain such information, or the region 001 is passed in. For 001 (representing + * non-geographical numbers), call {@link #getExampleNumberForNonGeoEntity} instead. + */ + public PhoneNumber getExampleNumber(String regionCode) { + return getExampleNumberForType(regionCode, PhoneNumberType.FIXED_LINE); + } + + /** + * Gets an invalid number for the specified region. This is useful for unit-testing purposes, + * where you want to test what will happen with an invalid number. Note that the number that is + * returned will always be able to be parsed and will have the correct country code. It may also + * be a valid *short* number/code for this region. Validity checking such numbers is handled with + * {@link com.google.i18n.phonenumbers.ShortNumberInfo}. + * + * @param regionCode the region for which an example number is needed + * @return an invalid number for the specified region. Returns null when an unsupported region or + * the region 001 (Earth) is passed in. + */ + public PhoneNumber getInvalidExampleNumber(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return null; + } + // We start off with a valid fixed-line number since every country supports this. Alternatively + // we could start with a different number type, since fixed-line numbers typically have a wide + // breadth of valid number lengths and we may have to make it very short before we get an + // invalid number. + PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), + PhoneNumberType.FIXED_LINE); + if (!desc.hasExampleNumber()) { + // This shouldn't happen; we have a test for this. + return null; + } + String exampleNumber = desc.getExampleNumber(); + // Try and make the number invalid. We do this by changing the length. We try reducing the + // length of the number, since currently no region has a number that is the same length as + // MIN_LENGTH_FOR_NSN. This is probably quicker than making the number longer, which is another + // alternative. We could also use the possible number pattern to extract the possible lengths of + // the number to make this faster, but this method is only for unit-testing so simplicity is + // preferred to performance. We don't want to return a number that can't be parsed, so we check + // the number is long enough. We try all possible lengths because phone number plans often have + // overlapping prefixes so the number 123456 might be valid as a fixed-line number, and 12345 as + // a mobile number. It would be faster to loop in a different order, but we prefer numbers that + // look closer to real numbers (and it gives us a variety of different lengths for the resulting + // phone numbers - otherwise they would all be MIN_LENGTH_FOR_NSN digits long.) + for (int phoneNumberLength = exampleNumber.length() - 1; + phoneNumberLength >= MIN_LENGTH_FOR_NSN; + phoneNumberLength--) { + String numberToTry = exampleNumber.substring(0, phoneNumberLength); + try { + PhoneNumber possiblyValidNumber = parse(numberToTry, regionCode); + if (!isValidNumber(possiblyValidNumber)) { + return possiblyValidNumber; + } + } catch (NumberParseException e) { + // Shouldn't happen: we have already checked the length, we know example numbers have + // only valid digits, and we know the region code is fine. + } + } + // We have a test to check that this doesn't happen for any of our supported regions. + return null; + } + + /** + * Gets a valid number for the specified region and number type. + * + * @param regionCode the region for which an example number is needed + * @param type the type of number that is needed + * @return a valid number for the specified region and type. Returns null when the metadata + * does not contain such information or if an invalid region or region 001 was entered. + * For 001 (representing non-geographical numbers), call + * {@link #getExampleNumberForNonGeoEntity} instead. + */ + public PhoneNumber getExampleNumberForType(String regionCode, PhoneNumberType type) { + // Check the region code is valid. + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return null; + } + PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type); + try { + if (desc.hasExampleNumber()) { + return parse(desc.getExampleNumber(), regionCode); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + return null; + } + + /** + * Gets a valid number for the specified number type (it may belong to any country). + * + * @param type the type of number that is needed + * @return a valid number for the specified type. Returns null when the metadata + * does not contain such information. This should only happen when no numbers of this type are + * allocated anywhere in the world anymore. + */ + public PhoneNumber getExampleNumberForType(PhoneNumberType type) { + for (String regionCode : getSupportedRegions()) { + PhoneNumber exampleNumber = getExampleNumberForType(regionCode, type); + if (exampleNumber != null) { + return exampleNumber; + } + } + // If there wasn't an example number for a region, try the non-geographical entities. + for (int countryCallingCode : getSupportedGlobalNetworkCallingCodes()) { + PhoneNumberDesc desc = getNumberDescByType( + getMetadataForNonGeographicalRegion(countryCallingCode), type); + try { + if (desc.hasExampleNumber()) { + return parse("+" + countryCallingCode + desc.getExampleNumber(), UNKNOWN_REGION); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + } + // There are no example numbers of this type for any country in the library. + return null; + } + + /** + * Gets a valid number for the specified country calling code for a non-geographical entity. + * + * @param countryCallingCode the country calling code for a non-geographical entity + * @return a valid number for the non-geographical entity. Returns null when the metadata + * does not contain such information, or the country calling code passed in does not belong + * to a non-geographical entity. + */ + public PhoneNumber getExampleNumberForNonGeoEntity(int countryCallingCode) { + PhoneMetadata metadata = getMetadataForNonGeographicalRegion(countryCallingCode); + if (metadata != null) { + // For geographical entities, fixed-line data is always present. However, for non-geographical + // entities, this is not the case, so we have to go through different types to find the + // example number. We don't check fixed-line or personal number since they aren't used by + // non-geographical entities (if this changes, a unit-test will catch this.) + for (PhoneNumberDesc desc : Arrays.asList(metadata.getMobile(), metadata.getTollFree(), + metadata.getSharedCost(), metadata.getVoip(), metadata.getVoicemail(), + metadata.getUan(), metadata.getPremiumRate())) { + try { + if (desc != null && desc.hasExampleNumber()) { + return parse("+" + countryCallingCode + desc.getExampleNumber(), UNKNOWN_REGION); + } + } catch (NumberParseException e) { + logger.log(Level.SEVERE, e.toString()); + } + } + } else { + logger.log(Level.WARNING, + "Invalid or unknown country calling code provided: " + countryCallingCode); + } + return null; + } + + /** + * Appends the formatted extension of a phone number to formattedNumber, if the phone number had + * an extension specified. + */ + private void maybeAppendFormattedExtension(PhoneNumber number, PhoneMetadata metadata, + PhoneNumberFormat numberFormat, + StringBuilder formattedNumber) { + if (number.hasExtension() && number.getExtension().length() > 0) { + if (numberFormat == PhoneNumberFormat.RFC3966) { + formattedNumber.append(RFC3966_EXTN_PREFIX).append(number.getExtension()); + } else { + if (metadata.hasPreferredExtnPrefix()) { + formattedNumber.append(metadata.getPreferredExtnPrefix()).append(number.getExtension()); + } else { + formattedNumber.append(DEFAULT_EXTN_PREFIX).append(number.getExtension()); + } + } + } + } + + PhoneNumberDesc getNumberDescByType(PhoneMetadata metadata, PhoneNumberType type) { + switch (type) { + case PREMIUM_RATE: + return metadata.getPremiumRate(); + case TOLL_FREE: + return metadata.getTollFree(); + case MOBILE: + return metadata.getMobile(); + case FIXED_LINE: + case FIXED_LINE_OR_MOBILE: + return metadata.getFixedLine(); + case SHARED_COST: + return metadata.getSharedCost(); + case VOIP: + return metadata.getVoip(); + case PERSONAL_NUMBER: + return metadata.getPersonalNumber(); + case PAGER: + return metadata.getPager(); + case UAN: + return metadata.getUan(); + case VOICEMAIL: + return metadata.getVoicemail(); + default: + return metadata.getGeneralDesc(); + } + } + + /** + * Gets the type of a valid phone number. + * + * @param number the phone number that we want to know the type + * @return the type of the phone number, or UNKNOWN if it is invalid + */ + public PhoneNumberType getNumberType(PhoneNumber number) { + String regionCode = getRegionCodeForNumber(number); + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(number.getCountryCode(), regionCode); + if (metadata == null) { + return PhoneNumberType.UNKNOWN; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return getNumberTypeHelper(nationalSignificantNumber, metadata); + } + + private PhoneNumberType getNumberTypeHelper(String nationalNumber, PhoneMetadata metadata) { + if (!isNumberMatchingDesc(nationalNumber, metadata.getGeneralDesc())) { + return PhoneNumberType.UNKNOWN; + } + + if (isNumberMatchingDesc(nationalNumber, metadata.getPremiumRate())) { + return PhoneNumberType.PREMIUM_RATE; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getTollFree())) { + return PhoneNumberType.TOLL_FREE; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getSharedCost())) { + return PhoneNumberType.SHARED_COST; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getVoip())) { + return PhoneNumberType.VOIP; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getPersonalNumber())) { + return PhoneNumberType.PERSONAL_NUMBER; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getPager())) { + return PhoneNumberType.PAGER; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getUan())) { + return PhoneNumberType.UAN; + } + if (isNumberMatchingDesc(nationalNumber, metadata.getVoicemail())) { + return PhoneNumberType.VOICEMAIL; + } + + boolean isFixedLine = isNumberMatchingDesc(nationalNumber, metadata.getFixedLine()); + if (isFixedLine) { + if (metadata.getSameMobileAndFixedLinePattern()) { + return PhoneNumberType.FIXED_LINE_OR_MOBILE; + } else if (isNumberMatchingDesc(nationalNumber, metadata.getMobile())) { + return PhoneNumberType.FIXED_LINE_OR_MOBILE; + } + return PhoneNumberType.FIXED_LINE; + } + // Otherwise, test to see if the number is mobile. Only do this if certain that the patterns for + // mobile and fixed line aren't the same. + if (!metadata.getSameMobileAndFixedLinePattern() + && isNumberMatchingDesc(nationalNumber, metadata.getMobile())) { + return PhoneNumberType.MOBILE; + } + return PhoneNumberType.UNKNOWN; + } + + /** + * Returns the metadata for the given region code or {@code null} if the region code is invalid or + * unknown. + * + * @throws MissingMetadataException if the region code is valid, but metadata cannot be found. + */ + PhoneMetadata getMetadataForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + return null; + } + PhoneMetadata phoneMetadata = metadataSource.getMetadataForRegion(regionCode); + ensureMetadataIsNonNull(phoneMetadata, "Missing metadata for region code " + regionCode); + return phoneMetadata; + } + + /** + * Returns the metadata for the given country calling code or {@code null} if the country calling + * code is invalid or unknown. + * + * @throws MissingMetadataException if the country calling code is valid, but metadata cannot be + * found. + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (!countryCodesForNonGeographicalRegion.contains(countryCallingCode)) { + return null; + } + PhoneMetadata phoneMetadata = metadataSource.getMetadataForNonGeographicalRegion( + countryCallingCode); + ensureMetadataIsNonNull(phoneMetadata, + "Missing metadata for country code " + countryCallingCode); + return phoneMetadata; + } + + private static void ensureMetadataIsNonNull(PhoneMetadata phoneMetadata, String message) { + if (phoneMetadata == null) { + throw new MissingMetadataException(message); + } + } + + boolean isNumberMatchingDesc(String nationalNumber, PhoneNumberDesc numberDesc) { + // Check if any possible number lengths are present; if so, we use them to avoid checking the + // validation pattern if they don't match. If they are absent, this means they match the general + // description, which we have already checked before checking a specific number type. + int actualLength = nationalNumber.length(); + List possibleLengths = numberDesc.getPossibleLengthList(); + if (possibleLengths.size() > 0 && !possibleLengths.contains(actualLength)) { + return false; + } + return matcherApi.matchNationalNumber(nationalNumber, numberDesc, false); + } + + /** + * Tests whether a phone number matches a valid pattern. Note this doesn't verify the number + * is actually in use, which is impossible to tell by just looking at a number itself. It only + * verifies whether the parsed, canonicalised number is valid: not whether a particular series of + * digits entered by the user is diallable from the region provided when parsing. For example, the + * number +41 (0) 78 927 2696 can be parsed into a number with country code "41" and national + * significant number "789272696". This is valid, while the original string is not diallable. + * + * @param number the phone number that we want to validate + * @return a boolean that indicates whether the number is of a valid pattern + */ + public boolean isValidNumber(PhoneNumber number) { + String regionCode = getRegionCodeForNumber(number); + return isValidNumberForRegion(number, regionCode); + } + + /** + * Tests whether a phone number is valid for a certain region. Note this doesn't verify the number + * is actually in use, which is impossible to tell by just looking at a number itself. If the + * country calling code is not the same as the country calling code for the region, this + * immediately exits with false. After this, the specific number pattern rules for the region are + * examined. This is useful for determining for example whether a particular number is valid for + * Canada, rather than just a valid NANPA number. + * Warning: In most cases, you want to use {@link #isValidNumber} instead. For example, this + * method will mark numbers from British Crown dependencies such as the Isle of Man as invalid for + * the region "GB" (United Kingdom), since it has its own region code, "IM", which may be + * undesirable. + * + * @param number the phone number that we want to validate + * @param regionCode the region that we want to validate the phone number for + * @return a boolean that indicates whether the number is of a valid pattern + */ + public boolean isValidNumberForRegion(PhoneNumber number, String regionCode) { + int countryCode = number.getCountryCode(); + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); + if ((metadata == null) + || (!REGION_CODE_FOR_NON_GEO_ENTITY.equals(regionCode) + && countryCode != getCountryCodeForValidRegion(regionCode))) { + // Either the region code was invalid, or the country calling code for this number does not + // match that of the region code. + return false; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return getNumberTypeHelper(nationalSignificantNumber, metadata) != PhoneNumberType.UNKNOWN; + } + + /** + * Returns the region where a phone number is from. This could be used for geocoding at the region + * level. Only guarantees correct results for valid, full numbers (not short-codes, or invalid + * numbers). + * + * @param number the phone number whose origin we want to know + * @return the region where the phone number is from, or null if no region matches this calling + * code + */ + public String getRegionCodeForNumber(PhoneNumber number) { + int countryCode = number.getCountryCode(); + List regions = countryCallingCodeToRegionCodeMap.get(countryCode); + if (regions == null) { + logger.log(Level.INFO, "Missing/invalid country_code (" + countryCode + ")"); + return null; + } + if (regions.size() == 1) { + return regions.get(0); + } else { + return getRegionCodeForNumberFromRegionList(number, regions); + } + } + + private String getRegionCodeForNumberFromRegionList(PhoneNumber number, + List regionCodes) { + String nationalNumber = getNationalSignificantNumber(number); + for (String regionCode : regionCodes) { + // If leadingDigits is present, use this. Otherwise, do full validation. + // Metadata cannot be null because the region codes come from the country calling code map. + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata.hasLeadingDigits()) { + if (regexCache.getPatternForRegex(metadata.getLeadingDigits()) + .matcher(nationalNumber).lookingAt()) { + return regionCode; + } + } else if (getNumberTypeHelper(nationalNumber, metadata) != PhoneNumberType.UNKNOWN) { + return regionCode; + } + } + return null; + } + + /** + * Returns the region code that matches the specific country calling code. In the case of no + * region code being found, ZZ will be returned. In the case of multiple regions, the one + * designated in the metadata as the "main" region for this calling code will be returned. If the + * countryCallingCode entered is valid but doesn't match a specific region (such as in the case of + * non-geographical calling codes like 800) the value "001" will be returned (corresponding to + * the value for World in the UN M.49 schema). + */ + public String getRegionCodeForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return regionCodes == null ? UNKNOWN_REGION : regionCodes.get(0); + } + + /** + * Returns a list with the region codes that match the specific country calling code. For + * non-geographical country calling codes, the region code 001 is returned. Also, in the case + * of no region code being found, an empty list is returned. + */ + public List getRegionCodesForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return Collections.unmodifiableList(regionCodes == null ? new ArrayList(0) + : regionCodes); + } + + /** + * Returns the country calling code for a specific region. For example, this would be 1 for the + * United States, and 64 for New Zealand. + * + * @param regionCode the region that we want to get the country calling code for + * @return the country calling code for the region denoted by regionCode + */ + public int getCountryCodeForRegion(String regionCode) { + if (!isValidRegionCode(regionCode)) { + logger.log(Level.WARNING, + "Invalid or missing region code (" + + ((regionCode == null) ? "null" : regionCode) + + ") provided."); + return 0; + } + return getCountryCodeForValidRegion(regionCode); + } + + /** + * Returns the country calling code for a specific region. For example, this would be 1 for the + * United States, and 64 for New Zealand. Assumes the region is already valid. + * + * @param regionCode the region that we want to get the country calling code for + * @return the country calling code for the region denoted by regionCode + * @throws IllegalArgumentException if the region is invalid + */ + private int getCountryCodeForValidRegion(String regionCode) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + throw new IllegalArgumentException("Invalid region code: " + regionCode); + } + return metadata.getCountryCode(); + } + + /** + * Returns the national dialling prefix for a specific region. For example, this would be 1 for + * the United States, and 0 for New Zealand. Set stripNonDigits to true to strip symbols like "~" + * (which indicates a wait for a dialling tone) from the prefix returned. If no national prefix is + * present, we return null. + * + *

Warning: Do not use this method for do-your-own formatting - for some regions, the + * national dialling prefix is used only for certain types of numbers. Use the library's + * formatting functions to prefix the national prefix when required. + * + * @param regionCode the region that we want to get the dialling prefix for + * @param stripNonDigits true to strip non-digits from the national dialling prefix + * @return the dialling prefix for the region denoted by regionCode + */ + public String getNddPrefixForRegion(String regionCode, boolean stripNonDigits) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + logger.log(Level.WARNING, + "Invalid or missing region code (" + + ((regionCode == null) ? "null" : regionCode) + + ") provided."); + return null; + } + String nationalPrefix = metadata.getNationalPrefix(); + // If no national prefix was found, we return null. + if (nationalPrefix.length() == 0) { + return null; + } + if (stripNonDigits) { + // Note: if any other non-numeric symbols are ever used in national prefixes, these would have + // to be removed here as well. + nationalPrefix = nationalPrefix.replace("~", ""); + } + return nationalPrefix; + } + + /** + * Checks if this is a region under the North American Numbering Plan Administration (NANPA). + * + * @return true if regionCode is one of the regions under NANPA + */ + public boolean isNANPACountry(String regionCode) { + return nanpaRegions.contains(regionCode); + } + + /** + * Checks if the number is a valid vanity (alpha) number such as 800 MICROSOFT. A valid vanity + * number will start with at least 3 digits and will have three or more alpha characters. This + * does not do region-specific checks - to work out if this number is actually valid for a region, + * it should be parsed and methods such as {@link #isPossibleNumberWithReason} and + * {@link #isValidNumber} should be used. + * + * @param number the number that needs to be checked + * @return true if the number is a valid vanity number + */ + public boolean isAlphaNumber(CharSequence number) { + if (!isViablePhoneNumber(number)) { + // Number is too short, or doesn't match the basic phone number pattern. + return false; + } + StringBuilder strippedNumber = new StringBuilder(number); + maybeStripExtension(strippedNumber); + return VALID_ALPHA_PHONE_PATTERN.matcher(strippedNumber).matches(); + } + + /** + * Convenience wrapper around {@link #isPossibleNumberWithReason}. Instead of returning the reason + * for failure, this method returns true if the number is either a possible fully-qualified number + * (containing the area code and country code), or if the number could be a possible local number + * (with a country code, but missing an area code). Local numbers are considered possible if they + * could be possibly dialled in this format: if the area code is needed for a call to connect, the + * number is not considered possible without it. + * + * @param number the number that needs to be checked + * @return true if the number is possible + */ + public boolean isPossibleNumber(PhoneNumber number) { + ValidationResult result = isPossibleNumberWithReason(number); + return result == ValidationResult.IS_POSSIBLE + || result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + /** + * Convenience wrapper around {@link #isPossibleNumberForTypeWithReason}. Instead of returning the + * reason for failure, this method returns true if the number is either a possible fully-qualified + * number (containing the area code and country code), or if the number could be a possible local + * number (with a country code, but missing an area code). Local numbers are considered possible + * if they could be possibly dialled in this format: if the area code is needed for a call to + * connect, the number is not considered possible without it. + * + * @param number the number that needs to be checked + * @param type the type we are interested in + * @return true if the number is possible for this particular type + */ + public boolean isPossibleNumberForType(PhoneNumber number, PhoneNumberType type) { + ValidationResult result = isPossibleNumberForTypeWithReason(number, type); + return result == ValidationResult.IS_POSSIBLE + || result == ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + /** + * Helper method to check a number against possible lengths for this region, based on the metadata + * being passed in, and determine whether it matches, or is too short or too long. + */ + private ValidationResult testNumberLength(CharSequence number, PhoneMetadata metadata) { + return testNumberLength(number, metadata, PhoneNumberType.UNKNOWN); + } + + /** + * Helper method to check a number against possible lengths for this number type, and determine + * whether it matches, or is too short or too long. + */ + private ValidationResult testNumberLength( + CharSequence number, PhoneMetadata metadata, PhoneNumberType type) { + PhoneNumberDesc descForType = getNumberDescByType(metadata, type); + // There should always be "possibleLengths" set for every element. This is declared in the XML + // schema which is verified by PhoneNumberMetadataSchemaTest. + // For size efficiency, where a sub-description (e.g. fixed-line) has the same possibleLengths + // as the parent, this is missing, so we fall back to the general desc (where no numbers of the + // type exist at all, there is one possible length (-1) which is guaranteed not to match the + // length of any real phone number). + List possibleLengths = descForType.getPossibleLengthList().isEmpty() + ? metadata.getGeneralDesc().getPossibleLengthList() : descForType.getPossibleLengthList(); + + List localLengths = descForType.getPossibleLengthLocalOnlyList(); + + if (type == PhoneNumberType.FIXED_LINE_OR_MOBILE) { + if (!descHasPossibleNumberData(getNumberDescByType(metadata, PhoneNumberType.FIXED_LINE))) { + // The rare case has been encountered where no fixedLine data is available (true for some + // non-geographical entities), so we just check mobile. + return testNumberLength(number, metadata, PhoneNumberType.MOBILE); + } else { + PhoneNumberDesc mobileDesc = getNumberDescByType(metadata, PhoneNumberType.MOBILE); + if (descHasPossibleNumberData(mobileDesc)) { + // Merge the mobile data in if there was any. We have to make a copy to do this. + possibleLengths = new ArrayList<>(possibleLengths); + // Note that when adding the possible lengths from mobile, we have to again check they + // aren't empty since if they are this indicates they are the same as the general desc and + // should be obtained from there. + possibleLengths.addAll(mobileDesc.getPossibleLengthCount() == 0 + ? metadata.getGeneralDesc().getPossibleLengthList() + : mobileDesc.getPossibleLengthList()); + // The current list is sorted; we need to merge in the new list and re-sort (duplicates + // are okay). Sorting isn't so expensive because the lists are very small. + Collections.sort(possibleLengths); + + if (localLengths.isEmpty()) { + localLengths = mobileDesc.getPossibleLengthLocalOnlyList(); + } else { + localLengths = new ArrayList<>(localLengths); + localLengths.addAll(mobileDesc.getPossibleLengthLocalOnlyList()); + Collections.sort(localLengths); + } + } + } + } + + // If the type is not supported at all (indicated by the possible lengths containing -1 at this + // point) we return invalid length. + if (possibleLengths.get(0) == -1) { + return ValidationResult.INVALID_LENGTH; + } + + int actualLength = number.length(); + // This is safe because there is never an overlap beween the possible lengths and the local-only + // lengths; this is checked at build time. + if (localLengths.contains(actualLength)) { + return ValidationResult.IS_POSSIBLE_LOCAL_ONLY; + } + + int minimumLength = possibleLengths.get(0); + if (minimumLength == actualLength) { + return ValidationResult.IS_POSSIBLE; + } else if (minimumLength > actualLength) { + return ValidationResult.TOO_SHORT; + } else if (possibleLengths.get(possibleLengths.size() - 1) < actualLength) { + return ValidationResult.TOO_LONG; + } + // We skip the first element; we've already checked it. + return possibleLengths.subList(1, possibleLengths.size()).contains(actualLength) + ? ValidationResult.IS_POSSIBLE : ValidationResult.INVALID_LENGTH; + } + + /** + * Check whether a phone number is a possible number. It provides a more lenient check than + * {@link #isValidNumber} in the following sense: + *

    + *
  1. It only checks the length of phone numbers. In particular, it doesn't check starting + * digits of the number. + *
  2. It doesn't attempt to figure out the type of the number, but uses general rules which + * applies to all types of phone numbers in a region. Therefore, it is much faster than + * isValidNumber. + *
  3. For some numbers (particularly fixed-line), many regions have the concept of area code, + * which together with subscriber number constitute the national significant number. It is + * sometimes okay to dial only the subscriber number when dialing in the same area. This + * function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is + * passed in. On the other hand, because isValidNumber validates using information on both + * starting digits (for fixed line numbers, that would most likely be area codes) and + * length (obviously includes the length of area codes for fixed line numbers), it will + * return false for the subscriber-number-only version. + *
+ * + *

There is a known issue with this + * method: if a number is possible only in a certain region among several regions that share the + * same country calling code, this method will consider only the "main" region. For example, + * +1310xxxx are valid numbers in Canada. However, they are not possible in the US. As a result, + * this method will return IS_POSSIBLE_LOCAL_ONLY for +1310xxxx. + * + * @param number the number that needs to be checked + * @return a ValidationResult object which indicates whether the number is possible + */ + public ValidationResult isPossibleNumberWithReason(PhoneNumber number) { + return isPossibleNumberForTypeWithReason(number, PhoneNumberType.UNKNOWN); + } + + /** + * Check whether a phone number is a possible number of a particular type. For types that don't + * exist in a particular region, this will return a result that isn't so useful; it is recommended + * that you use {@link #getSupportedTypesForRegion} or {@link #getSupportedTypesForNonGeoEntity} + * respectively before calling this method to determine whether you should call it for this number + * at all. + * + * This provides a more lenient check than {@link #isValidNumber} in the following sense: + * + *

    + *
  1. It only checks the length of phone numbers. In particular, it doesn't check starting + * digits of the number. + *
  2. For some numbers (particularly fixed-line), many regions have the concept of area code, + * which together with subscriber number constitute the national significant number. It is + * sometimes okay to dial only the subscriber number when dialing in the same area. This + * function will return IS_POSSIBLE_LOCAL_ONLY if the subscriber-number-only version is + * passed in. On the other hand, because isValidNumber validates using information on both + * starting digits (for fixed line numbers, that would most likely be area codes) and + * length (obviously includes the length of area codes for fixed line numbers), it will + * return false for the subscriber-number-only version. + *
+ * + *

There is a known issue with this + * method: if a number is possible only in a certain region among several regions that share the + * same country calling code, this method will consider only the "main" region. For example, + * +1310xxxx are valid numbers in Canada. However, they are not possible in the US. As a result, + * this method will return IS_POSSIBLE_LOCAL_ONLY for +1310xxxx. + * + * @param number the number that needs to be checked + * @param type the type we are interested in + * @return a ValidationResult object which indicates whether the number is possible + */ + public ValidationResult isPossibleNumberForTypeWithReason( + PhoneNumber number, PhoneNumberType type) { + String nationalNumber = getNationalSignificantNumber(number); + int countryCode = number.getCountryCode(); + // Note: For regions that share a country calling code, like NANPA numbers, we just use the + // rules from the default region (US in this case) since the getRegionCodeForNumber will not + // work if the number is possible but not valid. There is in fact one country calling code (290) + // where the possible number pattern differs between various regions (Saint Helena and Tristan + // da Cuñha), but this is handled by putting all possible lengths for any country with this + // country calling code in the metadata for the default region in this case. + if (!hasValidCountryCallingCode(countryCode)) { + return ValidationResult.INVALID_COUNTRY_CODE; + } + String regionCode = getRegionCodeForCountryCode(countryCode); + // Metadata cannot be null because the country calling code is valid. + PhoneMetadata metadata = getMetadataForRegionOrCallingCode(countryCode, regionCode); + return testNumberLength(nationalNumber, metadata, type); + } + + /** + * Check whether a phone number is a possible number given a number in the form of a string, and + * the region where the number could be dialed from. It provides a more lenient check than + * {@link #isValidNumber}. See {@link #isPossibleNumber(PhoneNumber)} for details. + * + *

This method first parses the number, then invokes {@link #isPossibleNumber(PhoneNumber)} + * with the resultant PhoneNumber object. + * + * @param number the number that needs to be checked + * @param regionDialingFrom the region that we are expecting the number to be dialed from. + * Note this is different from the region where the number belongs. For example, the number + * +1 650 253 0000 is a number that belongs to US. When written in this form, it can be + * dialed from any region. When it is written as 00 1 650 253 0000, it can be dialed from any + * region which uses an international dialling prefix of 00. When it is written as + * 650 253 0000, it can only be dialed from within the US, and when written as 253 0000, it + * can only be dialed from within a smaller area in the US (Mountain View, CA, to be more + * specific). + * @return true if the number is possible + */ + public boolean isPossibleNumber(CharSequence number, String regionDialingFrom) { + try { + return isPossibleNumber(parse(number, regionDialingFrom)); + } catch (NumberParseException e) { + return false; + } + } + + /** + * Attempts to extract a valid number from a phone number that is too long to be valid, and resets + * the PhoneNumber object passed in to that valid version. If no valid number could be extracted, + * the PhoneNumber object passed in will not be modified. + * @param number a PhoneNumber object which contains a number that is too long to be valid + * @return true if a valid phone number can be successfully extracted + */ + public boolean truncateTooLongNumber(PhoneNumber number) { + if (isValidNumber(number)) { + return true; + } + PhoneNumber numberCopy = new PhoneNumber(); + numberCopy.mergeFrom(number); + long nationalNumber = number.getNationalNumber(); + do { + nationalNumber /= 10; + numberCopy.setNationalNumber(nationalNumber); + if (isPossibleNumberWithReason(numberCopy) == ValidationResult.TOO_SHORT + || nationalNumber == 0) { + return false; + } + } while (!isValidNumber(numberCopy)); + number.setNationalNumber(nationalNumber); + return true; + } + + /** + * Gets an {@link com.google.i18n.phonenumbers.AsYouTypeFormatter} for the specific region. + * + * @param regionCode the region where the phone number is being entered + * @return an {@link com.google.i18n.phonenumbers.AsYouTypeFormatter} object, which can be used + * to format phone numbers in the specific region "as you type" + */ + public AsYouTypeFormatter getAsYouTypeFormatter(String regionCode) { + return new AsYouTypeFormatter(regionCode); + } + + // Extracts country calling code from fullNumber, returns it and places the remaining number in + // nationalNumber. It assumes that the leading plus sign or IDD has already been removed. Returns + // 0 if fullNumber doesn't start with a valid country calling code, and leaves nationalNumber + // unmodified. + int extractCountryCode(StringBuilder fullNumber, StringBuilder nationalNumber) { + if ((fullNumber.length() == 0) || (fullNumber.charAt(0) == '0')) { + // Country codes do not begin with a '0'. + return 0; + } + int potentialCountryCode; + int numberLength = fullNumber.length(); + for (int i = 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++) { + potentialCountryCode = Integer.parseInt(fullNumber.substring(0, i)); + if (countryCallingCodeToRegionCodeMap.containsKey(potentialCountryCode)) { + nationalNumber.append(fullNumber.substring(i)); + return potentialCountryCode; + } + } + return 0; + } + + /** + * Tries to extract a country calling code from a number. This method will return zero if no + * country calling code is considered to be present. Country calling codes are extracted in the + * following ways: + *

    + *
  • by stripping the international dialing prefix of the region the person is dialing from, + * if this is present in the number, and looking at the next digits + *
  • by stripping the '+' sign if present and then looking at the next digits + *
  • by comparing the start of the number and the country calling code of the default region. + * If the number is not considered possible for the numbering plan of the default region + * initially, but starts with the country calling code of this region, validation will be + * reattempted after stripping this country calling code. If this number is considered a + * possible number, then the first digits will be considered the country calling code and + * removed as such. + *
+ * It will throw a NumberParseException if the number starts with a '+' but the country calling + * code supplied after this does not match that of any known region. + * + * @param number non-normalized telephone number that we wish to extract a country calling + * code from - may begin with '+' + * @param defaultRegionMetadata metadata about the region this number may be from + * @param nationalNumber a string buffer to store the national significant number in, in the case + * that a country calling code was extracted. The number is appended to any existing contents. + * If no country calling code was extracted, this will be left unchanged. + * @param keepRawInput true if the country_code_source and preferred_carrier_code fields of + * phoneNumber should be populated. + * @param phoneNumber the PhoneNumber object where the country_code and country_code_source need + * to be populated. Note the country_code is always populated, whereas country_code_source is + * only populated when keepCountryCodeSource is true. + * @return the country calling code extracted or 0 if none could be extracted + */ + // @VisibleForTesting + int maybeExtractCountryCode(CharSequence number, PhoneMetadata defaultRegionMetadata, + StringBuilder nationalNumber, boolean keepRawInput, + PhoneNumber phoneNumber) + throws NumberParseException { + if (number.length() == 0) { + return 0; + } + StringBuilder fullNumber = new StringBuilder(number); + // Set the default prefix to be something that will never match. + String possibleCountryIddPrefix = "NonMatch"; + if (defaultRegionMetadata != null) { + possibleCountryIddPrefix = defaultRegionMetadata.getInternationalPrefix(); + } + + CountryCodeSource countryCodeSource = + maybeStripInternationalPrefixAndNormalize(fullNumber, possibleCountryIddPrefix); + if (keepRawInput) { + phoneNumber.setCountryCodeSource(countryCodeSource); + } + if (countryCodeSource != CountryCodeSource.FROM_DEFAULT_COUNTRY) { + if (fullNumber.length() <= MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, + "Phone number had an IDD, but after this was not " + + "long enough to be a viable phone number."); + } + int potentialCountryCode = extractCountryCode(fullNumber, nationalNumber); + if (potentialCountryCode != 0) { + phoneNumber.setCountryCode(potentialCountryCode); + return potentialCountryCode; + } + + // If this fails, they must be using a strange country calling code that we don't recognize, + // or that doesn't exist. + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Country calling code supplied was not recognised."); + } else if (defaultRegionMetadata != null) { + // Check to see if the number starts with the country calling code for the default region. If + // so, we remove the country calling code, and do some checks on the validity of the number + // before and after. + int defaultCountryCode = defaultRegionMetadata.getCountryCode(); + String defaultCountryCodeString = String.valueOf(defaultCountryCode); + String normalizedNumber = fullNumber.toString(); + if (normalizedNumber.startsWith(defaultCountryCodeString)) { + StringBuilder potentialNationalNumber = + new StringBuilder(normalizedNumber.substring(defaultCountryCodeString.length())); + PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc(); + maybeStripNationalPrefixAndCarrierCode( + potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */); + // If the number was not valid before but is valid now, or if it was too long before, we + // consider the number with the country calling code stripped to be a better result and + // keep that instead. + if ((!matcherApi.matchNationalNumber(fullNumber, generalDesc, false) + && matcherApi.matchNationalNumber(potentialNationalNumber, generalDesc, false)) + || testNumberLength(fullNumber, defaultRegionMetadata) == ValidationResult.TOO_LONG) { + nationalNumber.append(potentialNationalNumber); + if (keepRawInput) { + phoneNumber.setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + } + phoneNumber.setCountryCode(defaultCountryCode); + return defaultCountryCode; + } + } + } + // No country calling code present. + phoneNumber.setCountryCode(0); + return 0; + } + + /** + * Strips the IDD from the start of the number if present. Helper function used by + * maybeStripInternationalPrefixAndNormalize. + */ + private boolean parsePrefixAsIdd(Pattern iddPattern, StringBuilder number) { + Matcher m = iddPattern.matcher(number); + if (m.lookingAt()) { + int matchEnd = m.end(); + // Only strip this if the first digit after the match is not a 0, since country calling codes + // cannot begin with 0. + Matcher digitMatcher = CAPTURING_DIGIT_PATTERN.matcher(number.substring(matchEnd)); + if (digitMatcher.find()) { + String normalizedGroup = normalizeDigitsOnly(digitMatcher.group(1)); + if (normalizedGroup.equals("0")) { + return false; + } + } + number.delete(0, matchEnd); + return true; + } + return false; + } + + /** + * Strips any international prefix (such as +, 00, 011) present in the number provided, normalizes + * the resulting number, and indicates if an international prefix was present. + * + * @param number the non-normalized telephone number that we wish to strip any international + * dialing prefix from + * @param possibleIddPrefix the international direct dialing prefix from the region we + * think this number may be dialed in + * @return the corresponding CountryCodeSource if an international dialing prefix could be + * removed from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if the number did + * not seem to be in international format + */ + // @VisibleForTesting + CountryCodeSource maybeStripInternationalPrefixAndNormalize( + StringBuilder number, + String possibleIddPrefix) { + if (number.length() == 0) { + return CountryCodeSource.FROM_DEFAULT_COUNTRY; + } + // Check to see if the number begins with one or more plus signs. + Matcher m = PLUS_CHARS_PATTERN.matcher(number); + if (m.lookingAt()) { + number.delete(0, m.end()); + // Can now normalize the rest of the number since we've consumed the "+" sign at the start. + normalize(number); + return CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN; + } + // Attempt to parse the first digits as an international prefix. + Pattern iddPattern = regexCache.getPatternForRegex(possibleIddPrefix); + normalize(number); + return parsePrefixAsIdd(iddPattern, number) + ? CountryCodeSource.FROM_NUMBER_WITH_IDD + : CountryCodeSource.FROM_DEFAULT_COUNTRY; + } + + /** + * Strips any national prefix (such as 0, 1) present in the number provided. + * + * @param number the normalized telephone number that we wish to strip any national + * dialing prefix from + * @param metadata the metadata for the region that we think this number is from + * @param carrierCode a place to insert the carrier code if one is extracted + * @return true if a national prefix or carrier code (or both) could be extracted + */ + // @VisibleForTesting + boolean maybeStripNationalPrefixAndCarrierCode( + StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) { + int numberLength = number.length(); + String possibleNationalPrefix = metadata.getNationalPrefixForParsing(); + if (numberLength == 0 || possibleNationalPrefix.length() == 0) { + // Early return for numbers of zero length. + return false; + } + // Attempt to parse the first digits as a national prefix. + Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number); + if (prefixMatcher.lookingAt()) { + PhoneNumberDesc generalDesc = metadata.getGeneralDesc(); + // Check if the original number is viable. + boolean isViableOriginalNumber = matcherApi.matchNationalNumber(number, generalDesc, false); + // prefixMatcher.group(numOfGroups) == null implies nothing was captured by the capturing + // groups in possibleNationalPrefix; therefore, no transformation is necessary, and we just + // remove the national prefix. + int numOfGroups = prefixMatcher.groupCount(); + String transformRule = metadata.getNationalPrefixTransformRule(); + if (transformRule == null || transformRule.length() == 0 + || prefixMatcher.group(numOfGroups) == null) { + // If the original number was viable, and the resultant number is not, we return. + if (isViableOriginalNumber + && !matcherApi.matchNationalNumber( + number.substring(prefixMatcher.end()), generalDesc, false)) { + return false; + } + if (carrierCode != null && numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) { + carrierCode.append(prefixMatcher.group(1)); + } + number.delete(0, prefixMatcher.end()); + return true; + } else { + // Check that the resultant number is still viable. If not, return. Check this by copying + // the string buffer and making the transformation on the copy first. + StringBuilder transformedNumber = new StringBuilder(number); + transformedNumber.replace(0, numberLength, prefixMatcher.replaceFirst(transformRule)); + if (isViableOriginalNumber + && !matcherApi.matchNationalNumber(transformedNumber.toString(), generalDesc, false)) { + return false; + } + if (carrierCode != null && numOfGroups > 1) { + carrierCode.append(prefixMatcher.group(1)); + } + number.replace(0, number.length(), transformedNumber.toString()); + return true; + } + } + return false; + } + + /** + * Strips any extension (as in, the part of the number dialled after the call is connected, + * usually indicated with extn, ext, x or similar) from the end of the number, and returns it. + * + * @param number the non-normalized telephone number that we wish to strip the extension from + * @return the phone extension + */ + // @VisibleForTesting + String maybeStripExtension(StringBuilder number) { + Matcher m = EXTN_PATTERN.matcher(number); + // If we find a potential extension, and the number preceding this is a viable number, we assume + // it is an extension. + if (m.find() && isViablePhoneNumber(number.substring(0, m.start()))) { + // The numbers are captured into groups in the regular expression. + for (int i = 1, length = m.groupCount(); i <= length; i++) { + if (m.group(i) != null) { + // We go through the capturing groups until we find one that captured some digits. If none + // did, then we will return the empty string. + String extension = m.group(i); + number.delete(m.start(), number.length()); + return extension; + } + } + } + return ""; + } + + /** + * Checks to see that the region code used is valid, or if it is not valid, that the number to + * parse starts with a + symbol so that we can attempt to infer the region from the number. + * Returns false if it cannot use the region provided and the region cannot be inferred. + */ + private boolean checkRegionForParsing(CharSequence numberToParse, String defaultRegion) { + if (!isValidRegionCode(defaultRegion)) { + // If the number is null or empty, we can't infer the region. + if ((numberToParse == null) || (numberToParse.length() == 0) + || !PLUS_CHARS_PATTERN.matcher(numberToParse).lookingAt()) { + return false; + } + } + return true; + } + + /** + * Parses a string and returns it as a phone number in proto buffer format. The method is quite + * lenient and looks for a number in the input text (raw input) and does not check whether the + * string is definitely only a phone number. To do this, it ignores punctuation and white-space, + * as well as any text before the number (e.g. a leading "Tel: ") and trims the non-number bits. + * It will accept a number in any format (E164, national, international etc), assuming it can be + * interpreted with the defaultRegion supplied. It also attempts to convert any alpha characters + * into digits if it thinks this is a vanity number of the type "1800 MICROSOFT". + * + *

This method will throw a {@link com.google.i18n.phonenumbers.NumberParseException} if the + * number is not considered to be a possible number. Note that validation of whether the number + * is actually a valid number for a particular region is not performed. This can be done + * separately with {@link #isValidNumber}. + * + *

Note this method canonicalizes the phone number such that different representations can be + * easily compared, no matter what form it was originally entered in (e.g. national, + * international). If you want to record context about the number being parsed, such as the raw + * input that was entered, how the country code was derived etc. then call {@link + * #parseAndKeepRawInput} instead. + * + * @param numberToParse number that we are attempting to parse. This can contain formatting such + * as +, ( and -, as well as a phone number extension. It can also be provided in RFC3966 + * format. + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. If the number + * is guaranteed to start with a '+' followed by the country calling code, then RegionCode.ZZ + * or null can be supplied. + * @return a phone number proto buffer filled with the parsed number + * @throws NumberParseException if the string is not considered to be a viable phone number (e.g. + * too few or too many digits) or if no default region was supplied and the number is not in + * international format (does not start with +) + */ + public PhoneNumber parse(CharSequence numberToParse, String defaultRegion) + throws NumberParseException { + PhoneNumber phoneNumber = new PhoneNumber(); + parse(numberToParse, defaultRegion, phoneNumber); + return phoneNumber; + } + + /** + * Same as {@link #parse(CharSequence, String)}, but accepts mutable PhoneNumber as a + * parameter to decrease object creation when invoked many times. + */ + public void parse(CharSequence numberToParse, String defaultRegion, PhoneNumber phoneNumber) + throws NumberParseException { + parseHelper(numberToParse, defaultRegion, false, true, phoneNumber); + } + + /** + * Parses a string and returns it in proto buffer format. This method differs from {@link #parse} + * in that it always populates the raw_input field of the protocol buffer with numberToParse as + * well as the country_code_source field. + * + * @param numberToParse number that we are attempting to parse. This can contain formatting such + * as +, ( and -, as well as a phone number extension. + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country calling code + * for the number in this case would be stored as that of the default region supplied. + * @return a phone number proto buffer filled with the parsed number + * @throws NumberParseException if the string is not considered to be a viable phone number or if + * no default region was supplied + */ + public PhoneNumber parseAndKeepRawInput(CharSequence numberToParse, String defaultRegion) + throws NumberParseException { + PhoneNumber phoneNumber = new PhoneNumber(); + parseAndKeepRawInput(numberToParse, defaultRegion, phoneNumber); + return phoneNumber; + } + + /** + * Same as{@link #parseAndKeepRawInput(CharSequence, String)}, but accepts a mutable + * PhoneNumber as a parameter to decrease object creation when invoked many times. + */ + public void parseAndKeepRawInput(CharSequence numberToParse, String defaultRegion, + PhoneNumber phoneNumber) + throws NumberParseException { + parseHelper(numberToParse, defaultRegion, true, true, phoneNumber); + } + + /** + * Returns an iterable over all {@link PhoneNumberMatch PhoneNumberMatches} in {@code text}. This + * is a shortcut for {@link #findNumbers(CharSequence, String, Leniency, long) + * getMatcher(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE)}. + * + * @param text the text to search for phone numbers, null for no text + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. May be null if + * only international numbers are expected. + */ + public Iterable findNumbers(CharSequence text, String defaultRegion) { + return findNumbers(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE); + } + + /** + * Returns an iterable over all {@link PhoneNumberMatch PhoneNumberMatches} in {@code text}. + * + * @param text the text to search for phone numbers, null for no text + * @param defaultRegion region that we are expecting the number to be from. This is only used if + * the number being parsed is not written in international format. The country_code for the + * number in this case would be stored as that of the default region supplied. May be null if + * only international numbers are expected. + * @param leniency the leniency to use when evaluating candidate phone numbers + * @param maxTries the maximum number of invalid numbers to try before giving up on the text. + * This is to cover degenerate cases where the text has a lot of false positives in it. Must + * be {@code >= 0}. + */ + public Iterable findNumbers( + final CharSequence text, final String defaultRegion, final Leniency leniency, + final long maxTries) { + + return new Iterable() { + @Override + public Iterator iterator() { + return new PhoneNumberMatcher( + PhoneNumberUtil.this, text, defaultRegion, leniency, maxTries); + } + }; + } + + /** + * A helper function to set the values related to leading zeros in a PhoneNumber. + */ + static void setItalianLeadingZerosForPhoneNumber(CharSequence nationalNumber, + PhoneNumber phoneNumber) { + if (nationalNumber.length() > 1 && nationalNumber.charAt(0) == '0') { + phoneNumber.setItalianLeadingZero(true); + int numberOfLeadingZeros = 1; + // Note that if the national number is all "0"s, the last "0" is not counted as a leading + // zero. + while (numberOfLeadingZeros < nationalNumber.length() - 1 + && nationalNumber.charAt(numberOfLeadingZeros) == '0') { + numberOfLeadingZeros++; + } + if (numberOfLeadingZeros != 1) { + phoneNumber.setNumberOfLeadingZeros(numberOfLeadingZeros); + } + } + } + + /** + * Parses a string and fills up the phoneNumber. This method is the same as the public + * parse() method, with the exception that it allows the default region to be null, for use by + * isNumberMatch(). checkRegion should be set to false if it is permitted for the default region + * to be null or unknown ("ZZ"). + * + * Note if any new field is added to this method that should always be filled in, even when + * keepRawInput is false, it should also be handled in the copyCoreFieldsOnly() method. + */ + private void parseHelper(CharSequence numberToParse, String defaultRegion, + boolean keepRawInput, boolean checkRegion, PhoneNumber phoneNumber) + throws NumberParseException { + if (numberToParse == null) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The phone number supplied was null."); + } else if (numberToParse.length() > MAX_INPUT_STRING_LENGTH) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_LONG, + "The string supplied was too long to parse."); + } + + StringBuilder nationalNumber = new StringBuilder(); + String numberBeingParsed = numberToParse.toString(); + buildNationalNumberForParsing(numberBeingParsed, nationalNumber); + + if (!isViablePhoneNumber(nationalNumber)) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The string supplied did not seem to be a phone number."); + } + + // Check the region supplied is valid, or that the extracted number starts with some sort of + + // sign so the number's region can be determined. + if (checkRegion && !checkRegionForParsing(nationalNumber, defaultRegion)) { + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Missing or invalid default region."); + } + + if (keepRawInput) { + phoneNumber.setRawInput(numberBeingParsed); + } + // Attempt to parse extension first, since it doesn't require region-specific data and we want + // to have the non-normalised number here. + String extension = maybeStripExtension(nationalNumber); + if (extension.length() > 0) { + phoneNumber.setExtension(extension); + } + + PhoneMetadata regionMetadata = getMetadataForRegion(defaultRegion); + // Check to see if the number is given in international format so we know whether this number is + // from the default region or not. + StringBuilder normalizedNationalNumber = new StringBuilder(); + int countryCode = 0; + try { + // TODO: This method should really just take in the string buffer that has already + // been created, and just remove the prefix, rather than taking in a string and then + // outputting a string buffer. + countryCode = maybeExtractCountryCode(nationalNumber, regionMetadata, + normalizedNationalNumber, keepRawInput, phoneNumber); + } catch (NumberParseException e) { + Matcher matcher = PLUS_CHARS_PATTERN.matcher(nationalNumber); + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE + && matcher.lookingAt()) { + // Strip the plus-char, and try again. + countryCode = maybeExtractCountryCode(nationalNumber.substring(matcher.end()), + regionMetadata, normalizedNationalNumber, + keepRawInput, phoneNumber); + if (countryCode == 0) { + throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, + "Could not interpret numbers after plus-sign."); + } + } else { + throw new NumberParseException(e.getErrorType(), e.getMessage()); + } + } + if (countryCode != 0) { + String phoneNumberRegion = getRegionCodeForCountryCode(countryCode); + if (!phoneNumberRegion.equals(defaultRegion)) { + // Metadata cannot be null because the country calling code is valid. + regionMetadata = getMetadataForRegionOrCallingCode(countryCode, phoneNumberRegion); + } + } else { + // If no extracted country calling code, use the region supplied instead. The national number + // is just the normalized version of the number we were given to parse. + normalizedNationalNumber.append(normalize(nationalNumber)); + if (defaultRegion != null) { + countryCode = regionMetadata.getCountryCode(); + phoneNumber.setCountryCode(countryCode); + } else if (keepRawInput) { + phoneNumber.clearCountryCodeSource(); + } + } + if (normalizedNationalNumber.length() < MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_NSN, + "The string supplied is too short to be a phone number."); + } + if (regionMetadata != null) { + StringBuilder carrierCode = new StringBuilder(); + StringBuilder potentialNationalNumber = new StringBuilder(normalizedNationalNumber); + maybeStripNationalPrefixAndCarrierCode(potentialNationalNumber, regionMetadata, carrierCode); + // We require that the NSN remaining after stripping the national prefix and carrier code be + // long enough to be a possible length for the region. Otherwise, we don't do the stripping, + // since the original number could be a valid short number. + ValidationResult validationResult = testNumberLength(potentialNationalNumber, regionMetadata); + if (validationResult != ValidationResult.TOO_SHORT + && validationResult != ValidationResult.IS_POSSIBLE_LOCAL_ONLY + && validationResult != ValidationResult.INVALID_LENGTH) { + normalizedNationalNumber = potentialNationalNumber; + if (keepRawInput && carrierCode.length() > 0) { + phoneNumber.setPreferredDomesticCarrierCode(carrierCode.toString()); + } + } + } + int lengthOfNationalNumber = normalizedNationalNumber.length(); + if (lengthOfNationalNumber < MIN_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_NSN, + "The string supplied is too short to be a phone number."); + } + if (lengthOfNationalNumber > MAX_LENGTH_FOR_NSN) { + throw new NumberParseException(NumberParseException.ErrorType.TOO_LONG, + "The string supplied is too long to be a phone number."); + } + setItalianLeadingZerosForPhoneNumber(normalizedNationalNumber, phoneNumber); + phoneNumber.setNationalNumber(Long.parseLong(normalizedNationalNumber.toString())); + } + + /** + * Extracts the value of the phone-context parameter of numberToExtractFrom where the index of + * ";phone-context=" is the parameter indexOfPhoneContext, following the syntax defined in + * RFC3966. + * + * @return the extracted string (possibly empty), or null if no phone-context parameter is found. + */ + private String extractPhoneContext(String numberToExtractFrom, int indexOfPhoneContext) { + // If no phone-context parameter is present + if (indexOfPhoneContext == -1) { + return null; + } + + int phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length(); + // If phone-context parameter is empty + if (phoneContextStart >= numberToExtractFrom.length()) { + return ""; + } + + int phoneContextEnd = numberToExtractFrom.indexOf(';', phoneContextStart); + // If phone-context is not the last parameter + if (phoneContextEnd != -1) { + return numberToExtractFrom.substring(phoneContextStart, phoneContextEnd); + } else { + return numberToExtractFrom.substring(phoneContextStart); + } + } + + /** + * Returns whether the value of phoneContext follows the syntax defined in RFC3966. + */ + private boolean isPhoneContextValid(String phoneContext) { + if (phoneContext == null) { + return true; + } + if (phoneContext.length() == 0) { + return false; + } + + // Does phone-context value match pattern of global-number-digits or domainname + return RFC3966_GLOBAL_NUMBER_DIGITS_PATTERN.matcher(phoneContext).matches() + || RFC3966_DOMAINNAME_PATTERN.matcher(phoneContext).matches(); + } + + /** + * Converts numberToParse to a form that we can parse and write it to nationalNumber if it is + * written in RFC3966; otherwise extract a possible number out of it and write to nationalNumber. + */ + private void buildNationalNumberForParsing(String numberToParse, StringBuilder nationalNumber) + throws NumberParseException { + int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT); + + String phoneContext = extractPhoneContext(numberToParse, indexOfPhoneContext); + if (!isPhoneContextValid(phoneContext)) { + throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, + "The phone-context value is invalid."); + } + if (phoneContext != null) { + // If the phone context contains a phone number prefix, we need to capture it, whereas domains + // will be ignored. + if (phoneContext.charAt(0) == PLUS_SIGN) { + // Additional parameters might follow the phone context. If so, we will remove them here + // because the parameters after phone context are not important for parsing the phone + // number. + nationalNumber.append(phoneContext); + } + + // Now append everything between the "tel:" prefix and the phone-context. This should include + // the national number, an optional extension or isdn-subaddress component. Note we also + // handle the case when "tel:" is missing, as we have seen in some of the phone number inputs. + // In that case, we append everything from the beginning. + int indexOfRfc3966Prefix = numberToParse.indexOf(RFC3966_PREFIX); + int indexOfNationalNumber = + (indexOfRfc3966Prefix >= 0) ? indexOfRfc3966Prefix + RFC3966_PREFIX.length() : 0; + nationalNumber.append(numberToParse.substring(indexOfNationalNumber, indexOfPhoneContext)); + } else { + // Extract a possible number from the string passed in (this strips leading characters that + // could not be the start of a phone number.) + nationalNumber.append(extractPossibleNumber(numberToParse)); + } + + // Delete the isdn-subaddress and everything after it if it is present. Note extension won't + // appear at the same time with isdn-subaddress according to paragraph 5.3 of the RFC3966 spec, + int indexOfIsdn = nationalNumber.indexOf(RFC3966_ISDN_SUBADDRESS); + if (indexOfIsdn > 0) { + nationalNumber.delete(indexOfIsdn, nationalNumber.length()); + } + // If both phone context and isdn-subaddress are absent but other parameters are present, the + // parameters are left in nationalNumber. This is because we are concerned about deleting + // content from a potential number string when there is no strong evidence that the number is + // actually written in RFC3966. + } + + /** + * Returns a new phone number containing only the fields needed to uniquely identify a phone + * number, rather than any fields that capture the context in which the phone number was created. + * These fields correspond to those set in parse() rather than parseAndKeepRawInput(). + */ + private static PhoneNumber copyCoreFieldsOnly(PhoneNumber phoneNumberIn) { + PhoneNumber phoneNumber = new PhoneNumber(); + phoneNumber.setCountryCode(phoneNumberIn.getCountryCode()); + phoneNumber.setNationalNumber(phoneNumberIn.getNationalNumber()); + if (phoneNumberIn.getExtension().length() > 0) { + phoneNumber.setExtension(phoneNumberIn.getExtension()); + } + if (phoneNumberIn.isItalianLeadingZero()) { + phoneNumber.setItalianLeadingZero(true); + // This field is only relevant if there are leading zeros at all. + phoneNumber.setNumberOfLeadingZeros(phoneNumberIn.getNumberOfLeadingZeros()); + } + return phoneNumber; + } + + /** + * Takes two phone numbers and compares them for equality. + * + *

Returns EXACT_MATCH if the country_code, NSN, presence of a leading zero for Italian numbers + * and any extension present are the same. + * Returns NSN_MATCH if either or both has no region specified, and the NSNs and extensions are + * the same. + * Returns SHORT_NSN_MATCH if either or both has no region specified, or the region specified is + * the same, and one NSN could be a shorter version of the other number. This includes the case + * where one has an extension specified, and the other does not. + * Returns NO_MATCH otherwise. + * For example, the numbers +1 345 657 1234 and 657 1234 are a SHORT_NSN_MATCH. + * The numbers +1 345 657 1234 and 345 657 are a NO_MATCH. + * + * @param firstNumberIn first number to compare + * @param secondNumberIn second number to compare + * + * @return NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH or EXACT_MATCH depending on the level of equality + * of the two numbers, described in the method definition. + */ + public MatchType isNumberMatch(PhoneNumber firstNumberIn, PhoneNumber secondNumberIn) { + // We only care about the fields that uniquely define a number, so we copy these across + // explicitly. + PhoneNumber firstNumber = copyCoreFieldsOnly(firstNumberIn); + PhoneNumber secondNumber = copyCoreFieldsOnly(secondNumberIn); + // Early exit if both had extensions and these are different. + if (firstNumber.hasExtension() && secondNumber.hasExtension() + && !firstNumber.getExtension().equals(secondNumber.getExtension())) { + return MatchType.NO_MATCH; + } + int firstNumberCountryCode = firstNumber.getCountryCode(); + int secondNumberCountryCode = secondNumber.getCountryCode(); + // Both had country_code specified. + if (firstNumberCountryCode != 0 && secondNumberCountryCode != 0) { + if (firstNumber.exactlySameAs(secondNumber)) { + return MatchType.EXACT_MATCH; + } else if (firstNumberCountryCode == secondNumberCountryCode + && isNationalNumberSuffixOfTheOther(firstNumber, secondNumber)) { + // A SHORT_NSN_MATCH occurs if there is a difference because of the presence or absence of + // an 'Italian leading zero', the presence or absence of an extension, or one NSN being a + // shorter variant of the other. + return MatchType.SHORT_NSN_MATCH; + } + // This is not a match. + return MatchType.NO_MATCH; + } + // Checks cases where one or both country_code fields were not specified. To make equality + // checks easier, we first set the country_code fields to be equal. + firstNumber.setCountryCode(secondNumberCountryCode); + // If all else was the same, then this is an NSN_MATCH. + if (firstNumber.exactlySameAs(secondNumber)) { + return MatchType.NSN_MATCH; + } + if (isNationalNumberSuffixOfTheOther(firstNumber, secondNumber)) { + return MatchType.SHORT_NSN_MATCH; + } + return MatchType.NO_MATCH; + } + + // Returns true when one national number is the suffix of the other or both are the same. + private boolean isNationalNumberSuffixOfTheOther(PhoneNumber firstNumber, + PhoneNumber secondNumber) { + String firstNumberNationalNumber = String.valueOf(firstNumber.getNationalNumber()); + String secondNumberNationalNumber = String.valueOf(secondNumber.getNationalNumber()); + // Note that endsWith returns true if the numbers are equal. + return firstNumberNationalNumber.endsWith(secondNumberNationalNumber) + || secondNumberNationalNumber.endsWith(firstNumberNationalNumber); + } + + /** + * Takes two phone numbers as strings and compares them for equality. This is a convenience + * wrapper for {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known. + * + * @param firstNumber first number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @param secondNumber second number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details. + */ + public MatchType isNumberMatch(CharSequence firstNumber, CharSequence secondNumber) { + try { + PhoneNumber firstNumberAsProto = parse(firstNumber, UNKNOWN_REGION); + return isNumberMatch(firstNumberAsProto, secondNumber); + } catch (NumberParseException e) { + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + try { + PhoneNumber secondNumberAsProto = parse(secondNumber, UNKNOWN_REGION); + return isNumberMatch(secondNumberAsProto, firstNumber); + } catch (NumberParseException e2) { + if (e2.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + try { + PhoneNumber firstNumberProto = new PhoneNumber(); + PhoneNumber secondNumberProto = new PhoneNumber(); + parseHelper(firstNumber, null, false, false, firstNumberProto); + parseHelper(secondNumber, null, false, false, secondNumberProto); + return isNumberMatch(firstNumberProto, secondNumberProto); + } catch (NumberParseException e3) { + // Fall through and return MatchType.NOT_A_NUMBER. + } + } + } + } + } + // One or more of the phone numbers we are trying to match is not a viable phone number. + return MatchType.NOT_A_NUMBER; + } + + /** + * Takes two phone numbers and compares them for equality. This is a convenience wrapper for + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known. + * + * @param firstNumber first number to compare in proto buffer format + * @param secondNumber second number to compare. Can contain formatting, and can have country + * calling code specified with + at the start. + * @return NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See + * {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details. + */ + public MatchType isNumberMatch(PhoneNumber firstNumber, CharSequence secondNumber) { + // First see if the second number has an implicit country calling code, by attempting to parse + // it. + try { + PhoneNumber secondNumberAsProto = parse(secondNumber, UNKNOWN_REGION); + return isNumberMatch(firstNumber, secondNumberAsProto); + } catch (NumberParseException e) { + if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE) { + // The second number has no country calling code. EXACT_MATCH is no longer possible. + // We parse it as if the region was the same as that for the first number, and if + // EXACT_MATCH is returned, we replace this with NSN_MATCH. + String firstNumberRegion = getRegionCodeForCountryCode(firstNumber.getCountryCode()); + try { + if (!firstNumberRegion.equals(UNKNOWN_REGION)) { + PhoneNumber secondNumberWithFirstNumberRegion = parse(secondNumber, firstNumberRegion); + MatchType match = isNumberMatch(firstNumber, secondNumberWithFirstNumberRegion); + if (match == MatchType.EXACT_MATCH) { + return MatchType.NSN_MATCH; + } + return match; + } else { + // If the first number didn't have a valid country calling code, then we parse the + // second number without one as well. + PhoneNumber secondNumberProto = new PhoneNumber(); + parseHelper(secondNumber, null, false, false, secondNumberProto); + return isNumberMatch(firstNumber, secondNumberProto); + } + } catch (NumberParseException e2) { + // Fall-through to return NOT_A_NUMBER. + } + } + } + // One or more of the phone numbers we are trying to match is not a viable phone number. + return MatchType.NOT_A_NUMBER; + } + + /** + * Returns true if the number can be dialled from outside the region, or unknown. If the number + * can only be dialled from within the region, returns false. Does not check the number is a valid + * number. Note that, at the moment, this method does not handle short numbers (which are + * currently all presumed to not be diallable from outside their country). + * + * @param number the phone-number for which we want to know whether it is diallable from + * outside the region + */ + public boolean canBeInternationallyDialled(PhoneNumber number) { + PhoneMetadata metadata = getMetadataForRegion(getRegionCodeForNumber(number)); + if (metadata == null) { + // Note numbers belonging to non-geographical entities (e.g. +800 numbers) are always + // internationally diallable, and will be caught here. + return true; + } + String nationalSignificantNumber = getNationalSignificantNumber(number); + return !isNumberMatchingDesc(nationalSignificantNumber, metadata.getNoInternationalDialling()); + } + + /** + * Returns true if the supplied region supports mobile number portability. Returns false for + * invalid, unknown or regions that don't support mobile number portability. + * + * @param regionCode the region for which we want to know whether it supports mobile number + * portability or not + */ + public boolean isMobileNumberPortableRegion(String regionCode) { + PhoneMetadata metadata = getMetadataForRegion(regionCode); + if (metadata == null) { + logger.log(Level.WARNING, "Invalid or unknown region code provided: " + regionCode); + return false; + } + return metadata.getMobileNumberPortableRegion(); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonemetadata.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonemetadata.java new file mode 100644 index 0000000000..914c796368 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonemetadata.java @@ -0,0 +1,1188 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Definition of the class representing metadata for international telephone numbers. This class is + * hand created based on the class file compiled from phonemetadata.proto. Please refer to that file + * for detailed descriptions of the meaning of each field. + * + *

WARNING: This API isn't stable. It is considered libphonenumber-internal and can change at any + * time. We only declare it as public for easy inclusion in our build tools not in this package. + * Clients should not refer to this file, we do not commit to support backwards-compatibility or to + * warn about breaking changes. + */ + +package com.google.i18n.phonenumbers; + +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; + +public final class Phonemetadata { + private Phonemetadata() {} + public static class NumberFormat implements Externalizable { + private static final long serialVersionUID = 1; + public NumberFormat() {} + + /** + * Provides a dummy builder to 'emulate' the API of the code generated by the latest version of + * Protocol Buffers. This lets BuildMetadataFromXml class to build with both this hand created + * class and the one generated by the latest version of Protocol Buffers. + */ + public static final class Builder extends NumberFormat { + public NumberFormat build() { + return this; + } + + public Builder mergeFrom(NumberFormat other) { + if (other.hasPattern()) { + setPattern(other.getPattern()); + } + if (other.hasFormat()) { + setFormat(other.getFormat()); + } + for (int i = 0; i < other.leadingDigitsPatternSize(); i++) { + addLeadingDigitsPattern(other.getLeadingDigitsPattern(i)); + } + if (other.hasNationalPrefixFormattingRule()) { + setNationalPrefixFormattingRule(other.getNationalPrefixFormattingRule()); + } + if (other.hasDomesticCarrierCodeFormattingRule()) { + setDomesticCarrierCodeFormattingRule(other.getDomesticCarrierCodeFormattingRule()); + } + if (other.hasNationalPrefixOptionalWhenFormatting()) { + setNationalPrefixOptionalWhenFormatting(other.getNationalPrefixOptionalWhenFormatting()); + } + return this; + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + // required string pattern = 1; + private boolean hasPattern; + private String pattern_ = ""; + public boolean hasPattern() { return hasPattern; } + public String getPattern() { return pattern_; } + public NumberFormat setPattern(String value) { + hasPattern = true; + pattern_ = value; + return this; + } + + // required string format = 2; + private boolean hasFormat; + private String format_ = ""; + public boolean hasFormat() { return hasFormat; } + public String getFormat() { return format_; } + public NumberFormat setFormat(String value) { + hasFormat = true; + format_ = value; + return this; + } + + // repeated string leading_digits_pattern = 3; + private java.util.List leadingDigitsPattern_ = new java.util.ArrayList(); + public java.util.List leadingDigitPatterns() { + return leadingDigitsPattern_; + } + @Deprecated + public int leadingDigitsPatternSize() { return getLeadingDigitsPatternCount(); } + public int getLeadingDigitsPatternCount() { return leadingDigitsPattern_.size(); } + public String getLeadingDigitsPattern(int index) { + return leadingDigitsPattern_.get(index); + } + public NumberFormat addLeadingDigitsPattern(String value) { + if (value == null) { + throw new NullPointerException(); + } + leadingDigitsPattern_.add(value); + return this; + } + + // optional string national_prefix_formatting_rule = 4; + private boolean hasNationalPrefixFormattingRule; + private String nationalPrefixFormattingRule_ = ""; + public boolean hasNationalPrefixFormattingRule() { return hasNationalPrefixFormattingRule; } + public String getNationalPrefixFormattingRule() { return nationalPrefixFormattingRule_; } + public NumberFormat setNationalPrefixFormattingRule(String value) { + hasNationalPrefixFormattingRule = true; + nationalPrefixFormattingRule_ = value; + return this; + } + public NumberFormat clearNationalPrefixFormattingRule() { + hasNationalPrefixFormattingRule = false; + nationalPrefixFormattingRule_ = ""; + return this; + } + + // optional bool national_prefix_optional_when_formatting = 6 [default = false]; + private boolean hasNationalPrefixOptionalWhenFormatting; + private boolean nationalPrefixOptionalWhenFormatting_ = false; + public boolean hasNationalPrefixOptionalWhenFormatting() { + return hasNationalPrefixOptionalWhenFormatting; } + public boolean getNationalPrefixOptionalWhenFormatting() { + return nationalPrefixOptionalWhenFormatting_; } + public NumberFormat setNationalPrefixOptionalWhenFormatting(boolean value) { + hasNationalPrefixOptionalWhenFormatting = true; + nationalPrefixOptionalWhenFormatting_ = value; + return this; + } + + // optional string domestic_carrier_code_formatting_rule = 5; + private boolean hasDomesticCarrierCodeFormattingRule; + private String domesticCarrierCodeFormattingRule_ = ""; + public boolean hasDomesticCarrierCodeFormattingRule() { + return hasDomesticCarrierCodeFormattingRule; } + public String getDomesticCarrierCodeFormattingRule() { + return domesticCarrierCodeFormattingRule_; } + public NumberFormat setDomesticCarrierCodeFormattingRule(String value) { + hasDomesticCarrierCodeFormattingRule = true; + domesticCarrierCodeFormattingRule_ = value; + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeUTF(pattern_); + objectOutput.writeUTF(format_); + int leadingDigitsPatternSize = leadingDigitsPatternSize(); + objectOutput.writeInt(leadingDigitsPatternSize); + for (int i = 0; i < leadingDigitsPatternSize; i++) { + objectOutput.writeUTF(leadingDigitsPattern_.get(i)); + } + + objectOutput.writeBoolean(hasNationalPrefixFormattingRule); + if (hasNationalPrefixFormattingRule) { + objectOutput.writeUTF(nationalPrefixFormattingRule_); + } + objectOutput.writeBoolean(hasDomesticCarrierCodeFormattingRule); + if (hasDomesticCarrierCodeFormattingRule) { + objectOutput.writeUTF(domesticCarrierCodeFormattingRule_); + } + objectOutput.writeBoolean(nationalPrefixOptionalWhenFormatting_); + } + + public void readExternal(ObjectInput objectInput) throws IOException { + setPattern(objectInput.readUTF()); + setFormat(objectInput.readUTF()); + int leadingDigitsPatternSize = objectInput.readInt(); + for (int i = 0; i < leadingDigitsPatternSize; i++) { + leadingDigitsPattern_.add(objectInput.readUTF()); + } + if (objectInput.readBoolean()) { + setNationalPrefixFormattingRule(objectInput.readUTF()); + } + if (objectInput.readBoolean()) { + setDomesticCarrierCodeFormattingRule(objectInput.readUTF()); + } + setNationalPrefixOptionalWhenFormatting(objectInput.readBoolean()); + } + } + + public static class PhoneNumberDesc implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneNumberDesc() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneNumberDesc { + public PhoneNumberDesc build() { + return this; + } + + public Builder mergeFrom(PhoneNumberDesc other) { + if (other.hasNationalNumberPattern()) { + setNationalNumberPattern(other.getNationalNumberPattern()); + } + for (int i = 0; i < other.getPossibleLengthCount(); i++) { + addPossibleLength(other.getPossibleLength(i)); + } + for (int i = 0; i < other.getPossibleLengthLocalOnlyCount(); i++) { + addPossibleLengthLocalOnly(other.getPossibleLengthLocalOnly(i)); + } + if (other.hasExampleNumber()) { + setExampleNumber(other.getExampleNumber()); + } + return this; + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + // optional string national_number_pattern = 2; + private boolean hasNationalNumberPattern; + private String nationalNumberPattern_ = ""; + public boolean hasNationalNumberPattern() { return hasNationalNumberPattern; } + public String getNationalNumberPattern() { return nationalNumberPattern_; } + public PhoneNumberDesc setNationalNumberPattern(String value) { + hasNationalNumberPattern = true; + nationalNumberPattern_ = value; + return this; + } + public PhoneNumberDesc clearNationalNumberPattern() { + hasNationalNumberPattern = false; + nationalNumberPattern_ = ""; + return this; + } + + // repeated int32 possible_length = 9; + private java.util.List possibleLength_ = new java.util.ArrayList(); + public java.util.List getPossibleLengthList() { + return possibleLength_; + } + public int getPossibleLengthCount() { return possibleLength_.size(); } + public int getPossibleLength(int index) { + return possibleLength_.get(index); + } + public PhoneNumberDesc addPossibleLength(int value) { + possibleLength_.add(value); + return this; + } + public PhoneNumberDesc clearPossibleLength() { + possibleLength_.clear(); + return this; + } + + // repeated int32 possible_length_local_only = 10; + private java.util.List possibleLengthLocalOnly_ = new java.util.ArrayList(); + public java.util.List getPossibleLengthLocalOnlyList() { + return possibleLengthLocalOnly_; + } + public int getPossibleLengthLocalOnlyCount() { return possibleLengthLocalOnly_.size(); } + public int getPossibleLengthLocalOnly(int index) { + return possibleLengthLocalOnly_.get(index); + } + public PhoneNumberDesc addPossibleLengthLocalOnly(int value) { + possibleLengthLocalOnly_.add(value); + return this; + } + public PhoneNumberDesc clearPossibleLengthLocalOnly() { + possibleLengthLocalOnly_.clear(); + return this; + } + + // optional string example_number = 6; + private boolean hasExampleNumber; + private String exampleNumber_ = ""; + public boolean hasExampleNumber() { return hasExampleNumber; } + public String getExampleNumber() { return exampleNumber_; } + public PhoneNumberDesc setExampleNumber(String value) { + hasExampleNumber = true; + exampleNumber_ = value; + return this; + } + public PhoneNumberDesc clearExampleNumber() { + hasExampleNumber = false; + exampleNumber_ = ""; + return this; + } + + public boolean exactlySameAs(PhoneNumberDesc other) { + return nationalNumberPattern_.equals(other.nationalNumberPattern_) && + possibleLength_.equals(other.possibleLength_) && + possibleLengthLocalOnly_.equals(other.possibleLengthLocalOnly_) && + exampleNumber_.equals(other.exampleNumber_); + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeBoolean(hasNationalNumberPattern); + if (hasNationalNumberPattern) { + objectOutput.writeUTF(nationalNumberPattern_); + } + + int possibleLengthSize = getPossibleLengthCount(); + objectOutput.writeInt(possibleLengthSize); + for (int i = 0; i < possibleLengthSize; i++) { + objectOutput.writeInt(possibleLength_.get(i)); + } + + int possibleLengthLocalOnlySize = getPossibleLengthLocalOnlyCount(); + objectOutput.writeInt(possibleLengthLocalOnlySize); + for (int i = 0; i < possibleLengthLocalOnlySize; i++) { + objectOutput.writeInt(possibleLengthLocalOnly_.get(i)); + } + + objectOutput.writeBoolean(hasExampleNumber); + if (hasExampleNumber) { + objectOutput.writeUTF(exampleNumber_); + } + } + + public void readExternal(ObjectInput objectInput) throws IOException { + if (objectInput.readBoolean()) { + setNationalNumberPattern(objectInput.readUTF()); + } + + int possibleLengthSize = objectInput.readInt(); + for (int i = 0; i < possibleLengthSize; i++) { + possibleLength_.add(objectInput.readInt()); + } + + int possibleLengthLocalOnlySize = objectInput.readInt(); + for (int i = 0; i < possibleLengthLocalOnlySize; i++) { + possibleLengthLocalOnly_.add(objectInput.readInt()); + } + + if (objectInput.readBoolean()) { + setExampleNumber(objectInput.readUTF()); + } + } + } + + public static class PhoneMetadata implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneMetadata() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneMetadata { + public PhoneMetadata build() { + return this; + } + + public Builder setId(String value) { + super.setId(value); + return this; + } + + public Builder setInternationalPrefix(String value) { + super.setInternationalPrefix(value); + return this; + } + } + public static Builder newBuilder() { + return new Builder(); + } + + // optional PhoneNumberDesc general_desc = 1; + private boolean hasGeneralDesc; + private PhoneNumberDesc generalDesc_ = null; + public boolean hasGeneralDesc() { return hasGeneralDesc; } + public PhoneNumberDesc getGeneralDesc() { return generalDesc_; } + public PhoneNumberDesc getGeneralDescBuilder() { + if (generalDesc_ == null) { + generalDesc_ = new PhoneNumberDesc(); + } + return generalDesc_ ; + } + public PhoneMetadata setGeneralDesc(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasGeneralDesc = true; + generalDesc_ = value; + return this; + } + + // optional PhoneNumberDesc fixed_line = 2; + private boolean hasFixedLine; + private PhoneNumberDesc fixedLine_ = null; + public boolean hasFixedLine() { return hasFixedLine; } + public PhoneNumberDesc getFixedLine() { return fixedLine_; } + public PhoneMetadata setFixedLine(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasFixedLine = true; + fixedLine_ = value; + return this; + } + + // optional PhoneNumberDesc mobile = 3; + private boolean hasMobile; + private PhoneNumberDesc mobile_ = null; + public boolean hasMobile() { return hasMobile; } + public PhoneNumberDesc getMobile() { return mobile_; } + public PhoneMetadata setMobile(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasMobile = true; + mobile_ = value; + return this; + } + + // optional PhoneNumberDesc toll_free = 4; + private boolean hasTollFree; + private PhoneNumberDesc tollFree_ = null; + public boolean hasTollFree() { return hasTollFree; } + public PhoneNumberDesc getTollFree() { return tollFree_; } + public PhoneMetadata setTollFree(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasTollFree = true; + tollFree_ = value; + return this; + } + + // optional PhoneNumberDesc premium_rate = 5; + private boolean hasPremiumRate; + private PhoneNumberDesc premiumRate_ = null; + public boolean hasPremiumRate() { return hasPremiumRate; } + public PhoneNumberDesc getPremiumRate() { return premiumRate_; } + public PhoneMetadata setPremiumRate(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPremiumRate = true; + premiumRate_ = value; + return this; + } + + // optional PhoneNumberDesc shared_cost = 6; + private boolean hasSharedCost; + private PhoneNumberDesc sharedCost_ = null; + public boolean hasSharedCost() { return hasSharedCost; } + public PhoneNumberDesc getSharedCost() { return sharedCost_; } + public PhoneMetadata setSharedCost(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasSharedCost = true; + sharedCost_ = value; + return this; + } + + // optional PhoneNumberDesc personal_number = 7; + private boolean hasPersonalNumber; + private PhoneNumberDesc personalNumber_ = null; + public boolean hasPersonalNumber() { return hasPersonalNumber; } + public PhoneNumberDesc getPersonalNumber() { return personalNumber_; } + public PhoneMetadata setPersonalNumber(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPersonalNumber = true; + personalNumber_ = value; + return this; + } + + // optional PhoneNumberDesc voip = 8; + private boolean hasVoip; + private PhoneNumberDesc voip_ = null; + public boolean hasVoip() { return hasVoip; } + public PhoneNumberDesc getVoip() { return voip_; } + public PhoneMetadata setVoip(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasVoip = true; + voip_ = value; + return this; + } + + // optional PhoneNumberDesc pager = 21; + private boolean hasPager; + private PhoneNumberDesc pager_ = null; + public boolean hasPager() { return hasPager; } + public PhoneNumberDesc getPager() { return pager_; } + public PhoneMetadata setPager(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasPager = true; + pager_ = value; + return this; + } + + // optional PhoneNumberDesc uan = 25; + private boolean hasUan; + private PhoneNumberDesc uan_ = null; + public boolean hasUan() { return hasUan; } + public PhoneNumberDesc getUan() { return uan_; } + public PhoneMetadata setUan(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasUan = true; + uan_ = value; + return this; + } + + // optional PhoneNumberDesc emergency = 27; + private boolean hasEmergency; + private PhoneNumberDesc emergency_ = null; + public boolean hasEmergency() { return hasEmergency; } + public PhoneNumberDesc getEmergency() { return emergency_; } + public PhoneMetadata setEmergency(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasEmergency = true; + emergency_ = value; + return this; + } + + // optional PhoneNumberDesc voicemail = 28; + private boolean hasVoicemail; + private PhoneNumberDesc voicemail_ = null; + public boolean hasVoicemail() { return hasVoicemail; } + public PhoneNumberDesc getVoicemail() { return voicemail_; } + public PhoneMetadata setVoicemail(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasVoicemail = true; + voicemail_ = value; + return this; + } + + // optional PhoneNumberDesc short_code = 29; + private boolean hasShortCode; + private PhoneNumberDesc shortCode_ = null; + public boolean hasShortCode() { return hasShortCode; } + public PhoneNumberDesc getShortCode() { return shortCode_; } + public PhoneMetadata setShortCode(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasShortCode = true; + shortCode_ = value; + return this; + } + + // optional PhoneNumberDesc standard_rate = 30; + private boolean hasStandardRate; + private PhoneNumberDesc standardRate_ = null; + public boolean hasStandardRate() { return hasStandardRate; } + public PhoneNumberDesc getStandardRate() { return standardRate_; } + public PhoneMetadata setStandardRate(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasStandardRate = true; + standardRate_ = value; + return this; + } + + // optional PhoneNumberDesc carrier_specific = 31; + private boolean hasCarrierSpecific; + private PhoneNumberDesc carrierSpecific_ = null; + public boolean hasCarrierSpecific() { return hasCarrierSpecific; } + public PhoneNumberDesc getCarrierSpecific() { return carrierSpecific_; } + public PhoneMetadata setCarrierSpecific(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasCarrierSpecific = true; + carrierSpecific_ = value; + return this; + } + + // optional PhoneNumberDesc sms_services = 33; + private boolean hasSmsServices; + private PhoneNumberDesc smsServices_ = null; + public boolean hasSmsServices() { return hasSmsServices; } + public PhoneNumberDesc getSmsServices() { return smsServices_; } + public PhoneMetadata setSmsServices(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasSmsServices = true; + smsServices_ = value; + return this; + } + + // optional PhoneNumberDesc noInternationalDialling = 24; + private boolean hasNoInternationalDialling; + private PhoneNumberDesc noInternationalDialling_ = null; + public boolean hasNoInternationalDialling() { return hasNoInternationalDialling; } + public PhoneNumberDesc getNoInternationalDialling() { return noInternationalDialling_; } + public PhoneMetadata setNoInternationalDialling(PhoneNumberDesc value) { + if (value == null) { + throw new NullPointerException(); + } + hasNoInternationalDialling = true; + noInternationalDialling_ = value; + return this; + } + + // required string id = 9; + private boolean hasId; + private String id_ = ""; + public boolean hasId() { return hasId; } + public String getId() { return id_; } + public PhoneMetadata setId(String value) { + hasId = true; + id_ = value; + return this; + } + + // optional int32 country_code = 10; + private boolean hasCountryCode; + private int countryCode_ = 0; + public boolean hasCountryCode() { return hasCountryCode; } + public int getCountryCode() { return countryCode_; } + public PhoneMetadata setCountryCode(int value) { + hasCountryCode = true; + countryCode_ = value; + return this; + } + + // optional string international_prefix = 11; + private boolean hasInternationalPrefix; + private String internationalPrefix_ = ""; + public boolean hasInternationalPrefix() { return hasInternationalPrefix; } + public String getInternationalPrefix() { return internationalPrefix_; } + public PhoneMetadata setInternationalPrefix(String value) { + hasInternationalPrefix = true; + internationalPrefix_ = value; + return this; + } + + // optional string preferred_international_prefix = 17; + private boolean hasPreferredInternationalPrefix; + private String preferredInternationalPrefix_ = ""; + public boolean hasPreferredInternationalPrefix() { return hasPreferredInternationalPrefix; } + public String getPreferredInternationalPrefix() { return preferredInternationalPrefix_; } + public PhoneMetadata setPreferredInternationalPrefix(String value) { + hasPreferredInternationalPrefix = true; + preferredInternationalPrefix_ = value; + return this; + } + public PhoneMetadata clearPreferredInternationalPrefix() { + hasPreferredInternationalPrefix = false; + preferredInternationalPrefix_ = ""; + return this; + } + + // optional string national_prefix = 12; + private boolean hasNationalPrefix; + private String nationalPrefix_ = ""; + public boolean hasNationalPrefix() { return hasNationalPrefix; } + public String getNationalPrefix() { return nationalPrefix_; } + public PhoneMetadata setNationalPrefix(String value) { + hasNationalPrefix = true; + nationalPrefix_ = value; + return this; + } + public PhoneMetadata clearNationalPrefix() { + hasNationalPrefix = false; + nationalPrefix_ = ""; + return this; + } + + // optional string preferred_extn_prefix = 13; + private boolean hasPreferredExtnPrefix; + private String preferredExtnPrefix_ = ""; + public boolean hasPreferredExtnPrefix() { return hasPreferredExtnPrefix; } + public String getPreferredExtnPrefix() { return preferredExtnPrefix_; } + public PhoneMetadata setPreferredExtnPrefix(String value) { + hasPreferredExtnPrefix = true; + preferredExtnPrefix_ = value; + return this; + } + public PhoneMetadata clearPreferredExtnPrefix() { + hasPreferredExtnPrefix = false; + preferredExtnPrefix_ = ""; + return this; + } + + // optional string national_prefix_for_parsing = 15; + private boolean hasNationalPrefixForParsing; + private String nationalPrefixForParsing_ = ""; + public boolean hasNationalPrefixForParsing() { return hasNationalPrefixForParsing; } + public String getNationalPrefixForParsing() { return nationalPrefixForParsing_; } + public PhoneMetadata setNationalPrefixForParsing(String value) { + hasNationalPrefixForParsing = true; + nationalPrefixForParsing_ = value; + return this; + } + + // optional string national_prefix_transform_rule = 16; + private boolean hasNationalPrefixTransformRule; + private String nationalPrefixTransformRule_ = ""; + public boolean hasNationalPrefixTransformRule() { return hasNationalPrefixTransformRule; } + public String getNationalPrefixTransformRule() { return nationalPrefixTransformRule_; } + public PhoneMetadata setNationalPrefixTransformRule(String value) { + hasNationalPrefixTransformRule = true; + nationalPrefixTransformRule_ = value; + return this; + } + public PhoneMetadata clearNationalPrefixTransformRule() { + hasNationalPrefixTransformRule = false; + nationalPrefixTransformRule_ = ""; + return this; + } + + // optional bool same_mobile_and_fixed_line_pattern = 18 [default = false]; + private boolean hasSameMobileAndFixedLinePattern; + private boolean sameMobileAndFixedLinePattern_ = false; + public boolean hasSameMobileAndFixedLinePattern() { return hasSameMobileAndFixedLinePattern; } + public boolean getSameMobileAndFixedLinePattern() { return sameMobileAndFixedLinePattern_; } + public PhoneMetadata setSameMobileAndFixedLinePattern(boolean value) { + hasSameMobileAndFixedLinePattern = true; + sameMobileAndFixedLinePattern_ = value; + return this; + } + public PhoneMetadata clearSameMobileAndFixedLinePattern() { + hasSameMobileAndFixedLinePattern = false; + sameMobileAndFixedLinePattern_ = false; + return this; + } + + // repeated NumberFormat number_format = 19; + private java.util.List numberFormat_ = new java.util.ArrayList(); + @Deprecated + public java.util.List numberFormats() { + return getNumberFormatList(); + } + public java.util.List getNumberFormatList() { + return numberFormat_; + } + @Deprecated + public int numberFormatSize() { return getNumberFormatCount(); } + public int getNumberFormatCount() { return numberFormat_.size(); } + public NumberFormat getNumberFormat(int index) { + return numberFormat_.get(index); + } + public PhoneMetadata addNumberFormat(NumberFormat value) { + if (value == null) { + throw new NullPointerException(); + } + numberFormat_.add(value); + return this; + } + + // repeated NumberFormat intl_number_format = 20; + private java.util.List intlNumberFormat_ = + new java.util.ArrayList(); + @Deprecated + public java.util.List intlNumberFormats() { + return getIntlNumberFormatList(); + } + public java.util.List getIntlNumberFormatList() { + return intlNumberFormat_; + } + @Deprecated + public int intlNumberFormatSize() { return getIntlNumberFormatCount(); } + public int getIntlNumberFormatCount() { return intlNumberFormat_.size(); } + public NumberFormat getIntlNumberFormat(int index) { + return intlNumberFormat_.get(index); + } + + public PhoneMetadata addIntlNumberFormat(NumberFormat value) { + if (value == null) { + throw new NullPointerException(); + } + intlNumberFormat_.add(value); + return this; + } + public PhoneMetadata clearIntlNumberFormat() { + intlNumberFormat_.clear(); + return this; + } + + // optional bool main_country_for_code = 22 [default = false]; + private boolean hasMainCountryForCode; + private boolean mainCountryForCode_ = false; + public boolean hasMainCountryForCode() { return hasMainCountryForCode; } + public boolean isMainCountryForCode() { return mainCountryForCode_; } + // Method that lets this class have the same interface as the one generated by Protocol Buffers + // which is used by C++ build tools. + public boolean getMainCountryForCode() { return mainCountryForCode_; } + public PhoneMetadata setMainCountryForCode(boolean value) { + hasMainCountryForCode = true; + mainCountryForCode_ = value; + return this; + } + public PhoneMetadata clearMainCountryForCode() { + hasMainCountryForCode = false; + mainCountryForCode_ = false; + return this; + } + + // optional string leading_digits = 23; + private boolean hasLeadingDigits; + private String leadingDigits_ = ""; + public boolean hasLeadingDigits() { return hasLeadingDigits; } + public String getLeadingDigits() { return leadingDigits_; } + public PhoneMetadata setLeadingDigits(String value) { + hasLeadingDigits = true; + leadingDigits_ = value; + return this; + } + + // optional bool mobile_number_portable_region = 32 [default = false]; + private boolean hasMobileNumberPortableRegion; + private boolean mobileNumberPortableRegion_ = false; + public boolean hasMobileNumberPortableRegion() { return hasMobileNumberPortableRegion; } + @Deprecated + public boolean isMobileNumberPortableRegion() { return getMobileNumberPortableRegion(); } + public boolean getMobileNumberPortableRegion() { return mobileNumberPortableRegion_; } + public PhoneMetadata setMobileNumberPortableRegion(boolean value) { + hasMobileNumberPortableRegion = true; + mobileNumberPortableRegion_ = value; + return this; + } + public PhoneMetadata clearMobileNumberPortableRegion() { + hasMobileNumberPortableRegion = false; + mobileNumberPortableRegion_ = false; + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.writeBoolean(hasGeneralDesc); + if (hasGeneralDesc) { + generalDesc_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasFixedLine); + if (hasFixedLine) { + fixedLine_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasMobile); + if (hasMobile) { + mobile_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasTollFree); + if (hasTollFree) { + tollFree_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPremiumRate); + if (hasPremiumRate) { + premiumRate_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasSharedCost); + if (hasSharedCost) { + sharedCost_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPersonalNumber); + if (hasPersonalNumber) { + personalNumber_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasVoip); + if (hasVoip) { + voip_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasPager); + if (hasPager) { + pager_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasUan); + if (hasUan) { + uan_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasEmergency); + if (hasEmergency) { + emergency_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasVoicemail); + if (hasVoicemail) { + voicemail_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasShortCode); + if (hasShortCode) { + shortCode_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasStandardRate); + if (hasStandardRate) { + standardRate_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasCarrierSpecific); + if (hasCarrierSpecific) { + carrierSpecific_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasSmsServices); + if (hasSmsServices) { + smsServices_.writeExternal(objectOutput); + } + objectOutput.writeBoolean(hasNoInternationalDialling); + if (hasNoInternationalDialling) { + noInternationalDialling_.writeExternal(objectOutput); + } + + objectOutput.writeUTF(id_); + objectOutput.writeInt(countryCode_); + objectOutput.writeUTF(internationalPrefix_); + + objectOutput.writeBoolean(hasPreferredInternationalPrefix); + if (hasPreferredInternationalPrefix) { + objectOutput.writeUTF(preferredInternationalPrefix_); + } + + objectOutput.writeBoolean(hasNationalPrefix); + if (hasNationalPrefix) { + objectOutput.writeUTF(nationalPrefix_); + } + + objectOutput.writeBoolean(hasPreferredExtnPrefix); + if (hasPreferredExtnPrefix) { + objectOutput.writeUTF(preferredExtnPrefix_); + } + + objectOutput.writeBoolean(hasNationalPrefixForParsing); + if (hasNationalPrefixForParsing) { + objectOutput.writeUTF(nationalPrefixForParsing_); + } + + objectOutput.writeBoolean(hasNationalPrefixTransformRule); + if (hasNationalPrefixTransformRule) { + objectOutput.writeUTF(nationalPrefixTransformRule_); + } + + objectOutput.writeBoolean(sameMobileAndFixedLinePattern_); + + int numberFormatSize = numberFormatSize(); + objectOutput.writeInt(numberFormatSize); + for (int i = 0; i < numberFormatSize; i++) { + numberFormat_.get(i).writeExternal(objectOutput); + } + + int intlNumberFormatSize = intlNumberFormatSize(); + objectOutput.writeInt(intlNumberFormatSize); + for (int i = 0; i < intlNumberFormatSize; i++) { + intlNumberFormat_.get(i).writeExternal(objectOutput); + } + + objectOutput.writeBoolean(mainCountryForCode_); + + objectOutput.writeBoolean(hasLeadingDigits); + if (hasLeadingDigits) { + objectOutput.writeUTF(leadingDigits_); + } + + objectOutput.writeBoolean(mobileNumberPortableRegion_); + } + + public void readExternal(ObjectInput objectInput) throws IOException { + boolean hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setGeneralDesc(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setFixedLine(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setMobile(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setTollFree(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPremiumRate(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setSharedCost(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPersonalNumber(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setVoip(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setPager(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setUan(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setEmergency(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setVoicemail(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setShortCode(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setStandardRate(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setCarrierSpecific(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setSmsServices(desc); + } + hasDesc = objectInput.readBoolean(); + if (hasDesc) { + PhoneNumberDesc desc = new PhoneNumberDesc(); + desc.readExternal(objectInput); + setNoInternationalDialling(desc); + } + + setId(objectInput.readUTF()); + setCountryCode(objectInput.readInt()); + setInternationalPrefix(objectInput.readUTF()); + + boolean hasString = objectInput.readBoolean(); + if (hasString) { + setPreferredInternationalPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setPreferredExtnPrefix(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefixForParsing(objectInput.readUTF()); + } + + hasString = objectInput.readBoolean(); + if (hasString) { + setNationalPrefixTransformRule(objectInput.readUTF()); + } + + setSameMobileAndFixedLinePattern(objectInput.readBoolean()); + + int nationalFormatSize = objectInput.readInt(); + for (int i = 0; i < nationalFormatSize; i++) { + NumberFormat numFormat = new NumberFormat(); + numFormat.readExternal(objectInput); + numberFormat_.add(numFormat); + } + + int intlNumberFormatSize = objectInput.readInt(); + for (int i = 0; i < intlNumberFormatSize; i++) { + NumberFormat numFormat = new NumberFormat(); + numFormat.readExternal(objectInput); + intlNumberFormat_.add(numFormat); + } + + setMainCountryForCode(objectInput.readBoolean()); + + hasString = objectInput.readBoolean(); + if (hasString) { + setLeadingDigits(objectInput.readUTF()); + } + + setMobileNumberPortableRegion(objectInput.readBoolean()); + } + } + + public static class PhoneMetadataCollection implements Externalizable { + private static final long serialVersionUID = 1; + public PhoneMetadataCollection() {} + + /** + * Provides a dummy builder. + * + * @see NumberFormat.Builder + */ + public static final class Builder extends PhoneMetadataCollection { + public PhoneMetadataCollection build() { + return this; + } + } + public static Builder newBuilder() { + return new Builder(); + } + + // repeated PhoneMetadata metadata = 1; + private java.util.List metadata_ = new java.util.ArrayList(); + + public java.util.List getMetadataList() { + return metadata_; + } + public int getMetadataCount() { return metadata_.size(); } + + public PhoneMetadataCollection addMetadata(PhoneMetadata value) { + if (value == null) { + throw new NullPointerException(); + } + metadata_.add(value); + return this; + } + + public void writeExternal(ObjectOutput objectOutput) throws IOException { + int size = getMetadataCount(); + objectOutput.writeInt(size); + for (int i = 0; i < size; i++) { + metadata_.get(i).writeExternal(objectOutput); + } + } + + public void readExternal(ObjectInput objectInput) throws IOException { + int size = objectInput.readInt(); + for (int i = 0; i < size; i++) { + PhoneMetadata metadata = new PhoneMetadata(); + metadata.readExternal(objectInput); + metadata_.add(metadata); + } + } + + public PhoneMetadataCollection clear() { + metadata_.clear(); + return this; + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonenumber.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonenumber.java new file mode 100644 index 0000000000..fe88a465c6 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/Phonenumber.java @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Definition of the class representing international telephone numbers. This class is hand-created + * based on the class file compiled from phonenumber.proto. Please refer to that file for detailed + * descriptions of the meaning of each field. + */ + +package com.google.i18n.phonenumbers; + +import java.io.Serializable; + +public final class Phonenumber { + private Phonenumber() {} + public static class PhoneNumber implements Serializable { + private static final long serialVersionUID = 1L; + public enum CountryCodeSource { + FROM_NUMBER_WITH_PLUS_SIGN, + FROM_NUMBER_WITH_IDD, + FROM_NUMBER_WITHOUT_PLUS_SIGN, + FROM_DEFAULT_COUNTRY, + UNSPECIFIED + } + + public PhoneNumber() { + countryCodeSource_ = CountryCodeSource.UNSPECIFIED; + } + + // required int32 country_code = 1; + private boolean hasCountryCode; + private int countryCode_ = 0; + public boolean hasCountryCode() { return hasCountryCode; } + public int getCountryCode() { return countryCode_; } + public PhoneNumber setCountryCode(int value) { + hasCountryCode = true; + countryCode_ = value; + return this; + } + public PhoneNumber clearCountryCode() { + hasCountryCode = false; + countryCode_ = 0; + return this; + } + + // required uint64 national_number = 2; + private boolean hasNationalNumber; + private long nationalNumber_ = 0L; + public boolean hasNationalNumber() { return hasNationalNumber; } + public long getNationalNumber() { return nationalNumber_; } + public PhoneNumber setNationalNumber(long value) { + hasNationalNumber = true; + nationalNumber_ = value; + return this; + } + public PhoneNumber clearNationalNumber() { + hasNationalNumber = false; + nationalNumber_ = 0L; + return this; + } + + // optional string extension = 3; + private boolean hasExtension; + private java.lang.String extension_ = ""; + public boolean hasExtension() { return hasExtension; } + public String getExtension() { return extension_; } + public PhoneNumber setExtension(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasExtension = true; + extension_ = value; + return this; + } + public PhoneNumber clearExtension() { + hasExtension = false; + extension_ = ""; + return this; + } + + // optional bool italian_leading_zero = 4; + private boolean hasItalianLeadingZero; + private boolean italianLeadingZero_ = false; + public boolean hasItalianLeadingZero() { return hasItalianLeadingZero; } + public boolean isItalianLeadingZero() { return italianLeadingZero_; } + public PhoneNumber setItalianLeadingZero(boolean value) { + hasItalianLeadingZero = true; + italianLeadingZero_ = value; + return this; + } + public PhoneNumber clearItalianLeadingZero() { + hasItalianLeadingZero = false; + italianLeadingZero_ = false; + return this; + } + + // optional int32 number_of_leading_zeros = 8 [default = 1]; + private boolean hasNumberOfLeadingZeros; + private int numberOfLeadingZeros_ = 1; + public boolean hasNumberOfLeadingZeros() { return hasNumberOfLeadingZeros; } + public int getNumberOfLeadingZeros() { return numberOfLeadingZeros_; } + public PhoneNumber setNumberOfLeadingZeros(int value) { + hasNumberOfLeadingZeros = true; + numberOfLeadingZeros_ = value; + return this; + } + public PhoneNumber clearNumberOfLeadingZeros() { + hasNumberOfLeadingZeros = false; + numberOfLeadingZeros_ = 1; + return this; + } + + // optional string raw_input = 5; + private boolean hasRawInput; + private String rawInput_ = ""; + public boolean hasRawInput() { return hasRawInput; } + public String getRawInput() { return rawInput_; } + public PhoneNumber setRawInput(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasRawInput = true; + rawInput_ = value; + return this; + } + public PhoneNumber clearRawInput() { + hasRawInput = false; + rawInput_ = ""; + return this; + } + + // optional CountryCodeSource country_code_source = 6; + private boolean hasCountryCodeSource; + private CountryCodeSource countryCodeSource_; + public boolean hasCountryCodeSource() { return hasCountryCodeSource; } + public CountryCodeSource getCountryCodeSource() { return countryCodeSource_; } + public PhoneNumber setCountryCodeSource(CountryCodeSource value) { + if (value == null) { + throw new NullPointerException(); + } + hasCountryCodeSource = true; + countryCodeSource_ = value; + return this; + } + public PhoneNumber clearCountryCodeSource() { + hasCountryCodeSource = false; + countryCodeSource_ = CountryCodeSource.UNSPECIFIED; + return this; + } + + // optional string preferred_domestic_carrier_code = 7; + private boolean hasPreferredDomesticCarrierCode; + private java.lang.String preferredDomesticCarrierCode_ = ""; + public boolean hasPreferredDomesticCarrierCode() { return hasPreferredDomesticCarrierCode; } + public String getPreferredDomesticCarrierCode() { return preferredDomesticCarrierCode_; } + public PhoneNumber setPreferredDomesticCarrierCode(String value) { + if (value == null) { + throw new NullPointerException(); + } + hasPreferredDomesticCarrierCode = true; + preferredDomesticCarrierCode_ = value; + return this; + } + public PhoneNumber clearPreferredDomesticCarrierCode() { + hasPreferredDomesticCarrierCode = false; + preferredDomesticCarrierCode_ = ""; + return this; + } + + public final PhoneNumber clear() { + clearCountryCode(); + clearNationalNumber(); + clearExtension(); + clearItalianLeadingZero(); + clearNumberOfLeadingZeros(); + clearRawInput(); + clearCountryCodeSource(); + clearPreferredDomesticCarrierCode(); + return this; + } + + public PhoneNumber mergeFrom(PhoneNumber other) { + if (other.hasCountryCode()) { + setCountryCode(other.getCountryCode()); + } + if (other.hasNationalNumber()) { + setNationalNumber(other.getNationalNumber()); + } + if (other.hasExtension()) { + setExtension(other.getExtension()); + } + if (other.hasItalianLeadingZero()) { + setItalianLeadingZero(other.isItalianLeadingZero()); + } + if (other.hasNumberOfLeadingZeros()) { + setNumberOfLeadingZeros(other.getNumberOfLeadingZeros()); + } + if (other.hasRawInput()) { + setRawInput(other.getRawInput()); + } + if (other.hasCountryCodeSource()) { + setCountryCodeSource(other.getCountryCodeSource()); + } + if (other.hasPreferredDomesticCarrierCode()) { + setPreferredDomesticCarrierCode(other.getPreferredDomesticCarrierCode()); + } + return this; + } + + public boolean exactlySameAs(PhoneNumber other) { + if (other == null) { + return false; + } + if (this == other) { + return true; + } + return (countryCode_ == other.countryCode_ && nationalNumber_ == other.nationalNumber_ && + extension_.equals(other.extension_) && italianLeadingZero_ == other.italianLeadingZero_ && + numberOfLeadingZeros_ == other.numberOfLeadingZeros_ && + rawInput_.equals(other.rawInput_) && countryCodeSource_ == other.countryCodeSource_ && + preferredDomesticCarrierCode_.equals(other.preferredDomesticCarrierCode_) && + hasPreferredDomesticCarrierCode() == other.hasPreferredDomesticCarrierCode()); + } + + @Override + public boolean equals(Object that) { + return (that instanceof PhoneNumber) && exactlySameAs((PhoneNumber) that); + } + + @Override + public int hashCode() { + // Simplified rendition of the hashCode function automatically generated from the proto + // compiler with java_generate_equals_and_hash set to true. We are happy with unset values to + // be considered equal to their explicitly-set equivalents, so don't check if any value is + // unknown. The only exception to this is the preferred domestic carrier code. + int hash = 41; + hash = (53 * hash) + getCountryCode(); + hash = (53 * hash) + Long.valueOf(getNationalNumber()).hashCode(); + hash = (53 * hash) + getExtension().hashCode(); + hash = (53 * hash) + (isItalianLeadingZero() ? 1231 : 1237); + hash = (53 * hash) + getNumberOfLeadingZeros(); + hash = (53 * hash) + getRawInput().hashCode(); + hash = (53 * hash) + getCountryCodeSource().hashCode(); + hash = (53 * hash) + getPreferredDomesticCarrierCode().hashCode(); + hash = (53 * hash) + (hasPreferredDomesticCarrierCode() ? 1231 : 1237); + return hash; + } + + @Override + public String toString() { + StringBuilder outputString = new StringBuilder(); + outputString.append("Country Code: ").append(countryCode_); + outputString.append(" National Number: ").append(nationalNumber_); + if (hasItalianLeadingZero() && isItalianLeadingZero()) { + outputString.append(" Leading Zero(s): true"); + } + if (hasNumberOfLeadingZeros()) { + outputString.append(" Number of leading zeros: ").append(numberOfLeadingZeros_); + } + if (hasExtension()) { + outputString.append(" Extension: ").append(extension_); + } + if (hasCountryCodeSource()) { + outputString.append(" Country Code Source: ").append(countryCodeSource_); + } + if (hasPreferredDomesticCarrierCode()) { + outputString.append(" Preferred Domestic Carrier Code: "). + append(preferredDomesticCarrierCode_); + } + return outputString.toString(); + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumberInfo.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumberInfo.java new file mode 100644 index 0000000000..7ce2972bac --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumberInfo.java @@ -0,0 +1,569 @@ +/* + * Copyright (C) 2013 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.internal.MatcherApi; +import com.google.i18n.phonenumbers.internal.RegexBasedMatcher; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +import com.google.i18n.phonenumbers.metadata.DefaultMetadataDependenciesProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Methods for getting information about short phone numbers, such as short codes and emergency + * numbers. Note that most commercial short numbers are not handled here, but by the + * {@link PhoneNumberUtil}. + * + * @author Shaopeng Jia + * @author David Yonge-Mallo + */ +public class ShortNumberInfo { + private static final Logger logger = Logger.getLogger(ShortNumberInfo.class.getName()); + + private static final ShortNumberInfo INSTANCE = + new ShortNumberInfo( + RegexBasedMatcher.create(), + DefaultMetadataDependenciesProvider.getInstance().getShortNumberMetadataSource()); + + // In these countries, if extra digits are added to an emergency number, it no longer connects + // to the emergency service. + private static final Set REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT = new HashSet<>(); + static { + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("BR"); + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("CL"); + REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.add("NI"); + } + + /** Cost categories of short numbers. */ + public enum ShortNumberCost { + TOLL_FREE, + STANDARD_RATE, + PREMIUM_RATE, + UNKNOWN_COST + } + + /** Returns the singleton instance of the ShortNumberInfo. */ + public static ShortNumberInfo getInstance() { + return INSTANCE; + } + + // MatcherApi supports the basic matching method for checking if a given national number matches + // a national number pattern defined in the given {@code PhoneNumberDesc}. + private final MatcherApi matcherApi; + + // A mapping from a country calling code to the region codes which denote the region represented + // by that country calling code. In the case of multiple regions sharing a calling code, such as + // the NANPA regions, the one indicated with "isMainCountryForCode" in the metadata should be + // first. + private final Map> countryCallingCodeToRegionCodeMap; + + private final RegionMetadataSource shortNumberMetadataSource; + + // @VisibleForTesting + ShortNumberInfo(MatcherApi matcherApi, + RegionMetadataSource shortNumberMetadataSource) { + this.matcherApi = matcherApi; + this.shortNumberMetadataSource = shortNumberMetadataSource; + // TODO: Create ShortNumberInfo for a given map + this.countryCallingCodeToRegionCodeMap = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap(); + } + + /** + * Returns a list with the region codes that match the specific country calling code. For + * non-geographical country calling codes, the region code 001 is returned. Also, in the case + * of no region code being found, an empty list is returned. + */ + private List getRegionCodesForCountryCode(int countryCallingCode) { + List regionCodes = countryCallingCodeToRegionCodeMap.get(countryCallingCode); + return Collections.unmodifiableList(regionCodes == null ? new ArrayList(0) + : regionCodes); + } + + /** + * Helper method to check that the country calling code of the number matches the region it's + * being dialed from. + */ + private boolean regionDialingFromMatchesNumber(PhoneNumber number, + String regionDialingFrom) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + return regionCodes.contains(regionDialingFrom); + } + + /** + * A thin wrapper around {@code shortNumberMetadataSource} which catches {@link + * IllegalArgumentException} for invalid region code and instead returns {@code null} + */ + private PhoneMetadata getShortNumberMetadataForRegion(String regionCode) { + if (regionCode == null) { + return null; + } + try { + return shortNumberMetadataSource.getMetadataForRegion(regionCode); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** + * Check whether a short number is a possible number when dialed from the given region. This + * provides a more lenient check than {@link #isValidShortNumberForRegion}. + * + * @param number the short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the number is a possible short number + */ + public boolean isPossibleShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + int numberLength = getNationalSignificantNumber(number).length(); + return phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(numberLength); + } + + /** + * Check whether a short number is a possible number. If a country calling code is shared by + * multiple regions, this returns true if it's possible in any of them. This provides a more + * lenient check than {@link #isValidShortNumber}. See {@link + * #isPossibleShortNumberForRegion(PhoneNumber, String)} for details. + * + * @param number the short number to check + * @return whether the number is a possible short number + */ + public boolean isPossibleShortNumber(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + int shortNumberLength = getNationalSignificantNumber(number).length(); + for (String region : regionCodes) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(region); + if (phoneMetadata == null) { + continue; + } + if (phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(shortNumberLength)) { + return true; + } + } + return false; + } + + /** + * Tests whether a short number matches a valid pattern in a region. Note that this doesn't verify + * the number is actually in use, which is impossible to tell by just looking at the number + * itself. + * + * @param number the short number for which we want to test the validity + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number matches a valid pattern + */ + public boolean isValidShortNumberForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return false; + } + String shortNumber = getNationalSignificantNumber(number); + PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc(); + if (!matchesPossibleNumberAndNationalNumber(shortNumber, generalDesc)) { + return false; + } + PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode(); + return matchesPossibleNumberAndNationalNumber(shortNumber, shortNumberDesc); + } + + /** + * Tests whether a short number matches a valid pattern. If a country calling code is shared by + * multiple regions, this returns true if it's valid in any of them. Note that this doesn't verify + * the number is actually in use, which is impossible to tell by just looking at the number + * itself. See {@link #isValidShortNumberForRegion(PhoneNumber, String)} for details. + * + * @param number the short number for which we want to test the validity + * @return whether the short number matches a valid pattern + */ + public boolean isValidShortNumber(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); + if (regionCodes.size() > 1 && regionCode != null) { + // If a matching region had been found for the phone number from among two or more regions, + // then we have already implicitly verified its validity for that region. + return true; + } + return isValidShortNumberForRegion(number, regionCode); + } + + /** + * Gets the expected cost category of a short number when dialed from a region (however, nothing + * is implied about its validity). If it is important that the number is valid, then its validity + * must first be checked using {@link #isValidShortNumberForRegion}. Note that emergency numbers + * are always considered toll-free. Example usage: + *

{@code
+   * // The region for which the number was parsed and the region we subsequently check against
+   * // need not be the same. Here we parse the number in the US and check it for Canada.
+   * PhoneNumber number = phoneUtil.parse("110", "US");
+   * ...
+   * String regionCode = "CA";
+   * ShortNumberInfo shortInfo = ShortNumberInfo.getInstance();
+   * if (shortInfo.isValidShortNumberForRegion(shortNumber, regionCode)) {
+   *   ShortNumberCost cost = shortInfo.getExpectedCostForRegion(number, regionCode);
+   *   // Do something with the cost information here.
+   * }}
+ * + * @param number the short number for which we want to know the expected cost category + * @param regionDialingFrom the region from which the number is dialed + * @return the expected cost category for that region of the short number. Returns UNKNOWN_COST if + * the number does not match a cost category. Note that an invalid number may match any cost + * category. + */ + public ShortNumberCost getExpectedCostForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return ShortNumberCost.UNKNOWN_COST; + } + // Note that regionDialingFrom may be null, in which case phoneMetadata will also be null. + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + if (phoneMetadata == null) { + return ShortNumberCost.UNKNOWN_COST; + } + + String shortNumber = getNationalSignificantNumber(number); + + // The possible lengths are not present for a particular sub-type if they match the general + // description; for this reason, we check the possible lengths against the general description + // first to allow an early exit if possible. + if (!phoneMetadata.getGeneralDesc().getPossibleLengthList().contains(shortNumber.length())) { + return ShortNumberCost.UNKNOWN_COST; + } + + // The cost categories are tested in order of decreasing expense, since if for some reason the + // patterns overlap the most expensive matching cost category should be returned. + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getPremiumRate())) { + return ShortNumberCost.PREMIUM_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getStandardRate())) { + return ShortNumberCost.STANDARD_RATE; + } + if (matchesPossibleNumberAndNationalNumber(shortNumber, phoneMetadata.getTollFree())) { + return ShortNumberCost.TOLL_FREE; + } + if (isEmergencyNumber(shortNumber, regionDialingFrom)) { + // Emergency numbers are implicitly toll-free. + return ShortNumberCost.TOLL_FREE; + } + return ShortNumberCost.UNKNOWN_COST; + } + + /** + * Gets the expected cost category of a short number (however, nothing is implied about its + * validity). If the country calling code is unique to a region, this method behaves exactly the + * same as {@link #getExpectedCostForRegion(PhoneNumber, String)}. However, if the country + * calling code is shared by multiple regions, then it returns the highest cost in the sequence + * PREMIUM_RATE, UNKNOWN_COST, STANDARD_RATE, TOLL_FREE. The reason for the position of + * UNKNOWN_COST in this order is that if a number is UNKNOWN_COST in one region but STANDARD_RATE + * or TOLL_FREE in another, its expected cost cannot be estimated as one of the latter since it + * might be a PREMIUM_RATE number. + *

+ * For example, if a number is STANDARD_RATE in the US, but TOLL_FREE in Canada, the expected + * cost returned by this method will be STANDARD_RATE, since the NANPA countries share the same + * country calling code. + *

+ * Note: If the region from which the number is dialed is known, it is highly preferable to call + * {@link #getExpectedCostForRegion(PhoneNumber, String)} instead. + * + * @param number the short number for which we want to know the expected cost category + * @return the highest expected cost category of the short number in the region(s) with the given + * country calling code + */ + public ShortNumberCost getExpectedCost(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + if (regionCodes.size() == 0) { + return ShortNumberCost.UNKNOWN_COST; + } + if (regionCodes.size() == 1) { + return getExpectedCostForRegion(number, regionCodes.get(0)); + } + ShortNumberCost cost = ShortNumberCost.TOLL_FREE; + for (String regionCode : regionCodes) { + ShortNumberCost costForRegion = getExpectedCostForRegion(number, regionCode); + switch (costForRegion) { + case PREMIUM_RATE: + return ShortNumberCost.PREMIUM_RATE; + case UNKNOWN_COST: + cost = ShortNumberCost.UNKNOWN_COST; + break; + case STANDARD_RATE: + if (cost != ShortNumberCost.UNKNOWN_COST) { + cost = ShortNumberCost.STANDARD_RATE; + } + break; + case TOLL_FREE: + // Do nothing. + break; + default: + logger.log(Level.SEVERE, "Unrecognised cost for region: " + costForRegion); + } + } + return cost; + } + + // Helper method to get the region code for a given phone number, from a list of possible region + // codes. If the list contains more than one region, the first region for which the number is + // valid is returned. + private String getRegionCodeForShortNumberFromRegionList(PhoneNumber number, + List regionCodes) { + if (regionCodes.size() == 0) { + return null; + } else if (regionCodes.size() == 1) { + return regionCodes.get(0); + } + String nationalNumber = getNationalSignificantNumber(number); + for (String regionCode : regionCodes) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata != null + && matchesPossibleNumberAndNationalNumber(nationalNumber, phoneMetadata.getShortCode())) { + // The number is valid for this region. + return regionCode; + } + } + return null; + } + + /** + * Gets a valid short number for the specified region. + * + * @param regionCode the region for which an example short number is needed + * @return a valid short number for the specified region. Returns an empty string when the + * metadata does not contain such information. + */ + // @VisibleForTesting + String getExampleShortNumber(String regionCode) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata == null) { + return ""; + } + PhoneNumberDesc desc = phoneMetadata.getShortCode(); + if (desc.hasExampleNumber()) { + return desc.getExampleNumber(); + } + return ""; + } + + /** + * Gets a valid short number for the specified cost category. + * + * @param regionCode the region for which an example short number is needed + * @param cost the cost category of number that is needed + * @return a valid short number for the specified region and cost category. Returns an empty + * string when the metadata does not contain such information, or the cost is UNKNOWN_COST. + */ + // @VisibleForTesting + String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost) { + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + if (phoneMetadata == null) { + return ""; + } + PhoneNumberDesc desc = null; + switch (cost) { + case TOLL_FREE: + desc = phoneMetadata.getTollFree(); + break; + case STANDARD_RATE: + desc = phoneMetadata.getStandardRate(); + break; + case PREMIUM_RATE: + desc = phoneMetadata.getPremiumRate(); + break; + default: + // UNKNOWN_COST numbers are computed by the process of elimination from the other cost + // categories. + } + if (desc != null && desc.hasExampleNumber()) { + return desc.getExampleNumber(); + } + return ""; + } + + /** + * Returns true if the given number, exactly as dialed, might be used to connect to an emergency + * service in the given region. + *

+ * This method accepts a string, rather than a PhoneNumber, because it needs to distinguish + * cases such as "+1 911" and "911", where the former may not connect to an emergency service in + * all cases but the latter would. This method takes into account cases where the number might + * contain formatting, or might have additional digits appended (when it is okay to do that in + * the specified region). + * + * @param number the phone number to test + * @param regionCode the region where the phone number is being dialed + * @return whether the number might be used to connect to an emergency service in the given region + */ + public boolean connectsToEmergencyNumber(String number, String regionCode) { + return matchesEmergencyNumberHelper(number, regionCode, true /* allows prefix match */); + } + + /** + * Returns true if the given number exactly matches an emergency service number in the given + * region. + *

+ * This method takes into account cases where the number might contain formatting, but doesn't + * allow additional digits to be appended. Note that {@code isEmergencyNumber(number, region)} + * implies {@code connectsToEmergencyNumber(number, region)}. + * + * @param number the phone number to test + * @param regionCode the region where the phone number is being dialed + * @return whether the number exactly matches an emergency services number in the given region + */ + public boolean isEmergencyNumber(CharSequence number, String regionCode) { + return matchesEmergencyNumberHelper(number, regionCode, false /* doesn't allow prefix match */); + } + + private boolean matchesEmergencyNumberHelper(CharSequence number, String regionCode, + boolean allowPrefixMatch) { + CharSequence possibleNumber = PhoneNumberUtil.extractPossibleNumber(number); + if (PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(possibleNumber).lookingAt()) { + // Returns false if the number starts with a plus sign. We don't believe dialing the country + // code before emergency numbers (e.g. +1911) works, but later, if that proves to work, we can + // add additional logic here to handle it. + return false; + } + PhoneMetadata metadata = getShortNumberMetadataForRegion(regionCode); + if (metadata == null || !metadata.hasEmergency()) { + return false; + } + + String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(possibleNumber); + boolean allowPrefixMatchForRegion = + allowPrefixMatch && !REGIONS_WHERE_EMERGENCY_NUMBERS_MUST_BE_EXACT.contains(regionCode); + return matcherApi.matchNationalNumber(normalizedNumber, metadata.getEmergency(), + allowPrefixMatchForRegion); + } + + /** + * Given a valid short number, determines whether it is carrier-specific (however, nothing is + * implied about its validity). Carrier-specific numbers may connect to a different end-point, or + * not connect at all, depending on the user's carrier. If it is important that the number is + * valid, then its validity must first be checked using {@link #isValidShortNumber} or + * {@link #isValidShortNumberForRegion}. + * + * @param number the valid short number to check + * @return whether the short number is carrier-specific, assuming the input was a valid short + * number + */ + public boolean isCarrierSpecific(PhoneNumber number) { + List regionCodes = getRegionCodesForCountryCode(number.getCountryCode()); + String regionCode = getRegionCodeForShortNumberFromRegionList(number, regionCodes); + String nationalNumber = getNationalSignificantNumber(number); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionCode); + return (phoneMetadata != null) + && (matchesPossibleNumberAndNationalNumber(nationalNumber, + phoneMetadata.getCarrierSpecific())); + } + + /** + * Given a valid short number, determines whether it is carrier-specific when dialed from the + * given region (however, nothing is implied about its validity). Carrier-specific numbers may + * connect to a different end-point, or not connect at all, depending on the user's carrier. If + * it is important that the number is valid, then its validity must first be checked using + * {@link #isValidShortNumber} or {@link #isValidShortNumberForRegion}. Returns false if the + * number doesn't match the region provided. + * + * @param number the valid short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number is carrier-specific in the provided region, assuming the + * input was a valid short number + */ + public boolean isCarrierSpecificForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + String nationalNumber = getNationalSignificantNumber(number); + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + return (phoneMetadata != null) + && (matchesPossibleNumberAndNationalNumber(nationalNumber, + phoneMetadata.getCarrierSpecific())); + } + + /** + * Given a valid short number, determines whether it is an SMS service (however, nothing is + * implied about its validity). An SMS service is where the primary or only intended usage is to + * receive and/or send text messages (SMSs). This includes MMS as MMS numbers downgrade to SMS if + * the other party isn't MMS-capable. If it is important that the number is valid, then its + * validity must first be checked using {@link #isValidShortNumber} or {@link + * #isValidShortNumberForRegion}. Returns false if the number doesn't match the region provided. + * + * @param number the valid short number to check + * @param regionDialingFrom the region from which the number is dialed + * @return whether the short number is an SMS service in the provided region, assuming the input + * was a valid short number + */ + public boolean isSmsServiceForRegion(PhoneNumber number, String regionDialingFrom) { + if (!regionDialingFromMatchesNumber(number, regionDialingFrom)) { + return false; + } + PhoneMetadata phoneMetadata = getShortNumberMetadataForRegion(regionDialingFrom); + return phoneMetadata != null + && matchesPossibleNumberAndNationalNumber(getNationalSignificantNumber(number), + phoneMetadata.getSmsServices()); + } + + /** + * Gets the national significant number of the a phone number. Note a national significant number + * doesn't contain a national prefix or any formatting. + *

+ * This is a temporary duplicate of the {@code getNationalSignificantNumber} method from + * {@code PhoneNumberUtil}. Ultimately a canonical static version should exist in a separate + * utility class (to prevent {@code ShortNumberInfo} needing to depend on PhoneNumberUtil). + * + * @param number the phone number for which the national significant number is needed + * @return the national significant number of the PhoneNumber object passed in + */ + private static String getNationalSignificantNumber(PhoneNumber number) { + // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix. + StringBuilder nationalNumber = new StringBuilder(); + if (number.isItalianLeadingZero()) { + char[] zeros = new char[number.getNumberOfLeadingZeros()]; + Arrays.fill(zeros, '0'); + nationalNumber.append(new String(zeros)); + } + nationalNumber.append(number.getNationalNumber()); + return nationalNumber.toString(); + } + + // TODO: Once we have benchmarked ShortNumberInfo, consider if it is worth keeping + // this performance optimization. + private boolean matchesPossibleNumberAndNationalNumber(String number, + PhoneNumberDesc numberDesc) { + if (numberDesc.getPossibleLengthCount() > 0 + && !numberDesc.getPossibleLengthList().contains(number.length())) { + return false; + } + return matcherApi.matchNationalNumber(number, numberDesc, false); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java new file mode 100644 index 0000000000..e2046b0cd3 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/ShortNumbersRegionCodeSet.java @@ -0,0 +1,277 @@ +/* + * Copyright (C) 2013 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This file is automatically generated by {@link BuildMetadataProtoFromXml}. + * Please don't modify it directly. + */ + +package com.google.i18n.phonenumbers; + +import java.util.HashSet; +import java.util.Set; + +public class ShortNumbersRegionCodeSet { + // A set of all region codes for which data is available. + public static Set getRegionCodeSet() { + // The capacity is set to 321 as there are 241 different entries, + // and this offers a load factor of roughly 0.75. + Set regionCodeSet = new HashSet(321); + + regionCodeSet.add("AC"); + regionCodeSet.add("AD"); + regionCodeSet.add("AE"); + regionCodeSet.add("AF"); + regionCodeSet.add("AG"); + regionCodeSet.add("AI"); + regionCodeSet.add("AL"); + regionCodeSet.add("AM"); + regionCodeSet.add("AO"); + regionCodeSet.add("AR"); + regionCodeSet.add("AS"); + regionCodeSet.add("AT"); + regionCodeSet.add("AU"); + regionCodeSet.add("AW"); + regionCodeSet.add("AX"); + regionCodeSet.add("AZ"); + regionCodeSet.add("BA"); + regionCodeSet.add("BB"); + regionCodeSet.add("BD"); + regionCodeSet.add("BE"); + regionCodeSet.add("BF"); + regionCodeSet.add("BG"); + regionCodeSet.add("BH"); + regionCodeSet.add("BI"); + regionCodeSet.add("BJ"); + regionCodeSet.add("BL"); + regionCodeSet.add("BM"); + regionCodeSet.add("BN"); + regionCodeSet.add("BO"); + regionCodeSet.add("BQ"); + regionCodeSet.add("BR"); + regionCodeSet.add("BS"); + regionCodeSet.add("BT"); + regionCodeSet.add("BW"); + regionCodeSet.add("BY"); + regionCodeSet.add("BZ"); + regionCodeSet.add("CA"); + regionCodeSet.add("CC"); + regionCodeSet.add("CD"); + regionCodeSet.add("CF"); + regionCodeSet.add("CG"); + regionCodeSet.add("CH"); + regionCodeSet.add("CI"); + regionCodeSet.add("CK"); + regionCodeSet.add("CL"); + regionCodeSet.add("CM"); + regionCodeSet.add("CN"); + regionCodeSet.add("CO"); + regionCodeSet.add("CR"); + regionCodeSet.add("CU"); + regionCodeSet.add("CV"); + regionCodeSet.add("CW"); + regionCodeSet.add("CX"); + regionCodeSet.add("CY"); + regionCodeSet.add("CZ"); + regionCodeSet.add("DE"); + regionCodeSet.add("DJ"); + regionCodeSet.add("DK"); + regionCodeSet.add("DM"); + regionCodeSet.add("DO"); + regionCodeSet.add("DZ"); + regionCodeSet.add("EC"); + regionCodeSet.add("EE"); + regionCodeSet.add("EG"); + regionCodeSet.add("EH"); + regionCodeSet.add("ER"); + regionCodeSet.add("ES"); + regionCodeSet.add("ET"); + regionCodeSet.add("FI"); + regionCodeSet.add("FJ"); + regionCodeSet.add("FK"); + regionCodeSet.add("FM"); + regionCodeSet.add("FO"); + regionCodeSet.add("FR"); + regionCodeSet.add("GA"); + regionCodeSet.add("GB"); + regionCodeSet.add("GD"); + regionCodeSet.add("GE"); + regionCodeSet.add("GF"); + regionCodeSet.add("GG"); + regionCodeSet.add("GH"); + regionCodeSet.add("GI"); + regionCodeSet.add("GL"); + regionCodeSet.add("GM"); + regionCodeSet.add("GN"); + regionCodeSet.add("GP"); + regionCodeSet.add("GR"); + regionCodeSet.add("GT"); + regionCodeSet.add("GU"); + regionCodeSet.add("GW"); + regionCodeSet.add("GY"); + regionCodeSet.add("HK"); + regionCodeSet.add("HN"); + regionCodeSet.add("HR"); + regionCodeSet.add("HT"); + regionCodeSet.add("HU"); + regionCodeSet.add("ID"); + regionCodeSet.add("IE"); + regionCodeSet.add("IL"); + regionCodeSet.add("IM"); + regionCodeSet.add("IN"); + regionCodeSet.add("IQ"); + regionCodeSet.add("IR"); + regionCodeSet.add("IS"); + regionCodeSet.add("IT"); + regionCodeSet.add("JE"); + regionCodeSet.add("JM"); + regionCodeSet.add("JO"); + regionCodeSet.add("JP"); + regionCodeSet.add("KE"); + regionCodeSet.add("KG"); + regionCodeSet.add("KH"); + regionCodeSet.add("KI"); + regionCodeSet.add("KM"); + regionCodeSet.add("KN"); + regionCodeSet.add("KP"); + regionCodeSet.add("KR"); + regionCodeSet.add("KW"); + regionCodeSet.add("KY"); + regionCodeSet.add("KZ"); + regionCodeSet.add("LA"); + regionCodeSet.add("LB"); + regionCodeSet.add("LC"); + regionCodeSet.add("LI"); + regionCodeSet.add("LK"); + regionCodeSet.add("LR"); + regionCodeSet.add("LS"); + regionCodeSet.add("LT"); + regionCodeSet.add("LU"); + regionCodeSet.add("LV"); + regionCodeSet.add("LY"); + regionCodeSet.add("MA"); + regionCodeSet.add("MC"); + regionCodeSet.add("MD"); + regionCodeSet.add("ME"); + regionCodeSet.add("MF"); + regionCodeSet.add("MG"); + regionCodeSet.add("MH"); + regionCodeSet.add("MK"); + regionCodeSet.add("ML"); + regionCodeSet.add("MM"); + regionCodeSet.add("MN"); + regionCodeSet.add("MO"); + regionCodeSet.add("MP"); + regionCodeSet.add("MQ"); + regionCodeSet.add("MR"); + regionCodeSet.add("MS"); + regionCodeSet.add("MT"); + regionCodeSet.add("MU"); + regionCodeSet.add("MV"); + regionCodeSet.add("MW"); + regionCodeSet.add("MX"); + regionCodeSet.add("MY"); + regionCodeSet.add("MZ"); + regionCodeSet.add("NA"); + regionCodeSet.add("NC"); + regionCodeSet.add("NE"); + regionCodeSet.add("NF"); + regionCodeSet.add("NG"); + regionCodeSet.add("NI"); + regionCodeSet.add("NL"); + regionCodeSet.add("NO"); + regionCodeSet.add("NP"); + regionCodeSet.add("NR"); + regionCodeSet.add("NU"); + regionCodeSet.add("NZ"); + regionCodeSet.add("OM"); + regionCodeSet.add("PA"); + regionCodeSet.add("PE"); + regionCodeSet.add("PF"); + regionCodeSet.add("PG"); + regionCodeSet.add("PH"); + regionCodeSet.add("PK"); + regionCodeSet.add("PL"); + regionCodeSet.add("PM"); + regionCodeSet.add("PR"); + regionCodeSet.add("PS"); + regionCodeSet.add("PT"); + regionCodeSet.add("PW"); + regionCodeSet.add("PY"); + regionCodeSet.add("QA"); + regionCodeSet.add("RE"); + regionCodeSet.add("RO"); + regionCodeSet.add("RS"); + regionCodeSet.add("RU"); + regionCodeSet.add("RW"); + regionCodeSet.add("SA"); + regionCodeSet.add("SB"); + regionCodeSet.add("SC"); + regionCodeSet.add("SD"); + regionCodeSet.add("SE"); + regionCodeSet.add("SG"); + regionCodeSet.add("SH"); + regionCodeSet.add("SI"); + regionCodeSet.add("SJ"); + regionCodeSet.add("SK"); + regionCodeSet.add("SL"); + regionCodeSet.add("SM"); + regionCodeSet.add("SN"); + regionCodeSet.add("SO"); + regionCodeSet.add("SR"); + regionCodeSet.add("SS"); + regionCodeSet.add("ST"); + regionCodeSet.add("SV"); + regionCodeSet.add("SX"); + regionCodeSet.add("SY"); + regionCodeSet.add("SZ"); + regionCodeSet.add("TC"); + regionCodeSet.add("TD"); + regionCodeSet.add("TG"); + regionCodeSet.add("TH"); + regionCodeSet.add("TJ"); + regionCodeSet.add("TL"); + regionCodeSet.add("TM"); + regionCodeSet.add("TN"); + regionCodeSet.add("TO"); + regionCodeSet.add("TR"); + regionCodeSet.add("TT"); + regionCodeSet.add("TV"); + regionCodeSet.add("TW"); + regionCodeSet.add("TZ"); + regionCodeSet.add("UA"); + regionCodeSet.add("UG"); + regionCodeSet.add("US"); + regionCodeSet.add("UY"); + regionCodeSet.add("UZ"); + regionCodeSet.add("VA"); + regionCodeSet.add("VC"); + regionCodeSet.add("VE"); + regionCodeSet.add("VG"); + regionCodeSet.add("VI"); + regionCodeSet.add("VN"); + regionCodeSet.add("VU"); + regionCodeSet.add("WF"); + regionCodeSet.add("WS"); + regionCodeSet.add("XK"); + regionCodeSet.add("YE"); + regionCodeSet.add("YT"); + regionCodeSet.add("ZA"); + regionCodeSet.add("ZM"); + regionCodeSet.add("ZW"); + + return regionCodeSet; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/PhoneNumberMetadataForGoldenTests.xml b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/PhoneNumberMetadataForGoldenTests.xml new file mode 100644 index 0000000000..d6299aefd5 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/PhoneNumberMetadataForGoldenTests.xml @@ -0,0 +1,192 @@ + + + + + + http://www.itu.int/oth/T02020000AF/en + + + + [46]\d{4}| + [01589]\d{5} + + + + + 6[2-467]\d{3} + + + 62889 + + + 4\d{4} + + 40123 + + + [01589]\d{5} + + 542011 + + + + + + + http://www.itu.int/oth/T0202000009/en + + + + [68] + $1-$2-$3 + + + [2-9] + $1-$2 + NA + + + 911 + $2 15-$3-$4 + $1 $2 $3-$4 + + + 1 + $1 $2-$3 + + + + + 11\d{8}| + [2368]\d{9}| + 9\d{10} + + + + 810\d{7} + + 8101234567 + + + 11\d{8} + + 1123456789 + + + 810\d{7} + + 8101234567 + + + + + + + http://www.nationalnanpa.com/nas/public/assigned_code_query_step1.do?method=resetCodeQueryModel + + + [5689]\d{9} + + + + 671(?: + 3(?: + 00| + 3[39]| + 4[349]| + 55| + 6[26] + )| + 4(?: + 56| + 7[1-9]| + 8[236-9] + ) + )\d{4} + + + 6713001234 + + + + + 671(?: + 3(?: + 00| + 3[39]| + 4[349]| + 55| + 6[26] + )| + 4(?: + 56| + 7[1-9]| + 8[236-9] + ) + )\d{4} + + + 6713001234 + + + + 8(?: + 00| + 33| + 44| + 55| + 66| + 77| + 88 + )[2-9]\d{6} + + + 8002123456 + + + 900[2-9]\d{6} + + 9002123456 + + + + 5(?: + 00| + 22| + 33| + 44| + 66| + 77| + 88 + )[2-9]\d{6} + + + 5002345678 + + + + + + + http://www.itu.int/rec/T-REC-E.169-200205-I/en + + + + $1 $2 $3 + + + + \d{9} + + + \d{9} + + 123456789 + + + + diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/ShortNumberMetadataForGoldenTests.xml b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/ShortNumberMetadataForGoldenTests.xml new file mode 100644 index 0000000000..0adacbc41c --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/ShortNumberMetadataForGoldenTests.xml @@ -0,0 +1,117 @@ + + + + + + + 9\d{2} + + + 911 + + 911 + + + + 911 + + 911 + + + + + + + + + [01389]\d{1,4} + + + + 000| + 1(?: + 0[0-35-7]| + 1[02-5]| + 2[15]| + 9 + )| + 3372| + 89338| + 911 + + + 121 + + + + + [09]\d{2}| + 1(?: + [02-9]\d?| + 1[0-24-9]? + ) + + + 111 + + + + + + 89338| + 911 + + + 89338 + + + + + + 10[017]| + 911 + + + 101 + + + 10[356] + + 103 + + + + + 3372| + 89338 + + + 3372 + + + + + + + + 9\d{2} + + + 911 + + 911 + + + + 911 + + 911 + + + + diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_metadata.js b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_metadata.js new file mode 100644 index 0000000000..831b3da374 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_metadata.js @@ -0,0 +1,159 @@ +/** + * @license + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generated metadata for file + * googledata/third_party/i18n/phonenumbers/PhoneNumberMetadata.xml + * @author Nikolaos Trogkanis + */ + +goog.provide('i18n.phonenumbers.metadata'); + +/** + * A mapping from a country calling code to the region codes which denote the + * region represented by that country calling code. In the case of multiple + * countries sharing a calling code, such as the NANPA regions, the one + * indicated with "isMainCountryForCode" in the metadata should be first. + * @type {!Object.>} + */ +i18n.phonenumbers.metadata.countryCodeToRegionCodeMap = { +1:["GU"] +,54:["AR"] +,247:["AC"] +,979:["001"] +}; + +/** + * A mapping from a region code to the PhoneMetadata for that region. + * @type {!Object.} + */ +i18n.phonenumbers.metadata.countryToMetadata = { +"AC":[,[,,"[46]\\d{4}|[01589]\\d{5}",,,,,,,[5,6] +] +,[,,"6[2-467]\\d{3}",,,,"62889",,,[5] +] +,[,,"4\\d{4}",,,,"40123",,,[5] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,"AC",247,"00",,,,,,,,,,[,,,,,,,,,[-1] +] +,,,[,,,,,,,,,[-1] +] +,[,,"[01589]\\d{5}",,,,"542011",,,[6] +] +,,,[,,,,,,,,,[-1] +] +] +,"AR":[,[,,"11\\d{8}|[2368]\\d{9}|9\\d{10}",,,,,,,[10] +,[6,7,8] +] +,[,,"11\\d{8}",,,,"1123456789",,,,[6,7,8] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,"AR",54,"00","0",,,"0?(?:(11)?15)?","9$1",,,[[,"([68]\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"] +,"0$1"] +,[,"(\\d{2})(\\d{4})","$1-$2",["[2-9]"] +,"$1"] +,[,"(9)(11)(\\d{4})(\\d{4})","$2 15-$3-$4",["911"] +,"0$1"] +,[,"(11)(\\d{4})(\\d{4})","$1 $2-$3",["1"] +,"0$1",,1] +] +,[[,"([68]\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"] +,"0$1"] +,[,"(9)(11)(\\d{4})(\\d{4})","$1 $2 $3-$4",["911"] +] +,[,"(11)(\\d{4})(\\d{4})","$1 $2-$3",["1"] +,"0$1",,1] +] +,[,,,,,,,,,[-1] +] +,,,[,,"810\\d{7}",,,,"8101234567"] +,[,,"810\\d{7}",,,,"8101234567"] +,,,[,,,,,,,,,[-1] +] +] +,"GU":[,[,,"[5689]\\d{9}",,,,,,,[10] +,[7] +] +,[,,"671(?:3(?:00|3[39]|4[349]|55|6[26])|4(?:56|7[1-9]|8[236-9]))\\d{4}",,,,"6713001234",,,,[7] +] +,[,,"671(?:3(?:00|3[39]|4[349]|55|6[26])|4(?:56|7[1-9]|8[236-9]))\\d{4}",,,,"6713001234",,,,[7] +] +,[,,"8(?:00|33|44|55|66|77|88)[2-9]\\d{6}",,,,"8002123456"] +,[,,"900[2-9]\\d{6}",,,,"9002123456"] +,[,,,,,,,,,[-1] +] +,[,,"5(?:00|22|33|44|66|77|88)[2-9]\\d{6}",,,,"5002345678"] +,[,,,,,,,,,[-1] +] +,"GU",1,"011","1",,,"1",,,1,,,[,,,,,,,,,[-1] +] +,,"671",[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,,[,,,,,,,,,[-1] +] +] +,"979":[,[,,"\\d{9}",,,,,,,[9] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,"\\d{9}",,,,"123456789"] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,"001",979,,,,,,,,1,[[,"(\\d)(\\d{4})(\\d{4})","$1 $2 $3"] +] +,,[,,,,,,,,,[-1] +] +,,,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,,[,,,,,,,,,[-1] +] +] +}; diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_shortnumbermetadata.js b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_shortnumbermetadata.js new file mode 100644 index 0000000000..94be19ce52 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/buildtools/testdata/expected_shortnumbermetadata.js @@ -0,0 +1,88 @@ +/** + * @license + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generated metadata for file + * googledata/third_party/i18n/phonenumbers/ShortNumberMetadata.xml + * @author Nikolaos Trogkanis + */ + +goog.provide('i18n.phonenumbers.shortnumbergoldenmetadata'); + +/** + * A mapping from a country calling code to the region codes which denote the + * region represented by that country calling code. In the case of multiple + * countries sharing a calling code, such as the NANPA regions, the one + * indicated with "isMainCountryForCode" in the metadata should be first. + * @type {!Object.>} + */ +i18n.phonenumbers.shortnumbergoldenmetadata.countryCodeToRegionCodeMap = { +0:["AC","AR","GU"] +}; + +/** + * A mapping from a region code to the PhoneMetadata for that region. + * @type {!Object.} + */ +i18n.phonenumbers.shortnumbergoldenmetadata.countryToMetadata = { +"AC":[,[,,"9\\d{2}",,,,,,,[3] +] +,,,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,,,"AC",,,,,,,,,,,,,,,,,,[,,"911",,,,"911"] +,,[,,"911",,,,"911"] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,[,,,,,,,,,[-1] +] +] +,"AR":[,[,,"[01389]\\d{1,4}",,,,,,,[2,3,4,5] +] +,,,[,,"[09]\\d{2}|1(?:[02-9]\\d?|1[0-24-9]?)",,,,"111",,,[2,3] +] +,[,,,,,,,,,[-1] +] +,,,,"AR",,,,,,,,,,,,,,,,,,[,,"10[017]|911",,,,"101",,,[3] +] +,,[,,"000|1(?:0[0-35-7]|1[02-5]|2[15]|9)|3372|89338|911",,,,"121"] +,[,,,,,,,,,[-1] +] +,[,,"89338|911",,,,"89338",,,[3,5] +] +,,[,,"3372|89338",,,,"3372",,,[4,5] +] +] +,"GU":[,[,,"9\\d{2}",,,,,,,[3] +] +,,,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,,,"GU",,,,,,,,,,,,,,,,,,[,,"911",,,,"911"] +,,[,,"911",,,,"911"] +,[,,,,,,,,,[-1] +] +,[,,,,,,,,,[-1] +] +,,[,,,,,,,,,[-1] +] +] +}; diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_255 new file mode 100644 index 0000000000000000000000000000000000000000..1510187d4619de019bd61e1eba2efe3b4fe29a2a GIT binary patch literal 144 zcmZ4UmVvdri-CcG5s0yX|43p?45At_Db+@`njp#;LYdTRGH|FEDySGKs2BqkGcvG5 Uo0-Rgv>~eoDuZgmr5a)p02s6u8~^|S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_27 new file mode 100644 index 0000000000000000000000000000000000000000..3d86d493cb82039fed3c17ab65205220b90ba4ac GIT binary patch literal 101 zcmZ4UmVvcAo`HdZ5s0w>X(Ta522qWelxpKzO;n13L&Z=*#YjQL7^s+$f!)F^+ECXr H7NHXWV#Ew; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_30 new file mode 100644 index 0000000000000000000000000000000000000000..72ac06a4a280cc8db6afd530ee999667ff28e6f5 GIT binary patch literal 96 zcmZ4UmVvcAih+TF5s0w>IV3Sg22qWelxpKzO(e>sR+E84#ZW=TNI}IIsF;y~$;c3) F2>=+L3km=L literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_31 new file mode 100644 index 0000000000000000000000000000000000000000..c5abeb6858f2938ec3c3edbc0e7500e5f48d8f6b GIT binary patch literal 237 zcmZvVK?=e!5JjhgAh>o{FpGe8QRqx2NpqH%op*3ydL!@Us&{avRp`Qj@aBi)zt;@= z#~T0|Ie+H7x!b|%db>Yq>J+@fO&uI88cW7HdE5YF9-J?g1RP3r8pBvBFH5OjDLK|L vvyZYRR86b3(zlU(T>?1%B*yaMxnRc7%Wul$lX{R?Ef{-=USo)ccny3^5hl-(sijjhfF;FohgF>{au6b;Y zg+a8j8IZO#h&D8`u#ByV1`^SRx)!k@BV|BF7@?R16ZM K4ABIc0s#QSwj+oD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_350 new file mode 100644 index 0000000000000000000000000000000000000000..a404c3e8917facf05b2c48dba91a51cdb17cef1e GIT binary patch literal 85 zcmZ4UmVve0pMima5r{DXV;qtgBLkmCOiHy$ttOOWU{x_xP%#23VPs$gQBVK?e9;I} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_351 new file mode 100644 index 0000000000000000000000000000000000000000..7496756575d77478fd3477c16bc09efd3e02ab6a GIT binary patch literal 201 zcmZ4UmVveWFarYvBM@T(#&{$#W(HA>n3QVcT1`}nfkVYmLB&Wx#TclVk%84H+R!K# wq)!H<&Im<0ln103xM8{!R7}7c*})oXEJ0eqHlb=Y0qQ}ui4m+6q?~~P0O;Z&$p8QV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_352 new file mode 100644 index 0000000000000000000000000000000000000000..684e8e1e610b0f646a732ba5e8152b633b71b7d7 GIT binary patch literal 96 zcmZ4UmVvcAih+TF5r{DXV*-*GBZH_$OiHy;ttN;vhEoh2DuxOwMhYs%K*fv FO#mqf3rYY0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_358 new file mode 100644 index 0000000000000000000000000000000000000000..c6148a86282efddb8c80b5d2096514ced85ac906 GIT binary patch literal 272 zcmZ4UmVvd3fq{{o0Z0HbCSXiM5@Ti%(TGXW1mbGrS_q|MQme_pp<<|@Vx*vA3{=a= zARldHYGx4|ZK!JzTVt$YZ)E^vTE^CZNzEEdkb&YLGmM~S;4{k5C>E;Sq{cAX7-Wu- fWsRvpjd`@8X)MSnA()eZE`hp?36(lhx1|f}@6ipzmHmLi60BRZ$=Kufz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_372 new file mode 100644 index 0000000000000000000000000000000000000000..6e38688c0780f6f0faeaf62634af2633e987efd0 GIT binary patch literal 188 zcmZ4UmVvc=8v_FaBM@T(#u6kkW(FaRm=sMQt~RcPQ4Aa^h6*Z13M$4xm5dCGW*`ls jAT>r1HBbtu15GJgw27{{Wh}aSsL?=exYdL7FfafBYh4|r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_373 new file mode 100644 index 0000000000000000000000000000000000000000..7207f15f7e50a46da9c839781cfa288c96d1d062 GIT binary patch literal 158 zcmZ4UmVvc=1_J{FBM@T(#!@6PCI%Uen3QUxT1~7J1GkEyf{KxXim`%<2~Zm&1Ba1O iO|-F@c`V2fQ6x>q5F>yT0|!hKSO-fqR5eHk0|Nk~HyLpN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_380 new file mode 100644 index 0000000000000000000000000000000000000000..426f6f89c71879e5d42d7b6e9353d611db6a2d80 GIT binary patch literal 333 zcmcgoF%H5o40Mo~_yR+R49yU!iIXN_Vc`!9#v88y_eXq% z{{S!-P|)6%k(IWCV}H9p@0RR>6w8mVdW-?Qf3-_X372eG{~rk u6p}A2#kucHA*v@-7Q)e2c2cBK@Qp>?sY)(R_gGY!Gp(a+68$&I@}dtSUPpWY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_381 new file mode 100644 index 0000000000000000000000000000000000000000..2d5605b80e871697d88b11c4c465b7744876670a GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z0HbCSa^Z5@Ti%)rd){HmcPGQO0nJfkVYmLB&Wx#TclVkwGKc z&@8sbDB3{R$VAsXw#FF9vWTtGu(vXbHny+?3Rr4J8|hlcf{d0yG7)Mp!h8m9n86Av YCSbEw4aqSW>QsdJm+$k3MxhlD#k#Sj0}v1 zAPtge>Wm=DffNHbOu2%J36c&`kf{h|AReaSJkdtFW|pxv=Fw*6u^@Ypb>ViB8AvGv F001IPTWt3^E!qDb*&mnjp#uonqitF;q}7Qcy8gP%!~&V`Pvs z(6G0PHZ;~XHMfk7HqtdQ)3u1Lv4}P@1~D{2MvG#aXk4qwzyULgSaU#TF)#oC^ZO*6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_43 new file mode 100644 index 0000000000000000000000000000000000000000..175243cfdcf27612da995f7d9db157e6cf4e757e GIT binary patch literal 963 zcmb`GUrNL<5XMtvMUY*5^Ffh5RM=tyn@s-I7Y~vx`{F5dypbpHPTs*ux{2K2aPqunt?CgUvR?(hW55==JyV>raTiUPimJW41IK}L;k#(c$2I@wWs$!Ll z;&s+&ZYgV(veNr=6LzlaM@f$R#iYCFoGpLTKw)rIXf1b(9-G{4$0b=Uw0m1r8#km$ za{{91<9<<@>+o1&Q?RTXGsSgXR51gIf$l}tO%;jVacYwz8J_g)woi{BQMVS2L`#wO z25Djf3=Iu~6yb75tCAFT&syhnbc}BaHtq6s2C}z7y}hEGB6n# zfHWbi1uBASK~t+~s9|qqSQBleYi1d1s99rVP!nxzVHsOv4it|z)HOBN1#--cOf*48 z%76?pf|vz063PQo4BRkRD5#hK6{9)?;R5Uq(E>RH;*4kmBao%h<`%J_mqE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_49 new file mode 100644 index 0000000000000000000000000000000000000000..b5335e7ed241cdd1d673e68aa9b43c5558a15b93 GIT binary patch literal 12140 zcmeHN&5k2A5bl{_rA0_1_J9xqts)VLZ8VYWw)>9@4`TYpktblhZ^U~bae@N}9)fq^ z`^xslo$iF}ZYHD2^c=>W?y7Rx<*!_J)o=e6FMchGPYV29@!#}MXRpfQ%Qrv$d|$mS z*_hbe*|%l!a;;bEYPB{XzbbBxQ`O+D@~-KIo+7@@IHQ0`Q`{ygtF>LNYs$L*yL$8E z56an1GkA?hr%b)+2VeE2XE)(j>#9vV;0=kxf2TLLX+h|8)sn;D!Padz_!dvKyzBS` z$-UFI2EPSA7)%ZA*^nCFjBW6-7EQDjnHy7g5ZbUCkq8I)LiaRNXMEq690WudE)-D~1Ls%U`bOcaOb&iG7_jyoUR7dCyfO|} z@wS0FwjV%S@i#tHl?QvLr8kZplr>ry0TvA;owq$0`4wviFMCIO29`kL>IPpeI<(NR zru=9@+8%tycNJF$?ZSb9n!Q_3eW;cJRpT(x=tFqBRtUR+kjTLV3<;)=1JmmaOc90= zO!^KF#b+6g2%I5Ssr^#TQXlgW$YXw&2BUUAz zKqh`L*Xw}A&aRi(a=Z`@uZOd1DDHn&!)$@fxc}npntmfV9AhCa!8t&jUBA^K{qU`v z+eMF>MsWgkcqhY4zAks+jNeoDa`xF2L?_3sN19xxV1Sl@*BmT|Zak0*wL ztAQ`|u@O1l+f$FfWhWi2|FrG{6lQnQXMq550&?zU;C%KY=>mgu9z&<+w;dQHG|Zph zme@%1s^p=rXC5y$5-0GiFKE7xEB}aQ&*jGTA4|OSpy1%%bov0P{rCV0dR@YmWxNxZ z-dn~qb8MC~Gwh8!cU+e9%KZ%2_K&wOJnJn%&dlTcqV2`j^tk-jMYw-)0^97zN%B|7 z#Yp1kBzY_zRVb|t2|SI|OUN_zI6^ZwcFZ<`dr!$t?MZI!yIR6|n%l)AB(NSgdzB+0 z9-_DR`%@(RqnSWsy6qw$abh%_1O;6E54SCd6JP>($>;9L=jMpmLLr@=cXP7Kx%ooR z&6gY>i4*wW!UjqE#UN>Pzj{AkRj@!|fx?BB_tc|80y9l5U)@V81;Mc~cA^Ht~8EVHc)KC$I;jpfUaXHJaC@fG?%|OH%pyCL9VgQb6KG0?r zWEc=%aKspVm?EhMLpd0G*p^~NTcy+8McC@H%p?)k4y4`zY;xv!g3x+8=7JNrxjP10 zUoZepm@=aj1tbF#~o26mV$v%#pZIpf{vPGKDb^I}9yf9f>GE bx~2JgHwn{)k=S01WNWn}JdTxXpeX(Wc(5Kx literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_505 new file mode 100644 index 0000000000000000000000000000000000000000..2f7b212cf0000736997016e74517125e528e55d7 GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5r{DX<4+_pMg}2`m=sMQt~Ra(Qzo^V3>+$k3MxhlD#k#Sj0}uM G2n_)LF$#hJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_506 new file mode 100644 index 0000000000000000000000000000000000000000..2b6dd359432caf2b435a052bd2ac8bcd001db17e GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5r{DX<1ZvJMg~!hn3QUhT1^mT1g97{R16hVj1*LikrV@&02{Om AdjJ3c literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_52 new file mode 100644 index 0000000000000000000000000000000000000000..e23beaabe1fc78c5c0bff875741e6fa8585f21c5 GIT binary patch literal 214 zcmZ4UmVveW0s{jBBM@T&CP-pT49XfYDb+@`n)oONJ{3a+6(a=|V+9ox1r<}E0gMdX z#>O?K(WYjxH5P^-6Jt<8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_54 new file mode 100644 index 0000000000000000000000000000000000000000..ff52ce4cc116a9c4ac073a59def98d25a0a2daf6 GIT binary patch literal 434 zcmZvYK~BUl3`IRiNF%XkF}p6hm@Fb?Y$s`F!#PmMj#EH5&`8{a({KmA%?ykLm0Gv< z|37|x|D@X&qRol$!2Qovu6j3gzkhmu)wf_pehO{p!!+|W3&b1x;Qhm~vGl~F_-pP% zTZu~#W3@(N$;En!b6NVRJQg#AFa&dHjHbF$V_o}@mf?00KEuc!tEJkA1qJ??F{$kk zb2aT*;%@da>5M?=H~Otj_&tY~NYw5|++k gqaYu@VFj`sdd=CA*vT0L>Wlp{paopt#I_;&0_sF!5dZ)H literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_55 new file mode 100644 index 0000000000000000000000000000000000000000..21d60dc6d353f0e6d7683829196522ea17460ac4 GIT binary patch literal 118 zcmZ4UmVvdrfPsO55s0w>b0jfF20o3Llxm||O%P>KtI5EsVyK{E1XRMvpcHLrWMXC> hTVot;sB3C&5nE##ZD_1(8e0=>VHpb)vy4R;1ptbn5rhB$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_58 new file mode 100644 index 0000000000000000000000000000000000000000..2eafd93ee453c0a381f85bf4d514a8dfd216a98c GIT binary patch literal 92 zcmZ4UmVvcAjDdlH5s0w>DsR+E84#ZW=TNI}IINimQK0PdFx AyZ`_I literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_595 new file mode 100644 index 0000000000000000000000000000000000000000..9b3af0a9ae1e6608d73575ef18879d964ec38242 GIT binary patch literal 300 zcmZXOF%H5o3`Jc~B__ne!c>V4twe^zi5p=i80_OmOUB)7qwWO^fomf&;RP=ahXWn+LWAQ;sT>6tOD75tCAFRI3T1jCD*P3?Rk8p<<|@Vx*vA3{=j@ zz+)6`Xk-#w6K!l3YX~wx6j>icmnmUgGDx~$mO||YYUYMnsi0zl$5vyw4v=Y>ZsoLy rHqLUbS+~+nngkCfeMi*BMfb<(H54m1_-+VVOSR6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_66 new file mode 100644 index 0000000000000000000000000000000000000000..3dd783aed6e51f7160e18b194895205254e4e563 GIT binary patch literal 85 ycmZ4UmVve0pMima5s0w>CnPaO20o3LlxmY&O(?~{s$!_1Vgyve$iN7qpa1}N&j>XD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_675 new file mode 100644 index 0000000000000000000000000000000000000000..7355c1babc9f6ea3d95181fce5663a8ccc33a6e1 GIT binary patch literal 95 zcmZ4UmVvcAl7WGN5r{DX(_$nsMg~!hn3QVcT1^mT1fhUD1`ZWN1r;L&6=R@cMg~T6 GgdPAaa|>Yr literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_676 new file mode 100644 index 0000000000000000000000000000000000000000..64625de9379b05fb0a77191a5de6def3e345c080 GIT binary patch literal 89 zcmZ4UmVvcAn1O+T5r{DX(-I^xMg~5On3QUxT1^mTTC2&xs$!_1Vgyve$iNzHs%sgG GPz?aRjS0a3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_679 new file mode 100644 index 0000000000000000000000000000000000000000..a501a87f0864bc7448270397a370834509105c9a GIT binary patch literal 95 zcmZ4UmVvcAl7WGN5r{DX({dy+Mg~!hn3QUxT1^mT455HL1`ZWN1r;L&6=R@cMg~T6 GgdPAbN(*EF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_7 new file mode 100644 index 0000000000000000000000000000000000000000..f74102b958962790d5543d96f4a3e6c4d1bacf7a GIT binary patch literal 645 zcmb`FF>b>!3`Lm&NeUFm)~OvdXov>`HYv$=mz<&#qphcC)f@F{y+cXbP8_&n1PFvF z`G3A||NO%C6X2l$z()2zYrp92;Q4s|_zK^Z7P=I8^sV#gJjvw^3{0UPa_Nqzw^lYc zHN}*%1V(L_p0UeSK|N=rTo~&iV^yiwLAB$kEd{owZNl%fu)di}$04eY`Cvf~L#~+O z7Q7;uCm*Wu$ua~{s6Z2jUWI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_81 new file mode 100644 index 0000000000000000000000000000000000000000..db17512850bde51ff2433916e0380a8cbfb4f8c0 GIT binary patch literal 227 zcmZ4UmVveWE&~GtBM@T&fkccnjp#uLYdTRGH|FEDySGKs2BqkGcxdM w*jpJI)tH*sSXyctfb`2?YJ=(qQViTM-3lruI1E6x7ib~WdV=}Fs901s&={{R30 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_84 new file mode 100644 index 0000000000000000000000000000000000000000..3db56a25636a6978d91f3ba7abb4c713e5b075a0 GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBM@T&AxL7(45At_Db>ccny3^5hl-(sijjhfF;Foh1EU#8j|@nS m5kx7JLTF^*hUrjHF#&60HHtQ|hy`f`+hIb;4nvSq2mk=vtsm$B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_855 new file mode 100644 index 0000000000000000000000000000000000000000..07537c978e6c38b383214cd1ef204c4bb60300b3 GIT binary patch literal 104 zcmZ4UmVvcAiGhKE5r{DXb2yS1BZHhqOiHy;ttJ*q$GBFLfm_8;LB&Wx#aKbb1W6;1 F2>{L@4gvrG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_856 new file mode 100644 index 0000000000000000000000000000000000000000..7a56715715baf0ee3ccc15b6920c485ef07294fa GIT binary patch literal 162 zcmZ4UmVvc=4g&)NBM@T(<_IJ)W(HA>n3QVcT1_O%q*jxGL&Z=*#YjQL7^WDk&IqCo Zr~srKt2#cA3{;&3&>&W@K`>JwGytN(7?S`1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_90 new file mode 100644 index 0000000000000000000000000000000000000000..ecd338a121e69a468ce625dcc40c9e69067a5c8a GIT binary patch literal 178 zcmZ4UmVvc=4FdxMBM@T&QAlD;45At_Db>ccnn;vMttJD9ilKsvk%EdbP%$HeM6{8v zNo?2|Hm7_cAk<$z&V^M}llUEpA`NA}sVXR)t*Ks8X~BNGyL z1UB+E5nC-~9`LIe(!N9s5#h;`9kWS>Q=(Y5V#)cMSFwpn_W_JV#vyA;+LhQPrXiG5 zVpQfaCju9g-UTwEvY9bk!YV{oj=bZT2PGq0S3aN#u9HSV zH3}Azwo^vF4%wm~5*s$NaDlZ;4*p>AC=VS}2h>Ip5iCq7+*o2# zaR9qzN;)ca$=#wWj(cSO6W9AzX*<_;{=Z>xALnlvh``1BdAepPDXu6BmSaf~CN5{1 z`i~|JO}d)v!ya`cbK62%mlbz&OLK6TQ1tsO1}ouV$(pCMq;aG{krfUqR43>!M1~K* x6Fv|4Zx1(@vfj^J(QnuE%9)^?d%Yv|fZ|A!k)M_I8$26jY3XiWwOg HO%ZwkHj@j9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_972 new file mode 100644 index 0000000000000000000000000000000000000000..dfa294c22981a45f82237c54afe0ee7487bbd81d GIT binary patch literal 108 zcmZ4UmVvcAje&uI5r{DX^BE*DMg~cZm=sMQt~Ra(Q$}!#fm_8;LB&Wx#aKbb1gM9R Pfj!zt*Tljy7GVGY5!w#2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto_995 new file mode 100644 index 0000000000000000000000000000000000000000..152bf34840843c8fc8ed1b1cf8f91f855ccd00f6 GIT binary patch literal 352 zcmZ4UmVvd3fq^lc0Z0HbCSZPyB*w-dqY;x*ZCtAfqKwcf25uEY1r;L&6=MYz6QDLm z1}0-8kah)xavVDOkaQ}jm?CTDL$cDWR+E7htQ4$*HQLz3A{JzWD3T(m^MDis2h3PB dwoZbLiVv6BwR7;><204m>0RW^(KQRCR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_800 new file mode 100644 index 0000000000000000000000000000000000000000..76b8bf2c7d5510d107c76bf4b571342b902fc0f6 GIT binary patch literal 308 zcmZ4UmVvd3fq_w*0Z1@1G6-wfTNxPCL>uZ_#>S**#-vo6)q{ukD!A7B)$G~i0V93D0tN;=Q0+3@E8Td4S-ZiP! Wgi;KwDuxOwMqnwXm=usY2mk<1D?Tg$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_808 new file mode 100644 index 0000000000000000000000000000000000000000..c43d67c80718d9a4ed555e932d4b6daa0757c746 GIT binary patch literal 293 zcmZ4UmVvd3fq_wm0Z1@1GH^v3>RQIeq*R;Nf<%Cr1Bf9k2FCwDKn54xSf~*khDOFF zre@|AAZy4q9PCCU&0wQY&0}CTFfe3bVAcQ$0|Cf7Mg~3&pf62oHK7y(tBRq5iV;|f L6&wg4r4RrB1jsqt literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_870 new file mode 100644 index 0000000000000000000000000000000000000000..45c6e6c557600b2a4ddc1ece996125db13602459 GIT binary patch literal 363 zcma)&Jr2S!427Sm_^HGQdxbi*L!~BZ>WYPfgf0ki2xxD_)i?t<{Q=PdVabjxKYw}2 z{ek%vpcAAJVZ+DsO{unV+SrV1>8e&{Gs#eLEh);bJSF;;uuBemXKYzF%!Mm#opzfI zyE3ahg*~NLBQ&|vrm!VXL0&)~?(dec(4#*O^8UnHsQ;r+U(s)S#M=OZJXb()@v|Wa a+eB_PZTfv+6{{%LQEWs=SPmaJt^qHs!$>Cp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_878 new file mode 100644 index 0000000000000000000000000000000000000000..ada9c95fe886ef1aed66dc83a5fe78da3252229c GIT binary patch literal 299 zcmZ4UmVvd3fq_wp0Z1@1GH@6g#H3Uk8q|XLK+FTg5EcXDe;}Yb7u8Cr@jQkGhDOFF zre@|AmIfea;IN+fBpVpJUr%mxOA3=GV9AYmW?8OX>WssZ$<{9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_881 new file mode 100644 index 0000000000000000000000000000000000000000..78b32568347c0182ef7f31153c930bcc60426798 GIT binary patch literal 370 zcmZ4UmVvd3fq^lT0Z1@1GKiSPq*Pnh)m4Ux3C?lYaU0IT8Q_f*K?!Ot zP2HJ!^XBKgf2!GwQqvEmR8>{#AsR~ir&r(I?e1~gjqB=NjwXn;=`zgGIw#+hb$mV$Qk4uasj!7AVvB4!s*pYJrY~6aA78DG6!Mxy$))dxycPo)YaL+pv(Vk zqu$z7_a%UB1{o(VNh`HL4r7VO*+<2kRx9;pke#H0sEM0|sZfgAP)Je@xs+K{=i8Kh z)a>ABqV_4b(YP(F0a_c96pfBOF1IlnjR`Y5%rwNo-%r5kY{i#bIO{CgL50*_79u7d zsGSkkwv#U8RO*s~mbRU5+Hkse>>hA#qigy-7lM9sV7h?I4OBh1_=0ux$ub8Y;9I+3wNdF#%JtApob{`7d7D^i0cEMfsO%O7P{4%0Ktk)B+U6= z0FV-nw=)WuQM8nV|K@<7HbcPw3=`u8eOS#=?5(Vgez(OkSF9?#XlzMZXi$~pK1wqo X9v8^+JxY*F^zR7f(QNSsC89syIm6Px literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_883 new file mode 100644 index 0000000000000000000000000000000000000000..56b7d6609081904ef3bcb94cc1fbc2a33a297199 GIT binary patch literal 666 zcmb_YOHRWu6nt(J)Ka#;$z6g%yz| zw)1AjGkO1@{FP|&Mnpmgy4yS*J#TH>bc18rbp5Vk6)??#C9ndnfi-XgK$l*hc>et; z=mmi^pj6W#6Dv93WNL+!hZY%|P9bJYS_d2_YVX3}wFL#b-d1%;I`(Q?L#E?wx5v(S zrN^Dc%(gP}U3G|+r#dUgO0hQ9{oQo_Bcgn!pbSn#+4Ja~#yQ<@aHk3KY|+&|NLrR$ zl)5NQa(eV^FGqJgc8#vLXD%ntnN@~LzmV;Zdlwp!Cu2;b|7n>SUm*&cHu4`X2AMw6 T`ny_DT95_hUK^K$QB3p&4tS0l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_888 new file mode 100644 index 0000000000000000000000000000000000000000..634ecce02e03787620a90dfdae168bcb00fb444c GIT binary patch literal 291 zcmZ4UmVvd3fq_wq0Z1@1GO)#@R2v%Bf_Om84a5)@1LJ=npfeZQIZ&&)4ULRVOwG(K zEDa37PDFAT7Pm4m8vxZYFjs)JL%hPsAgTfMrE#q$5@lMe$-tpvsGwq`pkfSF45a`d C4>{og literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_979 new file mode 100644 index 0000000000000000000000000000000000000000..89f33ec6caa6bce22af9f02e31b2ec9bf60c8798 GIT binary patch literal 312 zcmZ4UmVvd3fq_w<0Z1@1GH^#58k<_i#-vnR)PjV7m=j8KfO!mz|A7D~1d+tU#V`z} zhl7!U)6mG+#MI2(!V+Wy9z#fxMRy;}J|yEAm<~P2$AU(tY;UfZs6j4y-%O}CO6M~oq zxlT-)ftc7rLBc}MWcJB=9qW|9n+HGAOI4~wz*KBSR4lRaky64rWBqFF-MDClT*VDT zHco{2zvFkY)5FW9nV%+!yv-JV2lAA1)-v^I904^=+%41(^*l_FVj6b;ETF^E7Q^z6 Wu@+$Zsq>KYo!mS$K$zGH+KxLm*iv@@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE new file mode 100644 index 0000000000000000000000000000000000000000..3ec15121100d9e03c070cf8d4bdad81afb79abe5 GIT binary patch literal 666 zcmaKpK~97)6oy}!!C@4W$r$&uU@;_;l+qS(V_bNO4!b#p!XdneH}NcN(ooCG}HLW60O-Xt(h~699p9x=OOWlk2n4b{~R&g z!c;ArqNRMwpEe856g@r>t==h;61WIICfBq(;%?QD^TH37Q=FBDO!Uf<2~$(Y55F~(YJZf@`IB3Eg-j{C#@AcOaAe|Ro03cy}Z?-k%?11JcD&CTyp z9i@_!td}?{kCdlNxhredU=aHd6M@eYpGgXGgqC*0C@pGjNzF&%QS>A7aUDkYcS@R4 zZd8!>l9CWf&cZCENUg3#B!?uPB|+1=dLNaU8FDVs>{%4zGphIUiKPei;4Mc~OxU0j zqXu;MN|H5*OOK+Xj5hk&IZ@A)Q0gf@k#--odv)W7Bn*ykL8FsQCqu81j|D;6bVc_x4r$ZG4|W;{`Ca1czD!7mJ5VeD%NI^)nbV#I#i%9nPPlG5qgLk`}0)`uLA8HQ38Q_g~BSJ)kC9ikK z@6Eh*8I6#FkYovQrPUhnkR16CK`t}d$BA4yC&LkWd`r7Ja%pZCM#H(6;7n(el8=%V zN$(24*0T2;0>{WHan4+dX@r~*l@6kyYF(_Qt|x(egF=%(tvHvkq@IYnb`)T{Lj?Vo|5G)<5O zgXhisKZdVwiav>^D0*M=UUfo-G)-@UELnDE)-bYKJNmul{vU3_`2m>-l1-W zm?IX57_mesM1+p?Zk=|OKA5I&B^@$XG*#*kB{tEoY=X6^h}l6y2v!=>gK!SE-(dsn zz_9~XW96x+4sI01#$?v{ynv4<&n-Jpz(UG z-M4SGPk#TT`jx2qAR?s{-E|N5NpD;nr|m9#p9AM%=(oGKuonodfmN^?c8MZ-MhzaF zcw_vOoxrm}#3ZwEVagVa5eaO=IAsq%OgSKmU4$E^UO;9t(#cCFS*I?F8qL~R=L7n+ zptcrt+B%{0IAM-4j|hPAblAdy(qTB2Hj#PR0Ru^>@P_5_ymR*s+a*+hnIj>blYKYyYI!B*oV2>Y9U1HAhxsX=Dsl1JcF#9|)k@ zX~hM52+1a}ymX&qLSbfp4zMVd~O8 zr!kLH=k`rAg(Q{nJnQ{(O>x}k5OQ=)mMWL{*5uGn9(5y6rncX^>?VgcA96?ylHTbWOp?Qh5mBYEirXraUUNaO;mYlBVofJ-CC{kmQDyn@VV{*wNrLb`pFZT05uH*ckLQGyt%rW`kidkfO zd>o5@mG=+|x%I_?Xm*jb_y&C&D7#uJU8s3-)+XMyR;|ESubQIQyV2Z5q*wbC=Yr2k zKFH4@$BCFr?UsgGGHhMvJei+5C|o^AQrI)-k6nQwj6i(X~b-uJRv3Q5`= z^`N0?Go>j|5};>pnz_VD>BSRLi!dP|NCd1wPW7RnfWZtjlj8Jja=BJsN2?h11~Qg}fnPP3aP0!7)z#Ckb3Vk>4Y%lIAur^>E9c_#?BXuK7~ElS*NF)sBH zT$8#P>h4i)hPgGxiZd{v6*~qS znJ1SG@Obvc>>gP#d)F+4zJB>N0;xJ{TNc**J4@}3zIg%hT{cwfcG(6EqsMOvQFBMM zDo)Nu8`Fe=XCr9l6v**j>K{b}G zIJL}7X}}<#!N&H^IEYQsq41_w^9?;6&N=`XOGUhO;woC;#D0=K(9`1_gVXPK3)#Z9 zn|cEQbU#`Uog{wCT1Rhk?3!L`ufJjF}LoP70|2 zs}L$q3h789p^xXc`Z%)sWYaz0xb4Ox^04~GHU`emB(L4tIgP`R_Ji7ZgwS{@6JnRBssZcMG`Gx`>s|##gFDR06p8d=YaIaZ#Mx9dQ^R4B#(VEw=YLO zwO;k@O8)K`pPK5oMYWv%mw^;ea~(`I*M>zq9iXZ(0qubWhRgjwi&yf2ZnrI9m^x#S z{mxjn*NnA7+iOz5?-=O0DPVnnvwTVFR;gnBf-*+jW4bOQ*q!Ab zYa!DJ%>8trY8~TovWfx!D8^#1Qe>ej@-j#_tk<`a0` ybEv=k2q^xf>mTD#`h91mHK*v)1$Z#}q$NgYF0vq)(+^+0CwIDJq#k9Xs{aJoKP+be literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS new file mode 100644 index 0000000000000000000000000000000000000000..ce57e4b5c892727fc0a14dc2bfb55e7b7dac199d GIT binary patch literal 717 zcmaJCn3i`Ma$KWCyfHS~6CshlAT5@bZ z&5XzM^7cu~7ox>G5p`Whx7){u8p}BBhrOf{q_@@#`$K+J0OopLSAf$!5Fl_4l5}P9 zUP6!x3Ay~n`v8~1AO?t?ky_HWI<3w&jr8q~*q)}OT^uF! zW=={XSLijgJNiOLnl+@v)vINK#v1a~k(^z}ibfd0OcEqKz6I@!e>;PW8gx63^>%xvAY^@z3?F@?= z53!E0jeJ@2ubNS{n&v#GM}{ z$N_K>v5vNz{a(`#4ik8M=y`;T4W*o&MP6FSJ1A%-1-@C($+fUxTq(}Fw>9Wgd4b?9 zWL}!PsV@nA(^bASQ@yKM*OL1|@#Jw_d_mwWSh7Psr|kNN*824e=!_hbcyjSgf z#Yn7a#c{P=pI5J{`o}Ld`=-=X;n7;F&vyCvAyw-cPv3&jp)(=uEZQZnn9_NlhFT zSE@XMHY$s>H{>!u~bY;oS;K47nLlp}-?VPdiy-7{CX zZ~J6@P1z;O{16DL4W$&;4ZX!g7ah-GpM1dKW@~cCu=q(3DmJNtGe)6Ri6g8b5{|`a zG>{0;Vm^p&@PI@=WLy&=jvYZjg@BMUa@jFZf@D7`dZq|P$reS~vBRWCI0A;?)-_3h zt`nzbWW6SG#z<09rpizPsbN($7OTkpTB{ppoey;rTlCJ?02C1>7WE)jFXVO1%#(@d zddSp~tAbN%ky8!&OJA`>ju?bzDHTjlq9goGIEwtnw$dvjac(3K2rsbMhwM4n%%N6| zW`KKVJ2V%_1(JjNy=r%)y0Rp=LVH3H5_V2Q4or)O$;6YAp0@03Vnv-zQ2YM+_FT67RbjkOdo}m6YINZW|(SE8&W>_qX|j z)fE&;10C%^;3F{kF7HQ&6!E}!WQXrbU>(QQ(Kl7$8?)xyzL0c8#yN;RA*j!%FL3`+ zkroaehc*ije8mI?w6cw$qHg*IjS(QXt%17LYC3MZLQ1ce7A?&?mw6{qJeyK{|`pciU_{!>%@ z5yOZN8ZY1zXYY=np~d7)QaJ~AmQB$;Y-ia_EtuUCa1X!YyPzTL(*T#~MSKyonk~VZ u(YStkdRRg%^zHIEFmvkQR{E#P{D8vd)au2s6ATQM*~$N0&i|G(t@Iy`T8y;- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW new file mode 100644 index 0000000000000000000000000000000000000000..1671079ae482c488f9d16956be3cf6f0f2313e15 GIT binary patch literal 463 zcmaixF>b>!3`MB`sWTM_(4k`o578iik|o>fQuGc5I>_35iiW;X&XL>n3@s_wNeT}! zAPeSy=KqvV-?04xP-ozmQt*6udrdBwF6LnzM(PpuFdqFRIB#oPWXwaRhcq>Fg>F!K53`!;W)t26#>@KqDa$$*mpx z+0S;~K4|?yw0b9^rfKL=597ghX)4B5%}wR@{?79-4r7VTZN2qV2~b?8RP|?N_wbv{ zz4d+C7qwEy} z#wP0l(SQh93l{N+!e8Yjmt9gt8=2fZlya3 z_TRzv;uA*{xa9L+v!Pc#vx-ykoRyXdNy!q>FQ-%~V^uD*!T4dCE=+CFoOSQy0^6y3 z^fM#}Oh^?ojIC@m)WIn(I>{2Tz<@Hn18`n=-J_5O^^IaxM{wN6?3S4C&S>@U1pAo` tb4dvlGArxlg@}%40}@#q*cm)a2qngnghJakv|?_kVHCpW=fI&NeF2&~h-Lr) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ new file mode 100644 index 0000000000000000000000000000000000000000..21bb446caf7953f239f26dbfefd80c4c9da884f7 GIT binary patch literal 1016 zcmd^7%TB{E5L~yE5>?`W!~uyzg>q;P73)WwgbU&~aDD5IKLGcS_$uy*Pk>oB2^E3^ zT(J^6-kq5pXZ`$2vqz%o8xbj`=*s$fvwiZrw7R_s+PJ#u;%1vXr?#z-X?B9dTlDK3 zJbD1y03Mxb6C~=uCJNkTAtPxMcnz`SEj~;eD*-wI)fohg4u~h`5lq4ftlip2lY+6) zR)Y0XUxs*?D=M_HcwFsa<626)v24&ja&m!POmL*@n3}*%OkF2Z`6#_s;drmoKxW>y zU(;>-nO=0vh8Yk$n1P#O9|cUDk$T7I#s9v|r##Tg%6S^)X>xau2ENdQ8F1B40y?7e zRd!j)Vs^tqC#7DNW?5Q*6wQKOcTotJ-@bG?j9S3c3*wHrr+WkI8=DuVD^}~N#3d0s$;8ckF92#f(j$G(#AR%zVp(`j7y$H4fJXxMt_@{^=20r zbZ$_1m8l-w%MfM2!EDcC6k$-1JJ6zyQd@r%*6v~GrSwry*n0KcpTsvF{>WMWSPHst zq``^1j^mjgSBHE$%G!0wM5*8@MFh<^Y7dWz6M$?v!*87<(lmK~f}b~u|=ttrCydM!xx@!2A=uHB4{d0b&6UK)Oj?V h+H>3;^X5Qw(B501`KY}tZI&0ffI$=glYeJf`~ceU#Lxf$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB new file mode 100644 index 0000000000000000000000000000000000000000..5cd771bf54fabab7db1a0be251c6899ead88be6e GIT binary patch literal 995 zcmah{Id0rQ5FA<%1Z<+%fHNx)0|ImP98L@<^cQBC?E@TJtwitfi=6oZeuGrixCGKYob0=#aJ^PsfvX@8{#`zCI9u`>;Q+0C$go zN({rN(gD9u4~hy$@E*0TT8CfqI%`G+z?he^YQ*3);?nU!2=zKr#srm&j<6(rusH;_ z8MP#9)ow#tU$vx}v@&V&BDJf@9k4!!n6ebm`@E6i0^Ar;cqq-FB-NHD)WwKsLAC5e zA%GlDpwNdbb=Ai9xCpzOZC2sPFha)X=#5Nzg-jGrIw13&L%i3NG-nmjQnXfWZMOY5 zOgZ=CG>7JWd^yNFwBjti7W%Q{LGU#N05~_AFi*JnhkkuG);u(3^X45J;O8Is&9rE~!j+#*=AMU>sP24cvu}9W7NQA)YVPyyBqU`B49%n%3=SJL z2p30)>}7Hi8uNb?6bQi})P|EY7%4z6Ig9*DVp7;l`b)1*TYzGZno8X>%;bQB58yDe zy_JfHLcn0;_jvn&q{}~Ynry2@*G(@r8HwMSxHorqG|*l65b&7zbA7w(irmaM8YXuM Nwl{&T+XXx-(=)W`+Ohxu literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD new file mode 100644 index 0000000000000000000000000000000000000000..5c4cb85a70c51ff733ac32c48fd3505cc656622f GIT binary patch literal 2129 zcmaKuO^)P55QXiTX&8ndafn`wr7Dpb`De2kf!J^cw|9L2c1VzQBbHo?Gr;#Et4it? znv$~Z%8Yyw@!~~P|Mk!G@W(X0oA}K0JpH=IbFSO*^!(>`>FXZO&A+tMdg;4ezm4~C zz;-(OYvr}H@m?+fKCr%EeaU*y`ik{|C07sg$4@_IR*Fy0PtQGDT6!_F1=s1q0Z+Ru zpZc1T?bTti(+yTgd#Oh^%S#uE*>2_NwWP%XPWf^(&9>)ufW7rqPGlaeu~D$s-L|DlLi3Ufpvhr$W^ZLV~+qid8=fT&}egVvJ%mpNjiYz)ld-@Pte+q}`KVc;-Ds zfyQ$Zc_H#>JQ|U05j+qAY!G3@NLA$2g#!i~!ib{%tSlg2Rakil04G(!ItUI063$s5 zu&*eRAj#=Wy6)c7B?4`r=$J{Ldb^CAgkTtZ1_sj7;|j^3@HeGFa==y`i)#!* zCca{6P>QfJ=(Re**2Ss_lWNo)l*FaGdXW~icjZH2bU}rU_z0+O7|K`LbMA~IXK`==}L%r7ZLs!XqsS^Mtlf(Yoyd^Ntzv1#7^^#2HS0D zg}RZQ1F1ZyvvOTYzyPTuZRUiGq*k#7PlK=wq6kZaZZ#&Q64oA}(wRbbtJUElfH)dN zfYj9ck!*#Lr6(W~wJ)Q^??~71bVArF_Kx+4Ys4oFsVV^$JzJoO(q*S^$5u-4v|^Jk z*>%oP@TNoWiqR9`(6W*z?#`piC~rV6k@{r~1|_K?aY-GITV8z}Y9dbWt;HBEWyY`y zMRSb7+H20b*G8i&m7dj|i$rpr!VYmAuk-W)4S`f@TS5DJ4Md}v-sEp)`54A-4dH62 z-D&=pk6zs9GhgTFhfOR8Qlq%ugDUQxRO?JH?AmV%R z|1wQ)f1BQffcbp=Bg=Qw_aE`j?}#4xR4>c)@EFgJ<|%%cA~l6h+Ju74)7$VEIq^$r zTuP_*^3vbxq+P>Q!$c(-6PAIc0o3|_tF?E420z=({2@<-%nuGNEqyiVMU0IhFlJMi z*rc*lxOf#8*D^irZ6J+tB8lm4eb{?63hLvE~3yb~yz&H{xoX0p7U(O{wH~ zY`=N)jqC3py8a}ZKN68ritbD|eEBg3UA8?!H{xK1vA|ejh>SiwhpO}Y`Gh{K@caN z?ZI>DylXFMWIyqxwtn%GAazRW-=(5g=RwH9I^Rd!tTwpnScS?8ueP!>K3ZV*vEc~b zM)m-4k=1$4a--*!FTl|3?H$`0&6puq+m9%(=zfhZ>#>lj+Dur{BG*}7WqAz|{uZEn zj%~q;=A3J6J|H0_o#w)VR=eCRHz|FEXM@L)UeDg(>8Rqi@L`&I+-&aXG<{Ng>p4wV KW}gWp^z;WOlbl!p literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF new file mode 100644 index 0000000000000000000000000000000000000000..8375abe516e2a10c57abe5f928a1232c88cf10b7 GIT binary patch literal 447 zcmcJMF^&Q;3`L!h(2m3&VT&nJFvUoojFW6=kSMr>iD)>*Zn)9bdmwtw0CpH53R)~V zQR4sotmN+kiyr{<53(2opNx)%nD@uuc+xw`R#K~QaI4K4B`FopZptOF7ja39V;EBI z3u%>oNLds#goh-GB&x!Tf+rF}@i;f=d*PAtY8Yr8QX1VvLbVFzQ8{#P=^2ObTsY{Q zY7NiUh-&mfM+bA2n47-qSRd($RJnC|z@gdh1c_*%*E?$p2BU}?wBy3S6W OB{3NIm_KLs%XR|_&|yCS literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG new file mode 100644 index 0000000000000000000000000000000000000000..503a5581609c245b207b25d9109a57eddb155748 GIT binary patch literal 1488 zcmeHHO-_U`6n>p?1k~uppY0^Fm@!OJN}h4w-F5gs5Yb3_HSwl%@rQdQz1&3CzALq z=m`Ou-9JF^g=SI$F1i;Z6N*+o`8CbboNY<)fJ&fN5?BNX2!kCuEkZC$H+-#pzbiPT~VS7hh8%ijW(ok zF%}Ei?<*$g3?o~+mXo|Ld#=#W+!KFrw7VI26K9w@^^wyS4eg|D2I@G~zF>Qnq8{+v V=;0>u6A&NaO8>7@&>y`{@eN!K83q6V literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH new file mode 100644 index 0000000000000000000000000000000000000000..0483e11c7e59bac89cadbb05e823e95f216a8d5b GIT binary patch literal 576 zcmb7?JyOIl426|2J8S_IoPc7Bb&(l4{*gn&3>8;koOC$@1u-|;tL#xY13Z~!cYzAe zD7GU#>64P(JFQ-cS|OsQY3M3j7rS8^=SAN19c&F#FTHFZ?k&tAD8#A6%vN_9XEV+v zsyo{VaS6=z&Nw5ypNjV-gd$mxy`*HykmE3^nIceT76=ip6|60ij6v4LD@I)nt*tQI z-g&@0D@fIKqP!(#?t*6jW>GINoC7GR3=nLEa+#e{XmJPy!kD1@ThGN~y=&y}T~#dc zoGDeJ5W#edib>EJcS$jR1`emd%jAE1lh?+OMtf~OuntZC<61x0nYgB^k7GV+AD@UW l_S7=h0$(vV+d67<*l4w}cbgtQG^M`;MyvzwJFmx+@Dmi=cb5PF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI new file mode 100644 index 0000000000000000000000000000000000000000..0ee448eac39c261ec4e1499334a316ea258b9e4d GIT binary patch literal 365 zcmZ4UmVvd3fq^lF0Z1@1G6-wfTSXh0na9SY)EFCT#-vo6)qU5Cc2ifHReEuDUbm-5~j!8($oyB2W)?2hs;C+p7FE4(33e!5N{^D8z?Dk(MeGX*9>G#8rQ?K}Hd2w4 z&P|k+O`b$)Ru&a&rmXo(%M6oD$|&HIf*)Pe|6hcqHT&FH@~M;Fga;=fmr9+<*aBg0 zY29I}520Jcq~j?j1_S4GCio7Hlw9t@fo(v#x(z2USP10{?TgqK2@w#`GH*B8{R_hC Mi|Y&XrVrNm0+BOS+5i9m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL new file mode 100644 index 0000000000000000000000000000000000000000..706168429c8b493295b88bbd287a551d300503dc GIT binary patch literal 532 zcmaJ;OHRZv40T3gF&gf`cDktKw2hO%0*N)^0%=zC6ocnRT#Ylpb6U`JLsVO-a9tA@!STGTSd(G3<>(kP577_f1ju(FNrSXj^$mDffw>R0)5-WumHIOD zQZ*aCpy~^IBLO-0Q`I8Tq<3nzTFGqes3kM=Mtu*BMu8r=m6x`b0C}ebUuI*S#;=3q z8%Piv54mrw?P&k&=xpBbjkyGyQxu3!6~c6irdw>k7n!51@c*N?x49v2Qd;`cLx-1F Ry!RU&n9=UG)U>Y2{Q#aoZCd~U literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM new file mode 100644 index 0000000000000000000000000000000000000000..dc8bf14fb14594c03fb04f815763af05ba100f90 GIT binary patch literal 691 zcmaiyO-{ow5QWD@Ri#RZHCyPSUPSWG*m2k(vF8MCc0C0hE`+!g2jC3w#z`rl3M?gd zM(>;FnaS%rEuV-MFGOUFq3iAa9kZ93%DCI__A)qUcl$&CtO7jid0#9< zlANXQr4(C3Hz465A9?t%i*w=2`VxhmRUv*YpIVU|jVYov&$SXdY=Y1k|Nb7=4}^Eh$vwYifV= z!2sIT(4|m)P*!3M5g`B5u7pPDocf}(BXerRpPy~g-_%X~lc2@Jqh_QF=RG!~udD58 T9Cjn#&=P;g#w$84=n*lW44;%q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN new file mode 100644 index 0000000000000000000000000000000000000000..2e5a9d8c56641d3f3ef6a6d83cd13e6c2729efb8 GIT binary patch literal 382 zcmb7AI}XAy41K9oRYHiFk)cC7RJ8dtg$0QNaDlX2ufPJ$Vc5AEX8=27Xcr_bIhOt2 z^C!<2(iFUZdsQpx&j+8d4It-IjnyQl_SQ;vn zL@}%nCXh*`O=~-9vSpog9jn5ieq^?uvuzXjJRIUp7Tf%j3ard`t>q>rZt}BtxO+A_ oke3Q1=L?WLkkmCJ!2~u19ix27LHiPE-t2NoAbmpo+sLKx0o6}S{Qv*} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO new file mode 100644 index 0000000000000000000000000000000000000000..028a73feadb6ff6e2c948053327dbc6a0e17e781 GIT binary patch literal 725 zcmaKqO-{ow5QWEuswovq)^w3Yvp{mjKXKR~(F61VX?8sYxHsY;EVv41fcIReXeDZC z5_|m3^UT<9pE7+BnS6+dF-Go_we5EI8uoeh^f>5)kKMT49^Bfz1#o z@1T{o-I2zuZS$ZZF}NQf(&R|5W+3o54^LtQr`h#6YSUx~k1HA;vj{W|dPGC^nge9J zF{cO>4N&Pp4qDQ5%y`TmF=-@;MT9So(59j<+9ea_=VR)bVTZF>pl5+BiUpS9j8v+v zIv*m+oU;;e-Cqu1)g6!y%q?3u*uow4*eq~!?iH5eV!kjqDQ8_+8kq(AdjaS91^bg< z5&BQ^{D=Zy$`&{MyuoK9H`bzccoxkQRE))EW><$bWv*ng!X^xjX=GZr%Ua<#vKZ6_ x-iME4iK^G@W!>V@5Ke$6Tw&{)ojpPBh`4=`)x*ytpepLi+LbVqPGaE0_y$=-j++1g literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BQ new file mode 100644 index 0000000000000000000000000000000000000000..b2aa5b880acb65d9447cbc3d4c1702772bc20bf6 GIT binary patch literal 395 zcmcJLF%H5o3`LzvRd-H72PC^`nv?~Jg_(&V&DK*uSU3+?;|%a)5HPS3$&Q`a?_0j! zs6G;z3&9yfi{)k=ZJ#9jX>O*1$>)1(a9`kvp4mFUW>x?77VzsYK^P%3Wla zvSUyR$QFpEu lF>}Xxss1a~^?WI*uDZ84RogvLb)bq_r};QTH5Tp@Jpg3dRMP+e literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR new file mode 100644 index 0000000000000000000000000000000000000000..4722a6b8845f299c085e57235f0fafc5505a6fd0 GIT binary patch literal 1685 zcmds1%Wf1g5VSW5>}~`H6okZS4dY-)0iH8I!>{oTQ0>{r z1R;U~Cr0x4)vm6tZu{#uarQ}wQ-M!PDL!QCT!_Q%-RIPj9*g%`W2H;H)Q=@w$D_zQ z+_zZUUR@rnO77WI)x9(Vma&&;E3`G*IT||??{F@Y3pfC;X(%R>aj_qY#oY72XR@6i zO00cMgUSZ;N`OJo7?S&?6l)@5oe!~3fWLkWJkG?DcKn(BV&{Tc^SDML#W_(5J8$r{ z?zIM~(8m3leYD`V!scWO%V*iA;djPZ~nCY{%j-*W7OJiqWdrs7oK5Vzu2^ zY{m6^3QU#N0fnX0+A#-KO33f{cuRBEft4)7)thG@FgV$W>VvK$=Z~p75eRir?yaybW1cUbtT23F&xoT zvEmKehEZXSuq4HMnrQeAMQO72k?YlFZMuLJ&@r9|z64ws4En4IR1;qwwneTCl|Y(Z zJZA@PRJ%@`HPlt-3vq!QPH6@0xlIn>GbFR5K8_4M z;C=WoJ3BkGuWxGoL#fqorIglMeR=r)%}39TO5Y#$2d>td{oy(P6aen+@x1|D{Q?vP z0k=hs52-h|)XuTl#Yg!fe5KMkw-9sZf@ADln_pte-Ed5f3B^e`P)wbjXWy&~om-@C zQ3@m~GiYin6;*k5EX9bpDB|Q2fg7#1kQE}OTq;DqTtrgKkdzxGFcF%A2CC1Z-4bYu zb_<#%s1)h2p*X_?v=>PnTEH_#Oy@9%lqBMu4N5}nY3TErLor;Ag8}23^@8;v4ATf1 zr`{fds>380;;W2g?HG1aS`J}IAWmqQ8D>ClMQqRM+K^(c7bZ&J`ix9JAmQB>|4*pl z=3iX$AyNOKQ_>?k^qIq86!Aq4!w5OcXkv;vIlM$`8=iGkzv7z7O=#hAGL+NhOv4lgZ_`-c{=eIre?W2e;`q&p|2^8y}!^gkpI B+42AY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT new file mode 100644 index 0000000000000000000000000000000000000000..3a2a40c44ad2980c981dd26b68553b8d8c6ab19e GIT binary patch literal 636 zcmc(cK~BRk5JkUJg+@i{qQH(t7Fo25NVT2V5gR1Vz|MHb4Z4HmM%;yyaEA8JK!jA- zA|g%3_Wb|GnY?|Vd;y9B0Ambpl8r-tdVY=5m|UyNFtJ!LmW)b-j0?&Uw)b}~`8MP+ z`7Wovjd|>o^E?Q&cg!(4NrPK=(oG>b^{O=j32aS0aF?0O11IS>+8;|%cZq#r6^6w4F) z`T5zJk58Jt5ltV6NGU~n`~0M%)&)Mhwkx<-yFI=`(@W6SO}E>Z#Nk8eQ8$InVGGz2 z#!U1M0t@q5*FJWofw#UZDeKV2t||^mgP;p_>PiSDH;IYctc^ooQxy*g>hRZQV;iVJ zbsbO~ka5WPh+4D|4^Zt{aul3T05$+x#9cs-Y!EAv8+fo)Jb~v46pSapWp2GT)_IJu z<|fu~^EyJ>X<&x)uz)XG!|2cee+Rtm4m&%pOhDsW6fHR|^a1#J0&G~}rGPX7q`?;s zUqm9Q^RJ@EHld+`@oIT>*a(DH#lp9vV0WDFBsiI2z<>F#`~4z;CNHnhbxRYiIW1>K zt1X7IeZ?;H70ov0eq)hTG)V#!gc}h4Ct{VY$NR!0hMxsft}pn;A~;$I?fu3H^9{e% Z6B?vk^e0-03?V+t7%Q%bRbzNM literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY new file mode 100644 index 0000000000000000000000000000000000000000..b5615e3466e304879b9a5e114606766d2236207c GIT binary patch literal 1245 zcmZuxOK#gR5G4~Uu^pi3rpTs1z0kr6B7lEU-2~_zx+rMvdLuFoJ;H#_8R*JTVfXwC|)2! zV|zNm>XFMhk{gn#U6)(dRONtxWUMEb8*R;QzuQ;Yj2r+4a$Cr;zJ_d%z_uGACa|g_ zY?cX+07LbFSQ&>F0H`d^s-l9q8d6LZT(a_^x@##`+8gIpt2K(*f|A7epdui5A1l*35DXkYqEd*l+*bfq(zeS6wxRcc@{(d5mDa{O9~$KTirA>t^uCCq z9Mo}qtnu#0V79zr(FX?!IbEe#8rPnc36-3Wc;}G!*N=?smEvwz7->D#2GLyJJLv?% zy7=`6nGWI-rAe`f&veL$6otxBJ#f&K__C#z_0@QYqSTwxz$t-LjNFtO_uE;Z8RE^o z>npKj#HO@oK;H<2AUZ}6a*dFhAs0gP6ek@pMj=@mz`Hqq{sNX-KQ{Nn3oH`;cId^2cY``S F=6?a02H*ey literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ new file mode 100644 index 0000000000000000000000000000000000000000..feac3a5b88f166cb625f77da3cb15d6539df648e GIT binary patch literal 474 zcmb`Dy$*sf6oqd|2r(pX4(<#xG^w{xh>MAvuV7{4DFoigm+?Uyo%P&`k`PBpPJizG zdQQvrPVt3E-3WtHwA$=_MUa!%FTRllR{0 zvTml%Sgxju<&hQlLfjQ3?pP$uyk%P;V(Glmw$v2@x^m9BFSmH#xT`)$xTK;~>f!}S z0;wlHS%knpZRcJ;>?t~&kolmJGO1x+E=abnyutjzuV`1zACLWWA36`K1T zC>q*CO&-aT6*-|~R4uJfbn(cBCq%6TRO;+V8ZBD_TJ|VAF=`$YxuXqqjk!&adf71c znUDr@L*tUoU@cZIC<(2T5rl-!jD|WJ;(!!1O@r`Q1Sv-F{(9ea(d}|c>rb1zEul)v zrMCXRUiyQH7y?p4&L{=7qBZpXvT%-~^$;X3*(ln(5yFcSTP1VX%4MuyY&I~9Jry&U z`H1vfX-fXoWzFRgn=JJH!ECpW{cbQL&{BWYr%YQzh-NPHjINt=qlj|7RUNPU7|!FGgGHklm*(d4Fy#)})@~vc^e^5sVT!~N4hic&BxFv) zQrkT1w&xPQO);$FT7qFun1d5xV=U}oJPyn5g$Ky_&DSpreHCIPV>>=pyxR5~G5Ph4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC new file mode 100644 index 0000000000000000000000000000000000000000..226552455f37f4043235bb21ccf04ca4039afab7 GIT binary patch literal 833 zcmZ8gTTUD?5VQ$NScLe>5m1CBR&v`OKO!MMIEHb)I0f{4avQFeGlVKHJKAKVmfP*> zu6CE_{g3(jV$7FnjIq|5d%1o1)&0J-@$~#!SM0Ec)jeoMIHdhND67*hsUAQoz$|xV zMUiix_8sd5YzMo9UBO6U-YRM?r17+%Q8at4%_)OYwPdFuM5pbD5>gKhpO_x%2)cMJ z2m~g1&Buk&suyBacEnbbLcg)Qww8vTraHI)h0PehzU*pPAFAc z_cF9bu*ZyxBcJYIiDgw{<`Jd&%cZsY^E)~o_ zq|Uj_E;Vf3o}o+5l(R(6C1C!LhNNq0o}8I_Y~?p-JAvK_r{w(v!oxb%O}tuSeuTCX z;UxBX4x^^ja?_FgaVv@wWB=l#Ly3P1N3*~nT*5q*)9>`07CaW-YF0mLz$r*7GOxto zX~BQDQ?HZbdHNsZ?C}wid&3^_O!v7$i`f*nLt}zoQYcm)87d|CwK~AXn)AbAJ*cj4 S`*M8oH|j0^lp7)2@%sSnIH|n= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD new file mode 100644 index 0000000000000000000000000000000000000000..dea8bcb416740fafb42ddfe8bcd43a830078db71 GIT binary patch literal 676 zcmcJNO-{ow5QWF4p)E-4*s%zbRW*x9wi7!x8y55yZgxEdBq!ktT#Xe6fam-XO18B! z{>%5?%qaQzq~w)|zY`H-jCT9yCp%8sW-V|uIFCaB!H8hhJ0}UqjNon8eEXMMHN0sWpiKmRY1cLF>}mH zjJDp72HnLsM%>_4oGx)Zw_eCb{N;e_FXB=HXTuc9Yr5Z~OWkI(rD!wS2$c$*iUJTL z?i`~lDHKk3Gtz)eIil z%g*HnlM?_Qfde9}YUgazovWeGcUw=cZMxo?HJ9ul413BhG%Oh*Z>Sv;u?Z;|YpAR? z%q^VPRESg*c_B{ghy=YmTkIgr-fM&k2ZU5=!pjbTAN-GJxM!plq`vha*&n!ag+y!V h1mlm&`5GG5KNHNA$rNR(%v8k#2vbkCsN3f_rw6xbN&^4@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG new file mode 100644 index 0000000000000000000000000000000000000000..f12515e161326738700dd5744289720497a8efbf GIT binary patch literal 462 zcmbu5L23gr3`OOkfd&eNLZHhmW|1rmvS#dYy6K{n9>O!bIYsNaQLd5Wbdw7tU!D|_ zLRS^YM*h!VLi=x8d=i-h;V_1tMWi3U!jw0!FWiqg@)mVBsg7JCm83_2$ypzF19Y!? z2}4ULPMX#SVDBsePA;+aLk=m}-Jpi;lo{{IwKl*2jRa-O*(YzKlH4h(?2S2x*}Kze z$ea*!UqcU((MEKha6M0CzRdIM%RkDpjH~v=>ei2{w-3A=sbW^8L`6@Ve%vClf}e}- cYqzdtT{mD1nW*SW8JU^pFZ3?448^z{XFxk$$N&HU literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH new file mode 100644 index 0000000000000000000000000000000000000000..ddbc79cac14e6eb9a888fe580a128755d7272098 GIT binary patch literal 713 zcmaKqOHRWu5QfL8kWy$_AR#s^B9TSAsN}cDY*?`24kkNJ0qKo61Q+5A@H3i7wn=KsCxvW(fF*}qpBW79{?abFFMN5CE42>)u)~CX z?vmHi+;$W1zm4IH2dxG zL}jh2T35A!2o2*TExH}0poOdzoVPhZAI0@MOms1XSG7G5@J|KwnAJ$Qn_T%P=yC$8 NYS*y@j|}YbzHhVVcZ&c3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI new file mode 100644 index 0000000000000000000000000000000000000000..eacc997bbaf8dbfd810464237f094f88e1cf0c70 GIT binary patch literal 456 zcmcJLF%H5o3`Lzv4A2uGF?8tA43$zRX<8NrCU&-vjZ@I{M%;n3Z~)E#c7$k=Sg~X$ zvH#DDa(%$!0w8WcMF?1Wh2eA_`jH!yD@q>05v$$SHJq!u8MO`A#jZ5+%` H(?o+8nYUmK literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK new file mode 100644 index 0000000000000000000000000000000000000000..0b268b4bd6b920958c2d2997e01bddfb96f36e7c GIT binary patch literal 327 zcmZ4UmVvd3fq~JE0Z1@1GVnwj>6)5b#Kxplo795DfS47CL9z_e8unI3F)201(T2vl z=CL&<(T2LFv6?`&#vrv|z{tRAWN2h;0#wcwjcgK3)*LJg;xYaQ0;n*pxL^+;*#x#1 zOu#K?U~=|mU|?Fsz+_+mb`3-gp9auhMzxwC%D7gOfmOv&LB$9t$H>4A4J5c~1^`wV BKm-5) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL new file mode 100644 index 0000000000000000000000000000000000000000..0b4069634ef21efe81d70cd76ea47e3476183f9d GIT binary patch literal 2245 zcmeHI%dXQf5VdoADeV;qAt8i>L>F1qQY-lt$6>>QEq{<^*MC3)XTy?jVasRn4RB`M zJlcCNumnLQH;#SIcsyrj`sJIr{vgCc;E_^_SH?Q6566$8PXVuHXLO%hyKg#t#U8LL zj1|Tj;|7C?pY8U|YtuyA>V4>vbH=y20!xAB`h;CZ5Gv@@1gnz62dy8DsnWplLaUt* zHJz3WY&o)#Y-{LMVZnNuMcRt6o`Tl+@u98g3+AwpqGkeY!c3EoF`C$2s(I^hoDSSq zHEc3A01F&lHw`$L$12D%W5^ysMko22iqC=fgDI0?d;xfYaAejLG6k)ltu#8JFZe9 zjuo0Whm#mTXD+=za1#LgGJU+ihjwm-Q%=ayD)0W(C*1ArJHVpgqDxdSRPll99rcwn z9(hg)-=J=_37qoUAk~$oBlua1<(4Z)iJ~-ElHx_KJ|dGjqtL>dPNzB&<1xXjUJb14 z(rikLjY3>m(})Frf)tBwX%tqU5zb}!^b!x5wJ9ASQanIci@L!)UYv)jNbbyf(%eMe0`J-;JHyW6*3 zP?Sc0us@^SMoSV?yqsZ9;h%ylZUz-LB?VN9BAhZ~^9vo3P)UY*~69sXDTCZ**M DxJ~32 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM new file mode 100644 index 0000000000000000000000000000000000000000..0dea728944e3d9163ea38b3073f4112c9d467ae6 GIT binary patch literal 465 zcmb_ZF%H5o40IwPsE}Y_Wr#$ERsyMY+BC2*F!O@ajaNYXBObzMcmtdR1413K?u0`rS~Tq2)A<_uE(Aosu6vX;d;(A40;D;o`yF%VTqY>ND0r+ZN|?D| zS5_X-l_1N8UE6u24Og2jB)YQ6i#8ji`})nUK~KKt5OoMmLdYXRG)X;SlEe}Ibp7o$ z(4O?+i023CJeP7bP0JKN!hJRvXle^%*;r?634$UWf)EYh!<0`Sntd^its;3W>%yj_ HLp1dQanf5! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN new file mode 100644 index 0000000000000000000000000000000000000000..43dc62fb8e0be5f9a67641c5bc7c13794047cf19 GIT binary patch literal 13352 zcmeHN%WfP+6z%rdPGUz8358_A!V-f>3y)OQ)lY=*BCHWBB-9?U@fHwUQo|SV11$I& z*6i5BIrmn#yL;O9;0F+UqO@nGx}Nua?yX<`i1vPpqTLAp;y8}Jdv)?D{@cd5MN!pD zpPrs2r)Q^UzQD(uYUM3HtXcWSro|H9ixv8xp2?p#=_)x%PJC71MSfhYJenJ~$jcgC zebpFzUDQiXl^@qDEV_^95uV3*p5QsabBO0Do*g`Uc=oZi-KX4^;d~}t$b6WwvDFey zrm>h6zwj6PO?(>q$!b{4Vc%?;?CzUxLJUQ>jK^R4%9NF_@tYr6B4m)A%dxESX?GrU z;`|0}PWt&e=d#Dysy}0IGLA4tDBJ7GC2i_t6RvUj(wBMWtK4$k@)+dDxNP{QTO0I{ z)kkYPcCfx|EU1?F3_ly2FRgcAAsTYN=h()TOKtSI^mnAQuh~2CCC9lMPQGPFMyh3Ork+nYQFB?^>|}6;Hq# zk`E-$if)V$d0haNjdF1A2#0XF&uWkEpaWWpO3uYkrHE~0T@Zm(0u^Kt992daO-8Zx zCB|1x>M)2@bJP+vXN@bC=&MT=IADg~TnNil1{6$n(}^!+m|cLgAYkfrA7lgRYb+>I zQdLsy2k)=~$-xyCy2QeXS{B%a9zqsXKHw0p0R1sKUyzrWD4ak}jfpC3l|8^z^iYyg zdz=^nncDIdx^i>|2JvLFVayQ(!Yo{lZ4Frt7K#q=9F%K(g5|Ub9m}Z=9m~OBRnv~; z+3K9-Zj$8~qk0A5NrH8lvL2n~h@%5*pix;~lojmT7q-j{)s{jUcHDpqa#o6Ulh;eU zm-B%|sSuJUM+<}nqbi!M7!S=9z8qTDE>L5I7dSWm(>&Ou@>N1Dhd!V$cSZX~+lGM$ zm1(zzafcQHA-a>d3(zK_-(y?QC}cSd^tWOHEvE#vYT8*fGFey#$}j5$ThW;)Pi=rE zi*%_rPzE{$=;Ti1pQZQD3r?q$4BC3wRk0C;%J9|VuQ8ce>LtQ zMgR`f8%z>K??z8vLBQz9lW1pd(KL(RYaJa;1E}2O#WH%)Hd6Avt7)v|#mmu)ynBPm zCT4#w{prU%JfRv6n}+$@=Co~h(I;(xO1DwV7CZ!2QfDfH40iEI&v+o%r1Nv_&F#@V z#jCxTzHH#u8%sOLsi`=@i44>R#&X~|T6HP=enJ%{IM}heY^*0epKzI$n9`5^fH?Ne z)Wcn6@+AO~$Rw{3m?T2n_?t21_#6I>jt24p{bekL#*UZ}$_XnpCg-{x8oA*ApDm)% z+>qAdbS`(WHvT~^K4>SwWlPY`u#?h!Ie05^(ePPb^K*&tjtF4FRHtCPu)Yj1(Wrm;t_9MyQ8xfxON< z9NuAm*#wtgpQHfX;Op7D|JnND@Jvdq1~8{E5I(jIRS=8@NNzIFQWFn2j6zhpKSQ7h z^a1#X{E2veMW0G@99rUAPMK!H0S?eFm9nZf8f1hnx)p+G^u&Y&d!RfC6<{dWMh%fKkOc@I&hIOdz2e)nj6zKxPr#zMuuYqcGC!XZ~_gb z0HkGens(WmQ$_sOfaRb$<(^y&>kA;bvWiB>)gtSsuvBoj)4T+>!l zMp*yfbcVsNT&yhwj^Z7WzY_1*cZ~3$nz>;wftSIDDs1i?=x+S913y#HhY1*1TuHyQ zC~__7f(}g5-Zh5ohaqAFm`(f#C{mIv10<%5{PX6&7^veqv#S1n!P|x8cvPK&{?NQhJgh zp-j_rGyNg6=p|ViBt{LB3Qcm!8-!3$HfB85M@lXR^Kn{~ZpWt@CCuW@&h?w9G_Js4 zNh!jgS6ox6#N#ptqeQLK5APKK7{Xp~6h8Ww2=p=r^D2nT+dBeCo4{Bz>k=*pgwza* z`?-uiulO?~kdX*l*%zzdxQur@a?}caRl@Q!1+;eNXJQ0;4CSSiUYZc4#k%8p;M|2g z->FcF9AqJfM7@CXar6i@%gbtgdwo&6aP+FWtj4yOyR9n{ zoY2JrUi5FOA(ReRd2U(EQRmv$74N35C`N$MNn1eDOLIwrt2QIIelHWF+nnfS*N|>Q z!>0lEHYa*{s5MPB#Wf+PcY8Te7=hXE59OAq&~TU-?O}*M_UM6!K4#s*+_wehZV~Pf G;rCw3 z7VNO(#2L@L_j#PxH???HYOXM}*2=6m53Wu%^+P`t{jjUYgb?>b3bu<9=|<$9VJq)E^s4pMKG~#d@xxPErXUTUAS!5Tb|MvO4_y;{T+dd-PsXLOpc9?-( zbjjC63cf*;prQ$nTUrMzk@O|2*oZ9tr|Wh8HHzt_7KT@*!j@JuS4&RLuw%|>#^N+% zUZX!+&DVwttI6MODR)B~m4_NEVUCpV%=%V$mD0b-nAB3xIPYuEqt}z#BKvQX-A) z@x0Gu=KX_KuSE3=5mi-1efRV*?GHI{zdyW9b4DJu9j1iT%-JxHQn51#HKIYR5kjX< zD~^5$0=9G3LT0c%9i|Z4IqMh`2YX_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU new file mode 100644 index 0000000000000000000000000000000000000000..795fd072187a2a76c829d86c3c12754f5b442f84 GIT binary patch literal 642 zcmb7>O-_VB5QVE5P%;yZi5GCe0?bT8|1-03;TdK&4LdHO!i~I|XV6!TgAQ?HCk55j z-+NUJ?;n)C5+yH0B!r;H^63!N&UZu8_HAFa{hJ>LRE+PCJLKAMW=AMe#1-Nikt5cK z1i|$TesqGJ4oY`}3C+G^JF|remnCZ2p%FH9P_`R<1Av){P(khtE2Xj+$WLb$df4-t zTM5d&RN7eQ(exgMw(SSUW5=FRA)w$P3AFv8^QNxR(z7Wed2 za)_>tsYQ1OTw>~xT%2{D5>zl-%hEt>2Q6u}wUXY)u~b` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX new file mode 100644 index 0000000000000000000000000000000000000000..bbd0e4d82b5c895516baf88ec215d93b35c3ea18 GIT binary patch literal 851 zcmZ8gOKuf05VVs3c@fHrBScXwWhA%%MvAgv#|e;}VU<%r&pEgRSK|y&<;NR67^&s9 zySlpE?fLo3y!mF#<0E8#uDa717~I#PZNz^bJy0K@=&U#qBT1W*oB}mJEwi({U|6u zVI#CvGxzvWrAEeDrO_dsUwHHvyF0;GHxdF^mY%WN;m5z%pp>RSw{SNJC&_`j@yq`dL zSm(SGua=k}F>Q%(5_Mj|IAuK_TLQxU1*|7$?Xw)CVP zI9+q!Peo(QV!84Dy^Rhmyw6jl^?YQAFB|)mdfOe|C+abala6F#Fw>Uub8Siext`4p OOhtoetjAa#3+V|`Jx7%Q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ new file mode 100644 index 0000000000000000000000000000000000000000..686d18a65a69f0c27f86d0a6dfb56c9ef6038648 GIT binary patch literal 818 zcmaJubv*GYK-&UW}B?2H`|@-Q^4fcQucsNQFGK4szhC*m`o4g zDzJ2v%D5(Usg2U|Y@*bd_hJl2u>=-#C6#WCbsh>Y4idr&h{(W6L}PLeENoXZzwHwa ztcbGlUCMaQ+oh-{%TxMRtVK>5H`-oYvy@UFXOz4y4=xZr@{uS~-+Mo}w6L^a|O2yHVCeN?Mp{eV(>>EOTylXMZ!q2yK62wm+Hb^(6Ys%^ zhsZO)@2mN%1)nCp2^2VM1?A!y#UsYA^*Rg5yu)Dr_-EKp= zEopf9>YFj9oiE)``sxdlt80aWVSP>R~g6h##y|x5LR~7`DSL$e%Ej!YSh+ zJUH)14HEIYHDy$Yte9aEl7JFv@R-g^u-1qQRpY>1pI z$mCr~wG;xo7A;0UuLU>>2w{Ow>cL;7PU&dV$%159!FL4(y3*kyf0jdCREU1GHJBvJ zs)b=Jz;VDr>PT+hkVe&^-M>p^oUD~WRaNdh`q0GGb{voI11R_x$%57bSqH*)G58W= z4PRp;n3@+1Y6o;pWa4$E=<5 zy&NUwq67DD2M^!pcr)L4KF^k*QBkpc4u8S)l8L5W^(TM2;jFqZg9m`I!u^TPs5;XrTze(m(p6QgcP5I zoQGj%l|-1*$4ac*eES^}!ELwJs)ewL85GFD@IoaL+i+4JX-? z2Cyr4;x7YF&Sc&}+s3|b+)2}9_kfQqx8^jiPI13?x^X`&DjKDt=uVT6jxit#aSRDr znuU|y8EFv`5-#Y3?H%%+gC<4wOPBsXc|)o_v3L8+LijsKY7*ybs|BS;MDIM zZRN!hPgCNJ4%JcOH=_yO0)oPj@GoMiJBcV7qdO_2JrwNhxtC~yQMZ^)iNeVw0w(?v z_3F2SC?Zn*Ds?6TIEClNR0FD;)KZKD47?f0XRkXXn>Lw5xSEr?v+V&FS@SH?r)VR&&FO&cyGezEi(lGl|V?^jM8@eucE7^&;k_E07A zmPU94sM@D!RLm(#bXI{nfr`F$49|o!1!_aGQ z-^cVkv}`Ned2IZ5;5Y6O#@^0{dv0xD^g1l6=D4emJcBu*PMtE+y|H8D}#Gi;H(SI|KDmhKEegs|547S~j6w6LRkPf9yMlB}2C& w+MbR3#_~ZL%Y9GzpY;?(VDtMdC-;qoA3sxbxNj_bDZO)J(Qkzh+*7K*02#Ifs{jB1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ new file mode 100644 index 0000000000000000000000000000000000000000..c4174f1e2c08c499b09ec4e4882a064f16212a01 GIT binary patch literal 345 zcmZ4UmVvd3fq^lA0Z1@1GVp8ITN%Zq)R>!V#-vo6)q;e9m;;DG3K+zUfC>zwjdV?8 zYs{lfOk+XHOhL-PfRTa2$k5o#z`(#5sF>Z{9A*ei*4*5}*wDbh5M(F=<9{H4%Fv1n zc0Q6#V0*y?+;Rpc7cZd5Uj`-v1CR_DFfzz!03B~stBI9j;8rnIP%%%sLNl`LefvI= z{P{)OccQy{B2r4xLoq|H$J0kVa|LscDcJGw@@z26IQU%4guYh7kkGB0odLVlU72ic z9!);g7VzaF_s8R@B~($&SYocaxtVJGMbo+}DTFt8G_?o?d111P!Zs0PzxakEiw%{%!{)pG(eDWmKPWxnQn>U zi9^gV%feT;ECAxKP{7e?9Jc4fmZ4~G&19_e0k=`XFmlGtMg&5VmIE`wxd|qB(Jby{ z&gy*Ruz?G6CL_nen-*g&p>8~#6H|EZ(kS{@iPE?x+T|NGUr=VKZ;WLp|NoR9?@CLQ t<*~}s=JgGgfi~mFhzvzf2ZT3g{pUiD{nYiQ>uuLN5EO0YM_bq^`~c>Tv#S6A literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM new file mode 100644 index 0000000000000000000000000000000000000000..d6b4f64fc29358f65715ea6630c77831657a5988 GIT binary patch literal 730 zcmaJJ5VeD%NRbdVH7Vj^CI7}B8X8(o;B2?2NQN768IHgKI0L-#CQ3jMOJ0wy zH*em&*|$%%+$*(sS4wHE)&2JAu~8X!({AFNGFNNOZaU;w0bs9>=L&EYfIx!BCgPL~ zN4YlZMvl!6o`yOaCW|wJjdt7pFEhnPwoiF2bNgC)2gaB|HJ zW#nverhi$zrz7h_fhcP^1dfrrP|lf4F(^{e>LHy}LDsrh>m`#C6y2i#KT&u;p?W)C zSQ3aWA0&Xn(q8Hvs8oh0P)8y_N6GJN$B(2FEa(i(ig>rtlR z+G~jQbJ9SVMm1*kpUF4yb+kL_!d$vExa6DbW8=_#Kw`vPuh~T~Ld?oVMymALh^yEB r16-gx_-BS%JiiE|y0OmT(DJ$4LV2EtW;X1!TH>eKI7yus@OaVR*M*%k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO new file mode 100644 index 0000000000000000000000000000000000000000..8d9d06cbbbc1b25f313749bad64b56dd26d2d72f GIT binary patch literal 1001 zcmah{J&qPJ3{6;}l~zzta0jLs$@y`Tp`oFmqoT?;-FFJsdm|172jC3wUNXaq6sY;o9ErOgTu@LKJ%#=2YU5>tg`u{3c>N3`WW%{}WRE7Koo22)R~?mdtUqyb?K zBo!dxFYWNAN^Is$OM^{u&Er;ZQ<9;GuvVNKPLi+_=^+<711il8WD#F*r30+UqGTM| z*8)iGA!aauNCpwxXQO!rN8S6ZZo*_3V&|E=mU}Z7aeLL8c$=Dpm zp=Z%^(ec!nJsC`MEJj;nCTAE|UWmVamkiox2+X|~QS%fLC%{=?b&2{Jy#p%Mf1I4S zbU^llktXS$cELxbk@tK7OZVXQZB>@eCOOf0qb>!t(FsLYRm(MB{9jip*&o2=C=Tq;+RDaBe@;@SCrR;TPlzj3X8@&Et; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC new file mode 100644 index 0000000000000000000000000000000000000000..726b61cde515862b92407e9f53d582c803e07102 GIT binary patch literal 759 zcmcJMJ5Iwu6h+@Sv2ch02?=N@QcPh>u{0n5hK2&M0BXlwRsrK3u{GEN+&6Y2196F^ zH{WybyCc7UQ2a_1eG-ung6{Qh|K_$@^*()kXiZ*s-tG1oPU{}b5|yAwH_*UE8?MSGcoPjumf*2uDk9 z56_izgIx{3TiqxXa(dm?O&2yn5dl7gg=)>x=U-k5dhTssnJT*dAYU-ryPl!j)Eg@2vA7BL64gqhzQVSBq`hHnmvM z)Kw6Vkn{B1QJh2-*AG**{Df;--85Yz;Av`Ts8Iqz15LsMf3Ys~1Hsjoh$QgUM2A^8 zYc9qzdnW=VtGv(HsS~2&1M#OY(}phsE)0&e5ljKkATfo*Tq+y8I=~L}PYAO;i%5=> zXT5i8!B}q;?GUAALqgSWvSF3*Gm_Dg9MVMof+mP4M6R_~SIo8mMk9R z`VST_?De~3pp}nW27(byTxw|~_67A{6Z)`Ta)_nXduW!&v`TEFgQ7e>0`Xn#jA68_ z3-#e%LOUL4gStH0+oOYXr%dr^ZyQavM&7Wsr4E>UGdSsuF{GByp%3fYEzN1V^&_(}Z=9I42+ua7(yTW%Hn&oPhYy1&3(w7&d@%xPGDb3fV9Q; z@ZOVd-}H1QGFQSdhMvdJbD8D~f64~kq6MRu;CSRLU=UEtP>VGWZtnv)?{CLLM31&l z!mNxx=To0cSCaxmRDGP`VDPajhDIRnaKUY(-FmNlt?R literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER new file mode 100644 index 0000000000000000000000000000000000000000..9ac4c6955a3d5c41937d106f80e7c97e97f91dce GIT binary patch literal 382 zcmcJLI}XAy42GSewuq5|xe^^(38cJJu`qD~)-+qMz(Ug-aW&2Wb|?$5@=Lap*#6?= zc8B~5z%GD}F<5!wy3h}!o#+IuoMVA`*fqz4AoD^R+lA<*4m=tYtryycHg^5c4=n;T z0Z0TX7?hoITv>^f4H29ddljPls>g=X38}QP)C%l@qD3P8XZwl%aT{c(Gmfx@jB_k! ivwKyp8+_zk=9*lwac;;7(2)JM?Hq()f1w zb|v}v4a+Zp#RmWgA>clmeMn7v@I6;(u4ys`$6y26-RlcR-22qYD2dv|It!|%ZQ3pn zYmlO{kqq2^#`HG{)q?>?rqCb>?a-^&ryUc>PlZoS(1Mx%S zbPe-Q0V^Y~#pcx7<#(T`bFaLN4WW4Zq{=fCh>YZM1FIc1)qMp;DXAo25zsJ}0XqSf z(S;NkdSs32tN8|ZrQDYFwp2tBa68;8^PeWfdXQZ<*qmkCQfK8d|IsW2DE`q*`~qda BtD67- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET new file mode 100644 index 0000000000000000000000000000000000000000..7988307b136d6887d5c57d34b47631367a8cd08a GIT binary patch literal 936 zcmcIjJ5Iwu5M3uiAtgon6fUxbrTwo>Lxs2io#QU2fXP|709WG#6!6|`0145ulI`{Q z{bsUxeKS{2#;jkAF$DtC_IP@(XMV)By*xL7u5J{G+w4OE@_3TS zH#aCzM(!3XS&Lzyns^j*#okJ})EoNygYw43S_uH~@_zPUNC>JZF+wP%*{4z$DFt5( z2x>%ZNJCkGLJ#Be1I!tW3qBUOO05d!b{riXnV%O_+>i?C%n&4Ji%L^=0RK+1A012H|kd+U* zZNnisQiX#7TLW+~70wA&frSAX(GaTpK%N zYQ-6`JSB;zgo`I-)0wU33Nd9ItB2~G1_dymY0fyUq=y2s0f3mBDSqKvWh^pHRwf=U zT9hvfcxH literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI new file mode 100644 index 0000000000000000000000000000000000000000..0a0c7a07098347f590a29d7322a88358669e641e GIT binary patch literal 1485 zcmd5+OKub~5Va>vW)cVji4D6fMkp3;tZyDh(i$fhVyU-PQ)4DmEAMR zKqRt>L`&|EUG?6pS9X8@sn%bWdZKV?t<}5CgY{ud)2GijZY~iIrk;5&S8uN~8#hEO z6`N^rVMtSlfN?HJt0}%8XFzQ+))=Q4o8|iq&vT5Y7|$?-P`&4Dfr#``7;PUa5vMv+ zvJo-+<&vO*NXR6*6K;bHKndA>gi5P3wrs5PA%gGHB^Q=7smP&@aVnk!%Qf-$;fQd- zatqW5tn-nmW>p0z2)J9SL?fWZBl;qTIMoE-B(IPlK8Y_991g*C;ukJ?!IIn_`l;17 z(^R1=fzUDWRVYgo_fo2o{akz|+nQ$kICsTRHiMTgqQ3|Y6k1A-aEOat9FMI-R7{d> zkfstrGkEF9t%)KU(zi@pE%>vHx~$cWAyAo2#!e+=>^s5WWgG1EgCV5`4&ndQ1~nE| zFY22#)U*^_w~drsCDz;O!$*kyqAZe#t~{!d)H~T zBGO6|D#T5$joMs^>2s%6JH~`or_oC*v^t?W^H;!jZ~t*fxP!4`!BQ^-+s<8mNaxgg z$Co=(d0tn+Qhv!eI2}x&Oc8xP;MRQ8@@2=jeEbCTj|JqFlw8mhaR3OJt-sBGDa1>D z=$VcM=y)KyKwwqr`g9!h1}Zt>bj#uH+EKTdlYIovdhbd)Aj#Q&fMbv2%ztVMekspc Lj&KymjCA-n1sNsm literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ new file mode 100644 index 0000000000000000000000000000000000000000..303845b68e600d3cd2df8a7e2a0f6871ed8a9989 GIT binary patch literal 482 zcmb`DJx&8b423-_MIl6@qb9`)Ws8-(Gvk>J4IKqnm~59*klFLla3K!C8Q|F@6oHbJ zJUJWyP%-JUwG>ue4$vYZc!)YM9LmmWFP&_{A`H jy2ZJpMLTR-Z$__A^T%kk{`ORI0bCidX@fEDr!~6*vJq*R;Kf<%Cr6^KD{4BS8|6NDT@n1R*U(8$;X zD9ssdY6jN`lQacOf(`f&1W;ih#YhV-*u6+bgY8ANoPo*B8)*9%1||aouxpSB0DUVn A-~a#s literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM new file mode 100644 index 0000000000000000000000000000000000000000..6fd391e565c4888edbc2093e76078dc671782d19 GIT binary patch literal 465 zcmcJLF%H5o3`LzvRW~+vh7Qeu2nab%?&}L)2&^p<^Yt@HeFq zn%X{~S6dfihdNp`(P1l-fX7DX^|oUQcO?WRL^c5xX;hlb&p7=zPCIiFS3KF?3;gSu sZ}>sV+#D7-6o(@~af1ReZ!>FFO}>##$xIT;T5W30H36k3>%yXi7p7Tdz5oCK literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO new file mode 100644 index 0000000000000000000000000000000000000000..6637ff15c844b6f1ee385f19468211d88431f9de GIT binary patch literal 445 zcmaJ;F;2uV5L`#PAW_iJP*5Oo#RVzSt`j>p4aG^<@&LzOUID%zQSvR`0JFX;aspw= zR$l zvBL=PJ;2FMISJ&710g2ye-PwMxCxxBn@+=rwPs)o3^X4jtEvpWgRbkRTx=3sKjOT= z%)G3;L{@E$K;|3k?D6u~&@D85;(qYCgzzhoKPCECrQXwONCjUqs5!jC#}hTo>HuR! l)36jo$gHC~rJ!}S!?pTjN6l7hVN)Lkop!t5Kh$D{{s0~}QYHWZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR new file mode 100644 index 0000000000000000000000000000000000000000..3d3ebbb4ffd2da92f80aae34d7e4994aca774302 GIT binary patch literal 886 zcmd6kOHRW;42C`F0~JtDz#^5hXcrOl&I}t?Z~(+^nq9YC046u$YMcRVPfCJ%0V1W7 z+P}Zw_I!T9>K$P51^_|`xK65#{qgh>28!Uj!IyIIw10fiK1pRzkzGWkark*awI4EO zlQLMEb&{>?NMxCo9R>pHI->F;V579L&UYaq{2t3aA!Ms9iVLCs$zy-yF!zSU{X0xJCWMD(Ibv$25iNGfQPJJP!CD34( zOBh$h_c}9R!e0zj&o3C+K_w;1#rQ*_C0y-!RR^dVg#iJTl9bs}+zf~DfK{XFMzcbY z5bkCIU3Aj{H!QCkQ#ZC01p!N0vq_Dm44w)IHvNO`th{a<6V`aQUF-!cBvSyYf6#>Z E0kedxR9J@5h;I|)L83kM>v z?48}6iN}{KmTy4y0>Bu9`{wB(O4#>@V^VDo$5S|`=(ZW)kzEyI#aJ`)3^q};*Qso# zlEGTkdv%>>(<6Dgq)?@O^pqfb3I&v{?~@9Jc7Z}|*4@o?2RV`k=?ZC)|KK-PxS9V* zk+1ZPx@0q`dVMDHj!Go=!bzipB`L^YVwm#rlG)h7hf;41Dyx}xf!l^2Fi!3~+i+vG owyw5aZGBN%7Do*hQl{^I9UH-)(xZp#sRzui zIqo>V;&{s;Umdp`Z#eD&y8Y|@FF%L#_jZT*EmnKhXW$1F!|!pqE4bBe>!uRdn^#Wm@YxHPVr1Zx)_e6Z146|SOg z4Jb2TKm%GSu-Fu)bCZZ8W=hFxoo5}aSdLgE7oUqFt+@`yM!%V`MqycH(RT$PY7y6v zEX*1QFDn9cfvccN2u0#vgrrari2kN@BS!+*rWb zlocnQV-W@<_CvHJazi31nQI%=M6r^>E~2OkGv<+KGpba?w1|L8r&MJJJ#$lrW1V`O zkxooUIYCv;=B*p#SdCB_dhPNLSW_A0!f>tVE}o6>WNxJwT;buoEjvZ}6r0iarsimu zbPADy!9sMc&VoI4&z>>KtHz@%)tKr^R1GOpcqJbch13HAjxq?;G*g3rN(Y_u!CKI~ zLC8q_oN;KzffmSQXHC_#BZja+s>-tNX-R$hLY_&ycJ(6nSgIXzvmqb~osEJ8eXb@K zYU<{+WumeHOnL6TZLg{vM(d0n?Xwz#tfIHDxM+6ljU_mbcBYPzGzKCvZz21=t|cl* zMv?ZL`dkWVUWmUoR~2Hjvn5W;SZmc@@z5i$Q>N5y&11jBrL0BFQdyHtj%>>0tp=i~ z0Vt|zr?zf+G)1w-vz1AbSXW{pER_^?y+D>qQ=rn5P0_k9$(lk3jDloP1!JP<>KecbiH_!C zPG4~xXSinfFU zy@(PDirPwgg^7TGbIFw^1xw|S>_;}s5x0w@oBrdc8{V$&u8B|A+xW8t&Mw##cE^`C zw7|KdzuVM+!B$Iz5<}qn(Mo7L2>Mi2Z%}%5OWEcX6HLR8B<#JJY@#+23yhbAN|K$4 z^_pDGXLa8p62%x;MfP7LQ_7L3<#-{0iD0LbChqFDUwQK6uDr*5@{_xI_+xVSehXA6 zdYSWO^7VT{Fwop1kH`Q3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD new file mode 100644 index 0000000000000000000000000000000000000000..b3057866dc88a7cab231a5edf9247616dd95c2d1 GIT binary patch literal 796 zcmaiyO-{ow5QS~3s!}Dyf)#7Js27p^Gj?n?Y>+sF>s=-8K&Ln2QXGIYz#Au30r6ug zO+9(z_wr3%-qiA0sl~NYN^7ldw)b~52Cgx;-F~;{Vy)Tj593h;xYqN11-W{H6b&9% zsCMv;Q!(62HJ8RY874feHnq&5#sNiwk{ZVvv4K^whEu31V+U=_oXK#umP^RuP2w#} z{8w77;p$UyJ`gfIP8r0;RzHk5)KyF3M!?>C4U6$YwS$nidIVS zsCIJduOORV#ekyV6or{tjNRB0P&s7xrtK;=Y-cB({K@EE7O{qCW^*Pq&WJD z^STYa(pH2o18GQ>%62u z8h^9IDD0h+pnysN5lqD`I8h1Uig3jmxkV@NB)Af$gNP)I+OC&|pz*Bn+v)_3Jj840 z5gatl5Ge^)VlI>`qpguWqO(rxSyRs$nkR>Rz5T`${uiNm$T)nk9* zSwjCct$D~)XMGLE_Aj7qruij&{cX7^r*OP3|02bze|$1#{llz?fV0b&LN?~jV_z5d z=a0GH``te5_ECAwDw8#9+Iv{KZ+0%&v$3QQ^EmOApIME*LgzTzRS5=z zo}}sxYs-*iZ*#H9^)VNRmChx|u7m&*-s-_PEm*_Y+61j^G=m(JHlRNM3R4x`s|BqA z3%RQ{E0>L(5fGt{glnW?E6}*pEJ4aDvB()<7=kCfVNe6)iUwlkr*5g=_~L|C4peKg@S9+ad7J5VaSPh;1k+Xpm@9WCbhv|Dj2lBTzW*atfHe4JB9O4DiOAgrH#U*w*aK z``G^c64!4+bRR+pDW!N?Z(g)Znu_&t%yqYax6^<*OqAM!0<2~lHfXs*ED<+|9w8A6 z0Et@$DaOwbemeX+)kx8Eh4CS#jQYn2TznDK$!0K8*1G6enfy;bNcxC6ZLISFy$?wh zl~`(oNTr%g-e?REw}B?kw4R72=1T}y%;+n{qDET>%19NZ0Y+&~F+bxv?}FRy0oEbd zG@D^D`3RfXzL4J-yy0_LMwXM#{Wtx;EvWI~zZxG7Y7=l?V_>ntQSfFy5^5<}A5E%c zaABd6b>yJmx>(5cbiv|0L9(0x|p*E$xeKbfGWZ9!{ zB-oX8X5;~Pd9st3S7u*BEEcIE^@&FYWnF*t`;%4hzb*&od;fs+J1v+|rlyxvEa`fO zO>={mPdjK@)n;2;q!eA1qn3kiY!dge*PnV-P_*RQz_k&S9f?QabpdZ{SJ>xr7ehJ} K$tC6bs~5apP`$lJ%#I@!Yd@6D%= zCv5Hj%mE#Y!6Cn#g?0wZMrqsiuH{A757p>#@|fH+;W!bc5oK$gX_Td#w#0Y3>pz-_ z4zWbRIVauDU{zD$q4p&g7*U|C2;M5bv|BL61LjlqBAefTrqoB8u)s9>tcj)iUn}gn tYUQ!jX^SfueP&{!W;R@Nq7JN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM new file mode 100644 index 0000000000000000000000000000000000000000..5e62ed5a374e28ab915f87f7d544b2c5672618c2 GIT binary patch literal 453 zcmcJMyNv=d5QfJ{DZo5jws&df8w+{Ul94Bm2;YD bX6R$rp1|ss7E4|4w|zj;P}e@`Rf+8vvIJz4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN new file mode 100644 index 0000000000000000000000000000000000000000..a5be8c84397409e6ad2828ee42192017caaccb31 GIT binary patch literal 490 zcma)1F>b>!45W+(NKkanlEH(AcnBbhvXpcw(4|{HAZzn0TKY$QRQrIup*^YfQe?1z zqbQPhCw^RM^G0O82*DWIN9V@rJRXx?0_;%&w?2XIIoh}W%Y?q zGMr-8A+cl)iO-j;DV{UyC9y}+E05E!tS_<#D6&YlVx4Cv9^wxnS!jj4*q6C#ZD5XCf%hFbM>p?2Y6*-Hvj+t literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP new file mode 100644 index 0000000000000000000000000000000000000000..3c4e10e9cca020f65ba0f85845bf27d4cf1aaed9 GIT binary patch literal 705 zcmb7CJ5B>J5FIa~h=Mo)5-GOG7AuXt{?bs=A$rFZk+=hKZo~n&6lZ`p&L&DIkg(RX z}{^x=$ifO3{7b#GCET?d$sSAv<4E%`uhDc0e@j1%|!AmJ9R-luIxy zJL}QMQnR)t^JwgtN;U8#I3bCn%hTuroQz;g!4H{%NFb>(G|Sloz1bdkt?;&`XyFnY z)@HJxe+8>=^a8CKN0W{4OsMV3P;JwN4ys1N&nzBMommSBB=KlPP>?o(lhN$MMGPF)@qt)(|SQ_5}(7?g+T zSRkz0AiBNymm*W}hw^_{Z{P8Zyh&;1q=&kv7yKK~)G-6DW+R}E?$#il_Jh34?-wn5 kz3R=XpH{sET+yvGfMH{5GIT{(+-qe1Sw_Xv%~n?Z0H?^6CjbBd literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ new file mode 100644 index 0000000000000000000000000000000000000000..3f6a6da63213c8d1e02c1ba9a86641fca3639e5d GIT binary patch literal 468 zcmbV}F>b>!3`Hp;2AU;6hOR{h5Ak3?7A?o>(y?=A*_%(1NH@w&a+UzSLHo%7jWc8^ z0m(4={{N74zEXK4G8e*T481w$#`)CewEuYLaZcW+IE2a8=pM3ASZgfdsbP+`aa|Lp zagJS&{nX{eBIe}B8M1iLDf+4sA+4F&hSqThlPze(B1(CLFF*_g^F6@LU}4wZ?EI1% zti4m=85RC02{1n>O_C%1_gC*@Ay%tLKPo=I(D|mqTA64S^t#7oajqXf^is9E%Izu! ZW~hvg{UnObg6nflrE&_bBB|JpFQW%Lrv}%-kNoK2;mbbUd}BN2K!%#v9Bn z<_+d8rf7V(0Gs0pP(Ime4n7{r)T)aU7I|tOAx$l?G_`~fP|k(rGL6kG3XR+VV0D2d zCrtd4fpo6M`a_&r;hIF>5wVX$9vfgg#~mV;At6tE06eVlYGrFc$p8`zixmw<;Nk^` zE07$4)-TBQD2``@Gw@(c^iyXCSc=1KcX}QUu5dhhvH?t|!KFW`elQ^6t~VP+!K9Trq&$6kW}# z3_vec^jQnIPdo>pII*#<+BAh0q<7M5?^&Dw`tK6EPx`CZPWob#wuZkLtG}1aLEZLE z%p&Ibn${AuB;DyyjL1H9_52Nqdv&EXD>63f<0A~(d1UaHpx*Dy!_GeJ9AJamSkn>- zA39i^M|CYQ!92+ag1)fmOSX^4lShxC^N>P}h|*T}z;tGvjUK2hKHOqp4Y2dd$6I{2 a__BzK@+EJfplg&P64|&;tbq~mNt1a5P^V- zk;Wc-zW2uR{z&{ThZNMTSE&ecuZg$VK;p2=4YxblNu z#8*E~5~>dfF-oc~O@oB~Hzvu|Zt$yA;}8dl_|tKlh;$hwA>*st#9Ua(1>z$rPLd0V z&d0{gz*Q6SIAw9w*pw$+A6TX4hA2d^5KaY838*;8h^(s)MNroNoHmk`>pG2YA>Li7Pbu=~g{F zvm2)xny-^+*f0(Ur$}`4XhYli9yq8y4JtXIQj?OQI tJQvuTfneIwfJiAX6$_ov5)YRBBB`Q0sCw9Z4n3J%-Bgh{U;T9~PEERAi|qYH9#)r`Jz zs7|6d&76Rx(gt>-srF2p=7BvD9;oet5Wxu=acrCt>V(v!yI*=&X-qq7wXx1)gc0gs zsy4liG(rOEfZ;iwn{v{_Rf(v}TH+uR<-!?WYlv)aoHLhltpaaV-O5^iw$ew#T#^GW zOCt4!vjUf)qJ1#o@0*b7rT^9T{r@W6$(IV+JiXvEpXo+xBTzqz?oNH$L7ZO(+8)i} OXaOqP;1uia literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK new file mode 100644 index 0000000000000000000000000000000000000000..3520b154d58c9f8f5492ce6cb2b5ca92e2ff1376 GIT binary patch literal 1559 zcmZux%Z?K<5cFiTkSG%3g17+6A%`6)5q>|oEJq}++`PH%SAZk&DSQCG#+f5jwI`2V zWhBRr-PK*Lu9@F|)a`er<_ga+4C-U9dgtS=>>nO~#BDmXf`#Ye?*3D?yR?@bcNnps z4uHMDxSi&gm=_pJj1>lxs-HkwqK%Wh%~mZ-q-YKYau#CQqqg;kXUDZ?{j zd6@UDhD4Sv;&0fGV+%ag)evPs6$p~_BspM^7#0g_tn(oz-1isLVGvlF^<#Cri1IAq z0ux0>utJi5SjGL=(zNTr<6Iw`HXs8ua-n*XOimE31k4#o=Cgo60372_j4kDn6_{6J zC*cY>V<(8nBq)OPJ>fOB!bD|KvN^6qx_}ir2oAZFNdVS4W|^*qAlL6ifgOtnM4@z$ zK8Oe8Za(Hy8`zP4he>Dl6aciL+L+nEb5gX2H|i;I4c0*>5 zFb~gL7f!8Hi>x(0dJLiE(A_1rdk~!WzGw=H!eT3NY;%~*)*nX1)3?vPE504n3fQSy zrhC-z4-Xgg^k;g_ATij=^~K=0V5An5)Z_9rch$~w52mM#`no5xnMh0i%SwOgHG`q4 z9|U4m$Epq9G7bhTO?*IOb{f{9WvFSY0U%XN^B(Ci$;8p&tpXP6Cwv5EONsIcr`-!l zB57UvgVrSpSjz$%-%-vxm`rD5fnql>=%MVvE=z1eyKy?G1GJ*9w7Uala&Oxml zy_o{C+>gFN>RB7F62RV^9u=_C_y#t`Sc7B9w8khSk5VCclt{MTJ0D`onEbAP8~9gL zJAw*O=ha%jeiX*Y2SGRAuP`D1z{82?k@}b8PcEVV%@lr`yL-sL(`2nU;bo$WYng;T oZM2!4nLSF1&Q5%9XB-b-sb_ zOAAGOB)E_WO528~g34|mJ#K<@X-=dzr3%;4m}qVEKDNQ~9%adWO&{B4+~u@87Fo4= z=!>?i$p?&-o>Y?u1OWFgNM&p?$iX0F?4TXj8cl+5=49frS0uji90Ubj`Cu&5lDB-% zZh(?|GjvM%k#m*`x^|lR{Db*)8V4ACWi>Z!hBM1gaw$72&7PhCd8e6_fQ#XaK^fg{ z&`bB_$*b;5$_uqF^tz}460}HO2%5`6p>W4wpiVe?`D53riRNq!h< o=u&S%JR2%^(FYB)FC~ihQpOU0C+m-ml4;{;|88_#pRFeG0}%bLeEAZHL)U7wdTPKul3!>{lkHH{8 zR9Z^TNwg!4lZrZ$Ojjn7t0`G3!39c1Vg0W<8L91&xmv=zcdrUKemQb+`XZ>rb0@P6w>A|Gu+W*vp=+m zqnT3brk1K&ZEC%#4LSq~1$T|Kn_9K_vEpVuH)jme1qPS?*E6`j|1+8O4VmX_b0wb6 N5CxUVA8(0=_yPPpgBSn+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID new file mode 100644 index 0000000000000000000000000000000000000000..0a67a1a27a6e58adef0a984abd2931e31f6608fb GIT binary patch literal 2116 zcmeHH%Wl*_5FBsVkWB(fkWhq#P!2|lC9gD3&zJ*TkPzSC^=)k8@PF%3me)Lp#SM~Jx>vu8#EW{&$t0)TbLCQ`o+kUnF($>lj@&4T#I84*W0G}Hw z+?ydvNyHF0;7}`xFP%gEfOHqI$FMWl0(K6g?-KR|_7rvnyN2DsX0SQzltjMiPH9UT zz79idREt-%XB0*sTLDiXkZ@lZ>SUOSL;lD1UFdn9lF+K^q+&A<0H14h8!@?%=Uq-|lW97Fq@4q|ych zcY_X~!61Pgo>PP*9LK|v5eN*3v99p}fl5lYEJ%}zD>X!)Km1T}0F?KT8ZadZkY>U%Ya+Slh0O44P*U&TV7;;dA6rM@c-5QUg2N9Z+Ibq2Y*9V#(Tu!OnHe}pu`su1&g zS*mIiG-h@+_I?_4f(v9R(iFo sG}$*gbyD=8+zCbtb;Zks*{YeOp|%HM7?pG_{*TGOACph^?*~PQpF}Q_DgXcg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE new file mode 100644 index 0000000000000000000000000000000000000000..9d9c82c169ac1637ce710e1d9912084c1217f362 GIT binary patch literal 1307 zcma)6OO6vU5VgZJ`S4lI2(f`IdXbhAWV`LQn++=#Y`B2O3#2&(xUa$qxEg1GSGK$3 z%n*r|oVJ~M^(M>j>CHscg6HaI(a z9mfeMg08VPSX-{B`~Pa5J$B+>ykSeyp0PeX{-OK^=|=v1Ah66jeZbGBAW zs$LstzjNSHD*8l)eB=W`I2Kil&DI%_;s*e>(g{%qksS!y(ftzjUQ(6PtCI_`8lQqB zx#IXtuwackV_!<=%^0qbR8ltfQpqeA*Nc#~9UwNDP*-G!9AW8_@jrNIL*3jsNzH$1 zf^-=}L0_FyQlJlGK&-~Rpj`40jX;~JuXG_~pCWKp`5Y34EFol9dP~e$vmMTuBClw= zY6;r<g{=G#*nds@PjFCAR*kGXgKRNwoX6Pt06afH#%G!jYhlFt_>F8a3Rb!A~<@ zrMaUtGd>gJbeRNy0{j(QS?GO+(xBykP;BLDy$MnrEqqTayz$nBOP1osS>mNO#z{{W gRI*?9PgjM%J^Pn^KfC^7c75OKY`j}E5gFru0dY$6V*mgE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL new file mode 100644 index 0000000000000000000000000000000000000000..024675b99e8e1ac0c9ab3a2a8b5c473f3f635d9d GIT binary patch literal 1221 zcmZuwOODhq6m)t%{R0+AEQSSQ5uu6Hk^Jm9wr4YIByM1`f;%9Aa};jC2{;2+;S5ma zbV7GCQNK>&RMo3jPJaAWH(!;yRyeAvQjL84{H-7FA0KeG2RAm4IXOSzE{r)z+l9y* zKZ0t zHb#u?T<;d9oleE$J29e9V}CiLi-g==*gpE8Ob{&32de?f&_(29`W+wylsuFz*$GXZXFBs4=%%0G3dc)pxn4^FQFi%{k?P+d84#QR&lS~c*&N&M* z7$O(ap^W{;=`GRXQV8&F(j0R#S#>R*y2gBH*LQLvzjyyD!7N_i5P2{QBEYS_Ztkm}SB!PIRiid$A`df` Y>dR_WiuqV`Eq$MmJi_qGX>vZAACMk;nE(I) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN new file mode 100644 index 0000000000000000000000000000000000000000..9e10ced9a4a7a30ab62f229a1060266fcc8644bc GIT binary patch literal 8916 zcmeI1yN(>k8HIahDUl*2Ly6$P3J7@(s0|KKm%b`-1W_i*CW59Jqd z$0uH>3?d{uNfBn}}r+WYKuj;cOtLj6=ox%Ct2Z|-J9Vjrf|?B_IuDdwgd_H!czS*Q+JKngnZH2&6YF5#)JE2|hWT7_(c3NL{g5#i9CU zM5$6Hqe$(YD@KMXeKKvWfRHI>J)^y7Rb90J7rDoH-4SmrLZdR_yx~nvn=`K(o^A&K zHyi@T8;$~qfaa!p**7up8&d`#zozy|1N7r8RHS@uoxB|eHzzZW+~sI!3a++N@Byd_ zHc--yYTF|~$rI4&0$NEnGWYixA}VJG8A0`t?$N(flL~v(fjo8yFmwlCEznXbQ|-0B z7ZRv_RyYBf6uBt@a?+deb~>%H_Ar#G?b0~eQ`?OPMk2v{={Hq?YKTrp9R=8yupyZ= z!GMK!U=4^7BH%`+q7WvO)r2)?^+|B5=o3fHBZbE`Mv=*pngDtpf*Yevu8->h<+DzB zSPYbpDQJzQ(L=!moXW0x0Nw%9q9cpiK>Y>v8hS8)Sb`&~0vZ_TUP8b_X`v<%mLNFe z2B+7`MMT*vh;wWO!e9_!2|+>uIBkrgcWn%!Ewi!ctR)uB$(BbrU#Pe_Eq&%tlJ z781yWt8)bgZj~=3$*DCK$to2F&eaQIFc)H(An&PKzjRCP#h1zS9*><$!dJH`42z3u)3eP-Bd4PbEZ=0$f%b* z9&>0@7cO;JU{eipV|7vv7m6AM;Q^yhJ3y7?)*SOdzW& zU?(tPBoY1nV?~k0p08zKb65NHrp2JoZsY6Qgo)eghTv4s6d{RzBbi)8mlFf47nXm0 zn~Q%${2-hbz01iUa53Vh`VI~(jKS-b2`@AmlIG=hPnJF+Lomu}$)f32Rl#b2FbRxN z|5kswcO+fL3ad6PaAIKcn!L0(U8lvEZg(qOXeO0`oIWZnH=DoyBtI9QUP$>$_O9XL zrz~7(aXk(H2mxQ{33vpMT*1JLs!25bjDX+Izt5O=7gg|Aac=FSnmo7T+_$xfI}f7B z^_)gFP;;Mn-0V01JSM>{cF!IuF3Xuy023>#)uR&g&>rdMWrqO4r9WYgE_O-UViGcb z*R7CtGt37)qw49Bj$NBKa$26WQ5HOEORbl~fowx=wCL2{*-9PZ4_eZ^$0W7vuMGkZ zFvh|a(|j!{!k&J={o_-b$%rY1x==7Co~>mpnru63kUeLz*EZ6Wf%nRpTIDSHIrj0S z0+8_t_7s9fZjXiFcWjjmXTs!Bxu7TxPr%mF@1=G$x@@_pJvj zth6vUzdUr$16x%sMWrze$wIe5dldFPcyqc#<$?IKX72HB2>s@FkGIb`^j=!qK0c{= ziS)ACa(BJCQdnp*rC4@u27yzi40{o|K9FS<z5BU zjPf@E>i(EmwbUA^wsk`sK0!j&RPa$d@K6d*q(Y>PQ4u(FZRq-}JhVJH;*W{8wlC_Q zPqR&VOyocPKIO9MekHC68(mIEQYxz7!Hj93Lx=v_I_uGG^?CG4R6Q?e z)6{Q2>NSTt214BEy)j9A~a{~uZZMIMfX-yrbB`b9Gz zMJ_MCz(2A6C)R(}&g_55`WN>3;lE-G0_Xpad1C$k6#H{G;1_8Yw|HXxg*ZR4etj}N zC9enCDgIdggSK*6KhejuPsaN1CH#QE_V4Uh9>YDKSbzCfAk$p}*B3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO new file mode 100644 index 0000000000000000000000000000000000000000..9a9d77e5a02b133b070d4b9a7248c3c40d936df8 GIT binary patch literal 296 zcmZ4UmVvd3fq_w;0Z1@1GO!uPq*R;Lf_Om84#XgF26kg}ptvbW91OrB29|~f24G1G z3`q+ELnC7okQoe&|A7Fii&k8)YmsaM+Y2V(mNPJU`U6G2F)$ezfMmdck%3PG=yu~; aO%P>LtI5EsVyK{E1e9cCU^IrR0#X2_TsLw6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ new file mode 100644 index 0000000000000000000000000000000000000000..d0d8e4cfaa02dbcfe0b3b3abbc127c1cf2fb4347 GIT binary patch literal 530 zcmcIhJ5Iwu6r8mcFrh<2R7fdYB$6%d$KFlSP*YN`xAQ3y`$jni*WnB>&j}XdQ(|eJ z-}BDQ8?8@oSR8=t27poukL#zs8A8{0{if@WVH~2ZeUi4?jwIzoL5N^UWW*J5O*y^v<*v-7@%R3)wcqZjP#_!g@Y(w_^!V7yvrZws6QiPe~Zp|Aej&7V@&A35PnpJ66 nrIXN5Mj_Xw;qV|tdnR7^uKKB1O#fyO#|G-hq^vDTU|lMHRXy?jCD`8k$+wwIB!EPOIfNNhG{86cP;i8YDM6evMMN~g z`w{2{Gj|)&}O^8_vLwg}@SY02@v4Lu6U382~ep56sM(UNb6c z<(33y)CvkcQeq}c4Wgy#IHE@*M&vrc%yF>oY(Eye_5!AR{^G+$4>I;`Olz)N0XR>v zoN&P{(MV4Pr&Kn)qTC`097C^RwJoghY*R6PY4YxC}=7udv ziSv2Li@p&Cf;b&&?5@#d^!c#6Mr1|s9t4k M`ujg-;S@0a2ZYDxkN^Mx literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS new file mode 100644 index 0000000000000000000000000000000000000000..b1f7eb02926ff847a732e8e5dd5906db87f77a84 GIT binary patch literal 868 zcmZvbJ#HH@5QT>d1UoPfeAE;Z8Mc;1!r_*UIQObk>vv#{>?}{@@2C#->afX zDiHtQMbTefe5?w4g`>4J6A`8C6oqEt6vbv95&5|jyxENRa+*D_ND`h;tDfr&xF2}V zm}LF))5)8N+4Hr-`Vw!fesuNB$H{e3%7L?7yCmep3_p04EH!j2H=2v){>f~gj$}Bz`d3`s=GI5K?Nwzz?*?C+!*^WO1 YW$*qHh2zj-lk1_q*@Yo@+)j`C3E#l7sQ>@~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT new file mode 100644 index 0000000000000000000000000000000000000000..a07ef182836f16712f0250b83592eb0112d1e5af GIT binary patch literal 2394 zcmeHH%Wl*#6m^D{KB+(zR7ePQQA8unNPZ?Zn=TRi?%eDu@ekDbBltAF0nWM3Of#)2 zB(@OAN@AaL@3}93|EYGrDYc{UG)<$f_08>FSQ;}HgRi(WdMxhp>QmOMIAEujog`mz zYzvOODk#V*>ljPC|IlD{U4pMZ(V1Cx zu;-}6F6oT`gO#-jM3ij%A)8egiZjLI%MYc?#)WPuG22z>hql<8TR>|R6VFzt%f=2R z`$!|8bfl!A^!O#yZ~JnD;n-*E;S!GMnP9k$rY&KPrw5xyPjV4?KjFgfj;*K&nCX_MnV3Cv3M$X$T928;8=god!rD0fx!3lBd8H2cNCs}mNBQsol3OPp>X z>2@=kjXHA9)P!pzh8ndWJu@yM=|(C8;+Jdud{hgq36$qp9b5wHmtkzx;(`_y>II|K zC1H|~b9FZTV$(|dU?|yZG_Xf@x8b7v1e=nq9KYnT9oy=IxZMkLeqq6E)UM998)!vf zuEHGdl^JZIK4{z-b@uAjBD13%2LPi6l^hcl{s5!;sqr!{h^fss-fNde5G( z0@46io|DPz%ke{kJdx<8Am`c}^(-b&7iY6PINrMxMeR#E&MzE5Xd1~#2^-2fC+pOJ z`GE3<`Nn|c4i{Kkvg5twX|6h5TX@>(>7&FM(foR*c~ZJ5VeB{Qm7~q5><*=BGP#6@z^v}G+cmUvt25V0K<*A8fSnvUO)+SSZl96 zes4Z+{PylnpPf57cg}h5-F4)Ycl(#}s++spF|pKXx7S7i#`pxhO%MErFSd4&s?N7ph@6&{+P55p=nD3?`juBV?so2vfBp>`Qr@URw7L#4kVF(en&zB{UChCGVE@I@htw`?Y)my6Bwo literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM new file mode 100644 index 0000000000000000000000000000000000000000..4b97837fcab2c80f9e168bd1741fb53bf77e8397 GIT binary patch literal 991 zcmaJ=J8s-C6r^GV3oPIRxOQU|0vZfyV7zTH9cmJ(vT@J^?(Xv*XMaIMNRGtXHZ@=w3z}-tN zIZGA*;*%j15qO54WMUSZn@lNB^DY} z(?fpNNti9)JVNR>50OW2|~ima6lBnz$ki{w_0^8RB%Art<`{5>oSgH zoXD7qtapRkqh}3Ke28HFj65LQnSx+vs%KujC86HMO4>pb&m(0>o4$I9!#65JF;XLe z+;RbYB_##4I~zZx!psyluELTO(l0YFDdPVb1Wy793~o6o5sT4MGF8jjO0il;=)qo2 z`K$mW*jJIjNX>}7hAaMw!u=W5rTc@$1I_YFsY_(9)EPA}>0Zew1Yi0sSYqCrX+}$1 z04DVTAG_=jHgNnGL9dSD0M-)gSei)w+s%eO8xG*~Ztj3IlheX3mj?WfwjD7992wASjw;nPR_n$L9@dpSLu({m5LM_+mh`16|22wh=pF&;1k z_@frUthIfx&AO41;oPz3F*4uH9z!~UHDHxW9eZp(9?RGhHn74@%b1(>VeA9rN7IG3 zxnlv+*$x^fAhL+bh#j1fB#_n^7^WG3GC_Dl7&^dCf&obZ2L9f7B8mnH3T)bUVKzeJ z2|RI_HJC$gE}=dxVy+aL4QCvhF8PA1*)+nkha)oE9)js{7V&_(=4WGxR$E~9g#xhW zljN7FKi`H_#X}(pyF+w>G%SXADeQ!HEHGuCD4Md$cXExr)T&k|PNaZ0G9o3@qO4Y*zbJM0U9GG|xSl5lt<}2&1TgSP z$t#|X+V0)s-aqaGB2d}p13RG>tu_a{cLv+L8%TP}0Br;$h;>6xX?2HK{D1rP#9%-1 amp?;S#V&!16?h=xUn}bt%as`1@b??+Oy(j0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP new file mode 100644 index 0000000000000000000000000000000000000000..1568a8f57e218726f58217603aa1984b291e1f48 GIT binary patch literal 6698 zcmeHKyKW>!6s;cHtZjCe1qmTCge>G1Gg7^)nq)HqA`oQl&ioZ@O~kj55%OEaWDDoq z>Yn!)cGo8>nnoF|d$Z_ zO6xM7-`%$)T7vN!*Cnp2@%#I@KgIP7*K=GS;Cg}ULtIp&UPF@M)ms-9c__Abi#QaA zTQ?NnTmI@p9`Fsv5w|pygd2`Kv7n_nwm#`y9O}cn`{MB&k3-7v0<2m@bbQneZ3*LX zrjt0Pw<0;?Fv(%{7}oe|4J42=%VA8y=&EMllemN`Cij{Sw56MrP)AReYThbj4FbV% zsYYEnW1SB%Wklw4Fh*^9z3>A6K)8U6mzRzwnaB;c4KJQ3-$a~($tPOb#Y@BHx@_d5Ui6rCkoVsU_o8U zjnL#p1?6Mx&m=He*XjrR!Q)cBaL&kJfgr zY};f!Q$MikZA59IBv9u8WgbvwQHtCx2uj~|Qlu%CE}|4nu>#TGzpJhfqF*+fHYv3B~Qj&qHjyYFH|oIp!hs#Z$&Sj(h|~F?H$#lWXOUm zOF@<{f;!O>X#$fuR?40|4IQh4M4IIT^tNaLgZlL!F|$LI*xUdg3DyB?=`1_R+gQCy zt^mVs0mB1CoB0Jq<2D*57)(grq@JlyoiuCPYiYrND6%7sQhhldA%aXZI&k%mzky}Y z8w9u#zln)w&G*cLVcr1%Br#{m7vUBMXpIX8_&9W6i>JgWJ_A%)&pCl(jHQx$<9H0y z7EW*m=H6mp$vh!@fEZCiROGTaj?O&KyoYQArd}v zCBDS`93IW`O$D^`LK~sk^L3-|qcj!Pw0b^+b;)oj^@x4Kq zFy7##gd5mK5LmYeK{e1UJifHEpT@{S0K73^2)HE(-VZaC7+V8vIA+_ukPFEI`XGhb zhnZq!v~^4~6A~zzF-~W+1IjTDxnktlPh=Krq^6j}GKXAd8ZIrE4MZ9SppA$Dhmyv2 z0%sZY?bJ~UvR73J2p&ozG;lHl?SGL%ie(QWBm{i0kkf&wHfSVpLeeWvSfWwDBjy3M z9;9$aq>xFowMpLjhy;icnj&ot%piaXZ3F?42rF^2M#mUHkkkjeLv=I$# z#&u<(Ll%P>j85xg-)gc!w@TkTat9c?DsbS z;R=CUr7qTQ;SNuXjJi5JtT;sDYeuCf{A)-&20@w)yhxeK-pVw(5Lp~R0Dl~7FWbnJ zCcw-b=`d9E*6=jD;HtuO46qUX+mmoy-^Q7}Kde9N4T=*(3vVa#VioG^7YCK+JIhMk zC+o%T)wBZ4cLmNimrtyTvM_*%yhm-o?wPrl9#}hf<-;1hsH|+-+($+&`yB7p*Vh%( zrX$mKyXT1P<*;d!c+xNrdpi%7_#I-<(CNTcerG}2Ck73P<2)T9=DYQQ@WA{X*^jxE zOA|nOomTUAc!M~t=BvWntk$vccB}QYnm@Ffa|pf34u*m8&Re-O0a+$7F*o0aXpD@x z(`tTN%}=YjEKK#~o7FPD*t1CL+o61WjMeeCs9jf3%t(*bH|E>tig= Gs`(QdEnZ&$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE new file mode 100644 index 0000000000000000000000000000000000000000..8e10e28d41cbe61c4019ecf76bcfa99c3692acd4 GIT binary patch literal 660 zcmbV~JyOFk5QSHX0|`YY9c>C1@k~6dek|KGR8&;dvbvlC-3Hyp;WV65&s+_sXFn!HP3pK}SsvRl1y_4OSac&w z3+NJBLmTJ{5<_}Kr3=P2F*QNgZ6A{ltX_#G{k{xxM_@Hq-ji+lS9zPDz!4=G@fh~l8uX1t4((Du-bJD z7XzETS1;`sGnoaiX?a`rP Soz3^9&HhE``tKry(DW1i34a>^ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG new file mode 100644 index 0000000000000000000000000000000000000000..41797005fc4ba12f271bffd2dd6057eb60149115 GIT binary patch literal 838 zcmb_ayH3ME5WGtiL=uSxQPHGu5lgXjzPFJOB?X^wxXV|-`j7Z5T6#K|T{})BT24CO z?d{Ay#{2Q5R&PozAC*#CYjvAnkMG?;#k$aRJ&ZiSwZL9uZ>IYS=M@O*+qHK8^bm?^ z62qy31tVs$60X)GP+cRG8wg&9-C|q#d~9-0uC#!VPgFugkeWEAwQvA}xD;_oeNBFR z4<#}oGBli^9taBE_!>_@w1HZ00;xZ^2LtJSwVunyt z&c&c2t`CKD#qh5YMdM{1C}^FGne%V5F{m{j5~E}RfyW8KFZu^-a{Zer%3Oq&MDm%l zsm04P#_m%si~(Fv9|kSe%^qd@q2?nDwOUo}uCj1pK4p4}^RdT_LNW-U)zVZg+;>cH qBkz2uYoYHdClR(X+B{S_&&>NjOi6AJ2&1+q{;u*8LZ6ASv3>#eIkn^f literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH new file mode 100644 index 0000000000000000000000000000000000000000..0156233aca0810f4f25bc03fdca6ab2677aa5aba GIT binary patch literal 758 zcmbVKOHRWu5FMu~gl-XZ%OZ5ZN(nleF;@uNyP!b+VlwGV<)~0p5iHp&MG16jl>}!aj(zoA^NB zLF=}DY-d3Sfgj=o)!GE-L+l~*WnxoFM{cRG_Q{6<>atH#v9cVvpDgW?nvM}mN|`QT zKcYJy#~1w=7C2<*81R|a$^3aN3znVZxw6!QY=YcgX=5Q6a@Q(KiPqdhL*CTDGD^Vs z77(nsY61assrqBgZx9sCkV5i?kAuQX;(xzi!9Va(b$5%WbWgRENm+~xAR(uP>nmDs rFd03z?9A-87B^fs>Z;LKjVUsh<#`HP$VMS?!R4qrMt#EwuAIMju#cYA literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI new file mode 100644 index 0000000000000000000000000000000000000000..e1beb0cdd92eb7c77be4ffdc9db6277a7b345ae2 GIT binary patch literal 678 zcma)4K~BUl40I}0+Fx)b5|tb$O}kt;Bc71vwy%J!#7Fo6;w!v_H^A8G9zX&S)m3AU zJu_BcKWKa;8eWLVIY&3wcef=jbvw0Ocv_CtZ>OhxZkm@Vty-B`lktq60Wl&D2%SLB z222WzB}~T(bjvfcEG0;7LCTzK6Dcc-B~Ei?_H6+|mhGf{fw}$Bk*ZGPwg!*k?0s7y zbvC6Ys%xP!28jup-ht1;TsTxC0>iGY>*A{yvplj9Ss^mRaq_JecyvF zCr8t+Ht>KcWkBIZCuLX#v_&iF3|vB=VNQXOiYC*cq^M!{ZSKUS&+2?h_wEq3b4P~- z*37B;cAq%?1F%5u}WxN`9yLslveDJ7{>g$B*o*902MHBn@5}InuFv`LGmB~ zQp3W?z;14CXk=_+3RJ`iGz4x0R1Lea5kwlS__VGgjNHpNwU#bX8N0dM_6hI9y>q`_sC|L5@ z-kTZE&ED$=Ee}MCHzG2|(Czl&zU4aY_Pf1|&e`4mxxDC0%=K|y0ZOs*2yoCjN@Oe1 z1xYw^b3PB_B*j_D-11N+)k&(OL$y|h)=&tMeTWHq+gUHwRzc0V@lYpWhK~Zpa6zPS z4x=v+xvRL}If+qHf(ZChiqvXbfFqdTlL@$3SLcFWpBdb1eD0qp)K94H{u4ttn!Uq!FG;!un~=YxQW;igutm4SOaH zd6G0*JI5_KH0X7-Klwr%x;3N}nh(8Ev4sd?`X{c8AT+E}wS#2NL0mlcet$!E@J|LU j9-mZ^uAKK+j6QC*a9-x7*^PKZOZ+1nuhe+}kBa#MKyH{! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP new file mode 100644 index 0000000000000000000000000000000000000000..a12d7deeebd5058676aafab4511ccd637fc0151a GIT binary patch literal 563 zcmcIhOHRZv40T!+su3$BR%~X`#dJoM;(VHh4F_O@*k-z$Q$TtnuErVQIY2?f8cVSg z`}sZBeSM?mnW)+mky46oCx1M>j7#3#-*G&iaxz1hd*s3bNQKklY`*Rnh?i)j5%|*L zvjIBW#Bt6pu}AR9hB=Rk;X|^>OkOBQp%fF^LZzrRY^?KR0O=LS#Dkr`)fHf(Oo}!f zS76D!!{maRxc_*bQx_pc2Vb|5rMFTt*X+K#uK*>)Bnv`mU>-7y~50R9HMr9T5V$2BB5@SOXUDLLo&mq zY}xBAQlyIjij?>`Z{EC-e*6+g--I|6xTKWgi&DMbbi?Pb-(#com~L+0_1X-{;f)<@ z+{2i9Z8x4VT?xofDXM9|Y`2Ze0ZOG%D`Jkwv&J~Wc!jYl&&QZgFitVfFwQX+Wsuww z?8FC4wn5xFl;gNJD>nUKXxOrB(xVr7grwsjsHK50NJ zM_JS+LW9&{;fFdI16lBb8sx%rBsN#(9-% z4v{Z~{EdqXHe&5^Gr<7QBtNx}8Y>pi%Tw&1x?IR_n z_69bvscn<@DTEYb>bg34?DQ%OD(^sM9|!E!DQ1~?#5u+zICp6(nJxtNm3D1Qak37x zlJm9{Z?~Nw*h4dX?gctA>k7i@*&Xqr)%$yF+zXqL@L@S0;SEdT@Uu&u2GW+T2`TgS z2!p?Bkdg|wOLfC~=zR|d^2>zj>RXaT&gBinbYm?JDvcKlvDQ=qP1Z2hwAA9{aotL> zz)xWDQ{^KUL@;B`$u=#Zjw-#W4A7*wLh8L=7H|N8uB+NtslV$(8aY|$U$^}CH0ZGnz+W-In literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW new file mode 100644 index 0000000000000000000000000000000000000000..27e1c8cf14d240225d1ca528496ac17418ec6229 GIT binary patch literal 758 zcmb`FJx&8L5QWE!qNGCffJBjkm5AiOvAs03NF0E|ahFrT?2Whv$H^JsjW-3Ll&s|4 z_4v&<<7a;yY4t`l9Er#nLpQGM5AQt7{nKOhoTj!vNOU8DX@+LNSYvE3G=rXfR|e=* zsS~#gyjv3ED2$M;HpC{??_yFQtENfDC$~}IQQ-!ogAHxG50O(YXzCh-=sI6vTEeno zT(!uTR5>+3L|gG5bkA*+j2W}!JW45*3qom0@9m^KHAt<~UM1}hN^lTZE6xGx02N<- zYFw7oq`=?WdE!QV3TP= z&7}#i)Uf<33EgxrtuR*3yT;Z!H4X=}KAq&rS3NWsjA&P=)nvZ#=udb4pQe9VXYe$< zyb@h}(qL^budjiw?)ya;^%EZAJko0G?zSF_hHh~laQk%IxZx~L_YAhEgf4sD+|&7Y M@~ZmCO-21N-@`VmFaQ7m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY new file mode 100644 index 0000000000000000000000000000000000000000..95bed5e01fd738d871f9cf873441f99291758251 GIT binary patch literal 868 zcmaJ~iebGNORNH@Qc3P9it z8heO~rlh4fjWJ@2J@2B%rb(PumKRMu=Bdt$mR=?-wK{FM5>ek%Mv>kSZq4b8uuljG zAoJo#CXoyW30+#V1C0=Z4>5t%<4P)q?pZsrKo3({G<2EL;*^|yFO`v%M_PGg(F*P* z&DwAU$oM@{Q7E7Yme^%*p5;p}F~p6_&DPZrLvw~SXqJtQV(6tDdqFe1CW0PvsSSNx zgC!1gEi_@v-yc2+KoBmEprOeN1~)Y5f2KDP6Zk~lUDySTr3gHXD9;p!8O{yO2&nBe zKPF-!WJna_9W;!VRq~DNYF-!mwt^;FJG)Id&7q^-$o5BGFn3VHQ-Fbi*pCnEJN5FH yLY(OG`8ZyYv2U`C+mn>D`v*jYce literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ new file mode 100644 index 0000000000000000000000000000000000000000..346ae181e9df519aa5c3e71a15dbefef98d637d0 GIT binary patch literal 911 zcmZ`&%TdEH5S0iaj1SCkpojS28U0t{LIHGuk{eZk!jWpIfsUvF-b%I;L-5Sn*6w?6 zpH}wAmsr0Dv3eImNGZi_+&#Z)dnlRW9*j2D&aR9Wf`KM*?pv$>$l~vLd;(x2R#7V{F5??NWP}KA#|ul6KfRQ}5C8xG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA new file mode 100644 index 0000000000000000000000000000000000000000..39c98b7375bdf8eaed44a1b91266da0a5c4bf1b2 GIT binary patch literal 585 zcmcJNu};J=42GQ+P&p#HNeG3{ZgriqKHQ9#`xbh#N(?sdB&3$}#oOW^suF&N~W@ zXs6e9D%idiAQ$XdJWE)2$|v)IrJGXje~#bLzf_~@;U1%Vq{=y@o9U*RHC-(6GCZ!- z$?T}HzO~$1Db1hnMk{5iDd4jhs-5+CczK|oFkdt}+hbZA3dzV{%7X@eD3A0fnZX-{+AC6A3QM+=*a;01E%X$=boUD4{D@ERAl?A8adJ8W4OTYJ z+OsobZ{9!Y>WwISCL(60`(VB5hvRAVQw*j~-)_QohR6{GLcsLu504Md#x7{(hS&$) z0A8WCnIg7=X_OPLXn$nEcSA4&jXqe_`avk{Qrn8wJeYE0Y~8dDVh$8|>ev}5M3D~K z2)V;7K0zYZ#fNH!N_<>$6@DcXa{j_dDoi&h5vp-MCu4a&BU91qvw^(Re<8XRv0?pB zN+Nk-Y0frF*~=5r?t?O|0q5luH^+D9ygK`?3atNl7cwi*#@4&VP4q aZ3ELzmj;D*LTb;Xi^PWeI{h+YC5>jrF^Ad1#4Fm`jlO)X1 zO9rhp+76>|^IIC7)uBt=_mK~HC!PKI71PX$5R=26n%+?14LYS8QGaPWmY>(-DGwLr>6#uPzJ z|HPFMgocI7JqqH_ZGRlbe#X|p-x=oQ?iMH3oca(jS^b@F;9MUuF3qhaShK)`S_h?0 I19+U+4@8-$wg3PC literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI new file mode 100644 index 0000000000000000000000000000000000000000..db5e577972f161632f5d6948cec8179381889a71 GIT binary patch literal 856 zcmb7CyH3O~5Zr{vL5GA8ROpIGT#A#{kN81DL4|}w1C=k`eFf}&4-LP@H^8ik4iFR& zW$oCW*%|NV<(2jxiFWRYsA(EHFCmSq^;6o&;_9+k7j-F_du$FHpjyNXafnb3JpgDC zY{V2BN3n&iAH{(e@VOk2LvrZF)s%i@aZX}khsjycBupy7VDtT3E5UPZanRR{$ zF+uJgNdf||FT*mAGOX6%h;FL#vfcn**uX@I3W=;~B`U<}4i?_Z5I)sZ2ug<`@Q0XI zBQe`zwFDp}2A!cMdFydv%@l|SoQqsxpbfZ`0mVAlFn;VMgkoG6!CtMa+UEuHl%TqJ z!!u=8*k6|o9i^!1Hc5)Vso>ZqW3_E(A!|8m6{OTQZ*QfQul?0}2I!UqT;?{}oMzbGzKiX!eqM{o;8Z?c+5r4}SzsFAqODY$YWD)%U=NM=; literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR new file mode 100644 index 0000000000000000000000000000000000000000..c69e3ae3e9d7eccfeaa48128108882e34e979f06 GIT binary patch literal 583 zcmb7AyH3L}6unLaO&O88cgWBnRdTLh5d+LfOsr0}di2q{Z8{k~0DUbn)DA%!1 z&P#s#psQD+;(>^iQgnBCypL>M82T|8le(_y$5WURa0V3Z(GLRo35pW4!Bm(nMm*>m zJSgOVkzd$U+_JIG2N0g%HNVWrXmoPUr2xoB-3}@AV}oF<2(%Jxb&5U=jRdJu)dMJGWETVDe;|Mw zPc<&s8%RcjEdmp8+ZdR9f`PVkF)$ezfUSq9;nM(m*`!tzN-?mi7%He30p)<90SYmT ISh!*a089x#RsaA1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT new file mode 100644 index 0000000000000000000000000000000000000000..521df976c220ab63f1c96d27ce32b3c492cf695d GIT binary patch literal 645 zcmZvaJ5Izf6h)s$6NnUvf=`1eQlvjHL%aWZovXp}S(3r~bf&lM3-c`j6M z0x7@n!a*sykV+d%%9Wuco03kGW}U1YdKA<<=`G<9Gei3QK$QuSLx?;t>kJ)Mv~=h$ zliVq(vJ|5)y6hTIc{c>)ml?}~(@6mPrf1m+gA{4(Kan;Y`Rq1E_Rm9L_xeVm@32E8 zoTb;^qYJrW54Y`M>}X7K&L1^*P&T}7MBPYY7+h=NvA2Ovy2ZZX9sPUQ7-A90|05RO z_5*2qtQ$_!O_GkZA-c#lx#LdSsM0OrIz;1n??Sij%j$83`dlr%q&u>O^Ul~0uO)4q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU new file mode 100644 index 0000000000000000000000000000000000000000..63217e0cfaf158c619ca578178c1e88b90d57db7 GIT binary patch literal 1357 zcmcgsy>8nu5T=YcwVT3Qrxt+*6|fKoAt{lfx}-tYt_2FP0y5+&($gE|)%py{cPGoH zE2rrc0|!#a{@*ZuE$6MFKPV5l5MyQzCxUw@6Z zc8%0f74>E9F)wAk?E$nvFyb6>ig<_M+!FB~afVXr&eft~n4faHxfCjIC+(*2*4jr-%_B*VPsH)Y?7n6hU+CH(Rt;g){r^eX9eUbth;Mh^XZ1|yCS1^@s6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV new file mode 100644 index 0000000000000000000000000000000000000000..07323a7ed384570b2b85388c76081ff3c59c053f GIT binary patch literal 447 zcmb7BF^YI!;JL-aHJZZV`4P9t)ekzRGS)C?H}=Ou|R9&dFC0{OUl<61R_U)B4p!Qyo1D^6Z03C=gUpq$nc zxy-o|_l?9it|jyJQjkQlP`GPokg_nlt%ckg)OBm1>7xW0M+uiQS^%DBa7!zBxC zUSEKG(nf30#WFByOZ!7J?s*DRPdjOpv?vMM=3+5wX|QZOJ2hUq<~?K_YVKYw{bff7 g$wpsx{h4SlO($(9T_=4fLo?mAzwsi%n4ksx0eI<*Jpcdz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC new file mode 100644 index 0000000000000000000000000000000000000000..34a35da4cda7d42a6de2d75c6953ddd06d336956 GIT binary patch literal 780 zcmdUtF;2rU7=?c)t(2+~5(9{V!Gnhesge`hvBSc^%n96Vy+liLBd*37;Qg*aQM0lT z>5pUkd+*tfKR#)FCMruJ5<<}Z?&Uce8~S04ogWUz`fz;r6J`rkh1#H)r3awF>#>jR z-uiu?VaKpQF^rF@@0-?G*Fo}R+1_@{jxIJ3vA>%}jGOC3*27@aUGzS{;g&-+LiJ^7 z%QT(SlK2ZxwqdV7>88!iyi$;$ZHU?rSQfU!S*UaZIJvi1^iNc1jbV{rEL+jt4gxdP zv!_|5=u~aVUSA1c9!*Qqn+k(FVP{NlC literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD new file mode 100644 index 0000000000000000000000000000000000000000..bd5d32062472b43964db925b9c3b26cbfe485830 GIT binary patch literal 579 zcmZXSK~BRk5Jkr=MG->mkk}w~kwqg>$)3SZ(hVE7oWRYlS6~Cqjkp?TfIm*sl3>Ld zW#<1k);M3^wD}-f9f-&nLl3)`LuB#$x;vgyY}(FN$J1x%wT@k2tCF4|#KY0;+b#)0 z-FA>BkE}@Yk$v4&YW8Z*%TU40j^)_{@#q8Ra)KqmT1OW^J2#v>f!*XO8f%wGq^9z1 zYoql6XPB=OkPHojPGqhJUH;Q0)AIoT$g_D) zpw-(ei0`zr7IHJbRJ5kM9mvvG8hl^TrgYnqQ8IL;H)UvTONZ}!Rq!Aj^$1jC{kD|B X!klDo8MPPZ!g7r}#gB0|frIA1YnWwj literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME new file mode 100644 index 0000000000000000000000000000000000000000..94f2430774f63e9e8f65116cb7aa15364c596f81 GIT binary patch literal 596 zcmZ{hO-{ow5QWDCX`I0L+KBLt;5nT$P} z=kJa3{z0o3qUwo=lu~rJ-9H$fvh89&4u^I)yoPy7EO{4abXABNaU}}GC3G|tSvFl7 zCyRaN&Wt!l9J6uA?c`8r)LcMSql(;4{#gAkio`5kt>C>t1tib{R8(6w*7*>Dz7K^L zJMjw|8#hit4EXVn9v9SsbrD0mPP~})5zhPLz=a5y;OfMTmkqjado;VOeL%0z8j`bs z-gzyLm?iazC7a^?=TXs3Oj&nMjQ<`}z%gk~G4bgwimqdX>>pJ$(PF?;+8F~>JwL+L s8&%9`SIg(vx!%H)nOjMANjo>UR5yClm`!8LL@WHMepGb9jTT{9UvYnI>Hq)$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF new file mode 100644 index 0000000000000000000000000000000000000000..dc4373bbb2b7b45e373ddfe30d151261c3d1e96b GIT binary patch literal 551 zcmaJ+lRZ~Dc?*+x}JMOPChso31;ugF$th5sLY{H_b~ ZA!VdrJutmI>k~M@gsA0iOGE3L+&9HYa^e60 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG new file mode 100644 index 0000000000000000000000000000000000000000..53d307b1f5cc813e9868ee5feebdc42c59e2240b GIT binary patch literal 450 zcma)3J8r`;45iWphLI%)$lyVPJp_=Ses-6RnR)_6TTao)H|hm?sGgxA9j9oE4j~{> zl-`Gg-al#cMx;K7H>Idfu=#Yp43k{&s+U~xGaX?f5=KF|slc=^&p4fnOD^W(lXZb} zNQh%DFDEkC@icjoS^O2E3iOvBSx;p8Nf~}1S|+kb`WKl07IrcbC5E2JKoWRL0r)b?Jx8V?6h%>+&=hMQD zDC2SF^XAQDKE7zPCt5!fQI=(N6HMuR(|5zcAH@dAAuGrwz|M*Os za+aK+(y`#t>g^Ty@3hhy;n{RZ(3);{AO^wKB*jNXc~NZ(vn?zlGI})FvcMi|AVaji z_gEeIu32TY)TEn_ ztU%$VOJ0iZo3|R>b#`=1R@<9TS<4*%cCCJ0plc%o*RzP5&hsL=&gB}g6w$)Ax zP3LRiE{WTb_RN?kmziz#Il$=F_HLDEvLnE6w3q0Xcc>}P@L_rAJ}xh?Xc~J SwhJOQaC?3LTB+B+RDS`%+)CEUv>Wax4ZnK>t1#|ecyM#_`Caud^O~EB)$?3k1 zn8k*p4C6vnd38SJSvu36hwDs_)c|mab8eSPByJ&~#Gyrx3TJmDD0LEa#moT{L)@}c zUJASJ2uAV>+XUuyU*{(Q39nIP#-GD)iv%gwAf`@yPUeC9SJbMl{63`H3}klgW}Cwn z*K`oHtWfbzW%J}FFOl@D#77l0VgSI5-=l(LthJ5Db#LvYW{L)J{3PNN-Gp+#K&6}e-pk*)M{3s&g!rDtVke%<-#Q5tBjuSVWLX_EFeM^^AhTi z76j#!)vFjZ6f!V%!EZ6? zc@38Hd0?}k?_T*3Qyxa9&fmge3}`e|1`HeS9AvGB5vksYBdC(@hb_bdigKSBQj<*$ z>#&*}##V5FF%FoyV6!hijyB0?W(tX08#(J;&1IMuO+va(eNm_@MocC`NhfR8DYx@E z$Dq5KL(7cBewv({G&dXsRE3TN##Gm!(a6VZQ*$ztwCn%l(T6F0X4`kyK1SvVGhx-% z)D;TJzwGclKr@zy4MKPE;RAw?-Gy_g_v=4tUU%QWBO}&Bc(fP2+gSy>L6v{>_Q*Cry6S*bwiGe`~K9S-C}H`jLmnCJ|S})KO$a32NeEV7d-_wc!^3 zha+Bq3QD|Xm_9>%(S2Jyzcq^PH&KSqY9{pX>kr=TqJKX>y{s-5c0*C+r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN new file mode 100644 index 0000000000000000000000000000000000000000..1039995371cc5df8b473abc4f296b241d00d1816 GIT binary patch literal 848 zcma)4OHRWu5FNJ-3SA&Jutp+_1|^a|v7I0xmaO0cZgxEdbvO}+;Ub&?-ndpN6-bTZ z%-DYO=FMc@KdE>nnm-Yd5Q46Q(&Kuw_02HFVA~;WCfv@kO009NW!^7f3#>E5(i?~B zpjyK*wsBKjJ>KKxa~Ku1ucHmd^<%x>tT)l)R5C!e7BSHW>H9JEvW`mkH9*@ADt6%} z=oXh93<$uZ+RpU@Q*B-2St36yb1zF!X^qmRvkn3u1|6g_sU(}k*&yv0U65`VkzI3g zhFB(!1H0%z%E0^ri(3Gv?EB1{_Fs6|Ne~jJZUxnb0$#}7hoJ>st&m(#^?~W8n#xMuRQjeespf+JkrH626b>#J z3{*B$BydLZOu?l~zBM}#4@-RrTmH<_o;3wz)}w$K-R3FLKK?r>v^oKVpJB$|Ic=__ PfpaKw!E}2l*F^LUF|@7b literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO new file mode 100644 index 0000000000000000000000000000000000000000..b7e0c23fb3d2991783c52f0f5aac7e95d06f26fc GIT binary patch literal 503 zcmb_ZOHRWu5FH0aEt{U83naQ|7Ln}nr!E^#fLO6|yvr%5b0e+>S14}=R8koVCUS5gr-l(%y m<7Me+v&Sb2%OEem4Ak%3!;W!e$SCic0NypBFO2_qF{5t)LuHr% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP new file mode 100644 index 0000000000000000000000000000000000000000..c7659bad3ecb5a74906474577226430167fa90b1 GIT binary patch literal 834 zcmd5)J5B>J5VeV-NRbdVH7Vj^rCI+?!wHb+9e1fX0!(hir8od*fH&S<1QCK3OS|^W zzS)`go?qV7`bnu(QA%m8)pZTI9gffC#QVG3n7EK3#OWjeJllES0InWmBET#jSKW{r zhse45AveR$)^TvTv6s&ddFLe`B(xj?=WIA4ik=g3wuTcxA(tlLp|s2;7lZa*+RKs= zHd<}b*g79#%KvAKn+z^Q46fb_zZf|sVOcH6fJR(sfX6ly*|C!Vh08+pBMSKi)%m|; z$wB0Q4PAM3MX8VIQEBSbMV6pv4@VA_rn52K4=G6b9Pd1)WQ#(NpM5FnHWBTBE=QC;?VkhUfVQ$0YxM_=Ngo+AkH80YkULDIu8XRAz{h8 zT6=b9M*Hze*Y8A4AtGZ8Jp@j6z1jL*Sw25yFHIb|MEcO@oFE0MFHTyKEa0b>aDp#%we^x*82a#YHC49$EJ z$98ZdnD3P|Wl=(mP~A#2T{KCO;n;KoR_;AowsJl=GFOPl;Cak;P+@z!NA76%2vPrJ zzHkm-KTAW8YR9Ee9p+C@7oTDNFNzzyAI-v?bJ^zWBevXiMZbj7U&mHQdl?v3u~IKr=abPI1@ME4DcMP86R{Vd+R}TK9uSZXYz+f zx%H*7&R1wzC)uEttJD$lUB#*s(U_T-!*w#9U_2$9hamAnjL6@v>3?6+$tWGO8)cU( lULKTb%}5H~1*SE_{%4_;EDLE0X$$GlAZW>ZsN>j<@&=X=Oi%y- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS new file mode 100644 index 0000000000000000000000000000000000000000..1a8393a0b1e6d5603bd3f4a3c70c8ef61a7860ec GIT binary patch literal 677 zcmaJJ5FH0akyZ*N5-p^Ni%9;jO~VPOD81X|6l8J}j=-fj0B3+V-i-(dV#({@ zdoyp|?Ar$|Ux*g3M5L6W+wJ2+jd>jQ!=6(LT#V7f{?H!w z2v8vVkWT55zsttBmRY!K)bb|^_a{`-{fQwPDe*nJSuUs{AxAY+CXRTJL%W4t5iYd7 zMnUq1r#}D2`v8^fKnw_WM&cx;!4TZeGBuZ$Bev3nw2LFm(t2`=qpOJ5(CESJKsYvO zaLHBcgv-7<^aqYzwkyI2F}lyvJ5t|9Ts*c;pP?K0CxaGG&k~WYjI~&le6F{mzV%FR R*eY7$=h#?bP6Kej)GDhIfh5!V@G<$2%M475Ev~V| zpwzi&HI>F_h(7w}`-tu#U{jKvAYWEtTbZREu)zq8{py6>fD+ilx=9 z*Rwn0Ilq0<;)Q7TPDI8Sy4~F0mDKHO-tM=1yWPKbLoM9IHt(=$2jJ$2C1Qm*M@T0< zp^>H8h1fO%uD&=Vwni=ckaR|6lsV$0cE0w`)}(;YBx&lrt*vm^j5Z%@D4zSB6)92J zXNUtk8Cs#t$UPX4pt)uwNyO-s3Wz|tB%Ib*LemObE-u6nsQdos z0v)gpIcy2V`7o+UqQ)S^2UWreI%0y7o9uY>E=wbecYoBYZ-$oHiS~$=WpDsZL*a_h*s9)Ap|_^o*pM-N=&97Lm%`0p!bJkm`idV1K*E06IfDo6dMYr z!ZR@)g(0TT#j!xlx**lkIOSvpk5kMAIqPxCCA3=B+`_Y}pkP%>It<1R&Xe>VNq9^i zb4k@gGxdiN0ux4JtZ9a7`=nW23fNG&LNG8WE`zB21FBZOXmL{Af%xxLz>RP3VRISH z;*7qv`mMas4CKozz{Lk#85S)zY5~%iYK%4s*E^cn&6*ECYgj4UtD)NNPM^o%+cVf1 TdadkM4O`_Z;WE)rF}kg9+8kv+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW new file mode 100644 index 0000000000000000000000000000000000000000..7ff74bab1a24773dbcc31da387a661b202b99e0a GIT binary patch literal 508 zcmcJMJ&wXK5QS%gAVhRX6iBO83KviyWo*D?8%{t?k)+Ehz_}4uqv8PY>=6D$yCXeM zY`t%u<($scKM?VSurSl_Z2MP;-sDwTJ0s58d08KA;{%-7ygGdEqfHP_9;(#Bl4e~ImKoJ9|ouDodkTl{a z?1)R&L201?J0Ly8leNtbp~?B;j<6TLHv5v1Am;1rl+VF$JTv$tA(ty^3Dgf(iifZ^ z2c}iV`YAB!Knlc{U30U(=uq5hBpckC?otgF%9ko>%Y{!$+d>>bY{ojlgyOWhFJeJP zImiLIs5Df27Kxme+W_HMIz3h!I$QKFuzwu8-l4f#N~Mi;KA?}!$j?6hcknNDQ0rX> z#T8GOlsU$Oj^o-c;$Ejk-AlQDBnW`%D^YDE9)arV1Z56T?lcWdpJ{m5s&@=7%G2@l z@3H%v2r;|6huMlb9-4lr#7s)UIL^ey3LA3UR?Hd&1H8`Ab4|P6w*1)LN7Rj4HhS3* iQ;ADsaDVVT{>d3hNL=bic$p6UZ+=Slhi literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY new file mode 100644 index 0000000000000000000000000000000000000000..efad3c5bc2b26c10be4d4b4406442c84542dc680 GIT binary patch literal 1506 zcmZ`(TaFVk5cFgrY!v6L0|J%wMj+59{2B<8Tem09EbD zEXtBd&N!WFcXd^Je*QMke;D)3;L~-Tc`y6JL%tu6_3q0jzdzIx`f=JJI2-}F!n(%V zVBKJ?u+~^FnEXAsp;(y!4lN&NxMF*sa7OjI%To>5xB;8UP3W;p*o8DqbtvM3!ZV7G z2*-itYnabU8Alc04n}&Ck4C4OMD!-Ds5(mqfoA|47!-k3! z{6diJj7YQv-B5;hB!rE?07X^7S+%6v`@^gk&z{YIaJ1VY zg35SCbi!#XE~%%*4^#6hz$+d`|LLxmI*WGysK)VRaq#A9!Sk_o{*0rHC}9K z;enSx_v;C_bFTlPZ&qKwA^h2_tOdNAzldC$*LR?S_27^C2*;hd-b%l9AGaQe&aCl* z!ANxG%5DXbw?w;!o|F9jdD_Z+(805KSMc7_sx~swV>paG`*-=XT}Q#YhBF%5oFHQ< zzYs=AGC8k|2K@qlch=oZn>jDF$$snmZO}e%m6GQ>F54YK=FLC4T$E=eaVe(>k2NmP KlLgNrruz$taZl6$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ new file mode 100644 index 0000000000000000000000000000000000000000..c45028701b38b112ac35001fa5963e159d9a571c GIT binary patch literal 438 zcmb`DO$x#=5QQfJp@O&*w=ODJP)H{IiEccB7clLvr_lCBdNj|VZ`xW!TpF0nBz*5p zGPeg!E=1~1*p#CA=6K-7mvvIs*P_L(Mns4yLKs>zm|$I+S7qH~!R)wdLgA}mQS6;4 zGf^spC{aXgExRouu2lzYfKf$2^Iz z*7;l}3Du5a8iZpI&(*R=Hz+Vma1tv=bR%d!jld^Pl4qR&9Xkv#2&;IsK-X@z0x?(C zYQb|R9@9_ZOY{C=OS1HUN+NtJb_)JcjPT2zo>HgcOL zO{#?9kah2&`TtAV5J5jS+OdEh#TNeZa;1 z1~*wL)p5Y_=@lu`pxWgaS`??)m@?o$3(o5d#M(UukVVPX0TjRJV802eIGJ}mx@cY> ze+~UANaZ(MoPSB0scFsNz7*s~pzmc)WzRTK_izvUo;qs*H}gx8Kj_abe0ewM#~(h_ zFWt?OZgiNtqfiZ>%_Ke`?fFJ{%kG;Ku^#K3Ts4aFAai%@lx0>R9*?! zg{C1!MT}?+5-pWB6|$Dd^45`XXpn`wKd`d{IKxTC-lGzxPz#k(Q~!1`b?ua*DS#(oqyq(vOO1fDBQ;1gJ1i>9OMf@=CwelL*aYLn|t QZX$l}KtIc|jrMj%`yp+0R?Mn4H zmwG`hcxt{Que3wyD)Bx8qcvy2l4(-l$_1q*+JTJB()zlLUJT s)Q@@?%`jTf6eLmTw;S#%`3`jPB^gH7R9Bg?ylOIQD?ij0Ds_(b2_ZRYWdHyG literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF new file mode 100644 index 0000000000000000000000000000000000000000..923bb18283295fcc36e0a527cad9850b2bb00368 GIT binary patch literal 406 zcmcJLF%H5o3`LzlDj_5gH$bREGa$urT3Qx1MlMjgaSBL}z#TXMSK|y|2No(;EICf> z{~Rax2beQ}x&kjs!K6j%j;Bl6OM*T7M8joR6}v66yDH))`Z`i$BeibrnX!zKU}AzA z1sS@kat)&kK?94+x)Ws>Dyc?KK{!xPHrb>$|2Ym@|F{kGVGp2hpq)#z%nNxcKOoI- ra|I*HQAiE5f|I_t5<+jmtsQ01My} zSiyxJwS-Mjy7tgU6QnYwZ(|iy>Dt%?sjISam{?3KRu?n~9NBP+061lG6_jdejMAp6 z8zj8K-%1^12`APokC4$I@^Sa|b)`fHJ9*dWg2j z-Z&|lR4B!~{urjp)}F!jNqplNAD(dwXL~9y#dPe{Z`UlZPw!7t1zNm3WAaH$DLwc? z4ku zuQwW=h}4A;l%n}+vo=9%j@FeS9gbafE)eUp0N@k2Kxt&r_R`L#Xkv}6YS(xS_gLe^ zqb_~o=w(&G4O&)n6?Nqj*HPCye&7L^i1hte^a?%oq7tor!Yzu+d<*1^b-_T4(wfX12;|i$2kCX%c6|$uwsX}K*zf*I0Az9EjR{OLmUBKl{=nf zKrrly)b6tLUe)V*Wqdn* zz$oW&jahqQq-?C`gubFVU)E^^0c8y~KTw3UT!e%N%A~prQUq%g6`<%jBgsYT`+2WXX9W;(fWJv9t3YP{ zjgu7DA-O{Sz>fk}e}0RM&>ekAnoh_n&QBQq{Rvkg{0ol;{ zpcYw;dU$B=gA^Z5CI3z9iS<~atc^zCqzz&7{vEC_MWaZZtQXR?7OOk*cIrg4(|91o zR%3|KtZdy#kY@xiQ%9TK6SCdu+Z{dv%@@OrMmqv>CUj@XBq`y{w=sD)UobBF5C7Swij)wxyYfiz@910MfiPSA^^cnMJKkl>1;Duxm*F6s0sc4@QY)4$ zur$de`Sa%6llMgsxamt|?r?)WYXmm(O{R}~c*dlg_Jz|B}Ag)nL zFH#vLKMmn%;q)ZF%EUcA~)xAB~m!fbNSVAoHn- z!YoL1RS0qO<3iEa^w#+yF#H?>x-tXGx)UbrwnsUrOEwgDWn+SpO@X-!LvPwnIDp(4 zK%8SXd0-x=aawj%q{|_oW^amwrA|rCAQidM$lk>$`ECv;wPX*GPQ@Vw6 g(NG03bSrK8MR4k7(QR9d>AEZ4lo-OQ{+oNEZ-SelN&o-= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR new file mode 100644 index 0000000000000000000000000000000000000000..20864a9a5976068dddf447c6831893d1baf05e76 GIT binary patch literal 368 zcmcIfI}XAy40S4%GI0im3N-^#o7yd5;RXz>En6k-0O@6zxf*AHm-M4@03tb#{rsNu zUT=!;MCwMklp>v-j>Z_r%nnZxcW67^cCM-_SJ$<()}nlH?+J(m;ip-Q3f{)>9F^AIYs9SQS_uJ&%_O% z+Qd8-Cd&vE1IaQlGO(B%7#acP#Xts`nt{!UHq^C@g&PG@2UN%ow7>+U7R>z*1W*Z( zEG@V|J5h`V^U#Et{6c|#UCqE`U;vT<14afu4X{TwL6k|YCIhRAp@NDLP?C{>(E_Rp GNC5y0us>x0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ new file mode 100644 index 0000000000000000000000000000000000000000..34fd143c18f677ec7b2535fa79d18385e9c3dbb7 GIT binary patch literal 1088 zcmZ`&OKub~5Va>vW+n?1ArzEd7PE+@X~}=PvmiMEVvXq?cR+&jjkp?TfLC_YbTW!1 zce(5H>Q$Bf>$lkc5aNx%l2VG##n?PfU%&kvD+LW1>iy#bq&>N+9;w(gG^;$V&GXaIX3 zG#3;(JTupb>R*Y=TK7Q2J#eaGT&LZ#p{r2pqVq&fQ;d`n<*b;Ct2D0Ac`9cO1G90- z00$xeVDW)lxl0_Mm>c(m>%rlWW=e^b>xdV>Qhdyva^%iiOAd|lMf)&OC_X$N2alX* zHEL#W(H+L)g;`|BNmFh_Ryn(weHP+k^XUr|PvWZehD(!^|#xU&<&s|PlwZ*Q_X{(Bj-wYY}0&#(85SIuF z$d!xsZeU|!46>|?k;Zk_b-f=z>F1Q7z&YnQ0QoUm*CUrgDY5WND!4DHB|MFExA8fl z9cF1Ws-I>}PUnIHqHKhNCd^0SLB5+rx=1r8<{gWhg8cXMwD}J`sU9D2p|4V@mU(2a-znM^3<^zo^Vz~eS literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA new file mode 100644 index 0000000000000000000000000000000000000000..014e949f77e1d80146c20255f0e2f98c810446f3 GIT binary patch literal 981 zcmbW0Pj1yP5XPO?R(+xpJJxiOMU5~T|Bb^2aRc^#-n~=6Pt7bM8M0sDE zk9F;q15k~y=l~i>rwp)Q2MH7~TaFqCvYO-;a&P3I5Tl5o5X(t?kr+WSNKODkc~oXO z4}{1BtU{*c(utSV@*=5?v>0-sIG6+{N;#B9HR1^4 z5LM(I{qO)uL9n{2UKRkl=utle;VKqcifuH66G>jutJvA=Q-J4X%xSjQryTo%CI;~a_H$GowW zG0v5&jbkMla=`&2cLyI3Dg6n7bLN7sw*@8FviAZf)4!@;R#D4fDDpS19WDz0_o_|0 zNLKRScysvn75rc3K%{zdyE1Pdv~5{A&JyD1pFiJT7Ei-d3V9W XANdk`oc;YA?&pY*$xKy3^_uLp?;Yoj7(_5Cc2Ao2{&{BI-O5yjq_D{&QL>MInlF zKHqo0@2~oOr2La8I}(u)f^N5u4?(xJA7a1T%iaFqMwBwF0&9KRuMn@%Kwsdew+&4@ zM2qG@2E_uMcMymUb?usn&`bquaW13hf(puZz6XsANmpa9LkgyssXH+^4z?SVlsr{C zvYwvw+Mo?zZJG``LDz1GE|?aX52nUI=;+voz+xZlCwUN5XlURCd4iyc82I>WEuu48?WGCSfL&X6jhCjrcjWR(wX z7p!Pk=Ar;naTKwzZ1O@%h~~bjv(SR7)cBI}wLulAh3AH|a)eo5M>EgNgPXa3A+#_n za{pd+j1X>47lIk;ESCn3?nRd(=RtJ?XfqX2{<@+4ysg2S-(KT##y6UuB}uBZKDHY+{i`jm`}|n^)jF@DA-)0Z4PLbX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG new file mode 100644 index 0000000000000000000000000000000000000000..95fd8f4392666af0476ab84abe7d33a09f9cb5ec GIT binary patch literal 549 zcmaJ;yH3O~5L`!`F47??3JMB}EAAvBt=|qpqNJra?)VDM`5Ib&jc)XjrN9=B@NM|$nG$LDrldPY>=@45)j}QfV z1QMUkJeX2lHa?c>vvsA8A_^w>Sr22W$!9i$3%Ji^L;@j#xNNO9*7*R{Ye+^g6Ns*f zoPv}WbStf>kNgMk(L(e63t0q_7L2e+ePhX`iTv}c=*FNtqa*1hW*=q;ZgH^4o9LUo zqMeDEwM=jY#A4#i!?}qSU(~%kW8fdOW3JjUMq!Jhj=6P#t)r_0O5)MvaMO`CdwsVz Zt;b89DxNU3xeKFV0b0Rc$V&-kUO!l$W~TrE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH new file mode 100644 index 0000000000000000000000000000000000000000..e3ce4c51a64173df98441e8bfd50fc5099635d8f GIT binary patch literal 1193 zcmb_b&2AGh5FV!uO`CuaQjee<_K+2cwD$P7mr9&C!rAdHJOKwJ@V*L9z^m~L@XhW< z4K2Af%Eb0~=9_OmPk#NT`FEmA!bd4Z?>F~%+3Z58X@6+;-HAyN2DsmarAx?smq?E*o}GNN9|_W7hECCS{FfpcaILf{7&9+@#Lwu^g%`Mac&lh1jWV zh+j#>ln@1n)E|6gGr&I6@iEqa;A!^hBi#2i>pFz1=|>_LwA?^*7({Pr-sp8>;762E zG~aZMZgG4q0k$9F?AD(~&gcWnvvTEBt#7N96Q%=mkl7VDv%x;#%2|sckfA6tjLuXK zhi?si9Wgq91fb{%20`pa&snWMX!Hl7NE@K6G(f0VKIoA626KF&Fly^4$GRIUDUEpz#Dbw4Y dO;Hj_?kp~N*yz16L+N%`@3S`U z(9vYt8$A?T=P+@+9zP;G6$5Cm6p-zp3c+lR<`Aj69a{L6lno*>a!gv|qkzPtc0g%M zSOdF&tzc`|3)mTq*3Mziu>o;|RQR)|c&m`J>q|fi8~a)dm146EeetN!M+Tq-7f?=# z7^S|n+4!C+i+$-#4MU{t+kyQN!)5CNpdLAZ?Ra~t_>i4%DJd^Rim9`Y6clM40;XEQ zA!2)l!?YX+es~9pi(;8>cu+Y2wNxjCM1Yuqz$bDBEUVl4!afpL3)sXH>3ZS^97?gW z#yTHjn>z6I)}frN57x694nrfM1r~nd+ zM1o5L5c|NP=|%@$sW5_Ix4R#=3P2}3je!EX|a;4x~u^s{3d^qn@z3A1`9}1Nu!Iow;pXnv=Xg9FPu=nKJxn>Nei-rBPY7YxQ+Jn> z_Uv;L(l)T?uq|u{yMkTAn2>%T$;fQO%IKyHmrA;iW7gRGFlK|@j@jZY>*04v+ulb+ zJY2>F_(D>)4`Yt-1VjdWyRidVl6sYxRrv;YQI`j7rV`$Dkk!CgEDI$;S4tb}e24?| z-fL!1Nh;Gj2t1x3jyu5Jn6+C6eTYMgPm<+_qz#LWaqd~6J@dQu0PtT&DZ%6qfm_E) z9@+&Z2+mj_Uj@mhSU(rz87~$*s}2h^0K1D)G3zA;?zuKjB=HA}|M10Z4fm#~s9DXh zX5a{K0kN}Go{-C1W*Od|6Ci^#{v%@nl>#aqMN9d4kVeg?kMKxpq~u6hTiV`$*i9WZ zt%6HXqXrJWWWSlZWur~2_N^|6ol;rL>@DM7GXSGoZOEcsf$v)bNJF17sZTnbioQHK zWhwhjRrXrd;j$n!sVe^5q_tOd@#5<*daqSBLw-Epb{=rKOgP#j@$fL~{F3P1<9=3O mP(?4+?(SQ@1VL|?caP`(&r4>yx~x_2!Cu^xAQ2f{miP-+<@R9! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM new file mode 100644 index 0000000000000000000000000000000000000000..592f052a1e49d8cc192337133e5e117f4944bb31 GIT binary patch literal 586 zcmbV}Jx;_h5QS&5+7+v%gpMLbirpfT|7|Eh8~};lY`3R?2ur#q9 zzxTbd{Q5@gXQJkwh?to!a!kjk(@PqMZ2D_i`VnUhYJ=LML`gQO9I7CU!~X6j8(a5- z%euE7XM@kGcM+=tI8HcaFm0Sw+E{RIqe^f)D19}ANj--u)4Nom(%Ay(J%|p-bF?Nj zWCqD(ROy>(o0O7Z=b_uBtWCLMT*!1)1@RJpV927N{=1!<|KL&c_<)diYLtSUr;jLC zbh*cc%y{@c(OIY4&a|B^?XAnJF|Aam@uPTb_54gT4@U{O67Hl~rtH2_+Rl|APTwKo GCi(>QkaHCP literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR new file mode 100644 index 0000000000000000000000000000000000000000..253a5eda92e6cede00714e0346f2791c22583fc2 GIT binary patch literal 644 zcmbVKOHRZv40Q&fkt(r-3$P)JN^TP8!-gv$w(0D8imB&DT#5s52Cy@o0XjlRSZb3v z@A)||d3}fLJ-}uL0Amc?Jv=>D%4IiBUy73a3DsKtkkE-9 z>W!QzdUe6|Aieoo{5rMB2r4xU0~b$k%#HrF7xs9V1{XS6}J5XB!x04hYCnRS1{5&Q0Bn3 z?P@>HmVMIp1?-;U>K6BIkVM6_P(=OxRZM+Ss?-L`ubx`v7gok{kL~Gz` z{RouO^>LUg=-e!EvP(r-X$~bH$_9j@%g-OADAlDw<>m*ynlSB5%58bXZf$#BlGpJ8 D!YE*G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT new file mode 100644 index 0000000000000000000000000000000000000000..1cb1fb6fe6ccbfb3fd69bfdf4debeb0a8c895ed5 GIT binary patch literal 833 zcmZ8g%TC=e5OqMPT)OF|T~;hEh%6$FJ${VYuw%`Foo|GY?pILfkNRuJskq4o*hT~;#GJ>>H8+(LN9aU0UZ|nNY2bVk_^VJMO=_!6h&l+` zlv3qUu}L)ND4I-7t8+r~)fP8-SXUgUu5c4G#Sg+CLZA~+pfn-nR+KvGbGf(Idw0EOzy@>SbaeGbgRi&`^9g>1p+Y0| KmuOM+HT(kw45gR= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW new file mode 100644 index 0000000000000000000000000000000000000000..3783c6a81e28bdc3f04c831052890907c29e5f0c GIT binary patch literal 454 zcmcIgJ5t0j43&2#Y{vy?D7IJ^nQ>&2eBC?nA*9I1*<7$-DdxfX9+Y zde3^#etn1T2_U?Ir4Zoicy}`)^|H+CylSSRV@h#epJ{W7#oofn@L*iDC`FlLf2=za6dtRn8Zxa+Th6;m7Nb@;G#2L7vT-}OtW>9+JO4!iqDfZYpRq+uFxX^u|3 a%cJ?vTl9mr2;E`0KA>R%I(zx}!-Y@7(_#z& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY new file mode 100644 index 0000000000000000000000000000000000000000..b1f8f3e7c83f8bf60bf087f93d36529926e9a8e0 GIT binary patch literal 1810 zcmeHHOK#gR5GCa}jcOn$3KZRRkpf;=fDQ0BB$Y*ag#uj_w01s4OW&wBD|&|Z%}5Cp z8E6jB8lXu^Z|1%E>Bld%{-)HG!cS|h9*U2LJRDEoX`jzE;1KyhJ)h2%H`-fsuDeh7 z?s%$H4Dg-c(ivW^r}YZ^4OWZw8f$~4vDV;GKVj{Q%l%M8ae*mov^5ob@I%eKMR7{| zG*ZE!*l>uft-2y7#?w%Hz-j2J2gc^=i;YSAdcsb&7Tk}gt_B9c90-RO#e$2CLxMF4 z!y&ML1m$q*YQ#gJSyTuj53$ySrvY&XH~~5`e?kO_AYIZ?GiA;R?IY)8g*DGdBY8ls zv}&DoK2S^(a!I+(dbtK%;f6bq zTW6jo4$VzM(^4C-7mu3HUzKXUsKyw))6*X#Th;C+?oKsZE5;k78U2G&+JQlD7~;>J zY^YqP)?0hGbppOFjumUQGGczqC^v%XIrQU;t*zC12RGe5S{$CD$cWlM@(~q;C?m$n;yDfp3pOJ;}xy>QQy*+G;c^}oPIkDLd>msu}c! zQ!9i{2<1^!S+<6abscywz;fJB2hFK4i-1en;>)J&P+Uy8gLIF5pR$)DpK?GADMysf zM_6X`E;N_^xO24P-80;80{UFid^Z>La_ez@7vf-GaFN^?#2Nv~s}RkP%6&lp2y4(B zOij<|sLN4{_m*W=b(tNhPdtmSA}vF3Q6eBRQeXoeU&cCEk9cJO{-1$H@QUzWcI#69 z*e};|yMr8_pU~Km4q5}Q*4KhOosq}QtrWX2blaG^v329>rUPElaj=ZZDZ0{)5d}G< EFR77w{r~^~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO new file mode 100644 index 0000000000000000000000000000000000000000..c2a71717e723ce7856c4949171af0cad8e2c0ce8 GIT binary patch literal 736 zcmaJUNB#g}1Bi7&j01t{b`` zwo+C&Gz`RHP#Of$1i5v-=bK%v;Weg4@7BrJ9MxpTf&o1wdJC;^HnxSA-d_Jtq-*sj4s65A^|Jo zG0T{Rlz~sc13V#zK@Lhbn6%_(z~H+P;^f_XtXzuIq}3qK(pMUWgi!p@bs=tcoiPn& zFXusAjd~i*G+KbLi#PzBJw?1Egu4YEgW(=65?QYZ(oSswb zo{2217xMR5JXu%-mTIT*_RvzOg>_pr|8F67EO=TaUl1QCyHCN%vHoET=RsGBA4?`h zK=uwC0RFP|j93OWCe*xyO<=d?`VxDR0c<34Dl7w3=u!L}?+|$}=Pc8CI8+cv2TXQ21e40oA9PNyZ!(bhPjvnuasG0V Y;h^**iGO;*@BEd>>Dve+;X6G128Q>}VgLXD literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW new file mode 100644 index 0000000000000000000000000000000000000000..9538d1a644f415e23ed425aafea3af5a3772a861 GIT binary patch literal 513 zcmbV|zYc;h5XP?<6NqutMF)lsFqj;NP;l`bTpWOnr|{1k`D*UQMZbcAF$~5_u3vlk zeRpjyR~jFP)QzwxMT=m&;q+99smi*nPeqnj%wbs{(=!kU=^{O(HPF1}rI0vDGk7|* zCCHP6BZ=2Z3VLe5nN<$%Xly@)Yv$l2{tzLUcYT)h@cj%XR+HF6FIg(f=kwfH*r^%{6%hR!S`(6(K literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA new file mode 100644 index 0000000000000000000000000000000000000000..f8c860238a7d08a9abb5795cf460878e9e5c86fc GIT binary patch literal 626 zcma)$O-{ow5Jtx-6-gKDVBJL)4N@fkWa5|&>KRzN*>%Gez_}6U;5M8AzKMfG3rMvz zo@D0f`Fs1I^$St)Ohig4y4yWIM8o6ZmL+XqRE63IiMj?)Y``19HrlQo z#^j=7>0NYfkKRYy@|b+InEO#|z1YMcw%MepGRC@&dp|&W&pt#A3t*lSOC)W?7bKUT zcfU+fRs6$JBL8=Gc|~%A*Jvvku#)S--*fs8 z0ToYsqSZSUS_4=3P+8fiQ=w64vzwi19;5ad=iHUlm<;8f1swssjcidMQd R7xR3|FXI3GgG8B+`U30*Z^{4w literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB new file mode 100644 index 0000000000000000000000000000000000000000..539014c75ca0e94696cf539f798059c0de11288e GIT binary patch literal 530 zcmaixJx;_h5QWE)tQ8b=+i$VOM#7T+;@C7uT!C_Mw>>>L$JvgnaRzwfjaDE)L>bLE z_I&gF^7c;pg=n}UBBc~`am}F4!Cp8nHphQMx_c-#LzEF14`_IM^av z<7=DPhT0MqVXh+pK>!LN02De}=K~neG575T7T&}euo-iaGT24hTj`U$eDrKxkRqH% zaTJ9z(L@oBW^0mAG76DakaHbHM!$zBfP~E)Jv2m!xON<}-1CP_mqli8_`tKaO8=ir z;3jtdSKQ?O#dVjy;QQ?F0%&-A!0$MbwlJf1QRibf2VBB0qoipWN$=fm@3E(7w_3Zp N+AW36`Qpz7L!WnAZUF!Q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC new file mode 100644 index 0000000000000000000000000000000000000000..0340ea64c9368c016d5aed6130555754fa949240 GIT binary patch literal 413 zcma)&I}XAy42B&fRK#OJNURJUV5pS1PMWeXa0JG*TTcP$EjR{OV`l>=rHIEuBqxgf z{r=-zt}r|Th%@je1T5COtwXY9T{Yg&rfN>Q4Kkg1i@$w=hEp>M+Ju((NL^|yo7EG8XZ1LDr>srtMMSeAuiEw!HKG2~1A zn&hcS4E@n6&i&>T#9!txIP5ulgRxZ7^GF%i0tQk>qsY(KRkPtZrQae-R0tvKJy zlkBvyH7T8oc>d z%WYN5Ly!lTo~ms$u<%>>xu336oM*VsaXrAbz$H|R%qtYB;z2q2v^i%t}V{c zmKsNmV;vj#@L`=t3rL9v_|;&*P^Jq-mcSH7Fa=lwWGpa_yx_*tz2yxMzSXV>LJAmH zkso8x4WqGmdGsk9No&8xdq5eq>RgeB0}qykKan)+0}J|wBMmQ=5YXgAEHR+QgrqnY zCmitSApzs?mPAd!@0m#e*uSe>13Bt{$7$R%V?YETn>|(6Ky-v3@~=iX$7MPO*x{p2rOJ6OfsEN4+Hf@K-)X_ zb34DYlL)`@;SHpR(n!CA_#EekR2Q0x5c)Gajq0M(p{B=Y$lmzYIJB?|EmVP4fqlc8 zlD!BrQw!srmL-tDjZl)Wo}oJW{1I>7s-v<5I7?qNTBxU2aBH@?9B)wW^sLU7x>%aa zrG;6hj!c=U<8rC-^oSM%&NMx5v}hQ1fi0G1{upOkZ_O0Aorxi8F;QE9XJ_5^9iy zMi)bxlN_*f9Htw?SNNAI%snXKER}rA1rpHH&WwK(G9BF#uV}{&P|H6XUG(#JeWc4p#+ZiS*JxObWrs6itsZf zn#Tbx43ZU7xAyPT*mhtv4t=~!rNhEubSs_qi55?s{A!M9FMU1fa(DSU^E7ryT)vkU4 D!V0~Y literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH new file mode 100644 index 0000000000000000000000000000000000000000..2c6bbd1f8da3f6c756abfe28153731783aa0cd38 GIT binary patch literal 323 zcma)&u?hk)42ILgBCd{(PC6X4xwf9SxVk&GZhZ<*-^f?<8T3yO5fQQQhcx;4llFQe zdm=IeAs9pR)o#cf)3MZZzbPfU575&R$KTAwYgFZX!bKfh0?}4-vrb?dY7x4fUA>ho$r!wrOL&&PnqTTz(=Q*dTXcU~fa@9(VwH?M^#KB^sq7?&10Tg*9Y2 z{c{xb4B0MjwrD9}tGEl#!%d-;wPWc?BM5m(BVw8weQ{3bzLIGTK$~sFGqgPY{R~-$ z8-#G|_~O%JE;&l)>@UdK%M%#h=|;+=Bot|#yiXyd7%M?%QVJ3hO!)8`)Afoc)K~1x z+V>SrO0_ICl7ePv0gXgKBUvhht}<+gcBj~}izys{^JCh99rz-1FH4i@=l?#11IHaW gcDi;1gGxBM*z+t)o2jPw*?6ylCMzhd5X(z^1JL}LlK=n! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ new file mode 100644 index 0000000000000000000000000000000000000000..a475b19afc8c41b8a9829a4d1ad79a7a97f179f7 GIT binary patch literal 516 zcmZvYF;2uV5Jkt4A|fp<&7J^?h_PeGV;Xu|N+(@T!Fq4R)i?nK{BhW5(Z5h zulf9<_JhcL6E(C|G4b-bp8xpI|qnKj)GXlmSGRUew<5oh_D72 zZlo8nu5I)LQ9K%2|v_aD#gMny>fEXnykrKP)0XlZ1y?M#Ow{((fpV zQL4@bBIwK?-F-hN%D;Y7{!FwaTtW!C^Ll4nci10KZ5OaGac=uLZ<`LO3&a^>g;*oF zn4az*ziWiDTo~)Bt_;}0?W>(Rc(rSR5nAO+3|1=am;>gxPj$z+I=rQp%G-uXEAS@( zW%tMZF|sl-t+iIVs*PqZdvA|30mMkan~FuUS?7y$6fp{1vp6laIN#@0-<40=pL<`-w7tYv}d zLT|3@+n>6Uq-FqkJ35s8`~g8Plt~FDG5j#e8GXJ-I}s<{#i4qryOPcewJr3vsE{Kl z(@M}n77D8`liZ<1Kj0X?E6HdxIZkvrS@3~NU>6JqJ{}k&kF;RPXaVoEN_&;t?Hd0tQy>!5)E?HJgE(Pfp`;Q=U>z|~M8)yxOdkj-1>9esah`+HF&zloz2yW-29-&ZJ_6XTpBC>yb)Mx#et9H0<1L}?Ui6>Cj%H(j@mpsbcVKN$FEt}9J&CWIA(j>S3vehe2FLU1{h~osM}g{ zE!i{Uan!FL+I$dIFGOUFp@-euYmzZchhvV?9*&>mNk_;nQb8mF5F>5k&P_RRn_X~O z+acL5PB|t)X|uOhH3rovVQ4FC**fV5NIj0akL}Qvjn3xCO7L^Sc!v8Cgqy&;oTF9r zJmz;Hq~3=J|JNcR^#7py0Ot;{HR@u`>%nAx5ogWue=~){Uzhshb`I WLnbJ%kS^#IcTL*hpNLagSU!J|#%urp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO new file mode 100644 index 0000000000000000000000000000000000000000..c4a80bded3448080ead9957c020e3025c76f0305 GIT binary patch literal 782 zcmcIiJx{|h5Iv`)EkdeTm=IEj42?u2f7@YUVrF1;v*lNS^N;vz`~xI-=M+IJ7>RT~ z`|jR*=lEXVsD36|)I=nNAeoHyT|ex{mpJ95v=8MF_|Q3yd)^uwdG99R&R|Q}3buxw z!cJ8ccMmcdnJf3Gk?={gC`U9R7C!O`w<$gNfEKu1+BpjK1?=d4 zg4RKmF1$dF#0Ng!pg&&z<9JH_iyBo=j|jh0B_+zmVd2UpZFab%o?3QxYN>A2w$Vrl zTF!r*>sFlhNLP(2xw^axr!J5xXion?-z4RRKcD#s8IF+~Jb=cZZf(Y64P1J~`eyF( z+tIo-yKM|g1Z^;6o&vl#;%Xd#3jUep8AXgVwj+Pv z%*c6prT&RXy%83r=xTd+Tbz!ym85gsAKGko`@?fQ0_cz%*e zjK~FYWi7C#kgVaban?E?pk6~w#pK$iVqIW2qtYyzbYo3ADH^80T7)-b^EJ+IAe(Ps zUIpe)K<0Qy@Igi+_4A4PF|ExVlg$0Ey{xv#D8r4`v8ycCK>srQY0?k2DY-w%|Q4KPff$={OK+T~Q7wiQjo51#h z3Ap79Ou@lGk;@EB1_nUoj8FoiQd9%z2jf~zREmK^#ZW=TNI}IIsEUz+1r%nC49o^9 Jh9F&F008gDLURBB literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST new file mode 100644 index 0000000000000000000000000000000000000000..63ffc4404b42c8197bd4d376f9aee36f8e12b339 GIT binary patch literal 338 zcmcIfF%H5o474k%Ztw+$BDDij;wDnf!psa?+O4mERwFh-di2$iQN_zt_*+cvQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV new file mode 100644 index 0000000000000000000000000000000000000000..95054b58ac376e29d25badc17ba0f926cb803e9e GIT binary patch literal 584 zcmbV}!A`?442GSKu?i#(2<|&nVmVZD({xF9*+U@hlJ?f8V96WtYMeR3?+nmZ?L;Lz zsr~u4-M)X&@{Oq26OmGiUV`arHxAR$rMTJeJP%XsnKdFdA&^fk_yV?qm9Tr52++ZR zaXlOdZmp~PF@^?ym~`|%abr7w78mU{MX3b36*dOv$H288CD|nrhe<13O4FFuc3X#r zcj0f|8RYmx0ebR`J&ry_kFgqA&x&RNlNIv#idMj+1{IIkIa3!a&v`(ZhXkoFJaWmC z{`YlWd_|9n*8`e-Qo)@2iCfUa2J^N_%VCqIW!0=JgOsA1fX^*dW{|wX+@5~CP|uf2 Rzi^oa*HsJTOj9a|z5&2WaQ6TJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX new file mode 100644 index 0000000000000000000000000000000000000000..9d1c0e242ca0cde34e2c12d2c658bc36bc9e0a0c GIT binary patch literal 698 zcmaiyO-{ow5QXics!|bW0EsSYq)7I7>^N*V1REqLyPg83H)6w)H~?pWH%^eC;>S|r zc=W#cdGYg`Sw9-HdNIaWYt3a(A&rNpe3bp&ZB1nw592`w?;WE3QDu0x%f10*u9ShA zD|Ka(QsXemP<_giLadN31vl1gRnC-hUjW}MaHyUpA=FCMN6tNRliz){ eYtDQK*sQ+J_wyBWI|J6dZ5(BoY-8N}FPfSPGKAyIC4qdMaexaSE_+#4R{a&H(eQ)e1$lSb87( z&AfTGKTo)P2h<64N@1Jqy^m9Vefv1p!cCNPtSoo5HElEJSB%#r;mKKIhQnCP{_(-m zk`1Jl4nMe5-h=1YJV1KI9TbFl%WbBCwJjAc%;rP`O%b#jHxl& zSc+&F2}Dn!VJ9PpP~TjVuq5t3w&$(?P(%0p0<6B!8AG_5ogh1G_q@5QT7sX$AykcZ lZ+E@h^mcq*PmZx{WSxb*I>P6yrE)-D(egM@xWeNZQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ new file mode 100644 index 0000000000000000000000000000000000000000..ce335be555c6cd04b58a67ab17db2bbc4758f052 GIT binary patch literal 455 zcma)&!41MN3`OlqKr2v3KpZ&GL!~s3hH_yDZnWH(0_aA}z(&jf-=ciJ8V`X-u_0F6z^4y(;b8@2dT&FeX7UuR#Tf5D_7yhhk8>(xwjN17SP} zLQJ8xna}Ke0dVL`mlmCr&xLV0sOaTD1zIJkH%cK4y?>@&(2BAmP8<;5u;c(AlG-cN zz<&rl-TJ@!zx7o8mvc;Pv&HWt3XBm_S3vPh$DA}9^`_ZmYVpX_FO3XdK&4#WMRB1@ Fn(n->NRR*k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TA new file mode 100644 index 0000000000000000000000000000000000000000..248ff7c0c84f2d8e26d703243faa9f341570847f GIT binary patch literal 245 zcmZ4UmVveWJp%&+BO@aNn?+1YwQ((o2gEEu3=&5YhKMk*SXf$Gf|M{Y{s#i6D4n=q iw;@>!b_SS$yM=)%#1ZH=B?cw~1F+)|1S12Z1p@%MAu)>p literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC new file mode 100644 index 0000000000000000000000000000000000000000..75da36f588701a135553662a4fcb4661e6649209 GIT binary patch literal 739 zcmah{J5EC}5VV7$NRd*|AW>0}A}%7W|27Q;SD<+LsUS2sX_;8Nmj z9m_s|7s&`G2uFtS7FsQV2FyAiz@>=`j&Ii0fkU&~TnEFx-yWI|144c{m&|!PCA%$1 zL&V;52pl7eqRge3=C&2p9MVw?)GP}TM8uQ}gsf2FpD4tSs9wbfhHRwrx9CJTCa59d zjz;5693_ZDkBS?O#=S8dCPFT!c+?8412G`k4-zME2tFV>$u!;RMzNPBq-}(K)l9Z? zblp1{ccI^;kG+wqQMC%Dk z`Y!1?1QduyD%4$~h|ylE5WQWVkG(goV~Sngl+_HGC9Ovd|gLS3K3d>5DRmbv`M{Vi%nC9{V{ftt+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG new file mode 100644 index 0000000000000000000000000000000000000000..23c0f80878fc1056bc983b125e86ca3c540d650b GIT binary patch literal 379 zcmcJLI}XAy42Er_N);Rdh7K9pp;GF+2n!<@U<=te0VAY0;#jPl0h~~w4y;)6Bep*O zN$yXmt^jxe4v4S}ijNd;0d>7Y$a#v~goH=XMkG#M<0 zP!rKWN*l)4OuHa^+WMG07s~cNX2Q-1FNY72SKy0n+V!tvdE`u~=$7ymhsE*0od+zW g%#&gWo0cz6WA`(`N(_ylMyN(;1`w+9wG++h4Py09UH||9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH new file mode 100644 index 0000000000000000000000000000000000000000..d8f9f301a652d68edf8df4093a01da589dadbf83 GIT binary patch literal 643 zcmZXR%}#|d5QST=KS1KfMBUy6iT5U#WZFUtZcJSH0PYGqp2Az+$XD|j^bAx)Y%=uk zoNuPX$EUb_7a~CjDW!NkJUgF({r+?Fjh=B1L3~9C3qS zh#)YOC-w#14Z(nfWyQcg)R=4^oHwQGnQ9p(5e&m3)k>SHwhkz5-3%)muzVFQ^%(fL z3f3!z`BjM###I59H4)Z;cE3ChRq-2_^a;ev8>GnjayG)2sg`J6C@aCv`8=wolP?Tj zOs^60cMGlc)S!*%VZ8q-&_;yg7OYKww_E0PyOAVsuQ+)T*F@+`+ruMi{;+ZFHWaest`;eScgDC>0Ej0gJSMdd=7^! zgZ76kydr+k4qN{<&G&xdlznrzm{alcjDPY)Wv`W>s(;rir$SfJ?KWSq#K72@S<+Rl zH?`T+7L0;QYc*BqJge@QWalH7XYP+g(6w8xJO%4wR%Rz~k51>Z8-62r6wBj~iz8y4 N7@tdvaboVi{Q?xekD&kn literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK new file mode 100644 index 0000000000000000000000000000000000000000..f6092ebf3de4ec441bf761262fc7d1b7a3399ef8 GIT binary patch literal 299 zcmZ4UmVvd3fq_wp0Z1@1GVn$l>6)0w#-vmm>zLI71zDh&6-cuIF*^{0lrl(Y*jpKa zRL9mt8=C-iXaY4E>6n5vfdL}}i?N}BA;?g3usTe6b0bRwMv!90|3CoMMJp}?noVGP Y!35lL2Br{i1_q{03`_*%Q#wdDCsn1t8%>T#5s52Kep3Dm+?7 z8e22|e*fd-<&D}$qUxH6gb;Mm?QWCNJnj$EVATHb#B)AEZjc$G2QUU{!8pJ-qnd24 z?c`IhUC>jdv2|*iUoew-j%y147 zf1mM-VqUmBGl_S^=gEJStt=2YF^5!J6$N7D;x;&a|agcM7Tnyxy$*UswC zjZUT6N~@*Q(gPP%87t_di(6?F8kbq-iu%V5zojjHS{T>rvy~~&irV5143lHP?}2B1EdgLEniOMk28 zJ`C``k7!j*7yT7e2I}h=e@_>2k6HZ?b*w)OWHwM!b3x2k`^T|9-a=fh>UQ&^)!QqO jFIq8crG}x$Jw~=ur^($CHLdJgyK5b2c;uhInq^2=cidT7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO new file mode 100644 index 0000000000000000000000000000000000000000..5a0b0a8f6a513a920ea02d891ff889aa2299d154 GIT binary patch literal 603 zcmaKqO-{rx427MdYQzSP0E<~nB`T$E+%{}D01G6$>yPIo2d0)^bX{S8z=Y5GWHuE0upLi8OKgmlT+QU?aa)-Qgoh~RYmRYx15FMvPjS8rUesJNC!yaNOD|x)O*UP2H-VqmYe9Nz(-V48nzs7HXH~Wz$ zEfP}CtTeGTo;UA#W}KhDX!)J!72#7#k#@WNL+DGy!n|eMm(AU$WNRPuZok`?&KQle zwg*5^=dcUd8`xWzq@f?cSiy0VlMT5f8?kXAV(Yy4WEa}OnRRIn!Q!{B4u|j-NHan^ ztBV^V$72a?yabHrPPp_zo`M*WMv5*h+s66O#t!oCePE<9%q8${F96pUFRsMCZgb&e z2GwnLB{dFLFFtYYyIi{DKr)x$n8TZy1RU!q>C6y^9ag(-dVN_}& z&71{Eu7Hdwb~&EZ{g@Q}m{`S2>Nh^wNE>c_Cta|d*yiE_k2jS=*jyR}p*oTTkX7`f z<|jdLPdpOj+5WWv^ZljBE9YdEoD7Q4$)I3!4mZOF-;vzmRM8Fe;h#z`YNulmEkH~?pWH{(`%S^6WN%Ui?oSKoED{>2VT$q_KFd+{n-3)3AD(9?qK7hD& zV&?9oep-N{fQZLw2{IBm5ETK=P%cz>nMIEX5Iv%}r(Wf)XWmEf7Gp#oap}g8_Y?xf zNGVayRElm+&O4@a4Jcv@7_`Tf3-sT?)<3flKW9ntUl{zsZhu5J+G7G5xIFe#9E=>q zLZa{?!UOr%T0CJuE|>W}u=@_cfMb4uPEG4w>J*x)aBzz|XpA$3s&#jbqH8!$iaPn) zU1Di)i90LT!}I-M$Nsk~UNz#vm)}eF=@v~&wqChJ*x^egunX+X;eg1XR>oSq27cV{ YyV?9ZprLw4c2H|D>@1`E00fcY8>?fuFaQ7m literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV new file mode 100644 index 0000000000000000000000000000000000000000..47f5bcb8670b588cf267e4d97a5381aca3cec85f GIT binary patch literal 410 zcmcJKu?@m75Jmqva%d0@3s9s;3M9t~icG^2h$f-S6p#$T9uzFb4Dc@?lptD8`o6RL z^lV@6uqQw+;39%$y4(7$YTBmlg3FrrT=qPQ7|X=Wj8PbKUpv1JM?!@{!YIVSdYAj+ z?W<~+6B_#rsgFw#2gOSjKprd|2H$_S-|8Q?!R!x!xxqL$yhfJ@iIne0OBw(G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW new file mode 100644 index 0000000000000000000000000000000000000000..10970e4122f2cf871752a7347a6a923ddc661d22 GIT binary patch literal 1375 zcmah}NsbgT5VU7u77idZEH_4?k=jz1ccmom=2T$GR4ICKPk9ZS5;0+L&wM=&p z5~a#^mn$P9a&i6qtt<|qH%2rVb zI2JA`N1sR@9Jl`jwzOVpbw$*Z^C2dT(R)Po)>>9hC>|CWA3q|(1lNG`)G)Nn$PDP4 zY~c;5aExQi79~V$;do4lR}&7Xcf>;knGV^>gb*|N1;=x`u#t5$PU!#O;y;*wbx{gX ziBSjo$|F;kY(H^fSVX3D6TQsPEq#F8mRNRP=+~p6)iv-_oibA>z0dz5aPmG%64NQ$ z*AbSCMcp1$0v$$ECttrQb^2YsoQ@Z!jQigg1F*KR54= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ new file mode 100644 index 0000000000000000000000000000000000000000..670561c94fc161abc8b25ba972b01e5694deb4e8 GIT binary patch literal 612 zcmZvY!A^uQ5Qe9^n{{L2!NhnlF?-;!97v|6l;Xvg@MPh}Q@HR(zM9Xl{?mf6DoGj2 z{Qoz9`}sxN52C9;L`o@oJifjJQx(2z`@!m=;k@ln^(bwuJ(dXR)&vtpsh57!-WXHb z%GDl{C!k!=MOhV1H`IZ3iH{%LY;i^>k5D}ameD6C6K9EMP8vvd4bOq*cC%{VdrY-F zIE;(4Ep=$bQ)eY8y4$@!nf e*u`?U!q>oWBR;ZKg>n&NVxs(s;p&AcHllAff@}-` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA new file mode 100644 index 0000000000000000000000000000000000000000..72e05da79778955661cd196deac0362ca9b18fd4 GIT binary patch literal 998 zcmb7DOHRWu5FPgelttNq*s`buk*IL|OAHId30QSyyg=d<;BX?Y#1S|HyqVBK09C@$ zB(Y}Rn>U}lywUWLX#7eF6FcB;2XhauzlDVHihlLc7dYPv+GNn z>SddYOSR><$F<2Nq}n(ia|OzVc@&I!1{{iJwyuqJJ~W`aXre}Z=nC`3;x%||VA=+> z)`K|W;}2T!&%FMkI%u^PVc_%UffdL>7(9I(G9E;P87t-f2!qE+94jaFj`PVdyegWv zEXp^+BB|EJvZ^+&Rc+;w27OB-!9xU%RyR;mXr#5Gv3|x=X#nxyGohn1lxw?c_@cc< zeX=ko3yYu;UGZ#kGBHb=rAsnCX*A}C!N~+2`fNDHhZ201jLUR81bYEC{oJ?U)|s5- zaG^3uV_#zCIue~3Z;~Vtx SaGY{G|BavUAG`sfb2uL-1<&jN literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG new file mode 100644 index 0000000000000000000000000000000000000000..84eb43935a1c1387aac508a72481f53153fa8281 GIT binary patch literal 669 zcmbVJJ5Izf5FKwetRev|B@`((MWpdRp`qjiR9<&ma{zE|!7;cRXMi^etTu=WE91nI z_vXFvynj&rLbQ1!BBd1F4$Oz+YnaOZ;Xau$b4k|4d^mPU$4Ov_22mku#06ppGCdmx z36F7HET<4NNF^Y{oVYhxvfR7eNijQX%$&qpB#KGCAAw35pyFq22}w(~6C(hDCu}cP zWUXu{YOFTa`49&<8lp*V$kLIYN|csZyM9=-Si>R2IOH-y%lZK_z=ogN=(UMw^{#L` z@Mguv$$)^6Utkcu98Z{4p^^1BMr^B3Ecux4^S{U6g468j_Ow5wFbX7R2eq3#pV=M+-f9eG-e>^aE?}VlT4KPIb3u|&gYWk+^xB0 P;l?$0E7Lsz#Td~SVj6@) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US new file mode 100644 index 0000000000000000000000000000000000000000..65e034d428d6214b5425c35073b239f7bb8dff6e GIT binary patch literal 2128 zcmeHIOO6vU6m(}84T=O33l{8<$RfRH$)D#>vw=GxR;G8{0STNla1k!W0XPFxJ@Zf`6@bSxhXaPey@CClxb-Y2?=Ij2= zYoDe1yfjQD`!<&_B3ClfM@{4#kFTw63K7fARZH~ds|{0RWDC_v#3>Y9}v=Q>iY2T*OLHJQqZPY)n9sj^yP?D>BPh@KPKv z7(vR1m`SXFlOljpEFDPz6fY>DR3vyyHjaA&#c65WA+bUb0}OX6*g*-U3!#)6l}g-> zU=W5_h-Y1>Pw`MPC%F)8qFiIkE1D#7aeAgyUHI5lVpTv3T3sb2iXM0t$_*n_S8ioR zONxaf#0W6QX9ZJ12-da2K8d;#kVWzo3s}t^C-k=`$EW!!m-1zifFcAM0tdQs3P<55 zR>^kLR@ELwdupHF3})*gQjFI5@X)LO+N){;4-NbO8`iwi`v(6AO{B%xQffK3QZ5@F z9ltFW*H&W61@`@9w)Wy$FbeCpQF>E;;=>8t+t=DA(hs~C44BH5R zWx0leBCT|e*FbP#Yqj=auZK)fBWrrr<#0S08ChVAS{7`y^I-iyM-UWNQg+r$3x##X z2i2$K1AupEJC<@ze9mRm=-k!2dX3@mN{WrZh6E|ZZR!hdMoK}V;zWDS zuK##I84*IhMAB7)rqb)4F;{nTeWA!}#!0@DwLRZ!LzLS_+5unOhBKZI0(4Qek2;d| U(_Z`}f9qN7qr{0B49Px3U!XUSt^fc4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ new file mode 100644 index 0000000000000000000000000000000000000000..e7f52e54b53945342d912b93511798e5e6445b29 GIT binary patch literal 1617 zcmcJPJ#y4Q6oe%kigJ+?5jfZY1*)2VNmNk;oPmT{WqS%3--vr~6Ee;KU%%0=eF3)C zD{J(A`gQly&p*TK@5AtF;4_Zn@b1IskHNJVTg~&fpD)w-@?&|@Q~n+lrnpap<$S)J zFRk#eS5|1T`jGaPs-L-JE-^3b-b$KUxQ4hnFH~;HPc2^$iK4yVbE9LKpPl_}NvRCXTId*+|5`j~qaU)Emc*4)Qy_YRH%z)ZA^f4k#^Irq&1L699LM`##PY2n z@20?7o!HyzL79@{(=*{J&Gba9;D)C?ie$m#W|HFS^Oq zyaevP*f5*G1Y?zg#L44kX4AblS*dn7>BV5|uXvQsb01GW+8fx7PF2Pm3)vNCiB4vmH-f@$7$Pnn`ldIxiL{KrfMgkFYnvinl264T|GWI2MK>xhm;M=TRUvCQ> zv)dP&YKe|Ll1*XP$L|fkGuRxqfGuHMj+VM@6DKsQmLUc%L8NFd;ij?91AegCtP=}_ zDw~^O9XL+~I~8Qk3e$#|z}-g;!F)~&jwRa@!?l?MGmBae6p(iYVqm3UVuIW7fwOj9 zaq!S8tg;skyM0}}{Hc*0aR@Ll=SrKcYrA?#VI#sADTxCQ(t;~gXBp=`6FDi3avtMQ zQ>Ft!*@W)$Ib0mUJC?!6C`o1|75_KOgd-4e^67Ex(vx9=+)(dN9aY#N^@E2O*yGpe v@{n(NHX=3gMZ!K;9Pfdmg|%krwKjsw>n}(3_JTi8RB6pSXOE(ZTnY6Hv0izz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC new file mode 100644 index 0000000000000000000000000000000000000000..1b04808283669f5c8697c2ff8e2445b88eab71ca GIT binary patch literal 802 zcmah{OHKnZ3{9x2N|mavyQYg~Q7Qiq3s`UmB$UpsrvP&!F2w;j13V`)RE&yQ1@9@l?Q9%O9tD$aja*CZogP!)X3)}_oFnfE{LooSl(VW9t$|vc zsDax$YYj>vrVLseNOd&|_9?3M^o7M2R`4TORtOtV&+=8>D>a4q(X5b^HEeg)Wo1Ch z^LXdMk}QCpXK?{hqt{k;let!))>TM`l3`H0tH)qR<#4phJ+}&4z^GEy@HQxZUzMwN5YuT&p z&dko{c%GB7`E)L6idprjhJ}H+-I{lx(F~-))uxQe zPJW2FBCSg^ zGrP0nd;L($qf(1^rIglM-EJT5eU4lykNd;^z{Og#Kb(daA>dl~eFeI*po+j3o^~!Z z(r9=XB4>Od&k0BwjTDJeM3xj{WioD!UK&ZhcZ!ThH*JBH2JjR`%fojSD%J5VeV-NRbdVH7Vj^CI7}B8fq>;<7}5xgvk-;I0l#E0Gt8dc(WiPpvTg# z?eQD?&3p6mrj`e#7Eekkt+l#tRL0%@u^xGQcN-#CYb^HpC;)ux)4T#)J%?xk^Y{Q_ zXW2KKhB9(&v5uUx;UM>Tj?r)wZ1Vxfk#h@iIOhal+cmv}1m%2}~=~38C%}#4G zSt|*-oa5m#u;>dP#kH@b?zC-Aq9>Y$t2}IJdJstip%1DtleJ7<`lO@X%nO!xYEa2H z=OvfJ++}~uMZXGhrpxzj?=7W2W$UMBkc)?VM6_C1=P+scU2RWw!ZfpCr_~bOxxqXS H;1N+D36s*q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN new file mode 100644 index 0000000000000000000000000000000000000000..33692697f96d4407625286e60b9ea6cde978eba0 GIT binary patch literal 1328 zcmd^9%TB{E5L_2ZTaXYJZU`!r1C?6IuQ)ar{(uwe#pK3Ufb&QE8s7l3j#HW<4xEX! z-E}=XGrOt!{z21MqGQ4%grId)x_y3m3tfuJ)SJKu&j-g zpi`}+(#F=Vf#eeuYlMy(?5Pf`a zqoBEKbRMwW4zBTaPrAKdtEt=(6@8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU new file mode 100644 index 0000000000000000000000000000000000000000..151e425973ddbdc39a5dba862a72d0050a07723a GIT binary patch literal 471 zcmaKpO-{o=423uvuy}x12pVTq8-Xn9jX*ba8CoVnNwR>87oEf?~-r521wH*7X~e+1zT;|ishV*fWROk3l@9{;zhxQ!~8i42rD)oo3QG9 zoyspgeqd;|sc}p}yOBo50PlF9ueyPU$ZZ!MtYT78ZSuXrOlFZ(k<1B3KWBBBRy9-B U49ti44;$t^Et1+Xg<(<`Z@Au69{>OV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS new file mode 100644 index 0000000000000000000000000000000000000000..0efa97a1c12f868ef48ee6ccf2a0dd0cddbc83ae GIT binary patch literal 497 zcmb_ZK~BRk5L~BCQz3--01}5BYKcgRUE3*_K7s>>kQ=X{_K(WHxbOy;*$9LXM=Z@| z?aa)s*XMVsUqsBCAQ&Tdcf6lm7w0@aJ)c6ci2IVKG|tE(vZz@o5Uhb3*Z>W10nkQn z;xu#zDtyU{W0-U77dLP!;7ch+YUc*$A#6cT(E8AgXn|7Sr8yte%2KbDssFBMq)F88 z101$v-z%A&0PGFP2FEO+yALcTN)Yoe+uvS)*h}^JfUCcX>9sn;N}8Qs%1YG^I52XF q`Ey!2LUOLj@WtxqE)^?vJKVNT*=s%sSy%k+78c&^C&wfbmh}m!7G9|U literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK new file mode 100644 index 0000000000000000000000000000000000000000..eb7e6292d323781c7cddd61e1756c787677b9ce6 GIT binary patch literal 593 zcmbV}%}#_c6oqdQ5_F7-3-_~N0SROJ159z_*2EVuf!XmC+Qt|1)qDm$_d-y~tZZ_C zmhYU?v>%_8y%Hr)M5L6W(vH*HvGy@I`7kDi^6{Y=r*R5{?@wA+_|Zo28I(hp&=s_U zt|3mMd*{J*wb2q_*&AG6Axv{X-Ni7NLw}OAN^I<;+wLZ%vL z1p}3PEsf77k`OdcgK&nS7PL~Gz`c`%vMO^Fk6vEo-7 zE6NJ9FRW}T+%(3_mB9Gd`&(eRT%Fb2mviC z&Dvg#J=W~|iLTy=_)NH%>0$l+WRvXn&2E2?oTA;xfV9gX%z!zt0G0p)*Jz^`>7yBm zAt#G=G$f3Q)(z2Zx_(GLI^QA&)EZlTA5s^6DJ8mqT4h_+s(??eqQf+|&WE-W2;N9E z)=RIeiPDv#DZhE s4J~TBs@wmG7(cAP4?T1XGM3sWT;2Hk+ zGv{x5`Xn-6gkTKW$l1-yF`RUNculN%UM%w1^GQ^k#iyg3ngDBu)ugnaBtyc52QRVe z7&NqVRhbtpF;#9xz6tv7T#E@Lh;E0*{nZye;Ms^LRY{NK;KX+&)k6UBia?yurDJ-NNo*oGCs( zefmf+ZLO}(YEspcPEl!q*r~#0iaw;V5=z*Ji^V16vAW}_`eLjLa4UpIt|(z#0he2& z4O!{pbiBG8WpOsT;@BA(2p>9BUuEZT{i#6Yj)P5xvjyN za+?{XYSB<;oTGS`urG+W_{wK-cz3S;71#JzgI0ab<1Pim)UgWiZD7k)@V4 zdyAZH%X!?{i)rr~_*`Q-UL;*%R7;_j(OG@_ihpUN$K=in4Q&$VS#$7zb7WfLK^9&9 E0jzJ}{{R30 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM new file mode 100644 index 0000000000000000000000000000000000000000..52e4c4a5be5a556d5125a63dfdf726bb5ac147ef GIT binary patch literal 585 zcmcJMO-{ow5QS&brqmK*$AT4IWYH{;{DbY7O}PLU!1b=DfaFG8jWfWr>r`Ze*kCCc zdFFfX#qq}{wQoetGZ8T}-49Y8Pw#FT_lGB~#%O&=$J6LckG7vOhDX%8frzfPit1qi z1|0@@WoW}Bv{KqUTIa#t!7|#Aq6Iv9l#nj2RV9M8X9Wb?`D4nkxC*rDJU96Zt4wp? zFI%Q7XXX=BfpF$eUga=9yi3wDj+)mO#ILE55;)gahE{a5N3fatTBz;RuG1JXwfJ!% pW$bnd&Fr?YyUrAR9rciyRzVb0txnEE-_VL=xmWnCq%u%K8x!s&MySKId*-y4h<7`GS)j0=oQ zKszh|<}vVw$EUtn{Im$)wiEMs9X`^Wk84l1Z;Mpc9(=D+m8b^)IBO7le8O6s?S&f- zkUR9l%DD8<(odu%6|K4^4uOb<6pz;SfE~PEf_hz`v;Jr8<@ zAKJ%JRLcucK$sPIKz)Ycvz+#dOl1o6g1Q!+DNh8LMx;H_6>`+WmW?KP?Z^XMjX2;8 zMWIJp+VB$}$pu*kIL<<$L;@^?tQwkB$_^Ro#5YorsWxGdjF`MAs*y{D($AGdgI9VK2d9ouPu{3TE<^3Q zI!8rrndv_~oT%ZiEGP3zWrBS30&++XuE*F@>ZLHkJe=(qd0Aldw&t1#%&+_V(m%A( z1TOx0wtx8Z4;a2S2j_4$Z9nvOYks^R#nlgpW6jl_e{&}a<#+PKwU~IHm|Wad7DO*f zbC`Bt28)|;6-qC-vQ5HDBCy~gfCC;DGFZP_ZcpaI-FbNU3100P0C~VQG&c(1&0SCo zmvp&ne19fQ*)y<*>OL2fquNHN`y_TSze+^%2h)_0&84~ER)+;Z8EOVx5<$#w8voXc zqTYM(q(NGcgGICfM0^B6v()=VKHcKo)nu;j5wt~2FB!uI4%dpS=V4D}59ZZb%$t08 zmZ*byAXv|i!RF`LFL8@lGqfvq$x${hT^4KRZ$$9G&e^Y)4vN+E}i%W zTQCJ-S$ZI6dln0E6miF^89w11!9CCLWPXrEJ;Dabf_AX+SmWKY5{e c1LJ=nfQjQ*Pl{n^W}|T#7?>QL5tgE`0JiKNApigX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AD new file mode 100644 index 0000000000000000000000000000000000000000..614e70c775d69f0db6fb213c11a87342b28978e3 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNt6@w^ObUnt#LPep0zh#NL&InTBQuLwhzLlY+0f7cq>6#@ aKM=sg@u?=>AT)E)xC{(TjxGobQCI-JZydM) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AE new file mode 100644 index 0000000000000000000000000000000000000000..e9968bba15eb506a5d12ac42a692131eb08cb457 GIT binary patch literal 255 zcmZ4UmVveWCj$cmBO@aNPqd+lWo%4JwULf-El`XJh?#+y1&BcasD#_l(5S}JGTL0% zG8QBP#2^(w1~X6w#ARUo4+J0v1Q65&GFBL5tci(fw4qrnlJQ^@uo{hK6VM1&p!S#) Ypbn4}*u{(tEI=^>pg$a4A#TAS0m|VbKL7v# literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AF new file mode 100644 index 0000000000000000000000000000000000000000..0bc1491690bf4e4563d50767f7173469b7448c5d GIT binary patch literal 287 zcmZ4UmVvd3fq_ws0Z1@1G6+Q*n#9JW#H480Tg9YQ8`Wys17(Gy!ffxjU3V98I zDh#3xjACmHEj2-6Knzj?WH1{V7=XA8jQ@cE#DD-Iw1JEkMlrg^!~h84Mqo1>sD~Y> e2IOp@I*`p^hcYs-g7g{?kOq3s(G6xk8VvxVRwJPR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AG new file mode 100644 index 0000000000000000000000000000000000000000..0cb86c9099cdfeea84aab1c048b6a4e9640ff056 GIT binary patch literal 237 zcmZ4UmVveWIRgU&BO@aNN3@}3Y)nc_3WyKH%s>nRKq+2J4SOp?!x{^V8cRz}h%iVI zv!$USNGSv3e;|N~gSBu$wP2_RnI~vyZdQZKOrRW^nLr)PKv9_a5FS=R1_mZacbGaf F8UWZ!9Jc@f literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AI new file mode 100644 index 0000000000000000000000000000000000000000..0b4d4fee130f01bd3222480fd5538009b8242e81 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNN3@}3Y)nc_3WyKH%s>nRKq)Ru4SOp?!x{?^cdgKNbI|7clwb6lJ*)SK|yY;{<-X(s=EC%#5!$ zssBX6MR0^5tE}C4Je}>cV`%|YbFPt>00Wa7{rLGN%=_FZmX4?BmbYKS=!rDmYQ*dt zK#sB-q*67kFFUBTMHW4BOOU#25WG`iT@-BQBvk-Ng$rpo^!v2Y!wQz2@1}QEw-lrA zCSN_|d^cpZG5RE3CbOn?fOm)(j8mjU5oo9<;f|P!tXg6Xcp0$-AMcuUCPwf1=lNe1 MnkeoMh35b904f4FHUIzs literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AM new file mode 100644 index 0000000000000000000000000000000000000000..cbecebe4fa44c2af7f86decabdf58bd328bc6213 GIT binary patch literal 276 zcmZ4UmVvd3fq{{m0Z1@1GVnwjnpnifq*NQ}nA8Hrn4y>jNV5Vl2mqC_8yZ9#>Key_ zct8wN1!OQA8W@7O42=JQ0K|X*yc$5piD}qd8P-?;jWmzdj7f<}sWCACLb!gA$p&a9 igA4_#0jUP614)A2$H>46(rZ9Knt_4I(HCYu8Vvxg*B|o$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AO new file mode 100644 index 0000000000000000000000000000000000000000..9565c322368522c9ef21d291782ab0ecd027f738 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InzW7AlO07#nI(9j5^h=K7x Z5WvLoC??t%G*i*I3=B+;{s`+(SO8Dt93cPz literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AR new file mode 100644 index 0000000000000000000000000000000000000000..a056cd23739ceb9f777aa27d611e8843303f588b GIT binary patch literal 385 zcmZ{g%?-jZ427NkhyxO=K_x2LO{z9rDpugy_SPW~gpF8@8Q?iBCyJ%mk@Ni7&hth2 zjmTUH&KTPDEVlLIFx}``m2~N7)b3`?W9Ww_xbSLh)v~}5xL3*xSJ%$P#1lv0# z9eg_mUj#3LQpJ6dWGE4DBJmB=%WP<{6_5plxlUC&25M4a))Bh(5z7A~Sld*g_13lv xHFjH@0{9Jt!!%5>CsEwpP>w7!p7+=tJjD%D5oNlUe%T_;@XXlue2Hy--3I^`I_&@e literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AS new file mode 100644 index 0000000000000000000000000000000000000000..b25ab705de64c105de775f4f0686c959d5ae1343 GIT binary patch literal 252 zcmZ4UmVveW8v_FaBO@b&P_&6(7~%#D5&%uZAvFL1 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AT new file mode 100644 index 0000000000000000000000000000000000000000..ffce32def9ba45d51bbc20c21d1c8861f1fbe76f GIT binary patch literal 433 zcmZutK~6*=3^Q|(@8e>wHfPXRzOzxAP)PgU>no?T zTaM28Plx2ayQ?g@^fun*Y5hR)8fW)&FSu`TEPxe$e0gS3sU)#w@Z`VjOtox?OGB*reOS>RVZj?Elj2IKK4L1(&AskF!3Nl*fldv9m+;- h18dL4FI@Biz7?8ZGxeOauZ8e}Dq+yo>)V9?P2Z`DNHPEb literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AU new file mode 100644 index 0000000000000000000000000000000000000000..e64990eaef9f1e10af8926f2bad8ca3a4ffb9ae1 GIT binary patch literal 551 zcmZuuOHRWu6tvs4zyib;7F`pmk^FbU25|^hPIfs3yezp5SK|)MgtP>ymPV2NX5M=< z`TAD7ccnH5rIglM-4@fhJoMv-JLU46Kyxt0h<$o_Hc6}#7u&Xt z5@SEslD!9s4NgrcR$6T#g7$$r2lyZ%rdm3T4#zarU~%5Xxms1$`M^$G;O^f7RBC_& zmq8?bu1Q?hh?A~_G}OWcj19#$evslk{0p9f(8HXCpCq* i*Aj7MV`RoR_7o~=?8r{%f2h^ocF4v+|N4f?rSk*7u~9bw literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_AW new file mode 100644 index 0000000000000000000000000000000000000000..960a9b259095c91ce523b1491e42ddceef3fad1e GIT binary patch literal 231 zcmZ4UmVveWAp-*gBO@aNN3@}3Y)nc_3WyKH%s>nRKq+=Z1A`h%LqmuFNSYZa0#d}l z_#X&h;&>E;j1e)^u(tx5WN1-iZl(z|Fxt>K7N!@gnLtg((T3`#DS|*)TpdrqL@1s6_#0nl6nL3$iRTD z%_=0MLqvFpK*kSwJa!lpjE`yN!8S3m(>k$Kf~ml*vfP6+!^SOAK^ BA6WnZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BD new file mode 100644 index 0000000000000000000000000000000000000000..2d91d8a2e3647caa1b21b25f2482958a6a1ae35e GIT binary patch literal 436 zcmZ{gK~BUl3`J9Bx&)5EmP%BLlO~<883}QVG`pSx%o#WcT#Ylp^GsniSaKcP|NFcC z{Br$^bKQsI({=8;N}5Ys*4OYby;0n4z9;s$8Ms^V)sG=Jtx{SkR>cj?V<+BQ>bh^t z9%qAib0+@Jv+3`0e|+>f8ZnoqsmeGtoyiFYlP+ygsgg(9!Jrap1zL$tq$10D)Li43 zDWn=e61@bS4_Qkp)3&_+$|bLPSz$+=Yy)M)Ff8le{+IrYeeZ052UO*0&Y$r`xE-NAN3U6-vie2xI_yKR?4KPl-5(g|fjUA6Y z<9>dJ`*R3)&mn|i7{ZJ4xU}QxczQj&ZO28f@emKF*loVY_W|w(P-Ya9(wL@kZpKPd zmSz=M7OOSd%qg0OTx^cV(G1y4#?<@OloY#EaSUcsyTuoNOm^ET(w8Y6WXPZ2)G&P%)ah77s z6s`0$m)a~9E6N2J7p+tq_#)3L75g+1OUVjAGizE_B`ySuFzyS3E^|g)h%8T$dIZ6_ wEmr5acryf~xwfve%j(PXaQK1syf5W%ID|(aw`u+azb#FO2*3aR!!iHZFSUVcE&u=k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BF new file mode 100644 index 0000000000000000000000000000000000000000..73cbb89a45eff75fd6ff327dec9406867835b06f GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYn4T%gaK+`*bL2>=y^Ed&4n literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BH new file mode 100644 index 0000000000000000000000000000000000000000..4c048fb12f85e94fea7085b10fa4ae5cb3a65f06 GIT binary patch literal 386 zcmZ{gF%H5o3`G;Fvali~Za_D?G$m$1Vq)M1X|`ShaBsxbI0O8o6(AuZIYa#X|99>W zQ(ld+7lX@Mvkb&uV%K;5=CJSjTRl_<^k%36Rie@Xx&}aj+g()870~UVfhCHJ2q06i z2+)NDZah@Mq+wJRvZfR!qC5a@{+>@r@|!f0-66$LCdF6BKUs(9yIp7?~P7M--;enZAZBd_Ke^bK069eBxP=6&*bs`aRp z?i3EK)jpA{WA2BWJvDa>3!ns6fD|}8qGTJN*%8SE5C)o($jVdc7fPB>LA3dbFjxr0 z($VqUQ9p2-EaKTEQ`^?%N;25X(y;d&eXKYn8*<=i%+Ftv%_14Lhd(uxVUo@N01~)c Ugm{8$CARauCrpaVbxK>@Z;a?I82|tP literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BJ new file mode 100644 index 0000000000000000000000000000000000000000..cc5edf442b02f2ad5d74777392e116029331d845 GIT binary patch literal 317 zcmZvYK?=e!5JeNKpm+@z3KlZcCav8FF1^CEyPiVhjl7y?&_A)=gbw_H8UFki^8T33 z!x&o|G;7UXs2Te4$>-{Y)e0)0HKYZ{fsWUXgzHeYL#!mA2XSFI#YU>q z#5SFNQS&|}?P!kCWJpQViIO@cIUm)fEEdPe2a`C#y*P{s9@~rZ-2&hFjF0FoO<_5i OU1r7~-0u3Wh57+|Rx@D$ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BL new file mode 100644 index 0000000000000000000000000000000000000000..8a9eeb543c405761880012beb0052c71f10e4c88 GIT binary patch literal 317 zcmZ{eJr2S!427LiSeO~O0U0Xgr<8=H5;HeQy5$s5Zp76%13V|83nJ2U68qVopD$Y9 zh(u2aLeM^FJH>Pu&oR~OZXR-!BMd93fm&z-@j=f{yV;^csaXfr4bD$8Ce+yb^^>4R zJGi$tn11kpWRHM{=b_$OqZB`RD9kxoCX{Z@9~T%nRKq)Ru4SOp?!x{?(4;!;o7hnh-N;>XrLC5n}OOu Wl3-UdGO&V-G5|W>$scAO8Vvvr-5~z} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BQ new file mode 100644 index 0000000000000000000000000000000000000000..e33f379a9dc253e3402b49cde6bdb6d7072c38ff GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@}3Y)nc_3WyKH%s>nRKq+=ZL!%l?LqmuFNSYZa0#d}l v_#X&h;&>E;jNvoXu(tx5WNxNO&@`ZOW1FCF>Nf#orDH8m%3Yqmlik+a&S`{Cz!P{f)Uq*L@!wYh%U#u z?i)af6M9uxEeNEh-tzWdxdKuJTa~Pq8m;CvuUj;a3H~Z_7l0Ba@NyZDlzokcAaOby1R&}~tZIol;`M!~ zFuoWHP2ndKL@s(ffs@K-DSar0l!C;2&g>MVRDUe?0v`lQ?rz2mgj^zuT*b>Ue4u0o t3b>+qjG&(VHA4@S25i%c>9kY@*q2Vw22L;P1KSrytFt`(e!7Id*f;lpns@*J literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BS new file mode 100644 index 0000000000000000000000000000000000000000..ed383266f43a14f06aea99a05d501f44f38734c7 GIT binary patch literal 214 zcmZ4UmVveW0s{jBBO@aNt7S||ObUnt#LPep0zh$IOAUJ~!)Qax*cuB9O^7f^5woSC nAxJ3$<9{H4iG#JUS%THW#2{)(Gz-mWG%f=JlT$Fvd^8#WUtb?h literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BT new file mode 100644 index 0000000000000000000000000000000000000000..47a4c6c19a18cf055c63a6f52905b95c3fcbe5aa GIT binary patch literal 250 zcmZ4UmVveW3j+fKBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(Al?7~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BW new file mode 100644 index 0000000000000000000000000000000000000000..346bfb444c64f8ad4696016f8e78eaa62b6eeda9 GIT binary patch literal 306 zcma)1I}XAy40Wg?HU`eXK!!?vDIbNU5|>~|vgH)e-iWJl26#@z0s~mGW%)h7XWt)U zuOh|?i!ri}2sxEhw!pB4?iIFA%rnXOpHgo*5 zr{Wu^c=U%n_VB$Mt69V@(+}w=#$})HRN+F*MSIh=Wuy z8yXmb)G{#s2LhNlVLc#2EntS4TLMjuHZn1btuZ#OF$Gy;8e3x)Z2=TFk2cjckFBwY dHnoVYu>?w)$Ktmh%{6FT1_malNQ5&{SOAZ9EU^Fp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_BZ new file mode 100644 index 0000000000000000000000000000000000000000..255205afa858bf4eb9d5ccddd53c677b0ef81f91 GIT binary patch literal 244 zcmZ4UmVveW9RmXcBO@aNn`KN&Oo}~_#{|X9KpF&qk`k60_ErWphK4mpMm1(;HRk3u ymeB^5v6>JSKs5|ZmIjPq)&GG2CJffh1J`V6fU1FPqtR?a;{v_l6oqgC3JU-@vnNmh literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CA new file mode 100644 index 0000000000000000000000000000000000000000..3a78361e8851946009a09b6d51fdeb001e64c13d GIT binary patch literal 320 zcmZusK@Ng25Zp?t@uDZcU?hRWEfQKU#Q2QDt*?OcBfsVwbQYBZGRbte-QC&g<4L+B zQWfD)iVmK0*EXREr~2B2-ekp))+i=lYQ!}tK>v=}L}zXE#>&+H}%e+60-cH&ChmeHmty_p>dKTY=LL P6=^;Lc)s6$yJqnXp(85O literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CC new file mode 100644 index 0000000000000000000000000000000000000000..500a225897cf0f29b198d7125e5233f87ac1e884 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNN3?-qY)nc_3WyKH%s>nRKq+DjZ48>JXj}#cCTC}abto(V=t~^E literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CD new file mode 100644 index 0000000000000000000000000000000000000000..1b326c9ef03fd90d69a8c46daeb10b3cb77633f0 GIT binary patch literal 302 zcmZ4UmVvd3fq_w#0Z1@1G6+Q*n#9JW#H480Tg9YQ8`Wys17(Gy!ffxjU3Iz>; zDh#8IO)O$-%*|^oEHpvlKnzj`WH1{V8iTkDjQ@cE#DD-IwSugWLbAfh7-~z6i2)G8 mO~YmnP%Ar74agTjbs$H8-Ob3r3esypKpN;mHyl;$_ou(vXdHn)haF*1rt z(S%3_jH#hno2h>DjYRM@BNNy(hgMA?akzGD}U8y?rMG2G9WYz zbT$xW%r`G+|2r*<4pt&ksC5|Ij8N=lEb23P7MNHeicEOGXEH`W*<)PIK?><;24H`h z&?JW~Jht%a`Z0WO>I@A*SX;|_=XD^s2fW4J;;J^7;NnKWM4lSOeC|OK1)$ST{BQDG OeD$BSuWxm*|Bo*fGPwGHSDbnqYVsW zYog69VhuDw!axjC24pZB8XADO42=JQ0K|X*;&g&65Jk73#>B+L7;X+W8-Ti4fr?^M bfT}>2gPqIBzycIAz$XXvptC2;WHcH8Sll8! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CK new file mode 100644 index 0000000000000000000000000000000000000000..c4e5176fd756ab813dacb3b4e274afa6d88f61b2 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt7S||ObUnt#LPep0zh$gOUr083(HuD07#nI($Wm1h=K7x Z5WvLoC??t%G*i*I3=B-p-U#bZSOA#~9J&Ai literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CL new file mode 100644 index 0000000000000000000000000000000000000000..87c02839b2e9d93624c1fc105ecc5b371a94b1aa GIT binary patch literal 1068 zcmcJOJ&qJH5QW{lvk`CrLNY9|QvKL&n}mRbfE#$6%^g;P;zpc^l$bNXE4Kx!Wkg0x zZnev<=c>=Izy1h!pF%hVJlnQ~=bi7{IA1=?oAd>-+ckW{9fm*H_L5(}dn>G_*smj6 z(saI9W5)UohUXok;g*$=^6f}rQ=}rZYpR1Rcj6JFc@U#h9>qGA*jncbX+fA6>Roh* z?Yq?)rwaAlhRrHu$5$yR#6?&}GA+nSkl%;p94)&JS#qh|3!<$>D<0huf{Y0Ip@QvX z1#5f7S+0i?c@~9(n*i@YYeA zaAzG?3C+f+liZ^|-hmGtN2^>Ri&`h8qcj%5TzW!_Dhgtb3^6B97#VDl!is(|mF8+= z2aEzvNlPx1mTz}pIi@);1zI4`u*cuuxnP!0IGM%*NcM4og*VIu;i=j#yH^ z8Yp__ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CM new file mode 100644 index 0000000000000000000000000000000000000000..762582408929fcbf875fb797a4efcf351272c34c GIT binary patch literal 288 zcmZ4UmVvd3fq_w+0Z1@1GH^#5TExbrR2%9T*8+u@ftU$OvjAxj0IK3Q)UdZQj5aop ztpO35Kv9q?m`Vml1|~yeMzG@lKmcMu0I_;OmWZHPQe$CmXb3k5iw!_MtUxs}DL_Ra Y%fSw2WMBb`8Q_xxI^5Y8W-uBJ0On{RPyhe` literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CN new file mode 100644 index 0000000000000000000000000000000000000000..062fdcaff698929146f78f68ae56b34871571b33 GIT binary patch literal 404 zcmZutOK!qI44r|74dM!{83`oY`G~OTqRUFXz$Ckz0?Y}x3RmL{?Rx>D3Sr5yHF>|8 z>n#+=5aK1^6JuCrZToIG*|t98=mR}}%mQT+A1T@8p5 zVTd1-?TmkYpWKizbpw@I3?%~b<_#DO%~sLry^qLUWzrcXr^`XMP{XB1qv;u*XS1)L IC;esq0SN6wLI3~& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CO new file mode 100644 index 0000000000000000000000000000000000000000..51b6508a15a05934d6c29000040d50539b9a94b2 GIT binary patch literal 423 zcma)2v26n}4AjT?lxb3Ag$T$45-G~BG%hkg2H>mvA&i7xB@=ix&yXBp!-bK;6i89v z9go!U6vnR*hM#~i4B9l|B4}`->6#xJL literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CR new file mode 100644 index 0000000000000000000000000000000000000000..796fb16da903fc7f90246255b2641d871e5f60b2 GIT binary patch literal 449 zcmaKpK~6*=42HoO^~pJZc38Z3w?diwI2>QoLw-Z?3fe(?$O4`lqNJV3GRV5v>`=AT`A>vxw)ppe z;VyLl^cYQ1i8V=DN^N}vwFXICGB15-(%e)^9aWof8@dWy+RZTSX=4bb0dG;}pc%D9 znsd-%ZHaX#Nm(lRYvZ5x85%^M}Ap;FsuL3=aY%J7>B%27)Pg(A9h9P`D0 mj^f8;@a#Jytlu=rWdIby;RuGA=e)h!!xHfe&oA3Ff308Som7_q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CU new file mode 100644 index 0000000000000000000000000000000000000000..2d18cf7da9c4a666aaddc8139ca1b1918afeb5e9 GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z1@1GKfSQ8pXz>#H480Tg9YQ8|#?VYT5(kn4y>rNV5Ym2mqB! z85%^J=$gmY0F@gWn$;K?n8c)Lf;84b)Bsg6FdG_}FoHGw2LhNlSU)>hzgaBEG$01q z0@VOAUC9t=EYt!J)6CG&u*O2O#>7AqWRt0psS!v62w=4Z%~CWj0|S$DC`2~~2>^zv BEEWI& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CV new file mode 100644 index 0000000000000000000000000000000000000000..f97fc8ac85f4ec9eec84d562d8e255b61b079f29 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL*r-zU87it07#nI(AWT^h=K7x Z5WvLoC??t%G*i*I3=B-pVF>F`SO7!v91j2h literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CW new file mode 100644 index 0000000000000000000000000000000000000000..2c8cb661785fc0c666498d0b0f5885451271827f GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@}3Y)nc_3WyKH%s>nRKq+=ZL!%l?LqmuFNSYZa0#d}l v_#X&h;&>E;jNvoXu(tx5WNxNO&@`ZOWnRKq+DjZ48>JXj}#cCg%u*bto(V>O&mT literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_CY new file mode 100644 index 0000000000000000000000000000000000000000..7feb7f8711b2d70b79780f3d50a8e83c0a2aaf63 GIT binary patch literal 258 zcmZ4UmVveW4+8@OBO@aNzhO*DOp1oRRZL2?ajm93P?!mbnSq!Mh(Q3TO4Jaj0)&lf z%peMDEG;!5(m(|a%!Y;OxiLD=M4eJ1Ws<6pB*{S^qJG8VuXga7~l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DE new file mode 100644 index 0000000000000000000000000000000000000000..2895ccce16545b8d583880543584374e231e1a9d GIT binary patch literal 524 zcmb_ZOHRZv40YzWMcjf&jAX}Y(jp`_aEdg$o&r2eZZlV#Gr)5PR>KlkZW8Cc=a=Ms zq5V72W=ljN1iEW-%;h-tdHG0>!wKab(zkuwBM(RqpzlQIybwngti;Vm#k{)HG9KSP__m($3qUgB0UXpaC~2|R6pvhseoWfjeQe(`GWQa zP%pU()WeJFHT$g5Q+#4RnfKZEMF2P_J@(meLy@Et2(k~6!jL3-=`tcm8L2p3YQ*1V PX1mQOzjM0${ImW6x5hC+ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DM new file mode 100644 index 0000000000000000000000000000000000000000..c5264b25edc727cbeaeeee6cbb57c1f2e046897e GIT binary patch literal 233 zcmZ4UmVveWF#`hwBO@aNN3^kJY)nc_3WyKH%s>nRKq*0EW8)f24SOp?!x{^V8cRz} qh!jX6Gf)nsoPqH_5WvL2+W3&PVdx>lTr_LYxC{(TF1`r+QCI*kSR_;c literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_DO new file mode 100644 index 0000000000000000000000000000000000000000..ca339572e30507bae0d0144a91c9e302bad2b9f1 GIT binary patch literal 220 zcmZ4UmVveW8Uq6ZBO@aNN3@}3Y)nc_3WyKH%s>nRKq)>$L!%l?4SOp?!x{?nRKq)~(4SOqtXhWme8bc$^8cRb% nh!jX6v!Q_@NI3)Je;|N~6Qzv|qtR?a<1#QXxjG}9fWiU*sevTk literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EE new file mode 100644 index 0000000000000000000000000000000000000000..e1448ef23787a52d0f9e940fa097741939f627fc GIT binary patch literal 1774 zcmaKs-EG`J41`a1Y@`$mh=BcoNl`O}AEZ~o!&v;L|JM=RWk zuX76oTy9~TThvdV>^u0DpI;v5R*IWj+C$5_U0pm{@~&m)d8d#MEymbNN^@H+Lufv% zZQJLz>40ln&Fe9@U2m(8>1aO9a|Z^r)2;Vznr?m@K;3b!RUcB`4#Qv=2?KmdWwB@j z%MuG|drM2w*;cAkOgDJnW4VS*tj4ke-at4oP{FRG8hFaU&)KR9t8vjw+940_ylzK} zHD;@-M#vWgDigQE784GIp=yIxRpipBMfVgU6gv|cN`DZ9E zw%W_xF&d?Eq5=%Ygb%bS2xMLWxP>zvJ}t%G1VS-V;~JUzS1wV%lwAk=$g0ow1cBQ@ z?R6fL@26pAhs>ClaYqe=8VbQO1}Jg@Iw{P@W|mDm2D|5GZVOk2gwR*ECXvpz6E*3$ zhR_-D4ggacS&e2zAxHD+a-azYAfeTC4Xe6NO`!K7SLz~8W!USgQl`J^;5#U~Rp%}5 zfUv85(=}QVy?oIow*#aNq#c-LEjzDVe+N}amWEpJrhhs0+O6h=5X~7l_TFpchwM8J z4ztM4-~9ti;O6JMr|E;t@}#4G?=h%wRwsrvRMPTusCuAUC6;>U!B5 z(K-})KH3z6e&Ek|_6Tc0OC!Q)x|mdpjnz2(X?DtIS6UuhFh(uQ=iQgRgiL9}6Sr24 zC!fb2&dgL2)KmEFE;Y*M-qr)bHA;s w4o=r8I9$OdU)!$div_sIdZ(Py%Jm%|Cw51~JR}c<{|LUIpF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EG new file mode 100644 index 0000000000000000000000000000000000000000..9ff6e65376d98f4dec40ef1f4a641ffc4e3569bb GIT binary patch literal 298 zcmZ4UmVvd3fq_wx0Z1@1G6+Q*8pp<@#H480Tg9YQ8`Wys17(Gy!ffxjU3V98I zDvY9yjALso3^YMvKnzj?WH1{V8G*PAjQ@cE#DD-Iw1JG4Ll_-xW^M^|PPK6@$d(#o q6B7dixM|qz0cvLlssi}{s1D=^u$vhfSiyP;NCSQ9>JBp>jRpX)KqsI8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_EH new file mode 100644 index 0000000000000000000000000000000000000000..80c491c970c6b633d60d8e14621e3fd0d4d788f6 GIT binary patch literal 220 zcmZ4UmVveW8Uq6ZBO@aNn_)~!Oo}~_#{|X9KpF&ql01eQ_EyoRma#SF=9&;upg04Q fp(!I+#eX1x2@}vjl5uFJqj7;wb@f14i^2i`^P(U5 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ER new file mode 100644 index 0000000000000000000000000000000000000000..e298284dcf8b1de241cb5065126c4876ddfe9fd7 GIT binary patch literal 348 zcmbtQF%AMD5Ckv!06$OPiDO719p@>e$9YjRHXC37c0ef*4@90%W{eq3VsC8BtczMzT_b`j1|pVK z^+xr1HJPZ0zdmdXvw}&P0izzXBa4Y6quMjpV$WJR*L|9QN#wd2GX3MV%KH0?zqwp{ HmR0`%pGZEO literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ES new file mode 100644 index 0000000000000000000000000000000000000000..c4b40539def8e788254a3f2368e3a1d8ebbd958f GIT binary patch literal 728 zcmZXSO-{o=4235xWx;|2Z~`J)$@b)D!U9(8*s+{s*HeIdBaVW^Nw@>g<0R#$(li~{ zde7f;-oL``HH6J)2%)N~aGmK8`(YZ7Z?bPss9xY~=jRU3OC0;4`GIa9@3~VU?Q+{s znsS?_S{Y@cPFXa^Ll3d>SgZAxW?Ud2P27YR@giJ>EpZ3!=gcw*`gq@*bTFrOJZeAd zBo$P0ge$6vYK`*++NfkO3^vo^WFrTtvylI+!WETym08MvK8iI_YK`xs@F5ZD04JHa zNfS^}a9RSc4mRlwohcsNl=tyef)MRW90VV(HF+2-83MAjEg&OW>xsPR<DE)wa3ik98Q?oDOU0L*#P*Bx^Lmqe z5U~&zX4*w*`!u9s-(Ax%>Y;x64!vp)hkcDO0pE%M)ZBmtiQ)=jaDkXA5oM&rAIJ`q zaMxN$tZNr=C>3-rzp0oVLJUox?HMs|S!?foE~y^R@S59G6z#pawmGKxVWy45iGsaS WC$cX9aH1iEg||hD@7(T&|IrsAm@g*) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FJ new file mode 100644 index 0000000000000000000000000000000000000000..0275a2d27ac61982e901f23da990b6be66d06f25 GIT binary patch literal 317 zcmaJ+yAi@L43(1$?7#%L$eq9Em?jNJ!3vJLOaW#iR$~Tuf-1is@s@Jk9&@u&ArM=~0iUXd%sFJ6HjlHrW=NSOSO?!D+L#5|VlX;(YM0UdWCH zlWp;V>riYTSXYZ51K)EkE^^k@6*pwA-qc|5sx06W(jjuFDgK604knW9dp4Gun?zjQ160x2^v)Bpeg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FK new file mode 100644 index 0000000000000000000000000000000000000000..5c16cb200e72d259e5ff5c3524ffe73f1fadd796 GIT binary patch literal 200 zcmZ4UmVveW5Ca1PBO@aNN3@}3Y)nc_3WyKH%s>nRKq+QROG^j`Bn9Gu6fiLU2LhNl g4uv4?oQ5D{Yfud_G%!Fj1V5L7fyvDqVHpYw06kG0N&o-= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FM new file mode 100644 index 0000000000000000000000000000000000000000..e06e4c19fbdafd3fc3d3e254f0c6ccf71bc8d6c0 GIT binary patch literal 237 zcmZ4UmVveWIRgU&BO@b&P_(gSY)nc_iiW*aOiHzJt)@Lth6#w7ftU@5K>(mHyl;$_ou(vXdHZqB=u>h*n zgh&9T7?=$WjTphI{sRF_9IT1W5Uc}a0uX~tgsKObs17sH0%WA6W(|mM5^V^w!rZXN fBHCQnGFCGt1*8iEu-b%XF&Y=>6E}Z|ZVVCtx}PWR literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_FR new file mode 100644 index 0000000000000000000000000000000000000000..4fde5fe011c3d50183f57b7e3b995bef76c87110 GIT binary patch literal 609 zcmZuvK~BUl3{2ZyPQU|r0g-kkJ4ut4%ieeZC!{pDzGBz?5ntmEj8iJ1vXQLT$#^{D zjc9hzSfBHaOP0N<2)%mQ!JQ}1X5LXZ8LarOGzb9I2pC$_7y=a;$E4Jl z8*9d-KxBY&3`~X=j9^v&fdD29)dbN2)?-j(p$U@(Yl0YyPX(H>__;u5yF0=xK%)V) C*Ct>9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GB new file mode 100644 index 0000000000000000000000000000000000000000..6eb65ad4695e28e4b0ca2c751236b7db3636928a GIT binary patch literal 660 zcmZuvO-{xj5T)ObF1>~%-H1^Q)CH zhXD{0iO7n>wIdw+Xr;%Hlu`o$j5#uet|ES6?D5**mf3B|nxQmm0XuE~S=(pgP#OiU z9F!ALjWCPz)=J!XDHAC4MFMzvFFgV*^wv@Ys?f=v6ZSYF2!k)lOd3d zF-g)!3_t8{QZnQP3y=<&`ib=O0Of>QLiG7b&;N{Xf4qmX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GD new file mode 100644 index 0000000000000000000000000000000000000000..e5cee36f6479daa218367034ea056d7e1e69f066 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNN3@}3Y)nc_3WyKH%s>nRKq)Ru4SOp?!x{?!3?4w>O&K6r^IwFlrv6^b3%nlfW(PMP52emeR%Uw8cwlb8Tlp(<33YEX2**(uizV@L)p>0?q(w*6>>@DTtaEF{KR zr8-bH#_2S!w-vQauv6 zE#YyFHc4X1!_Du*9it^!eYJ+JKm(j>5w9^u>p*j%s4%sb+zYVcgV_Z;cah!o%!#F_ vB=JT4L0i!fG$szEu_!fS*n8|j$T0!5jjm<33)0x<{x6>=L|MjPrH z$JSU{T7pD?7^D)&U^cWg1aTP{{{sPt0RaRxfsB=f8Eawygf$xWR;DI37RH(e22hK@ tW?{7is9OZ6CnhB(1xa5_3Qz|V5X0Ti$iQN1Vqid`a-bpZ9uSXUkN`Z6D?|VQ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GI new file mode 100644 index 0000000000000000000000000000000000000000..2ae84745e1368ac9633b928a053bb06b53bd43b3 GIT binary patch literal 530 zcmZ{hU24QI4211ux6r?PG|+(LMu}4>`&fDg+iy9=R=rWL)-$vtX9Izy2FG$V8GTZ| zf86oxTyyK3^WM9M#1czhKEtzo;oSkdy_`p!H`ulyJ@M1&l}I@SDH>jMz@2rUNlmdm%PBmoHzIC>|M)5Fu#w9`*8+I6?zB_#d&v#P*`XTkH)~k zDxplxuZ|G5%)vD0jT6#}IwBxSG#0I&C!UPI>oi)qZr4j99t{s#h>I1Ys% h?Hq>DhPoE9V3Wbh!DbksnSr0nz`*40gRl#Q1pp2m8eaea literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GM new file mode 100644 index 0000000000000000000000000000000000000000..1b2a03a672ae14e6deeaf48046532a995cca4cc9 GIT binary patch literal 235 zcmZ4UmVveWDFXuoBO@aNn_)~!Oo}~_#{|X9KpF&ql7faB_Ev_`X1W%!HDFQ`A_bIW hU@|mg1S|Uw1TbM@bdhc_nmuS-pv&ET5e`6M0RYPfBkBME literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GN new file mode 100644 index 0000000000000000000000000000000000000000..fa8954a2cba0d2327ee6e16c4d16787c91e59844 GIT binary patch literal 235 zcmZ4UmVveWDFXuoBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDL4XlV{09PT zT&!Y1v$+h7Vp3{M41f@<1V}J4FdG^fpc}`?zz$Rcas^lk)LupgR*+r;ph@_ofv$D; JgPD&;0|0|SBEbLv literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GP new file mode 100644 index 0000000000000000000000000000000000000000..43e217f2ab2ac403be3cf5212ff49b34dcf8b8e6 GIT binary patch literal 329 zcmZ{eI}XAy5JcA@q~QeI02h(`As^F(j+Wkb=Tktq5m)03Flz@Sgs`;!&Fs9rKWKd+ z5=X)&1Z};xF{Ise2x&R4<|ZdO!LUMAs2bIvcyW*R-7v=4qD!e+d)4-%i!vnW?0@%= zph|b>*jR7&y#pwF1U#Gxy|zXvzH)F=g0oOkN&;){3ku}m;s+g)oH2~nqgSSdu<$Ta Y1{OdbCZnEM%OAu3Ju$=SoPEFB3z#Z1d;kCd literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GR new file mode 100644 index 0000000000000000000000000000000000000000..1ac216e648f2b6e7d9e8c2ec10ea5a45e457093c GIT binary patch literal 339 zcmZusF%H5o40Ku*R(Js`kr?bm3JnY$kr-LqZhZxqAMrKb0Oz($;a%W#&Z>sJ@ z?n*eEqpfs9H|(2JH$1{2K7E6Sa*hglg)o4-6Y#j@I`?X2&;%7Unv&-1!731@9#xJ? zVRmTAeE=&aVAy6H#wwWdQybOPG%0Q8d9gDF)?`K)Vq|IM*lUR1dqo@Ttl4J_H9sR} cACA@{(Y}jYTV>xvQQ>xBbK$zU+>HJQUpT5X;Q#;t literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GT new file mode 100644 index 0000000000000000000000000000000000000000..ede385ac4d0a57df9f3a253cb70b47216e191554 GIT binary patch literal 290 zcmZ4UmVvd3fq_wy0Z1@1GH^#5n#9JWR2%7-)B=T=p_m0ovjQ;)09ElCYS>#D8q^p? z8yLrGg2aFrq!!3vHZ(KbjB27y&4CWmj7fnT mgv|<|PIjQ4m=v%&ko{oiGBU7&%rYP#&A`Cq9s)BTjRpYsha{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FJrrg*8Vvx6_Z)8k literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GW new file mode 100644 index 0000000000000000000000000000000000000000..2bef055ca2fe5b0ba01bc0c595f3c6ee04bc78d1 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoebBkDr07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B-};Rx$cSO8t?97+HH literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_GY new file mode 100644 index 0000000000000000000000000000000000000000..db33cceaccaa0d2aa9a3d19ba1572523b6b525a3 GIT binary patch literal 321 zcmaJ-!41MN3`}S%J`6%6D#fYWBz$=CVgQup#}r^TVl`%fODpvO2uo+#=W}f5@l?%K zDIFA?)@qY1#XMeaZr9zxt$+%sfnt!XBPD7%mkcOX1XUy|snRc431(Xwx*rYYxs%-< z_SOkJc?s5#Ftd2%Y4F)gG!ly>`H&^KmVGux2o!TCed>phAz7B1=3*gh-N!B!|^r4E12pd3OF^ksPq|TN=7#NEl1>1)1 z6T=qk`0tEqxaIq&M?zpW;*_CBrSX1_5Jp2PP1k@96_c96js8r$!Ls5N6qdrA}%UXG#Q;(89B_-~UC(YN|0Y07AHOYz6^UvIEtC90pVevIXoEMg~@p QUIPNsKo5BM!OTaa0q7td4gdfE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HR new file mode 100644 index 0000000000000000000000000000000000000000..ddbf4654c87fc83bf3fefb7349856c936cc93538 GIT binary patch literal 450 zcmaJ-JC4FI5Ve7@9Tgol5|)TGj)N1^Y`gVVD>?3Rie};#VnsRXDU(t4P+DA$9%9?hj{F3*-zrM=r+iC2k2UZ0+vzXe$n}D(hr$yE<_$ z`mSdeOxJfkW@UH65zLIC)hsxmY)FO$$+jGQ*@^&no_2*>^3UF!JfV^`tpC%1me5U< zDpQH#AJCA0ved#d2u7n~FKvqCM;FmHi7RIex8lUWQqyq26dWHCw+&j^wWyI8Oy$=d fG1RpBur7@MLZc>LFj}BW1X=Ieu<`YsabAxH{FFp% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HT new file mode 100644 index 0000000000000000000000000000000000000000..ac6f5cd0784d17aeb3f92e7fd30d6e8dd0529596 GIT binary patch literal 266 zcmZ4UmVvd3fq{{c0Yoq|2t^y3#Kxq=q-fY%#iUdl)oR)UWtf1N8Hibd7zBU{*$fS% zO)O$T93Tcs0vXJPh9)2`1LJ=n05Ko{pL&pCJP^ZbObmb!t_hoQK*j7pH6RxP)q(5+ WyNQv36{OdIfHcr29w9LE(P#h?p&qON literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_HU new file mode 100644 index 0000000000000000000000000000000000000000..f23d173a1a79e1964bbfd2e811a4cce94a671f79 GIT binary patch literal 554 zcmZuvOHRcw3{2k#vEmMIM+B8@Cu#E7u;l`*((HN)FgN06h%>-AEeND%$x7qjOvZix zbjKIxb|>fDFbwXR=jB!I(;Myw_b}DW+oEj`Iv!Yv(0k+(`(8|A%lBM~gdgGQ+3pwY8wD3?1^@s6 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ID new file mode 100644 index 0000000000000000000000000000000000000000..64b6a35effdcae83e14ebda9e147617eea42948f GIT binary patch literal 313 zcmaiuJr2S!422!4fS8!L0wNNFod%M!bYbBPZMU2P!i~5ZXMkt^rXrr?(h82w2tfpwX(WxorqL HMOhUAABQ9KchP1n$LgS6Rns@O3phckr(}bCy|9+n@ zRo|4-4~37`YLz6!z8mgt7dV@vXP>jixj?fZU5ji_N0;|d`-jOfMl32c9~7ZhGZ6>v zG9-VXtuG+#X{NNQgSXc5PRj=BkB`QLKG4vE+w&I)thLGR`^*HA!dbg-FYPtgaWrC+ZDu C+%oO} literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IL new file mode 100644 index 0000000000000000000000000000000000000000..8529cf27a0dc6c39e88adc8161513e5c764e7bd8 GIT binary patch literal 323 zcma)1TM7a(3`|`YKLpQV!G$yyR`=NdQUPRuL_k~y#{WP7Vn6^+#UNvp3=vj>EUd8rT5o1zVp3yiVPURW1F;2c v5YPrg0|PW0(7B8Zd=L|W`ZYmD1GR$GfLsq`uv(az7#J`xFnRid1h4=A8l@)w literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IN new file mode 100644 index 0000000000000000000000000000000000000000..5f0744e87623de3fb5ec990e5132eef0976ea829 GIT binary patch literal 1604 zcmZ{kJ#G|15QTTW7(+rtKt{?)Ua9|khQtyX2{BUdWP1u+%Sku_SK|(RuY1?542<0N zxTpT!t5@~&*XH)yX7gghv)yhtZ<-Ie&g&LBU0g2-&xzn^_r1GxEQ6{jhAeaAD8Ecr zT1uS)sx`)BxBxGFg7s%_;oWAS7fD5cqMAVzNAP!(XntCvuo1kQu$|Fp{ zSLI_)B<~T5dPRpSSVx;|;REgUai2vrSToTQMW{cS%A1c#r7F>2VW5(uj#_2G5jNtR zTi91QKgRof8bCr!mUFi1QG}muDJ@-K^$=Y`&8OAjfIehgO0jvySUHLO-Qq30d+^GXf%$K2fD5uF!m9Oq9`S7Ub1GTdAWNKpM)Vh`Dx@)V(-mx|$4^ z8*KJDk@;x*>;hH-snYaDcz)bdKROYSA`4642Hp3lG9CJ0KBE+F0)@jNOM+m>su0#Vl$A)w~D(~|a@ z@v%p8%XDbghgn1z(UqaAKoCvI-i0k C(`k_a literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IQ new file mode 100644 index 0000000000000000000000000000000000000000..63477f21f3aab8f05a857d27d1d977fb9056e47e GIT binary patch literal 335 zcmZ4UmVvd3fq~JD0Z1@1GVn$lnwVS0#-vmm>6p|41(~6k1xT|3F$e(F2^ebFTNy+f zn8el?n${Q@X@Z1-7^ED?U^X-`0C5=@{{sPt0RhD61X-YfZb6NSiLp_QxuKz%Xfy!ZWGz|% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IR new file mode 100644 index 0000000000000000000000000000000000000000..3451a0026cf64d4e64b44603c09a3940a35dac00 GIT binary patch literal 583 zcmZ`%J5t0j40ZN56jW5SbcA7NB>&c;fSQ)pahFrD;zk^ZOK=8wN-|3mG~SmGh2}<9 zr#_;ysnyUlh}H;z1oM=LNX)Ij3}YTs=Wb0W!61UF#WuK6Ka4=y6zyTK*>NJmU>;0! rm4QxCr(qmMm3|i3ECSPO{)t?P0Cx`d@aC}`A5cc%FL`}KbuE4YV<~Hg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IS new file mode 100644 index 0000000000000000000000000000000000000000..96668f323558080ab20286ff4fd60d6b0d839393 GIT binary patch literal 375 zcmZutI}XAy3{5C7!O9uPfMkcHDJ-3t8QTs>ojCxQ8*w$x0MBU_1eWah^Zab*`7(=} zG4^U;tTh|%$9~+l$71gO;ab<-BB0@OHi#q|Q+-e(#(FWQl}34snps5r=wk5~HM2Ns>BBy92U~Qji}q zzD7!##>s(57tQi_!F*L7)Q=Ka!MbF*XwHEMkhQKAID&7w{2Rj&e{nibV}9%h(&0FV literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_IT new file mode 100644 index 0000000000000000000000000000000000000000..2a1f7ab7a679f108c1fd4cc7ccaff9206541b2e6 GIT binary patch literal 603 zcmb7CNlwHt5OiiHfW!}Y0Twfo+gp;kaOR4*d3?(&pz|Z1#20u2RAmtdE?}wSrK`Gn z$@`~iUya#48)KTLF}Foxy^L@Em?u27us!Usp0BW9!?=LHll#Xrt@x1osu|2MS?xOu zzz#+-Nv1J-5f9D-DPAL4vFj^$cZyX@It`G%j8;>!mZvqqramh-<{;iV#$*aNB8xb$ zFbb|>bbl~AHy0EpT~a-z4oaHoaZW|VS`8)Ojal_x2N2}QO41BcDJ;(ypDK_p02z_+ zP_1UCeaT(b0np-PhB1D;jGBjx*o^9f51L#|R&iq@knzMX{;;u2OlueZ(jHd3^>#jf nVXcq!{9GGzW*-02DK6D*5S%7|hjj>T3}_yP{PZ%*{r-FdY2bC) literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JE new file mode 100644 index 0000000000000000000000000000000000000000..4d01e44e08f01ecb4e6002d1369b3125b3b1f4f7 GIT binary patch literal 326 zcmaJ+%MHRX40R}<9hiU|kP@d=6C{)q7e*k-EmKf;BUWPuuxYvUP)pDDv;3Tw*Bf?E z0CfdUO2IK%3?n;NFfAa4B6tQ;i*ti9}a1zSQW^* zhvm18At^{c*TIdN&{4~SWZOdMsn1nYmn-$M%&rS@@`YR%HF@JHBx7AyM49l+s>$Kc Tgt#+i;clG*Z0@)J9~SisfFL=N literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JM new file mode 100644 index 0000000000000000000000000000000000000000..bcb6c85a3f1b855220f6ff5c55388faaab783989 GIT binary patch literal 251 zcmZ4UmVveWD+2=qBO@aNN3@}3Y)nc_3WyKH%s>nRKq(&!XzLXK&DC>f=q)LY;LAWtl>bN%!cM>$mW@w PVHIRxVDj>XsY9ayz=j}P literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JO new file mode 100644 index 0000000000000000000000000000000000000000..ec29ccde960558b7836def23b40843a65daecc9c GIT binary patch literal 376 zcma)1F%E+;3`{_*9oV~3hH=8V>iH#O=FEaAVBry1VLjI85W%ByA(97dLlp@?G)&py zLk<>s~=T8KM{WQrrRmSptd>KQ%~tSmQb=VhuK?B`NcjxpiA( W)?O*`#aJ(Q)!h4;?0QSCzvB({BRBB? literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_JP new file mode 100644 index 0000000000000000000000000000000000000000..485360c217faf77eb1745d84741ba3550c79ce1e GIT binary patch literal 309 zcmZvXJrcqo5QP`xPqeb|5XlV1!jKqj(p%YwbezJF8+kR)pl>Im1-dgI?83f%@OaYZ zPNXzpQHo9jn=!-?tNs$=)adhE_qbbw0+e764nP8uoiPJ@k!35&ez|8uwt88<)xxyJ{S6*4=F0qW&sne KuD6dzw!Z;o#4CCL literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KE new file mode 100644 index 0000000000000000000000000000000000000000..d33355e193f5b41c8b52ba98d10b4cc08888c34e GIT binary patch literal 727 zcmbu7O-{rx424sM3JGx#DiLJor)k(AA+h2JX?8sY7*51lxCuu<@SIdIf+d}1TD$g_ zmzTW0oAJ?@lQ(0`Fbw9Ru+4Sdp4?S*D@8eGgQQf3Lq6h z38IAySr@AWqDh)Ka>1%Re26L6NyS-T#TR1K6$V~qYuHjw5y7HXyhi~67fVDq>s%x* zV`X!ySQip=As?|yDQT$_p1HwXvk)QYUWcrb6WXa3YY})-GQhUtsiL2$|&Wk#Ln*wHl$`1Oyat7QLxb|2bLnSq!Eh(Q3Tg5A&{+ECXx7Q_Q$ zkSvhFY-nHz;xaJ)2LccS0`O`88OH-PuExZ`!~m`fn|VORtUyIEDL_>qtH5qzWMBbl P#3u*zg||D*WHcH8`S=^B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KH new file mode 100644 index 0000000000000000000000000000000000000000..b9610350a9603d76d936bd44c9a9afa683d8196c GIT binary patch literal 282 zcmZ4UmVvd3fq_ww0Z1@1G6+W-nwZ7Lq{O6X*jvS$*485L literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KI new file mode 100644 index 0000000000000000000000000000000000000000..a381e3fe0450cab86f5f25b7ed8f38cb315fb26d GIT binary patch literal 288 zcmZ4UmVvd3fq_w+0Z1@1GVnwjnp?)kq*NQ}7}o;Dn1GlWh*^Lb1b|BT4K1UMbWLMx zEJ3tMEJzfHL8^cZW;?mny#@wA-9XA1D1zc317kD?p>ct}^!9`rgiZkf;v^|S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KM new file mode 100644 index 0000000000000000000000000000000000000000..9c4a073760b40810e975ce3324b48591f824b439 GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYrK6C7NM{JpbinRKq*0EW8)f24SOp?!x{^V8cRz} qh!jX6Gf)nsoPqH_5WvL2+W3&PVdx>lTr_LYxC{(T-hK%CQCI*lA0%7= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KP new file mode 100644 index 0000000000000000000000000000000000000000..093275551b18bfe2d6f69054e146e937332fa41f GIT binary patch literal 215 zcmZ4UmVveWA_D^hBO@aNN3@|uY)nc_3WyKH%s>nRKq)Rm!)PPR*cuB%ONbaq1+$@{ f5l9^a<9{H4iQ`vKieYGGqj4D+n7jiJmZGo#>V6;r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KR new file mode 100644 index 0000000000000000000000000000000000000000..6c770c97d034bc688ec19bc613e500e2c11f210d GIT binary patch literal 502 zcmZuuOHRZv3{4mY%^ryzd%7r!lQ>P;^Z@MGrrGrrGwwmS16P|fz;mXR5WE>qOcpwmr6=zLQ%$BbLpDIusrD3c@Q38$*XQ)Xit`DrrktgBe zc&L&JC)^AL0LjI3MjU}a?1Z@x*Lk_bRWhiwdXg9=rS5iHe6C$5DyuqN1>+HqZQ#~r zB*~~mdu*n?IrpbGRQ|eCfT6@bp~?-}$ct+&ft!e+4X%A;I^#A1&|34TJk02YVyapt VukC&N5!RfD*{Olz{X@b3*bl&|TkZe= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KW new file mode 100644 index 0000000000000000000000000000000000000000..c37942e118523671a410ce97fd23e7346263a13b GIT binary patch literal 243 zcmZ4UmVveWEdv7sBO@b&P_&^%Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(Jpem5- afa*Y!VD~UGumVLfR0Cb@9S$=OjRpWb8XtQA literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KY new file mode 100644 index 0000000000000000000000000000000000000000..3353ad9369485258334c83c04f3cdd3b8011451a GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FI}&C%8Vvx7yBv1_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_KZ new file mode 100644 index 0000000000000000000000000000000000000000..03d7639434bf76081ef8855c2b64e3ad2d4ebba3 GIT binary patch literal 333 zcmZ4UmVvd3fq~J50Z1@1GVnwj>YBvHq*NQ}nA8Hrn4y>jNV5Vl2mqCd7;4yC835H9 z$JQ7cY1SAS8pWglrI>&iqy?m$fsujP(7=!p%=`}oAO-{gP2fW{0Vobq2+|AH2eL*H zrpN?tjbRPYW@7^rgBlY96HNnB7tjQLi0YUWuyVK?;of0nU;&zAK)gzzAHAa> Hc4CkKOARXJ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LA new file mode 100644 index 0000000000000000000000000000000000000000..bcfc00618ad2e8a139877c68fe7b1aa95bd0f293 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL(6CbL(^D@07#nI(9!^;h=K7x Z5WvLoC??t%G*i*I3=B*@jtJ{eSO8r&96SI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LB new file mode 100644 index 0000000000000000000000000000000000000000..628496307edc9debfa5d5ac17961aa8f57a4f3f6 GIT binary patch literal 236 zcmZ4UmVveW83O|YBO@aNN3@}3Y)nc_3WyKH%s>nRKq)~(4SOp?qZ$)~8go<48cRz{ nh!jX6v!S68NI3)Je;|N~6Qzv|qtR?a<1#QX`8Xk*fWiU*#~>vg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LC new file mode 100644 index 0000000000000000000000000000000000000000..bd295e7dfe2bc287cba26909b4aef8ccdfd9fbcf GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4K#DMjM%1#MYRY zXo3WR7^DcuU^X-~0&y7_{{sPt0RhD50~xLkHXLXH)O=IT8k1;aT~qVe8dHNBbJH3N b!)QZ`Sdgt?fYnAc2cU6*p7Qa8=|`ghA?GMt literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LK new file mode 100644 index 0000000000000000000000000000000000000000..bef8687933b8ba2ef8d6d8d0f8f0d78e38e45d6c GIT binary patch literal 388 zcmah_!41MN3`{9VunCojWG89U@L>Shz~sjiG%SQzjTzwF3LX^_mYnlB_QlTQX;xQb zs=?r>DzoPEWpF!x17E;v_!6#$>kYGz>-vG?eCI$vImd3`KPz%6jU^N`5 nQv|Hu1ga0HO;a-_1*ik$46u6{8CXCDlb{snVV@v~!!bwzw>%~o literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LS new file mode 100644 index 0000000000000000000000000000000000000000..228c9d47fae21c536553a457b3dc2ae0cc30b4b3 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InzQ}bAe07#nI(9j5^h=K7x Z5WvLoC??t%G*i*I3=B*@!3gV6SO8ZI96SI3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LT new file mode 100644 index 0000000000000000000000000000000000000000..9ca9325385c5188e72199318f80ccfa7daec0e2c GIT binary patch literal 366 zcmaKmJr2S!426>-xB??99xBC&)B=kyz{r+nE0+LsBd*37;3aLA3e{5l9RECh?~mC& zjInovWUbjp$7vXka+%XJyhune-rzN}?w~nvadKE@7WG~<1R-TKT;w*SQhM!}nb7Ah zPli$1(=bjB@Gy;ITim{g+AijYRdY{R&PWw&^2$`QdI*f@`}Ul)5II*sIdY%W2SQYe Qe{c)d#TPW!TRmUs4{nY?^Z)<= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LU new file mode 100644 index 0000000000000000000000000000000000000000..febd5a97db8d4aced8b555db8e8b0997f07e5462 GIT binary patch literal 279 zcmZurI}XAy6nl@-iV2BZ5UE36q9Vk?1z4GyZaD>{H|o_m1K5-S6)e4vBl|hiL+YD| zZUs$MHkR@|wA~24Mpd6#V>T!PvYpxfeCk6S$^nKrI=rt?)W3Bqm03_w(I>!V2JDR) xz2FqkgN1tDZoh6L#Cu=N%(=oyJC;6lL&_z(lvAda_#3xKUr>Dba-H2j{RK%hDYF0o literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_LV new file mode 100644 index 0000000000000000000000000000000000000000..812f9222e9cee2b86909cb330821db7a81df960c GIT binary patch literal 379 zcmZWkI}XAy40Q@+LhRgtN+8*7lNJ^vW@eT)TTj3U>5aG=XMpE4Wxsv8i^2i`^THqc literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MC new file mode 100644 index 0000000000000000000000000000000000000000..0fb1738c6d40595389ec5019b584a90b87d32130 GIT binary patch literal 226 zcmZ4UmVveW4g&)NBO@aNn_)~!Oo}~_#{|X9KpF&qlDvi*_Ev^QHPNQ#7O|QTVW0#9 nlc6aiSjm4NfC&@Q0WwekYM_ZB5oV%UfyMsKLa literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MD new file mode 100644 index 0000000000000000000000000000000000000000..703bf720525776290518f8643e4159e32fae9919 GIT binary patch literal 355 zcmaJ+F%H5o3`{6x;TsG@qEeie(y*|w@&OWWc?Fms@ipE6c0y6r0ZX>y_%3&OzEpiv zN?#Qht<^e!$C&PJw}0@}lC%2un)`}Vf{`15?dj;K=W4AbnE=SeWQ-wi12io%bipZ4 zWU5vbfYUrG{pOHE3DM@&geWK>szMS?%pw!nV0$de0S-v6W$7WNm`>ztLVhW_&q{<<(kkM4uQh`F=5v6&>Ke{sf z^c;={u!6CT?gs4>_c6z;VrEhtsPzd>n~^*3Jv&fMFb*^ujCP5gb4qcU6b$JOWGH)Z b`ox1VxT2W9&VG5Gd|?8Gm>u^Y{iHqst|U9B literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MF new file mode 100644 index 0000000000000000000000000000000000000000..7106c2f843cfd76e68521b4c000399aa7bfb3e55 GIT binary patch literal 329 zcmZ{e%MHRX5JcA@fDe)UAs=%ICvH?=`{pVjbVO^^0JC;LLI_Li-^|Y2`-9dO zB5@>aLeSQ08$;Snhme-zYHo6p6AUX-BO@aNn_)~!Oo}~_#{|X9KpF&qlKh4m_Ev_`<`%IvAVL!&0hD53 fGBjrdEBX%vFk!-aNHrAA4m2*%&A#pk%TZVW;oBnF literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MH new file mode 100644 index 0000000000000000000000000000000000000000..e42f2eea2588bd4d943902e3082fe740dd9bd20e GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG85l2P6gJffO(>{s#h>I1YtG TX-6{+jmyBmSzP1^|Mb BG5r7l literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ML new file mode 100644 index 0000000000000000000000000000000000000000..9b903bad8d2eaf34337be96c0d2e70f0a98f206e GIT binary patch literal 594 zcmZutOH#uy40TG&l0BRNPsxmA`4h8Y%?zBt^{%HV;sTt7t8oXOoUACBaiYl5`+fho z!^OGXt8;FeCU@6Z^1SrZ`GcS0C%Su_9nQ^GAMmvY!$)qZEL|U8o+Sm%#S>|X6s(g= zK^=7=B7Zt#!w?L~5C_WScAS9280TP@jWE?x z?NwoOX-ma;iR%>v!*@#F95tFlZ)_%TiILan8MA+BHBZQ64L}tK&e}njs7n#1l4e8gf EUrixo_W%F@ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MM new file mode 100644 index 0000000000000000000000000000000000000000..922ffccc4adc0d97a1b442d8efd4bb78e40eeae5 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLrY5t2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6#@ aKM=sg@u?=>AT)E)xC{(TzJ3S`QCI-2+#II> literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MO new file mode 100644 index 0000000000000000000000000000000000000000..cab7cbe5ae77a068cd7f93cffc20f8ced4a99f37 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBmH289Ixdm|Y~ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MP new file mode 100644 index 0000000000000000000000000000000000000000..577d33c7b19869e9323600414dc1196554f287a3 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|!FHvnch8Vvx76&!E? literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MQ new file mode 100644 index 0000000000000000000000000000000000000000..f4965bc7cca9baf5a091b80fba923ff1854ce878 GIT binary patch literal 353 zcmZus%MOAt5ZodX6XV&NXE~7cAqrmj0uSCy3OBw&;E((@zd>gZ2qbRP?RIx&I(@xm z{S;9TK~hQ%-ngo)kHvMK8r#JM7f>N~fV~>(2qy#Ny#deI)~A=Oid*NkfmT^#O7xs1 zN&=IDvvuB{&iRN_!0`plLua*SN$K4}8a;}Qfr8G8`t$ck^WmsBDA&Ev?c0;U;z@-bcK`KovlCd1w5%SiU0rr literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MR new file mode 100644 index 0000000000000000000000000000000000000000..bd9cbf662d289492fcc3e523c59bf776f5f81c48 GIT binary patch literal 192 zcmZ4UmVvc=7Xt$WBO@aNvtdjMhzZ0@KnwyvQC7ofbBkCA7bMAKXbw`r!1x~sV8Xam T5@!IKd1zdqYkY$c7NM{Jptu>q literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MS new file mode 100644 index 0000000000000000000000000000000000000000..f4dd3eca9fa8c0a7bcb24dc89ff2b2040b78c68b GIT binary patch literal 225 zcmZ4UmVveWHUk3#BO@aNN3@Y;Y)nc_3WyKH%s>nRKq+2J4SOp?!x{^V8cRz}h%iVI vv!$USNGSv3e;|N~gSBu$wP2_RnI~ujGz^!SKshus@pBm%n0$i~cB8NWbuJ WkV+81YBZWnXk4JneM2C+F-QPyl_e4Y literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MU new file mode 100644 index 0000000000000000000000000000000000000000..56c4fd644154094740ba45dcc4d7f011ecbf2cb0 GIT binary patch literal 254 zcmZ4UmVveW2Ll5GBO@aNPqd+hWo%4JwULfVEl`XZidld(D-eSKP#LeGVYG>9Y>lO5 zw5eq*NDPQUYJm)9Lqih~mx1v=5P%pEK!i4s(c*?s+iNuJtt?_vVp4#%XvU<#jR9I< TV1Q-;el7z8lW!fGT(mHSDbnjA{&{ zEi7X-L1I7*QUhc#8yXmaxD1T{fdIsS03x)3j8+C29c`d%Y_4k=TN7=fYX)?RW=u+r piGhg$&_WZ_SVOpxAj=HUECZUs23LmSE)zpEr9i*=hQSO&qXAhiCQSeU literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MW new file mode 100644 index 0000000000000000000000000000000000000000..27ed1791cb9e773a63c529399433b3449c2f278e GIT binary patch literal 282 zcmZ4UmVvd3fq_ww0Z1@1G6+W-T3E)$q{O6X*jvS!3f}P07zzQ~lfHcr!zTptZVUPe8cOz&3 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MX new file mode 100644 index 0000000000000000000000000000000000000000..f5b17552ef36a8142f8a104f0961c04f95ceaba7 GIT binary patch literal 324 zcma)$F%H5o3`HHuLf(+eNt8O6i5U*kW*%`kUE#9C{$3~o~h4yan{hEJFUyZyUh zaPM@#JcJfVV(Ds03yh!9G}o?ki>dqdw4N4C zXvGvY?dd#gDaD8{UJH6u7G*7sO7~h(z{QB?FPe+aq_u?%Oz$=4%(jU;5eg|u!?|v^ zck;=q5~?O(7z-#lp#%s4xHJ}nG9n=NBMn3g!34qq>!D#1Zdwm+L=|nDzG#Z+JDj~B V8oBMkzm|nV2+mzSJ{iCt_6243Vsroi literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_MZ new file mode 100644 index 0000000000000000000000000000000000000000..fcce2b377366e6c513680a841fbbb159b991fc69 GIT binary patch literal 256 zcmZ4UmVveW7Xt$WBO@aNhha=gwULf-Es)Oy#LPg<0>mHylol}5u(vXdHn)tev5Ypi zh}8rM12IS$kil$dXb$2sF#ZPu5CZ~;(+RRb8e~DVfsw9hY)nc_N)4J_VB@gbgJvxn N7w8$^D41)|XaGSoC}#iw literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NA new file mode 100644 index 0000000000000000000000000000000000000000..c69a95ec37bb6742cb170f1073e2c6c5bfee5cf0 GIT binary patch literal 244 zcmZ4UmVveW9RmXcBO@aNceJ5pY)neEk&a0%P>30dS%5Sv5Q6|v6|13vp`js&4a8t^ zm>5Waf$={OfEW;fR|Cj6DGhroLxUPiV@;r`H6Tt*N{yvvOiD}&+zbY0O9KNm)A4f| M7?}JVVfxW%06XI%*8l(j literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NC new file mode 100644 index 0000000000000000000000000000000000000000..d1ae2941e41924c648d4bb27ae2da8cb43e63f6f GIT binary patch literal 340 zcmZWkOAZ1d422nWVLXVFNWy0d#ElCVE=;@tu;UbCy^&Y*3|c^q8Jo0)e%^b%KiG0& zjGq|=&eLDdNzq#E2oC7mkh*>!Ph+{`!$cDWQcG52UrWy+tStx_0#jxhZXI^LkcM|bs0zF; z*tf(qF4WBr6&jcjg_sS_8D+^rVjyrKu_KF3Vw4#srskL|dmov~2F^J~M49-!jYx6` lVJ5rSM@-te$v+Rn-|B;G7R$GhuhwAgLR)TjIZx(`{sFjAMrHs2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NF new file mode 100644 index 0000000000000000000000000000000000000000..851a2b4956cf5131e27b2c1be38c630391166de1 GIT binary patch literal 221 zcmZ4UmVveWIs*d(BO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F+V(;9PgO^7f^5woSC fAxJ3$<9{H4i4)X9qLFAepm7-(nEc!jR->>0ibEjj literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NG new file mode 100644 index 0000000000000000000000000000000000000000..7229d6a28c9d099dbce23b3a4556482436b0d2e0 GIT binary patch literal 254 zcmZ4UmVveW2Ll5GBO@b&P_&^*Y)nc_iiW*aOiHy;t)@Lth6#w7ftVGDK>(YN|0YFgGxOE5~LKP$fH1706*gbs$^7PGMwV R1?wds4fKGYJIs7E8UX4}9T)%r literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NI new file mode 100644 index 0000000000000000000000000000000000000000..62dd13c116fcfdefccc035bd75970a9ea886b1ae GIT binary patch literal 297 zcmZusF%H5o3`{7jh>4kzNDOw;l9Yv+g%70N`U)^V;%mGC&MinNVCgK`x$|A_53{%! zV>brPTC>dT>wWCI;p%tchV2ZffH|NA(weu&1Lr37;xnb*Ner3taUo;{ob&5$MY>7!i3{DuD8J0iWK^*2Qksu=Ov^J!B5 F^cRcUF_i!S literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NL new file mode 100644 index 0000000000000000000000000000000000000000..4c9128189c146aa44c7c2be49ffd1e140584214c GIT binary patch literal 384 zcmZut!41MN40M13Z@w%*9+m7Q0?MZgAQnjbtHcOMG~I~Rm;ug7e_+Y3{A{}a^6~-oX#WHp-(<~)DSE>_O;$6 z1?F@HC9*360r%AOP%4`N7t7hvU#sv@iQ{g_)`;{4;Bkc+1KXB8Kd{Gcyu|IAH~*F| Do+Uga literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NO new file mode 100644 index 0000000000000000000000000000000000000000..7f0731331e02fd1114ea94cdfde9151ff3f1c0cc GIT binary patch literal 330 zcmZusyAi@L47CY?f{rQh9fjmLB%$GGDPRD{U8VqKBUWPucru~k^6q5)-jn3#%anIx z?AhS4)@&ki>W7El*CR?xSTXq$eg#v2xnib1)>V5j)B?Gz#K9);!A$@g05TScLDoR^fviykD*{>t mwaL-~Vv}LCp{_}6jgh7%NIeK(wF}K^G%nC%egP2O7$gASrYW)j literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NR new file mode 100644 index 0000000000000000000000000000000000000000..317c9d3fce467811d554ea1eb0b1681d2fcb5305 GIT binary patch literal 213 zcmZ4UmVveWJOcv*BO@aNt6@w^ObUnt#LPep0zh$gL&InTU87it07#nI(9i&+h=K7x r5WvLoC3j31k~k6lN-fho**sfyplvrUH!y0QV>wrT_o{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_NZ new file mode 100644 index 0000000000000000000000000000000000000000..e922a873ad8c45978c937219ae8e4d7cc34f57b2 GIT binary patch literal 350 zcmaJ+K@I{T41`^cUy)=t*-`{o51zev^CHV_U!mO}`8D65EyTodu%S>oWoCH3)cUTJ zzAE0dR-0*lVCNRTHk>Wzic^Bo767E;6od=u2r$6D0!ru4Ga)?l6v6g%;01)i0C8oJ zMrRy_IA98fqV0E~9}|1C9WLZ$+5=f1haM9JXN}mAC|<;&(r*qavf32dk6@E$Vq>Pc*3XogwS2p|+`g^q`~cx`HO>G4 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_OM new file mode 100644 index 0000000000000000000000000000000000000000..3fff62fbcb4d4887213f3d7492e0d830b9de8294 GIT binary patch literal 285 zcmaKmF%H5o3`HGOhB9*qI#j9?r^PJnNQeWZ*?J0UZp76%1K2nRKq+QRLqiA$Bn9Gu6fiLU2LhNl k4uv4?+=d3xM!F`kHK@iI8W^D&gP+U5z!cz!unvU<05UZj`v3p{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PE new file mode 100644 index 0000000000000000000000000000000000000000..f660b534d65eae75c2a3a473f272d4e7bcd6071f GIT binary patch literal 221 zcmZ4UmVveWIs*d(BO@aNt6@w^ObUnt#LPep0zh$ILk)W?1JfGAXfyLzO^7f^5woFz fDM%>;<9{H4i4)X9qLFAepm7-(m;zi8R->>0cTgb8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PF new file mode 100644 index 0000000000000000000000000000000000000000..b431f93433325eb32d4a28372897862c6643c9f1 GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBO@aNvtdjMhzZ0@KnwyvQ8vS9Q*(=02p=TNWM~Rf!oc_+2w=iE Ul@e(Lnu%y!po0S35LThE00vqbR{#J2 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PG new file mode 100644 index 0000000000000000000000000000000000000000..022009b726388ef4bcb25d794ff4f75b0f563c10 GIT binary patch literal 293 zcmZ4UmVvd3fq_wm0Z1@1GH^#57{nRKq)Rm!)PP(*cwYiLx>ni1+$@{ f5l9^a<9{H4iQ`vKieYGGqj4D+m;yWymZGo#-RK|W literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PK new file mode 100644 index 0000000000000000000000000000000000000000..228f85a6b21aaf1b00df041979c6b1d6a35ba8c2 GIT binary patch literal 265 zcmZ4UmVvd3fq{_$2pAa|88{4MQmPGgjB9~>W*}yQ(kwt41b|9J4K?hoK-efI#lFT= zvnJZqELIaD4Kj(z&=g|ae;|MfgLR6)bsFK&2r^$Dtjfr!#yHx*&?FXOe2t-Dw2_Ia Zxvpg_%t&lDp;?T^1$rmI8>StN1^~phDIov= literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PL new file mode 100644 index 0000000000000000000000000000000000000000..96ad400ae37e373bbf652bba971e8d28086b8e18 GIT binary patch literal 320 zcmaJ+I}XAy40Wi=!iqQpm8cXasA*U_urjbG*?Ni+Zp76%13dR5p$=Gju`R#n=e*uj z4n)ck9;Ij>*r(XX{@7h&|1c-}tUAn!871--kO2L_45G;mxL{`QgR6bQa07^FBr7VI zjY3Q6gOFkh?AT%SBNUbhX%dOcRZM21vE*!Qm0Qoj*aX+b9ke!_YnQSQj615#9GW(1 UttY!>>*|#MEk1Li_@% literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PM new file mode 100644 index 0000000000000000000000000000000000000000..b07b532a37c7e0663ea791898de2d7a0f3cfbb29 GIT binary patch literal 370 zcmZXP!41MN3`LVt5E2tG01`b^vJ+ZTE}a00d(vAjtU${~ti}xR-GpAS^zyegEQQMgQJ<3_Gd3!=t3OrGh^mY3Y#4ffmGs;Ha8cScoNr2e-Kh2irY06 Gf9Drba5Odm literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PR new file mode 100644 index 0000000000000000000000000000000000000000..03bbbbd9c7a5e80130a5e760075ebade03eff3d0 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L&F*i3r&a^NCmT{p&>{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yPAP8nS8Vvx7kQ{XY literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PS new file mode 100644 index 0000000000000000000000000000000000000000..3a437d58e3d697e05c7ceb9643c1d615627fd9a7 GIT binary patch literal 255 zcmZ4UmVveWCj$cmBO@aNhha=gwULf-Es)Oy#LPg<0>mHyl;$(ku(vXZHqbSStuZsx z1PKB$ND+|1Y-nHr;xaJ)2LccS0)YD14I!F<0%#gQrb-~0YG`CsV`2g{yvEWJWIh;R iH5;gr)zHu=CIzSjWGL8~j0`M5F-&JL1q4Hk!XN?46(ODg literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PT new file mode 100644 index 0000000000000000000000000000000000000000..be530d73a6c0fad2b37ebac9ccb6ee4e82e6258c GIT binary patch literal 404 zcmZusv2nvN45T8*BY1)oVUat4A}Pv^R!EVKLZ>NWcmlT>BdcYGDZXWXpttj&zsDL(GxNz&=ZSqf+k%=Gf}0CUbH1@Orp_i zDud?MpfF_7p;8c?DrYRU;W;yFnmj9mpvYM4QpAQfOH}z~fJCHb3tG^`y97_RqQ$?q Q?p)qIoqKqF+t7dN4`lgH@c;k- literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PW new file mode 100644 index 0000000000000000000000000000000000000000..dfa8e34031eed862ecc56df949ff82e3622bbd5d GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG85l2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6cCQE289IxQvMk7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_PY new file mode 100644 index 0000000000000000000000000000000000000000..f8618ca22b03009e28aeb3193f6f84c7dc29cad1 GIT binary patch literal 359 zcmbVH!41MN40NbyN8rH%R4P(jQi<^C3Vcx#UYUX>8?hQQz`3pZC=w4&I>%1p^ZEIr z?Sn|&2|+2^Ic`m7gO5HQ`iqalsWG|k@m$O-aaN!J9Tm6dWSOM`ZA%4`WA6bJvx|5aply}0l9`2tTbBEE%NtFV9u9*&_#ZO~kKQ&hNY!Hh_?N zN1~H4RV~e`99pue9;TM&WnRXddyTm*Bxhc`k&Af8a%nalq3+s6|5C8YIa>!|qKPKN z90u+9uml4N185_$sF31mJcSh}b`3*Gh6-jCnAR-KjulT77`aDmk2CUkyb!;*yy2nRASpw`XhS0t(^!ZINS@iy&=91G zf$={Oz{J6-*}$sN)PjsrHPo=TGKeb>!45X5{OQ$TEGgd$ikh0^1U5dV;qwLN3M9X}l@5tBshUO?aQ$v7~NZyf0 zU4NP^kF8D- zuoc|tg%)Tnk^({se=vVkL$@tT_ZHw+x?`PAmFiQ^KGdDrFk3{T^}>aUl;o36HBhyL zmYLgbim~eBocb2c&4uR9Up?C}*eM?%+0ki{UX(4812xjiI2R@LQy^)B97EEsNMgu{ b<810P26P7azP|sW@1XpD{nh7(S0C67s{27! literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SB new file mode 100644 index 0000000000000000000000000000000000000000..46fc12706d4e8cafd16d81a1c432d71fed3a18af GIT binary patch literal 295 zcmaJ*I}XAy40WiOxC1jCD#Z?IViqK>!02W{Jq7ZSxEf~w8`Px|Sn}uj`STu6*xmuc z9xQ|aJ3%S~w`rbcZ<%-IZpL=Z`~^-q@&O1hv!(xI(ARHxIG-evU01Y6O(o?f5v@3K z6ST)V3VABxGPFt@YU`Co)>4Yrl$AeMu%QxZN}97#TB|bmiwaYRF|O48hX9-FW!Ycl EH>IyNqyPW_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SC new file mode 100644 index 0000000000000000000000000000000000000000..b3b13e738d8ef54c4eca633ded18bba87e75c8cf GIT binary patch literal 310 zcmaJ+I}XAy3{5CZj9h|BM2gci)GQ1f0WrDRI0cv+aW&2W&q6R12}>`wpPxUuKiuNt zoDU9<_iib~bv$3wrn`Zf0Szz*%%E7&dcPx~T!yM8w#v*_0ZfUYAtFnif5I$y8=9M6 zu`#HeY^=nBQ*S_P^u0{Az_K2aSrB`@r*Id?RPbf Rig9w({}i7;9zOjO{{kN*HPrwB literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SD new file mode 100644 index 0000000000000000000000000000000000000000..9c84b486ed2715cb71668a004bfb782a5d0c8e03 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6zqbq289Ixda)To literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SE new file mode 100644 index 0000000000000000000000000000000000000000..2624935a08dc4cf971581effb67c753fa1c63cda GIT binary patch literal 558 zcmbVIK~BUl3{1OpB~FMxfJ7uJ*-qM|TsZLpj%jXv1#5o9Blr++fN@%J;YK7Utu-?q z&&QV=-kj_2opW8+xtqdcNaIr1?IMrUJK9&M)A0^?&nP=U-!VTtKZ)WBImb2tbg+p=vgqXwKNk zM6F0C_M|M{c5joTW{8b(MtB&~l31vqQ}$u)W5$HAZI928KXa#H7@qSOhi;Xo;bL S0h%TFxeN?U!5%QDpwR#*S0>*8 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SI new file mode 100644 index 0000000000000000000000000000000000000000..68f0d5610bb29297a42477fa8b06b4d9a55c223f GIT binary patch literal 357 zcmZusF&4rg3A50$~4HWNBSJq(0Ku+zIW|6~*5Q8wsLuFIl}KQ$#BY>7 zO5x1H&V+$hiK?ZdQ?D@af}{67i-^mq@mmdX literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SL new file mode 100644 index 0000000000000000000000000000000000000000..53fc6e66dff5219ac7e54430ef05ac648528d322 GIT binary patch literal 279 zcmZ4UmVvd3fq{{a0Z1@1G6+W-m|4cgq{O6X*jvS|PwQUGKy8yH%GxD1T{fdIsS077~|h6*4ItuZq&F))B@#%3%~13OR^ c$hAOqAUnbCV`N|j>m?u!^i{AA%zQK&0H-w}c>n+a literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SM new file mode 100644 index 0000000000000000000000000000000000000000..9ce5a90dbfa7daac96137e85a1e2f5ff0f2c8f28 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoeQ;S%L07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B-cz6k43SO8l|97X^D literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SN new file mode 100644 index 0000000000000000000000000000000000000000..424f4f8f876bcc427facd5b907a847044533deea GIT binary patch literal 417 zcmZ`#OAf*y5QSPyOcR%`Jb)&eFk@-e#CQWYE-Aa7Lh&9R!mD`)-_Wu!QIdffnD-f8 zZ)I*u>8HY`wW>UE==wWt+yhqzQ6MIWa;&E~WubdXtMk#3i@x25b!1f5Mp}blCvbrX z{0pj8K`p?G)b6=%LiBY5f(#RgC?_SY4A<6L)JfBjh)Ir+P9z`{J14P2zBz=5Br$h= zbmC_;=k0dTBOF;VlIMX^*b*IsZJzv5mHylx8+GGzGDM7$gH^fJ8uC l2FCwD0AfG@PQ@T&kZl1g2bp7FfMyPUF3^3!K``6UXaF^98=n9G literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SS new file mode 100644 index 0000000000000000000000000000000000000000..23d11a49916b7a566ad9020726fee94a22433f81 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6da7O289Ixd>I*0 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ST new file mode 100644 index 0000000000000000000000000000000000000000..1d52d4ed86b5ccf0c1acd127c50d5d9df039f9b4 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLqj772P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6dZ!E289IxJ1H2z literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SV new file mode 100644 index 0000000000000000000000000000000000000000..b37645ec17691fcc33492b387537ffbbfabe81a1 GIT binary patch literal 327 zcmaivK@P$o5Jd-@){R^5Ac;*FsHC{ChcIyi>^Oze8+kR)pns|>W8x!@>Er7g1BD~m+jPE6E^~|iR1?&4UR~Jq1a}CiPvaW-{szKmXstsCfM6hDE cUthy`4PK^O5F(idY%4zI&ozcSUxfdm7k?`)TmS$7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SX new file mode 100644 index 0000000000000000000000000000000000000000..1c247755b99702cd2c9578a79ad7ecbc82bb7351 GIT binary patch literal 205 zcmZ4UmVveWI0FL%BO@aNt7S||ObUnt#LPep0zh#tOAUJ~L(3Wq3r&a^NCmT{p(RKi i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yPI09xk8VvxU3mmQh literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SY new file mode 100644 index 0000000000000000000000000000000000000000..b71062fa2dae57a8dcb7b441b9ec3e9095ddcfc5 GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&InTBjZ?z07#nI(9i&+h=K7x Z5WvLoC??t%G*i*I3=B-ckqGNhSO7@v94G() literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_SZ new file mode 100644 index 0000000000000000000000000000000000000000..7284651d5722da3c9c421b5414ec1b736cd4fa13 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt7S||ObUnt#LPep0zh$QOG`@#2P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6dZ-H289Ixe8Cx5 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TC new file mode 100644 index 0000000000000000000000000000000000000000..7f9f221e452e48ce5d0f8c5ecac4ec6c3e8b0b5e GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4KmHylomA9u(vXdHn)haF^@Jh zGLO{+i32f69gx9nXlM@NGBExJ0uTcNh|~(QLJVYufuUiIVYC6NJz%52b{L@9fu9TX LNr*elC1^ANN^T~M literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TH new file mode 100644 index 0000000000000000000000000000000000000000..5ec30571cbafb3e9f6248bff0e9a822f30c97953 GIT binary patch literal 854 zcmZWnOHN!d5cFd}WR(l#0vu&ICA?M5AaHp^Me}!|xxyIoK_p|)I|HI?`2+eCB+BBBEkJ57K zV{bmh-0euEj*Pe%M{e}j3a8Lj>-j=^hb>J~PifT$f;q`9!1*RdxsZx_yN74~;T&%EC^U>kX zyq8|YP!~c94NAvtM*xQqP=t9o+o5=nx}>nS05Y|dSuFy#s2#DCr4d?z>U7pjAO=1F zmApVDq>LA!x)2i)fGbMN&W3w>@VurIo4Sc3q*y>P&BDkRDrGWt*-=2UN$fkK0w?J? zsW~*bKX=l5bo$>M5OTb(Ap-Dd9fhsN0g`>o2e!I{@Z^9UVLIr7$C3<#ierIMuo>JI zE>Z9Z(A6+;)DI<}giIZARmDyrLmHz(M!VN&6COY(dloL;o-dH}b&b42*R4q8;J$fd TWwhBo@X^3`_4KfeZ@>QmUNF00 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TJ new file mode 100644 index 0000000000000000000000000000000000000000..de63252fc77a968c6909ab8255e93423d6d0dfe9 GIT binary patch literal 224 zcmZ4UmVveW76StVBO@aNt6@w^ObUnt#LPep0zh#-Lk)W?gJ?rtV-#&*XlxN%V{TMq8Es%5s|hm)WWIp`n)&#-3=B*m JJ}~`gGys1vBR~KE literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TM new file mode 100644 index 0000000000000000000000000000000000000000..7623973b28042cfe236e94b782cc70eca6cc4795 GIT binary patch literal 197 zcmZ4UmVvc=KLY~;BO@aNvq4M>hzZ0@KnwyvQFeo9LtPWgScm{fn#sTrq=td8q5^DyUk!W0?lR|tEcA>BUFa;Wp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TN new file mode 100644 index 0000000000000000000000000000000000000000..192ca3302c3204069bf7f1bf7d00f1a663381b8d GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL(6CbbBkDr07#nI(9!^;h=K7x Z5WvLoC??t%G*i*I3=B*mehBMOSO9Dl9Bcpp literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TO new file mode 100644 index 0000000000000000000000000000000000000000..4a340a72c07513566f7076e9a4aa40458fb53853 GIT binary patch literal 230 zcmZ4UmVveW0RsaABO@aNt7S||ObUnt#LPep0zh#AOAUJ~L&F*)qZ(u58cRz}hzv*_ jv!$USNHqiFe;|N~6QhfCgVF3k<1#QXh4>>JfWiU*a^fSZ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TR new file mode 100644 index 0000000000000000000000000000000000000000..0847c59312fd7667713e7796cc79dd6e80e2751d GIT binary patch literal 1027 zcmaKrO|BF%41{}_#|}6Lkr)&waemlv2gEMZyEz4z8*vlP!UfpC=kz>~;E9%^PA9g@ zuB!g}eS7|C+s;3>Z9AP#+lwiev0rbW)0^^zv-5pD@P5wnhp@Nu`u#hZG3}O;cRETJdMSx^qHuR;wDUG%@8cHfudtJ*J0ay@FaJE^A&zVl^Ua zp-xOzTd`K)QDr5|Oiphk-w{1O>C#}gS=#P}9Air6fB}WTJXTL78@yVh&7KML8KtPD z5y`z&l&8hk64y+~t@8$M0?k=S8G<|s)dx%}{8_88(mFLh}^nQ+|-%*(`lWfawl>Y)uM` zJaT{hF7C_fydH$ReE@>xMe?0vyu9p%ng_F#3E_H!s%I?!)$Y8Vr4$Z7e&Fb-=NILk B>Z||& literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TT new file mode 100644 index 0000000000000000000000000000000000000000..bbf62cfc01b1c64d161b82efa4dd98b5e1ad569d GIT binary patch literal 214 zcmZ4UmVveW0s{jBBO@aNt7S||ObUnt#LPep0zh$IOAUJ~3yT`dXambwO^7f^5woR* p1xP6a<9{H4iG#JUS%MYA#6W5-4M;Q#&1f_(0|Qe?2+Vvm8UTAgAD93D literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TV new file mode 100644 index 0000000000000000000000000000000000000000..4625d190d1bb35fe0cd636283f0a85b00bf1280d GIT binary patch literal 200 zcmZ4UmVveW5Ca1PBO@aNN3@}3Y)nc_3WyKH%s>nRKq+QRLqiA$Bn9Gu6fiLU2LhNl g4uv4?oQ5D{Yfud_G%!Fj1V5L7fhi;mVHpYw02!|w6951J literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TW new file mode 100644 index 0000000000000000000000000000000000000000..17b8ee5a5ad3df9fb2f10089d5d394c661761691 GIT binary patch literal 354 zcmZWl+YQ1n3`}`1zy}*piAr`#(u5zDKtffTzfJ*WBUWPuIEOE&C0n-ceCOo(GRvDW zRc}zL%4~QT@Al9>Fwc;4B07#@tvE0M`5*yZ wmYCRitk!k$*As9l>7_fh^6tAljN(WFrtnMkPTygwH=;=Vjrgm}wE)xd0U~KQW&i*H literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_TZ new file mode 100644 index 0000000000000000000000000000000000000000..1118137e0c313630b1a32d88b2153665bbbd21d8 GIT binary patch literal 302 zcmah^K?(vf3`|^#Cr^U-0l_^8%~F+k*-v<~?X9oS^+$fqH|V6RCl?G%NXSekc|6Ho ziFiXu%(RRWG^divwm+qE>+Wrj(F|w+2Uvi)5-=qC-BI(P(Q9r8Rka~tWE72vx0d*Y zuwo487h>Wr?4h2Lna8?%r1IS#4#E2my)K$`fN&0`Jpq#0*Rz>i)&Cje+4E(*@+ZFm D1>5IZgYqjX8Zh9YXZd(rcmm-pJ&#=!C0#MhqX%DueUEZ^#jw|T$!5GwM2+>8p zRtZ_sI4b=FBzXgEmcMPBXoV{s#h>I1YtG TX-6{+jmyBm6zYz!289Ixdn*}7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_US new file mode 100644 index 0000000000000000000000000000000000000000..2c5228726391b2b79e765f8c14a24f4b1191c202 GIT binary patch literal 794 zcmZuvJ5HQI4E{IEhK7cMiVHAOko+3Ym?lkb5T#nS;}l?y!7aENJtd$21(Ya^#`Eyo zpZ)x@?CzIkd%i5oX0ut&_Iw?O+q(z((I3G(0d3#!9q#X-T2Q@UmUQNftDiTxRCCT& zGEmvzv4sv)U&UlnLQg03eKzfB_0`^U^bS)IZrQ=Zwiy{}O|pl~mP2UF)m#+j)NFMo z!_(NBYsm!Eg>sm|LW43YQk2X?!IF&OZ5}<9c6Y?>2rFSZy_^q;W@{)#NMrRJZjv(` zna7CcC9UKg#649Syo^@t9$d+`nE{_|yrWUb0gc@XL%j>X)50&9SJ6L+mGl=g`~d(o z#Ks}_KGBvOd%EuU22k0{u~mvz)n^{QXvQ(xMM%YIoEMlNz(X$FoLGm|=MKVPMBW{x1MwA?}~waPif8 E14P16#@ aKM=sg@u?=>AT)E)xC{(TVU7q3QCI-Qs~pw< literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VC new file mode 100644 index 0000000000000000000000000000000000000000..cce977b1a94f2e64d3a53b5e28da5c1269b68461 GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNt7S||ObUnt#LPep0zh$IOAUJ~L&F*iiyBKyO^7f^5woSC kAxJ3$<9{H4iG#IpLA7A0C(%4KnRKq)>$4SOp?qZ)HV%^FKXLx?y? j6|{e i1LJ=nfQf_EgQQ>r5QU_ef@UZhmw|yP%oAof8Vvx7P8@Oo literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VN new file mode 100644 index 0000000000000000000000000000000000000000..3246aa77cea80f484d798ea60b482fcd41abe68d GIT binary patch literal 203 zcmZ4UmVveWC<6lnBO@aNt6@w^ObUnt#LPep0zh$gL&IoeUDH^I07#nI(9js9h=K7x Z5WvLoC??t%G*i*I3=B+RehBMOSO81#94P<* literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_VU new file mode 100644 index 0000000000000000000000000000000000000000..3e5597175382cc9e663f5c6cfca978b714af92e8 GIT binary patch literal 191 zcmZ4UmVvc=Cj$cmBO@aNt6@w^ObUnt#LPep0zh$QLqj772P6gJffO(>{s#h>I1YtG TX-6{+jmyBm6c&oG289IxJB%2_ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WF new file mode 100644 index 0000000000000000000000000000000000000000..d2cf29bf73665f66f1945238d4c65622c6e853fe GIT binary patch literal 195 zcmZ4UmVvc=F9QPuBO@aNvtdjMhzZ0@KnwyvQ8vS9Q*(=02p=TNWM~Rf!oc_+2w=iE Ul@e(Lnu%y!po7BQ5LThE00#*gUH||9 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_WS new file mode 100644 index 0000000000000000000000000000000000000000..6eac506ea908accfad42247b601ecbdce3afce64 GIT binary patch literal 267 zcmZ4UmVvd3fq{{U0Z1@1GH^s2TE@nt#H4`uK+FupAOMu&x74t=GBm8Qj5g6Vvy9b* zNPv_vTN)aI6f-dX2LhNl5t=~8svClgjW#rjtucx=&^3##i8i*3HPEaiw5tgH{0OqkFTmS$7 literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YE new file mode 100644 index 0000000000000000000000000000000000000000..86864619cac48504e40a61468567cf548bc47a57 GIT binary patch literal 206 zcmZ4UmVveW1Oo#DBO@aNt6@w^ObUnt#LPep0zh#NL(6DG6I07rhzLlY+0fDuq>6#@ aKM=sg@u?=>AT)E)xC{(Tk*){}QCI-nm>mrO literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_YT new file mode 100644 index 0000000000000000000000000000000000000000..23e960b5049f92a0a39e29010c5b59595a1c973c GIT binary patch literal 211 zcmZ4UmVveWECT}rBO@aNn_)~!Oo}~_#{|X9KpF&qlAMMb_Ev^QHKv*nA)p`wlc6ai cSo%K@z=ZLsCf*=4bJ4g!7ec|656>r0(>%>W!NGY0Q+R=_*%1YB z2Uak0kus8E_JRzIQU&it@wh62CX$@p|FT;Db)gl$Bm^&-)+lrcXxSEG?$UVdSyBtR zcBw6-?wquB%4Np21+?rlq@N;EeJ)6bj{YZ>F+sXeNKROlD>q77W+W*kBFM_8T6G%O jwuT`>Nf&{A&=%4yfl&_vx7VHg&h*}6uWv8P|8af*ZI?f{ literal 0 HcmV?d00001 diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_ZM new file mode 100644 index 0000000000000000000000000000000000000000..84d736c22180e9b564c4473f434e38830f7b9ff8 GIT binary patch literal 218 zcmZ4UmVveW3IhWJBO@aNN3@}3Y)nc_3WyKH%s>nRKq+oRL!%l?%VA single country calling code could map to several different regions. It is considered that + * {@code countryCallingCode} belongs to a geo entity if all of these regions are geo entities + * + *

Note that this method will not throw an exception even when the underlying mapping for the + * {@code countryCallingCode} does not exist, instead it will return {@code false} + */ + public static boolean isGeoEntity(int countryCallingCode) { + List regionCodesForCountryCallingCode = + CountryCodeToRegionCodeMap.getCountryCodeToRegionCodeMap().get(countryCallingCode); + + return regionCodesForCountryCallingCode != null + && !regionCodesForCountryCallingCode.contains(REGION_CODE_FOR_NON_GEO_ENTITIES); + } + + private GeoEntityUtility() {} +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/MatcherApi.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/MatcherApi.java new file mode 100644 index 0000000000..d2c32b9eaf --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/MatcherApi.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; + +/** + * Internal phonenumber matching API used to isolate the underlying implementation of the + * matcher and allow different implementations to be swapped in easily. + */ +public interface MatcherApi { + /** + * Returns whether the given national number (a string containing only decimal digits) matches + * the national number pattern defined in the given {@code PhoneNumberDesc} message. + */ + boolean matchNationalNumber(CharSequence number, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java new file mode 100644 index 0000000000..ed18ed0948 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexBasedMatcher.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Implementation of the matcher API using the regular expressions in the PhoneNumberDesc + * proto message to match numbers. + */ +public final class RegexBasedMatcher implements MatcherApi { + public static MatcherApi create() { + return new RegexBasedMatcher(); + } + + private final RegexCache regexCache = new RegexCache(100); + + private RegexBasedMatcher() {} + + // @Override + public boolean matchNationalNumber(CharSequence number, PhoneNumberDesc numberDesc, + boolean allowPrefixMatch) { + String nationalNumberPattern = numberDesc.getNationalNumberPattern(); + // We don't want to consider it a prefix match when matching non-empty input against an empty + // pattern. + if (nationalNumberPattern.length() == 0) { + return false; + } + return match(number, regexCache.getPatternForRegex(nationalNumberPattern), allowPrefixMatch); + } + + private static boolean match(CharSequence number, Pattern pattern, boolean allowPrefixMatch) { + Matcher matcher = pattern.matcher(number); + if (!matcher.lookingAt()) { + return false; + } else { + return (matcher.matches()) ? true : allowPrefixMatch; + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexCache.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexCache.java new file mode 100644 index 0000000000..f29005e23b --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/internal/RegexCache.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2010 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.internal; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * LRU Cache for compiled regular expressions used by the libphonenumbers libary. + * + * @author Shaopeng Jia + */ +public class RegexCache { + private LRUCache cache; + + public RegexCache(int size) { + cache = new LRUCache(size); + } + + public Pattern getPatternForRegex(String regex) { + Pattern pattern = cache.get(regex); + if (pattern == null) { + pattern = Pattern.compile(regex); + cache.put(regex, pattern); + } + return pattern; + } + + // @VisibleForTesting + boolean containsRegex(String regex) { + return cache.containsKey(regex); + } + + private static class LRUCache { + // LinkedHashMap offers a straightforward implementation of LRU cache. + private LinkedHashMap map; + private int size; + + @SuppressWarnings("serial") + public LRUCache(int size) { + this.size = size; + // Using access-order instead of insertion-order. + map = new LinkedHashMap(size * 4 / 3 + 1, 0.75f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > LRUCache.this.size; + } + }; + } + + public synchronized V get(K key) { + return map.get(key); + } + + public synchronized void put(K key, V value) { + map.put(key, value); + } + + public synchronized boolean containsKey(K key) { + return map.containsKey(key); + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java new file mode 100644 index 0000000000..6bf4df9413 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/DefaultMetadataDependenciesProvider.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.ClassPathResourceMetadataLoader; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.FormattingMetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MetadataSource; +import com.google.i18n.phonenumbers.metadata.source.MetadataSourceImpl; +import com.google.i18n.phonenumbers.metadata.source.MultiFileModeFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.PhoneMetadataFileNameProvider; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSource; +import com.google.i18n.phonenumbers.metadata.source.RegionMetadataSourceImpl; + +/** + * Provides metadata init and source dependencies when metadata is stored in multi-file mode and + * loaded as a classpath resource. + */ +public final class DefaultMetadataDependenciesProvider { + + private static final DefaultMetadataDependenciesProvider INSTANCE = new DefaultMetadataDependenciesProvider(); + + public static DefaultMetadataDependenciesProvider getInstance() { + return INSTANCE; + } + + private DefaultMetadataDependenciesProvider() { + } + + private final MetadataParser metadataParser = MetadataParser.newLenientParser(); + private final MetadataLoader metadataLoader = new ClassPathResourceMetadataLoader(); + + private final PhoneMetadataFileNameProvider phoneNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto"); + private final MetadataSource phoneNumberMetadataSource = + new MetadataSourceImpl( + phoneNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider shortNumberMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/ShortNumberMetadataProto"); + private final RegionMetadataSource shortNumberMetadataSource = + new RegionMetadataSourceImpl( + shortNumberMetadataFileNameProvider, + metadataLoader, + metadataParser); + + private final PhoneMetadataFileNameProvider alternateFormatsMetadataFileNameProvider = + new MultiFileModeFileNameProvider( + "/com/google/i18n/phonenumbers/data/PhoneNumberAlternateFormatsProto"); + private final FormattingMetadataSource alternateFormatsMetadataSource = + new FormattingMetadataSourceImpl( + alternateFormatsMetadataFileNameProvider, + metadataLoader, + metadataParser); + + public MetadataParser getMetadataParser() { + return metadataParser; + } + + public MetadataLoader getMetadataLoader() { + return metadataLoader; + } + + public PhoneMetadataFileNameProvider getPhoneNumberMetadataFileNameProvider() { + return phoneNumberMetadataFileNameProvider; + } + + public MetadataSource getPhoneNumberMetadataSource() { + return phoneNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getShortNumberMetadataFileNameProvider() { + return shortNumberMetadataFileNameProvider; + } + + public RegionMetadataSource getShortNumberMetadataSource() { + return shortNumberMetadataSource; + } + + public PhoneMetadataFileNameProvider getAlternateFormatsMetadataFileNameProvider() { + return alternateFormatsMetadataFileNameProvider; + } + + public FormattingMetadataSource getAlternateFormatsMetadataSource() { + return alternateFormatsMetadataSource; + } + + public String getCarrierDataDirectory() { + return "/com/google/i18n/phonenumbers/carrier/data/"; + } + + public String getGeocodingDataDirectory() { + return "/com/google/i18n/phonenumbers/geocoding/data/"; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java new file mode 100644 index 0000000000..76122b8ad8 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/ClassPathResourceMetadataLoader.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.MetadataLoader; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A {@link MetadataLoader} implementation that reads phone number metadata files as classpath + * resources. + */ +public final class ClassPathResourceMetadataLoader implements MetadataLoader { + + private static final Logger logger = + Logger.getLogger(ClassPathResourceMetadataLoader.class.getName()); + + @Override + public InputStream loadMetadata(String metadataFileName) { + InputStream inputStream = + ClassPathResourceMetadataLoader.class.getResourceAsStream(metadataFileName); + if (inputStream == null) { + logger.log(Level.WARNING, String.format("File %s not found", metadataFileName)); + } + return inputStream; + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java new file mode 100644 index 0000000000..e923dfadf7 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/init/MetadataParser.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.init; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadataCollection; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Exposes single method for parsing {@link InputStream} content into {@link Collection} of {@link + * PhoneMetadata} + */ +public final class MetadataParser { + + private static final Logger logger = Logger.getLogger(MetadataParser.class.getName()); + + /** + * Creates new instance in lenient mode, see {@link MetadataParser#parse(InputStream)} for more + * info. + */ + public static MetadataParser newLenientParser() { + return new MetadataParser(false); + } + + /** + * Creates new instance in strict mode, see {@link MetadataParser#parse(InputStream)} for more + * info + */ + public static MetadataParser newStrictParser() { + return new MetadataParser(true); + } + + private final boolean strictMode; + + private MetadataParser(boolean strictMode) { + this.strictMode = strictMode; + } + + /** + * Parses given {@link InputStream} into a {@link Collection} of {@link PhoneMetadata}. + * + * @throws IllegalArgumentException if {@code source} is {@code null} and strict mode is on + * @return parsed {@link PhoneMetadata}, or empty {@link Collection} if {@code source} is {@code + * null} and lenient mode is on + */ + public Collection parse(InputStream source) { + if (source == null) { + return handleNullSource(); + } + ObjectInputStream ois = null; + try { + ois = new ObjectInputStream(source); + PhoneMetadataCollection phoneMetadataCollection = new PhoneMetadataCollection(); + phoneMetadataCollection.readExternal(ois); + List phoneMetadata = phoneMetadataCollection.getMetadataList(); + // Sanity check; this should not happen if provided InputStream is valid + if (phoneMetadata.isEmpty()) { + throw new IllegalStateException("Empty metadata"); + } + return phoneMetadataCollection.getMetadataList(); + } catch (IOException e) { + throw new IllegalStateException("Unable to parse metadata file", e); + } finally { + if (ois != null) { + // This will close all underlying streams as well, including source. + close(ois); + } else { + close(source); + } + } + } + + private List handleNullSource() { + if (strictMode) { + throw new IllegalArgumentException("Source cannot be null"); + } + return Collections.emptyList(); + } + + private void close(InputStream inputStream) { + try { + inputStream.close(); + } catch (IOException e) { + logger.log(Level.WARNING, "Error closing input stream (ignored)", e); + } + } +} \ No newline at end of file diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java new file mode 100644 index 0000000000..d621e0cf5f --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/BlockingMetadataBootstrappingGuard.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; +import java.io.InputStream; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A blocking implementation of {@link MetadataBootstrappingGuard}. Can be used for both single-file + * (bulk) and multi-file metadata + * + * @param needs to extend {@link MetadataContainer} + */ +final class BlockingMetadataBootstrappingGuard + implements MetadataBootstrappingGuard { + + private final MetadataLoader metadataLoader; + private final MetadataParser metadataParser; + private final T metadataContainer; + private final Map loadedFiles; // identity map + + BlockingMetadataBootstrappingGuard( + MetadataLoader metadataLoader, MetadataParser metadataParser, T metadataContainer) { + this.metadataLoader = metadataLoader; + this.metadataParser = metadataParser; + this.metadataContainer = metadataContainer; + this.loadedFiles = new ConcurrentHashMap<>(); + } + + @Override + public T getOrBootstrap(String phoneMetadataFile) { + if (!loadedFiles.containsKey(phoneMetadataFile)) { + bootstrapMetadata(phoneMetadataFile); + } + return metadataContainer; + } + + private synchronized void bootstrapMetadata(String phoneMetadataFile) { + // Additional check is needed because multiple threads could pass the first check when calling + // getOrBootstrap() at the same time for unloaded metadata file + if (loadedFiles.containsKey(phoneMetadataFile)) { + return; + } + Collection phoneMetadata = read(phoneMetadataFile); + for (PhoneMetadata metadata : phoneMetadata) { + metadataContainer.accept(metadata); + } + loadedFiles.put(phoneMetadataFile, phoneMetadataFile); + } + + private Collection read(String phoneMetadataFile) { + try { + InputStream metadataStream = metadataLoader.loadMetadata(phoneMetadataFile); + return metadataParser.parse(metadataStream); + } catch (IllegalArgumentException | IllegalStateException e) { + throw new IllegalStateException("Failed to read file " + phoneMetadataFile, e); + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java new file mode 100644 index 0000000000..7275749578 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/CompositeMetadataContainer.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * Implementation of {@link MetadataContainer} which is a composition of different {@link + * MapBackedMetadataContainer}s. It adds items to a single simpler container at a time depending on + * the content of {@link PhoneMetadata}. + */ +final class CompositeMetadataContainer implements MetadataContainer { + + private final MapBackedMetadataContainer metadataByCountryCode = + MapBackedMetadataContainer.byCountryCallingCode(); + private final MapBackedMetadataContainer metadataByRegionCode = + MapBackedMetadataContainer.byRegionCode(); + + /** + * Intended to be called for geographical regions only. For non-geographical entities, use {@link + * CompositeMetadataContainer#getMetadataBy(int)} + */ + PhoneMetadata getMetadataBy(String regionCode) { + return metadataByRegionCode.getMetadataBy(regionCode); + } + + /** + * Intended to be called for non-geographical entities only, such as 800 (country code assigned to + * the Universal International Freephone Service). For geographical regions, use {@link + * CompositeMetadataContainer#getMetadataBy(String)} + */ + PhoneMetadata getMetadataBy(int countryCallingCode) { + return metadataByCountryCode.getMetadataBy(countryCallingCode); + } + + /** + * If the metadata belongs to a specific geographical region (it has a region code other than + * {@link GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}), it will be added to a {@link + * MapBackedMetadataContainer} which stores metadata by region code. Otherwise, it will be added + * to a {@link MapBackedMetadataContainer} which stores metadata by country calling code. This + * means that {@link CompositeMetadataContainer#getMetadataBy(int)} will not work for country + * calling codes such as 41 (country calling code for Switzerland), only for country calling codes + * such as 800 (country code assigned to the Universal International Freephone Service) + */ + @Override + public void accept(PhoneMetadata phoneMetadata) { + String regionCode = metadataByRegionCode.getKeyProvider().getKeyOf(phoneMetadata); + if (GeoEntityUtility.isGeoEntity(regionCode)) { + metadataByRegionCode.accept(phoneMetadata); + } else { + metadataByCountryCode.accept(phoneMetadata); + } + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java new file mode 100644 index 0000000000..f4f332cb21 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSource.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** A source of formatting phone metadata. */ +public interface FormattingMetadataSource { + + /** + * Returns formatting phone metadata for provided country calling code. + * + *

This method is similar to the one in {@link + * NonGeographicalEntityMetadataSource#getMetadataForNonGeographicalRegion(int)}, except that it + * will not fail for geographical regions, it can be used for both geo- and non-geo entities. + * + *

In case the provided {@code countryCallingCode} maps to several different regions, only one + * would contain formatting metadata. + * + * @return the phone metadata for provided {@code countryCallingCode}, or null if there is none. + */ + PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java new file mode 100644 index 0000000000..d6a819099f --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/FormattingMetadataSourceImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link FormattingMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class FormattingMetadataSourceImpl implements FormattingMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard> bootstrappingGuard; + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public FormattingMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byCountryCallingCode())); + } + + @Override + public PhoneMetadata getFormattingMetadataForCountryCallingCode(int countryCallingCode) { + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java new file mode 100644 index 0000000000..639280d87c --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MapBackedMetadataContainer.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * A {@link MetadataContainer} implementation backed by a {@link ConcurrentHashMap} with generic + * keys. + */ +final class MapBackedMetadataContainer implements MetadataContainer { + + static MapBackedMetadataContainer byRegionCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider() { + @Override + public String getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getId(); + } + }); + } + + static MapBackedMetadataContainer byCountryCallingCode() { + return new MapBackedMetadataContainer<>( + new KeyProvider() { + @Override + public Integer getKeyOf(PhoneMetadata phoneMetadata) { + return phoneMetadata.getCountryCode(); + } + }); + } + + private final ConcurrentMap metadataMap; + + private final KeyProvider keyProvider; + + private MapBackedMetadataContainer(KeyProvider keyProvider) { + this.metadataMap = new ConcurrentHashMap<>(); + this.keyProvider = keyProvider; + } + + PhoneMetadata getMetadataBy(T key) { + return key != null ? metadataMap.get(key) : null; + } + + KeyProvider getKeyProvider() { + return keyProvider; + } + + @Override + public void accept(PhoneMetadata phoneMetadata) { + metadataMap.put(keyProvider.getKeyOf(phoneMetadata), phoneMetadata); + } + + interface KeyProvider { + T getKeyOf(PhoneMetadata phoneMetadata); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java new file mode 100644 index 0000000000..9380c5954d --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataBootstrappingGuard.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Guard that ensures that metadata bootstrapping process (loading and parsing) is triggered only + * once per metadata file. + * + * @param needs to extend {@link MetadataContainer} + */ +public interface MetadataBootstrappingGuard { + + /** + * If metadata from the provided file has not yet been read, invokes loading and parsing from the + * provided file and adds the result to guarded {@link MetadataContainer}. + * + * @param phoneMetadataFile to read from + * @return guarded {@link MetadataContainer} + */ + T getOrBootstrap(String phoneMetadataFile); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java new file mode 100644 index 0000000000..3f6b21ed0e --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataContainer.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A container for {@link PhoneMetadata} + */ +interface MetadataContainer { + + /** + * Adds {@link PhoneMetadata} to the container. It depends on the implementation of the interface + * what this means, for example {@link MapBackedMetadataContainer} simply adds the provided + * metadata into the backing map. Implementing classes should ensure thread-safety. + */ + void accept(PhoneMetadata phoneMetadata); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java new file mode 100644 index 0000000000..d353ce9694 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSource.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** A source of phone metadata split by different regions. */ +public interface MetadataSource extends RegionMetadataSource, NonGeographicalEntityMetadataSource { +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java new file mode 100644 index 0000000000..c3d1c7360b --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MetadataSourceImpl.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link MetadataSource} guarded by {@link MetadataBootstrappingGuard}. + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class MetadataSourceImpl implements MetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard bootstrappingGuard; + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public MetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, new CompositeMetadataContainer())); + } + + @Override + public PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode) { + if (GeoEntityUtility.isGeoEntity(countryCallingCode)) { + throw new IllegalArgumentException( + countryCallingCode + " calling code belongs to a geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(countryCallingCode)) + .getMetadataBy(countryCallingCode); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java new file mode 100644 index 0000000000..c8a3270a6d --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + + +/** + * {@link PhoneMetadataFileNameProvider} implementation which appends key as a suffix to the + * predefined metadata file name base. + */ +public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileNamePrefix; + + public MultiFileModeFileNameProvider(String phoneMetadataFileNameBase) { + this.phoneMetadataFileNamePrefix = phoneMetadataFileNameBase + "_"; + } + + @Override + public String getFor(Object key) { + String keyAsString = key.toString(); + if (!isAlphanumeric(keyAsString)) { + throw new IllegalArgumentException("Invalid key: " + keyAsString); + } + return phoneMetadataFileNamePrefix + key; + } + + private boolean isAlphanumeric(String key) { + if (key == null || key.length() == 0) { + return false; + } + // String#length doesn't actually return the number of + // code points in the String, it returns the number + // of char values. + int size = key.length(); + for (int charIdx = 0; charIdx < size; ) { + final int codePoint = key.codePointAt(charIdx); + if (!Character.isLetterOrDigit(codePoint)) { + return false; + } + charIdx += Character.charCount(codePoint); + } + return true; + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java new file mode 100644 index 0000000000..70db06df03 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/NonGeographicalEntityMetadataSource.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; + +/** + * A source of phone metadata for non-geographical entities. + * + *

Non-geographical entities are phone number ranges that have a country calling code, but either + * do not belong to an actual country (some international services), or belong to a region which has + * a different country calling code from the country it is part of. Examples of such ranges are + * those starting with: + * + *

+ */ +public interface NonGeographicalEntityMetadataSource { + + /** + * Gets phone metadata for a non-geographical entity. + * + * @param countryCallingCode the country calling code. + * @return the phone metadata for that entity, or null if there is none. + * @throws IllegalArgumentException if provided {@code countryCallingCode} does not belong to a + * non-geographical entity + */ + PhoneMetadata getMetadataForNonGeographicalRegion(int countryCallingCode); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java new file mode 100644 index 0000000000..c3d16887fb --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/PhoneMetadataFileNameProvider.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * Abstraction responsible for inferring the metadata file name. + * + *

Two implementations are available: + * + *

    + *
  • {@link SingleFileModeFileNameProvider} for single-file metadata. + *
  • {@link MultiFileModeFileNameProvider} for multi-file metadata. + *
+ */ +public interface PhoneMetadataFileNameProvider { + + /** + * Returns phone metadata file path for the given key. Assumes that key.toString() is + * well-defined. + */ + String getFor(Object key); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java new file mode 100644 index 0000000000..3cf15c206a --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSource.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; + +/** + * A source of phone metadata split by geographical regions. + */ +public interface RegionMetadataSource { + + /** + * Returns phone metadata for provided geographical region. + * + *

The {@code regionCode} must be different from {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES}, which has a special meaning and is used to + * mark non-geographical regions (see {@link NonGeographicalEntityMetadataSource} for more + * information). + * + * @return the phone metadata for provided {@code regionCode}, or null if there is none. + * @throws IllegalArgumentException if provided {@code regionCode} is {@link + * GeoEntityUtility#REGION_CODE_FOR_NON_GEO_ENTITIES} + */ + PhoneMetadata getMetadataForRegion(String regionCode); +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java new file mode 100644 index 0000000000..0078dd9454 --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/RegionMetadataSourceImpl.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +import com.google.i18n.phonenumbers.MetadataLoader; +import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; +import com.google.i18n.phonenumbers.internal.GeoEntityUtility; +import com.google.i18n.phonenumbers.metadata.init.MetadataParser; + +/** + * Implementation of {@link RegionMetadataSource} guarded by {@link MetadataBootstrappingGuard} + * + *

By default, a {@link BlockingMetadataBootstrappingGuard} will be used, but any custom + * implementation can be injected. + */ +public final class RegionMetadataSourceImpl implements RegionMetadataSource { + + private final PhoneMetadataFileNameProvider phoneMetadataFileNameProvider; + private final MetadataBootstrappingGuard> + bootstrappingGuard; + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataBootstrappingGuard> bootstrappingGuard) { + this.phoneMetadataFileNameProvider = phoneMetadataFileNameProvider; + this.bootstrappingGuard = bootstrappingGuard; + } + + public RegionMetadataSourceImpl( + PhoneMetadataFileNameProvider phoneMetadataFileNameProvider, + MetadataLoader metadataLoader, + MetadataParser metadataParser) { + this( + phoneMetadataFileNameProvider, + new BlockingMetadataBootstrappingGuard<>( + metadataLoader, metadataParser, MapBackedMetadataContainer.byRegionCode())); + } + + @Override + public PhoneMetadata getMetadataForRegion(String regionCode) { + if (!GeoEntityUtility.isGeoEntity(regionCode)) { + throw new IllegalArgumentException(regionCode + " region code is a non-geo entity"); + } + return bootstrappingGuard + .getOrBootstrap(phoneMetadataFileNameProvider.getFor(regionCode)) + .getMetadataBy(regionCode); + } +} diff --git a/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java new file mode 100644 index 0000000000..1d3d1eb81b --- /dev/null +++ b/tools/java/java-build/target/test-classes/com/google/i18n/phonenumbers/metadata/source/SingleFileModeFileNameProvider.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The Libphonenumber Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.i18n.phonenumbers.metadata.source; + +/** + * {@link PhoneMetadataFileNameProvider} implementation that returns the same metadata file name for + * each key + */ +public final class SingleFileModeFileNameProvider implements PhoneMetadataFileNameProvider { + + private final String phoneMetadataFileName; + + public SingleFileModeFileNameProvider(String phoneMetadataFileName) { + this.phoneMetadataFileName = phoneMetadataFileName; + } + + @Override + public String getFor(Object key) { + return phoneMetadataFileName; + } +}