package Geo::IP;

use strict;

use base qw(Exporter);

our $VERSION;

our @ISA;

our $GEOIP_PP_ONLY = 0;
our $XS_VERSION;

our @EXPORT = qw(
    GEOIP_STANDARD              GEOIP_MEMORY_CACHE
    GEOIP_CHECK_CACHE           GEOIP_INDEX_CACHE
    GEOIP_UNKNOWN_SPEED         GEOIP_DIALUP_SPEED
    GEOIP_CABLEDSL_SPEED        GEOIP_CORPORATE_SPEED
    GEOIP_COUNTRY_EDITION       GEOIP_REGION_EDITION_REV0
    GEOIP_CITY_EDITION_REV0     GEOIP_ORG_EDITION
    GEOIP_ISP_EDITION           GEOIP_CITY_EDITION_REV1
    GEOIP_REGION_EDITION_REV1   GEOIP_PROXY_EDITION
    GEOIP_ASNUM_EDITION         GEOIP_NETSPEED_EDITION
    GEOIP_CHARSET_ISO_8859_1    GEOIP_CHARSET_UTF8
    GEOIP_MMAP_CACHE            GEOIP_ACCURACYRADIUS_EDITION
    GEOIP_COUNTRY_EDITION_V6    GEOIP_DOMAIN_EDITION
    GEOIP_NETSPEED_EDITION_REV1 GEOIP_SILENCE
);

BEGIN {
    $VERSION = '1.51';
    eval {

        # PERL_DL_NONLAZY must be false, or any errors in loading will just
        # cause the perl code to be tested
        local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY};

        require DynaLoader;
        local @ISA = qw(DynaLoader);
        bootstrap Geo::IP $VERSION;
    } unless $GEOIP_PP_ONLY || $ENV{GEOIP_PP_ONLY};
}

require Geo::IP::Record;

sub GEOIP_STANDARD()     { 0; }    # PP
sub GEOIP_MEMORY_CACHE() { 1; }    # PP
sub GEOIP_CHECK_CACHE()  { 2; }
sub GEOIP_INDEX_CACHE()  { 4; }
sub GEOIP_MMAP_CACHE()   { 8; }    # PP
sub GEOIP_SILENCE()      { 16; }

sub GEOIP_UNKNOWN_SPEED()   { 0; }    #PP
sub GEOIP_DIALUP_SPEED()    { 1; }    #PP
sub GEOIP_CABLEDSL_SPEED()  { 2; }    #PP
sub GEOIP_CORPORATE_SPEED() { 3; }    #PP

BEGIN {

    #my $pp = !( defined &_XScompiled && &_XScompiled && !$TESTING_PERL_ONLY );
    my $pp = !defined &open;

    sub GEOIP_COUNTRY_EDITION()        { 1; }
    sub GEOIP_CITY_EDITION_REV1()      { 2; }
    sub GEOIP_REGION_EDITION_REV1()    { 3; }
    sub GEOIP_ISP_EDITION()            { 4; }
    sub GEOIP_ORG_EDITION()            { 5; }
    sub GEOIP_CITY_EDITION_REV0()      { 6; }
    sub GEOIP_REGION_EDITION_REV0()    { 7; }
    sub GEOIP_PROXY_EDITION()          { 8; }
    sub GEOIP_ASNUM_EDITION()          { 9; }
    sub GEOIP_NETSPEED_EDITION()       { 10; }
    sub GEOIP_DOMAIN_EDITION()         { 11; }
    sub GEOIP_COUNTRY_EDITION_V6()     { 12; }
    sub GEOIP_ACCURACYRADIUS_EDITION() { 14; }
    sub GEOIP_ASNUM_EDITION_V6()       { 21; }
    sub GEOIP_CITY_EDITION_REV1_V6()   { 30; }
    sub GEOIP_CITY_EDITION_REV0_V6()   { 31; }
    sub GEOIP_NETSPEED_EDITION_REV1()  { 32; }

    sub GEOIP_CHARSET_ISO_8859_1() { 0; }
    sub GEOIP_CHARSET_UTF8()       { 1; }

    #
    sub api {
        defined &Geo::IP::Record::_XScompiled ? 'CAPI' : 'PurePerl';
    }

    # cheat --- try to load Sys::Mmap PurePerl only
    if ($pp) {
        eval {

            # wrap into eval again, as workaround for centos / mod_perl issue
            # seems they use $@ without eval somewhere
            eval "require Sys::Mmap"
                ? Sys::Mmap->import
                : do {
                for (qw/ PROT_READ MAP_PRIVATE MAP_SHARED /) {
                    no strict 'refs';
                    my $unused_stub = $_;    # we must use a copy
                    *$unused_stub
                        = sub { die 'Sys::Mmap required for mmap support' };
                }    # for
                };    # do
            1;
        };    # eval
    }    # pp
    else {
        eval << '__CAPI_GLUE__';
  # threads should not clone or DESTROY the GeoIP object.
  sub CLONE_SKIP {1}

  *name_by_name = *isp_by_name = *org_by_name;
  *name_by_addr = *isp_by_addr = *org_by_addr;

  *org_by_name_v6 = *name_by_name_v6;
  *org_by_addr_v6 = *name_by_addr_v6;
__CAPI_GLUE__
    }
}

eval << '__PP_CODE__' unless defined &open;
package Geo::IP;

use strict;

use base qw(Exporter);

our $VERSION;

our @ISA;

our $GEOIP_PP_ONLY = 0;
our $XS_VERSION;

our @EXPORT = qw(
    GEOIP_STANDARD              GEOIP_MEMORY_CACHE
    GEOIP_CHECK_CACHE           GEOIP_INDEX_CACHE
    GEOIP_UNKNOWN_SPEED         GEOIP_DIALUP_SPEED
    GEOIP_CABLEDSL_SPEED        GEOIP_CORPORATE_SPEED
    GEOIP_COUNTRY_EDITION       GEOIP_REGION_EDITION_REV0
    GEOIP_CITY_EDITION_REV0     GEOIP_ORG_EDITION
    GEOIP_ISP_EDITION           GEOIP_CITY_EDITION_REV1
    GEOIP_REGION_EDITION_REV1   GEOIP_PROXY_EDITION
    GEOIP_ASNUM_EDITION         GEOIP_NETSPEED_EDITION
    GEOIP_CHARSET_ISO_8859_1    GEOIP_CHARSET_UTF8
    GEOIP_MMAP_CACHE            GEOIP_ACCURACYRADIUS_EDITION
    GEOIP_COUNTRY_EDITION_V6    GEOIP_DOMAIN_EDITION
    GEOIP_NETSPEED_EDITION_REV1 GEOIP_SILENCE
);

use strict;
use FileHandle;
use File::Spec;

require bytes;

BEGIN {
    if ( $] >= 5.008 ) {
        require Encode;
        Encode->import(qw/ decode /);
    }
    else {
        *decode = sub {
            local $_ = $_[1];
            use bytes;
            s/([\x80-\xff])/my $c = ord($1);
            my $p = $c >= 192 ? 1 : 0;
            pack ( 'CC' => 0xc2 + $p , $c & ~0x40 ); /ge;
            return $_;
        };
    }
}

use vars qw/$PP_OPEN_TYPE_PATH/;

use constant FULL_RECORD_LENGTH      => 50;
use constant GEOIP_COUNTRY_BEGIN     => 16776960;
use constant RECORD_LENGTH           => 3;
use constant GEOIP_STATE_BEGIN_REV0  => 16700000;
use constant GEOIP_STATE_BEGIN_REV1  => 16000000;
use constant STRUCTURE_INFO_MAX_SIZE => 20;
use constant DATABASE_INFO_MAX_SIZE  => 100;

use constant SEGMENT_RECORD_LENGTH  => 3;
use constant STANDARD_RECORD_LENGTH => 3;
use constant ORG_RECORD_LENGTH      => 4;
use constant MAX_RECORD_LENGTH      => 4;
use constant MAX_ORG_RECORD_LENGTH  => 300;
use constant US_OFFSET              => 1;
use constant CANADA_OFFSET          => 677;
use constant WORLD_OFFSET           => 1353;
use constant FIPS_RANGE             => 360;

my @continents = qw/
    --
    AS EU EU AS AS NA NA EU AS NA
    AF AN SA OC EU OC NA AS EU NA
    AS EU AF EU AS AF AF NA AS SA
    SA NA AS AN AF EU NA NA AS AF
    AF AF EU AF OC SA AF AS SA NA
    NA AF AS AS EU EU AF EU NA NA
    AF SA EU AF AF AF EU AF EU OC
    SA OC EU EU EU AF EU NA AS SA
    AF EU NA AF AF NA AF EU AN NA
    OC AF SA AS AN NA EU NA EU AS
    EU AS AS AS AS AS EU EU NA AS
    AS AF AS AS OC AF NA AS AS AS
    NA AS AS AS NA EU AS AF AF EU
    EU EU AF AF EU EU AF OC EU AF
    AS AS AS OC NA AF NA EU AF AS
    AF NA AS AF AF OC AF OC AF NA
    EU EU AS OC OC OC AS NA SA OC
    OC AS AS EU NA OC NA AS EU OC
    SA AS AF EU EU AF AS OC AF AF
    EU AS AF EU EU EU AF EU AF AF
    SA AF NA AS AF NA AF AN AF AS
    AS OC AS AF OC AS EU NA OC AS
    AF EU AF OC NA SA AS EU NA SA
    NA NA AS OC OC OC AS AF EU AF
    AF EU AF -- -- -- EU EU EU EU
    NA NA NA AF
    /;

my @countries = (
    undef, qw/
        AP EU AD AE AF AG AI
        AL AM CW AO AQ AR AS AT
        AU AW AZ BA BB BD BE BF
        BG BH BI BJ BM BN BO BR
        BS BT BV BW BY BZ CA CC
        CD CF CG CH CI CK CL CM
        CN CO CR CU CV CX CY CZ
        DE DJ DK DM DO DZ EC EE
        EG EH ER ES ET FI FJ FK
        FM FO FR FX GA GB GD GE
        GF GH GI GL GM GN GP GQ
        GR GS GT GU GW GY HK HM
        HN HR HT HU ID IE IL IN
        IO IQ IR IS IT JM JO JP
        KE KG KH KI KM KN KP KR
        KW KY KZ LA LB LC LI LK
        LR LS LT LU LV LY MA MC
        MD MG MH MK ML MM MN MO
        MP MQ MR MS MT MU MV MW
        MX MY MZ NA NC NE NF NG
        NI NL NO NP NR NU NZ OM
        PA PE PF PG PH PK PL PM
        PN PR PS PT PW PY QA RE
        RO RU RW SA SB SC SD SE
        SG SH SI SJ SK SL SM SN
        SO SR ST SV SY SZ TC TD
        TF TG TH TJ TK TM TN TO
        TL TR TT TV TW TZ UA UG
        UM US UY UZ VA VC VE VG
        VI VN VU WF WS YE YT RS
        ZA ZM ME ZW A1 A2 O1 AX
        GG IM JE BL MF BQ SS O1 /
);

my %_id_by_code;
for ( 1 .. $#countries ) {
    $_id_by_code{ $countries[$_] } = $_;
}

my @code3s = (
    undef, qw/
        AP  EU  AND ARE AFG ATG AIA
        ALB ARM CUW AGO ATA ARG ASM AUT
        AUS ABW AZE BIH BRB BGD BEL BFA
        BGR BHR BDI BEN BMU BRN BOL BRA
        BHS BTN BVT BWA BLR BLZ CAN CCK
        COD CAF COG CHE CIV COK CHL CMR
        CHN COL CRI CUB CPV CXR CYP CZE
        DEU DJI DNK DMA DOM DZA ECU EST
        EGY ESH ERI ESP ETH FIN FJI FLK
        FSM FRO FRA FX  GAB GBR GRD GEO
        GUF GHA GIB GRL GMB GIN GLP GNQ
        GRC SGS GTM GUM GNB GUY HKG HMD
        HND HRV HTI HUN IDN IRL ISR IND
        IOT IRQ IRN ISL ITA JAM JOR JPN
        KEN KGZ KHM KIR COM KNA PRK KOR
        KWT CYM KAZ LAO LBN LCA LIE LKA
        LBR LSO LTU LUX LVA LBY MAR MCO
        MDA MDG MHL MKD MLI MMR MNG MAC
        MNP MTQ MRT MSR MLT MUS MDV MWI
        MEX MYS MOZ NAM NCL NER NFK NGA
        NIC NLD NOR NPL NRU NIU NZL OMN
        PAN PER PYF PNG PHL PAK POL SPM
        PCN PRI PSE PRT PLW PRY QAT REU
        ROU RUS RWA SAU SLB SYC SDN SWE
        SGP SHN SVN SJM SVK SLE SMR SEN
        SOM SUR STP SLV SYR SWZ TCA TCD
        ATF TGO THA TJK TKL TKM TUN TON
        TLS TUR TTO TUV TWN TZA UKR UGA
        UMI USA URY UZB VAT VCT VEN VGB
        VIR VNM VUT WLF WSM YEM MYT SRB
        ZAF ZMB MNE ZWE A1  A2  O1  ALA
        GGY IMN JEY BLM MAF BES SSD O1 /
);
my @names = (
    undef,
    "Asia/Pacific Region",
    "Europe",
    "Andorra",
    "United Arab Emirates",
    "Afghanistan",
    "Antigua and Barbuda",
    "Anguilla",
    "Albania",
    "Armenia",
    "Curacao",
    "Angola",
    "Antarctica",
    "Argentina",
    "American Samoa",
    "Austria",
    "Australia",
    "Aruba",
    "Azerbaijan",
    "Bosnia and Herzegovina",
    "Barbados",
    "Bangladesh",
    "Belgium",
    "Burkina Faso",
    "Bulgaria",
    "Bahrain",
    "Burundi",
    "Benin",
    "Bermuda",
    "Brunei Darussalam",
    "Bolivia",
    "Brazil",
    "Bahamas",
    "Bhutan",
    "Bouvet Island",
    "Botswana",
    "Belarus",
    "Belize",
    "Canada",
    "Cocos (Keeling) Islands",
    "Congo, The Democratic Republic of the",
    "Central African Republic",
    "Congo",
    "Switzerland",
    "Cote D'Ivoire",
    "Cook Islands",
    "Chile",
    "Cameroon",
    "China",
    "Colombia",
    "Costa Rica",
    "Cuba",
    "Cape Verde",
    "Christmas Island",
    "Cyprus",
    "Czech Republic",
    "Germany",
    "Djibouti",
    "Denmark",
    "Dominica",
    "Dominican Republic",
    "Algeria",
    "Ecuador",
    "Estonia",
    "Egypt",
    "Western Sahara",
    "Eritrea",
    "Spain",
    "Ethiopia",
    "Finland",
    "Fiji",
    "Falkland Islands (Malvinas)",
    "Micronesia, Federated States of",
    "Faroe Islands",
    "France",
    "France, Metropolitan",
    "Gabon",
    "United Kingdom",
    "Grenada",
    "Georgia",
    "French Guiana",
    "Ghana",
    "Gibraltar",
    "Greenland",
    "Gambia",
    "Guinea",
    "Guadeloupe",
    "Equatorial Guinea",
    "Greece",
    "South Georgia and the South Sandwich Islands",
    "Guatemala",
    "Guam",
    "Guinea-Bissau",
    "Guyana",
    "Hong Kong",
    "Heard Island and McDonald Islands",
    "Honduras",
    "Croatia",
    "Haiti",
    "Hungary",
    "Indonesia",
    "Ireland",
    "Israel",
    "India",
    "British Indian Ocean Territory",
    "Iraq",
    "Iran, Islamic Republic of",
    "Iceland",
    "Italy",
    "Jamaica",
    "Jordan",
    "Japan",
    "Kenya",
    "Kyrgyzstan",
    "Cambodia",
    "Kiribati",
    "Comoros",
    "Saint Kitts and Nevis",
    "Korea, Democratic People's Republic of",
    "Korea, Republic of",
    "Kuwait",
    "Cayman Islands",
    "Kazakhstan",
    "Lao People's Democratic Republic",
    "Lebanon",
    "Saint Lucia",
    "Liechtenstein",
    "Sri Lanka",
    "Liberia",
    "Lesotho",
    "Lithuania",
    "Luxembourg",
    "Latvia",
    "Libya",
    "Morocco",
    "Monaco",
    "Moldova, Republic of",
    "Madagascar",
    "Marshall Islands",
    "Macedonia",
    "Mali",
    "Myanmar",
    "Mongolia",
    "Macau",
    "Northern Mariana Islands",
    "Martinique",
    "Mauritania",
    "Montserrat",
    "Malta",
    "Mauritius",
    "Maldives",
    "Malawi",
    "Mexico",
    "Malaysia",
    "Mozambique",
    "Namibia",
    "New Caledonia",
    "Niger",
    "Norfolk Island",
    "Nigeria",
    "Nicaragua",
    "Netherlands",
    "Norway",
    "Nepal",
    "Nauru",
    "Niue",
    "New Zealand",
    "Oman",
    "Panama",
    "Peru",
    "French Polynesia",
    "Papua New Guinea",
    "Philippines",
    "Pakistan",
    "Poland",
    "Saint Pierre and Miquelon",
    "Pitcairn Islands",
    "Puerto Rico",
    "Palestinian Territory",
    "Portugal",
    "Palau",
    "Paraguay",
    "Qatar",
    "Reunion",
    "Romania",
    "Russian Federation",
    "Rwanda",
    "Saudi Arabia",
    "Solomon Islands",
    "Seychelles",
    "Sudan",
    "Sweden",
    "Singapore",
    "Saint Helena",
    "Slovenia",
    "Svalbard and Jan Mayen",
    "Slovakia",
    "Sierra Leone",
    "San Marino",
    "Senegal",
    "Somalia",
    "Suriname",
    "Sao Tome and Principe",
    "El Salvador",
    "Syrian Arab Republic",
    "Swaziland",
    "Turks and Caicos Islands",
    "Chad",
    "French Southern Territories",
    "Togo",
    "Thailand",
    "Tajikistan",
    "Tokelau",
    "Turkmenistan",
    "Tunisia",
    "Tonga",
    "Timor-Leste",
    "Turkey",
    "Trinidad and Tobago",
    "Tuvalu",
    "Taiwan",
    "Tanzania, United Republic of",
    "Ukraine",
    "Uganda",
    "United States Minor Outlying Islands",
    "United States",
    "Uruguay",
    "Uzbekistan",
    "Holy See (Vatican City State)",
    "Saint Vincent and the Grenadines",
    "Venezuela",
    "Virgin Islands, British",
    "Virgin Islands, U.S.",
    "Vietnam",
    "Vanuatu",
    "Wallis and Futuna",
    "Samoa",
    "Yemen",
    "Mayotte",
    "Serbia",
    "South Africa",
    "Zambia",
    "Montenegro",
    "Zimbabwe",
    "Anonymous Proxy",
    "Satellite Provider",
    "Other",
    "Aland Islands",
    "Guernsey",
    "Isle of Man",
    "Jersey",
    "Saint Barthelemy",
    "Saint Martin",
    "Bonaire, Saint Eustatius and Saba",
    "South Sudan",
    "Other"
);

my %country_region_names = (
    'AD' => {
        '02' => 'Canillo',
        '03' => 'Encamp',
        '04' => 'La Massana',
        '05' => 'Ordino',
        '06' => 'Sant Julia de Loria',
        '07' => 'Andorra la Vella',
        '08' => 'Escaldes-Engordany'
    },
    'AE' => {
        '01' => 'Abu Dhabi',
        '02' => 'Ajman',
        '03' => 'Dubai',
        '04' => 'Fujairah',
        '05' => 'Ras Al Khaimah',
        '06' => 'Sharjah',
        '07' => 'Umm Al Quwain'
    },
    'AF' => {
        '01' => 'Badakhshan',
        '02' => 'Badghis',
        '03' => 'Baghlan',
        '05' => 'Bamian',
        '06' => 'Farah',
        '07' => 'Faryab',
        '08' => 'Ghazni',
        '09' => 'Ghowr',
        '10' => 'Helmand',
        '11' => 'Herat',
        '13' => 'Kabol',
        '14' => 'Kapisa',
        '17' => 'Lowgar',
        '18' => 'Nangarhar',
        '19' => 'Nimruz',
        '23' => 'Kandahar',
        '24' => 'Kondoz',
        '26' => 'Takhar',
        '27' => 'Vardak',
        '28' => 'Zabol',
        '29' => 'Paktika',
        '30' => 'Balkh',
        '31' => 'Jowzjan',
        '32' => 'Samangan',
        '33' => 'Sar-e Pol',
        '34' => 'Konar',
        '35' => 'Laghman',
        '36' => 'Paktia',
        '37' => 'Khowst',
        '38' => 'Nurestan',
        '39' => 'Oruzgan',
        '40' => 'Parvan',
        '41' => 'Daykondi',
        '42' => 'Panjshir'
    },
    'AG' => {
        '01' => 'Barbuda',
        '03' => 'Saint George',
        '04' => 'Saint John',
        '05' => 'Saint Mary',
        '06' => 'Saint Paul',
        '07' => 'Saint Peter',
        '08' => 'Saint Philip',
        '09' => 'Redonda'
    },
    'AL' => {
        '40' => 'Berat',
        '41' => 'Diber',
        '42' => 'Durres',
        '43' => 'Elbasan',
        '44' => 'Fier',
        '45' => 'Gjirokaster',
        '46' => 'Korce',
        '47' => 'Kukes',
        '48' => 'Lezhe',
        '49' => 'Shkoder',
        '50' => 'Tirane',
        '51' => 'Vlore'
    },
    'AM' => {
        '01' => 'Aragatsotn',
        '02' => 'Ararat',
        '03' => 'Armavir',
        '04' => 'Geghark\'unik\'',
        '05' => 'Kotayk\'',
        '06' => 'Lorri',
        '07' => 'Shirak',
        '08' => 'Syunik\'',
        '09' => 'Tavush',
        '10' => 'Vayots\' Dzor',
        '11' => 'Yerevan'
    },
    'AO' => {
        '01' => 'Benguela',
        '02' => 'Bie',
        '03' => 'Cabinda',
        '04' => 'Cuando Cubango',
        '05' => 'Cuanza Norte',
        '06' => 'Cuanza Sul',
        '07' => 'Cunene',
        '08' => 'Huambo',
        '09' => 'Huila',
        '12' => 'Malanje',
        '13' => 'Namibe',
        '14' => 'Moxico',
        '15' => 'Uige',
        '16' => 'Zaire',
        '17' => 'Lunda Norte',
        '18' => 'Lunda Sul',
        '19' => 'Bengo',
        '20' => 'Luanda'
    },
    'AR' => {
        '01' => 'Buenos Aires',
        '02' => 'Catamarca',
        '03' => 'Chaco',
        '04' => 'Chubut',
        '05' => 'Cordoba',
        '06' => 'Corrientes',
        '07' => 'Distrito Federal',
        '08' => 'Entre Rios',
        '09' => 'Formosa',
        '10' => 'Jujuy',
        '11' => 'La Pampa',
        '12' => 'La Rioja',
        '13' => 'Mendoza',
        '14' => 'Misiones',
        '15' => 'Neuquen',
        '16' => 'Rio Negro',
        '17' => 'Salta',
        '18' => 'San Juan',
        '19' => 'San Luis',
        '20' => 'Santa Cruz',
        '21' => 'Santa Fe',
        '22' => 'Santiago del Estero',
        '23' => 'Tierra del Fuego',
        '24' => 'Tucuman'
    },
    'AT' => {
        '01' => 'Burgenland',
        '02' => 'Karnten',
        '03' => 'Niederosterreich',
        '04' => 'Oberosterreich',
        '05' => 'Salzburg',
        '06' => 'Steiermark',
        '07' => 'Tirol',
        '08' => 'Vorarlberg',
        '09' => 'Wien'
    },
    'AU' => {
        '01' => 'Australian Capital Territory',
        '02' => 'New South Wales',
        '03' => 'Northern Territory',
        '04' => 'Queensland',
        '05' => 'South Australia',
        '06' => 'Tasmania',
        '07' => 'Victoria',
        '08' => 'Western Australia'
    },
    'AZ' => {
        '01' => 'Abseron',
        '02' => 'Agcabadi',
        '03' => 'Agdam',
        '04' => 'Agdas',
        '05' => 'Agstafa',
        '06' => 'Agsu',
        '07' => 'Ali Bayramli',
        '08' => 'Astara',
        '09' => 'Baki',
        '10' => 'Balakan',
        '11' => 'Barda',
        '12' => 'Beylaqan',
        '13' => 'Bilasuvar',
        '14' => 'Cabrayil',
        '15' => 'Calilabad',
        '16' => 'Daskasan',
        '17' => 'Davaci',
        '18' => 'Fuzuli',
        '19' => 'Gadabay',
        '20' => 'Ganca',
        '21' => 'Goranboy',
        '22' => 'Goycay',
        '23' => 'Haciqabul',
        '24' => 'Imisli',
        '25' => 'Ismayilli',
        '26' => 'Kalbacar',
        '27' => 'Kurdamir',
        '28' => 'Lacin',
        '29' => 'Lankaran',
        '30' => 'Lankaran',
        '31' => 'Lerik',
        '32' => 'Masalli',
        '33' => 'Mingacevir',
        '34' => 'Naftalan',
        '35' => 'Naxcivan',
        '36' => 'Neftcala',
        '37' => 'Oguz',
        '38' => 'Qabala',
        '39' => 'Qax',
        '40' => 'Qazax',
        '41' => 'Qobustan',
        '42' => 'Quba',
        '43' => 'Qubadli',
        '44' => 'Qusar',
        '45' => 'Saatli',
        '46' => 'Sabirabad',
        '47' => 'Saki',
        '48' => 'Saki',
        '49' => 'Salyan',
        '50' => 'Samaxi',
        '51' => 'Samkir',
        '52' => 'Samux',
        '53' => 'Siyazan',
        '54' => 'Sumqayit',
        '55' => 'Susa',
        '56' => 'Susa',
        '57' => 'Tartar',
        '58' => 'Tovuz',
        '59' => 'Ucar',
        '60' => 'Xacmaz',
        '61' => 'Xankandi',
        '62' => 'Xanlar',
        '63' => 'Xizi',
        '64' => 'Xocali',
        '65' => 'Xocavand',
        '66' => 'Yardimli',
        '67' => 'Yevlax',
        '68' => 'Yevlax',
        '69' => 'Zangilan',
        '70' => 'Zaqatala',
        '71' => 'Zardab'
    },
    'BA' => {
        '01' => 'Federation of Bosnia and Herzegovina',
        '02' => 'Republika Srpska',
        '03' => 'Brcko District'
    },
    'BB' => {
        '01' => 'Christ Church',
        '02' => 'Saint Andrew',
        '03' => 'Saint George',
        '04' => 'Saint James',
        '05' => 'Saint John',
        '06' => 'Saint Joseph',
        '07' => 'Saint Lucy',
        '08' => 'Saint Michael',
        '09' => 'Saint Peter',
        '10' => 'Saint Philip',
        '11' => 'Saint Thomas'
    },
    'BD' => {
        '81' => 'Dhaka',
        '82' => 'Khulna',
        '83' => 'Rajshahi',
        '84' => 'Chittagong',
        '85' => 'Barisal',
        '86' => 'Sylhet',
        '87' => 'Rangpur'
    },
    'BE' => {
        '01' => 'Antwerpen',
        '03' => 'Hainaut',
        '04' => 'Liege',
        '05' => 'Limburg',
        '06' => 'Luxembourg',
        '07' => 'Namur',
        '08' => 'Oost-Vlaanderen',
        '09' => 'West-Vlaanderen',
        '10' => 'Brabant Wallon',
        '11' => 'Brussels Hoofdstedelijk Gewest',
        '12' => 'Vlaams-Brabant',
        '13' => 'Flanders',
        '14' => 'Wallonia'
    },
    'BF' => {
        '15' => 'Bam',
        '19' => 'Boulkiemde',
        '20' => 'Ganzourgou',
        '21' => 'Gnagna',
        '28' => 'Kouritenga',
        '33' => 'Oudalan',
        '34' => 'Passore',
        '36' => 'Sanguie',
        '40' => 'Soum',
        '42' => 'Tapoa',
        '44' => 'Zoundweogo',
        '45' => 'Bale',
        '46' => 'Banwa',
        '47' => 'Bazega',
        '48' => 'Bougouriba',
        '49' => 'Boulgou',
        '50' => 'Gourma',
        '51' => 'Houet',
        '52' => 'Ioba',
        '53' => 'Kadiogo',
        '54' => 'Kenedougou',
        '55' => 'Komoe',
        '56' => 'Komondjari',
        '57' => 'Kompienga',
        '58' => 'Kossi',
        '59' => 'Koulpelogo',
        '60' => 'Kourweogo',
        '61' => 'Leraba',
        '62' => 'Loroum',
        '63' => 'Mouhoun',
        '64' => 'Namentenga',
        '65' => 'Naouri',
        '66' => 'Nayala',
        '67' => 'Noumbiel',
        '68' => 'Oubritenga',
        '69' => 'Poni',
        '70' => 'Sanmatenga',
        '71' => 'Seno',
        '72' => 'Sissili',
        '73' => 'Sourou',
        '74' => 'Tuy',
        '75' => 'Yagha',
        '76' => 'Yatenga',
        '77' => 'Ziro',
        '78' => 'Zondoma'
    },
    'BG' => {
        '33' => 'Mikhaylovgrad',
        '38' => 'Blagoevgrad',
        '39' => 'Burgas',
        '40' => 'Dobrich',
        '41' => 'Gabrovo',
        '42' => 'Grad Sofiya',
        '43' => 'Khaskovo',
        '44' => 'Kurdzhali',
        '45' => 'Kyustendil',
        '46' => 'Lovech',
        '47' => 'Montana',
        '48' => 'Pazardzhik',
        '49' => 'Pernik',
        '50' => 'Pleven',
        '51' => 'Plovdiv',
        '52' => 'Razgrad',
        '53' => 'Ruse',
        '54' => 'Shumen',
        '55' => 'Silistra',
        '56' => 'Sliven',
        '57' => 'Smolyan',
        '58' => 'Sofiya',
        '59' => 'Stara Zagora',
        '60' => 'Turgovishte',
        '61' => 'Varna',
        '62' => 'Veliko Turnovo',
        '63' => 'Vidin',
        '64' => 'Vratsa',
        '65' => 'Yambol'
    },
    'BH' => {
        '01' => 'Al Hadd',
        '02' => 'Al Manamah',
        '05' => 'Jidd Hafs',
        '06' => 'Sitrah',
        '08' => 'Al Mintaqah al Gharbiyah',
        '09' => 'Mintaqat Juzur Hawar',
        '10' => 'Al Mintaqah ash Shamaliyah',
        '11' => 'Al Mintaqah al Wusta',
        '12' => 'Madinat',
        '13' => 'Ar Rifa',
        '14' => 'Madinat Hamad',
        '15' => 'Al Muharraq',
        '16' => 'Al Asimah',
        '17' => 'Al Janubiyah',
        '18' => 'Ash Shamaliyah',
        '19' => 'Al Wusta'
    },
    'BI' => {
        '02' => 'Bujumbura',
        '09' => 'Bubanza',
        '10' => 'Bururi',
        '11' => 'Cankuzo',
        '12' => 'Cibitoke',
        '13' => 'Gitega',
        '14' => 'Karuzi',
        '15' => 'Kayanza',
        '16' => 'Kirundo',
        '17' => 'Makamba',
        '18' => 'Muyinga',
        '19' => 'Ngozi',
        '20' => 'Rutana',
        '21' => 'Ruyigi',
        '22' => 'Muramvya',
        '23' => 'Mwaro'
    },
    'BJ' => {
        '07' => 'Alibori',
        '08' => 'Atakora',
        '09' => 'Atlanyique',
        '10' => 'Borgou',
        '11' => 'Collines',
        '12' => 'Kouffo',
        '13' => 'Donga',
        '14' => 'Littoral',
        '15' => 'Mono',
        '16' => 'Oueme',
        '17' => 'Plateau',
        '18' => 'Zou'
    },
    'BM' => {
        '01' => 'Devonshire',
        '02' => 'Hamilton',
        '03' => 'Hamilton',
        '04' => 'Paget',
        '05' => 'Pembroke',
        '06' => 'Saint George',
        '07' => 'Saint George\'s',
        '08' => 'Sandys',
        '09' => 'Smiths',
        '10' => 'Southampton',
        '11' => 'Warwick'
    },
    'BN' => {
        '07' => 'Alibori',
        '08' => 'Belait',
        '09' => 'Brunei and Muara',
        '10' => 'Temburong',
        '11' => 'Collines',
        '12' => 'Kouffo',
        '13' => 'Donga',
        '14' => 'Littoral',
        '15' => 'Tutong',
        '16' => 'Oueme',
        '17' => 'Plateau',
        '18' => 'Zou'
    },
    'BO' => {
        '01' => 'Chuquisaca',
        '02' => 'Cochabamba',
        '03' => 'El Beni',
        '04' => 'La Paz',
        '05' => 'Oruro',
        '06' => 'Pando',
        '07' => 'Potosi',
        '08' => 'Santa Cruz',
        '09' => 'Tarija'
    },
    'BR' => {
        '01' => 'Acre',
        '02' => 'Alagoas',
        '03' => 'Amapa',
        '04' => 'Amazonas',
        '05' => 'Bahia',
        '06' => 'Ceara',
        '07' => 'Distrito Federal',
        '08' => 'Espirito Santo',
        '11' => 'Mato Grosso do Sul',
        '13' => 'Maranhao',
        '14' => 'Mato Grosso',
        '15' => 'Minas Gerais',
        '16' => 'Para',
        '17' => 'Paraiba',
        '18' => 'Parana',
        '20' => 'Piaui',
        '21' => 'Rio de Janeiro',
        '22' => 'Rio Grande do Norte',
        '23' => 'Rio Grande do Sul',
        '24' => 'Rondonia',
        '25' => 'Roraima',
        '26' => 'Santa Catarina',
        '27' => 'Sao Paulo',
        '28' => 'Sergipe',
        '29' => 'Goias',
        '30' => 'Pernambuco',
        '31' => 'Tocantins'
    },
    'BS' => {
        '05' => 'Bimini',
        '06' => 'Cat Island',
        '10' => 'Exuma',
        '13' => 'Inagua',
        '15' => 'Long Island',
        '16' => 'Mayaguana',
        '18' => 'Ragged Island',
        '22' => 'Harbour Island',
        '23' => 'New Providence',
        '24' => 'Acklins and Crooked Islands',
        '25' => 'Freeport',
        '26' => 'Fresh Creek',
        '27' => 'Governor\'s Harbour',
        '28' => 'Green Turtle Cay',
        '29' => 'High Rock',
        '30' => 'Kemps Bay',
        '31' => 'Marsh Harbour',
        '32' => 'Nichollstown and Berry Islands',
        '33' => 'Rock Sound',
        '34' => 'Sandy Point',
        '35' => 'San Salvador and Rum Cay'
    },
    'BT' => {
        '05' => 'Bumthang',
        '06' => 'Chhukha',
        '07' => 'Chirang',
        '08' => 'Daga',
        '09' => 'Geylegphug',
        '10' => 'Ha',
        '11' => 'Lhuntshi',
        '12' => 'Mongar',
        '13' => 'Paro',
        '14' => 'Pemagatsel',
        '15' => 'Punakha',
        '16' => 'Samchi',
        '17' => 'Samdrup',
        '18' => 'Shemgang',
        '19' => 'Tashigang',
        '20' => 'Thimphu',
        '21' => 'Tongsa',
        '22' => 'Wangdi Phodrang'
    },
    'BW' => {
        '01' => 'Central',
        '03' => 'Ghanzi',
        '04' => 'Kgalagadi',
        '05' => 'Kgatleng',
        '06' => 'Kweneng',
        '08' => 'North-East',
        '09' => 'South-East',
        '10' => 'Southern',
        '11' => 'North-West'
    },
    'BY' => {
        '01' => 'Brestskaya Voblasts\'',
        '02' => 'Homyel\'skaya Voblasts\'',
        '03' => 'Hrodzyenskaya Voblasts\'',
        '04' => 'Minsk',
        '05' => 'Minskaya Voblasts\'',
        '06' => 'Mahilyowskaya Voblasts\'',
        '07' => 'Vitsyebskaya Voblasts\''
    },
    'BZ' => {
        '01' => 'Belize',
        '02' => 'Cayo',
        '03' => 'Corozal',
        '04' => 'Orange Walk',
        '05' => 'Stann Creek',
        '06' => 'Toledo'
    },
    'CA' => {
        'AB' => 'Alberta',
        'BC' => 'British Columbia',
        'MB' => 'Manitoba',
        'NB' => 'New Brunswick',
        'NL' => 'Newfoundland',
        'NS' => 'Nova Scotia',
        'NT' => 'Northwest Territories',
        'NU' => 'Nunavut',
        'ON' => 'Ontario',
        'PE' => 'Prince Edward Island',
        'QC' => 'Quebec',
        'SK' => 'Saskatchewan',
        'YT' => 'Yukon Territory'
    },
    'CD' => {
        '01' => 'Bandundu',
        '02' => 'Equateur',
        '04' => 'Kasai-Oriental',
        '05' => 'Katanga',
        '06' => 'Kinshasa',
        '08' => 'Bas-Congo',
        '09' => 'Orientale',
        '10' => 'Maniema',
        '11' => 'Nord-Kivu',
        '12' => 'Sud-Kivu'
    },
    'CF' => {
        '01' => 'Bamingui-Bangoran',
        '02' => 'Basse-Kotto',
        '03' => 'Haute-Kotto',
        '04' => 'Mambere-Kadei',
        '05' => 'Haut-Mbomou',
        '06' => 'Kemo',
        '07' => 'Lobaye',
        '08' => 'Mbomou',
        '09' => 'Nana-Mambere',
        '11' => 'Ouaka',
        '12' => 'Ouham',
        '13' => 'Ouham-Pende',
        '14' => 'Cuvette-Ouest',
        '15' => 'Nana-Grebizi',
        '16' => 'Sangha-Mbaere',
        '17' => 'Ombella-Mpoko',
        '18' => 'Bangui'
    },
    'CG' => {
        '01' => 'Bouenza',
        '04' => 'Kouilou',
        '05' => 'Lekoumou',
        '06' => 'Likouala',
        '07' => 'Niari',
        '08' => 'Plateaux',
        '10' => 'Sangha',
        '11' => 'Pool',
        '12' => 'Brazzaville',
        '13' => 'Cuvette',
        '14' => 'Cuvette-Ouest'
    },
    'CH' => {
        '01' => 'Aargau',
        '02' => 'Ausser-Rhoden',
        '03' => 'Basel-Landschaft',
        '04' => 'Basel-Stadt',
        '05' => 'Bern',
        '06' => 'Fribourg',
        '07' => 'Geneve',
        '08' => 'Glarus',
        '09' => 'Graubunden',
        '10' => 'Inner-Rhoden',
        '11' => 'Luzern',
        '12' => 'Neuchatel',
        '13' => 'Nidwalden',
        '14' => 'Obwalden',
        '15' => 'Sankt Gallen',
        '16' => 'Schaffhausen',
        '17' => 'Schwyz',
        '18' => 'Solothurn',
        '19' => 'Thurgau',
        '20' => 'Ticino',
        '21' => 'Uri',
        '22' => 'Valais',
        '23' => 'Vaud',
        '24' => 'Zug',
        '25' => 'Zurich',
        '26' => 'Jura'
    },
    'CI' => {
        '74' => 'Agneby',
        '75' => 'Bafing',
        '76' => 'Bas-Sassandra',
        '77' => 'Denguele',
        '78' => 'Dix-Huit Montagnes',
        '79' => 'Fromager',
        '80' => 'Haut-Sassandra',
        '81' => 'Lacs',
        '82' => 'Lagunes',
        '83' => 'Marahoue',
        '84' => 'Moyen-Cavally',
        '85' => 'Moyen-Comoe',
        '86' => 'N\'zi-Comoe',
        '87' => 'Savanes',
        '88' => 'Sud-Bandama',
        '89' => 'Sud-Comoe',
        '90' => 'Vallee du Bandama',
        '91' => 'Worodougou',
        '92' => 'Zanzan'
    },
    'CL' => {
        '01' => 'Valparaiso',
        '02' => 'Aisen del General Carlos Ibanez del Campo',
        '03' => 'Antofagasta',
        '04' => 'Araucania',
        '05' => 'Atacama',
        '06' => 'Bio-Bio',
        '07' => 'Coquimbo',
        '08' => 'Libertador General Bernardo O\'Higgins',
        '09' => 'Los Lagos',
        '10' => 'Magallanes y de la Antartica Chilena',
        '11' => 'Maule',
        '12' => 'Region Metropolitana',
        '13' => 'Tarapaca',
        '14' => 'Los Lagos',
        '15' => 'Tarapaca',
        '16' => 'Arica y Parinacota',
        '17' => 'Los Rios'
    },
    'CM' => {
        '04' => 'Est',
        '05' => 'Littoral',
        '07' => 'Nord-Ouest',
        '08' => 'Ouest',
        '09' => 'Sud-Ouest',
        '10' => 'Adamaoua',
        '11' => 'Centre',
        '12' => 'Extreme-Nord',
        '13' => 'Nord',
        '14' => 'Sud'
    },
    'CN' => {
        '01' => 'Anhui',
        '02' => 'Zhejiang',
        '03' => 'Jiangxi',
        '04' => 'Jiangsu',
        '05' => 'Jilin',
        '06' => 'Qinghai',
        '07' => 'Fujian',
        '08' => 'Heilongjiang',
        '09' => 'Henan',
        '10' => 'Hebei',
        '11' => 'Hunan',
        '12' => 'Hubei',
        '13' => 'Xinjiang',
        '14' => 'Xizang',
        '15' => 'Gansu',
        '16' => 'Guangxi',
        '18' => 'Guizhou',
        '19' => 'Liaoning',
        '20' => 'Nei Mongol',
        '21' => 'Ningxia',
        '22' => 'Beijing',
        '23' => 'Shanghai',
        '24' => 'Shanxi',
        '25' => 'Shandong',
        '26' => 'Shaanxi',
        '28' => 'Tianjin',
        '29' => 'Yunnan',
        '30' => 'Guangdong',
        '31' => 'Hainan',
        '32' => 'Sichuan',
        '33' => 'Chongqing'
    },
    'CO' => {
        '01' => 'Amazonas',
        '02' => 'Antioquia',
        '03' => 'Arauca',
        '04' => 'Atlantico',
        '08' => 'Caqueta',
        '09' => 'Cauca',
        '10' => 'Cesar',
        '11' => 'Choco',
        '12' => 'Cordoba',
        '14' => 'Guaviare',
        '15' => 'Guainia',
        '16' => 'Huila',
        '17' => 'La Guajira',
        '19' => 'Meta',
        '20' => 'Narino',
        '21' => 'Norte de Santander',
        '22' => 'Putumayo',
        '23' => 'Quindio',
        '24' => 'Risaralda',
        '25' => 'San Andres y Providencia',
        '26' => 'Santander',
        '27' => 'Sucre',
        '28' => 'Tolima',
        '29' => 'Valle del Cauca',
        '30' => 'Vaupes',
        '31' => 'Vichada',
        '32' => 'Casanare',
        '33' => 'Cundinamarca',
        '34' => 'Distrito Especial',
        '35' => 'Bolivar',
        '36' => 'Boyaca',
        '37' => 'Caldas',
        '38' => 'Magdalena'
    },
    'CR' => {
        '01' => 'Alajuela',
        '02' => 'Cartago',
        '03' => 'Guanacaste',
        '04' => 'Heredia',
        '06' => 'Limon',
        '07' => 'Puntarenas',
        '08' => 'San Jose'
    },
    'CU' => {
        '01' => 'Pinar del Rio',
        '02' => 'Ciudad de la Habana',
        '03' => 'Matanzas',
        '04' => 'Isla de la Juventud',
        '05' => 'Camaguey',
        '07' => 'Ciego de Avila',
        '08' => 'Cienfuegos',
        '09' => 'Granma',
        '10' => 'Guantanamo',
        '11' => 'La Habana',
        '12' => 'Holguin',
        '13' => 'Las Tunas',
        '14' => 'Sancti Spiritus',
        '15' => 'Santiago de Cuba',
        '16' => 'Villa Clara'
    },
    'CV' => {
        '01' => 'Boa Vista',
        '02' => 'Brava',
        '04' => 'Maio',
        '05' => 'Paul',
        '07' => 'Ribeira Grande',
        '08' => 'Sal',
        '10' => 'Sao Nicolau',
        '11' => 'Sao Vicente',
        '13' => 'Mosteiros',
        '14' => 'Praia',
        '15' => 'Santa Catarina',
        '16' => 'Santa Cruz',
        '17' => 'Sao Domingos',
        '18' => 'Sao Filipe',
        '19' => 'Sao Miguel',
        '20' => 'Tarrafal'
    },
    'CY' => {
        '01' => 'Famagusta',
        '02' => 'Kyrenia',
        '03' => 'Larnaca',
        '04' => 'Nicosia',
        '05' => 'Limassol',
        '06' => 'Paphos'
    },
    'CZ' => {
        '52' => 'Hlavni mesto Praha',
        '78' => 'Jihomoravsky kraj',
        '79' => 'Jihocesky kraj',
        '80' => 'Vysocina',
        '81' => 'Karlovarsky kraj',
        '82' => 'Kralovehradecky kraj',
        '83' => 'Liberecky kraj',
        '84' => 'Olomoucky kraj',
        '85' => 'Moravskoslezsky kraj',
        '86' => 'Pardubicky kraj',
        '87' => 'Plzensky kraj',
        '88' => 'Stredocesky kraj',
        '89' => 'Ustecky kraj',
        '90' => 'Zlinsky kraj'
    },
    'DE' => {
        '01' => 'Baden-Wurttemberg',
        '02' => 'Bayern',
        '03' => 'Bremen',
        '04' => 'Hamburg',
        '05' => 'Hessen',
        '06' => 'Niedersachsen',
        '07' => 'Nordrhein-Westfalen',
        '08' => 'Rheinland-Pfalz',
        '09' => 'Saarland',
        '10' => 'Schleswig-Holstein',
        '11' => 'Brandenburg',
        '12' => 'Mecklenburg-Vorpommern',
        '13' => 'Sachsen',
        '14' => 'Sachsen-Anhalt',
        '15' => 'Thuringen',
        '16' => 'Berlin'
    },
    'DJ' => {
        '01' => 'Ali Sabieh',
        '04' => 'Obock',
        '05' => 'Tadjoura',
        '06' => 'Dikhil',
        '07' => 'Djibouti',
        '08' => 'Arta'
    },
    'DK' => {
        '17' => 'Hovedstaden',
        '18' => 'Midtjylland',
        '19' => 'Nordjylland',
        '20' => 'Sjelland',
        '21' => 'Syddanmark'
    },
    'DM' => {
        '02' => 'Saint Andrew',
        '03' => 'Saint David',
        '04' => 'Saint George',
        '05' => 'Saint John',
        '06' => 'Saint Joseph',
        '07' => 'Saint Luke',
        '08' => 'Saint Mark',
        '09' => 'Saint Patrick',
        '10' => 'Saint Paul',
        '11' => 'Saint Peter'
    },
    'DO' => {
        '01' => 'Azua',
        '02' => 'Baoruco',
        '03' => 'Barahona',
        '04' => 'Dajabon',
        '05' => 'Distrito Nacional',
        '06' => 'Duarte',
        '08' => 'Espaillat',
        '09' => 'Independencia',
        '10' => 'La Altagracia',
        '11' => 'Elias Pina',
        '12' => 'La Romana',
        '14' => 'Maria Trinidad Sanchez',
        '15' => 'Monte Cristi',
        '16' => 'Pedernales',
        '17' => 'Peravia',
        '18' => 'Puerto Plata',
        '19' => 'Salcedo',
        '20' => 'Samana',
        '21' => 'Sanchez Ramirez',
        '23' => 'San Juan',
        '24' => 'San Pedro De Macoris',
        '25' => 'Santiago',
        '26' => 'Santiago Rodriguez',
        '27' => 'Valverde',
        '28' => 'El Seibo',
        '29' => 'Hato Mayor',
        '30' => 'La Vega',
        '31' => 'Monsenor Nouel',
        '32' => 'Monte Plata',
        '33' => 'San Cristobal',
        '34' => 'Distrito Nacional',
        '35' => 'Peravia',
        '36' => 'San Jose de Ocoa',
        '37' => 'Santo Domingo'
    },
    'DZ' => {
        '01' => 'Alger',
        '03' => 'Batna',
        '04' => 'Constantine',
        '06' => 'Medea',
        '07' => 'Mostaganem',
        '09' => 'Oran',
        '10' => 'Saida',
        '12' => 'Setif',
        '13' => 'Tiaret',
        '14' => 'Tizi Ouzou',
        '15' => 'Tlemcen',
        '18' => 'Bejaia',
        '19' => 'Biskra',
        '20' => 'Blida',
        '21' => 'Bouira',
        '22' => 'Djelfa',
        '23' => 'Guelma',
        '24' => 'Jijel',
        '25' => 'Laghouat',
        '26' => 'Mascara',
        '27' => 'M\'sila',
        '29' => 'Oum el Bouaghi',
        '30' => 'Sidi Bel Abbes',
        '31' => 'Skikda',
        '33' => 'Tebessa',
        '34' => 'Adrar',
        '35' => 'Ain Defla',
        '36' => 'Ain Temouchent',
        '37' => 'Annaba',
        '38' => 'Bechar',
        '39' => 'Bordj Bou Arreridj',
        '40' => 'Boumerdes',
        '41' => 'Chlef',
        '42' => 'El Bayadh',
        '43' => 'El Oued',
        '44' => 'El Tarf',
        '45' => 'Ghardaia',
        '46' => 'Illizi',
        '47' => 'Khenchela',
        '48' => 'Mila',
        '49' => 'Naama',
        '50' => 'Ouargla',
        '51' => 'Relizane',
        '52' => 'Souk Ahras',
        '53' => 'Tamanghasset',
        '54' => 'Tindouf',
        '55' => 'Tipaza',
        '56' => 'Tissemsilt'
    },
    'EC' => {
        '01' => 'Galapagos',
        '02' => 'Azuay',
        '03' => 'Bolivar',
        '04' => 'Canar',
        '05' => 'Carchi',
        '06' => 'Chimborazo',
        '07' => 'Cotopaxi',
        '08' => 'El Oro',
        '09' => 'Esmeraldas',
        '10' => 'Guayas',
        '11' => 'Imbabura',
        '12' => 'Loja',
        '13' => 'Los Rios',
        '14' => 'Manabi',
        '15' => 'Morona-Santiago',
        '17' => 'Pastaza',
        '18' => 'Pichincha',
        '19' => 'Tungurahua',
        '20' => 'Zamora-Chinchipe',
        '22' => 'Sucumbios',
        '23' => 'Napo',
        '24' => 'Orellana'
    },
    'EE' => {
        '01' => 'Harjumaa',
        '02' => 'Hiiumaa',
        '03' => 'Ida-Virumaa',
        '04' => 'Jarvamaa',
        '05' => 'Jogevamaa',
        '06' => 'Kohtla-Jarve',
        '07' => 'Laanemaa',
        '08' => 'Laane-Virumaa',
        '09' => 'Narva',
        '10' => 'Parnu',
        '11' => 'Parnumaa',
        '12' => 'Polvamaa',
        '13' => 'Raplamaa',
        '14' => 'Saaremaa',
        '15' => 'Sillamae',
        '16' => 'Tallinn',
        '17' => 'Tartu',
        '18' => 'Tartumaa',
        '19' => 'Valgamaa',
        '20' => 'Viljandimaa',
        '21' => 'Vorumaa'
    },
    'EG' => {
        '01' => 'Ad Daqahliyah',
        '02' => 'Al Bahr al Ahmar',
        '03' => 'Al Buhayrah',
        '04' => 'Al Fayyum',
        '05' => 'Al Gharbiyah',
        '06' => 'Al Iskandariyah',
        '07' => 'Al Isma\'iliyah',
        '08' => 'Al Jizah',
        '09' => 'Al Minufiyah',
        '10' => 'Al Minya',
        '11' => 'Al Qahirah',
        '12' => 'Al Qalyubiyah',
        '13' => 'Al Wadi al Jadid',
        '14' => 'Ash Sharqiyah',
        '15' => 'As Suways',
        '16' => 'Aswan',
        '17' => 'Asyut',
        '18' => 'Bani Suwayf',
        '19' => 'Bur Sa\'id',
        '20' => 'Dumyat',
        '21' => 'Kafr ash Shaykh',
        '22' => 'Matruh',
        '23' => 'Qina',
        '24' => 'Suhaj',
        '26' => 'Janub Sina\'',
        '27' => 'Shamal Sina\'',
        '28' => 'Al Uqsur'
    },
    'ER' => {
        '01' => 'Anseba',
        '02' => 'Debub',
        '03' => 'Debubawi K\'eyih Bahri',
        '04' => 'Gash Barka',
        '05' => 'Ma\'akel',
        '06' => 'Semenawi K\'eyih Bahri'
    },
    'ES' => {
        '07' => 'Islas Baleares',
        '27' => 'La Rioja',
        '29' => 'Madrid',
        '31' => 'Murcia',
        '32' => 'Navarra',
        '34' => 'Asturias',
        '39' => 'Cantabria',
        '51' => 'Andalucia',
        '52' => 'Aragon',
        '53' => 'Canarias',
        '54' => 'Castilla-La Mancha',
        '55' => 'Castilla y Leon',
        '56' => 'Catalonia',
        '57' => 'Extremadura',
        '58' => 'Galicia',
        '59' => 'Pais Vasco',
        '60' => 'Comunidad Valenciana'
    },
    'ET' => {
        '44' => 'Adis Abeba',
        '45' => 'Afar',
        '46' => 'Amara',
        '47' => 'Binshangul Gumuz',
        '48' => 'Dire Dawa',
        '49' => 'Gambela Hizboch',
        '50' => 'Hareri Hizb',
        '51' => 'Oromiya',
        '52' => 'Sumale',
        '53' => 'Tigray',
        '54' => 'YeDebub Biheroch Bihereseboch na Hizboch'
    },
    'FI' => {
        '01' => 'Aland',
        '06' => 'Lapland',
        '08' => 'Oulu',
        '13' => 'Southern Finland',
        '14' => 'Eastern Finland',
        '15' => 'Western Finland'
    },
    'FJ' => {
        '01' => 'Central',
        '02' => 'Eastern',
        '03' => 'Northern',
        '04' => 'Rotuma',
        '05' => 'Western'
    },
    'FM' => {
        '01' => 'Kosrae',
        '02' => 'Pohnpei',
        '03' => 'Chuuk',
        '04' => 'Yap'
    },
    'FR' => {
        '97' => 'Aquitaine',
        '98' => 'Auvergne',
        '99' => 'Basse-Normandie',
        'A1' => 'Bourgogne',
        'A2' => 'Bretagne',
        'A3' => 'Centre',
        'A4' => 'Champagne-Ardenne',
        'A5' => 'Corse',
        'A6' => 'Franche-Comte',
        'A7' => 'Haute-Normandie',
        'A8' => 'Ile-de-France',
        'A9' => 'Languedoc-Roussillon',
        'B1' => 'Limousin',
        'B2' => 'Lorraine',
        'B3' => 'Midi-Pyrenees',
        'B4' => 'Nord-Pas-de-Calais',
        'B5' => 'Pays de la Loire',
        'B6' => 'Picardie',
        'B7' => 'Poitou-Charentes',
        'B8' => 'Provence-Alpes-Cote d\'Azur',
        'B9' => 'Rhone-Alpes',
        'C1' => 'Alsace'
    },
    'GA' => {
        '01' => 'Estuaire',
        '02' => 'Haut-Ogooue',
        '03' => 'Moyen-Ogooue',
        '04' => 'Ngounie',
        '05' => 'Nyanga',
        '06' => 'Ogooue-Ivindo',
        '07' => 'Ogooue-Lolo',
        '08' => 'Ogooue-Maritime',
        '09' => 'Woleu-Ntem'
    },
    'GB' => {
        'A1' => 'Barking and Dagenham',
        'A2' => 'Barnet',
        'A3' => 'Barnsley',
        'A4' => 'Bath and North East Somerset',
        'A5' => 'Bedfordshire',
        'A6' => 'Bexley',
        'A7' => 'Birmingham',
        'A8' => 'Blackburn with Darwen',
        'A9' => 'Blackpool',
        'B1' => 'Bolton',
        'B2' => 'Bournemouth',
        'B3' => 'Bracknell Forest',
        'B4' => 'Bradford',
        'B5' => 'Brent',
        'B6' => 'Brighton and Hove',
        'B7' => 'Bristol, City of',
        'B8' => 'Bromley',
        'B9' => 'Buckinghamshire',
        'C1' => 'Bury',
        'C2' => 'Calderdale',
        'C3' => 'Cambridgeshire',
        'C4' => 'Camden',
        'C5' => 'Cheshire',
        'C6' => 'Cornwall',
        'C7' => 'Coventry',
        'C8' => 'Croydon',
        'C9' => 'Cumbria',
        'D1' => 'Darlington',
        'D2' => 'Derby',
        'D3' => 'Derbyshire',
        'D4' => 'Devon',
        'D5' => 'Doncaster',
        'D6' => 'Dorset',
        'D7' => 'Dudley',
        'D8' => 'Durham',
        'D9' => 'Ealing',
        'E1' => 'East Riding of Yorkshire',
        'E2' => 'East Sussex',
        'E3' => 'Enfield',
        'E4' => 'Essex',
        'E5' => 'Gateshead',
        'E6' => 'Gloucestershire',
        'E7' => 'Greenwich',
        'E8' => 'Hackney',
        'E9' => 'Halton',
        'F1' => 'Hammersmith and Fulham',
        'F2' => 'Hampshire',
        'F3' => 'Haringey',
        'F4' => 'Harrow',
        'F5' => 'Hartlepool',
        'F6' => 'Havering',
        'F7' => 'Herefordshire',
        'F8' => 'Hertford',
        'F9' => 'Hillingdon',
        'G1' => 'Hounslow',
        'G2' => 'Isle of Wight',
        'G3' => 'Islington',
        'G4' => 'Kensington and Chelsea',
        'G5' => 'Kent',
        'G6' => 'Kingston upon Hull, City of',
        'G7' => 'Kingston upon Thames',
        'G8' => 'Kirklees',
        'G9' => 'Knowsley',
        'H1' => 'Lambeth',
        'H2' => 'Lancashire',
        'H3' => 'Leeds',
        'H4' => 'Leicester',
        'H5' => 'Leicestershire',
        'H6' => 'Lewisham',
        'H7' => 'Lincolnshire',
        'H8' => 'Liverpool',
        'H9' => 'London, City of',
        'I1' => 'Luton',
        'I2' => 'Manchester',
        'I3' => 'Medway',
        'I4' => 'Merton',
        'I5' => 'Middlesbrough',
        'I6' => 'Milton Keynes',
        'I7' => 'Newcastle upon Tyne',
        'I8' => 'Newham',
        'I9' => 'Norfolk',
        'J1' => 'Northamptonshire',
        'J2' => 'North East Lincolnshire',
        'J3' => 'North Lincolnshire',
        'J4' => 'North Somerset',
        'J5' => 'North Tyneside',
        'J6' => 'Northumberland',
        'J7' => 'North Yorkshire',
        'J8' => 'Nottingham',
        'J9' => 'Nottinghamshire',
        'K1' => 'Oldham',
        'K2' => 'Oxfordshire',
        'K3' => 'Peterborough',
        'K4' => 'Plymouth',
        'K5' => 'Poole',
        'K6' => 'Portsmouth',
        'K7' => 'Reading',
        'K8' => 'Redbridge',
        'K9' => 'Redcar and Cleveland',
        'L1' => 'Richmond upon Thames',
        'L2' => 'Rochdale',
        'L3' => 'Rotherham',
        'L4' => 'Rutland',
        'L5' => 'Salford',
        'L6' => 'Shropshire',
        'L7' => 'Sandwell',
        'L8' => 'Sefton',
        'L9' => 'Sheffield',
        'M1' => 'Slough',
        'M2' => 'Solihull',
        'M3' => 'Somerset',
        'M4' => 'Southampton',
        'M5' => 'Southend-on-Sea',
        'M6' => 'South Gloucestershire',
        'M7' => 'South Tyneside',
        'M8' => 'Southwark',
        'M9' => 'Staffordshire',
        'N1' => 'St. Helens',
        'N2' => 'Stockport',
        'N3' => 'Stockton-on-Tees',
        'N4' => 'Stoke-on-Trent',
        'N5' => 'Suffolk',
        'N6' => 'Sunderland',
        'N7' => 'Surrey',
        'N8' => 'Sutton',
        'N9' => 'Swindon',
        'O1' => 'Tameside',
        'O2' => 'Telford and Wrekin',
        'O3' => 'Thurrock',
        'O4' => 'Torbay',
        'O5' => 'Tower Hamlets',
        'O6' => 'Trafford',
        'O7' => 'Wakefield',
        'O8' => 'Walsall',
        'O9' => 'Waltham Forest',
        'P1' => 'Wandsworth',
        'P2' => 'Warrington',
        'P3' => 'Warwickshire',
        'P4' => 'West Berkshire',
        'P5' => 'Westminster',
        'P6' => 'West Sussex',
        'P7' => 'Wigan',
        'P8' => 'Wiltshire',
        'P9' => 'Windsor and Maidenhead',
        'Q1' => 'Wirral',
        'Q2' => 'Wokingham',
        'Q3' => 'Wolverhampton',
        'Q4' => 'Worcestershire',
        'Q5' => 'York',
        'Q6' => 'Antrim',
        'Q7' => 'Ards',
        'Q8' => 'Armagh',
        'Q9' => 'Ballymena',
        'R1' => 'Ballymoney',
        'R2' => 'Banbridge',
        'R3' => 'Belfast',
        'R4' => 'Carrickfergus',
        'R5' => 'Castlereagh',
        'R6' => 'Coleraine',
        'R7' => 'Cookstown',
        'R8' => 'Craigavon',
        'R9' => 'Down',
        'S1' => 'Dungannon',
        'S2' => 'Fermanagh',
        'S3' => 'Larne',
        'S4' => 'Limavady',
        'S5' => 'Lisburn',
        'S6' => 'Derry',
        'S7' => 'Magherafelt',
        'S8' => 'Moyle',
        'S9' => 'Newry and Mourne',
        'T1' => 'Newtownabbey',
        'T2' => 'North Down',
        'T3' => 'Omagh',
        'T4' => 'Strabane',
        'T5' => 'Aberdeen City',
        'T6' => 'Aberdeenshire',
        'T7' => 'Angus',
        'T8' => 'Argyll and Bute',
        'T9' => 'Scottish Borders, The',
        'U1' => 'Clackmannanshire',
        'U2' => 'Dumfries and Galloway',
        'U3' => 'Dundee City',
        'U4' => 'East Ayrshire',
        'U5' => 'East Dunbartonshire',
        'U6' => 'East Lothian',
        'U7' => 'East Renfrewshire',
        'U8' => 'Edinburgh, City of',
        'U9' => 'Falkirk',
        'V1' => 'Fife',
        'V2' => 'Glasgow City',
        'V3' => 'Highland',
        'V4' => 'Inverclyde',
        'V5' => 'Midlothian',
        'V6' => 'Moray',
        'V7' => 'North Ayrshire',
        'V8' => 'North Lanarkshire',
        'V9' => 'Orkney',
        'W1' => 'Perth and Kinross',
        'W2' => 'Renfrewshire',
        'W3' => 'Shetland Islands',
        'W4' => 'South Ayrshire',
        'W5' => 'South Lanarkshire',
        'W6' => 'Stirling',
        'W7' => 'West Dunbartonshire',
        'W8' => 'Eilean Siar',
        'W9' => 'West Lothian',
        'X1' => 'Isle of Anglesey',
        'X2' => 'Blaenau Gwent',
        'X3' => 'Bridgend',
        'X4' => 'Caerphilly',
        'X5' => 'Cardiff',
        'X6' => 'Ceredigion',
        'X7' => 'Carmarthenshire',
        'X8' => 'Conwy',
        'X9' => 'Denbighshire',
        'Y1' => 'Flintshire',
        'Y2' => 'Gwynedd',
        'Y3' => 'Merthyr Tydfil',
        'Y4' => 'Monmouthshire',
        'Y5' => 'Neath Port Talbot',
        'Y6' => 'Newport',
        'Y7' => 'Pembrokeshire',
        'Y8' => 'Powys',
        'Y9' => 'Rhondda Cynon Taff',
        'Z1' => 'Swansea',
        'Z2' => 'Torfaen',
        'Z3' => 'Vale of Glamorgan, The',
        'Z4' => 'Wrexham',
        'Z5' => 'Bedfordshire',
        'Z6' => 'Central Bedfordshire',
        'Z7' => 'Cheshire East',
        'Z8' => 'Cheshire West and Chester',
        'Z9' => 'Isles of Scilly'
    },
    'GD' => {
        '01' => 'Saint Andrew',
        '02' => 'Saint David',
        '03' => 'Saint George',
        '04' => 'Saint John',
        '05' => 'Saint Mark',
        '06' => 'Saint Patrick'
    },
    'GE' => {
        '01' => 'Abashis Raioni',
        '02' => 'Abkhazia',
        '03' => 'Adigenis Raioni',
        '04' => 'Ajaria',
        '05' => 'Akhalgoris Raioni',
        '06' => 'Akhalk\'alak\'is Raioni',
        '07' => 'Akhalts\'ikhis Raioni',
        '08' => 'Akhmetis Raioni',
        '09' => 'Ambrolauris Raioni',
        '10' => 'Aspindzis Raioni',
        '11' => 'Baghdat\'is Raioni',
        '12' => 'Bolnisis Raioni',
        '13' => 'Borjomis Raioni',
        '14' => 'Chiat\'ura',
        '15' => 'Ch\'khorotsqus Raioni',
        '16' => 'Ch\'okhatauris Raioni',
        '17' => 'Dedop\'listsqaros Raioni',
        '18' => 'Dmanisis Raioni',
        '19' => 'Dushet\'is Raioni',
        '20' => 'Gardabanis Raioni',
        '21' => 'Gori',
        '22' => 'Goris Raioni',
        '23' => 'Gurjaanis Raioni',
        '24' => 'Javis Raioni',
        '25' => 'K\'arelis Raioni',
        '26' => 'Kaspis Raioni',
        '27' => 'Kharagaulis Raioni',
        '28' => 'Khashuris Raioni',
        '29' => 'Khobis Raioni',
        '30' => 'Khonis Raioni',
        '31' => 'K\'ut\'aisi',
        '32' => 'Lagodekhis Raioni',
        '33' => 'Lanch\'khut\'is Raioni',
        '34' => 'Lentekhis Raioni',
        '35' => 'Marneulis Raioni',
        '36' => 'Martvilis Raioni',
        '37' => 'Mestiis Raioni',
        '38' => 'Mts\'khet\'is Raioni',
        '39' => 'Ninotsmindis Raioni',
        '40' => 'Onis Raioni',
        '41' => 'Ozurget\'is Raioni',
        '42' => 'P\'ot\'i',
        '43' => 'Qazbegis Raioni',
        '44' => 'Qvarlis Raioni',
        '45' => 'Rust\'avi',
        '46' => 'Sach\'kheris Raioni',
        '47' => 'Sagarejos Raioni',
        '48' => 'Samtrediis Raioni',
        '49' => 'Senakis Raioni',
        '50' => 'Sighnaghis Raioni',
        '51' => 'T\'bilisi',
        '52' => 'T\'elavis Raioni',
        '53' => 'T\'erjolis Raioni',
        '54' => 'T\'et\'ritsqaros Raioni',
        '55' => 'T\'ianet\'is Raioni',
        '56' => 'Tqibuli',
        '57' => 'Ts\'ageris Raioni',
        '58' => 'Tsalenjikhis Raioni',
        '59' => 'Tsalkis Raioni',
        '60' => 'Tsqaltubo',
        '61' => 'Vanis Raioni',
        '62' => 'Zestap\'onis Raioni',
        '63' => 'Zugdidi',
        '64' => 'Zugdidis Raioni'
    },
    'GH' => {
        '01' => 'Greater Accra',
        '02' => 'Ashanti',
        '03' => 'Brong-Ahafo',
        '04' => 'Central',
        '05' => 'Eastern',
        '06' => 'Northern',
        '08' => 'Volta',
        '09' => 'Western',
        '10' => 'Upper East',
        '11' => 'Upper West'
    },
    'GL' => {
        '01' => 'Nordgronland',
        '02' => 'Ostgronland',
        '03' => 'Vestgronland'
    },
    'GM' => {
        '01' => 'Banjul',
        '02' => 'Lower River',
        '03' => 'Central River',
        '04' => 'Upper River',
        '05' => 'Western',
        '07' => 'North Bank'
    },
    'GN' => {
        '01' => 'Beyla',
        '02' => 'Boffa',
        '03' => 'Boke',
        '04' => 'Conakry',
        '05' => 'Dabola',
        '06' => 'Dalaba',
        '07' => 'Dinguiraye',
        '09' => 'Faranah',
        '10' => 'Forecariah',
        '11' => 'Fria',
        '12' => 'Gaoual',
        '13' => 'Gueckedou',
        '15' => 'Kerouane',
        '16' => 'Kindia',
        '17' => 'Kissidougou',
        '18' => 'Koundara',
        '19' => 'Kouroussa',
        '21' => 'Macenta',
        '22' => 'Mali',
        '23' => 'Mamou',
        '25' => 'Pita',
        '27' => 'Telimele',
        '28' => 'Tougue',
        '29' => 'Yomou',
        '30' => 'Coyah',
        '31' => 'Dubreka',
        '32' => 'Kankan',
        '33' => 'Koubia',
        '34' => 'Labe',
        '35' => 'Lelouma',
        '36' => 'Lola',
        '37' => 'Mandiana',
        '38' => 'Nzerekore',
        '39' => 'Siguiri'
    },
    'GQ' => {
        '03' => 'Annobon',
        '04' => 'Bioko Norte',
        '05' => 'Bioko Sur',
        '06' => 'Centro Sur',
        '07' => 'Kie-Ntem',
        '08' => 'Litoral',
        '09' => 'Wele-Nzas'
    },
    'GR' => {
        '01' => 'Evros',
        '02' => 'Rodhopi',
        '03' => 'Xanthi',
        '04' => 'Drama',
        '05' => 'Serrai',
        '06' => 'Kilkis',
        '07' => 'Pella',
        '08' => 'Florina',
        '09' => 'Kastoria',
        '10' => 'Grevena',
        '11' => 'Kozani',
        '12' => 'Imathia',
        '13' => 'Thessaloniki',
        '14' => 'Kavala',
        '15' => 'Khalkidhiki',
        '16' => 'Pieria',
        '17' => 'Ioannina',
        '18' => 'Thesprotia',
        '19' => 'Preveza',
        '20' => 'Arta',
        '21' => 'Larisa',
        '22' => 'Trikala',
        '23' => 'Kardhitsa',
        '24' => 'Magnisia',
        '25' => 'Kerkira',
        '26' => 'Levkas',
        '27' => 'Kefallinia',
        '28' => 'Zakinthos',
        '29' => 'Fthiotis',
        '30' => 'Evritania',
        '31' => 'Aitolia kai Akarnania',
        '32' => 'Fokis',
        '33' => 'Voiotia',
        '34' => 'Evvoia',
        '35' => 'Attiki',
        '36' => 'Argolis',
        '37' => 'Korinthia',
        '38' => 'Akhaia',
        '39' => 'Ilia',
        '40' => 'Messinia',
        '41' => 'Arkadhia',
        '42' => 'Lakonia',
        '43' => 'Khania',
        '44' => 'Rethimni',
        '45' => 'Iraklion',
        '46' => 'Lasithi',
        '47' => 'Dhodhekanisos',
        '48' => 'Samos',
        '49' => 'Kikladhes',
        '50' => 'Khios',
        '51' => 'Lesvos'
    },
    'GT' => {
        '01' => 'Alta Verapaz',
        '02' => 'Baja Verapaz',
        '03' => 'Chimaltenango',
        '04' => 'Chiquimula',
        '05' => 'El Progreso',
        '06' => 'Escuintla',
        '07' => 'Guatemala',
        '08' => 'Huehuetenango',
        '09' => 'Izabal',
        '10' => 'Jalapa',
        '11' => 'Jutiapa',
        '12' => 'Peten',
        '13' => 'Quetzaltenango',
        '14' => 'Quiche',
        '15' => 'Retalhuleu',
        '16' => 'Sacatepequez',
        '17' => 'San Marcos',
        '18' => 'Santa Rosa',
        '19' => 'Solola',
        '20' => 'Suchitepequez',
        '21' => 'Totonicapan',
        '22' => 'Zacapa'
    },
    'GW' => {
        '01' => 'Bafata',
        '02' => 'Quinara',
        '04' => 'Oio',
        '05' => 'Bolama',
        '06' => 'Cacheu',
        '07' => 'Tombali',
        '10' => 'Gabu',
        '11' => 'Bissau',
        '12' => 'Biombo'
    },
    'GY' => {
        '10' => 'Barima-Waini',
        '11' => 'Cuyuni-Mazaruni',
        '12' => 'Demerara-Mahaica',
        '13' => 'East Berbice-Corentyne',
        '14' => 'Essequibo Islands-West Demerara',
        '15' => 'Mahaica-Berbice',
        '16' => 'Pomeroon-Supenaam',
        '17' => 'Potaro-Siparuni',
        '18' => 'Upper Demerara-Berbice',
        '19' => 'Upper Takutu-Upper Essequibo'
    },
    'HN' => {
        '01' => 'Atlantida',
        '02' => 'Choluteca',
        '03' => 'Colon',
        '04' => 'Comayagua',
        '05' => 'Copan',
        '06' => 'Cortes',
        '07' => 'El Paraiso',
        '08' => 'Francisco Morazan',
        '09' => 'Gracias a Dios',
        '10' => 'Intibuca',
        '11' => 'Islas de la Bahia',
        '12' => 'La Paz',
        '13' => 'Lempira',
        '14' => 'Ocotepeque',
        '15' => 'Olancho',
        '16' => 'Santa Barbara',
        '17' => 'Valle',
        '18' => 'Yoro'
    },
    'HR' => {
        '01' => 'Bjelovarsko-Bilogorska',
        '02' => 'Brodsko-Posavska',
        '03' => 'Dubrovacko-Neretvanska',
        '04' => 'Istarska',
        '05' => 'Karlovacka',
        '06' => 'Koprivnicko-Krizevacka',
        '07' => 'Krapinsko-Zagorska',
        '08' => 'Licko-Senjska',
        '09' => 'Medimurska',
        '10' => 'Osjecko-Baranjska',
        '11' => 'Pozesko-Slavonska',
        '12' => 'Primorsko-Goranska',
        '13' => 'Sibensko-Kninska',
        '14' => 'Sisacko-Moslavacka',
        '15' => 'Splitsko-Dalmatinska',
        '16' => 'Varazdinska',
        '17' => 'Viroviticko-Podravska',
        '18' => 'Vukovarsko-Srijemska',
        '19' => 'Zadarska',
        '20' => 'Zagrebacka',
        '21' => 'Grad Zagreb'
    },
    'HT' => {
        '03' => 'Nord-Ouest',
        '06' => 'Artibonite',
        '07' => 'Centre',
        '09' => 'Nord',
        '10' => 'Nord-Est',
        '11' => 'Ouest',
        '12' => 'Sud',
        '13' => 'Sud-Est',
        '14' => 'Grand\' Anse',
        '15' => 'Nippes'
    },
    'HU' => {
        '01' => 'Bacs-Kiskun',
        '02' => 'Baranya',
        '03' => 'Bekes',
        '04' => 'Borsod-Abauj-Zemplen',
        '05' => 'Budapest',
        '06' => 'Csongrad',
        '07' => 'Debrecen',
        '08' => 'Fejer',
        '09' => 'Gyor-Moson-Sopron',
        '10' => 'Hajdu-Bihar',
        '11' => 'Heves',
        '12' => 'Komarom-Esztergom',
        '13' => 'Miskolc',
        '14' => 'Nograd',
        '15' => 'Pecs',
        '16' => 'Pest',
        '17' => 'Somogy',
        '18' => 'Szabolcs-Szatmar-Bereg',
        '19' => 'Szeged',
        '20' => 'Jasz-Nagykun-Szolnok',
        '21' => 'Tolna',
        '22' => 'Vas',
        '23' => 'Veszprem',
        '24' => 'Zala',
        '25' => 'Gyor',
        '26' => 'Bekescsaba',
        '27' => 'Dunaujvaros',
        '28' => 'Eger',
        '29' => 'Hodmezovasarhely',
        '30' => 'Kaposvar',
        '31' => 'Kecskemet',
        '32' => 'Nagykanizsa',
        '33' => 'Nyiregyhaza',
        '34' => 'Sopron',
        '35' => 'Szekesfehervar',
        '36' => 'Szolnok',
        '37' => 'Szombathely',
        '38' => 'Tatabanya',
        '39' => 'Veszprem',
        '40' => 'Zalaegerszeg',
        '41' => 'Salgotarjan',
        '42' => 'Szekszard',
        '43' => 'Erd'
    },
    'ID' => {
        '01' => 'Aceh',
        '02' => 'Bali',
        '03' => 'Bengkulu',
        '04' => 'Jakarta Raya',
        '05' => 'Jambi',
        '07' => 'Jawa Tengah',
        '08' => 'Jawa Timur',
        '10' => 'Yogyakarta',
        '11' => 'Kalimantan Barat',
        '12' => 'Kalimantan Selatan',
        '13' => 'Kalimantan Tengah',
        '14' => 'Kalimantan Timur',
        '15' => 'Lampung',
        '17' => 'Nusa Tenggara Barat',
        '18' => 'Nusa Tenggara Timur',
        '21' => 'Sulawesi Tengah',
        '22' => 'Sulawesi Tenggara',
        '24' => 'Sumatera Barat',
        '26' => 'Sumatera Utara',
        '28' => 'Maluku',
        '29' => 'Maluku Utara',
        '30' => 'Jawa Barat',
        '31' => 'Sulawesi Utara',
        '32' => 'Sumatera Selatan',
        '33' => 'Banten',
        '34' => 'Gorontalo',
        '35' => 'Kepulauan Bangka Belitung',
        '36' => 'Papua',
        '37' => 'Riau',
        '38' => 'Sulawesi Selatan',
        '39' => 'Irian Jaya Barat',
        '40' => 'Kepulauan Riau',
        '41' => 'Sulawesi Barat'
    },
    'IE' => {
        '01' => 'Carlow',
        '02' => 'Cavan',
        '03' => 'Clare',
        '04' => 'Cork',
        '06' => 'Donegal',
        '07' => 'Dublin',
        '10' => 'Galway',
        '11' => 'Kerry',
        '12' => 'Kildare',
        '13' => 'Kilkenny',
        '14' => 'Leitrim',
        '15' => 'Laois',
        '16' => 'Limerick',
        '18' => 'Longford',
        '19' => 'Louth',
        '20' => 'Mayo',
        '21' => 'Meath',
        '22' => 'Monaghan',
        '23' => 'Offaly',
        '24' => 'Roscommon',
        '25' => 'Sligo',
        '26' => 'Tipperary',
        '27' => 'Waterford',
        '29' => 'Westmeath',
        '30' => 'Wexford',
        '31' => 'Wicklow'
    },
    'IL' => {
        '01' => 'HaDarom',
        '02' => 'HaMerkaz',
        '03' => 'HaZafon',
        '04' => 'Hefa',
        '05' => 'Tel Aviv',
        '06' => 'Yerushalayim'
    },
    'IN' => {
        '01' => 'Andaman and Nicobar Islands',
        '02' => 'Andhra Pradesh',
        '03' => 'Assam',
        '05' => 'Chandigarh',
        '06' => 'Dadra and Nagar Haveli',
        '07' => 'Delhi',
        '09' => 'Gujarat',
        '10' => 'Haryana',
        '11' => 'Himachal Pradesh',
        '12' => 'Jammu and Kashmir',
        '13' => 'Kerala',
        '14' => 'Lakshadweep',
        '16' => 'Maharashtra',
        '17' => 'Manipur',
        '18' => 'Meghalaya',
        '19' => 'Karnataka',
        '20' => 'Nagaland',
        '21' => 'Orissa',
        '22' => 'Puducherry',
        '23' => 'Punjab',
        '24' => 'Rajasthan',
        '25' => 'Tamil Nadu',
        '26' => 'Tripura',
        '28' => 'West Bengal',
        '29' => 'Sikkim',
        '30' => 'Arunachal Pradesh',
        '31' => 'Mizoram',
        '32' => 'Daman and Diu',
        '33' => 'Goa',
        '34' => 'Bihar',
        '35' => 'Madhya Pradesh',
        '36' => 'Uttar Pradesh',
        '37' => 'Chhattisgarh',
        '38' => 'Jharkhand',
        '39' => 'Uttarakhand'
    },
    'IQ' => {
        '01' => 'Al Anbar',
        '02' => 'Al Basrah',
        '03' => 'Al Muthanna',
        '04' => 'Al Qadisiyah',
        '05' => 'As Sulaymaniyah',
        '06' => 'Babil',
        '07' => 'Baghdad',
        '08' => 'Dahuk',
        '09' => 'Dhi Qar',
        '10' => 'Diyala',
        '11' => 'Arbil',
        '12' => 'Karbala\'',
        '13' => 'At Ta\'mim',
        '14' => 'Maysan',
        '15' => 'Ninawa',
        '16' => 'Wasit',
        '17' => 'An Najaf',
        '18' => 'Salah ad Din'
    },
    'IR' => {
        '01' => 'Azarbayjan-e Bakhtari',
        '03' => 'Chahar Mahall va Bakhtiari',
        '04' => 'Sistan va Baluchestan',
        '05' => 'Kohkiluyeh va Buyer Ahmadi',
        '07' => 'Fars',
        '08' => 'Gilan',
        '09' => 'Hamadan',
        '10' => 'Ilam',
        '11' => 'Hormozgan',
        '12' => 'Kerman',
        '13' => 'Bakhtaran',
        '15' => 'Khuzestan',
        '16' => 'Kordestan',
        '17' => 'Mazandaran',
        '18' => 'Semnan Province',
        '19' => 'Markazi',
        '21' => 'Zanjan',
        '22' => 'Bushehr',
        '23' => 'Lorestan',
        '24' => 'Markazi',
        '25' => 'Semnan',
        '26' => 'Tehran',
        '27' => 'Zanjan',
        '28' => 'Esfahan',
        '29' => 'Kerman',
        '30' => 'Khorasan',
        '31' => 'Yazd',
        '32' => 'Ardabil',
        '33' => 'East Azarbaijan',
        '34' => 'Markazi',
        '35' => 'Mazandaran',
        '36' => 'Zanjan',
        '37' => 'Golestan',
        '38' => 'Qazvin',
        '39' => 'Qom',
        '40' => 'Yazd',
        '41' => 'Khorasan-e Janubi',
        '42' => 'Khorasan-e Razavi',
        '43' => 'Khorasan-e Shemali',
        '44' => 'Alborz'
    },
    'IS' => {
        '03' => 'Arnessysla',
        '05' => 'Austur-Hunavatnssysla',
        '06' => 'Austur-Skaftafellssysla',
        '07' => 'Borgarfjardarsysla',
        '09' => 'Eyjafjardarsysla',
        '10' => 'Gullbringusysla',
        '15' => 'Kjosarsysla',
        '17' => 'Myrasysla',
        '20' => 'Nordur-Mulasysla',
        '21' => 'Nordur-Tingeyjarsysla',
        '23' => 'Rangarvallasysla',
        '28' => 'Skagafjardarsysla',
        '29' => 'Snafellsnes- og Hnappadalssysla',
        '30' => 'Strandasysla',
        '31' => 'Sudur-Mulasysla',
        '32' => 'Sudur-Tingeyjarsysla',
        '34' => 'Vestur-Bardastrandarsysla',
        '35' => 'Vestur-Hunavatnssysla',
        '36' => 'Vestur-Isafjardarsysla',
        '37' => 'Vestur-Skaftafellssysla',
        '38' => 'Austurland',
        '39' => 'Hofuoborgarsvaoio',
        '40' => 'Norourland Eystra',
        '41' => 'Norourland Vestra',
        '42' => 'Suourland',
        '43' => 'Suournes',
        '44' => 'Vestfiroir',
        '45' => 'Vesturland'
    },
    'IT' => {
        '01' => 'Abruzzi',
        '02' => 'Basilicata',
        '03' => 'Calabria',
        '04' => 'Campania',
        '05' => 'Emilia-Romagna',
        '06' => 'Friuli-Venezia Giulia',
        '07' => 'Lazio',
        '08' => 'Liguria',
        '09' => 'Lombardia',
        '10' => 'Marche',
        '11' => 'Molise',
        '12' => 'Piemonte',
        '13' => 'Puglia',
        '14' => 'Sardegna',
        '15' => 'Sicilia',
        '16' => 'Toscana',
        '17' => 'Trentino-Alto Adige',
        '18' => 'Umbria',
        '19' => 'Valle d\'Aosta',
        '20' => 'Veneto'
    },
    'JM' => {
        '01' => 'Clarendon',
        '02' => 'Hanover',
        '04' => 'Manchester',
        '07' => 'Portland',
        '08' => 'Saint Andrew',
        '09' => 'Saint Ann',
        '10' => 'Saint Catherine',
        '11' => 'Saint Elizabeth',
        '12' => 'Saint James',
        '13' => 'Saint Mary',
        '14' => 'Saint Thomas',
        '15' => 'Trelawny',
        '16' => 'Westmoreland',
        '17' => 'Kingston'
    },
    'JO' => {
        '02' => 'Al Balqa\'',
        '09' => 'Al Karak',
        '12' => 'At Tafilah',
        '15' => 'Al Mafraq',
        '16' => 'Amman',
        '17' => 'Az Zaraqa',
        '18' => 'Irbid',
        '19' => 'Ma\'an',
        '20' => 'Ajlun',
        '21' => 'Al Aqabah',
        '22' => 'Jarash',
        '23' => 'Madaba'
    },
    'JP' => {
        '01' => 'Aichi',
        '02' => 'Akita',
        '03' => 'Aomori',
        '04' => 'Chiba',
        '05' => 'Ehime',
        '06' => 'Fukui',
        '07' => 'Fukuoka',
        '08' => 'Fukushima',
        '09' => 'Gifu',
        '10' => 'Gumma',
        '11' => 'Hiroshima',
        '12' => 'Hokkaido',
        '13' => 'Hyogo',
        '14' => 'Ibaraki',
        '15' => 'Ishikawa',
        '16' => 'Iwate',
        '17' => 'Kagawa',
        '18' => 'Kagoshima',
        '19' => 'Kanagawa',
        '20' => 'Kochi',
        '21' => 'Kumamoto',
        '22' => 'Kyoto',
        '23' => 'Mie',
        '24' => 'Miyagi',
        '25' => 'Miyazaki',
        '26' => 'Nagano',
        '27' => 'Nagasaki',
        '28' => 'Nara',
        '29' => 'Niigata',
        '30' => 'Oita',
        '31' => 'Okayama',
        '32' => 'Osaka',
        '33' => 'Saga',
        '34' => 'Saitama',
        '35' => 'Shiga',
        '36' => 'Shimane',
        '37' => 'Shizuoka',
        '38' => 'Tochigi',
        '39' => 'Tokushima',
        '40' => 'Tokyo',
        '41' => 'Tottori',
        '42' => 'Toyama',
        '43' => 'Wakayama',
        '44' => 'Yamagata',
        '45' => 'Yamaguchi',
        '46' => 'Yamanashi',
        '47' => 'Okinawa'
    },
    'KE' => {
        '01' => 'Central',
        '02' => 'Coast',
        '03' => 'Eastern',
        '05' => 'Nairobi Area',
        '06' => 'North-Eastern',
        '07' => 'Nyanza',
        '08' => 'Rift Valley',
        '09' => 'Western'
    },
    'KG' => {
        '01' => 'Bishkek',
        '02' => 'Chuy',
        '03' => 'Jalal-Abad',
        '04' => 'Naryn',
        '05' => 'Osh',
        '06' => 'Talas',
        '07' => 'Ysyk-Kol',
        '08' => 'Osh',
        '09' => 'Batken'
    },
    'KH' => {
        '01' => 'Batdambang',
        '02' => 'Kampong Cham',
        '03' => 'Kampong Chhnang',
        '04' => 'Kampong Speu',
        '05' => 'Kampong Thum',
        '06' => 'Kampot',
        '07' => 'Kandal',
        '08' => 'Koh Kong',
        '09' => 'Kracheh',
        '10' => 'Mondulkiri',
        '11' => 'Phnum Penh',
        '12' => 'Pursat',
        '13' => 'Preah Vihear',
        '14' => 'Prey Veng',
        '15' => 'Ratanakiri Kiri',
        '16' => 'Siem Reap',
        '17' => 'Stung Treng',
        '18' => 'Svay Rieng',
        '19' => 'Takeo',
        '22' => 'Phnum Penh',
        '23' => 'Ratanakiri',
        '25' => 'Banteay Meanchey',
        '28' => 'Preah Seihanu',
        '29' => 'Batdambang',
        '30' => 'Pailin'
    },
    'KI' => {
        '01' => 'Gilbert Islands',
        '02' => 'Line Islands',
        '03' => 'Phoenix Islands'
    },
    'KM' => {
        '01' => 'Anjouan',
        '02' => 'Grande Comore',
        '03' => 'Moheli'
    },
    'KN' => {
        '01' => 'Christ Church Nichola Town',
        '02' => 'Saint Anne Sandy Point',
        '03' => 'Saint George Basseterre',
        '04' => 'Saint George Gingerland',
        '05' => 'Saint James Windward',
        '06' => 'Saint John Capisterre',
        '07' => 'Saint John Figtree',
        '08' => 'Saint Mary Cayon',
        '09' => 'Saint Paul Capisterre',
        '10' => 'Saint Paul Charlestown',
        '11' => 'Saint Peter Basseterre',
        '12' => 'Saint Thomas Lowland',
        '13' => 'Saint Thomas Middle Island',
        '15' => 'Trinity Palmetto Point'
    },
    'KP' => {
        '01' => 'Chagang-do',
        '03' => 'Hamgyong-namdo',
        '06' => 'Hwanghae-namdo',
        '07' => 'Hwanghae-bukto',
        '08' => 'Kaesong-si',
        '09' => 'Kangwon-do',
        '11' => 'P\'yongan-bukto',
        '12' => 'P\'yongyang-si',
        '13' => 'Yanggang-do',
        '14' => 'Namp\'o-si',
        '15' => 'P\'yongan-namdo',
        '17' => 'Hamgyong-bukto',
        '18' => 'Najin Sonbong-si'
    },
    'KR' => {
        '01' => 'Cheju-do',
        '03' => 'Cholla-bukto',
        '05' => 'Ch\'ungch\'ong-bukto',
        '06' => 'Kangwon-do',
        '10' => 'Pusan-jikhalsi',
        '11' => 'Seoul-t\'ukpyolsi',
        '12' => 'Inch\'on-jikhalsi',
        '13' => 'Kyonggi-do',
        '14' => 'Kyongsang-bukto',
        '15' => 'Taegu-jikhalsi',
        '16' => 'Cholla-namdo',
        '17' => 'Ch\'ungch\'ong-namdo',
        '18' => 'Kwangju-jikhalsi',
        '19' => 'Taejon-jikhalsi',
        '20' => 'Kyongsang-namdo',
        '21' => 'Ulsan-gwangyoksi'
    },
    'KW' => {
        '01' => 'Al Ahmadi',
        '02' => 'Al Kuwayt',
        '05' => 'Al Jahra',
        '07' => 'Al Farwaniyah',
        '08' => 'Hawalli',
        '09' => 'Mubarak al Kabir'
    },
    'KY' => {
        '01' => 'Creek',
        '02' => 'Eastern',
        '03' => 'Midland',
        '04' => 'South Town',
        '05' => 'Spot Bay',
        '06' => 'Stake Bay',
        '07' => 'West End',
        '08' => 'Western'
    },
    'KZ' => {
        '01' => 'Almaty',
        '02' => 'Almaty City',
        '03' => 'Aqmola',
        '04' => 'Aqtobe',
        '05' => 'Astana',
        '06' => 'Atyrau',
        '07' => 'West Kazakhstan',
        '08' => 'Bayqonyr',
        '09' => 'Mangghystau',
        '10' => 'South Kazakhstan',
        '11' => 'Pavlodar',
        '12' => 'Qaraghandy',
        '13' => 'Qostanay',
        '14' => 'Qyzylorda',
        '15' => 'East Kazakhstan',
        '16' => 'North Kazakhstan',
        '17' => 'Zhambyl'
    },
    'LA' => {
        '01' => 'Attapu',
        '02' => 'Champasak',
        '03' => 'Houaphan',
        '04' => 'Khammouan',
        '05' => 'Louang Namtha',
        '07' => 'Oudomxai',
        '08' => 'Phongsali',
        '09' => 'Saravan',
        '10' => 'Savannakhet',
        '11' => 'Vientiane',
        '13' => 'Xaignabouri',
        '14' => 'Xiangkhoang',
        '17' => 'Louangphrabang'
    },
    'LB' => {
        '01' => 'Beqaa',
        '02' => 'Al Janub',
        '03' => 'Liban-Nord',
        '04' => 'Beyrouth',
        '05' => 'Mont-Liban',
        '06' => 'Liban-Sud',
        '07' => 'Nabatiye',
        '08' => 'Beqaa',
        '09' => 'Liban-Nord',
        '10' => 'Aakk,r',
        '11' => 'Baalbek-Hermel'
    },
    'LC' => {
        '01' => 'Anse-la-Raye',
        '02' => 'Dauphin',
        '03' => 'Castries',
        '04' => 'Choiseul',
        '05' => 'Dennery',
        '06' => 'Gros-Islet',
        '07' => 'Laborie',
        '08' => 'Micoud',
        '09' => 'Soufriere',
        '10' => 'Vieux-Fort',
        '11' => 'Praslin'
    },
    'LI' => {
        '01' => 'Balzers',
        '02' => 'Eschen',
        '03' => 'Gamprin',
        '04' => 'Mauren',
        '05' => 'Planken',
        '06' => 'Ruggell',
        '07' => 'Schaan',
        '08' => 'Schellenberg',
        '09' => 'Triesen',
        '10' => 'Triesenberg',
        '11' => 'Vaduz',
        '21' => 'Gbarpolu',
        '22' => 'River Gee'
    },
    'LK' => {
        '29' => 'Central',
        '30' => 'North Central',
        '32' => 'North Western',
        '33' => 'Sabaragamuwa',
        '34' => 'Southern',
        '35' => 'Uva',
        '36' => 'Western',
        '37' => 'Eastern',
        '38' => 'Northern'
    },
    'LR' => {
        '01' => 'Bong',
        '04' => 'Grand Cape Mount',
        '05' => 'Lofa',
        '06' => 'Maryland',
        '07' => 'Monrovia',
        '09' => 'Nimba',
        '10' => 'Sino',
        '11' => 'Grand Bassa',
        '12' => 'Grand Cape Mount',
        '13' => 'Maryland',
        '14' => 'Montserrado',
        '17' => 'Margibi',
        '18' => 'River Cess',
        '19' => 'Grand Gedeh',
        '20' => 'Lofa',
        '21' => 'Gbarpolu',
        '22' => 'River Gee'
    },
    'LS' => {
        '10' => 'Berea',
        '11' => 'Butha-Buthe',
        '12' => 'Leribe',
        '13' => 'Mafeteng',
        '14' => 'Maseru',
        '15' => 'Mohales Hoek',
        '16' => 'Mokhotlong',
        '17' => 'Qachas Nek',
        '18' => 'Quthing',
        '19' => 'Thaba-Tseka'
    },
    'LT' => {
        '56' => 'Alytaus Apskritis',
        '57' => 'Kauno Apskritis',
        '58' => 'Klaipedos Apskritis',
        '59' => 'Marijampoles Apskritis',
        '60' => 'Panevezio Apskritis',
        '61' => 'Siauliu Apskritis',
        '62' => 'Taurages Apskritis',
        '63' => 'Telsiu Apskritis',
        '64' => 'Utenos Apskritis',
        '65' => 'Vilniaus Apskritis'
    },
    'LU' => {
        '01' => 'Diekirch',
        '02' => 'Grevenmacher',
        '03' => 'Luxembourg'
    },
    'LV' => {
        '01' => 'Aizkraukles',
        '02' => 'Aluksnes',
        '03' => 'Balvu',
        '04' => 'Bauskas',
        '05' => 'Cesu',
        '06' => 'Daugavpils',
        '07' => 'Daugavpils',
        '08' => 'Dobeles',
        '09' => 'Gulbenes',
        '10' => 'Jekabpils',
        '11' => 'Jelgava',
        '12' => 'Jelgavas',
        '13' => 'Jurmala',
        '14' => 'Kraslavas',
        '15' => 'Kuldigas',
        '16' => 'Liepaja',
        '17' => 'Liepajas',
        '18' => 'Limbazu',
        '19' => 'Ludzas',
        '20' => 'Madonas',
        '21' => 'Ogres',
        '22' => 'Preilu',
        '23' => 'Rezekne',
        '24' => 'Rezeknes',
        '25' => 'Riga',
        '26' => 'Rigas',
        '27' => 'Saldus',
        '28' => 'Talsu',
        '29' => 'Tukuma',
        '30' => 'Valkas',
        '31' => 'Valmieras',
        '32' => 'Ventspils',
        '33' => 'Ventspils'
    },
    'LY' => {
        '03' => 'Al Aziziyah',
        '05' => 'Al Jufrah',
        '08' => 'Al Kufrah',
        '13' => 'Ash Shati\'',
        '30' => 'Murzuq',
        '34' => 'Sabha',
        '41' => 'Tarhunah',
        '42' => 'Tubruq',
        '45' => 'Zlitan',
        '47' => 'Ajdabiya',
        '48' => 'Al Fatih',
        '49' => 'Al Jabal al Akhdar',
        '50' => 'Al Khums',
        '51' => 'An Nuqat al Khams',
        '52' => 'Awbari',
        '53' => 'Az Zawiyah',
        '54' => 'Banghazi',
        '55' => 'Darnah',
        '56' => 'Ghadamis',
        '57' => 'Gharyan',
        '58' => 'Misratah',
        '59' => 'Sawfajjin',
        '60' => 'Surt',
        '61' => 'Tarabulus',
        '62' => 'Yafran'
    },
    'MA' => {
        '45' => 'Grand Casablanca',
        '46' => 'Fes-Boulemane',
        '47' => 'Marrakech-Tensift-Al Haouz',
        '48' => 'Meknes-Tafilalet',
        '49' => 'Rabat-Sale-Zemmour-Zaer',
        '50' => 'Chaouia-Ouardigha',
        '51' => 'Doukkala-Abda',
        '52' => 'Gharb-Chrarda-Beni Hssen',
        '53' => 'Guelmim-Es Smara',
        '54' => 'Oriental',
        '55' => 'Souss-Massa-Dr,a',
        '56' => 'Tadla-Azilal',
        '57' => 'Tanger-Tetouan',
        '58' => 'Taza-Al Hoceima-Taounate',
        '59' => 'La,youne-Boujdour-Sakia El Hamra'
    },
    'MC' => {
        '01' => 'La Condamine',
        '02' => 'Monaco',
        '03' => 'Monte-Carlo'
    },
    'MD' => {
        '51' => 'Gagauzia',
        '57' => 'Chisinau',
        '58' => 'Stinga Nistrului',
        '59' => 'Anenii Noi',
        '60' => 'Balti',
        '61' => 'Basarabeasca',
        '62' => 'Bender',
        '63' => 'Briceni',
        '64' => 'Cahul',
        '65' => 'Cantemir',
        '66' => 'Calarasi',
        '67' => 'Causeni',
        '68' => 'Cimislia',
        '69' => 'Criuleni',
        '70' => 'Donduseni',
        '71' => 'Drochia',
        '72' => 'Dubasari',
        '73' => 'Edinet',
        '74' => 'Falesti',
        '75' => 'Floresti',
        '76' => 'Glodeni',
        '77' => 'Hincesti',
        '78' => 'Ialoveni',
        '79' => 'Leova',
        '80' => 'Nisporeni',
        '81' => 'Ocnita',
        '82' => 'Orhei',
        '83' => 'Rezina',
        '84' => 'Riscani',
        '85' => 'Singerei',
        '86' => 'Soldanesti',
        '87' => 'Soroca',
        '88' => 'Stefan-Voda',
        '89' => 'Straseni',
        '90' => 'Taraclia',
        '91' => 'Telenesti',
        '92' => 'Ungheni'
    },
    'MG' => {
        '01' => 'Antsiranana',
        '02' => 'Fianarantsoa',
        '03' => 'Mahajanga',
        '04' => 'Toamasina',
        '05' => 'Antananarivo',
        '06' => 'Toliara'
    },
    'MK' => {
        '01' => 'Aracinovo',
        '02' => 'Bac',
        '03' => 'Belcista',
        '04' => 'Berovo',
        '05' => 'Bistrica',
        '06' => 'Bitola',
        '07' => 'Blatec',
        '08' => 'Bogdanci',
        '09' => 'Bogomila',
        '10' => 'Bogovinje',
        '11' => 'Bosilovo',
        '12' => 'Brvenica',
        '13' => 'Cair',
        '14' => 'Capari',
        '15' => 'Caska',
        '16' => 'Cegrane',
        '17' => 'Centar',
        '18' => 'Centar Zupa',
        '19' => 'Cesinovo',
        '20' => 'Cucer-Sandevo',
        '21' => 'Debar',
        '22' => 'Delcevo',
        '23' => 'Delogozdi',
        '24' => 'Demir Hisar',
        '25' => 'Demir Kapija',
        '26' => 'Dobrusevo',
        '27' => 'Dolna Banjica',
        '28' => 'Dolneni',
        '29' => 'Dorce Petrov',
        '30' => 'Drugovo',
        '31' => 'Dzepciste',
        '32' => 'Gazi Baba',
        '33' => 'Gevgelija',
        '34' => 'Gostivar',
        '35' => 'Gradsko',
        '36' => 'Ilinden',
        '37' => 'Izvor',
        '38' => 'Jegunovce',
        '39' => 'Kamenjane',
        '40' => 'Karbinci',
        '41' => 'Karpos',
        '42' => 'Kavadarci',
        '43' => 'Kicevo',
        '44' => 'Kisela Voda',
        '45' => 'Klecevce',
        '46' => 'Kocani',
        '47' => 'Konce',
        '48' => 'Kondovo',
        '49' => 'Konopiste',
        '50' => 'Kosel',
        '51' => 'Kratovo',
        '52' => 'Kriva Palanka',
        '53' => 'Krivogastani',
        '54' => 'Krusevo',
        '55' => 'Kuklis',
        '56' => 'Kukurecani',
        '57' => 'Kumanovo',
        '58' => 'Labunista',
        '59' => 'Lipkovo',
        '60' => 'Lozovo',
        '61' => 'Lukovo',
        '62' => 'Makedonska Kamenica',
        '63' => 'Makedonski Brod',
        '64' => 'Mavrovi Anovi',
        '65' => 'Meseista',
        '66' => 'Miravci',
        '67' => 'Mogila',
        '68' => 'Murtino',
        '69' => 'Negotino',
        '70' => 'Negotino-Polosko',
        '71' => 'Novaci',
        '72' => 'Novo Selo',
        '73' => 'Oblesevo',
        '74' => 'Ohrid',
        '75' => 'Orasac',
        '76' => 'Orizari',
        '77' => 'Oslomej',
        '78' => 'Pehcevo',
        '79' => 'Petrovec',
        '80' => 'Plasnica',
        '81' => 'Podares',
        '82' => 'Prilep',
        '83' => 'Probistip',
        '84' => 'Radovis',
        '85' => 'Rankovce',
        '86' => 'Resen',
        '87' => 'Rosoman',
        '88' => 'Rostusa',
        '89' => 'Samokov',
        '90' => 'Saraj',
        '91' => 'Sipkovica',
        '92' => 'Sopiste',
        '93' => 'Sopotnica',
        '94' => 'Srbinovo',
        '95' => 'Staravina',
        '96' => 'Star Dojran',
        '97' => 'Staro Nagoricane',
        '98' => 'Stip',
        '99' => 'Struga',
        'A1' => 'Strumica',
        'A2' => 'Studenicani',
        'A3' => 'Suto Orizari',
        'A4' => 'Sveti Nikole',
        'A5' => 'Tearce',
        'A6' => 'Tetovo',
        'A7' => 'Topolcani',
        'A8' => 'Valandovo',
        'A9' => 'Vasilevo',
        'B1' => 'Veles',
        'B2' => 'Velesta',
        'B3' => 'Vevcani',
        'B4' => 'Vinica',
        'B5' => 'Vitoliste',
        'B6' => 'Vranestica',
        'B7' => 'Vrapciste',
        'B8' => 'Vratnica',
        'B9' => 'Vrutok',
        'C1' => 'Zajas',
        'C2' => 'Zelenikovo',
        'C3' => 'Zelino',
        'C4' => 'Zitose',
        'C5' => 'Zletovo',
        'C6' => 'Zrnovci',
        'C8' => 'Cair',
        'C9' => 'Caska',
        'D2' => 'Debar',
        'D3' => 'Demir Hisar',
        'D4' => 'Gostivar',
        'D5' => 'Jegunovce',
        'D6' => 'Kavadarci',
        'D7' => 'Kumanovo',
        'D8' => 'Makedonski Brod',
        'E2' => 'Ohrid',
        'E3' => 'Prilep',
        'E5' => 'Dojran',
        'E6' => 'Struga',
        'E7' => 'Strumica',
        'E8' => 'Tetovo',
        'E9' => 'Valandovo',
        'F1' => 'Veles',
        'F2' => 'Aerodrom'
    },
    'ML' => {
        '01' => 'Bamako',
        '03' => 'Kayes',
        '04' => 'Mopti',
        '05' => 'Segou',
        '06' => 'Sikasso',
        '07' => 'Koulikoro',
        '08' => 'Tombouctou',
        '09' => 'Gao',
        '10' => 'Kidal'
    },
    'MM' => {
        '01' => 'Rakhine State',
        '02' => 'Chin State',
        '03' => 'Irrawaddy',
        '04' => 'Kachin State',
        '05' => 'Karan State',
        '06' => 'Kayah State',
        '07' => 'Magwe',
        '08' => 'Mandalay',
        '09' => 'Pegu',
        '10' => 'Sagaing',
        '11' => 'Shan State',
        '12' => 'Tenasserim',
        '13' => 'Mon State',
        '14' => 'Rangoon',
        '17' => 'Yangon'
    },
    'MN' => {
        '01' => 'Arhangay',
        '02' => 'Bayanhongor',
        '03' => 'Bayan-Olgiy',
        '05' => 'Darhan',
        '06' => 'Dornod',
        '07' => 'Dornogovi',
        '08' => 'Dundgovi',
        '09' => 'Dzavhan',
        '10' => 'Govi-Altay',
        '11' => 'Hentiy',
        '12' => 'Hovd',
        '13' => 'Hovsgol',
        '14' => 'Omnogovi',
        '15' => 'Ovorhangay',
        '16' => 'Selenge',
        '17' => 'Suhbaatar',
        '18' => 'Tov',
        '19' => 'Uvs',
        '20' => 'Ulaanbaatar',
        '21' => 'Bulgan',
        '22' => 'Erdenet',
        '23' => 'Darhan-Uul',
        '24' => 'Govisumber',
        '25' => 'Orhon'
    },
    'MO' => {
        '01' => 'Ilhas',
        '02' => 'Macau'
    },
    'MR' => {
        '01' => 'Hodh Ech Chargui',
        '02' => 'Hodh El Gharbi',
        '03' => 'Assaba',
        '04' => 'Gorgol',
        '05' => 'Brakna',
        '06' => 'Trarza',
        '07' => 'Adrar',
        '08' => 'Dakhlet Nouadhibou',
        '09' => 'Tagant',
        '10' => 'Guidimaka',
        '11' => 'Tiris Zemmour',
        '12' => 'Inchiri'
    },
    'MS' => {
        '01' => 'Saint Anthony',
        '02' => 'Saint Georges',
        '03' => 'Saint Peter'
    },
    'MU' => {
        '12' => 'Black River',
        '13' => 'Flacq',
        '14' => 'Grand Port',
        '15' => 'Moka',
        '16' => 'Pamplemousses',
        '17' => 'Plaines Wilhems',
        '18' => 'Port Louis',
        '19' => 'Riviere du Rempart',
        '20' => 'Savanne',
        '21' => 'Agalega Islands',
        '22' => 'Cargados Carajos',
        '23' => 'Rodrigues'
    },
    'MV' => {
        '01' => 'Seenu',
        '05' => 'Laamu',
        '30' => 'Alifu',
        '31' => 'Baa',
        '32' => 'Dhaalu',
        '33' => 'Faafu ',
        '34' => 'Gaafu Alifu',
        '35' => 'Gaafu Dhaalu',
        '36' => 'Haa Alifu',
        '37' => 'Haa Dhaalu',
        '38' => 'Kaafu',
        '39' => 'Lhaviyani',
        '40' => 'Maale',
        '41' => 'Meemu',
        '42' => 'Gnaviyani',
        '43' => 'Noonu',
        '44' => 'Raa',
        '45' => 'Shaviyani',
        '46' => 'Thaa',
        '47' => 'Vaavu'
    },
    'MW' => {
        '02' => 'Chikwawa',
        '03' => 'Chiradzulu',
        '04' => 'Chitipa',
        '05' => 'Thyolo',
        '06' => 'Dedza',
        '07' => 'Dowa',
        '08' => 'Karonga',
        '09' => 'Kasungu',
        '11' => 'Lilongwe',
        '12' => 'Mangochi',
        '13' => 'Mchinji',
        '15' => 'Mzimba',
        '16' => 'Ntcheu',
        '17' => 'Nkhata Bay',
        '18' => 'Nkhotakota',
        '19' => 'Nsanje',
        '20' => 'Ntchisi',
        '21' => 'Rumphi',
        '22' => 'Salima',
        '23' => 'Zomba',
        '24' => 'Blantyre',
        '25' => 'Mwanza',
        '26' => 'Balaka',
        '27' => 'Likoma',
        '28' => 'Machinga',
        '29' => 'Mulanje',
        '30' => 'Phalombe'
    },
    'MX' => {
        '01' => 'Aguascalientes',
        '02' => 'Baja California',
        '03' => 'Baja California Sur',
        '04' => 'Campeche',
        '05' => 'Chiapas',
        '06' => 'Chihuahua',
        '07' => 'Coahuila de Zaragoza',
        '08' => 'Colima',
        '09' => 'Distrito Federal',
        '10' => 'Durango',
        '11' => 'Guanajuato',
        '12' => 'Guerrero',
        '13' => 'Hidalgo',
        '14' => 'Jalisco',
        '15' => 'Mexico',
        '16' => 'Michoacan de Ocampo',
        '17' => 'Morelos',
        '18' => 'Nayarit',
        '19' => 'Nuevo Leon',
        '20' => 'Oaxaca',
        '21' => 'Puebla',
        '22' => 'Queretaro de Arteaga',
        '23' => 'Quintana Roo',
        '24' => 'San Luis Potosi',
        '25' => 'Sinaloa',
        '26' => 'Sonora',
        '27' => 'Tabasco',
        '28' => 'Tamaulipas',
        '29' => 'Tlaxcala',
        '30' => 'Veracruz-Llave',
        '31' => 'Yucatan',
        '32' => 'Zacatecas'
    },
    'MY' => {
        '01' => 'Johor',
        '02' => 'Kedah',
        '03' => 'Kelantan',
        '04' => 'Melaka',
        '05' => 'Negeri Sembilan',
        '06' => 'Pahang',
        '07' => 'Perak',
        '08' => 'Perlis',
        '09' => 'Pulau Pinang',
        '11' => 'Sarawak',
        '12' => 'Selangor',
        '13' => 'Terengganu',
        '14' => 'Kuala Lumpur',
        '15' => 'Labuan',
        '16' => 'Sabah',
        '17' => 'Putrajaya'
    },
    'MZ' => {
        '01' => 'Cabo Delgado',
        '02' => 'Gaza',
        '03' => 'Inhambane',
        '04' => 'Maputo',
        '05' => 'Sofala',
        '06' => 'Nampula',
        '07' => 'Niassa',
        '08' => 'Tete',
        '09' => 'Zambezia',
        '10' => 'Manica',
        '11' => 'Maputo'
    },
    'NA' => {
        '01' => 'Bethanien',
        '02' => 'Caprivi Oos',
        '03' => 'Boesmanland',
        '04' => 'Gobabis',
        '05' => 'Grootfontein',
        '06' => 'Kaokoland',
        '07' => 'Karibib',
        '08' => 'Keetmanshoop',
        '09' => 'Luderitz',
        '10' => 'Maltahohe',
        '11' => 'Okahandja',
        '12' => 'Omaruru',
        '13' => 'Otjiwarongo',
        '14' => 'Outjo',
        '15' => 'Owambo',
        '16' => 'Rehoboth',
        '17' => 'Swakopmund',
        '18' => 'Tsumeb',
        '20' => 'Karasburg',
        '21' => 'Windhoek',
        '22' => 'Damaraland',
        '23' => 'Hereroland Oos',
        '24' => 'Hereroland Wes',
        '25' => 'Kavango',
        '26' => 'Mariental',
        '27' => 'Namaland',
        '28' => 'Caprivi',
        '29' => 'Erongo',
        '30' => 'Hardap',
        '31' => 'Karas',
        '32' => 'Kunene',
        '33' => 'Ohangwena',
        '34' => 'Okavango',
        '35' => 'Omaheke',
        '36' => 'Omusati',
        '37' => 'Oshana',
        '38' => 'Oshikoto',
        '39' => 'Otjozondjupa'
    },
    'NE' => {
        '01' => 'Agadez',
        '02' => 'Diffa',
        '03' => 'Dosso',
        '04' => 'Maradi',
        '05' => 'Niamey',
        '06' => 'Tahoua',
        '07' => 'Zinder',
        '08' => 'Niamey'
    },
    'NG' => {
        '05' => 'Lagos',
        '11' => 'Federal Capital Territory',
        '16' => 'Ogun',
        '21' => 'Akwa Ibom',
        '22' => 'Cross River',
        '23' => 'Kaduna',
        '24' => 'Katsina',
        '25' => 'Anambra',
        '26' => 'Benue',
        '27' => 'Borno',
        '28' => 'Imo',
        '29' => 'Kano',
        '30' => 'Kwara',
        '31' => 'Niger',
        '32' => 'Oyo',
        '35' => 'Adamawa',
        '36' => 'Delta',
        '37' => 'Edo',
        '39' => 'Jigawa',
        '40' => 'Kebbi',
        '41' => 'Kogi',
        '42' => 'Osun',
        '43' => 'Taraba',
        '44' => 'Yobe',
        '45' => 'Abia',
        '46' => 'Bauchi',
        '47' => 'Enugu',
        '48' => 'Ondo',
        '49' => 'Plateau',
        '50' => 'Rivers',
        '51' => 'Sokoto',
        '52' => 'Bayelsa',
        '53' => 'Ebonyi',
        '54' => 'Ekiti',
        '55' => 'Gombe',
        '56' => 'Nassarawa',
        '57' => 'Zamfara'
    },
    'NI' => {
        '01' => 'Boaco',
        '02' => 'Carazo',
        '03' => 'Chinandega',
        '04' => 'Chontales',
        '05' => 'Esteli',
        '06' => 'Granada',
        '07' => 'Jinotega',
        '08' => 'Leon',
        '09' => 'Madriz',
        '10' => 'Managua',
        '11' => 'Masaya',
        '12' => 'Matagalpa',
        '13' => 'Nueva Segovia',
        '14' => 'Rio San Juan',
        '15' => 'Rivas',
        '16' => 'Zelaya',
        '17' => 'Autonoma Atlantico Norte',
        '18' => 'Region Autonoma Atlantico Sur'
    },
    'NL' => {
        '01' => 'Drenthe',
        '02' => 'Friesland',
        '03' => 'Gelderland',
        '04' => 'Groningen',
        '05' => 'Limburg',
        '06' => 'Noord-Brabant',
        '07' => 'Noord-Holland',
        '09' => 'Utrecht',
        '10' => 'Zeeland',
        '11' => 'Zuid-Holland',
        '15' => 'Overijssel',
        '16' => 'Flevoland'
    },
    'NO' => {
        '01' => 'Akershus',
        '02' => 'Aust-Agder',
        '04' => 'Buskerud',
        '05' => 'Finnmark',
        '06' => 'Hedmark',
        '07' => 'Hordaland',
        '08' => 'More og Romsdal',
        '09' => 'Nordland',
        '10' => 'Nord-Trondelag',
        '11' => 'Oppland',
        '12' => 'Oslo',
        '13' => 'Ostfold',
        '14' => 'Rogaland',
        '15' => 'Sogn og Fjordane',
        '16' => 'Sor-Trondelag',
        '17' => 'Telemark',
        '18' => 'Troms',
        '19' => 'Vest-Agder',
        '20' => 'Vestfold'
    },
    'NP' => {
        '01' => 'Bagmati',
        '02' => 'Bheri',
        '03' => 'Dhawalagiri',
        '04' => 'Gandaki',
        '05' => 'Janakpur',
        '06' => 'Karnali',
        '07' => 'Kosi',
        '08' => 'Lumbini',
        '09' => 'Mahakali',
        '10' => 'Mechi',
        '11' => 'Narayani',
        '12' => 'Rapti',
        '13' => 'Sagarmatha',
        '14' => 'Seti'
    },
    'NR' => {
        '01' => 'Aiwo',
        '02' => 'Anabar',
        '03' => 'Anetan',
        '04' => 'Anibare',
        '05' => 'Baiti',
        '06' => 'Boe',
        '07' => 'Buada',
        '08' => 'Denigomodu',
        '09' => 'Ewa',
        '10' => 'Ijuw',
        '11' => 'Meneng',
        '12' => 'Nibok',
        '13' => 'Uaboe',
        '14' => 'Yaren'
    },
    'NZ' => {
        '10' => 'Chatham Islands',
        'E7' => 'Auckland',
        'E8' => 'Bay of Plenty',
        'E9' => 'Canterbury',
        'F1' => 'Gisborne',
        'F2' => 'Hawke\'s Bay',
        'F3' => 'Manawatu-Wanganui',
        'F4' => 'Marlborough',
        'F5' => 'Nelson',
        'F6' => 'Northland',
        'F7' => 'Otago',
        'F8' => 'Southland',
        'F9' => 'Taranaki',
        'G1' => 'Waikato',
        'G2' => 'Wellington',
        'G3' => 'West Coast'
    },
    'OM' => {
        '01' => 'Ad Dakhiliyah',
        '02' => 'Al Batinah',
        '03' => 'Al Wusta',
        '04' => 'Ash Sharqiyah',
        '05' => 'Az Zahirah',
        '06' => 'Masqat',
        '07' => 'Musandam',
        '08' => 'Zufar'
    },
    'PA' => {
        '01' => 'Bocas del Toro',
        '02' => 'Chiriqui',
        '03' => 'Cocle',
        '04' => 'Colon',
        '05' => 'Darien',
        '06' => 'Herrera',
        '07' => 'Los Santos',
        '08' => 'Panama',
        '09' => 'San Blas',
        '10' => 'Veraguas'
    },
    'PE' => {
        '01' => 'Amazonas',
        '02' => 'Ancash',
        '03' => 'Apurimac',
        '04' => 'Arequipa',
        '05' => 'Ayacucho',
        '06' => 'Cajamarca',
        '07' => 'Callao',
        '08' => 'Cusco',
        '09' => 'Huancavelica',
        '10' => 'Huanuco',
        '11' => 'Ica',
        '12' => 'Junin',
        '13' => 'La Libertad',
        '14' => 'Lambayeque',
        '15' => 'Lima',
        '16' => 'Loreto',
        '17' => 'Madre de Dios',
        '18' => 'Moquegua',
        '19' => 'Pasco',
        '20' => 'Piura',
        '21' => 'Puno',
        '22' => 'San Martin',
        '23' => 'Tacna',
        '24' => 'Tumbes',
        '25' => 'Ucayali'
    },
    'PG' => {
        '01' => 'Central',
        '02' => 'Gulf',
        '03' => 'Milne Bay',
        '04' => 'Northern',
        '05' => 'Southern Highlands',
        '06' => 'Western',
        '07' => 'North Solomons',
        '08' => 'Chimbu',
        '09' => 'Eastern Highlands',
        '10' => 'East New Britain',
        '11' => 'East Sepik',
        '12' => 'Madang',
        '13' => 'Manus',
        '14' => 'Morobe',
        '15' => 'New Ireland',
        '16' => 'Western Highlands',
        '17' => 'West New Britain',
        '18' => 'Sandaun',
        '19' => 'Enga',
        '20' => 'National Capital'
    },
    'PH' => {
        '01' => 'Abra',
        '02' => 'Agusan del Norte',
        '03' => 'Agusan del Sur',
        '04' => 'Aklan',
        '05' => 'Albay',
        '06' => 'Antique',
        '07' => 'Bataan',
        '08' => 'Batanes',
        '09' => 'Batangas',
        '10' => 'Benguet',
        '11' => 'Bohol',
        '12' => 'Bukidnon',
        '13' => 'Bulacan',
        '14' => 'Cagayan',
        '15' => 'Camarines Norte',
        '16' => 'Camarines Sur',
        '17' => 'Camiguin',
        '18' => 'Capiz',
        '19' => 'Catanduanes',
        '20' => 'Cavite',
        '21' => 'Cebu',
        '22' => 'Basilan',
        '23' => 'Eastern Samar',
        '24' => 'Davao',
        '25' => 'Davao del Sur',
        '26' => 'Davao Oriental',
        '27' => 'Ifugao',
        '28' => 'Ilocos Norte',
        '29' => 'Ilocos Sur',
        '30' => 'Iloilo',
        '31' => 'Isabela',
        '32' => 'Kalinga-Apayao',
        '33' => 'Laguna',
        '34' => 'Lanao del Norte',
        '35' => 'Lanao del Sur',
        '36' => 'La Union',
        '37' => 'Leyte',
        '38' => 'Marinduque',
        '39' => 'Masbate',
        '40' => 'Mindoro Occidental',
        '41' => 'Mindoro Oriental',
        '42' => 'Misamis Occidental',
        '43' => 'Misamis Oriental',
        '44' => 'Mountain',
        '45' => 'Negros Occidental',
        '46' => 'Negros Oriental',
        '47' => 'Nueva Ecija',
        '48' => 'Nueva Vizcaya',
        '49' => 'Palawan',
        '50' => 'Pampanga',
        '51' => 'Pangasinan',
        '53' => 'Rizal',
        '54' => 'Romblon',
        '55' => 'Samar',
        '56' => 'Maguindanao',
        '57' => 'North Cotabato',
        '58' => 'Sorsogon',
        '59' => 'Southern Leyte',
        '60' => 'Sulu',
        '61' => 'Surigao del Norte',
        '62' => 'Surigao del Sur',
        '63' => 'Tarlac',
        '64' => 'Zambales',
        '65' => 'Zamboanga del Norte',
        '66' => 'Zamboanga del Sur',
        '67' => 'Northern Samar',
        '68' => 'Quirino',
        '69' => 'Siquijor',
        '70' => 'South Cotabato',
        '71' => 'Sultan Kudarat',
        '72' => 'Tawitawi',
        'A1' => 'Angeles',
        'A2' => 'Bacolod',
        'A3' => 'Bago',
        'A4' => 'Baguio',
        'A5' => 'Bais',
        'A6' => 'Basilan City',
        'A7' => 'Batangas City',
        'A8' => 'Butuan',
        'A9' => 'Cabanatuan',
        'B1' => 'Cadiz',
        'B2' => 'Cagayan de Oro',
        'B3' => 'Calbayog',
        'B4' => 'Caloocan',
        'B5' => 'Canlaon',
        'B6' => 'Cavite City',
        'B7' => 'Cebu City',
        'B8' => 'Cotabato',
        'B9' => 'Dagupan',
        'C1' => 'Danao',
        'C2' => 'Dapitan',
        'C3' => 'Davao City',
        'C4' => 'Dipolog',
        'C5' => 'Dumaguete',
        'C6' => 'General Santos',
        'C7' => 'Gingoog',
        'C8' => 'Iligan',
        'C9' => 'Iloilo City',
        'D1' => 'Iriga',
        'D2' => 'La Carlota',
        'D3' => 'Laoag',
        'D4' => 'Lapu-Lapu',
        'D5' => 'Legaspi',
        'D6' => 'Lipa',
        'D7' => 'Lucena',
        'D8' => 'Mandaue',
        'D9' => 'Manila',
        'E1' => 'Marawi',
        'E2' => 'Naga',
        'E3' => 'Olongapo',
        'E4' => 'Ormoc',
        'E5' => 'Oroquieta',
        'E6' => 'Ozamis',
        'E7' => 'Pagadian',
        'E8' => 'Palayan',
        'E9' => 'Pasay',
        'F1' => 'Puerto Princesa',
        'F2' => 'Quezon City',
        'F3' => 'Roxas',
        'F4' => 'San Carlos',
        'F5' => 'San Carlos',
        'F6' => 'San Jose',
        'F7' => 'San Pablo',
        'F8' => 'Silay',
        'F9' => 'Surigao',
        'G1' => 'Tacloban',
        'G2' => 'Tagaytay',
        'G3' => 'Tagbilaran',
        'G4' => 'Tangub',
        'G5' => 'Toledo',
        'G6' => 'Trece Martires',
        'G7' => 'Zamboanga',
        'G8' => 'Aurora',
        'H2' => 'Quezon',
        'H3' => 'Negros Occidental',
        'H9' => 'Biliran',
        'I6' => 'Compostela Valley',
        'I7' => 'Davao del Norte',
        'J3' => 'Guimaras',
        'J4' => 'Himamaylan',
        'J7' => 'Kalinga',
        'K1' => 'Las Pinas',
        'K5' => 'Malabon',
        'K6' => 'Malaybalay',
        'L4' => 'Muntinlupa',
        'L5' => 'Navotas',
        'L7' => 'Paranaque',
        'L9' => 'Passi',
        'M5' => 'San Jose del Monte',
        'M6' => 'San Juan',
        'M8' => 'Santiago',
        'M9' => 'Sarangani',
        'N1' => 'Sipalay',
        'N3' => 'Surigao del Norte',
        'P1' => 'Zambales',
        'P2' => 'Zamboanga'
    },
    'PK' => {
        '01' => 'Federally Administered Tribal Areas',
        '02' => 'Balochistan',
        '03' => 'North-West Frontier',
        '04' => 'Punjab',
        '05' => 'Sindh',
        '06' => 'Azad Kashmir',
        '07' => 'Northern Areas',
        '08' => 'Islamabad'
    },
    'PL' => {
        '72' => 'Dolnoslaskie',
        '73' => 'Kujawsko-Pomorskie',
        '74' => 'Lodzkie',
        '75' => 'Lubelskie',
        '76' => 'Lubuskie',
        '77' => 'Malopolskie',
        '78' => 'Mazowieckie',
        '79' => 'Opolskie',
        '80' => 'Podkarpackie',
        '81' => 'Podlaskie',
        '82' => 'Pomorskie',
        '83' => 'Slaskie',
        '84' => 'Swietokrzyskie',
        '85' => 'Warminsko-Mazurskie',
        '86' => 'Wielkopolskie',
        '87' => 'Zachodniopomorskie'
    },
    'PS' => {
        'GZ' => 'Gaza',
        'WE' => 'West Bank'
    },
    'PT' => {
        '02' => 'Aveiro',
        '03' => 'Beja',
        '04' => 'Braga',
        '05' => 'Braganca',
        '06' => 'Castelo Branco',
        '07' => 'Coimbra',
        '08' => 'Evora',
        '09' => 'Faro',
        '10' => 'Madeira',
        '11' => 'Guarda',
        '13' => 'Leiria',
        '14' => 'Lisboa',
        '16' => 'Portalegre',
        '17' => 'Porto',
        '18' => 'Santarem',
        '19' => 'Setubal',
        '20' => 'Viana do Castelo',
        '21' => 'Vila Real',
        '22' => 'Viseu',
        '23' => 'Azores'
    },
    'PY' => {
        '01' => 'Alto Parana',
        '02' => 'Amambay',
        '04' => 'Caaguazu',
        '05' => 'Caazapa',
        '06' => 'Central',
        '07' => 'Concepcion',
        '08' => 'Cordillera',
        '10' => 'Guaira',
        '11' => 'Itapua',
        '12' => 'Misiones',
        '13' => 'Neembucu',
        '15' => 'Paraguari',
        '16' => 'Presidente Hayes',
        '17' => 'San Pedro',
        '19' => 'Canindeyu',
        '22' => 'Asuncion',
        '23' => 'Alto Paraguay',
        '24' => 'Boqueron'
    },
    'QA' => {
        '01' => 'Ad Dawhah',
        '02' => 'Al Ghuwariyah',
        '03' => 'Al Jumaliyah',
        '04' => 'Al Khawr',
        '05' => 'Al Wakrah Municipality',
        '06' => 'Ar Rayyan',
        '08' => 'Madinat ach Shamal',
        '09' => 'Umm Salal',
        '10' => 'Al Wakrah',
        '11' => 'Jariyan al Batnah',
        '12' => 'Umm Sa\'id'
    },
    'RO' => {
        '01' => 'Alba',
        '02' => 'Arad',
        '03' => 'Arges',
        '04' => 'Bacau',
        '05' => 'Bihor',
        '06' => 'Bistrita-Nasaud',
        '07' => 'Botosani',
        '08' => 'Braila',
        '09' => 'Brasov',
        '10' => 'Bucuresti',
        '11' => 'Buzau',
        '12' => 'Caras-Severin',
        '13' => 'Cluj',
        '14' => 'Constanta',
        '15' => 'Covasna',
        '16' => 'Dambovita',
        '17' => 'Dolj',
        '18' => 'Galati',
        '19' => 'Gorj',
        '20' => 'Harghita',
        '21' => 'Hunedoara',
        '22' => 'Ialomita',
        '23' => 'Iasi',
        '25' => 'Maramures',
        '26' => 'Mehedinti',
        '27' => 'Mures',
        '28' => 'Neamt',
        '29' => 'Olt',
        '30' => 'Prahova',
        '31' => 'Salaj',
        '32' => 'Satu Mare',
        '33' => 'Sibiu',
        '34' => 'Suceava',
        '35' => 'Teleorman',
        '36' => 'Timis',
        '37' => 'Tulcea',
        '38' => 'Vaslui',
        '39' => 'Valcea',
        '40' => 'Vrancea',
        '41' => 'Calarasi',
        '42' => 'Giurgiu',
        '43' => 'Ilfov'
    },
    'RS' => {
        '01' => 'Kosovo',
        '02' => 'Vojvodina'
    },
    'RU' => {
        '01' => 'Adygeya, Republic of',
        '02' => 'Aginsky Buryatsky AO',
        '03' => 'Gorno-Altay',
        '04' => 'Altaisky krai',
        '05' => 'Amur',
        '06' => 'Arkhangel\'sk',
        '07' => 'Astrakhan\'',
        '08' => 'Bashkortostan',
        '09' => 'Belgorod',
        '10' => 'Bryansk',
        '11' => 'Buryat',
        '12' => 'Chechnya',
        '13' => 'Chelyabinsk',
        '14' => 'Chita',
        '15' => 'Chukot',
        '16' => 'Chuvashia',
        '17' => 'Dagestan',
        '18' => 'Evenk',
        '19' => 'Ingush',
        '20' => 'Irkutsk',
        '21' => 'Ivanovo',
        '22' => 'Kabardin-Balkar',
        '23' => 'Kaliningrad',
        '24' => 'Kalmyk',
        '25' => 'Kaluga',
        '26' => 'Kamchatka',
        '27' => 'Karachay-Cherkess',
        '28' => 'Karelia',
        '29' => 'Kemerovo',
        '30' => 'Khabarovsk',
        '31' => 'Khakass',
        '32' => 'Khanty-Mansiy',
        '33' => 'Kirov',
        '34' => 'Komi',
        '36' => 'Koryak',
        '37' => 'Kostroma',
        '38' => 'Krasnodar',
        '39' => 'Krasnoyarsk',
        '40' => 'Kurgan',
        '41' => 'Kursk',
        '42' => 'Leningrad',
        '43' => 'Lipetsk',
        '44' => 'Magadan',
        '45' => 'Mariy-El',
        '46' => 'Mordovia',
        '47' => 'Moskva',
        '48' => 'Moscow City',
        '49' => 'Murmansk',
        '50' => 'Nenets',
        '51' => 'Nizhegorod',
        '52' => 'Novgorod',
        '53' => 'Novosibirsk',
        '54' => 'Omsk',
        '55' => 'Orenburg',
        '56' => 'Orel',
        '57' => 'Penza',
        '58' => 'Perm\'',
        '59' => 'Primor\'ye',
        '60' => 'Pskov',
        '61' => 'Rostov',
        '62' => 'Ryazan\'',
        '63' => 'Sakha',
        '64' => 'Sakhalin',
        '65' => 'Samara',
        '66' => 'Saint Petersburg City',
        '67' => 'Saratov',
        '68' => 'North Ossetia',
        '69' => 'Smolensk',
        '70' => 'Stavropol\'',
        '71' => 'Sverdlovsk',
        '72' => 'Tambovskaya oblast',
        '73' => 'Tatarstan',
        '74' => 'Taymyr',
        '75' => 'Tomsk',
        '76' => 'Tula',
        '77' => 'Tver\'',
        '78' => 'Tyumen\'',
        '79' => 'Tuva',
        '80' => 'Udmurt',
        '81' => 'Ul\'yanovsk',
        '83' => 'Vladimir',
        '84' => 'Volgograd',
        '85' => 'Vologda',
        '86' => 'Voronezh',
        '87' => 'Yamal-Nenets',
        '88' => 'Yaroslavl\'',
        '89' => 'Yevrey',
        '90' => 'Permskiy Kray',
        '91' => 'Krasnoyarskiy Kray',
        '92' => 'Kamchatskiy Kray',
        '93' => 'Zabaykal\'skiy Kray'
    },
    'RW' => {
        '01' => 'Butare',
        '06' => 'Gitarama',
        '07' => 'Kibungo',
        '09' => 'Kigali',
        '11' => 'Est',
        '12' => 'Kigali',
        '13' => 'Nord',
        '14' => 'Ouest',
        '15' => 'Sud'
    },
    'SA' => {
        '02' => 'Al Bahah',
        '05' => 'Al Madinah',
        '06' => 'Ash Sharqiyah',
        '08' => 'Al Qasim',
        '10' => 'Ar Riyad',
        '11' => 'Asir Province',
        '13' => 'Ha\'il',
        '14' => 'Makkah',
        '15' => 'Al Hudud ash Shamaliyah',
        '16' => 'Najran',
        '17' => 'Jizan',
        '19' => 'Tabuk',
        '20' => 'Al Jawf'
    },
    'SB' => {
        '03' => 'Malaita',
        '06' => 'Guadalcanal',
        '07' => 'Isabel',
        '08' => 'Makira',
        '09' => 'Temotu',
        '10' => 'Central',
        '11' => 'Western',
        '12' => 'Choiseul',
        '13' => 'Rennell and Bellona'
    },
    'SC' => {
        '01' => 'Anse aux Pins',
        '02' => 'Anse Boileau',
        '03' => 'Anse Etoile',
        '04' => 'Anse Louis',
        '05' => 'Anse Royale',
        '06' => 'Baie Lazare',
        '07' => 'Baie Sainte Anne',
        '08' => 'Beau Vallon',
        '09' => 'Bel Air',
        '10' => 'Bel Ombre',
        '11' => 'Cascade',
        '12' => 'Glacis',
        '13' => 'Grand\' Anse',
        '14' => 'Grand\' Anse',
        '15' => 'La Digue',
        '16' => 'La Riviere Anglaise',
        '17' => 'Mont Buxton',
        '18' => 'Mont Fleuri',
        '19' => 'Plaisance',
        '20' => 'Pointe La Rue',
        '21' => 'Port Glaud',
        '22' => 'Saint Louis',
        '23' => 'Takamaka'
    },
    'SD' => {
        '27' => 'Al Wusta',
        '28' => 'Al Istiwa\'iyah',
        '29' => 'Al Khartum',
        '30' => 'Ash Shamaliyah',
        '31' => 'Ash Sharqiyah',
        '32' => 'Bahr al Ghazal',
        '33' => 'Darfur',
        '34' => 'Kurdufan',
        '35' => 'Upper Nile',
        '40' => 'Al Wahadah State',
        '44' => 'Central Equatoria State',
        '49' => 'Southern Darfur',
        '50' => 'Southern Kordofan',
        '52' => 'Kassala',
        '53' => 'River Nile',
        '55' => 'Northern Darfur'
    },
    'SE' => {
        '02' => 'Blekinge Lan',
        '03' => 'Gavleborgs Lan',
        '05' => 'Gotlands Lan',
        '06' => 'Hallands Lan',
        '07' => 'Jamtlands Lan',
        '08' => 'Jonkopings Lan',
        '09' => 'Kalmar Lan',
        '10' => 'Dalarnas Lan',
        '12' => 'Kronobergs Lan',
        '14' => 'Norrbottens Lan',
        '15' => 'Orebro Lan',
        '16' => 'Ostergotlands Lan',
        '18' => 'Sodermanlands Lan',
        '21' => 'Uppsala Lan',
        '22' => 'Varmlands Lan',
        '23' => 'Vasterbottens Lan',
        '24' => 'Vasternorrlands Lan',
        '25' => 'Vastmanlands Lan',
        '26' => 'Stockholms Lan',
        '27' => 'Skane Lan',
        '28' => 'Vastra Gotaland'
    },
    'SH' => {
        '01' => 'Ascension',
        '02' => 'Saint Helena',
        '03' => 'Tristan da Cunha'
    },
    'SI' => {
        '01' => 'Ajdovscina Commune',
        '02' => 'Beltinci Commune',
        '03' => 'Bled Commune',
        '04' => 'Bohinj Commune',
        '05' => 'Borovnica Commune',
        '06' => 'Bovec Commune',
        '07' => 'Brda Commune',
        '08' => 'Brezice Commune',
        '09' => 'Brezovica Commune',
        '11' => 'Celje Commune',
        '12' => 'Cerklje na Gorenjskem Commune',
        '13' => 'Cerknica Commune',
        '14' => 'Cerkno Commune',
        '15' => 'Crensovci Commune',
        '16' => 'Crna na Koroskem Commune',
        '17' => 'Crnomelj Commune',
        '19' => 'Divaca Commune',
        '20' => 'Dobrepolje Commune',
        '22' => 'Dol pri Ljubljani Commune',
        '24' => 'Dornava Commune',
        '25' => 'Dravograd Commune',
        '26' => 'Duplek Commune',
        '27' => 'Gorenja vas-Poljane Commune',
        '28' => 'Gorisnica Commune',
        '29' => 'Gornja Radgona Commune',
        '30' => 'Gornji Grad Commune',
        '31' => 'Gornji Petrovci Commune',
        '32' => 'Grosuplje Commune',
        '34' => 'Hrastnik Commune',
        '35' => 'Hrpelje-Kozina Commune',
        '36' => 'Idrija Commune',
        '37' => 'Ig Commune',
        '38' => 'Ilirska Bistrica Commune',
        '39' => 'Ivancna Gorica Commune',
        '40' => 'Izola-Isola Commune',
        '42' => 'Jursinci Commune',
        '44' => 'Kanal Commune',
        '45' => 'Kidricevo Commune',
        '46' => 'Kobarid Commune',
        '47' => 'Kobilje Commune',
        '49' => 'Komen Commune',
        '50' => 'Koper-Capodistria Urban Commune',
        '51' => 'Kozje Commune',
        '52' => 'Kranj Commune',
        '53' => 'Kranjska Gora Commune',
        '54' => 'Krsko Commune',
        '55' => 'Kungota Commune',
        '57' => 'Lasko Commune',
        '61' => 'Ljubljana Urban Commune',
        '62' => 'Ljubno Commune',
        '64' => 'Logatec Commune',
        '66' => 'Loski Potok Commune',
        '68' => 'Lukovica Commune',
        '71' => 'Medvode Commune',
        '72' => 'Menges Commune',
        '73' => 'Metlika Commune',
        '74' => 'Mezica Commune',
        '76' => 'Mislinja Commune',
        '77' => 'Moravce Commune',
        '78' => 'Moravske Toplice Commune',
        '79' => 'Mozirje Commune',
        '80' => 'Murska Sobota Urban Commune',
        '81' => 'Muta Commune',
        '82' => 'Naklo Commune',
        '83' => 'Nazarje Commune',
        '84' => 'Nova Gorica Urban Commune',
        '86' => 'Odranci Commune',
        '87' => 'Ormoz Commune',
        '88' => 'Osilnica Commune',
        '89' => 'Pesnica Commune',
        '91' => 'Pivka Commune',
        '92' => 'Podcetrtek Commune',
        '94' => 'Postojna Commune',
        '97' => 'Puconci Commune',
        '98' => 'Race-Fram Commune',
        '99' => 'Radece Commune',
        'A1' => 'Radenci Commune',
        'A2' => 'Radlje ob Dravi Commune',
        'A3' => 'Radovljica Commune',
        'A6' => 'Rogasovci Commune',
        'A7' => 'Rogaska Slatina Commune',
        'A8' => 'Rogatec Commune',
        'B1' => 'Semic Commune',
        'B2' => 'Sencur Commune',
        'B3' => 'Sentilj Commune',
        'B4' => 'Sentjernej Commune',
        'B6' => 'Sevnica Commune',
        'B7' => 'Sezana Commune',
        'B8' => 'Skocjan Commune',
        'B9' => 'Skofja Loka Commune',
        'C1' => 'Skofljica Commune',
        'C2' => 'Slovenj Gradec Urban Commune',
        'C4' => 'Slovenske Konjice Commune',
        'C5' => 'Smarje pri Jelsah Commune',
        'C6' => 'Smartno ob Paki Commune',
        'C7' => 'Sostanj Commune',
        'C8' => 'Starse Commune',
        'C9' => 'Store Commune',
        'D1' => 'Sveti Jurij Commune',
        'D2' => 'Tolmin Commune',
        'D3' => 'Trbovlje Commune',
        'D4' => 'Trebnje Commune',
        'D5' => 'Trzic Commune',
        'D6' => 'Turnisce Commune',
        'D7' => 'Velenje Urban Commune',
        'D8' => 'Velike Lasce Commune',
        'E1' => 'Vipava Commune',
        'E2' => 'Vitanje Commune',
        'E3' => 'Vodice Commune',
        'E5' => 'Vrhnika Commune',
        'E6' => 'Vuzenica Commune',
        'E7' => 'Zagorje ob Savi Commune',
        'E9' => 'Zavrc Commune',
        'F1' => 'Zelezniki Commune',
        'F2' => 'Ziri Commune',
        'F3' => 'Zrece Commune',
        'F4' => 'Benedikt Commune',
        'F5' => 'Bistrica ob Sotli Commune',
        'F6' => 'Bloke Commune',
        'F7' => 'Braslovce Commune',
        'F8' => 'Cankova Commune',
        'F9' => 'Cerkvenjak Commune',
        'G1' => 'Destrnik Commune',
        'G2' => 'Dobje Commune',
        'G3' => 'Dobrna Commune',
        'G4' => 'Dobrova-Horjul-Polhov Gradec Commune',
        'G5' => 'Dobrovnik-Dobronak Commune',
        'G6' => 'Dolenjske Toplice Commune',
        'G7' => 'Domzale Commune',
        'G8' => 'Grad Commune',
        'G9' => 'Hajdina Commune',
        'H1' => 'Hoce-Slivnica Commune',
        'H2' => 'Hodos-Hodos Commune',
        'H3' => 'Horjul Commune',
        'H4' => 'Jesenice Commune',
        'H5' => 'Jezersko Commune',
        'H6' => 'Kamnik Commune',
        'H7' => 'Kocevje Commune',
        'H8' => 'Komenda Commune',
        'H9' => 'Kostel Commune',
        'I1' => 'Krizevci Commune',
        'I2' => 'Kuzma Commune',
        'I3' => 'Lenart Commune',
        'I4' => 'Lendava-Lendva Commune',
        'I5' => 'Litija Commune',
        'I6' => 'Ljutomer Commune',
        'I7' => 'Loska Dolina Commune',
        'I8' => 'Lovrenc na Pohorju Commune',
        'I9' => 'Luce Commune',
        'J1' => 'Majsperk Commune',
        'J2' => 'Maribor Commune',
        'J3' => 'Markovci Commune',
        'J4' => 'Miklavz na Dravskem polju Commune',
        'J5' => 'Miren-Kostanjevica Commune',
        'J6' => 'Mirna Pec Commune',
        'J7' => 'Novo mesto Urban Commune',
        'J8' => 'Oplotnica Commune',
        'J9' => 'Piran-Pirano Commune',
        'K1' => 'Podlehnik Commune',
        'K2' => 'Podvelka Commune',
        'K3' => 'Polzela Commune',
        'K4' => 'Prebold Commune',
        'K5' => 'Preddvor Commune',
        'K6' => 'Prevalje Commune',
        'K7' => 'Ptuj Urban Commune',
        'K8' => 'Ravne na Koroskem Commune',
        'K9' => 'Razkrizje Commune',
        'L1' => 'Ribnica Commune',
        'L2' => 'Ribnica na Pohorju Commune',
        'L3' => 'Ruse Commune',
        'L4' => 'Salovci Commune',
        'L5' => 'Selnica ob Dravi Commune',
        'L6' => 'Sempeter-Vrtojba Commune',
        'L7' => 'Sentjur pri Celju Commune',
        'L8' => 'Slovenska Bistrica Commune',
        'L9' => 'Smartno pri Litiji Commune',
        'M1' => 'Sodrazica Commune',
        'M2' => 'Solcava Commune',
        'M3' => 'Sveta Ana Commune',
        'M4' => 'Sveti Andraz v Slovenskih goricah Commune',
        'M5' => 'Tabor Commune',
        'M6' => 'Tisina Commune',
        'M7' => 'Trnovska vas Commune',
        'M8' => 'Trzin Commune',
        'M9' => 'Velika Polana Commune',
        'N1' => 'Verzej Commune',
        'N2' => 'Videm Commune',
        'N3' => 'Vojnik Commune',
        'N4' => 'Vransko Commune',
        'N5' => 'Zalec Commune',
        'N6' => 'Zetale Commune',
        'N7' => 'Zirovnica Commune',
        'N8' => 'Zuzemberk Commune',
        'N9' => 'Apace Commune',
        'O1' => 'Cirkulane Commune',
        'O2' => 'Gorje',
        'O3' => 'Kostanjevica na Krki',
        'O4' => 'Log-Dragomer',
        'O5' => 'Makole',
        'O6' => 'Mirna',
        'O7' => 'Mokronog-Trebelno',
        'O8' => 'Poljcane',
        'O9' => 'Recica ob Savinji',
        'P1' => 'Rence-Vogrsko',
        'P2' => 'Sentrupert',
        'P3' => 'Smarjesk Toplice',
        'P4' => 'Sredisce ob Dravi',
        'P5' => 'Straza',
        'P7' => 'Sveti Jurij v Slovenskih Goricah'
    },
    'SK' => {
        '01' => 'Banska Bystrica',
        '02' => 'Bratislava',
        '03' => 'Kosice',
        '04' => 'Nitra',
        '05' => 'Presov',
        '06' => 'Trencin',
        '07' => 'Trnava',
        '08' => 'Zilina'
    },
    'SL' => {
        '01' => 'Eastern',
        '02' => 'Northern',
        '03' => 'Southern',
        '04' => 'Western Area'
    },
    'SM' => {
        '01' => 'Acquaviva',
        '02' => 'Chiesanuova',
        '03' => 'Domagnano',
        '04' => 'Faetano',
        '05' => 'Fiorentino',
        '06' => 'Borgo Maggiore',
        '07' => 'San Marino',
        '08' => 'Monte Giardino',
        '09' => 'Serravalle'
    },
    'SN' => {
        '01' => 'Dakar',
        '03' => 'Diourbel',
        '05' => 'Tambacounda',
        '07' => 'Thies',
        '09' => 'Fatick',
        '10' => 'Kaolack',
        '11' => 'Kolda',
        '12' => 'Ziguinchor',
        '13' => 'Louga',
        '14' => 'Saint-Louis',
        '15' => 'Matam'
    },
    'SO' => {
        '01' => 'Bakool',
        '02' => 'Banaadir',
        '03' => 'Bari',
        '04' => 'Bay',
        '05' => 'Galguduud',
        '06' => 'Gedo',
        '07' => 'Hiiraan',
        '08' => 'Jubbada Dhexe',
        '09' => 'Jubbada Hoose',
        '10' => 'Mudug',
        '11' => 'Nugaal',
        '12' => 'Sanaag',
        '13' => 'Shabeellaha Dhexe',
        '14' => 'Shabeellaha Hoose',
        '16' => 'Woqooyi Galbeed',
        '18' => 'Nugaal',
        '19' => 'Togdheer',
        '20' => 'Woqooyi Galbeed',
        '21' => 'Awdal',
        '22' => 'Sool'
    },
    'SR' => {
        '10' => 'Brokopondo',
        '11' => 'Commewijne',
        '12' => 'Coronie',
        '13' => 'Marowijne',
        '14' => 'Nickerie',
        '15' => 'Para',
        '16' => 'Paramaribo',
        '17' => 'Saramacca',
        '18' => 'Sipaliwini',
        '19' => 'Wanica'
    },
    'SS' => {
        '01' => 'Central Equatoria',
        '02' => 'Eastern Equatoria',
        '03' => 'Jonglei',
        '04' => 'Lakes',
        '05' => 'Northern Bahr el Ghazal',
        '06' => 'Unity',
        '07' => 'Upper Nile',
        '08' => 'Warrap',
        '09' => 'Western Bahr el Ghazal',
        '10' => 'Western Equatoria'
    },
    'ST' => {
        '01' => 'Principe',
        '02' => 'Sao Tome'
    },
    'SV' => {
        '01' => 'Ahuachapan',
        '02' => 'Cabanas',
        '03' => 'Chalatenango',
        '04' => 'Cuscatlan',
        '05' => 'La Libertad',
        '06' => 'La Paz',
        '07' => 'La Union',
        '08' => 'Morazan',
        '09' => 'San Miguel',
        '10' => 'San Salvador',
        '11' => 'Santa Ana',
        '12' => 'San Vicente',
        '13' => 'Sonsonate',
        '14' => 'Usulutan'
    },
    'SY' => {
        '01' => 'Al Hasakah',
        '02' => 'Al Ladhiqiyah',
        '03' => 'Al Qunaytirah',
        '04' => 'Ar Raqqah',
        '05' => 'As Suwayda\'',
        '06' => 'Dar',
        '07' => 'Dayr az Zawr',
        '08' => 'Rif Dimashq',
        '09' => 'Halab',
        '10' => 'Hamah',
        '11' => 'Hims',
        '12' => 'Idlib',
        '13' => 'Dimashq',
        '14' => 'Tartus'
    },
    'SZ' => {
        '01' => 'Hhohho',
        '02' => 'Lubombo',
        '03' => 'Manzini',
        '04' => 'Shiselweni',
        '05' => 'Praslin'
    },
    'TD' => {
        '01' => 'Batha',
        '02' => 'Biltine',
        '03' => 'Borkou-Ennedi-Tibesti',
        '04' => 'Chari-Baguirmi',
        '05' => 'Guera',
        '06' => 'Kanem',
        '07' => 'Lac',
        '08' => 'Logone Occidental',
        '09' => 'Logone Oriental',
        '10' => 'Mayo-Kebbi',
        '11' => 'Moyen-Chari',
        '12' => 'Ouaddai',
        '13' => 'Salamat',
        '14' => 'Tandjile'
    },
    'TG' => {
        '22' => 'Centrale',
        '23' => 'Kara',
        '24' => 'Maritime',
        '25' => 'Plateaux',
        '26' => 'Savanes'
    },
    'TH' => {
        '01' => 'Mae Hong Son',
        '02' => 'Chiang Mai',
        '03' => 'Chiang Rai',
        '04' => 'Nan',
        '05' => 'Lamphun',
        '06' => 'Lampang',
        '07' => 'Phrae',
        '08' => 'Tak',
        '09' => 'Sukhothai',
        '10' => 'Uttaradit',
        '11' => 'Kamphaeng Phet',
        '12' => 'Phitsanulok',
        '13' => 'Phichit',
        '14' => 'Phetchabun',
        '15' => 'Uthai Thani',
        '16' => 'Nakhon Sawan',
        '17' => 'Nong Khai',
        '18' => 'Loei',
        '20' => 'Sakon Nakhon',
        '21' => 'Nakhon Phanom',
        '22' => 'Khon Kaen',
        '23' => 'Kalasin',
        '24' => 'Maha Sarakham',
        '25' => 'Roi Et',
        '26' => 'Chaiyaphum',
        '27' => 'Nakhon Ratchasima',
        '28' => 'Buriram',
        '29' => 'Surin',
        '30' => 'Sisaket',
        '31' => 'Narathiwat',
        '32' => 'Chai Nat',
        '33' => 'Sing Buri',
        '34' => 'Lop Buri',
        '35' => 'Ang Thong',
        '36' => 'Phra Nakhon Si Ayutthaya',
        '37' => 'Saraburi',
        '38' => 'Nonthaburi',
        '39' => 'Pathum Thani',
        '40' => 'Krung Thep',
        '41' => 'Phayao',
        '42' => 'Samut Prakan',
        '43' => 'Nakhon Nayok',
        '44' => 'Chachoengsao',
        '45' => 'Prachin Buri',
        '46' => 'Chon Buri',
        '47' => 'Rayong',
        '48' => 'Chanthaburi',
        '49' => 'Trat',
        '50' => 'Kanchanaburi',
        '51' => 'Suphan Buri',
        '52' => 'Ratchaburi',
        '53' => 'Nakhon Pathom',
        '54' => 'Samut Songkhram',
        '55' => 'Samut Sakhon',
        '56' => 'Phetchaburi',
        '57' => 'Prachuap Khiri Khan',
        '58' => 'Chumphon',
        '59' => 'Ranong',
        '60' => 'Surat Thani',
        '61' => 'Phangnga',
        '62' => 'Phuket',
        '63' => 'Krabi',
        '64' => 'Nakhon Si Thammarat',
        '65' => 'Trang',
        '66' => 'Phatthalung',
        '67' => 'Satun',
        '68' => 'Songkhla',
        '69' => 'Pattani',
        '70' => 'Yala',
        '71' => 'Ubon Ratchathani',
        '72' => 'Yasothon',
        '73' => 'Nakhon Phanom',
        '74' => 'Prachin Buri',
        '75' => 'Ubon Ratchathani',
        '76' => 'Udon Thani',
        '77' => 'Amnat Charoen',
        '78' => 'Mukdahan',
        '79' => 'Nong Bua Lamphu',
        '80' => 'Sa Kaeo',
        '81' => 'Bueng Kan'
    },
    'TJ' => {
        '01' => 'Kuhistoni Badakhshon',
        '02' => 'Khatlon',
        '03' => 'Sughd',
        '04' => 'Dushanbe',
        '05' => 'Nohiyahoi Tobei Jumhuri'
    },
    'TL' => { '06' => 'Dili' },
    'TM' => {
        '01' => 'Ahal',
        '02' => 'Balkan',
        '03' => 'Dashoguz',
        '04' => 'Lebap',
        '05' => 'Mary'
    },
    'TN' => {
        '02' => 'Kasserine',
        '03' => 'Kairouan',
        '06' => 'Jendouba',
        '10' => 'Qafsah',
        '14' => 'El Kef',
        '15' => 'Al Mahdia',
        '16' => 'Al Munastir',
        '17' => 'Bajah',
        '18' => 'Bizerte',
        '19' => 'Nabeul',
        '22' => 'Siliana',
        '23' => 'Sousse',
        '27' => 'Ben Arous',
        '28' => 'Madanin',
        '29' => 'Gabes',
        '31' => 'Kebili',
        '32' => 'Sfax',
        '33' => 'Sidi Bou Zid',
        '34' => 'Tataouine',
        '35' => 'Tozeur',
        '36' => 'Tunis',
        '37' => 'Zaghouan',
        '38' => 'Aiana',
        '39' => 'Manouba'
    },
    'TO' => {
        '01' => 'Ha',
        '02' => 'Tongatapu',
        '03' => 'Vava'
    },
    'TR' => {
        '02' => 'Adiyaman',
        '03' => 'Afyonkarahisar',
        '04' => 'Agri',
        '05' => 'Amasya',
        '07' => 'Antalya',
        '08' => 'Artvin',
        '09' => 'Aydin',
        '10' => 'Balikesir',
        '11' => 'Bilecik',
        '12' => 'Bingol',
        '13' => 'Bitlis',
        '14' => 'Bolu',
        '15' => 'Burdur',
        '16' => 'Bursa',
        '17' => 'Canakkale',
        '19' => 'Corum',
        '20' => 'Denizli',
        '21' => 'Diyarbakir',
        '22' => 'Edirne',
        '23' => 'Elazig',
        '24' => 'Erzincan',
        '25' => 'Erzurum',
        '26' => 'Eskisehir',
        '28' => 'Giresun',
        '31' => 'Hatay',
        '32' => 'Mersin',
        '33' => 'Isparta',
        '34' => 'Istanbul',
        '35' => 'Izmir',
        '37' => 'Kastamonu',
        '38' => 'Kayseri',
        '39' => 'Kirklareli',
        '40' => 'Kirsehir',
        '41' => 'Kocaeli',
        '43' => 'Kutahya',
        '44' => 'Malatya',
        '45' => 'Manisa',
        '46' => 'Kahramanmaras',
        '48' => 'Mugla',
        '49' => 'Mus',
        '50' => 'Nevsehir',
        '52' => 'Ordu',
        '53' => 'Rize',
        '54' => 'Sakarya',
        '55' => 'Samsun',
        '57' => 'Sinop',
        '58' => 'Sivas',
        '59' => 'Tekirdag',
        '60' => 'Tokat',
        '61' => 'Trabzon',
        '62' => 'Tunceli',
        '63' => 'Sanliurfa',
        '64' => 'Usak',
        '65' => 'Van',
        '66' => 'Yozgat',
        '68' => 'Ankara',
        '69' => 'Gumushane',
        '70' => 'Hakkari',
        '71' => 'Konya',
        '72' => 'Mardin',
        '73' => 'Nigde',
        '74' => 'Siirt',
        '75' => 'Aksaray',
        '76' => 'Batman',
        '77' => 'Bayburt',
        '78' => 'Karaman',
        '79' => 'Kirikkale',
        '80' => 'Sirnak',
        '81' => 'Adana',
        '82' => 'Cankiri',
        '83' => 'Gaziantep',
        '84' => 'Kars',
        '85' => 'Zonguldak',
        '86' => 'Ardahan',
        '87' => 'Bartin',
        '88' => 'Igdir',
        '89' => 'Karabuk',
        '90' => 'Kilis',
        '91' => 'Osmaniye',
        '92' => 'Yalova',
        '93' => 'Duzce'
    },
    'TT' => {
        '01' => 'Arima',
        '02' => 'Caroni',
        '03' => 'Mayaro',
        '04' => 'Nariva',
        '05' => 'Port-of-Spain',
        '06' => 'Saint Andrew',
        '07' => 'Saint David',
        '08' => 'Saint George',
        '09' => 'Saint Patrick',
        '10' => 'San Fernando',
        '11' => 'Tobago',
        '12' => 'Victoria'
    },
    'TW' => {
        '01' => 'Fu-chien',
        '02' => 'Kao-hsiung',
        '03' => 'T\'ai-pei',
        '04' => 'T\'ai-wan'
    },
    'TZ' => {
        '02' => 'Pwani',
        '03' => 'Dodoma',
        '04' => 'Iringa',
        '05' => 'Kigoma',
        '06' => 'Kilimanjaro',
        '07' => 'Lindi',
        '08' => 'Mara',
        '09' => 'Mbeya',
        '10' => 'Morogoro',
        '11' => 'Mtwara',
        '12' => 'Mwanza',
        '13' => 'Pemba North',
        '14' => 'Ruvuma',
        '15' => 'Shinyanga',
        '16' => 'Singida',
        '17' => 'Tabora',
        '18' => 'Tanga',
        '19' => 'Kagera',
        '20' => 'Pemba South',
        '21' => 'Zanzibar Central',
        '22' => 'Zanzibar North',
        '23' => 'Dar es Salaam',
        '24' => 'Rukwa',
        '25' => 'Zanzibar Urban',
        '26' => 'Arusha',
        '27' => 'Manyara'
    },
    'UA' => {
        '01' => 'Cherkas\'ka Oblast\'',
        '02' => 'Chernihivs\'ka Oblast\'',
        '03' => 'Chernivets\'ka Oblast\'',
        '04' => 'Dnipropetrovs\'ka Oblast\'',
        '05' => 'Donets\'ka Oblast\'',
        '06' => 'Ivano-Frankivs\'ka Oblast\'',
        '07' => 'Kharkivs\'ka Oblast\'',
        '08' => 'Khersons\'ka Oblast\'',
        '09' => 'Khmel\'nyts\'ka Oblast\'',
        '10' => 'Kirovohrads\'ka Oblast\'',
        '11' => 'Krym',
        '12' => 'Kyyiv',
        '13' => 'Kyyivs\'ka Oblast\'',
        '14' => 'Luhans\'ka Oblast\'',
        '15' => 'L\'vivs\'ka Oblast\'',
        '16' => 'Mykolayivs\'ka Oblast\'',
        '17' => 'Odes\'ka Oblast\'',
        '18' => 'Poltavs\'ka Oblast\'',
        '19' => 'Rivnens\'ka Oblast\'',
        '20' => 'Sevastopol\'',
        '21' => 'Sums\'ka Oblast\'',
        '22' => 'Ternopil\'s\'ka Oblast\'',
        '23' => 'Vinnyts\'ka Oblast\'',
        '24' => 'Volyns\'ka Oblast\'',
        '25' => 'Zakarpats\'ka Oblast\'',
        '26' => 'Zaporiz\'ka Oblast\'',
        '27' => 'Zhytomyrs\'ka Oblast\''
    },
    'UG' => {
        '26' => 'Apac',
        '28' => 'Bundibugyo',
        '29' => 'Bushenyi',
        '30' => 'Gulu',
        '31' => 'Hoima',
        '33' => 'Jinja',
        '36' => 'Kalangala',
        '37' => 'Kampala',
        '38' => 'Kamuli',
        '39' => 'Kapchorwa',
        '40' => 'Kasese',
        '41' => 'Kibale',
        '42' => 'Kiboga',
        '43' => 'Kisoro',
        '45' => 'Kotido',
        '46' => 'Kumi',
        '47' => 'Lira',
        '50' => 'Masindi',
        '52' => 'Mbarara',
        '56' => 'Mubende',
        '58' => 'Nebbi',
        '59' => 'Ntungamo',
        '60' => 'Pallisa',
        '61' => 'Rakai',
        '65' => 'Adjumani',
        '66' => 'Bugiri',
        '67' => 'Busia',
        '69' => 'Katakwi',
        '70' => 'Luwero',
        '71' => 'Masaka',
        '72' => 'Moyo',
        '73' => 'Nakasongola',
        '74' => 'Sembabule',
        '76' => 'Tororo',
        '77' => 'Arua',
        '78' => 'Iganga',
        '79' => 'Kabarole',
        '80' => 'Kaberamaido',
        '81' => 'Kamwenge',
        '82' => 'Kanungu',
        '83' => 'Kayunga',
        '84' => 'Kitgum',
        '85' => 'Kyenjojo',
        '86' => 'Mayuge',
        '87' => 'Mbale',
        '88' => 'Moroto',
        '89' => 'Mpigi',
        '90' => 'Mukono',
        '91' => 'Nakapiripirit',
        '92' => 'Pader',
        '93' => 'Rukungiri',
        '94' => 'Sironko',
        '95' => 'Soroti',
        '96' => 'Wakiso',
        '97' => 'Yumbe'
    },
    'US' => {
        'AA' => 'Armed Forces Americas',
        'AE' => 'Armed Forces Europe, Middle East, & Canada',
        'AK' => 'Alaska',
        'AL' => 'Alabama',
        'AP' => 'Armed Forces Pacific',
        'AR' => 'Arkansas',
        'AS' => 'American Samoa',
        'AZ' => 'Arizona',
        'CA' => 'California',
        'CO' => 'Colorado',
        'CT' => 'Connecticut',
        'DC' => 'District of Columbia',
        'DE' => 'Delaware',
        'FL' => 'Florida',
        'FM' => 'Federated States of Micronesia',
        'GA' => 'Georgia',
        'GU' => 'Guam',
        'HI' => 'Hawaii',
        'IA' => 'Iowa',
        'ID' => 'Idaho',
        'IL' => 'Illinois',
        'IN' => 'Indiana',
        'KS' => 'Kansas',
        'KY' => 'Kentucky',
        'LA' => 'Louisiana',
        'MA' => 'Massachusetts',
        'MD' => 'Maryland',
        'ME' => 'Maine',
        'MH' => 'Marshall Islands',
        'MI' => 'Michigan',
        'MN' => 'Minnesota',
        'MO' => 'Missouri',
        'MP' => 'Northern Mariana Islands',
        'MS' => 'Mississippi',
        'MT' => 'Montana',
        'NC' => 'North Carolina',
        'ND' => 'North Dakota',
        'NE' => 'Nebraska',
        'NH' => 'New Hampshire',
        'NJ' => 'New Jersey',
        'NM' => 'New Mexico',
        'NV' => 'Nevada',
        'NY' => 'New York',
        'OH' => 'Ohio',
        'OK' => 'Oklahoma',
        'OR' => 'Oregon',
        'PA' => 'Pennsylvania',
        'PW' => 'Palau',
        'RI' => 'Rhode Island',
        'SC' => 'South Carolina',
        'SD' => 'South Dakota',
        'TN' => 'Tennessee',
        'TX' => 'Texas',
        'UT' => 'Utah',
        'VA' => 'Virginia',
        'VI' => 'Virgin Islands',
        'VT' => 'Vermont',
        'WA' => 'Washington',
        'WI' => 'Wisconsin',
        'WV' => 'West Virginia',
        'WY' => 'Wyoming'
    },
    'UY' => {
        '01' => 'Artigas',
        '02' => 'Canelones',
        '03' => 'Cerro Largo',
        '04' => 'Colonia',
        '05' => 'Durazno',
        '06' => 'Flores',
        '07' => 'Florida',
        '08' => 'Lavalleja',
        '09' => 'Maldonado',
        '10' => 'Montevideo',
        '11' => 'Paysandu',
        '12' => 'Rio Negro',
        '13' => 'Rivera',
        '14' => 'Rocha',
        '15' => 'Salto',
        '16' => 'San Jose',
        '17' => 'Soriano',
        '18' => 'Tacuarembo',
        '19' => 'Treinta y Tres'
    },
    'UZ' => {
        '01' => 'Andijon',
        '02' => 'Bukhoro',
        '03' => 'Farghona',
        '04' => 'Jizzakh',
        '05' => 'Khorazm',
        '06' => 'Namangan',
        '07' => 'Nawoiy',
        '08' => 'Qashqadaryo',
        '09' => 'Qoraqalpoghiston',
        '10' => 'Samarqand',
        '11' => 'Sirdaryo',
        '12' => 'Surkhondaryo',
        '13' => 'Toshkent',
        '14' => 'Toshkent',
        '15' => 'Jizzax'
    },
    'VC' => {
        '01' => 'Charlotte',
        '02' => 'Saint Andrew',
        '03' => 'Saint David',
        '04' => 'Saint George',
        '05' => 'Saint Patrick',
        '06' => 'Grenadines'
    },
    'VE' => {
        '01' => 'Amazonas',
        '02' => 'Anzoategui',
        '03' => 'Apure',
        '04' => 'Aragua',
        '05' => 'Barinas',
        '06' => 'Bolivar',
        '07' => 'Carabobo',
        '08' => 'Cojedes',
        '09' => 'Delta Amacuro',
        '11' => 'Falcon',
        '12' => 'Guarico',
        '13' => 'Lara',
        '14' => 'Merida',
        '15' => 'Miranda',
        '16' => 'Monagas',
        '17' => 'Nueva Esparta',
        '18' => 'Portuguesa',
        '19' => 'Sucre',
        '20' => 'Tachira',
        '21' => 'Trujillo',
        '22' => 'Yaracuy',
        '23' => 'Zulia',
        '24' => 'Dependencias Federales',
        '25' => 'Distrito Federal',
        '26' => 'Vargas'
    },
    'VN' => {
        '01' => 'An Giang',
        '03' => 'Ben Tre',
        '05' => 'Cao Bang',
        '09' => 'Dong Thap',
        '13' => 'Hai Phong',
        '20' => 'Ho Chi Minh',
        '21' => 'Kien Giang',
        '23' => 'Lam Dong',
        '24' => 'Long An',
        '30' => 'Quang Ninh',
        '32' => 'Son La',
        '33' => 'Tay Ninh',
        '34' => 'Thanh Hoa',
        '35' => 'Thai Binh',
        '37' => 'Tien Giang',
        '39' => 'Lang Son',
        '43' => 'Dong Nai',
        '44' => 'Ha Noi',
        '45' => 'Ba Ria-Vung Tau',
        '46' => 'Binh Dinh',
        '47' => 'Binh Thuan',
        '49' => 'Gia Lai',
        '50' => 'Ha Giang',
        '52' => 'Ha Tinh',
        '53' => 'Hoa Binh',
        '54' => 'Khanh Hoa',
        '55' => 'Kon Tum',
        '58' => 'Nghe An',
        '59' => 'Ninh Binh',
        '60' => 'Ninh Thuan',
        '61' => 'Phu Yen',
        '62' => 'Quang Binh',
        '63' => 'Quang Ngai',
        '64' => 'Quang Tri',
        '65' => 'Soc Trang',
        '66' => 'Thua Thien-Hue',
        '67' => 'Tra Vinh',
        '68' => 'Tuyen Quang',
        '69' => 'Vinh Long',
        '70' => 'Yen Bai',
        '71' => 'Bac Giang',
        '72' => 'Bac Kan',
        '73' => 'Bac Lieu',
        '74' => 'Bac Ninh',
        '75' => 'Binh Duong',
        '76' => 'Binh Phuoc',
        '77' => 'Ca Mau',
        '78' => 'Da Nang',
        '79' => 'Hai Duong',
        '80' => 'Ha Nam',
        '81' => 'Hung Yen',
        '82' => 'Nam Dinh',
        '83' => 'Phu Tho',
        '84' => 'Quang Nam',
        '85' => 'Thai Nguyen',
        '86' => 'Vinh Phuc',
        '87' => 'Can Tho',
        '88' => 'Dac Lak',
        '89' => 'Lai Chau',
        '90' => 'Lao Cai',
        '91' => 'Dak Nong',
        '92' => 'Dien Bien',
        '93' => 'Hau Giang'
    },
    'VU' => {
        '05' => 'Ambrym',
        '06' => 'Aoba',
        '07' => 'Torba',
        '08' => 'Efate',
        '09' => 'Epi',
        '10' => 'Malakula',
        '11' => 'Paama',
        '12' => 'Pentecote',
        '13' => 'Sanma',
        '14' => 'Shepherd',
        '15' => 'Tafea',
        '16' => 'Malampa',
        '17' => 'Penama',
        '18' => 'Shefa'
    },
    'WS' => {
        '02' => 'Aiga-i-le-Tai',
        '03' => 'Atua',
        '04' => 'Fa',
        '05' => 'Gaga',
        '06' => 'Va',
        '07' => 'Gagaifomauga',
        '08' => 'Palauli',
        '09' => 'Satupa',
        '10' => 'Tuamasaga',
        '11' => 'Vaisigano'
    },
    'YE' => {
        '01' => 'Abyan',
        '02' => 'Adan',
        '03' => 'Al Mahrah',
        '04' => 'Hadramawt',
        '05' => 'Shabwah',
        '06' => 'Lahij',
        '07' => 'Al Bayda\'',
        '08' => 'Al Hudaydah',
        '09' => 'Al Jawf',
        '10' => 'Al Mahwit',
        '11' => 'Dhamar',
        '12' => 'Hajjah',
        '13' => 'Ibb',
        '14' => 'Ma\'rib',
        '15' => 'Sa\'dah',
        '16' => 'San\'a\'',
        '17' => 'Taizz',
        '18' => 'Ad Dali',
        '19' => 'Amran',
        '20' => 'Al Bayda\'',
        '21' => 'Al Jawf',
        '22' => 'Hajjah',
        '23' => 'Ibb',
        '24' => 'Lahij',
        '25' => 'Taizz'
    },
    'ZA' => {
        '01' => 'North-Western Province',
        '02' => 'KwaZulu-Natal',
        '03' => 'Free State',
        '05' => 'Eastern Cape',
        '06' => 'Gauteng',
        '07' => 'Mpumalanga',
        '08' => 'Northern Cape',
        '09' => 'Limpopo',
        '10' => 'North-West',
        '11' => 'Western Cape'
    },
    'ZM' => {
        '01' => 'Western',
        '02' => 'Central',
        '03' => 'Eastern',
        '04' => 'Luapula',
        '05' => 'Northern',
        '06' => 'North-Western',
        '07' => 'Southern',
        '08' => 'Copperbelt',
        '09' => 'Lusaka'
    },
    'ZW' => {
        '01' => 'Manicaland',
        '02' => 'Midlands',
        '03' => 'Mashonaland Central',
        '04' => 'Mashonaland East',
        '05' => 'Mashonaland West',
        '06' => 'Matabeleland North',
        '07' => 'Matabeleland South',
        '08' => 'Masvingo',
        '09' => 'Bulawayo',
        '10' => 'Harare'
    }
);

sub continent_code_by_country_code {
    my $id = $_id_by_code{ $_[1] } || 0;
    return $continents[$id];
}
sub time_zone { Geo::IP::Record->_time_zone( $_[1], $_[2] ) }

sub _get_region_name {
    my ( $ccode, $region ) = @_;
    return unless $region;
    return if $region eq '00';

    return $country_region_names{$ccode}->{$region}
        if exists $country_region_names{$ccode};
}

# --- unfortunately we do not know the path so we assume the
# default path /usr/local/share/GeoIP
# if thats not true, you can set $Geo::IP::PP_OPEN_TYPE_PATH
#
sub open_type {
    my ( $class, $type, $flags ) = @_;
    my %type_dat_name_mapper = (
        GEOIP_COUNTRY_EDITION()       => 'GeoIP',
        GEOIP_COUNTRY_EDITION_V6()    => 'GeoIPv6',
        GEOIP_REGION_EDITION_REV0()   => 'GeoIPRegion',
        GEOIP_REGION_EDITION_REV1()   => 'GeoIPRegion',
        GEOIP_CITY_EDITION_REV0()     => 'GeoIPCity',
        GEOIP_CITY_EDITION_REV1()     => 'GeoIPCity',
        GEOIP_CITY_EDITION_REV0_V6()  => 'GeoIPCityv6',
        GEOIP_CITY_EDITION_REV1_V6()  => 'GeoIPCityv6',
        GEOIP_ISP_EDITION()           => 'GeoIPISP',
        GEOIP_ORG_EDITION()           => 'GeoIPOrg',
        GEOIP_PROXY_EDITION()         => 'GeoIPProxy',
        GEOIP_ASNUM_EDITION()         => 'GeoIPASNum',
        GEOIP_ASNUM_EDITION_V6()      => 'GeoIPASNumv6',
        GEOIP_NETSPEED_EDITION()      => 'GeoIPNetSpeed',
        GEOIP_NETSPEED_EDITION_REV1() => 'GeoIPNetSpeed',
        GEOIP_DOMAIN_EDITION()        => 'GeoIPDomain',
    );

    # backward compatibility for 2003 databases.
    $type -= 105 if $type >= 106;

    my $name = $type_dat_name_mapper{$type};
    die("Invalid database type $type\n") unless $name;

    my $mkpath = sub { File::Spec->catfile( File::Spec->rootdir, @_ ) };

    my $path
        = defined $Geo::IP::PP_OPEN_TYPE_PATH
        ? $Geo::IP::PP_OPEN_TYPE_PATH
        : do {
        $^O eq 'NetWare'
            ? $mkpath->(qw/ etc GeoIP /)
            : do {
            $^O eq 'MSWin32'
                ? $mkpath->(qw/ GeoIP /)
                : $mkpath->(qw/ usr local share GeoIP /);
            }
        };

    my $filename = File::Spec->catfile( $path, $name . '.dat' );
    return $class->open( $filename, $flags );
}

sub open {
    die "Geo::IP::open() requires a path name"
        unless ( @_ > 1 and $_[1] );
    my ( $class, $db_file, $flags ) = @_;
    my $fh = FileHandle->new;
    my $gi;
    CORE::open $fh, "$db_file" or die "Error opening $db_file";
    binmode($fh);
    if ( $flags && ( $flags & ( GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE ) ) ) {
        my %self;
        if ( $flags & GEOIP_MMAP_CACHE ) {
            die "Sys::Mmap required for MMAP support"
                unless defined $Sys::Mmap::VERSION;
            mmap( $self{buf} = undef, 0, PROT_READ, MAP_PRIVATE, $fh )
                or die "mmap: $!";
        }
        else {
            local $/ = undef;
            $self{buf} = <$fh>;
        }
        $self{fh} = $fh;
        $gi = bless \%self, $class;
    }
    else {
        $gi = bless { fh => $fh }, $class;
    }
    $gi->_setup_segments();
    return $gi;
}

sub new {
    my ( $class, $db_file, $flags ) = @_;

    # this will be less messy once deprecated new( $path, [$flags] )
    # is no longer supported (that's what open() is for)
    my $def_db_file = '/usr/local/share/GeoIP/GeoIP.dat';
    if ( $^O eq 'NetWare' ) {
        $def_db_file = 'sys:/etc/GeoIP/GeoIP.dat';
    }
    elsif ( $^O eq 'MSWin32' ) {
        $def_db_file = 'c:/GeoIP/GeoIP.dat';
    }
    if ( !defined $db_file ) {

        # called as new()
        $db_file = $def_db_file;
    }
    elsif ( $db_file =~ /^\d+$/ ) {

        # called as new( $flags )
        $flags   = $db_file;
        $db_file = $def_db_file;
    }    # else called as new( $database_filename, [$flags] );

    $class->open( $db_file, $flags );
}

#this function setups the database segments
sub _setup_segments {
    my ($gi) = @_;
    my $a    = 0;
    my $i    = 0;
    my $j    = 0;
    my $delim;
    my $buf;

    $gi->{_charset}        = GEOIP_CHARSET_ISO_8859_1;
    $gi->{"databaseType"}  = GEOIP_COUNTRY_EDITION;
    $gi->{"record_length"} = STANDARD_RECORD_LENGTH;

    my $filepos = tell( $gi->{fh} );
    seek( $gi->{fh}, -3, 2 );
    for ( $i = 0 ; $i < STRUCTURE_INFO_MAX_SIZE ; $i++ ) {
        read( $gi->{fh}, $delim, 3 );

        #find the delim
        if ( $delim eq ( chr(255) . chr(255) . chr(255) ) ) {
            read( $gi->{fh}, $a, 1 );

            #read the databasetype
            my $database_type = ord($a);

            # backward compatibility for 2003 databases.
            $database_type -= 105 if $database_type >= 106;
            $gi->{"databaseType"} = $database_type;

            #chose the database segment for the database type
            #if database Type is GEOIP_REGION_EDITION then use database segment GEOIP_STATE_BEGIN
            if ( $gi->{"databaseType"} == GEOIP_REGION_EDITION_REV0 ) {
                $gi->{"databaseSegments"} = GEOIP_STATE_BEGIN_REV0;
            }
            elsif ( $gi->{"databaseType"} == GEOIP_REGION_EDITION_REV1 ) {
                $gi->{"databaseSegments"} = GEOIP_STATE_BEGIN_REV1;
            }

            #if database Type is GEOIP_CITY_EDITION, GEOIP_ISP_EDITION or GEOIP_ORG_EDITION then
            #read in the database segment
            elsif (( $gi->{"databaseType"} == GEOIP_CITY_EDITION_REV0 )
                || ( $gi->{"databaseType"} == GEOIP_CITY_EDITION_REV1 )
                || ( $gi->{"databaseType"} == GEOIP_CITY_EDITION_REV0_V6 )
                || ( $gi->{"databaseType"} == GEOIP_CITY_EDITION_REV1_V6 )
                || ( $gi->{"databaseType"} == GEOIP_ORG_EDITION )
                || ( $gi->{"databaseType"} == GEOIP_DOMAIN_EDITION )
                || ( $gi->{"databaseType"} == GEOIP_ASNUM_EDITION )
                || ( $gi->{"databaseType"} == GEOIP_ASNUM_EDITION_V6 )
                || ( $gi->{"databaseType"} == GEOIP_NETSPEED_EDITION_REV1 )
                || ( $gi->{"databaseType"} == GEOIP_ISP_EDITION ) ) {
                $gi->{"databaseSegments"} = 0;

                #read in the database segment for the database type
                read( $gi->{fh}, $buf, SEGMENT_RECORD_LENGTH );
                for ( $j = 0 ; $j < SEGMENT_RECORD_LENGTH ; $j++ ) {
                    $gi->{"databaseSegments"}
                        += ( ord( substr( $buf, $j, 1 ) ) << ( $j * 8 ) );
                }

                #record length is four for ISP databases and ORG databases
                #record length is three for country databases, region database and city databases
                if (   $gi->{"databaseType"} == GEOIP_ORG_EDITION
                    || $gi->{"databaseType"} == GEOIP_ISP_EDITION
                    || $gi->{"databaseType"} == GEOIP_DOMAIN_EDITION ) {
                    $gi->{"record_length"} = ORG_RECORD_LENGTH;
                }
            }
            last;
        }
        else {
            seek( $gi->{fh}, -4, 1 );
        }
    }

    #if database Type is GEOIP_COUNTY_EDITION then use database segment GEOIP_COUNTRY_BEGIN
    if (   $gi->{"databaseType"} == GEOIP_COUNTRY_EDITION
        || $gi->{"databaseType"} == GEOIP_COUNTRY_EDITION_V6
        || $gi->{"databaseType"} == GEOIP_NETSPEED_EDITION ) {
        $gi->{"databaseSegments"} = GEOIP_COUNTRY_BEGIN;
    }
    seek( $gi->{fh}, $filepos, 0 );
    return $gi;
}

sub _seek_country {
    my ( $gi, $ipnum ) = @_;

    my $fh     = $gi->{fh};
    my $offset = 0;

    my ( $x0, $x1 );

    my $reclen = $gi->{record_length};

    for ( my $depth = 31 ; $depth >= 0 ; $depth-- ) {
        unless ( exists $gi->{buf} ) {
            seek $fh, $offset * 2 * $reclen, 0;
            read $fh, $x0, $reclen;
            read $fh, $x1, $reclen;
        }
        else {
            $x0 = substr( $gi->{buf}, $offset * 2 * $reclen, $reclen );
            $x1 = substr( $gi->{buf}, $offset * 2 * $reclen + $reclen,
                $reclen );
        }

        $x0 = unpack( "V1", $x0 . "\0" );
        $x1 = unpack( "V1", $x1 . "\0" );

        if ( $ipnum & ( 1 << $depth ) ) {
            if ( $x1 >= $gi->{"databaseSegments"} ) {
                $gi->{last_netmask} = 32 - $depth;
                return $x1;
            }
            $offset = $x1;
        }
        else {
            if ( $x0 >= $gi->{"databaseSegments"} ) {
                $gi->{last_netmask} = 32 - $depth;
                return $x0;
            }
            $offset = $x0;
        }
    }

    print STDERR
        "Error Traversing Database for ipnum = $ipnum - Perhaps database is corrupt?";
}

sub charset {
    return $_[0]->{_charset};
}

sub set_charset {
    my ( $gi, $charset ) = @_;
    my $old_charset = $gi->{_charset};
    $gi->{_charset} = $charset;
    return $old_charset;
}

#this function returns the country code of ip address
sub country_code_by_addr {
    my ( $gi, $ip_address ) = @_;
    return unless $ip_address =~ m!^(?:\d{1,3}\.){3}\d{1,3}$!;
    return $countries[ $gi->id_by_addr($ip_address) ];
}

#this function returns the country code3 of ip address
sub country_code3_by_addr {
    my ( $gi, $ip_address ) = @_;
    return unless $ip_address =~ m!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$!;
    return $code3s[ $gi->id_by_addr($ip_address) ];
}

#this function returns the name of ip address
sub country_name_by_addr {
    my ( $gi, $ip_address ) = @_;
    return unless $ip_address =~ m!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$!;
    return $names[ $gi->id_by_addr($ip_address) ];
}

sub id_by_addr {
    my ( $gi, $ip_address ) = @_;
    return unless $ip_address =~ m!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$!;
    return $gi->_seek_country( addr_to_num($ip_address) )
        - GEOIP_COUNTRY_BEGIN;
}

#this function returns the country code of domain name
sub country_code_by_name {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name($host);
    return $countries[$country_id];
}

#this function returns the country code3 of domain name
sub country_code3_by_name {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name($host);
    return $code3s[$country_id];
}

#this function returns the country name of domain name
sub country_name_by_name {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name($host);
    return $names[$country_id];
}

sub id_by_name {
    my ( $gi, $host ) = @_;
    my $ip_address;
    if ( $host =~ m!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$! ) {
        $ip_address = $host;
    }
    else {
        $ip_address
            = join( '.', unpack( 'C4', ( gethostbyname($host) )[4] ) );
    }
    return unless $ip_address;
    return $gi->_seek_country( addr_to_num($ip_address) )
        - GEOIP_COUNTRY_BEGIN;
}

#this function returns the city record as a hash ref
sub get_city_record_as_hash {
    my ( $gi, $host ) = @_;
    my %gir;

    @gir{
        qw/ country_code   country_code3   country_name   region     city
            postal_code    latitude        longitude      dma_code   area_code
            continent_code region_name     metro_code /
    } = $gi->get_city_record($host);

    return
        defined( $gir{latitude} ) ? bless( \%gir, 'Geo::IP::Record' ) : undef;
}

*record_by_addr = \&get_city_record_as_hash;
*record_by_name = \&get_city_record_as_hash;

sub org_by_name {
    my ( $gi, $host ) = @_;
    return $gi->org_by_addr( $gi->get_ip_address($host) );
}

#this function returns isp or org of the domain name
sub org_by_addr {
    my ( $gi, $ip_address ) = @_;
    my $seek_org = $gi->_seek_country( addr_to_num($ip_address) );

    return $gi->_common_org($seek_org);
}

sub _common_org {
    my ($gi, $seek_org) = @_;

    my $char;
    my $org_buf;
    my $record_pointer;

    if ( $seek_org == $gi->{"databaseSegments"} ) {
        return undef;
    }

    $record_pointer = $seek_org
        + ( 2 * $gi->{"record_length"} - 1 ) * $gi->{"databaseSegments"};

    unless ( exists $gi->{buf} ) {
        seek( $gi->{"fh"}, $record_pointer, 0 );
        read( $gi->{"fh"}, $org_buf, MAX_ORG_RECORD_LENGTH );
    }
    else {
        $org_buf
            = substr( $gi->{buf}, $record_pointer, MAX_ORG_RECORD_LENGTH );
    }

    $org_buf = unpack 'Z*' => $org_buf;

    $org_buf = decode( 'iso-8859-1' => $org_buf )
        if $gi->charset == GEOIP_CHARSET_UTF8;

    return $org_buf;
}

#this function returns isp or org of the domain name
*isp_by_name  = \*org_by_name;
*isp_by_addr  = \*org_by_addr;
*name_by_addr = \*org_by_addr;
*name_by_name = \*org_by_name;

#this function returns the region
sub region_by_name {
    my ( $gi, $host ) = @_;
    my $ip_address = $gi->get_ip_address($host);
    return unless $ip_address;
    if ( $gi->{"databaseType"} == GEOIP_REGION_EDITION_REV0 ) {
        my $seek_region = $gi->_seek_country( addr_to_num($ip_address) )
            - GEOIP_STATE_BEGIN_REV0;
        if ( $seek_region >= 1000 ) {
            return (
                "US",
                chr( ( $seek_region - 1000 ) / 26 + 65 )
                    . chr( ( $seek_region - 1000 ) % 26 + 65 )
            );
        }
        else {
            return ( $countries[$seek_region], "" );
        }
    }
    elsif ( $gi->{"databaseType"} == GEOIP_REGION_EDITION_REV1 ) {
        my $seek_region = $gi->_seek_country( addr_to_num($ip_address) )
            - GEOIP_STATE_BEGIN_REV1;
        if ( $seek_region < US_OFFSET ) {
            return ( "", "" );
        }
        elsif ( $seek_region < CANADA_OFFSET ) {

            # return a us state
            return (
                "US",
                chr( ( $seek_region - US_OFFSET ) / 26 + 65 )
                    . chr( ( $seek_region - US_OFFSET ) % 26 + 65 )
            );
        }
        elsif ( $seek_region < WORLD_OFFSET ) {

            # return a canada province
            return (
                "CA",
                chr( ( $seek_region - CANADA_OFFSET ) / 26 + 65 )
                    . chr( ( $seek_region - CANADA_OFFSET ) % 26 + 65 )
            );
        }
        else {

            # return a country of the world
            my $c
                = $countries[ ( $seek_region - WORLD_OFFSET ) / FIPS_RANGE ];
            my $a2 = ( $seek_region - WORLD_OFFSET ) % FIPS_RANGE;

##      my $r =
##          chr( ( $a2 / 100 ) + 48 )
##        . chr( ( ( $a2 / 10 ) % 10 ) + 48 )
##        . chr( ( $a2 % 10 ) + 48 );
            return ( $c, $a2 ? sprintf( '%03d', $a2 ) : '00' );
        }
    }
}

*region_by_addr = \&region_by_name;

sub get_ip_address {
    my ( $gi, $host ) = @_;
    my $ip_address;

    #check if host is ip address
    if ( $host =~ m!^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$! ) {

        #host is ip address
        $ip_address = $host;
    }
    else {

        #host is domain name do a dns lookup
        $ip_address
            = join( '.', unpack( 'C4', ( gethostbyname($host) )[4] ) );
    }
    return $ip_address;
}

sub addr_to_num { unpack( N => pack( C4 => split( /\./, $_[0] ) ) ) }
sub num_to_addr { join q{.}, unpack( C4 => pack( N => $_[0] ) ) }

#sub addr_to_num {
#  my @a = split( '\.', $_[0] );
#  return $a[0] * 16777216 + $a[1] * 65536 + $a[2] * 256 + $a[3];
#}

sub database_edition {
    $_[0]->{databaseType};
}

sub database_info {
    my $gi = shift;
    my $i  = 0;
    my $buf;
    my $retval;
    my $hasStructureInfo = 0;
    seek( $gi->{fh}, -3, 2 );
    for ( my $i = 0 ; $i < STRUCTURE_INFO_MAX_SIZE ; $i++ ) {
        read( $gi->{fh}, $buf, 3 );
        if ( $buf eq ( chr(255) . chr(255) . chr(255) ) ) {
            $hasStructureInfo = 1;
            last;
        }
        seek( $gi->{fh}, -4, 1 );
    }
    if ( $hasStructureInfo == 1 ) {
        seek( $gi->{fh}, -6, 1 );
    }
    else {

        # no structure info, must be pre Sep 2002 database, go back to
        seek( $gi->{fh}, -3, 2 );
    }
    for ( my $i = 0 ; $i < DATABASE_INFO_MAX_SIZE ; $i++ ) {
        read( $gi->{fh}, $buf, 3 );
        if ( $buf eq ( chr(0) . chr(0) . chr(0) ) ) {
            read( $gi->{fh}, $retval, $i );
            return $retval;
        }
        seek( $gi->{fh}, -4, 1 );
    }
    return '';
}

sub range_by_ip {
    my $gi             = shift;
    my $ipnum          = addr_to_num(shift);
    my $c              = $gi->_seek_country($ipnum);
    my $nm             = $gi->last_netmask;
    my $m              = 0xffffffff << 32 - $nm;
    my $left_seek_num  = $ipnum & $m;
    my $right_seek_num = $left_seek_num + ( 0xffffffff & ~$m );

    while ( $left_seek_num != 0
        and $c == $gi->_seek_country( $left_seek_num - 1 ) ) {
        my $lm = 0xffffffff << 32 - $gi->last_netmask;
        $left_seek_num = ( $left_seek_num - 1 ) & $lm;
    }
    while ( $right_seek_num != 0xffffffff
        and $c == $gi->_seek_country( $right_seek_num + 1 ) ) {
        my $rm = 0xffffffff << 32 - $gi->last_netmask;
        $right_seek_num = ( $right_seek_num + 1 ) & $rm;
        $right_seek_num += ( 0xffffffff & ~$rm );
    }
    return ( num_to_addr($left_seek_num), num_to_addr($right_seek_num) );
}

sub netmask { $_[0]->{last_netmask} = $_[1] }

sub last_netmask {
    return $_[0]->{last_netmask};
}

sub get_city_record {
    my ( $gi, $host ) = @_;
    my $ip_address = $gi->get_ip_address($host);
    return unless $ip_address;

    #lookup the city
    my $seek = $gi->_seek_country( addr_to_num($ip_address) );
    return if ( $seek == $gi->{databaseSegments} );
    return _get_city_record_seek( $gi, $seek );
}

#this function returns the city record as a array
sub _get_city_record_seek {
    my ( $gi, $seek_position ) = @_;
    my $record_buf;
    my $record_buf_pos;
    my $char;
    my $metroarea_combo;
    my $record_country_code   = '';
    my $record_country_code3  = '';
    my $record_country_name   = '';
    my $record_region         = undef;
    my $record_city           = '';
    my $record_postal_code    = undef;
    my $record_latitude       = '';
    my $record_longitude      = '';
    my $record_metro_code     = 0;
    my $record_area_code      = 0;
    my $record_continent_code = '';
    my $record_region_name    = undef;
    my $str_length            = 0;
    my $i;
    my $j;

    #set the record pointer to location of the city record
    my $record_pointer = $seek_position
        + ( 2 * $gi->{record_length} - 1 ) * $gi->{databaseSegments};

    unless ( exists $gi->{buf} ) {
        seek( $gi->{fh}, $record_pointer, 0 );
        read( $gi->{fh}, $record_buf, FULL_RECORD_LENGTH );
        $record_buf_pos = 0;
    }
    else {
        $record_buf
            = substr( $gi->{buf}, $record_pointer, FULL_RECORD_LENGTH );
        $record_buf_pos = 0;
    }

    #get the country
    $char = ord( substr( $record_buf, $record_buf_pos, 1 ) );
    $record_country_code = $countries[$char];    #get the country code
    $record_country_code3
        = $code3s[$char];    #get the country code with 3 letters
    $record_country_name = $names[$char];    #get the country name
    $record_buf_pos++;

    # get the continent code
    $record_continent_code = $continents[$char];

    #get the region
    $char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    while ( $char != 0 ) {
        $str_length++;                       #get the length of string
        $char
            = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    }
    if ( $str_length > 0 ) {
        $record_region = substr( $record_buf, $record_buf_pos, $str_length );
    }
    $record_buf_pos += $str_length + 1;
    $str_length = 0;

    #get the city
    $char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    while ( $char != 0 ) {
        $str_length++;    #get the length of string
        $char
            = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    }
    if ( $str_length > 0 ) {
        $record_city = substr( $record_buf, $record_buf_pos, $str_length );
    }
    $record_buf_pos += $str_length + 1;
    $str_length = 0;

    #get the postal code
    $char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    while ( $char != 0 ) {
        $str_length++;    #get the length of string
        $char
            = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
    }
    if ( $str_length > 0 ) {
        $record_postal_code
            = substr( $record_buf, $record_buf_pos, $str_length );
    }
    $record_buf_pos += $str_length + 1;
    $str_length = 0;
    my $latitude  = 0;
    my $longitude = 0;

    #get the latitude
    for ( $j = 0 ; $j < 3 ; ++$j ) {
        $char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
        $latitude += ( $char << ( $j * 8 ) );
    }
    $record_latitude = ( $latitude / 10000 ) - 180;

    #get the longitude
    for ( $j = 0 ; $j < 3 ; ++$j ) {
        $char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
        $longitude += ( $char << ( $j * 8 ) );
    }
    $record_longitude = ( $longitude / 10000 ) - 180;

    #get the metro code and the area code
    if ( GEOIP_CITY_EDITION_REV1 == $gi->{databaseType} ) {
        $metroarea_combo = 0;
        if ( $record_country_code eq 'US' ) {

            #if the country is US then read the dma/metro area combo
            for ( $j = 0 ; $j < 3 ; ++$j ) {
                $char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
                $metroarea_combo += ( $char << ( $j * 8 ) );
            }

            #split the dma/metro area combo into the metro code and the area code
            $record_metro_code = int( $metroarea_combo / 1000 );
            $record_area_code  = $metroarea_combo % 1000;
        }
    }
    $record_region_name
        = _get_region_name( $record_country_code, $record_region );

    # the pureperl API must convert the string by themself to UTF8
    # using Encode for perl >= 5.008 otherwise use it's own iso-8859-1 to utf8 converter
    $record_city = decode( 'iso-8859-1' => $record_city )
        if $gi->charset == GEOIP_CHARSET_UTF8;

    return (
        $record_country_code, $record_country_code3,  $record_country_name,
        $record_region,       $record_city,           $record_postal_code,
        $record_latitude,     $record_longitude,      $record_metro_code,
        $record_area_code,    $record_continent_code, $record_region_name,
        $record_metro_code
    );
}

sub DESTROY {
    my $gi = shift;

    if (   exists $gi->{buf}
        && $gi->{flags}
        && ( $gi->{flags} & GEOIP_MMAP_CACHE ) ) {
        munmap( $gi->{buf} ) or die "munmap: $!";
        delete $gi->{buf};
    }
}

eval <<'__IPV6__' if $] >= 5.014;
use Socket qw/ getaddrinfo NI_NUMERICHOST SOCK_STREAM unpack_sockaddr_in6 / ;
my $AF_INET6 = eval { Socket::AF_INET6() };

sub id_by_addr_v6 {
    my ( $gi, $ip_address ) = @_;
    my $addr = $gi->get_ip_address_v6($ip_address);
    return unless $addr;
    return $gi->_seek_country_v6($addr) - GEOIP_COUNTRY_BEGIN;
}

sub _seek_country_v6 {
    my ( $gi, $ipnum ) = @_;

    my $fh     = $gi->{fh};
    my $offset = 0;

    my ( $x0, $x1 );

    my $reclen = $gi->{record_length};

    for my $depth ( 0 .. 127 ) {
        unless ( exists $gi->{buf} ) {
            seek $fh, $offset * 2 * $reclen, 0;
            read $fh, $x0, $reclen;
            read $fh, $x1, $reclen;
        }
        else {
            $x0 = substr( $gi->{buf}, $offset * 2 * $reclen, $reclen );
            $x1 = substr(
                $gi->{buf}, $offset * 2 * $reclen + $reclen,
                $reclen
            );
        }

        $x0 = unpack( "V1", $x0 . "\0" );
        $x1 = unpack( "V1", $x1 . "\0" );

        if ( vec( $ipnum, $depth ^ 7, 1 ) ) {
            if ( $x1 >= $gi->{databaseSegments} ) {
                $gi->{last_netmask} = 1 + $depth;
                return $x1;
            }
            $offset = $x1;
        }
        else {
            if ( $x0 >= $gi->{databaseSegments} ) {
                $gi->{last_netmask} = 1 + $depth;
                return $x0;
            }
            $offset = $x0;
        }
    }

    print STDERR
        "Error Traversing Database for ipnum = $ipnum - Perhaps database is corrupt?";
}

#this function returns the country code of ip address
sub country_code_by_addr_v6 {
    my ( $gi, $ip_address ) = @_;
    return $countries[ $gi->id_by_addr_v6($ip_address) ];
}

#this function returns the country code3 of ip address
sub country_code3_by_addr_v6 {
    my ( $gi, $ip_address ) = @_;
    return $code3s[ $gi->id_by_addr_v6($ip_address) ];
}

#this function returns the name of ip address
sub country_name_by_addr_v6 {
    my ( $gi, $ip_address ) = @_;
    return $names[ $gi->id_by_addr_v6($ip_address) ];
}

#this function returns the country code of domain name
sub country_code_by_name_v6 {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name_v6($host);
    return $countries[$country_id];
}

#this function returns the country code3 of domain name
sub country_code3_by_name_v6 {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name_v6($host);
    return $code3s[$country_id];
}

#this function returns the country name of domain name
sub country_name_by_name_v6 {
    my ( $gi, $host ) = @_;
    my $country_id = $gi->id_by_name_v6($host);
    return $names[$country_id];
}

sub id_by_name_v6 {
    my ( $gi, $host ) = @_;
    my $addr = $gi->get_ip_address_v6($host);
    return unless $addr;
    return $gi->_seek_country_v6($addr) - GEOIP_COUNTRY_BEGIN;
}

sub org_by_addr_v6 {
    my ( $gi, $ip_address ) = @_;

    my $addr = $gi->get_ip_address_v6($ip_address);
    return unless $addr;

    my $seek_org = $gi->_seek_country_v6($addr);
    return $gi->_common_org($seek_org);
}

*name_by_addr_v6 = \*org_by_addr_v6;
*name_by_name_v6 = \*org_by_addr_v6;
*org_by_name_v6 = \*org_by_addr_v6;

sub get_ip_address_v6 {
    my ( $gi, $host ) = @_;

    my $hints = { family => $AF_INET6, socktype => SOCK_STREAM, };
    $hints->{flags} = NI_NUMERICHOST if ( $host =~ /:/ );

    my ( $err, $data ) = getaddrinfo( $host, undef, $hints );
    return $err ? undef : ( unpack_sockaddr_in6( $data->{addr} ) )[1];
}

sub get_city_record_v6 {
    my ( $gi, $host ) = @_;
    my $ip_address = $gi->get_ip_address_v6($host);
    return unless $ip_address;

    #lookup the city
    my $seek = $gi->_seek_country_v6($ip_address);
    return if ( $seek == $gi->{databaseSegments} );
    return _get_city_record_seek( $gi, $seek );
}

#this function returns the city record as a hash ref
sub get_city_record_as_hash_v6 {
    my ( $gi, $host ) = @_;
    my %gir;

    @gir{
        qw/ country_code   country_code3   country_name   region     city
            postal_code    latitude        longitude      dma_code   area_code
            continent_code region_name     metro_code /
    } = $gi->get_city_record_v6($host);

    return
        defined( $gir{latitude} ) ? bless( \%gir, 'Geo::IP::Record' ) : undef;
}

*record_by_addr_v6 = \&get_city_record_as_hash_v6;
*record_by_name_v6 = \&get_city_record_as_hash_v6;
1;
__IPV6__

1;
#sub _XS
__PP_CODE__

print STDERR $@ if $@;
1;

# ABSTRACT: Look up location and network information by IP Address

__END__

=head1 SYNOPSIS

  use Geo::IP;
  my $gi = Geo::IP->new(GEOIP_MEMORY_CACHE);
  # look up IP address '24.24.24.24'
  # returns undef if country is unallocated, or not defined in our database
  my $country = $gi->country_code_by_addr('24.24.24.24');
  $country = $gi->country_code_by_name('yahoo.com');
  # $country is equal to "US"


  use Geo::IP;
  my $gi = Geo::IP->open("/usr/local/share/GeoIP/GeoIPCity.dat", GEOIP_STANDARD);
  my $record = $gi->record_by_addr('24.24.24.24');
  print $record->country_code,
        $record->country_code3,
        $record->country_name,
        $record->region,
        $record->region_name,
        $record->city,
        $record->postal_code,
        $record->latitude,
        $record->longitude,
        $record->time_zone,
        $record->area_code,
        $record->continent_code,
        $record->metro_code;


  # the IPv6 support is currently only avail if you use the CAPI which is much
  # faster anyway. ie: print Geo::IP->api equals to 'CAPI'
  use Socket;
  use Socket6;
  use Geo::IP;
  my $g = Geo::IP->open('/usr/local/share/GeoIP/GeoIPv6.dat') or die;
  print $g->country_code_by_ipnum_v6(inet_pton AF_INET6, '::24.24.24.24');
  print $g->country_code_by_addr_v6('2a02:e88::');

=head1 DESCRIPTION

This module uses the GeoIP Legacy file based database.  This database simply
contains IP blocks as keys, and countries as values. This database should be
more complete and accurate than reverse DNS lookups.

This module can be used to automatically select the geographically closest
mirror, to analyze your web server logs to determine the countries of your
visitors, for credit card fraud detection, and for software export controls.

=head1 IP GEOLOCATION USAGE

IP geolocation is inherently imprecise. Locations are often near the center of
the population. Any location provided by a GeoIP database or web service
should not be used to identify a particular address or household.

=head1 IP ADDRESS TO COUNTRY DATABASES

Free monthly updates to the database are available from

  http://dev.maxmind.com/geoip/geolite

This free database is similar to the database contained in IP::Country, as
well as many paid databases. It uses ARIN, RIPE, APNIC, and LACNIC whois to
obtain the IP->Country mappings.

If you require greater accuracy, MaxMind offers a database on a paid
subscription basis.  Also included with this is a service that updates your
database automatically each month, by running a program called geoipupdate
included with the C API from a cronjob.  For more details on the differences
between the free and paid databases, see:

http://www.maxmind.com/en/geolocation_landing

Do not miss the city database, described in Geo::IP::Record

Make sure to use the F<geolite-mirror-simple.pl> script from the example directory to
stay current with the databases.

=head1 BENCHMARK the lookups are fast. This is my laptop ( examples/benchmark.pl ):

  Benchmark: running city_mem, city_std, country_mem, country_std, country_v6_mem, country_v6_std, isp_mem, isp_std for at least 10 CPU seconds...
    city_mem: 10.3121 wallclock secs (10.30 usr +  0.01 sys = 10.31 CPU) @ 387271.48/s (n=3992769)
    city_std: 10.0658 wallclock secs ( 2.86 usr +  7.17 sys = 10.03 CPU) @ 54392.62/s (n=545558)
  country_mem: 10.1772 wallclock secs (10.16 usr +  0.00 sys = 10.16 CPU) @ 1077507.97/s (n=10947481)
  country_std: 10.1432 wallclock secs ( 2.30 usr +  7.85 sys = 10.15 CPU) @ 83629.56/s (n=848840)
  country_v6_mem: 10.2579 wallclock secs (10.25 usr + -0.00 sys = 10.25 CPU) @ 365997.37/s (n=3751473)
  country_v6_std: 10.8541 wallclock secs ( 1.77 usr +  9.07 sys = 10.84 CPU) @ 10110.42/s (n=109597)
     isp_mem: 10.147 wallclock secs (10.13 usr +  0.01 sys = 10.14 CPU) @ 590109.66/s (n=5983712)
     isp_std: 10.0484 wallclock secs ( 2.71 usr +  7.33 sys = 10.04 CPU) @ 73186.35/s (n=734791)


=head1 CLASS METHODS

=over 4

=item $gi = Geo::IP->new( $flags );

Constructs a new Geo::IP object with the default database located inside your system's
I<datadir>, typically I</usr/local/share/GeoIP/GeoIP.dat>.

Flags can be set to either GEOIP_STANDARD, or for faster performance (at a
cost of using more memory), GEOIP_MEMORY_CACHE. When using memory cache you
can force a reload if the file is updated by setting GEOIP_CHECK_CACHE.
GEOIP_INDEX_CACHE caches the most frequently accessed index portion of the
database, resulting in faster lookups than GEOIP_STANDARD, but less memory
usage than GEOIP_MEMORY_CACHE - useful for larger databases such as GeoIP
Legacy Organization and GeoIP City. Note, for GeoIP Country, Region and
Netspeed databases, GEOIP_INDEX_CACHE is equivalent to GEOIP_MEMORY_CACHE.

Prior to geoip-api version 1.6.3, the C API would leak diagnostic messages
onto stderr unconditionally. From Geo::IP v1.44 onwards, the flag
squelching this behavior (GEOIP_SILENCE) is implicitly added to the flags
passed in new(), open(), and open_type().

To combine flags, use the bitwise OR operator, |.  For example, to cache the
database in memory, but check for an updated GeoIP.dat file, use:
Geo::IP->new( GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE );

=item $gi = Geo::IP->open( $database_filename, $flags );

Constructs a new Geo::IP object with the database located at C<$database_filename>.

=item $gi = Geo::IP->open_type( $database_type, $flags );

Constructs a new Geo::IP object with the $database_type database located in
the standard location.  For example

  $gi = Geo::IP->open_type( GEOIP_CITY_EDITION_REV1 , GEOIP_STANDARD );

opens the database file in the standard location for GeoIP Legacy City,
typically I</usr/local/share/GeoIP/GeoIPCity.dat>.

=back

=head1 OBJECT METHODS

=over 4

=item $code = $gi->country_code_by_addr( $ipaddr );

Returns the ISO 3166 country code for an IP address.

=item $code = $gi->country_code_by_name( $hostname );

Returns the ISO 3166 country code for a hostname.

=item $code = $gi->country_code3_by_addr( $ipaddr );

Returns the 3 letter country code for an IP address.

=item $code = $gi->country_code3_by_name( $hostname );

Returns the 3 letter country code for a hostname.

=item $name = $gi->country_name_by_addr( $ipaddr );

Returns the full country name for an IP address.

=item $name = $gi->country_name_by_name( $hostname );

Returns the full country name for a hostname.

=item $r = $gi->record_by_addr( $ipaddr );

Returns a Geo::IP::Record object containing city location for an IP address.

=item $r = $gi->record_by_name( $hostname );

Returns a Geo::IP::Record object containing city location for a hostname.

=item $org = $gi->org_by_addr( $ipaddr ); B<deprecated> use C<name_by_addr> instead.

Returns the Organization, ISP name or Domain Name for an IP address.

=item $org = $gi->org_by_name( $hostname );  B<deprecated> use C<name_by_name> instead.

Returns the Organization, ISP name or Domain Name for a hostname.

=item $info = $gi->database_info;

Returns database string, includes version, date, build number and copyright notice.

=item $old_charset = $gi->set_charset( $charset );

Set the charset for the city name - defaults to GEOIP_CHARSET_ISO_8859_1.  To
set UTF8, pass GEOIP_CHARSET_UTF8 to set_charset.
For perl >= 5.008 the utf8 flag is honored.

=item $charset = $gi->charset;

Gets the currently used charset.

=item ( $country, $region ) = $gi->region_by_addr('24.24.24.24');

Returns a list containing country and region. If region and/or country is
unknown, undef is returned. Sure this works only for region databases.

=item ( $country, $region ) = $gi->region_by_name('www.xyz.com');

Returns a list containing country and region. If region and/or country is
unknown, undef is returned. Sure this works only for region databases.

=item $netmask = $gi->last_netmask;

Gets netmask of network block from last lookup.

=item $gi->netmask(12);

Sets netmask for the last lookup

=item my ( $from, $to ) = $gi->range_by_ip('24.24.24.24');

Returns the start and end of the current network block. The method tries to join several continuous netblocks.

=item $api = $gi->api or $api = Geo::IP->api

Returns the currently used API.

  # prints either CAPI or PurePerl
  print Geo::IP->api;

=item $continent = $gi->continent_code_by_country_code('US');

Returns the continent code by country code.

=item $dbe = $gi->database_edition

Returns the database_edition of the currently opened database.

  if ( $gi->database_edition == GEOIP_COUNTRY_EDITION ){
    ...
  }

=item $isp = $gi->isp_by_addr('24.24.24.24');

Returns the isp for 24.24.24.24

=item $isp = $gi->isp_by_name('www.maxmind.com');

Returns the isp for www.something.de

=item my $time_zone = $gi->time_zone('US', 'AZ');

Returns the time zone for country/region.

  # undef
  print  $gi->time_zone('US', '');

  # America/Phoenix
  print  $gi->time_zone('US', 'AZ');

  # Europe/Berlin
  print  $gi->time_zone('DE', '00');

  # Europe/Berlin
  print  $gi->time_zone('DE', '');

=item $id = $gi->id_by_addr('24.24.24.24');

Returns the country_id for 24.24.24.24. The country_id might be useful as array
index. 0 is unknown.

=item $id = $gi->id_by_name('www.maxmind.com');

Returns the country_id for www.maxmind.com. The country_id might be useful as array
index. 0 is unknown.

=item $cc = $gi->country_code3_by_addr_v6('::24.24.24.24');

=item $cc = $gi->country_code3_by_name_v6('ipv6.google.com');

=item $cc = $gi->country_code_by_addr_v6('2a02:ea0::');

=item $cc = $gi->country_code_by_ipnum_v6($ipnum);

  use Socket;
  use Socket6;
  use Geo::IP;
  my $g = Geo::IP->open('/usr/local/share/GeoIP/GeoIPv6.dat') or die;
  print $g->country_code_by_ipnum_v6(inet_pton AF_INET6, '::24.24.24.24');

=item $cc = $gi->country_code_by_name_v6('ipv6.google.com');

=item name_by_addr

Returns the Organization, ISP name or Domain Name for a IP address.

=item name_by_addr_v6

Returns the Organization, ISP name or Domain Name for an IPv6 address.

=item name_by_ipnum_v6

Returns the Organization, ISP name or Domain Name for an ipnum.

=item name_by_name

Returns the Organization, ISP name or Domain Name for a hostname.

=item name_by_name_v6

Returns the Organization, ISP name or Domain Name for a hostname.

=item org_by_addr_v6 B<deprecated> use C<name_by_addr_v6>

Returns the Organization, ISP name or Domain Name for an IPv6 address.

=item org_by_name_v6  B<deprecated> use C<name_by_name_v6>

Returns the Organization, ISP name or Domain Name for a hostname.

=item teredo

Returns the current setting for teredo.

=item enable_teredo

Enable / disable teredo

  $gi->enable_teredo(1); # enable
  $gi->enable_teredo(0); # disable

=item lib_version

  if ( $gi->api eq 'CAPI' ){
      print $gi->lib_version;
  }

=back

=head1 ISSUE TRACKER AND GIT repo

Is available from GitHub, see

https://github.com/maxmind/geoip-api-perl

=head1 SEE ALSO

L<GeoIP2> - database reader for the GeoIP2 format.

=cut


