UNPKG

tldts-icann

Version:

Library to work against complex domain names, subdomains and URIs. Only contains ICANN section.

566 lines (556 loc) 131 kB
'use strict'; /** * Check if `vhost` is a valid suffix of `hostname` (top-domain) * * It means that `vhost` needs to be a suffix of `hostname` and we then need to * make sure that: either they are equal, or the character preceding `vhost` in * `hostname` is a '.' (it should not be a partial label). * * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok */ function shareSameDomainSuffix(hostname, vhost) { if (hostname.endsWith(vhost)) { return (hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === '.'); } return false; } /** * Given a hostname and its public suffix, extract the general domain. */ function extractDomainWithSuffix(hostname, publicSuffix) { // Locate the index of the last '.' in the part of the `hostname` preceding // the public suffix. // // examples: // 1. not.evil.co.uk => evil.co.uk // ^ ^ // | | start of public suffix // | index of the last dot // // 2. example.co.uk => example.co.uk // ^ ^ // | | start of public suffix // | // | (-1) no dot found before the public suffix const publicSuffixIndex = hostname.length - publicSuffix.length - 2; const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); // No '.' found, then `hostname` is the general domain (no sub-domain) if (lastDotBeforeSuffixIndex === -1) { return hostname; } // Extract the part between the last '.' return hostname.slice(lastDotBeforeSuffixIndex + 1); } /** * Detects the domain based on rules and upon and a host string */ function getDomain$1(suffix, hostname, options) { // Check if `hostname` ends with a member of `validHosts`. if (options.validHosts !== null) { const validHosts = options.validHosts; for (const vhost of validHosts) { if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost)) { return vhost; } } } let numberOfLeadingDots = 0; if (hostname.startsWith('.')) { while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === '.') { numberOfLeadingDots += 1; } } // If `hostname` is a valid public suffix, then there is no domain to return. // Since we already know that `getPublicSuffix` returns a suffix of `hostname` // there is no need to perform a string comparison and we only compare the // size. if (suffix.length === hostname.length - numberOfLeadingDots) { return null; } // To extract the general domain, we start by identifying the public suffix // (if any), then consider the domain to be the public suffix with one added // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: // `co.uk`, then we take one more level: `evil`, giving the final result: // `evil.co.uk`). return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix); } /** * Return the part of domain without suffix. * * Example: for domain 'foo.com', the result would be 'foo'. */ function getDomainWithoutSuffix$1(domain, suffix) { // Note: here `domain` and `suffix` cannot have the same length because in // this case we set `domain` to `null` instead. It is thus safe to assume // that `suffix` is shorter than `domain`. return domain.slice(0, -suffix.length - 1); } /** * @param url - URL we want to extract a hostname from. * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. */ function extractHostname(url, urlIsValidHostname) { let start = 0; let end = url.length; let hasUpper = false; // If url is not already a valid hostname, then try to extract hostname. if (!urlIsValidHostname) { // Special handling of data URLs if (url.startsWith('data:')) { return null; } // Trim leading spaces while (start < url.length && url.charCodeAt(start) <= 32) { start += 1; } // Trim trailing spaces while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { end -= 1; } // Skip scheme. if (url.charCodeAt(start) === 47 /* '/' */ && url.charCodeAt(start + 1) === 47 /* '/' */) { start += 2; } else { const indexOfProtocol = url.indexOf(':/', start); if (indexOfProtocol !== -1) { // Implement fast-path for common protocols. We expect most protocols // should be one of these 4 and thus we will not need to perform the // more expansive validity check most of the time. const protocolSize = indexOfProtocol - start; const c0 = url.charCodeAt(start); const c1 = url.charCodeAt(start + 1); const c2 = url.charCodeAt(start + 2); const c3 = url.charCodeAt(start + 3); const c4 = url.charCodeAt(start + 4); if (protocolSize === 5 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */ && c4 === 115 /* 's' */) ; else if (protocolSize === 4 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */) ; else if (protocolSize === 3 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */ && c2 === 115 /* 's' */) ; else if (protocolSize === 2 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */) ; else { // Check that scheme is valid for (let i = start; i < indexOfProtocol; i += 1) { const lowerCaseCode = url.charCodeAt(i) | 32; if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] lowerCaseCode === 46 || // '.' lowerCaseCode === 45 || // '-' lowerCaseCode === 43) // '+' )) { return null; } } } // Skip 0, 1 or more '/' after ':/' start = indexOfProtocol + 2; while (url.charCodeAt(start) === 47 /* '/' */) { start += 1; } } } // Detect first occurrence of '/', '?' or '#'. We also keep track of the // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of // (respectively), identifier, ipv6 or port. let indexOfIdentifier = -1; let indexOfClosingBracket = -1; let indexOfPort = -1; for (let i = start; i < end; i += 1) { const code = url.charCodeAt(i); if (code === 35 || // '#' code === 47 || // '/' code === 63 // '?' ) { end = i; break; } else if (code === 64) { // '@' indexOfIdentifier = i; } else if (code === 93) { // ']' indexOfClosingBracket = i; } else if (code === 58) { // ':' indexOfPort = i; } else if (code >= 65 && code <= 90) { hasUpper = true; } } // Detect identifier: '@' if (indexOfIdentifier !== -1 && indexOfIdentifier > start && indexOfIdentifier < end) { start = indexOfIdentifier + 1; } // Handle ipv6 addresses if (url.charCodeAt(start) === 91 /* '[' */) { if (indexOfClosingBracket !== -1) { return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); } return null; } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { // Detect port: ':' end = indexOfPort; } } // Trim trailing dots while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { end -= 1; } const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; if (hasUpper) { return hostname.toLowerCase(); } return hostname; } /** * Check if a hostname is an IP. You should be aware that this only works * because `hostname` is already garanteed to be a valid hostname! */ function isProbablyIpv4(hostname) { // Cannot be shorted than 1.1.1.1 if (hostname.length < 7) { return false; } // Cannot be longer than: 255.255.255.255 if (hostname.length > 15) { return false; } let numberOfDots = 0; for (let i = 0; i < hostname.length; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { numberOfDots += 1; } else if (code < 48 /* '0' */ || code > 57 /* '9' */) { return false; } } return (numberOfDots === 3 && hostname.charCodeAt(0) !== 46 /* '.' */ && hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); } /** * Similar to isProbablyIpv4. */ function isProbablyIpv6(hostname) { if (hostname.length < 3) { return false; } let start = hostname.startsWith('[') ? 1 : 0; let end = hostname.length; if (hostname[end - 1] === ']') { end -= 1; } // We only consider the maximum size of a normal IPV6. Note that this will // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case // and a proper validation library should be used for these. if (end - start > 39) { return false; } let hasColon = false; for (; start < end; start += 1) { const code = hostname.charCodeAt(start); if (code === 58 /* ':' */) { hasColon = true; } else if (!(((code >= 48 && code <= 57) || // 0-9 (code >= 97 && code <= 102) || // a-f (code >= 65 && code <= 90)) // A-F )) { return false; } } return hasColon; } /** * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). * This *will not* work on any string. We need `hostname` to be a valid * hostname. */ function isIp(hostname) { return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); } /** * Implements fast shallow verification of hostnames. This does not perform a * struct check on the content of labels (classes of Unicode characters, etc.) * but instead check that the structure is valid (number of labels, length of * labels, etc.). * * If you need stricter validation, consider using an external library. */ function isValidAscii(code) { return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); } /** * Check if a hostname string is valid. It's usually a preliminary check before * trying to use getDomain or anything else. * * Beware: it does not check if the TLD exists. */ function isValidHostname (hostname) { if (hostname.length > 255) { return false; } if (hostname.length === 0) { return false; } if ( /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot) hostname.charCodeAt(0) !== 95 // '_' (underscore) ) { return false; } // Validate hostname according to RFC let lastDotIndex = -1; let lastCharCode = -1; const len = hostname.length; for (let i = 0; i < len; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { if ( // Check that previous label is < 63 bytes long (64 = 63 + '.') i - lastDotIndex > 64 || // Check that previous character was not already a '.' lastCharCode === 46 || // Check that the previous label does not end with a '-' (dash) lastCharCode === 45 || // Check that the previous label does not end with a '_' (underscore) lastCharCode === 95) { return false; } lastDotIndex = i; } else if (!( /*@__INLINE__*/(isValidAscii(code) || code === 45 || code === 95))) { // Check if there is a forbidden character in the label return false; } lastCharCode = code; } return ( // Check that last label is shorter than 63 chars len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character. // Since we already checked that the char is a valid hostname character, // we only need to check that it's different from '-'. lastCharCode !== 45); } function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { return { allowIcannDomains, allowPrivateDomains, detectIp, extractHostname, mixedInputs, validHosts, validateHostname, }; } const DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({}); function setDefaults(options) { if (options === undefined) { return DEFAULT_OPTIONS; } return /*@__INLINE__*/ setDefaultsImpl(options); } /** * Returns the subdomain of a hostname string */ function getSubdomain$1(hostname, domain) { // If `hostname` and `domain` are the same, then there is no sub-domain if (domain.length === hostname.length) { return ''; } return hostname.slice(0, -domain.length - 1); } /** * Implement a factory allowing to plug different implementations of suffix * lookup (e.g.: using a trie or the packed hashes datastructures). This is used * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. */ function getEmptyResult() { return { domain: null, domainWithoutSuffix: null, hostname: null, isIcann: null, isIp: null, isPrivate: null, publicSuffix: null, subdomain: null, }; } function resetResult(result) { result.domain = null; result.domainWithoutSuffix = null; result.hostname = null; result.isIcann = null; result.isIp = null; result.isPrivate = null; result.publicSuffix = null; result.subdomain = null; } function parseImpl(url, step, suffixLookup, partialOptions, result) { const options = /*@__INLINE__*/ setDefaults(partialOptions); // Very fast approximate check to make sure `url` is a string. This is needed // because the library will not necessarily be used in a typed setup and // values of arbitrary types might be given as argument. if (typeof url !== 'string') { return result; } // Extract hostname from `url` only if needed. This can be made optional // using `options.extractHostname`. This option will typically be used // whenever we are sure the inputs to `parse` are already hostnames and not // arbitrary URLs. // // `mixedInput` allows to specify if we expect a mix of URLs and hostnames // as input. If only hostnames are expected then `extractHostname` can be // set to `false` to speed-up parsing. If only URLs are expected then // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint // and will not change the behavior of the library. if (!options.extractHostname) { result.hostname = url; } else if (options.mixedInputs) { result.hostname = extractHostname(url, isValidHostname(url)); } else { result.hostname = extractHostname(url, false); } // Check if `hostname` is a valid ip address if (options.detectIp && result.hostname !== null) { result.isIp = isIp(result.hostname); if (result.isIp) { return result; } } // Perform hostname validation if enabled. If hostname is not valid, no need to // go further as there will be no valid domain or sub-domain. This validation // is applied before any early returns to ensure consistent behavior across // all API methods including getHostname(). if (options.validateHostname && options.extractHostname && result.hostname !== null && !isValidHostname(result.hostname)) { result.hostname = null; return result; } if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { return result; } // Extract public suffix suffixLookup(result.hostname, options, result); if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { return result; } // Extract domain result.domain = getDomain$1(result.publicSuffix, result.hostname, options); if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { return result; } // Extract subdomain result.subdomain = getSubdomain$1(result.hostname, result.domain); if (step === 4 /* FLAG.SUB_DOMAIN */) { return result; } // Extract domain without suffix result.domainWithoutSuffix = getDomainWithoutSuffix$1(result.domain, result.publicSuffix); return result; } function fastPathLookup (hostname, options, out) { // Fast path for very popular suffixes; this allows to by-pass lookup // completely as well as any extra allocation or string manipulation. if (!options.allowPrivateDomains && hostname.length > 3) { const last = hostname.length - 1; const c3 = hostname.charCodeAt(last); const c2 = hostname.charCodeAt(last - 1); const c1 = hostname.charCodeAt(last - 2); const c0 = hostname.charCodeAt(last - 3); if (c3 === 109 /* 'm' */ && c2 === 111 /* 'o' */ && c1 === 99 /* 'c' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'com'; return true; } else if (c3 === 103 /* 'g' */ && c2 === 114 /* 'r' */ && c1 === 111 /* 'o' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'org'; return true; } else if (c3 === 117 /* 'u' */ && c2 === 100 /* 'd' */ && c1 === 101 /* 'e' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'edu'; return true; } else if (c3 === 118 /* 'v' */ && c2 === 111 /* 'o' */ && c1 === 103 /* 'g' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'gov'; return true; } else if (c3 === 116 /* 't' */ && c2 === 101 /* 'e' */ && c1 === 110 /* 'n' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'net'; return true; } else if (c3 === 101 /* 'e' */ && c2 === 100 /* 'd' */ && c1 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'de'; return true; } } return false; } const exceptions = (function () { const _65 = [1, {}], _66 = [0, { "city": _65 }]; const exceptions = [0, { "ck": [0, { "www": _65 }], "jp": [0, { "kawasaki": _66, "kitakyushu": _66, "kobe": _66, "nagoya": _66, "sapporo": _66, "sendai": _66, "yokohama": _66 }] }]; return exceptions; })(); const rules = (function () { const _67 = [1, {}], _68 = [1, { "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67 }], _69 = [1, { "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], _70 = [1, { "gov": _67 }], _71 = [0, { "*": _67 }], _72 = [1, { "co": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], _73 = [1, { "com": _67, "edu": _67, "net": _67, "org": _67 }], _74 = [1, { "co": _67, "net": _67, "org": _67 }], _75 = [1, { "co": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "nom": _67, "org": _67 }], _76 = [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "net": _67, "org": _67 }], _77 = [1, { "gs": _67 }], _78 = [0, { "nes": _67 }], _79 = [1, { "k12": _67, "cc": _67, "lib": _67 }], _80 = [1, { "cc": _67 }], _81 = [1, { "cc": _67, "lib": _67 }]; const rules = [0, { "ac": _68, "ad": _67, "ae": [1, { "ac": _67, "co": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "sch": _67 }], "aero": [1, { "airline": _67, "airport": _67, "accident-investigation": _67, "accident-prevention": _67, "aerobatic": _67, "aeroclub": _67, "aerodrome": _67, "agents": _67, "air-surveillance": _67, "air-traffic-control": _67, "aircraft": _67, "airtraffic": _67, "ambulance": _67, "association": _67, "author": _67, "ballooning": _67, "broker": _67, "caa": _67, "cargo": _67, "catering": _67, "certification": _67, "championship": _67, "charter": _67, "civilaviation": _67, "club": _67, "conference": _67, "consultant": _67, "consulting": _67, "control": _67, "council": _67, "crew": _67, "design": _67, "dgca": _67, "educator": _67, "emergency": _67, "engine": _67, "engineer": _67, "entertainment": _67, "equipment": _67, "exchange": _67, "express": _67, "federation": _67, "flight": _67, "freight": _67, "fuel": _67, "gliding": _67, "government": _67, "groundhandling": _67, "group": _67, "hanggliding": _67, "homebuilt": _67, "insurance": _67, "journal": _67, "journalist": _67, "leasing": _67, "logistics": _67, "magazine": _67, "maintenance": _67, "marketplace": _67, "media": _67, "microlight": _67, "modelling": _67, "navigation": _67, "parachuting": _67, "paragliding": _67, "passenger-association": _67, "pilot": _67, "press": _67, "production": _67, "recreation": _67, "repbody": _67, "res": _67, "research": _67, "rotorcraft": _67, "safety": _67, "scientist": _67, "services": _67, "show": _67, "skydiving": _67, "software": _67, "student": _67, "taxi": _67, "trader": _67, "trading": _67, "trainer": _67, "union": _67, "workinggroup": _67, "works": _67 }], "af": _69, "ag": [1, { "co": _67, "com": _67, "net": _67, "nom": _67, "org": _67 }], "ai": [1, { "com": _67, "net": _67, "off": _67, "org": _67 }], "al": _68, "am": [1, { "co": _67, "com": _67, "commune": _67, "net": _67, "org": _67 }], "ao": [1, { "co": _67, "ed": _67, "edu": _67, "gov": _67, "gv": _67, "it": _67, "og": _67, "org": _67, "pb": _67 }], "aq": _67, "ar": [1, { "bet": _67, "com": _67, "coop": _67, "edu": _67, "gob": _67, "gov": _67, "int": _67, "mil": _67, "musica": _67, "mutual": _67, "net": _67, "org": _67, "seg": _67, "senasa": _67, "tur": _67 }], "arpa": [1, { "e164": _67, "home": _67, "in-addr": _67, "ip6": _67, "iris": _67, "uri": _67, "urn": _67 }], "as": _70, "asia": _67, "at": [1, { "ac": [1, { "sth": _67 }], "co": _67, "gv": _67, "or": _67 }], "au": [1, { "asn": _67, "com": _67, "edu": [1, { "act": _67, "catholic": _67, "nsw": [1, { "schools": _67 }], "nt": _67, "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "gov": [1, { "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "id": _67, "net": _67, "org": _67, "conf": _67, "oz": _67, "act": _67, "nsw": _67, "nt": _67, "qld": _67, "sa": _67, "tas": _67, "vic": _67, "wa": _67 }], "aw": [1, { "com": _67 }], "ax": _67, "az": [1, { "biz": _67, "co": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "int": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "pp": _67, "pro": _67 }], "ba": _68, "bb": [1, { "biz": _67, "co": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "net": _67, "org": _67, "store": _67, "tv": _67 }], "bd": _71, "be": [1, { "ac": _67 }], "bf": _70, "bg": [1, { "0": _67, "1": _67, "2": _67, "3": _67, "4": _67, "5": _67, "6": _67, "7": _67, "8": _67, "9": _67, "a": _67, "b": _67, "c": _67, "d": _67, "e": _67, "f": _67, "g": _67, "h": _67, "i": _67, "j": _67, "k": _67, "l": _67, "m": _67, "n": _67, "o": _67, "p": _67, "q": _67, "r": _67, "s": _67, "t": _67, "u": _67, "v": _67, "w": _67, "x": _67, "y": _67, "z": _67 }], "bh": _69, "bi": [1, { "co": _67, "com": _67, "edu": _67, "or": _67, "org": _67 }], "biz": _67, "bj": [1, { "africa": _67, "agro": _67, "architectes": _67, "assur": _67, "avocats": _67, "co": _67, "com": _67, "eco": _67, "econo": _67, "edu": _67, "info": _67, "loisirs": _67, "money": _67, "net": _67, "org": _67, "ote": _67, "restaurant": _67, "resto": _67, "tourism": _67, "univ": _67 }], "bm": _69, "bn": _69, "bo": [1, { "com": _67, "edu": _67, "gob": _67, "int": _67, "mil": _67, "net": _67, "org": _67, "tv": _67, "web": _67, "academia": _67, "agro": _67, "arte": _67, "blog": _67, "bolivia": _67, "ciencia": _67, "cooperativa": _67, "democracia": _67, "deporte": _67, "ecologia": _67, "economia": _67, "empresa": _67, "indigena": _67, "industria": _67, "info": _67, "medicina": _67, "movimiento": _67, "musica": _67, "natural": _67, "nombre": _67, "noticias": _67, "patria": _67, "plurinacional": _67, "politica": _67, "profesional": _67, "pueblo": _67, "revista": _67, "salud": _67, "tecnologia": _67, "tksat": _67, "transporte": _67, "wiki": _67 }], "br": [1, { "9guacu": _67, "abc": _67, "adm": _67, "adv": _67, "agr": _67, "aju": _67, "am": _67, "anani": _67, "aparecida": _67, "app": _67, "arq": _67, "art": _67, "ato": _67, "b": _67, "barueri": _67, "belem": _67, "bet": _67, "bhz": _67, "bib": _67, "bio": _67, "blog": _67, "bmd": _67, "boavista": _67, "bsb": _67, "campinagrande": _67, "campinas": _67, "caxias": _67, "cim": _67, "cng": _67, "cnt": _67, "com": _67, "contagem": _67, "coop": _67, "coz": _67, "cri": _67, "cuiaba": _67, "curitiba": _67, "def": _67, "des": _67, "det": _67, "dev": _67, "ecn": _67, "eco": _67, "edu": _67, "emp": _67, "enf": _67, "eng": _67, "esp": _67, "etc": _67, "eti": _67, "far": _67, "feira": _67, "flog": _67, "floripa": _67, "fm": _67, "fnd": _67, "fortal": _67, "fot": _67, "foz": _67, "fst": _67, "g12": _67, "geo": _67, "ggf": _67, "goiania": _67, "gov": [1, { "ac": _67, "al": _67, "am": _67, "ap": _67, "ba": _67, "ce": _67, "df": _67, "es": _67, "go": _67, "ma": _67, "mg": _67, "ms": _67, "mt": _67, "pa": _67, "pb": _67, "pe": _67, "pi": _67, "pr": _67, "rj": _67, "rn": _67, "ro": _67, "rr": _67, "rs": _67, "sc": _67, "se": _67, "sp": _67, "to": _67 }], "gru": _67, "imb": _67, "ind": _67, "inf": _67, "jab": _67, "jampa": _67, "jdf": _67, "joinville": _67, "jor": _67, "jus": _67, "leg": _67, "leilao": _67, "lel": _67, "log": _67, "londrina": _67, "macapa": _67, "maceio": _67, "manaus": _67, "maringa": _67, "mat": _67, "med": _67, "mil": _67, "morena": _67, "mp": _67, "mus": _67, "natal": _67, "net": _67, "niteroi": _67, "nom": _71, "not": _67, "ntr": _67, "odo": _67, "ong": _67, "org": _67, "osasco": _67, "palmas": _67, "poa": _67, "ppg": _67, "pro": _67, "psc": _67, "psi": _67, "pvh": _67, "qsl": _67, "radio": _67, "rec": _67, "recife": _67, "rep": _67, "ribeirao": _67, "rio": _67, "riobranco": _67, "riopreto": _67, "salvador": _67, "sampa": _67, "santamaria": _67, "santoandre": _67, "saobernardo": _67, "saogonca": _67, "seg": _67, "sjc": _67, "slg": _67, "slz": _67, "sorocaba": _67, "srv": _67, "taxi": _67, "tc": _67, "tec": _67, "teo": _67, "the": _67, "tmp": _67, "trd": _67, "tur": _67, "tv": _67, "udi": _67, "vet": _67, "vix": _67, "vlog": _67, "wiki": _67, "zlg": _67 }], "bs": _69, "bt": _69, "bv": _67, "bw": [1, { "ac": _67, "co": _67, "gov": _67, "net": _67, "org": _67 }], "by": [1, { "gov": _67, "mil": _67, "com": _67, "of": _67 }], "bz": _72, "ca": [1, { "ab": _67, "bc": _67, "mb": _67, "nb": _67, "nf": _67, "nl": _67, "ns": _67, "nt": _67, "nu": _67, "on": _67, "pe": _67, "qc": _67, "sk": _67, "yk": _67, "gc": _67 }], "cat": _67, "cc": _67, "cd": _70, "cf": _67, "cg": _67, "ch": _67, "ci": [1, { "ac": _67, "xn--aroport-bya": _67, "aéroport": _67, "asso": _67, "co": _67, "com": _67, "ed": _67, "edu": _67, "go": _67, "gouv": _67, "int": _67, "net": _67, "or": _67, "org": _67 }], "ck": _71, "cl": [1, { "co": _67, "gob": _67, "gov": _67, "mil": _67 }], "cm": [1, { "co": _67, "com": _67, "gov": _67, "net": _67 }], "cn": [1, { "ac": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "xn--55qx5d": _67, "公司": _67, "xn--od0alg": _67, "網絡": _67, "xn--io0a7i": _67, "网络": _67, "ah": _67, "bj": _67, "cq": _67, "fj": _67, "gd": _67, "gs": _67, "gx": _67, "gz": _67, "ha": _67, "hb": _67, "he": _67, "hi": _67, "hk": _67, "hl": _67, "hn": _67, "jl": _67, "js": _67, "jx": _67, "ln": _67, "mo": _67, "nm": _67, "nx": _67, "qh": _67, "sc": _67, "sd": _67, "sh": _67, "sn": _67, "sx": _67, "tj": _67, "tw": _67, "xj": _67, "xz": _67, "yn": _67, "zj": _67 }], "co": [1, { "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "nom": _67, "org": _67 }], "com": _67, "coop": _67, "cr": [1, { "ac": _67, "co": _67, "ed": _67, "fi": _67, "go": _67, "or": _67, "sa": _67 }], "cu": [1, { "com": _67, "edu": _67, "gob": _67, "inf": _67, "nat": _67, "net": _67, "org": _67 }], "cv": [1, { "com": _67, "edu": _67, "id": _67, "int": _67, "net": _67, "nome": _67, "org": _67, "publ": _67 }], "cw": _73, "cx": _70, "cy": [1, { "ac": _67, "biz": _67, "com": _67, "ekloges": _67, "gov": _67, "ltd": _67, "mil": _67, "net": _67, "org": _67, "press": _67, "pro": _67, "tm": _67 }], "cz": _67, "de": _67, "dj": _67, "dk": _67, "dm": _72, "do": [1, { "art": _67, "com": _67, "edu": _67, "gob": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "sld": _67, "web": _67 }], "dz": [1, { "art": _67, "asso": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67, "pol": _67, "soc": _67, "tm": _67 }], "ec": [1, { "abg": _67, "adm": _67, "agron": _67, "arqt": _67, "art": _67, "bar": _67, "chef": _67, "com": _67, "cont": _67, "cpa": _67, "cue": _67, "dent": _67, "dgn": _67, "disco": _67, "doc": _67, "edu": _67, "eng": _67, "esm": _67, "fin": _67, "fot": _67, "gal": _67, "gob": _67, "gov": _67, "gye": _67, "ibr": _67, "info": _67, "k12": _67, "lat": _67, "loj": _67, "med": _67, "mil": _67, "mktg": _67, "mon": _67, "net": _67, "ntr": _67, "odont": _67, "org": _67, "pro": _67, "prof": _67, "psic": _67, "psiq": _67, "pub": _67, "rio": _67, "rrpp": _67, "sal": _67, "tech": _67, "tul": _67, "tur": _67, "uio": _67, "vet": _67, "xxx": _67 }], "edu": _67, "ee": [1, { "aip": _67, "com": _67, "edu": _67, "fie": _67, "gov": _67, "lib": _67, "med": _67, "org": _67, "pri": _67, "riik": _67 }], "eg": [1, { "ac": _67, "com": _67, "edu": _67, "eun": _67, "gov": _67, "info": _67, "me": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "sci": _67, "sport": _67, "tv": _67 }], "er": _71, "es": [1, { "com": _67, "edu": _67, "gob": _67, "nom": _67, "org": _67 }], "et": [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "info": _67, "name": _67, "net": _67, "org": _67 }], "eu": _67, "fi": [1, { "aland": _67 }], "fj": [1, { "ac": _67, "biz": _67, "com": _67, "gov": _67, "info": _67, "mil": _67, "name": _67, "net": _67, "org": _67, "pro": _67 }], "fk": _71, "fm": _73, "fo": _67, "fr": [1, { "asso": _67, "com": _67, "gouv": _67, "nom": _67, "prd": _67, "tm": _67, "avoues": _67, "cci": _67, "greta": _67, "huissier-justice": _67 }], "ga": _67, "gb": _67, "gd": [1, { "edu": _67, "gov": _67 }], "ge": [1, { "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67, "pvt": _67, "school": _67 }], "gf": _67, "gg": _74, "gh": [1, { "biz": _67, "com": _67, "edu": _67, "gov": _67, "mil": _67, "net": _67, "org": _67 }], "gi": [1, { "com": _67, "edu": _67, "gov": _67, "ltd": _67, "mod": _67, "org": _67 }], "gl": [1, { "co": _67, "com": _67, "edu": _67, "net": _67, "org": _67 }], "gm": _67, "gn": [1, { "ac": _67, "com": _67, "edu": _67, "gov": _67, "net": _67, "org": _67 }], "gov": _67, "gp": [1, { "asso": _67, "com": _67, "edu": _67, "mobi": _67, "net": _67, "org": _67 }], "gq": _67, "gr": _69, "gs": _67, "gt": [1, { "com": _67, "edu": _67, "gob": _67, "ind": _67, "mil": _67, "net": _67, "org": _67 }], "gu": [1, { "com": _67, "edu": _67, "gov": _67, "guam": _67, "info": _67, "net": _67, "org": _67, "web": _67 }], "gw": _67, "gy": _72, "hk": [1, { "com": _67, "edu": _67, "gov": _67, "idv": _67, "net": _67, "org": _67, "xn--ciqpn": _67, "个人": _67, "xn--gmqw5a": _67, "個人": _67, "xn--55qx5d": _67, "公司": _67, "xn--mxtq1m": _67, "政府": _67, "xn--lcvr32d": _67, "敎育": _67, "xn--wcvs22d": _67, "教育": _67, "xn--gmq050i": _67, "箇人": _67, "xn--uc0atv": _67, "組織": _67, "xn--uc0ay4a": _67, "組织": _67, "xn--od0alg": _67, "網絡": _67, "xn--zf0avx": _67, "網络": _67, "xn--mk0axi": _67, "组織": _67, "xn--tn0ag": _67, "组织": _67, "xn--od0aq3b": _67, "网絡": _67, "xn--io0a7i": _67, "网络": _67 }], "hm": _67, "hn": [1, { "com": _67, "edu": _67, "gob": _67, "mil": _67, "net": _67, "org": _67 }], "hr": [1, { "com": _67, "from": _67, "iz": _67, "name": _67 }], "ht": [1, { "adult": _67, "art": _67, "asso": _67, "com": _67, "coop": _67, "edu": _67, "firm": _67, "gouv": _67, "info": _67, "med": _67, "net": _67, "org": _67, "perso": _67, "pol": _67, "pro": _67, "rel": _67, "shop": _67 }], "hu": [1, { "2000": _67, "agrar": _67, "bolt": _67, "casino": _67, "city": _67, "co": _67, "erotica": _67, "erotika": _67, "film": _67, "forum": _67, "games": _67, "hotel": _67, "info": _67, "ingatlan": _67, "jogasz": _67, "konyvelo": _67, "lakas": _67, "media": _67, "news": _67, "org": _67, "priv": _67, "reklam": _67, "sex": _67, "shop": _67, "sport": _67, "suli": _67, "szex": _67, "tm": _67, "tozsde": _67, "utazas": _67, "video": _67 }], "id": [1, { "ac": _67, "biz": _67, "co": _67, "desa": _67, "go": _67, "kop": _67, "mil": _67, "my": _67, "net": _67, "or": _67, "ponpes": _67, "sch": _67, "web": _67 }], "ie": _70, "il": [1, { "ac": _67, "co": _67, "gov": _67, "idf": _67, "k12": _67, "muni": _67, "net": _67, "org": _67 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _67, "xn--5dbhl8d": _67, "xn--8dbq2a": _67, "xn--hebda8b": _67 }], "ישראל": [1, { "אקדמיה": _67, "ישוב": _67, "צהל": _67, "ממשל": _67 }], "im": [1, { "ac": _67, "co": [1, { "ltd": _67, "plc": _67 }], "com": _67, "net": _67, "org": _67, "tt": _67, "tv": _67 }], "in": [1, { "5g": _67, "6g": _67, "ac": _67, "ai": _67, "am": _67, "bihar": _67, "biz": _67, "business": _67, "ca": _67, "cn": _67, "co": _67, "com": _67, "coop": _67, "cs": _67, "delhi": _67, "dr": _67, "edu": _67, "er": _67, "firm": _67, "gen": _67, "gov": _67, "gujarat": _67, "ind": _67, "info": _67, "int": _67, "internet": _67, "io": _67, "me": _67, "mil": _67, "net": _67, "nic": _67, "org": _67, "pg": _67, "post": _67, "pro": _67, "res": _67, "travel": _67, "tv": _67, "uk": _67, "up": _67, "us": _67 }], "info": _67, "int": [1, { "eu": _67 }], "io": _75, "iq": _68, "ir": [1, { "ac": _67, "co": _67, "gov": _67, "id": _67, "net": _67, "org": _67, "sch": _67, "xn--mgba3a4f16a": _67, "ایران": _67, "xn--mgba3a4fra": _67, "ايران": _67 }], "is": _67, "it": [1, { "edu": _67, "gov": _67, "abr": _67, "abruzzo": _67, "aosta-valley": _67, "aostavalley": _67, "bas": _67, "basilicata": _67, "cal": _67, "calabria": _67, "cam": _67, "campania": _67, "emilia-romagna": _67, "emiliaromagna": _67, "emr": _67, "friuli-v-giulia": _67, "friuli-ve-giulia": _67, "friuli-vegiulia": _67, "friuli-venezia-giulia": _67, "friuli-veneziagiulia": _67, "friuli-vgiulia": _67, "friuliv-giulia": _67, "friulive-giulia": _67, "friulivegiulia": _67, "friulivenezia-giulia": _67, "friuliveneziagiulia": _67, "friulivgiulia": _67, "fvg": _67, "laz": _67, "lazio": _67, "lig": _67, "liguria": _67, "lom": _67, "lombardia": _67, "lombardy": _67, "lucania": _67, "mar": _67, "marche": _67, "mol": _67, "molise": _67, "piedmont": _67, "piemonte": _67, "pmn": _67, "pug": _67, "puglia": _67, "sar": _67, "sardegna": _67, "sardinia": _67, "sic": _67, "sicilia": _67, "sicily": _67, "taa": _67, "tos": _67, "toscana": _67, "trentin-sud-tirol": _67, "xn--trentin-sd-tirol-rzb": _67, "trentin-süd-tirol": _67, "trentin-sudtirol": _67, "xn--trentin-sdtirol-7vb": _67, "trentin-südtirol": _67, "trentin-sued-tirol": _67, "trentin-suedtirol": _67, "trentino": _67, "trentino-a-adige": _67, "trentino-aadige": _67, "trentino-alto-adige": _67, "trentino-altoadige": _67, "trentino-s-tirol": _67, "trentino-stirol": _67, "trentino-sud-tirol": _67, "xn--trentino-sd-tirol-c3b": _67, "trentino-süd-tirol": _67, "trentino-sudtirol": _67, "xn--trentino-sdtirol-szb": _67, "trentino-südtirol": _67, "trentino-sued-tirol": _67, "trentino-suedtirol": _67, "trentinoa-adige": _67, "trentinoaadige": _67, "trentinoalto-adige": _67, "trentinoaltoadige": _67, "trentinos-tirol": _67, "trentinostirol": _67, "trentinosud-tirol": _67, "xn--trentinosd-tirol-rzb": _67, "trentinosüd-tirol": _67, "trentinosudtirol": _67, "xn--trentinosdtirol-7vb": _67, "trentinosüdtirol": _67, "trentinosued-tirol": _67, "trentinosuedtirol": _67, "trentinsud-tirol": _67, "xn--trentinsd-tirol-6vb": _67, "trentinsüd-tirol": _67, "trentinsudtirol": _67, "xn--trentinsdtirol-nsb": _67, "trentinsüdtirol": _67, "trentinsued-tirol": _67, "trentinsuedtirol": _67, "tuscany": _67, "umb": _67, "umbria": _67, "val-d-aosta": _67, "val-daosta": _67, "vald-aosta": _67, "valdaosta": _67, "valle-aosta": _67, "valle-d-aosta": _67, "valle-daosta": _67, "valleaosta": _67, "valled-aosta": _67, "valledaosta": _67, "vallee-aoste": _67, "xn--valle-aoste-ebb": _67, "vallée-aoste": _67, "vallee-d-aoste": _67, "xn--valle-d-aoste-ehb": _67, "vallée-d-aoste": _67, "valleeaoste": _67, "xn--valleaoste-e7a": _67, "valléeaoste": _67, "valleedaoste": _67, "xn--valledaoste-ebb": _67, "valléedaoste": _67, "vao": _67, "vda": _67, "ven": _67, "veneto": _67, "ag": _67, "agrigento": _67, "al": _67, "alessandria": _67, "alto-adige": _67, "altoadige": _67, "an": _67, "ancona": _67, "andria-barletta-trani": _67, "andria-trani-barletta": _67, "andriabarlettatrani": _67, "andriatranibarletta": _67, "ao": _67, "aosta": _67, "aoste": _67, "ap": _67, "aq": _67, "aquila": _67, "ar": _67, "arezzo": _67, "ascoli-piceno": _67, "ascolipiceno": _67, "asti": _67, "at": _67, "av": _67, "avellino": _67, "ba": _67, "balsan": _67, "balsan-sudtirol": _67, "xn--balsan-sdtirol-nsb": _67, "balsan-südtirol": _67, "balsan-suedtirol": _67, "bari": _67, "barletta-trani-andria": _67, "barlettatraniandria": _67, "belluno": _67, "benevento": _67, "bergamo": _67, "bg": _67, "bi": _67, "biella": _67, "bl": _67, "bn": _67, "bo": _67, "bologna": _67, "bolzano": _67, "bolzano-altoadige": _67, "bozen": _67, "bozen-sudtirol": _67, "xn--bozen-sdtirol-2ob": _67, "bozen-südtirol": _67, "bozen-suedtirol": _67, "br": _67, "brescia": _67, "brindisi": _67, "bs": _67, "bt": _67, "bulsan": _67, "bulsan-sudtirol": _67, "xn--bulsan-sdtirol-nsb": _67, "bulsan-südtirol": _67, "bulsan-suedtirol": _67, "bz": _67, "ca": _67, "cagliari": _67, "caltanissetta": _67, "campidano-medio": _67, "campidanomedio": _67, "campobasso": _67, "carbonia-iglesias": _67, "carboniaiglesias": _67, "carrara-massa": _67, "carraramassa": _67, "caserta": _67, "catania": _67, "catanzaro": _67, "cb": _67, "ce": _67, "cesena-forli": _67, "xn--cesena-forl-mcb": _67, "cesena-forlì": _67, "cesenaforli": _67, "xn--cesenaforl-i8a": _67, "cesenaforlì": _67, "ch": _67, "chieti": _67, "ci": _67, "cl": _67, "cn": _67, "co": _67, "como": _67, "cosenza": _67, "cr": _67, "cremona": _67, "crotone": _67, "cs": _67, "ct": _67, "cuneo": _67, "cz": _67, "dell-ogliastra": _67, "dellogliastra": _67, "en": _67, "enna": _67, "fc": _67, "fe": _67, "fermo": _67, "ferrara": _67, "fg": _67, "fi": _67, "firenze": _67, "florence": _67, "fm": _67, "foggia": _67, "forli-cesena": _67, "xn--forl-cesena-fcb": _67, "forlì-cesena": _67, "forlicesena": _67, "xn--forlcesena-c8a": _67, "forlìcesena": _67, "fr": _67, "frosinone": _67, "ge": _67, "genoa": _67, "genova": _67, "go": _67, "gorizia": _67, "gr": _67, "grosseto": _67, "iglesias-carbonia": _67, "iglesiascarbonia": _67, "im": _67, "imperia": _67, "is": _67, "isernia": _67, "kr": _67, "la-spezia": _67, "laquila": _67, "laspezia": _67, "latina": _67, "lc": _67, "le": _67, "lecce": _67, "lecco": _67, "li": _67, "livorno": _67, "lo": _67, "lodi": _67, "lt": _67, "lu": _67, "lucca": _67, "macerata": _67, "mantova": _67, "massa-carrara": _67, "massacarrara": _67, "matera": _67, "mb": _67, "mc": _67, "me": _67, "medio-campidano": _67, "mediocampidano": _67, "messina": _67, "mi": _67, "milan": _67, "milano": _67, "mn": _67, "mo": _67, "modena": _67, "monza": _67, "monza-brianza": _67, "monza-e-della-brianza": _67, "monzabrianza": _67, "monzaebrianza": _67, "monzaedellabrianza": _67, "ms": _67, "mt": _67, "na": _67, "naples": _67, "napoli": _67, "no": _67, "novara": _67, "nu": _67, "nuoro": _67, "og": _67, "ogliastra": _67, "olbia-tempio": _67, "olbiatempio": _67, "or": _67, "oristano": _67, "ot": _67, "pa": _67, "padova": _67, "padua": _67, "palermo": _67, "parma": _67, "pavia": _67, "pc": _67, "pd": _67, "pe": _67, "perugia": _67, "pesaro-urbino": _67, "pesarourbino": _67, "pescara": _67, "pg": _67, "pi": _67, "piacenza": _67, "pisa": _67, "pistoia": _67, "pn": _67, "po": _67, "pordenone": _67, "potenza": _67, "pr": _67, "prato": _67, "pt": _67, "pu": _67, "pv": _67, "pz": _67, "ra": _67, "ragusa": _67, "ravenna": _67, "rc": _67, "re": _67, "reggio-calabria": _67, "reggio-emilia": _67, "reggiocalabria": _67, "reggioemilia": _67, "rg": _67, "ri": _67, "rieti": _67, "rimini": _67, "rm": _67, "rn": _67, "ro": _67, "roma": _67, "rome": _67, "rovigo": _67, "sa": _67, "salerno": _67, "sassari": _67, "savona": _67, "si": _67, "siena": _67, "siracusa": _67, "so": _67, "sondrio": _67, "sp": _67, "sr": _67, "ss": _67, "xn--sdtirol-n2a": _67, "südtirol": _67, "suedtirol": _67, "sv": _67, "ta": _67, "taranto": _67, "te": _67, "tempio-olbia": _67, "tempioolbia": _67, "teramo": _67, "terni": _67, "tn": _67, "to": _67, "torino": _67, "tp": _67, "tr": _67, "trani-andria-barletta": _67, "trani-barletta-andria": _67, "traniandriabarletta": _67, "tranibarlettaandria": _67, "trapani": _67, "trento": _67, "treviso": _67, "trieste": _67, "ts": _67, "turin": _67, "tv": _67, "ud": _67, "udine": _67, "urbino-pesaro": _67, "urbinopesaro": _67, "va": _67, "varese": _67, "vb": _67, "vc": _67, "ve": _67, "venezia": _67, "venice": _67, "verbania": _67, "vercelli": _67, "verona": _67, "vi": _67, "vibo-valentia": _67, "vibovalentia": _67, "vicenza": _67, "viterbo": _67, "vr": _67, "vs": _67, "vt": _67, "vv": _67 }], "je": _74, "jm": _71, "jo": [1, { "agri": _67, "ai": _67, "com": _67, "edu": _67, "eng": _67, "fm": _67, "gov": _67, "mil": _67, "net": _67, "org": _67, "per": _67, "phd": _67, "sch": _67, "tv": _67 }], "jobs": _67, "jp": [1, { "ac": _67, "ad": _67, "co": _67, "ed": _67, "go": _67, "gr": _67, "lg": _67, "ne": _67, "or": _67, "aichi": [1, { "aisai": _67, "ama": _67, "anjo": _67, "asuke": _67, "chiryu": _67, "chita": _67, "fuso": _67, "gamagori": _67, "handa": _67, "hazu": _67, "hekinan": _67, "higashiura": _67, "ichinomiya": _67, "inazawa": _67, "inuyama": _67, "isshiki": _67, "iwakura": _67, "kanie": _67, "kariya": _67, "kasugai": _67, "kira": _67, "kiyosu": _67, "komaki": _67, "konan": _67, "kota": _67, "mihama": _67, "miyoshi": _67, "nishio": _67, "nisshin": _67, "obu": _67, "oguchi": _67, "oharu": _67, "okazaki": _67, "owariasahi": _67, "seto": _67, "shikatsu": _67, "shinshiro": _67, "shitara": _67, "tahara": _67, "takahama": _67, "tobishima": _67, "toei": _67, "togo": _67, "tokai": _67, "tokoname": _67, "toyoake": _67, "toyohashi": _67, "toyokawa": _67, "toyone": _67, "toyota": _67, "tsushima": _67, "yatomi": _67 }], "akita": [1, { "akita": _67, "daisen": _67, "fujisato": _67, "gojome": _67, "hachirogata": _67, "happou": _67, "higashinaruse": _67, "honjo": _67, "honjyo": _67, "ikawa": _67, "kamikoani": _67, "kamioka": _67, "katagami": _67, "kazuno": _67, "kitaakita": _67, "kosaka": _67, "kyowa": _67, "misato": _67, "mitane": _67, "moriyoshi": _67, "nikaho": _67, "noshiro": _67, "odate": _67, "oga": _67, "ogata": _67, "semboku": _67, "yokote": _67, "yurihonjo": _67 }], "aomori": [1, { "aomori": _67, "gonohe": _67, "hachinohe": _67, "hashikami": _67, "hiranai": _67, "hirosaki": _67, "itayanagi": _67, "kuroishi": _67, "misawa": _67, "mutsu": _67, "nakadomari": _67, "noheji": _67, "oirase": _67, "owani": _67, "rokunohe": _67, "sannohe": _67, "shichinohe": _67, "shingo": _67, "takko": _67, "towada": _67, "tsugaru": _67, "tsuruta": _67 }], "chiba": [1, { "abiko": _67, "asahi": _67, "chonan": _67, "chosei": _67, "choshi": _67, "chuo": _67, "funabashi": _67, "futtsu": _67, "hanamigawa": _67, "ichihara": _67, "ichikawa": _67, "ichinomiya": _67, "inzai": _67, "isumi": _67, "kamagaya": _67, "kamogawa": _67, "kashiwa": _67, "katori": _67, "katsuura": _67, "kimitsu": _67, "kisarazu": _67, "kozaki": _67, "kujukuri": _67, "kyonan": _67, "matsudo": _67, "midori": _67, "mihama": _67, "minamiboso": _67, "mobara": _67, "mutsuzawa": _67, "nagara": _67, "nagareyama": _67, "narashino": _67, "narita": _67, "noda": _67, "oamishirasato": _67, "omigawa": _67, "onjuku": _67, "otaki": _67, "sakae": _67, "sakura": _67, "shimofusa": _67, "shirako": _67, "shiroi": _67, "shisui": _67, "sodegaura": _67, "sosa": _67, "tako": _67, "tateyama": _67, "togane": _67, "tohnosho": _67, "tomisato": _67, "urayasu": _67, "yachimata": _67, "yachiyo": _67, "yokaichiba": _67, "yokoshibahikari": _67, "yotsukaido": _67 }], "ehime": [1, { "ainan": _67, "honai": _67, "ikata": _67, "imabari": _67, "iyo": _67, "kamijima": _67, "kihoku": _67, "kumakogen": _67, "masaki": _67, "matsuno": _67, "matsuyama": _67, "namikata": _67, "niihama": _67, "ozu": _67, "saijo": _67, "seiyo": _67, "shikokuchuo": _67, "tobe": _67, "toon": _67, "uchiko": _67, "uwajima": _67, "yawatahama": _67 }], "fukui": [1, { "echizen": _67, "eiheiji": _67, "fukui": _67, "ikeda": _67, "katsuyama": _67, "mihama": _67, "minamiechizen": _67, "obama": _67, "ohi": _67, "ono": _67, "sabae": _67, "sakai": _67, "takahama": _67, "tsuruga": _67, "wakasa": _67 }], "fukuoka": [1, { "ashiya": _67, "buzen": _67, "chikugo": _67, "chikuho": _67, "chikujo": _67, "chikushino": _67, "chikuzen": _67, "chuo": _67, "dazaifu": _67, "fukuchi": _67, "hakata": _67, "higashi": _67, "hirokawa": _67, "hisayama": _67, "iizuka": _67, "inatsuki": _67, "kaho": _67, "kasuga": _67, "kasuya": _67, "kawara": _67, "keisen": _67, "koga": _67, "kurate": _67, "kurogi": _67, "kurume": _67, "minami": _67, "miyako": _67, "miyama": _67, "miyawaka": _67, "mizumaki": _67, "munakata": _67, "nakagawa": _67, "nakama": _67, "nishi": _67, "nogata": _67, "ogori": _67, "okagaki": _67, "okawa": _67, "oki": _67, "omuta": _67, "onga": _67, "onojo": _67, "oto": _67, "saigawa": _67, "sasaguri": _67, "shingu": _67, "shinyoshitomi": _67, "shonai": _67, "soeda": _67, "sue": _67, "tachiarai": _67, "tagawa": _67, "takata": _67, "toho": _67, "toyotsu": _67, "tsuiki": _67, "ukiha": _67, "umi": _67, "usui": _67, "yamada": _67, "yame": _67, "yanagawa": _67, "yukuhashi": _67 }], "fukushima": [1, { "aizubange": _67, "aizumisato": _67, "aizuwakamatsu": _67, "asakawa": _67, "bandai": _67, "date": _67, "fukushima": _67, "furudono": _67, "futaba": _67, "hanawa": _67, "higashi": _67, "hirata": _67, "hirono": _67, "iitate": _67, "inawashiro": _67, "ishikawa": _67, "iwaki": _67, "izumizaki": _67, "kagamiishi": _67, "kaneyama": _67, "kawamata": _67, "kitakata": _67, "kitashiobara": _67, "koori": _67, "koriyama": _67, "kunimi": _67, "miharu": _67, "mishima": _67, "namie": _67, "nango": _67, "nishiaizu": _67, "nishigo": _67, "okuma": _67, "omotego": _67, "ono": _67, "otama": _67, "samegawa": _67, "shimogo": _67, "shirakawa": _67, "showa": _67, "soma": _67, "sukagawa": _67, "taishin": _67, "tamakawa": _67, "tanagura": _67, "tenei": _67, "yabuki": _67, "yamato": _67, "yamatsuri": _67, "yanaizu": _67, "yugawa": _67 }], "gifu": [1, { "anpachi": _67, "ena": _67, "gifu": _67, "ginan": _67, "godo": _67, "gujo": _67, "hashima": _67, "hichiso": _67, "hida": _67, "higashishirakawa": _67, "ibigawa": _67, "ikeda": _67, "kakamigahara": _67, "kani": _67, "kasahara": _67, "kasamatsu": _67, "kawaue": _67, "kitagata": _67, "mino": _67, "minokamo": _67, "mitake": _67, "mizunami": _67, "motosu": _67, "nakatsugawa": _67, "ogaki": _67, "sakahogi": _67, "seki": _67, "sekigahara": _67, "shirakawa": _67, "tajimi": _67, "takayama": _67, "tarui": _67, "toki": _67, "tomika": _67, "wanouchi": _67, "yamagata": _67, "yaotsu": _67, "yoro": _67 }], "gunma": [1, { "annaka": _67, "chiyoda": _67, "fujioka": _67, "higashiagatsuma": _67, "isesaki": _67, "itakura": _67, "kanna": _67, "kanra": _67, "katashina": _67, "kawaba": _67, "kiryu": _67, "kusatsu": _67, "maebashi": _67, "meiwa": _67, "midori": _67, "minakami": _67, "naganohara": _67, "nakanojo": _67, "nanmoku": _67, "numata": _67, "oizumi": _67, "ora": _67, "ota": _67, "shibukawa": _67, "shimonita": _67, "shinto": _67, "showa": _67, "takasaki": _67, "takayama": _67, "tamamura": _67, "tatebayashi": _67, "tomioka": _67, "tsukiyono": _67, "tsumagoi": _67, "ueno": _67, "yoshioka": _67 }], "hiroshima": [1, { "asaminami": _67, "daiwa": _67, "etajima": _67, "fuchu": _67, "fukuyama": _67, "hatsukaichi": _67, "higashihiroshima": _67, "hongo": _67, "jinsekikogen": _67, "kaita": _67, "kui": _67, "kumano": _67, "kure": _67, "mihara": _67, "miyoshi": _67, "naka": _67, "onomichi