@canonry/canonry 4.136.0 → 4.136.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +4 -0
- package/assets/agent-workspace/skills/canonry/references/indexing.md +26 -12
- package/assets/assets/{AuditHistoryPanel-DKaiIlcO.js → AuditHistoryPanel-DtUGiN21.js} +1 -1
- package/assets/assets/{BacklinksPage-Z2_ws8c2.js → BacklinksPage-BGwtmwfz.js} +1 -1
- package/assets/assets/{ChartPrimitives-CF_ocuvj.js → ChartPrimitives-Df2UC1g3.js} +1 -1
- package/assets/assets/{HistoryPage-DDKO8_D8.js → HistoryPage-AtaMVEUx.js} +1 -1
- package/assets/assets/ProjectPage-OlBjxXNx.js +8 -0
- package/assets/assets/{RunRow-BhtCgyqA.js → RunRow-Cmf-5xVo.js} +1 -1
- package/assets/assets/{RunsPage-B8Nw3wP-.js → RunsPage-BAPy9Yri.js} +1 -1
- package/assets/assets/{SettingsPage-DsmQhytl.js → SettingsPage-BXO7WpTo.js} +1 -1
- package/assets/assets/{TrafficPage-COJs6eRH.js → TrafficPage-IH-wiPu2.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-BI6IwzMQ.js → TrafficSourceDetailPage-CTTN-P52.js} +1 -1
- package/assets/assets/{arrow-left-C-lGPq-u.js → arrow-left-BwzAIeJ_.js} +1 -1
- package/assets/assets/{extract-error-message-8h0hF1I1.js → extract-error-message-BIcIoJLN.js} +1 -1
- package/assets/assets/index-BPpSrJY0.js +210 -0
- package/assets/assets/index-CglduHCN.css +1 -0
- package/assets/assets/{trash-2-CnOZwYKe.js → trash-2-C50OeBAV.js} +1 -1
- package/assets/index.html +2 -2
- package/dist/{chunk-PXEEWJRV.js → chunk-GGIRLRAY.js} +3093 -399
- package/dist/{chunk-3PFRVEWP.js → chunk-MXR3GI5L.js} +54 -122
- package/dist/{chunk-PAR6P5H6.js → chunk-SMFUCXHI.js} +132 -6
- package/dist/{chunk-TPVMHYHD.js → chunk-YVMQWVNY.js} +291 -206
- package/dist/cli.js +184 -15
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-BMEJ5GFZ.js → intelligence-service-BD6BHTEJ.js} +2 -2
- package/dist/mcp.js +2 -2
- package/package.json +9 -9
- package/assets/assets/ProjectPage-hmNsqBov.js +0 -8
- package/assets/assets/index-B4ksyQXo.css +0 -1
- package/assets/assets/index-BoSfFv1t.js +0 -210
|
@@ -300,6 +300,2914 @@ var gaMeasurementAnalysisDtoSchema = z2.object({
|
|
|
300
300
|
})
|
|
301
301
|
});
|
|
302
302
|
|
|
303
|
+
// ../../node_modules/.pnpm/uc.micro@3.0.0/node_modules/uc.micro/build/index.mjs
|
|
304
|
+
var Any = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
|
|
305
|
+
var Cc = /[\0-\x1F\x7F-\x9F]/;
|
|
306
|
+
var P = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B60\u1B7D-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDEAD\uDED0\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]/;
|
|
307
|
+
var Z = /[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/;
|
|
308
|
+
|
|
309
|
+
// ../../node_modules/.pnpm/linkify-it@6.1.0/node_modules/linkify-it/build/index.mjs
|
|
310
|
+
var REBuilder = class {
|
|
311
|
+
src_Any = Any.source;
|
|
312
|
+
src_Cc = Cc.source;
|
|
313
|
+
src_Z = Z.source;
|
|
314
|
+
src_P = P.source;
|
|
315
|
+
src_ZPCc = [
|
|
316
|
+
this.src_Z,
|
|
317
|
+
this.src_P,
|
|
318
|
+
this.src_Cc
|
|
319
|
+
].join("|");
|
|
320
|
+
src_ZCc = [this.src_Z, this.src_Cc].join("|");
|
|
321
|
+
cache = {};
|
|
322
|
+
opts = {
|
|
323
|
+
maxLength: 1e4,
|
|
324
|
+
urlAuth: false,
|
|
325
|
+
schema_names: []
|
|
326
|
+
};
|
|
327
|
+
constructor(opts = {}) {
|
|
328
|
+
this.opts = {
|
|
329
|
+
...this.opts,
|
|
330
|
+
...opts
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
set(opts = {}) {
|
|
334
|
+
this.opts = {
|
|
335
|
+
...this.opts,
|
|
336
|
+
...opts
|
|
337
|
+
};
|
|
338
|
+
this.cache = {};
|
|
339
|
+
return this;
|
|
340
|
+
}
|
|
341
|
+
escapeRE(str) {
|
|
342
|
+
return str.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
|
|
343
|
+
}
|
|
344
|
+
nestedPairRE(open, close, depth = 4) {
|
|
345
|
+
const openRE = this.escapeRE(open);
|
|
346
|
+
const closeRE = this.escapeRE(close);
|
|
347
|
+
const atom = `(?:(?!${this.src_ZCc}|${openRE}|${closeRE}).)`;
|
|
348
|
+
let pair = `${openRE}${atom}{0,1000}${closeRE}`;
|
|
349
|
+
for (let level = 2; level <= depth; level++) pair = `${openRE}(?:${atom}|${pair}){0,1000}${closeRE}`;
|
|
350
|
+
return pair;
|
|
351
|
+
}
|
|
352
|
+
get_text_separators() {
|
|
353
|
+
return this.cache.text_separators ??= /[><\uff5c]/;
|
|
354
|
+
}
|
|
355
|
+
get_pseudo_letter() {
|
|
356
|
+
return this.cache.src_pseudo_letter ??= new RegExp(`(?:(?!${this.get_text_separators().source}|${this.src_ZPCc})${this.src_Any})`);
|
|
357
|
+
}
|
|
358
|
+
get_ipv4_addr() {
|
|
359
|
+
return this.cache.src_ip4 ??= /* @__PURE__ */ new RegExp("(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])[.]){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])");
|
|
360
|
+
}
|
|
361
|
+
get_ipv6_addr() {
|
|
362
|
+
const h16 = "[0-9A-Fa-f]{1,4}";
|
|
363
|
+
const ls32 = `(?:(?:${h16}:${h16})|${this.get_ipv4_addr().source})`;
|
|
364
|
+
return this.cache.src_ip6_addr ??= new RegExp(`(?:(?:${h16}:){6}${ls32}|::(?:${h16}:){5}${ls32}|(?:${h16})?::(?:${h16}:){4}${ls32}|(?:(?:${h16}:){0,1}${h16})?::(?:${h16}:){3}${ls32}|(?:(?:${h16}:){0,2}${h16})?::(?:${h16}:){2}${ls32}|(?:(?:${h16}:){0,3}${h16})?::${h16}:${ls32}|(?:(?:${h16}:){0,4}${h16})?::${ls32}|(?:(?:${h16}:){0,5}${h16})?::${h16}|(?:(?:${h16}:){0,6}${h16})?::)`);
|
|
365
|
+
}
|
|
366
|
+
get_ipv6_url_host() {
|
|
367
|
+
return this.cache.src_ip6_host ??= new RegExp(`\\[${this.get_ipv6_addr().source}\\]`);
|
|
368
|
+
}
|
|
369
|
+
get_ipv6_mail_host() {
|
|
370
|
+
return this.cache.src_ipv6_mail_host ??= new RegExp(`\\[IPv6:${this.get_ipv6_addr().source}\\]`);
|
|
371
|
+
}
|
|
372
|
+
get_auth() {
|
|
373
|
+
return this.cache.src_auth ??= new RegExp(`(?:(?:(?!${this.src_ZCc}|[@/\\[\\]()]).){1,50}@)?`);
|
|
374
|
+
}
|
|
375
|
+
get_port() {
|
|
376
|
+
return this.cache.src_port ??= /* @__PURE__ */ new RegExp("(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?");
|
|
377
|
+
}
|
|
378
|
+
get_host_terminator() {
|
|
379
|
+
return this.cache.src_host_terminator ??= new RegExp(`(?=$|${this.get_text_separators().source}|${this.src_ZPCc})(?!${this.opts["---"] ? "-(?!--)|" : "-|"}_|:\\d|\\.-|\\.(?!$|${this.src_ZPCc}))`);
|
|
380
|
+
}
|
|
381
|
+
get_path_terminator() {
|
|
382
|
+
return this.cache.src_path_terminator ??= new RegExp(`${this.src_ZPCc}|${this.get_text_separators().source}`);
|
|
383
|
+
}
|
|
384
|
+
get_path() {
|
|
385
|
+
return this.cache.src_path ??= new RegExp(`(?:[/?#](?:${this.nestedPairRE("[", "]")}|${this.nestedPairRE("(", ")")}|${this.nestedPairRE("{", "}")}|\\"(?:(?!${this.src_ZCc}|["]).){1,100}\\"|\\'(?:(?!${this.src_ZCc}|[']).){1,100}\\'|\\'(?=${this.get_pseudo_letter().source}|[-])|\\.{2,20}[:]?[a-zA-Z0-9%/&]|\\.(?!${this.src_ZCc}|[.]|$)|` + (this.opts["---"] ? "\\-(?!--(?:[^-]|$))(?:-{0,19})|" : "\\-{1,20}|") + `,(?!${this.src_ZCc}|$)|;(?!${this.src_ZCc}|$)|\\!{1,20}(?!${this.src_ZCc}|[!]|$)|\\?(?!${this.src_ZCc}|[?]|$)|` + this.get_path_extra().source + `[\\\\/:%@#&=_~*]|(?!${this.get_path_terminator().source}).){1,${this.opts.maxLength}}|\\/)?`);
|
|
386
|
+
}
|
|
387
|
+
get_mail_name() {
|
|
388
|
+
return this.cache.src_mail_name ??= /* @__PURE__ */ new RegExp("[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9](?:[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9]|[.](?=[-!#$%&'*+/=?^_`{|}~a-zA-Z0-9])){0,63}");
|
|
389
|
+
}
|
|
390
|
+
get_xn() {
|
|
391
|
+
return this.cache.src_xn ??= /* @__PURE__ */ new RegExp("xn--[a-z0-9\\-]{1,59}");
|
|
392
|
+
}
|
|
393
|
+
get_tld() {
|
|
394
|
+
if (this.cache.tld) return this.cache.tld;
|
|
395
|
+
const tlds_src = [...new Set(this.opts.tlds || [])].sort().reverse().join("|");
|
|
396
|
+
this.cache.tld = new RegExp(`${tlds_src || "$#none#$"}|${this.get_xn().source}`);
|
|
397
|
+
return this.cache.tld;
|
|
398
|
+
}
|
|
399
|
+
get_domain_root() {
|
|
400
|
+
return this.cache.src_domain_root ??= new RegExp("(?:" + this.get_xn().source + `|${this.get_pseudo_letter().source}{1,63})`);
|
|
401
|
+
}
|
|
402
|
+
get_domain() {
|
|
403
|
+
return this.cache.src_domain ??= new RegExp("(?:" + this.get_xn().source + `|(?:${this.get_pseudo_letter().source})|(?:${this.get_pseudo_letter().source}(?:-|${this.get_pseudo_letter().source}){0,61}${this.get_pseudo_letter().source}))`);
|
|
404
|
+
}
|
|
405
|
+
get_url_host_port() {
|
|
406
|
+
return this.cache.url_host_port ??= new RegExp("(?:" + this.get_ipv6_url_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,10}${this.get_domain().source}))` + this.get_port().source + this.get_host_terminator().source);
|
|
407
|
+
}
|
|
408
|
+
get_fuzzy_url_host_port() {
|
|
409
|
+
return this.cache.fuzzy_url_host_port ??= new RegExp("(?:" + (this.opts.fuzzyIP ? this.get_ipv4_addr().source + "|" : "") + `(?:(?:(?:${this.get_domain().source})\\.){1,10}(?:${this.get_tld().source})))` + this.get_host_terminator().source);
|
|
410
|
+
}
|
|
411
|
+
get_mail_host() {
|
|
412
|
+
return this.cache.src_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})\\.){0,4}${this.get_domain().source}))` + this.get_host_terminator().source);
|
|
413
|
+
}
|
|
414
|
+
get_fuzzy_mail_host() {
|
|
415
|
+
return this.cache.src_fuzzy_mail_host ??= new RegExp("(?:" + this.get_ipv6_mail_host().source + `|(?:(?:(?:${this.get_domain().source})[.]){1,4}${this.get_domain_root().source}))` + this.get_host_terminator().source);
|
|
416
|
+
}
|
|
417
|
+
get_path_extra() {
|
|
418
|
+
return this.cache.src_path_extra ??= /* @__PURE__ */ new RegExp("");
|
|
419
|
+
}
|
|
420
|
+
get_fuzzy_mail_host_search() {
|
|
421
|
+
return this.cache.mail_fuzzy_host_search ??= new RegExp(`@${this.get_fuzzy_mail_host().source}`, "ig");
|
|
422
|
+
}
|
|
423
|
+
get_fuzzy_link_search() {
|
|
424
|
+
return this.cache.link_fuzzy_search ??= new RegExp(`(^|(?![.:/\\-_@])(?:[$+<=>^\`|\uFF5C]|${this.src_ZPCc}))(?:(?![$+<=>^\`|\uFF5C])${this.get_fuzzy_url_host_port().source}${this.get_path().source})`, "ig");
|
|
425
|
+
}
|
|
426
|
+
get_http_validator() {
|
|
427
|
+
return this.cache.http_validator ??= new RegExp("\\/\\/" + (this.opts.urlAuth ? this.get_auth().source : "") + this.get_url_host_port().source + this.get_path().source, "iy");
|
|
428
|
+
}
|
|
429
|
+
get_relative_proto_validator() {
|
|
430
|
+
return this.cache.relative_proto_validator ??= new RegExp((this.opts.urlAuth ? this.get_auth().source : "") + `(?:localhost|${this.get_ipv6_url_host().source}|(?:(?:${this.get_domain().source})[.]){1,10}${this.get_domain_root().source})` + this.get_port().source + this.get_host_terminator().source + this.get_path().source, "iy");
|
|
431
|
+
}
|
|
432
|
+
get_mail_name_validator() {
|
|
433
|
+
return this.cache.mail_name_validator ??= new RegExp(`(?:^|${this.get_text_separators().source}|"|\\(|${this.src_ZCc})(${this.get_mail_name().source})$`);
|
|
434
|
+
}
|
|
435
|
+
get_mailto_validator() {
|
|
436
|
+
return this.cache.mailto_validator ??= new RegExp(`${this.get_mail_name().source}@${this.get_mail_host().source}`, "iy");
|
|
437
|
+
}
|
|
438
|
+
get_schema_names() {
|
|
439
|
+
return this.cache.schema_names ??= new RegExp((this.opts.schema_names || []).map((name) => this.escapeRE(name)).join("|"));
|
|
440
|
+
}
|
|
441
|
+
get_schema_search() {
|
|
442
|
+
return this.cache.schema_search ??= new RegExp(`(^|(?!_)(?:[><\uFF5C]|${this.src_ZPCc}))(${this.get_schema_names().source})`, "ig");
|
|
443
|
+
}
|
|
444
|
+
get_schema_at_start() {
|
|
445
|
+
return this.cache.schema_at_start ??= new RegExp(`^${this.get_schema_search().source}`, "i");
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
var web_schema = {
|
|
449
|
+
validate: (text, pos, self) => {
|
|
450
|
+
const re = self.re.get_http_validator();
|
|
451
|
+
re.lastIndex = pos;
|
|
452
|
+
const m = re.exec(text);
|
|
453
|
+
return m ? m[0].length : 0;
|
|
454
|
+
},
|
|
455
|
+
normalize: (match, self) => self.normalize(match)
|
|
456
|
+
};
|
|
457
|
+
var defaultSchemas = {
|
|
458
|
+
"http:": web_schema,
|
|
459
|
+
"https:": web_schema,
|
|
460
|
+
"ftp:": web_schema,
|
|
461
|
+
"//": {
|
|
462
|
+
validate: function(text, pos, self) {
|
|
463
|
+
const re = self.re.get_relative_proto_validator();
|
|
464
|
+
re.lastIndex = pos;
|
|
465
|
+
const m = re.exec(text);
|
|
466
|
+
if (m) {
|
|
467
|
+
if (pos >= 3 && text[pos - 3] === ":") return 0;
|
|
468
|
+
if (pos >= 3 && text[pos - 3] === "/") return 0;
|
|
469
|
+
return m[0].length;
|
|
470
|
+
}
|
|
471
|
+
return 0;
|
|
472
|
+
},
|
|
473
|
+
normalize: (match, self) => self.normalize(match)
|
|
474
|
+
},
|
|
475
|
+
"mailto:": {
|
|
476
|
+
validate: function(text, pos, self) {
|
|
477
|
+
const re = self.re.get_mailto_validator();
|
|
478
|
+
re.lastIndex = pos;
|
|
479
|
+
const m = re.exec(text);
|
|
480
|
+
return m ? m[0].length : 0;
|
|
481
|
+
},
|
|
482
|
+
normalize: (match, self) => self.normalize(match)
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
var tlds_2ch = "a:cdefgilmnoqrstuwxz|b:abdefghijmnorstvwyz|c:acdfghiklmnoruvwxyz|d:ejkmoz|e:cegrstu|f:ijkmor|g:abdefghilmnpqrstuwy|h:kmnrtu|i:delmnoqrst|j:emop|k:eghimnprwyz|l:abcikrstuvy|m:acdeghklmnopqrstuvwxyz|n:acefgilopruz|o:m|p:aefghklmnrstwy|q:a|r:eosuw|s:abcdeghijklmnortuvxyz|t:cdfghjklmnortvwz|u:agksyz|v:aceginu|w:fs|y:et|z:amw";
|
|
486
|
+
var tlds_default = "biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444";
|
|
487
|
+
function unpackTlds() {
|
|
488
|
+
const result = tlds_default.split("|");
|
|
489
|
+
tlds_2ch.split("|").forEach((item) => {
|
|
490
|
+
const sep = item.indexOf(":");
|
|
491
|
+
const prefix = item.slice(0, sep);
|
|
492
|
+
for (const suffix of item.slice(sep + 1)) result.push(prefix + suffix);
|
|
493
|
+
});
|
|
494
|
+
return result;
|
|
495
|
+
}
|
|
496
|
+
var defaultOptions = {
|
|
497
|
+
fuzzyLink: false,
|
|
498
|
+
fuzzyEmail: true,
|
|
499
|
+
fuzzyIP: false,
|
|
500
|
+
"---": false,
|
|
501
|
+
tlds: unpackTlds(),
|
|
502
|
+
urlAuth: false,
|
|
503
|
+
maxLength: 1e4
|
|
504
|
+
};
|
|
505
|
+
var Match = class {
|
|
506
|
+
/** Prefix (protocol) for matched string. Empty for fuzzy links. */
|
|
507
|
+
schema;
|
|
508
|
+
/** First position of matched string. */
|
|
509
|
+
index;
|
|
510
|
+
/** Next position after matched string. */
|
|
511
|
+
lastIndex;
|
|
512
|
+
/** Matched string. */
|
|
513
|
+
raw;
|
|
514
|
+
/** Normalized text of matched string. */
|
|
515
|
+
text;
|
|
516
|
+
/** Normalized URL of matched string. */
|
|
517
|
+
url;
|
|
518
|
+
constructor(text, schema, index, lastIndex) {
|
|
519
|
+
const raw = text.slice(index, lastIndex);
|
|
520
|
+
this.schema = schema.toLowerCase();
|
|
521
|
+
this.index = index;
|
|
522
|
+
this.lastIndex = lastIndex;
|
|
523
|
+
this.raw = raw;
|
|
524
|
+
this.text = raw;
|
|
525
|
+
this.url = raw;
|
|
526
|
+
}
|
|
527
|
+
};
|
|
528
|
+
var LinkifyIt = class {
|
|
529
|
+
__opts__;
|
|
530
|
+
__schemas__;
|
|
531
|
+
re;
|
|
532
|
+
/**
|
|
533
|
+
* Creates new linkifier instance.
|
|
534
|
+
*
|
|
535
|
+
* By default understands:
|
|
536
|
+
*
|
|
537
|
+
* - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links
|
|
538
|
+
* - "fuzzy" emails (foo@bar.com).
|
|
539
|
+
*
|
|
540
|
+
* See {@link LinkifyConstructorOptions} for available options.
|
|
541
|
+
*
|
|
542
|
+
* @param options Recognition options.
|
|
543
|
+
*
|
|
544
|
+
* @example
|
|
545
|
+
* ```javascript
|
|
546
|
+
* import { LinkifyIt } from 'linkify-it'
|
|
547
|
+
*
|
|
548
|
+
* const linkify = new LinkifyIt({ fuzzyLink: true })
|
|
549
|
+
*
|
|
550
|
+
* linkify
|
|
551
|
+
* .tlds(require('tlds')) // Reload with full TLD list
|
|
552
|
+
* .tlds('onion', true) // Add unofficial `.onion` domain
|
|
553
|
+
* .add('ftp:', null) // Disable `ftp:` protocol
|
|
554
|
+
* .set({ fuzzyIP: true }) // Enable IPs in fuzzy links
|
|
555
|
+
*
|
|
556
|
+
* console.log(linkify.test('Site github.com!')) // true
|
|
557
|
+
* console.log(linkify.match('Site github.com!'))
|
|
558
|
+
* ```
|
|
559
|
+
*/
|
|
560
|
+
constructor(options = {}) {
|
|
561
|
+
const { rebuilder, ...linkifyOptions } = options;
|
|
562
|
+
this.__opts__ = {
|
|
563
|
+
...defaultOptions,
|
|
564
|
+
...linkifyOptions
|
|
565
|
+
};
|
|
566
|
+
this.__schemas__ = { ...defaultSchemas };
|
|
567
|
+
this.re = rebuilder || new REBuilder();
|
|
568
|
+
this.re.set({
|
|
569
|
+
...this.__opts__,
|
|
570
|
+
schema_names: Object.keys(this.__schemas__)
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Add new rule definition.
|
|
575
|
+
*
|
|
576
|
+
* `schema` is a link prefix (usually, protocol name with `:` at the end,
|
|
577
|
+
* `skype:` for example). `linkify-it` makes sure that prefix is not
|
|
578
|
+
* preceded with alphanumeric char and symbols. Only whitespaces and
|
|
579
|
+
* punctuation allowed.
|
|
580
|
+
*
|
|
581
|
+
* `definition` is a rule to check tail after link prefix. To disable an
|
|
582
|
+
* existing rule, pass `null`.
|
|
583
|
+
*
|
|
584
|
+
* @param schema Rule name (fixed pattern prefix).
|
|
585
|
+
* @param definition Schema definition, or `null` to disable the rule.
|
|
586
|
+
*
|
|
587
|
+
* See [twitter mentions example](https://github.com/markdown-it/linkify-it/blob/master/examples/twitter.mjs).
|
|
588
|
+
*/
|
|
589
|
+
add(schema, definition = null) {
|
|
590
|
+
if (!definition) delete this.__schemas__[schema];
|
|
591
|
+
else {
|
|
592
|
+
const def = {
|
|
593
|
+
normalize: (match, self) => self.normalize(match),
|
|
594
|
+
...definition
|
|
595
|
+
};
|
|
596
|
+
this.__schemas__[schema] = def;
|
|
597
|
+
}
|
|
598
|
+
this.re.set({
|
|
599
|
+
...this.__opts__,
|
|
600
|
+
schema_names: Object.keys(this.__schemas__)
|
|
601
|
+
});
|
|
602
|
+
return this;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Set recognition options for links without schema.
|
|
606
|
+
*
|
|
607
|
+
* @param options Recognition options.
|
|
608
|
+
*/
|
|
609
|
+
set(options = {}) {
|
|
610
|
+
this.__opts__ = {
|
|
611
|
+
...this.__opts__,
|
|
612
|
+
...options
|
|
613
|
+
};
|
|
614
|
+
this.re.set({
|
|
615
|
+
...this.__opts__,
|
|
616
|
+
schema_names: Object.keys(this.__schemas__)
|
|
617
|
+
});
|
|
618
|
+
return this;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Searches linkifiable pattern and returns `true` on success or `false` on fail.
|
|
622
|
+
*
|
|
623
|
+
* @param text Text to scan.
|
|
624
|
+
*/
|
|
625
|
+
test(text) {
|
|
626
|
+
if (!text.length) return false;
|
|
627
|
+
let m, re;
|
|
628
|
+
re = this.re.get_schema_search();
|
|
629
|
+
re.lastIndex = 0;
|
|
630
|
+
while ((m = re.exec(text)) !== null) if (this.testSchemaAt(text, m[2], re.lastIndex)) return true;
|
|
631
|
+
if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
|
|
632
|
+
re = this.re.get_fuzzy_link_search();
|
|
633
|
+
re.lastIndex = 0;
|
|
634
|
+
if (re.exec(text) !== null) return true;
|
|
635
|
+
}
|
|
636
|
+
if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
|
|
637
|
+
if (text.indexOf("@") >= 0) {
|
|
638
|
+
const mailHostRe = this.re.get_fuzzy_mail_host_search();
|
|
639
|
+
const mailNameRe = this.re.get_mail_name_validator();
|
|
640
|
+
mailHostRe.lastIndex = 0;
|
|
641
|
+
while ((m = mailHostRe.exec(text)) !== null) {
|
|
642
|
+
const name = text.slice(Math.max(0, m.index - 65), m.index);
|
|
643
|
+
if (mailNameRe.test(name)) return true;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
return false;
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Similar to {@link LinkifyIt.test} but checks only specific protocol tail exactly
|
|
651
|
+
* at given position. Returns length of found pattern (0 on fail).
|
|
652
|
+
*
|
|
653
|
+
* @param text Text to scan.
|
|
654
|
+
* @param schema Rule (schema) name.
|
|
655
|
+
* @param pos Text offset to check from.
|
|
656
|
+
*/
|
|
657
|
+
testSchemaAt(text, schema, pos) {
|
|
658
|
+
if (!this.__schemas__[schema.toLowerCase()]) return 0;
|
|
659
|
+
return this.__schemas__[schema.toLowerCase()].validate(text.slice(0, pos + this.__opts__.maxLength), pos, this);
|
|
660
|
+
}
|
|
661
|
+
/**
|
|
662
|
+
* Returns array of found link descriptions or `null` on fail. We strongly
|
|
663
|
+
* recommend to use {@link LinkifyIt.test} first, for best speed.
|
|
664
|
+
*
|
|
665
|
+
* @param text Text to scan.
|
|
666
|
+
*/
|
|
667
|
+
match(text) {
|
|
668
|
+
const result = [];
|
|
669
|
+
const schemaRe = this.re.get_schema_search();
|
|
670
|
+
let fuzzyLinkRe;
|
|
671
|
+
let mailHostRe;
|
|
672
|
+
let mailNameRe;
|
|
673
|
+
let fuzzyLinkCandidate;
|
|
674
|
+
let fuzzyEmailCandidate;
|
|
675
|
+
let schemaPrefix;
|
|
676
|
+
let schemaDone = false;
|
|
677
|
+
let fuzzyLinkDone = false;
|
|
678
|
+
let fuzzyEmailDone = false;
|
|
679
|
+
let pos = 0;
|
|
680
|
+
if (!text.length) return null;
|
|
681
|
+
schemaRe.lastIndex = 0;
|
|
682
|
+
if (this.__opts__.fuzzyLink && this.__schemas__["http:"]) {
|
|
683
|
+
fuzzyLinkRe = this.re.get_fuzzy_link_search();
|
|
684
|
+
fuzzyLinkRe.lastIndex = 0;
|
|
685
|
+
}
|
|
686
|
+
if (this.__opts__.fuzzyEmail && this.__schemas__["mailto:"]) {
|
|
687
|
+
mailHostRe = this.re.get_fuzzy_mail_host_search();
|
|
688
|
+
mailHostRe.lastIndex = 0;
|
|
689
|
+
mailNameRe = this.re.get_mail_name_validator();
|
|
690
|
+
}
|
|
691
|
+
for (; ; ) {
|
|
692
|
+
const scanFrom = Math.max(pos - 1, 0);
|
|
693
|
+
if (mailHostRe && mailNameRe && !fuzzyEmailDone && (!fuzzyEmailCandidate || fuzzyEmailCandidate.index < pos)) {
|
|
694
|
+
if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
|
|
695
|
+
for (; ; ) {
|
|
696
|
+
const m = mailHostRe.exec(text);
|
|
697
|
+
if (!m) {
|
|
698
|
+
fuzzyEmailDone = true;
|
|
699
|
+
fuzzyEmailCandidate = void 0;
|
|
700
|
+
break;
|
|
701
|
+
}
|
|
702
|
+
const name = mailNameRe.exec(text.slice(Math.max(0, m.index - 65), m.index));
|
|
703
|
+
if (!name) continue;
|
|
704
|
+
fuzzyEmailCandidate = {
|
|
705
|
+
schema: "mailto:",
|
|
706
|
+
index: m.index - name[1].length,
|
|
707
|
+
lastIndex: m.index + m[0].length
|
|
708
|
+
};
|
|
709
|
+
if (fuzzyEmailCandidate.index >= pos) break;
|
|
710
|
+
if (mailHostRe.lastIndex < scanFrom) mailHostRe.lastIndex = scanFrom;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
if (fuzzyLinkRe && !fuzzyLinkDone && (!fuzzyLinkCandidate || fuzzyLinkCandidate.index < pos)) {
|
|
714
|
+
if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
|
|
715
|
+
for (; ; ) {
|
|
716
|
+
const m = fuzzyLinkRe.exec(text);
|
|
717
|
+
if (!m) {
|
|
718
|
+
fuzzyLinkDone = true;
|
|
719
|
+
fuzzyLinkCandidate = void 0;
|
|
720
|
+
break;
|
|
721
|
+
}
|
|
722
|
+
fuzzyLinkCandidate = {
|
|
723
|
+
schema: "",
|
|
724
|
+
index: m.index + m[1].length,
|
|
725
|
+
lastIndex: m.index + m[0].length
|
|
726
|
+
};
|
|
727
|
+
if (fuzzyLinkCandidate.index >= pos) break;
|
|
728
|
+
if (fuzzyLinkRe.lastIndex < scanFrom) fuzzyLinkRe.lastIndex = scanFrom;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
let fuzzyCandidate = fuzzyEmailCandidate;
|
|
732
|
+
if (!fuzzyCandidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < fuzzyCandidate.index || fuzzyLinkCandidate.index === fuzzyCandidate.index && fuzzyLinkCandidate.lastIndex > fuzzyCandidate.lastIndex)) fuzzyCandidate = fuzzyLinkCandidate;
|
|
733
|
+
let schemaCandidate;
|
|
734
|
+
if (!schemaDone) for (; ; ) {
|
|
735
|
+
if (!schemaPrefix) {
|
|
736
|
+
if (schemaRe.lastIndex < scanFrom) schemaRe.lastIndex = scanFrom;
|
|
737
|
+
const m = schemaRe.exec(text);
|
|
738
|
+
if (!m) {
|
|
739
|
+
schemaDone = true;
|
|
740
|
+
break;
|
|
741
|
+
}
|
|
742
|
+
schemaPrefix = {
|
|
743
|
+
schema: m[2],
|
|
744
|
+
index: m.index + m[1].length,
|
|
745
|
+
lastIndex: m.index + m[0].length
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
if (schemaPrefix.index < pos) {
|
|
749
|
+
schemaPrefix = void 0;
|
|
750
|
+
continue;
|
|
751
|
+
}
|
|
752
|
+
if (fuzzyCandidate && schemaPrefix.index > fuzzyCandidate.index) break;
|
|
753
|
+
const prefix = schemaPrefix;
|
|
754
|
+
schemaPrefix = void 0;
|
|
755
|
+
const len = this.testSchemaAt(text, prefix.schema, prefix.lastIndex);
|
|
756
|
+
if (len) {
|
|
757
|
+
schemaCandidate = {
|
|
758
|
+
schema: prefix.schema,
|
|
759
|
+
index: prefix.index,
|
|
760
|
+
lastIndex: prefix.lastIndex + len
|
|
761
|
+
};
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
let candidate = schemaCandidate;
|
|
766
|
+
if (!candidate || fuzzyEmailCandidate && (fuzzyEmailCandidate.index < candidate.index || fuzzyEmailCandidate.index === candidate.index && fuzzyEmailCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyEmailCandidate;
|
|
767
|
+
if (!candidate || fuzzyLinkCandidate && (fuzzyLinkCandidate.index < candidate.index || fuzzyLinkCandidate.index === candidate.index && fuzzyLinkCandidate.lastIndex > candidate.lastIndex)) candidate = fuzzyLinkCandidate;
|
|
768
|
+
if (!candidate) break;
|
|
769
|
+
if (candidate === fuzzyEmailCandidate) fuzzyEmailCandidate = void 0;
|
|
770
|
+
else if (candidate === fuzzyLinkCandidate) fuzzyLinkCandidate = void 0;
|
|
771
|
+
const match = new Match(text, candidate.schema, candidate.index, candidate.lastIndex);
|
|
772
|
+
if (match.schema) this.__schemas__[match.schema].normalize(match, this);
|
|
773
|
+
else this.normalize(match);
|
|
774
|
+
result.push(match);
|
|
775
|
+
pos = candidate.lastIndex;
|
|
776
|
+
}
|
|
777
|
+
if (result.length) return result;
|
|
778
|
+
return null;
|
|
779
|
+
}
|
|
780
|
+
/**
|
|
781
|
+
* Returns fully-formed (not fuzzy) link if it starts at the beginning
|
|
782
|
+
* of the string, and null otherwise.
|
|
783
|
+
*
|
|
784
|
+
* @param text Text to scan.
|
|
785
|
+
*/
|
|
786
|
+
matchAtStart(text) {
|
|
787
|
+
if (!text.length) return null;
|
|
788
|
+
const m = this.re.get_schema_at_start().exec(text);
|
|
789
|
+
if (!m) return null;
|
|
790
|
+
const len = this.testSchemaAt(text, m[2], m[0].length);
|
|
791
|
+
if (!len) return null;
|
|
792
|
+
const match = new Match(text, m[2], m.index + m[1].length, m.index + m[0].length + len);
|
|
793
|
+
this.__schemas__[match.schema].normalize(match, this);
|
|
794
|
+
return match;
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Load (or merge) new TLDs list. Those are used for fuzzy links (without
|
|
798
|
+
* prefix) to avoid false positives. By default this algorithm is used:
|
|
799
|
+
*
|
|
800
|
+
* - hostname with any 2-letter root zones are ok.
|
|
801
|
+
* - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф
|
|
802
|
+
* are ok.
|
|
803
|
+
* - encoded (`xn--...`) root zones are ok.
|
|
804
|
+
*
|
|
805
|
+
* If list is replaced, then exact match for 2-chars root zones will be checked.
|
|
806
|
+
*
|
|
807
|
+
* @param list List of TLDs.
|
|
808
|
+
* @param keepOld Merge with current list if `true` (`false` by default).
|
|
809
|
+
*/
|
|
810
|
+
tlds(list, keepOld = false) {
|
|
811
|
+
list = Array.isArray(list) ? list : [list];
|
|
812
|
+
if (!keepOld) this.__opts__.tlds = list;
|
|
813
|
+
else this.__opts__.tlds = this.__opts__.tlds.concat(list);
|
|
814
|
+
this.re.set({
|
|
815
|
+
...this.__opts__,
|
|
816
|
+
schema_names: Object.keys(this.__schemas__)
|
|
817
|
+
});
|
|
818
|
+
return this;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Default normalizer (if schema does not define its own).
|
|
822
|
+
*
|
|
823
|
+
* @param match Match to normalize.
|
|
824
|
+
*/
|
|
825
|
+
normalize(match) {
|
|
826
|
+
if (!match.schema) match.url = `http://${match.url}`;
|
|
827
|
+
if (match.schema === "mailto:" && !/^mailto:/i.test(match.url)) match.url = `mailto:${match.url}`;
|
|
828
|
+
}
|
|
829
|
+
};
|
|
830
|
+
|
|
831
|
+
// ../../node_modules/.pnpm/tlds@1.261.0/node_modules/tlds/index.json
|
|
832
|
+
var tlds_default2 = [
|
|
833
|
+
"aaa",
|
|
834
|
+
"aarp",
|
|
835
|
+
"abb",
|
|
836
|
+
"abbott",
|
|
837
|
+
"abbvie",
|
|
838
|
+
"abc",
|
|
839
|
+
"able",
|
|
840
|
+
"abogado",
|
|
841
|
+
"abudhabi",
|
|
842
|
+
"ac",
|
|
843
|
+
"academy",
|
|
844
|
+
"accenture",
|
|
845
|
+
"accountant",
|
|
846
|
+
"accountants",
|
|
847
|
+
"aco",
|
|
848
|
+
"actor",
|
|
849
|
+
"ad",
|
|
850
|
+
"ads",
|
|
851
|
+
"adult",
|
|
852
|
+
"ae",
|
|
853
|
+
"aeg",
|
|
854
|
+
"aero",
|
|
855
|
+
"aetna",
|
|
856
|
+
"af",
|
|
857
|
+
"afl",
|
|
858
|
+
"africa",
|
|
859
|
+
"ag",
|
|
860
|
+
"agakhan",
|
|
861
|
+
"agency",
|
|
862
|
+
"ai",
|
|
863
|
+
"aig",
|
|
864
|
+
"airbus",
|
|
865
|
+
"airforce",
|
|
866
|
+
"airtel",
|
|
867
|
+
"akdn",
|
|
868
|
+
"al",
|
|
869
|
+
"alibaba",
|
|
870
|
+
"alipay",
|
|
871
|
+
"allfinanz",
|
|
872
|
+
"allstate",
|
|
873
|
+
"ally",
|
|
874
|
+
"alsace",
|
|
875
|
+
"alstom",
|
|
876
|
+
"am",
|
|
877
|
+
"amazon",
|
|
878
|
+
"americanexpress",
|
|
879
|
+
"americanfamily",
|
|
880
|
+
"amex",
|
|
881
|
+
"amfam",
|
|
882
|
+
"amica",
|
|
883
|
+
"amsterdam",
|
|
884
|
+
"analytics",
|
|
885
|
+
"android",
|
|
886
|
+
"anquan",
|
|
887
|
+
"anz",
|
|
888
|
+
"ao",
|
|
889
|
+
"aol",
|
|
890
|
+
"apartments",
|
|
891
|
+
"app",
|
|
892
|
+
"apple",
|
|
893
|
+
"aq",
|
|
894
|
+
"aquarelle",
|
|
895
|
+
"ar",
|
|
896
|
+
"arab",
|
|
897
|
+
"aramco",
|
|
898
|
+
"archi",
|
|
899
|
+
"army",
|
|
900
|
+
"arpa",
|
|
901
|
+
"art",
|
|
902
|
+
"arte",
|
|
903
|
+
"as",
|
|
904
|
+
"asda",
|
|
905
|
+
"asia",
|
|
906
|
+
"associates",
|
|
907
|
+
"at",
|
|
908
|
+
"athleta",
|
|
909
|
+
"attorney",
|
|
910
|
+
"au",
|
|
911
|
+
"auction",
|
|
912
|
+
"audi",
|
|
913
|
+
"audible",
|
|
914
|
+
"audio",
|
|
915
|
+
"auspost",
|
|
916
|
+
"author",
|
|
917
|
+
"auto",
|
|
918
|
+
"autos",
|
|
919
|
+
"aw",
|
|
920
|
+
"aws",
|
|
921
|
+
"ax",
|
|
922
|
+
"axa",
|
|
923
|
+
"az",
|
|
924
|
+
"azure",
|
|
925
|
+
"ba",
|
|
926
|
+
"baby",
|
|
927
|
+
"baidu",
|
|
928
|
+
"banamex",
|
|
929
|
+
"band",
|
|
930
|
+
"bank",
|
|
931
|
+
"bar",
|
|
932
|
+
"barcelona",
|
|
933
|
+
"barclaycard",
|
|
934
|
+
"barclays",
|
|
935
|
+
"barefoot",
|
|
936
|
+
"bargains",
|
|
937
|
+
"baseball",
|
|
938
|
+
"basketball",
|
|
939
|
+
"bauhaus",
|
|
940
|
+
"bayern",
|
|
941
|
+
"bb",
|
|
942
|
+
"bbc",
|
|
943
|
+
"bbt",
|
|
944
|
+
"bbva",
|
|
945
|
+
"bcg",
|
|
946
|
+
"bcn",
|
|
947
|
+
"bd",
|
|
948
|
+
"be",
|
|
949
|
+
"beats",
|
|
950
|
+
"beauty",
|
|
951
|
+
"beer",
|
|
952
|
+
"berlin",
|
|
953
|
+
"best",
|
|
954
|
+
"bestbuy",
|
|
955
|
+
"bet",
|
|
956
|
+
"bf",
|
|
957
|
+
"bg",
|
|
958
|
+
"bh",
|
|
959
|
+
"bharti",
|
|
960
|
+
"bi",
|
|
961
|
+
"bible",
|
|
962
|
+
"bid",
|
|
963
|
+
"bike",
|
|
964
|
+
"bing",
|
|
965
|
+
"bingo",
|
|
966
|
+
"bio",
|
|
967
|
+
"biz",
|
|
968
|
+
"bj",
|
|
969
|
+
"black",
|
|
970
|
+
"blackfriday",
|
|
971
|
+
"blockbuster",
|
|
972
|
+
"blog",
|
|
973
|
+
"bloomberg",
|
|
974
|
+
"blue",
|
|
975
|
+
"bm",
|
|
976
|
+
"bms",
|
|
977
|
+
"bmw",
|
|
978
|
+
"bn",
|
|
979
|
+
"bnpparibas",
|
|
980
|
+
"bo",
|
|
981
|
+
"boats",
|
|
982
|
+
"boehringer",
|
|
983
|
+
"bofa",
|
|
984
|
+
"bom",
|
|
985
|
+
"bond",
|
|
986
|
+
"boo",
|
|
987
|
+
"book",
|
|
988
|
+
"booking",
|
|
989
|
+
"bosch",
|
|
990
|
+
"bostik",
|
|
991
|
+
"boston",
|
|
992
|
+
"bot",
|
|
993
|
+
"boutique",
|
|
994
|
+
"box",
|
|
995
|
+
"br",
|
|
996
|
+
"bradesco",
|
|
997
|
+
"bridgestone",
|
|
998
|
+
"broadway",
|
|
999
|
+
"broker",
|
|
1000
|
+
"brother",
|
|
1001
|
+
"brussels",
|
|
1002
|
+
"bs",
|
|
1003
|
+
"bt",
|
|
1004
|
+
"build",
|
|
1005
|
+
"builders",
|
|
1006
|
+
"business",
|
|
1007
|
+
"buy",
|
|
1008
|
+
"buzz",
|
|
1009
|
+
"bv",
|
|
1010
|
+
"bw",
|
|
1011
|
+
"by",
|
|
1012
|
+
"bz",
|
|
1013
|
+
"bzh",
|
|
1014
|
+
"ca",
|
|
1015
|
+
"cab",
|
|
1016
|
+
"cafe",
|
|
1017
|
+
"cal",
|
|
1018
|
+
"call",
|
|
1019
|
+
"calvinklein",
|
|
1020
|
+
"cam",
|
|
1021
|
+
"camera",
|
|
1022
|
+
"camp",
|
|
1023
|
+
"canon",
|
|
1024
|
+
"capetown",
|
|
1025
|
+
"capital",
|
|
1026
|
+
"capitalone",
|
|
1027
|
+
"car",
|
|
1028
|
+
"caravan",
|
|
1029
|
+
"cards",
|
|
1030
|
+
"care",
|
|
1031
|
+
"career",
|
|
1032
|
+
"careers",
|
|
1033
|
+
"cars",
|
|
1034
|
+
"casa",
|
|
1035
|
+
"case",
|
|
1036
|
+
"cash",
|
|
1037
|
+
"casino",
|
|
1038
|
+
"cat",
|
|
1039
|
+
"catering",
|
|
1040
|
+
"catholic",
|
|
1041
|
+
"cba",
|
|
1042
|
+
"cbn",
|
|
1043
|
+
"cbre",
|
|
1044
|
+
"cc",
|
|
1045
|
+
"cd",
|
|
1046
|
+
"center",
|
|
1047
|
+
"ceo",
|
|
1048
|
+
"cern",
|
|
1049
|
+
"cf",
|
|
1050
|
+
"cfa",
|
|
1051
|
+
"cfd",
|
|
1052
|
+
"cg",
|
|
1053
|
+
"ch",
|
|
1054
|
+
"chanel",
|
|
1055
|
+
"channel",
|
|
1056
|
+
"charity",
|
|
1057
|
+
"chase",
|
|
1058
|
+
"chat",
|
|
1059
|
+
"cheap",
|
|
1060
|
+
"chintai",
|
|
1061
|
+
"christmas",
|
|
1062
|
+
"chrome",
|
|
1063
|
+
"church",
|
|
1064
|
+
"ci",
|
|
1065
|
+
"cipriani",
|
|
1066
|
+
"circle",
|
|
1067
|
+
"cisco",
|
|
1068
|
+
"citadel",
|
|
1069
|
+
"citi",
|
|
1070
|
+
"citic",
|
|
1071
|
+
"city",
|
|
1072
|
+
"ck",
|
|
1073
|
+
"cl",
|
|
1074
|
+
"claims",
|
|
1075
|
+
"cleaning",
|
|
1076
|
+
"click",
|
|
1077
|
+
"clinic",
|
|
1078
|
+
"clinique",
|
|
1079
|
+
"clothing",
|
|
1080
|
+
"cloud",
|
|
1081
|
+
"club",
|
|
1082
|
+
"clubmed",
|
|
1083
|
+
"cm",
|
|
1084
|
+
"cn",
|
|
1085
|
+
"co",
|
|
1086
|
+
"coach",
|
|
1087
|
+
"codes",
|
|
1088
|
+
"coffee",
|
|
1089
|
+
"college",
|
|
1090
|
+
"cologne",
|
|
1091
|
+
"com",
|
|
1092
|
+
"commbank",
|
|
1093
|
+
"community",
|
|
1094
|
+
"company",
|
|
1095
|
+
"compare",
|
|
1096
|
+
"computer",
|
|
1097
|
+
"comsec",
|
|
1098
|
+
"condos",
|
|
1099
|
+
"construction",
|
|
1100
|
+
"consulting",
|
|
1101
|
+
"contact",
|
|
1102
|
+
"contractors",
|
|
1103
|
+
"cooking",
|
|
1104
|
+
"cool",
|
|
1105
|
+
"coop",
|
|
1106
|
+
"corsica",
|
|
1107
|
+
"country",
|
|
1108
|
+
"coupon",
|
|
1109
|
+
"coupons",
|
|
1110
|
+
"courses",
|
|
1111
|
+
"cpa",
|
|
1112
|
+
"cr",
|
|
1113
|
+
"credit",
|
|
1114
|
+
"creditcard",
|
|
1115
|
+
"creditunion",
|
|
1116
|
+
"cricket",
|
|
1117
|
+
"crown",
|
|
1118
|
+
"crs",
|
|
1119
|
+
"cruise",
|
|
1120
|
+
"cruises",
|
|
1121
|
+
"cu",
|
|
1122
|
+
"cuisinella",
|
|
1123
|
+
"cv",
|
|
1124
|
+
"cw",
|
|
1125
|
+
"cx",
|
|
1126
|
+
"cy",
|
|
1127
|
+
"cymru",
|
|
1128
|
+
"cyou",
|
|
1129
|
+
"cz",
|
|
1130
|
+
"dad",
|
|
1131
|
+
"dance",
|
|
1132
|
+
"data",
|
|
1133
|
+
"date",
|
|
1134
|
+
"dating",
|
|
1135
|
+
"datsun",
|
|
1136
|
+
"day",
|
|
1137
|
+
"dclk",
|
|
1138
|
+
"dds",
|
|
1139
|
+
"de",
|
|
1140
|
+
"deal",
|
|
1141
|
+
"dealer",
|
|
1142
|
+
"deals",
|
|
1143
|
+
"degree",
|
|
1144
|
+
"delivery",
|
|
1145
|
+
"dell",
|
|
1146
|
+
"deloitte",
|
|
1147
|
+
"delta",
|
|
1148
|
+
"democrat",
|
|
1149
|
+
"dental",
|
|
1150
|
+
"dentist",
|
|
1151
|
+
"desi",
|
|
1152
|
+
"design",
|
|
1153
|
+
"dev",
|
|
1154
|
+
"dhl",
|
|
1155
|
+
"diamonds",
|
|
1156
|
+
"diet",
|
|
1157
|
+
"digital",
|
|
1158
|
+
"direct",
|
|
1159
|
+
"directory",
|
|
1160
|
+
"discount",
|
|
1161
|
+
"discover",
|
|
1162
|
+
"dish",
|
|
1163
|
+
"diy",
|
|
1164
|
+
"dj",
|
|
1165
|
+
"dk",
|
|
1166
|
+
"dm",
|
|
1167
|
+
"dnp",
|
|
1168
|
+
"do",
|
|
1169
|
+
"docs",
|
|
1170
|
+
"doctor",
|
|
1171
|
+
"dog",
|
|
1172
|
+
"domains",
|
|
1173
|
+
"dot",
|
|
1174
|
+
"download",
|
|
1175
|
+
"drive",
|
|
1176
|
+
"dtv",
|
|
1177
|
+
"dubai",
|
|
1178
|
+
"dupont",
|
|
1179
|
+
"durban",
|
|
1180
|
+
"dvag",
|
|
1181
|
+
"dvr",
|
|
1182
|
+
"dz",
|
|
1183
|
+
"earth",
|
|
1184
|
+
"eat",
|
|
1185
|
+
"ec",
|
|
1186
|
+
"eco",
|
|
1187
|
+
"edeka",
|
|
1188
|
+
"edu",
|
|
1189
|
+
"education",
|
|
1190
|
+
"ee",
|
|
1191
|
+
"eg",
|
|
1192
|
+
"email",
|
|
1193
|
+
"emerck",
|
|
1194
|
+
"energy",
|
|
1195
|
+
"engineer",
|
|
1196
|
+
"engineering",
|
|
1197
|
+
"enterprises",
|
|
1198
|
+
"epson",
|
|
1199
|
+
"equipment",
|
|
1200
|
+
"er",
|
|
1201
|
+
"ericsson",
|
|
1202
|
+
"erni",
|
|
1203
|
+
"es",
|
|
1204
|
+
"esq",
|
|
1205
|
+
"estate",
|
|
1206
|
+
"et",
|
|
1207
|
+
"eu",
|
|
1208
|
+
"eurovision",
|
|
1209
|
+
"eus",
|
|
1210
|
+
"events",
|
|
1211
|
+
"exchange",
|
|
1212
|
+
"expert",
|
|
1213
|
+
"exposed",
|
|
1214
|
+
"express",
|
|
1215
|
+
"extraspace",
|
|
1216
|
+
"fage",
|
|
1217
|
+
"fail",
|
|
1218
|
+
"fairwinds",
|
|
1219
|
+
"faith",
|
|
1220
|
+
"family",
|
|
1221
|
+
"fan",
|
|
1222
|
+
"fans",
|
|
1223
|
+
"farm",
|
|
1224
|
+
"farmers",
|
|
1225
|
+
"fashion",
|
|
1226
|
+
"fast",
|
|
1227
|
+
"fedex",
|
|
1228
|
+
"feedback",
|
|
1229
|
+
"ferrari",
|
|
1230
|
+
"ferrero",
|
|
1231
|
+
"fi",
|
|
1232
|
+
"fidelity",
|
|
1233
|
+
"fido",
|
|
1234
|
+
"film",
|
|
1235
|
+
"final",
|
|
1236
|
+
"finance",
|
|
1237
|
+
"financial",
|
|
1238
|
+
"fire",
|
|
1239
|
+
"firestone",
|
|
1240
|
+
"firmdale",
|
|
1241
|
+
"fish",
|
|
1242
|
+
"fishing",
|
|
1243
|
+
"fit",
|
|
1244
|
+
"fitness",
|
|
1245
|
+
"fj",
|
|
1246
|
+
"fk",
|
|
1247
|
+
"flickr",
|
|
1248
|
+
"flights",
|
|
1249
|
+
"flir",
|
|
1250
|
+
"florist",
|
|
1251
|
+
"flowers",
|
|
1252
|
+
"fly",
|
|
1253
|
+
"fm",
|
|
1254
|
+
"fo",
|
|
1255
|
+
"foo",
|
|
1256
|
+
"food",
|
|
1257
|
+
"football",
|
|
1258
|
+
"ford",
|
|
1259
|
+
"forex",
|
|
1260
|
+
"forsale",
|
|
1261
|
+
"forum",
|
|
1262
|
+
"foundation",
|
|
1263
|
+
"fox",
|
|
1264
|
+
"fr",
|
|
1265
|
+
"free",
|
|
1266
|
+
"fresenius",
|
|
1267
|
+
"frl",
|
|
1268
|
+
"frogans",
|
|
1269
|
+
"frontier",
|
|
1270
|
+
"ftr",
|
|
1271
|
+
"fujitsu",
|
|
1272
|
+
"fun",
|
|
1273
|
+
"fund",
|
|
1274
|
+
"furniture",
|
|
1275
|
+
"futbol",
|
|
1276
|
+
"fyi",
|
|
1277
|
+
"ga",
|
|
1278
|
+
"gal",
|
|
1279
|
+
"gallery",
|
|
1280
|
+
"gallo",
|
|
1281
|
+
"gallup",
|
|
1282
|
+
"game",
|
|
1283
|
+
"games",
|
|
1284
|
+
"gap",
|
|
1285
|
+
"garden",
|
|
1286
|
+
"gay",
|
|
1287
|
+
"gb",
|
|
1288
|
+
"gbiz",
|
|
1289
|
+
"gd",
|
|
1290
|
+
"gdn",
|
|
1291
|
+
"ge",
|
|
1292
|
+
"gea",
|
|
1293
|
+
"gent",
|
|
1294
|
+
"genting",
|
|
1295
|
+
"george",
|
|
1296
|
+
"gf",
|
|
1297
|
+
"gg",
|
|
1298
|
+
"ggee",
|
|
1299
|
+
"gh",
|
|
1300
|
+
"gi",
|
|
1301
|
+
"gift",
|
|
1302
|
+
"gifts",
|
|
1303
|
+
"gives",
|
|
1304
|
+
"giving",
|
|
1305
|
+
"gl",
|
|
1306
|
+
"glass",
|
|
1307
|
+
"gle",
|
|
1308
|
+
"global",
|
|
1309
|
+
"globo",
|
|
1310
|
+
"gm",
|
|
1311
|
+
"gmail",
|
|
1312
|
+
"gmbh",
|
|
1313
|
+
"gmo",
|
|
1314
|
+
"gmx",
|
|
1315
|
+
"gn",
|
|
1316
|
+
"godaddy",
|
|
1317
|
+
"gold",
|
|
1318
|
+
"goldpoint",
|
|
1319
|
+
"golf",
|
|
1320
|
+
"goo",
|
|
1321
|
+
"goodyear",
|
|
1322
|
+
"goog",
|
|
1323
|
+
"google",
|
|
1324
|
+
"gop",
|
|
1325
|
+
"got",
|
|
1326
|
+
"gov",
|
|
1327
|
+
"gp",
|
|
1328
|
+
"gq",
|
|
1329
|
+
"gr",
|
|
1330
|
+
"grainger",
|
|
1331
|
+
"graphics",
|
|
1332
|
+
"gratis",
|
|
1333
|
+
"green",
|
|
1334
|
+
"gripe",
|
|
1335
|
+
"grocery",
|
|
1336
|
+
"group",
|
|
1337
|
+
"gs",
|
|
1338
|
+
"gt",
|
|
1339
|
+
"gu",
|
|
1340
|
+
"gucci",
|
|
1341
|
+
"guge",
|
|
1342
|
+
"guide",
|
|
1343
|
+
"guitars",
|
|
1344
|
+
"guru",
|
|
1345
|
+
"gw",
|
|
1346
|
+
"gy",
|
|
1347
|
+
"hair",
|
|
1348
|
+
"hamburg",
|
|
1349
|
+
"hangout",
|
|
1350
|
+
"haus",
|
|
1351
|
+
"hbo",
|
|
1352
|
+
"hdfc",
|
|
1353
|
+
"hdfcbank",
|
|
1354
|
+
"health",
|
|
1355
|
+
"healthcare",
|
|
1356
|
+
"help",
|
|
1357
|
+
"helsinki",
|
|
1358
|
+
"here",
|
|
1359
|
+
"hermes",
|
|
1360
|
+
"hiphop",
|
|
1361
|
+
"hisamitsu",
|
|
1362
|
+
"hitachi",
|
|
1363
|
+
"hiv",
|
|
1364
|
+
"hk",
|
|
1365
|
+
"hkt",
|
|
1366
|
+
"hm",
|
|
1367
|
+
"hn",
|
|
1368
|
+
"hockey",
|
|
1369
|
+
"holdings",
|
|
1370
|
+
"holiday",
|
|
1371
|
+
"homedepot",
|
|
1372
|
+
"homegoods",
|
|
1373
|
+
"homes",
|
|
1374
|
+
"homesense",
|
|
1375
|
+
"honda",
|
|
1376
|
+
"horse",
|
|
1377
|
+
"hospital",
|
|
1378
|
+
"host",
|
|
1379
|
+
"hosting",
|
|
1380
|
+
"hot",
|
|
1381
|
+
"hotels",
|
|
1382
|
+
"hotmail",
|
|
1383
|
+
"house",
|
|
1384
|
+
"how",
|
|
1385
|
+
"hr",
|
|
1386
|
+
"hsbc",
|
|
1387
|
+
"ht",
|
|
1388
|
+
"hu",
|
|
1389
|
+
"hughes",
|
|
1390
|
+
"hyatt",
|
|
1391
|
+
"hyundai",
|
|
1392
|
+
"ibm",
|
|
1393
|
+
"icbc",
|
|
1394
|
+
"ice",
|
|
1395
|
+
"icu",
|
|
1396
|
+
"id",
|
|
1397
|
+
"ie",
|
|
1398
|
+
"ieee",
|
|
1399
|
+
"ifm",
|
|
1400
|
+
"ikano",
|
|
1401
|
+
"il",
|
|
1402
|
+
"im",
|
|
1403
|
+
"imamat",
|
|
1404
|
+
"imdb",
|
|
1405
|
+
"immo",
|
|
1406
|
+
"immobilien",
|
|
1407
|
+
"in",
|
|
1408
|
+
"inc",
|
|
1409
|
+
"industries",
|
|
1410
|
+
"infiniti",
|
|
1411
|
+
"info",
|
|
1412
|
+
"ing",
|
|
1413
|
+
"ink",
|
|
1414
|
+
"institute",
|
|
1415
|
+
"insurance",
|
|
1416
|
+
"insure",
|
|
1417
|
+
"int",
|
|
1418
|
+
"international",
|
|
1419
|
+
"intuit",
|
|
1420
|
+
"investments",
|
|
1421
|
+
"io",
|
|
1422
|
+
"ipiranga",
|
|
1423
|
+
"iq",
|
|
1424
|
+
"ir",
|
|
1425
|
+
"irish",
|
|
1426
|
+
"is",
|
|
1427
|
+
"ismaili",
|
|
1428
|
+
"ist",
|
|
1429
|
+
"istanbul",
|
|
1430
|
+
"it",
|
|
1431
|
+
"itau",
|
|
1432
|
+
"itv",
|
|
1433
|
+
"jaguar",
|
|
1434
|
+
"java",
|
|
1435
|
+
"jcb",
|
|
1436
|
+
"je",
|
|
1437
|
+
"jeep",
|
|
1438
|
+
"jetzt",
|
|
1439
|
+
"jewelry",
|
|
1440
|
+
"jio",
|
|
1441
|
+
"jll",
|
|
1442
|
+
"jm",
|
|
1443
|
+
"jmp",
|
|
1444
|
+
"jnj",
|
|
1445
|
+
"jo",
|
|
1446
|
+
"jobs",
|
|
1447
|
+
"joburg",
|
|
1448
|
+
"jot",
|
|
1449
|
+
"joy",
|
|
1450
|
+
"jp",
|
|
1451
|
+
"jpmorgan",
|
|
1452
|
+
"jprs",
|
|
1453
|
+
"juegos",
|
|
1454
|
+
"juniper",
|
|
1455
|
+
"kaufen",
|
|
1456
|
+
"kddi",
|
|
1457
|
+
"ke",
|
|
1458
|
+
"kerryhotels",
|
|
1459
|
+
"kerryproperties",
|
|
1460
|
+
"kfh",
|
|
1461
|
+
"kg",
|
|
1462
|
+
"kh",
|
|
1463
|
+
"ki",
|
|
1464
|
+
"kia",
|
|
1465
|
+
"kids",
|
|
1466
|
+
"kim",
|
|
1467
|
+
"kindle",
|
|
1468
|
+
"kitchen",
|
|
1469
|
+
"kiwi",
|
|
1470
|
+
"km",
|
|
1471
|
+
"kn",
|
|
1472
|
+
"koeln",
|
|
1473
|
+
"komatsu",
|
|
1474
|
+
"kosher",
|
|
1475
|
+
"kp",
|
|
1476
|
+
"kpmg",
|
|
1477
|
+
"kpn",
|
|
1478
|
+
"kr",
|
|
1479
|
+
"krd",
|
|
1480
|
+
"kred",
|
|
1481
|
+
"kuokgroup",
|
|
1482
|
+
"kw",
|
|
1483
|
+
"ky",
|
|
1484
|
+
"kyoto",
|
|
1485
|
+
"kz",
|
|
1486
|
+
"la",
|
|
1487
|
+
"lacaixa",
|
|
1488
|
+
"lamborghini",
|
|
1489
|
+
"lamer",
|
|
1490
|
+
"land",
|
|
1491
|
+
"landrover",
|
|
1492
|
+
"lanxess",
|
|
1493
|
+
"lasalle",
|
|
1494
|
+
"lat",
|
|
1495
|
+
"latino",
|
|
1496
|
+
"latrobe",
|
|
1497
|
+
"law",
|
|
1498
|
+
"lawyer",
|
|
1499
|
+
"lb",
|
|
1500
|
+
"lc",
|
|
1501
|
+
"lds",
|
|
1502
|
+
"lease",
|
|
1503
|
+
"leclerc",
|
|
1504
|
+
"lefrak",
|
|
1505
|
+
"legal",
|
|
1506
|
+
"lego",
|
|
1507
|
+
"lexus",
|
|
1508
|
+
"lgbt",
|
|
1509
|
+
"li",
|
|
1510
|
+
"lidl",
|
|
1511
|
+
"life",
|
|
1512
|
+
"lifeinsurance",
|
|
1513
|
+
"lifestyle",
|
|
1514
|
+
"lighting",
|
|
1515
|
+
"like",
|
|
1516
|
+
"lilly",
|
|
1517
|
+
"limited",
|
|
1518
|
+
"limo",
|
|
1519
|
+
"lincoln",
|
|
1520
|
+
"link",
|
|
1521
|
+
"live",
|
|
1522
|
+
"living",
|
|
1523
|
+
"lk",
|
|
1524
|
+
"llc",
|
|
1525
|
+
"llp",
|
|
1526
|
+
"loan",
|
|
1527
|
+
"loans",
|
|
1528
|
+
"locker",
|
|
1529
|
+
"locus",
|
|
1530
|
+
"lol",
|
|
1531
|
+
"london",
|
|
1532
|
+
"lotte",
|
|
1533
|
+
"lotto",
|
|
1534
|
+
"love",
|
|
1535
|
+
"lpl",
|
|
1536
|
+
"lplfinancial",
|
|
1537
|
+
"lr",
|
|
1538
|
+
"ls",
|
|
1539
|
+
"lt",
|
|
1540
|
+
"ltd",
|
|
1541
|
+
"ltda",
|
|
1542
|
+
"lu",
|
|
1543
|
+
"lundbeck",
|
|
1544
|
+
"luxe",
|
|
1545
|
+
"luxury",
|
|
1546
|
+
"lv",
|
|
1547
|
+
"ly",
|
|
1548
|
+
"ma",
|
|
1549
|
+
"madrid",
|
|
1550
|
+
"maif",
|
|
1551
|
+
"maison",
|
|
1552
|
+
"makeup",
|
|
1553
|
+
"man",
|
|
1554
|
+
"management",
|
|
1555
|
+
"mango",
|
|
1556
|
+
"map",
|
|
1557
|
+
"market",
|
|
1558
|
+
"marketing",
|
|
1559
|
+
"markets",
|
|
1560
|
+
"marriott",
|
|
1561
|
+
"marshalls",
|
|
1562
|
+
"mattel",
|
|
1563
|
+
"mba",
|
|
1564
|
+
"mc",
|
|
1565
|
+
"mckinsey",
|
|
1566
|
+
"md",
|
|
1567
|
+
"me",
|
|
1568
|
+
"med",
|
|
1569
|
+
"media",
|
|
1570
|
+
"meet",
|
|
1571
|
+
"melbourne",
|
|
1572
|
+
"meme",
|
|
1573
|
+
"memorial",
|
|
1574
|
+
"men",
|
|
1575
|
+
"menu",
|
|
1576
|
+
"merckmsd",
|
|
1577
|
+
"mg",
|
|
1578
|
+
"mh",
|
|
1579
|
+
"miami",
|
|
1580
|
+
"microsoft",
|
|
1581
|
+
"mil",
|
|
1582
|
+
"mini",
|
|
1583
|
+
"mint",
|
|
1584
|
+
"mit",
|
|
1585
|
+
"mitsubishi",
|
|
1586
|
+
"mk",
|
|
1587
|
+
"ml",
|
|
1588
|
+
"mlb",
|
|
1589
|
+
"mls",
|
|
1590
|
+
"mm",
|
|
1591
|
+
"mma",
|
|
1592
|
+
"mn",
|
|
1593
|
+
"mo",
|
|
1594
|
+
"mobi",
|
|
1595
|
+
"mobile",
|
|
1596
|
+
"moda",
|
|
1597
|
+
"moe",
|
|
1598
|
+
"moi",
|
|
1599
|
+
"mom",
|
|
1600
|
+
"monash",
|
|
1601
|
+
"money",
|
|
1602
|
+
"monster",
|
|
1603
|
+
"mormon",
|
|
1604
|
+
"mortgage",
|
|
1605
|
+
"moscow",
|
|
1606
|
+
"moto",
|
|
1607
|
+
"motorcycles",
|
|
1608
|
+
"mov",
|
|
1609
|
+
"movie",
|
|
1610
|
+
"mp",
|
|
1611
|
+
"mq",
|
|
1612
|
+
"mr",
|
|
1613
|
+
"ms",
|
|
1614
|
+
"msd",
|
|
1615
|
+
"mt",
|
|
1616
|
+
"mtn",
|
|
1617
|
+
"mtr",
|
|
1618
|
+
"mu",
|
|
1619
|
+
"museum",
|
|
1620
|
+
"music",
|
|
1621
|
+
"mv",
|
|
1622
|
+
"mw",
|
|
1623
|
+
"mx",
|
|
1624
|
+
"my",
|
|
1625
|
+
"mz",
|
|
1626
|
+
"na",
|
|
1627
|
+
"nab",
|
|
1628
|
+
"nagoya",
|
|
1629
|
+
"name",
|
|
1630
|
+
"navy",
|
|
1631
|
+
"nba",
|
|
1632
|
+
"nc",
|
|
1633
|
+
"ne",
|
|
1634
|
+
"nec",
|
|
1635
|
+
"net",
|
|
1636
|
+
"netbank",
|
|
1637
|
+
"netflix",
|
|
1638
|
+
"network",
|
|
1639
|
+
"neustar",
|
|
1640
|
+
"new",
|
|
1641
|
+
"news",
|
|
1642
|
+
"next",
|
|
1643
|
+
"nextdirect",
|
|
1644
|
+
"nexus",
|
|
1645
|
+
"nf",
|
|
1646
|
+
"nfl",
|
|
1647
|
+
"ng",
|
|
1648
|
+
"ngo",
|
|
1649
|
+
"nhk",
|
|
1650
|
+
"ni",
|
|
1651
|
+
"nico",
|
|
1652
|
+
"nike",
|
|
1653
|
+
"nikon",
|
|
1654
|
+
"ninja",
|
|
1655
|
+
"nissan",
|
|
1656
|
+
"nissay",
|
|
1657
|
+
"nl",
|
|
1658
|
+
"no",
|
|
1659
|
+
"nokia",
|
|
1660
|
+
"norton",
|
|
1661
|
+
"now",
|
|
1662
|
+
"nowruz",
|
|
1663
|
+
"nowtv",
|
|
1664
|
+
"np",
|
|
1665
|
+
"nr",
|
|
1666
|
+
"nra",
|
|
1667
|
+
"nrw",
|
|
1668
|
+
"ntt",
|
|
1669
|
+
"nu",
|
|
1670
|
+
"nyc",
|
|
1671
|
+
"nz",
|
|
1672
|
+
"obi",
|
|
1673
|
+
"observer",
|
|
1674
|
+
"office",
|
|
1675
|
+
"okinawa",
|
|
1676
|
+
"olayan",
|
|
1677
|
+
"olayangroup",
|
|
1678
|
+
"ollo",
|
|
1679
|
+
"om",
|
|
1680
|
+
"omega",
|
|
1681
|
+
"one",
|
|
1682
|
+
"ong",
|
|
1683
|
+
"onl",
|
|
1684
|
+
"online",
|
|
1685
|
+
"ooo",
|
|
1686
|
+
"open",
|
|
1687
|
+
"oracle",
|
|
1688
|
+
"orange",
|
|
1689
|
+
"org",
|
|
1690
|
+
"organic",
|
|
1691
|
+
"origins",
|
|
1692
|
+
"osaka",
|
|
1693
|
+
"otsuka",
|
|
1694
|
+
"ott",
|
|
1695
|
+
"ovh",
|
|
1696
|
+
"pa",
|
|
1697
|
+
"page",
|
|
1698
|
+
"panasonic",
|
|
1699
|
+
"paris",
|
|
1700
|
+
"pars",
|
|
1701
|
+
"partners",
|
|
1702
|
+
"parts",
|
|
1703
|
+
"party",
|
|
1704
|
+
"pay",
|
|
1705
|
+
"pccw",
|
|
1706
|
+
"pe",
|
|
1707
|
+
"pet",
|
|
1708
|
+
"pf",
|
|
1709
|
+
"pfizer",
|
|
1710
|
+
"pg",
|
|
1711
|
+
"ph",
|
|
1712
|
+
"pharmacy",
|
|
1713
|
+
"phd",
|
|
1714
|
+
"philips",
|
|
1715
|
+
"phone",
|
|
1716
|
+
"photo",
|
|
1717
|
+
"photography",
|
|
1718
|
+
"photos",
|
|
1719
|
+
"physio",
|
|
1720
|
+
"pics",
|
|
1721
|
+
"pictet",
|
|
1722
|
+
"pictures",
|
|
1723
|
+
"pid",
|
|
1724
|
+
"pin",
|
|
1725
|
+
"ping",
|
|
1726
|
+
"pink",
|
|
1727
|
+
"pioneer",
|
|
1728
|
+
"pizza",
|
|
1729
|
+
"pk",
|
|
1730
|
+
"pl",
|
|
1731
|
+
"place",
|
|
1732
|
+
"play",
|
|
1733
|
+
"playstation",
|
|
1734
|
+
"plumbing",
|
|
1735
|
+
"plus",
|
|
1736
|
+
"pm",
|
|
1737
|
+
"pn",
|
|
1738
|
+
"pnc",
|
|
1739
|
+
"pohl",
|
|
1740
|
+
"poker",
|
|
1741
|
+
"politie",
|
|
1742
|
+
"porn",
|
|
1743
|
+
"post",
|
|
1744
|
+
"pr",
|
|
1745
|
+
"praxi",
|
|
1746
|
+
"press",
|
|
1747
|
+
"prime",
|
|
1748
|
+
"pro",
|
|
1749
|
+
"prod",
|
|
1750
|
+
"productions",
|
|
1751
|
+
"prof",
|
|
1752
|
+
"progressive",
|
|
1753
|
+
"promo",
|
|
1754
|
+
"properties",
|
|
1755
|
+
"property",
|
|
1756
|
+
"protection",
|
|
1757
|
+
"pru",
|
|
1758
|
+
"prudential",
|
|
1759
|
+
"ps",
|
|
1760
|
+
"pt",
|
|
1761
|
+
"pub",
|
|
1762
|
+
"pw",
|
|
1763
|
+
"pwc",
|
|
1764
|
+
"py",
|
|
1765
|
+
"qa",
|
|
1766
|
+
"qpon",
|
|
1767
|
+
"quebec",
|
|
1768
|
+
"quest",
|
|
1769
|
+
"racing",
|
|
1770
|
+
"radio",
|
|
1771
|
+
"re",
|
|
1772
|
+
"read",
|
|
1773
|
+
"realestate",
|
|
1774
|
+
"realtor",
|
|
1775
|
+
"realty",
|
|
1776
|
+
"recipes",
|
|
1777
|
+
"red",
|
|
1778
|
+
"redumbrella",
|
|
1779
|
+
"rehab",
|
|
1780
|
+
"reise",
|
|
1781
|
+
"reisen",
|
|
1782
|
+
"reit",
|
|
1783
|
+
"reliance",
|
|
1784
|
+
"ren",
|
|
1785
|
+
"rent",
|
|
1786
|
+
"rentals",
|
|
1787
|
+
"repair",
|
|
1788
|
+
"report",
|
|
1789
|
+
"republican",
|
|
1790
|
+
"rest",
|
|
1791
|
+
"restaurant",
|
|
1792
|
+
"review",
|
|
1793
|
+
"reviews",
|
|
1794
|
+
"rexroth",
|
|
1795
|
+
"rich",
|
|
1796
|
+
"richardli",
|
|
1797
|
+
"ricoh",
|
|
1798
|
+
"ril",
|
|
1799
|
+
"rio",
|
|
1800
|
+
"rip",
|
|
1801
|
+
"ro",
|
|
1802
|
+
"rocks",
|
|
1803
|
+
"rodeo",
|
|
1804
|
+
"rogers",
|
|
1805
|
+
"room",
|
|
1806
|
+
"rs",
|
|
1807
|
+
"rsvp",
|
|
1808
|
+
"ru",
|
|
1809
|
+
"rugby",
|
|
1810
|
+
"ruhr",
|
|
1811
|
+
"run",
|
|
1812
|
+
"rw",
|
|
1813
|
+
"rwe",
|
|
1814
|
+
"ryukyu",
|
|
1815
|
+
"sa",
|
|
1816
|
+
"saarland",
|
|
1817
|
+
"safe",
|
|
1818
|
+
"safety",
|
|
1819
|
+
"sakura",
|
|
1820
|
+
"sale",
|
|
1821
|
+
"salon",
|
|
1822
|
+
"samsclub",
|
|
1823
|
+
"samsung",
|
|
1824
|
+
"sandvik",
|
|
1825
|
+
"sandvikcoromant",
|
|
1826
|
+
"sanofi",
|
|
1827
|
+
"sap",
|
|
1828
|
+
"sarl",
|
|
1829
|
+
"sas",
|
|
1830
|
+
"save",
|
|
1831
|
+
"saxo",
|
|
1832
|
+
"sb",
|
|
1833
|
+
"sbi",
|
|
1834
|
+
"sbs",
|
|
1835
|
+
"sc",
|
|
1836
|
+
"scb",
|
|
1837
|
+
"schaeffler",
|
|
1838
|
+
"schmidt",
|
|
1839
|
+
"scholarships",
|
|
1840
|
+
"school",
|
|
1841
|
+
"schule",
|
|
1842
|
+
"schwarz",
|
|
1843
|
+
"science",
|
|
1844
|
+
"scot",
|
|
1845
|
+
"sd",
|
|
1846
|
+
"se",
|
|
1847
|
+
"search",
|
|
1848
|
+
"seat",
|
|
1849
|
+
"secure",
|
|
1850
|
+
"security",
|
|
1851
|
+
"seek",
|
|
1852
|
+
"select",
|
|
1853
|
+
"sener",
|
|
1854
|
+
"services",
|
|
1855
|
+
"seven",
|
|
1856
|
+
"sew",
|
|
1857
|
+
"sex",
|
|
1858
|
+
"sexy",
|
|
1859
|
+
"sfr",
|
|
1860
|
+
"sg",
|
|
1861
|
+
"sh",
|
|
1862
|
+
"shangrila",
|
|
1863
|
+
"sharp",
|
|
1864
|
+
"shell",
|
|
1865
|
+
"shia",
|
|
1866
|
+
"shiksha",
|
|
1867
|
+
"shoes",
|
|
1868
|
+
"shop",
|
|
1869
|
+
"shopping",
|
|
1870
|
+
"shouji",
|
|
1871
|
+
"show",
|
|
1872
|
+
"si",
|
|
1873
|
+
"silk",
|
|
1874
|
+
"sina",
|
|
1875
|
+
"singles",
|
|
1876
|
+
"site",
|
|
1877
|
+
"sj",
|
|
1878
|
+
"sk",
|
|
1879
|
+
"ski",
|
|
1880
|
+
"skin",
|
|
1881
|
+
"sky",
|
|
1882
|
+
"skype",
|
|
1883
|
+
"sl",
|
|
1884
|
+
"sling",
|
|
1885
|
+
"sm",
|
|
1886
|
+
"smart",
|
|
1887
|
+
"smile",
|
|
1888
|
+
"sn",
|
|
1889
|
+
"sncf",
|
|
1890
|
+
"so",
|
|
1891
|
+
"soccer",
|
|
1892
|
+
"social",
|
|
1893
|
+
"softbank",
|
|
1894
|
+
"software",
|
|
1895
|
+
"sohu",
|
|
1896
|
+
"solar",
|
|
1897
|
+
"solutions",
|
|
1898
|
+
"song",
|
|
1899
|
+
"sony",
|
|
1900
|
+
"soy",
|
|
1901
|
+
"spa",
|
|
1902
|
+
"space",
|
|
1903
|
+
"sport",
|
|
1904
|
+
"spot",
|
|
1905
|
+
"sr",
|
|
1906
|
+
"srl",
|
|
1907
|
+
"ss",
|
|
1908
|
+
"st",
|
|
1909
|
+
"stada",
|
|
1910
|
+
"staples",
|
|
1911
|
+
"star",
|
|
1912
|
+
"statebank",
|
|
1913
|
+
"statefarm",
|
|
1914
|
+
"stc",
|
|
1915
|
+
"stcgroup",
|
|
1916
|
+
"stockholm",
|
|
1917
|
+
"storage",
|
|
1918
|
+
"store",
|
|
1919
|
+
"stream",
|
|
1920
|
+
"studio",
|
|
1921
|
+
"study",
|
|
1922
|
+
"style",
|
|
1923
|
+
"su",
|
|
1924
|
+
"sucks",
|
|
1925
|
+
"supplies",
|
|
1926
|
+
"supply",
|
|
1927
|
+
"support",
|
|
1928
|
+
"surf",
|
|
1929
|
+
"surgery",
|
|
1930
|
+
"suzuki",
|
|
1931
|
+
"sv",
|
|
1932
|
+
"swatch",
|
|
1933
|
+
"swiss",
|
|
1934
|
+
"sx",
|
|
1935
|
+
"sy",
|
|
1936
|
+
"sydney",
|
|
1937
|
+
"systems",
|
|
1938
|
+
"sz",
|
|
1939
|
+
"tab",
|
|
1940
|
+
"taipei",
|
|
1941
|
+
"talk",
|
|
1942
|
+
"taobao",
|
|
1943
|
+
"target",
|
|
1944
|
+
"tatamotors",
|
|
1945
|
+
"tatar",
|
|
1946
|
+
"tattoo",
|
|
1947
|
+
"tax",
|
|
1948
|
+
"taxi",
|
|
1949
|
+
"tc",
|
|
1950
|
+
"tci",
|
|
1951
|
+
"td",
|
|
1952
|
+
"tdk",
|
|
1953
|
+
"team",
|
|
1954
|
+
"tech",
|
|
1955
|
+
"technology",
|
|
1956
|
+
"tel",
|
|
1957
|
+
"temasek",
|
|
1958
|
+
"tennis",
|
|
1959
|
+
"teva",
|
|
1960
|
+
"tf",
|
|
1961
|
+
"tg",
|
|
1962
|
+
"th",
|
|
1963
|
+
"thd",
|
|
1964
|
+
"theater",
|
|
1965
|
+
"theatre",
|
|
1966
|
+
"tiaa",
|
|
1967
|
+
"tickets",
|
|
1968
|
+
"tienda",
|
|
1969
|
+
"tips",
|
|
1970
|
+
"tires",
|
|
1971
|
+
"tirol",
|
|
1972
|
+
"tj",
|
|
1973
|
+
"tjmaxx",
|
|
1974
|
+
"tjx",
|
|
1975
|
+
"tk",
|
|
1976
|
+
"tkmaxx",
|
|
1977
|
+
"tl",
|
|
1978
|
+
"tm",
|
|
1979
|
+
"tmall",
|
|
1980
|
+
"tn",
|
|
1981
|
+
"to",
|
|
1982
|
+
"today",
|
|
1983
|
+
"tokyo",
|
|
1984
|
+
"tools",
|
|
1985
|
+
"top",
|
|
1986
|
+
"toray",
|
|
1987
|
+
"toshiba",
|
|
1988
|
+
"total",
|
|
1989
|
+
"tours",
|
|
1990
|
+
"town",
|
|
1991
|
+
"toyota",
|
|
1992
|
+
"toys",
|
|
1993
|
+
"tr",
|
|
1994
|
+
"trade",
|
|
1995
|
+
"trading",
|
|
1996
|
+
"training",
|
|
1997
|
+
"travel",
|
|
1998
|
+
"travelers",
|
|
1999
|
+
"travelersinsurance",
|
|
2000
|
+
"trust",
|
|
2001
|
+
"trv",
|
|
2002
|
+
"tt",
|
|
2003
|
+
"tube",
|
|
2004
|
+
"tui",
|
|
2005
|
+
"tunes",
|
|
2006
|
+
"tushu",
|
|
2007
|
+
"tv",
|
|
2008
|
+
"tvs",
|
|
2009
|
+
"tw",
|
|
2010
|
+
"tz",
|
|
2011
|
+
"ua",
|
|
2012
|
+
"ubank",
|
|
2013
|
+
"ubs",
|
|
2014
|
+
"ug",
|
|
2015
|
+
"uk",
|
|
2016
|
+
"unicom",
|
|
2017
|
+
"university",
|
|
2018
|
+
"uno",
|
|
2019
|
+
"uol",
|
|
2020
|
+
"ups",
|
|
2021
|
+
"us",
|
|
2022
|
+
"uy",
|
|
2023
|
+
"uz",
|
|
2024
|
+
"va",
|
|
2025
|
+
"vacations",
|
|
2026
|
+
"vana",
|
|
2027
|
+
"vanguard",
|
|
2028
|
+
"vc",
|
|
2029
|
+
"ve",
|
|
2030
|
+
"vegas",
|
|
2031
|
+
"ventures",
|
|
2032
|
+
"verisign",
|
|
2033
|
+
"verm\xF6gensberater",
|
|
2034
|
+
"verm\xF6gensberatung",
|
|
2035
|
+
"versicherung",
|
|
2036
|
+
"vet",
|
|
2037
|
+
"vg",
|
|
2038
|
+
"vi",
|
|
2039
|
+
"viajes",
|
|
2040
|
+
"video",
|
|
2041
|
+
"vig",
|
|
2042
|
+
"viking",
|
|
2043
|
+
"villas",
|
|
2044
|
+
"vin",
|
|
2045
|
+
"vip",
|
|
2046
|
+
"virgin",
|
|
2047
|
+
"visa",
|
|
2048
|
+
"vision",
|
|
2049
|
+
"viva",
|
|
2050
|
+
"vivo",
|
|
2051
|
+
"vlaanderen",
|
|
2052
|
+
"vn",
|
|
2053
|
+
"vodka",
|
|
2054
|
+
"volvo",
|
|
2055
|
+
"vote",
|
|
2056
|
+
"voting",
|
|
2057
|
+
"voto",
|
|
2058
|
+
"voyage",
|
|
2059
|
+
"vu",
|
|
2060
|
+
"wales",
|
|
2061
|
+
"walmart",
|
|
2062
|
+
"walter",
|
|
2063
|
+
"wang",
|
|
2064
|
+
"wanggou",
|
|
2065
|
+
"watch",
|
|
2066
|
+
"watches",
|
|
2067
|
+
"weather",
|
|
2068
|
+
"weatherchannel",
|
|
2069
|
+
"webcam",
|
|
2070
|
+
"weber",
|
|
2071
|
+
"website",
|
|
2072
|
+
"wed",
|
|
2073
|
+
"wedding",
|
|
2074
|
+
"weibo",
|
|
2075
|
+
"weir",
|
|
2076
|
+
"wf",
|
|
2077
|
+
"whoswho",
|
|
2078
|
+
"wien",
|
|
2079
|
+
"wiki",
|
|
2080
|
+
"williamhill",
|
|
2081
|
+
"win",
|
|
2082
|
+
"windows",
|
|
2083
|
+
"wine",
|
|
2084
|
+
"winners",
|
|
2085
|
+
"wme",
|
|
2086
|
+
"wolterskluwer",
|
|
2087
|
+
"woodside",
|
|
2088
|
+
"work",
|
|
2089
|
+
"works",
|
|
2090
|
+
"world",
|
|
2091
|
+
"wow",
|
|
2092
|
+
"ws",
|
|
2093
|
+
"wtc",
|
|
2094
|
+
"wtf",
|
|
2095
|
+
"xbox",
|
|
2096
|
+
"xerox",
|
|
2097
|
+
"xihuan",
|
|
2098
|
+
"xin",
|
|
2099
|
+
"xxx",
|
|
2100
|
+
"xyz",
|
|
2101
|
+
"yachts",
|
|
2102
|
+
"yahoo",
|
|
2103
|
+
"yamaxun",
|
|
2104
|
+
"yandex",
|
|
2105
|
+
"ye",
|
|
2106
|
+
"yodobashi",
|
|
2107
|
+
"yoga",
|
|
2108
|
+
"yokohama",
|
|
2109
|
+
"you",
|
|
2110
|
+
"youtube",
|
|
2111
|
+
"yt",
|
|
2112
|
+
"yun",
|
|
2113
|
+
"za",
|
|
2114
|
+
"zappos",
|
|
2115
|
+
"zara",
|
|
2116
|
+
"zero",
|
|
2117
|
+
"zip",
|
|
2118
|
+
"zm",
|
|
2119
|
+
"zone",
|
|
2120
|
+
"zuerich",
|
|
2121
|
+
"zw",
|
|
2122
|
+
"\u03B5\u03BB",
|
|
2123
|
+
"\u03B5\u03C5",
|
|
2124
|
+
"\u0431\u0433",
|
|
2125
|
+
"\u0431\u0435\u043B",
|
|
2126
|
+
"\u0434\u0435\u0442\u0438",
|
|
2127
|
+
"\u0435\u044E",
|
|
2128
|
+
"\u043A\u0430\u0442\u043E\u043B\u0438\u043A",
|
|
2129
|
+
"\u043A\u043E\u043C",
|
|
2130
|
+
"\u043C\u043A\u0434",
|
|
2131
|
+
"\u043C\u043E\u043D",
|
|
2132
|
+
"\u043C\u043E\u0441\u043A\u0432\u0430",
|
|
2133
|
+
"\u043E\u043D\u043B\u0430\u0439\u043D",
|
|
2134
|
+
"\u043E\u0440\u0433",
|
|
2135
|
+
"\u0440\u0443\u0441",
|
|
2136
|
+
"\u0440\u0444",
|
|
2137
|
+
"\u0441\u0430\u0439\u0442",
|
|
2138
|
+
"\u0441\u0440\u0431",
|
|
2139
|
+
"\u0443\u043A\u0440",
|
|
2140
|
+
"\u049B\u0430\u0437",
|
|
2141
|
+
"\u0570\u0561\u0575",
|
|
2142
|
+
"\u05D9\u05E9\u05E8\u05D0\u05DC",
|
|
2143
|
+
"\u05E7\u05D5\u05DD",
|
|
2144
|
+
"\u0627\u0628\u0648\u0638\u0628\u064A",
|
|
2145
|
+
"\u0627\u0631\u0627\u0645\u0643\u0648",
|
|
2146
|
+
"\u0627\u0644\u0627\u0631\u062F\u0646",
|
|
2147
|
+
"\u0627\u0644\u0628\u062D\u0631\u064A\u0646",
|
|
2148
|
+
"\u0627\u0644\u062C\u0632\u0627\u0626\u0631",
|
|
2149
|
+
"\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629",
|
|
2150
|
+
"\u0627\u0644\u0639\u0644\u064A\u0627\u0646",
|
|
2151
|
+
"\u0627\u0644\u0645\u063A\u0631\u0628",
|
|
2152
|
+
"\u0627\u0645\u0627\u0631\u0627\u062A",
|
|
2153
|
+
"\u0627\u06CC\u0631\u0627\u0646",
|
|
2154
|
+
"\u0628\u0627\u0631\u062A",
|
|
2155
|
+
"\u0628\u0627\u0632\u0627\u0631",
|
|
2156
|
+
"\u0628\u064A\u062A\u0643",
|
|
2157
|
+
"\u0628\u06BE\u0627\u0631\u062A",
|
|
2158
|
+
"\u062A\u0648\u0646\u0633",
|
|
2159
|
+
"\u0633\u0648\u062F\u0627\u0646",
|
|
2160
|
+
"\u0633\u0648\u0631\u064A\u0629",
|
|
2161
|
+
"\u0634\u0628\u0643\u0629",
|
|
2162
|
+
"\u0639\u0631\u0627\u0642",
|
|
2163
|
+
"\u0639\u0631\u0628",
|
|
2164
|
+
"\u0639\u0645\u0627\u0646",
|
|
2165
|
+
"\u0641\u0644\u0633\u0637\u064A\u0646",
|
|
2166
|
+
"\u0642\u0637\u0631",
|
|
2167
|
+
"\u0643\u0627\u062B\u0648\u0644\u064A\u0643",
|
|
2168
|
+
"\u0643\u0648\u0645",
|
|
2169
|
+
"\u0645\u0635\u0631",
|
|
2170
|
+
"\u0645\u0644\u064A\u0633\u064A\u0627",
|
|
2171
|
+
"\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627",
|
|
2172
|
+
"\u0645\u0648\u0642\u0639",
|
|
2173
|
+
"\u0647\u0645\u0631\u0627\u0647",
|
|
2174
|
+
"\u067E\u0627\u06A9\u0633\u062A\u0627\u0646",
|
|
2175
|
+
"\u0680\u0627\u0631\u062A",
|
|
2176
|
+
"\u0915\u0949\u092E",
|
|
2177
|
+
"\u0928\u0947\u091F",
|
|
2178
|
+
"\u092D\u093E\u0930\u0924",
|
|
2179
|
+
"\u092D\u093E\u0930\u0924\u092E\u094D",
|
|
2180
|
+
"\u092D\u093E\u0930\u094B\u0924",
|
|
2181
|
+
"\u0938\u0902\u0917\u0920\u0928",
|
|
2182
|
+
"\u09AC\u09BE\u0982\u09B2\u09BE",
|
|
2183
|
+
"\u09AD\u09BE\u09B0\u09A4",
|
|
2184
|
+
"\u09AD\u09BE\u09F0\u09A4",
|
|
2185
|
+
"\u0A2D\u0A3E\u0A30\u0A24",
|
|
2186
|
+
"\u0AAD\u0ABE\u0AB0\u0AA4",
|
|
2187
|
+
"\u0B2D\u0B3E\u0B30\u0B24",
|
|
2188
|
+
"\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE",
|
|
2189
|
+
"\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8",
|
|
2190
|
+
"\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD",
|
|
2191
|
+
"\u0C2D\u0C3E\u0C30\u0C24\u0C4D",
|
|
2192
|
+
"\u0CAD\u0CBE\u0CB0\u0CA4",
|
|
2193
|
+
"\u0D2D\u0D3E\u0D30\u0D24\u0D02",
|
|
2194
|
+
"\u0DBD\u0D82\u0D9A\u0DCF",
|
|
2195
|
+
"\u0E04\u0E2D\u0E21",
|
|
2196
|
+
"\u0E44\u0E17\u0E22",
|
|
2197
|
+
"\u0EA5\u0EB2\u0EA7",
|
|
2198
|
+
"\u10D2\u10D4",
|
|
2199
|
+
"\u307F\u3093\u306A",
|
|
2200
|
+
"\u30A2\u30DE\u30BE\u30F3",
|
|
2201
|
+
"\u30AF\u30E9\u30A6\u30C9",
|
|
2202
|
+
"\u30B0\u30FC\u30B0\u30EB",
|
|
2203
|
+
"\u30B3\u30E0",
|
|
2204
|
+
"\u30B9\u30C8\u30A2",
|
|
2205
|
+
"\u30BB\u30FC\u30EB",
|
|
2206
|
+
"\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3",
|
|
2207
|
+
"\u30DD\u30A4\u30F3\u30C8",
|
|
2208
|
+
"\u4E16\u754C",
|
|
2209
|
+
"\u4E2D\u4FE1",
|
|
2210
|
+
"\u4E2D\u56FD",
|
|
2211
|
+
"\u4E2D\u570B",
|
|
2212
|
+
"\u4E2D\u6587\u7F51",
|
|
2213
|
+
"\u4E9A\u9A6C\u900A",
|
|
2214
|
+
"\u4F01\u4E1A",
|
|
2215
|
+
"\u4F5B\u5C71",
|
|
2216
|
+
"\u4FE1\u606F",
|
|
2217
|
+
"\u5065\u5EB7",
|
|
2218
|
+
"\u516B\u5366",
|
|
2219
|
+
"\u516C\u53F8",
|
|
2220
|
+
"\u516C\u76CA",
|
|
2221
|
+
"\u53F0\u6E7E",
|
|
2222
|
+
"\u53F0\u7063",
|
|
2223
|
+
"\u5546\u57CE",
|
|
2224
|
+
"\u5546\u5E97",
|
|
2225
|
+
"\u5546\u6807",
|
|
2226
|
+
"\u5609\u91CC",
|
|
2227
|
+
"\u5609\u91CC\u5927\u9152\u5E97",
|
|
2228
|
+
"\u5728\u7EBF",
|
|
2229
|
+
"\u5927\u62FF",
|
|
2230
|
+
"\u5929\u4E3B\u6559",
|
|
2231
|
+
"\u5A31\u4E50",
|
|
2232
|
+
"\u5BB6\u96FB",
|
|
2233
|
+
"\u5E7F\u4E1C",
|
|
2234
|
+
"\u5FAE\u535A",
|
|
2235
|
+
"\u6148\u5584",
|
|
2236
|
+
"\u6211\u7231\u4F60",
|
|
2237
|
+
"\u624B\u673A",
|
|
2238
|
+
"\u62DB\u8058",
|
|
2239
|
+
"\u653F\u52A1",
|
|
2240
|
+
"\u653F\u5E9C",
|
|
2241
|
+
"\u65B0\u52A0\u5761",
|
|
2242
|
+
"\u65B0\u95FB",
|
|
2243
|
+
"\u65F6\u5C1A",
|
|
2244
|
+
"\u66F8\u7C4D",
|
|
2245
|
+
"\u673A\u6784",
|
|
2246
|
+
"\u6DE1\u9A6C\u9521",
|
|
2247
|
+
"\u6E38\u620F",
|
|
2248
|
+
"\u6FB3\u9580",
|
|
2249
|
+
"\u70B9\u770B",
|
|
2250
|
+
"\u79FB\u52A8",
|
|
2251
|
+
"\u7EC4\u7EC7\u673A\u6784",
|
|
2252
|
+
"\u7F51\u5740",
|
|
2253
|
+
"\u7F51\u5E97",
|
|
2254
|
+
"\u7F51\u7AD9",
|
|
2255
|
+
"\u7F51\u7EDC",
|
|
2256
|
+
"\u8054\u901A",
|
|
2257
|
+
"\u8C37\u6B4C",
|
|
2258
|
+
"\u8D2D\u7269",
|
|
2259
|
+
"\u901A\u8CA9",
|
|
2260
|
+
"\u96C6\u56E2",
|
|
2261
|
+
"\u96FB\u8A0A\u76C8\u79D1",
|
|
2262
|
+
"\u98DE\u5229\u6D66",
|
|
2263
|
+
"\u98DF\u54C1",
|
|
2264
|
+
"\u9910\u5385",
|
|
2265
|
+
"\u9999\u683C\u91CC\u62C9",
|
|
2266
|
+
"\u9999\u6E2F",
|
|
2267
|
+
"\uB2F7\uB137",
|
|
2268
|
+
"\uB2F7\uCEF4",
|
|
2269
|
+
"\uC0BC\uC131",
|
|
2270
|
+
"\uD55C\uAD6D"
|
|
2271
|
+
];
|
|
2272
|
+
|
|
2273
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/domain.js
|
|
2274
|
+
function shareSameDomainSuffix(hostname, vhost) {
|
|
2275
|
+
if (hostname.endsWith(vhost)) {
|
|
2276
|
+
return hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === ".";
|
|
2277
|
+
}
|
|
2278
|
+
return false;
|
|
2279
|
+
}
|
|
2280
|
+
function extractDomainWithSuffix(hostname, publicSuffix) {
|
|
2281
|
+
const publicSuffixIndex = hostname.length - publicSuffix.length - 2;
|
|
2282
|
+
const lastDotBeforeSuffixIndex = hostname.lastIndexOf(".", publicSuffixIndex);
|
|
2283
|
+
if (lastDotBeforeSuffixIndex === -1) {
|
|
2284
|
+
return hostname;
|
|
2285
|
+
}
|
|
2286
|
+
return hostname.slice(lastDotBeforeSuffixIndex + 1);
|
|
2287
|
+
}
|
|
2288
|
+
function getDomain(suffix, hostname, options) {
|
|
2289
|
+
if (options.validHosts !== null) {
|
|
2290
|
+
const validHosts = options.validHosts;
|
|
2291
|
+
for (const vhost of validHosts) {
|
|
2292
|
+
if (
|
|
2293
|
+
/*@__INLINE__*/
|
|
2294
|
+
shareSameDomainSuffix(hostname, vhost)
|
|
2295
|
+
) {
|
|
2296
|
+
return vhost;
|
|
2297
|
+
}
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2300
|
+
let numberOfLeadingDots = 0;
|
|
2301
|
+
if (hostname.startsWith(".")) {
|
|
2302
|
+
while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === ".") {
|
|
2303
|
+
numberOfLeadingDots += 1;
|
|
2304
|
+
}
|
|
2305
|
+
}
|
|
2306
|
+
if (suffix.length === hostname.length - numberOfLeadingDots) {
|
|
2307
|
+
return null;
|
|
2308
|
+
}
|
|
2309
|
+
return (
|
|
2310
|
+
/*@__INLINE__*/
|
|
2311
|
+
extractDomainWithSuffix(hostname, suffix)
|
|
2312
|
+
);
|
|
2313
|
+
}
|
|
2314
|
+
|
|
2315
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/domain-without-suffix.js
|
|
2316
|
+
function getDomainWithoutSuffix(domain, suffix) {
|
|
2317
|
+
return domain.slice(0, -suffix.length - 1);
|
|
2318
|
+
}
|
|
2319
|
+
|
|
2320
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/extract-hostname.js
|
|
2321
|
+
var CONTROL_CHARS = /[\t\n\r]/g;
|
|
2322
|
+
var extractedHostnameValidated = false;
|
|
2323
|
+
function isValidHostnameChar(code) {
|
|
2324
|
+
return code >= 97 && code <= 122 || // a-z
|
|
2325
|
+
code >= 48 && code <= 57 || // 0-9
|
|
2326
|
+
code > 127 || // non-ASCII (accepted, not punycode-checked)
|
|
2327
|
+
code >= 65 && code <= 90 || // A-Z (becomes valid once lowercased)
|
|
2328
|
+
code === 45 || // '-'
|
|
2329
|
+
code === 95;
|
|
2330
|
+
}
|
|
2331
|
+
function getSpecialScheme(url, schemeStart, colonIndex) {
|
|
2332
|
+
const length = colonIndex - schemeStart;
|
|
2333
|
+
const c0 = url.charCodeAt(schemeStart) | 32;
|
|
2334
|
+
if (length === 2) {
|
|
2335
|
+
return c0 === 119 && (url.charCodeAt(schemeStart + 1) | 32) === 115 ? 1 : 0;
|
|
2336
|
+
} else if (length === 3) {
|
|
2337
|
+
const c1 = url.charCodeAt(schemeStart + 1) | 32;
|
|
2338
|
+
const c2 = url.charCodeAt(schemeStart + 2) | 32;
|
|
2339
|
+
if (c0 === 119 && c1 === 115 && c2 === 115)
|
|
2340
|
+
return 1;
|
|
2341
|
+
if (c0 === 102 && c1 === 116 && c2 === 112)
|
|
2342
|
+
return 1;
|
|
2343
|
+
return 0;
|
|
2344
|
+
} else if (length === 4) {
|
|
2345
|
+
const c1 = url.charCodeAt(schemeStart + 1) | 32;
|
|
2346
|
+
const c2 = url.charCodeAt(schemeStart + 2) | 32;
|
|
2347
|
+
const c3 = url.charCodeAt(schemeStart + 3) | 32;
|
|
2348
|
+
if (c0 === 104 && c1 === 116 && c2 === 116 && c3 === 112)
|
|
2349
|
+
return 1;
|
|
2350
|
+
if (c0 === 102 && c1 === 105 && c2 === 108 && c3 === 101)
|
|
2351
|
+
return 2;
|
|
2352
|
+
return 0;
|
|
2353
|
+
} else if (length === 5) {
|
|
2354
|
+
return c0 === 104 && (url.charCodeAt(schemeStart + 1) | 32) === 116 && (url.charCodeAt(schemeStart + 2) | 32) === 116 && (url.charCodeAt(schemeStart + 3) | 32) === 112 && (url.charCodeAt(schemeStart + 4) | 32) === 115 ? 1 : 0;
|
|
2355
|
+
}
|
|
2356
|
+
return 0;
|
|
2357
|
+
}
|
|
2358
|
+
function extractHostname(url, urlIsValidHostname, validate = false) {
|
|
2359
|
+
let start = 0;
|
|
2360
|
+
let end = url.length;
|
|
2361
|
+
let hasUpper = false;
|
|
2362
|
+
let isSpecial = false;
|
|
2363
|
+
extractedHostnameValidated = false;
|
|
2364
|
+
if (!urlIsValidHostname) {
|
|
2365
|
+
if (url.startsWith("data:")) {
|
|
2366
|
+
return null;
|
|
2367
|
+
}
|
|
2368
|
+
while (start < url.length && url.charCodeAt(start) <= 32) {
|
|
2369
|
+
start += 1;
|
|
2370
|
+
}
|
|
2371
|
+
while (end > start + 1 && url.charCodeAt(end - 1) <= 32) {
|
|
2372
|
+
end -= 1;
|
|
2373
|
+
}
|
|
2374
|
+
if (url.charCodeAt(start) === 47 && url.charCodeAt(start + 1) === 47) {
|
|
2375
|
+
start += 2;
|
|
2376
|
+
} else {
|
|
2377
|
+
const indexOfProtocol = url.indexOf(":/", start);
|
|
2378
|
+
if (indexOfProtocol !== -1) {
|
|
2379
|
+
const special = getSpecialScheme(url, start, indexOfProtocol);
|
|
2380
|
+
if (special === 1) {
|
|
2381
|
+
isSpecial = true;
|
|
2382
|
+
start = indexOfProtocol + 2;
|
|
2383
|
+
while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
|
|
2384
|
+
start += 1;
|
|
2385
|
+
}
|
|
2386
|
+
} else if (special === 2) {
|
|
2387
|
+
isSpecial = true;
|
|
2388
|
+
start = indexOfProtocol + 1;
|
|
2389
|
+
let slashes = 0;
|
|
2390
|
+
while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
|
|
2391
|
+
start += 1;
|
|
2392
|
+
slashes += 1;
|
|
2393
|
+
}
|
|
2394
|
+
if (slashes < 2) {
|
|
2395
|
+
return null;
|
|
2396
|
+
}
|
|
2397
|
+
} else {
|
|
2398
|
+
for (let i = start; i < indexOfProtocol; i += 1) {
|
|
2399
|
+
const code = url.charCodeAt(i) | 32;
|
|
2400
|
+
if (!(code >= 97 && code <= 122 || // [a, z]
|
|
2401
|
+
code >= 48 && code <= 57 || // [0, 9]
|
|
2402
|
+
code === 46 || // '.'
|
|
2403
|
+
code === 45 || // '-'
|
|
2404
|
+
code === 43)) {
|
|
2405
|
+
const raw = url.charCodeAt(i);
|
|
2406
|
+
if (raw === 9 || raw === 10 || raw === 13) {
|
|
2407
|
+
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
2408
|
+
}
|
|
2409
|
+
return null;
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
if (url.charCodeAt(indexOfProtocol + 2) === 47) {
|
|
2413
|
+
start = indexOfProtocol + 3;
|
|
2414
|
+
} else {
|
|
2415
|
+
return null;
|
|
2416
|
+
}
|
|
2417
|
+
}
|
|
2418
|
+
} else if (url.charCodeAt(start) !== 91) {
|
|
2419
|
+
let indexOfColon = -1;
|
|
2420
|
+
for (let i = start; i < end; i += 1) {
|
|
2421
|
+
const code = url.charCodeAt(i);
|
|
2422
|
+
if (code === 9 || code === 10 || code === 13) {
|
|
2423
|
+
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
2424
|
+
}
|
|
2425
|
+
if (code === 58) {
|
|
2426
|
+
indexOfColon = i;
|
|
2427
|
+
break;
|
|
2428
|
+
}
|
|
2429
|
+
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
2430
|
+
break;
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
|
+
if (indexOfColon !== -1) {
|
|
2434
|
+
let hasIdentifier = false;
|
|
2435
|
+
for (let i = indexOfColon + 1; i < end; i += 1) {
|
|
2436
|
+
const code = url.charCodeAt(i);
|
|
2437
|
+
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
2438
|
+
break;
|
|
2439
|
+
}
|
|
2440
|
+
if (code === 64) {
|
|
2441
|
+
hasIdentifier = true;
|
|
2442
|
+
break;
|
|
2443
|
+
}
|
|
2444
|
+
}
|
|
2445
|
+
if (!hasIdentifier) {
|
|
2446
|
+
let allDigits = true;
|
|
2447
|
+
let i = indexOfColon + 1;
|
|
2448
|
+
for (; i < end; i += 1) {
|
|
2449
|
+
const code = url.charCodeAt(i);
|
|
2450
|
+
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
2451
|
+
break;
|
|
2452
|
+
}
|
|
2453
|
+
if (code < 48 || code > 57) {
|
|
2454
|
+
allDigits = false;
|
|
2455
|
+
break;
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
if (i === indexOfColon + 1) {
|
|
2459
|
+
allDigits = false;
|
|
2460
|
+
}
|
|
2461
|
+
if (!allDigits) {
|
|
2462
|
+
const special = getSpecialScheme(url, start, indexOfColon);
|
|
2463
|
+
if (special === 0) {
|
|
2464
|
+
let isBareIpv6 = false;
|
|
2465
|
+
for (let j = indexOfColon + 1; j < end; j += 1) {
|
|
2466
|
+
const code = url.charCodeAt(j);
|
|
2467
|
+
if (code === 47 || code === 92 || code === 63 || code === 35) {
|
|
2468
|
+
break;
|
|
2469
|
+
}
|
|
2470
|
+
if (code === 58) {
|
|
2471
|
+
isBareIpv6 = true;
|
|
2472
|
+
break;
|
|
2473
|
+
}
|
|
2474
|
+
}
|
|
2475
|
+
if (!isBareIpv6) {
|
|
2476
|
+
return null;
|
|
2477
|
+
}
|
|
2478
|
+
} else {
|
|
2479
|
+
isSpecial = true;
|
|
2480
|
+
start = indexOfColon + 1;
|
|
2481
|
+
if (special === 2) {
|
|
2482
|
+
let slashes = 0;
|
|
2483
|
+
while ((url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) && slashes < 2) {
|
|
2484
|
+
start += 1;
|
|
2485
|
+
slashes += 1;
|
|
2486
|
+
}
|
|
2487
|
+
if (slashes < 2) {
|
|
2488
|
+
return null;
|
|
2489
|
+
}
|
|
2490
|
+
} else {
|
|
2491
|
+
while (url.charCodeAt(start) === 47 || url.charCodeAt(start) === 92) {
|
|
2492
|
+
start += 1;
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2495
|
+
}
|
|
2496
|
+
}
|
|
2497
|
+
}
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
}
|
|
2501
|
+
let indexOfIdentifier = -1;
|
|
2502
|
+
let indexOfClosingBracket = -1;
|
|
2503
|
+
let indexOfPort = -1;
|
|
2504
|
+
let indexOfFirstColon = -1;
|
|
2505
|
+
let hasControl = false;
|
|
2506
|
+
let vValid = validate;
|
|
2507
|
+
let vLastDot = start - 1;
|
|
2508
|
+
let vLastCode = -1;
|
|
2509
|
+
if (validate && start < end) {
|
|
2510
|
+
const c0 = url.charCodeAt(start);
|
|
2511
|
+
if (!/*@__INLINE__*/
|
|
2512
|
+
(isValidHostnameChar(c0) || c0 === 46 || c0 === 95) || c0 === 45) {
|
|
2513
|
+
vValid = false;
|
|
2514
|
+
}
|
|
2515
|
+
}
|
|
2516
|
+
for (let i = start; i < end; i += 1) {
|
|
2517
|
+
const code = url.charCodeAt(i);
|
|
2518
|
+
if (code < 64) {
|
|
2519
|
+
if (code === 47 || code === 35 || code === 63) {
|
|
2520
|
+
end = i;
|
|
2521
|
+
break;
|
|
2522
|
+
} else if (code === 58) {
|
|
2523
|
+
if (indexOfFirstColon === -1) {
|
|
2524
|
+
indexOfFirstColon = i;
|
|
2525
|
+
}
|
|
2526
|
+
indexOfPort = i;
|
|
2527
|
+
} else if (code === 9 || code === 10 || code === 13) {
|
|
2528
|
+
hasControl = true;
|
|
2529
|
+
} else if (validate) {
|
|
2530
|
+
if (code === 46) {
|
|
2531
|
+
if (i - vLastDot > 64 || vLastCode === 46 || vLastCode === 45) {
|
|
2532
|
+
vValid = false;
|
|
2533
|
+
}
|
|
2534
|
+
vLastDot = i;
|
|
2535
|
+
} else if (code < 48 || code > 57) {
|
|
2536
|
+
if (code !== 45 || vLastCode === 46) {
|
|
2537
|
+
vValid = false;
|
|
2538
|
+
}
|
|
2539
|
+
}
|
|
2540
|
+
}
|
|
2541
|
+
} else if (isSpecial && code === 92) {
|
|
2542
|
+
end = i;
|
|
2543
|
+
break;
|
|
2544
|
+
} else if (code === 64) {
|
|
2545
|
+
indexOfIdentifier = i;
|
|
2546
|
+
indexOfFirstColon = -1;
|
|
2547
|
+
} else if (code === 93) {
|
|
2548
|
+
indexOfClosingBracket = i;
|
|
2549
|
+
} else if (code >= 65 && code <= 90) {
|
|
2550
|
+
hasUpper = true;
|
|
2551
|
+
} else if (validate && !/*@__INLINE__*/
|
|
2552
|
+
isValidHostnameChar(code)) {
|
|
2553
|
+
vValid = false;
|
|
2554
|
+
}
|
|
2555
|
+
if (validate) {
|
|
2556
|
+
vLastCode = code;
|
|
2557
|
+
}
|
|
2558
|
+
}
|
|
2559
|
+
if (hasControl) {
|
|
2560
|
+
return extractHostname(url.replace(CONTROL_CHARS, ""), urlIsValidHostname, validate);
|
|
2561
|
+
}
|
|
2562
|
+
if (indexOfIdentifier !== -1 && indexOfIdentifier >= start && indexOfIdentifier < end) {
|
|
2563
|
+
start = indexOfIdentifier + 1;
|
|
2564
|
+
}
|
|
2565
|
+
if (url.charCodeAt(start) === 91) {
|
|
2566
|
+
if (indexOfClosingBracket !== -1) {
|
|
2567
|
+
return url.slice(start + 1, indexOfClosingBracket).toLowerCase();
|
|
2568
|
+
}
|
|
2569
|
+
return null;
|
|
2570
|
+
} else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end && // A host:port has exactly one ':' in the host (so its first ':' is its
|
|
2571
|
+
// last); a bare, unbracketed IPv6 literal ("2a01:e35::1") has >= 2, so
|
|
2572
|
+
// its first ':' precedes the last. Only the former has a ':port' to trim.
|
|
2573
|
+
indexOfFirstColon === indexOfPort) {
|
|
2574
|
+
end = indexOfPort;
|
|
2575
|
+
}
|
|
2576
|
+
if (start >= end) {
|
|
2577
|
+
return null;
|
|
2578
|
+
}
|
|
2579
|
+
if (validate && vValid && indexOfIdentifier === -1 && indexOfPort === -1 && indexOfClosingBracket === -1 && url.charCodeAt(end - 1) !== 46 && end - start <= 255 && // total length
|
|
2580
|
+
end - vLastDot - 1 <= 63 && // last label length
|
|
2581
|
+
vLastCode !== 45) {
|
|
2582
|
+
extractedHostnameValidated = true;
|
|
2583
|
+
}
|
|
2584
|
+
}
|
|
2585
|
+
while (end > start + 1 && url.charCodeAt(end - 1) === 46) {
|
|
2586
|
+
end -= 1;
|
|
2587
|
+
}
|
|
2588
|
+
const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url;
|
|
2589
|
+
if (hasUpper) {
|
|
2590
|
+
return hostname.toLowerCase();
|
|
2591
|
+
}
|
|
2592
|
+
return hostname;
|
|
2593
|
+
}
|
|
2594
|
+
|
|
2595
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-ip.js
|
|
2596
|
+
function isProbablyIpv4(hostname) {
|
|
2597
|
+
if (hostname.length < 7) {
|
|
2598
|
+
return false;
|
|
2599
|
+
}
|
|
2600
|
+
if (hostname.length > 15) {
|
|
2601
|
+
return false;
|
|
2602
|
+
}
|
|
2603
|
+
let numberOfDots = 0;
|
|
2604
|
+
for (let i = 0; i < hostname.length; i += 1) {
|
|
2605
|
+
const code = hostname.charCodeAt(i);
|
|
2606
|
+
if (code === 46) {
|
|
2607
|
+
numberOfDots += 1;
|
|
2608
|
+
} else if (code < 48 || code > 57) {
|
|
2609
|
+
return false;
|
|
2610
|
+
}
|
|
2611
|
+
}
|
|
2612
|
+
return numberOfDots === 3 && hostname.charCodeAt(0) !== 46 && hostname.charCodeAt(hostname.length - 1) !== 46;
|
|
2613
|
+
}
|
|
2614
|
+
function isProbablyIpv6(hostname) {
|
|
2615
|
+
if (hostname.length < 3) {
|
|
2616
|
+
return false;
|
|
2617
|
+
}
|
|
2618
|
+
let start = hostname.startsWith("[") ? 1 : 0;
|
|
2619
|
+
let end = hostname.length;
|
|
2620
|
+
if (hostname[end - 1] === "]") {
|
|
2621
|
+
end -= 1;
|
|
2622
|
+
}
|
|
2623
|
+
if (end - start > 39) {
|
|
2624
|
+
return false;
|
|
2625
|
+
}
|
|
2626
|
+
let hasColon = false;
|
|
2627
|
+
for (; start < end; start += 1) {
|
|
2628
|
+
const code = hostname.charCodeAt(start);
|
|
2629
|
+
if (code === 58) {
|
|
2630
|
+
hasColon = true;
|
|
2631
|
+
} else if (!(code >= 48 && code <= 57 || // 0-9
|
|
2632
|
+
code >= 97 && code <= 102 || // a-f
|
|
2633
|
+
code >= 65 && code <= 70)) {
|
|
2634
|
+
return false;
|
|
2635
|
+
}
|
|
2636
|
+
}
|
|
2637
|
+
return hasColon;
|
|
2638
|
+
}
|
|
2639
|
+
function isIp(hostname) {
|
|
2640
|
+
return isProbablyIpv6(hostname) || isProbablyIpv4(hostname);
|
|
2641
|
+
}
|
|
2642
|
+
|
|
2643
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-special-use.js
|
|
2644
|
+
var SPECIAL_USE_DOMAINS = [
|
|
2645
|
+
"test",
|
|
2646
|
+
// RFC 6761
|
|
2647
|
+
"localhost",
|
|
2648
|
+
// RFC 6761
|
|
2649
|
+
"invalid",
|
|
2650
|
+
// RFC 6761
|
|
2651
|
+
"example",
|
|
2652
|
+
// RFC 6761
|
|
2653
|
+
"example.com",
|
|
2654
|
+
// RFC 6761
|
|
2655
|
+
"example.net",
|
|
2656
|
+
// RFC 6761
|
|
2657
|
+
"example.org",
|
|
2658
|
+
// RFC 6761
|
|
2659
|
+
"local",
|
|
2660
|
+
// RFC 6762 (mDNS)
|
|
2661
|
+
"onion",
|
|
2662
|
+
// RFC 7686 (Tor)
|
|
2663
|
+
"alt",
|
|
2664
|
+
// RFC 9476
|
|
2665
|
+
"home.arpa",
|
|
2666
|
+
// RFC 8375
|
|
2667
|
+
"ipv4only.arpa",
|
|
2668
|
+
// RFC 8880
|
|
2669
|
+
"resolver.arpa",
|
|
2670
|
+
// RFC 9462
|
|
2671
|
+
"service.arpa",
|
|
2672
|
+
// RFC 9665
|
|
2673
|
+
"6tisch.arpa",
|
|
2674
|
+
// RFC 9031
|
|
2675
|
+
"eap.arpa"
|
|
2676
|
+
// RFC 9965
|
|
2677
|
+
];
|
|
2678
|
+
function isSpecialUse(hostname) {
|
|
2679
|
+
for (const name of SPECIAL_USE_DOMAINS) {
|
|
2680
|
+
if (hostname.endsWith(name) && (hostname.length === name.length || hostname.charCodeAt(hostname.length - name.length - 1) === 46)) {
|
|
2681
|
+
return true;
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2684
|
+
return false;
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/is-valid.js
|
|
2688
|
+
function isValidAscii(code) {
|
|
2689
|
+
return code >= 97 && code <= 122 || code >= 48 && code <= 57 || code > 127;
|
|
2690
|
+
}
|
|
2691
|
+
function is_valid_default(hostname) {
|
|
2692
|
+
if (hostname.length > 255) {
|
|
2693
|
+
return false;
|
|
2694
|
+
}
|
|
2695
|
+
if (hostname.length === 0) {
|
|
2696
|
+
return false;
|
|
2697
|
+
}
|
|
2698
|
+
if (
|
|
2699
|
+
/*@__INLINE__*/
|
|
2700
|
+
!isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot)
|
|
2701
|
+
hostname.charCodeAt(0) !== 95
|
|
2702
|
+
) {
|
|
2703
|
+
return false;
|
|
2704
|
+
}
|
|
2705
|
+
let lastDotIndex = -1;
|
|
2706
|
+
let lastCharCode = -1;
|
|
2707
|
+
const len = hostname.length;
|
|
2708
|
+
for (let i = 0; i < len; i += 1) {
|
|
2709
|
+
const code = hostname.charCodeAt(i);
|
|
2710
|
+
if (code === 46) {
|
|
2711
|
+
if (
|
|
2712
|
+
// Check that previous label is < 63 bytes long (64 = 63 + '.')
|
|
2713
|
+
i - lastDotIndex > 64 || // Check that previous character was not already a '.'
|
|
2714
|
+
lastCharCode === 46 || // Check that the previous label does not end with '-' (RFC 1035 §2.3.1 LDH).
|
|
2715
|
+
// '_' is intentionally NOT restricted: DNS allows any octet (RFC 2181 §11) and
|
|
2716
|
+
// WHATWG URL does not treat '_' as a forbidden host code point.
|
|
2717
|
+
lastCharCode === 45
|
|
2718
|
+
) {
|
|
2719
|
+
return false;
|
|
2720
|
+
}
|
|
2721
|
+
lastDotIndex = i;
|
|
2722
|
+
} else if (
|
|
2723
|
+
// A forbidden character in the label...
|
|
2724
|
+
!/*@__INLINE__*/
|
|
2725
|
+
(isValidAscii(code) || code === 45 || code === 95) || // ...or a '-' starting a label (the byte right after a '.'). A label must
|
|
2726
|
+
// not begin with a hyphen (RFC 1034 §3.5 / RFC 1035 §2.3.1 LDH, as amended
|
|
2727
|
+
// by RFC 1123 §2.1; cf. UTS #46 CheckHyphens). The first label is covered by
|
|
2728
|
+
// the leading-character guard above; mirrors the trailing-'-' rule below.
|
|
2729
|
+
code === 45 && lastCharCode === 46
|
|
2730
|
+
) {
|
|
2731
|
+
return false;
|
|
2732
|
+
}
|
|
2733
|
+
lastCharCode = code;
|
|
2734
|
+
}
|
|
2735
|
+
return (
|
|
2736
|
+
// Check that last label is shorter than 63 chars
|
|
2737
|
+
len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character.
|
|
2738
|
+
// Since we already checked that the char is a valid hostname character,
|
|
2739
|
+
// we only need to check that it's different from '-'.
|
|
2740
|
+
lastCharCode !== 45
|
|
2741
|
+
);
|
|
2742
|
+
}
|
|
2743
|
+
|
|
2744
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/options.js
|
|
2745
|
+
function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, detectSpecialUse = false, extractHostname: extractHostname2 = true, mixedInputs = true, validHosts = null, validateHostname = true }) {
|
|
2746
|
+
return {
|
|
2747
|
+
allowIcannDomains,
|
|
2748
|
+
allowPrivateDomains,
|
|
2749
|
+
detectIp,
|
|
2750
|
+
detectSpecialUse,
|
|
2751
|
+
extractHostname: extractHostname2,
|
|
2752
|
+
mixedInputs,
|
|
2753
|
+
validHosts,
|
|
2754
|
+
validateHostname
|
|
2755
|
+
};
|
|
2756
|
+
}
|
|
2757
|
+
var DEFAULT_OPTIONS = (
|
|
2758
|
+
/*@__INLINE__*/
|
|
2759
|
+
setDefaultsImpl({})
|
|
2760
|
+
);
|
|
2761
|
+
function setDefaults(options) {
|
|
2762
|
+
if (options === void 0) {
|
|
2763
|
+
return DEFAULT_OPTIONS;
|
|
2764
|
+
}
|
|
2765
|
+
return (
|
|
2766
|
+
/*@__INLINE__*/
|
|
2767
|
+
setDefaultsImpl(options)
|
|
2768
|
+
);
|
|
2769
|
+
}
|
|
2770
|
+
|
|
2771
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/subdomain.js
|
|
2772
|
+
function getSubdomain(hostname, domain) {
|
|
2773
|
+
if (domain.length === hostname.length) {
|
|
2774
|
+
return "";
|
|
2775
|
+
}
|
|
2776
|
+
return hostname.slice(0, -domain.length - 1);
|
|
2777
|
+
}
|
|
2778
|
+
|
|
2779
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/factory.js
|
|
2780
|
+
function getEmptyResult() {
|
|
2781
|
+
return {
|
|
2782
|
+
domain: null,
|
|
2783
|
+
domainWithoutSuffix: null,
|
|
2784
|
+
hostname: null,
|
|
2785
|
+
isIcann: null,
|
|
2786
|
+
isIp: null,
|
|
2787
|
+
isPrivate: null,
|
|
2788
|
+
isSpecialUse: null,
|
|
2789
|
+
publicSuffix: null,
|
|
2790
|
+
subdomain: null
|
|
2791
|
+
};
|
|
2792
|
+
}
|
|
2793
|
+
function resetResult(result) {
|
|
2794
|
+
result.domain = null;
|
|
2795
|
+
result.domainWithoutSuffix = null;
|
|
2796
|
+
result.hostname = null;
|
|
2797
|
+
result.isIcann = null;
|
|
2798
|
+
result.isIp = null;
|
|
2799
|
+
result.isPrivate = null;
|
|
2800
|
+
result.isSpecialUse = null;
|
|
2801
|
+
result.publicSuffix = null;
|
|
2802
|
+
result.subdomain = null;
|
|
2803
|
+
}
|
|
2804
|
+
function parseImpl(url, step, suffixLookup2, partialOptions, result) {
|
|
2805
|
+
const options = (
|
|
2806
|
+
/*@__INLINE__*/
|
|
2807
|
+
setDefaults(partialOptions)
|
|
2808
|
+
);
|
|
2809
|
+
if (typeof url !== "string") {
|
|
2810
|
+
return result;
|
|
2811
|
+
}
|
|
2812
|
+
let urlIsValid = false;
|
|
2813
|
+
if (!options.extractHostname) {
|
|
2814
|
+
result.hostname = url;
|
|
2815
|
+
} else if (options.mixedInputs) {
|
|
2816
|
+
urlIsValid = is_valid_default(url);
|
|
2817
|
+
result.hostname = extractHostname(url, urlIsValid, options.validateHostname);
|
|
2818
|
+
} else {
|
|
2819
|
+
result.hostname = extractHostname(url, false, options.validateHostname);
|
|
2820
|
+
}
|
|
2821
|
+
if (options.detectIp && result.hostname !== null) {
|
|
2822
|
+
result.isIp = isIp(result.hostname);
|
|
2823
|
+
if (result.isIp) {
|
|
2824
|
+
return result;
|
|
2825
|
+
}
|
|
2826
|
+
}
|
|
2827
|
+
if (options.validateHostname && options.extractHostname && result.hostname !== null && // Skip the re-scan when `url` was already validated and extractHostname
|
|
2828
|
+
// returned it unchanged (same reference => identical string, still valid).
|
|
2829
|
+
!(urlIsValid && result.hostname === url) && // Skip the re-scan when extractHostname already validated the host inline
|
|
2830
|
+
// (a confirmed-valid simple authority — see extract-hostname.ts).
|
|
2831
|
+
!extractedHostnameValidated && !is_valid_default(result.hostname)) {
|
|
2832
|
+
result.hostname = null;
|
|
2833
|
+
return result;
|
|
2834
|
+
}
|
|
2835
|
+
if (step === 0 || result.hostname === null) {
|
|
2836
|
+
return result;
|
|
2837
|
+
}
|
|
2838
|
+
if (step === 5 && options.detectSpecialUse) {
|
|
2839
|
+
result.isSpecialUse = isSpecialUse(result.hostname);
|
|
2840
|
+
}
|
|
2841
|
+
suffixLookup2(result.hostname, options, result);
|
|
2842
|
+
if (step === 2 || result.publicSuffix === null) {
|
|
2843
|
+
return result;
|
|
2844
|
+
}
|
|
2845
|
+
result.domain = getDomain(result.publicSuffix, result.hostname, options);
|
|
2846
|
+
if (step === 3 || result.domain === null) {
|
|
2847
|
+
return result;
|
|
2848
|
+
}
|
|
2849
|
+
result.subdomain = getSubdomain(result.hostname, result.domain);
|
|
2850
|
+
if (step === 4) {
|
|
2851
|
+
return result;
|
|
2852
|
+
}
|
|
2853
|
+
result.domainWithoutSuffix = getDomainWithoutSuffix(result.domain, result.publicSuffix);
|
|
2854
|
+
return result;
|
|
2855
|
+
}
|
|
2856
|
+
|
|
2857
|
+
// ../../node_modules/.pnpm/tldts-core@7.4.9/node_modules/tldts-core/dist/es6/src/lookup/fast-path.js
|
|
2858
|
+
function fast_path_default(hostname, options, out) {
|
|
2859
|
+
if (!options.allowPrivateDomains && hostname.length > 3) {
|
|
2860
|
+
const last = hostname.length - 1;
|
|
2861
|
+
const c3 = hostname.charCodeAt(last);
|
|
2862
|
+
const c2 = hostname.charCodeAt(last - 1);
|
|
2863
|
+
const c1 = hostname.charCodeAt(last - 2);
|
|
2864
|
+
const c0 = hostname.charCodeAt(last - 3);
|
|
2865
|
+
if (c3 === 109 && c2 === 111 && c1 === 99 && c0 === 46) {
|
|
2866
|
+
out.isIcann = true;
|
|
2867
|
+
out.isPrivate = false;
|
|
2868
|
+
out.publicSuffix = "com";
|
|
2869
|
+
return true;
|
|
2870
|
+
} else if (c3 === 103 && c2 === 114 && c1 === 111 && c0 === 46) {
|
|
2871
|
+
out.isIcann = true;
|
|
2872
|
+
out.isPrivate = false;
|
|
2873
|
+
out.publicSuffix = "org";
|
|
2874
|
+
return true;
|
|
2875
|
+
} else if (c3 === 117 && c2 === 100 && c1 === 101 && c0 === 46) {
|
|
2876
|
+
out.isIcann = true;
|
|
2877
|
+
out.isPrivate = false;
|
|
2878
|
+
out.publicSuffix = "edu";
|
|
2879
|
+
return true;
|
|
2880
|
+
} else if (c3 === 118 && c2 === 111 && c1 === 103 && c0 === 46) {
|
|
2881
|
+
out.isIcann = true;
|
|
2882
|
+
out.isPrivate = false;
|
|
2883
|
+
out.publicSuffix = "gov";
|
|
2884
|
+
return true;
|
|
2885
|
+
} else if (c3 === 116 && c2 === 101 && c1 === 110 && c0 === 46) {
|
|
2886
|
+
out.isIcann = true;
|
|
2887
|
+
out.isPrivate = false;
|
|
2888
|
+
out.publicSuffix = "net";
|
|
2889
|
+
return true;
|
|
2890
|
+
} else if (c3 === 101 && c2 === 100 && c1 === 46) {
|
|
2891
|
+
out.isIcann = true;
|
|
2892
|
+
out.isPrivate = false;
|
|
2893
|
+
out.publicSuffix = "de";
|
|
2894
|
+
return true;
|
|
2895
|
+
}
|
|
2896
|
+
}
|
|
2897
|
+
return false;
|
|
2898
|
+
}
|
|
2899
|
+
|
|
2900
|
+
// ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/src/data/trie.js
|
|
2901
|
+
var nodeFlags = /* @__PURE__ */ new Uint8Array([1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 1, 0, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 2, 0, 1, 1, 0, 2, 0, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]);
|
|
2902
|
+
var edgeStart = /* @__PURE__ */ new Uint16Array([0, 0, 0, 10, 11, 18, 106, 111, 117, 124, 130, 136, 145, 146, 147, 148, 149, 150, 151, 153, 154, 155, 157, 159, 226, 239, 241, 242, 243, 258, 265, 266, 269, 270, 271, 274, 276, 295, 296, 298, 307, 312, 313, 331, 332, 335, 337, 338, 340, 374, 375, 377, 380, 381, 385, 387, 391, 394, 426, 429, 442, 443, 451, 452, 454, 464, 478, 479, 480, 489, 490, 527, 532, 548, 568, 574, 615, 616, 643, 670, 671, 819, 825, 828, 829, 830, 835, 840, 849, 871, 872, 873, 874, 875, 876, 877, 895, 897, 898, 901, 903, 904, 906, 908, 923, 938, 943, 944, 946, 947, 948, 949, 950, 952, 955, 960, 961, 962, 964, 965, 968, 971, 972, 973, 986, 988, 1e3, 1011, 1019, 1021, 1061, 1064, 1068, 1069, 1071, 1074, 1085, 1087, 1097, 1099, 1105, 1107, 1108, 1110, 1113, 1114, 1115, 1167, 1169, 1171, 1191, 1192, 1193, 1194, 1196, 1207, 1238, 1249, 1261, 1270, 1277, 1282, 1295, 1306, 1319, 1320, 1331, 1365, 1366, 1367, 1382, 1397, 1469, 1470, 1472, 1473, 1507, 1508, 1509, 1512, 1516, 1518, 1547, 1548, 1556, 1557, 1558, 1560, 1562, 1563, 1565, 1566, 1567, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1594, 1595, 1596, 1598, 2053, 2056, 2057, 2059, 2066, 2073, 2083, 2087, 2098, 2099, 2100, 2112, 2113, 2115, 2117, 2118, 2125, 2126, 2128, 2129, 2131, 2132, 2133, 2134, 2135, 2209, 2211, 2232, 2233, 2234, 2236, 2262, 2263, 2314, 2315, 2317, 2324, 2330, 2340, 2350, 2403, 2404, 2405, 2415, 2429, 2430, 2433, 2440, 2441, 2449, 2450, 2451, 2452, 2453, 2464, 2465, 2466, 2468, 2469, 2470, 2471, 2473, 2483, 2495, 2501, 2533, 2537, 2539, 2540, 2542, 2543, 2554, 2555, 2557, 2565, 2572, 2578, 2583, 2584, 2590, 2593, 2599, 2606, 2607, 2614, 2622, 2623, 2624, 2662, 2668, 2683, 2684, 2689, 2707, 2738, 2756, 2758, 2761, 2769, 2771, 2778, 2830, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2868, 2869, 2870, 2871, 2872, 2873, 2875, 2876, 2880, 2964, 2977, 2978, 3414, 3418, 3432, 3484, 3512, 3534, 3592, 3614, 3629, 3692, 3743, 3781, 3817, 3842, 3984, 4030, 4081, 4100, 4134, 4149, 4169, 4199, 4230, 4253, 4284, 4314, 4346, 4373, 4448, 4470, 4508, 4518, 4552, 4571, 4597, 4639, 4689, 4715, 4784, 4785, 4787, 4810, 4833, 4869, 4900, 4917, 4974, 4987, 5011, 5040, 5042, 5076, 5092, 5120, 5425, 5434, 5443, 5450, 5467, 5471, 5477, 5516, 5518, 5525, 5532, 5541, 5548, 5549, 5560, 5563, 5578, 5579, 5588, 5589, 5598, 5607, 5613, 5615, 5616, 5617, 5653, 5654, 5656, 5664, 5671, 5684, 5688, 5690, 5691, 5697, 5704, 5718, 5728, 5733, 5741, 5749, 5755, 5756, 5760, 5762, 5763, 5775, 5776, 5777, 5778, 5780, 5781, 5784, 5786, 5789, 5793, 5794, 5800, 5801, 5802, 5804, 5806, 5808, 5809, 5810, 5813, 5815, 5818, 5819, 5821, 6019, 6026, 6027, 6037, 6042, 6059, 6073, 6082, 6083, 6084, 6088, 6089, 6091, 6093, 6099, 6100, 6103, 6104, 6106, 6107, 6108, 7008, 7009, 7013, 7031, 7040, 7043, 7050, 7051, 7053, 7054, 7055, 7057, 7109, 7110, 7113, 7114, 7231, 7232, 7243, 7254, 7261, 7264, 7273, 7274, 7275, 7290, 7345, 7536, 7538, 7539, 7541, 7546, 7559, 7574, 7581, 7590, 7593, 7596, 7603, 7611, 7615, 7616, 7617, 7631, 7635, 7644, 7645, 7646, 7650, 7685, 7686, 7703, 7710, 7718, 7719, 7724, 7732, 7776, 7777, 7783, 7786, 7797, 7802, 7803, 7806, 7839, 7840, 7846, 7853, 7854, 7863, 7872, 7887, 7891, 7943, 7944, 7949, 7951, 7954, 7956, 7957, 7958, 7967, 7981, 7989, 8003, 8015, 8016, 8018, 8020, 8042, 8053, 8059, 8060, 8072, 8084, 8171, 8183, 8185, 8194, 8197, 8203, 8228, 8231, 8232, 8233, 8235, 8238, 8241, 8252, 8254, 8256, 8284, 8358, 8365, 8369, 8370, 8379, 8401, 8402, 8407, 8408, 8487, 8489, 8491, 8500, 8504, 8510, 8516, 8522, 8532, 8537, 8538, 8556, 8567, 8572, 8577, 8587, 8593, 8597, 8603, 8609, 10217, 10218, 10219, 10226, 10228]);
|
|
2903
|
+
var edgeLength = /* @__PURE__ */ new Uint8Array([3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 8, 2, 2, 3, 3, 3, 3, 3, 8, 5, 5, 5, 5, 5, 3, 3, 5, 5, 9, 12, 19, 8, 19, 8, 11, 9, 9, 8, 7, 7, 6, 8, 9, 16, 10, 7, 7, 11, 8, 6, 6, 9, 7, 11, 7, 14, 4, 4, 4, 4, 4, 4, 10, 7, 6, 6, 6, 6, 10, 10, 6, 10, 10, 22, 11, 9, 10, 10, 10, 9, 10, 8, 7, 7, 7, 8, 21, 13, 11, 11, 9, 10, 9, 13, 10, 8, 8, 9, 12, 9, 7, 10, 7, 7, 13, 7, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 7, 8, 5, 2, 2, 7, 2, 2, 1, 4, 1, 11, 9, 9, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 11, 9, 9, 13, 7, 14, 7, 6, 6, 6, 7, 6, 6, 6, 6, 6, 10, 7, 11, 9, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 8, 7, 10, 9, 9, 9, 8, 9, 8, 10, 6, 9, 9, 8, 10, 10, 7, 8, 1, 9, 10, 12, 12, 12, 10, 9, 9, 10, 10, 9, 9, 1, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 4, 3, 3, 3, 7, 4, 4, 4, 3, 3, 6, 7, 3, 4, 1, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 12, 5, 3, 8, 9, 13, 4, 4, 13, 9, 9, 11, 7, 3, 12, 9, 2, 2, 2, 3, 3, 3, 3, 3, 8, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 7, 10, 15, 7, 15, 15, 20, 15, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 7, 8, 6, 8, 8, 6, 8, 13, 8, 8, 6, 13, 8, 11, 13, 8, 6, 13, 8, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 9, 9, 9, 10, 14, 14, 11, 13, 13, 9, 9, 9, 9, 9, 9, 2, 6, 9, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 3, 3, 3, 3, 3, 3, 7, 7, 2, 3, 2, 2, 5, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 7, 2, 2, 12, 8, 10, 8, 10, 7, 18, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 3, 3, 3, 5, 5, 3, 8, 8, 6, 8, 6, 6, 4, 6, 7, 7, 7, 10, 11, 2, 5, 5, 3, 3, 3, 3, 3, 3, 5, 5, 6, 11, 10, 7, 7, 7, 4, 4, 4, 2, 3, 3, 3, 3, 3, 2, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 11, 7, 6, 9, 6, 6, 8, 10, 8, 6, 8, 13, 4, 4, 4, 4, 4, 10, 8, 11, 8, 8, 8, 10, 10, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 10, 13, 7, 8, 7, 11, 8, 8, 6, 9, 8, 8, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 9, 7, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 9, 7, 8, 10, 8, 8, 2, 3, 3, 3, 3, 3, 2, 8, 9, 9, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 9, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 5, 3, 5, 4, 2, 3, 2, 4, 3, 9, 2, 2, 2, 2, 2, 5, 5, 3, 8, 8, 13, 6, 10, 9, 4, 7, 9, 11, 2, 3, 7, 3, 3, 4, 1, 3, 4, 2, 9, 3, 3, 12, 5, 3, 7, 10, 10, 7, 4, 4, 6, 14, 7, 9, 7, 13, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 8, 15, 4, 4, 2, 3, 3, 3, 7, 4, 9, 9, 2, 3, 3, 3, 5, 3, 2, 2, 7, 2, 7, 6, 6, 7, 2, 4, 2, 2, 2, 2, 2, 2, 8, 8, 8, 9, 5, 2, 3, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 4, 2, 3, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 2, 3, 3, 3, 3, 10, 7, 4, 4, 4, 4, 3, 9, 6, 6, 6, 9, 13, 9, 2, 2, 2, 8, 7, 9, 5, 3, 3, 3, 5, 5, 12, 9, 10, 7, 8, 7, 6, 8, 6, 11, 12, 7, 9, 10, 4, 4, 7, 8, 11, 6, 7, 9, 8, 7, 10, 8, 9, 15, 7, 8, 5, 4, 7, 2, 3, 3, 3, 2, 14, 10, 2, 14, 10, 2, 14, 3, 9, 13, 13, 10, 14, 16, 17, 11, 2, 14, 2, 14, 3, 9, 13, 10, 14, 16, 17, 11, 14, 10, 14, 2, 7, 3, 10, 7, 14, 10, 2, 14, 10, 9, 9, 17, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 10, 10, 10, 12, 9, 4, 10, 11, 8, 8, 8, 7, 9, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 4, 4, 4, 4, 4, 4, 6, 16, 3, 3, 14, 3, 14, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 9, 9, 9, 9, 9, 9, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 17, 13, 10, 10, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 14, 16, 17, 11, 2, 14, 9, 13, 10, 16, 11, 2, 14, 10, 19, 7, 2, 14, 9, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 10, 19, 7, 14, 16, 17, 11, 2, 14, 9, 13, 17, 13, 10, 10, 14, 16, 17, 11, 6, 3, 2, 14, 9, 13, 10, 10, 14, 16, 17, 11, 6, 9, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 14, 10, 10, 10, 14, 9, 9, 9, 9, 14, 14, 14, 13, 13, 14, 9, 9, 9, 9, 9, 9, 4, 11, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 14, 9, 13, 17, 13, 10, 19, 10, 7, 14, 16, 17, 11, 6, 2, 9, 10, 10, 7, 17, 3, 3, 12, 12, 16, 15, 15, 12, 14, 14, 14, 20, 20, 13, 12, 12, 12, 12, 12, 12, 20, 25, 14, 14, 12, 12, 10, 10, 10, 10, 9, 9, 9, 25, 4, 9, 17, 10, 7, 14, 16, 21, 13, 13, 14, 20, 14, 13, 17, 24, 9, 12, 13, 25, 13, 21, 20, 17, 9, 9, 9, 9, 9, 9, 12, 17, 4, 4, 9, 9, 9, 10, 10, 12, 14, 14, 14, 12, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 9, 1, 8, 7, 11, 11, 1, 3, 3, 3, 4, 8, 9, 10, 14, 14, 12, 12, 12, 12, 14, 14, 10, 10, 10, 10, 14, 9, 9, 9, 10, 14, 14, 14, 13, 13, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 12, 6, 14, 4, 12, 7, 2, 2, 1, 2, 7, 6, 4, 4, 4, 6, 8, 8, 7, 4, 5, 6, 3, 3, 3, 3, 4, 16, 8, 3, 5, 4, 3, 3, 3, 5, 2, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 12, 7, 7, 13, 9, 10, 12, 8, 9, 7, 8, 5, 12, 10, 13, 14, 5, 5, 5, 13, 5, 5, 5, 3, 3, 3, 5, 16, 5, 5, 5, 5, 5, 7, 12, 14, 8, 12, 8, 10, 12, 9, 11, 7, 9, 7, 10, 7, 13, 9, 7, 12, 8, 17, 7, 7, 16, 10, 13, 13, 8, 10, 10, 14, 17, 7, 16, 16, 15, 8, 10, 10, 12, 17, 7, 17, 14, 7, 10, 17, 8, 7, 7, 7, 8, 15, 15, 7, 14, 10, 10, 10, 11, 11, 7, 7, 13, 8, 10, 7, 16, 7, 8, 7, 14, 17, 12, 10, 11, 21, 8, 9, 7, 13, 9, 8, 13, 6, 12, 7, 6, 13, 10, 10, 10, 8, 18, 9, 17, 13, 10, 12, 6, 13, 6, 11, 8, 13, 10, 13, 18, 13, 11, 13, 8, 16, 7, 10, 8, 16, 12, 10, 8, 8, 6, 14, 11, 8, 15, 8, 8, 7, 7, 12, 7, 8, 9, 14, 15, 8, 9, 10, 9, 15, 7, 8, 8, 12, 13, 9, 10, 15, 15, 13, 7, 10, 10, 20, 7, 6, 9, 6, 6, 14, 11, 14, 11, 12, 9, 10, 16, 16, 12, 7, 11, 28, 8, 11, 10, 7, 21, 8, 7, 9, 4, 4, 4, 17, 7, 8, 6, 9, 6, 6, 13, 6, 6, 6, 6, 18, 20, 14, 8, 11, 12, 9, 10, 13, 15, 19, 8, 9, 12, 7, 10, 16, 12, 9, 9, 9, 14, 12, 11, 9, 12, 11, 18, 9, 9, 9, 10, 7, 7, 16, 8, 9, 7, 13, 12, 10, 18, 7, 8, 11, 7, 7, 8, 8, 13, 7, 7, 7, 11, 15, 13, 11, 7, 8, 15, 11, 7, 8, 18, 14, 13, 18, 15, 10, 12, 12, 9, 7, 11, 11, 8, 7, 10, 8, 14, 12, 10, 18, 7, 10, 9, 7, 8, 13, 10, 14, 9, 10, 8, 8, 23, 7, 7, 11, 12, 12, 17, 7, 7, 11, 11, 17, 16, 16, 7, 8, 11, 14, 14, 8, 10, 7, 7, 16, 16, 13, 9, 11, 9, 15, 15, 11, 11, 7, 7, 14, 7, 9, 7, 7, 16, 10, 13, 10, 11, 14, 7, 11, 10, 11, 7, 11, 10, 11, 15, 11, 15, 10, 12, 17, 10, 14, 13, 11, 11, 12, 13, 10, 7, 13, 10, 16, 12, 21, 9, 10, 10, 7, 11, 14, 17, 7, 7, 8, 11, 12, 8, 15, 14, 14, 8, 17, 12, 10, 10, 7, 9, 11, 7, 10, 7, 11, 18, 7, 11, 7, 12, 11, 8, 8, 14, 12, 7, 8, 15, 3, 7, 7, 5, 2, 9, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 5, 11, 6, 4, 7, 10, 7, 7, 11, 1, 10, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 3, 5, 6, 3, 3, 5, 2, 2, 5, 3, 4, 13, 11, 3, 3, 6, 3, 5, 14, 2, 2, 3, 8, 2, 2, 12, 5, 18, 5, 3, 3, 3, 16, 5, 5, 5, 10, 7, 13, 12, 13, 9, 12, 14, 19, 9, 9, 21, 9, 9, 10, 6, 9, 6, 15, 10, 6, 12, 8, 6, 10, 15, 4, 4, 6, 6, 9, 9, 12, 16, 14, 23, 7, 7, 7, 14, 9, 7, 7, 11, 14, 10, 7, 10, 10, 10, 12, 6, 11, 10, 13, 11, 15, 11, 7, 12, 10, 3, 7, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 3, 7, 2, 5, 5, 3, 3, 5, 5, 5, 5, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 7, 10, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 5, 5, 10, 9, 11, 8, 7, 12, 8, 9, 7, 6, 13, 11, 6, 13, 7, 9, 9, 4, 4, 4, 4, 4, 4, 6, 10, 7, 8, 13, 8, 8, 9, 14, 8, 10, 7, 7, 7, 9, 6, 9, 7, 2, 12, 5, 3, 3, 13, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 7, 6, 4, 12, 3, 3, 3, 3, 3, 8, 7, 3, 3, 3, 3, 3, 3, 4, 4, 11, 14, 2, 8, 3, 5, 5, 8, 10, 8, 6, 4, 7, 17, 7, 4, 5, 2, 6, 3, 5, 2, 4, 4, 2, 12, 5, 5, 3, 15, 13, 10, 8, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 3, 3, 3, 3, 4, 18, 2, 12, 5, 3, 3, 3, 3, 3, 5, 16, 8, 8, 9, 6, 6, 4, 4, 4, 4, 31, 6, 6, 10, 11, 21, 10, 9, 7, 10, 7, 7, 2, 4, 4, 4, 4, 6, 5, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 2, 2, 2, 5, 3, 3, 3, 7, 7, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 8, 2, 3, 3, 3, 3, 3, 5, 9, 11, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 5, 10, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 11, 10, 10, 10, 10, 10, 11, 10, 11, 10, 11, 10, 9, 9, 11, 3, 3, 3, 3, 3, 3, 5, 3, 7, 8, 8, 7, 6, 6, 11, 4, 4, 4, 7, 8, 9, 9, 2, 3, 7, 4, 4, 2, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 9, 12, 3, 7, 10, 7, 2, 2, 3, 3, 3, 3, 3, 4, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 6, 6, 8, 6, 7, 4, 4, 4, 4, 4, 4, 6, 7, 5, 5, 20, 19, 8, 10, 9, 7, 10, 6, 8, 11, 6, 6, 6, 6, 13, 12, 8, 6, 7, 14, 11, 9, 2, 5, 3, 3, 6, 2, 3, 2, 2, 2, 2, 2, 2, 2, 5, 4, 3, 7, 6, 4, 7, 4, 3, 6, 4, 7, 2, 7, 7, 7, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 9, 10, 10, 8, 11, 7, 8, 20, 7, 8, 9, 8, 12, 6, 6, 6, 8, 9, 8, 12, 6, 6, 8, 13, 10, 12, 6, 6, 7, 7, 8, 9, 6, 4, 4, 4, 4, 4, 4, 4, 10, 6, 6, 6, 7, 14, 11, 10, 7, 8, 10, 8, 11, 14, 11, 11, 9, 7, 9, 8, 11, 9, 17, 10, 9, 2, 2, 2, 9, 3, 3, 3, 3, 15, 14, 9, 5, 5, 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 12, 22, 19, 17, 18, 18, 19, 21, 7, 16, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 7, 16, 11, 11, 7, 7, 7, 7, 17, 7, 8, 12, 15, 9, 19, 7, 19, 8, 16, 21, 11, 12, 19, 14, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 16, 19, 24, 12, 7, 14, 7, 12, 7, 8, 10, 10, 13, 7, 12, 12, 7, 7, 10, 18, 15, 12, 16, 7, 14, 12, 17, 10, 16, 17, 12, 17, 25, 7, 7, 7, 13, 6, 9, 6, 9, 18, 6, 6, 11, 20, 10, 6, 6, 6, 6, 6, 6, 6, 17, 6, 6, 6, 15, 6, 6, 6, 6, 6, 8, 14, 11, 12, 15, 13, 19, 17, 21, 7, 18, 8, 13, 13, 8, 12, 8, 6, 6, 13, 6, 15, 15, 16, 6, 6, 16, 6, 6, 6, 14, 6, 18, 6, 6, 6, 17, 18, 9, 13, 15, 8, 19, 8, 15, 15, 18, 14, 16, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 11, 10, 11, 6, 21, 23, 12, 17, 12, 11, 14, 13, 22, 15, 15, 11, 12, 14, 12, 7, 12, 8, 14, 12, 18, 10, 8, 16, 19, 17, 12, 14, 15, 8, 9, 19, 17, 12, 13, 13, 15, 18, 13, 23, 24, 23, 21, 17, 24, 8, 21, 8, 14, 14, 16, 14, 8, 8, 15, 20, 8, 19, 21, 9, 8, 13, 12, 13, 15, 11, 8, 11, 9, 9, 8, 11, 8, 21, 14, 21, 15, 15, 13, 7, 19, 7, 7, 7, 7, 7, 7, 16, 12, 17, 18, 7, 7, 11, 11, 7, 9, 9, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 10, 10, 7, 9, 7, 7, 7, 6, 8, 6, 6, 6, 6, 6, 6, 6, 7, 6, 8, 6, 6, 9, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 8, 9, 8, 7, 8, 7, 8, 10, 7, 5, 5, 5, 5, 5, 5, 3, 9, 7, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 9, 11, 13, 7, 8, 9, 9, 5, 5, 5, 7, 8, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 7, 10, 9, 10, 7, 8, 5, 5, 5, 5, 5, 5, 7, 7, 9, 8, 7, 7, 6, 6, 6, 6, 6, 6, 10, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 10, 4, 4, 4, 4, 8, 7, 7, 10, 10, 9, 8, 8, 15, 9, 8, 8, 8, 8, 8, 9, 10, 9, 10, 7, 8, 13, 5, 5, 5, 5, 5, 3, 3, 7, 7, 8, 6, 6, 6, 4, 4, 11, 9, 7, 8, 9, 10, 7, 5, 5, 5, 5, 5, 3, 3, 7, 6, 6, 13, 7, 9, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 7, 8, 7, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 6, 7, 6, 7, 6, 6, 9, 7, 4, 4, 4, 4, 4, 4, 4, 7, 8, 7, 8, 9, 8, 8, 8, 7, 10, 7, 8, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 7, 9, 7, 10, 9, 6, 6, 6, 6, 6, 8, 8, 6, 6, 6, 7, 6, 6, 6, 9, 9, 4, 4, 13, 7, 10, 9, 9, 12, 7, 8, 8, 10, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 11, 7, 9, 8, 8, 6, 6, 10, 6, 8, 8, 8, 6, 7, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 8, 16, 8, 9, 8, 7, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 10, 15, 8, 9, 8, 9, 9, 6, 6, 6, 6, 6, 6, 7, 4, 8, 7, 8, 8, 7, 8, 11, 8, 5, 5, 5, 5, 5, 3, 7, 7, 6, 11, 16, 7, 6, 4, 4, 4, 4, 9, 9, 8, 8, 8, 13, 12, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 7, 8, 8, 9, 13, 7, 7, 7, 9, 8, 8, 9, 12, 7, 12, 7, 12, 8, 7, 10, 12, 9, 9, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 9, 11, 8, 6, 6, 6, 6, 6, 12, 7, 6, 6, 6, 9, 7, 7, 6, 6, 6, 6, 6, 11, 9, 6, 6, 6, 6, 6, 7, 9, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 7, 7, 7, 7, 7, 11, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 7, 7, 11, 11, 7, 12, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 13, 12, 8, 8, 8, 8, 7, 7, 7, 9, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 11, 7, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 11, 6, 7, 9, 4, 4, 4, 4, 4, 4, 9, 9, 8, 9, 8, 8, 8, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 11, 7, 7, 7, 9, 6, 6, 11, 8, 10, 6, 6, 6, 12, 8, 8, 7, 6, 6, 8, 7, 4, 4, 4, 4, 4, 4, 4, 4, 9, 10, 9, 9, 8, 10, 9, 11, 8, 5, 5, 5, 7, 6, 6, 8, 7, 4, 4, 4, 4, 8, 7, 7, 8, 7, 8, 8, 5, 5, 5, 5, 7, 7, 8, 8, 8, 6, 6, 6, 6, 6, 10, 8, 9, 13, 6, 7, 6, 6, 8, 7, 8, 4, 4, 4, 4, 11, 8, 8, 8, 10, 5, 5, 8, 7, 8, 13, 8, 7, 6, 8, 6, 9, 7, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 6, 4, 8, 10, 10, 8, 12, 9, 13, 2, 7, 5, 5, 5, 5, 5, 7, 7, 10, 6, 6, 6, 6, 6, 6, 6, 8, 4, 4, 9, 8, 8, 8, 14, 8, 8, 8, 9, 8, 5, 5, 5, 5, 5, 3, 3, 9, 6, 6, 6, 6, 10, 12, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 11, 8, 7, 8, 8, 8, 5, 5, 3, 3, 3, 3, 7, 7, 6, 8, 6, 8, 11, 7, 6, 6, 6, 7, 4, 8, 11, 9, 10, 5, 5, 5, 3, 3, 3, 7, 7, 8, 9, 8, 15, 9, 6, 6, 6, 6, 6, 6, 11, 11, 4, 4, 4, 4, 4, 7, 9, 9, 10, 8, 7, 5, 5, 5, 5, 5, 5, 3, 3, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 7, 4, 4, 4, 4, 4, 9, 9, 8, 8, 10, 13, 5, 5, 5, 3, 17, 7, 7, 7, 7, 7, 8, 6, 8, 13, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 9, 10, 8, 8, 8, 5, 5, 5, 5, 3, 7, 7, 7, 8, 8, 6, 6, 6, 8, 8, 8, 9, 10, 8, 4, 8, 10, 9, 8, 8, 8, 9, 13, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 8, 9, 9, 7, 7, 7, 10, 9, 9, 8, 9, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 8, 8, 9, 9, 10, 8, 9, 7, 7, 5, 5, 5, 5, 5, 5, 3, 7, 8, 7, 6, 6, 8, 6, 6, 10, 4, 7, 8, 9, 12, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 7, 14, 7, 9, 8, 8, 6, 6, 8, 12, 12, 6, 6, 7, 7, 10, 4, 4, 4, 4, 4, 9, 9, 14, 9, 13, 8, 7, 5, 5, 5, 6, 6, 6, 7, 4, 8, 7, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 7, 7, 7, 8, 6, 6, 6, 6, 6, 6, 12, 6, 6, 6, 6, 4, 4, 9, 9, 8, 8, 11, 7, 7, 7, 5, 5, 5, 3, 9, 8, 6, 6, 7, 4, 4, 4, 4, 4, 4, 8, 8, 11, 5, 5, 5, 7, 7, 7, 9, 6, 6, 6, 6, 6, 6, 9, 8, 4, 4, 4, 4, 7, 12, 9, 8, 8, 8, 7, 10, 10, 5, 5, 5, 5, 5, 5, 5, 3, 11, 14, 8, 7, 8, 8, 6, 6, 6, 6, 6, 8, 7, 6, 6, 6, 7, 6, 8, 9, 4, 4, 4, 7, 8, 9, 7, 9, 7, 7, 9, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 9, 7, 7, 12, 14, 8, 6, 6, 12, 11, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 7, 4, 4, 4, 16, 9, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 8, 13, 11, 8, 5, 5, 5, 5, 3, 7, 6, 6, 8, 8, 8, 6, 6, 7, 10, 7, 4, 4, 4, 4, 9, 7, 8, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 7, 7, 7, 9, 6, 6, 6, 6, 6, 8, 8, 7, 7, 9, 6, 6, 6, 7, 6, 6, 6, 6, 6, 15, 4, 4, 4, 4, 4, 8, 8, 7, 8, 12, 9, 8, 8, 8, 8, 8, 9, 8, 8, 10, 8, 8, 8, 8, 16, 9, 10, 2, 5, 5, 5, 5, 5, 5, 5, 9, 7, 6, 8, 9, 4, 4, 4, 4, 4, 7, 8, 8, 8, 9, 8, 11, 10, 5, 5, 5, 5, 3, 7, 8, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 4, 12, 10, 12, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 3, 3, 7, 7, 10, 8, 9, 7, 6, 10, 7, 6, 6, 4, 4, 8, 9, 7, 9, 9, 9, 9, 8, 8, 8, 8, 10, 5, 5, 5, 5, 5, 5, 8, 7, 6, 6, 6, 10, 6, 7, 10, 7, 4, 4, 4, 4, 4, 4, 4, 12, 9, 10, 7, 7, 10, 8, 10, 5, 12, 9, 6, 6, 6, 6, 6, 7, 6, 4, 4, 4, 10, 9, 9, 8, 7, 7, 5, 5, 5, 5, 5, 5, 3, 3, 13, 7, 7, 9, 7, 7, 7, 8, 9, 9, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 15, 15, 4, 4, 4, 4, 4, 10, 10, 9, 8, 9, 8, 8, 9, 7, 8, 7, 8, 5, 5, 7, 6, 6, 6, 4, 4, 4, 7, 8, 11, 8, 5, 5, 5, 5, 5, 5, 5, 7, 6, 6, 6, 6, 6, 6, 9, 11, 10, 7, 4, 4, 4, 9, 8, 8, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 6, 6, 6, 9, 9, 4, 4, 4, 4, 8, 8, 8, 9, 9, 8, 8, 8, 13, 2, 4, 2, 7, 5, 5, 5, 5, 5, 5, 9, 9, 6, 6, 6, 6, 10, 8, 8, 8, 6, 6, 6, 4, 4, 9, 8, 10, 8, 9, 8, 8, 8, 9, 8, 8, 5, 3, 3, 3, 11, 6, 6, 6, 7, 6, 6, 6, 4, 4, 9, 8, 5, 5, 5, 5, 5, 3, 11, 8, 6, 6, 6, 6, 6, 9, 7, 4, 4, 14, 10, 9, 8, 12, 8, 8, 8, 11, 15, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 10, 10, 7, 7, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 7, 11, 7, 7, 11, 11, 7, 8, 9, 10, 7, 7, 9, 9, 9, 9, 7, 7, 10, 8, 13, 8, 8, 8, 8, 11, 10, 6, 6, 8, 10, 11, 14, 14, 6, 6, 6, 6, 6, 6, 9, 11, 7, 7, 6, 8, 12, 11, 11, 6, 6, 10, 6, 6, 6, 6, 6, 10, 7, 7, 6, 6, 11, 6, 6, 6, 11, 8, 9, 7, 6, 10, 11, 9, 10, 11, 7, 11, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 6, 6, 8, 9, 10, 9, 6, 6, 6, 10, 6, 6, 6, 6, 11, 10, 11, 10, 9, 8, 7, 7, 7, 7, 11, 14, 8, 10, 9, 9, 8, 8, 7, 11, 8, 8, 8, 11, 11, 10, 10, 9, 10, 8, 11, 10, 8, 11, 9, 12, 8, 10, 8, 11, 8, 9, 9, 11, 11, 10, 11, 13, 8, 7, 8, 8, 9, 7, 8, 8, 8, 8, 7, 8, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 4, 4, 4, 11, 7, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 8, 7, 7, 8, 8, 4, 8, 7, 7, 7, 9, 7, 8, 9, 8, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 3, 8, 8, 6, 9, 4, 4, 10, 7, 3, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 10, 2, 3, 3, 3, 3, 3, 3, 3, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 5, 2, 4, 2, 6, 2, 2, 9, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 9, 8, 7, 6, 6, 11, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 7, 7, 11, 8, 8, 6, 5, 11, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 3, 3, 3, 3, 5, 7, 2, 3, 3, 3, 3, 3, 8, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 6, 3, 3, 8, 10, 3, 4, 4, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 7, 7, 1, 1, 3, 8, 7, 7, 8, 8, 8, 1, 6, 1, 1, 6, 3, 3, 4, 7, 3, 5, 5, 4, 4, 4, 4, 4, 2, 7, 7, 8, 12, 3, 4, 5, 1, 3, 4, 4, 10, 4, 3, 3, 3, 8, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 9, 20, 7, 5, 5, 5, 9, 13, 5, 5, 5, 5, 5, 3, 3, 3, 16, 5, 5, 5, 13, 7, 8, 8, 11, 8, 7, 9, 7, 11, 12, 9, 9, 8, 8, 11, 10, 14, 7, 12, 10, 11, 13, 7, 9, 11, 17, 17, 14, 13, 7, 8, 7, 10, 10, 7, 16, 13, 7, 8, 17, 12, 9, 8, 6, 7, 10, 6, 6, 12, 6, 8, 10, 8, 8, 8, 6, 8, 6, 14, 6, 6, 6, 13, 6, 10, 6, 6, 7, 14, 8, 6, 6, 10, 11, 10, 9, 9, 7, 7, 6, 6, 6, 9, 9, 7, 9, 10, 9, 13, 12, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 8, 6, 8, 9, 10, 9, 7, 10, 10, 8, 7, 8, 7, 10, 12, 9, 8, 15, 8, 7, 8, 8, 7, 7, 15, 13, 7, 10, 9, 14, 18, 16, 7, 24, 7, 8, 10, 11, 16, 8, 14, 7, 9, 9, 9, 11, 13, 19, 14, 15, 14, 11, 7, 13, 9, 10, 7, 13, 9, 10, 11, 12, 8, 9, 2, 3, 5, 8, 7, 4, 4, 10, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 2, 12, 5, 3, 8, 10, 15, 6, 7, 2, 3, 2, 5, 5, 12, 2, 5, 5, 5, 5, 2, 2, 5, 5, 12, 9, 5, 2, 2, 9, 5, 5, 12, 12, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 12, 5, 8, 8, 9, 5, 5, 5, 8, 19, 7, 16, 15, 14, 9, 9, 9, 9, 7, 11, 11, 11, 7, 14, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 12, 9, 9, 12, 12, 12, 15, 7, 11, 7, 14, 11, 18, 13, 8, 18, 15, 18, 12, 14, 12, 8, 8, 8, 8, 9, 9, 9, 12, 7, 10, 10, 8, 8, 12, 12, 12, 7, 12, 12, 9, 7, 7, 7, 7, 7, 8, 15, 12, 9, 10, 10, 7, 10, 10, 13, 11, 10, 9, 22, 11, 9, 8, 8, 8, 8, 8, 13, 18, 13, 9, 15, 19, 9, 7, 7, 10, 7, 7, 7, 11, 8, 13, 17, 7, 7, 10, 10, 10, 7, 20, 16, 7, 7, 7, 7, 7, 7, 11, 21, 12, 12, 13, 11, 14, 16, 8, 8, 13, 11, 7, 7, 13, 7, 7, 14, 15, 15, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 10, 18, 6, 6, 6, 6, 6, 6, 6, 6, 6, 11, 8, 8, 12, 12, 11, 11, 8, 12, 9, 9, 9, 13, 13, 9, 9, 9, 9, 9, 9, 6, 10, 12, 6, 6, 6, 6, 17, 11, 7, 7, 7, 7, 14, 14, 12, 6, 7, 7, 6, 6, 15, 10, 13, 10, 6, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 13, 9, 9, 15, 13, 6, 12, 12, 6, 19, 11, 10, 7, 7, 16, 8, 19, 17, 9, 9, 9, 9, 9, 6, 6, 6, 10, 8, 16, 8, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 14, 6, 6, 6, 6, 20, 6, 9, 6, 14, 9, 9, 9, 6, 9, 8, 8, 12, 9, 8, 8, 8, 8, 7, 8, 12, 7, 8, 8, 8, 6, 8, 6, 6, 6, 6, 6, 6, 6, 9, 8, 8, 6, 6, 13, 9, 12, 13, 12, 14, 13, 12, 11, 11, 6, 8, 8, 8, 6, 13, 12, 11, 11, 12, 6, 11, 12, 11, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 15, 6, 6, 6, 6, 6, 6, 6, 13, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 6, 18, 6, 12, 13, 13, 13, 9, 10, 15, 9, 12, 6, 6, 6, 6, 6, 6, 6, 6, 9, 15, 10, 9, 10, 13, 9, 19, 8, 18, 17, 10, 10, 8, 8, 6, 6, 6, 6, 6, 6, 10, 14, 8, 16, 16, 9, 8, 15, 8, 8, 10, 12, 14, 7, 7, 8, 8, 7, 7, 7, 7, 8, 13, 13, 11, 9, 9, 9, 12, 10, 17, 8, 11, 9, 7, 7, 14, 8, 14, 14, 7, 7, 7, 7, 7, 7, 14, 7, 7, 7, 7, 7, 10, 10, 8, 14, 7, 7, 7, 7, 8, 8, 8, 8, 8, 17, 9, 7, 15, 7, 8, 12, 7, 9, 14, 7, 7, 7, 9, 13, 8, 14, 7, 16, 18, 13, 15, 14, 12, 13, 10, 15, 9, 7, 7, 7, 10, 13, 15, 15, 9, 9, 9, 9, 19, 11, 7, 11, 11, 13, 8, 8, 8, 8, 7, 12, 19, 17, 9, 9, 13, 7, 7, 7, 9, 7, 7, 7, 12, 13, 15, 10, 8, 8, 14, 15, 12, 13, 13, 8, 12, 14, 7, 11, 7, 14, 15, 13, 12, 8, 8, 8, 8, 11, 13, 15, 15, 8, 13, 12, 8, 8, 8, 13, 10, 16, 14, 11, 8, 8, 12, 12, 9, 15, 15, 12, 12, 13, 8, 8, 9, 12, 13, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 11, 12, 11, 7, 14, 7, 13, 13, 13, 12, 18, 16, 7, 12, 11, 10, 10, 15, 9, 9, 9, 21, 7, 7, 7, 11, 16, 8, 8, 11, 11, 7, 7, 7, 7, 7, 19, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 8, 9, 12, 14, 11, 9, 9, 9, 22, 12, 3, 8, 8, 15, 4, 2, 2, 5, 5, 3, 3, 3, 3, 3, 3, 6, 6, 4, 4, 4, 12, 7, 10, 2, 3, 3, 3, 3, 3, 3, 3, 6, 7, 3, 7, 5, 14, 4, 4, 7, 8, 10, 4, 1, 3, 3, 6, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2, 2, 5, 3, 4, 2, 2, 2, 2, 2, 2, 11, 5, 5, 5, 11, 5, 5, 3, 5, 5, 5, 5, 11, 14, 13, 9, 11, 9, 12, 8, 11, 11, 8, 11, 16, 9, 9, 7, 10, 9, 12, 8, 15, 6, 7, 6, 6, 13, 10, 8, 11, 8, 6, 6, 6, 12, 16, 6, 11, 7, 8, 9, 18, 6, 6, 9, 4, 4, 6, 13, 6, 6, 6, 6, 8, 8, 9, 16, 7, 7, 14, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 15, 13, 7, 10, 7, 7, 10, 12, 16, 15, 7, 9, 9, 14, 11, 11, 10, 9, 10, 8, 12, 7, 8, 7, 7, 10, 12, 7, 12, 8, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 5, 5, 5, 10, 4, 8, 7, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 7, 4, 5, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 8, 2, 2, 2, 8, 12, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 7, 11, 9, 8, 8, 8, 7, 8, 9, 7, 7, 9, 7, 7, 7, 10, 7, 7, 10, 9, 10, 6, 6, 6, 6, 6, 6, 15, 7, 8, 9, 9, 8, 6, 6, 10, 9, 6, 8, 13, 9, 7, 6, 6, 6, 6, 6, 6, 12, 6, 6, 7, 6, 7, 6, 6, 6, 10, 10, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 14, 6, 6, 7, 7, 9, 6, 6, 6, 6, 9, 9, 8, 9, 10, 9, 8, 9, 12, 7, 7, 7, 8, 7, 10, 12, 11, 9, 10, 7, 7, 7, 9, 10, 10, 8, 12, 9, 7, 7, 9, 8, 8, 8, 10, 7, 7, 8, 9, 9, 7, 7, 7, 8, 2, 4, 6, 3, 4, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 5, 8, 6, 4, 7, 3, 3, 3, 3, 3, 3, 3, 12, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 5, 3, 4, 7, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 6, 4, 3, 4, 2, 2, 2, 5, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 7, 6, 8, 9, 2, 2, 2, 2, 3, 3, 3, 5, 7, 2, 3, 3, 8, 7, 7, 2, 2, 8, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 8, 8, 7, 7, 6, 10, 6, 9, 7, 11, 4, 6, 8, 8, 7, 8, 4, 5, 5, 5, 3, 3, 11, 8, 9, 6, 6, 8, 7, 4, 4, 7, 8, 7, 2, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 7, 2, 2, 5, 3, 3, 2, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 12, 5, 5, 3, 3, 3, 5, 10, 12, 6, 15, 4, 6, 6, 7, 14, 9, 3, 3, 3, 3, 3, 8, 2, 2, 3, 5, 3, 3, 3, 3, 3, 3, 8, 8, 8, 7, 5, 8, 4, 6, 11, 2, 2, 6, 7, 2, 9, 8, 5, 5, 3, 3, 5, 5, 7, 7, 6, 6, 10, 6, 6, 8, 9, 7, 4, 4, 4, 4, 7, 6, 6, 7, 7, 10, 9, 8, 11, 8, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 7, 6, 2, 5, 6, 7, 6, 4, 8, 9, 11, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 3, 3, 3, 3, 3, 9, 9, 6, 4, 8, 7, 7, 5, 9, 8, 6, 8, 7, 8, 5, 5, 5, 5, 5, 3, 3, 3, 16, 8, 7, 7, 7, 8, 7, 7, 7, 7, 9, 6, 9, 6, 10, 7, 7, 7, 6, 10, 8, 9, 11, 11, 8, 4, 4, 10, 8, 8, 6, 9, 6, 11, 8, 8, 8, 15, 7, 8, 9, 5, 3, 3, 3, 3, 3, 5, 11, 2, 2, 3, 8, 9, 10, 3, 2, 2, 2, 2, 2, 2, 3, 6, 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 11, 5, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 12, 7, 4, 12, 4, 6, 5, 4, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 11, 10, 6, 4, 6, 10, 8, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 5, 3, 4, 4, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 7, 8, 8, 7, 13, 12, 10, 10, 8, 8, 7, 7, 9, 12, 11, 6, 6, 8, 8, 9, 7, 7, 7, 10, 15, 10, 4, 4, 4, 4, 4, 11, 8, 8, 9, 7, 9, 14, 14, 12, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 12, 5, 5, 5, 8, 11, 10, 7, 9, 3, 8, 7, 3, 15, 13, 11, 4, 4, 2, 2, 2, 19, 7, 5, 5, 3, 3, 3, 3, 3, 3, 3, 5, 22, 18, 6, 14, 17, 4, 4, 19, 16, 18, 2, 3, 3, 2, 3, 2, 3, 3, 6, 4, 2, 3, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 9, 9, 2, 3, 2, 2, 2, 3, 3, 3, 5, 7, 14, 7, 7, 12, 9, 13, 6, 11, 6, 10, 9, 7, 7, 8, 12, 12, 8, 8, 8, 10, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 5, 8, 10, 7, 8, 11, 8, 12, 9, 4, 7, 7, 9, 13, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 1, 2, 2, 3, 3, 3, 3, 3, 3, 5, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 4, 4, 4, 3, 2, 3, 3, 3, 3, 5, 2, 2, 2, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 12, 9, 8, 8, 9, 8, 6, 17, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 4, 4, 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 7, 8, 8, 8, 10, 7, 13, 10, 8, 9, 3, 3, 5, 13, 3, 3, 3, 3, 3, 7, 7, 6, 6, 10, 13, 11, 11, 8, 8, 9, 8, 9, 9, 10, 10, 10, 11, 10, 10, 13, 13, 16, 15, 11, 12, 9, 9, 10, 9, 11, 10, 9, 9, 14, 7, 8, 3, 10, 7, 7, 3, 2, 2, 2, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 11, 6, 7, 4, 6, 2, 2, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 6, 4, 4, 2, 2, 2, 3, 3, 3, 3, 4, 4, 6, 6, 6, 6, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 11, 6, 10, 9, 12, 7, 7, 11, 14, 9, 7, 12, 3, 3, 7, 12, 11, 12, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 5, 5, 5, 5, 5, 5, 5, 5, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 10, 3, 3, 3, 11, 3, 5, 9, 11, 8, 12, 14, 9, 7, 8, 7, 7, 11, 11, 7, 7, 10, 9, 8, 10, 9, 7, 7, 7, 7, 7, 7, 8, 8, 7, 11, 8, 8, 8, 7, 7, 10, 8, 7, 13, 12, 7, 17, 10, 8, 8, 11, 7, 11, 11, 14, 7, 11, 7, 8, 6, 9, 20, 8, 7, 9, 16, 7, 10, 6, 11, 10, 8, 9, 7, 16, 11, 11, 9, 8, 9, 8, 8, 8, 11, 8, 15, 8, 8, 9, 7, 8, 8, 11, 10, 7, 5, 7, 10, 10, 15, 7, 7, 7, 8, 7, 8, 8, 10, 11, 10, 10, 10, 11, 11, 7, 8, 6, 8, 8, 8, 10, 6, 8, 6, 6, 7, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 16, 6, 15, 6, 7, 11, 11, 7, 9, 10, 11, 13, 10, 6, 16, 8, 10, 12, 11, 6, 6, 6, 6, 6, 6, 6, 10, 6, 10, 7, 7, 7, 7, 11, 7, 11, 6, 6, 6, 6, 6, 6, 17, 7, 7, 6, 6, 12, 22, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 7, 6, 6, 5, 6, 6, 8, 11, 6, 9, 14, 11, 9, 11, 7, 7, 8, 6, 6, 6, 8, 10, 9, 6, 6, 6, 6, 9, 7, 6, 6, 6, 6, 6, 15, 6, 4, 4, 4, 6, 4, 17, 8, 11, 6, 6, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 10, 6, 10, 6, 6, 6, 6, 12, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, 6, 6, 18, 6, 6, 6, 8, 9, 10, 7, 8, 9, 10, 11, 7, 13, 6, 8, 8, 6, 6, 14, 7, 7, 7, 7, 10, 7, 14, 9, 6, 6, 9, 15, 9, 7, 14, 6, 11, 14, 13, 7, 12, 8, 7, 7, 7, 7, 7, 12, 7, 10, 9, 16, 6, 8, 6, 5, 17, 6, 8, 10, 4, 6, 4, 10, 15, 17, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 11, 7, 4, 4, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 19, 17, 6, 10, 11, 6, 6, 6, 6, 18, 6, 6, 11, 4, 4, 4, 5, 6, 6, 6, 9, 5, 6, 4, 6, 6, 4, 6, 6, 6, 6, 10, 6, 6, 4, 6, 6, 10, 6, 10, 6, 6, 6, 6, 11, 6, 6, 10, 6, 6, 8, 6, 6, 6, 8, 6, 11, 4, 11, 9, 10, 9, 11, 4, 8, 4, 11, 12, 7, 9, 8, 6, 7, 7, 8, 12, 12, 11, 13, 10, 11, 7, 7, 7, 9, 7, 11, 10, 7, 7, 7, 16, 11, 10, 11, 17, 9, 9, 8, 8, 7, 7, 7, 9, 7, 7, 7, 14, 7, 13, 9, 11, 10, 14, 10, 10, 12, 11, 10, 7, 10, 5, 14, 8, 8, 8, 9, 7, 8, 7, 7, 9, 8, 7, 8, 7, 7, 7, 7, 7, 7, 7, 11, 8, 10, 8, 7, 8, 14, 11, 8, 9, 9, 9, 8, 24, 10, 10, 12, 7, 7, 15, 11, 8, 8, 12, 11, 8, 9, 9, 7, 8, 9, 10, 11, 10, 11, 7, 12, 7, 7, 11, 9, 8, 14, 13, 12, 8, 11, 10, 8, 8, 7, 7, 14, 9, 10, 8, 9, 11, 7, 14, 8, 8, 13, 8, 8, 12, 7, 10, 14, 14, 11, 9, 10, 9, 9, 7, 7, 11, 11, 13, 9, 13, 5, 5, 5, 7, 9, 5, 11, 12, 14, 8, 7, 7, 11, 10, 9, 7, 8, 8, 7, 10, 11, 11, 5, 5, 7, 5, 5, 5, 7, 7, 15, 7, 7, 8, 7, 15, 12, 12, 10, 7, 8, 7, 11, 7, 7, 7, 23, 11, 8, 8, 11, 10, 7, 8, 11, 7, 19, 7, 7, 6, 9, 9, 9, 11, 3, 4, 7, 8, 6, 6, 4, 10, 8, 2, 2]);
|
|
2904
|
+
var edgeChild = /* @__PURE__ */ new Uint16Array([0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 17, 1, 1, 1, 12, 1, 12, 1, 12, 13, 1, 1, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 14, 21, 1, 1, 1, 1, 1, 1, 1, 19, 12, 1, 1, 1, 1, 1, 1, 1, 20, 1, 1, 1, 16, 1, 18, 1, 1, 15, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 22, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 12, 12, 12, 12, 1, 32, 0, 0, 0, 1, 1, 1, 1, 35, 34, 1, 1, 1, 1, 1, 33, 1, 1, 1, 1, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 39, 40, 0, 0, 0, 41, 0, 12, 1, 1, 12, 1, 1, 1, 1, 44, 45, 45, 45, 44, 45, 44, 44, 46, 45, 44, 45, 44, 44, 44, 44, 44, 44, 46, 44, 44, 44, 44, 44, 44, 45, 47, 47, 45, 44, 44, 44, 44, 44, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 52, 50, 50, 50, 52, 50, 51, 50, 53, 50, 51, 51, 50, 50, 50, 51, 53, 51, 53, 50, 51, 51, 12, 55, 55, 54, 56, 51, 53, 50, 50, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 60, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 67, 1, 12, 1, 1, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 12, 1, 1, 1, 1, 89, 1, 91, 1, 1, 1, 1, 1, 1, 1, 1, 94, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 97, 97, 1, 1, 12, 1, 100, 1, 1, 1, 1, 1, 1, 1, 98, 1, 99, 1, 101, 1, 1, 1, 1, 1, 102, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 110, 111, 1, 1, 1, 1, 1, 1, 113, 113, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 121, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 122, 1, 1, 1, 1, 1, 1, 1, 1, 1, 126, 123, 125, 120, 1, 124, 1, 1, 114, 1, 1, 1, 1, 117, 1, 127, 1, 1, 1, 1, 1, 119, 1, 108, 1, 109, 1, 12, 128, 106, 1, 112, 1, 1, 1, 1, 1, 107, 115, 1, 12, 12, 12, 118, 116, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 12, 12, 1, 1, 1, 1, 1, 12, 134, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 136, 1, 1, 1, 1, 1, 1, 1, 1, 137, 138, 12, 12, 135, 133, 45, 45, 140, 50, 50, 139, 142, 141, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 1, 0, 144, 132, 1, 0, 1, 12, 12, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 148, 147, 20, 1, 1, 12, 12, 1, 20, 12, 12, 1, 1, 1, 1, 1, 134, 1, 1, 152, 1, 1, 1, 1, 153, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 1, 136, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 134, 1, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 134, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 160, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 1, 160, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 134, 1, 1, 1, 1, 152, 1, 1, 1, 1, 153, 1, 1, 1, 134, 1, 1, 152, 1, 1, 1, 1, 164, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 167, 1, 1, 160, 1, 1, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 1, 160, 1, 1, 1, 1, 1, 152, 1, 1, 1, 1, 1, 153, 1, 154, 158, 158, 12, 1, 12, 166, 1, 1, 1, 1, 1, 158, 158, 158, 154, 1, 1, 1, 157, 158, 161, 165, 1, 1, 1, 1, 157, 157, 1, 1, 156, 154, 154, 157, 170, 156, 170, 1, 1, 168, 1, 156, 155, 157, 1, 1, 1, 1, 157, 1, 159, 1, 1, 1, 12, 1, 162, 1, 162, 1, 1, 1, 162, 161, 163, 169, 156, 154, 1, 1, 1, 1, 1, 1, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 172, 173, 172, 172, 172, 172, 174, 174, 172, 173, 172, 173, 172, 172, 12, 12, 12, 12, 12, 1, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193, 1, 1, 1, 1, 12, 199, 200, 201, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 151, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 196, 1, 1, 1, 184, 1, 210, 1, 1, 1, 208, 1, 1, 205, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 190, 1, 1, 1, 186, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 182, 1, 1, 1, 1, 1, 1, 1, 191, 1, 1, 1, 1, 195, 1, 1, 1, 1, 171, 1, 1, 189, 1, 1, 1, 192, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 180, 1, 12, 1, 1, 12, 1, 1, 1, 1, 183, 1, 1, 1, 188, 1, 203, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 209, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 194, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 176, 12, 1, 1, 1, 178, 12, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 177, 1, 1, 1, 1, 1, 1, 204, 1, 1, 1, 181, 1, 1, 1, 187, 1, 12, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 191, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 175, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 185, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 207, 1, 1, 12, 1, 1, 1, 1, 179, 1, 1, 1, 185, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 197, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 202, 1, 1, 12, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 220, 0, 0, 0, 0, 0, 221, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 225, 1, 1, 1, 0, 226, 223, 224, 1, 1, 1, 1, 1, 1, 231, 1, 233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 229, 1, 1, 1, 1, 1, 235, 1, 1, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 234, 1, 1, 1, 12, 1, 1, 1, 1, 230, 1, 1, 1, 228, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 232, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 241, 13, 1, 1, 1, 12, 12, 238, 239, 1, 1, 1, 1, 240, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 242, 1, 1, 12, 16, 1, 1, 1, 1, 1, 1, 1, 243, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 243, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 256, 256, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 172, 261, 262, 1, 12, 1, 1, 1, 1, 12, 264, 1, 1, 263, 1, 1, 266, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 271, 272, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 283, 0, 0, 284, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 327, 327, 328, 327, 0, 185, 1, 1, 13, 323, 1, 321, 0, 0, 0, 0, 1, 0, 0, 0, 324, 1, 1, 329, 1, 205, 1, 1, 1, 1, 1, 322, 1, 319, 1, 325, 1, 317, 1, 326, 1, 318, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 12, 1, 12, 320, 320, 1, 1, 1, 316, 184, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 12, 1, 1, 1, 1, 315, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 332, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 266, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 372, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 340, 351, 1, 1, 339, 374, 1, 345, 1, 1, 337, 369, 1, 1, 355, 336, 341, 1, 1, 1, 348, 379, 357, 1, 1, 1, 1, 1, 1, 358, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 367, 371, 0, 0, 79, 1, 1, 0, 365, 342, 378, 343, 346, 353, 1, 368, 0, 1, 0, 79, 362, 360, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 381, 1, 1, 352, 1, 79, 1, 0, 1, 1, 1, 384, 1, 0, 0, 79, 359, 0, 1, 338, 1, 1, 1, 0, 1, 1, 361, 1, 0, 1, 1, 1, 0, 1, 386, 349, 1, 1, 0, 1, 0, 0, 377, 0, 1, 1, 1, 79, 370, 1, 1, 366, 363, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 344, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 376, 0, 79, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 380, 1, 1, 1, 0, 0, 383, 0, 0, 0, 1, 356, 1, 0, 79, 382, 1, 0, 0, 0, 0, 385, 1, 1, 0, 0, 1, 0, 1, 0, 354, 0, 350, 0, 1, 1, 1, 0, 1, 1, 0, 373, 347, 375, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 400, 400, 1, 1, 12, 12, 1, 400, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 412, 1, 1, 0, 1, 1, 1, 1, 205, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 430, 430, 1, 1, 0, 0, 317, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 442, 1, 441, 1, 1, 1, 1, 1, 1, 1, 1, 445, 1, 12, 12, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 453, 1, 1, 1, 455, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 452, 1, 447, 1, 1, 1, 1, 435, 1, 1, 1, 1, 1, 1, 1, 1, 448, 12, 1, 1, 1, 1, 454, 1, 1, 1, 449, 444, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 317, 1, 433, 1, 1, 12, 451, 1, 1, 317, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 437, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 454, 1, 1, 1, 1, 317, 1, 450, 1, 1, 1, 439, 1, 1, 1, 1, 1, 440, 1, 456, 443, 1, 1, 1, 1, 1, 438, 1, 1, 1, 1, 1, 1, 1, 1, 1, 434, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 446, 1, 1, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 436, 1, 1, 1, 1, 1, 1, 1, 220, 457, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 462, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 466, 466, 466, 466, 466, 466, 466, 0, 466, 466, 466, 466, 466, 1, 466, 466, 466, 0, 466, 466, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 478, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 488, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 198, 198, 1, 492, 1, 1, 1, 491, 1, 1, 1, 1, 487, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 489, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 493, 1, 1, 490, 1, 1, 1, 1, 1, 1, 1, 1, 372, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 494, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 12, 1, 507, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 60, 1, 1, 12, 12, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 526, 1, 1, 1, 1, 1, 1, 1, 527, 1, 1, 1, 1, 1, 1, 1, 525, 1, 1, 12, 1, 529, 239, 1, 1, 12, 12, 1, 1, 12, 1, 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 539, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 132, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 107, 1, 1, 12, 1, 1, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 548, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 144, 1, 1, 1, 228, 1, 1, 12, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 572, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 577, 1, 220, 1, 328, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 578, 1, 1, 1, 1, 0, 580, 0, 79, 0, 579, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 12, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 582, 582, 0, 585, 583, 582, 582, 582, 582, 582, 587, 582, 582, 591, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 588, 585, 582, 582, 585, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 582, 582, 582, 582, 582, 589, 582, 582, 582, 582, 582, 582, 0, 0, 0, 1, 590, 1, 1, 1, 1, 584, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 595, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 12, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 1, 1, 12, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 65, 280, 306, 411, 535, 0, 4, 68, 236, 254, 282, 307, 334, 388, 413, 0, 499, 519, 536, 597, 9, 0, 61, 88, 398, 409, 429, 575, 0, 497, 518, 532, 612, 0, 30, 6, 0, 461, 500, 602, 560, 70, 0, 7, 285, 255, 389, 463, 416, 538, 79, 598, 0, 576, 309, 418, 465, 9, 105, 288, 506, 6, 30, 0, 311, 79, 391, 79, 483, 10, 6, 131, 248, 275, 0, 613, 509, 0, 563, 0, 64, 6, 6, 251, 95, 2, 432, 399, 410, 596, 0, 6, 0, 6, 286, 103, 6, 561, 501, 540, 0, 464, 390, 273, 287, 8, 71, 104, 599, 543, 392, 312, 300, 419, 146, 74, 290, 546, 510, 601, 564, 335, 330, 479, 6, 75, 149, 11, 0, 249, 522, 547, 565, 514, 551, 570, 611, 36, 6, 260, 295, 333, 304, 218, 30, 528, 553, 218, 42, 216, 265, 296, 305, 406, 423, 481, 274, 0, 73, 562, 0, 403, 417, 299, 79, 247, 79, 0, 581, 545, 504, 292, 421, 79, 393, 387, 0, 0, 0, 9, 555, 571, 217, 0, 424, 407, 531, 516, 573, 615, 85, 218, 43, 297, 396, 425, 569, 0, 511, 293, 276, 79, 215, 80, 28, 390, 30, 6, 394, 331, 303, 604, 592, 524, 550, 513, 0, 258, 81, 30, 405, 422, 0, 30, 426, 0, 219, 593, 517, 9, 408, 427, 218, 248, 86, 222, 594, 574, 557, 482, 428, 397, 250, 227, 87, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 129, 0, 0, 84, 549, 0, 0, 0, 0, 0, 0, 0, 27, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 503, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 281, 0, 0, 0, 0, 0, 530, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 568, 0, 0, 0, 0, 600, 521, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 62, 0, 0, 0, 267, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 279, 610, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, 278, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 502, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 614, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 544, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 29, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 558, 0, 270, 0, 0, 130, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 414, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 415, 0, 0, 401, 0, 0, 0, 0, 0, 0, 603, 0, 0, 0, 541, 0, 0, 90, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623, 623, 623, 623, 623, 623, 623, 622, 624]);
|
|
2905
|
+
var labelText = "orgmilcomschnetedugovdrrformsfeedbackofficialaccoorgmilschnetgovmagazinemediaunioncargopilotgroupcaarespressworksaerodromeworkinggroupair-traffic-controlaircraftaccident-preventioneducatormarketplaceambulanceinsurancecateringairportrepbodyenginesoftwaremodellingair-surveillanceconsultingchartertrainermaintenanceservicesdesignflightskydivingfreightassociationstudentgroundhandlingdgcafuelclubtaxicrewshowballooningexpresstraderbrokerauthoragentsairtrafficjournalistsafetyconsultantmicrolightaccident-investigationparachutingequipmentproductionfederationrecreationscientistnavigationengineertradingglidingleasingresearchpassenger-associationentertainmentparaglidinghangglidingaerobaticrotorcraftemergencycertificationgovernmentaeroclubexchangelogisticschampionshiphomebuiltcouncilconferencecontrolairlinecivilaviationjournalorgcomnetedugovcoorgcomnomnetobjofforgcomnetuwukiloappsframerorgmilcomnetedugovcoradioorgcomnetcommuneedogpbcoitgvorgedugov*spreviewfrontendrelayononstagingupid*mtls*privatelinktypedreamdeveloperbravemochawindsurfaivenmirenupsunwnextbegetngrokclerkwale2bwebcsbrunputerflutterflowspawnbaseshiptodaymagicpatternsnetlifyondigitaloceanrailwayhostedclaudehasurabotdashvercelgithubluyanigadgetreplitcloudflaretelebitedgecomputeevervaultdetaexponyatnoopencrpplxzeaburwasmerframerzeropsconvexmedusajsspritesonherculeseasypanelstreamlitsnowflakemesserliloginlinehackclubnorthflankbase44corespeedadaptableleapcellngrok-freeclerkstagelovableon-fleek*us-west-3ap-south-2us-central-2us-central-1eu-central-1ap-south-1us-west-2us-east-2eu-north-1ap-north-1us-west-1us-east-1*rcloudintsegorgmilcomgobbetnetintedugovturmusicasenasamutualcoopip6uriurnin-addre164homeirisgovdixdaemoncloudnssthwien*inexexkunden4accogvormymyspreadshop4lima2ixortsinfofuturecmsfuturehosting12hpprivfuturemailinglima-cityfunkfeuer123webseitednshomemelmyspreadshopcloudletswasantqldvicactnswtascatholicwasaqldvictasvpsidwasantozqldorgcomvicasnactnetedugovnswtasconfhrsncomairflowlambda-urltransfer-webappairflowtransfer-webapptransfer-webapptransfer-webapp-fipstransfer-webappeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1privatenotebookstudiolabelingnotebookstudionotebooknotebook-fipslabelingnotebookstudionotebook-fipsnotebookstudio-fipsnotebook-fipsnotebookstudionotebook-fipsnotebookstudioeu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2experimentsus-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1onrepostsagemakercopporgmilcompronetintedugovbiznameinfoshoprsorgmilcomnetedugovbrendlyresolvenzauscotvstoreorgcomnetedugovbizinfoidacaicoittvorgmilcomschnetedugovinfocloudezproxyacmymyspreadshopkuleuvenwebhostingtransurl123websitecloudnsinterhostsolutionsddns5476103298edgfacbmlonihkjutwvqpsryxzbarsycoororgcomedumyftpno-iporxcloud-ipfor-somemmafanfor-morewebhopselfipjozidyndnscloudnsdscloudfor-thefor-betteractivetrailcoeconorestooteorgcomeconeteduassurmoneyafricaarchitectesrestaurantloisirstourismavocatsinfoagrounivcoorgcomnetedugovtvdeportesaludtksatorgmilcomwebgobnetinteducienciaboliviarevistacooperativaempresanombreindustriamusicapatriamedicinademocraciapoliticapuebloindigenaplurinacionalarteblogwikiinfoagrotransportenoticiasprofesionalacademiaeconomiaecologiamovimientotecnologianaturalsimplesitecepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesmscepesebamapadfmgalampbacscpirngorotomtrjspaprrprrsesms*biaamfmtcmptvfeirasampajampanatalbelemananiradiog12medindfndbmdtrdthepoaggfjdfdefinfenflegsegongengcngorgzlgslglogppgmillelqslcimcomnomadmjabimbbibbsbabcrectecsjcetcpscpvhudieticriapipsiecnbiorioecogeoteoodoproatoartfstmatvetdetbetnetcntnotfotgrueduajuespappreptmpemparqsrvadvdevgovntrturagrjorfarjusmusdesvixxyzcozfozslzbhzmaringasantamariacampinagrandegoianiasorocabafloripasaobernardocuritibaboavistarecifeaparecidasaogoncasalvadorcuiabamorenamacapalondrinacontagemsocialfortalmaceioleilaoosascoriobranconiteroi9guacutcheblogflogvlogwikitaxicoopmanauspalmascaxiasjoinvillebaruericampinassantoandreribeiraoriopretoweorgcomnetedugovv0windsurfshiptodaycloudsitecoaccoorgnetgovofmilcomgovmediatechzacoorgcomnetedugsjgovmydnspenfnlabnbmbgcbcqconcontnuyksknsmyspreadshopno-ipawdevboxbarsyonidatemfuinabusavinstanceseceuguukussryzespawncsxcloud-ipmyphotosfantasyleaguetwmailcleverappsscrappingccwucloudnsftpaccessgame-serverccgovobjectsrmalpgcust*svcalp1aeappenginermalpgmyspreadshop4lima2ixsquare7cloudscale123websitefirenet12hpflowgotdnslinkyard-cloudcloudnslima-citydnskingobjectstorageedaccogoorusorgcomnetintedua\xE9roportxn--aroport-byaassogouvcomilgobgovcloudnses-1eu-west-1us-east-1euvipit1eurarubait1s3lbwebsites3websiteru-spbru-mskelasticcsrunstnukukcaukusnl-ams-1fr-par-1fr-par-2functionsnodess3ddlwhmrdbfnck8sifrs3-websitecockpitscblmgdbdtwhkafkpubprivs3ddlwhmrdbk8sifrs3-websitecockpitscblmgdbdtwhkafks3ddlrdbk8sifrs3-websitecockpitscblmgdbdtwhkafkk8sscalebookpl-wawfr-parnl-amsbaremetalsmartlabelinginstancesdechk2kuleuvenlaravelvoorloperurownoxazapscwhstgrvaporobservablehqelementorantagonistreclaimjoteluluencowaydiademjelasticmatlabmagentositetrendhostingaxarnetperspectajenv-arubajelejoteravendbemergenttrafficplexconvexkeliwebserveboltbegetcdnstaticson-rancherprimetelonstackitunison-servicesdnshomelinkyardbarsyjelecloudnscocomnetgovmycn-northwest-1cn-north-1s3s3-accesspoints3-websites3s3-accesspointrdsdualstacks3-deprecatedemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspoints3s3-accesspointrdsdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicn-northwest-1cn-north-1cn-northwest-1ebcomputeelbcn-north-1airflowcn-northwest-1cn-north-1oncn-northwest-1cn-north-1amazonawssagemakeramazonwebservicesdirectasgdsdhehahljlnmhbacscahqhshhihnlnynsnmofjbjzjxjtjhkcqtwgsjssxnxjxgxxzgz\u7DB2\u7D61\u7F51\u7EDC\u516C\u53F8orgmilcomnetedugovxn--55qx5dcanva-appsxn--io0a7iquickconnectcanvasitekhsjxn--od0algmyqnapcloudsrvrlessclustersrealtimestorageleadpagescarrdcrdorgmilcomnomnetedugovhidnssupabaserdpareplmypiumsoxmitotaplpagesfirewalledreplitowodevwebview-assetsvfswebview-assetss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websiteemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecateds3-websites3-object-lambdaexecute-apis3s3-accesspoints3-websites3-accesspoint-fipss3-fipss3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstackemrappui-prods3-websites3-accesspoint-fipss3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apis3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9vfss3s3-accesspointdualstackemrappui-prods3-websiteaws-cloud9emrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9eu-west-3ap-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1us-northeast-1ap-southeast-1me-south-1af-south-1ap-south-1ap-southeast-7us-west-2eu-west-2ap-east-2us-east-2ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ap-southeast-6ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1mrapaccesspoints3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3s3-accesspointdualstacks3-deprecatedanalytics-gatewayemrappui-prods3-websites3-accesspoint-fipsaws-cloud9s3-fipsemrstudio-prods3-object-lambdaemrnotebooks-prodexecute-apicloud9s3eu-west-3ap-south-2eu-south-2computes3-ap-northeast-2elbrdss3-ap-east-1s3-sa-east-1s3-us-gov-west-1s3-eu-central-1s3-ca-central-1eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3s3-website-us-west-2s3-website-eu-west-1s3-external-1eu-central-1me-central-1ca-central-1il-central-1s3-us-west-1s3-eu-west-1s3-website-sa-east-1s3-website-ap-southeast-2ap-northeast-1ap-southeast-1s3-us-west-2s3-eu-west-2me-south-1af-south-1eu-south-1ap-south-1us-west-2eu-west-2us-east-2s3-website-ap-southeast-1s3-1s3-globals3-ap-northeast-3eu-north-1airflowap-southeast-2s3-us-gov-east-1s3-fips-us-gov-east-1s3-me-south-1s3-ap-south-1ap-northeast-2s3-website-us-west-1ap-southeast-5s3-eu-north-1s3-ap-southeast-1s3-website-us-gov-west-1compute-1s3-eu-west-3us-gov-west-1s3-website-ap-northeast-1us-gov-east-1s3-fips-us-gov-west-1s3-website-us-east-1s3-ap-southeast-2ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1s3-us-east-2s3-ap-northeast-1authauthauth-fipsauth-fipseu-west-3ap-south-2eu-south-2eu-central-2ap-southeast-3ap-southeast-4ap-northeast-3eu-central-1mx-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1ca-west-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1rservicesbuilderstg-builderdev-builder*ociocpocsdemoinstanceeu-west-3eu-south-2ap-southeast-3ap-northeast-3eu-central-1me-central-1ca-central-1il-central-1ap-northeast-1ap-southeast-1me-south-1af-south-1eu-south-1ap-south-1ap-southeast-7us-west-2eu-west-2us-east-2eu-north-1ap-southeast-2ap-northeast-2ap-southeast-5us-gov-west-1us-gov-east-1us-west-1eu-west-1us-east-1ap-east-1sa-east-1previeweu-4us-4us-1eu-1us-2eu-2us-3eu-3appspaasrag-cloudrag-cloud-chjcloudjcloud-ver-jpcdemonodebalancermembersipeuxvsoncillaocelotonzayalilynxsphinxfentigercustomercaracalo365cloudstaticxendevapp001testcode-builder-stgplatformapimediasiteprojedrydpagesjsu2u2-localx0desazacncoitrueu4uhkukgrbrushatenadiarymyspreadshopfrom-flfrom-wvwebspace-hosttheworkpchatenablogservesarcasmapplinzisakuratanwixsiteappchizigiizeis-into-carsdnsiskinkyadobeaemcloudis-a-therapistpgfogmyvncdojinis-an-actress1kappfldrvkozowqa2jpnmexprgmrfirewall-gatewaydynnscafjsfbsbxooguyxnbayfrom-gawoltlab-demois-a-anarchistwiardwebteaches-yogadattowebtb-hostinglive-websiteservegamegotpantheonfrom-nhsubsc-payfrom-ohvipsinaappfrom-cadyndns-officehomelinuxfrom-mahercules-appservebbsstreakusercontentfrom-okfrom-wyfastly-terrariumis-a-llamaqualyhqportalserveexchangeon-vaporvivenushopciscofreakgrayjayleaguesmetaaiusercontentfrom-iais-a-libertariansaves-the-whalestaveusercontentyolasiteoperaunitepoint2thisis-a-catererlinodeusercontentfrom-vagithubusercontentsells-for-lesshosteurcanva-appsplaystation-cloudddnsfreefrom-pafrom-prfrom-waddnskingoutsystemscloudhotelwithflightmydattois-a-nascarfanmydbserverminiserverdamnserverservehumouris-a-playerfrom-nvfrom-nmemergentagentgentappsamplifyappfrom-kyis-an-accountantnfshostserveircfrom-akpythonanywherestackhero-networkpostman-echolikescandydyndns-mailobservableusercontentserveftpfreeboxosfrom-utcdn77-storageamazonawsneat-urldyndns-serverlinodeis-a-teacherfrom-vtgleezemythic-beastsus1-pleniteu1-plenitla1-plenitpaywhirlservecounterstrikejdevcloudhealth-carereformis-into-animegoogleapisis-a-painterafricaisa-hockeynutatmetais-an-actora2hostedis-a-democratdatadetectest-le-patrondigitaloceanspacesis-a-designeris-a-hunterlinodeobjectstemp-dnsissmarterthanyoufrom-arsimplesiteevennodetownnews-stagingis-a-liberalgooglecodejelasticservemp3stdlibqualyhqpartnerdyndns-free1cooldnsest-a-la-masiondrayddnsdynuddnsfrom-orfrom-miis-a-bloggerfrom-himydobisscanvacodeis-an-engineerest-a-la-maisonupsunappdevinappswafflecellmyasustorwpenginepoweredfrom-ctservep2psame-appmyshopblocksthingdustdatalikes-piediscordsezis-with-thebanddev-myqnapcloudlpusercontentis-leetshopitsite3utilitiesis-a-personaltrainersinaappladeskis-a-cheflogoipselfipbase44-sandboxnospamproxyalibabacloudcsmesswithdnsauthgearappsiamallamawithgooglelutrausercontentmochausercontentframercanvasmytabitdyndns-homew-credentialless-staticblitzcpserverdiscordsaysis-a-nurseappspotatlassian-isolated-3premotewdfrom-mtwixstudiocode0emm180rmyactivedirectoryawsappsmytuleapdnsabrpolyspaceqbuserrenderbuiltwithdarkboutirgotdnsabrdnsdopaascanva-hosted-embedawsglobalacceleratorhomesecuritypcmyiphostditchyouripclever-clouddyndns-ipon-aptibleis-a-musiciansecuritytacticsappspaceusercontenthomeunixstrapiappsame-previewcf-ipfsmycloudnaselasticbeanstalkis-certifieddontexistkasserverik-serverdrive-platformatlassian-3pfirebaseappherokuappawsapprunnerbarsycenteris-a-cubicle-slaveservehttpmyshopifyis-a-guruquicksytessiiitesorsitesmagicpatternsappis-a-cpameteorappfrom-wiis-a-rockstarbumbleshrimpdattolocalreadthedocs-hostedfrom-rifamilydsdyndns-picsplesknsbplaceddnsaliasdynaliasdyndns-remotedoomdnsip-ddnsblogdnsis-a-doctorroutingthecloudamazoncognitobarsyonlinedsmynasddnsgurucloudflare-ipfsdeus-canvasfrom-idsmushcdnpagespeedmobilizerdyndns-at-homeunusualpersonhosted-by-previderis-a-republicandyn-o-saurstreamlitappworkisboringonthewificprapidqualifioappis-uberleetis-slickgetmyipwpdevcloudtypeformdyndns-at-workgentlentapismynascloudw-corp-staticblitzfrom-ingeekgalaxyservebeerfrom-mdonrenderspace-to-rentaivencloudappspacehostedonfabricawafaicloudcodespotblogspotatlassian-3p-us-gov-modfrom-ndfrom-msis-a-techieis-a-studentcustomer-ociis-a-photographerdurumisfrom-ksmassivegriddyndns-wikiis-an-entertaineris-a-hard-workermysecuritycamerafrom-mnrackmazedyndns-blogis-a-bulls-fanwritesthisblogfreemyipsimple-urlfrom-sdreservdauthgear-stagingest-mon-blogueuris-into-gamesrice-labsxtooldevicesakurawebis-an-anarchistoraclecloudappsdyndns-worksells-for-urhcloudfrom-dcfastvps-serverwpmucdnis-a-geekscrysecfrom-txis-into-cartoonsmodelscapetrycloudflarelocaltonetstreak-linkbalena-devicesfrom-njforgeblocksfreebox-oswebadorsitefrom-ncdoesntexisthobby-sitestreaklinkshomesecuritymacownprovidertuleap-partnersdattorelaywphostedmailalpha-myqnapcloudservequakeis-a-socialistservehalflifepivohostingdynuhostingquipelementsw-staticblitzdyndns-webfrom-deproject-studyaliases121is-not-certifiedhercules-devis-a-financialadvisorservepicsis-a-greenloseyouripfrom-ilwithyoutubemwcloudnonprodwiredbladehostingdnsdojofrom-tnpixolinomyqnapcloudis-an-artisthostedpiis-a-landscaperauiusercontentoaiusercontenton-forgeis-a-conservativedreamhostersnet-freaksapps-1and1is-goneencoreapifastly-edgefrom-nesalesforcefrom-scdeployagentoraclegovcloudappsfrom-alis-a-lawyercechirevultrobjectsstufftoreadisa-geekddnsgeeklovableprojecttry-snowplowfrom-moblogsyteis-a-bookkeepernogmyforumravendbmyboxdeelementoredsaacficogoorinforgcomgobnatneteduidstoreorgcomnetintedudevnomepublorgcomneteduathgovtestscalculatorspaynowinfoquizzesresearchedcloudnsfunnelsassessmentsjscaleforcetmacltdorgmilcompronetgovbizpresseklogesrsccloudcustomfltusrcloude4corealmgovmunicontentproxy9metacentrumdyndyndyndnsdynpagespages-researchitionoccustomercomymyspreadshopipv64diskussionsbereich4limacomrub2ixfirewall-gatewayddnssspdnsbarsykeymachinesquare7myhome-serverspeedpartnercommunity-proschuldockxenonconnectg\xFCnstigliefernbwcloud-os-instancedyndnssecmy-routerxn--gnstigliefern-wobin-butterl-o-g-i-nisteingeekin-dslin-berlinin-brbfuettertdasnetzleitungsenin-vpnlcube-serverdyn-ip24logoipdyn-berlinruhr-uni-bochum12hpgoipsrvdnsfruskygit-repossvn-reposinternet-dnsg\xFCnstigbestellenhome-webserverxn--gnstigbestellen-zvbbplacedheimdnscosidnswebspaceconfiglima-citydyndns1istmeinvirtualuserschulplattformmy-gatewayddnsseclebtimnetztest-iservmein-iservvirtual-userhome64iservschuletaifun-dnstraeumtgeradeschulserverdynamisches-dns123webseitednshomehs-heilbronndnsupdaterbssgraphicdwadpdwdaepeweaawapaafpfwfabwbpbacwcpcciwebuserapiobjectsidsiskospockkimodorikerbonesteamsparisjanewaypicardglobaltarpitreedpikekiraworfsulukirkarchertuckerhackercanarywesleystagingprereleaset3r2lpbravepanelngrokiservstglclcrmerpflypagesbarsyvivenushoplocalcertlocalplayerbearbloggatewaydeno-stagingis-not-ais-a-goodbotdashvercelmocha-sandboxplatter-appreplitgithubpreviewworkersinbrowserevervaultdetais-ahrsndenoxmitmodxmyaddrstorageapipayloadgrebedocruncontainersstgstagelclstageloginlineis-a-fullstackleapcellngrok-freeis-coolstoragewebharemediatechlibp2pdiscourseimaginecomyspreadshopstoreregbiz123hjemmesidefirmcoorgcomnetedugovsldorgmilcomwebgobartnetedugovtmorgpolcomsocartnetedugovassoagrondiscoodontk12medcuegyecpaabgengorgmilgalsaltulcomadmesmgobpubdocmonfindgnriouioproartlatvetnetfotedulojgovntrturibrbarxxxofficialbasechefprofmktgpsictechinfoarqtcontdentrrpppsiqgit-pagesritmedfieorgcomlibprieduaipgovriikmeactvsportorgmilcomscieunnetedugovnameinfopintouchtawktotawkmyspreadshoporgcomnomgobedu123miwebcomputeorgcomnetedugovbiznameinfocognito-idpeusc-de-east-1onjelasticnxaspdnsbarsydirectwpdeuxfleurstransurldogadoprvwcloudnsamazonwebservicesdnshomeuserpartycokoobinmkmstorjfidemopaasdymyspreadshopalandkapsiikixn--hkkinen-5wacloudplatformdatacenterh\xE4kkinen123kotisivuidacorgmilcompronetedugovbiznameinforadioorgcomneteduuserexperts-comptablestmmyspreadshopgretaprdcomnomynhccifbxoshuissier-justicenotairesaeroportfreeboxoson-webavocatassoportgouvkdnschirurgiens-dentistes-en-franceavouesfbx-os123sitewebveterinairechirurgiens-dentistespharmacienchambagrimedecinfreebox-osdediboxgoupilemszicpyicpvicppleysheezypagesedugovcnpyorgcomcybllcpvtnetedugovtnxonlineschooldaemond6atcopanelorgnetplybotdashstackitkaasorgmilcomnetedugovbizmodltdorgcomedugovcoorgcomneteduappwriteacorgcomnetedugovcloudtranslateusercontentorgcomnetedumobiassoorgcomnetedugovbarsysimplesitediscourseindorgmilcomgobneteduorgcomwebnetedugovguaminfonxhra\u6559\u80B2\u654E\u80B2\u7DB2\u7D61\u7F51\u7D61\u7EC4\u7E54\u7D44\u7E54\u7F51\u7EDC\u7DB2\u7EDC\u7EC4\u7EC7\u7D44\u7EC7\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\u4E2A\u4EBA\u7B87\u4EBAltdorgcomincneteduidvgovxn--uc0ay4axn--55qx5dxn--mk0axixn--io0a7ixn--uc0atvxn--zf0avxxn--lcvr32dxn--od0algxn--wcvs22dxn--gmqw5axn--od0aq3bxn--mxtq1mxn--ciqpnxn--tn0agxn--gmq050iorgmilcomgobneteduiservwp2tempurlmircloudfreesitewpmudevmyfastgadgetcloudaccessjelehalfboltfastvpsemergenteasypanelopencraftizcombrendlynamefromrtpersoadultmedorgpolrelcomproartnetedufirminfoassoshopcoopgouvtmcomediahotelforumvideosportorgsexagrargameslakaseroticaerotikatozsdereklamcasino2000filmsuliinfoboltshopprivnewsszexcityutazasjogaszkonyveloingatlaneacaicogoormy\u1B29\u1B2E\u1B36milwebschnetkopbizzonedesaponpesxn--9tfkymyspreadshopgovmytabittabitorderravpageaccok12idforgnetgovmuniltdplcaccotttvorgcomnetmeca6g5gpgamubacaicniocoukuptverdruscsdelhiindorgmilcomwebnicfingenpronetintedugovresbizbiharbarsyinternetbusinessschooltravelsupabasealumnigujaratfirminfoaeropostbankcoopindevscloudnsno-ipbarsybarrell-of-knowledgebarrel-of-knowledgensupdategroks-thisdnsupdatefor-ourknowsitalldvrcammittwalddynamic-dnsv-infowebhopselfipdyndnshere-for-moreilovecollegemayfirstforumzcloudnsmittwaldservertypo3servergroks-theeusekd1uk0cdndyndnsidrawsainaueuapjpusstagemocksysdevicesclientcustreservdcustdevdisrecprodtestingcobeebyteutwenteboxfusebravepstmndedynngrokorgmilcomnomhzcnetedugovqcxqzzbarsythingdustmo-siemensrb-hostingprotonetfh-muenstergitbookbluebitecloudbeesusercontentnodeartkiloappsforgerockdarklangresinstagingapigeebubbleb-datascryptedhypernodedappnodepantheonsitegitlabgithubkeeneticvirtualservercleverappshostyhostingon-rioedugitticketstelebiton-acornwixstudioon-k3sicp0icp12038jeleqotobigvlairbubbleappsmyaddrstolosmyrdbxwebflowdrive-platformbeagleboardhasura-applolipopdefinimavaporcloudmusicianwebflowtestazurecontainerresindevicereadthedocsloginlineeditorxmoonscalesandcatsbasicserverwebthingsbrowsersafetymarkbeebyteappbitbucketidaccovistablogorgschnetgovxn--mgba3a4f16axn--mgba3a4fraarvanedge\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646jclaspeziapdudcefegelemeperetevebacanatavaparasabgagfgogrgpgalclblimfmrmcbmbvbfclcmcvcrcpcchlimifibicivipirisimncnbnanenrnpntnnolomobocoaogorosopotoptvtatctbtmtltotpulunutpspapaqsvpvvvtvavvrtrsrprgrfrcrbrarorkrvstsssbscsmsispzczbzbozen-suedtirolmyspreadshopxn--bulsan-sdtirol-nsbxn--valledaoste-ebbtrentinoaltoadigetrentin-sued-tirolxn--forlcesena-c8axn--forl-cesena-fcbxn--bozen-sdtirol-2obtriestetrentinsuedtiroltrentino-s-tirollecceudineaostesienaparmaluccapaviagenoapaduaaostamonzaabruzzoternirietiturinmilanbozenlaziofermoleccocuneonuoropratola-speziavdataaligfvgpugmolcalcamlomumbsicpmnvenvaoedugovabrsarmaremrbastoslazibxosfirenzetrentinos\xFCdtirolval-d-aostavalle-aostamessinacremonaravennatoscanatrentin-suedtirolbolognacalabriaurbinopesarofriuli-v-giuliaogliastraxn--valle-aoste-ebblaquilaandriatranibarlettasyncloudtrentinosudtirolxn--valle-d-aoste-ehbaostavalleyvalled-aostatrentino-alto-adigevallee-d-aostexn--balsan-sdtirol-nsbpistoiasicilialucaniacataniaiserniaperugiabresciaveneziagorizialiguriaimperiabulsan-suedtirolbalsan-suedtirolbarlettatraniandriaxn--trentino-sdtirol-szbforl\xEC-cesenatuscanyvall\xE9e-d-aostemantovavall\xE9e-aostecasertapiemontevalleaostaval-daostafriulivgiuliatrevisoforli-cesenavall\xE9edaosteferrarapescaravald-aostatrentino-altoadigefriuli-vegiuliavallee-aostecarboniaiglesiastarantomediocampidanovalleedaostetrentinosud-tirolcampobassotrentins\xFCd-tiroltrentinos\xFCd-tirolmonzabrianzatrentino-s\xFCdtirolxn--trentino-sd-tirol-c3bpotenzacosenzavicenzaemiliaromagnavenicefrosinonemarchepordenonetrentinosued-tirolvaresemolisevall\xE9eaostefriuli-veneziagiuliabasilicatalatinaanconasavonaveronamodenaaquilabiellabolzano-altoadigepugliafoggiaumbriatrentino-stirolgenovapadovamateranovararagusapiacenzatrentinostirolvalleeaostetempio-olbiatrentinsudtirolmassa-carrarafriuliveneziagiuliatrentinosuedtirolandria-barletta-tranitrapanixn--cesenaforl-i8amaceratacaltanissettaascoli-picenobrindisicarraramassacagliaririmininapolivibo-valentiachietibulsan-sudtirolbalsan-sudtiroltrentino-a-adigebulsanbalsaniglesiascarboniamilanotorinoteramodell-ogliastraarezzotrentinoalto-adigerovigotrentovenetoiglesias-carboniatrentino-sud-tirolaltoadigereggio-emiliareggio-calabriasardegnatranibarlettaandriapiedmontxn--sdtirol-n2amedio-campidanotrentino-s\xFCd-tirolfriuli-vgiuliafriuli-ve-giuliaromeennaromapisa32-b16-b64-blodiastibarineencomonaplesforlicesenailiadboxosalessandriasicilytrani-barletta-andriaxn--trentin-sdtirol-7vbpesarourbinotrentinsued-tirolcesena-forliforl\xECcesenaemilia-romagnamonzaebrianzaxn--trentinsdtirol-nsbtrentinos-tiroltrentins\xFCdtirolvalledaostaolbia-tempiocampidanomediovibovalentiasassarivalle-daostalombardyfriulivegiuliareggioemiliamonzaedellabrianzaalto-adigevercellitrentin-sudtiroltraniandriabarlettatrentino-sudtirolascolipicenobozen-s\xFCdtirolfriulive-giuliaflorencevaldaostaxn--cesena-forl-mcbcarbonia-iglesiasaosta-valleycarrara-massadellogliastratrentinoa-adigexn--valleaoste-e7apesaro-urbinoxn--trentinosdtirol-7vbxn--trentin-sd-tirol-rzbxn--trentinsd-tirol-6vbtrani-andria-barlettatrentin-s\xFCd-tirolxn--trentinosd-tirol-rzbgrossetomonza-e-della-brianzas\xFCdtirolreggiocalabriatrentinoaadigetrentin-s\xFCdtirolfriuliv-giuliaverbaniacampaniatrentino-aadigefriulivenezia-giuliasardiniaandriabarlettatranibarletta-trani-andriacatanzarooristanourbino-pesarocesena-forl\xECvalle-d-aostacampidano-medio123homepagesiracusatempioolbiasuedtirollombardiaavellinocesenaforl\xECtrentinofriuli-venezia-giuliabozen-sudtirolandria-trani-barlettabulsan-s\xFCdtirolbalsan-s\xFCdtirolmonza-brianzabolzanotrentino-sued-tirolbellunosalernolivornocrotonesondriodnshometrentinsud-tirolmassacarraratrentin-sud-tiroltrentino-suedtirolviterbobergamocesenaforliolbiatempiopalermobeneventoagrigentoofcoorgnetfmaitvphdengorgmilcomschnetedugovperagrikanieasukehandachitatokaiaisaikonanoharuamaobuhigashiuraowariasahiinuyamatobishimaiwakurashitarainazawatoyonegamagorimihamatoyotataharakariyayatomioguchikomakimiyoshinishiotokonamekiyosuchiryutoyohashiokazakiisshikikasugaikotakiratoeianjotogofusosetohazutsushimashinshirotakahamanisshinshikatsuhekinantoyokawaichinomiyatoyoakeodateogataakitaikawakyowahonjoogayurihonjonoshirokamiokakatagamimitanegojomeyokotekosakadaisenkazunonikahohonjyomoriyoshimisatohappoukamikoanihachirogatahigashinarusesembokufujisatokitaakitaitayanagiowanitakkomutsutsurutahirosakigonoheoirasetowadamisawanohejiaomorishingohiranairokunohehashikamitsugarushichinohehachinohenakadomarisannohekuroishisakaeisumiasahiotakiinzaiabikomatsudoyachiyomutsuzawakujukuriomigawakashiwatoganemihamanaritasakuranagaramobarahanamigawachoshishiroichoseikozakishisuikatorimidorichonankyonanfuttsuonjukufunabashinagareyamanodasosatakochuotohnoshourayasukimitsuyokaichibayotsukaidosodegauratateyamakamagayayokoshibahikariyachimatakatsuuratomisatokisarazukamogawaichikawanarashinoichinomiyashimofusaminamibososhirakoichiharaoamishirasatoikatahonaiainansaijoseiyoiyoozuuwajimaniihamanamikatamasakiuchikokihokutobetoonshikokuchuomatsuyamaimabarikamijimakumakogenyawatahamamatsunosabaeikedaobamasakaifukuiohionotsurugamihamawakasaminamiechizeneiheijikatsuyamatakahamaechizensoedaukihaomutaokawanishiogoribuzenonojosueumiokiotochikugosasagurisaigawamizumakishinyoshitomikurumekurateyamadakasuganakamamiyamanogatatakatahakataiizukakawaratagawakasuyaashiyainatsukimunakataminamitsuikishonaikurogifukuchikeisenhigashimiyakoshinguyukuhashiokagakiyamekogaongausuikahotohochuotoyotsumiyawakadazaifuhisayamatachiaraiyanagawanakagawahirokawachikujochikushinochikuhochikuzennamieotamaokumashowateneiiwakikoorinangoononishigoshimogoomotegomishimafukushimaasakawakagamiishishirakawaiitatefutabahiratayugawahanawakitakatakawamatakunimiyabukibandaihigashihironoyamatomiharuyamatsuriaizubangedatesomaaizuwakamatsuyanaizuaizumisatonishiaizuizumizakikitashiobarataishinkaneyamakoriyamainawashirotanagurafurudonosamegawasukagawaishikawatamakawaikedaogakitaruiginanenahashimahichisonakatsugawaibigawashirakawamizunamiminokamomitakekawauesekigaharatomikasakahogikitagatayamagatatajimianpachimotosuyaotsukakamigaharahidakanisekitokigujominogodoyorogifukasamatsutakayamawanouchihigashishirakawakasaharashimonitatsumagoichiyodakannakanrashowameiwakiryuotaoratomiokafujiokaitakuranaganoharahigashiagatsumatakasakishibukawaminakamikatashinatsukiyonokawabanumataannakaoizumimidorishintoisesakiuenoyoshiokakusatsutakayamanakanojonanmokutamamuratatebayashimaebashiotakekaitadaiwahongofuchukuietajimashobaramiharahatsukaichihigashihiroshimamiyoshikumanokurenakasakaseraseranishiasaminamifukuyamashinichionomichiosakikamijimajinsekikogentakeharaotobenanaeikedatohmaozoraobiraabirakyowaeniwataikibibaisharirebunerimohiroooketootarupippunishiokoppechitosefurubirahakodateshiranukakitahiroshimakushiroobihironanporoiwamizawaniikappukunneppufukushimanakasatsunaitoyourakuromatsunaiakabirakamisunagawashibechaurakawakamifuranonakatombetsuasahikawashimokawakayabeokoppebiratoriabashirisaromaatsumanumatahidakabifukamukawamikasahorokanaitoyotomisarufutsuhigashikawaishikarikitamiyoichiesashiiwanaitomariminamifuranoakkeshifuranotoyakoyakumootoineppushikaoishiraoinemuronayorohaboroashorobihororishirifujiutashinaihokutotakasuebetsuurausuassabukikonaishimamakinaiedatetoyabieinikiesanuryuoumuteshikagarikubetsuashibetsukimobetsuaibetsutobetsusobetsuembetsushimizuchippubetsurishirihokuryuhoronobeshintokutsubetsushibetsuhonbetsumombetsutsukigatakuriyamakoshimizushiriuchikutchanmurorannoboribetsukamishihorowassamushinshinotsukembuchiwakkanaikamoenaikiyosatotakinoueshikabesunagawafukagawanakagawatakikawakamikawahigashikagurahamatonbetsumatsumaemoseushirankoshishakotanimakanemashikeotofuketomakomaisandatambaitamiawajikasaiasagoshisoonoakoyashirotoyookaminamiawajiinagawafukusakitakasagokamigorikasugaharimayokawaashiyahimejiakashitaishiaogakisannantakinosumototakarazukanishinomiyashingugoshikinishiwakiyokatakaaioimikisayoyabukawanishiamagasakisasayamashinonsenkakogawaichikawakamikawatatsunotsukubaiwamaogawaasahisakaitokaioaraiitakobandodaigosuifuinaamikasumigaurakashimaomitamayachiyoshimodatetomobetoridehitachinakainashikisakuragawakasamayawaramoriyahitachiomiyanamegatayamagatahitachikamisuushikutakahagiibarakitonekoganakasowayukimihojosomitoryugasakishimotsumafujishirotsuchiurachikuseihitachiotashirosatotamatsukuriuchiharashikahakuinanaotsubatawajimakahokukawakitatsurugikaganominotosuzuuchinadakomatsuanamizunakanotohakusannonoichikanazawaiwateshiwafudaikawaimoriokaofunatohanamakikuzumakikitakamininohekunoheyamadayahabasumitaichinosekitanohatahiraizumirikuzentakatajobojiotsuchihironomiyakoiwaizumikarumaiichinohenodakujitonooshushizukuishifujisawamizusawakamaishikanegasakimannoutazukotohiraayagawazentsujihigashikagawauchinomikanonjisanukimarugamemitoyotakamatsutadotsunaoshimatonoshoakuneamamiizumihiokiyusuikinkoisasookouyamanakatanekagoshimakanoyaisenkawanabeminamitanemakurazakitarumizunishinoomotematsumotosatsumasendaioimatsudaayaseebinamiurazushinakaiodawaraiseharasagamiharahakoneaikawakaiseiatsugitsukuihadanoyamatoyamakitazamaoisochigasakininomiyayokosukakamakuraminamiashigarafujisawasamukawakiyokawahiratsukayugawaraokawaumajikochitsunootoyoakiinonishitosayasudahidakamiharasakawaniyodogawahigashitsunokagamigeiseisusakiotsukinaharisukumomurototosakamiochitoyotosashimizumotoyamanankokunakamurakitagawayusuharaogunichoyoukiasoutoozugyokutoamakusamifunetakamoriyamagaminamataminamiogunikikuchisumotoyamatonagasumashikiaraokumamotokamiamakusanishiharayatsushiroayabeseikasakyoideineujinakagyokameokakyotangokyotanabekyotambaminamiyamashiroyamashinatanabeyawatawazukaminaminantanmiyazuhigashiyamafukuchiyamakitamukokamojoyokizumaizuruujitawaraoyamazakinagaokakyokumiyamakawagoeinabeshimameiwaasahitaikiudonoisetsukisosakikuwanamihamamiyamasuzukatamakimisuginabarikumanokomonominamiisewataraitobakiwatakikihotadomatsusakayokkaichikameyamaureshinoishinomakishichikashukuohirataiwaosakizaohigashimatsushimashikamaiwanumashibataogawaraonagawakawasakiseminemarumoriminamisanrikukakudamuratawakuyatomiyanatoriwataritagajomisatotomekamirifushiroishimatsushimayamamotoshiogamafurukawahyugaebinotsunosaitoayakushimanobeokakitauramiyazakitakazakigokaseshiibamimatashintomikunitomikitakatakobayashikawaminamitakaharukijotakanabemiyakonojonishimeranichinankitagawakadogawamorotsukakisofukushimaminamimakisakaeobuseikedaogawamiasaokayaasahiotakiotarichinoinaomichikumakomaganechikuhokukaruizawayasuokaooshikaikusakaminamiaikitogakushimatsukawakawakamitateshinatakamorikitaaikishiojirimiyadahakubaiizunaiijimaiiyamamiyotasuzakayasakatoguraookuwanagawaminowahirayayamagataminamiminowafujimiomachisakakitakaginaganonakanosakuhokomoronagisoshinanomachiwadauedaiidaharasuwatomiachiaokianankisosakunozawaonsenagematsutakayamashimosuwamatsumotoyamanouchinakagawamochizukiazuminotatsunoobamaomuraseihiunzenosetofutsuikichijiwanagasakiisahayahasamisaikaikawatanasasebohiradokuchinotsugototogitsutsushimashimabarashinkamigotomatsuurayamazoekashibaikomakawaitenrioyodosangokoryoudaojiikarugayamatokoriyamatenkawakatsuragikurotakikawakamimiyakemitsuetakatorikamikitayamayamatotakadahegurishinjokanmakisakuraitawaramotogoseoudanarasoniandokawanishishimoichihigashiyoshinokashiharashimokitayamanosegawayoshinomintsivorytopazsakuragehirnsumomoaseinetopalmail-boxmokurenyoitamuikaojiyagosensanjoaganomyokoseiroagaomishibataniigatanagaokamurakamiuonumayuzawakariwatagamitainaitsunanminamiuonumatochioyahikojoetsuseiroukamosadoizumozakitokamachiitoigawasekikawakashiwazakitsubamemitsukekokonoesaikiusukibeppuusahimeshimakunisakihasamataketatsukumihitaoitahijikusuyufukujukamitsuebungoonobungotakadaibaraniimibizentsuyamaokayamakasaokahayashimayakagemaniwaakaiwamisakishinjotamanotakahashikibichuowakesojanagishookumenannishiawakurakurashikiasakuchisetouchikagaminosatoshotomigusukunakagusukuyaeseizenaurumaiheyaaguniogiminanjokinminamidaitokitanakagusukuyonaguniokinawaishigakikunigamiurasoekadenataramahiraraginozataketomishimojizamamitonakiitomanhigashimotobuyonabarugushikamionnanahanagohaebarukumejimakitadaitonakijinnishiharayomitanginowantokashikiishikawaikedasuitaminohizuminishisakaikananabenodaitoosakasayamayaokishiwadatadaokakaizukatondabayashichihayaakasakakumatorikadomasayamahigashiosakashijonawatehirakatataishimisakitajirihannansennankatanotoyonominatosettsuhigashiyodogawaibarakinosekitachuohigashisumiyoshifujiiderakashiwaraizumiotsutoyonakamatsubaramoriguchiizumisanoshimamototakatsukineyagawahabikinotakaishikawachinaganoyoshinogarikamiminearitaouchiimarihizenogikashimaariakekiyamafukudomikitagatakitahataomachigenkaikanzakinishiaritakyuragisagataratosutakushiroishikaratsuhamatamakouhokukawagoeyoshidasatteogoseirumaasakaurawaogawaniizaomiyayoriiotakishikihonjooganohannohanyuinasaitamaokegawaarakawayoshikawayokozehasudasayamahidakafukayachichibuiwatsukiryokamiyoshimikamiizumifujimiwarabiranzanmiyoshiminanoyashiosakadosugitomisatohigashichichibutodasokakukiyonokazoshiraokakasukabekounosukawajimatsurugashimamiyashirokitamotohatoyamamoroyamahatogayakumagayakawaguchinagatorokamisatomatsubushinamegawatokigawakamikawafujiminohigashimatsuyamakoshigayatokorozawas3isk01isk02ryuohkoseikonanaishorittotakashimamaibarahikonetorahimenishiazaikokagamokotoyasuotsukusatsunagahamamoriyamatoyosatotakatsukinotogawaomihachimanhigashiomiakagiunnanizumogotsuamayatsukakakinokimatsuehamadamasudahikawahikimiokuizumoyasugiyakumomisatotamayuohdahigashiizumookinoshimanishinoshimatsuwanoshimaneshimadafujiedayoshidashimodagotembaiwataatamikosaiyaizuitoizumishimahaibaramakinoharaomaezakikawanehonkannamisusonohigashiizufukuroinumazukawazufujiaraishizuokahamamatsushimizuizunokunimatsuzakimorimachiminamiizunishiizukikugawakakegawafujikawafujinomiyaujiietsugaoyamayaitaohiranikkoashikagakuroisokanumasakurashioyakarasuyamamotegiichikaikaminokawatochigihagamokanogisanobatonasumibunasushiobaranishikatautsunomiyaiwafunemashikoshimotsukeohtawaratakanezawaitanokomatsushimatokushimaichibaminamiaizumiwajikikainanmiyoshinarutomimamugiananmatsushigesanagochishishikuinakagawamachidachiyodakomaefussainagitaitochofufuchuomeotahigashiyamatotoshimaokutamaaogashimakodairaedogawaarakawahachiojishinagawatachikawashibuyasuginamihinodekiyosesumidaoshimanerimamitakahamuraadachinakanomizuhobunkyomegurominatokoganeihigashikurumekokubunjihigashimurayamamusashimurayamatamakitahinochuokotokatsushikakouzushimaogasawaraakishimakunitachishinjukusetagayamusashinohachijoitabashiakirunohinoharachizunanbukotouramisasawakasayonagokogehinoyazutottorinichinansakaiminatokawaharaoyabetairainamiasahinantoimizufuchutakaokakurobeyamadajohanatoyamatonaminyuzenfunahashinakaniikawanamerikawaunazukitogahimiuozufukumitsutateyamakamiichiiwadearidayuasainamitaijikatsuragiaridagawatanabemihamahidakakainankiminomisatoshingushirahamakamitondayurakozakoyagobokitayamawakayamakudoyamahashimotokushimotokozagawahirogawakinokawanachikatsuurarsuseroeoishidasagaeoguniasahinagaitendonanyoobanazawanishikawasakataohkuratozawamikawamamurogawayamagatafunagatatakahatashonaishinjokahokuiideyuzakawanishitsuruokakaminoyamayamanobeshiratakamurayamanakayamakaneyamahigashineyonezawasakegawamitouubeyuuabushimonosekitabuseoshimatoyotaiwakunihikarishunannagatohagihofukudamatsutokuyamashowadoshitsurunanbukoshukaiminami-alpsnirasakikosugeotsukioshinohokutominobuyamanashifuefukichuokofuichikawamisatoyamanakakonakamichitabayamanishikatsuranarusawafujikawahayakawafujiyoshidafujikawaguchikouenohara\u9577\u91CE\u4EAC\u90FD\u5C90\u961C\u5927\u962A\u4E09\u91CD\u7FA4\u99AC\u5343\u8449\u6ECB\u8CC0\u4F50\u8CC0\u5948\u826Fadednelgaccogogror\u79CB\u7530\u611B\u77E5\u9AD8\u77E5\u57FC\u7389\u6C96\u7E04\u6803\u6728\u718A\u672C\u5CA9\u624B\u9752\u68EE\u5C71\u68A8\u65B0\u6F5F\u5CF6\u6839\u9CE5\u53D6\u9577\u5D0E\u9999\u5DDD\u5BAE\u57CE\u77F3\u5DDD\u5927\u5206\u5BAE\u5D0E\u8328\u57CE\u5C71\u53E3\u5175\u5EAB\u5C71\u5F62\u5FB3\u5CF6\u5E83\u5CF6\u798F\u5CF6\u798F\u5CA1\u5CA1\u5C71\u5BCC\u5C71\u9759\u5CA1\u611B\u5A9B\u798F\u4E95\u6771\u4EACxn--4it168dhatenadiaryxn--vgu402ckawaiishophatenablogcocottenamaste\u5317\u6D77\u9053penneehimeiwateversestabachibashigagonnagunmapermahaccaakitaosakauh-ohblushkochiaichifukuikuroncapooitigohyogotokyokyotopunyuthickcheap0t00g00j0mie2-ddaapyawjg0amfemsubxiiboomoobutchueekpgwrgrherskrboyrdyupperunderflierchipsmydnsheavyangryhippygirlyrulez\u795E\u5948\u5DDD\u9E7F\u5150\u5CF6\u548C\u6B4C\u5C71bambinaxn--nit225kokayamasaitamaxn--k7yn95exn--1lqs03nsapporoparasitelolipopmcxn--efvn9sniigatafukuokatokushimafukushimahiroshimakagoshimafakefurokinawaxn--8pvr4ucoolblogxn--0trq7p7nnkawasakinagasakimiyazakichilloutxn--8ltr62kxn--klty5xpeeweezombiecutegirlxn--rny31hxn--uuwu58axn--ntso0iqx3axn--djrs72d6uytoyamanikitanyantakagawamimozanagoyaboyfriendxn--2m4a15egreaterchowderegoismyamagatafashionstorexn--elqq16hxn--pssu33lsendaimiyagixn--rht27zpecoriaomorisaloonwatsonvivianxn--djty4knobushipigboatnaganopinokoxn--f6qx53asadistvelvetsecretxn--5js045dchicappayamanashiibarakidigickgirlfriendxn--1lqs71dmongolianxn--c3s14mxn--qqqt11mtochigixn--5rtq34kparallelo0o0mondkobesagabonadecaoitanarafoolkilldecimainhiholomosblokilociaoundopupugifutankcrapflopnooroopsmodsholyjeezstripperpepperbittershizuokaxn--rht3dkitakyushureadymadeicurusversusmatrixxn--rht61ehungryfloppygloomycrankyhandcraftedlittlestarxn--klt787dxn--kltx9awhitesnowsunnydaytottorilovepoptheshopbuyshopxn--5rtp49cxn--d5qv7z876cwebaccelxn--kbrq7oxn--4pvxsxn--1ctwolovesickkumamotocatfoodxn--tor131oyokohamawakayamatonkotsuxn--ehqz56nxn--uist22hxn--6btw5axn--kltp7dyamaguchifrenchkisspussycatxn--4it797kxn--uisz3gbabybluexn--zbx025dnetgamersxn--7t0a264ckanagawaxn--6orx2rishikawaxn--ntsq17ghalfmoonschoolbusjellybeanxn--mkru45iusercontentlolitapunkxn--32vp30hsakurastoragehokkaidoshimanecandypopbabymilksupersaleweblikeraindropbackdropwebsozaikikirarahateblodaynightmeneacsccogoormobiinfoaeusxxorgmilcomnetedugovorgcomnetedugovbizinfotmprdorgmilcomnomedugovassnotairespresseassocoopgouvveterinairemedecinpharmaciensorgnetedugovtraorgcomedurepgovmeneperekgacscaiiocogoitoresmshsseoulbusanulsandaeguc01milvkimmvchungnamjeonnamjeonbukeliv-dnsgyeonggijejueliv-cdnincheondaejeongangwongyeongbukgwangjuchungbukgyeongnameliv-apicoeduindorgcomembnetedugovorgmilcomnetedugovjcloudorgcomnetintedugovperbnrinfocooyorgcomnetedugovipfscanvamypepw3sstorachakeeneticjoinmcinbrowserdwebcyonnftstoragemyfritzaemewphlxachotelltdorgcomwebsocschngonetintedugrpgovassnomgacsccoorgnetedugovbizinfo123websiteidorgmilcomasnnetedugovconfidmedorgcomplcschnetedugovaccoorgnetgovpresstmassoirseproxaccosoundcasthoptocraftvp4c66orgnetedugovitsmcdirmyboxbarsyedgestacksynologylogintonohostwebhopdiskstationi234tcp4hoocgroknoipprivmydsddnsdnsforlohmustransipdscloudfilegear-sgbrasiliafilegearframerbarsybarsyonlinecoprdorgmilcomnomedugovinforgcomnetedugovnameacprorgcomartnetedugovpresseinfoassoinstgouvorgnycedugovbarsydscloudjuorgcomnetedugovminisiteaccoororgcomnetgovorgmilcompronetintedugovbizmuseumnameinfoaerocoopaccoorgcomnetintedugovbizcooporgcomgobneteduorgmilcomnetedugovbiznameaccoorgmilneteduadvgovcoorgcomnetaltgovforgotherhiskeeneticispmanagernomassoprod5476132eastasiacentraluswesteuropewestus2eastus2rucdnwest1-usfra1-desandboxjls-sto1jls-sto3jls-sto2aglobalabglobalsslmapprodfreetlsmaplon-1lon-2ny-1fr-1sg-1ny-2paassnwebpaashostingjelasticnordeste-idcsocuserpagescwebfileblobservicebuscoreatlricnjsjelasticwebsitestoragesezagbinruhuukjptsmyspreadshopmynetnameakamaiorigin-stagingfrom-coipv64dynv6cdn77serveblogadobeaemcloudhicamsprytdnsupno-ipownipde5ovhicpfirewall-gatewaysytesmypsxbarsyusgovcloudapimyamazemyradwebakamaihdsaveincloudfastlylbfrom-lasubsc-paysquare7in-the-bandblackbaudcdnhomelinuxoninfernoctfcloudservebbsdns-dynamiccloudfrontakamai-stagingipifonyham-radio-opsenseeringclickrisingcommunity-profrom-nylocalcertgrafana-devedgesuite-stagingcloudflareanycasteating-organicatlassian-devmydattofeste-iplocaltotorprojectknx-serveredgekeycloudflareglobalcloudyclustercasacamserveftpakamaized-stagingakamaiorigindns-cloudmyeffectboomlabotdashbuyshousestwmailhetemlazure-mobilein-dslthruhereredirectmedynuddnsbouncemesupabaseluyanicloudappakamaicloudfunctionsdebiannhlfanpgafanstatic-accessin-vpnmysynologymafeloappudohomeftptrafficmanagersiteleafseidatmemsetcloudflarecloudaccesskeyword-onazure-apiis-a-chefdoes-itgets-itwebhopselfiphomeipkicks-assedgesuitewindowsserver-ontunnelmolemydissentscrapper-sitecloudflarecnuni5srcfggffiobbzabcdenodynuopikddnsvpndnsakadnselastxkinghostvps-hostfastlyhomeunixazureedgeshopselectdontexistmyfritzcloudjiffyalwaysdatasells-itsquaresbroke-itazurefddattolocalat-band-campmeinforumfamilydsazurestaticappsdefinimabplaceddnsaliasdynaliasnow-dnsblogdnsroutingthecloudendofinternetdsmynasakamaiedgemymediapcadobeio-staticakamaiedge-stagingakamaihd-stagingddns-ipprivatizehealthinsurancelive-onkrellianschokokeksmassivegridmysecuritycamerarackmazeserveminecraftfrom-azis-a-geekakamaizedmoonscalecryptonomicoffice-on-theusgovtrafficmanageradobeioruntimeedgekey-stagingreserve-onlinechannelsdvrdnsdojousgovcloudappcdn77-sslapps-1and1podzoneazurewebsitesdynathomescaleforceyandexcloudvusercontentisa-geekcdn-edgescoaemalcesappwriteazimuthtlonarvonoticeablestorecomwebrecnetperotherfirminfoartslgdloncogoiltdorgmilcolcomplcschgenngonetedugovbiznamefirmmobiacincoorgmilcomnomwebgobnetintedubizinfocomyspreadshopdemongovtransurl123websitehosting-clusterkhplaycistrongsnesosvalerv\xE5lerxn--vler-qoaossandeheroysandeher\xF8yb\xF8boheroyher\xF8yxn--hery-iraxn--b-5gavalerb\xF8boxn--b-5gasandesandexn--hery-iraxn--vler-qoav\xE5lerh\xE5re\xE5laahavaofsfvfhlolnlalrlhmfmtmahcostntbu\xE5strmreigersundmyspreadshopg\xE1ls\xE1eidsvolltingvollgildeskalflor\xF8vads\xF8vard\xF8vanylvenxn--bhccavuotna-k7astrandaxn--kvnangen-k0axn--sknland-fxaxn--mosjen-eyarakkestadhyllestadnannestadvevelstadvaapstenordre-landsondre-lands\xF8ndre-landtjieltexn--vrggt-xqads\xF8r-aurdalsor-aurdalheradstordmoldefordef\xF8rdeseljefedjeryggehemnexn--krehamn-dxasognegranes\xF8gnebrynetjomevallebykletokkegiskedovretj\xF8mehob\xF8lvoldasaudatolgas\xF8mnaviknad\xF8nnasomnadonnatranafrananesnaraumasmolatr\xE6nafr\xE6nalesjasm\xF8la\xF8rstaorstahitrafloraaukraloppafr\xF8yarissasnasahalsagalsaromsaraisar\xE1isafroyasn\xE5sagronghobolfjelltydal\xE5rdalardalaskimharamkraanghkekr\xE5anghkesorumbarumhurumb\xE6rums\xF8rummodums\xE1l\xE1tb\xE1l\xE1tfrognbjugnv\xE5ganvagangulenskienl\xF8tenlotenstrynvefsnxn--merker-kuaskaunsveiob\xF8mlobomloskj\xE5kvardoflorovadsosalatbalats\xE1latkl\xE6buklabuselbubarduulvikskjakkleppris\xF8rxn--nttery-byaefl\xE5eidflahofmilgolholsellomskifetvikdepvgsfhsaskerrisorhamarasnes\xE5snesr\xF8rosrorosxn--slat-5namasoynaroyvaroyluroydyroyaskoyradoyandoyrodoymeloyrad\xF8yand\xF8yr\xF8d\xF8ymel\xF8yask\xF8ylur\xF8ydyr\xF8ym\xE5s\xF8yv\xE6r\xF8yn\xE6r\xF8yhoylandeth\xF8ylandetdivtasvuodnal\xF8renskoglorenskognesoddtangenxn--tjme-hraxn--smla-hraxn--stjrdal-s1aunjargalillehammerunj\xE1rgaxn--hamary-fyadavvenjargaxn--bearalvhki-y4a123hjemmesidegjerdrumxn--brnnysund-m8acxn--tnsberg-q1axn--mlatvuopmi-s4axn--snsa-roaxn--skierv-utaxn--brum-voatysfjordkvafjordeidfjordkv\xE6fjordsongdalenmjondalenmj\xF8ndalenxn--gls-elackragerog\xE1\u014Bgaviikagangaviikas\xF8rreisasorreisas\xF8r-varangersor-varangerxn--risr-iraskiervaxn--frna-woaxn--trna-woakvinesdalleksvikleirvikr\xF8yrvikroyrviksvelvikvenneslaevje-og-hornnessandnessj\xF8enmarnardalvindafjordsandefjordenebakksnillfjordullensvangxn--trany-yuabr\xF8nn\xF8ysundnamsskoganaustevollxn--stjrdalshalsen-sqbnord-aurdalnord-frontr\xF8gstadtrogstadgrimstadflakstadgjerstadxn--sandy-yuaxn--leagaviika-52bnore-og-uvdalvegarsheixn--rlingen-mxaxn--ggaviika-8ya47hveg\xE5rsheikarlsoykvitsoymasfjordenhamaroyinderoyosteroydavvenj\xE1rgasauheradguovdageaidnuxn--vre-eiker-k8abronnoysiellakkr\xF8dsheradkrodsheradkvinnheradbr\xF8nn\xF8yxn--mtta-vrjjat-k7afxn--lrenskog-54akvits\xF8yv\xE1rgg\xE1tkarls\xF8yoster\xF8yinder\xF8yhamar\xF8ybronnoysundxn--aurskog-hland-jnbbahccavuotnab\xE1hccavuotnagiehtavuoatnastor-elvdalmidtre-gauldalxn--gildeskl-g0akarasjokevenassixn--bievt-0qaxn--yer-znalebesbynessebyxn--hbmer-xqamalselvm\xE5lselvxn--unjrga-rtam\xF8re-og-romsdalmore-og-romsdalhareidmeland\xF8rlandorlandstrand\xE5lg\xE5rdsolundalgardafjord\xE5fjorddielddanuorrikautokeinoxn--stre-toten-zcbskodjeaejriestangeliernebamblestokkefauskesn\xE5asesnaasekongsvingerlangevagberlevagxn--flor-jrahattfjelldalostre-toten\xF8stre-totenvestfoldxn--mely-ira\xE1laheadjualaheadjunordreisaxn--troms-zuaxn--lgrd-poacporsangerflatangerstavangerleikangerbremangersamnangergieldakarasjohkaxn--rdy-0nabfrostautsirasnoasatromsaxn--sr-aurdal-l8aflekkefjordj\xF8lsterjolsteraremarkhedmarkn\xE5\xE5mesjevuemienaamesjevuemiexn--vard-jrarollagmer\xE5kermerakerorskog\xF8rskogxn--bdddj-mrabd\xE1k\u014Boluoktaxn--osyro-wuaaknoluoktatrysilskjerv\xF8ymandaljondalbindalrindalmeldalsuldalorkdalsigdalalvdall\xE6rdalhurdalsirdalverdallerdallardaloppdal\xE5seralaseralhadselkrager\xF8divttasvuotnaoverhallasteinkjerxn--hnefoss-q1askedsmokorsettroms\xF8xn--dyry-iravestre-totenmuseumxn--sandnessjen-ogbrahkkeravjufylkesbiblb\xE1jddarbajddarxn--laheadju-7yarennes\xF8yxn--koluokta-7ya57hxn--hgebostad-g3aleirfjordstorfjordbalsfjordb\xE5tsfjordbatsfjordmuos\xE1tbiev\xE1tloab\xE1tk\xE1r\xE1\u0161johkan\xF8tter\xF8yxn--mjndalen-64anordkappl\xE1hppilahppialstahaugsiljanverranr\xF8ykenroykenhaldenlyngenbergenhortenh\xF8nefosshonefosstroandinbeiarnvarggatosoyroos\xF8yrotromsoidrettmuosatbievatruovatloabatvoagattynsetnessetxn--indery-fyask\xE1nitskanitraholtr\xE5holtxn--ystre-slidre-ujbandebusarpsborgbearduxn--karlsy-fyahordalandjorpelandj\xF8rpelanddeatnuringsakers\xF8r-odalsor-odalxn--slt-elabringerikeaudnedalnittedalnissedalhemsedalslattumsurnadalxn--blt-elabelverumstj\xF8rdalnaustdalhjartdalgj\xF8vikfyresdalhasviknarviklarvikgjovikmalvikgamviklenvikporsgrunnstjordalengerdaldrobakdr\xF8bakxn--msy-ula0hvestvagoyxn--vgan-qoaxn--ryken-vuaxn--lten-graxn--stfold-9xaxn--hpmir-xqaxn--lury-iram\xE1latvuopmimalatvuopmitysv\xE6rkirkenesbirkenesmoskenesb\xE1id\xE1rxn--fjord-lraxn--rdal-poabahcavuotnab\xE1hcavuotnaxn--frde-gralind\xE5sbearalvahkixn--hobl-irar\xE1hkker\xE1vjuxn--loabt-0qav\xE5g\xE5\xE1lt\xE1bod\xF8sundlundrader\xE5deetnetimeholeauregrueoddavagavegaranatanaarnasolasulaaltalekafusavangbergkvam\xE5mliamlibokntinnroangranosenoslobodor\xF8stroststat\xE5motamotivgupriv\xF8yeroyerliermossvossxn--nvuotna-hwalusterlunnermarkerh\xE1bmerhabmerhvalerfjalerxn--rholt-mratysvarbaidarfitjargaularh\xE1pmirhapmirmelhusfosnes\xF8ksnesoksnestysneshemnesevenesflesbergeidsbergtonsbergt\xF8nsberglindasxn--sndre-land-0cbnamsosxn--srum-gra\xF8ystre-slidreoystre-slidrevestre-slidretrondheimbalestrandxn--langevg-jxaaustrheimxn--skjk-soavagsoyaveroysandoykarmoyfinnoytranoyvestbytranbysykkylvenxn--hyanger-q1aspjelkavikandasuoloxn--fl-ziaxn--drbak-wuastathellexn--sr-varanger-ggbtelemarkxn--bhcavuotna-s4axn--porsgu-sta26f\u010D\xE1hcesuolocahcesuoloakrehamn\xE5krehamnsand\xF8ykarm\xF8yfinn\xF8ytran\xF8yv\xE5gs\xF8yaver\xF8ynamdalseidxn--lesund-huabadaddjaxn--vegrshei-c0axn--btsfjord-9zagildesk\xE5lporsanguxn--trgstad-r1an\xE1vuotnanavuotnahammerfestxn--sgne-graxn--brnny-wuacibestadharstadnarviikaeven\xE1\u0161\u0161ivestnesgjemnessandnesagdenesrennesoyxn--avery-yuaxn--tysvr-vrabearalv\xE1hkikongsbergspydebergrandabergxn--andy-iradavvesiidaxn--krdsherad-m8apors\xE1\u014Bgufredrikstadbjerkreimringeburennebuaurskog-holandnotteroyxn--vgsy-qoa0jxn--rmskog-byaskierv\xE1ivelandbyglandfrolandaurlandforsandxn--bjddar-ptamidsund\xE5lesundalesundfetsundfarsundovre-eiker\xF8vre-eikerakershusxn--moreke-juas\xF8rfold\xF8stfoldostfoldsorfoldh\xF8yangerhoyangerlevangerorkangertanangerxn--vestvgy-ixa6olillesandulsteinxn--rennesy-v1agranvinskjervoyxn--klbu-woalavagisxn--h-2faxn--ryrvik-byakafjordk\xE5fjordseljordfolkebiblxn--gjvik-wuajevnakerxn--kfjord-iuabudejjuxn--kranghke-b0axn--davvenjrga-y4axn--rland-uuaxn--ldingen-q1axn--mlselv-iuaxn--rady-iraxn--linds-prabrumunddalxn--ygarden-p1amo-i-ranaeidskogr\xF8mskogromskoghjelmelandxn--finny-yuaxn--sr-odal-q1axn--skjervy-v1aballangenkvanangenkv\xE6nangengratangenxn--hmmrfeasta-s4acvossevangensuohkanxn--rde-ulaxn--mli-tlaxn--ksnes-uuanordlandskanlandsk\xE5nlandsortlandfuoiskuxn--rros-graxn--hcesuolo-7ya35bxn--eveni-0qa01gagaivuotnag\xE1ivuotnaxn--seral-lradrammenmodalenmosjoenjan-mayentorskensteigengloppenxn--snes-poamatta-varjjatxn--sr-fron-q1aomasvuotnajessheimb\xE5d\xE5ddj\xE5xn--krager-gyaxn--kvfjord-nxaxn--asky-iraxn--snase-nraxn--bidr-5nacholt\xE5lenxn--vads-jraxn--jlster-byamosj\xF8enxn--rst-0nastavernxn--ostery-fyaxn--oppegrd-ixaxn--sknit-yqaxn--risa-5naoppeg\xE5rdskiptvetrendalenholtalenxn--mot-tlaxn--lhppi-xqaxn--holtlen-hxaxn--srreisa-q1akopervikxn--muost-0qaxn--bmlo-grahokksundkvalsundegersundxn--karmy-yuaullensakerxn--hylandet-54axn--kvitsy-fyaxn--bod-2nalangev\xE5gberlev\xE5gkristiansandxn--rsta-frahornindalstj\xF8rdalshalsenstjordalshalsensandnessjoenh\xE1mm\xE1rfeastaxn--lrdal-sras\xF8r-fronsor-fronnord-odalkristiansundm\xE1tta-v\xE1rjjatvestv\xE5g\xF8ynesoddennotoddenbuskerud\xF8ygardenoygardensalangenlavangenralingenr\xE6lingenlodingenl\xF8dingenlea\u014Bgaviikalaakesvuemieleangaviikauenorgexn--srfold-byaaskvollxn--rskog-uuaxn--nry-yla5gxn--vry-yla5ghammarfeastaxn--rhkkervju-01afxn--givuotna-8yakommunekrokstadelvanedre-eikerhagebostadh\xE6gebostadxn--berlevg-jxakviteseidxn--s-1faxn--l-1faxn--nmesjevuemie-tcbafuosskomo\xE5rekemoarekexn--lt-liacxn--jrpeland-54asvalbardoppegardholmestrandtvedestrandsogndalsokndalarendalsunndalfolldalxn--krjohka-hwab49jlyngdaletnedalnorddalsaltdalgausdalskedsmovaksdalgjesdalstordalxn--frya-hraaarbortedrangedalxn--smna-graaurskog-h\xF8landxn--vg-yiabtjeldsundhaugesundlindesnesxn--mre-og-romsdal-qqbxn--dnna-gradynmerseineshacknetenterprisecloudmineaccomaorim\u0101oriorgmilcriiwigennetschoolhealthkiwigovtgeekxn--mori-qsacloudnsparliamentcomedorgcompronetedugovmuseumwebsitekinservicebarsywebsitebuildereerobookheimdnsleapcelleero-stagetechcrscsslorigingohomecdbedeeeiemesecabgngilnlalplchfisiincnnoroptatitmtltruauhulumkdkukskjplvtrgrfrkrhrusesismycynzcznetinteduassoososcloudstgbetaaezaeuhkusjshatenadiarycdn77hoptozaptois-a-knightmyftpno-ipjpnddnssdpdnsspdnsbarsysweetpepperis-a-bruinsfanis-very-sweetservegameis-a-soxfanhomelinuxcdn77-secureservebbsmisconfusedwebredirectblogsitefreedesktopcouchpotatofriestoolforgeaccesscamis-lostreadmyblogsmall-webfedorapeopleserveftpis-a-celticsfanmywirepotagertwmailin-dslsellsyourhomeread-booksfreeddnscable-modemis-savednflfanufcfanmlbfanstuff-4-saleendoftheinternetin-vpnmy-firewallhomeftpis-localis-a-chefboldlygoingnowherewebhopselfipkicks-assroxatunkcamdvrfedoraprojectgotdnsdvrdnsdyndnspubtlspimientahomeunixdontexistfedorainfracloudwmflabsfspagesbmoattachmentsteckidsfamilydsdnsaliasdynaliasnow-dnscloudnsdoomdnsduckdnsblogdnshomednsroutingthecloudendofinternetdsmynasip-dynamicpoivronhttpbinmyfirewallis-very-evilmysecuritycamerais-a-linux-userwmcloudis-a-geektuxfamilyis-a-candidatedoesntexistis-very-badhobby-sitegame-hostaltervistais-foundis-a-patsfandnsdojohepforgepodzonedynservcollegefanis-very-goodfrom-meis-very-niceisa-geeknerdpolacmedsldingorgcomnomgobabonetedupleskaemhlxmyboxrockyprvcydeuxfleurspdnscodebergheyflowstatichostorgmilcomnomgobneteduorgcomeduiorgmilcomngonetedugovcloudns1337ngrokacorggogfamcomwebgobnetedugokgopgkpgovgosbizpasaugumicsopozpapuwmwsrprusiskwpspkppspkmpspokeoiawsawifoumsdnskokwpmuppuppsppiwwiwoowuzswkzoschrzpisdnwzmiuwwitdpssewsseumigugimoirmpinbwinbwiihupporzgwgriwupowwskrwioswuozstarostwokonsulattmpccopruszkowmyspreadshopostrodakartuzyopolegminamediaustkazgorajgoraolawailawalomzawloclradombytomjaworznotargilubinkoninzagantorunkutnokepnonakloczestsopotsanokturekplockslasksklepzarowlukowmedaidgdaorgmilrelcomnomatmgsmartneteduelkgovwawsossexbiztgorysejnytychypomorzeboleslawiechomesklepsdscloudunicloudzakopanelegnicarawa-mazbydgoszczswidnikkrasnikwloclawekbielawamragowograjeworealestatebeskidykaszubymalopolskaprzeworskswiebodzinlecznadfirmaszkolawarmiagdyniamiastakazimierz-dolnymalborkswidnicadlugolekaostrolekapodlasieelblagtravelsimplesitezachpomormielecszczecinnieruchomosciwalbrzychlezajsklublinbedzinpoznanwielunmielnooleckostarachowicedkontopowiatwroclawrybniksuwalkileborkslupskgdanskostrowwlkptarnobrzegtourismwegrowkrakowglogowyou2pilanysamailwrocinfoagroautobeepshopprivlapypiszlodzcfolksecommerce-shopmazurypulawyskoczowrzeszowpomorskiezgierzkaliszolkuszlowiczostrowiecsosnowiecmazowszewodzislawbialowiezazgorzeleckatowicepabianicejelenia-gorawolominkarpaczsieradznowarudaczeladzkonskowolaskierniewiceswinoujscieturystykabieszczadycieszynketrzynolsztynbialystokbabia-goraprochowicewarszawastalowa-wolapolkowicegorlicegliwiceponiatowalimanowalubartowaugustowkobierzyceopocznognieznoszczytnokolobrzegshoparenapodhalebielskoklodzkostargardatwithplayitownnamecoorgnetedugovacorgcomproestnetedugovbiznameislaprofinforechtngrokmedaaaacacpaenglawjurbarbarsykeeneticavocatacctcloudnsorgcomsecplonetedugov123paginaweborgcomnetintedugovnomepublidkinbarsygovx443cloudnsorgmilcomnetedugovcooporgmilcomschnetedugovnamecomcannetlibassoaemclantmcontstoreorgcomnomrecwwwbarsyfirminfoshopartsstackitmyddnswebspacelima-cityacincooxorgedugovbarsybrendlyhbvpsvpsspectrumlandinghostingacppmordoviamcprecbgorgmilcomspbnetintedumsknovgovbirrasmcdirmytismircloudvladimirnalchikadygeyamarinepyatigorskmyjinobashkiriaeurodirvladikavkazna4ugroznykustanaikalmykiacldmaildagestaniranbuildcanvaliaravalwixdevelopmentappwritemigrationneedleverceldatabasestackitcodereplravendbonporterlovableaccoorgmilnetgovcoopmedorgcompubschnetedugovservicemecomygovorggovtvmedorgcomnetedugovinfoedgfacbmlonihkutwpsryxzbdtmacfhppmyspreadshopbrandpartiorgcomfhvpress123minsidaitcouldbeworlanbibkommunalforbundfhskiopsyskomvuxkomforbnaturbruksgymnloginlineorgcomnetedugovenscaledeuusentbotdaorgmilcomnetgovnowteleporthashbangplatformlovablebarsyshopwarebasehoplixbarsyonlinemsf5gitappgitpagecofigma-govcaffeinefigmacanvasoltstputerbarsysupportchatgptsquareomniweopensocialcpanelnotionnovecorewpsquaredpreviewjelecyonbyensrhtfastvpspieboxconvexjouwwebheyflowplatformshloginlinemadethissourcecraftclouderaorgorgcomartedugouvunivmeorgcomnetedugovsurveysstatichfheiyuxs4allprojectmyfastubervibehostapp-ionosdeployagentmecoorgcomschnetedugovbizcncostoreorgmilcomneteduembaixadaconsuladokiraranohoprincipesaotomeheliohobarsystorebaseshopwaresellfyabkhaziavologdamordoviapenzalenugsochinavoiexnetspbmsknovnorth-kazakhstanashgabadkareliaarmeniageorgiavladimirnalchikivanovobukharaadygeyakhakassiakalugakrasnodarjambylaktyubinsktroitskbryanskobninskkurganazerbaijanpokrovskbashkiriatselinogradvladikavkazmurmansktulatuvamangyshlaktashkentchimkentgroznykaragandatermezarkhangelskkustanaikalmykiabalashoveast-kazakhstankaracoldagestantogliattibarsyredorgcomgobedumirenknightpointaccoorgjelasticdiscoursecleverappsschacmiincogoornetonlineshopcogoorgmilcomwebnicnetintedugovbiznametestcoorgmilcomnomnetedugovorangecloudpersoindorgcomfinnatnetgovensmincomtourismintlinfox0611oyaorgmilcomnetedugovquickconnectvpnplusnettprequalifymeaddrmyaddrntdllwadlnctvavdrk12orgmilpolbeltelcomwebgennetedutskkepgovbbsbiznameinfocoorgmilcompronetedugovbiznameinfobetter-thanworse-thansakurafromdyndnson-the-webmymailerorgmilurlcomneteduidvgovmydnsgameclubebizmeneacsccogotvorhotelmilmobiinfovodteiflgplkmsmsbcckhincndnvncoztltmkckppzpdprvcvkvlvcrkrkscxuzchernovtsyrivneyaltaodesavolynrovnolutskltdinforgcomnetedugovbizvinnicazhitomirternopilpoltavakropyvnytskyizaporizhzhiasevastopolsebastopoluzhgoroduzhhorodkharkovkharkivvinnytsiakhmelnytskyizaporizhzhecrimeaodessazhytomyrnikolaevcherkassydonetskluganskluhanskkirovogradivano-frankivskchernivtsikrymkievkyivlvivsumyzakarpattiamykolaivcherkasychernigovkhersonchernihivdnipropetrovskdnepropetrovskkhmelnitskiyneacsccogoorusorgmilcomedugovvmdhmyspreadshopadimono-ipbarsybytemarkbarsyonlinelayershiftnh-servretrosnubapicampaignservicelugaffinitylotteryweeklylotteryraffleentrygluglugsmeaccoindependent-inquestnimsitecopropymntltdorgplcschnetgovnhsbarsyindependent-commissionindependent-reviewpolicepublic-inquiryindependent-panelconnhospindependent-inquiryroyal-commissionoraclegovcloudappscck12libccphxcclibpvtparochchtrcck12libcceatonk12coglibtecgendstmusann-arborwashtenawcck12glghcck12sealibforksolympiabainbridge-islkeyporthoquiamyarrow-pointcentraliaport-townsendsequimport-ludlowrentonsilverdalebremertonredmondsheltonbellevueport-orchardport-angeleskingstonchehalisaberdeengig-harborseattlepoulsboidmdndsddemenegacalamaiavawapailalflnmdcncscohnhmihiviwiriinmntnmocoutvtctmtgunjokakwvnvprarorasmskstxwynykyazisadninsnngosrvis-bymircloudservernamepointtoenscaledland-4-salefreeddnsstuff-4-saleazure-apinoipcloudnsgolffanheliohostazurewebsitesgvorgmilcomgubneteducoorgcomnetd0egvorgmilcomnetedugovmydnsiacostoree12orgmilcomnomwebgobbibrectecnetintedugovraremprendefirminfoartseducok12orgcomnethidnsidacaiiosonlahanamhanoicamauhueorgcompronetintedugovbizbacninhtayninhhoabinhnamdinhtravinhhaiphongvinhlonghaiduongquangnamquangtrithuathienhuequangninhbacgianghaugiangquangbinhsoctrangbentrethanhphohochiminhdanangkontumhatinhkhanhhoathanhhoahealthgialailaocaiyenbaibackanngheanlonganphuyenphuthocanthodaklakdongnainameinfovinhphucdongthapkiengiangtiengiangquangngailaichaulangsonlamdongdaknonghagiangangiangcaobangbinhduongninhthuanbinhthuanbaclieuthaibinhninhbinhbinhdinhtuyenquanghungyenbaria-vungtauthainguyendienbienbinhphuocschbizputerimagine-proxyorgcomnetedugovcloud66advisormypetsdyndnsxn--8dbq2axn--4dbgdty6cxn--5dbhl8dxn--hebda8bxn--80auxn--d1atxn--c1avgxn--o1acxn--o1achxn--90azhxn--55qx5dxn--uc0atvxn--od0algxn--wcvs22dxn--gmqw5axn--mxtq1mxn--12c1fe0brxn--h3cuzk1dixn--12co0c3b4evaxn--12cfi8ixb8lxn--o3cyx2axn--m3ch0j3axn--j1adpxn--90amcxn--90a1afxn--h1ahnxn--j1ael8bxn--h1alizxn--c1avgxn--j1aefxn--80aaa0cvacxn--41acaffeineexeopentunnelbotdashtelebitorgtmaccoagricorgmilnomwebnicngonetaltedugovlawnisschoolgrondaraccoorgmilcomschnetedugovbizinfoprg1-zeropstritonstackitlimazeropsaccoorgmilgov\u044F\u0441\u043F\u0431\u043E\u0440\u0433\u043A\u043E\u043C\u043C\u0441\u043A\u0431\u0438\u0437\u043C\u0438\u0440\u0441\u0430\u043C\u0430\u0440\u0430\u043A\u0440\u044B\u043C\u0441\u043E\u0447\u0438\u0430\u043A\u043E\u0434\u043F\u0440\u043E\u0440\u0433\u043E\u0431\u0440\u0443\u043F\u0440\u05E6\u05D4\u05DC\u05DE\u05DE\u05E9\u05DC\u05D9\u05E9\u05D5\u05D1\u05D0\u05E7\u05D3\u05DE\u05D9\u05D4\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25\u0E28\u0E36\u0E01\u0E29\u0E32\u0E17\u0E2B\u0E32\u0E23\u0E40\u0E19\u0E47\u0E15\u6559\u80B2\u7DB2\u7D61\u7D44\u7E54\u516C\u53F8\u653F\u5E9C\u500B\u4EBA\uB2F7\uB137\uD55C\uAD6D\u6FB3\u95E8\u65B0\u95FB\u6FB3\u9580\u8054\u901A\u5BB6\u96FB\u5609\u91CC\u62DB\u8058\u901A\u8CA9\uB2F7\uCEF4\uC0BC\uC131\u30B3\u30E0\u10D2\u10D4\u0431\u0433\u0440\u0444\u0435\u044Eadcdbdgdidmdsdtdaebedeeegeiejekemenepereseveyegabacalamanauavapaqasazacfbfafgfnfpfwftfbgcgagggegkgngmgsgpgvgtgugilmlnlalclglplsltlhmimjmkmmmomambmcmdmfmgmzmpmsmtmgbbblbsbecccacnclcmcvctcscmhkhghchbhthphshlinikifigiaibicivisikninhnmncnbngnsnpnvntnjoionomobocoaofodorosotoptstttytatbtetgtithtmtltrusuvuaucueuguhulumunufjdjbjtjsjlkmkhkfkdkcktkukskpkgpmpnpkpjpgqaqmqiqsvtvcvbvmvlvrwpwtwzwbwcwawgwkwmwtrsrprgrfrercrbrarnrmrlrkrirhrwsusrssspsgsesbsaslsmsissxmxaxcxuypysylymykygybycyuztzsznzmzkzdzczbzaz\u03B5\u03BB\u03B5\u03C5\u4E16\u754C\u53F0\u7063\u8D2D\u7269\u516C\u76CA\u70B9\u770B\u81FA\u7063\u7F51\u7EDC\u66F8\u7C4D\u5728\u7EBF\u7F51\u7AD9\u624B\u673A\u673A\u6784\u5927\u62FF\u6E38\u620F\u4FE1\u606F\u53F0\u6E7E\u8C37\u6B4C\u6148\u5584\u5546\u6807\u9999\u6E2F\u4E2D\u56FD\u9910\u5385\u7F51\u5740\u4E2D\u570B\u5546\u57CE\u98DF\u54C1\u5FAE\u535A\u653F\u52A1\u79FB\u52A8\u96C6\u56E2\u516C\u53F8\u516B\u5366\u5546\u5E97\u5065\u5EB7\u7F51\u5E97\u653F\u5E9C\u65F6\u5C1A\u4F5B\u5C71\u4E2D\u4FE1\u5A31\u4E50\u5E7F\u4E1C\u4F01\u4E1Ahomedepotengineering\u0627\u0645\u0627\u0631\u0627\u062Arepublicankuokgroupversicherungchannelcitadelxn--pgbs0dhxn--b4w605ferdstatebankwebsitexn--mgb9awbf\u4E9A\u9A6C\u900A\u6DE1\u9A6C\u9521alibabaxn--ngbc5azdxn--mgbbh1axn--45br5cyltoshibabuildworldcloudtradeguideplacespacedancemoviephoneprimesmilebiblestyleappleazurestoreskypegripexn--l1accdrivelottehorsehouseleasechasereisestadahondaomegaaetnaamicaninjanokiamediadeltavodkaedekaosakapizzaslingemailgmailtirolshelltmallfinallegaltotalhotelamfamforumrehabmusicciticricohcoachwatchboschearthfaithirishmiamiarchidubaiguccipraxi\u307F\u3093\u306A\u30B9\u30C8\u30A2\u30BB\u30FC\u30EBcanonsalononionnikonepsonkoelngreensevencrownikanoradioaudioweiboglobopromogalloyahoociscorodeovideomangobingotokyovolvolottokyotophotosmartsportquesttrusthyattjetztadultcymrubaidutushuxn--kprw13dubankclickblackmerckgroupsharpcheapnowtvxn--h2brj9c\u05E7\u05D5\u05DD\u0570\u0561\u0575\u043E\u0440\u0433\u0441\u0440\u0431\u043C\u043E\u043D\u043A\u043E\u043C\u0431\u0435\u043B\u043C\u043A\u0434\u049B\u0430\u0437\u0440\u0443\u0441\u0443\u043A\u0440\u0645\u0635\u0631\u0642\u0637\u0631\u0639\u0631\u0628\u0643\u0648\u0645dadcfdmedwedredphdthdbidpidkrdmsdltdiceonewmeglemoerwecfageacbanbambaaaammakianraspacpaaxawtfbcgaegongingaigvigorgdogdhlmilrilonlaolloluoljllcalgalnflafltelsrlfrllplkimibmcamcombommomifmabbjcbscbcabnabtabmlbpubabcbbcnecincpncllcstcwtcpwcnyckfhbzhovhmoiskiobisbitcifyituipinvinwinxincbnbcnmanfangdnmenrenkpnmtnyunrunfununobiojioriohbogmofooboooooacoecoceongoproartistottnttbbtcateatlatvetpetbetnethktmitfitintjothotgotdotbotprueduicujnjyouinknhktdkappsapgapmapdnptopgopllpjmpzipvipripesqtrvdtvitvdevmovgovhivnrwlawsewnewbmwwownowhowdvrftrmtrsfrbarcartvscrseusawsupsubssbsadsddsldssasbmsmlsxxxboxfoxgmxtjxsextaxbuyflydiysoyjoyskypaydaygayxyzanzbizwebersenerpokerlameractortatarsolar\u0EA5\u0EB2\u0EA7\u0E04\u0E2D\u0E21\u0E44\u0E17\u0E22tourslocusnexuslexusgiftsbeatsboatspartspressglassswiss\u0915\u0949\u092E\u0928\u0947\u091Ftiresgivescodeshomesgamestunesshoescardswalesloansvegastoolsdealsautosparis\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3workssucksrocksxeroxforexfedexpartylillymoneystudyrugbytoraytoday\u4E2D\u6587\u7F51xn--unup4y\u5929\u4E3B\u6559\u98DE\u5229\u6D66\u65B0\u52A0\u5761enterprises\u6211\u7231\u4F60\u5609\u91CC\u5927\u9152\u5E97christmasxn--fct429kholdingsxn--8y0a063axn--mgbx4cd0ablifestyleabogadoallstatenetbank\u0643\u0627\u062B\u0648\u0644\u064A\u0643xn--s9brj9cxn--gk3at1ebestbuycharityxn--55qx5dmicrosoftpropertybasketballhomegoodscorsicajewelrygallerygrocerysurgerycountrybrusselsverisignferreroxn--czr694bhdfcbankcommbanksoftbank\u067E\u0627\u0643\u0633\u062A\u0627\u0646\u067E\u0627\u06A9\u0633\u062A\u0627\u0646nextdirect\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647\u0627\u0644\u0639\u0644\u064A\u0627\u0646xn--h2brj9c8cxn--80adxhksshikshaxn--mgbai9azgqp6jcuisinellabarclayscatholicxn--kpry57dcompanyxn--xhq521bblackfridayxn--mgba3a3ejtsandvikxn--d1acj3bacademydownload\u0645\u0644\u064A\u0633\u064A\u0627xn--j1amhxn--w4r85el8fhu5dnraipirangaathletaxn--fhbeixn--mgbqly7cvafrzuerichxn--c2br7g\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8contractorsxn--io0a7igraphicsinsurancetemasekxn--xkc2al3hye2amotorcyclesphotographydirectoryplumbingxn--vhquvclothingtrainingcleaningwilliamhilllightingxn--mgba3a4f16ashoppingcateringeducationokinawapicturesventuresproductionsxn--9et52uwalmart\u0D2D\u0D3E\u0D30\u0D24\u0D02supportrealestatecapitalonexn--nqv7fs00emaauspostfloristdentistxn--qxamgodaddybradescobargainsmitsubishikerryhotelsxn--9dbq2axn--3pxu8kimmobilienxn--fjq720axn--mgbtx2bholidaymckinseymadridbusinessbuildershelsinkixn--4gbrim\u043C\u043E\u0441\u043A\u0432\u0430\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629coffeedegreelacaixapartnersalsaceofficeabbvievoyageorangegeorgeonlinechromemobilekindlegoogleoraclecircleschulesecureinsurexn--mgba7c0bbn0aestatexn--mgbc0a9azcgcruisehangoutxn--vuq861bxn--42c2d9arexrothfirestoneuniversityxn--nnx388alifeinsuranceextraspace\u043E\u043D\u043B\u0430\u0439\u043Dverm\xF6gensberatersoftwarexn--fiqs8sxn--mgbab2bdxn--w4rs40ltienda\u092D\u093E\u0930\u0924\u092E\u094Dafricatoyotaotsukasakuracameracreditcardnagoyaconsultingnetworkjunipertheatermonsterprogressivepioneerxn--55qw42gracingdatingvotingvikinglivinggivingxn--bck1b9a5dre4cbrotherweatherjoburg\u0641\u0644\u0633\u0637\u064A\u0646lplfinancialxn--clchc0ea0b2g2a9gcdfutbolschoolsocialglobaldentalwoodsidechanelairtelmatteltravelrealtorwebcamstream\u0C2D\u0C3E\u0C30\u0C24\u0C4Dunicomalstomxn--nodexn--6frz82gmuseumfurniturexn--rvc1e0am3exn--mix891faccenturexn--11b4c3dismailineustardiscountquebeccomsecclinicservicesxn--y9a3aqxn--c1avgswatchchurchsearch\u0627\u0644\u0627\u0631\u062F\u0646marketingcontacthealthmonashshoujisanofitaipeiamericanexpresssuzuki\u30A2\u30DE\u30BE\u30F3\u30AF\u30E9\u30A6\u30C9\u30DD\u30A4\u30F3\u30C8bharti\u30B0\u30FC\u30B0\u30EBxn--mgberp4a5d4armemorialxn--1qqw23alondonmormoninstitutevisionbostonnortoncouponmaisonamazonvirginberlindesigndurbanolayannissananquanxihuanhitachikaufengardenreisenbayerntechnologydatsunxn--90a3aclatinocasinostudiophysioxn--ngbe9e0apharmacytattootaobaoaramcoexpertreportabbottdirectselectimamatfairwindspictettargetmarketintuittravelersinsurancecreditdupontryukyusuppliesxn--tckwebnpparibasschmidtmerckmsdyodobashirestaurantbridgestonecricketxn--fpcrj9c3dbostikbroadwayattorneylefrakemerckxn--fiq228c5hscareersfarmerswinnersflowersxn--wgbh1cguitarsxn--54b7fta0ccxn--p1acfmakeupgalluplandroverxn--kcrx77d1x4agoldpointbauhausxn--mgbayh7gpahiphopplaystationxn--mgba3a4fraxn--eckvdtc9dhyundaixn--gckr3f0fistanbulticketsmarketsflightschintaireviewsxn--3e0b707ewindowsxn--fiqz9sfinancialxn--fzys8d69uvgm\u0627\u0628\u0648\u0638\u0628\u064Adiscoverreview\u09AC\u09BE\u0982\u09B2\u09BExn--5su34j936bgsgmoscowobserverapartments\u0434\u0435\u0442\u0438\u0627\u0631\u0627\u0645\u0643\u0648\u0441\u0430\u0439\u0442eurovisionxn--i1b6b1a6a2exn--xkc2dl3a5ee0h\u062A\u0648\u0646\u0633\u0645\u0648\u0642\u0639\u0628\u0627\u0631\u062A\u0680\u0627\u0631\u062A\u0634\u0628\u0643\u0629\u0639\u0645\u0627\u0646\u0628\u064A\u062A\u0643\u0639\u0631\u0627\u0642readkredbondlandbandfundfoodprodgoldfordtubecafesafelifeggeeieeefreefagepagegugezonewinememenamegamesaleablebikenikelikecarecbreherefiresaveloveliveblueartedatesitevotecaseluxebofamodaltdaasdatiaayogasinavanashiaasiajavabbvatevavivadatazaraarpacasavisasncfprofmaifsurfgolfdvagsongbingpingwangkpmggoogblogpohlfailcooldellcalldeallidlsarlfilmteamroomfarmimdbarabclubhdfcicbchsbcgmbhrichtechfishdishcashminiernikddiaudiwikimobitaxicitikiwidesiqponskinloanakdnwienopenporncerntownimmolimoolloinfonicofidolegosaxozeroaerovivoautovotomotofastbestresthostpostnextlgbtchatseatgiftmeetdietreitmintrentgentspotscotguruitausohumenucyoubanklinkpinkdclktalksilkbookseekworkrsvpaarpjeepshopcoophelpcamppccwshowbeerstarruhrflirweirhaircarsparsjprshausplusnewstipstoysjobskidsfanspicsdocsxboxamexsexynavycitysonyarmyallybabyplaydeliverybuzzgbizlamborghiniphilips\u0DBD\u0D82\u0D9A\u0DCF\u0CAD\u0CBE\u0CB0\u0CA4fitnessexpresslanxesspfizercenterwalterlawyersoccercareerkosherbrokerlockerdealerdoctorauthorxn--mgbqly7c0a67fbcverm\xF6gensberatungjaguarxn--pssy2uxn--hxt814eflickrrepairrogersairbusxn--mgbai9a5eva00beventsyachtsxn--t60b56a\u09AD\u09BE\u09F0\u09A4\u09AD\u09BE\u09B0\u09A4\u092D\u093E\u0930\u0924\u092D\u093E\u0930\u094B\u0924viajeshermeshughesxn--j1aef\u0938\u0902\u0917\u0920\u0928villas\u0B2D\u0B3E\u0B30\u0B24claimshotels\u0AAD\u0ABE\u0AB0\u0AA4zapposphotosjuegoscondostatamotorsgratistennis\u0A2D\u0A3E\u0A30\u0A24tkmaxxtjmaxxschaeffleryandexxn--80aswgrealtysafetybeautyluxuryxn--3ds443gsupplyfamilyxn--o3cw4hhockeysydneyxn--90aenissayalipayenergycomputeragencyxn--rovu88b\u96FB\u8A0A\u76C8\u79D1xn--gecrj9cstatefarmaccountantaquarelleolayangroup\u9999\u683C\u91CC\u62C9xn--p1ai\u7EC4\u7EC7\u673A\u6784xn--1ck2e1bxn--mgbt3dhdschwarz\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627abudhabinowruzkomatsufujitsuhospitalxn--80asehdbxn--mgbtf8flxn--j6w193gxn--yfro4i67oprudentialxn--flw351ecruisescoursesrecipesxn--e1a4cferrarixn--ses554gxn--wgbl6awatchesstaplessinglesxn--mgbcpq6gpa1axn--otu796dpropertiescreditunionxn--mgbah1a3hjkrdstockholmhisamitsu\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629stcgroupdomainsoriginscouponsbloombergclubmedfroganslimitedxn--80aqecdr1aexposedinternationalequipmentbarclaycardxn--q7ce6axn--mgbi4ecexpprotectionassociatesconstructionxn--cck2b3bxn--45q11candroidfoundation\u05D9\u05E9\u05E8\u05D0\u05DCxn--mgbca7dzdocliniqueboutiqueengineerxn--qxa6asystemsfirmdalefashionauctionxn--nqv7finfinitirentalsreliancetradingweddingfishinghostinggentingbookingcookingxn--3hcrj9cgraingerxn--czrs0tdemocratsamsungyokohamaxn--h2breg3evexn--nyqy26alundbeckmelbournevacationssolutionsfrontierxn--vermgensberatung-pwbmanagementxn--cg4bkixn--mgb2ddeslincolnhamburgsandvikcoromantblockbusterairforcebarefootxn--4dbrk0ceinvestmentsfeedbackcommunityxn--ngbrx\u0627\u0644\u0628\u062D\u0631\u064A\u0646diamondsamsterdamhealthcareredumbrellaxn--mxtq1mxn--2scrj9cagakhanxn--mgbpl2fh\u043A\u0430\u0442\u043E\u043B\u0438\u043Acaravan\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCDrichardlimortgageamericanfamilyxn--fzc2c9e2cscholarshipssaarlandxn--imr513nvlaanderensamsclubgoodyearkitchen\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBEweatherchannelallfinanzxn--kput3i\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3xn--90aisxn--efvy88h\u0627\u0644\u062C\u0632\u0627\u0626\u0631xn--mgbaam7a8hexchangejpmorganxn--tiq49xqyjfidelitysecurityxn--mk1bu44cwanggouxn--fiq64bxn--6qq986b3xlxn--mgbbh1a71exn--80ao21amarshallsxn--5tzm5gtravelerspanasoniclatrobeyoutubeaccountantsxn--rhqv96gxn--cckwcxetdanalyticsxn--ygbi2ammx\u0628\u0627\u0632\u0627\u0631\u0628\u06BE\u0627\u0631\u062A\u0633\u0648\u0631\u064A\u0629organicfresenius\u0633\u0648\u0631\u064A\u0627xn--9krt00axn--qcka1pmcxn--jlq480n2rgdeloittesciencefinancexn--jvr189mxn--30rr7yhomesensehotmailbaseballfootballleclercboehringerxn--q9jyb4cxn--mix082f\u0627\u0644\u064A\u0645\u0646\u0647\u0645\u0631\u0627\u0647politie\u0633\u0648\u062F\u0627\u0646\u0627\u064A\u0631\u0627\u0646\u0627\u06CC\u0631\u0627\u0646netflixyamaxunxn--lgbbat1ad8jcollegestoragecapetowncolognekerrypropertiesxn--mgbgu82axn--ogbpf8flxn--czru2dwhoswhociprianilasallexn--g2xx48cforsalebanamexaudiblexn--vermgensberater-ctbxn--zfr164bericssonvanguardxn--45brj9cindustriestheatremarriottxn--3bst00mcomparexn--mgberp4a5d4a87gcapitaldigital\u0627\u0644\u0645\u063A\u0631\u0628barcelonashangrilaxn--d1alfcalvinkleinwwwcitysapporokawasakinagoyasendaikobekitakyushuyokohamackjp";
|
|
2906
|
+
var rulesRoot = 621;
|
|
2907
|
+
var exceptionsRoot = 625;
|
|
2908
|
+
|
|
2909
|
+
// ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/src/suffix-trie.js
|
|
2910
|
+
var numberOfNodes = nodeFlags.length;
|
|
2911
|
+
var numberOfEdges = edgeLength.length;
|
|
2912
|
+
var edgeOffset = new Uint32Array(numberOfEdges);
|
|
2913
|
+
var edgeHash = new Uint32Array(numberOfEdges);
|
|
2914
|
+
var wildcardEdge = new Int32Array(numberOfNodes).fill(-1);
|
|
2915
|
+
for (let node = 0, offset = 0; node < numberOfNodes; node += 1) {
|
|
2916
|
+
for (let edge = edgeStart[node]; edge < edgeStart[node + 1]; edge += 1) {
|
|
2917
|
+
edgeOffset[edge] = offset;
|
|
2918
|
+
const end = offset + edgeLength[edge];
|
|
2919
|
+
let hash = 5381;
|
|
2920
|
+
for (let i = end - 1; i >= offset; i -= 1) {
|
|
2921
|
+
hash = hash * 33 ^ labelText.charCodeAt(i);
|
|
2922
|
+
}
|
|
2923
|
+
edgeHash[edge] = hash >>> 0;
|
|
2924
|
+
if (edgeLength[edge] === 1 && labelText.charCodeAt(offset) === 42) {
|
|
2925
|
+
wildcardEdge[node] = edge;
|
|
2926
|
+
}
|
|
2927
|
+
offset = end;
|
|
2928
|
+
}
|
|
2929
|
+
}
|
|
2930
|
+
var matchNode = -1;
|
|
2931
|
+
var matchStart = 0;
|
|
2932
|
+
var matchEnd = 0;
|
|
2933
|
+
function labelEquals(edge, hostname, start, length) {
|
|
2934
|
+
if (edgeLength[edge] !== length) {
|
|
2935
|
+
return false;
|
|
2936
|
+
}
|
|
2937
|
+
const offset = edgeOffset[edge];
|
|
2938
|
+
for (let i = 0; i < length; i += 1) {
|
|
2939
|
+
if (labelText.charCodeAt(offset + i) !== hostname.charCodeAt(start + i)) {
|
|
2940
|
+
return false;
|
|
2941
|
+
}
|
|
2942
|
+
}
|
|
2943
|
+
return true;
|
|
2944
|
+
}
|
|
2945
|
+
function findEdge(node, hash, hostname, start, length) {
|
|
2946
|
+
let lo = edgeStart[node];
|
|
2947
|
+
let hi = edgeStart[node + 1];
|
|
2948
|
+
while (lo < hi) {
|
|
2949
|
+
const mid = lo + hi >>> 1;
|
|
2950
|
+
const value = edgeHash[mid];
|
|
2951
|
+
if (value < hash) {
|
|
2952
|
+
lo = mid + 1;
|
|
2953
|
+
} else if (value > hash) {
|
|
2954
|
+
hi = mid;
|
|
2955
|
+
} else {
|
|
2956
|
+
for (let e = mid; e >= lo && edgeHash[e] === hash; e -= 1) {
|
|
2957
|
+
if (labelEquals(e, hostname, start, length))
|
|
2958
|
+
return e;
|
|
2959
|
+
}
|
|
2960
|
+
for (let e = mid + 1; e < hi && edgeHash[e] === hash; e += 1) {
|
|
2961
|
+
if (labelEquals(e, hostname, start, length))
|
|
2962
|
+
return e;
|
|
2963
|
+
}
|
|
2964
|
+
return -1;
|
|
2965
|
+
}
|
|
2966
|
+
}
|
|
2967
|
+
return -1;
|
|
2968
|
+
}
|
|
2969
|
+
function walk(hostname, root, allowedMask) {
|
|
2970
|
+
let node = root;
|
|
2971
|
+
let end = hostname.length;
|
|
2972
|
+
let hash = 5381;
|
|
2973
|
+
matchNode = -1;
|
|
2974
|
+
for (let i = hostname.length - 1; i >= 0; i -= 1) {
|
|
2975
|
+
const code = hostname.charCodeAt(i);
|
|
2976
|
+
if (code === 46) {
|
|
2977
|
+
const start = i + 1;
|
|
2978
|
+
let edge2 = findEdge(node, hash >>> 0, hostname, start, end - start);
|
|
2979
|
+
if (edge2 === -1) {
|
|
2980
|
+
edge2 = wildcardEdge[node];
|
|
2981
|
+
}
|
|
2982
|
+
if (edge2 === -1) {
|
|
2983
|
+
return matchNode !== -1;
|
|
2984
|
+
}
|
|
2985
|
+
node = edgeChild[edge2];
|
|
2986
|
+
if ((nodeFlags[node] & allowedMask) !== 0) {
|
|
2987
|
+
matchNode = node;
|
|
2988
|
+
matchStart = start;
|
|
2989
|
+
matchEnd = end;
|
|
2990
|
+
}
|
|
2991
|
+
end = i;
|
|
2992
|
+
hash = 5381;
|
|
2993
|
+
} else {
|
|
2994
|
+
hash = hash * 33 ^ code;
|
|
2995
|
+
}
|
|
2996
|
+
}
|
|
2997
|
+
let edge = findEdge(node, hash >>> 0, hostname, 0, end);
|
|
2998
|
+
if (edge === -1) {
|
|
2999
|
+
edge = wildcardEdge[node];
|
|
3000
|
+
}
|
|
3001
|
+
if (edge !== -1) {
|
|
3002
|
+
node = edgeChild[edge];
|
|
3003
|
+
if ((nodeFlags[node] & allowedMask) !== 0) {
|
|
3004
|
+
matchNode = node;
|
|
3005
|
+
matchStart = 0;
|
|
3006
|
+
matchEnd = end;
|
|
3007
|
+
}
|
|
3008
|
+
}
|
|
3009
|
+
return matchNode !== -1;
|
|
3010
|
+
}
|
|
3011
|
+
function suffixLookup(hostname, options, out) {
|
|
3012
|
+
if (fast_path_default(hostname, options, out)) {
|
|
3013
|
+
return;
|
|
3014
|
+
}
|
|
3015
|
+
const allowedMask = (options.allowPrivateDomains ? 2 : 0) | (options.allowIcannDomains ? 1 : 0);
|
|
3016
|
+
if (walk(hostname, exceptionsRoot, allowedMask)) {
|
|
3017
|
+
out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
|
|
3018
|
+
out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
|
|
3019
|
+
out.publicSuffix = hostname.slice(matchEnd + 1);
|
|
3020
|
+
return;
|
|
3021
|
+
}
|
|
3022
|
+
if (walk(hostname, rulesRoot, allowedMask)) {
|
|
3023
|
+
out.isIcann = (nodeFlags[matchNode] & 1) !== 0;
|
|
3024
|
+
out.isPrivate = (nodeFlags[matchNode] & 2) !== 0;
|
|
3025
|
+
out.publicSuffix = hostname.slice(matchStart);
|
|
3026
|
+
return;
|
|
3027
|
+
}
|
|
3028
|
+
out.isIcann = false;
|
|
3029
|
+
out.isPrivate = false;
|
|
3030
|
+
const lastDot = hostname.lastIndexOf(".");
|
|
3031
|
+
out.publicSuffix = lastDot === -1 ? hostname : hostname.slice(lastDot + 1);
|
|
3032
|
+
}
|
|
3033
|
+
|
|
3034
|
+
// ../../node_modules/.pnpm/tldts@7.4.9/node_modules/tldts/dist/es6/index.js
|
|
3035
|
+
var RESULT = getEmptyResult();
|
|
3036
|
+
function getHostname(url, options) {
|
|
3037
|
+
resetResult(RESULT);
|
|
3038
|
+
return parseImpl(url, 0, suffixLookup, options, RESULT).hostname;
|
|
3039
|
+
}
|
|
3040
|
+
function getDomain2(url, options) {
|
|
3041
|
+
resetResult(RESULT);
|
|
3042
|
+
return parseImpl(url, 3, suffixLookup, options, RESULT).domain;
|
|
3043
|
+
}
|
|
3044
|
+
function getDomainWithoutSuffix2(url, options) {
|
|
3045
|
+
resetResult(RESULT);
|
|
3046
|
+
return parseImpl(url, 5, suffixLookup, options, RESULT).domainWithoutSuffix;
|
|
3047
|
+
}
|
|
3048
|
+
|
|
3049
|
+
// ../contracts/src/url-normalize.ts
|
|
3050
|
+
var DOMAIN_PARSE_OPTIONS = { allowPrivateDomains: true };
|
|
3051
|
+
var LINKIFY = new LinkifyIt({ fuzzyLink: true, fuzzyEmail: false }).tlds(tlds_default2);
|
|
3052
|
+
var STRIP_KEYS = /* @__PURE__ */ new Set([
|
|
3053
|
+
// Click identifiers
|
|
3054
|
+
"fbclid",
|
|
3055
|
+
"gclid",
|
|
3056
|
+
"msclkid",
|
|
3057
|
+
"ttclid",
|
|
3058
|
+
"li_fat_id",
|
|
3059
|
+
"igshid",
|
|
3060
|
+
"yclid",
|
|
3061
|
+
"dclid",
|
|
3062
|
+
"gbraid",
|
|
3063
|
+
"wbraid",
|
|
3064
|
+
"bingid",
|
|
3065
|
+
// Mailchimp
|
|
3066
|
+
"mc_cid",
|
|
3067
|
+
"mc_eid",
|
|
3068
|
+
// Google Analytics linkers
|
|
3069
|
+
"_ga",
|
|
3070
|
+
"_gl",
|
|
3071
|
+
// Google Tag Manager debug
|
|
3072
|
+
"gtm_latency",
|
|
3073
|
+
"gtm_debug",
|
|
3074
|
+
// WordPress internal noise
|
|
3075
|
+
"preview",
|
|
3076
|
+
"preview_id",
|
|
3077
|
+
"preview_nonce",
|
|
3078
|
+
"_thumbnail_id",
|
|
3079
|
+
// Common cache-busters/versioning
|
|
3080
|
+
"v",
|
|
3081
|
+
"ver",
|
|
3082
|
+
"version"
|
|
3083
|
+
]);
|
|
3084
|
+
function shouldStrip(key) {
|
|
3085
|
+
if (STRIP_KEYS.has(key)) return true;
|
|
3086
|
+
if (key.startsWith("utm_")) return true;
|
|
3087
|
+
return false;
|
|
3088
|
+
}
|
|
3089
|
+
function parseQuery(query) {
|
|
3090
|
+
if (query === "") return [];
|
|
3091
|
+
return query.split("&").map((pair) => {
|
|
3092
|
+
const eq = pair.indexOf("=");
|
|
3093
|
+
if (eq === -1) return { key: pair, value: null };
|
|
3094
|
+
return { key: pair.slice(0, eq), value: pair.slice(eq + 1) };
|
|
3095
|
+
});
|
|
3096
|
+
}
|
|
3097
|
+
function encodeQuery(pairs) {
|
|
3098
|
+
return pairs.map((p) => p.value === null ? p.key : `${p.key}=${p.value}`).join("&");
|
|
3099
|
+
}
|
|
3100
|
+
function collapseRootIndex(path) {
|
|
3101
|
+
if (path === "/index.html" || path === "/index.php") return "/";
|
|
3102
|
+
return path;
|
|
3103
|
+
}
|
|
3104
|
+
function dropTrailingSlash(path) {
|
|
3105
|
+
if (path.length > 1 && path.endsWith("/")) {
|
|
3106
|
+
return path.replace(/\/+$/, "");
|
|
3107
|
+
}
|
|
3108
|
+
return path;
|
|
3109
|
+
}
|
|
3110
|
+
function absolutizeProjectUrl(url, canonicalDomain) {
|
|
3111
|
+
if (!url) return "";
|
|
3112
|
+
const trimmed = url.trim();
|
|
3113
|
+
if (!trimmed) return "";
|
|
3114
|
+
if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
|
3115
|
+
if (trimmed.startsWith("//")) return `https:${trimmed}`;
|
|
3116
|
+
const host = canonicalDomain.trim().replace(/^https?:\/\//i, "").replace(/\/+$/, "");
|
|
3117
|
+
if (!host) return trimmed;
|
|
3118
|
+
if (trimmed.startsWith("/")) return `https://${host}${trimmed}`;
|
|
3119
|
+
return `https://${host}/${trimmed}`;
|
|
3120
|
+
}
|
|
3121
|
+
function hostOf(value) {
|
|
3122
|
+
if (value == null) return null;
|
|
3123
|
+
const trimmed = value.trim();
|
|
3124
|
+
if (!trimmed) return null;
|
|
3125
|
+
const hostname = getHostname(trimmed);
|
|
3126
|
+
return hostname ? hostname.replace(/^www\./i, "").toLowerCase() : null;
|
|
3127
|
+
}
|
|
3128
|
+
function registrableDomain(value) {
|
|
3129
|
+
if (value == null || value.trim() === "") return "";
|
|
3130
|
+
return getDomain2(value, DOMAIN_PARSE_OPTIONS)?.toLowerCase() ?? "";
|
|
3131
|
+
}
|
|
3132
|
+
function brandLabelFromDomain(value) {
|
|
3133
|
+
if (value == null || value.trim() === "") return "";
|
|
3134
|
+
return getDomainWithoutSuffix2(value, DOMAIN_PARSE_OPTIONS)?.toLowerCase() ?? "";
|
|
3135
|
+
}
|
|
3136
|
+
function hostMatchesDomain(candidate, domain) {
|
|
3137
|
+
const candidateHost = hostOf(candidate);
|
|
3138
|
+
const domainHost = hostOf(domain);
|
|
3139
|
+
if (!candidateHost || !domainHost) return false;
|
|
3140
|
+
return candidateHost === domainHost || candidateHost.endsWith(`.${domainHost}`);
|
|
3141
|
+
}
|
|
3142
|
+
function hostMatchesAnyDomain(candidate, domains) {
|
|
3143
|
+
return domains.some((domain) => hostMatchesDomain(candidate, domain));
|
|
3144
|
+
}
|
|
3145
|
+
function extractDomainsFromText(text) {
|
|
3146
|
+
if (!text) return [];
|
|
3147
|
+
const domains = /* @__PURE__ */ new Set();
|
|
3148
|
+
for (const match of LINKIFY.match(text) ?? []) {
|
|
3149
|
+
if (match.schema === "mailto:") continue;
|
|
3150
|
+
const host = hostOf(match.url);
|
|
3151
|
+
if (!host || !registrableDomain(host)) continue;
|
|
3152
|
+
domains.add(host);
|
|
3153
|
+
}
|
|
3154
|
+
return [...domains];
|
|
3155
|
+
}
|
|
3156
|
+
function textContainsDomain(text, domain) {
|
|
3157
|
+
return extractDomainsFromText(text).some((candidate) => hostMatchesDomain(candidate, domain));
|
|
3158
|
+
}
|
|
3159
|
+
function normalizeUrlPath(input) {
|
|
3160
|
+
if (input == null) return null;
|
|
3161
|
+
let trimmed = input.trim();
|
|
3162
|
+
if (trimmed === "") return null;
|
|
3163
|
+
trimmed = trimmed.replace(/ /g, " ").replace(/\s+/g, " ").trim();
|
|
3164
|
+
if (trimmed === "" || trimmed === "/") return "/";
|
|
3165
|
+
if (trimmed === "(not set)") return null;
|
|
3166
|
+
trimmed = trimmed.replace(/([a-z0-9])[).]+$/i, "$1");
|
|
3167
|
+
if (trimmed.startsWith("/)") || trimmed.startsWith("/ ")) {
|
|
3168
|
+
trimmed = "/";
|
|
3169
|
+
}
|
|
3170
|
+
if (trimmed.includes(" ")) {
|
|
3171
|
+
trimmed = trimmed.split(" ")[0];
|
|
3172
|
+
}
|
|
3173
|
+
if (trimmed === "" || trimmed === "/") return "/";
|
|
3174
|
+
let pathPart;
|
|
3175
|
+
let queryPart;
|
|
3176
|
+
if (/^https?:\/\//i.test(trimmed)) {
|
|
3177
|
+
let url;
|
|
3178
|
+
try {
|
|
3179
|
+
url = new URL(trimmed);
|
|
3180
|
+
} catch {
|
|
3181
|
+
return null;
|
|
3182
|
+
}
|
|
3183
|
+
pathPart = url.pathname || "/";
|
|
3184
|
+
queryPart = url.search.startsWith("?") ? url.search.slice(1) : url.search;
|
|
3185
|
+
} else {
|
|
3186
|
+
let raw = trimmed;
|
|
3187
|
+
const hashIdx = raw.indexOf("#");
|
|
3188
|
+
if (hashIdx !== -1) raw = raw.slice(0, hashIdx);
|
|
3189
|
+
const qIdx = raw.indexOf("?");
|
|
3190
|
+
if (qIdx === -1) {
|
|
3191
|
+
pathPart = raw;
|
|
3192
|
+
queryPart = "";
|
|
3193
|
+
} else {
|
|
3194
|
+
pathPart = raw.slice(0, qIdx);
|
|
3195
|
+
queryPart = raw.slice(qIdx + 1);
|
|
3196
|
+
}
|
|
3197
|
+
}
|
|
3198
|
+
if (pathPart === "") pathPart = "/";
|
|
3199
|
+
pathPart = collapseRootIndex(pathPart);
|
|
3200
|
+
pathPart = dropTrailingSlash(pathPart);
|
|
3201
|
+
const pairs = parseQuery(queryPart).filter((p) => !shouldStrip(p.key));
|
|
3202
|
+
pairs.sort((a, b) => {
|
|
3203
|
+
if (a.key < b.key) return -1;
|
|
3204
|
+
if (a.key > b.key) return 1;
|
|
3205
|
+
return 0;
|
|
3206
|
+
});
|
|
3207
|
+
if (pairs.length === 0) return pathPart;
|
|
3208
|
+
return `${pathPart}?${encodeQuery(pairs)}`;
|
|
3209
|
+
}
|
|
3210
|
+
|
|
303
3211
|
// ../contracts/src/project.ts
|
|
304
3212
|
var configSourceSchema = z3.enum(["cli", "api", "config-file"]);
|
|
305
3213
|
function findDuplicateLocationLabels(locations) {
|
|
@@ -420,72 +3328,7 @@ var competitorBatchRequestSchema = z3.object({
|
|
|
420
3328
|
competitors: z3.array(z3.string().trim().min(1)).min(1)
|
|
421
3329
|
});
|
|
422
3330
|
function normalizeProjectDomain(input) {
|
|
423
|
-
|
|
424
|
-
try {
|
|
425
|
-
if (domain.includes("://")) {
|
|
426
|
-
domain = new URL(domain).hostname.toLowerCase();
|
|
427
|
-
}
|
|
428
|
-
} catch {
|
|
429
|
-
}
|
|
430
|
-
return domain.replace(/^www\./, "");
|
|
431
|
-
}
|
|
432
|
-
var MULTI_LABEL_PUBLIC_SUFFIXES = /* @__PURE__ */ new Set([
|
|
433
|
-
"ac.uk",
|
|
434
|
-
"co.id",
|
|
435
|
-
"co.il",
|
|
436
|
-
"co.in",
|
|
437
|
-
"co.jp",
|
|
438
|
-
"co.kr",
|
|
439
|
-
"co.nz",
|
|
440
|
-
"co.th",
|
|
441
|
-
"co.uk",
|
|
442
|
-
"co.za",
|
|
443
|
-
"com.au",
|
|
444
|
-
"com.br",
|
|
445
|
-
"com.cn",
|
|
446
|
-
"com.mx",
|
|
447
|
-
"com.ph",
|
|
448
|
-
"com.sg",
|
|
449
|
-
"com.tr",
|
|
450
|
-
"edu.au",
|
|
451
|
-
"edu.sg",
|
|
452
|
-
"gov.au",
|
|
453
|
-
"gov.uk",
|
|
454
|
-
"me.uk",
|
|
455
|
-
"ne.jp",
|
|
456
|
-
"net.au",
|
|
457
|
-
"net.br",
|
|
458
|
-
"net.cn",
|
|
459
|
-
"net.in",
|
|
460
|
-
"net.tr",
|
|
461
|
-
"or.jp",
|
|
462
|
-
"or.kr",
|
|
463
|
-
"org.au",
|
|
464
|
-
"org.br",
|
|
465
|
-
"org.in",
|
|
466
|
-
"org.nz",
|
|
467
|
-
"org.tr",
|
|
468
|
-
"org.uk",
|
|
469
|
-
"org.za"
|
|
470
|
-
]);
|
|
471
|
-
function registrableDomain(input) {
|
|
472
|
-
const normalized = normalizeProjectDomain(input);
|
|
473
|
-
if (!normalized) return "";
|
|
474
|
-
const hostname = normalized.split("/")[0]?.split(":")[0] ?? "";
|
|
475
|
-
if (!hostname) return "";
|
|
476
|
-
const labels = hostname.split(".").filter(Boolean);
|
|
477
|
-
if (labels.length < 2) return "";
|
|
478
|
-
if (labels.length === 2) return labels.join(".");
|
|
479
|
-
const lastTwo = labels.slice(-2).join(".");
|
|
480
|
-
if (MULTI_LABEL_PUBLIC_SUFFIXES.has(lastTwo)) {
|
|
481
|
-
return labels.length >= 3 ? labels.slice(-3).join(".") : "";
|
|
482
|
-
}
|
|
483
|
-
return labels.slice(-2).join(".");
|
|
484
|
-
}
|
|
485
|
-
function brandLabelFromDomain(input) {
|
|
486
|
-
const reg = registrableDomain(input);
|
|
487
|
-
if (!reg) return "";
|
|
488
|
-
return reg.split(".")[0] ?? "";
|
|
3331
|
+
return hostOf(input) ?? input.trim().toLowerCase().replace(/^www\./, "");
|
|
489
3332
|
}
|
|
490
3333
|
function effectiveDomains(project) {
|
|
491
3334
|
const all = [project.canonicalDomain, ...project.ownedDomains ?? []];
|
|
@@ -1493,10 +4336,13 @@ var gscSiteListResponseDtoSchema = z9.object({
|
|
|
1493
4336
|
var gscSitemapContentDtoSchema = z9.object({
|
|
1494
4337
|
type: z9.string(),
|
|
1495
4338
|
submitted: z9.string(),
|
|
1496
|
-
|
|
4339
|
+
// Google still returns this for existing sitemap reads, but it is not a
|
|
4340
|
+
// reliable submission outcome. Retained only for response compatibility.
|
|
4341
|
+
indexed: z9.string().optional().describe("Deprecated compatibility field.")
|
|
1497
4342
|
});
|
|
1498
4343
|
var gscSitemapDtoSchema = z9.object({
|
|
1499
4344
|
path: z9.string(),
|
|
4345
|
+
parentSitemapUrl: z9.string().optional(),
|
|
1500
4346
|
lastSubmitted: z9.string().optional(),
|
|
1501
4347
|
isPending: z9.boolean().optional(),
|
|
1502
4348
|
isSitemapsIndex: z9.boolean().optional(),
|
|
@@ -1507,7 +4353,50 @@ var gscSitemapDtoSchema = z9.object({
|
|
|
1507
4353
|
contents: z9.array(gscSitemapContentDtoSchema).optional()
|
|
1508
4354
|
});
|
|
1509
4355
|
var gscSitemapListResponseDtoSchema = z9.object({
|
|
1510
|
-
sitemaps: z9.array(gscSitemapDtoSchema).default([])
|
|
4356
|
+
sitemaps: z9.array(gscSitemapDtoSchema).default([]),
|
|
4357
|
+
summary: z9.object({
|
|
4358
|
+
total: z9.number().int().nonnegative(),
|
|
4359
|
+
indexes: z9.number().int().nonnegative(),
|
|
4360
|
+
files: z9.number().int().nonnegative()
|
|
4361
|
+
}),
|
|
4362
|
+
preferredSubmissionUrls: z9.array(z9.string()).default([])
|
|
4363
|
+
});
|
|
4364
|
+
var gscSubmitSitemapsRequestDtoSchema = z9.object({
|
|
4365
|
+
sitemapUrls: z9.array(
|
|
4366
|
+
z9.string().url().refine(
|
|
4367
|
+
(value) => {
|
|
4368
|
+
const protocol = new URL(value).protocol;
|
|
4369
|
+
return protocol === "http:" || protocol === "https:";
|
|
4370
|
+
},
|
|
4371
|
+
{ message: "Sitemap URL must use http or https." }
|
|
4372
|
+
)
|
|
4373
|
+
).min(1).max(50)
|
|
4374
|
+
});
|
|
4375
|
+
var gscSubmitSitemapResultDtoSchema = z9.object({
|
|
4376
|
+
sitemapUrl: z9.string(),
|
|
4377
|
+
status: z9.enum(["accepted", "error"]),
|
|
4378
|
+
submittedAt: z9.string().optional(),
|
|
4379
|
+
error: z9.string().optional()
|
|
4380
|
+
});
|
|
4381
|
+
var gscSubmitSitemapsResponseDtoSchema = z9.object({
|
|
4382
|
+
summary: z9.object({
|
|
4383
|
+
total: z9.number().int().nonnegative(),
|
|
4384
|
+
accepted: z9.number().int().nonnegative(),
|
|
4385
|
+
failed: z9.number().int().nonnegative()
|
|
4386
|
+
}),
|
|
4387
|
+
results: z9.array(gscSubmitSitemapResultDtoSchema)
|
|
4388
|
+
});
|
|
4389
|
+
var gscDiscoverSitemapsResponseDtoSchema = z9.object({
|
|
4390
|
+
sitemaps: z9.array(gscSitemapDtoSchema),
|
|
4391
|
+
primarySitemapUrl: z9.string(),
|
|
4392
|
+
run: z9.object({
|
|
4393
|
+
id: z9.string(),
|
|
4394
|
+
projectId: z9.string(),
|
|
4395
|
+
kind: z9.string(),
|
|
4396
|
+
status: z9.string(),
|
|
4397
|
+
trigger: z9.string(),
|
|
4398
|
+
createdAt: z9.string()
|
|
4399
|
+
}).nullable()
|
|
1511
4400
|
});
|
|
1512
4401
|
|
|
1513
4402
|
// ../contracts/src/gbp.ts
|
|
@@ -2529,16 +5418,10 @@ var CATEGORY_LABELS = {
|
|
|
2529
5418
|
other: "Independent sites"
|
|
2530
5419
|
};
|
|
2531
5420
|
function categorizeSource(uri) {
|
|
2532
|
-
|
|
2533
|
-
try {
|
|
2534
|
-
const url = new URL(uri.startsWith("http") ? uri : `https://${uri}`);
|
|
2535
|
-
domain = url.hostname.replace(/^www\./, "");
|
|
2536
|
-
} catch {
|
|
2537
|
-
domain = uri.replace(/^https?:\/\//, "").replace(/^www\./, "").split("/")[0] ?? uri;
|
|
2538
|
-
}
|
|
5421
|
+
const domain = hostOf(uri) ?? uri.trim().toLowerCase();
|
|
2539
5422
|
const domainLower = domain.toLowerCase();
|
|
2540
5423
|
for (const rule of SOURCE_CATEGORY_RULES) {
|
|
2541
|
-
if (
|
|
5424
|
+
if (!rule.pattern.startsWith(".") && hostMatchesDomain(domainLower, rule.pattern) || rule.pattern.startsWith(".") && domainLower.endsWith(rule.pattern)) {
|
|
2542
5425
|
return { category: rule.category, label: rule.label, domain };
|
|
2543
5426
|
}
|
|
2544
5427
|
}
|
|
@@ -2561,6 +5444,89 @@ import { z as z20 } from "zod";
|
|
|
2561
5444
|
// ../contracts/src/discovery.ts
|
|
2562
5445
|
import { z as z19 } from "zod";
|
|
2563
5446
|
|
|
5447
|
+
// ../contracts/src/brand-matching.ts
|
|
5448
|
+
var WORD_SEGMENTER = new Intl.Segmenter("en", { granularity: "word" });
|
|
5449
|
+
var NON_WORD = /[^\p{L}\p{N}]+/gu;
|
|
5450
|
+
var WORD_RUNS = /[\p{L}\p{N}]+/gu;
|
|
5451
|
+
function normalizeForMatch(value) {
|
|
5452
|
+
return value.normalize("NFKC").toLocaleLowerCase("en");
|
|
5453
|
+
}
|
|
5454
|
+
function wordsOfNormalized(normalized) {
|
|
5455
|
+
const words = [];
|
|
5456
|
+
for (const segment of WORD_SEGMENTER.segment(normalized)) {
|
|
5457
|
+
if (!segment.isWordLike) continue;
|
|
5458
|
+
for (const word of segment.segment.match(WORD_RUNS) ?? []) words.push(word);
|
|
5459
|
+
}
|
|
5460
|
+
return words;
|
|
5461
|
+
}
|
|
5462
|
+
function brandWords(value) {
|
|
5463
|
+
return wordsOfNormalized(normalizeForMatch(value));
|
|
5464
|
+
}
|
|
5465
|
+
function brandKeyFromText(value) {
|
|
5466
|
+
return brandWords(value).join("");
|
|
5467
|
+
}
|
|
5468
|
+
function compileBrandAliases(aliases) {
|
|
5469
|
+
const keys = /* @__PURE__ */ new Set();
|
|
5470
|
+
let longest = 0;
|
|
5471
|
+
for (const alias of aliases) {
|
|
5472
|
+
if (!alias) continue;
|
|
5473
|
+
const key = brandKeyFromText(alias);
|
|
5474
|
+
if (!key) continue;
|
|
5475
|
+
keys.add(key);
|
|
5476
|
+
if (key.length > longest) longest = key.length;
|
|
5477
|
+
}
|
|
5478
|
+
return { keys, longest };
|
|
5479
|
+
}
|
|
5480
|
+
function matcherMatchesText(matcher, text) {
|
|
5481
|
+
if (!text || matcher.keys.size === 0) return false;
|
|
5482
|
+
const normalized = normalizeForMatch(text);
|
|
5483
|
+
const stripped = normalized.replace(NON_WORD, "");
|
|
5484
|
+
let possible = false;
|
|
5485
|
+
for (const key of matcher.keys) {
|
|
5486
|
+
if (stripped.includes(key)) {
|
|
5487
|
+
possible = true;
|
|
5488
|
+
break;
|
|
5489
|
+
}
|
|
5490
|
+
}
|
|
5491
|
+
if (!possible) return false;
|
|
5492
|
+
const words = wordsOfNormalized(normalized);
|
|
5493
|
+
for (let start = 0; start < words.length; start++) {
|
|
5494
|
+
let candidate = "";
|
|
5495
|
+
for (let end = start; end < words.length; end++) {
|
|
5496
|
+
candidate += words[end];
|
|
5497
|
+
if (matcher.keys.has(candidate)) return true;
|
|
5498
|
+
if (candidate.length >= matcher.longest) break;
|
|
5499
|
+
}
|
|
5500
|
+
}
|
|
5501
|
+
return false;
|
|
5502
|
+
}
|
|
5503
|
+
function matchedAliasKeys(matcher, text) {
|
|
5504
|
+
const found = /* @__PURE__ */ new Set();
|
|
5505
|
+
if (!text || matcher.keys.size === 0) return found;
|
|
5506
|
+
const normalized = normalizeForMatch(text);
|
|
5507
|
+
const stripped = normalized.replace(NON_WORD, "");
|
|
5508
|
+
const reachable = [...matcher.keys].filter((key) => stripped.includes(key));
|
|
5509
|
+
if (reachable.length === 0) return found;
|
|
5510
|
+
const words = wordsOfNormalized(normalized);
|
|
5511
|
+
for (let start = 0; start < words.length; start++) {
|
|
5512
|
+
let candidate = "";
|
|
5513
|
+
for (let end = start; end < words.length; end++) {
|
|
5514
|
+
candidate += words[end];
|
|
5515
|
+
if (matcher.keys.has(candidate)) found.add(candidate);
|
|
5516
|
+
if (candidate.length >= matcher.longest) break;
|
|
5517
|
+
}
|
|
5518
|
+
if (found.size === matcher.keys.size) break;
|
|
5519
|
+
}
|
|
5520
|
+
return found;
|
|
5521
|
+
}
|
|
5522
|
+
function textContainsBrandAlias(text, alias) {
|
|
5523
|
+
if (!alias) return false;
|
|
5524
|
+
return matcherMatchesText(compileBrandAliases([alias]), text);
|
|
5525
|
+
}
|
|
5526
|
+
function textContainsAnyBrandAlias(text, aliases) {
|
|
5527
|
+
return matcherMatchesText(compileBrandAliases(aliases), text);
|
|
5528
|
+
}
|
|
5529
|
+
|
|
2564
5530
|
// ../contracts/src/embeddings.ts
|
|
2565
5531
|
function cosineSimilarity(a, b) {
|
|
2566
5532
|
if (a.length === 0 || b.length === 0) {
|
|
@@ -2658,139 +5624,6 @@ function computeDedupSimilarityStats(vectors, indexClusters) {
|
|
|
2658
5624
|
return { perClusterMinSimilarity, bandPairFraction: round2(inBand / pairsTotal), pairsTotal };
|
|
2659
5625
|
}
|
|
2660
5626
|
|
|
2661
|
-
// ../contracts/src/url-normalize.ts
|
|
2662
|
-
var STRIP_KEYS = /* @__PURE__ */ new Set([
|
|
2663
|
-
// Click identifiers
|
|
2664
|
-
"fbclid",
|
|
2665
|
-
"gclid",
|
|
2666
|
-
"msclkid",
|
|
2667
|
-
"ttclid",
|
|
2668
|
-
"li_fat_id",
|
|
2669
|
-
"igshid",
|
|
2670
|
-
"yclid",
|
|
2671
|
-
"dclid",
|
|
2672
|
-
"gbraid",
|
|
2673
|
-
"wbraid",
|
|
2674
|
-
"bingid",
|
|
2675
|
-
// Mailchimp
|
|
2676
|
-
"mc_cid",
|
|
2677
|
-
"mc_eid",
|
|
2678
|
-
// Google Analytics linkers
|
|
2679
|
-
"_ga",
|
|
2680
|
-
"_gl",
|
|
2681
|
-
// Google Tag Manager debug
|
|
2682
|
-
"gtm_latency",
|
|
2683
|
-
"gtm_debug",
|
|
2684
|
-
// WordPress internal noise
|
|
2685
|
-
"preview",
|
|
2686
|
-
"preview_id",
|
|
2687
|
-
"preview_nonce",
|
|
2688
|
-
"_thumbnail_id",
|
|
2689
|
-
// Common cache-busters/versioning
|
|
2690
|
-
"v",
|
|
2691
|
-
"ver",
|
|
2692
|
-
"version"
|
|
2693
|
-
]);
|
|
2694
|
-
function shouldStrip(key) {
|
|
2695
|
-
if (STRIP_KEYS.has(key)) return true;
|
|
2696
|
-
if (key.startsWith("utm_")) return true;
|
|
2697
|
-
return false;
|
|
2698
|
-
}
|
|
2699
|
-
function parseQuery(query) {
|
|
2700
|
-
if (query === "") return [];
|
|
2701
|
-
return query.split("&").map((pair) => {
|
|
2702
|
-
const eq = pair.indexOf("=");
|
|
2703
|
-
if (eq === -1) return { key: pair, value: null };
|
|
2704
|
-
return { key: pair.slice(0, eq), value: pair.slice(eq + 1) };
|
|
2705
|
-
});
|
|
2706
|
-
}
|
|
2707
|
-
function encodeQuery(pairs) {
|
|
2708
|
-
return pairs.map((p) => p.value === null ? p.key : `${p.key}=${p.value}`).join("&");
|
|
2709
|
-
}
|
|
2710
|
-
function collapseRootIndex(path) {
|
|
2711
|
-
if (path === "/index.html" || path === "/index.php") return "/";
|
|
2712
|
-
return path;
|
|
2713
|
-
}
|
|
2714
|
-
function dropTrailingSlash(path) {
|
|
2715
|
-
if (path.length > 1 && path.endsWith("/")) {
|
|
2716
|
-
return path.replace(/\/+$/, "");
|
|
2717
|
-
}
|
|
2718
|
-
return path;
|
|
2719
|
-
}
|
|
2720
|
-
function absolutizeProjectUrl(url, canonicalDomain) {
|
|
2721
|
-
if (!url) return "";
|
|
2722
|
-
const trimmed = url.trim();
|
|
2723
|
-
if (!trimmed) return "";
|
|
2724
|
-
if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
|
2725
|
-
if (trimmed.startsWith("//")) return `https:${trimmed}`;
|
|
2726
|
-
const host = canonicalDomain.trim().replace(/^https?:\/\//i, "").replace(/\/+$/, "");
|
|
2727
|
-
if (!host) return trimmed;
|
|
2728
|
-
if (trimmed.startsWith("/")) return `https://${host}${trimmed}`;
|
|
2729
|
-
return `https://${host}/${trimmed}`;
|
|
2730
|
-
}
|
|
2731
|
-
function hostOf(value) {
|
|
2732
|
-
if (value == null) return null;
|
|
2733
|
-
const trimmed = value.trim();
|
|
2734
|
-
if (!trimmed) return null;
|
|
2735
|
-
try {
|
|
2736
|
-
const url = trimmed.includes("://") ? new URL(trimmed) : new URL(`https://${trimmed}`);
|
|
2737
|
-
return url.hostname.replace(/^www\./, "").toLowerCase();
|
|
2738
|
-
} catch {
|
|
2739
|
-
return null;
|
|
2740
|
-
}
|
|
2741
|
-
}
|
|
2742
|
-
function normalizeUrlPath(input) {
|
|
2743
|
-
if (input == null) return null;
|
|
2744
|
-
let trimmed = input.trim();
|
|
2745
|
-
if (trimmed === "") return null;
|
|
2746
|
-
trimmed = trimmed.replace(/ /g, " ").replace(/\s+/g, " ").trim();
|
|
2747
|
-
if (trimmed === "" || trimmed === "/") return "/";
|
|
2748
|
-
if (trimmed === "(not set)") return null;
|
|
2749
|
-
trimmed = trimmed.replace(/([a-z0-9])[).]+$/i, "$1");
|
|
2750
|
-
if (trimmed.startsWith("/)") || trimmed.startsWith("/ ")) {
|
|
2751
|
-
trimmed = "/";
|
|
2752
|
-
}
|
|
2753
|
-
if (trimmed.includes(" ")) {
|
|
2754
|
-
trimmed = trimmed.split(" ")[0];
|
|
2755
|
-
}
|
|
2756
|
-
if (trimmed === "" || trimmed === "/") return "/";
|
|
2757
|
-
let pathPart;
|
|
2758
|
-
let queryPart;
|
|
2759
|
-
if (/^https?:\/\//i.test(trimmed)) {
|
|
2760
|
-
let url;
|
|
2761
|
-
try {
|
|
2762
|
-
url = new URL(trimmed);
|
|
2763
|
-
} catch {
|
|
2764
|
-
return null;
|
|
2765
|
-
}
|
|
2766
|
-
pathPart = url.pathname || "/";
|
|
2767
|
-
queryPart = url.search.startsWith("?") ? url.search.slice(1) : url.search;
|
|
2768
|
-
} else {
|
|
2769
|
-
let raw = trimmed;
|
|
2770
|
-
const hashIdx = raw.indexOf("#");
|
|
2771
|
-
if (hashIdx !== -1) raw = raw.slice(0, hashIdx);
|
|
2772
|
-
const qIdx = raw.indexOf("?");
|
|
2773
|
-
if (qIdx === -1) {
|
|
2774
|
-
pathPart = raw;
|
|
2775
|
-
queryPart = "";
|
|
2776
|
-
} else {
|
|
2777
|
-
pathPart = raw.slice(0, qIdx);
|
|
2778
|
-
queryPart = raw.slice(qIdx + 1);
|
|
2779
|
-
}
|
|
2780
|
-
}
|
|
2781
|
-
if (pathPart === "") pathPart = "/";
|
|
2782
|
-
pathPart = collapseRootIndex(pathPart);
|
|
2783
|
-
pathPart = dropTrailingSlash(pathPart);
|
|
2784
|
-
const pairs = parseQuery(queryPart).filter((p) => !shouldStrip(p.key));
|
|
2785
|
-
pairs.sort((a, b) => {
|
|
2786
|
-
if (a.key < b.key) return -1;
|
|
2787
|
-
if (a.key > b.key) return 1;
|
|
2788
|
-
return 0;
|
|
2789
|
-
});
|
|
2790
|
-
if (pairs.length === 0) return pathPart;
|
|
2791
|
-
return `${pathPart}?${encodeQuery(pairs)}`;
|
|
2792
|
-
}
|
|
2793
|
-
|
|
2794
5627
|
// ../contracts/src/discovery.ts
|
|
2795
5628
|
var discoveryBucketSchema = z19.enum(["cited", "aspirational", "wasted-surface"]);
|
|
2796
5629
|
var DiscoveryBuckets = discoveryBucketSchema.enum;
|
|
@@ -2919,48 +5752,20 @@ function seedCollapseWarning(input) {
|
|
|
2919
5752
|
return `Seed dedup collapsed ${seedCountRaw} raw candidates into ${canonicalCount} canonical ${noun} at threshold ${dedupThreshold}. Distinct intents were likely merged into one cluster; re-run with a higher --dedup-threshold.`;
|
|
2920
5753
|
}
|
|
2921
5754
|
function filterBrandedSeedCandidates(input) {
|
|
2922
|
-
const
|
|
2923
|
-
|
|
5755
|
+
const brandAliases = input.brandNames.filter((name) => brandKeyFromText(name).length >= 3);
|
|
5756
|
+
const domains = input.canonicalDomains.filter((domain) => hostOf(domain) !== null);
|
|
5757
|
+
if (brandAliases.length === 0 && domains.length === 0) {
|
|
5758
|
+
return { kept: [...input.candidates], droppedBranded: [] };
|
|
5759
|
+
}
|
|
2924
5760
|
const kept = [];
|
|
2925
5761
|
const droppedBranded = [];
|
|
2926
5762
|
for (const candidate of input.candidates) {
|
|
2927
|
-
const
|
|
2928
|
-
if (
|
|
5763
|
+
const branded = textContainsAnyBrandAlias(candidate, brandAliases) || domains.some((domain) => textContainsDomain(candidate, domain));
|
|
5764
|
+
if (branded) droppedBranded.push(candidate);
|
|
2929
5765
|
else kept.push(candidate);
|
|
2930
5766
|
}
|
|
2931
5767
|
return { kept, droppedBranded };
|
|
2932
5768
|
}
|
|
2933
|
-
function normalizeForBrandMatch(text) {
|
|
2934
|
-
return text.toLowerCase().replace(/\s+/g, " ").trim();
|
|
2935
|
-
}
|
|
2936
|
-
function brandMatchTokens(brandNames, canonicalDomains) {
|
|
2937
|
-
const tokens = /* @__PURE__ */ new Set();
|
|
2938
|
-
for (const name of brandNames) {
|
|
2939
|
-
const normalized = normalizeForBrandMatch(name);
|
|
2940
|
-
if (normalized.length < 3) continue;
|
|
2941
|
-
tokens.add(normalized);
|
|
2942
|
-
const squashed = normalized.replace(/[^a-z0-9]/g, "");
|
|
2943
|
-
if (squashed.length >= 4 && squashed !== normalized) tokens.add(squashed);
|
|
2944
|
-
}
|
|
2945
|
-
for (const domain of canonicalDomains) {
|
|
2946
|
-
const host = hostOf(domain) ?? normalizeForBrandMatch(domain).replace(/^www\./, "");
|
|
2947
|
-
if (!host) continue;
|
|
2948
|
-
tokens.add(host);
|
|
2949
|
-
tokens.add(`www.${host}`);
|
|
2950
|
-
}
|
|
2951
|
-
return [...tokens];
|
|
2952
|
-
}
|
|
2953
|
-
function containsWholeToken(normalized, token) {
|
|
2954
|
-
let index = normalized.indexOf(token);
|
|
2955
|
-
while (index !== -1) {
|
|
2956
|
-
const before = index === 0 ? " " : normalized[index - 1];
|
|
2957
|
-
const afterIndex = index + token.length;
|
|
2958
|
-
const after = afterIndex >= normalized.length ? " " : normalized[afterIndex];
|
|
2959
|
-
if (!/[a-z0-9]/.test(before) && !/[a-z0-9]/.test(after)) return true;
|
|
2960
|
-
index = normalized.indexOf(token, index + 1);
|
|
2961
|
-
}
|
|
2962
|
-
return false;
|
|
2963
|
-
}
|
|
2964
5769
|
var DISCOVERY_SEED_PROVIDERS = ["gemini", "openai"];
|
|
2965
5770
|
var discoverySeedProviderSchema = z19.enum(DISCOVERY_SEED_PROVIDERS);
|
|
2966
5771
|
var discoveryRunRequestSchema = z19.object({
|
|
@@ -3164,9 +5969,8 @@ function buildHarvestAnchorTerms(corpus, domains = []) {
|
|
|
3164
5969
|
for (const token of significantHarvestTokens(text)) set.add(token);
|
|
3165
5970
|
}
|
|
3166
5971
|
for (const domain of domains) {
|
|
3167
|
-
const
|
|
3168
|
-
if (!
|
|
3169
|
-
const label = host.replace(/\.[a-z0-9]+$/, "");
|
|
5972
|
+
const label = brandLabelFromDomain(domain);
|
|
5973
|
+
if (!label) continue;
|
|
3170
5974
|
for (const token of significantHarvestTokens(label)) set.add(token);
|
|
3171
5975
|
}
|
|
3172
5976
|
return [...set];
|
|
@@ -3290,19 +6094,10 @@ function surfaceClassFromCompetitorType(type) {
|
|
|
3290
6094
|
return void 0;
|
|
3291
6095
|
}
|
|
3292
6096
|
}
|
|
3293
|
-
function matchesAnyDomain(candidate, domains) {
|
|
3294
|
-
if (!candidate) return false;
|
|
3295
|
-
for (const domain of domains) {
|
|
3296
|
-
const normalized = normalizeProjectDomain(domain);
|
|
3297
|
-
if (!normalized) continue;
|
|
3298
|
-
if (candidate === normalized || candidate.endsWith(`.${normalized}`)) return true;
|
|
3299
|
-
}
|
|
3300
|
-
return false;
|
|
3301
|
-
}
|
|
3302
6097
|
function classifySurfaceFromCategory(domain, category, context, storedClass) {
|
|
3303
6098
|
const candidate = normalizeProjectDomain(domain);
|
|
3304
|
-
if (
|
|
3305
|
-
if (
|
|
6099
|
+
if (hostMatchesAnyDomain(candidate, context.projectDomains)) return SurfaceClasses.own;
|
|
6100
|
+
if (hostMatchesAnyDomain(candidate, context.competitorDomains)) return SurfaceClasses["direct-competitor"];
|
|
3306
6101
|
if (storedClass) return storedClass;
|
|
3307
6102
|
switch (category) {
|
|
3308
6103
|
case "directory":
|
|
@@ -4214,87 +7009,47 @@ var ga4SessionHistoryEntrySchema = z25.object({
|
|
|
4214
7009
|
});
|
|
4215
7010
|
|
|
4216
7011
|
// ../contracts/src/answer-visibility.ts
|
|
4217
|
-
var
|
|
4218
|
-
"agency",
|
|
4219
|
-
"app",
|
|
4220
|
-
"company",
|
|
4221
|
-
"corp",
|
|
4222
|
-
"group",
|
|
4223
|
-
"health",
|
|
4224
|
-
"inc",
|
|
4225
|
-
"llc",
|
|
4226
|
-
"online",
|
|
4227
|
-
"platform",
|
|
4228
|
-
"services",
|
|
4229
|
-
"site",
|
|
4230
|
-
"solutions",
|
|
4231
|
-
"software",
|
|
4232
|
-
"systems",
|
|
4233
|
-
"tech"
|
|
4234
|
-
]);
|
|
4235
|
-
var MIN_BRAND_KEY_LENGTH = 6;
|
|
4236
|
-
var BUSINESS_SUFFIXES = [
|
|
4237
|
-
"incorporated",
|
|
4238
|
-
"corporation",
|
|
4239
|
-
"limited",
|
|
4240
|
-
"company",
|
|
4241
|
-
"gmbh",
|
|
4242
|
-
"pllc",
|
|
4243
|
-
"corp",
|
|
4244
|
-
"group",
|
|
4245
|
-
"llp",
|
|
4246
|
-
"plc",
|
|
4247
|
-
"llc",
|
|
4248
|
-
"inc",
|
|
4249
|
-
"ltd"
|
|
4250
|
-
];
|
|
7012
|
+
var MIN_DOMAIN_BRAND_KEY_LENGTH = 4;
|
|
4251
7013
|
function extractAnswerMentions(answerText, brandNames, domains) {
|
|
4252
7014
|
if (!answerText) return { mentioned: false, matchedTerms: [] };
|
|
4253
7015
|
const matchedTerms = [];
|
|
4254
|
-
const
|
|
7016
|
+
const matchedDomainTerms = /* @__PURE__ */ new Set();
|
|
7017
|
+
const answerDomains = extractDomainsFromText(answerText);
|
|
4255
7018
|
for (const domain of domains) {
|
|
4256
|
-
const normalizedDomain =
|
|
7019
|
+
const normalizedDomain = hostOf(domain);
|
|
4257
7020
|
if (!normalizedDomain || !normalizedDomain.includes(".")) continue;
|
|
4258
|
-
if (
|
|
7021
|
+
if (answerDomains.some((candidate) => hostMatchesDomain(candidate, normalizedDomain))) {
|
|
4259
7022
|
matchedTerms.push(normalizedDomain);
|
|
7023
|
+
matchedDomainTerms.add(normalizedDomain);
|
|
4260
7024
|
}
|
|
4261
7025
|
}
|
|
4262
|
-
const
|
|
4263
|
-
const answerBrandKey = brandKeyFromText(answerText);
|
|
7026
|
+
const candidates = [];
|
|
4264
7027
|
for (const brandName of brandNames) {
|
|
4265
7028
|
if (!brandName || !brandName.trim()) continue;
|
|
4266
|
-
const
|
|
4267
|
-
|
|
4268
|
-
const matchesNormalized = normalizedCandidates.some(
|
|
4269
|
-
(c) => new RegExp(`\\b${escapeRegExp(c)}\\b`).test(answerNormalized)
|
|
4270
|
-
);
|
|
4271
|
-
const matchesBrandKey = brandKeyCandidates.some(
|
|
4272
|
-
(c) => c.length >= MIN_BRAND_KEY_LENGTH && answerBrandKey.includes(c)
|
|
4273
|
-
);
|
|
4274
|
-
if (matchesNormalized || matchesBrandKey) {
|
|
4275
|
-
matchedTerms.push(brandName);
|
|
4276
|
-
}
|
|
7029
|
+
const key = brandKeyFromText(brandName);
|
|
7030
|
+
if (key) candidates.push({ term: brandName, key });
|
|
4277
7031
|
}
|
|
4278
|
-
const
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
const matchedPrimary = [];
|
|
4283
|
-
for (const token of allTokens) {
|
|
4284
|
-
if (new RegExp(`\\b${escapeRegExp(token)}\\b`).test(lowerAnswer)) {
|
|
4285
|
-
tokenMatches++;
|
|
4286
|
-
if (!secondarySet.has(token)) matchedPrimary.push(token);
|
|
4287
|
-
}
|
|
7032
|
+
for (const domain of domains) {
|
|
7033
|
+
const brand = brandLabelFromDomain(domain);
|
|
7034
|
+
const key = brandKeyFromText(brand);
|
|
7035
|
+
if (key.length >= MIN_DOMAIN_BRAND_KEY_LENGTH) candidates.push({ term: brand, key });
|
|
4288
7036
|
}
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
7037
|
+
if (candidates.length > 0) {
|
|
7038
|
+
const hits = matchedAliasKeys(
|
|
7039
|
+
compileBrandAliases(candidates.map((c) => c.term)),
|
|
7040
|
+
answerText
|
|
7041
|
+
);
|
|
7042
|
+
for (const candidate of candidates) {
|
|
7043
|
+
if (hits.has(candidate.key)) matchedTerms.push(candidate.term);
|
|
7044
|
+
}
|
|
4292
7045
|
}
|
|
4293
7046
|
const unique = [...new Set(matchedTerms)];
|
|
4294
|
-
const
|
|
7047
|
+
const domainBrandKeys = new Set(
|
|
7048
|
+
[...matchedDomainTerms].map((domain) => brandKeyFromText(brandLabelFromDomain(domain))).filter(Boolean)
|
|
7049
|
+
);
|
|
4295
7050
|
const dedupedFinal = unique.filter((term) => {
|
|
4296
|
-
if (
|
|
4297
|
-
return !
|
|
7051
|
+
if (matchedDomainTerms.has(term)) return true;
|
|
7052
|
+
return !domainBrandKeys.has(brandKeyFromText(term));
|
|
4298
7053
|
});
|
|
4299
7054
|
return { mentioned: dedupedFinal.length > 0, matchedTerms: dedupedFinal };
|
|
4300
7055
|
}
|
|
@@ -4307,75 +7062,6 @@ function visibilityStateFromAnswerMentioned(answerMentioned) {
|
|
|
4307
7062
|
function mentionStateFromAnswerMentioned(answerMentioned) {
|
|
4308
7063
|
return answerMentioned ? "mentioned" : "not-mentioned";
|
|
4309
7064
|
}
|
|
4310
|
-
function brandKeyFromText(value) {
|
|
4311
|
-
return value.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
4312
|
-
}
|
|
4313
|
-
function domainMentioned(lowerAnswer, normalizedDomain) {
|
|
4314
|
-
const escapedDomain = escapeRegExp(normalizedDomain.toLowerCase());
|
|
4315
|
-
const patterns = [
|
|
4316
|
-
new RegExp(`(^|[^a-z0-9-])${escapedDomain}($|[^a-z0-9-])`),
|
|
4317
|
-
new RegExp(`https?://(?:www\\.)?${escapedDomain}(?:[/:?#]|$)`),
|
|
4318
|
-
new RegExp(`www\\.${escapedDomain}(?:[/:?#]|$)`)
|
|
4319
|
-
];
|
|
4320
|
-
return patterns.some((pattern) => pattern.test(lowerAnswer));
|
|
4321
|
-
}
|
|
4322
|
-
function collectBrandTokens(brandNames, domains) {
|
|
4323
|
-
const primary = /* @__PURE__ */ new Set();
|
|
4324
|
-
const secondary = /* @__PURE__ */ new Set();
|
|
4325
|
-
for (const brandName of brandNames) {
|
|
4326
|
-
if (!brandName || !brandName.trim()) continue;
|
|
4327
|
-
const distinctiveWords = extractDistinctiveTokens(brandName);
|
|
4328
|
-
if (distinctiveWords.length > 0) {
|
|
4329
|
-
primary.add(distinctiveWords[0]);
|
|
4330
|
-
for (let i = 1; i < distinctiveWords.length; i++) {
|
|
4331
|
-
secondary.add(distinctiveWords[i]);
|
|
4332
|
-
}
|
|
4333
|
-
}
|
|
4334
|
-
}
|
|
4335
|
-
for (const domain of domains) {
|
|
4336
|
-
const reg = registrableDomain(domain);
|
|
4337
|
-
const brand = reg ? brandLabelFromDomain(reg) : normalizeProjectDomain(domain).split("/")[0]?.split(".")[0] ?? "";
|
|
4338
|
-
const token = brand.replace(/[^a-z0-9]/gi, "").toLowerCase();
|
|
4339
|
-
if (isDistinctiveToken(token)) primary.add(token);
|
|
4340
|
-
}
|
|
4341
|
-
for (const t of primary) secondary.delete(t);
|
|
4342
|
-
return { primary: [...primary], secondary: [...secondary] };
|
|
4343
|
-
}
|
|
4344
|
-
function extractDistinctiveTokens(value) {
|
|
4345
|
-
return normalizeText(value).split(" ").filter(isDistinctiveToken);
|
|
4346
|
-
}
|
|
4347
|
-
function isDistinctiveToken(token) {
|
|
4348
|
-
if (token.length < 4) return false;
|
|
4349
|
-
return !GENERIC_TOKENS.has(token);
|
|
4350
|
-
}
|
|
4351
|
-
function normalizeText(value) {
|
|
4352
|
-
return value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
4353
|
-
}
|
|
4354
|
-
function brandNormalizedCandidates(displayName) {
|
|
4355
|
-
const original = normalizeText(displayName);
|
|
4356
|
-
if (!original) return [];
|
|
4357
|
-
const stripped = stripBusinessSuffix(original, " ");
|
|
4358
|
-
if (!stripped || stripped === original) return [original];
|
|
4359
|
-
return [original, stripped];
|
|
4360
|
-
}
|
|
4361
|
-
function brandKeyCandidatesForMatch(displayName) {
|
|
4362
|
-
const original = brandKeyFromText(displayName);
|
|
4363
|
-
if (!original) return [];
|
|
4364
|
-
const stripped = stripBusinessSuffix(original, "");
|
|
4365
|
-
return stripped && stripped !== original ? [original, stripped] : [original];
|
|
4366
|
-
}
|
|
4367
|
-
function stripBusinessSuffix(value, separator) {
|
|
4368
|
-
for (const suffix of BUSINESS_SUFFIXES) {
|
|
4369
|
-
const trailing = `${separator}${suffix}`;
|
|
4370
|
-
if (value.endsWith(trailing) && value.length - trailing.length >= 3) {
|
|
4371
|
-
return value.slice(0, -trailing.length);
|
|
4372
|
-
}
|
|
4373
|
-
}
|
|
4374
|
-
return value;
|
|
4375
|
-
}
|
|
4376
|
-
function escapeRegExp(value) {
|
|
4377
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4378
|
-
}
|
|
4379
7065
|
|
|
4380
7066
|
// ../contracts/src/intelligence.ts
|
|
4381
7067
|
import { z as z26 } from "zod";
|
|
@@ -7833,6 +10519,14 @@ export {
|
|
|
7833
10519
|
gaMeasurementAnalysisWindowSchema,
|
|
7834
10520
|
gaMeasurementHostScopeSchema,
|
|
7835
10521
|
gaMeasurementAnalysisDtoSchema,
|
|
10522
|
+
absolutizeProjectUrl,
|
|
10523
|
+
hostOf,
|
|
10524
|
+
registrableDomain,
|
|
10525
|
+
brandLabelFromDomain,
|
|
10526
|
+
hostMatchesDomain,
|
|
10527
|
+
hostMatchesAnyDomain,
|
|
10528
|
+
textContainsDomain,
|
|
10529
|
+
normalizeUrlPath,
|
|
7836
10530
|
findDuplicateLocationLabels,
|
|
7837
10531
|
hasLocationLabel,
|
|
7838
10532
|
orderLocationsDefaultFirst,
|
|
@@ -7848,8 +10542,6 @@ export {
|
|
|
7848
10542
|
competitorDtoSchema,
|
|
7849
10543
|
competitorBatchRequestSchema,
|
|
7850
10544
|
normalizeProjectDomain,
|
|
7851
|
-
registrableDomain,
|
|
7852
|
-
brandLabelFromDomain,
|
|
7853
10545
|
effectiveDomains,
|
|
7854
10546
|
normalizeProjectAliases,
|
|
7855
10547
|
effectiveBrandNames,
|
|
@@ -7882,6 +10574,9 @@ export {
|
|
|
7882
10574
|
gscCoverageSnapshotDtoSchema,
|
|
7883
10575
|
gscSiteListResponseDtoSchema,
|
|
7884
10576
|
gscSitemapListResponseDtoSchema,
|
|
10577
|
+
gscSubmitSitemapsRequestDtoSchema,
|
|
10578
|
+
gscSubmitSitemapsResponseDtoSchema,
|
|
10579
|
+
gscDiscoverSitemapsResponseDtoSchema,
|
|
7885
10580
|
gbpAccountListResponseSchema,
|
|
7886
10581
|
gbpLocationDtoSchema,
|
|
7887
10582
|
gbpLocationListResponseSchema,
|
|
@@ -7963,13 +10658,13 @@ export {
|
|
|
7963
10658
|
categorizeSource,
|
|
7964
10659
|
categorizeSourceWithCompetitors,
|
|
7965
10660
|
categoryLabel,
|
|
10661
|
+
brandKeyFromText,
|
|
10662
|
+
textContainsBrandAlias,
|
|
10663
|
+
textContainsAnyBrandAlias,
|
|
7966
10664
|
cosineSimilarity,
|
|
7967
10665
|
clusterByCosine,
|
|
7968
10666
|
pickClusterRepresentative,
|
|
7969
10667
|
computeDedupSimilarityStats,
|
|
7970
|
-
absolutizeProjectUrl,
|
|
7971
|
-
hostOf,
|
|
7972
|
-
normalizeUrlPath,
|
|
7973
10668
|
discoveryBucketSchema,
|
|
7974
10669
|
DiscoveryBuckets,
|
|
7975
10670
|
DEFAULT_DISCOVERY_PROMOTE_BUCKETS,
|
|
@@ -8025,7 +10720,6 @@ export {
|
|
|
8025
10720
|
determineAnswerMentioned,
|
|
8026
10721
|
visibilityStateFromAnswerMentioned,
|
|
8027
10722
|
mentionStateFromAnswerMentioned,
|
|
8028
|
-
brandKeyFromText,
|
|
8029
10723
|
healthSnapshotDtoSchema,
|
|
8030
10724
|
agentProvidersResponseDtoSchema,
|
|
8031
10725
|
MemorySources,
|