tldts-icann
Version:
Library to work against complex domain names, subdomains and URIs. Only contains ICANN section.
563 lines (553 loc) • 130 kB
JavaScript
'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);
}
if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) {
return result;
}
// Check if `hostname` is a valid ip address
if (options.detectIp) {
result.isIp = isIp(result.hostname);
if (result.isIp) {
return result;
}
}
// Perform optional hostname validation. If hostname is not valid, no need to
// go further as there will be no valid domain or sub-domain.
if (options.validateHostname &&
options.extractHostname &&
!isValidHostname(result.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 _62 = [1, {}], _63 = [0, { "city": _62 }];
const exceptions = [0, { "ck": [0, { "www": _62 }], "jp": [0, { "kawasaki": _63, "kitakyushu": _63, "kobe": _63, "nagoya": _63, "sapporo": _63, "sendai": _63, "yokohama": _63 }] }];
return exceptions;
})();
const rules = (function () {
const _64 = [1, {}], _65 = [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "org": _64 }], _66 = [1, { "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], _67 = [1, { "gov": _64 }], _68 = [0, { "*": _64 }], _69 = [1, { "co": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], _70 = [1, { "com": _64, "edu": _64, "net": _64, "org": _64 }], _71 = [1, { "co": _64, "net": _64, "org": _64 }], _72 = [1, { "co": _64, "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "nom": _64, "org": _64 }], _73 = [1, { "biz": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "net": _64, "org": _64 }], _74 = [1, { "gs": _64 }], _75 = [0, { "nes": _64 }], _76 = [1, { "k12": _64, "cc": _64, "lib": _64 }], _77 = [1, { "cc": _64 }], _78 = [1, { "cc": _64, "lib": _64 }];
const rules = [0, { "ac": _65, "ad": _64, "ae": [1, { "ac": _64, "co": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "sch": _64 }], "aero": [1, { "airline": _64, "airport": _64, "accident-investigation": _64, "accident-prevention": _64, "aerobatic": _64, "aeroclub": _64, "aerodrome": _64, "agents": _64, "air-surveillance": _64, "air-traffic-control": _64, "aircraft": _64, "airtraffic": _64, "ambulance": _64, "association": _64, "author": _64, "ballooning": _64, "broker": _64, "caa": _64, "cargo": _64, "catering": _64, "certification": _64, "championship": _64, "charter": _64, "civilaviation": _64, "club": _64, "conference": _64, "consultant": _64, "consulting": _64, "control": _64, "council": _64, "crew": _64, "design": _64, "dgca": _64, "educator": _64, "emergency": _64, "engine": _64, "engineer": _64, "entertainment": _64, "equipment": _64, "exchange": _64, "express": _64, "federation": _64, "flight": _64, "freight": _64, "fuel": _64, "gliding": _64, "government": _64, "groundhandling": _64, "group": _64, "hanggliding": _64, "homebuilt": _64, "insurance": _64, "journal": _64, "journalist": _64, "leasing": _64, "logistics": _64, "magazine": _64, "maintenance": _64, "marketplace": _64, "media": _64, "microlight": _64, "modelling": _64, "navigation": _64, "parachuting": _64, "paragliding": _64, "passenger-association": _64, "pilot": _64, "press": _64, "production": _64, "recreation": _64, "repbody": _64, "res": _64, "research": _64, "rotorcraft": _64, "safety": _64, "scientist": _64, "services": _64, "show": _64, "skydiving": _64, "software": _64, "student": _64, "taxi": _64, "trader": _64, "trading": _64, "trainer": _64, "union": _64, "workinggroup": _64, "works": _64 }], "af": _66, "ag": [1, { "co": _64, "com": _64, "net": _64, "nom": _64, "org": _64 }], "ai": [1, { "com": _64, "net": _64, "off": _64, "org": _64 }], "al": _65, "am": [1, { "co": _64, "com": _64, "commune": _64, "net": _64, "org": _64 }], "ao": [1, { "co": _64, "ed": _64, "edu": _64, "gov": _64, "gv": _64, "it": _64, "og": _64, "org": _64, "pb": _64 }], "aq": _64, "ar": [1, { "bet": _64, "com": _64, "coop": _64, "edu": _64, "gob": _64, "gov": _64, "int": _64, "mil": _64, "musica": _64, "mutual": _64, "net": _64, "org": _64, "senasa": _64, "tur": _64 }], "arpa": [1, { "e164": _64, "home": _64, "in-addr": _64, "ip6": _64, "iris": _64, "uri": _64, "urn": _64 }], "as": _67, "asia": _64, "at": [1, { "ac": [1, { "sth": _64 }], "co": _64, "gv": _64, "or": _64 }], "au": [1, { "asn": _64, "com": _64, "edu": [1, { "act": _64, "catholic": _64, "nsw": [1, { "schools": _64 }], "nt": _64, "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "gov": [1, { "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "id": _64, "net": _64, "org": _64, "conf": _64, "oz": _64, "act": _64, "nsw": _64, "nt": _64, "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "aw": [1, { "com": _64 }], "ax": _64, "az": [1, { "biz": _64, "co": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "int": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "pp": _64, "pro": _64 }], "ba": _65, "bb": [1, { "biz": _64, "co": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "net": _64, "org": _64, "store": _64, "tv": _64 }], "bd": _68, "be": [1, { "ac": _64 }], "bf": _67, "bg": [1, { "0": _64, "1": _64, "2": _64, "3": _64, "4": _64, "5": _64, "6": _64, "7": _64, "8": _64, "9": _64, "a": _64, "b": _64, "c": _64, "d": _64, "e": _64, "f": _64, "g": _64, "h": _64, "i": _64, "j": _64, "k": _64, "l": _64, "m": _64, "n": _64, "o": _64, "p": _64, "q": _64, "r": _64, "s": _64, "t": _64, "u": _64, "v": _64, "w": _64, "x": _64, "y": _64, "z": _64 }], "bh": _66, "bi": [1, { "co": _64, "com": _64, "edu": _64, "or": _64, "org": _64 }], "biz": _64, "bj": [1, { "africa": _64, "agro": _64, "architectes": _64, "assur": _64, "avocats": _64, "co": _64, "com": _64, "eco": _64, "econo": _64, "edu": _64, "info": _64, "loisirs": _64, "money": _64, "net": _64, "org": _64, "ote": _64, "restaurant": _64, "resto": _64, "tourism": _64, "univ": _64 }], "bm": _66, "bn": _66, "bo": [1, { "com": _64, "edu": _64, "gob": _64, "int": _64, "mil": _64, "net": _64, "org": _64, "tv": _64, "web": _64, "academia": _64, "agro": _64, "arte": _64, "blog": _64, "bolivia": _64, "ciencia": _64, "cooperativa": _64, "democracia": _64, "deporte": _64, "ecologia": _64, "economia": _64, "empresa": _64, "indigena": _64, "industria": _64, "info": _64, "medicina": _64, "movimiento": _64, "musica": _64, "natural": _64, "nombre": _64, "noticias": _64, "patria": _64, "plurinacional": _64, "politica": _64, "profesional": _64, "pueblo": _64, "revista": _64, "salud": _64, "tecnologia": _64, "tksat": _64, "transporte": _64, "wiki": _64 }], "br": [1, { "9guacu": _64, "abc": _64, "adm": _64, "adv": _64, "agr": _64, "aju": _64, "am": _64, "anani": _64, "aparecida": _64, "app": _64, "arq": _64, "art": _64, "ato": _64, "b": _64, "barueri": _64, "belem": _64, "bet": _64, "bhz": _64, "bib": _64, "bio": _64, "blog": _64, "bmd": _64, "boavista": _64, "bsb": _64, "campinagrande": _64, "campinas": _64, "caxias": _64, "cim": _64, "cng": _64, "cnt": _64, "com": _64, "contagem": _64, "coop": _64, "coz": _64, "cri": _64, "cuiaba": _64, "curitiba": _64, "def": _64, "des": _64, "det": _64, "dev": _64, "ecn": _64, "eco": _64, "edu": _64, "emp": _64, "enf": _64, "eng": _64, "esp": _64, "etc": _64, "eti": _64, "far": _64, "feira": _64, "flog": _64, "floripa": _64, "fm": _64, "fnd": _64, "fortal": _64, "fot": _64, "foz": _64, "fst": _64, "g12": _64, "geo": _64, "ggf": _64, "goiania": _64, "gov": [1, { "ac": _64, "al": _64, "am": _64, "ap": _64, "ba": _64, "ce": _64, "df": _64, "es": _64, "go": _64, "ma": _64, "mg": _64, "ms": _64, "mt": _64, "pa": _64, "pb": _64, "pe": _64, "pi": _64, "pr": _64, "rj": _64, "rn": _64, "ro": _64, "rr": _64, "rs": _64, "sc": _64, "se": _64, "sp": _64, "to": _64 }], "gru": _64, "imb": _64, "ind": _64, "inf": _64, "jab": _64, "jampa": _64, "jdf": _64, "joinville": _64, "jor": _64, "jus": _64, "leg": _64, "leilao": _64, "lel": _64, "log": _64, "londrina": _64, "macapa": _64, "maceio": _64, "manaus": _64, "maringa": _64, "mat": _64, "med": _64, "mil": _64, "morena": _64, "mp": _64, "mus": _64, "natal": _64, "net": _64, "niteroi": _64, "nom": _68, "not": _64, "ntr": _64, "odo": _64, "ong": _64, "org": _64, "osasco": _64, "palmas": _64, "poa": _64, "ppg": _64, "pro": _64, "psc": _64, "psi": _64, "pvh": _64, "qsl": _64, "radio": _64, "rec": _64, "recife": _64, "rep": _64, "ribeirao": _64, "rio": _64, "riobranco": _64, "riopreto": _64, "salvador": _64, "sampa": _64, "santamaria": _64, "santoandre": _64, "saobernardo": _64, "saogonca": _64, "seg": _64, "sjc": _64, "slg": _64, "slz": _64, "sorocaba": _64, "srv": _64, "taxi": _64, "tc": _64, "tec": _64, "teo": _64, "the": _64, "tmp": _64, "trd": _64, "tur": _64, "tv": _64, "udi": _64, "vet": _64, "vix": _64, "vlog": _64, "wiki": _64, "zlg": _64 }], "bs": _66, "bt": _66, "bv": _64, "bw": [1, { "ac": _64, "co": _64, "gov": _64, "net": _64, "org": _64 }], "by": [1, { "gov": _64, "mil": _64, "com": _64, "of": _64 }], "bz": _69, "ca": [1, { "ab": _64, "bc": _64, "mb": _64, "nb": _64, "nf": _64, "nl": _64, "ns": _64, "nt": _64, "nu": _64, "on": _64, "pe": _64, "qc": _64, "sk": _64, "yk": _64, "gc": _64 }], "cat": _64, "cc": _64, "cd": _67, "cf": _64, "cg": _64, "ch": _64, "ci": [1, { "ac": _64, "xn--aroport-bya": _64, "aéroport": _64, "asso": _64, "co": _64, "com": _64, "ed": _64, "edu": _64, "go": _64, "gouv": _64, "int": _64, "net": _64, "or": _64, "org": _64 }], "ck": _68, "cl": [1, { "co": _64, "gob": _64, "gov": _64, "mil": _64 }], "cm": [1, { "co": _64, "com": _64, "gov": _64, "net": _64 }], "cn": [1, { "ac": _64, "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "xn--55qx5d": _64, "公司": _64, "xn--od0alg": _64, "網絡": _64, "xn--io0a7i": _64, "网络": _64, "ah": _64, "bj": _64, "cq": _64, "fj": _64, "gd": _64, "gs": _64, "gx": _64, "gz": _64, "ha": _64, "hb": _64, "he": _64, "hi": _64, "hk": _64, "hl": _64, "hn": _64, "jl": _64, "js": _64, "jx": _64, "ln": _64, "mo": _64, "nm": _64, "nx": _64, "qh": _64, "sc": _64, "sd": _64, "sh": _64, "sn": _64, "sx": _64, "tj": _64, "tw": _64, "xj": _64, "xz": _64, "yn": _64, "zj": _64 }], "co": [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "nom": _64, "org": _64 }], "com": _64, "coop": _64, "cr": [1, { "ac": _64, "co": _64, "ed": _64, "fi": _64, "go": _64, "or": _64, "sa": _64 }], "cu": [1, { "com": _64, "edu": _64, "gob": _64, "inf": _64, "nat": _64, "net": _64, "org": _64 }], "cv": [1, { "com": _64, "edu": _64, "id": _64, "int": _64, "net": _64, "nome": _64, "org": _64, "publ": _64 }], "cw": _70, "cx": _67, "cy": [1, { "ac": _64, "biz": _64, "com": _64, "ekloges": _64, "gov": _64, "ltd": _64, "mil": _64, "net": _64, "org": _64, "press": _64, "pro": _64, "tm": _64 }], "cz": _64, "de": _64, "dj": _64, "dk": _64, "dm": _69, "do": [1, { "art": _64, "com": _64, "edu": _64, "gob": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "sld": _64, "web": _64 }], "dz": [1, { "art": _64, "asso": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64, "pol": _64, "soc": _64, "tm": _64 }], "ec": [1, { "com": _64, "edu": _64, "fin": _64, "gob": _64, "gov": _64, "info": _64, "k12": _64, "med": _64, "mil": _64, "net": _64, "org": _64, "pro": _64 }], "edu": _64, "ee": [1, { "aip": _64, "com": _64, "edu": _64, "fie": _64, "gov": _64, "lib": _64, "med": _64, "org": _64, "pri": _64, "riik": _64 }], "eg": [1, { "ac": _64, "com": _64, "edu": _64, "eun": _64, "gov": _64, "info": _64, "me": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "sci": _64, "sport": _64, "tv": _64 }], "er": _68, "es": [1, { "com": _64, "edu": _64, "gob": _64, "nom": _64, "org": _64 }], "et": [1, { "biz": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "name": _64, "net": _64, "org": _64 }], "eu": _64, "fi": [1, { "aland": _64 }], "fj": [1, { "ac": _64, "biz": _64, "com": _64, "gov": _64, "info": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "pro": _64 }], "fk": _68, "fm": _70, "fo": _64, "fr": [1, { "asso": _64, "com": _64, "gouv": _64, "nom": _64, "prd": _64, "tm": _64, "avoues": _64, "cci": _64, "greta": _64, "huissier-justice": _64 }], "ga": _64, "gb": _64, "gd": [1, { "edu": _64, "gov": _64 }], "ge": [1, { "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64, "pvt": _64, "school": _64 }], "gf": _64, "gg": _71, "gh": [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "org": _64 }], "gi": [1, { "com": _64, "edu": _64, "gov": _64, "ltd": _64, "mod": _64, "org": _64 }], "gl": [1, { "co": _64, "com": _64, "edu": _64, "net": _64, "org": _64 }], "gm": _64, "gn": [1, { "ac": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], "gov": _64, "gp": [1, { "asso": _64, "com": _64, "edu": _64, "mobi": _64, "net": _64, "org": _64 }], "gq": _64, "gr": _66, "gs": _64, "gt": [1, { "com": _64, "edu": _64, "gob": _64, "ind": _64, "mil": _64, "net": _64, "org": _64 }], "gu": [1, { "com": _64, "edu": _64, "gov": _64, "guam": _64, "info": _64, "net": _64, "org": _64, "web": _64 }], "gw": _64, "gy": _69, "hk": [1, { "com": _64, "edu": _64, "gov": _64, "idv": _64, "net": _64, "org": _64, "xn--ciqpn": _64, "个人": _64, "xn--gmqw5a": _64, "個人": _64, "xn--55qx5d": _64, "公司": _64, "xn--mxtq1m": _64, "政府": _64, "xn--lcvr32d": _64, "敎育": _64, "xn--wcvs22d": _64, "教育": _64, "xn--gmq050i": _64, "箇人": _64, "xn--uc0atv": _64, "組織": _64, "xn--uc0ay4a": _64, "組织": _64, "xn--od0alg": _64, "網絡": _64, "xn--zf0avx": _64, "網络": _64, "xn--mk0axi": _64, "组織": _64, "xn--tn0ag": _64, "组织": _64, "xn--od0aq3b": _64, "网絡": _64, "xn--io0a7i": _64, "网络": _64 }], "hm": _64, "hn": [1, { "com": _64, "edu": _64, "gob": _64, "mil": _64, "net": _64, "org": _64 }], "hr": [1, { "com": _64, "from": _64, "iz": _64, "name": _64 }], "ht": [1, { "adult": _64, "art": _64, "asso": _64, "com": _64, "coop": _64, "edu": _64, "firm": _64, "gouv": _64, "info": _64, "med": _64, "net": _64, "org": _64, "perso": _64, "pol": _64, "pro": _64, "rel": _64, "shop": _64 }], "hu": [1, { "2000": _64, "agrar": _64, "bolt": _64, "casino": _64, "city": _64, "co": _64, "erotica": _64, "erotika": _64, "film": _64, "forum": _64, "games": _64, "hotel": _64, "info": _64, "ingatlan": _64, "jogasz": _64, "konyvelo": _64, "lakas": _64, "media": _64, "news": _64, "org": _64, "priv": _64, "reklam": _64, "sex": _64, "shop": _64, "sport": _64, "suli": _64, "szex": _64, "tm": _64, "tozsde": _64, "utazas": _64, "video": _64 }], "id": [1, { "ac": _64, "biz": _64, "co": _64, "desa": _64, "go": _64, "mil": _64, "my": _64, "net": _64, "or": _64, "ponpes": _64, "sch": _64, "web": _64 }], "ie": _67, "il": [1, { "ac": _64, "co": _64, "gov": _64, "idf": _64, "k12": _64, "muni": _64, "net": _64, "org": _64 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _64, "xn--5dbhl8d": _64, "xn--8dbq2a": _64, "xn--hebda8b": _64 }], "ישראל": [1, { "אקדמיה": _64, "ישוב": _64, "צהל": _64, "ממשל": _64 }], "im": [1, { "ac": _64, "co": [1, { "ltd": _64, "plc": _64 }], "com": _64, "net": _64, "org": _64, "tt": _64, "tv": _64 }], "in": [1, { "5g": _64, "6g": _64, "ac": _64, "ai": _64, "am": _64, "bihar": _64, "biz": _64, "business": _64, "ca": _64, "cn": _64, "co": _64, "com": _64, "coop": _64, "cs": _64, "delhi": _64, "dr": _64, "edu": _64, "er": _64, "firm": _64, "gen": _64, "gov": _64, "gujarat": _64, "ind": _64, "info": _64, "int": _64, "internet": _64, "io": _64, "me": _64, "mil": _64, "net": _64, "nic": _64, "org": _64, "pg": _64, "post": _64, "pro": _64, "res": _64, "travel": _64, "tv": _64, "uk": _64, "up": _64, "us": _64 }], "info": _64, "int": [1, { "eu": _64 }], "io": _72, "iq": _65, "ir": [1, { "ac": _64, "co": _64, "gov": _64, "id": _64, "net": _64, "org": _64, "sch": _64, "xn--mgba3a4f16a": _64, "ایران": _64, "xn--mgba3a4fra": _64, "ايران": _64 }], "is": _64, "it": [1, { "edu": _64, "gov": _64, "abr": _64, "abruzzo": _64, "aosta-valley": _64, "aostavalley": _64, "bas": _64, "basilicata": _64, "cal": _64, "calabria": _64, "cam": _64, "campania": _64, "emilia-romagna": _64, "emiliaromagna": _64, "emr": _64, "friuli-v-giulia": _64, "friuli-ve-giulia": _64, "friuli-vegiulia": _64, "friuli-venezia-giulia": _64, "friuli-veneziagiulia": _64, "friuli-vgiulia": _64, "friuliv-giulia": _64, "friulive-giulia": _64, "friulivegiulia": _64, "friulivenezia-giulia": _64, "friuliveneziagiulia": _64, "friulivgiulia": _64, "fvg": _64, "laz": _64, "lazio": _64, "lig": _64, "liguria": _64, "lom": _64, "lombardia": _64, "lombardy": _64, "lucania": _64, "mar": _64, "marche": _64, "mol": _64, "molise": _64, "piedmont": _64, "piemonte": _64, "pmn": _64, "pug": _64, "puglia": _64, "sar": _64, "sardegna": _64, "sardinia": _64, "sic": _64, "sicilia": _64, "sicily": _64, "taa": _64, "tos": _64, "toscana": _64, "trentin-sud-tirol": _64, "xn--trentin-sd-tirol-rzb": _64, "trentin-süd-tirol": _64, "trentin-sudtirol": _64, "xn--trentin-sdtirol-7vb": _64, "trentin-südtirol": _64, "trentin-sued-tirol": _64, "trentin-suedtirol": _64, "trentino": _64, "trentino-a-adige": _64, "trentino-aadige": _64, "trentino-alto-adige": _64, "trentino-altoadige": _64, "trentino-s-tirol": _64, "trentino-stirol": _64, "trentino-sud-tirol": _64, "xn--trentino-sd-tirol-c3b": _64, "trentino-süd-tirol": _64, "trentino-sudtirol": _64, "xn--trentino-sdtirol-szb": _64, "trentino-südtirol": _64, "trentino-sued-tirol": _64, "trentino-suedtirol": _64, "trentinoa-adige": _64, "trentinoaadige": _64, "trentinoalto-adige": _64, "trentinoaltoadige": _64, "trentinos-tirol": _64, "trentinostirol": _64, "trentinosud-tirol": _64, "xn--trentinosd-tirol-rzb": _64, "trentinosüd-tirol": _64, "trentinosudtirol": _64, "xn--trentinosdtirol-7vb": _64, "trentinosüdtirol": _64, "trentinosued-tirol": _64, "trentinosuedtirol": _64, "trentinsud-tirol": _64, "xn--trentinsd-tirol-6vb": _64, "trentinsüd-tirol": _64, "trentinsudtirol": _64, "xn--trentinsdtirol-nsb": _64, "trentinsüdtirol": _64, "trentinsued-tirol": _64, "trentinsuedtirol": _64, "tuscany": _64, "umb": _64, "umbria": _64, "val-d-aosta": _64, "val-daosta": _64, "vald-aosta": _64, "valdaosta": _64, "valle-aosta": _64, "valle-d-aosta": _64, "valle-daosta": _64, "valleaosta": _64, "valled-aosta": _64, "valledaosta": _64, "vallee-aoste": _64, "xn--valle-aoste-ebb": _64, "vallée-aoste": _64, "vallee-d-aoste": _64, "xn--valle-d-aoste-ehb": _64, "vallée-d-aoste": _64, "valleeaoste": _64, "xn--valleaoste-e7a": _64, "valléeaoste": _64, "valleedaoste": _64, "xn--valledaoste-ebb": _64, "valléedaoste": _64, "vao": _64, "vda": _64, "ven": _64, "veneto": _64, "ag": _64, "agrigento": _64, "al": _64, "alessandria": _64, "alto-adige": _64, "altoadige": _64, "an": _64, "ancona": _64, "andria-barletta-trani": _64, "andria-trani-barletta": _64, "andriabarlettatrani": _64, "andriatranibarletta": _64, "ao": _64, "aosta": _64, "aoste": _64, "ap": _64, "aq": _64, "aquila": _64, "ar": _64, "arezzo": _64, "ascoli-piceno": _64, "ascolipiceno": _64, "asti": _64, "at": _64, "av": _64, "avellino": _64, "ba": _64, "balsan": _64, "balsan-sudtirol": _64, "xn--balsan-sdtirol-nsb": _64, "balsan-südtirol": _64, "balsan-suedtirol": _64, "bari": _64, "barletta-trani-andria": _64, "barlettatraniandria": _64, "belluno": _64, "benevento": _64, "bergamo": _64, "bg": _64, "bi": _64, "biella": _64, "bl": _64, "bn": _64, "bo": _64, "bologna": _64, "bolzano": _64, "bolzano-altoadige": _64, "bozen": _64, "bozen-sudtirol": _64, "xn--bozen-sdtirol-2ob": _64, "bozen-südtirol": _64, "bozen-suedtirol": _64, "br": _64, "brescia": _64, "brindisi": _64, "bs": _64, "bt": _64, "bulsan": _64, "bulsan-sudtirol": _64, "xn--bulsan-sdtirol-nsb": _64, "bulsan-südtirol": _64, "bulsan-suedtirol": _64, "bz": _64, "ca": _64, "cagliari": _64, "caltanissetta": _64, "campidano-medio": _64, "campidanomedio": _64, "campobasso": _64, "carbonia-iglesias": _64, "carboniaiglesias": _64, "carrara-massa": _64, "carraramassa": _64, "caserta": _64, "catania": _64, "catanzaro": _64, "cb": _64, "ce": _64, "cesena-forli": _64, "xn--cesena-forl-mcb": _64, "cesena-forlì": _64, "cesenaforli": _64, "xn--cesenaforl-i8a": _64, "cesenaforlì": _64, "ch": _64, "chieti": _64, "ci": _64, "cl": _64, "cn": _64, "co": _64, "como": _64, "cosenza": _64, "cr": _64, "cremona": _64, "crotone": _64, "cs": _64, "ct": _64, "cuneo": _64, "cz": _64, "dell-ogliastra": _64, "dellogliastra": _64, "en": _64, "enna": _64, "fc": _64, "fe": _64, "fermo": _64, "ferrara": _64, "fg": _64, "fi": _64, "firenze": _64, "florence": _64, "fm": _64, "foggia": _64, "forli-cesena": _64, "xn--forl-cesena-fcb": _64, "forlì-cesena": _64, "forlicesena": _64, "xn--forlcesena-c8a": _64, "forlìcesena": _64, "fr": _64, "frosinone": _64, "ge": _64, "genoa": _64, "genova": _64, "go": _64, "gorizia": _64, "gr": _64, "grosseto": _64, "iglesias-carbonia": _64, "iglesiascarbonia": _64, "im": _64, "imperia": _64, "is": _64, "isernia": _64, "kr": _64, "la-spezia": _64, "laquila": _64, "laspezia": _64, "latina": _64, "lc": _64, "le": _64, "lecce": _64, "lecco": _64, "li": _64, "livorno": _64, "lo": _64, "lodi": _64, "lt": _64, "lu": _64, "lucca": _64, "macerata": _64, "mantova": _64, "massa-carrara": _64, "massacarrara": _64, "matera": _64, "mb": _64, "mc": _64, "me": _64, "medio-campidano": _64, "mediocampidano": _64, "messina": _64, "mi": _64, "milan": _64, "milano": _64, "mn": _64, "mo": _64, "modena": _64, "monza": _64, "monza-brianza": _64, "monza-e-della-brianza": _64, "monzabrianza": _64, "monzaebrianza": _64, "monzaedellabrianza": _64, "ms": _64, "mt": _64, "na": _64, "naples": _64, "napoli": _64, "no": _64, "novara": _64, "nu": _64, "nuoro": _64, "og": _64, "ogliastra": _64, "olbia-tempio": _64, "olbiatempio": _64, "or": _64, "oristano": _64, "ot": _64, "pa": _64, "padova": _64, "padua": _64, "palermo": _64, "parma": _64, "pavia": _64, "pc": _64, "pd": _64, "pe": _64, "perugia": _64, "pesaro-urbino": _64, "pesarourbino": _64, "pescara": _64, "pg": _64, "pi": _64, "piacenza": _64, "pisa": _64, "pistoia": _64, "pn": _64, "po": _64, "pordenone": _64, "potenza": _64, "pr": _64, "prato": _64, "pt": _64, "pu": _64, "pv": _64, "pz": _64, "ra": _64, "ragusa": _64, "ravenna": _64, "rc": _64, "re": _64, "reggio-calabria": _64, "reggio-emilia": _64, "reggiocalabria": _64, "reggioemilia": _64, "rg": _64, "ri": _64, "rieti": _64, "rimini": _64, "rm": _64, "rn": _64, "ro": _64, "roma": _64, "rome": _64, "rovigo": _64, "sa": _64, "salerno": _64, "sassari": _64, "savona": _64, "si": _64, "siena": _64, "siracusa": _64, "so": _64, "sondrio": _64, "sp": _64, "sr": _64, "ss": _64, "xn--sdtirol-n2a": _64, "südtirol": _64, "suedtirol": _64, "sv": _64, "ta": _64, "taranto": _64, "te": _64, "tempio-olbia": _64, "tempioolbia": _64, "teramo": _64, "terni": _64, "tn": _64, "to": _64, "torino": _64, "tp": _64, "tr": _64, "trani-andria-barletta": _64, "trani-barletta-andria": _64, "traniandriabarletta": _64, "tranibarlettaandria": _64, "trapani": _64, "trento": _64, "treviso": _64, "trieste": _64, "ts": _64, "turin": _64, "tv": _64, "ud": _64, "udine": _64, "urbino-pesaro": _64, "urbinopesaro": _64, "va": _64, "varese": _64, "vb": _64, "vc": _64, "ve": _64, "venezia": _64, "venice": _64, "verbania": _64, "vercelli": _64, "verona": _64, "vi": _64, "vibo-valentia": _64, "vibovalentia": _64, "vicenza": _64, "viterbo": _64, "vr": _64, "vs": _64, "vt": _64, "vv": _64 }], "je": _71, "jm": _68, "jo": [1, { "agri": _64, "ai": _64, "com": _64, "edu": _64, "eng": _64, "fm": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "per": _64, "phd": _64, "sch": _64, "tv": _64 }], "jobs": _64, "jp": [1, { "ac": _64, "ad": _64, "co": _64, "ed": _64, "go": _64, "gr": _64, "lg": _64, "ne": _64, "or": _64, "aichi": [1, { "aisai": _64, "ama": _64, "anjo": _64, "asuke": _64, "chiryu": _64, "chita": _64, "fuso": _64, "gamagori": _64, "handa": _64, "hazu": _64, "hekinan": _64, "higashiura": _64, "ichinomiya": _64, "inazawa": _64, "inuyama": _64, "isshiki": _64, "iwakura": _64, "kanie": _64, "kariya": _64, "kasugai": _64, "kira": _64, "kiyosu": _64, "komaki": _64, "konan": _64, "kota": _64, "mihama": _64, "miyoshi": _64, "nishio": _64, "nisshin": _64, "obu": _64, "oguchi": _64, "oharu": _64, "okazaki": _64, "owariasahi": _64, "seto": _64, "shikatsu": _64, "shinshiro": _64, "shitara": _64, "tahara": _64, "takahama": _64, "tobishima": _64, "toei": _64, "togo": _64, "tokai": _64, "tokoname": _64, "toyoake": _64, "toyohashi": _64, "toyokawa": _64, "toyone": _64, "toyota": _64, "tsushima": _64, "yatomi": _64 }], "akita": [1, { "akita": _64, "daisen": _64, "fujisato": _64, "gojome": _64, "hachirogata": _64, "happou": _64, "higashinaruse": _64, "honjo": _64, "honjyo": _64, "ikawa": _64, "kamikoani": _64, "kamioka": _64, "katagami": _64, "kazuno": _64, "kitaakita": _64, "kosaka": _64, "kyowa": _64, "misato": _64, "mitane": _64, "moriyoshi": _64, "nikaho": _64, "noshiro": _64, "odate": _64, "oga": _64, "ogata": _64, "semboku": _64, "yokote": _64, "yurihonjo": _64 }], "aomori": [1, { "aomori": _64, "gonohe": _64, "hachinohe": _64, "hashikami": _64, "hiranai": _64, "hirosaki": _64, "itayanagi": _64, "kuroishi": _64, "misawa": _64, "mutsu": _64, "nakadomari": _64, "noheji": _64, "oirase": _64, "owani": _64, "rokunohe": _64, "sannohe": _64, "shichinohe": _64, "shingo": _64, "takko": _64, "towada": _64, "tsugaru": _64, "tsuruta": _64 }], "chiba": [1, { "abiko": _64, "asahi": _64, "chonan": _64, "chosei": _64, "choshi": _64, "chuo": _64, "funabashi": _64, "futtsu": _64, "hanamigawa": _64, "ichihara": _64, "ichikawa": _64, "ichinomiya": _64, "inzai": _64, "isumi": _64, "kamagaya": _64, "kamogawa": _64, "kashiwa": _64, "katori": _64, "katsuura": _64, "kimitsu": _64, "kisarazu": _64, "kozaki": _64, "kujukuri": _64, "kyonan": _64, "matsudo": _64, "midori": _64, "mihama": _64, "minamiboso": _64, "mobara": _64, "mutsuzawa": _64, "nagara": _64, "nagareyama": _64, "narashino": _64, "narita": _64, "noda": _64, "oamishirasato": _64, "omigawa": _64, "onjuku": _64, "otaki": _64, "sakae": _64, "sakura": _64, "shimofusa": _64, "shirako": _64, "shiroi": _64, "shisui": _64, "sodegaura": _64, "sosa": _64, "tako": _64, "tateyama": _64, "togane": _64, "tohnosho": _64, "tomisato": _64, "urayasu": _64, "yachimata": _64, "yachiyo": _64, "yokaichiba": _64, "yokoshibahikari": _64, "yotsukaido": _64 }], "ehime": [1, { "ainan": _64, "honai": _64, "ikata": _64, "imabari": _64, "iyo": _64, "kamijima": _64, "kihoku": _64, "kumakogen": _64, "masaki": _64, "matsuno": _64, "matsuyama": _64, "namikata": _64, "niihama": _64, "ozu": _64, "saijo": _64, "seiyo": _64, "shikokuchuo": _64, "tobe": _64, "toon": _64, "uchiko": _64, "uwajima": _64, "yawatahama": _64 }], "fukui": [1, { "echizen": _64, "eiheiji": _64, "fukui": _64, "ikeda": _64, "katsuyama": _64, "mihama": _64, "minamiechizen": _64, "obama": _64, "ohi": _64, "ono": _64, "sabae": _64, "sakai": _64, "takahama": _64, "tsuruga": _64, "wakasa": _64 }], "fukuoka": [1, { "ashiya": _64, "buzen": _64, "chikugo": _64, "chikuho": _64, "chikujo": _64, "chikushino": _64, "chikuzen": _64, "chuo": _64, "dazaifu": _64, "fukuchi": _64, "hakata": _64, "higashi": _64, "hirokawa": _64, "hisayama": _64, "iizuka": _64, "inatsuki": _64, "kaho": _64, "kasuga": _64, "kasuya": _64, "kawara": _64, "keisen": _64, "koga": _64, "kurate": _64, "kurogi": _64, "kurume": _64, "minami": _64, "miyako": _64, "miyama": _64, "miyawaka": _64, "mizumaki": _64, "munakata": _64, "nakagawa": _64, "nakama": _64, "nishi": _64, "nogata": _64, "ogori": _64, "okagaki": _64, "okawa": _64, "oki": _64, "omuta": _64, "onga": _64, "onojo": _64, "oto": _64, "saigawa": _64, "sasaguri": _64, "shingu": _64, "shinyoshitomi": _64, "shonai": _64, "soeda": _64, "sue": _64, "tachiarai": _64, "tagawa": _64, "takata": _64, "toho": _64, "toyotsu": _64, "tsuiki": _64, "ukiha": _64, "umi": _64, "usui": _64, "yamada": _64, "yame": _64, "yanagawa": _64, "yukuhashi": _64 }], "fukushima": [1, { "aizubange": _64, "aizumisato": _64, "aizuwakamatsu": _64, "asakawa": _64, "bandai": _64, "date": _64, "fukushima": _64, "furudono": _64, "futaba": _64, "hanawa": _64, "higashi": _64, "hirata": _64, "hirono": _64, "iitate": _64, "inawashiro": _64, "ishikawa": _64, "iwaki": _64, "izumizaki": _64, "kagamiishi": _64, "kaneyama": _64, "kawamata": _64, "kitakata": _64, "kitashiobara": _64, "koori": _64, "koriyama": _64, "kunimi": _64, "miharu": _64, "mishima": _64, "namie": _64, "nango": _64, "nishiaizu": _64, "nishigo": _64, "okuma": _64, "omotego": _64, "ono": _64, "otama": _64, "samegawa": _64, "shimogo": _64, "shirakawa": _64, "showa": _64, "soma": _64, "sukagawa": _64, "taishin": _64, "tamakawa": _64, "tanagura": _64, "tenei": _64, "yabuki": _64, "yamato": _64, "yamatsuri": _64, "yanaizu": _64, "yugawa": _64 }], "gifu": [1, { "anpachi": _64, "ena": _64, "gifu": _64, "ginan": _64, "godo": _64, "gujo": _64, "hashima": _64, "hichiso": _64, "hida": _64, "higashishirakawa": _64, "ibigawa": _64, "ikeda": _64, "kakamigahara": _64, "kani": _64, "kasahara": _64, "kasamatsu": _64, "kawaue": _64, "kitagata": _64, "mino": _64, "minokamo": _64, "mitake": _64, "mizunami": _64, "motosu": _64, "nakatsugawa": _64, "ogaki": _64, "sakahogi": _64, "seki": _64, "sekigahara": _64, "shirakawa": _64, "tajimi": _64, "takayama": _64, "tarui": _64, "toki": _64, "tomika": _64, "wanouchi": _64, "yamagata": _64, "yaotsu": _64, "yoro": _64 }], "gunma": [1, { "annaka": _64, "chiyoda": _64, "fujioka": _64, "higashiagatsuma": _64, "isesaki": _64, "itakura": _64, "kanna": _64, "kanra": _64, "katashina": _64, "kawaba": _64, "kiryu": _64, "kusatsu": _64, "maebashi": _64, "meiwa": _64, "midori": _64, "minakami": _64, "naganohara": _64, "nakanojo": _64, "nanmoku": _64, "numata": _64, "oizumi": _64, "ora": _64, "ota": _64, "shibukawa": _64, "shimonita": _64, "shinto": _64, "showa": _64, "takasaki": _64, "takayama": _64, "tamamura": _64, "tatebayashi": _64, "tomioka": _64, "tsukiyono": _64, "tsumagoi": _64, "ueno": _64, "yoshioka": _64 }], "hiroshima": [1, { "asaminami": _64, "daiwa": _64, "etajima": _64, "fuchu": _64, "fukuyama": _64, "hatsukaichi": _64, "higashihiroshima": _64, "hongo": _64, "jinsekikogen": _64, "kaita": _64, "kui": _64, "kumano": _64, "kure": _64, "mihara": _64, "miyoshi": _64, "naka": _64, "onomichi": _64, "osakikamijima": _64, "otake": _64, "saka": _64, "sera": _64, "seranishi": _64, "shinichi": _64, "shobara": _64, "takehara": _64 }], "hokkaido": [1, { "abashiri": _64, "abira": _64, "aibetsu": _64, "akabira": _64, "akkeshi": _64, "asahikawa": _64, "ashibetsu": _64, "ashoro": _64, "assabu": _64, "atsuma": _64, "bibai": _64, "biei": _64, "bifuka": _64, "bihoro": _64, "biratori": _64, "chippubetsu": _64, "chitose": _64, "date": _64, "ebetsu": _64, "embetsu": _64, "eniwa": _64, "erimo": _64, "esan": _64, "esashi": _64, "fukagawa": _64, "fukushima": _64, "furano": _64, "furubira": _64, "haboro": _64, "hakodate": _64, "hamatonbetsu": _64, "hidaka": _64, "higashikagura": _64, "higashikawa": _64, "hiroo": _64, "hokuryu": _64, "hokut