Iwara Download Tool

Download videos from iwara.tv

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name              Iwara Download Tool
// @description       Download videos from iwara.tv
// @name:ja           Iwara バッチダウンローダー
// @description:ja    Iwara 動画バッチをダウンロード
// @name:zh-CN        Iwara 批量下载工具
// @description:zh-CN 批量下载 Iwara 视频
// @icon              https://www.google.com/s2/favicons?sz=64&domain=iwara.tv
// @namespace         https://github.com/dawn-lc/
// @author            dawn-lc
// @license           Apache-2.0
// @copyright         2026, Dawnlc (https://dawnlc.me/)
// @supportURL        https://github.com/dawn-lc/IwaraDownloadTool/issues
// @connect           iwara.tv
// @connect           *.iwara.*
// @connect           localhost
// @connect           127.0.0.1
// @connect           *
// @include           *://*.iwara.*/*
// @grant             GM_getValue
// @grant             GM_setValue
// @grant             GM_listValues
// @grant             GM_deleteValue
// @grant             GM_addValueChangeListener
// @grant             GM_addStyle
// @grant             GM_setClipboard
// @grant             GM_download
// @grant             GM_xmlhttpRequest
// @grant             GM_openInTab
// @grant             GM_info
// @grant             unsafeWindow
// @grant             window.close
// @run-at            document-start
// @noframes
// @version           3.3.93
// ==/UserScript==
"use strict";
(() => {
  var __create = Object.create;
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __getProtoOf = Object.getPrototypeOf;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __commonJS = (cb, mod) => function __require() {
    return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
    mod
  ));
  var require_dayjs_min = __commonJS({
    "node_modules/dayjs/dayjs.min.js"(exports, module) {
      "use strict";
      (function(T2, g4) {
        typeof exports == "object" && typeof module < "u" ? module.exports = g4() : typeof define == "function" && define.amd ? define(g4) : (T2 = typeof globalThis < "u" ? globalThis : T2 || self).dayjs = g4();
      })(exports, (function() {
        "use strict";
        var T2 = 1e3, g4 = 6e4, U = 36e5, A2 = "millisecond", w2 = "second", O2 = "minute", b2 = "hour", M2 = "day", L2 = "week", m2 = "month", F2 = "quarter", y2 = "year", _ = "date", J = "Invalid Date", V2 = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, q = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, B2 = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(i3) {
          var n5 = ["th", "st", "nd", "rd"], t2 = i3 % 100;
          return "[" + i3 + (n5[(t2 - 20) % 10] || n5[t2] || n5[0]) + "]";
        } }, I2 = function(i3, n5, t2) {
          var r2 = String(i3);
          return !r2 || r2.length >= n5 ? i3 : "" + Array(n5 + 1 - r2.length).join(t2) + i3;
        }, E2 = { s: I2, z: function(i3) {
          var n5 = -i3.utcOffset(), t2 = Math.abs(n5), r2 = Math.floor(t2 / 60), e = t2 % 60;
          return (n5 <= 0 ? "+" : "-") + I2(r2, 2, "0") + ":" + I2(e, 2, "0");
        }, m: function i3(n5, t2) {
          if (n5.date() < t2.date()) return -i3(t2, n5);
          var r2 = 12 * (t2.year() - n5.year()) + (t2.month() - n5.month()), e = n5.clone().add(r2, m2), s = t2 - e < 0, u3 = n5.clone().add(r2 + (s ? -1 : 1), m2);
          return +(-(r2 + (t2 - e) / (s ? e - u3 : u3 - e)) || 0);
        }, a: function(i3) {
          return i3 < 0 ? Math.ceil(i3) || 0 : Math.floor(i3);
        }, p: function(i3) {
          return { M: m2, y: y2, w: L2, d: M2, D: _, h: b2, m: O2, s: w2, ms: A2, Q: F2 }[i3] || String(i3 || "").toLowerCase().replace(/s$/, "");
        }, u: function(i3) {
          return i3 === void 0;
        } }, Y = "en", D2 = {};
        D2[Y] = B2;
        var Z = "$isDayjsObject", N = function(i3) {
          return i3 instanceof C2 || !(!i3 || !i3[Z]);
        }, W2 = function i3(n5, t2, r2) {
          var e;
          if (!n5) return Y;
          if (typeof n5 == "string") {
            var s = n5.toLowerCase();
            D2[s] && (e = s), t2 && (D2[s] = t2, e = s);
            var u3 = n5.split("-");
            if (!e && u3.length > 1) return i3(u3[0]);
          } else {
            var o = n5.name;
            D2[o] = n5, e = o;
          }
          return !r2 && e && (Y = e), e || !r2 && Y;
        }, f2 = function(i3, n5) {
          if (N(i3)) return i3.clone();
          var t2 = typeof n5 == "object" ? n5 : {};
          return t2.date = i3, t2.args = arguments, new C2(t2);
        }, a3 = E2;
        a3.l = W2, a3.i = N, a3.w = function(i3, n5) {
          return f2(i3, { locale: n5.$L, utc: n5.$u, x: n5.$x, $offset: n5.$offset });
        };
        var C2 = (function() {
          function i3(t2) {
            this.$L = W2(t2.locale, null, true), this.parse(t2), this.$x = this.$x || t2.x || {}, this[Z] = true;
          }
          var n5 = i3.prototype;
          return n5.parse = function(t2) {
            this.$d = (function(r2) {
              var e = r2.date, s = r2.utc;
              if (e === null) return new Date(NaN);
              if (a3.u(e)) return new Date();
              if (e instanceof Date) return new Date(e);
              if (typeof e == "string" && !/Z$/i.test(e)) {
                var u3 = e.match(V2);
                if (u3) {
                  var o = u3[2] - 1 || 0, c2 = (u3[7] || "0").substring(0, 3);
                  return s ? new Date(Date.UTC(u3[1], o, u3[3] || 1, u3[4] || 0, u3[5] || 0, u3[6] || 0, c2)) : new Date(u3[1], o, u3[3] || 1, u3[4] || 0, u3[5] || 0, u3[6] || 0, c2);
                }
              }
              return new Date(e);
            })(t2), this.init();
          }, n5.init = function() {
            var t2 = this.$d;
            this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds();
          }, n5.$utils = function() {
            return a3;
          }, n5.isValid = function() {
            return this.$d.toString() !== J;
          }, n5.isSame = function(t2, r2) {
            var e = f2(t2);
            return this.startOf(r2) <= e && e <= this.endOf(r2);
          }, n5.isAfter = function(t2, r2) {
            return f2(t2) < this.startOf(r2);
          }, n5.isBefore = function(t2, r2) {
            return this.endOf(r2) < f2(t2);
          }, n5.$g = function(t2, r2, e) {
            return a3.u(t2) ? this[r2] : this.set(e, t2);
          }, n5.unix = function() {
            return Math.floor(this.valueOf() / 1e3);
          }, n5.valueOf = function() {
            return this.$d.getTime();
          }, n5.startOf = function(t2, r2) {
            var e = this, s = !!a3.u(r2) || r2, u3 = a3.p(t2), o = function(S2, $) {
              var v2 = a3.w(e.$u ? Date.UTC(e.$y, $, S2) : new Date(e.$y, $, S2), e);
              return s ? v2 : v2.endOf(M2);
            }, c2 = function(S2, $) {
              return a3.w(e.toDate()[S2].apply(e.toDate("s"), (s ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice($)), e);
            }, h2 = this.$W, d = this.$M, l2 = this.$D, k2 = "set" + (this.$u ? "UTC" : "");
            switch (u3) {
              case y2:
                return s ? o(1, 0) : o(31, 11);
              case m2:
                return s ? o(1, d) : o(0, d + 1);
              case L2:
                var p3 = this.$locale().weekStart || 0, H = (h2 < p3 ? h2 + 7 : h2) - p3;
                return o(s ? l2 - H : l2 + (6 - H), d);
              case M2:
              case _:
                return c2(k2 + "Hours", 0);
              case b2:
                return c2(k2 + "Minutes", 1);
              case O2:
                return c2(k2 + "Seconds", 2);
              case w2:
                return c2(k2 + "Milliseconds", 3);
              default:
                return this.clone();
            }
          }, n5.endOf = function(t2) {
            return this.startOf(t2, false);
          }, n5.$set = function(t2, r2) {
            var e, s = a3.p(t2), u3 = "set" + (this.$u ? "UTC" : ""), o = (e = {}, e[M2] = u3 + "Date", e[_] = u3 + "Date", e[m2] = u3 + "Month", e[y2] = u3 + "FullYear", e[b2] = u3 + "Hours", e[O2] = u3 + "Minutes", e[w2] = u3 + "Seconds", e[A2] = u3 + "Milliseconds", e)[s], c2 = s === M2 ? this.$D + (r2 - this.$W) : r2;
            if (s === m2 || s === y2) {
              var h2 = this.clone().set(_, 1);
              h2.$d[o](c2), h2.init(), this.$d = h2.set(_, Math.min(this.$D, h2.daysInMonth())).$d;
            } else o && this.$d[o](c2);
            return this.init(), this;
          }, n5.set = function(t2, r2) {
            return this.clone().$set(t2, r2);
          }, n5.get = function(t2) {
            return this[a3.p(t2)]();
          }, n5.add = function(t2, r2) {
            var e, s = this;
            t2 = Number(t2);
            var u3 = a3.p(r2), o = function(d) {
              var l2 = f2(s);
              return a3.w(l2.date(l2.date() + Math.round(d * t2)), s);
            };
            if (u3 === m2) return this.set(m2, this.$M + t2);
            if (u3 === y2) return this.set(y2, this.$y + t2);
            if (u3 === M2) return o(1);
            if (u3 === L2) return o(7);
            var c2 = (e = {}, e[O2] = g4, e[b2] = U, e[w2] = T2, e)[u3] || 1, h2 = this.$d.getTime() + t2 * c2;
            return a3.w(h2, this);
          }, n5.subtract = function(t2, r2) {
            return this.add(-1 * t2, r2);
          }, n5.format = function(t2) {
            var r2 = this, e = this.$locale();
            if (!this.isValid()) return e.invalidDate || J;
            var s = t2 || "YYYY-MM-DDTHH:mm:ssZ", u3 = a3.z(this), o = this.$H, c2 = this.$m, h2 = this.$M, d = e.weekdays, l2 = e.months, k2 = e.meridiem, p3 = function($, v2, x2, j2) {
              return $ && ($[v2] || $(r2, s)) || x2[v2].slice(0, j2);
            }, H = function($) {
              return a3.s(o % 12 || 12, $, "0");
            }, S2 = k2 || function($, v2, x2) {
              var j2 = $ < 12 ? "AM" : "PM";
              return x2 ? j2.toLowerCase() : j2;
            };
            return s.replace(q, (function($, v2) {
              return v2 || (function(x2) {
                switch (x2) {
                  case "YY":
                    return String(r2.$y).slice(-2);
                  case "YYYY":
                    return a3.s(r2.$y, 4, "0");
                  case "M":
                    return h2 + 1;
                  case "MM":
                    return a3.s(h2 + 1, 2, "0");
                  case "MMM":
                    return p3(e.monthsShort, h2, l2, 3);
                  case "MMMM":
                    return p3(l2, h2);
                  case "D":
                    return r2.$D;
                  case "DD":
                    return a3.s(r2.$D, 2, "0");
                  case "d":
                    return String(r2.$W);
                  case "dd":
                    return p3(e.weekdaysMin, r2.$W, d, 2);
                  case "ddd":
                    return p3(e.weekdaysShort, r2.$W, d, 3);
                  case "dddd":
                    return d[r2.$W];
                  case "H":
                    return String(o);
                  case "HH":
                    return a3.s(o, 2, "0");
                  case "h":
                    return H(1);
                  case "hh":
                    return H(2);
                  case "a":
                    return S2(o, c2, true);
                  case "A":
                    return S2(o, c2, false);
                  case "m":
                    return String(c2);
                  case "mm":
                    return a3.s(c2, 2, "0");
                  case "s":
                    return String(r2.$s);
                  case "ss":
                    return a3.s(r2.$s, 2, "0");
                  case "SSS":
                    return a3.s(r2.$ms, 3, "0");
                  case "Z":
                    return u3;
                }
                return null;
              })($) || u3.replace(":", "");
            }));
          }, n5.utcOffset = function() {
            return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
          }, n5.diff = function(t2, r2, e) {
            var s, u3 = this, o = a3.p(r2), c2 = f2(t2), h2 = (c2.utcOffset() - this.utcOffset()) * g4, d = this - c2, l2 = function() {
              return a3.m(u3, c2);
            };
            switch (o) {
              case y2:
                s = l2() / 12;
                break;
              case m2:
                s = l2();
                break;
              case F2:
                s = l2() / 3;
                break;
              case L2:
                s = (d - h2) / 6048e5;
                break;
              case M2:
                s = (d - h2) / 864e5;
                break;
              case b2:
                s = d / U;
                break;
              case O2:
                s = d / g4;
                break;
              case w2:
                s = d / T2;
                break;
              default:
                s = d;
            }
            return e ? s : a3.a(s);
          }, n5.daysInMonth = function() {
            return this.endOf(m2).$D;
          }, n5.$locale = function() {
            return D2[this.$L];
          }, n5.locale = function(t2, r2) {
            if (!t2) return this.$L;
            var e = this.clone(), s = W2(t2, r2, true);
            return s && (e.$L = s), e;
          }, n5.clone = function() {
            return a3.w(this.$d, this);
          }, n5.toDate = function() {
            return new Date(this.valueOf());
          }, n5.toJSON = function() {
            return this.isValid() ? this.toISOString() : null;
          }, n5.toISOString = function() {
            return this.$d.toISOString();
          }, n5.toString = function() {
            return this.$d.toUTCString();
          }, i3;
        })(), z = C2.prototype;
        return f2.prototype = z, [["$ms", A2], ["$s", w2], ["$m", O2], ["$H", b2], ["$W", M2], ["$M", m2], ["$y", y2], ["$D", _]].forEach((function(i3) {
          z[i3[1]] = function(n5) {
            return this.$g(n5, i3[0], i3[1]);
          };
        })), f2.extend = function(i3, n5) {
          return i3.$i || (i3(n5, C2, f2), i3.$i = true), f2;
        }, f2.locale = W2, f2.isDayjs = N, f2.unix = function(i3) {
          return f2(1e3 * i3);
        }, f2.en = D2[Y], f2.Ls = D2, f2.p = {}, f2;
      }));
    }
  });
  if (unsafeWindow.IwaraDownloadTool) {
    throw `Script is already running`;
  }
  unsafeWindow.IwaraDownloadTool = true;
  var main_default = '@keyframes rainbow-horizontal{0%{background-position:0% 0%}to{background-position:200% 0%}}@keyframes rainbow-vertical{0%{background-position:0% 0%}to{background-position:0% 200%}}.rainbow-text{background-image:linear-gradient(to right,#ff4040,#ffff40,#40ff40,#40ffff,#4040ff,#ff40ff,#ff4040);background-size:200% 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:rainbow-horizontal .8s infinite linear;font-weight:700}#pluginMenu{z-index:2147483644;position:fixed;top:50%;right:0;padding:10px 26px;background-color:var(--body-dark);border:1px solid var(--text);border-radius:5px;box-shadow:0 0 10px var(--text);transform:translate(calc(100% - 26px)) translateY(-50%);transition:transform .3s ease-in-out}#pluginMenu:not(.expanded){overflow:visible}#pluginMenu:not(.expanded):before{content:"";mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WiIvPjwvc3ZnPg==) no-repeat center;-webkit-mask:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNTYwLTI0MCAzMjAtNDgwbDI0MC0yNDAgNTYgNTYtMTg0IDE4NCAxODQgMTg0LTU2IDU2WiIvPjwvc3ZnPg==) no-repeat center;background-color:var(--text);width:24px;height:24px;position:absolute;left:0;top:50%;line-height:0;transform:translateY(-50%)}#pluginMenu.expanded{transform:translate(0) translateY(-50%)}#pluginMenu ul{list-style:none;margin:0;padding:0}#pluginMenu li{padding:5px 10px;cursor:pointer;text-align:center;user-select:none;color:var(--text)}#pluginMenu li:hover{background-color:var(--primary-dark);border-radius:3px}@media(max-width:720px){#pluginMenu{padding:8px 18px;transform:translate(calc(100% - 18px)) translateY(-50%)}#pluginMenu:not(.expanded):before{width:20px;height:20px}#pluginMenu.expanded{transform:translate(0) translateY(-50%)}#pluginMenu li{padding:12px 16px;font-size:15px;min-width:44px;min-height:44px;display:flex;align-items:center;justify-content:center;white-space:nowrap}}@media(max-width:480px){#pluginMenu{padding:6px 14px;transform:translate(calc(100% - 14px)) translateY(-50%)}#pluginMenu:not(.expanded):before{width:18px;height:18px}#pluginMenu li{padding:14px 18px;font-size:14px}}@media(pointer:coarse){#pluginMenu{padding:12px 34px;transform:translate(calc(100% - 34px)) translateY(-50%)}#pluginMenu:not(.expanded):before{width:28px;height:28px;left:3px}#pluginMenu.expanded{transform:translate(0) translateY(-50%)}#pluginMenu li{padding:14px 22px;font-size:15px;min-width:48px;min-height:48px;display:flex;align-items:center;justify-content:center;white-space:nowrap}#pluginMenu li:nth-child(odd){background-color:var(--body-dark)}#pluginMenu li:nth-child(2n){background-color:var(--body)}#pluginMenu li:active{background-color:var(--primary-dark)!important;border-radius:3px}}#pluginConfig{color:var(--text);position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000000bf;z-index:2147483646;display:flex;flex-direction:column;align-items:center;justify-content:center}#pluginConfig .main{background-color:var(--body);padding:24px;margin:10px;overflow-y:auto;width:480px}#pluginConfig .buttonList{display:flex;flex-direction:row;justify-content:center}@media(max-width:640px){#pluginConfig .main{width:100%;height:80%}}#pluginConfig button{background-color:var(--primary);margin:0 20px;padding:10px 20px;color:var(--primary-text);font-size:18px;border:none;border-radius:4px;cursor:pointer}#pluginConfig button{background-color:var(--primary)}#pluginConfig button[disabled]{background-color:var(--muted);cursor:not-allowed}#pluginConfig p{display:flex;flex-direction:column;margin-top:10px;margin-bottom:0}#pluginConfig fieldset{border:none;margin:10px 0 0;padding:0;display:flex;justify-content:space-between;flex-wrap:nowrap}#pluginConfig fieldset>legend{margin:0 0 5px;padding:0}#pluginConfig fieldset>label{text-align:center}#pluginConfig p label{display:flex;flex-direction:column;margin:5px 0 0}#pluginConfig .inputRadioLine{display:flex;align-items:center;flex-direction:row;justify-content:space-between}#pluginConfig input[type=text],#pluginConfig input[type=password]{outline:none;border-top:none;border-right:none;border-left:none;border-image:initial;border-bottom:1px solid var(--muted);line-height:1;height:30px;box-sizing:border-box;width:100%;background-color:var(--body);color:var(--text)}#pluginConfig input[type=checkbox].switch{outline:none;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;width:40px;height:20px;background:var(--muted);border-radius:10px;transition:border-color .2s,background-color .2s}#pluginConfig input[type=checkbox].switch:after{content:"";display:inline-block;width:40%;height:80%;border-radius:50%;background:var(--white);box-shadow:0,0,2px,var(--muted);transition:.2s;top:2px;position:absolute;right:55%}#pluginConfig input[type=checkbox].switch:checked{background:var(--success)}#pluginConfig input[type=checkbox].switch:checked:after{content:"";position:absolute;right:2px;top:2px}#pluginOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000000bf;z-index:2147483645;display:flex;flex-direction:column;align-items:center;justify-content:center}#pluginOverlay .main{color:var(--text);font-size:24px;width:60%;background-color:var(--body);padding:24px;margin:10px;overflow-y:auto}@media(max-width:640px){#pluginOverlay .main{width:100%}}#pluginOverlay button{padding:10px 20px;color:var(--primary-text);font-size:18px;border:none;border-radius:4px;cursor:pointer}#pluginOverlay button{background-color:var(--primary)}#pluginOverlay button[disabled]{background-color:var(--muted);cursor:not-allowed}#pluginOverlay .checkbox{width:32px;height:32px;margin:0 4px 0 0;padding:0}#pluginOverlay .checkbox-container{display:flex;align-items:center;margin:0 0 10px}#pluginOverlay .checkbox-label{color:var(--text);font-size:32px;font-weight:700;margin-left:10px;display:flex;align-items:center}.fixed-bottom-right{position:fixed;bottom:0;right:0;background-color:var(--body);color:var(--text);border-top:1px solid var(--primary);border-left:1px solid var(--primary);border-top-left-radius:6px;padding:2px 5px;margin:0;user-select:none;z-index:102}.follow{bottom:24px;right:2px;border-radius:2px;position:absolute;padding:3px 5px;background-color:#000c;pointer-events:none}.selectButton{accent-color:var(--primary);position:absolute;width:38px;height:38px;right:0;cursor:pointer;z-index:102;top:22px}.deleteButton{accent-color:var(--danger);position:absolute;width:38px;height:38px;left:0;cursor:pointer;z-index:101;border:none;padding:0;margin:3px;top:22px}.toast h3{margin:0 0 10px}.toast p{margin:0}.offscreen-container{position:absolute;visibility:hidden;pointer-events:none;max-width:480px}.toast-container{isolation:isolate;position:fixed;z-index:2147483647;display:flex;flex-direction:column;box-sizing:border-box;transition:transform calc(.6 * var(--toast-rate) * 1s) ease,opacity calc(.6 * var(--toast-rate) * 1s) ease}.toast-container.toast-top{top:0}.toast-container.toast-bottom{bottom:0}.toast-container.toast-left{left:0;align-items:flex-start}.toast-container.toast-center{left:50%;transform:translate(-50%);align-items:center}.toast-container.toast-right{right:0;align-items:flex-end}#toast-container-top-left .toast{margin:10px 0 0 10px;transform-origin:left center}#toast-container-top-center .toast{margin:10px 0 0;transform-origin:top}#toast-container-top-right .toast{margin:10px 10px 0 0;transform-origin:right center}#toast-container-bottom-left .toast{margin:0 0 10px 10px;transform-origin:left center}#toast-container-bottom-center .toast{margin:0 0 10px;transform-origin:bottom}#toast-container-bottom-right .toast{margin:0 10px 10px 0;transform-origin:right center}.toast{--toast-rate: 1;--toast-translate: 0;--toast-scale: 1;position:relative;transition:transform calc(.4s * var(--toast-rate)) cubic-bezier(.34,1.56,.64,1),opacity calc(.3s * var(--toast-rate)) ease;transform:translate3d(0,var(--toast-translate),0) scale(var(--toast-scale));max-width:480px;max-height:0px;will-change:transform,opacity;backface-visibility:hidden;contain:content;border-radius:6px;box-shadow:0 4px 8px #00000040}.toast-close{position:absolute;color:var(--text);top:5px;right:5px;cursor:pointer;font-size:12px;line-height:12px;z-index:2147483648;transform-origin:center center}.toast-content{border-radius:6px;padding:14px 18px;max-width:100%;box-sizing:border-box;background:var(--primary);color:var(--primary-text);cursor:pointer;white-space:normal;word-break:break-all;overflow:hidden;position:relative}.toast-progress{position:absolute;bottom:0;left:0;right:0;height:4px;background:#fffc;transform:scaleX(var(--toast-progress, 0));transition:transform calc(.05s * var(--toast-rate)) linear;will-change:transform;backface-visibility:hidden}.toast:hover{z-index:2147483648;--toast-scale: 1.15}.toast-container.toast-left .toast .toast-content .toast-progress{transform-origin:left}.toast-container.toast-center .toast .toast-content .toast-progress{transform-origin:center}.toast-container.toast-right .toast .toast-content .toast-progress{transform-origin:right}.toast-container.toast-top .toast.show{animation:toast-in-top calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-bottom .toast.show{animation:toast-in-bottom calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-top .toast.hide{animation:toast-out-top calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}.toast-container.toast-bottom .toast.hide{animation:toast-out-bottom calc(.3 * var(--toast-rate) * 1s) ease-in-out forwards}@keyframes toast-in-top{0%{opacity:0;max-height:0px}to{max-height:var(--toast-height)}}@keyframes toast-in-bottom{0%{opacity:0;max-height:0px}to{max-height:var(--toast-height)}}@keyframes toast-out-top{0%{max-height:var(--toast-height)}to{opacity:0;max-height:0px}}@keyframes toast-out-bottom{0%{max-height:var(--toast-height)}to{opacity:0;max-height:0px}}';
  var beautify_default = ".page-profile__content *>.col-6.col-sm-4.col-lg-3,.moreFromUser__item,.moreLikeThis__item{margin-bottom:2%}@media(max-width:720px){.page-videoList__item{padding:0 6px 0 2px!important}}.videoTeaser{display:flex;flex-direction:column;height:100%;border-radius:6px;border:2px solid color-mix(in srgb,var(--text) 20%,transparent);overflow:hidden;transition:background-color .2s ease,border-color .2s ease;background-color:var(--body-alt)}.videoTeaser:hover{background-color:color-mix(in srgb,var(--body-alt) 90%,var(--text))}.videoTeaser__content{display:flex;flex-direction:column;flex:1;padding:2%}.videoTeaser__title{padding-left:2%;padding-right:2%}.videoTeaser__bottom{margin-top:auto!important;height:auto!important;padding-bottom:2%;padding-left:2%;padding-right:2%}";
  var widescreen_default = ".container,.container-fluid{max-width:85%!important}.videoTeaser__title,.videoTeaser__byline{line-clamp:1!important;-webkit-line-clamp:1!important}@media(max-width:720px){.container,.container-fluid{max-width:100%!important}.videoTeaser__title,.videoTeaser__byline{line-clamp:2!important;-webkit-line-clamp:2!important}}";
  var ConvertibleNumber = Symbol("ConvertibleNumber");
  var PositiveInteger = Symbol("PositiveInteger");
  var NegativeInteger = Symbol("NegativeInteger");
  var PositiveFloat = Symbol("PositiveFloat");
  var NegativeFloat = Symbol("NegativeFloat");
  var emojiBase = String.raw`\p{Emoji}(?:\p{EMod}|[\u{E0020}-\u{E007E}]+\u{E007F}|\uFE0F?\u20E3?)`;
  var emojiRegex = new RegExp(String.raw`\p{RI}{2}|(?![#*\d](?!\uFE0F?\u20E3))${emojiBase}(?:\u200D${emojiBase})*`, "gu");
  var isNull = (obj) => obj === null;
  var isUndefined = (obj) => typeof obj === "undefined";
  var isNullOrUndefined = (obj) => isUndefined(obj) || isNull(obj);
  var isObject = (obj) => !isNullOrUndefined(obj) && typeof obj === "object" && !Array.isArray(obj);
  var isString = (obj) => !isNullOrUndefined(obj) && typeof obj === "string";
  var isNumber = (obj) => !isNullOrUndefined(obj) && typeof obj === "number";
  var isArray = (obj) => Array.isArray(obj);
  var isElement = (obj) => !isNullOrUndefined(obj) && obj instanceof Element;
  var isNode = (obj) => !isNullOrUndefined(obj) && obj instanceof Node;
  var isNotEmpty = (obj) => {
    if (isNullOrUndefined(obj)) {
      return false;
    }
    if (Array.isArray(obj)) {
      return obj.some(isNotEmpty);
    }
    if (isString(obj)) {
      return !obj.isEmpty();
    }
    if (isNumber(obj)) {
      return !Number.isNaN(obj);
    }
    if (isElement(obj) || isNode(obj)) {
      return true;
    }
    if (isObject(obj)) {
      return Object.values(obj).some(isNotEmpty);
    }
    return true;
  };
  var isVideoInfo = (obj) => {
    if (obj === null || typeof obj !== "object") return false;
    const info = obj;
    return isInitVideoInfo(info) || isFullVideoInfo(info) || isPartialVideoInfo(info) || isCacheVideoInfo(info) || isFailVideoInfo(info);
  };
  var hasValidID = (info) => isString(info.ID) && isNotEmpty(info.ID);
  var isInitVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "init" && hasValidID(info);
  var isFullVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "full" && hasValidID(info) && isNumber(info.UploadTime) && isString(info.Title) && isNotEmpty(info.Title) && isString(info.FileName) && isNotEmpty(info.FileName) && isNumber(info.Size) && isArray(info.Tags) && typeof info.Liked === "boolean" && typeof info.Following === "boolean" && typeof info.Friend === "boolean" && isString(info.Author) && isNotEmpty(info.Author) && isString(info.AuthorID) && isNotEmpty(info.AuthorID) && typeof info.Private === "boolean" && typeof info.Unlisted === "boolean" && isString(info.DownloadQuality) && typeof info.External === "boolean" && isString(info.DownloadUrl) && isNotEmpty(info.DownloadUrl) && isObject(info.RAW);
  var isPartialVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "partial" && hasValidID(info) && isNumber(info.UploadTime) && isString(info.Title) && isNotEmpty(info.Title) && isArray(info.Tags) && typeof info.Liked === "boolean" && isString(info.Author) && isNotEmpty(info.Author) && isString(info.AuthorID) && isNotEmpty(info.AuthorID) && typeof info.Private === "boolean" && typeof info.Unlisted === "boolean" && typeof info.External === "boolean" && isObject(info.RAW);
  var isCacheVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "cache" && hasValidID(info) && isObject(info.RAW);
  var isFailVideoInfo = (info) => !isNullOrUndefined(info) && info.Type === "fail" && hasValidID(info);
  var assertVideoInfoType = (info) => {
    switch (info.Type) {
      case "init":
        return info;
      case "full":
        return info;
      case "partial":
        return info;
      case "cache":
        return info;
      case "fail":
        return info;
      default:
        throw new Error(`未知的 VideoInfo 类型: ${info.Type}`);
    }
  };
  function isConvertibleToNumber(obj, includeInfinity = false) {
    if (isNullOrUndefined(obj)) {
      return false;
    }
    if (isString(obj)) {
      return obj.isConvertibleToNumber(includeInfinity);
    }
    if (isNumber(obj)) {
      return isNaN(obj) ? false : includeInfinity ? true : isFinite(obj);
    }
    return false;
  }
  Number.isConvertibleNumber = (value, includeInfinity = false) => {
    if (isNullOrUndefined(value)) {
      return false;
    }
    if (isString(value)) {
      return value.isConvertibleToNumber(includeInfinity);
    }
    if (isNumber(value)) {
      return isNaN(value) ? false : includeInfinity ? true : isFinite(value);
    }
    return false;
  };
  Number.isPositiveInteger = (value) => typeof value === "number" && Number.isInteger(value) && value > 0;
  Number.isNegativeInteger = (value) => typeof value === "number" && Number.isInteger(value) && value < 0;
  Number.isPositiveFloat = (value) => typeof value === "number" && !Number.isInteger(value) && value > 0;
  Number.isNegativeFloat = (value) => typeof value === "number" && !Number.isInteger(value) && value < 0;
  Number.toPositiveInteger = (value) => {
    if (!Number.isPositiveInteger(value)) {
      throw new Error("值必须为正整数");
    }
    return value;
  };
  Number.toNegativeInteger = (value) => {
    if (!Number.isNegativeInteger(value)) {
      throw new Error("值必须为负整数");
    }
    return value;
  };
  Number.toPositiveFloat = (value) => {
    if (!Number.isPositiveFloat(value)) {
      throw new Error("值必须为正浮点数");
    }
    return value;
  };
  Number.toNegativeFloat = (value) => {
    if (!Number.isNegativeFloat(value)) {
      throw new Error("值必须为负浮点数");
    }
    return value;
  };
  Array.prototype.any = function() {
    return this.filter((i3) => !isNullOrUndefined(i3)).length > 0;
  };
  Array.prototype.unique = function(prop) {
    if (isNullOrUndefined(prop)) {
      const seen = new Set();
      return this.filter((item) => {
        if (seen.has(item)) return false;
        seen.add(item);
        return true;
      });
    } else {
      const seen = new Map();
      const nanSymbol = Symbol();
      return this.filter((item) => {
        const rawKey = item[prop];
        const key = isNumber(rawKey) && Number.isNaN(rawKey) ? nanSymbol : rawKey;
        if (seen.has(key)) return false;
        seen.set(key, true);
        return true;
      });
    }
  };
  Array.prototype.union = function(that, prop) {
    return [...this, ...that].unique(prop);
  };
  Array.prototype.intersect = function(that, prop) {
    return this.filter(
      (item) => that.some((t2) => isNullOrUndefined(prop) ? t2 === item : t2[prop] === item[prop])
    ).unique(prop);
  };
  Array.prototype.difference = function(that, prop) {
    return this.filter(
      (item) => !that.some((t2) => isNullOrUndefined(prop) ? t2 === item : t2[prop] === item[prop])
    ).unique(prop);
  };
  Array.prototype.complement = function(that, prop) {
    return this.union(that, prop).difference(this.intersect(that, prop), prop);
  };
  String.prototype.isEmpty = function() {
    return !isNullOrUndefined(this) && this.length === 0;
  };
  String.prototype.isConvertibleToNumber = function(includeInfinity = false) {
    const trimmed = this.trim();
    if (trimmed === "") return false;
    return Number.isConvertibleNumber(Number(trimmed), includeInfinity);
  };
  String.prototype.reversed = function() {
    const segmenter = new Intl.Segmenter(navigator.language, { granularity: "grapheme" });
    return [...segmenter.segment(this.toString())].reverse().join("");
  };
  String.prototype.among = function(start, end, greedy = false, reverse = false) {
    if (this.isEmpty() || start.isEmpty() || end.isEmpty()) return "";
    if (!reverse) {
      const startIndex = this.indexOf(start);
      if (startIndex === -1) return "";
      const adjustedStartIndex = startIndex + start.length;
      const endIndex = greedy ? this.lastIndexOf(end) : this.indexOf(end, adjustedStartIndex);
      if (endIndex === -1 || endIndex < adjustedStartIndex) return "";
      return this.slice(adjustedStartIndex, endIndex);
    } else {
      const endIndex = this.lastIndexOf(end);
      if (endIndex === -1) return "";
      const adjustedEndIndex = endIndex - end.length;
      const startIndex = greedy ? this.indexOf(start) : this.lastIndexOf(start, adjustedEndIndex);
      if (startIndex === -1 || startIndex + start.length > adjustedEndIndex) return "";
      return this.slice(startIndex + start.length, endIndex);
    }
  };
  String.prototype.splitLimit = function(separator, limit) {
    if (this.isEmpty() || isNullOrUndefined(separator)) {
      throw new Error("Empty");
    }
    let body = this.split(separator);
    return limit ? body.slice(0, limit).concat(body.slice(limit).join(separator)) : body;
  };
  String.prototype.truncate = function(maxLength) {
    return this.length > maxLength ? this.substring(0, maxLength) : this.toString();
  };
  String.prototype.trimHead = function(prefix) {
    return this.startsWith(prefix) ? this.slice(prefix.length) : this.toString();
  };
  String.prototype.trimTail = function(suffix) {
    return this.endsWith(suffix) ? this.slice(0, -suffix.length) : this.toString();
  };
  String.prototype.replaceEmojis = function(replace) {
    return this.replaceAll(emojiRegex, replace ?? "");
  };
  String.prototype.toURL = function() {
    try {
      return new URL(this.toString());
    } catch (error) {
      if (error instanceof TypeError && this.toString().startsWith("//")) {
        return new URL(unsafeWindow.location.protocol + this.toString());
      }
      throw error;
    }
  };
  Date.prototype.add = function({
    years = 0,
    months = 0,
    days = 0,
    hours = 0,
    minutes = 0,
    seconds = 0,
    ms = 0
  } = {}) {
    const newDate = new Date(this.getTime());
    if (years) newDate.setFullYear(newDate.getFullYear() + years);
    if (months) newDate.setMonth(newDate.getMonth() + months);
    if (days) newDate.setDate(newDate.getDate() + days);
    if (hours) newDate.setHours(newDate.getHours() + hours);
    if (minutes) newDate.setMinutes(newDate.getMinutes() + minutes);
    if (seconds) newDate.setSeconds(newDate.getSeconds() + seconds);
    if (ms) newDate.setMilliseconds(newDate.getMilliseconds() + ms);
    return newDate;
  };
  Date.prototype.sub = function({
    years = 0,
    months = 0,
    days = 0,
    hours = 0,
    minutes = 0,
    seconds = 0,
    ms = 0
  } = {}) {
    const newDate = new Date(this.getTime());
    if (years) newDate.setFullYear(newDate.getFullYear() - years);
    if (months) newDate.setMonth(newDate.getMonth() - months);
    if (days) newDate.setDate(newDate.getDate() - days);
    if (hours) newDate.setHours(newDate.getHours() - hours);
    if (minutes) newDate.setMinutes(newDate.getMinutes() - minutes);
    if (seconds) newDate.setSeconds(newDate.getSeconds() - seconds);
    if (ms) newDate.setMilliseconds(newDate.getMilliseconds() - ms);
    return newDate;
  };
  function throttle(fn, delay2, { leading = true, trailing = true } = {}) {
    let lastCall = 0;
    let timer = null;
    const throttled = function(...args) {
      const now = Date.now();
      if (!lastCall && !leading) {
        lastCall = now;
      }
      const remaining = delay2 - (now - lastCall);
      if (remaining <= 0) {
        if (timer) {
          clearTimeout(timer);
          timer = null;
        }
        lastCall = now;
        fn.apply(this, args);
      } else if (trailing && !timer) {
        timer = setTimeout(() => {
          lastCall = leading ? Date.now() : 0;
          timer = null;
          fn.apply(this, args);
        }, remaining);
      }
    };
    throttled.cancel = () => {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      lastCall = 0;
    };
    return throttled;
  }
  function debounce(fn, delay2, { immediate = false } = {}) {
    let timer = null;
    const debounced = function(...args) {
      const callNow = immediate && !timer;
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        timer = null;
        if (!immediate) {
          fn.apply(this, args);
        }
      }, delay2);
      if (callNow) {
        fn.apply(this, args);
      }
    };
    debounced.cancel = () => {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
    };
    return debounced;
  }
  function delay(time) {
    return new Promise((resolve) => setTimeout(resolve, time));
  }
  function hasProperty(element, property) {
    return property in element;
  }
  function hasOwnProperty(element, prop) {
    return prop in element;
  }
  function hasFunction(obj, method) {
    return isObject(obj) && method in obj && typeof obj[method] === "function";
  }
  ;
  function UUID() {
    return isNullOrUndefined(crypto) ? Array.from({ length: 8 }, () => ((1 + Math.random()) * 65536 | 0).toString(16).substring(1)).join("") : crypto.randomUUID().replaceAll("-", "");
  }
  function stringify(data) {
    switch (typeof data) {
      case "undefined":
        return "undefined";
      case "boolean":
        return data ? "true" : "false";
      case "number":
        return String(data);
      case "string":
        return data;
      case "symbol":
        return data.toString();
      case "function":
        return data.toString();
      case "object":
        if (isNull(data)) {
          return "null";
        }
        if (data instanceof Error) {
          return data.toString();
        }
        if (data instanceof Date) {
          return data.toISOString();
        }
        return JSON.stringify(data, null, 2);
      default:
        return "unknown";
    }
  }
  function prune(data) {
    if (isElement(data) || isNode(data)) {
      return data;
    }
    if (Array.isArray(data)) {
      return data.map((item) => prune(item)).filter(isNotEmpty);
    }
    if (isObject(data)) {
      const result = Object.fromEntries(
        Object.entries(data).filter(([, v2]) => isNotEmpty(v2)).map(([k2, v2]) => [k2, prune(v2)]).filter(([, v2]) => isNotEmpty(v2))
      );
      return result;
    }
    return data;
  }
  String.prototype.replaceVariable = function(replacements, prefix = "%#", suffix = "#%") {
    function escapeRegex(str) {
      return str.replace(/[\.\*\+\?\^\$\{\}\(\)\|\[\]\\]/g, "\\$&");
    }
    let current = this.toString();
    prefix = escapeRegex(prefix);
    suffix = escapeRegex(suffix);
    const seen = new Set();
    const patterns = Object.keys(replacements).map((key) => {
      const escKey = escapeRegex(key);
      return {
        value: replacements[key],
        placeholderRegex: new RegExp(`${prefix}${escKey}(?=(?::.*?${suffix}|${suffix}))(?::.*?)?${suffix}`, "gs"),
        placeholderFormatRegex: new RegExp(`(?<=${prefix}${escKey}(?=(?::.*?${suffix}|${suffix})):).*?(?=${suffix})`, "gs")
      };
    });
    while (true) {
      if (seen.has(current)) {
        console.warn("检测到循环替换!", `终止于: ${current}`);
        break;
      }
      seen.add(current);
      let next = current;
      for (const { value, placeholderRegex, placeholderFormatRegex } of patterns) {
        if (placeholderRegex.test(next)) {
          let format = next.match(placeholderFormatRegex);
          if (!isNullOrUndefined(format) && format.any() && !format[0].isEmpty() && hasFunction(value, "format")) {
            next = next.replace(placeholderRegex, stringify(value.format(format[0])));
          } else {
            next = next.replace(placeholderRegex, stringify(value instanceof Date ? value.format("YYYY-MM-DD") : value));
          }
        }
      }
      if (current === next) break;
      current = next;
    }
    return current;
  };
  var zh_cn_default = {
    appName: "Iwara 批量下载工具",
    language: "语言: ",
    downloadPriority: "下载画质: ",
    downloadPath: "下载到: ",
    downloadProxy: "下载代理: ",
    downloadProxyUsername: "下载代理用户名: ",
    downloadProxyPassword: "下载代理密码: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 密钥: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl 密钥: ",
    experimentalFeatures: "实验性功能",
    enableUnsafeMode: "激进模式(风险自行承担)",
    enableBeautify: "美化",
    enableWidescreen: "宽屏适配",
    rename: "重命名",
    save: "保存",
    reset: "重置",
    ok: "确定",
    on: "开启",
    off: "关闭",
    delete: "删除",
    deleteSucceed: "删除成功!",
    isDebug: "调试模式",
    downloadType: "下载方式",
    browserDownload: "浏览器下载",
    iwaradlDownload: "iwaradl下载",
    autoFollow: "自动关注选中的视频作者",
    autoLike: "自动点赞选中的视频",
    addUnlistedAndPrivate: "不公开和私有视频强制显示(需关注作者)",
    checkDownloadLink: "第三方网盘下载地址检查",
    checkPriority: "下载画质检查",
    autoDownloadMetadata: "自动下载视频元数据",
    filterLikedVideos: "过滤时间线上的已喜欢视频",
    videoMetadata: "视频元数据",
    autoInjectCheckbox: "自动注入选择框",
    notOfficialWarning: "警告,此网站不是Iwara官方网站,请勿填写任何敏感信息!!!继续浏览该网站?",
    autoCopySaveFileName: "自动复制根据规则生成的文件名",
    configurationIncompatible: "初始化或配置文件不兼容,请重新配置!",
    browserDownloadNotEnabled: "未启用下载功能!",
    browserDownloadNotWhitelisted: "请求的文件扩展名未列入白名单!",
    browserDownloadNotPermitted: "下载功能已启用,但未授予下载权限!",
    browserDownloadNotSupported: "目前浏览器/版本不支持下载功能!",
    browserDownloadNotSucceeded: "下载未开始或失败!",
    browserDownloadUnknownError: "未知错误,有可能是下载时提供的参数存在问题,请检查文件名是否合法!",
    browserDownloadTimeout: "下载超时,请检查网络环境是否正常!",
    variable: "→ 查看可用变量 ←",
    iwaradlLink: "→ iwaradl 官网 ←",
    downloadTime: "下载时间 ",
    uploadTime: "发布时间 ",
    example: "示例: ",
    result: "结果: ",
    loadingCompleted: "加载完成",
    settings: "打开设置",
    downloadThis: "下载当前视频",
    manualDownload: "手动下载",
    aria2TaskCheck: "Aria2任务重启",
    reverseSelect: "本页反向选中",
    deselectThis: "取消本页选中",
    deselectAll: "取消所有选中",
    selectThis: "本页全部选中",
    parseUnlistedAndPrivate: "解析近期隐藏或私有的视频",
    downloadSelected: "下载所选",
    selected: "已选中",
    downloadingSelected: "正在下载所选,请稍后...",
    injectCheckbox: "开关选择框",
    configError: "脚本配置中存在错误,请修改。",
    alreadyKnowHowToUse: "我已知晓如何使用!!!(此页面仅显示一次)",
    notice: [
      "加载完成"
    ],
    useHelpForBase: [
      "请认真阅读使用指南!",
      {
        nodeType: "br"
      },
      "点击网页侧边的灰色侧栏展开脚本菜单,根据需求点击菜单中的功能。"
    ],
    useHelpForInjectCheckbox: "打开任意存在视频卡片的页面,脚本会在视频卡片上注入复选框,点击复选框或鼠标悬浮在视频卡片上按空格将会勾选此视频。",
    useHelpForCheckDownloadLink: "开启“%#checkDownloadLink#%”功能会在下载视频前会检查视频简介以及评论,如果在其中发现疑似第三方网盘下载链接,将会弹出提示,您可以点击提示打开视频页面。",
    useHelpForManualDownload: [
      "使用手动下载功能需要提供视频ID,如需批量手动下载请提供使用“|”分割的视频ID。",
      {
        nodeType: "br"
      },
      "例如: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L"
    ],
    useHelpForBugreport: [
      "反馈遇到的BUG、使用问题等请前往: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ 点击此处重新下载 ←",
    tryReparseDownload: "→ 点击此处重新解析 ←",
    cdnCacheFinded: "→ 进入 MMD Fans 缓存页面 ←",
    openVideoLink: "→ 进入视频页面 ←",
    copySucceed: "复制成功!",
    pushTaskSucceed: "推送下载任务成功!",
    exportConfig: "导出配置",
    importConfig: "导入配置",
    exportConfigSucceed: "配置已导出至剪切板!",
    importConfigSucceed: "配置导入成功!",
    importConfigFail: "配置导入失败!",
    connectionTest: "连接测试",
    settingsCheck: "配置检查",
    createTask: "创建任务",
    downloadPathError: "下载路径错误!",
    browserDownloadModeError: "请启用脚本管理器的浏览器API下载模式!",
    downloadQualityError: "未找到指定的画质下载地址!",
    findedDownloadLink: "发现疑似第三方网盘下载地址!",
    allCompleted: "全部解析完成!",
    parsing: "预解析中...",
    following: "已关注",
    parsingProgress: "解析进度: ",
    manualDownloadTips: "单独下载请直接在此处输入视频ID, 批量下载请提供使用“|”分割的视频ID, 例如: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L",
    externalVideo: "非本站视频",
    playlistDelete: "删除播放列表",
    noAvailableVideoSource: "没有可供下载的视频源",
    videoSourceNotAvailable: "视频源地址不可用",
    getVideoSourceFailed: "获取视频源失败",
    downloadFailed: "下载失败!",
    downloadThisFailed: "未找到可供下载的视频!",
    pushTaskFailed: "推送下载任务失败!",
    parsingFailed: "视频信息解析失败!",
    autoFollowFailed: "自动关注视频作者失败!",
    autoLikeFailed: "自动点赞视频失败!"
  };
  var en_default = {
    appName: "Iwara Download Tool",
    language: "Language: ",
    downloadPriority: "Download Quality: ",
    downloadPath: "Download Path: ",
    downloadProxy: "Download Proxy: ",
    downloadProxyUsername: "Download Proxy Username: ",
    downloadProxyPassword: "Download Proxy Password: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 Token: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl Token: ",
    experimentalFeatures: "Experimental Features",
    enableUnsafeMode: "Unsafe Mode (Use at your own risk)",
    enableBeautify: "Beautify",
    enableWidescreen: "Widescreen Adaptation",
    rename: "Rename",
    save: "Save",
    reset: "Reset",
    ok: "OK",
    on: "On",
    off: "Off",
    delete: "Delete",
    deleteSucceed: "Deletion successful!",
    isDebug: "Debug Mode",
    downloadType: "Download Type",
    browserDownload: "Browser Download",
    iwaradlDownload: "iwaradl Download",
    autoFollow: "Automatically follow the selected video author",
    autoLike: "Automatically like the selected videos",
    addUnlistedAndPrivate: "Force display unlisted and private videos (requires following the author)",
    parseUnlistedAndPrivate: "Parse recent unlisted and private videos",
    checkDownloadLink: "Check third-party cloud storage download links",
    notOfficialWarning: "Warning: This website is not the official Iwara website. Do not enter any sensitive information!!! Continue browsing this website?",
    checkPriority: "Check download quality",
    autoDownloadMetadata: "Auto-download metadata",
    filterLikedVideos: "Filter liked videos on timeline",
    videoMetadata: "Video Metadata",
    autoInjectCheckbox: "Automatically inject selection box",
    autoCopySaveFileName: "Automatically copy the filename generated by rules",
    configurationIncompatible: "Initialization or configuration file incompatible, please reconfigure!",
    browserDownloadNotEnabled: "Download feature not enabled!",
    browserDownloadNotWhitelisted: "Requested file extension not whitelisted!",
    browserDownloadNotPermitted: "Download feature enabled, but permission not granted!",
    browserDownloadNotSupported: "Current browser/version does not support download functionality!",
    browserDownloadNotSucceeded: "Download did not start or failed!",
    browserDownloadUnknownError: "Unknown error, possibly due to invalid download parameters. Please check if the filename is valid!",
    browserDownloadTimeout: "Download timed out. Please check your network connection!",
    variable: "View available variables",
    iwaradlLink: "→ iwaradl Official Website ←",
    downloadTime: "Download Time ",
    uploadTime: "Upload Time ",
    example: "Example: ",
    result: "Result: ",
    loadingCompleted: "Loading completed",
    settings: "Open Settings",
    downloadThis: "Download current video",
    manualDownload: "Manual Download",
    aria2TaskCheck: "Aria2 Task Restart",
    reverseSelect: "Reverse selection on this page",
    deselectThis: "Deselect on this page",
    deselectAll: "Deselect all",
    selectThis: "Select all on this page",
    selected: "Selected",
    downloadSelected: "Download selected",
    downloadingSelected: "Downloading selected, please wait...",
    injectCheckbox: "Toggle selection box",
    configError: "There is an error in the script configuration. Please modify.",
    alreadyKnowHowToUse: "I already know how to use it!!!",
    notice: [
      "Loading Complete"
    ],
    useHelpForBase: [
      "Please read the usage guide carefully!",
      {
        nodeType: "br"
      },
      "Click the gray sidebar on the webpage to expand the script menu, then click the functions in the menu according to your needs."
    ],
    useHelpForInjectCheckbox: "Open any page with video cards, and the script will inject checkboxes on the video cards. Click the checkbox or hover over the video card and press space to select this video.",
    useHelpForCheckDownloadLink: 'Enabling "%#checkDownloadLink#%" will check the video description and comments before downloading. If third-party cloud storage links are found, a prompt will appear allowing you to visit the video page.',
    useHelpForManualDownload: [
      'To use manual download, provide the video ID. For batch manual download, use "|" to separate video IDs.',
      {
        nodeType: "br"
      },
      "Example: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L"
    ],
    useHelpForBugreport: [
      "To report bugs or usage issues, please visit: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ Click here to restart download ←",
    tryReparseDownload: "→ Click here to reparse ←",
    cdnCacheFinded: "→ Visit MMD Fans Cache Page ←",
    openVideoLink: "→ Visit Video Page ←",
    copySucceed: "Copy succeeded!",
    pushTaskSucceed: "Task pushed successfully!",
    exportConfig: "Export Configuration",
    importConfig: "Import Configuration",
    exportConfigSucceed: "Configuration exported to clipboard!",
    importConfigSucceed: "Configuration imported successfully!",
    importConfigFail: "Configuration import failed!",
    connectionTest: "Connection Test",
    settingsCheck: "Settings Check",
    createTask: "Create Task",
    downloadPathError: "Download path error!",
    browserDownloadModeError: "Please enable the browser API download mode in the script manager!",
    downloadQualityError: "Specified quality download URL not found!",
    findedDownloadLink: "Possible third-party cloud storage link found!",
    allCompleted: "All parsing completed!",
    parsing: "Parsing...",
    following: "Following",
    parsingProgress: "Parsing Progress: ",
    manualDownloadTips: 'For individual downloads, input the video ID here. For batch downloads, separate video IDs with "|". Example: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L',
    externalVideo: "External Video",
    playlistDelete: "Delete Playlist",
    noAvailableVideoSource: "No available video sources",
    videoSourceNotAvailable: "Video source URL unavailable",
    getVideoSourceFailed: "Failed to get video source",
    downloadFailed: "Download failed!",
    downloadThisFailed: "No downloadable video found!",
    pushTaskFailed: "Failed to push download task!",
    parsingFailed: "Failed to parse video information!",
    autoFollowFailed: "Failed to auto-follow the video author!",
    autoLikeFailed: "Failed to auto-like the video!"
  };
  var ja_default = {
    appName: "Iwara バッチダウンロードツール",
    language: "言語: ",
    downloadPriority: "ダウンロード画質: ",
    downloadPath: "ダウンロード先: ",
    downloadProxy: "ダウンロードプロキシ: ",
    downloadProxyUsername: "ダウンロードプロキシユーザー名: ",
    downloadProxyPassword: "ダウンロードプロキシパスワード: ",
    aria2Path: "Aria2 RPC: ",
    aria2Token: "Aria2 トークン: ",
    iwaradlPath: "iwaradl RPC: ",
    iwaradlToken: "iwaradl トークン: ",
    experimentalFeatures: "実験的機能",
    enableUnsafeMode: "アンセーフモード(自己責任で使用)",
    enableBeautify: "美化",
    enableWidescreen: "ワイドスクリーン適応",
    rename: "名前変更",
    save: "保存",
    reset: "リセット",
    ok: "OK",
    on: "オン",
    off: "オフ",
    delete: "削除",
    deleteSucceed: "削除成功!",
    isDebug: "デバッグモード",
    downloadType: "ダウンロード方式",
    browserDownload: "ブラウザダウンロード",
    iwaradlDownload: "iwaradlダウンロード",
    autoFollow: "選択した動画の作者を自動フォロー",
    autoLike: "選択した動画を自動いいね",
    addUnlistedAndPrivate: "非公開・限定公開動画を強制表示(作者のフォローが必要)",
    parseUnlistedAndPrivate: "最近の非公開・限定公開動画を解析",
    checkDownloadLink: "サードパーティクラウドストレージのダウンロードリンクをチェック",
    notOfficialWarning: "警告:このサイトはIwara公式サイトではありません。個人情報を入力しないでください!!! このサイトを閲覧しますか?",
    checkPriority: "ダウンロード画質チェック",
    autoDownloadMetadata: "動画メタデータを自動ダウンロード",
    filterLikedVideos: "タイムライン上のいいね済み動画をフィルタリング",
    videoMetadata: "動画メタデータ",
    autoInjectCheckbox: "選択ボックスを自動注入",
    autoCopySaveFileName: "ルールに基づいて生成されたファイル名を自動コピー",
    configurationIncompatible: "初期化または設定ファイルが互換性がありません。再設定してください!",
    browserDownloadNotEnabled: "ダウンロード機能が有効になっていません!",
    browserDownloadNotWhitelisted: "要求されたファイル拡張子がホワイトリストに登録されていません!",
    browserDownloadNotPermitted: "ダウンロード機能は有効ですが、権限が付与されていません!",
    browserDownloadNotSupported: "現在のブラウザ/バージョンはダウンロード機能をサポートしていません!",
    browserDownloadNotSucceeded: "ダウンロードが開始されなかったか失敗しました!",
    browserDownloadUnknownError: "不明なエラー。ダウンロード時に提供されたパラメータに問題がある可能性があります。ファイル名が有効か確認してください!",
    browserDownloadTimeout: "ダウンロードがタイムアウトしました。ネットワーク環境を確認してください!",
    variable: "→ 利用可能な変数を表示 ←",
    iwaradlLink: "→ iwaradl 公式サイト ←",
    downloadTime: "ダウンロード時間 ",
    uploadTime: "公開時間 ",
    example: "例: ",
    result: "結果: ",
    loadingCompleted: "読み込み完了",
    settings: "設定を開く",
    downloadThis: "現在の動画をダウンロード",
    manualDownload: "手動ダウンロード",
    aria2TaskCheck: "Aria2タスク再起動",
    reverseSelect: "このページで選択を反転",
    deselectThis: "このページの選択を解除",
    deselectAll: "すべての選択を解除",
    selectThis: "このページをすべて選択",
    selected: "選択済み",
    downloadSelected: "選択したものをダウンロード",
    downloadingSelected: "選択したものをダウンロード中、しばらくお待ちください...",
    injectCheckbox: "選択ボックスを切り替え",
    configError: "スクリプト設定にエラーがあります。修正してください。",
    alreadyKnowHowToUse: "使用方法を理解しました!!!(このページは一度だけ表示されます)",
    notice: [
      "読み込み完了"
    ],
    useHelpForBase: [
      "使用ガイドをよくお読みください!",
      {
        nodeType: "br"
      },
      "ウェブページのサイドにある灰色のサイドバーをクリックしてスクリプトメニューを展開し、必要に応じてメニューの機能をクリックしてください。"
    ],
    useHelpForInjectCheckbox: "動画カードがある任意のページを開くと、スクリプトは動画カードにチェックボックスを注入します。チェックボックスをクリックするか、動画カードにマウスをホバーしてスペースキーを押すと、この動画が選択されます。",
    useHelpForCheckDownloadLink: '"%#checkDownloadLink#%"機能を有効にすると、動画をダウンロードする前に動画の説明とコメントをチェックします。サードパーティクラウドストレージのダウンロードリンクが見つかった場合、プロンプトが表示され、動画ページを開くことができます。',
    useHelpForManualDownload: [
      "手動ダウンロード機能を使用するには、動画IDを提供する必要があります。バッチ手動ダウンロードの場合は、「|」で区切った動画IDを提供してください。",
      {
        nodeType: "br"
      },
      "例: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L"
    ],
    useHelpForBugreport: [
      "バグや使用上の問題を報告する場合は、以下にアクセスしてください: ",
      {
        nodeType: "a",
        childs: "Github",
        attributes: {
          href: "https://github.com/dawn-lc/IwaraDownloadTool/"
        }
      }
    ],
    tryRestartingDownload: "→ ここをクリックしてダウンロードを再開 ←",
    tryReparseDownload: "→ ここをクリックして再解析 ←",
    cdnCacheFinded: "→ MMD Fans キャッシュページへ ←",
    openVideoLink: "→ 動画ページへ ←",
    copySucceed: "コピー成功!",
    pushTaskSucceed: "ダウンロードタスクのプッシュ成功!",
    exportConfig: "設定をエクスポート",
    importConfig: "設定をインポート",
    exportConfigSucceed: "設定がクリップボードにエクスポートされました!",
    importConfigSucceed: "設定のインポートが成功しました!",
    importConfigFail: "設定のインポートに失敗しました!",
    connectionTest: "接続テスト",
    settingsCheck: "設定チェック",
    createTask: "タスク作成",
    downloadPathError: "ダウンロードパスエラー!",
    browserDownloadModeError: "スクリプトマネージャーのブラウザAPIダウンロードモードを有効にしてください!",
    downloadQualityError: "指定された画質のダウンロードURLが見つかりません!",
    findedDownloadLink: "サードパーティクラウドストレージのダウンロードリンクを発見!",
    allCompleted: "すべての解析完了!",
    parsing: "解析中...",
    following: "フォロー中",
    parsingProgress: "解析進捗: ",
    manualDownloadTips: "個別ダウンロードはここに動画IDを直接入力してください。バッチダウンロードは「|」で区切った動画IDを提供してください。例: AeGUIRO2D5vQ6F|qQsUMJa19LcK3L",
    externalVideo: "外部動画",
    playlistDelete: "プレイリストを削除",
    noAvailableVideoSource: "利用可能な動画ソースがありません",
    videoSourceNotAvailable: "動画ソースURLが利用できません",
    getVideoSourceFailed: "動画ソースの取得に失敗しました",
    downloadFailed: "ダウンロード失敗!",
    downloadThisFailed: "ダウンロード可能な動画が見つかりません!",
    pushTaskFailed: "ダウンロードタスクのプッシュに失敗!",
    parsingFailed: "動画情報の解析に失敗!",
    autoFollowFailed: "動画作者の自動フォローに失敗!",
    autoLikeFailed: "動画の自動いいねに失敗!"
  };
  var i18nList = {
    zh: zh_cn_default,
    en: en_default,
    ja: ja_default
  };
  var originalFetch = unsafeWindow.fetch;
  var originalHistoryPushState = unsafeWindow.history.pushState;
  var originalHistoryReplaceState = unsafeWindow.history.replaceState;
  var originalNodeAppendChild = unsafeWindow.Node.prototype.appendChild;
  var originalNodeRemoveChild = unsafeWindow.Node.prototype.removeChild;
  var originalElementRemove = unsafeWindow.Element.prototype.remove;
  var originalAddEventListener = unsafeWindow.EventTarget.prototype.addEventListener;
  var originalRemoveEventListener = unsafeWindow.EventTarget.prototype.removeEventListener;
  var originalStorageSetItem = unsafeWindow.Storage.prototype.setItem;
  var originalStorageRemoveItem = unsafeWindow.Storage.prototype.removeItem;
  var originalStorageClear = unsafeWindow.Storage.prototype.clear;
  var originalConsole = {
    log: unsafeWindow.console.log.bind(unsafeWindow.console),
    info: unsafeWindow.console.info.bind(unsafeWindow.console),
    warn: unsafeWindow.console.warn.bind(unsafeWindow.console),
    error: unsafeWindow.console.error.bind(unsafeWindow.console),
    debug: unsafeWindow.console.debug.bind(unsafeWindow.console),
    trace: unsafeWindow.console.trace.bind(unsafeWindow.console),
    dir: unsafeWindow.console.dir.bind(unsafeWindow.console),
    table: unsafeWindow.console.table?.bind(unsafeWindow.console)
  };
  var DownloadType = ((DownloadType2) => {
    DownloadType2[DownloadType2["Aria2"] = 0] = "Aria2";
    DownloadType2[DownloadType2["Iwaradl"] = 1] = "Iwaradl";
    DownloadType2[DownloadType2["Browser"] = 2] = "Browser";
    DownloadType2[DownloadType2["Others"] = 3] = "Others";
    return DownloadType2;
  })(DownloadType || {});
  var PageType = ((PageType2) => {
    PageType2["Video"] = "video";
    PageType2["Image"] = "image";
    PageType2["VideoList"] = "videoList";
    PageType2["ImageList"] = "imageList";
    PageType2["Forum"] = "forum";
    PageType2["ForumSection"] = "forumSection";
    PageType2["ForumThread"] = "forumThread";
    PageType2["Page"] = "page";
    PageType2["Home"] = "home";
    PageType2["Profile"] = "profile";
    PageType2["Subscriptions"] = "subscriptions";
    PageType2["Playlist"] = "playlist";
    PageType2["Favorites"] = "favorites";
    PageType2["Search"] = "search";
    PageType2["Account"] = "account";
    return PageType2;
  })(PageType || {});
  var ToastType = ((ToastType2) => {
    ToastType2[ToastType2["Log"] = 0] = "Log";
    ToastType2[ToastType2["Info"] = 1] = "Info";
    ToastType2[ToastType2["Warn"] = 2] = "Warn";
    ToastType2[ToastType2["Error"] = 3] = "Error";
    return ToastType2;
  })(ToastType || {});
  var MessageType = ((MessageType2) => {
    MessageType2[MessageType2["Close"] = 0] = "Close";
    MessageType2[MessageType2["Request"] = 1] = "Request";
    MessageType2[MessageType2["Receive"] = 2] = "Receive";
    MessageType2[MessageType2["Set"] = 3] = "Set";
    MessageType2[MessageType2["Del"] = 4] = "Del";
    return MessageType2;
  })(MessageType || {});
  var VersionState = ((VersionState2) => {
    VersionState2[VersionState2["Low"] = 0] = "Low";
    VersionState2[VersionState2["Equal"] = 1] = "Equal";
    VersionState2[VersionState2["High"] = 2] = "High";
    return VersionState2;
  })(VersionState || {});
  var DEFAULT_CONFIG = {
    language: "zh",
    autoFollow: false,
    autoLike: false,
    autoCopySaveFileName: false,
    autoDownloadMetadata: false,
    enableUnsafeMode: false,
    enableBeautify: false,
    enableWidescreen: false,
    experimentalFeatures: false,
    autoInjectCheckbox: true,
    checkDownloadLink: false,
    filterLikedVideos: false,
    checkPriority: true,
    addUnlistedAndPrivate: false,
    downloadPriority: "Source",
    downloadType: 3,
    downloadPath: "/Iwara/%#AUTHOR#%/%#TITLE#%[%#ID#%].mp4",
    downloadProxy: "",
    downloadProxyUsername: "",
    downloadProxyPassword: "",
    aria2Path: "http://127.0.0.1:6800/jsonrpc",
    aria2Token: "",
    iwaradlPath: "http://127.0.0.1:23456/api/tasks",
    iwaradlToken: "",
    priority: {
      "Source": 100,
      "540": 99,
      "360": 98,
      "preview": 1
    }
  };
  var Config = class _Config {
    static instance;
    configChange;
    authorization;
    language = DEFAULT_CONFIG.language;
    autoFollow = DEFAULT_CONFIG.autoFollow;
    autoLike = DEFAULT_CONFIG.autoLike;
    autoDownloadMetadata = DEFAULT_CONFIG.autoDownloadMetadata;
    addUnlistedAndPrivate = DEFAULT_CONFIG.addUnlistedAndPrivate;
    enableUnsafeMode = DEFAULT_CONFIG.enableUnsafeMode;
    enableBeautify = DEFAULT_CONFIG.enableBeautify;
    enableWidescreen = DEFAULT_CONFIG.enableWidescreen;
    experimentalFeatures = DEFAULT_CONFIG.experimentalFeatures;
    autoInjectCheckbox = DEFAULT_CONFIG.autoInjectCheckbox;
    autoCopySaveFileName = DEFAULT_CONFIG.autoCopySaveFileName;
    filterLikedVideos = DEFAULT_CONFIG.filterLikedVideos;
    checkDownloadLink = DEFAULT_CONFIG.checkDownloadLink;
    checkPriority = DEFAULT_CONFIG.checkPriority;
    downloadPriority = DEFAULT_CONFIG.downloadPriority;
    downloadType = DEFAULT_CONFIG.downloadType;
    downloadPath = DEFAULT_CONFIG.downloadPath;
    downloadProxy = DEFAULT_CONFIG.downloadProxy;
    downloadProxyUsername = DEFAULT_CONFIG.downloadProxyUsername;
    downloadProxyPassword = DEFAULT_CONFIG.downloadProxyPassword;
    aria2Path = DEFAULT_CONFIG.aria2Path;
    aria2Token = DEFAULT_CONFIG.aria2Token;
    iwaradlPath = DEFAULT_CONFIG.iwaradlPath;
    iwaradlToken = DEFAULT_CONFIG.iwaradlToken;
    priority = DEFAULT_CONFIG.priority;
    constructor(importConfig2) {
      let body = new Proxy(this, {
        get: function(target, property) {
          if (property === "configChange") {
            return target.configChange;
          }
          let value = GM_getValue(property, target[property]);
          if (property === "language") {
            return _Config.getLanguage(value);
          }
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] get: ${property} ${/password/i.test(property) || /token/i.test(property) || /authorization/i.test(property) ? "凭证已隐藏" : stringify(value)}`);
          return value;
        },
        set: function(target, property, value) {
          if (property === "configChange") {
            target.configChange = value;
            return true;
          }
          GM_setValue(property, value);
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] set: ${property} ${/password/i.test(property) || /token/i.test(property) || /authorization/i.test(property) ? "凭证已隐藏" : stringify(value)}`);
          if (!isNullOrUndefined(target.configChange)) target.configChange(property);
          return true;
        }
      });
      for (const key of Object.keys(DEFAULT_CONFIG)) {
        GM_addValueChangeListener(
          key,
          (name, old_value, new_value, remote) => {
            if (remote && !isNullOrUndefined(body.configChange)) body.configChange(name);
          }
        );
      }
      if (!isNullOrUndefined(importConfig2)) {
        Object.assign(body, importConfig2);
      }
      return body;
    }
    static getInstance() {
      if (isNullOrUndefined(_Config.instance)) _Config.instance = new _Config();
      return _Config.instance;
    }
    static destroyInstance() {
      _Config.instance = void 0;
    }
    static initInstance(importConfig2) {
      _Config.instance = new _Config(importConfig2 ?? DEFAULT_CONFIG);
    }
    static getLanguage(value) {
      function formatLanguage(value2) {
        return value2.replace("-", "_").toLowerCase();
      }
      function getMainLanguage(value2) {
        return value2.split("_").shift();
      }
      if (!isNullOrUndefined(GM_getValue("language", void 0))) {
        let custom = formatLanguage(value ?? DEFAULT_CONFIG.language);
        if (!isNullOrUndefined(custom)) {
          if (!isNullOrUndefined(i18nList[custom])) {
            return custom;
          } else {
            let customMain = getMainLanguage(custom);
            if (!isNullOrUndefined(i18nList[customMain])) {
              return customMain;
            }
          }
        }
      }
      let env = formatLanguage(navigator.language ?? navigator.languages[0] ?? DEFAULT_CONFIG.language);
      if (!isNullOrUndefined(i18nList[env])) {
        return env;
      } else {
        let main2 = getMainLanguage(env);
        if (!isNullOrUndefined(i18nList[main2])) {
          return main2;
        }
      }
      return DEFAULT_CONFIG.language;
    }
  };
  var config = Config.getInstance();
  var Path = class {
    fullPath;
    directory;
    fullName;
    type;
    extension;
    baseName;
    constructor(input, validate = true) {
      if (input === "") {
        throw new Error("路径不能为空");
      }
      if (this.isUNC(input)) {
        throw new Error("不接受UNC路径");
      }
      const detectedType = this.detectPathType(input);
      if (validate) this.validatePath(input, detectedType);
      const normalized = this.normalizePath(input, detectedType);
      const directory = this.extractDirectory(normalized, detectedType);
      const fileName = this.extractFileName(normalized, detectedType);
      const { baseName, extension } = this.extractBaseAndExtension(fileName);
      this.type = detectedType;
      this.fullPath = normalized;
      this.directory = directory;
      this.fullName = fileName;
      this.baseName = baseName;
      this.extension = extension;
    }
    isUNC(path) {
      return path.startsWith("\\\\");
    }
    detectPathType(path) {
      if (/^[A-Za-z]:[\\/]/.test(path)) {
        return "Windows";
      }
      if (path.startsWith("/")) {
        return "Unix";
      }
      return "Relative";
    }
    validatePath(path, type) {
      const invalidChars = /[<>:"|?*]/;
      if (type === "Windows") {
        if (!/^[A-Za-z]:[\\/]/.test(path)) {
          throw new Error("无效的Windows路径格式");
        }
        const segments = path.split(/[\\/]/);
        for (let i3 = 1; i3 < segments.length; i3++) {
          let segment = segments[i3];
          let variables = [...segment.matchAll(/%#(.*?)#%/g)].map((match) => {
            let variable = match[1].split(":");
            if (variable.length > 1) {
              if (invalidChars.test(variable[1])) {
                throw new Error(`路径变量格式化参数 "${variable[1]}" 含有非法字符`);
              }
            }
            return match[1];
          });
          for (let index = 0; index < variables.length; index++) {
            const variable = variables[index];
            segment = segment.replaceAll(variable, "");
          }
          if (invalidChars.test(segment)) {
            throw new Error(`路径段 "${segments[i3]}" 含有非法字符`);
          }
        }
      } else if (type === "Unix") {
        if (path.indexOf("\0") !== -1) {
          throw new Error("路径中包含非法空字符");
        }
      } else if (type === "Relative") {
        if (path.indexOf("\0") !== -1) {
          throw new Error("路径中包含非法空字符");
        }
        if (invalidChars.test(path)) {
          throw new Error("路径含有非法字符");
        }
      }
    }
    normalizePath(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      if (type === "Windows") {
        path = path.replace(/\//g, "\\");
        path = path.replace(/\\+/g, "\\");
      } else {
        path = path.replace(/\\/g, "/");
        path = path.replace(/\/+/g, "/");
      }
      let segments;
      if (type === "Windows") {
        segments = path.split("\\");
      } else {
        segments = path.split("/");
      }
      let isAbsolute = false;
      let prefix = "";
      if (type === "Windows") {
        if (/^[A-Za-z]:$/.test(segments[0])) {
          isAbsolute = true;
          prefix = segments[0];
          segments = segments.slice(1);
        }
      } else if (type === "Unix") {
        if (path.startsWith("/")) {
          isAbsolute = true;
          if (segments[0] === "") {
            segments = segments.slice(1);
          }
        }
      } else {
        isAbsolute = false;
      }
      const resolvedSegments = this.resolveSegments(segments, isAbsolute);
      let normalized = "";
      if (type === "Windows") {
        normalized = prefix ? prefix + sep + resolvedSegments.join(sep) : resolvedSegments.join(sep);
        if (prefix && normalized === prefix) {
          normalized += sep;
        }
      } else if (type === "Unix") {
        normalized = (isAbsolute ? sep : "") + resolvedSegments.join(sep);
        if (isAbsolute && normalized === "") {
          normalized = sep;
        }
      } else {
        normalized = resolvedSegments.join(sep);
      }
      return normalized;
    }
    resolveSegments(segments, isAbsolute) {
      const stack = [];
      for (const segment of segments) {
        if (segment === "" || segment === ".") continue;
        if (segment === "..") {
          if (stack.length > 0 && stack[stack.length - 1] !== "..") {
            stack.pop();
          } else {
            if (isAbsolute) {
              throw new Error("绝对路径不能越界");
            } else {
              stack.push("..");
            }
          }
        } else {
          stack.push(segment);
        }
      }
      return stack;
    }
    extractDirectory(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      if (type === "Windows" && /^[A-Za-z]:\\$/.test(path)) {
        return path;
      }
      if (type === "Unix" && path === "/") {
        return path;
      }
      const lastIndex = path.lastIndexOf(sep);
      return lastIndex === -1 ? "" : path.substring(0, lastIndex);
    }
    extractFileName(path, type) {
      const sep = type === "Windows" ? "\\" : "/";
      const lastIndex = path.lastIndexOf(sep);
      return lastIndex === -1 ? path : path.substring(lastIndex + 1);
    }
    extractBaseAndExtension(fileName) {
      const lastDot = fileName.lastIndexOf(".");
      if (lastDot <= 0) {
        return { baseName: fileName, extension: "" };
      }
      const baseName = fileName.substring(0, lastDot);
      const extension = fileName.substring(lastDot + 1);
      return { baseName, extension };
    }
  };
  var Version = class _Version {
    major;
    minor;
    patch;
    preRelease;
    buildMetadata;
    constructor(versionString) {
      if (!versionString || typeof versionString !== "string") {
        throw new Error("Invalid version string");
      }
      const [version, preRelease, buildMetadata] = versionString.split(/[-+]/);
      const versionParts = version.split(".").map(Number);
      if (versionParts.some(isNaN)) {
        throw new Error("Version string contains invalid numbers");
      }
      this.major = versionParts[0] || 0;
      this.minor = versionParts.length > 1 ? versionParts[1] : 0;
      this.patch = versionParts.length > 2 ? versionParts[2] : 0;
      this.preRelease = preRelease ? preRelease.split(".") : [];
      this.buildMetadata = buildMetadata || "";
    }
    static compareValues(a3, b2) {
      if (a3 < b2) return 0;
      if (a3 > b2) return 2;
      return 1;
    }
    compare(other) {
      let state = _Version.compareValues(this.major, other.major);
      if (state !== 1) return state;
      state = _Version.compareValues(this.minor, other.minor);
      if (state !== 1) return state;
      state = _Version.compareValues(this.patch, other.patch);
      if (state !== 1) return state;
      for (let i3 = 0; i3 < Math.max(this.preRelease.length, other.preRelease.length); i3++) {
        const pre1 = this.preRelease[i3] ?? "";
        const pre2 = other.preRelease[i3] ?? "";
        state = _Version.compareValues(
          isNaN(+pre1) ? pre1 : +pre1,
          isNaN(+pre2) ? pre2 : +pre2
        );
        if (state !== 1) return state;
      }
      return 1;
    }
    toString() {
      const version = `${this.major}.${this.minor}.${this.patch}`;
      const preRelease = this.preRelease.length ? `-${this.preRelease.join(".")}` : "";
      const buildMetadata = this.buildMetadata ? `+${this.buildMetadata}` : "";
      return `${version}${preRelease}${buildMetadata}`;
    }
  };
  var Dictionary = class extends Map {
    constructor(data = []) {
      super(data);
    }
    toArray() {
      return Array.from(this);
    }
    keysArray() {
      return Array.from(this.keys());
    }
    valuesArray() {
      return Array.from(this.values());
    }
  };
  var GMSyncDictionary = class _GMSyncDictionary extends Dictionary {
    onSet;
    onDel;
    onSync;
    name;
    listenerId = null;
    static BATCH_THRESHOLD = 10;
    constructor(name, initial = []) {
      let stored = initial.any() ? initial : GM_getValue(name, initial);
      try {
        super(stored.filter(([_, info]) => isVideoInfo(info)));
      } catch (error) {
        super();
      }
      this.name = name;
      this.saveToStorage();
      this.setupValueChangeListener();
    }
    setupValueChangeListener() {
      if (this.listenerId !== null) {
        GM_removeValueChangeListener(this.listenerId);
      }
      this.listenerId = GM_addValueChangeListener(
        this.name,
        (key, oldValue, newValue, remote) => {
          if (key === this.name && remote) {
            this.handleRemoteChange(newValue);
          }
        }
      );
    }
    handleRemoteChange(newValue) {
      if (isNullOrUndefined(newValue)) {
        super.clear();
        this.onSync?.();
        return;
      }
      const currentKeys = new Set(this.keys());
      const addedOrUpdated = [];
      const deleted = [];
      for (const [key, value] of newValue) {
        if (!currentKeys.has(key)) {
          addedOrUpdated.push([key, value]);
        } else {
          const currentValue = this.get(key);
          if (currentValue !== value) {
            addedOrUpdated.push([key, value]);
          }
          currentKeys.delete(key);
        }
      }
      for (const key of currentKeys) {
        deleted.push(key);
      }
      const totalChanges = addedOrUpdated.length + deleted.length;
      if (totalChanges > _GMSyncDictionary.BATCH_THRESHOLD) {
        super.clear();
        for (const [key, value] of newValue) {
          super.set(key, value);
        }
        this.onSync?.();
      } else {
        for (const [key, value] of addedOrUpdated) {
          super.set(key, value);
          this.onSet?.(key, value);
        }
        for (const key of deleted) {
          super.delete(key);
          this.onDel?.(key);
        }
      }
    }
    saveToStorage() {
      GM_setValue(this.name, this.toArray());
    }
    set(key, value) {
      super.set(key, value);
      this.saveToStorage();
      this.onSet?.(key, value);
      return this;
    }
    delete(key) {
      const result = super.delete(key);
      if (result) {
        this.saveToStorage();
        this.onDel?.(key);
      }
      return result;
    }
    clear() {
      super.clear();
      this.saveToStorage();
      this.onSync?.();
    }
    get(key) {
      return super.get(key);
    }
    has(key) {
      return super.has(key);
    }
    get size() {
      return super.size;
    }
    destroy() {
      if (this.listenerId !== null) {
        GM_removeValueChangeListener(this.listenerId);
        this.listenerId = null;
      }
    }
  };
  var SyncDictionary = class extends Dictionary {
    onSet;
    onDel;
    onSync;
    timestamp;
    lifetime;
    id;
    channel;
    constructor(channelName, initial = []) {
      const hasInitial = prune(initial).any();
      super(hasInitial ? initial : void 0);
      this.timestamp = hasInitial ? Date.now() : 0;
      this.lifetime = hasInitial ? performance.now() : 0;
      this.id = UUID();
      this.channel = new BroadcastChannel(channelName);
      this.channel.onmessage = ({ data: msg }) => this.handleMessage(msg);
      this.channel.postMessage({ type: "sync", id: this.id, timestamp: this.timestamp, lifetime: this.lifetime });
    }
    setTimestamp(timestamp) {
      this.timestamp = timestamp ?? Date.now();
      this.lifetime = performance.now();
    }
    set(key, value) {
      this.setTimestamp();
      super.set(key, value);
      this.channel.postMessage({ type: "set", key, value, timestamp: this.timestamp, lifetime: this.lifetime, id: this.id });
      this.onSet?.(key, value);
      return this;
    }
    delete(key) {
      this.setTimestamp();
      const existed = super.delete(key);
      if (existed) {
        this.onDel?.(key);
        this.channel.postMessage({ type: "delete", key, timestamp: this.timestamp, lifetime: this.lifetime, id: this.id });
      }
      return existed;
    }
    clear() {
      this.setTimestamp();
      super.clear();
      this.channel.postMessage({ timestamp: this.timestamp, lifetime: this.lifetime, id: this.id, type: "state", state: super.toArray() });
      this.onSync?.();
    }
    handleMessage(msg) {
      if (msg.id === this.id) return;
      if (msg.type === "sync") {
        this.channel.postMessage({ timestamp: this.timestamp, lifetime: this.lifetime, id: this.id, type: "state", state: super.toArray() });
        return;
      }
      if (msg.timestamp === this.timestamp && msg.lifetime === this.lifetime) return;
      if (msg.timestamp < this.timestamp || msg.lifetime < this.lifetime) return;
      switch (msg.type) {
        case "state": {
          super.clear();
          for (let index = 0; index < msg.state.length; index++) {
            const [key, value] = msg.state[index];
            super.set(key, value);
          }
          this.setTimestamp(msg.timestamp);
          this.onSync?.();
          break;
        }
        case "set": {
          const { key, value } = msg;
          super.set(key, value);
          this.setTimestamp(msg.timestamp);
          this.onSet?.(key, value);
          break;
        }
        case "delete": {
          const { key } = msg;
          if (super.delete(key)) {
            this.setTimestamp(msg.timestamp);
            this.onDel?.(key);
          }
          break;
        }
      }
    }
  };
  var MultiPage = class {
    pageId;
    onLastPage;
    onPageJoin;
    onPageLeave;
    channel;
    beforeUnloadHandler;
    constructor() {
      this.pageId = UUID();
      GM_saveTab({ id: this.pageId });
      this.channel = new BroadcastChannel("page-status-channel");
      this.channel.onmessage = (event) => this.handleMessage(event.data);
      this.channel.postMessage({ type: "join", id: this.pageId });
      this.beforeUnloadHandler = () => {
        this.channel.postMessage({ type: "leave", id: this.pageId });
        originalRemoveEventListener.call(unsafeWindow.document, "beforeunload", this.beforeUnloadHandler);
      };
      originalAddEventListener.call(unsafeWindow.document, "beforeunload", this.beforeUnloadHandler);
    }
    suicide() {
      this.channel.postMessage({ type: "suicide", id: this.pageId });
    }
    handleMessage(message) {
      switch (message.type) {
        case "suicide":
          if (this.pageId !== message.id) unsafeWindow.close();
          break;
        case "join":
          this.onPageJoin?.(message.id);
          break;
        case "leave":
          this.onPageLeave?.(message.id);
          GM_getTabs((tabs) => {
            if (Object.keys(tabs).length > 1) return;
            this.onLastPage?.();
          });
          break;
      }
    }
  };
  var D = (e, n5) => n5.some((t2) => e instanceof t2);
  var w, b;
  function C() {
    return w || (w = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction]);
  }
  function x() {
    return b || (b = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey]);
  }
  var I = new WeakMap(), l = new WeakMap(), f = new WeakMap();
  function V(e) {
    const n5 = new Promise((t2, r2) => {
      const i3 = () => {
        e.removeEventListener("success", c2), e.removeEventListener("error", o);
      }, c2 = () => {
        t2(a(e.result)), i3();
      }, o = () => {
        r2(e.error), i3();
      };
      e.addEventListener("success", c2), e.addEventListener("error", o);
    });
    return f.set(n5, e), n5;
  }
  function S(e) {
    if (I.has(e)) return;
    const n5 = new Promise((t2, r2) => {
      const i3 = () => {
        e.removeEventListener("complete", c2), e.removeEventListener("error", o), e.removeEventListener("abort", o);
      }, c2 = () => {
        t2(), i3();
      }, o = () => {
        r2(e.error || new DOMException("AbortError", "AbortError")), i3();
      };
      e.addEventListener("complete", c2), e.addEventListener("error", o), e.addEventListener("abort", o);
    });
    I.set(e, n5);
  }
  var y = { get(e, n5, t2) {
    if (e instanceof IDBTransaction) {
      if (n5 === "done") return I.get(e);
      if (n5 === "store") return t2.objectStoreNames[1] ? void 0 : t2.objectStore(t2.objectStoreNames[0]);
    }
    return a(e[n5]);
  }, set(e, n5, t2) {
    return e[n5] = t2, true;
  }, has(e, n5) {
    return e instanceof IDBTransaction && (n5 === "done" || n5 === "store") ? true : n5 in e;
  } };
  function E(e) {
    y = e(y);
  }
  function T(e) {
    return x().includes(e) ? function(...n5) {
      return e.apply(h(this), n5), a(this.request);
    } : function(...n5) {
      return a(e.apply(h(this), n5));
    };
  }
  function j(e) {
    return typeof e == "function" ? T(e) : (e instanceof IDBTransaction && S(e), D(e, C()) ? new Proxy(e, y) : e);
  }
  function a(e) {
    if (e instanceof IDBRequest) return V(e);
    if (l.has(e)) return l.get(e);
    const n5 = j(e);
    return n5 !== e && (l.set(e, n5), f.set(n5, e)), n5;
  }
  var h = (e) => f.get(e);
  function A(e, n5, { blocked: t2, upgrade: r2, blocking: i3, terminated: c2 } = {}) {
    const o = indexedDB.open(e, n5), d = a(o);
    return r2 && o.addEventListener("upgradeneeded", (s) => {
      r2(a(o.result), s.oldVersion, s.newVersion, a(o.transaction), s);
    }), t2 && o.addEventListener("blocked", (s) => t2(s.oldVersion, s.newVersion, s)), d.then((s) => {
      c2 && s.addEventListener("close", () => c2()), i3 && s.addEventListener("versionchange", (u3) => i3(u3.oldVersion, u3.newVersion, u3));
    }).catch(() => {
    }), d;
  }
  function O(e, { blocked: n5 } = {}) {
    const t2 = indexedDB.deleteDatabase(e);
    return n5 && t2.addEventListener("blocked", (r2) => n5(r2.oldVersion, r2)), a(t2).then(() => {
    });
  }
  var v = ["get", "getKey", "getAll", "getAllKeys", "count"], W = ["put", "add", "delete", "clear"], m = new Map();
  function M(e, n5) {
    if (!(e instanceof IDBDatabase && !(n5 in e) && typeof n5 == "string")) return;
    if (m.get(n5)) return m.get(n5);
    const t2 = n5.replace(/FromIndex$/, ""), r2 = n5 !== t2, i3 = W.includes(t2);
    if (!(t2 in (r2 ? IDBIndex : IDBObjectStore).prototype) || !(i3 || v.includes(t2))) return;
    const c2 = async function(o, ...d) {
      const s = this.transaction(o, i3 ? "readwrite" : "readonly");
      let u3 = s.store;
      return r2 && (u3 = u3.index(d.shift())), (await Promise.all([u3[t2](...d), i3 && s.done]))[0];
    };
    return m.set(n5, c2), c2;
  }
  E((e) => ({ ...e, get: (n5, t2, r2) => M(n5, t2) || e.get(n5, t2, r2), has: (n5, t2) => !!M(n5, t2) || e.has(n5, t2) }));
  var p = ["continue", "continuePrimaryKey", "advance"], P = {}, B = new WeakMap(), L = new WeakMap(), F = { get(e, n5) {
    if (!p.includes(n5)) return e[n5];
    let t2 = P[n5];
    return t2 || (t2 = P[n5] = function(...r2) {
      B.set(this, L.get(this)[n5](...r2));
    }), t2;
  } };
  async function* k(...e) {
    let n5 = this;
    if (n5 instanceof IDBCursor || (n5 = await n5.openCursor(...e)), !n5) return;
    n5 = n5;
    const t2 = new Proxy(n5, F);
    for (L.set(t2, n5), f.set(t2, h(n5)); n5; ) yield t2, n5 = await (B.get(t2) || n5.continue()), B.delete(t2);
  }
  function g(e, n5) {
    return n5 === Symbol.asyncIterator && D(e, [IDBIndex, IDBObjectStore, IDBCursor]) || n5 === "iterate" && D(e, [IDBIndex, IDBObjectStore]);
  }
  E((e) => ({ ...e, get(n5, t2, r2) {
    return g(n5, t2) ? k : e.get(n5, t2, r2);
  }, has(n5, t2) {
    return g(n5, t2) || e.has(n5, t2);
  } }));
  var Database = class _Database {
    static instance;
    dbPromise;
    constructor() {
      this.dbPromise = A("IwaraDownloadTool", 20, {
        upgrade(db2, oldVersion, newVersion, transaction) {
          if (!db2.objectStoreNames.contains("follows")) {
            const followsStore = db2.createObjectStore("follows", { keyPath: "id" });
            followsStore.createIndex("id", "id", { unique: true });
            followsStore.createIndex("username", "username", { unique: true });
            followsStore.createIndex("name", "name");
            followsStore.createIndex("friend", "friend");
            followsStore.createIndex("following", "following");
            followsStore.createIndex("followedBy", "followedBy");
          }
          if (!db2.objectStoreNames.contains("friends")) {
            const friendsStore = db2.createObjectStore("friends", { keyPath: "id" });
            friendsStore.createIndex("id", "id", { unique: true });
            friendsStore.createIndex("username", "username", { unique: true });
            friendsStore.createIndex("name", "name");
            friendsStore.createIndex("friend", "friend");
            friendsStore.createIndex("following", "following");
            friendsStore.createIndex("followedBy", "followedBy");
          }
          if (!db2.objectStoreNames.contains("videos")) {
            const videosStore = db2.createObjectStore("videos", { keyPath: "ID" });
            videosStore.createIndex("ID", "ID", { unique: true });
            videosStore.createIndex("UploadTime", "UploadTime");
            videosStore.createIndex("Private", "Private");
            videosStore.createIndex("Unlisted", "Unlisted");
            videosStore.createIndex("Type", "Type");
          }
          if (!db2.objectStoreNames.contains("caches")) {
            const cachesStore = db2.createObjectStore("caches", { keyPath: "ID" });
            cachesStore.createIndex("ID", "ID", { unique: true });
          }
        }
      });
    }
    async getDB() {
      return this.dbPromise;
    }
    async follows() {
      const db2 = await this.getDB();
      return db2.transaction("follows", "readwrite").objectStore("follows");
    }
    async friends() {
      const db2 = await this.getDB();
      return db2.transaction("friends", "readwrite").objectStore("friends");
    }
    async videos() {
      const db2 = await this.getDB();
      return db2.transaction("videos", "readwrite").objectStore("videos");
    }
    async caches() {
      const db2 = await this.getDB();
      return db2.transaction("caches", "readwrite").objectStore("caches");
    }
    async getFollows() {
      const store = await this.follows();
      return store.getAll();
    }
    async getFriends() {
      const store = await this.friends();
      return store.getAll();
    }
    async getVideos() {
      const store = await this.videos();
      return store.getAll();
    }
    async getCaches() {
      const store = await this.caches();
      return store.getAll();
    }
    async getFollowByUsername(username) {
      const db2 = await this.getDB();
      const tx = db2.transaction("follows", "readonly");
      const index = tx.store.index("username");
      return index.get(username);
    }
    async getFollowById(id) {
      const db2 = await this.getDB();
      return db2.get("follows", id);
    }
    async getVideoById(id) {
      const db2 = await this.getDB();
      return db2.get("videos", id);
    }
    async getVideosByIds(ids) {
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readonly");
      const store = tx.store;
      const results = [];
      for (const id of ids) {
        const video = await store.get(id);
        if (video) {
          results.push(video);
        }
      }
      return results;
    }
    async putVideo(video) {
      const db2 = await this.getDB();
      await db2.put("videos", video);
    }
    async bulkPutVideos(videos) {
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readwrite");
      const store = tx.store;
      for (const video of videos) {
        await store.put(video);
      }
      await tx.done;
    }
    async putFollow(user) {
      const db2 = await this.getDB();
      await db2.put("follows", user);
    }
    async putFriend(user) {
      const db2 = await this.getDB();
      await db2.put("friends", user);
    }
    async deleteFollow(id) {
      const db2 = await this.getDB();
      await db2.delete("follows", id);
    }
    async deleteFriend(id) {
      const db2 = await this.getDB();
      await db2.delete("friends", id);
    }
    async getFilteredVideos(startTime, endTime) {
      if (isNullOrUndefined(startTime) || isNullOrUndefined(endTime)) return [];
      const db2 = await this.getDB();
      const tx = db2.transaction("videos", "readonly");
      const store = tx.store;
      const index = store.index("UploadTime");
      const allVideos = [];
      let cursor = await index.openCursor(IDBKeyRange.bound(startTime, endTime, true, true));
      while (cursor) {
        const video = cursor.value;
        if ((video.Type === "partial" || video.Type === "full") && (video.Private || video.Unlisted) && !isNullOrUndefined(video.RAW)) {
          allVideos.push(video);
        }
        cursor = await cursor.continue();
      }
      return allVideos;
    }
    static getInstance() {
      if (isNullOrUndefined(_Database.instance)) {
        _Database.instance = new _Database();
      }
      return _Database.instance;
    }
    static destroyInstance() {
      _Database.instance = void 0;
    }
    async delete() {
      const db2 = await this.getDB();
      db2.close();
      await O("IwaraDownloadTool");
    }
  };
  var db = Database.getInstance();
  var import_dayjs = __toESM(require_dayjs_min(), 1);
  Date.prototype.format = function(format) {
    return (0, import_dayjs.default)(this).format(format);
  };
  var unlimitedFetch = async (input, init = {}, options) => {
    const {
      force = false,
      retry = false,
      maxRetries = 3,
      retryDelay = 3e3,
      successStatus = [200, 201],
      failStatuses = [403, 404],
      onFail,
      onRetry
    } = options || {};
    const successStatuses = Array.isArray(successStatus) ? successStatus : [successStatus];
    const failStatusList = Array.isArray(failStatuses) ? failStatuses : [failStatuses];
    const url = typeof input === "string" ? input : input.url;
    const isCrossOrigin = force || new URL(url).hostname !== unsafeWindow.location.hostname;
    const doFetch = async () => {
      if (isCrossOrigin) {
        return new Promise((resolve, reject) => {
          GM_xmlhttpRequest({
            method: init.method,
            url,
            headers: init.headers || {},
            data: init.body || void 0,
            onload: (response) => {
              resolve(new Response(response.responseText, {
                status: response.status,
                statusText: response.statusText
              }));
            },
            onerror: reject
          });
        });
      } else {
        return originalFetch(input, init);
      }
    };
    if (!retry) return doFetch();
    let lastResponse = await doFetch();
    let attempts = 1;
    while (attempts < maxRetries) {
      if (successStatuses.includes(lastResponse.status)) return lastResponse;
      if (failStatusList.includes(lastResponse.status)) break;
      attempts++;
      if (onRetry) await onRetry(lastResponse);
      await delay(retryDelay);
      lastResponse = await doFetch();
    }
    if (onFail) await onFail(lastResponse);
    return lastResponse;
  };
  var findElement = (element, condition) => {
    while (!isNullOrUndefined(element) && !element.matches(condition)) {
      if (isNullOrUndefined(element.parentElement)) return void 0;
      element = element.parentElement;
    }
    return element.querySelectorAll(condition).length > 1 ? void 0 : element;
  };
  var renderNode = (renderCode) => {
    let code = prune(renderCode);
    if (isNullOrUndefined(code)) throw new Error("RenderCode null");
    if (typeof code === "string") {
      return document.createTextNode(code.replaceVariable(i18nList[config.language]));
    }
    if (renderCode instanceof Node) {
      return code;
    }
    if (typeof renderCode !== "object" || !renderCode.nodeType) {
      throw new Error("Invalid arguments");
    }
    const { nodeType, attributes, events, className, childs } = renderCode;
    const node = document.createElement(nodeType);
    if (!isNullOrUndefined(events) && Object.keys(events).length > 0) {
      Object.entries(events).forEach(([eventName, eventHandler]) => originalAddEventListener.call(node, eventName, eventHandler));
    }
    if (!isNullOrUndefined(attributes) && Object.keys(attributes).length > 0) {
      Object.entries(attributes).forEach(([key, value]) => {
        node.setAttribute(key, value);
        node[key] = value;
      });
    }
    if (!isNullOrUndefined(className) && className.length > 0) {
      node.classList.add(...typeof className === "string" ? [className] : className);
    }
    if (!isNullOrUndefined(childs)) {
      node.append(...(isArray(childs) ? childs : [childs]).filter((child) => !isNullOrUndefined(child)).map(renderNode));
    }
    return node;
  };
  var activeToasts = new Dictionary();
  var toastTimeouts = new Map();
  var toastIntervals = new Map();
  var toastContainers = new Map();
  var offscreenContainer = document.createElement("div");
  offscreenContainer.classList.add("offscreen-container");
  var getContainer = (gravity, position) => {
    const containerId = `toast-container-${gravity}-${position}`;
    if (!toastContainers.has(containerId)) {
      const container = document.createElement("div");
      container.id = containerId;
      container.classList.add(
        "toast-container",
        `toast-${gravity}`,
        `toast-${position}`
      );
      document.body.appendChild(container);
      toastContainers.set(containerId, container);
    }
    return toastContainers.get(containerId);
  };
  var addTimeout = (toast, callback) => {
    if (isNullOrUndefined(toast.options.duration)) return;
    delTimeout(toast);
    const duration = toast.options.duration;
    const timeoutId = window.setTimeout(() => {
      callback();
      delTimeout(toast);
    }, duration);
    toastTimeouts.set(toast, timeoutId);
    if (!toast.showProgress) return;
    if (isNullOrUndefined(toast.progress)) return;
    const startTime = Date.now();
    const updateRemainingTime = () => {
      if (isNullOrUndefined(toast.progress)) return;
      const elapsed = Date.now() - startTime;
      const remaining = Math.max(0, duration - elapsed);
      toast.progress.style.setProperty("--toast-progress", `${remaining / duration}`);
    };
    toast.progress.style.setProperty("--toast-progress", `1`);
    const intervalId = window.setInterval(updateRemainingTime, 20);
    toastIntervals.set(toast, intervalId);
  };
  var delTimeout = (toast) => {
    const timeoutId = toastTimeouts.get(toast);
    if (!isNullOrUndefined(timeoutId)) {
      clearTimeout(timeoutId);
      toastTimeouts.delete(toast);
    }
    if (!toast.showProgress) return;
    const intervalId = toastIntervals.get(toast);
    if (!isNullOrUndefined(intervalId)) {
      clearInterval(intervalId);
      toastIntervals.delete(toast);
    }
    if (!isNullOrUndefined(toast.progress)) {
      toast.progress.style.removeProperty("--toast-progress");
    }
  };
  var Toast = class _Toast {
    static defaults = {
      id: UUID(),
      gravity: "top",
      position: "left",
      stopOnFocus: true,
      oldestFirst: true,
      showProgress: false
    };
    id;
    options;
    root;
    element;
    gravity;
    position;
    oldestFirst;
    stopOnFocus;
    showProgress;
    content;
    progress;
    mouseOverHandler;
    mouseLeaveHandler;
    closeButtonHandler;
    animationEndHandler;
    clickHandler;
    closeButton;
    constructor(options) {
      this.options = {
        ..._Toast.defaults,
        ...options
      };
      this.id = this.options.id;
      this.root = getContainer(this.options.gravity, this.options.position);
      this.gravity = this.options.gravity;
      this.position = this.options.position;
      this.stopOnFocus = this.options.stopOnFocus;
      this.oldestFirst = this.options.oldestFirst;
      this.showProgress = this.options.showProgress;
      this.element = document.createElement("div");
      this.applyBaseStyles().addCloseButton().createContent().ensureCloseMethod().bindEvents();
      activeToasts.set(this.id, this);
    }
    applyBaseStyles() {
      this.element.classList.add("toast");
      if (this.options.className) {
        const classes = Array.isArray(this.options.className) ? this.options.className : [this.options.className];
        classes.forEach((cls) => this.element.classList.add(cls));
      }
      return this;
    }
    createContent() {
      this.content = document.createElement("div");
      this.content.classList.add("toast-content");
      if (this.options.text) {
        this.content.textContent = this.options.text;
      }
      if (this.options.node) {
        this.content.appendChild(this.options.node);
      }
      if (this.options.style) {
        this.applyStyles(this.content, this.options.style);
      }
      if (this.options.showProgress) {
        this.progress = document.createElement("div");
        this.progress.classList.add("toast-progress");
        this.content.appendChild(this.progress);
      }
      this.element.appendChild(this.content);
      return this;
    }
    addCloseButton() {
      if (this.options.close) {
        this.closeButton = document.createElement("span");
        this.closeButton.className = "toast-close";
        this.closeButton.textContent = "🗙";
        this.closeButtonHandler = () => this.hide("close-button");
        this.closeButton.addEventListener("click", this.closeButtonHandler);
        this.element.appendChild(this.closeButton);
      }
      return this;
    }
    setToastRect() {
      if (!this.element.classList.contains("show")) offscreenContainer.appendChild(this.element);
      this.element.style.removeProperty("--toast-height");
      this.element.style.removeProperty("--toast-width");
      this.element.style.setProperty("max-height", "none", "important");
      this.element.style.setProperty("max-width", `${this.root.getBoundingClientRect().width}px`, "important");
      const { height, width } = this.element.getBoundingClientRect();
      this.element.style.setProperty("--toast-height", `${height}px`);
      this.element.style.setProperty("--toast-width", `${width}px`);
      this.element.style.removeProperty("max-height");
      this.element.style.removeProperty("max-width");
      if (!this.element.classList.contains("show")) offscreenContainer.removeChild(this.element);
      return this;
    }
    ensureCloseMethod() {
      if (isNullOrUndefined(this.options.duration) && isNullOrUndefined(this.options.close) && isNullOrUndefined(this.options.onClick)) {
        this.options.onClick = () => this.hide("other");
      }
      return this;
    }
    bindEvents() {
      if (this.stopOnFocus && !isNullOrUndefined(this.options.duration) && this.options.duration > 0) {
        this.mouseOverHandler = () => delTimeout(this);
        this.mouseLeaveHandler = () => addTimeout(this, () => this.hide("timeout"));
        this.element.addEventListener("mouseover", this.mouseOverHandler);
        this.element.addEventListener("mouseleave", this.mouseLeaveHandler);
      }
      if (!isNullOrUndefined(this.options.onClick)) {
        this.clickHandler = this.options.onClick.bind(this);
        this.element.addEventListener("click", this.clickHandler);
      }
      return this;
    }
    applyStyles(element, styles) {
      function camelToKebab(str) {
        return str.replace(/([A-Z])/g, "-$1").toLowerCase();
      }
      for (const key in styles) {
        const value = styles[key];
        const property = camelToKebab(key);
        if (isNullOrUndefined(value)) {
          element.style.removeProperty(property);
          continue;
        }
        const important = value.includes("!important");
        const cleanValue = value.replace(/\s*!important\s*/, "").trim();
        element.style.setProperty(property, cleanValue, important ? "important" : "");
      }
    }
    toggleAnimationState(animation) {
      if (!this.element.classList.replace(animation ? "hide" : "show", animation ? "show" : "hide")) {
        this.element.classList.add(animation ? "show" : "hide");
      }
      return this;
    }
    insertToastElement() {
      if (this.oldestFirst) {
        this.root.insertBefore(this.element, this.root.firstChild);
      } else {
        if (this.root.lastChild) {
          this.root.insertBefore(this.element, this.root.lastChild.nextSibling);
        } else {
          this.root.appendChild(this.element);
        }
      }
      return this;
    }
    setupAutoHide() {
      if (!isNullOrUndefined(this.options.duration) && this.options.duration > 0) {
        addTimeout(this, () => this.hide("timeout"));
      }
      return this;
    }
    show() {
      this.setToastRect().insertToastElement().toggleAnimationState(true).setupAutoHide();
      return this;
    }
    showToast() {
      return this.show();
    }
    removeEventListeners() {
      if (this.mouseOverHandler) {
        this.element.removeEventListener("mouseover", this.mouseOverHandler);
      }
      if (this.mouseLeaveHandler) {
        this.element.removeEventListener("mouseleave", this.mouseLeaveHandler);
      }
      if (this.clickHandler) {
        this.element.removeEventListener("click", this.clickHandler);
      }
      if (this.options.close && this.closeButton && this.closeButtonHandler) {
        this.closeButton.removeEventListener("click", this.closeButtonHandler);
      }
      return this;
    }
    hide(reason = "other") {
      if (!this.element) return;
      delTimeout(this);
      activeToasts.delete(this.id);
      this.animationEndHandler = (e) => {
        if (e.animationName.startsWith("toast-out")) {
          this.element.removeEventListener("animationend", this.animationEndHandler);
          this.element.remove();
          this.options.onClose?.call(this, new CustomEvent("toast-close", {
            detail: { reason }
          }));
        }
      };
      this.element.addEventListener("animationend", this.animationEndHandler);
      this.removeEventListeners().toggleAnimationState(false);
    }
    hideToast() {
      this.hide("other");
    }
  };
  function createToast(options) {
    return new Toast(options);
  }
  globalThis.Toast = createToast;
  globalThis.Toastify = createToast;
  (document.body ?? document.documentElement).appendChild(offscreenContainer);
  window.addEventListener("resize", debounce(() => {
    for (const [_, toast] of activeToasts) {
      toast.setToastRect();
    }
  }, 100));
  async function refreshToken() {
    const { authorization } = config;
    if (!isLoggedIn()) throw new Error(`Refresh token failed: Not logged in`);
    const refreshToken2 = localStorage.getItem("token") ?? authorization;
    if (isNullOrUndefined(refreshToken2) || refreshToken2.isEmpty()) {
      throw new Error(`Refresh token failed: no refresh token`);
    }
    const oldAccessToken = localStorage.getItem("accessToken");
    try {
      const res = await unlimitedFetch(
        `https://${apiEndpoint}/user/token`,
        {
          method: "POST",
          headers: {
            Authorization: `Bearer ${refreshToken2}`
          }
        }
      );
      if (!res.ok) {
        throw new Error(`Refresh token failed with status: ${res.status}`);
      }
      const { accessToken } = await res.json();
      if (!accessToken) {
        throw new Error(`No access token in response`);
      }
      if (!oldAccessToken || oldAccessToken !== accessToken) {
        localStorage.setItem("accessToken", accessToken);
      }
      return accessToken;
    } catch (error) {
      originalConsole.warn("Failed to refresh token:", error);
      if (!oldAccessToken?.trim()) {
        throw new Error(`Refresh token failed and no valid access token available`);
      }
      return oldAccessToken;
    }
  }
  async function getAuth(url) {
    return prune({
      "Referer": `${window.location.origin}/`,
      "Accept": "application/json",
      "Cooike": unsafeWindow.document.cookie,
      "Authorization": isLoggedIn() ? `Bearer ${localStorage.getItem("accessToken") ?? await refreshToken()}` : void 0,
      "X-Version": !isNullOrUndefined(url) && !url.isEmpty() ? await getXVersion(url) : void 0,
      "X-Site": unsafeWindow.location.hostname
    });
  }
  function checkIsHaveDownloadLink(comment) {
    if (!config.checkDownloadLink || isNullOrUndefined(comment) || comment.isEmpty()) {
      return false;
    }
    return [
      "iwara.zip",
      "pan.baidu",
      "/s/",
      "mega.nz",
      "drive.google.com",
      "aliyundrive",
      "uploadgig",
      "katfile",
      "storex",
      "subyshare",
      "rapidgator",
      "filebe",
      "filespace",
      "mexa.sh",
      "mexashare",
      "mx-sh.net",
      "icerbox",
      "alfafile",
      "1drv.ms",
      "onedrive.",
      "gofile.io",
      "workupload.com",
      "pixeldrain.",
      "dailyuploads.net",
      "katfile.com",
      "fikper.com",
      "frdl.io",
      "rg.to",
      "gigafile.nu",
      "mediafire.com"
    ].filter((i3) => comment.toLowerCase().includes(i3)).any();
  }
  function toastNode(body, title) {
    return renderNode({
      nodeType: "div",
      childs: [
        !isNullOrUndefined(title) && !title.isEmpty() ? {
          nodeType: "h3",
          childs: `%#appName#% - ${title}`
        } : {
          nodeType: "h3",
          childs: "%#appName#%"
        },
        {
          nodeType: "p",
          childs: body
        }
      ]
    });
  }
  function getTextNode(node) {
    return node.nodeType === Node.TEXT_NODE ? node.textContent || "" : node.nodeType === Node.ELEMENT_NODE ? Array.from(node.childNodes).map(getTextNode).join("") : "";
  }
  function newToast(type, params) {
    const logFunc = {
      [2]: originalConsole.warn,
      [3]: originalConsole.error,
      [0]: originalConsole.log,
      [1]: originalConsole.info
    }[type] || originalConsole.log;
    if (isNullOrUndefined(params)) params = {};
    if (!isNullOrUndefined(params.id) && activeToasts.has(params.id)) activeToasts.get(params.id)?.hide();
    switch (type) {
      case 1:
        params = Object.assign({
          duration: 2e3,
          style: {
            background: "linear-gradient(-30deg, rgb(0, 108, 215), rgb(0, 180, 255))"
          }
        }, params);
      case 2:
        params = Object.assign({
          duration: -1,
          style: {
            background: "linear-gradient(-30deg, rgb(119, 76, 0), rgb(255, 165, 0))"
          }
        }, params);
        break;
      case 3:
        params = Object.assign({
          duration: -1,
          style: {
            background: "linear-gradient(-30deg, rgb(108, 0, 0), rgb(215, 0, 0))"
          }
        }, params);
      default:
        break;
    }
    if (!isNullOrUndefined(params.text)) {
      params.text = params.text.replaceVariable(i18nList[config.language]).toString();
    }
    logFunc((!isNullOrUndefined(params.text) ? params.text : !isNullOrUndefined(params.node) ? getTextNode(params.node) : "undefined").replaceVariable(i18nList[config.language]));
    return new Toast(params);
  }
  function getDownloadPath(videoInfo) {
    return analyzeLocalPath(
      config.downloadPath.trim().replaceVariable({
        NowTime: new Date(),
        UploadTime: new Date(videoInfo.UploadTime),
        AUTHOR: videoInfo.Author,
        ID: videoInfo.ID,
        TITLE: videoInfo.Title.normalize("NFKC").replaceEmojis("_").replaceAll(new RegExp("(\\P{Mark})(\\p{Mark}+)", "gu"), "_").replace(/^\.|[\\\\/:*?\"<>|]/img, "_").truncate(72),
        ALIAS: videoInfo.Alias.normalize("NFKC").replaceAll(new RegExp("(\\P{Mark})(\\p{Mark}+)", "gu"), "_").replace(/^\.|[\\\\/:*?\"<>|]/img, "_").truncate(64),
        QUALITY: videoInfo.DownloadQuality
      })
    );
  }
  function analyzeLocalPath(path) {
    try {
      return new Path(path);
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#downloadPathError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      throw new Error(`%#downloadPathError#% ["${path}"]`);
    }
  }
  async function EnvCheck() {
    try {
      if (GM_info.scriptHandler !== "ScriptCat" && GM_info.downloadMode !== "browser") {
        GM_getValue("isDebug") && originalConsole.debug("[Debug]", GM_info);
        throw new Error("%#browserDownloadModeError#%");
      }
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#configError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function localPathCheck() {
    try {
      let pathTest = analyzeLocalPath(config.downloadPath.replaceVariable({
        NowTime: new Date(),
        UploadTime: new Date(),
        AUTHOR: "test",
        ID: "test",
        TITLE: "test",
        ALIAS: "test",
        QUALITY: "test"
      }));
      if (isNullOrUndefined(pathTest)) throw "analyzeLocalPath error";
      if (pathTest.fullPath.isEmpty()) throw "analyzeLocalPath isEmpty";
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `%#downloadPathError#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function aria2Check() {
    try {
      let res = await (await unlimitedFetch(config.aria2Path, {
        method: "POST",
        headers: {
          "accept": "application/json",
          "content-type": "application/json"
        },
        body: JSON.stringify({
          "jsonrpc": "2.0",
          "method": "aria2.tellActive",
          "id": UUID(),
          "params": ["token:" + config.aria2Token]
        })
      })).json();
      if (res.error) {
        throw new Error(res.error.message);
      }
    } catch (error) {
      let toast = newToast(
        3,
        {
          node: toastNode([
            `Aria2 RPC %#connectionTest#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            toast.hide();
          }
        }
      );
      toast.show();
      return false;
    }
    return true;
  }
  async function iwaradlCheck() {
    try {
      let res = await (await unlimitedFetch(config.iwaradlPath, {
        method: "GET",
        headers: {
          "accept": "application/json",
          "content-type": "application/json",
          "authorization": `Bearer ${config.iwaradlToken}`
        }
      })).json();
      if (!isArray(res)) {
        throw new Error(`后端未启动或无响应`);
      }
    } catch (error) {
      newToast(
        3,
        {
          node: toastNode([
            `iwaradl RPC %#connectionTest#%`,
            { nodeType: "br" },
            stringify(error)
          ], "%#settingsCheck#%"),
          position: "center",
          onClick() {
            this.hide();
          }
        }
      ).show();
      return false;
    }
    return true;
  }
  function aria2Download(videoInfo) {
    (async function(videoInfo2) {
      let localPath = getDownloadPath(videoInfo2);
      let downloadUrl = videoInfo2.DownloadUrl.toURL();
      downloadUrl.searchParams.set("videoid", videoInfo2.ID);
      downloadUrl.searchParams.set("download", localPath.fullName);
      let params = [
        [downloadUrl.href],
        prune({
          "all-proxy": config.downloadProxy,
          "all-proxy-passwd": !config.downloadProxy.isEmpty() ? config.downloadProxyPassword : void 0,
          "all-proxy-user": !config.downloadProxy.isEmpty() ? config.downloadProxyUsername : void 0,
          "out": localPath.fullName,
          "dir": localPath.directory,
          "referer": window.location.hostname,
          "header": [
            "Cookie:" + unsafeWindow.document.cookie
          ]
        })
      ];
      let res = await aria2API("aria2.addUri", params);
      originalConsole.log(`Aria2 ${videoInfo2.Title} ${JSON.stringify(res)}`);
      newToast(
        1,
        {
          gravity: "bottom",
          node: toastNode(`${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskSucceed#%`)
        }
      ).show();
    })(videoInfo);
  }
  function iwaradlDownload(videoInfo) {
    (async function(videoInfo2) {
      try {
        let proxyURL;
        if (!config.downloadProxy.isEmpty()) {
          proxyURL = new URL(config.downloadProxy);
          proxyURL.username = config.downloadProxyUsername;
          proxyURL.password = config.downloadProxyPassword;
        }
        let downloadPathTemplate = new Path(config.downloadPath, false);
        let response = await unlimitedFetch(config.iwaradlPath, {
          method: "POST",
          headers: {
            "accept": "application/json",
            "content-type": "application/json",
            "authorization": `Bearer ${config.iwaradlToken}`
          },
          body: JSON.stringify(prune({
            "urls": [`https://www.${domain}/video/${videoInfo2.ID}`],
            "options": {
              "proxy_url": proxyURL ? proxyURL.href : void 0,
              "cookies": unsafeWindow.document.cookie,
              "download_dir": downloadPathTemplate.directory,
              "filename_template": downloadPathTemplate.fullName
            }
          }))
        });
        if (response.ok) {
          originalConsole.log(`${videoInfo2.Title} %#pushTaskSucceed#%`);
          newToast(
            1,
            {
              node: toastNode(`${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskSucceed#%`)
            }
          ).show();
        }
      } catch (error) {
        newToast(
          3,
          {
            node: toastNode([
              `${videoInfo2.Title}[${videoInfo2.ID}] %#pushTaskFailed#% `,
              { nodeType: "br" },
              stringify(error)
            ], "%#iwaradlDownload#%"),
            onClick() {
              this.hide();
            }
          }
        ).show();
      }
    })(videoInfo);
  }
  function othersDownload(videoInfo) {
    (async function(DownloadUrl) {
      DownloadUrl.searchParams.set("download", getDownloadPath(videoInfo).fullName);
      GM_openInTab(DownloadUrl.href, { active: false, insert: true, setParent: true });
    })(videoInfo.DownloadUrl.toURL());
  }
  function browserDownloadErrorParse(error) {
    let errorInfo = stringify(error);
    if (!(error instanceof Error)) {
      errorInfo = {
        "not_enabled": `%#browserDownloadNotEnabled#%`,
        "not_whitelisted": `%#browserDownloadNotWhitelisted#%`,
        "not_permitted": `%#browserDownloadNotPermitted#%`,
        "not_supported": `%#browserDownloadNotSupported#%`,
        "not_succeeded": `%#browserDownloadNotSucceeded#% ${isNullOrUndefined(error.details) ? "UnknownError" : error.details}`
      }[error.error] || `%#browserDownloadUnknownError#%`;
    }
    return errorInfo;
  }
  function browserDownload(videoInfo) {
    (async function(videoInfo2) {
      function toastError(error) {
        let toast = newToast(
          3,
          {
            node: toastNode([
              `${videoInfo2.Title}[${videoInfo2.ID}] %#downloadFailed#%`,
              { nodeType: "br" },
              browserDownloadErrorParse(error),
              { nodeType: "br" },
              `%#tryRestartingDownload#%`
            ], "%#browserDownload#%"),
            async onClick() {
              toast.hide();
              await pushDownloadTask(videoInfo2);
            }
          }
        );
        toast.show();
      }
      GM_download({
        url: videoInfo2.DownloadUrl,
        saveAs: false,
        name: getDownloadPath(videoInfo2).fullPath,
        onerror: (err) => toastError(err),
        ontimeout: () => toastError(new Error("%#browserDownloadTimeout#%"))
      });
    })(videoInfo);
  }
  async function aria2API(method, params) {
    return await (await unlimitedFetch(config.aria2Path, {
      headers: {
        "accept": "application/json",
        "content-type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        method,
        id: UUID(),
        params: [`token:${config.aria2Token}`, ...params]
      }),
      method: "POST"
    })).json();
  }
  function aria2TaskExtractVideoID(task) {
    try {
      if (isNullOrUndefined(task.files) || task.files.length !== 1) return;
      const file = task.files[0];
      if (isNullOrUndefined(file)) return;
      if (file.uris.length < 1) return;
      let downloadUrl = file.uris[0].uri.toURL();
      if (isNullOrUndefined(downloadUrl)) return;
      let videoID;
      if (downloadUrl.searchParams.has("videoid")) videoID = downloadUrl.searchParams.get("videoid");
      if (!isNullOrUndefined(videoID) && !videoID.isEmpty()) return videoID;
      if (isNullOrUndefined(file.path) || file.path.isEmpty()) return;
      let path = analyzeLocalPath(file.path);
      if (isNullOrUndefined(path.fullName) || path.fullName.isEmpty()) return;
      videoID = path.fullName.toLowerCase().among("[", "].mp4", false, true);
      if (videoID.isEmpty()) return;
      return videoID;
    } catch (error) {
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] check aria2 task file fail! ${stringify(task)}`);
      return;
    }
  }
  async function aria2TaskCheckAndRestart() {
    let stoped = prune(
      (await aria2API(
        "aria2.tellStopped",
        [
          0,
          4096,
          [
            "gid",
            "status",
            "files",
            "errorCode",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let active = prune(
      (await aria2API(
        "aria2.tellActive",
        [
          [
            "gid",
            "status",
            "files",
            "downloadSpeed",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let downloadNormalTasks = active.filter(
      (task) => isConvertibleToNumber(task.data.downloadSpeed) && Number(task.data.downloadSpeed) >= 512
    ).unique("id");
    let downloadCompleted = stoped.filter(
      (task) => task.data.status === "complete" || task.data.errorCode === "13"
    ).unique("id");
    let downloadUncompleted = stoped.difference(downloadCompleted, "id").difference(downloadNormalTasks, "id");
    let downloadToSlowTasks = active.filter(
      (task) => isConvertibleToNumber(task.data.downloadSpeed) && Number(task.data.downloadSpeed) <= 512
    ).unique("id");
    let needRestart = downloadUncompleted.union(downloadToSlowTasks, "id");
    if (needRestart.length !== 0) {
      newToast(
        2,
        {
          id: "aria2TaskCheckAndRestart",
          node: toastNode(
            [
              `发现 ${needRestart.length} 个需要重启的下载任务!`,
              { nodeType: "br" },
              "%#tryRestartingDownload#%"
            ],
            "%#aria2TaskCheck#%"
          ),
          async onClick() {
            this.hide();
            for (let i3 = 0; i3 < needRestart.length; i3++) {
              const task = needRestart[i3];
              await pushDownloadTask(await parseVideoInfo({
                Type: "init",
                ID: task.id
              }), true);
              let activeTasks = active.filter(
                (activeTask) => activeTask.id === task.id
              );
              for (let t2 = 0; t2 < activeTasks.length; t2++) {
                const element = activeTasks[t2];
                await aria2API("aria2.forceRemove", [element.data.gid]);
              }
            }
          }
        }
      ).show();
    } else {
      newToast(1, {
        id: "aria2TaskCheckAndRestart",
        duration: 1e4,
        node: toastNode(
          `未发现需要重启的下载任务!`
        )
      }).show();
    }
  }
  function getPlayload(authorization) {
    return JSON.parse(decodeURIComponent(encodeURIComponent(window.atob(authorization.split(" ").pop().split(".")[1]))));
  }
  async function check() {
    if (await localPathCheck()) {
      switch (config.downloadType) {
        case 0:
          return await aria2Check();
        case 1:
          return await iwaradlCheck();
        case 2:
          return await EnvCheck();
        default:
          break;
      }
      return true;
    } else {
      return false;
    }
  }
  async function getXVersion(urlString) {
    let url = urlString.toURL();
    const data = new TextEncoder().encode([url.pathname.split("/").pop(), url.searchParams.get("expires"), "mSvL05GfEmeEmsEYfGCnVpEjYgTJraJN"].join("_"));
    const hashBuffer = await crypto.subtle.digest("SHA-1", data);
    return Array.from(new Uint8Array(hashBuffer)).map((b2) => b2.toString(16).padStart(2, "0")).join("");
  }
  async function getCommentData(id, commentID, page = 0) {
    return await (await unlimitedFetch(`https://${apiEndpoint}/video/${id}/comments?page=${page}${!isNullOrUndefined(commentID) && !commentID.isEmpty() ? "&parent=" + commentID : ""}`, { headers: await getAuth() })).json();
  }
  async function getCommentDatas(id, commentID) {
    let comments = [];
    let base = await getCommentData(id, commentID);
    comments.push(...base.results);
    for (let page = 1; page < Math.ceil(base.count / base.limit); page++) {
      comments.push(...(await getCommentData(id, commentID, page)).results);
    }
    let replies = [];
    for (let index = 0; index < comments.length; index++) {
      const comment = comments[index];
      if (comment.numReplies > 0) {
        replies.push(...await getCommentDatas(id, comment.id));
      }
    }
    comments.push(...replies);
    return comments;
  }
  async function parseVideoInfo(info) {
    let ID = info.ID;
    let Type = info.Type;
    let RAW = info.RAW;
    try {
      switch (info.Type) {
        case "cache":
          RAW = info.RAW;
          ID = RAW.id;
          Type = "partial";
          break;
        case "init":
        case "fail":
        case "partial":
        case "full":
          GM_getValue("isDebug") && originalConsole.debug(`[debug] try parse full source`);
          let sourceResult = await (await unlimitedFetch(
            `https://${apiEndpoint}/video/${info.ID}`,
            {
              headers: await getAuth()
            },
            {
              retry: true,
              maxRetries: 3,
              failStatuses: [403, 404],
              retryDelay: 1e3,
              onRetry: async () => {
                await refreshToken();
              },
              onFail: async (response) => {
                GM_getValue("isDebug") && originalConsole.debug("[Debug]", `${response.url} Fail, response: ${await response.clone().text()}`);
              }
            }
          )).json();
          if (isNullOrUndefined(sourceResult.id)) {
            Type = "fail";
            return {
              ID,
              Type,
              RAW,
              Msg: sourceResult.message ?? stringify(sourceResult)
            };
          }
          RAW = sourceResult;
          ID = RAW.id;
          Type = "full";
          break;
        default:
          Type = "fail";
          return {
            ID,
            Type,
            RAW,
            Msg: "Unknown type"
          };
      }
    } catch (error) {
      newToast(
        3,
        {
          node: toastNode([
            `${info.RAW?.title}[${ID}] %#parsingFailed#%`
          ], "%#createTask#%"),
          async onClick() {
            await parseVideoInfo({ Type: "init", ID, RAW, UploadTime: 0 });
            this.hide();
          }
        }
      ).show();
      Type = "fail";
      return {
        ID,
        Type,
        RAW,
        Msg: stringify(error)
      };
    }
    let FileName;
    let Size;
    let External;
    let ExternalUrl;
    let Description;
    let DownloadQuality;
    let DownloadUrl;
    let Comments;
    let UploadTime;
    let Title;
    let Tags;
    let Liked;
    let Alias;
    let Author;
    let AuthorID;
    let Private;
    let Unlisted;
    let Following;
    let Friend;
    UploadTime = new Date(RAW.createdAt ?? 0).getTime();
    Title = RAW.title;
    Tags = RAW.tags;
    Liked = RAW.liked;
    Alias = RAW.user.name;
    Author = RAW.user.username;
    AuthorID = RAW.user.id;
    Private = RAW.private;
    Unlisted = RAW.unlisted;
    External = !isNullOrUndefined(RAW.embedUrl) && !RAW.embedUrl.isEmpty();
    ExternalUrl = RAW.embedUrl;
    if (External) {
      Type = "fail";
      return {
        Type,
        RAW,
        ID,
        Alias,
        Author,
        AuthorID,
        Private,
        UploadTime,
        Title,
        Tags,
        Liked,
        External,
        ExternalUrl,
        Description,
        Unlisted,
        Msg: "external Video"
      };
    }
    try {
      switch (Type) {
        case "full":
          Following = RAW.user.following;
          Friend = RAW.user.friend;
          if (Following) {
            await db.putFollow(RAW.user);
          } else {
            await db.deleteFollow(AuthorID);
          }
          if (Friend) {
            await db.putFriend(RAW.user);
          } else {
            await db.deleteFriend(AuthorID);
          }
          Description = RAW.body;
          FileName = RAW.file.name;
          Size = RAW.file.size;
          let VideoFileSource = (await (await unlimitedFetch(RAW.fileUrl, { headers: await getAuth(RAW.fileUrl) })).json()).sort((a3, b2) => (!isNullOrUndefined(config.priority[b2.name]) ? config.priority[b2.name] : 0) - (!isNullOrUndefined(config.priority[a3.name]) ? config.priority[a3.name] : 0));
          if (isNullOrUndefined(VideoFileSource) || !(VideoFileSource instanceof Array) || VideoFileSource.length < 1) throw new Error(i18nList[config.language].getVideoSourceFailed.toString());
          DownloadQuality = config.checkPriority ? config.downloadPriority : VideoFileSource[0].name;
          let fileList = VideoFileSource.filter((x2) => x2.name === DownloadQuality);
          if (!fileList.any()) throw new Error(i18nList[config.language].noAvailableVideoSource.toString());
          let Source = fileList[Math.floor(Math.random() * fileList.length)].src.download;
          if (isNullOrUndefined(Source) || Source.isEmpty()) throw new Error(i18nList[config.language].videoSourceNotAvailable.toString());
          DownloadUrl = decodeURIComponent(`https:${Source}`);
          GM_getValue("isDebug") && originalConsole.debug(`[debug] try parse all comment`);
          Comments = JSON.stringify(await getCommentDatas(ID)).normalize("NFKC");
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            Private,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            FileName,
            DownloadQuality,
            ExternalUrl,
            Description,
            Comments,
            DownloadUrl,
            Size,
            Following,
            Unlisted,
            Friend
          };
        case "partial":
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            ExternalUrl,
            Unlisted,
            Private
          };
        default:
          Type = "fail";
          return {
            Type,
            RAW,
            ID,
            Alias,
            Author,
            AuthorID,
            Private,
            UploadTime,
            Title,
            Tags,
            Liked,
            External,
            ExternalUrl,
            Description,
            Unlisted,
            Msg: "Unknown type"
          };
      }
    } catch (error) {
      Type = "fail";
      return {
        Type,
        RAW,
        ID,
        Alias,
        Author,
        AuthorID,
        Private,
        UploadTime,
        Title,
        Tags,
        Liked,
        External,
        ExternalUrl,
        Description,
        Unlisted,
        Msg: stringify(error)
      };
    }
  }
  function generateMatadataURL(videoInfo) {
    const metadataContent = generateMetadataContent(videoInfo);
    const blob = new Blob([metadataContent], { type: "text/plain" });
    return URL.createObjectURL(blob);
  }
  function getMatadataPath(videoInfo) {
    const videoPath = getDownloadPath(videoInfo);
    return `${videoPath.directory}/${videoPath.baseName}.json`;
  }
  function generateMetadataContent(videoInfo) {
    const metadata = Object.assign(videoInfo, {
      DownloadPath: getDownloadPath(videoInfo).fullPath,
      MetaDataVersion: GM_info.script.version
    });
    return JSON.stringify(metadata, (key, value) => {
      if (value instanceof Date) {
        return value.toISOString();
      }
      return value;
    }, 2);
  }
  function browserDownloadMetadata(videoInfo) {
    const url = generateMatadataURL(videoInfo);
    function toastError(error) {
      newToast(
        3,
        {
          node: toastNode([
            `${videoInfo.Title}[${videoInfo.ID}] %#videoMetadata#% %#downloadFailed#%`,
            { nodeType: "br" },
            browserDownloadErrorParse(error)
          ], "%#browserDownload#%"),
          close: true
        }
      ).show();
    }
    GM_download({
      url,
      saveAs: false,
      name: getMatadataPath(videoInfo),
      onerror: (err) => toastError(err),
      ontimeout: () => toastError(new Error("%#browserDownloadTimeout#%")),
      onload: () => URL.revokeObjectURL(url)
    });
  }
  function othersDownloadMetadata(videoInfo) {
    const url = generateMatadataURL(videoInfo);
    const metadataFile = analyzeLocalPath(getMatadataPath(videoInfo)).fullName;
    const downloadHandle = renderNode({
      nodeType: "a",
      attributes: {
        href: url,
        download: metadataFile
      }
    });
    downloadHandle.click();
    downloadHandle.remove();
    URL.revokeObjectURL(url);
  }
  async function importConfig() {
    let textArea = renderNode({
      nodeType: "textarea",
      attributes: {
        placeholder: i18nList[config.language].importConfig,
        style: "margin-bottom: 10px;",
        rows: "16",
        cols: "96"
      }
    });
    let body = renderNode({
      nodeType: "div",
      attributes: {
        id: "pluginOverlay"
      },
      childs: [
        textArea,
        {
          nodeType: "button",
          events: {
            click: (e) => {
              if (!isNullOrUndefined(textArea.value) && !textArea.value.isEmpty()) {
                try {
                  let tempConfig = JSON.parse(textArea.value);
                  if (!tempConfig || typeof tempConfig !== "object") {
                    throw "配置校验失败";
                  }
                  Config.initInstance(tempConfig);
                  unsafeWindow.location.reload();
                } catch (error) {
                  newToast(3, {
                    node: renderNode({
                      nodeType: "p",
                      childs: [
                        "%#importConfigFail#%",
                        stringify(error)
                      ]
                    })
                  }).show();
                }
              }
              body.remove();
            }
          },
          childs: i18nList[config.language].ok
        }
      ]
    });
    unsafeWindow.document.body.appendChild(body);
  }
  async function addDownloadTask() {
    let textArea = renderNode({
      nodeType: "textarea",
      attributes: {
        placeholder: i18nList[config.language].manualDownloadTips,
        style: "margin-bottom: 10px;",
        rows: "16",
        cols: "96"
      }
    });
    let body = renderNode({
      nodeType: "div",
      attributes: {
        id: "pluginOverlay"
      },
      childs: [
        textArea,
        {
          nodeType: "button",
          events: {
            click: (e) => {
              if (!isNullOrUndefined(textArea.value) && !textArea.value.isEmpty()) {
                let list = [];
                try {
                  list = textArea.value.split("|").map((ID) => [ID.trim(), {
                    Type: "init",
                    ID: ID.trim()
                  }]);
                } catch (error) {
                  throw new Error("解析结果不是符合预期的列表");
                }
                if (list.length > 0) {
                  analyzeDownloadTask(new Dictionary(list));
                }
              }
              body.remove();
            }
          },
          childs: i18nList[config.language].ok
        }
      ]
    });
    unsafeWindow.document.body.appendChild(body);
  }
  async function downloadTaskUnique(taskList) {
    let stoped = prune(
      (await aria2API(
        "aria2.tellStopped",
        [
          0,
          4096,
          [
            "gid",
            "status",
            "files",
            "errorCode",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let active = prune(
      (await aria2API(
        "aria2.tellActive",
        [
          [
            "gid",
            "status",
            "files",
            "downloadSpeed",
            "bittorrent"
          ]
        ]
      )).result.filter(
        (task) => isNullOrUndefined(task.bittorrent)
      ).map(
        (task) => {
          let ID = aria2TaskExtractVideoID(task);
          if (!isNullOrUndefined(ID) && !ID.isEmpty()) {
            return {
              id: ID,
              data: task
            };
          }
        }
      )
    );
    let downloadCompleted = stoped.filter(
      (task) => task.data.status === "complete"
    ).unique("id");
    let startedAndCompleted = [...active, ...downloadCompleted].map((i3) => i3.id);
    for (let key of taskList.keysArray().intersect(startedAndCompleted)) {
      taskList.delete(key);
    }
  }
  async function analyzeDownloadTask(taskList = selectList) {
    let size = taskList.size;
    let node = renderNode({
      nodeType: "p",
      childs: `${i18nList[config.language].parsingProgress}[${taskList.size}/${size}]`
    });
    let parsingProgressToast = newToast(1, {
      node,
      duration: -1
    });
    function updateParsingProgress() {
      node.firstChild.textContent = `${i18nList[config.language].parsingProgress}[${taskList.size}/${size}]`;
    }
    parsingProgressToast.show();
    if (config.experimentalFeatures && config.downloadType === 0) {
      await downloadTaskUnique(taskList);
      updateParsingProgress();
    }
    for (let [id, info] of taskList) {
      await pushDownloadTask(await parseVideoInfo(info));
      taskList.delete(id);
      updateParsingProgress();
      !config.enableUnsafeMode && await delay(3e3);
    }
    parsingProgressToast.hide();
    newToast(
      1,
      {
        text: `%#allCompleted#%`,
        duration: -1,
        close: true,
        onClick() {
          this.hide();
        }
      }
    ).show();
  }
  async function pushDownloadTask(videoInfo, bypass = false) {
    switch (videoInfo.Type) {
      case "full":
        await db.putVideo(videoInfo);
        if (!bypass) {
          const authorInfo = await db.getFollowById(videoInfo.AuthorID);
          if (config.autoFollow && (!authorInfo?.following || !videoInfo.Following)) {
            await unlimitedFetch(
              `https://${apiEndpoint}/user/${videoInfo.AuthorID}/followers`,
              {
                method: "POST",
                headers: await getAuth()
              },
              {
                retry: true,
                successStatus: 201,
                failStatuses: [404],
                onFail: async (res) => {
                  newToast(2, {
                    text: `${videoInfo.Alias} %#autoFollowFailed#% ${res.status}`,
                    close: true,
                    onClick() {
                      this.hide();
                    }
                  }).show();
                },
                onRetry: async () => {
                  await refreshToken();
                }
              }
            );
          }
          if (config.autoLike && !videoInfo.Liked) {
            await unlimitedFetch(
              `https://${apiEndpoint}/video/${videoInfo.ID}/like`,
              {
                method: "POST",
                headers: await getAuth()
              },
              {
                retry: true,
                successStatus: 201,
                failStatuses: [404],
                onFail: async (res) => {
                  newToast(2, {
                    text: `${videoInfo.Alias} %#autoLikeFailed#% ${res.status}`,
                    close: true,
                    onClick() {
                      this.hide();
                    }
                  }).show();
                },
                onRetry: async () => {
                  await refreshToken();
                }
              }
            );
          }
          if (config.checkDownloadLink && checkIsHaveDownloadLink(`${videoInfo.Description} ${videoInfo.Comments}`)) {
            let toastBody = toastNode([
              `${videoInfo.Title}[${videoInfo.ID}] %#findedDownloadLink#%`,
              { nodeType: "br" },
              `%#openVideoLink#%`
            ], "%#createTask#%");
            newToast(
              2,
              {
                node: toastBody,
                close: config.autoCopySaveFileName,
                onClick() {
                  GM_openInTab(`https://www.${domain}/video/${videoInfo.ID}`, { active: false, insert: true, setParent: true });
                  if (config.autoCopySaveFileName) {
                    GM_setClipboard(getDownloadPath(videoInfo).fullName, "text");
                    toastBody.appendChild(renderNode({
                      nodeType: "p",
                      childs: "%#copySucceed#%"
                    }));
                  } else {
                    this.hide();
                  }
                }
              }
            ).show();
            return;
          }
        }
        if (config.checkPriority && videoInfo.DownloadQuality !== config.downloadPriority) {
          newToast(
            2,
            {
              node: toastNode([
                `${videoInfo.Title.truncate(64)}[${videoInfo.ID}] %#downloadQualityError#%`,
                { nodeType: "br" },
                `%#tryReparseDownload#%`
              ], "%#createTask#%"),
              async onClick() {
                this.hide();
                await pushDownloadTask(await parseVideoInfo(videoInfo));
              }
            }
          ).show();
          return;
        }
        switch (config.downloadType) {
          case 0:
            aria2Download(videoInfo);
            break;
          case 1:
            iwaradlDownload(videoInfo);
            break;
          case 2:
            browserDownload(videoInfo);
            break;
          default:
            othersDownload(videoInfo);
            break;
        }
        if (config.autoDownloadMetadata) {
          switch (config.downloadType) {
            case 3:
              othersDownloadMetadata(videoInfo);
              break;
            case 2:
              browserDownloadMetadata(videoInfo);
              break;
            default:
              break;
          }
          GM_getValue("isDebug") && originalConsole.debug("[Debug] Download task pushed:", videoInfo);
        }
        selectList.delete(videoInfo.ID);
        break;
      case "partial":
        const partialCache = await db.getVideoById(videoInfo.ID);
        if (!isNullOrUndefined(partialCache) && partialCache.Type !== "full") await db.putVideo(videoInfo);
      case "cache":
      case "init":
        return await pushDownloadTask(await parseVideoInfo(videoInfo));
      case "fail":
        const cache = await db.getVideoById(videoInfo.ID);
        newToast(
          3,
          {
            close: true,
            node: toastNode([
              `${videoInfo.Title ?? videoInfo.RAW?.title ?? cache?.RAW?.title}[${videoInfo.ID}] %#parsingFailed#%`,
              { nodeType: "br" },
              videoInfo.Msg,
              { nodeType: "br" },
              videoInfo.External ? `%#openVideoLink#%` : `%#tryReparseDownload#%`
            ], "%#createTask#%"),
            async onClick() {
              this.hide();
              if (videoInfo.External && !isNullOrUndefined(videoInfo.ExternalUrl) && !videoInfo.ExternalUrl.isEmpty()) {
                GM_openInTab(videoInfo.ExternalUrl, { active: false, insert: true, setParent: true });
              } else {
                await pushDownloadTask(await parseVideoInfo({ Type: "init", ID: videoInfo.ID, RAW: videoInfo.RAW ?? cache?.RAW }));
              }
            }
          }
        ).show();
        break;
      default:
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Unknown type:", videoInfo);
        break;
    }
  }
  function uninjectCheckbox(element) {
    if (element instanceof HTMLElement) {
      if (element instanceof HTMLInputElement && element.classList.contains("selectButton")) {
        element.hasAttribute("videoID") && pageSelectButtons.delete(element.getAttribute("videoID"));
      }
      if (element.querySelector("input.selectButton")) {
        element.querySelectorAll(".selectButton").forEach((i3) => i3.hasAttribute("videoID") && pageSelectButtons.delete(i3.getAttribute("videoID")));
      }
    }
  }
  async function injectCheckbox(element) {
    let ID = element.querySelector("a.videoTeaser__thumbnail").href.toURL().pathname.split("/")[2];
    if (isNullOrUndefined(ID)) return;
    let info = await db.getVideoById(ID);
    let Title = info?.Type === "full" || info?.Type === "partial" ? info?.Title : info?.RAW?.title ?? element.querySelector(".videoTeaser__title")?.getAttribute("title") ?? void 0;
    let Alias = info?.Type === "full" || info?.Type === "partial" ? info?.Alias : info?.RAW?.user.name ?? element.querySelector("a.username")?.getAttribute("title") ?? void 0;
    let Author = info?.Type === "full" || info?.Type === "partial" ? info?.Author : info?.RAW?.user.username ?? element.querySelector("a.username")?.href.toURL().pathname.split("/").pop();
    let UploadTime = info?.Type === "full" || info?.Type === "partial" ? info?.UploadTime : new Date(info?.RAW?.updatedAt ?? 0).getTime();
    let button = renderNode({
      nodeType: "input",
      attributes: {
        type: "checkbox",
        videoID: ID,
        checked: selectList.has(ID) ? true : void 0,
        videoName: Title,
        videoAlias: Alias,
        videoAuthor: Author,
        videoUploadTime: UploadTime
      },
      className: "selectButton",
      events: {
        click: (event) => {
          event.target.checked ? selectList.set(ID, {
            Type: "init",
            ID,
            Title,
            Alias,
            Author,
            UploadTime
          }) : selectList.delete(ID);
          event.stopPropagation();
          event.stopImmediatePropagation();
          return false;
        }
      }
    });
    let item = element.querySelector(".videoTeaser__thumbnail")?.parentElement;
    item?.style.setProperty("position", "relative");
    pageSelectButtons.set(ID, button);
    originalNodeAppendChild.call(item, button);
    if (!isNullOrUndefined(Author)) {
      const AuthorInfo = await db.getFollowByUsername(Author);
      if (AuthorInfo?.following && element.querySelector(".videoTeaser__thumbnail")?.querySelector(".follow") === null) {
        originalNodeAppendChild.call(element.querySelector(".videoTeaser__thumbnail"), renderNode(
          {
            nodeType: "div",
            className: "follow",
            childs: {
              nodeType: "div",
              className: ["text", "text--white", "text--tiny", "text--bold"],
              childs: "%#following#%"
            }
          }
        ));
      }
    }
    if (getPageType() === "playlist") {
      let deletePlaylistItme = renderNode({
        nodeType: "button",
        attributes: {
          videoID: ID
        },
        childs: "%#delete#%",
        className: "deleteButton",
        events: {
          click: async (event) => {
            if ((await unlimitedFetch(`https://${apiEndpoint}/playlist/${unsafeWindow.location.pathname.split("/")[2]}/${ID}`, {
              method: "DELETE",
              headers: await getAuth()
            })).ok) {
              newToast(1, { text: `${Title} %#deleteSucceed#%`, close: true }).show();
              deletePlaylistItme.remove();
            }
            event.preventDefault();
            event.stopPropagation();
            event.stopImmediatePropagation();
            return false;
          }
        }
      });
      originalNodeAppendChild.call(item, deletePlaylistItme);
    }
  }
  var configEdit = class {
    source;
    target;
    interfacePage;
    interface;
    constructor(config2) {
      this.target = config2;
      this.target.configChange = (item) => {
        this.configChange.call(this, item);
      };
      this.interfacePage = renderNode({
        nodeType: "p"
      });
      let save = renderNode({
        nodeType: "button",
        childs: "%#save#%",
        attributes: {
          title: i18nList[config2.language].save
        },
        events: {
          click: async () => {
            save.disabled = !save.disabled;
            if (await check()) {
              unsafeWindow.location.reload();
            }
            save.disabled = !save.disabled;
          }
        }
      });
      let reset = renderNode({
        nodeType: "button",
        childs: "%#reset#%",
        attributes: {
          title: i18nList[config2.language].reset
        },
        events: {
          click: () => {
            GM_setValue("isFirstRun", true);
            unsafeWindow.location.reload();
          }
        }
      });
      this.interface = renderNode({
        nodeType: "div",
        attributes: {
          id: "pluginConfig"
        },
        childs: [
          {
            nodeType: "div",
            className: "main",
            childs: [
              {
                nodeType: "h2",
                childs: "%#appName#%"
              },
              {
                nodeType: "label",
                childs: [
                  "%#language#% ",
                  {
                    nodeType: "input",
                    className: "inputRadioLine",
                    attributes: {
                      name: "language",
                      type: "text",
                      value: this.target.language
                    },
                    events: {
                      change: (event) => {
                        this.target.language = event.target.value;
                      }
                    }
                  }
                ]
              },
              this.downloadTypeSelect(),
              this.interfacePage,
              this.switchButton("checkPriority"),
              this.switchButton("checkDownloadLink"),
              this.switchButton("autoFollow"),
              this.switchButton("autoLike"),
              this.switchButton("filterLikedVideos"),
              this.switchButton("autoInjectCheckbox"),
              this.switchButton("autoDownloadMetadata"),
              this.switchButton("autoCopySaveFileName"),
              this.switchButton("addUnlistedAndPrivate"),
              this.switchButton("experimentalFeatures"),
              this.switchButton("enableUnsafeMode"),
              this.switchButton("enableWidescreen"),
              this.switchButton("enableBeautify"),
              this.switchButton("isDebug", GM_getValue, (name, e) => {
                GM_setValue(name, e.target.checked);
                unsafeWindow.location.reload();
              }, false)
            ]
          },
          {
            nodeType: "p",
            className: "buttonList",
            childs: [
              reset,
              save
            ]
          }
        ]
      });
    }
    switchButton(name, get, set, defaultValue) {
      return renderNode({
        nodeType: "p",
        className: "inputRadioLine",
        childs: [
          {
            nodeType: "label",
            childs: `%#${name}#%`,
            attributes: {
              for: name
            }
          },
          {
            nodeType: "input",
            className: "switch",
            attributes: {
              type: "checkbox",
              name,
              checked: get !== void 0 ? get(name, defaultValue) : this.target[name] ?? defaultValue ?? false
            },
            events: {
              change: (e) => {
                if (set !== void 0) {
                  set(name, e);
                  return;
                } else {
                  this.target[name] = e.target.checked;
                }
              }
            }
          }
        ]
      });
    }
    inputComponent(name, type, help, get, set) {
      return renderNode({
        nodeType: "label",
        childs: [
          {
            nodeType: "span",
            childs: [
              `%#${name}#%`,
              help
            ]
          },
          {
            nodeType: "input",
            attributes: {
              name,
              type: type ?? "text",
              value: get !== void 0 ? get(name) : this.target[name]
            },
            events: {
              change: (e) => {
                if (set !== void 0) {
                  set(name, e);
                  return;
                } else {
                  this.target[name] = e.target.value;
                }
              }
            }
          }
        ]
      });
    }
    downloadTypeSelect() {
      return renderNode({
        nodeType: "fieldset",
        childs: [
          {
            nodeType: "legend",
            childs: "%#downloadType#%"
          },
          ...Object.keys(DownloadType).filter((i3) => isNaN(Number(i3))).map(
            (type, index) => renderNode({
              nodeType: "label",
              childs: [
                {
                  nodeType: "input",
                  attributes: {
                    type: "radio",
                    name: "downloadType",
                    value: index,
                    checked: index === Number(this.target.downloadType)
                  },
                  events: {
                    change: (e) => {
                      this.target.downloadType = Number(e.target.value);
                    }
                  }
                },
                type
              ]
            })
          )
        ]
      });
    }
    configChange(item) {
      switch (item) {
        case "downloadType":
          const radios = this.interface.querySelectorAll(`[name=${item}]`);
          radios.forEach((radio) => {
            radio.checked = Number(radio.value) === Number(this.target.downloadType);
          });
          this.pageChange();
          break;
        case "checkPriority":
          this.pageChange();
          break;
        default:
          let element = this.interface.querySelector(`[name=${item}]`);
          if (element) {
            switch (element.type) {
              case "radio":
                element.value = this.target[item];
                break;
              case "checkbox":
                element.checked = this.target[item];
                break;
              case "text":
              case "password":
                element.value = this.target[item];
                break;
              default:
                break;
            }
          }
          break;
      }
    }
    pageChange() {
      while (this.interfacePage.hasChildNodes()) {
        this.interfacePage.removeChild(this.interfacePage.firstChild);
      }
      let downloadConfigInput = [
        this.inputComponent("downloadPath", "text", renderNode({
          nodeType: "a",
          childs: "%#variable#%",
          className: "rainbow-text",
          attributes: {
            style: "float: inline-end;",
            href: "https://github.com/dawn-lc/IwaraDownloadTool/wiki/路径可用变量"
          }
        }))
      ];
      let proxyConfigInput = [
        this.inputComponent("downloadProxy"),
        this.inputComponent("downloadProxyUsername"),
        this.inputComponent("downloadProxyPassword", "password")
      ];
      let aria2ConfigInput = [
        this.inputComponent("aria2Path"),
        this.inputComponent("aria2Token", "password"),
        ...proxyConfigInput
      ];
      let iwaradlConfigInput = [
        this.inputComponent("iwaradlPath", "text", renderNode({
          nodeType: "a",
          childs: "%#iwaradlLink#%",
          className: "rainbow-text",
          attributes: {
            style: "float: inline-end;",
            href: "https://github.com/Izumiko/iwaradl"
          }
        })),
        this.inputComponent("iwaradlToken", "password"),
        ...proxyConfigInput
      ];
      switch (this.target.downloadType) {
        case 0:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          aria2ConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case 1:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          iwaradlConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        default:
          downloadConfigInput.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
      }
      if (this.target.checkPriority) {
        originalNodeAppendChild.call(this.interfacePage, this.inputComponent("downloadPriority"));
      }
    }
    inject() {
      if (!unsafeWindow.document.querySelector("#pluginConfig")) {
        originalNodeAppendChild.call(unsafeWindow.document.body, this.interface);
        this.configChange("downloadType");
      }
    }
  };
  var menu = class {
    observer;
    pageType;
    interface;
    interfacePage;
    isTouchDevice;
    constructor() {
      let body = new Proxy(this, {
        set: (target, prop, value) => {
          if (prop === "pageType") {
            if (isNullOrUndefined(value) || target.pageType === value) return true;
            const ok = Reflect.set(target, prop, value);
            this.pageChange();
            GM_getValue("isDebug") && originalConsole.debug(`[Debug] Page change to ${this.pageType}`);
            return ok;
          }
          return Reflect.set(target, prop, value);
        }
      });
      body.interfacePage = renderNode({
        nodeType: "ul"
      });
      body.interface = renderNode({
        nodeType: "div",
        attributes: {
          id: "pluginMenu"
        },
        childs: body.interfacePage
      });
      body.isTouchDevice = unsafeWindow.matchMedia("(pointer: coarse)").matches || (unsafeWindow.navigator.maxTouchPoints ?? 0) > 0;
      if (body.isTouchDevice) {
        originalAddEventListener.call(body.interface, "click", (event) => {
          if (event.target === body.interface) {
            body.interface.classList.toggle("expanded");
          }
        });
        originalAddEventListener.call(unsafeWindow.document, "click", (event) => {
          if (body.interface.classList.contains("expanded") && !body.interface.contains(event.target)) {
            body.interface.classList.remove("expanded");
          }
        });
      } else {
        let mouseoutTimer = null;
        originalAddEventListener.call(body.interface, "mouseover", (event) => {
          if (mouseoutTimer !== null) {
            clearTimeout(mouseoutTimer);
            mouseoutTimer = null;
          }
          body.interface.classList.add("expanded");
        });
        originalAddEventListener.call(body.interface, "mouseout", (event) => {
          const e = event;
          const relatedTarget = e.relatedTarget;
          if (relatedTarget && body.interface.contains(relatedTarget)) {
            return;
          }
          mouseoutTimer = setTimeout(() => {
            body.interface.classList.remove("expanded");
            mouseoutTimer = null;
          }, 300);
        });
        originalAddEventListener.call(body.interface, "click", (event) => {
          if (event.target === body.interface) {
            body.interface.classList.toggle("expanded");
          }
        });
      }
      body.observer = new MutationObserver((mutationsList) => body.pageType = getPageType(mutationsList) ?? body.pageType);
      body.pageType = "page";
      return body;
    }
    button(name, click) {
      const self2 = this;
      return renderNode({
        nodeType: "li",
        childs: `%#${name}#%`,
        events: {
          click: (event) => {
            !isNullOrUndefined(click) && click(name, event);
            if (self2.isTouchDevice) {
              setTimeout(() => self2.interface.classList.remove("expanded"), 150);
            }
            event.stopPropagation();
            return false;
          }
        }
      });
    }
    async parseUnlistedAndPrivate() {
      if (!isLoggedIn()) return;
      const lastMonthTimestamp = Date.now() - 30 * 24 * 60 * 60 * 1e3;
      const thisMonthUnlistedAndPrivateVideos = await db.getFilteredVideos(lastMonthTimestamp, Infinity);
      let parseUnlistedAndPrivateVideos = [];
      let pageCount = 0;
      const MAX_FIND_PAGES = 64;
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] Starting fetch loop. MAX_PAGES=${MAX_FIND_PAGES}`);
      while (pageCount < MAX_FIND_PAGES) {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Fetching page ${pageCount}.`);
        const response = await unlimitedFetch(
          `https://${apiEndpoint}/videos?subscribed=true&limit=50&rating=${rating()}&page=${pageCount}`,
          { method: "GET", headers: await getAuth() },
          {
            retry: true,
            retryDelay: 1e3,
            onRetry: async () => {
              await refreshToken();
            }
          }
        );
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Received response, parsing JSON.");
        const data = (await response.json()).results;
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Page ${pageCount} returned ${data.length} videos.`);
        data.forEach((info) => info.user.following = true);
        const videoPromises = data.map((info) => parseVideoInfo({
          Type: "cache",
          ID: info.id,
          RAW: info
        }));
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Initializing VideoInfo promises.");
        const videoInfos = await Promise.all(videoPromises);
        parseUnlistedAndPrivateVideos.push(...videoInfos);
        let test = videoInfos.filter((i3) => i3.Type === "partial" && (i3.Private || i3.Unlisted)).any();
        GM_getValue("isDebug") && originalConsole.debug("[Debug] All VideoInfo objects initialized.");
        if (test && thisMonthUnlistedAndPrivateVideos.intersect(videoInfos, "ID").any()) {
          GM_getValue("isDebug") && originalConsole.debug(`[Debug] Found private video on page ${pageCount}.`);
          break;
        }
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Latest private video not found on page ${pageCount}, continuing.`);
        pageCount++;
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Incremented page to ${pageCount}, delaying next fetch.`);
        await delay(100);
      }
      GM_getValue("isDebug") && originalConsole.debug("[Debug] Fetch loop ended. Start updating the database");
      const existingVideos = await db.getVideosByIds(parseUnlistedAndPrivateVideos.map((v2) => v2.ID));
      const toUpdate = parseUnlistedAndPrivateVideos.difference(
        existingVideos.filter((v2) => v2.Type === "full"),
        "ID"
      );
      if (toUpdate.any()) {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Need to update ${toUpdate.length} pieces of data.`);
        await db.bulkPutVideos(toUpdate);
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] Update Completed.`);
      } else {
        GM_getValue("isDebug") && originalConsole.debug(`[Debug] No need to update data.`);
      }
    }
    async pageChange() {
      while (this.interfacePage.hasChildNodes()) {
        this.interfacePage.removeChild(this.interfacePage.firstChild);
      }
      let manualDownloadButton = this.button("manualDownload", (name, event) => {
        addDownloadTask();
      });
      let settingsButton = this.button("settings", (name, event) => {
        editConfig.inject();
      });
      let exportConfigButton = this.button("exportConfig", (name, event) => {
        GM_setClipboard(stringify(config));
        newToast(
          1,
          {
            node: toastNode(i18nList[config.language].exportConfigSucceed),
            duration: 3e3,
            gravity: "bottom",
            position: "center",
            onClick() {
              this.hide();
            }
          }
        ).show();
      });
      let importConfigButton = this.button("importConfig", (name, event) => {
        importConfig();
      });
      renderNode({
        nodeType: "button",
        childs: "%#importConfig#%",
        attributes: {
          title: i18nList[config.language].save
        },
        events: {
          click: async () => {
          }
        }
      });
      let baseButtons = [
        manualDownloadButton,
        exportConfigButton,
        importConfigButton,
        settingsButton
      ];
      let injectCheckboxButton = this.button("injectCheckbox", (name, event) => {
        if (unsafeWindow.document.querySelector(".selectButton")) {
          unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
            element.remove();
          });
        } else {
          unsafeWindow.document.querySelectorAll(`.videoTeaser`).forEach((element) => {
            injectCheckbox(element);
          });
        }
      });
      let deselectAllButton = this.button("deselectAll", (name, event) => {
        for (const id of selectList.keys()) {
          selectList.delete(id);
        }
      });
      let reverseSelectButton = this.button("reverseSelect", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          element.click();
        });
      });
      let selectThisButton = this.button("selectThis", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          let button = element;
          !button.checked && button.click();
        });
      });
      let deselectThisButton = this.button("deselectThis", (name, event) => {
        unsafeWindow.document.querySelectorAll(".selectButton").forEach((element) => {
          let button = element;
          button.checked && button.click();
        });
      });
      let downloadSelectedButton = this.button("downloadSelected", (name, event) => {
        analyzeDownloadTask();
        newToast(1, {
          text: `%#${name}#%`,
          close: true
        }).show();
      });
      let selectButtons = [
        injectCheckboxButton,
        deselectAllButton,
        reverseSelectButton,
        selectThisButton,
        deselectThisButton,
        downloadSelectedButton
      ];
      let downloadThisButton = this.button("downloadThis", async (name, event) => {
        let ID = unsafeWindow.location.href.toURL().pathname.split("/")[2];
        await pushDownloadTask(await parseVideoInfo({
          Type: "init",
          ID
        }), true);
      });
      let aria2TaskCheckButton = this.button("aria2TaskCheck", (name, event) => {
        aria2TaskCheckAndRestart();
      });
      config.experimentalFeatures && originalNodeAppendChild.call(this.interfacePage, aria2TaskCheckButton);
      switch (this.pageType) {
        case "video":
          originalNodeAppendChild.call(this.interfacePage, downloadThisButton);
          selectButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case "search":
        case "profile":
        case "home":
        case "videoList":
        case "subscriptions":
        case "playlist":
        case "favorites":
        case "account":
          selectButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
        case "page":
        case "forum":
        case "image":
        case "imageList":
        case "forumSection":
        case "forumThread":
        default:
          baseButtons.map((i3) => originalNodeAppendChild.call(this.interfacePage, i3));
          break;
      }
      if (config.addUnlistedAndPrivate && this.pageType === "videoList") {
        this.parseUnlistedAndPrivate();
      } else {
        GM_getValue("isDebug") && originalConsole.debug("[Debug] Conditions not met: addUnlistedAndPrivate or pageType mismatch.");
      }
    }
    inject() {
      try {
        this.observer.observe(unsafeWindow.document.getElementById("app"), { childList: true, subtree: true });
        if (!unsafeWindow.document.querySelector("#pluginMenu")) {
          originalNodeAppendChild.call(unsafeWindow.document.body, this.interface);
          this.pageType = getPageType() ?? this.pageType;
        }
      } catch (error) {
        originalNodeAppendChild.call(unsafeWindow.document.body, this.interface);
      }
    }
  };
  var waterMark = class {
    debugSwitchCount = 0;
    selected = renderNode({
      nodeType: "span",
      childs: ` %#selected#% ${selectList.size} `
    });
    debugFlag = renderNode({
      nodeType: "span",
      childs: `${GM_getValue("isDebug") ? `${i18nList[config.language].isDebug} ${GM_info.scriptHandler}` : ""}`
    });
    bdoy = renderNode({
      nodeType: "p",
      className: "fixed-bottom-right",
      childs: [
        `%#appName#% ${GM_getValue("version")} `,
        this.selected,
        this.debugFlag
      ],
      events: {
        click: (e) => {
          if (GM_getValue("isDebug")) return;
          if (this.debugSwitchCount < 5) {
            this.debugSwitchCount++;
            return;
          } else {
            GM_setValue("isDebug", true);
            this.debugFlag.textContent = `${GM_getValue("isDebug") ? i18nList[config.language].isDebug : ""}`;
            unsafeWindow.location.reload();
          }
        }
      }
    });
    constructor() {
      return this;
    }
    inject() {
      originalNodeAppendChild.call(unsafeWindow.document.body, this.bdoy);
    }
  };
  function handleAuthorizationHeader(init) {
    if (!init || !init.headers) return;
    let authorization = null;
    if (init.headers instanceof Headers) {
      authorization = init.headers.has("Authorization") ? init.headers.get("Authorization") : null;
    } else if (Array.isArray(init.headers)) {
      const index = init.headers.findIndex(([key]) => key.toLowerCase() === "authorization");
      if (index >= 0) authorization = init.headers[index][1];
    } else if (typeof init.headers === "object") {
      for (const key in init.headers) {
        if (key.toLowerCase() === "authorization") {
          authorization = init.headers[key];
          break;
        }
      }
    }
    if (!authorization) return;
    const payload = getPlayload(authorization);
    const token = authorization.split(" ").pop();
    if (payload["type"] === "refresh_token" && !isUndefined(token)) {
      localStorage.setItem("token", token);
      config.authorization = token;
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] refresh_token: 凭证已隐藏`);
    }
  }
  async function handleUserTokenResponse(response) {
    const cloneResponse = response.clone();
    if (!cloneResponse.ok) return;
    const { accessToken } = await cloneResponse.json();
    const token = localStorage.getItem("accessToken");
    if (isNull(token) || token !== accessToken) {
      localStorage.setItem("accessToken", accessToken);
    }
  }
  async function handleVideosResponse(response, url) {
    const cloneResponse = response.clone();
    if (!cloneResponse.ok) return response;
    const cloneBody = await cloneResponse.json();
    const rawVideos = cloneBody.results;
    const parsePromises = rawVideos.map(
      (info) => parseVideoInfo({ Type: "cache", ID: info.id, RAW: info })
    );
    const settled = await Promise.allSettled(parsePromises);
    const list = settled.filter((i3) => i3.status === "fulfilled").map((i3) => i3.value).filter((i3) => i3.Type === "partial" || i3.Type === "full");
    const ids = list.map((v2) => v2.ID);
    const existing = await db.getVideosByIds(ids);
    const fullVideos = existing.filter((v2) => v2.Type === "full");
    const toUpdate = list.difference(fullVideos, "ID");
    if (toUpdate.any()) {
      await db.bulkPutVideos(toUpdate);
    }
    if (config.filterLikedVideos) {
      cloneBody.results = rawVideos.filter((i3) => !i3.liked);
      cloneBody.limit = cloneBody.results.length;
      cloneBody.count = cloneBody.limit * (cloneBody.page + 1) + 1;
    }
    let preResponse = new Response(JSON.stringify(cloneBody), {
      status: cloneResponse.status,
      statusText: cloneResponse.statusText,
      headers: Object.fromEntries(cloneResponse.headers.entries())
    });
    if (!config.addUnlistedAndPrivate) return preResponse;
    if (url.searchParams.has("user")) return preResponse;
    if (url.searchParams.has("subscribed")) return preResponse;
    if (url.searchParams.has("sort") && url.searchParams.get("sort") !== "date") return preResponse;
    const sortedList = list.sort((a3, b2) => a3.UploadTime - b2.UploadTime);
    if (sortedList.length === 0) return preResponse;
    const minTime = sortedList[0].UploadTime;
    const maxTime = sortedList[sortedList.length - 1].UploadTime;
    const startTime = new Date(minTime).sub({ hours: 4 }).getTime();
    const endTime = new Date(maxTime).add({ hours: 4 }).getTime();
    const cacheVideos = (await db.getFilteredVideos(startTime, endTime)).filter((i3) => i3.Type === "partial" || i3.Type === "full").sort((a3, b2) => b2.UploadTime - a3.UploadTime).map((i3) => i3.RAW);
    cloneBody.results.push(...cacheVideos);
    cloneBody.limit = cloneBody.results.length;
    cloneBody.count = cloneBody.limit * (cloneBody.page + 1) + 1;
    preResponse = new Response(JSON.stringify(cloneBody), {
      status: cloneResponse.status,
      statusText: cloneResponse.statusText,
      headers: Object.fromEntries(cloneResponse.headers.entries())
    });
    return preResponse;
  }
  function createInterceptedFetch() {
    return async function(input, init) {
      GM_getValue("isDebug") && originalConsole.debug(`[Debug] Fetch ${input}`);
      const url = (input instanceof Request ? input.url : input instanceof URL ? input.href : input).toURL();
      if (!isUndefined(init) && init.headers) {
        handleAuthorizationHeader(init);
      }
      return new Promise(
        (resolve, reject) => originalFetch(input, init).then(async (response) => {
          if (!url.pathname.isEmpty()) {
            const path = url.pathname.toLowerCase().split("/").slice(1);
            if (url.hostname === "apiq.iwara.tv" || url.hostname === "api.iwara.tv") {
              switch (path[0]) {
                case "user":
                  if (path[1] === "token") await handleUserTokenResponse(response);
                  break;
                case "videos":
                  return resolve(await handleVideosResponse(response, url));
                default:
                  break;
              }
            }
          }
          return resolve(response);
        }).catch((err) => reject(err))
      );
    };
  }
  function r(t2, n5) {
    return t2.endsWith(n5) ? t2.length === n5.length || t2[t2.length - n5.length - 1] === "." : false;
  }
  function u(t2, n5) {
    const l2 = t2.length - n5.length - 2, i3 = t2.lastIndexOf(".", l2);
    return i3 === -1 ? t2 : t2.slice(i3 + 1);
  }
  function g2(t2, n5, l2) {
    if (l2.validHosts !== null) {
      const f2 = l2.validHosts;
      for (const e of f2) if (r(n5, e)) return e;
    }
    let i3 = 0;
    if (n5.startsWith(".")) for (; i3 < n5.length && n5[i3] === "."; ) i3 += 1;
    return t2.length === n5.length - i3 ? null : u(n5, t2);
  }
  function i(t2, e) {
    return t2.slice(0, -e.length - 1);
  }
  function g3(t2, x2) {
    let e = 0, o = t2.length, l2 = false;
    if (!x2) {
      if (t2.startsWith("data:")) return null;
      for (; e < t2.length && t2.charCodeAt(e) <= 32; ) e += 1;
      for (; o > e + 1 && t2.charCodeAt(o - 1) <= 32; ) o -= 1;
      if (t2.charCodeAt(e) === 47 && t2.charCodeAt(e + 1) === 47) e += 2;
      else {
        const c2 = t2.indexOf(":/", e);
        if (c2 !== -1) {
          const i3 = c2 - e, a3 = t2.charCodeAt(e), d = t2.charCodeAt(e + 1), r2 = t2.charCodeAt(e + 2), w2 = t2.charCodeAt(e + 3), O2 = t2.charCodeAt(e + 4);
          if (!(i3 === 5 && a3 === 104 && d === 116 && r2 === 116 && w2 === 112 && O2 === 115)) {
            if (!(i3 === 4 && a3 === 104 && d === 116 && r2 === 116 && w2 === 112)) {
              if (!(i3 === 3 && a3 === 119 && d === 115 && r2 === 115)) {
                if (!(i3 === 2 && a3 === 119 && d === 115)) for (let C2 = e; C2 < c2; C2 += 1) {
                  const n5 = t2.charCodeAt(C2) | 32;
                  if (!(n5 >= 97 && n5 <= 122 || n5 >= 48 && n5 <= 57 || n5 === 46 || n5 === 45 || n5 === 43)) return null;
                }
              }
            }
          }
          for (e = c2 + 2; t2.charCodeAt(e) === 47; ) e += 1;
        }
      }
      let s = -1, h2 = -1, f2 = -1;
      for (let c2 = e; c2 < o; c2 += 1) {
        const i3 = t2.charCodeAt(c2);
        if (i3 === 35 || i3 === 47 || i3 === 63) {
          o = c2;
          break;
        } else i3 === 64 ? s = c2 : i3 === 93 ? h2 = c2 : i3 === 58 ? f2 = c2 : i3 >= 65 && i3 <= 90 && (l2 = true);
      }
      if (s !== -1 && s > e && s < o && (e = s + 1), t2.charCodeAt(e) === 91) return h2 !== -1 ? t2.slice(e + 1, h2).toLowerCase() : null;
      f2 !== -1 && f2 > e && f2 < o && (o = f2);
    }
    for (; o > e + 1 && t2.charCodeAt(o - 1) === 46; ) o -= 1;
    const A2 = e !== 0 || o !== t2.length ? t2.slice(e, o) : t2;
    return l2 ? A2.toLowerCase() : A2;
  }
  function i2(e) {
    if (e.length < 7 || e.length > 15) return false;
    let t2 = 0;
    for (let r2 = 0; r2 < e.length; r2 += 1) {
      const f2 = e.charCodeAt(r2);
      if (f2 === 46) t2 += 1;
      else if (f2 < 48 || f2 > 57) return false;
    }
    return t2 === 3 && e.charCodeAt(0) !== 46 && e.charCodeAt(e.length - 1) !== 46;
  }
  function n(e) {
    if (e.length < 3) return false;
    let t2 = e.startsWith("[") ? 1 : 0, r2 = e.length;
    if (e[r2 - 1] === "]" && (r2 -= 1), r2 - t2 > 39) return false;
    let f2 = false;
    for (; t2 < r2; t2 += 1) {
      const l2 = e.charCodeAt(t2);
      if (l2 === 58) f2 = true;
      else if (!(l2 >= 48 && l2 <= 57 || l2 >= 97 && l2 <= 102 || l2 >= 65 && l2 <= 90)) return false;
    }
    return f2;
  }
  function u2(e) {
    return n(e) || i2(e);
  }
  function n2(r2) {
    return r2 >= 97 && r2 <= 122 || r2 >= 48 && r2 <= 57 || r2 > 127;
  }
  function is_valid_default(r2) {
    if (r2.length > 255 || r2.length === 0 || !n2(r2.charCodeAt(0)) && r2.charCodeAt(0) !== 46 && r2.charCodeAt(0) !== 95) return false;
    let f2 = -1, e = -1;
    const i3 = r2.length;
    for (let t2 = 0; t2 < i3; t2 += 1) {
      const l2 = r2.charCodeAt(t2);
      if (l2 === 46) {
        if (t2 - f2 > 64 || e === 46 || e === 45 || e === 95) return false;
        f2 = t2;
      } else if (!(n2(l2) || l2 === 45 || l2 === 95)) return false;
      e = l2;
    }
    return i3 - f2 - 1 <= 63 && e !== 45;
  }
  function t({ allowIcannDomains: e = true, allowPrivateDomains: u3 = false, detectIp: r2 = true, extractHostname: n5 = true, mixedInputs: f2 = true, validHosts: l2 = null, validateHostname: s = true }) {
    return { allowIcannDomains: e, allowPrivateDomains: u3, detectIp: r2, extractHostname: n5, mixedInputs: f2, validHosts: l2, validateHostname: s };
  }
  var a2 = t({});
  function setDefaults(e) {
    return e === void 0 ? a2 : t(e);
  }
  function n3(e, t2) {
    return t2.length === e.length ? "" : e.slice(0, -t2.length - 1);
  }
  function getEmptyResult() {
    return { domain: null, domainWithoutSuffix: null, hostname: null, isIcann: null, isIp: null, isPrivate: null, publicSuffix: null, subdomain: null };
  }
  function resetResult(i3) {
    i3.domain = null, i3.domainWithoutSuffix = null, i3.hostname = null, i3.isIcann = null, i3.isIp = null, i3.isPrivate = null, i3.publicSuffix = null, i3.subdomain = null;
  }
  function parseImpl(i3, m2, t2, p3, n5) {
    const o = setDefaults(p3);
    return typeof i3 != "string" || (o.extractHostname ? o.mixedInputs ? n5.hostname = g3(i3, is_valid_default(i3)) : n5.hostname = g3(i3, false) : n5.hostname = i3, o.detectIp && n5.hostname !== null && (n5.isIp = u2(n5.hostname), n5.isIp)) ? n5 : o.validateHostname && o.extractHostname && n5.hostname !== null && !is_valid_default(n5.hostname) ? (n5.hostname = null, n5) : (m2 === 0 || n5.hostname === null || (t2(n5.hostname, o, n5), m2 === 2 || n5.publicSuffix === null) || (n5.domain = g2(n5.publicSuffix, n5.hostname, o), m2 === 3 || n5.domain === null) || (n5.subdomain = n3(n5.hostname, n5.domain), m2 === 4) || (n5.domainWithoutSuffix = i(n5.domain, n5.publicSuffix)), n5);
  }
  function fast_path_default(i3, l2, e) {
    if (!l2.allowPrivateDomains && i3.length > 3) {
      const n5 = i3.length - 1, r2 = i3.charCodeAt(n5), f2 = i3.charCodeAt(n5 - 1), c2 = i3.charCodeAt(n5 - 2), s = i3.charCodeAt(n5 - 3);
      if (r2 === 109 && f2 === 111 && c2 === 99 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "com", true;
      if (r2 === 103 && f2 === 114 && c2 === 111 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "org", true;
      if (r2 === 117 && f2 === 100 && c2 === 101 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "edu", true;
      if (r2 === 118 && f2 === 111 && c2 === 103 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "gov", true;
      if (r2 === 116 && f2 === 101 && c2 === 110 && s === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "net", true;
      if (r2 === 101 && f2 === 100 && c2 === 46) return e.isIcann = true, e.isPrivate = false, e.publicSuffix = "de", true;
    }
    return false;
  }
  var exceptions = (function() {
    const a3 = [1, {}], e = [0, { city: a3 }];
    return [0, { ck: [0, { www: a3 }], jp: [0, { kawasaki: e, kitakyushu: e, kobe: e, nagoya: e, sapporo: e, sendai: e, yokohama: e }] }];
  })(), rules = (function() {
    const a3 = [1, {}], e = [2, {}], m2 = [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3 }], w2 = [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], o = [0, { "*": e }], C2 = [2, { s: o }], O2 = [0, { relay: e }], D2 = [2, { id: e }], g4 = [1, { gov: a3 }], n5 = [0, { airflow: o, "lambda-url": e, "transfer-webapp": e }], l2 = [0, { airflow: o, "transfer-webapp": e }], P2 = [0, { "transfer-webapp": e }], Q = [0, { "transfer-webapp": e, "transfer-webapp-fips": e }], u3 = [0, { notebook: e, studio: e }], c2 = [0, { labeling: e, notebook: e, studio: e }], R = [0, { notebook: e }], x2 = [0, { labeling: e, notebook: e, "notebook-fips": e, studio: e }], S2 = [0, { notebook: e, "notebook-fips": e, studio: e, "studio-fips": e }], E2 = [0, { shop: e }], r2 = [0, { "*": a3 }], y2 = [1, { co: e }], T2 = [0, { objects: e }], U = [2, { "eu-west-1": e, "us-east-1": e }], V2 = [0, { lb: e, s3: e, website: e }], F2 = [2, { nodes: e }], W2 = [0, { my: e }], k2 = [0, { s3: e, "s3-accesspoint": e, "s3-website": e }], X = [0, { s3: e, "s3-accesspoint": e }], Y = [0, { direct: e }], d = [0, { "webview-assets": e }], h2 = [0, { vfs: e, "webview-assets": e }], v2 = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e, "aws-cloud9": d, cloud9: h2 }], z = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: X, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e, "aws-cloud9": d, cloud9: h2 }], p3 = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e, "analytics-gateway": e, "aws-cloud9": d, cloud9: h2 }], b2 = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e }], j2 = [0, { s3: e, "s3-accesspoint": e, "s3-accesspoint-fips": e, "s3-fips": e, "s3-website": e }], Z = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: j2, s3: e, "s3-accesspoint": e, "s3-accesspoint-fips": e, "s3-fips": e, "s3-object-lambda": e, "s3-website": e, "aws-cloud9": d, cloud9: h2 }], G = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: j2, s3: e, "s3-accesspoint": e, "s3-accesspoint-fips": e, "s3-fips": e, "s3-object-lambda": e, "s3-website": e }], $ = [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: j2, s3: e, "s3-accesspoint": e, "s3-accesspoint-fips": e, "s3-deprecated": e, "s3-fips": e, "s3-object-lambda": e, "s3-website": e, "analytics-gateway": e, "aws-cloud9": d, cloud9: h2 }], s = [0, { auth: e }], q = [0, { auth: e, "auth-fips": e }], aa = [0, { "auth-fips": e }], ea = [0, { apps: e }], H = [0, { paas: e }], oa = [2, { eu: e }], I2 = [0, { app: e }], J = [0, { site: e }], _ = [1, { com: a3, edu: a3, net: a3, org: a3 }], K = [0, { j: e }], ia = [0, { dyn: e }], sa = [2, { web: e }], na = [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3 }], ta = [0, { p: e }], ra = [0, { user: e }], ua = [1, { ms: e }], f2 = [0, { cdn: e }], ma = [2, { raw: o }], L2 = [0, { cust: e, reservd: e }], la = [0, { cust: e }], M2 = [0, { s3: e }], ca = [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3 }], N = [0, { ipfs: e }], A2 = [1, { framer: e }], da = [0, { forgot: e }], pa = [0, { blob: e, file: e, web: e }], ga = [0, { core: pa, servicebus: e }], t2 = [1, { gs: a3 }], ka = [0, { nes: a3 }], i3 = [1, { k12: a3, cc: a3, lib: a3 }], ha = [1, { cc: a3 }], B2 = [1, { cc: a3, lib: a3 }];
    return [0, { ac: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, drr: e, feedback: e, forms: e }], ad: a3, ae: [1, { ac: a3, co: a3, gov: a3, mil: a3, net: a3, org: a3, sch: a3 }], aero: [1, { airline: a3, airport: a3, "accident-investigation": a3, "accident-prevention": a3, aerobatic: a3, aeroclub: a3, aerodrome: a3, agents: a3, "air-surveillance": a3, "air-traffic-control": a3, aircraft: a3, airtraffic: a3, ambulance: a3, association: a3, author: a3, ballooning: a3, broker: a3, caa: a3, cargo: a3, catering: a3, certification: a3, championship: a3, charter: a3, civilaviation: a3, club: a3, conference: a3, consultant: a3, consulting: a3, control: a3, council: a3, crew: a3, design: a3, dgca: a3, educator: a3, emergency: a3, engine: a3, engineer: a3, entertainment: a3, equipment: a3, exchange: a3, express: a3, federation: a3, flight: a3, freight: a3, fuel: a3, gliding: a3, government: a3, groundhandling: a3, group: a3, hanggliding: a3, homebuilt: a3, insurance: a3, journal: a3, journalist: a3, leasing: a3, logistics: a3, magazine: a3, maintenance: a3, marketplace: a3, media: a3, microlight: a3, modelling: a3, navigation: a3, parachuting: a3, paragliding: a3, "passenger-association": a3, pilot: a3, press: a3, production: a3, recreation: a3, repbody: a3, res: a3, research: a3, rotorcraft: a3, safety: a3, scientist: a3, services: a3, show: a3, skydiving: a3, software: a3, student: a3, taxi: a3, trader: a3, trading: a3, trainer: a3, union: a3, workinggroup: a3, works: a3 }], af: m2, ag: [1, { co: a3, com: a3, net: a3, nom: a3, org: a3, obj: e }], ai: [1, { com: a3, net: a3, off: a3, org: a3, uwu: e, framer: e, kiloapps: e }], al: w2, am: [1, { co: a3, com: a3, commune: a3, net: a3, org: a3, radio: e }], ao: [1, { co: a3, ed: a3, edu: a3, gov: a3, gv: a3, it: a3, og: a3, org: a3, pb: a3 }], aq: a3, ar: [1, { bet: a3, com: a3, coop: a3, edu: a3, gob: a3, gov: a3, int: a3, mil: a3, musica: a3, mutual: a3, net: a3, org: a3, seg: a3, senasa: a3, tur: a3 }], arpa: [1, { e164: a3, home: a3, "in-addr": a3, ip6: a3, iris: a3, uri: a3, urn: a3 }], as: g4, asia: [1, { cloudns: e, daemon: e, dix: e }], at: [1, { 4: e, ac: [1, { sth: a3 }], co: a3, gv: a3, or: a3, funkfeuer: [0, { wien: e }], futurecms: [0, { "*": e, ex: o, in: o }], futurehosting: e, futuremailing: e, ortsinfo: [0, { ex: o, kunden: o }], biz: e, info: e, "123webseite": e, priv: e, my: e, myspreadshop: e, "12hp": e, "2ix": e, "4lima": e, "lima-city": e }], au: [1, { asn: a3, com: [1, { cloudlets: [0, { mel: e }], myspreadshop: e }], edu: [1, { act: a3, catholic: a3, nsw: a3, nt: a3, qld: a3, sa: a3, tas: a3, vic: a3, wa: a3 }], gov: [1, { qld: a3, sa: a3, tas: a3, vic: a3, wa: a3 }], id: a3, net: a3, org: a3, conf: a3, oz: a3, act: a3, nsw: a3, nt: a3, qld: a3, sa: a3, tas: a3, vic: a3, wa: a3, hrsn: [0, { vps: e }] }], aw: [1, { com: a3 }], ax: a3, az: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, int: a3, mil: a3, name: a3, net: a3, org: a3, pp: a3, pro: a3 }], ba: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, brendly: E2, rs: e }], bb: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3, store: a3, tv: a3 }], bd: [1, { ac: a3, ai: a3, co: a3, com: a3, edu: a3, gov: a3, id: a3, info: a3, it: a3, mil: a3, net: a3, org: a3, sch: a3, tv: a3 }], be: [1, { ac: a3, cloudns: e, webhosting: e, interhostsolutions: [0, { cloud: e }], kuleuven: [0, { ezproxy: e }], my: e, "123website": e, myspreadshop: e, transurl: o }], bf: g4, bg: [1, { 0: a3, 1: a3, 2: a3, 3: a3, 4: a3, 5: a3, 6: a3, 7: a3, 8: a3, 9: a3, a: a3, b: a3, c: a3, d: a3, e: a3, f: a3, g: a3, h: a3, i: a3, j: a3, k: a3, l: a3, m: a3, n: a3, o: a3, p: a3, q: a3, r: a3, s: a3, t: a3, u: a3, v: a3, w: a3, x: a3, y: a3, z: a3, barsy: e }], bh: m2, bi: [1, { co: a3, com: a3, edu: a3, or: a3, org: a3 }], biz: [1, { activetrail: e, "cloud-ip": e, cloudns: e, jozi: e, dyndns: e, "for-better": e, "for-more": e, "for-some": e, "for-the": e, selfip: e, webhop: e, orx: e, mmafan: e, myftp: e, "no-ip": e, dscloud: e }], bj: [1, { africa: a3, agro: a3, architectes: a3, assur: a3, avocats: a3, co: a3, com: a3, eco: a3, econo: a3, edu: a3, info: a3, loisirs: a3, money: a3, net: a3, org: a3, ote: a3, restaurant: a3, resto: a3, tourism: a3, univ: a3 }], bm: m2, bn: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, co: e }], bo: [1, { com: a3, edu: a3, gob: a3, int: a3, mil: a3, net: a3, org: a3, tv: a3, web: a3, academia: a3, agro: a3, arte: a3, blog: a3, bolivia: a3, ciencia: a3, cooperativa: a3, democracia: a3, deporte: a3, ecologia: a3, economia: a3, empresa: a3, indigena: a3, industria: a3, info: a3, medicina: a3, movimiento: a3, musica: a3, natural: a3, nombre: a3, noticias: a3, patria: a3, plurinacional: a3, politica: a3, profesional: a3, pueblo: a3, revista: a3, salud: a3, tecnologia: a3, tksat: a3, transporte: a3, wiki: a3 }], br: [1, { "9guacu": a3, abc: a3, adm: a3, adv: a3, agr: a3, aju: a3, am: a3, anani: a3, aparecida: a3, api: a3, app: a3, arq: a3, art: a3, ato: a3, b: a3, barueri: a3, belem: a3, bet: a3, bhz: a3, bib: a3, bio: a3, blog: a3, bmd: a3, boavista: a3, bsb: a3, campinagrande: a3, campinas: a3, caxias: a3, cim: a3, cng: a3, cnt: a3, com: [1, { simplesite: e }], contagem: a3, coop: a3, coz: a3, cri: a3, cuiaba: a3, curitiba: a3, def: a3, des: a3, det: a3, dev: a3, ecn: a3, eco: a3, edu: a3, emp: a3, enf: a3, eng: a3, esp: a3, etc: a3, eti: a3, far: a3, feira: a3, flog: a3, floripa: a3, fm: a3, fnd: a3, fortal: a3, fot: a3, foz: a3, fst: a3, g12: a3, geo: a3, ggf: a3, goiania: a3, gov: [1, { ac: a3, al: a3, am: a3, ap: a3, ba: a3, ce: a3, df: a3, es: a3, go: a3, ma: a3, mg: a3, ms: a3, mt: a3, pa: a3, pb: a3, pe: a3, pi: a3, pr: a3, rj: a3, rn: a3, ro: a3, rr: a3, rs: a3, sc: a3, se: a3, sp: a3, to: a3 }], gru: a3, ia: a3, imb: a3, ind: a3, inf: a3, jab: a3, jampa: a3, jdf: a3, joinville: a3, jor: a3, jus: a3, leg: [1, { ac: e, al: e, am: e, ap: e, ba: e, ce: e, df: e, es: e, go: e, ma: e, mg: e, ms: e, mt: e, pa: e, pb: e, pe: e, pi: e, pr: e, rj: e, rn: e, ro: e, rr: e, rs: e, sc: e, se: e, sp: e, to: e }], leilao: a3, lel: a3, log: a3, londrina: a3, macapa: a3, maceio: a3, manaus: a3, maringa: a3, mat: a3, med: a3, mil: a3, morena: a3, mp: a3, mus: a3, natal: a3, net: a3, niteroi: a3, nom: r2, not: a3, ntr: a3, odo: a3, ong: a3, org: a3, osasco: a3, palmas: a3, poa: a3, ppg: a3, pro: a3, psc: a3, psi: a3, pvh: a3, qsl: a3, radio: a3, rec: a3, recife: a3, rep: a3, ribeirao: a3, rio: a3, riobranco: a3, riopreto: a3, salvador: a3, sampa: a3, santamaria: a3, santoandre: a3, saobernardo: a3, saogonca: a3, seg: a3, sjc: a3, slg: a3, slz: a3, social: a3, sorocaba: a3, srv: a3, taxi: a3, tc: a3, tec: a3, teo: a3, the: a3, tmp: a3, trd: a3, tur: a3, tv: a3, udi: a3, vet: a3, vix: a3, vlog: a3, wiki: a3, xyz: a3, zlg: a3, tche: e }], bs: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, we: e }], bt: m2, bv: a3, bw: [1, { ac: a3, co: a3, gov: a3, net: a3, org: a3 }], by: [1, { gov: a3, mil: a3, com: a3, of: a3, mediatech: e }], bz: [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, za: e, mydns: e, gsj: e }], ca: [1, { ab: a3, bc: a3, mb: a3, nb: a3, nf: a3, nl: a3, ns: a3, nt: a3, nu: a3, on: a3, pe: a3, qc: a3, sk: a3, yk: a3, gc: a3, barsy: e, awdev: o, co: e, "no-ip": e, onid: e, myspreadshop: e, box: e }], cat: a3, cc: [1, { cleverapps: e, "cloud-ip": e, cloudns: e, ccwu: e, ftpaccess: e, "game-server": e, myphotos: e, scrapping: e, twmail: e, csx: e, fantasyleague: e, spawn: [0, { instances: e }], sryze: e, ec: e, eu: e, gu: e, uk: e, us: e }], cd: [1, { gov: a3, cc: e }], cf: a3, cg: a3, ch: [1, { square7: e, cloudns: e, cloudscale: [0, { cust: e, lpg: T2, rma: T2 }], objectstorage: [0, { lpg: e, rma: e }], flow: [0, { ae: [0, { alp1: e }], appengine: e }], "linkyard-cloud": e, gotdns: e, dnsking: e, "123website": e, myspreadshop: e, firenet: [0, { "*": e, svc: o }], "12hp": e, "2ix": e, "4lima": e, "lima-city": e }], ci: [1, { ac: a3, "xn--aroport-bya": a3, aéroport: a3, asso: a3, co: a3, com: a3, ed: a3, edu: a3, go: a3, gouv: a3, int: a3, net: a3, or: a3, org: a3, us: e }], ck: r2, cl: [1, { co: a3, gob: a3, gov: a3, mil: a3, cloudns: e }], cm: [1, { co: a3, com: a3, gov: a3, net: a3 }], cn: [1, { ac: a3, com: [1, { amazonaws: [0, { "cn-north-1": [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, rds: o, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-deprecated": e, "s3-object-lambda": e, "s3-website": e }], "cn-northwest-1": [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, rds: o, dualstack: X, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e }], compute: o, airflow: [0, { "cn-north-1": o, "cn-northwest-1": o }], eb: [0, { "cn-north-1": e, "cn-northwest-1": e }], elb: o }], amazonwebservices: [0, { on: [0, { "cn-north-1": l2, "cn-northwest-1": l2 }] }], sagemaker: [0, { "cn-north-1": u3, "cn-northwest-1": u3 }] }], edu: a3, gov: a3, mil: a3, net: a3, org: a3, "xn--55qx5d": a3, 公司: a3, "xn--od0alg": a3, 網絡: a3, "xn--io0a7i": a3, 网络: a3, ah: a3, bj: a3, cq: a3, fj: a3, gd: a3, gs: a3, gx: a3, gz: a3, ha: a3, hb: a3, he: a3, hi: a3, hk: a3, hl: a3, hn: a3, jl: a3, js: a3, jx: a3, ln: a3, mo: a3, nm: a3, nx: a3, qh: a3, sc: a3, sd: a3, sh: [1, { as: e }], sn: a3, sx: a3, tj: a3, tw: a3, xj: a3, xz: a3, yn: a3, zj: a3, "canva-apps": e, canvasite: W2, myqnapcloud: e, quickconnect: Y }], co: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3, carrd: e, crd: e, otap: o, hidns: e, leadpages: e, lpages: e, mypi: e, xmit: o, rdpa: [0, { clusters: o, srvrless: o }], firewalledreplit: D2, repl: D2, supabase: [2, { realtime: e, storage: e }], umso: e }], com: [1, { a2hosted: e, cpserver: e, adobeaemcloud: [2, { dev: o }], africa: e, auiusercontent: o, aivencloud: e, alibabacloudcs: e, kasserver: e, amazonaws: [0, { "af-south-1": v2, "ap-east-1": z, "ap-northeast-1": p3, "ap-northeast-2": p3, "ap-northeast-3": v2, "ap-south-1": p3, "ap-south-2": b2, "ap-southeast-1": p3, "ap-southeast-2": p3, "ap-southeast-3": b2, "ap-southeast-4": b2, "ap-southeast-5": [0, { "execute-api": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-deprecated": e, "s3-object-lambda": e, "s3-website": e }], "ca-central-1": Z, "ca-west-1": G, "eu-central-1": p3, "eu-central-2": b2, "eu-north-1": z, "eu-south-1": v2, "eu-south-2": b2, "eu-west-1": [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-deprecated": e, "s3-object-lambda": e, "s3-website": e, "analytics-gateway": e, "aws-cloud9": d, cloud9: h2 }], "eu-west-2": z, "eu-west-3": v2, "il-central-1": [0, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: k2, s3: e, "s3-accesspoint": e, "s3-object-lambda": e, "s3-website": e, "aws-cloud9": d, cloud9: [0, { vfs: e }] }], "me-central-1": b2, "me-south-1": z, "sa-east-1": v2, "us-east-1": [2, { "execute-api": e, "emrappui-prod": e, "emrnotebooks-prod": e, "emrstudio-prod": e, dualstack: j2, s3: e, "s3-accesspoint": e, "s3-accesspoint-fips": e, "s3-deprecated": e, "s3-fips": e, "s3-object-lambda": e, "s3-website": e, "analytics-gateway": e, "aws-cloud9": d, cloud9: h2 }], "us-east-2": $, "us-gov-east-1": G, "us-gov-west-1": G, "us-west-1": Z, "us-west-2": $, compute: o, "compute-1": o, airflow: [0, { "af-south-1": o, "ap-east-1": o, "ap-northeast-1": o, "ap-northeast-2": o, "ap-northeast-3": o, "ap-south-1": o, "ap-south-2": o, "ap-southeast-1": o, "ap-southeast-2": o, "ap-southeast-3": o, "ap-southeast-4": o, "ap-southeast-5": o, "ap-southeast-7": o, "ca-central-1": o, "ca-west-1": o, "eu-central-1": o, "eu-central-2": o, "eu-north-1": o, "eu-south-1": o, "eu-south-2": o, "eu-west-1": o, "eu-west-2": o, "eu-west-3": o, "il-central-1": o, "me-central-1": o, "me-south-1": o, "sa-east-1": o, "us-east-1": o, "us-east-2": o, "us-west-1": o, "us-west-2": o }], rds: [0, { "af-south-1": o, "ap-east-1": o, "ap-east-2": o, "ap-northeast-1": o, "ap-northeast-2": o, "ap-northeast-3": o, "ap-south-1": o, "ap-south-2": o, "ap-southeast-1": o, "ap-southeast-2": o, "ap-southeast-3": o, "ap-southeast-4": o, "ap-southeast-5": o, "ap-southeast-6": o, "ap-southeast-7": o, "ca-central-1": o, "ca-west-1": o, "eu-central-1": o, "eu-central-2": o, "eu-west-1": o, "eu-west-2": o, "eu-west-3": o, "il-central-1": o, "me-central-1": o, "me-south-1": o, "mx-central-1": o, "sa-east-1": o, "us-east-1": o, "us-east-2": o, "us-gov-east-1": o, "us-gov-west-1": o, "us-northeast-1": o, "us-west-1": o, "us-west-2": o }], s3: e, "s3-1": e, "s3-ap-east-1": e, "s3-ap-northeast-1": e, "s3-ap-northeast-2": e, "s3-ap-northeast-3": e, "s3-ap-south-1": e, "s3-ap-southeast-1": e, "s3-ap-southeast-2": e, "s3-ca-central-1": e, "s3-eu-central-1": e, "s3-eu-north-1": e, "s3-eu-west-1": e, "s3-eu-west-2": e, "s3-eu-west-3": e, "s3-external-1": e, "s3-fips-us-gov-east-1": e, "s3-fips-us-gov-west-1": e, "s3-global": [0, { accesspoint: [0, { mrap: e }] }], "s3-me-south-1": e, "s3-sa-east-1": e, "s3-us-east-2": e, "s3-us-gov-east-1": e, "s3-us-gov-west-1": e, "s3-us-west-1": e, "s3-us-west-2": e, "s3-website-ap-northeast-1": e, "s3-website-ap-southeast-1": e, "s3-website-ap-southeast-2": e, "s3-website-eu-west-1": e, "s3-website-sa-east-1": e, "s3-website-us-east-1": e, "s3-website-us-gov-west-1": e, "s3-website-us-west-1": e, "s3-website-us-west-2": e, elb: o }], amazoncognito: [0, { "af-south-1": s, "ap-east-1": s, "ap-northeast-1": s, "ap-northeast-2": s, "ap-northeast-3": s, "ap-south-1": s, "ap-south-2": s, "ap-southeast-1": s, "ap-southeast-2": s, "ap-southeast-3": s, "ap-southeast-4": s, "ap-southeast-5": s, "ap-southeast-7": s, "ca-central-1": s, "ca-west-1": s, "eu-central-1": s, "eu-central-2": s, "eu-north-1": s, "eu-south-1": s, "eu-south-2": s, "eu-west-1": s, "eu-west-2": s, "eu-west-3": s, "il-central-1": s, "me-central-1": s, "me-south-1": s, "mx-central-1": s, "sa-east-1": s, "us-east-1": q, "us-east-2": q, "us-gov-east-1": aa, "us-gov-west-1": aa, "us-west-1": q, "us-west-2": q }], amplifyapp: e, awsapprunner: o, awsapps: e, elasticbeanstalk: [2, { "af-south-1": e, "ap-east-1": e, "ap-northeast-1": e, "ap-northeast-2": e, "ap-northeast-3": e, "ap-south-1": e, "ap-southeast-1": e, "ap-southeast-2": e, "ap-southeast-3": e, "ap-southeast-5": e, "ap-southeast-7": e, "ca-central-1": e, "eu-central-1": e, "eu-north-1": e, "eu-south-1": e, "eu-south-2": e, "eu-west-1": e, "eu-west-2": e, "eu-west-3": e, "il-central-1": e, "me-central-1": e, "me-south-1": e, "sa-east-1": e, "us-east-1": e, "us-east-2": e, "us-gov-east-1": e, "us-gov-west-1": e, "us-west-1": e, "us-west-2": e }], awsglobalaccelerator: e, siiites: e, appspacehosted: e, appspaceusercontent: e, "on-aptible": e, myasustor: e, "atlassian-3p": o, "atlassian-3p-us-gov-mod": o, "atlassian-isolated-3p": o, "balena-devices": e, boutir: e, bplaced: e, cafjs: e, "canva-apps": e, "canva-hosted-embed": e, canvacode: e, "rice-labs": e, "cdn77-storage": e, br: e, cn: e, de: e, eu: e, jpn: e, mex: e, ru: e, sa: e, uk: e, us: e, za: e, "clever-cloud": [0, { services: o }], abrdns: e, dnsabr: e, "ip-ddns": e, jdevcloud: e, wpdevcloud: e, "cf-ipfs": e, "cloudflare-ipfs": e, trycloudflare: e, co: e, devinapps: o, builtwithdark: e, datadetect: [0, { demo: e, instance: e }], dattolocal: e, dattorelay: e, dattoweb: e, mydatto: e, deployagent: e, digitaloceanspaces: o, discordsays: e, discordsez: e, drayddns: e, dreamhosters: e, durumis: e, blogdns: e, cechire: e, dnsalias: e, dnsdojo: e, doesntexist: e, dontexist: e, doomdns: e, "dyn-o-saur": e, dynalias: e, "dyndns-at-home": e, "dyndns-at-work": e, "dyndns-blog": e, "dyndns-free": e, "dyndns-home": e, "dyndns-ip": e, "dyndns-mail": e, "dyndns-office": e, "dyndns-pics": e, "dyndns-remote": e, "dyndns-server": e, "dyndns-web": e, "dyndns-wiki": e, "dyndns-work": e, "est-a-la-maison": e, "est-a-la-masion": e, "est-le-patron": e, "est-mon-blogueur": e, "from-ak": e, "from-al": e, "from-ar": e, "from-ca": e, "from-ct": e, "from-dc": e, "from-de": e, "from-fl": e, "from-ga": e, "from-hi": e, "from-ia": e, "from-id": e, "from-il": e, "from-in": e, "from-ks": e, "from-ky": e, "from-ma": e, "from-md": e, "from-mi": e, "from-mn": e, "from-mo": e, "from-ms": e, "from-mt": e, "from-nc": e, "from-nd": e, "from-ne": e, "from-nh": e, "from-nj": e, "from-nm": e, "from-nv": e, "from-oh": e, "from-ok": e, "from-or": e, "from-pa": e, "from-pr": e, "from-ri": e, "from-sc": e, "from-sd": e, "from-tn": e, "from-tx": e, "from-ut": e, "from-va": e, "from-vt": e, "from-wa": e, "from-wi": e, "from-wv": e, "from-wy": e, getmyip: e, gotdns: e, "hobby-site": e, homelinux: e, homeunix: e, iamallama: e, "is-a-anarchist": e, "is-a-blogger": e, "is-a-bookkeeper": e, "is-a-bulls-fan": e, "is-a-caterer": e, "is-a-chef": e, "is-a-conservative": e, "is-a-cpa": e, "is-a-cubicle-slave": e, "is-a-democrat": e, "is-a-designer": e, "is-a-doctor": e, "is-a-financialadvisor": e, "is-a-geek": e, "is-a-green": e, "is-a-guru": e, "is-a-hard-worker": e, "is-a-hunter": e, "is-a-landscaper": e, "is-a-lawyer": e, "is-a-liberal": e, "is-a-libertarian": e, "is-a-llama": e, "is-a-musician": e, "is-a-nascarfan": e, "is-a-nurse": e, "is-a-painter": e, "is-a-personaltrainer": e, "is-a-photographer": e, "is-a-player": e, "is-a-republican": e, "is-a-rockstar": e, "is-a-socialist": e, "is-a-student": e, "is-a-teacher": e, "is-a-techie": e, "is-a-therapist": e, "is-an-accountant": e, "is-an-actor": e, "is-an-actress": e, "is-an-anarchist": e, "is-an-artist": e, "is-an-engineer": e, "is-an-entertainer": e, "is-certified": e, "is-gone": e, "is-into-anime": e, "is-into-cars": e, "is-into-cartoons": e, "is-into-games": e, "is-leet": e, "is-not-certified": e, "is-slick": e, "is-uberleet": e, "is-with-theband": e, "isa-geek": e, "isa-hockeynut": e, issmarterthanyou: e, "likes-pie": e, likescandy: e, "neat-url": e, "saves-the-whales": e, selfip: e, "sells-for-less": e, "sells-for-u": e, servebbs: e, "simple-url": e, "space-to-rent": e, "teaches-yoga": e, writesthisblog: e, "1cooldns": e, bumbleshrimp: e, ddnsfree: e, ddnsgeek: e, ddnsguru: e, dynuddns: e, dynuhosting: e, giize: e, gleeze: e, kozow: e, loseyourip: e, ooguy: e, pivohosting: e, theworkpc: e, wiredbladehosting: e, emergentagent: [0, { preview: e }], mytuleap: e, "tuleap-partners": e, encoreapi: e, evennode: [0, { "eu-1": e, "eu-2": e, "eu-3": e, "eu-4": e, "us-1": e, "us-2": e, "us-3": e, "us-4": e }], onfabrica: e, "fastly-edge": e, "fastly-terrarium": e, "fastvps-server": e, mydobiss: e, firebaseapp: e, fldrv: e, framercanvas: e, "freebox-os": e, freeboxos: e, freemyip: e, aliases121: e, gentapps: e, gentlentapis: e, githubusercontent: e, "0emm": o, appspot: [2, { r: o }], blogspot: e, codespot: e, googleapis: e, googlecode: e, pagespeedmobilizer: e, withgoogle: e, withyoutube: e, grayjayleagues: e, hatenablog: e, hatenadiary: e, "hercules-app": e, "hercules-dev": e, herokuapp: e, gr: e, smushcdn: e, wphostedmail: e, wpmucdn: e, pixolino: e, "apps-1and1": e, "live-website": e, "webspace-host": e, dopaas: e, "hosted-by-previder": H, hosteur: [0, { "rag-cloud": e, "rag-cloud-ch": e }], "ik-server": [0, { jcloud: e, "jcloud-ver-jpc": e }], jelastic: [0, { demo: e }], massivegrid: H, wafaicloud: [0, { jed: e, ryd: e }], "eu1-plenit": e, "la1-plenit": e, "us1-plenit": e, webadorsite: e, "on-forge": e, "on-vapor": e, lpusercontent: e, linode: [0, { members: e, nodebalancer: o }], linodeobjects: o, linodeusercontent: [0, { ip: e }], localtonet: e, lovableproject: e, barsycenter: e, barsyonline: e, lutrausercontent: o, magicpatternsapp: e, modelscape: e, mwcloudnonprod: e, polyspace: e, miniserver: e, atmeta: e, fbsbx: ea, metaaiusercontent: o, meteorapp: oa, routingthecloud: e, "same-app": e, "same-preview": e, mydbserver: e, mochausercontent: e, hostedpi: e, "mythic-beasts": [0, { caracal: e, customer: e, fentiger: e, lynx: e, ocelot: e, oncilla: e, onza: e, sphinx: e, vs: e, x: e, yali: e }], nospamproxy: [0, { cloud: [2, { o365: e }] }], "4u": e, nfshost: e, "3utilities": e, blogsyte: e, ciscofreak: e, damnserver: e, ddnsking: e, ditchyourip: e, dnsiskinky: e, dynns: e, geekgalaxy: e, "health-carereform": e, homesecuritymac: e, homesecuritypc: e, myactivedirectory: e, mysecuritycamera: e, myvnc: e, "net-freaks": e, onthewifi: e, point2this: e, quicksytes: e, securitytactics: e, servebeer: e, servecounterstrike: e, serveexchange: e, serveftp: e, servegame: e, servehalflife: e, servehttp: e, servehumour: e, serveirc: e, servemp3: e, servep2p: e, servepics: e, servequake: e, servesarcasm: e, stufftoread: e, unusualperson: e, workisboring: e, myiphost: e, observableusercontent: [0, { static: e }], simplesite: e, oaiusercontent: o, orsites: e, operaunite: e, "customer-oci": [0, { "*": e, oci: o, ocp: o, ocs: o }], oraclecloudapps: o, oraclegovcloudapps: o, "authgear-staging": e, authgearapps: e, outsystemscloud: e, ownprovider: e, pgfog: e, gotpantheon: e, paywhirl: o, forgeblocks: e, upsunapp: e, "postman-echo": e, prgmr: [0, { xen: e }], "project-study": [0, { dev: e }], pythonanywhere: oa, qa2: e, "alpha-myqnapcloud": e, "dev-myqnapcloud": e, mycloudnas: e, mynascloud: e, myqnapcloud: e, qualifioapp: e, ladesk: e, qualyhqpartner: o, qualyhqportal: o, qbuser: e, quipelements: o, rackmaze: e, "readthedocs-hosted": e, rhcloud: e, onrender: e, render: I2, "subsc-pay": e, "180r": e, dojin: e, sakuratan: e, sakuraweb: e, x0: e, code: [0, { builder: o, "dev-builder": o, "stg-builder": o }], salesforce: [0, { platform: [0, { "code-builder-stg": [0, { test: [0, { "001": o }] }] }] }], logoip: e, scrysec: e, "firewall-gateway": e, myshopblocks: e, myshopify: e, shopitsite: e, "1kapp": e, appchizi: e, applinzi: e, sinaapp: e, vipsinaapp: e, streamlitapp: e, "try-snowplow": e, "playstation-cloud": e, myspreadshop: e, "w-corp-staticblitz": e, "w-credentialless-staticblitz": e, "w-staticblitz": e, "stackhero-network": e, stdlib: [0, { api: e }], strapiapp: [2, { media: e }], "streak-link": e, streaklinks: e, streakusercontent: e, "temp-dns": e, dsmynas: e, familyds: e, mytabit: e, taveusercontent: e, "tb-hosting": J, reservd: e, thingdustdata: e, "townnews-staging": e, typeform: [0, { pro: e }], hk: e, it: e, "deus-canvas": e, vivenushop: e, vultrobjects: o, wafflecell: e, hotelwithflight: e, "reserve-online": e, cprapid: e, pleskns: e, remotewd: e, wiardweb: [0, { pages: e }], "drive-platform": e, "base44-sandbox": e, wixsite: e, wixstudio: e, messwithdns: e, "woltlab-demo": e, wpenginepowered: [2, { js: e }], xnbay: [2, { u2: e, "u2-local": e }], xtooldevice: e, yolasite: e }], coop: a3, cr: [1, { ac: a3, co: a3, ed: a3, fi: a3, go: a3, or: a3, sa: a3 }], cu: [1, { com: a3, edu: a3, gob: a3, inf: a3, nat: a3, net: a3, org: a3 }], cv: [1, { com: a3, edu: a3, id: a3, int: a3, net: a3, nome: a3, org: a3, publ: a3 }], cw: _, cx: [1, { gov: a3, cloudns: e, ath: e, info: e, assessments: e, calculators: e, funnels: e, paynow: e, quizzes: e, researched: e, tests: e }], cy: [1, { ac: a3, biz: a3, com: [1, { scaleforce: K }], ekloges: a3, gov: a3, ltd: a3, mil: a3, net: a3, org: a3, press: a3, pro: a3, tm: a3 }], cz: [1, { gov: a3, contentproxy9: [0, { rsc: e }], realm: e, e4: e, co: e, metacentrum: [0, { cloud: o, custom: e }], muni: [0, { cloud: [0, { flt: e, usr: e }] }] }], de: [1, { bplaced: e, square7: e, "bwcloud-os-instance": o, com: e, cosidns: ia, dnsupdater: e, "dynamisches-dns": e, "internet-dns": e, "l-o-g-i-n": e, ddnss: [2, { dyn: e, dyndns: e }], "dyn-ip24": e, dyndns1: e, "home-webserver": [2, { dyn: e }], "myhome-server": e, dnshome: e, fuettertdasnetz: e, isteingeek: e, istmein: e, lebtimnetz: e, leitungsen: e, traeumtgerade: e, frusky: o, goip: e, "xn--gnstigbestellen-zvb": e, günstigbestellen: e, "xn--gnstigliefern-wob": e, günstigliefern: e, "hs-heilbronn": [0, { it: [0, { pages: e, "pages-research": e }] }], "dyn-berlin": e, "in-berlin": e, "in-brb": e, "in-butter": e, "in-dsl": e, "in-vpn": e, iservschule: e, "mein-iserv": e, schuldock: e, schulplattform: e, schulserver: e, "test-iserv": e, keymachine: e, co: e, "git-repos": e, "lcube-server": e, "svn-repos": e, barsy: e, webspaceconfig: e, "123webseite": e, rub: e, "ruhr-uni-bochum": [2, { noc: [0, { io: e }] }], logoip: e, "firewall-gateway": e, "my-gateway": e, "my-router": e, spdns: e, my: e, speedpartner: [0, { customer: e }], myspreadshop: e, "taifun-dns": e, "12hp": e, "2ix": e, "4lima": e, "lima-city": e, "virtual-user": e, virtualuser: e, "community-pro": e, diskussionsbereich: e, xenonconnect: o }], dj: a3, dk: [1, { biz: e, co: e, firm: e, reg: e, store: e, "123hjemmeside": e, myspreadshop: e }], dm: na, do: [1, { art: a3, com: a3, edu: a3, gob: a3, gov: a3, mil: a3, net: a3, org: a3, sld: a3, web: a3 }], dz: [1, { art: a3, asso: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, pol: a3, soc: a3, tm: a3 }], ec: [1, { abg: a3, adm: a3, agron: a3, arqt: a3, art: a3, bar: a3, chef: a3, com: a3, cont: a3, cpa: a3, cue: a3, dent: a3, dgn: a3, disco: a3, doc: a3, edu: a3, eng: a3, esm: a3, fin: a3, fot: a3, gal: a3, gob: a3, gov: a3, gye: a3, ibr: a3, info: a3, k12: a3, lat: a3, loj: a3, med: a3, mil: a3, mktg: a3, mon: a3, net: a3, ntr: a3, odont: a3, org: a3, pro: a3, prof: a3, psic: a3, psiq: a3, pub: a3, rio: a3, rrpp: a3, sal: a3, tech: a3, tul: a3, tur: a3, uio: a3, vet: a3, xxx: a3, base: e, official: e }], edu: [1, { rit: [0, { "git-pages": e }] }], ee: [1, { aip: a3, com: a3, edu: a3, fie: a3, gov: a3, lib: a3, med: a3, org: a3, pri: a3, riik: a3 }], eg: [1, { ac: a3, com: a3, edu: a3, eun: a3, gov: a3, info: a3, me: a3, mil: a3, name: a3, net: a3, org: a3, sci: a3, sport: a3, tv: a3 }], er: r2, es: [1, { com: a3, edu: a3, gob: a3, nom: a3, org: a3, "123miweb": e, myspreadshop: e }], et: [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, name: a3, net: a3, org: a3 }], eu: [1, { amazonwebservices: [0, { on: [0, { "eusc-de-east-1": [0, { "cognito-idp": s }] }] }], cloudns: e, prvw: e, deuxfleurs: e, dogado: [0, { jelastic: e }], barsy: e, spdns: e, nxa: o, directwp: e, transurl: o }], fi: [1, { aland: a3, dy: e, "xn--hkkinen-5wa": e, häkkinen: e, iki: e, cloudplatform: [0, { fi: e }], datacenter: [0, { demo: e, paas: e }], kapsi: e, "123kotisivu": e, myspreadshop: e }], fj: [1, { ac: a3, biz: a3, com: a3, edu: a3, gov: a3, id: a3, info: a3, mil: a3, name: a3, net: a3, org: a3, pro: a3 }], fk: r2, fm: [1, { com: a3, edu: a3, net: a3, org: a3, radio: e, user: o }], fo: a3, fr: [1, { asso: a3, com: a3, gouv: a3, nom: a3, prd: a3, tm: a3, avoues: a3, cci: a3, greta: a3, "huissier-justice": a3, "fbx-os": e, fbxos: e, "freebox-os": e, freeboxos: e, goupile: e, kdns: e, "123siteweb": e, "on-web": e, "chirurgiens-dentistes-en-france": e, dedibox: e, aeroport: e, avocat: e, chambagri: e, "chirurgiens-dentistes": e, "experts-comptables": e, medecin: e, notaires: e, pharmacien: e, port: e, veterinaire: e, myspreadshop: e, ynh: e }], ga: a3, gb: a3, gd: [1, { edu: a3, gov: a3 }], ge: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, pvt: a3, school: a3 }], gf: a3, gg: [1, { co: a3, net: a3, org: a3, ply: [0, { at: o, d6: e }], botdash: e, kaas: e, stackit: e, panel: [2, { daemon: e }] }], gh: [1, { biz: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], gi: [1, { com: a3, edu: a3, gov: a3, ltd: a3, mod: a3, org: a3 }], gl: [1, { co: a3, com: a3, edu: a3, net: a3, org: a3 }], gm: a3, gn: [1, { ac: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3 }], gov: a3, gp: [1, { asso: a3, com: a3, edu: a3, mobi: a3, net: a3, org: a3 }], gq: a3, gr: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, barsy: e, simplesite: e }], gs: a3, gt: [1, { com: a3, edu: a3, gob: a3, ind: a3, mil: a3, net: a3, org: a3 }], gu: [1, { com: a3, edu: a3, gov: a3, guam: a3, info: a3, net: a3, org: a3, web: a3 }], gw: [1, { nx: e }], gy: na, hk: [1, { com: a3, edu: a3, gov: a3, idv: a3, net: a3, org: a3, "xn--ciqpn": a3, 个人: a3, "xn--gmqw5a": a3, 個人: a3, "xn--55qx5d": a3, 公司: a3, "xn--mxtq1m": a3, 政府: a3, "xn--lcvr32d": a3, 敎育: a3, "xn--wcvs22d": a3, 教育: a3, "xn--gmq050i": a3, 箇人: a3, "xn--uc0atv": a3, 組織: a3, "xn--uc0ay4a": a3, 組织: a3, "xn--od0alg": a3, 網絡: a3, "xn--zf0avx": a3, 網络: a3, "xn--mk0axi": a3, 组織: a3, "xn--tn0ag": a3, 组织: a3, "xn--od0aq3b": a3, 网絡: a3, "xn--io0a7i": a3, 网络: a3, inc: e, ltd: e }], hm: a3, hn: [1, { com: a3, edu: a3, gob: a3, mil: a3, net: a3, org: a3 }], hr: [1, { com: a3, from: a3, iz: a3, name: a3, brendly: E2 }], ht: [1, { adult: a3, art: a3, asso: a3, com: a3, coop: a3, edu: a3, firm: a3, gouv: a3, info: a3, med: a3, net: a3, org: a3, perso: a3, pol: a3, pro: a3, rel: a3, shop: a3, rt: e }], hu: [1, { 2e3: a3, agrar: a3, bolt: a3, casino: a3, city: a3, co: a3, erotica: a3, erotika: a3, film: a3, forum: a3, games: a3, hotel: a3, info: a3, ingatlan: a3, jogasz: a3, konyvelo: a3, lakas: a3, media: a3, news: a3, org: a3, priv: a3, reklam: a3, sex: a3, shop: a3, sport: a3, suli: a3, szex: a3, tm: a3, tozsde: a3, utazas: a3, video: a3 }], id: [1, { ac: a3, biz: a3, co: a3, desa: a3, go: a3, kop: a3, mil: a3, my: a3, net: a3, or: a3, ponpes: a3, sch: a3, web: a3, "xn--9tfky": a3, "ᬩᬮᬶ": a3, e, zone: e }], ie: [1, { gov: a3, myspreadshop: e }], il: [1, { ac: a3, co: [1, { ravpage: e, mytabit: e, tabitorder: e }], gov: a3, idf: a3, k12: a3, muni: a3, net: a3, org: a3 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": a3, "xn--5dbhl8d": a3, "xn--8dbq2a": a3, "xn--hebda8b": a3 }], ישראל: [1, { אקדמיה: a3, ישוב: a3, צהל: a3, ממשל: a3 }], im: [1, { ac: a3, co: [1, { ltd: a3, plc: a3 }], com: a3, net: a3, org: a3, tt: a3, tv: a3 }], in: [1, { "5g": a3, "6g": a3, ac: a3, ai: a3, am: a3, bank: a3, bihar: a3, biz: a3, business: a3, ca: a3, cn: a3, co: a3, com: a3, coop: a3, cs: a3, delhi: a3, dr: a3, edu: a3, er: a3, fin: a3, firm: a3, gen: a3, gov: a3, gujarat: a3, ind: a3, info: a3, int: a3, internet: a3, io: a3, me: a3, mil: a3, net: a3, nic: a3, org: a3, pg: a3, post: a3, pro: a3, res: a3, travel: a3, tv: a3, uk: a3, up: a3, us: a3, cloudns: e, barsy: e, web: e, indevs: e, supabase: e }], info: [1, { cloudns: e, "dynamic-dns": e, "barrel-of-knowledge": e, "barrell-of-knowledge": e, dyndns: e, "for-our": e, "groks-the": e, "groks-this": e, "here-for-more": e, knowsitall: e, selfip: e, webhop: e, barsy: e, mayfirst: e, mittwald: e, mittwaldserver: e, typo3server: e, dvrcam: e, ilovecollege: e, "no-ip": e, forumz: e, nsupdate: e, dnsupdate: e, "v-info": e }], int: [1, { eu: a3 }], io: [1, { 2038: e, co: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3, "on-acorn": o, myaddr: e, apigee: e, "b-data": e, beagleboard: e, bitbucket: e, bluebite: e, boxfuse: e, brave: C2, browsersafetymark: e, bubble: f2, bubbleapps: e, bigv: [0, { uk0: e }], cleverapps: e, cloudbeesusercontent: e, dappnode: [0, { dyndns: e }], darklang: e, definima: e, dedyn: e, icp0: ma, icp1: ma, qzz: e, "fh-muenster": e, gitbook: e, github: e, gitlab: e, lolipop: e, "hasura-app": e, hostyhosting: e, hypernode: e, moonscale: o, beebyte: H, beebyteapp: [0, { sekd1: e }], jele: e, keenetic: e, kiloapps: e, webthings: e, loginline: e, barsy: e, azurecontainer: o, ngrok: [2, { ap: e, au: e, eu: e, in: e, jp: e, sa: e, us: e }], nodeart: [0, { stage: e }], pantheonsite: e, forgerock: [0, { id: e }], pstmn: [2, { mock: e }], protonet: e, qcx: [2, { sys: o }], qoto: e, vaporcloud: e, myrdbx: e, "rb-hosting": J, "on-k3s": o, "on-rio": o, readthedocs: e, resindevice: e, resinstaging: [0, { devices: e }], hzc: e, sandcats: e, scrypted: [0, { client: e }], "mo-siemens": e, lair: ea, stolos: o, musician: e, utwente: e, edugit: e, telebit: e, thingdust: [0, { dev: L2, disrec: L2, prod: la, testing: L2 }], tickets: e, webflow: e, webflowtest: e, "drive-platform": e, editorx: e, wixstudio: e, basicserver: e, virtualserver: e }], iq: w2, ir: [1, { ac: a3, co: a3, gov: a3, id: a3, net: a3, org: a3, sch: a3, "xn--mgba3a4f16a": a3, ایران: a3, "xn--mgba3a4fra": a3, ايران: a3, arvanedge: e, vistablog: e }], is: a3, it: [1, { edu: a3, gov: a3, abr: a3, abruzzo: a3, "aosta-valley": a3, aostavalley: a3, bas: a3, basilicata: a3, cal: a3, calabria: a3, cam: a3, campania: a3, "emilia-romagna": a3, emiliaromagna: a3, emr: a3, "friuli-v-giulia": a3, "friuli-ve-giulia": a3, "friuli-vegiulia": a3, "friuli-venezia-giulia": a3, "friuli-veneziagiulia": a3, "friuli-vgiulia": a3, "friuliv-giulia": a3, "friulive-giulia": a3, friulivegiulia: a3, "friulivenezia-giulia": a3, friuliveneziagiulia: a3, friulivgiulia: a3, fvg: a3, laz: a3, lazio: a3, lig: a3, liguria: a3, lom: a3, lombardia: a3, lombardy: a3, lucania: a3, mar: a3, marche: a3, mol: a3, molise: a3, piedmont: a3, piemonte: a3, pmn: a3, pug: a3, puglia: a3, sar: a3, sardegna: a3, sardinia: a3, sic: a3, sicilia: a3, sicily: a3, taa: a3, tos: a3, toscana: a3, "trentin-sud-tirol": a3, "xn--trentin-sd-tirol-rzb": a3, "trentin-süd-tirol": a3, "trentin-sudtirol": a3, "xn--trentin-sdtirol-7vb": a3, "trentin-südtirol": a3, "trentin-sued-tirol": a3, "trentin-suedtirol": a3, trentino: a3, "trentino-a-adige": a3, "trentino-aadige": a3, "trentino-alto-adige": a3, "trentino-altoadige": a3, "trentino-s-tirol": a3, "trentino-stirol": a3, "trentino-sud-tirol": a3, "xn--trentino-sd-tirol-c3b": a3, "trentino-süd-tirol": a3, "trentino-sudtirol": a3, "xn--trentino-sdtirol-szb": a3, "trentino-südtirol": a3, "trentino-sued-tirol": a3, "trentino-suedtirol": a3, "trentinoa-adige": a3, trentinoaadige: a3, "trentinoalto-adige": a3, trentinoaltoadige: a3, "trentinos-tirol": a3, trentinostirol: a3, "trentinosud-tirol": a3, "xn--trentinosd-tirol-rzb": a3, "trentinosüd-tirol": a3, trentinosudtirol: a3, "xn--trentinosdtirol-7vb": a3, trentinosüdtirol: a3, "trentinosued-tirol": a3, trentinosuedtirol: a3, "trentinsud-tirol": a3, "xn--trentinsd-tirol-6vb": a3, "trentinsüd-tirol": a3, trentinsudtirol: a3, "xn--trentinsdtirol-nsb": a3, trentinsüdtirol: a3, "trentinsued-tirol": a3, trentinsuedtirol: a3, tuscany: a3, umb: a3, umbria: a3, "val-d-aosta": a3, "val-daosta": a3, "vald-aosta": a3, valdaosta: a3, "valle-aosta": a3, "valle-d-aosta": a3, "valle-daosta": a3, valleaosta: a3, "valled-aosta": a3, valledaosta: a3, "vallee-aoste": a3, "xn--valle-aoste-ebb": a3, "vallée-aoste": a3, "vallee-d-aoste": a3, "xn--valle-d-aoste-ehb": a3, "vallée-d-aoste": a3, valleeaoste: a3, "xn--valleaoste-e7a": a3, valléeaoste: a3, valleedaoste: a3, "xn--valledaoste-ebb": a3, valléedaoste: a3, vao: a3, vda: a3, ven: a3, veneto: a3, ag: a3, agrigento: a3, al: a3, alessandria: a3, "alto-adige": a3, altoadige: a3, an: a3, ancona: a3, "andria-barletta-trani": a3, "andria-trani-barletta": a3, andriabarlettatrani: a3, andriatranibarletta: a3, ao: a3, aosta: a3, aoste: a3, ap: a3, aq: a3, aquila: a3, ar: a3, arezzo: a3, "ascoli-piceno": a3, ascolipiceno: a3, asti: a3, at: a3, av: a3, avellino: a3, ba: a3, balsan: a3, "balsan-sudtirol": a3, "xn--balsan-sdtirol-nsb": a3, "balsan-südtirol": a3, "balsan-suedtirol": a3, bari: a3, "barletta-trani-andria": a3, barlettatraniandria: a3, belluno: a3, benevento: a3, bergamo: a3, bg: a3, bi: a3, biella: a3, bl: a3, bn: a3, bo: a3, bologna: a3, bolzano: a3, "bolzano-altoadige": a3, bozen: a3, "bozen-sudtirol": a3, "xn--bozen-sdtirol-2ob": a3, "bozen-südtirol": a3, "bozen-suedtirol": a3, br: a3, brescia: a3, brindisi: a3, bs: a3, bt: a3, bulsan: a3, "bulsan-sudtirol": a3, "xn--bulsan-sdtirol-nsb": a3, "bulsan-südtirol": a3, "bulsan-suedtirol": a3, bz: a3, ca: a3, cagliari: a3, caltanissetta: a3, "campidano-medio": a3, campidanomedio: a3, campobasso: a3, "carbonia-iglesias": a3, carboniaiglesias: a3, "carrara-massa": a3, carraramassa: a3, caserta: a3, catania: a3, catanzaro: a3, cb: a3, ce: a3, "cesena-forli": a3, "xn--cesena-forl-mcb": a3, "cesena-forlì": a3, cesenaforli: a3, "xn--cesenaforl-i8a": a3, cesenaforlì: a3, ch: a3, chieti: a3, ci: a3, cl: a3, cn: a3, co: a3, como: a3, cosenza: a3, cr: a3, cremona: a3, crotone: a3, cs: a3, ct: a3, cuneo: a3, cz: a3, "dell-ogliastra": a3, dellogliastra: a3, en: a3, enna: a3, fc: a3, fe: a3, fermo: a3, ferrara: a3, fg: a3, fi: a3, firenze: a3, florence: a3, fm: a3, foggia: a3, "forli-cesena": a3, "xn--forl-cesena-fcb": a3, "forlì-cesena": a3, forlicesena: a3, "xn--forlcesena-c8a": a3, forlìcesena: a3, fr: a3, frosinone: a3, ge: a3, genoa: a3, genova: a3, go: a3, gorizia: a3, gr: a3, grosseto: a3, "iglesias-carbonia": a3, iglesiascarbonia: a3, im: a3, imperia: a3, is: a3, isernia: a3, kr: a3, "la-spezia": a3, laquila: a3, laspezia: a3, latina: a3, lc: a3, le: a3, lecce: a3, lecco: a3, li: a3, livorno: a3, lo: a3, lodi: a3, lt: a3, lu: a3, lucca: a3, macerata: a3, mantova: a3, "massa-carrara": a3, massacarrara: a3, matera: a3, mb: a3, mc: a3, me: a3, "medio-campidano": a3, mediocampidano: a3, messina: a3, mi: a3, milan: a3, milano: a3, mn: a3, mo: a3, modena: a3, monza: a3, "monza-brianza": a3, "monza-e-della-brianza": a3, monzabrianza: a3, monzaebrianza: a3, monzaedellabrianza: a3, ms: a3, mt: a3, na: a3, naples: a3, napoli: a3, no: a3, novara: a3, nu: a3, nuoro: a3, og: a3, ogliastra: a3, "olbia-tempio": a3, olbiatempio: a3, or: a3, oristano: a3, ot: a3, pa: a3, padova: a3, padua: a3, palermo: a3, parma: a3, pavia: a3, pc: a3, pd: a3, pe: a3, perugia: a3, "pesaro-urbino": a3, pesarourbino: a3, pescara: a3, pg: a3, pi: a3, piacenza: a3, pisa: a3, pistoia: a3, pn: a3, po: a3, pordenone: a3, potenza: a3, pr: a3, prato: a3, pt: a3, pu: a3, pv: a3, pz: a3, ra: a3, ragusa: a3, ravenna: a3, rc: a3, re: a3, "reggio-calabria": a3, "reggio-emilia": a3, reggiocalabria: a3, reggioemilia: a3, rg: a3, ri: a3, rieti: a3, rimini: a3, rm: a3, rn: a3, ro: a3, roma: a3, rome: a3, rovigo: a3, sa: a3, salerno: a3, sassari: a3, savona: a3, si: a3, siena: a3, siracusa: a3, so: a3, sondrio: a3, sp: a3, sr: a3, ss: a3, "xn--sdtirol-n2a": a3, südtirol: a3, suedtirol: a3, sv: a3, ta: a3, taranto: a3, te: a3, "tempio-olbia": a3, tempioolbia: a3, teramo: a3, terni: a3, tn: a3, to: a3, torino: a3, tp: a3, tr: a3, "trani-andria-barletta": a3, "trani-barletta-andria": a3, traniandriabarletta: a3, tranibarlettaandria: a3, trapani: a3, trento: a3, treviso: a3, trieste: a3, ts: a3, turin: a3, tv: a3, ud: a3, udine: a3, "urbino-pesaro": a3, urbinopesaro: a3, va: a3, varese: a3, vb: a3, vc: a3, ve: a3, venezia: a3, venice: a3, verbania: a3, vercelli: a3, verona: a3, vi: a3, "vibo-valentia": a3, vibovalentia: a3, vicenza: a3, viterbo: a3, vr: a3, vs: a3, vt: a3, vv: a3, ibxos: e, iliadboxos: e, neen: [0, { jc: e }], "123homepage": e, "16-b": e, "32-b": e, "64-b": e, myspreadshop: e, syncloud: e }], je: [1, { co: a3, net: a3, org: a3, of: e }], jm: r2, jo: [1, { agri: a3, ai: a3, com: a3, edu: a3, eng: a3, fm: a3, gov: a3, mil: a3, net: a3, org: a3, per: a3, phd: a3, sch: a3, tv: a3 }], jobs: a3, jp: [1, { ac: a3, ad: a3, co: a3, ed: a3, go: a3, gr: a3, lg: a3, ne: [1, { aseinet: ra, gehirn: e, ivory: e, "mail-box": e, mints: e, mokuren: e, opal: e, sakura: e, sumomo: e, topaz: e }], or: a3, aichi: [1, { aisai: a3, ama: a3, anjo: a3, asuke: a3, chiryu: a3, chita: a3, fuso: a3, gamagori: a3, handa: a3, hazu: a3, hekinan: a3, higashiura: a3, ichinomiya: a3, inazawa: a3, inuyama: a3, isshiki: a3, iwakura: a3, kanie: a3, kariya: a3, kasugai: a3, kira: a3, kiyosu: a3, komaki: a3, konan: a3, kota: a3, mihama: a3, miyoshi: a3, nishio: a3, nisshin: a3, obu: a3, oguchi: a3, oharu: a3, okazaki: a3, owariasahi: a3, seto: a3, shikatsu: a3, shinshiro: a3, shitara: a3, tahara: a3, takahama: a3, tobishima: a3, toei: a3, togo: a3, tokai: a3, tokoname: a3, toyoake: a3, toyohashi: a3, toyokawa: a3, toyone: a3, toyota: a3, tsushima: a3, yatomi: a3 }], akita: [1, { akita: a3, daisen: a3, fujisato: a3, gojome: a3, hachirogata: a3, happou: a3, higashinaruse: a3, honjo: a3, honjyo: a3, ikawa: a3, kamikoani: a3, kamioka: a3, katagami: a3, kazuno: a3, kitaakita: a3, kosaka: a3, kyowa: a3, misato: a3, mitane: a3, moriyoshi: a3, nikaho: a3, noshiro: a3, odate: a3, oga: a3, ogata: a3, semboku: a3, yokote: a3, yurihonjo: a3 }], aomori: [1, { aomori: a3, gonohe: a3, hachinohe: a3, hashikami: a3, hiranai: a3, hirosaki: a3, itayanagi: a3, kuroishi: a3, misawa: a3, mutsu: a3, nakadomari: a3, noheji: a3, oirase: a3, owani: a3, rokunohe: a3, sannohe: a3, shichinohe: a3, shingo: a3, takko: a3, towada: a3, tsugaru: a3, tsuruta: a3 }], chiba: [1, { abiko: a3, asahi: a3, chonan: a3, chosei: a3, choshi: a3, chuo: a3, funabashi: a3, futtsu: a3, hanamigawa: a3, ichihara: a3, ichikawa: a3, ichinomiya: a3, inzai: a3, isumi: a3, kamagaya: a3, kamogawa: a3, kashiwa: a3, katori: a3, katsuura: a3, kimitsu: a3, kisarazu: a3, kozaki: a3, kujukuri: a3, kyonan: a3, matsudo: a3, midori: a3, mihama: a3, minamiboso: a3, mobara: a3, mutsuzawa: a3, nagara: a3, nagareyama: a3, narashino: a3, narita: a3, noda: a3, oamishirasato: a3, omigawa: a3, onjuku: a3, otaki: a3, sakae: a3, sakura: a3, shimofusa: a3, shirako: a3, shiroi: a3, shisui: a3, sodegaura: a3, sosa: a3, tako: a3, tateyama: a3, togane: a3, tohnosho: a3, tomisato: a3, urayasu: a3, yachimata: a3, yachiyo: a3, yokaichiba: a3, yokoshibahikari: a3, yotsukaido: a3 }], ehime: [1, { ainan: a3, honai: a3, ikata: a3, imabari: a3, iyo: a3, kamijima: a3, kihoku: a3, kumakogen: a3, masaki: a3, matsuno: a3, matsuyama: a3, namikata: a3, niihama: a3, ozu: a3, saijo: a3, seiyo: a3, shikokuchuo: a3, tobe: a3, toon: a3, uchiko: a3, uwajima: a3, yawatahama: a3 }], fukui: [1, { echizen: a3, eiheiji: a3, fukui: a3, ikeda: a3, katsuyama: a3, mihama: a3, minamiechizen: a3, obama: a3, ohi: a3, ono: a3, sabae: a3, sakai: a3, takahama: a3, tsuruga: a3, wakasa: a3 }], fukuoka: [1, { ashiya: a3, buzen: a3, chikugo: a3, chikuho: a3, chikujo: a3, chikushino: a3, chikuzen: a3, chuo: a3, dazaifu: a3, fukuchi: a3, hakata: a3, higashi: a3, hirokawa: a3, hisayama: a3, iizuka: a3, inatsuki: a3, kaho: a3, kasuga: a3, kasuya: a3, kawara: a3, keisen: a3, koga: a3, kurate: a3, kurogi: a3, kurume: a3, minami: a3, miyako: a3, miyama: a3, miyawaka: a3, mizumaki: a3, munakata: a3, nakagawa: a3, nakama: a3, nishi: a3, nogata: a3, ogori: a3, okagaki: a3, okawa: a3, oki: a3, omuta: a3, onga: a3, onojo: a3, oto: a3, saigawa: a3, sasaguri: a3, shingu: a3, shinyoshitomi: a3, shonai: a3, soeda: a3, sue: a3, tachiarai: a3, tagawa: a3, takata: a3, toho: a3, toyotsu: a3, tsuiki: a3, ukiha: a3, umi: a3, usui: a3, yamada: a3, yame: a3, yanagawa: a3, yukuhashi: a3 }], fukushima: [1, { aizubange: a3, aizumisato: a3, aizuwakamatsu: a3, asakawa: a3, bandai: a3, date: a3, fukushima: a3, furudono: a3, futaba: a3, hanawa: a3, higashi: a3, hirata: a3, hirono: a3, iitate: a3, inawashiro: a3, ishikawa: a3, iwaki: a3, izumizaki: a3, kagamiishi: a3, kaneyama: a3, kawamata: a3, kitakata: a3, kitashiobara: a3, koori: a3, koriyama: a3, kunimi: a3, miharu: a3, mishima: a3, namie: a3, nango: a3, nishiaizu: a3, nishigo: a3, okuma: a3, omotego: a3, ono: a3, otama: a3, samegawa: a3, shimogo: a3, shirakawa: a3, showa: a3, soma: a3, sukagawa: a3, taishin: a3, tamakawa: a3, tanagura: a3, tenei: a3, yabuki: a3, yamato: a3, yamatsuri: a3, yanaizu: a3, yugawa: a3 }], gifu: [1, { anpachi: a3, ena: a3, gifu: a3, ginan: a3, godo: a3, gujo: a3, hashima: a3, hichiso: a3, hida: a3, higashishirakawa: a3, ibigawa: a3, ikeda: a3, kakamigahara: a3, kani: a3, kasahara: a3, kasamatsu: a3, kawaue: a3, kitagata: a3, mino: a3, minokamo: a3, mitake: a3, mizunami: a3, motosu: a3, nakatsugawa: a3, ogaki: a3, sakahogi: a3, seki: a3, sekigahara: a3, shirakawa: a3, tajimi: a3, takayama: a3, tarui: a3, toki: a3, tomika: a3, wanouchi: a3, yamagata: a3, yaotsu: a3, yoro: a3 }], gunma: [1, { annaka: a3, chiyoda: a3, fujioka: a3, higashiagatsuma: a3, isesaki: a3, itakura: a3, kanna: a3, kanra: a3, katashina: a3, kawaba: a3, kiryu: a3, kusatsu: a3, maebashi: a3, meiwa: a3, midori: a3, minakami: a3, naganohara: a3, nakanojo: a3, nanmoku: a3, numata: a3, oizumi: a3, ora: a3, ota: a3, shibukawa: a3, shimonita: a3, shinto: a3, showa: a3, takasaki: a3, takayama: a3, tamamura: a3, tatebayashi: a3, tomioka: a3, tsukiyono: a3, tsumagoi: a3, ueno: a3, yoshioka: a3 }], hiroshima: [1, { asaminami: a3, daiwa: a3, etajima: a3, fuchu: a3, fukuyama: a3, hatsukaichi: a3, higashihiroshima: a3, hongo: a3, jinsekikogen: a3, kaita: a3, kui: a3, kumano: a3, kure: a3, mihara: a3, miyoshi: a3, naka: a3, onomichi: a3, osakikamijima: a3, otake: a3, saka: a3, sera: a3, seranishi: a3, shinichi: a3, shobara: a3, takehara: a3 }], hokkaido: [1, { abashiri: a3, abira: a3, aibetsu: a3, akabira: a3, akkeshi: a3, asahikawa: a3, ashibetsu: a3, ashoro: a3, assabu: a3, atsuma: a3, bibai: a3, biei: a3, bifuka: a3, bihoro: a3, biratori: a3, chippubetsu: a3, chitose: a3, date: a3, ebetsu: a3, embetsu: a3, eniwa: a3, erimo: a3, esan: a3, esashi: a3, fukagawa: a3, fukushima: a3, furano: a3, furubira: a3, haboro: a3, hakodate: a3, hamatonbetsu: a3, hidaka: a3, higashikagura: a3, higashikawa: a3, hiroo: a3, hokuryu: a3, hokuto: a3, honbetsu: a3, horokanai: a3, horonobe: a3, ikeda: a3, imakane: a3, ishikari: a3, iwamizawa: a3, iwanai: a3, kamifurano: a3, kamikawa: a3, kamishihoro: a3, kamisunagawa: a3, kamoenai: a3, kayabe: a3, kembuchi: a3, kikonai: a3, kimobetsu: a3, kitahiroshima: a3, kitami: a3, kiyosato: a3, koshimizu: a3, kunneppu: a3, kuriyama: a3, kuromatsunai: a3, kushiro: a3, kutchan: a3, kyowa: a3, mashike: a3, matsumae: a3, mikasa: a3, minamifurano: a3, mombetsu: a3, moseushi: a3, mukawa: a3, muroran: a3, naie: a3, nakagawa: a3, nakasatsunai: a3, nakatombetsu: a3, nanae: a3, nanporo: a3, nayoro: a3, nemuro: a3, niikappu: a3, niki: a3, nishiokoppe: a3, noboribetsu: a3, numata: a3, obihiro: a3, obira: a3, oketo: a3, okoppe: a3, otaru: a3, otobe: a3, otofuke: a3, otoineppu: a3, oumu: a3, ozora: a3, pippu: a3, rankoshi: a3, rebun: a3, rikubetsu: a3, rishiri: a3, rishirifuji: a3, saroma: a3, sarufutsu: a3, shakotan: a3, shari: a3, shibecha: a3, shibetsu: a3, shikabe: a3, shikaoi: a3, shimamaki: a3, shimizu: a3, shimokawa: a3, shinshinotsu: a3, shintoku: a3, shiranuka: a3, shiraoi: a3, shiriuchi: a3, sobetsu: a3, sunagawa: a3, taiki: a3, takasu: a3, takikawa: a3, takinoue: a3, teshikaga: a3, tobetsu: a3, tohma: a3, tomakomai: a3, tomari: a3, toya: a3, toyako: a3, toyotomi: a3, toyoura: a3, tsubetsu: a3, tsukigata: a3, urakawa: a3, urausu: a3, uryu: a3, utashinai: a3, wakkanai: a3, wassamu: a3, yakumo: a3, yoichi: a3 }], hyogo: [1, { aioi: a3, akashi: a3, ako: a3, amagasaki: a3, aogaki: a3, asago: a3, ashiya: a3, awaji: a3, fukusaki: a3, goshiki: a3, harima: a3, himeji: a3, ichikawa: a3, inagawa: a3, itami: a3, kakogawa: a3, kamigori: a3, kamikawa: a3, kasai: a3, kasuga: a3, kawanishi: a3, miki: a3, minamiawaji: a3, nishinomiya: a3, nishiwaki: a3, ono: a3, sanda: a3, sannan: a3, sasayama: a3, sayo: a3, shingu: a3, shinonsen: a3, shiso: a3, sumoto: a3, taishi: a3, taka: a3, takarazuka: a3, takasago: a3, takino: a3, tamba: a3, tatsuno: a3, toyooka: a3, yabu: a3, yashiro: a3, yoka: a3, yokawa: a3 }], ibaraki: [1, { ami: a3, asahi: a3, bando: a3, chikusei: a3, daigo: a3, fujishiro: a3, hitachi: a3, hitachinaka: a3, hitachiomiya: a3, hitachiota: a3, ibaraki: a3, ina: a3, inashiki: a3, itako: a3, iwama: a3, joso: a3, kamisu: a3, kasama: a3, kashima: a3, kasumigaura: a3, koga: a3, miho: a3, mito: a3, moriya: a3, naka: a3, namegata: a3, oarai: a3, ogawa: a3, omitama: a3, ryugasaki: a3, sakai: a3, sakuragawa: a3, shimodate: a3, shimotsuma: a3, shirosato: a3, sowa: a3, suifu: a3, takahagi: a3, tamatsukuri: a3, tokai: a3, tomobe: a3, tone: a3, toride: a3, tsuchiura: a3, tsukuba: a3, uchihara: a3, ushiku: a3, yachiyo: a3, yamagata: a3, yawara: a3, yuki: a3 }], ishikawa: [1, { anamizu: a3, hakui: a3, hakusan: a3, kaga: a3, kahoku: a3, kanazawa: a3, kawakita: a3, komatsu: a3, nakanoto: a3, nanao: a3, nomi: a3, nonoichi: a3, noto: a3, shika: a3, suzu: a3, tsubata: a3, tsurugi: a3, uchinada: a3, wajima: a3 }], iwate: [1, { fudai: a3, fujisawa: a3, hanamaki: a3, hiraizumi: a3, hirono: a3, ichinohe: a3, ichinoseki: a3, iwaizumi: a3, iwate: a3, joboji: a3, kamaishi: a3, kanegasaki: a3, karumai: a3, kawai: a3, kitakami: a3, kuji: a3, kunohe: a3, kuzumaki: a3, miyako: a3, mizusawa: a3, morioka: a3, ninohe: a3, noda: a3, ofunato: a3, oshu: a3, otsuchi: a3, rikuzentakata: a3, shiwa: a3, shizukuishi: a3, sumita: a3, tanohata: a3, tono: a3, yahaba: a3, yamada: a3 }], kagawa: [1, { ayagawa: a3, higashikagawa: a3, kanonji: a3, kotohira: a3, manno: a3, marugame: a3, mitoyo: a3, naoshima: a3, sanuki: a3, tadotsu: a3, takamatsu: a3, tonosho: a3, uchinomi: a3, utazu: a3, zentsuji: a3 }], kagoshima: [1, { akune: a3, amami: a3, hioki: a3, isa: a3, isen: a3, izumi: a3, kagoshima: a3, kanoya: a3, kawanabe: a3, kinko: a3, kouyama: a3, makurazaki: a3, matsumoto: a3, minamitane: a3, nakatane: a3, nishinoomote: a3, satsumasendai: a3, soo: a3, tarumizu: a3, yusui: a3 }], kanagawa: [1, { aikawa: a3, atsugi: a3, ayase: a3, chigasaki: a3, ebina: a3, fujisawa: a3, hadano: a3, hakone: a3, hiratsuka: a3, isehara: a3, kaisei: a3, kamakura: a3, kiyokawa: a3, matsuda: a3, minamiashigara: a3, miura: a3, nakai: a3, ninomiya: a3, odawara: a3, oi: a3, oiso: a3, sagamihara: a3, samukawa: a3, tsukui: a3, yamakita: a3, yamato: a3, yokosuka: a3, yugawara: a3, zama: a3, zushi: a3 }], kochi: [1, { aki: a3, geisei: a3, hidaka: a3, higashitsuno: a3, ino: a3, kagami: a3, kami: a3, kitagawa: a3, kochi: a3, mihara: a3, motoyama: a3, muroto: a3, nahari: a3, nakamura: a3, nankoku: a3, nishitosa: a3, niyodogawa: a3, ochi: a3, okawa: a3, otoyo: a3, otsuki: a3, sakawa: a3, sukumo: a3, susaki: a3, tosa: a3, tosashimizu: a3, toyo: a3, tsuno: a3, umaji: a3, yasuda: a3, yusuhara: a3 }], kumamoto: [1, { amakusa: a3, arao: a3, aso: a3, choyo: a3, gyokuto: a3, kamiamakusa: a3, kikuchi: a3, kumamoto: a3, mashiki: a3, mifune: a3, minamata: a3, minamioguni: a3, nagasu: a3, nishihara: a3, oguni: a3, ozu: a3, sumoto: a3, takamori: a3, uki: a3, uto: a3, yamaga: a3, yamato: a3, yatsushiro: a3 }], kyoto: [1, { ayabe: a3, fukuchiyama: a3, higashiyama: a3, ide: a3, ine: a3, joyo: a3, kameoka: a3, kamo: a3, kita: a3, kizu: a3, kumiyama: a3, kyotamba: a3, kyotanabe: a3, kyotango: a3, maizuru: a3, minami: a3, minamiyamashiro: a3, miyazu: a3, muko: a3, nagaokakyo: a3, nakagyo: a3, nantan: a3, oyamazaki: a3, sakyo: a3, seika: a3, tanabe: a3, uji: a3, ujitawara: a3, wazuka: a3, yamashina: a3, yawata: a3 }], mie: [1, { asahi: a3, inabe: a3, ise: a3, kameyama: a3, kawagoe: a3, kiho: a3, kisosaki: a3, kiwa: a3, komono: a3, kumano: a3, kuwana: a3, matsusaka: a3, meiwa: a3, mihama: a3, minamiise: a3, misugi: a3, miyama: a3, nabari: a3, shima: a3, suzuka: a3, tado: a3, taiki: a3, taki: a3, tamaki: a3, toba: a3, tsu: a3, udono: a3, ureshino: a3, watarai: a3, yokkaichi: a3 }], miyagi: [1, { furukawa: a3, higashimatsushima: a3, ishinomaki: a3, iwanuma: a3, kakuda: a3, kami: a3, kawasaki: a3, marumori: a3, matsushima: a3, minamisanriku: a3, misato: a3, murata: a3, natori: a3, ogawara: a3, ohira: a3, onagawa: a3, osaki: a3, rifu: a3, semine: a3, shibata: a3, shichikashuku: a3, shikama: a3, shiogama: a3, shiroishi: a3, tagajo: a3, taiwa: a3, tome: a3, tomiya: a3, wakuya: a3, watari: a3, yamamoto: a3, zao: a3 }], miyazaki: [1, { aya: a3, ebino: a3, gokase: a3, hyuga: a3, kadogawa: a3, kawaminami: a3, kijo: a3, kitagawa: a3, kitakata: a3, kitaura: a3, kobayashi: a3, kunitomi: a3, kushima: a3, mimata: a3, miyakonojo: a3, miyazaki: a3, morotsuka: a3, nichinan: a3, nishimera: a3, nobeoka: a3, saito: a3, shiiba: a3, shintomi: a3, takaharu: a3, takanabe: a3, takazaki: a3, tsuno: a3 }], nagano: [1, { achi: a3, agematsu: a3, anan: a3, aoki: a3, asahi: a3, azumino: a3, chikuhoku: a3, chikuma: a3, chino: a3, fujimi: a3, hakuba: a3, hara: a3, hiraya: a3, iida: a3, iijima: a3, iiyama: a3, iizuna: a3, ikeda: a3, ikusaka: a3, ina: a3, karuizawa: a3, kawakami: a3, kiso: a3, kisofukushima: a3, kitaaiki: a3, komagane: a3, komoro: a3, matsukawa: a3, matsumoto: a3, miasa: a3, minamiaiki: a3, minamimaki: a3, minamiminowa: a3, minowa: a3, miyada: a3, miyota: a3, mochizuki: a3, nagano: a3, nagawa: a3, nagiso: a3, nakagawa: a3, nakano: a3, nozawaonsen: a3, obuse: a3, ogawa: a3, okaya: a3, omachi: a3, omi: a3, ookuwa: a3, ooshika: a3, otaki: a3, otari: a3, sakae: a3, sakaki: a3, saku: a3, sakuho: a3, shimosuwa: a3, shinanomachi: a3, shiojiri: a3, suwa: a3, suzaka: a3, takagi: a3, takamori: a3, takayama: a3, tateshina: a3, tatsuno: a3, togakushi: a3, togura: a3, tomi: a3, ueda: a3, wada: a3, yamagata: a3, yamanouchi: a3, yasaka: a3, yasuoka: a3 }], nagasaki: [1, { chijiwa: a3, futsu: a3, goto: a3, hasami: a3, hirado: a3, iki: a3, isahaya: a3, kawatana: a3, kuchinotsu: a3, matsuura: a3, nagasaki: a3, obama: a3, omura: a3, oseto: a3, saikai: a3, sasebo: a3, seihi: a3, shimabara: a3, shinkamigoto: a3, togitsu: a3, tsushima: a3, unzen: a3 }], nara: [1, { ando: a3, gose: a3, heguri: a3, higashiyoshino: a3, ikaruga: a3, ikoma: a3, kamikitayama: a3, kanmaki: a3, kashiba: a3, kashihara: a3, katsuragi: a3, kawai: a3, kawakami: a3, kawanishi: a3, koryo: a3, kurotaki: a3, mitsue: a3, miyake: a3, nara: a3, nosegawa: a3, oji: a3, ouda: a3, oyodo: a3, sakurai: a3, sango: a3, shimoichi: a3, shimokitayama: a3, shinjo: a3, soni: a3, takatori: a3, tawaramoto: a3, tenkawa: a3, tenri: a3, uda: a3, yamatokoriyama: a3, yamatotakada: a3, yamazoe: a3, yoshino: a3 }], niigata: [1, { aga: a3, agano: a3, gosen: a3, itoigawa: a3, izumozaki: a3, joetsu: a3, kamo: a3, kariwa: a3, kashiwazaki: a3, minamiuonuma: a3, mitsuke: a3, muika: a3, murakami: a3, myoko: a3, nagaoka: a3, niigata: a3, ojiya: a3, omi: a3, sado: a3, sanjo: a3, seiro: a3, seirou: a3, sekikawa: a3, shibata: a3, tagami: a3, tainai: a3, tochio: a3, tokamachi: a3, tsubame: a3, tsunan: a3, uonuma: a3, yahiko: a3, yoita: a3, yuzawa: a3 }], oita: [1, { beppu: a3, bungoono: a3, bungotakada: a3, hasama: a3, hiji: a3, himeshima: a3, hita: a3, kamitsue: a3, kokonoe: a3, kuju: a3, kunisaki: a3, kusu: a3, oita: a3, saiki: a3, taketa: a3, tsukumi: a3, usa: a3, usuki: a3, yufu: a3 }], okayama: [1, { akaiwa: a3, asakuchi: a3, bizen: a3, hayashima: a3, ibara: a3, kagamino: a3, kasaoka: a3, kibichuo: a3, kumenan: a3, kurashiki: a3, maniwa: a3, misaki: a3, nagi: a3, niimi: a3, nishiawakura: a3, okayama: a3, satosho: a3, setouchi: a3, shinjo: a3, shoo: a3, soja: a3, takahashi: a3, tamano: a3, tsuyama: a3, wake: a3, yakage: a3 }], okinawa: [1, { aguni: a3, ginowan: a3, ginoza: a3, gushikami: a3, haebaru: a3, higashi: a3, hirara: a3, iheya: a3, ishigaki: a3, ishikawa: a3, itoman: a3, izena: a3, kadena: a3, kin: a3, kitadaito: a3, kitanakagusuku: a3, kumejima: a3, kunigami: a3, minamidaito: a3, motobu: a3, nago: a3, naha: a3, nakagusuku: a3, nakijin: a3, nanjo: a3, nishihara: a3, ogimi: a3, okinawa: a3, onna: a3, shimoji: a3, taketomi: a3, tarama: a3, tokashiki: a3, tomigusuku: a3, tonaki: a3, urasoe: a3, uruma: a3, yaese: a3, yomitan: a3, yonabaru: a3, yonaguni: a3, zamami: a3 }], osaka: [1, { abeno: a3, chihayaakasaka: a3, chuo: a3, daito: a3, fujiidera: a3, habikino: a3, hannan: a3, higashiosaka: a3, higashisumiyoshi: a3, higashiyodogawa: a3, hirakata: a3, ibaraki: a3, ikeda: a3, izumi: a3, izumiotsu: a3, izumisano: a3, kadoma: a3, kaizuka: a3, kanan: a3, kashiwara: a3, katano: a3, kawachinagano: a3, kishiwada: a3, kita: a3, kumatori: a3, matsubara: a3, minato: a3, minoh: a3, misaki: a3, moriguchi: a3, neyagawa: a3, nishi: a3, nose: a3, osakasayama: a3, sakai: a3, sayama: a3, sennan: a3, settsu: a3, shijonawate: a3, shimamoto: a3, suita: a3, tadaoka: a3, taishi: a3, tajiri: a3, takaishi: a3, takatsuki: a3, tondabayashi: a3, toyonaka: a3, toyono: a3, yao: a3 }], saga: [1, { ariake: a3, arita: a3, fukudomi: a3, genkai: a3, hamatama: a3, hizen: a3, imari: a3, kamimine: a3, kanzaki: a3, karatsu: a3, kashima: a3, kitagata: a3, kitahata: a3, kiyama: a3, kouhoku: a3, kyuragi: a3, nishiarita: a3, ogi: a3, omachi: a3, ouchi: a3, saga: a3, shiroishi: a3, taku: a3, tara: a3, tosu: a3, yoshinogari: a3 }], saitama: [1, { arakawa: a3, asaka: a3, chichibu: a3, fujimi: a3, fujimino: a3, fukaya: a3, hanno: a3, hanyu: a3, hasuda: a3, hatogaya: a3, hatoyama: a3, hidaka: a3, higashichichibu: a3, higashimatsuyama: a3, honjo: a3, ina: a3, iruma: a3, iwatsuki: a3, kamiizumi: a3, kamikawa: a3, kamisato: a3, kasukabe: a3, kawagoe: a3, kawaguchi: a3, kawajima: a3, kazo: a3, kitamoto: a3, koshigaya: a3, kounosu: a3, kuki: a3, kumagaya: a3, matsubushi: a3, minano: a3, misato: a3, miyashiro: a3, miyoshi: a3, moroyama: a3, nagatoro: a3, namegawa: a3, niiza: a3, ogano: a3, ogawa: a3, ogose: a3, okegawa: a3, omiya: a3, otaki: a3, ranzan: a3, ryokami: a3, saitama: a3, sakado: a3, satte: a3, sayama: a3, shiki: a3, shiraoka: a3, soka: a3, sugito: a3, toda: a3, tokigawa: a3, tokorozawa: a3, tsurugashima: a3, urawa: a3, warabi: a3, yashio: a3, yokoze: a3, yono: a3, yorii: a3, yoshida: a3, yoshikawa: a3, yoshimi: a3 }], shiga: [1, { aisho: a3, gamo: a3, higashiomi: a3, hikone: a3, koka: a3, konan: a3, kosei: a3, koto: a3, kusatsu: a3, maibara: a3, moriyama: a3, nagahama: a3, nishiazai: a3, notogawa: a3, omihachiman: a3, otsu: a3, ritto: a3, ryuoh: a3, takashima: a3, takatsuki: a3, torahime: a3, toyosato: a3, yasu: a3 }], shimane: [1, { akagi: a3, ama: a3, gotsu: a3, hamada: a3, higashiizumo: a3, hikawa: a3, hikimi: a3, izumo: a3, kakinoki: a3, masuda: a3, matsue: a3, misato: a3, nishinoshima: a3, ohda: a3, okinoshima: a3, okuizumo: a3, shimane: a3, tamayu: a3, tsuwano: a3, unnan: a3, yakumo: a3, yasugi: a3, yatsuka: a3 }], shizuoka: [1, { arai: a3, atami: a3, fuji: a3, fujieda: a3, fujikawa: a3, fujinomiya: a3, fukuroi: a3, gotemba: a3, haibara: a3, hamamatsu: a3, higashiizu: a3, ito: a3, iwata: a3, izu: a3, izunokuni: a3, kakegawa: a3, kannami: a3, kawanehon: a3, kawazu: a3, kikugawa: a3, kosai: a3, makinohara: a3, matsuzaki: a3, minamiizu: a3, mishima: a3, morimachi: a3, nishiizu: a3, numazu: a3, omaezaki: a3, shimada: a3, shimizu: a3, shimoda: a3, shizuoka: a3, susono: a3, yaizu: a3, yoshida: a3 }], tochigi: [1, { ashikaga: a3, bato: a3, haga: a3, ichikai: a3, iwafune: a3, kaminokawa: a3, kanuma: a3, karasuyama: a3, kuroiso: a3, mashiko: a3, mibu: a3, moka: a3, motegi: a3, nasu: a3, nasushiobara: a3, nikko: a3, nishikata: a3, nogi: a3, ohira: a3, ohtawara: a3, oyama: a3, sakura: a3, sano: a3, shimotsuke: a3, shioya: a3, takanezawa: a3, tochigi: a3, tsuga: a3, ujiie: a3, utsunomiya: a3, yaita: a3 }], tokushima: [1, { aizumi: a3, anan: a3, ichiba: a3, itano: a3, kainan: a3, komatsushima: a3, matsushige: a3, mima: a3, minami: a3, miyoshi: a3, mugi: a3, nakagawa: a3, naruto: a3, sanagochi: a3, shishikui: a3, tokushima: a3, wajiki: a3 }], tokyo: [1, { adachi: a3, akiruno: a3, akishima: a3, aogashima: a3, arakawa: a3, bunkyo: a3, chiyoda: a3, chofu: a3, chuo: a3, edogawa: a3, fuchu: a3, fussa: a3, hachijo: a3, hachioji: a3, hamura: a3, higashikurume: a3, higashimurayama: a3, higashiyamato: a3, hino: a3, hinode: a3, hinohara: a3, inagi: a3, itabashi: a3, katsushika: a3, kita: a3, kiyose: a3, kodaira: a3, koganei: a3, kokubunji: a3, komae: a3, koto: a3, kouzushima: a3, kunitachi: a3, machida: a3, meguro: a3, minato: a3, mitaka: a3, mizuho: a3, musashimurayama: a3, musashino: a3, nakano: a3, nerima: a3, ogasawara: a3, okutama: a3, ome: a3, oshima: a3, ota: a3, setagaya: a3, shibuya: a3, shinagawa: a3, shinjuku: a3, suginami: a3, sumida: a3, tachikawa: a3, taito: a3, tama: a3, toshima: a3 }], tottori: [1, { chizu: a3, hino: a3, kawahara: a3, koge: a3, kotoura: a3, misasa: a3, nanbu: a3, nichinan: a3, sakaiminato: a3, tottori: a3, wakasa: a3, yazu: a3, yonago: a3 }], toyama: [1, { asahi: a3, fuchu: a3, fukumitsu: a3, funahashi: a3, himi: a3, imizu: a3, inami: a3, johana: a3, kamiichi: a3, kurobe: a3, nakaniikawa: a3, namerikawa: a3, nanto: a3, nyuzen: a3, oyabe: a3, taira: a3, takaoka: a3, tateyama: a3, toga: a3, tonami: a3, toyama: a3, unazuki: a3, uozu: a3, yamada: a3 }], wakayama: [1, { arida: a3, aridagawa: a3, gobo: a3, hashimoto: a3, hidaka: a3, hirogawa: a3, inami: a3, iwade: a3, kainan: a3, kamitonda: a3, katsuragi: a3, kimino: a3, kinokawa: a3, kitayama: a3, koya: a3, koza: a3, kozagawa: a3, kudoyama: a3, kushimoto: a3, mihama: a3, misato: a3, nachikatsuura: a3, shingu: a3, shirahama: a3, taiji: a3, tanabe: a3, wakayama: a3, yuasa: a3, yura: a3 }], yamagata: [1, { asahi: a3, funagata: a3, higashine: a3, iide: a3, kahoku: a3, kaminoyama: a3, kaneyama: a3, kawanishi: a3, mamurogawa: a3, mikawa: a3, murayama: a3, nagai: a3, nakayama: a3, nanyo: a3, nishikawa: a3, obanazawa: a3, oe: a3, oguni: a3, ohkura: a3, oishida: a3, sagae: a3, sakata: a3, sakegawa: a3, shinjo: a3, shirataka: a3, shonai: a3, takahata: a3, tendo: a3, tozawa: a3, tsuruoka: a3, yamagata: a3, yamanobe: a3, yonezawa: a3, yuza: a3 }], yamaguchi: [1, { abu: a3, hagi: a3, hikari: a3, hofu: a3, iwakuni: a3, kudamatsu: a3, mitou: a3, nagato: a3, oshima: a3, shimonoseki: a3, shunan: a3, tabuse: a3, tokuyama: a3, toyota: a3, ube: a3, yuu: a3 }], yamanashi: [1, { chuo: a3, doshi: a3, fuefuki: a3, fujikawa: a3, fujikawaguchiko: a3, fujiyoshida: a3, hayakawa: a3, hokuto: a3, ichikawamisato: a3, kai: a3, kofu: a3, koshu: a3, kosuge: a3, "minami-alps": a3, minobu: a3, nakamichi: a3, nanbu: a3, narusawa: a3, nirasaki: a3, nishikatsura: a3, oshino: a3, otsuki: a3, showa: a3, tabayama: a3, tsuru: a3, uenohara: a3, yamanakako: a3, yamanashi: a3 }], "xn--ehqz56n": a3, 三重: a3, "xn--1lqs03n": a3, 京都: a3, "xn--qqqt11m": a3, 佐賀: a3, "xn--f6qx53a": a3, 兵庫: a3, "xn--djrs72d6uy": a3, 北海道: a3, "xn--mkru45i": a3, 千葉: a3, "xn--0trq7p7nn": a3, 和歌山: a3, "xn--5js045d": a3, 埼玉: a3, "xn--kbrq7o": a3, 大分: a3, "xn--pssu33l": a3, 大阪: a3, "xn--ntsq17g": a3, 奈良: a3, "xn--uisz3g": a3, 宮城: a3, "xn--6btw5a": a3, 宮崎: a3, "xn--1ctwo": a3, 富山: a3, "xn--6orx2r": a3, 山口: a3, "xn--rht61e": a3, 山形: a3, "xn--rht27z": a3, 山梨: a3, "xn--nit225k": a3, 岐阜: a3, "xn--rht3d": a3, 岡山: a3, "xn--djty4k": a3, 岩手: a3, "xn--klty5x": a3, 島根: a3, "xn--kltx9a": a3, 広島: a3, "xn--kltp7d": a3, 徳島: a3, "xn--c3s14m": a3, 愛媛: a3, "xn--vgu402c": a3, 愛知: a3, "xn--efvn9s": a3, 新潟: a3, "xn--1lqs71d": a3, 東京: a3, "xn--4pvxs": a3, 栃木: a3, "xn--uuwu58a": a3, 沖縄: a3, "xn--zbx025d": a3, 滋賀: a3, "xn--8pvr4u": a3, 熊本: a3, "xn--5rtp49c": a3, 石川: a3, "xn--ntso0iqx3a": a3, 神奈川: a3, "xn--elqq16h": a3, 福井: a3, "xn--4it168d": a3, 福岡: a3, "xn--klt787d": a3, 福島: a3, "xn--rny31h": a3, 秋田: a3, "xn--7t0a264c": a3, 群馬: a3, "xn--uist22h": a3, 茨城: a3, "xn--8ltr62k": a3, 長崎: a3, "xn--2m4a15e": a3, 長野: a3, "xn--32vp30h": a3, 青森: a3, "xn--4it797k": a3, 静岡: a3, "xn--5rtq34k": a3, 香川: a3, "xn--k7yn95e": a3, 高知: a3, "xn--tor131o": a3, 鳥取: a3, "xn--d5qv7z876c": a3, 鹿児島: a3, kawasaki: r2, kitakyushu: r2, kobe: r2, nagoya: r2, sapporo: r2, sendai: r2, yokohama: r2, buyshop: e, fashionstore: e, handcrafted: e, kawaiishop: e, supersale: e, theshop: e, "0am": e, "0g0": e, "0j0": e, "0t0": e, mydns: e, pgw: e, wjg: e, usercontent: e, angry: e, babyblue: e, babymilk: e, backdrop: e, bambina: e, bitter: e, blush: e, boo: e, boy: e, boyfriend: e, but: e, candypop: e, capoo: e, catfood: e, cheap: e, chicappa: e, chillout: e, chips: e, chowder: e, chu: e, ciao: e, cocotte: e, coolblog: e, cranky: e, cutegirl: e, daa: e, deca: e, deci: e, digick: e, egoism: e, fakefur: e, fem: e, flier: e, floppy: e, fool: e, frenchkiss: e, girlfriend: e, girly: e, gloomy: e, gonna: e, greater: e, hacca: e, heavy: e, her: e, hiho: e, hippy: e, holy: e, hungry: e, icurus: e, itigo: e, jellybean: e, kikirara: e, kill: e, kilo: e, kuron: e, littlestar: e, lolipopmc: e, lolitapunk: e, lomo: e, lovepop: e, lovesick: e, main: e, mods: e, mond: e, mongolian: e, moo: e, namaste: e, nikita: e, nobushi: e, noor: e, oops: e, parallel: e, parasite: e, pecori: e, peewee: e, penne: e, pepper: e, perma: e, pigboat: e, pinoko: e, punyu: e, pupu: e, pussycat: e, pya: e, raindrop: e, readymade: e, sadist: e, schoolbus: e, secret: e, staba: e, stripper: e, sub: e, sunnyday: e, thick: e, tonkotsu: e, under: e, upper: e, velvet: e, verse: e, versus: e, vivian: e, watson: e, weblike: e, whitesnow: e, zombie: e, hateblo: e, hatenablog: e, hatenadiary: e, "2-d": e, bona: e, crap: e, daynight: e, eek: e, flop: e, halfmoon: e, jeez: e, matrix: e, mimoza: e, netgamers: e, nyanta: e, o0o0: e, rdy: e, rgr: e, rulez: e, sakurastorage: [0, { isk01: M2, isk02: M2 }], saloon: e, sblo: e, skr: e, tank: e, "uh-oh": e, undo: e, webaccel: [0, { rs: e, user: e }], websozai: e, xii: e }], ke: [1, { ac: a3, co: a3, go: a3, info: a3, me: a3, mobi: a3, ne: a3, or: a3, sc: a3 }], kg: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, us: e, xx: e, ae: e }], kh: m2, ki: ca, km: [1, { ass: a3, com: a3, edu: a3, gov: a3, mil: a3, nom: a3, org: a3, prd: a3, tm: a3, asso: a3, coop: a3, gouv: a3, medecin: a3, notaires: a3, pharmaciens: a3, presse: a3, veterinaire: a3 }], kn: [1, { edu: a3, gov: a3, net: a3, org: a3 }], kp: [1, { com: a3, edu: a3, gov: a3, org: a3, rep: a3, tra: a3 }], kr: [1, { ac: a3, ai: a3, co: a3, es: a3, go: a3, hs: a3, io: a3, it: a3, kg: a3, me: a3, mil: a3, ms: a3, ne: a3, or: a3, pe: a3, re: a3, sc: a3, busan: a3, chungbuk: a3, chungnam: a3, daegu: a3, daejeon: a3, gangwon: a3, gwangju: a3, gyeongbuk: a3, gyeonggi: a3, gyeongnam: a3, incheon: a3, jeju: a3, jeonbuk: a3, jeonnam: a3, seoul: a3, ulsan: a3, c01: e, "eliv-api": e, "eliv-cdn": e, "eliv-dns": e, mmv: e, vki: e }], kw: [1, { com: a3, edu: a3, emb: a3, gov: a3, ind: a3, net: a3, org: a3 }], ky: _, kz: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, jcloud: e }], la: [1, { com: a3, edu: a3, gov: a3, info: a3, int: a3, net: a3, org: a3, per: a3, bnr: e }], lb: m2, lc: [1, { co: a3, com: a3, edu: a3, gov: a3, net: a3, org: a3, oy: e }], li: a3, lk: [1, { ac: a3, assn: a3, com: a3, edu: a3, gov: a3, grp: a3, hotel: a3, int: a3, ltd: a3, net: a3, ngo: a3, org: a3, sch: a3, soc: a3, web: a3 }], lr: m2, ls: [1, { ac: a3, biz: a3, co: a3, edu: a3, gov: a3, info: a3, net: a3, org: a3, sc: a3 }], lt: g4, lu: [1, { "123website": e }], lv: [1, { asn: a3, com: a3, conf: a3, edu: a3, gov: a3, id: a3, mil: a3, net: a3, org: a3 }], ly: [1, { com: a3, edu: a3, gov: a3, id: a3, med: a3, net: a3, org: a3, plc: a3, sch: a3 }], ma: [1, { ac: a3, co: a3, gov: a3, net: a3, org: a3, press: a3 }], mc: [1, { asso: a3, tm: a3 }], md: [1, { ir: e }], me: [1, { ac: a3, co: a3, edu: a3, gov: a3, its: a3, net: a3, org: a3, priv: a3, c66: e, craft: e, edgestack: e, mybox: e, filegear: e, hooc: [0, { seprox: e }], "filegear-sg": e, lohmus: e, barsy: e, mcdir: e, brasilia: e, ddns: e, dnsfor: e, hopto: e, loginto: e, noip: e, webhop: e, soundcast: e, tcp4: e, vp4: e, diskstation: e, dscloud: e, i234: e, myds: e, synology: e, transip: J, nohost: e }], mg: [1, { co: a3, com: a3, edu: a3, gov: a3, mil: a3, nom: a3, org: a3, prd: a3 }], mh: a3, mil: a3, mk: [1, { com: a3, edu: a3, gov: a3, inf: a3, name: a3, net: a3, org: a3 }], ml: [1, { ac: a3, art: a3, asso: a3, com: a3, edu: a3, gouv: a3, gov: a3, info: a3, inst: a3, net: a3, org: a3, pr: a3, presse: a3 }], mm: r2, mn: [1, { edu: a3, gov: a3, org: a3, nyc: e }], mo: m2, mobi: [1, { barsy: e, dscloud: e }], mp: [1, { ju: e }], mq: a3, mr: g4, ms: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, minisite: e }], mt: _, mu: [1, { ac: a3, co: a3, com: a3, gov: a3, net: a3, or: a3, org: a3 }], museum: a3, mv: [1, { aero: a3, biz: a3, com: a3, coop: a3, edu: a3, gov: a3, info: a3, int: a3, mil: a3, museum: a3, name: a3, net: a3, org: a3, pro: a3 }], mw: [1, { ac: a3, biz: a3, co: a3, com: a3, coop: a3, edu: a3, gov: a3, int: a3, net: a3, org: a3 }], mx: [1, { com: a3, edu: a3, gob: a3, net: a3, org: a3 }], my: [1, { biz: a3, com: a3, edu: a3, gov: a3, mil: a3, name: a3, net: a3, org: a3 }], mz: [1, { ac: a3, adv: a3, co: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], na: [1, { alt: a3, co: a3, com: a3, gov: a3, net: a3, org: a3 }], name: [1, { her: da, his: da, ispmanager: e, keenetic: e }], nc: [1, { asso: a3, nom: a3 }], ne: a3, net: [1, { adobeaemcloud: e, "adobeio-static": e, adobeioruntime: e, akadns: e, akamai: e, "akamai-staging": e, akamaiedge: e, "akamaiedge-staging": e, akamaihd: e, "akamaihd-staging": e, akamaiorigin: e, "akamaiorigin-staging": e, akamaized: e, "akamaized-staging": e, edgekey: e, "edgekey-staging": e, edgesuite: e, "edgesuite-staging": e, alwaysdata: e, myamaze: e, cloudfront: e, appudo: e, "atlassian-dev": [0, { prod: f2 }], myfritz: e, shopselect: e, blackbaudcdn: e, boomla: e, bplaced: e, square7: e, cdn77: [0, { r: e }], "cdn77-ssl": e, gb: e, hu: e, jp: e, se: e, uk: e, clickrising: e, "ddns-ip": e, "dns-cloud": e, "dns-dynamic": e, cloudaccess: e, cloudflare: [2, { cdn: e }], cloudflareanycast: f2, cloudflarecn: f2, cloudflareglobal: f2, ctfcloud: e, "feste-ip": e, "knx-server": e, "static-access": e, cryptonomic: o, dattolocal: e, mydatto: e, debian: e, definima: e, deno: [2, { sandbox: e }], icp: o, de5: e, "at-band-camp": e, blogdns: e, "broke-it": e, buyshouses: e, dnsalias: e, dnsdojo: e, "does-it": e, dontexist: e, dynalias: e, dynathome: e, endofinternet: e, "from-az": e, "from-co": e, "from-la": e, "from-ny": e, "gets-it": e, "ham-radio-op": e, homeftp: e, homeip: e, homelinux: e, homeunix: e, "in-the-band": e, "is-a-chef": e, "is-a-geek": e, "isa-geek": e, "kicks-ass": e, "office-on-the": e, podzone: e, "scrapper-site": e, selfip: e, "sells-it": e, servebbs: e, serveftp: e, thruhere: e, webhop: e, casacam: e, dynu: e, dynuddns: e, mysynology: e, opik: e, spryt: e, dynv6: e, twmail: e, ru: e, channelsdvr: [2, { u: e }], fastly: [0, { freetls: e, map: e, prod: [0, { a: e, global: e }], ssl: [0, { a: e, b: e, global: e }] }], fastlylb: [2, { map: e }], "keyword-on": e, "live-on": e, "server-on": e, "cdn-edges": e, heteml: e, cloudfunctions: e, "grafana-dev": e, iobb: e, moonscale: e, "in-dsl": e, "in-vpn": e, oninferno: e, botdash: e, "apps-1and1": e, ipifony: e, cloudjiffy: [2, { "fra1-de": e, "west1-us": e }], elastx: [0, { "jls-sto1": e, "jls-sto2": e, "jls-sto3": e }], massivegrid: [0, { paas: [0, { "fr-1": e, "lon-1": e, "lon-2": e, "ny-1": e, "ny-2": e, "sg-1": e }] }], saveincloud: [0, { jelastic: e, "nordeste-idc": e }], scaleforce: K, kinghost: e, uni5: e, krellian: e, ggff: e, localto: o, barsy: e, luyani: e, memset: e, "azure-api": e, "azure-mobile": e, azureedge: e, azurefd: e, azurestaticapps: [2, { 1: e, 2: e, 3: e, 4: e, 5: e, 6: e, 7: e, centralus: e, eastasia: e, eastus2: e, westeurope: e, westus2: e }], azurewebsites: e, cloudapp: e, trafficmanager: e, usgovcloudapi: ga, usgovcloudapp: e, usgovtrafficmanager: e, windows: ga, mynetname: [0, { sn: e }], routingthecloud: e, bounceme: e, ddns: e, "eating-organic": e, mydissent: e, myeffect: e, mymediapc: e, mypsx: e, mysecuritycamera: e, nhlfan: e, "no-ip": e, pgafan: e, privatizehealthinsurance: e, redirectme: e, serveblog: e, serveminecraft: e, sytes: e, dnsup: e, hicam: e, "now-dns": e, ownip: e, vpndns: e, cloudycluster: e, ovh: [0, { hosting: o, webpaas: o }], rackmaze: e, myradweb: e, in: e, "subsc-pay": e, squares: e, schokokeks: e, "firewall-gateway": e, seidat: e, senseering: e, siteleaf: e, mafelo: e, myspreadshop: e, "vps-host": [2, { jelastic: [0, { atl: e, njs: e, ric: e }] }], srcf: [0, { soc: e, user: e }], supabase: e, dsmynas: e, familyds: e, ts: [2, { c: o }], torproject: [2, { pages: e }], tunnelmole: e, vusercontent: e, "reserve-online": e, localcert: e, "community-pro": e, meinforum: e, yandexcloud: [2, { storage: e, website: e }], za: e, zabc: e }], nf: [1, { arts: a3, com: a3, firm: a3, info: a3, net: a3, other: a3, per: a3, rec: a3, store: a3, web: a3 }], ng: [1, { com: a3, edu: a3, gov: a3, i: a3, mil: a3, mobi: a3, name: a3, net: a3, org: a3, sch: a3, biz: [2, { co: e, dl: e, go: e, lg: e, on: e }], col: e, firm: e, gen: e, ltd: e, ngo: e, plc: e }], ni: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, gob: a3, in: a3, info: a3, int: a3, mil: a3, net: a3, nom: a3, org: a3, web: a3 }], nl: [1, { co: e, "hosting-cluster": e, gov: e, khplay: e, "123website": e, myspreadshop: e, transurl: o, cistron: e, demon: e }], no: [1, { fhs: a3, folkebibl: a3, fylkesbibl: a3, idrett: a3, museum: a3, priv: a3, vgs: a3, dep: a3, herad: a3, kommune: a3, mil: a3, stat: a3, aa: t2, ah: t2, bu: t2, fm: t2, hl: t2, hm: t2, "jan-mayen": t2, mr: t2, nl: t2, nt: t2, of: t2, ol: t2, oslo: t2, rl: t2, sf: t2, st: t2, svalbard: t2, tm: t2, tr: t2, va: t2, vf: t2, akrehamn: a3, "xn--krehamn-dxa": a3, åkrehamn: a3, algard: a3, "xn--lgrd-poac": a3, ålgård: a3, arna: a3, bronnoysund: a3, "xn--brnnysund-m8ac": a3, brønnøysund: a3, brumunddal: a3, bryne: a3, drobak: a3, "xn--drbak-wua": a3, drøbak: a3, egersund: a3, fetsund: a3, floro: a3, "xn--flor-jra": a3, florø: a3, fredrikstad: a3, hokksund: a3, honefoss: a3, "xn--hnefoss-q1a": a3, hønefoss: a3, jessheim: a3, jorpeland: a3, "xn--jrpeland-54a": a3, jørpeland: a3, kirkenes: a3, kopervik: a3, krokstadelva: a3, langevag: a3, "xn--langevg-jxa": a3, langevåg: a3, leirvik: a3, mjondalen: a3, "xn--mjndalen-64a": a3, mjøndalen: a3, "mo-i-rana": a3, mosjoen: a3, "xn--mosjen-eya": a3, mosjøen: a3, nesoddtangen: a3, orkanger: a3, osoyro: a3, "xn--osyro-wua": a3, osøyro: a3, raholt: a3, "xn--rholt-mra": a3, råholt: a3, sandnessjoen: a3, "xn--sandnessjen-ogb": a3, sandnessjøen: a3, skedsmokorset: a3, slattum: a3, spjelkavik: a3, stathelle: a3, stavern: a3, stjordalshalsen: a3, "xn--stjrdalshalsen-sqb": a3, stjørdalshalsen: a3, tananger: a3, tranby: a3, vossevangen: a3, aarborte: a3, aejrie: a3, afjord: a3, "xn--fjord-lra": a3, åfjord: a3, agdenes: a3, akershus: ka, aknoluokta: a3, "xn--koluokta-7ya57h": a3, ákŋoluokta: a3, al: a3, "xn--l-1fa": a3, ål: a3, alaheadju: a3, "xn--laheadju-7ya": a3, álaheadju: a3, alesund: a3, "xn--lesund-hua": a3, ålesund: a3, alstahaug: a3, alta: a3, "xn--lt-liac": a3, áltá: a3, alvdal: a3, amli: a3, "xn--mli-tla": a3, åmli: a3, amot: a3, "xn--mot-tla": a3, åmot: a3, andasuolo: a3, andebu: a3, andoy: a3, "xn--andy-ira": a3, andøy: a3, ardal: a3, "xn--rdal-poa": a3, årdal: a3, aremark: a3, arendal: a3, "xn--s-1fa": a3, ås: a3, aseral: a3, "xn--seral-lra": a3, åseral: a3, asker: a3, askim: a3, askoy: a3, "xn--asky-ira": a3, askøy: a3, askvoll: a3, asnes: a3, "xn--snes-poa": a3, åsnes: a3, audnedaln: a3, aukra: a3, aure: a3, aurland: a3, "aurskog-holand": a3, "xn--aurskog-hland-jnb": a3, "aurskog-høland": a3, austevoll: a3, austrheim: a3, averoy: a3, "xn--avery-yua": a3, averøy: a3, badaddja: a3, "xn--bdddj-mrabd": a3, bådåddjå: a3, "xn--brum-voa": a3, bærum: a3, bahcavuotna: a3, "xn--bhcavuotna-s4a": a3, báhcavuotna: a3, bahccavuotna: a3, "xn--bhccavuotna-k7a": a3, báhccavuotna: a3, baidar: a3, "xn--bidr-5nac": a3, báidár: a3, bajddar: a3, "xn--bjddar-pta": a3, bájddar: a3, balat: a3, "xn--blt-elab": a3, bálát: a3, balestrand: a3, ballangen: a3, balsfjord: a3, bamble: a3, bardu: a3, barum: a3, batsfjord: a3, "xn--btsfjord-9za": a3, båtsfjord: a3, bearalvahki: a3, "xn--bearalvhki-y4a": a3, bearalváhki: a3, beardu: a3, beiarn: a3, berg: a3, bergen: a3, berlevag: a3, "xn--berlevg-jxa": a3, berlevåg: a3, bievat: a3, "xn--bievt-0qa": a3, bievát: a3, bindal: a3, birkenes: a3, bjerkreim: a3, bjugn: a3, bodo: a3, "xn--bod-2na": a3, bodø: a3, bokn: a3, bomlo: a3, "xn--bmlo-gra": a3, bømlo: a3, bremanger: a3, bronnoy: a3, "xn--brnny-wuac": a3, brønnøy: a3, budejju: a3, buskerud: ka, bygland: a3, bykle: a3, cahcesuolo: a3, "xn--hcesuolo-7ya35b": a3, čáhcesuolo: a3, davvenjarga: a3, "xn--davvenjrga-y4a": a3, davvenjárga: a3, davvesiida: a3, deatnu: a3, dielddanuorri: a3, divtasvuodna: a3, divttasvuotna: a3, donna: a3, "xn--dnna-gra": a3, dønna: a3, dovre: a3, drammen: a3, drangedal: a3, dyroy: a3, "xn--dyry-ira": a3, dyrøy: a3, eid: a3, eidfjord: a3, eidsberg: a3, eidskog: a3, eidsvoll: a3, eigersund: a3, elverum: a3, enebakk: a3, engerdal: a3, etne: a3, etnedal: a3, evenassi: a3, "xn--eveni-0qa01ga": a3, evenášši: a3, evenes: a3, "evje-og-hornnes": a3, farsund: a3, fauske: a3, fedje: a3, fet: a3, finnoy: a3, "xn--finny-yua": a3, finnøy: a3, fitjar: a3, fjaler: a3, fjell: a3, fla: a3, "xn--fl-zia": a3, flå: a3, flakstad: a3, flatanger: a3, flekkefjord: a3, flesberg: a3, flora: a3, folldal: a3, forde: a3, "xn--frde-gra": a3, førde: a3, forsand: a3, fosnes: a3, "xn--frna-woa": a3, fræna: a3, frana: a3, frei: a3, frogn: a3, froland: a3, frosta: a3, froya: a3, "xn--frya-hra": a3, frøya: a3, fuoisku: a3, fuossko: a3, fusa: a3, fyresdal: a3, gaivuotna: a3, "xn--givuotna-8ya": a3, gáivuotna: a3, galsa: a3, "xn--gls-elac": a3, gálsá: a3, gamvik: a3, gangaviika: a3, "xn--ggaviika-8ya47h": a3, gáŋgaviika: a3, gaular: a3, gausdal: a3, giehtavuoatna: a3, gildeskal: a3, "xn--gildeskl-g0a": a3, gildeskål: a3, giske: a3, gjemnes: a3, gjerdrum: a3, gjerstad: a3, gjesdal: a3, gjovik: a3, "xn--gjvik-wua": a3, gjøvik: a3, gloppen: a3, gol: a3, gran: a3, grane: a3, granvin: a3, gratangen: a3, grimstad: a3, grong: a3, grue: a3, gulen: a3, guovdageaidnu: a3, ha: a3, "xn--h-2fa": a3, hå: a3, habmer: a3, "xn--hbmer-xqa": a3, hábmer: a3, hadsel: a3, "xn--hgebostad-g3a": a3, hægebostad: a3, hagebostad: a3, halden: a3, halsa: a3, hamar: a3, hamaroy: a3, hammarfeasta: a3, "xn--hmmrfeasta-s4ac": a3, hámmárfeasta: a3, hammerfest: a3, hapmir: a3, "xn--hpmir-xqa": a3, hápmir: a3, haram: a3, hareid: a3, harstad: a3, hasvik: a3, hattfjelldal: a3, haugesund: a3, hedmark: [0, { os: a3, valer: a3, "xn--vler-qoa": a3, våler: a3 }], hemne: a3, hemnes: a3, hemsedal: a3, hitra: a3, hjartdal: a3, hjelmeland: a3, hobol: a3, "xn--hobl-ira": a3, hobøl: a3, hof: a3, hol: a3, hole: a3, holmestrand: a3, holtalen: a3, "xn--holtlen-hxa": a3, holtålen: a3, hordaland: [0, { os: a3 }], hornindal: a3, horten: a3, hoyanger: a3, "xn--hyanger-q1a": a3, høyanger: a3, hoylandet: a3, "xn--hylandet-54a": a3, høylandet: a3, hurdal: a3, hurum: a3, hvaler: a3, hyllestad: a3, ibestad: a3, inderoy: a3, "xn--indery-fya": a3, inderøy: a3, iveland: a3, ivgu: a3, jevnaker: a3, jolster: a3, "xn--jlster-bya": a3, jølster: a3, jondal: a3, kafjord: a3, "xn--kfjord-iua": a3, kåfjord: a3, karasjohka: a3, "xn--krjohka-hwab49j": a3, kárášjohka: a3, karasjok: a3, karlsoy: a3, karmoy: a3, "xn--karmy-yua": a3, karmøy: a3, kautokeino: a3, klabu: a3, "xn--klbu-woa": a3, klæbu: a3, klepp: a3, kongsberg: a3, kongsvinger: a3, kraanghke: a3, "xn--kranghke-b0a": a3, kråanghke: a3, kragero: a3, "xn--krager-gya": a3, kragerø: a3, kristiansand: a3, kristiansund: a3, krodsherad: a3, "xn--krdsherad-m8a": a3, krødsherad: a3, "xn--kvfjord-nxa": a3, kvæfjord: a3, "xn--kvnangen-k0a": a3, kvænangen: a3, kvafjord: a3, kvalsund: a3, kvam: a3, kvanangen: a3, kvinesdal: a3, kvinnherad: a3, kviteseid: a3, kvitsoy: a3, "xn--kvitsy-fya": a3, kvitsøy: a3, laakesvuemie: a3, "xn--lrdal-sra": a3, lærdal: a3, lahppi: a3, "xn--lhppi-xqa": a3, láhppi: a3, lardal: a3, larvik: a3, lavagis: a3, lavangen: a3, leangaviika: a3, "xn--leagaviika-52b": a3, leaŋgaviika: a3, lebesby: a3, leikanger: a3, leirfjord: a3, leka: a3, leksvik: a3, lenvik: a3, lerdal: a3, lesja: a3, levanger: a3, lier: a3, lierne: a3, lillehammer: a3, lillesand: a3, lindas: a3, "xn--linds-pra": a3, lindås: a3, lindesnes: a3, loabat: a3, "xn--loabt-0qa": a3, loabát: a3, lodingen: a3, "xn--ldingen-q1a": a3, lødingen: a3, lom: a3, loppa: a3, lorenskog: a3, "xn--lrenskog-54a": a3, lørenskog: a3, loten: a3, "xn--lten-gra": a3, løten: a3, lund: a3, lunner: a3, luroy: a3, "xn--lury-ira": a3, lurøy: a3, luster: a3, lyngdal: a3, lyngen: a3, malatvuopmi: a3, "xn--mlatvuopmi-s4a": a3, málatvuopmi: a3, malselv: a3, "xn--mlselv-iua": a3, målselv: a3, malvik: a3, mandal: a3, marker: a3, marnardal: a3, masfjorden: a3, masoy: a3, "xn--msy-ula0h": a3, måsøy: a3, "matta-varjjat": a3, "xn--mtta-vrjjat-k7af": a3, "mátta-várjjat": a3, meland: a3, meldal: a3, melhus: a3, meloy: a3, "xn--mely-ira": a3, meløy: a3, meraker: a3, "xn--merker-kua": a3, meråker: a3, midsund: a3, "midtre-gauldal": a3, moareke: a3, "xn--moreke-jua": a3, moåreke: a3, modalen: a3, modum: a3, molde: a3, "more-og-romsdal": [0, { heroy: a3, sande: a3 }], "xn--mre-og-romsdal-qqb": [0, { "xn--hery-ira": a3, sande: a3 }], "møre-og-romsdal": [0, { herøy: a3, sande: a3 }], moskenes: a3, moss: a3, muosat: a3, "xn--muost-0qa": a3, muosát: a3, naamesjevuemie: a3, "xn--nmesjevuemie-tcba": a3, nååmesjevuemie: a3, "xn--nry-yla5g": a3, nærøy: a3, namdalseid: a3, namsos: a3, namsskogan: a3, nannestad: a3, naroy: a3, narviika: a3, narvik: a3, naustdal: a3, navuotna: a3, "xn--nvuotna-hwa": a3, návuotna: a3, "nedre-eiker": a3, nesna: a3, nesodden: a3, nesseby: a3, nesset: a3, nissedal: a3, nittedal: a3, "nord-aurdal": a3, "nord-fron": a3, "nord-odal": a3, norddal: a3, nordkapp: a3, nordland: [0, { bo: a3, "xn--b-5ga": a3, bø: a3, heroy: a3, "xn--hery-ira": a3, herøy: a3 }], "nordre-land": a3, nordreisa: a3, "nore-og-uvdal": a3, notodden: a3, notteroy: a3, "xn--nttery-byae": a3, nøtterøy: a3, odda: a3, oksnes: a3, "xn--ksnes-uua": a3, øksnes: a3, omasvuotna: a3, oppdal: a3, oppegard: a3, "xn--oppegrd-ixa": a3, oppegård: a3, orkdal: a3, orland: a3, "xn--rland-uua": a3, ørland: a3, orskog: a3, "xn--rskog-uua": a3, ørskog: a3, orsta: a3, "xn--rsta-fra": a3, ørsta: a3, osen: a3, osteroy: a3, "xn--ostery-fya": a3, osterøy: a3, ostfold: [0, { valer: a3 }], "xn--stfold-9xa": [0, { "xn--vler-qoa": a3 }], østfold: [0, { våler: a3 }], "ostre-toten": a3, "xn--stre-toten-zcb": a3, "østre-toten": a3, overhalla: a3, "ovre-eiker": a3, "xn--vre-eiker-k8a": a3, "øvre-eiker": a3, oyer: a3, "xn--yer-zna": a3, øyer: a3, oygarden: a3, "xn--ygarden-p1a": a3, øygarden: a3, "oystre-slidre": a3, "xn--ystre-slidre-ujb": a3, "øystre-slidre": a3, porsanger: a3, porsangu: a3, "xn--porsgu-sta26f": a3, porsáŋgu: a3, porsgrunn: a3, rade: a3, "xn--rde-ula": a3, råde: a3, radoy: a3, "xn--rady-ira": a3, radøy: a3, "xn--rlingen-mxa": a3, rælingen: a3, rahkkeravju: a3, "xn--rhkkervju-01af": a3, ráhkkerávju: a3, raisa: a3, "xn--risa-5na": a3, ráisa: a3, rakkestad: a3, ralingen: a3, rana: a3, randaberg: a3, rauma: a3, rendalen: a3, rennebu: a3, rennesoy: a3, "xn--rennesy-v1a": a3, rennesøy: a3, rindal: a3, ringebu: a3, ringerike: a3, ringsaker: a3, risor: a3, "xn--risr-ira": a3, risør: a3, rissa: a3, roan: a3, rodoy: a3, "xn--rdy-0nab": a3, rødøy: a3, rollag: a3, romsa: a3, romskog: a3, "xn--rmskog-bya": a3, rømskog: a3, roros: a3, "xn--rros-gra": a3, røros: a3, rost: a3, "xn--rst-0na": a3, røst: a3, royken: a3, "xn--ryken-vua": a3, røyken: a3, royrvik: a3, "xn--ryrvik-bya": a3, røyrvik: a3, ruovat: a3, rygge: a3, salangen: a3, salat: a3, "xn--slat-5na": a3, sálat: a3, "xn--slt-elab": a3, sálát: a3, saltdal: a3, samnanger: a3, sandefjord: a3, sandnes: a3, sandoy: a3, "xn--sandy-yua": a3, sandøy: a3, sarpsborg: a3, sauda: a3, sauherad: a3, sel: a3, selbu: a3, selje: a3, seljord: a3, siellak: a3, sigdal: a3, siljan: a3, sirdal: a3, skanit: a3, "xn--sknit-yqa": a3, skánit: a3, skanland: a3, "xn--sknland-fxa": a3, skånland: a3, skaun: a3, skedsmo: a3, ski: a3, skien: a3, skierva: a3, "xn--skierv-uta": a3, skiervá: a3, skiptvet: a3, skjak: a3, "xn--skjk-soa": a3, skjåk: a3, skjervoy: a3, "xn--skjervy-v1a": a3, skjervøy: a3, skodje: a3, smola: a3, "xn--smla-hra": a3, smøla: a3, snaase: a3, "xn--snase-nra": a3, snåase: a3, snasa: a3, "xn--snsa-roa": a3, snåsa: a3, snillfjord: a3, snoasa: a3, sogndal: a3, sogne: a3, "xn--sgne-gra": a3, søgne: a3, sokndal: a3, sola: a3, solund: a3, somna: a3, "xn--smna-gra": a3, sømna: a3, "sondre-land": a3, "xn--sndre-land-0cb": a3, "søndre-land": a3, songdalen: a3, "sor-aurdal": a3, "xn--sr-aurdal-l8a": a3, "sør-aurdal": a3, "sor-fron": a3, "xn--sr-fron-q1a": a3, "sør-fron": a3, "sor-odal": a3, "xn--sr-odal-q1a": a3, "sør-odal": a3, "sor-varanger": a3, "xn--sr-varanger-ggb": a3, "sør-varanger": a3, sorfold: a3, "xn--srfold-bya": a3, sørfold: a3, sorreisa: a3, "xn--srreisa-q1a": a3, sørreisa: a3, sortland: a3, sorum: a3, "xn--srum-gra": a3, sørum: a3, spydeberg: a3, stange: a3, stavanger: a3, steigen: a3, steinkjer: a3, stjordal: a3, "xn--stjrdal-s1a": a3, stjørdal: a3, stokke: a3, "stor-elvdal": a3, stord: a3, stordal: a3, storfjord: a3, strand: a3, stranda: a3, stryn: a3, sula: a3, suldal: a3, sund: a3, sunndal: a3, surnadal: a3, sveio: a3, svelvik: a3, sykkylven: a3, tana: a3, telemark: [0, { bo: a3, "xn--b-5ga": a3, bø: a3 }], time: a3, tingvoll: a3, tinn: a3, tjeldsund: a3, tjome: a3, "xn--tjme-hra": a3, tjøme: a3, tokke: a3, tolga: a3, tonsberg: a3, "xn--tnsberg-q1a": a3, tønsberg: a3, torsken: a3, "xn--trna-woa": a3, træna: a3, trana: a3, tranoy: a3, "xn--trany-yua": a3, tranøy: a3, troandin: a3, trogstad: a3, "xn--trgstad-r1a": a3, trøgstad: a3, tromsa: a3, tromso: a3, "xn--troms-zua": a3, tromsø: a3, trondheim: a3, trysil: a3, tvedestrand: a3, tydal: a3, tynset: a3, tysfjord: a3, tysnes: a3, "xn--tysvr-vra": a3, tysvær: a3, tysvar: a3, ullensaker: a3, ullensvang: a3, ulvik: a3, unjarga: a3, "xn--unjrga-rta": a3, unjárga: a3, utsira: a3, vaapste: a3, vadso: a3, "xn--vads-jra": a3, vadsø: a3, "xn--vry-yla5g": a3, værøy: a3, vaga: a3, "xn--vg-yiab": a3, vågå: a3, vagan: a3, "xn--vgan-qoa": a3, vågan: a3, vagsoy: a3, "xn--vgsy-qoa0j": a3, vågsøy: a3, vaksdal: a3, valle: a3, vang: a3, vanylven: a3, vardo: a3, "xn--vard-jra": a3, vardø: a3, varggat: a3, "xn--vrggt-xqad": a3, várggát: a3, varoy: a3, vefsn: a3, vega: a3, vegarshei: a3, "xn--vegrshei-c0a": a3, vegårshei: a3, vennesla: a3, verdal: a3, verran: a3, vestby: a3, vestfold: [0, { sande: a3 }], vestnes: a3, "vestre-slidre": a3, "vestre-toten": a3, vestvagoy: a3, "xn--vestvgy-ixa6o": a3, vestvågøy: a3, vevelstad: a3, vik: a3, vikna: a3, vindafjord: a3, voagat: a3, volda: a3, voss: a3, co: e, "123hjemmeside": e, myspreadshop: e }], np: r2, nr: ca, nu: [1, { merseine: e, mine: e, shacknet: e, enterprisecloud: e }], nz: [1, { ac: a3, co: a3, cri: a3, geek: a3, gen: a3, govt: a3, health: a3, iwi: a3, kiwi: a3, maori: a3, "xn--mori-qsa": a3, māori: a3, mil: a3, net: a3, org: a3, parliament: a3, school: a3, cloudns: e }], om: [1, { co: a3, com: a3, edu: a3, gov: a3, med: a3, museum: a3, net: a3, org: a3, pro: a3 }], onion: a3, org: [1, { altervista: e, pimienta: e, poivron: e, potager: e, sweetpepper: e, cdn77: [0, { c: e, rsc: e }], "cdn77-secure": [0, { origin: [0, { ssl: e }] }], ae: e, cloudns: e, "ip-dynamic": e, ddnss: e, dpdns: e, duckdns: e, tunk: e, blogdns: e, blogsite: e, boldlygoingnowhere: e, dnsalias: e, dnsdojo: e, doesntexist: e, dontexist: e, doomdns: e, dvrdns: e, dynalias: e, dyndns: [2, { go: e, home: e }], endofinternet: e, endoftheinternet: e, "from-me": e, "game-host": e, gotdns: e, "hobby-site": e, homedns: e, homeftp: e, homelinux: e, homeunix: e, "is-a-bruinsfan": e, "is-a-candidate": e, "is-a-celticsfan": e, "is-a-chef": e, "is-a-geek": e, "is-a-knight": e, "is-a-linux-user": e, "is-a-patsfan": e, "is-a-soxfan": e, "is-found": e, "is-lost": e, "is-saved": e, "is-very-bad": e, "is-very-evil": e, "is-very-good": e, "is-very-nice": e, "is-very-sweet": e, "isa-geek": e, "kicks-ass": e, misconfused: e, podzone: e, readmyblog: e, selfip: e, sellsyourhome: e, servebbs: e, serveftp: e, servegame: e, "stuff-4-sale": e, webhop: e, accesscam: e, camdvr: e, freeddns: e, mywire: e, roxa: e, webredirect: e, twmail: e, eu: [2, { al: e, asso: e, at: e, au: e, be: e, bg: e, ca: e, cd: e, ch: e, cn: e, cy: e, cz: e, de: e, dk: e, edu: e, ee: e, es: e, fi: e, fr: e, gr: e, hr: e, hu: e, ie: e, il: e, in: e, int: e, is: e, it: e, jp: e, kr: e, lt: e, lu: e, lv: e, me: e, mk: e, mt: e, my: e, net: e, ng: e, nl: e, no: e, nz: e, pl: e, pt: e, ro: e, ru: e, se: e, si: e, sk: e, tr: e, uk: e, us: e }], fspages: e, fedorainfracloud: e, fedorapeople: e, fedoraproject: [0, { cloud: e, os: I2, stg: [0, { os: I2 }] }], freedesktop: e, hatenadiary: e, hepforge: e, "in-dsl": e, "in-vpn": e, js: e, barsy: e, mayfirst: e, routingthecloud: e, bmoattachments: e, "cable-modem": e, collegefan: e, couchpotatofries: e, hopto: e, mlbfan: e, myftp: e, mysecuritycamera: e, nflfan: e, "no-ip": e, "read-books": e, ufcfan: e, zapto: e, dynserv: e, "now-dns": e, "is-local": e, httpbin: e, pubtls: e, jpn: e, "my-firewall": e, myfirewall: e, spdns: e, "small-web": e, dsmynas: e, familyds: e, teckids: M2, tuxfamily: e, hk: e, us: e, toolforge: e, wmcloud: [2, { beta: e }], wmflabs: e, za: e }], pa: [1, { abo: a3, ac: a3, com: a3, edu: a3, gob: a3, ing: a3, med: a3, net: a3, nom: a3, org: a3, sld: a3 }], pe: [1, { com: a3, edu: a3, gob: a3, mil: a3, net: a3, nom: a3, org: a3 }], pf: [1, { com: a3, edu: a3, org: a3 }], pg: r2, ph: [1, { com: a3, edu: a3, gov: a3, i: a3, mil: a3, net: a3, ngo: a3, org: a3, cloudns: e }], pk: [1, { ac: a3, biz: a3, com: a3, edu: a3, fam: a3, gkp: a3, gob: a3, gog: a3, gok: a3, gop: a3, gos: a3, gov: a3, net: a3, org: a3, web: a3 }], pl: [1, { com: a3, net: a3, org: a3, agro: a3, aid: a3, atm: a3, auto: a3, biz: a3, edu: a3, gmina: a3, gsm: a3, info: a3, mail: a3, media: a3, miasta: a3, mil: a3, nieruchomosci: a3, nom: a3, pc: a3, powiat: a3, priv: a3, realestate: a3, rel: a3, sex: a3, shop: a3, sklep: a3, sos: a3, szkola: a3, targi: a3, tm: a3, tourism: a3, travel: a3, turystyka: a3, gov: [1, { ap: a3, griw: a3, ic: a3, is: a3, kmpsp: a3, konsulat: a3, kppsp: a3, kwp: a3, kwpsp: a3, mup: a3, mw: a3, oia: a3, oirm: a3, oke: a3, oow: a3, oschr: a3, oum: a3, pa: a3, pinb: a3, piw: a3, po: a3, pr: a3, psp: a3, psse: a3, pup: a3, rzgw: a3, sa: a3, sdn: a3, sko: a3, so: a3, sr: a3, starostwo: a3, ug: a3, ugim: a3, um: a3, umig: a3, upow: a3, uppo: a3, us: a3, uw: a3, uzs: a3, wif: a3, wiih: a3, winb: a3, wios: a3, witd: a3, wiw: a3, wkz: a3, wsa: a3, wskr: a3, wsse: a3, wuoz: a3, wzmiuw: a3, zp: a3, zpisdn: a3 }], augustow: a3, "babia-gora": a3, bedzin: a3, beskidy: a3, bialowieza: a3, bialystok: a3, bielawa: a3, bieszczady: a3, boleslawiec: a3, bydgoszcz: a3, bytom: a3, cieszyn: a3, czeladz: a3, czest: a3, dlugoleka: a3, elblag: a3, elk: a3, glogow: a3, gniezno: a3, gorlice: a3, grajewo: a3, ilawa: a3, jaworzno: a3, "jelenia-gora": a3, jgora: a3, kalisz: a3, karpacz: a3, kartuzy: a3, kaszuby: a3, katowice: a3, "kazimierz-dolny": a3, kepno: a3, ketrzyn: a3, klodzko: a3, kobierzyce: a3, kolobrzeg: a3, konin: a3, konskowola: a3, kutno: a3, lapy: a3, lebork: a3, legnica: a3, lezajsk: a3, limanowa: a3, lomza: a3, lowicz: a3, lubin: a3, lukow: a3, malbork: a3, malopolska: a3, mazowsze: a3, mazury: a3, mielec: a3, mielno: a3, mragowo: a3, naklo: a3, nowaruda: a3, nysa: a3, olawa: a3, olecko: a3, olkusz: a3, olsztyn: a3, opoczno: a3, opole: a3, ostroda: a3, ostroleka: a3, ostrowiec: a3, ostrowwlkp: a3, pila: a3, pisz: a3, podhale: a3, podlasie: a3, polkowice: a3, pomorskie: a3, pomorze: a3, prochowice: a3, pruszkow: a3, przeworsk: a3, pulawy: a3, radom: a3, "rawa-maz": a3, rybnik: a3, rzeszow: a3, sanok: a3, sejny: a3, skoczow: a3, slask: a3, slupsk: a3, sosnowiec: a3, "stalowa-wola": a3, starachowice: a3, stargard: a3, suwalki: a3, swidnica: a3, swiebodzin: a3, swinoujscie: a3, szczecin: a3, szczytno: a3, tarnobrzeg: a3, tgory: a3, turek: a3, tychy: a3, ustka: a3, walbrzych: a3, warmia: a3, warszawa: a3, waw: a3, wegrow: a3, wielun: a3, wlocl: a3, wloclawek: a3, wodzislaw: a3, wolomin: a3, wroclaw: a3, zachpomor: a3, zagan: a3, zarow: a3, zgora: a3, zgorzelec: a3, art: e, gliwice: e, krakow: e, poznan: e, wroc: e, zakopane: e, beep: e, "ecommerce-shop": e, cfolks: e, dfirma: e, dkonto: e, you2: e, shoparena: e, homesklep: e, sdscloud: e, unicloud: e, lodz: e, pabianice: e, plock: e, sieradz: e, skierniewice: e, zgierz: e, krasnik: e, leczna: e, lubartow: e, lublin: e, poniatowa: e, swidnik: e, co: e, torun: e, simplesite: e, myspreadshop: e, gda: e, gdansk: e, gdynia: e, med: e, sopot: e, bielsko: e }], pm: [1, { own: e, name: e }], pn: [1, { co: a3, edu: a3, gov: a3, net: a3, org: a3 }], post: a3, pr: [1, { biz: a3, com: a3, edu: a3, gov: a3, info: a3, isla: a3, name: a3, net: a3, org: a3, pro: a3, ac: a3, est: a3, prof: a3 }], pro: [1, { aaa: a3, aca: a3, acct: a3, avocat: a3, bar: a3, cpa: a3, eng: a3, jur: a3, law: a3, med: a3, recht: a3, cloudns: e, keenetic: e, barsy: e, ngrok: e }], ps: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, plo: a3, sec: a3 }], pt: [1, { com: a3, edu: a3, gov: a3, int: a3, net: a3, nome: a3, org: a3, publ: a3, "123paginaweb": e }], pw: [1, { gov: a3, cloudns: e, x443: e }], py: [1, { com: a3, coop: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3 }], qa: [1, { com: a3, edu: a3, gov: a3, mil: a3, name: a3, net: a3, org: a3, sch: a3 }], re: [1, { asso: a3, com: a3, netlib: e, can: e }], ro: [1, { arts: a3, com: a3, firm: a3, info: a3, nom: a3, nt: a3, org: a3, rec: a3, store: a3, tm: a3, www: a3, co: e, shop: e, barsy: e }], rs: [1, { ac: a3, co: a3, edu: a3, gov: a3, in: a3, org: a3, brendly: E2, barsy: e, ox: e }], ru: [1, { ac: e, edu: e, gov: e, int: e, mil: e, eurodir: e, adygeya: e, bashkiria: e, bir: e, cbg: e, com: e, dagestan: e, grozny: e, kalmykia: e, kustanai: e, marine: e, mordovia: e, msk: e, mytis: e, nalchik: e, nov: e, pyatigorsk: e, spb: e, vladikavkaz: e, vladimir: e, na4u: e, mircloud: e, myjino: [2, { hosting: o, landing: o, spectrum: o, vps: o }], cldmail: [0, { hb: e }], mcdir: [2, { vps: e }], mcpre: e, net: e, org: e, pp: e, ras: e }], rw: [1, { ac: a3, co: a3, coop: a3, gov: a3, mil: a3, net: a3, org: a3 }], sa: [1, { com: a3, edu: a3, gov: a3, med: a3, net: a3, org: a3, pub: a3, sch: a3 }], sb: m2, sc: m2, sd: [1, { com: a3, edu: a3, gov: a3, info: a3, med: a3, net: a3, org: a3, tv: a3 }], se: [1, { a: a3, ac: a3, b: a3, bd: a3, brand: a3, c: a3, d: a3, e: a3, f: a3, fh: a3, fhsk: a3, fhv: a3, g: a3, h: a3, i: a3, k: a3, komforb: a3, kommunalforbund: a3, komvux: a3, l: a3, lanbib: a3, m: a3, n: a3, naturbruksgymn: a3, o: a3, org: a3, p: a3, parti: a3, pp: a3, press: a3, r: a3, s: a3, t: a3, tm: a3, u: a3, w: a3, x: a3, y: a3, z: a3, com: e, iopsys: e, "123minsida": e, itcouldbewor: e, myspreadshop: e }], sg: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, enscaled: e }], sh: [1, { com: a3, gov: a3, mil: a3, net: a3, org: a3, hashbang: e, botda: e, lovable: e, platform: [0, { ent: e, eu: e, us: e }], teleport: e, now: e }], si: [1, { f5: e, gitapp: e, gitpage: e }], sj: a3, sk: [1, { org: a3 }], sl: m2, sm: a3, sn: [1, { art: a3, com: a3, edu: a3, gouv: a3, org: a3, univ: a3 }], so: [1, { com: a3, edu: a3, gov: a3, me: a3, net: a3, org: a3, surveys: e }], sr: a3, ss: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, me: a3, net: a3, org: a3, sch: a3 }], st: [1, { co: a3, com: a3, consulado: a3, edu: a3, embaixada: a3, mil: a3, net: a3, org: a3, principe: a3, saotome: a3, store: a3, helioho: e, cn: o, kirara: e, noho: e }], su: [1, { abkhazia: e, adygeya: e, aktyubinsk: e, arkhangelsk: e, armenia: e, ashgabad: e, azerbaijan: e, balashov: e, bashkiria: e, bryansk: e, bukhara: e, chimkent: e, dagestan: e, "east-kazakhstan": e, exnet: e, georgia: e, grozny: e, ivanovo: e, jambyl: e, kalmykia: e, kaluga: e, karacol: e, karaganda: e, karelia: e, khakassia: e, krasnodar: e, kurgan: e, kustanai: e, lenug: e, mangyshlak: e, mordovia: e, msk: e, murmansk: e, nalchik: e, navoi: e, "north-kazakhstan": e, nov: e, obninsk: e, penza: e, pokrovsk: e, sochi: e, spb: e, tashkent: e, termez: e, togliatti: e, troitsk: e, tselinograd: e, tula: e, tuva: e, vladikavkaz: e, vladimir: e, vologda: e }], sv: [1, { com: a3, edu: a3, gob: a3, org: a3, red: a3 }], sx: g4, sy: w2, sz: [1, { ac: a3, co: a3, org: a3 }], tc: a3, td: a3, tel: a3, tf: [1, { sch: e }], tg: a3, th: [1, { ac: a3, co: a3, go: a3, in: a3, mi: a3, net: a3, or: a3, online: e, shop: e }], tj: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, go: a3, gov: a3, int: a3, mil: a3, name: a3, net: a3, nic: a3, org: a3, test: a3, web: a3 }], tk: a3, tl: g4, tm: [1, { co: a3, com: a3, edu: a3, gov: a3, mil: a3, net: a3, nom: a3, org: a3 }], tn: [1, { com: a3, ens: a3, fin: a3, gov: a3, ind: a3, info: a3, intl: a3, mincom: a3, nat: a3, net: a3, org: a3, perso: a3, tourism: a3, orangecloud: e }], to: [1, { 611: e, com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, oya: e, x0: e, quickconnect: Y, vpnplus: e, nett: e }], tr: [1, { av: a3, bbs: a3, bel: a3, biz: a3, com: a3, dr: a3, edu: a3, gen: a3, gov: a3, info: a3, k12: a3, kep: a3, mil: a3, name: a3, net: a3, org: a3, pol: a3, tel: a3, tsk: a3, tv: a3, web: a3, nc: g4 }], tt: [1, { biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, mil: a3, name: a3, net: a3, org: a3, pro: a3 }], tv: [1, { "better-than": e, dyndns: e, "on-the-web": e, "worse-than": e, from: e, sakura: e }], tw: [1, { club: a3, com: [1, { mymailer: e }], ebiz: a3, edu: a3, game: a3, gov: a3, idv: a3, mil: a3, net: a3, org: a3, url: e, mydns: e }], tz: [1, { ac: a3, co: a3, go: a3, hotel: a3, info: a3, me: a3, mil: a3, mobi: a3, ne: a3, or: a3, sc: a3, tv: a3 }], ua: [1, { com: a3, edu: a3, gov: a3, in: a3, net: a3, org: a3, cherkassy: a3, cherkasy: a3, chernigov: a3, chernihiv: a3, chernivtsi: a3, chernovtsy: a3, ck: a3, cn: a3, cr: a3, crimea: a3, cv: a3, dn: a3, dnepropetrovsk: a3, dnipropetrovsk: a3, donetsk: a3, dp: a3, if: a3, "ivano-frankivsk": a3, kh: a3, kharkiv: a3, kharkov: a3, kherson: a3, khmelnitskiy: a3, khmelnytskyi: a3, kiev: a3, kirovograd: a3, km: a3, kr: a3, kropyvnytskyi: a3, krym: a3, ks: a3, kv: a3, kyiv: a3, lg: a3, lt: a3, lugansk: a3, luhansk: a3, lutsk: a3, lv: a3, lviv: a3, mk: a3, mykolaiv: a3, nikolaev: a3, od: a3, odesa: a3, odessa: a3, pl: a3, poltava: a3, rivne: a3, rovno: a3, rv: a3, sb: a3, sebastopol: a3, sevastopol: a3, sm: a3, sumy: a3, te: a3, ternopil: a3, uz: a3, uzhgorod: a3, uzhhorod: a3, vinnica: a3, vinnytsia: a3, vn: a3, volyn: a3, yalta: a3, zakarpattia: a3, zaporizhzhe: a3, zaporizhzhia: a3, zhitomir: a3, zhytomyr: a3, zp: a3, zt: a3, cc: e, inf: e, ltd: e, cx: e, biz: e, co: e, pp: e, v: e }], ug: [1, { ac: a3, co: a3, com: a3, edu: a3, go: a3, gov: a3, mil: a3, ne: a3, or: a3, org: a3, sc: a3, us: a3 }], uk: [1, { ac: a3, co: [1, { bytemark: [0, { dh: e, vm: e }], layershift: K, barsy: e, barsyonline: e, retrosnub: la, "nh-serv": e, "no-ip": e, adimo: e, myspreadshop: e }], gov: [1, { api: e, campaign: e, service: e }], ltd: a3, me: a3, net: a3, nhs: a3, org: [1, { glug: e, lug: e, lugs: e, affinitylottery: e, raffleentry: e, weeklylottery: e }], plc: a3, police: a3, sch: r2, conn: e, copro: e, hosp: e, "independent-commission": e, "independent-inquest": e, "independent-inquiry": e, "independent-panel": e, "independent-review": e, "public-inquiry": e, "royal-commission": e, pymnt: e, barsy: e, nimsite: e, oraclegovcloudapps: o }], us: [1, { dni: a3, isa: a3, nsn: a3, ak: i3, al: i3, ar: i3, as: i3, az: i3, ca: i3, co: i3, ct: i3, dc: i3, de: ha, fl: i3, ga: i3, gu: i3, hi: B2, ia: i3, id: i3, il: i3, in: i3, ks: i3, ky: i3, la: i3, ma: [1, { k12: [1, { chtr: a3, paroch: a3, pvt: a3 }], cc: a3, lib: a3 }], md: i3, me: i3, mi: [1, { k12: a3, cc: a3, lib: a3, "ann-arbor": a3, cog: a3, dst: a3, eaton: a3, gen: a3, mus: a3, tec: a3, washtenaw: a3 }], mn: i3, mo: i3, ms: [1, { k12: a3, cc: a3 }], mt: i3, nc: i3, nd: B2, ne: i3, nh: i3, nj: i3, nm: i3, nv: i3, ny: i3, oh: i3, ok: i3, or: i3, pa: i3, pr: i3, ri: B2, sc: i3, sd: B2, tn: i3, tx: i3, ut: i3, va: i3, vi: i3, vt: i3, wa: [1, { k12: a3, cc: a3, lib: a3, aberdeen: e, "bainbridge-isl": e, bellevue: e, bremerton: e, centralia: e, chehalis: e, forks: e, "gig-harbor": e, hoquiam: e, keyport: e, kingston: e, olympia: e, "port-angeles": e, "port-ludlow": e, "port-orchard": e, "port-townsend": e, poulsbo: e, redmond: e, renton: e, sea: e, seattle: e, sequim: e, shelton: e, silverdale: e, "yarrow-point": e }], wi: i3, wv: ha, wy: i3, cloudns: e, "is-by": e, "land-4-sale": e, "stuff-4-sale": e, heliohost: e, enscaled: [0, { phx: e }], mircloud: e, "azure-api": e, azurewebsites: e, ngo: e, golffan: e, noip: e, pointto: e, freeddns: e, srv: [2, { gh: e, gl: e }], servername: e }], uy: [1, { com: a3, edu: a3, gub: a3, mil: a3, net: a3, org: a3, gv: e }], uz: [1, { co: a3, com: a3, net: a3, org: a3 }], va: a3, vc: [1, { com: a3, edu: a3, gov: a3, mil: a3, net: a3, org: a3, gv: [2, { d: e }], "0e": o, mydns: e }], ve: [1, { arts: a3, bib: a3, co: a3, com: a3, e12: a3, edu: a3, emprende: a3, firm: a3, gob: a3, gov: a3, ia: a3, info: a3, int: a3, mil: a3, net: a3, nom: a3, org: a3, rar: a3, rec: a3, store: a3, tec: a3, web: a3 }], vg: [1, { edu: a3 }], vi: [1, { co: a3, com: a3, k12: a3, net: a3, org: a3 }], vn: [1, { ac: a3, ai: a3, biz: a3, com: a3, edu: a3, gov: a3, health: a3, id: a3, info: a3, int: a3, io: a3, name: a3, net: a3, org: a3, pro: a3, angiang: a3, bacgiang: a3, backan: a3, baclieu: a3, bacninh: a3, "baria-vungtau": a3, bentre: a3, binhdinh: a3, binhduong: a3, binhphuoc: a3, binhthuan: a3, camau: a3, cantho: a3, caobang: a3, daklak: a3, daknong: a3, danang: a3, dienbien: a3, dongnai: a3, dongthap: a3, gialai: a3, hagiang: a3, haiduong: a3, haiphong: a3, hanam: a3, hanoi: a3, hatinh: a3, haugiang: a3, hoabinh: a3, hue: a3, hungyen: a3, khanhhoa: a3, kiengiang: a3, kontum: a3, laichau: a3, lamdong: a3, langson: a3, laocai: a3, longan: a3, namdinh: a3, nghean: a3, ninhbinh: a3, ninhthuan: a3, phutho: a3, phuyen: a3, quangbinh: a3, quangnam: a3, quangngai: a3, quangninh: a3, quangtri: a3, soctrang: a3, sonla: a3, tayninh: a3, thaibinh: a3, thainguyen: a3, thanhhoa: a3, thanhphohochiminh: a3, thuathienhue: a3, tiengiang: a3, travinh: a3, tuyenquang: a3, vinhlong: a3, vinhphuc: a3, yenbai: a3 }], vu: _, wf: [1, { biz: e, sch: e }], ws: [1, { com: a3, edu: a3, gov: a3, net: a3, org: a3, advisor: o, cloud66: e, dyndns: e, mypets: e }], yt: [1, { org: e }], "xn--mgbaam7a8h": a3, امارات: a3, "xn--y9a3aq": a3, հայ: a3, "xn--54b7fta0cc": a3, বাংলা: a3, "xn--90ae": a3, бг: a3, "xn--mgbcpq6gpa1a": a3, البحرين: a3, "xn--90ais": a3, бел: a3, "xn--fiqs8s": a3, 中国: a3, "xn--fiqz9s": a3, 中國: a3, "xn--lgbbat1ad8j": a3, الجزائر: a3, "xn--wgbh1c": a3, مصر: a3, "xn--e1a4c": a3, ею: a3, "xn--qxa6a": a3, ευ: a3, "xn--mgbah1a3hjkrd": a3, موريتانيا: a3, "xn--node": a3, გე: a3, "xn--qxam": a3, ελ: a3, "xn--j6w193g": [1, { "xn--gmqw5a": a3, "xn--55qx5d": a3, "xn--mxtq1m": a3, "xn--wcvs22d": a3, "xn--uc0atv": a3, "xn--od0alg": a3 }], 香港: [1, { 個人: a3, 公司: a3, 政府: a3, 教育: a3, 組織: a3, 網絡: a3 }], "xn--2scrj9c": a3, ಭಾರತ: a3, "xn--3hcrj9c": a3, ଭାରତ: a3, "xn--45br5cyl": a3, ভাৰত: a3, "xn--h2breg3eve": a3, भारतम्: a3, "xn--h2brj9c8c": a3, भारोत: a3, "xn--mgbgu82a": a3, ڀارت: a3, "xn--rvc1e0am3e": a3, ഭാരതം: a3, "xn--h2brj9c": a3, भारत: a3, "xn--mgbbh1a": a3, بارت: a3, "xn--mgbbh1a71e": a3, بھارت: a3, "xn--fpcrj9c3d": a3, భారత్: a3, "xn--gecrj9c": a3, ભારત: a3, "xn--s9brj9c": a3, ਭਾਰਤ: a3, "xn--45brj9c": a3, ভারত: a3, "xn--xkc2dl3a5ee0h": a3, இந்தியா: a3, "xn--mgba3a4f16a": a3, ایران: a3, "xn--mgba3a4fra": a3, ايران: a3, "xn--mgbtx2b": a3, عراق: a3, "xn--mgbayh7gpa": a3, الاردن: a3, "xn--3e0b707e": a3, 한국: a3, "xn--80ao21a": a3, қаз: a3, "xn--q7ce6a": a3, ລາວ: a3, "xn--fzc2c9e2c": a3, ලංකා: a3, "xn--xkc2al3hye2a": a3, இலங்கை: a3, "xn--mgbc0a9azcg": a3, المغرب: a3, "xn--d1alf": a3, мкд: a3, "xn--l1acc": a3, мон: a3, "xn--mix891f": a3, 澳門: a3, "xn--mix082f": a3, 澳门: a3, "xn--mgbx4cd0ab": a3, مليسيا: a3, "xn--mgb9awbf": a3, عمان: a3, "xn--mgbai9azgqp6j": a3, پاکستان: a3, "xn--mgbai9a5eva00b": a3, پاكستان: a3, "xn--ygbi2ammx": a3, فلسطين: a3, "xn--90a3ac": [1, { "xn--80au": a3, "xn--90azh": a3, "xn--d1at": a3, "xn--c1avg": a3, "xn--o1ac": a3, "xn--o1ach": a3 }], срб: [1, { ак: a3, обр: a3, од: a3, орг: a3, пр: a3, упр: a3 }], "xn--p1ai": a3, рф: a3, "xn--wgbl6a": a3, قطر: a3, "xn--mgberp4a5d4ar": a3, السعودية: a3, "xn--mgberp4a5d4a87g": a3, السعودیة: a3, "xn--mgbqly7c0a67fbc": a3, السعودیۃ: a3, "xn--mgbqly7cvafr": a3, السعوديه: a3, "xn--mgbpl2fh": a3, سودان: a3, "xn--yfro4i67o": a3, 新加坡: a3, "xn--clchc0ea0b2g2a9gcd": a3, சிங்கப்பூர்: a3, "xn--ogbpf8fl": a3, سورية: a3, "xn--mgbtf8fl": a3, سوريا: a3, "xn--o3cw4h": [1, { "xn--o3cyx2a": a3, "xn--12co0c3b4eva": a3, "xn--m3ch0j3a": a3, "xn--h3cuzk1di": a3, "xn--12c1fe0br": a3, "xn--12cfi8ixb8l": a3 }], ไทย: [1, { ทหาร: a3, ธุรกิจ: a3, เน็ต: a3, รัฐบาล: a3, ศึกษา: a3, องค์กร: a3 }], "xn--pgbs0dh": a3, تونس: a3, "xn--kpry57d": a3, 台灣: a3, "xn--kprw13d": a3, 台湾: a3, "xn--nnx388a": a3, 臺灣: a3, "xn--j1amh": a3, укр: a3, "xn--mgb2ddes": a3, اليمن: a3, xxx: a3, ye: w2, za: [0, { ac: a3, agric: a3, alt: a3, co: a3, edu: a3, gov: a3, grondar: a3, law: a3, mil: a3, net: a3, ngo: a3, nic: a3, nis: a3, nom: a3, org: a3, school: a3, tm: a3, web: a3 }], zm: [1, { ac: a3, biz: a3, co: a3, com: a3, edu: a3, gov: a3, info: a3, mil: a3, net: a3, org: a3, sch: a3 }], zw: [1, { ac: a3, co: a3, gov: a3, mil: a3, org: a3 }], aaa: a3, aarp: a3, abb: a3, abbott: a3, abbvie: a3, abc: a3, able: a3, abogado: a3, abudhabi: a3, academy: [1, { official: e }], accenture: a3, accountant: a3, accountants: a3, aco: a3, actor: a3, ads: a3, adult: a3, aeg: a3, aetna: a3, afl: a3, africa: a3, agakhan: a3, agency: a3, aig: a3, airbus: a3, airforce: a3, airtel: a3, akdn: a3, alibaba: a3, alipay: a3, allfinanz: a3, allstate: a3, ally: a3, alsace: a3, alstom: a3, amazon: a3, americanexpress: a3, americanfamily: a3, amex: a3, amfam: a3, amica: a3, amsterdam: a3, analytics: a3, android: a3, anquan: a3, anz: a3, aol: a3, apartments: a3, app: [1, { adaptable: e, aiven: e, claude: e, beget: o, brave: C2, clerk: e, clerkstage: e, cloudflare: e, wnext: e, csb: [2, { preview: e }], convex: e, corespeed: e, deta: e, ondigitalocean: e, easypanel: e, encr: [2, { frontend: e }], evervault: O2, expo: [2, { on: e, staging: [2, { on: e }] }], edgecompute: e, "on-fleek": e, flutterflow: e, sprites: e, e2b: e, framer: e, gadget: e, github: e, hosted: o, run: [0, { "*": e, mtls: o }], web: e, hackclub: e, hasura: e, onhercules: e, botdash: e, shiptoday: e, leapcell: e, loginline: e, lovable: e, luyani: e, magicpatterns: e, medusajs: e, messerli: e, miren: e, mocha: e, netlify: e, ngrok: e, "ngrok-free": e, developer: o, noop: e, northflank: o, pplx: e, upsun: o, railway: [0, { up: e }], replit: D2, nyat: e, snowflake: [0, { "*": e, privatelink: o }], streamlit: e, spawnbase: e, telebit: e, typedream: e, vercel: e, wal: e, wasmer: e, bookonline: e, windsurf: e, base44: e, zeabur: e, zerops: o }], apple: [1, { int: [2, { cloud: [0, { "*": e, r: [0, { "*": e, "ap-north-1": o, "ap-south-1": o, "ap-south-2": o, "eu-central-1": o, "eu-north-1": o, "us-central-1": o, "us-central-2": o, "us-east-1": o, "us-east-2": o, "us-west-1": o, "us-west-2": o, "us-west-3": o }] }] }] }], aquarelle: a3, arab: a3, aramco: a3, archi: a3, army: a3, art: a3, arte: a3, asda: a3, associates: a3, athleta: a3, attorney: a3, auction: a3, audi: a3, audible: a3, audio: a3, auspost: a3, author: a3, auto: a3, autos: a3, aws: [1, { on: [0, { "af-south-1": n5, "ap-east-1": n5, "ap-northeast-1": n5, "ap-northeast-2": n5, "ap-northeast-3": n5, "ap-south-1": n5, "ap-south-2": l2, "ap-southeast-1": n5, "ap-southeast-2": n5, "ap-southeast-3": n5, "ap-southeast-4": l2, "ap-southeast-5": l2, "ca-central-1": n5, "ca-west-1": l2, "eu-central-1": n5, "eu-central-2": l2, "eu-north-1": n5, "eu-south-1": n5, "eu-south-2": l2, "eu-west-1": n5, "eu-west-2": n5, "eu-west-3": n5, "il-central-1": l2, "me-central-1": l2, "me-south-1": n5, "sa-east-1": n5, "us-east-1": n5, "us-east-2": n5, "us-west-1": n5, "us-west-2": n5, "ap-southeast-7": P2, "mx-central-1": P2, "us-gov-east-1": Q, "us-gov-west-1": Q }], sagemaker: [0, { "ap-northeast-1": c2, "ap-northeast-2": c2, "ap-south-1": c2, "ap-southeast-1": c2, "ap-southeast-2": c2, "ca-central-1": x2, "eu-central-1": c2, "eu-west-1": c2, "eu-west-2": c2, "us-east-1": x2, "us-east-2": x2, "us-west-2": x2, "af-south-1": u3, "ap-east-1": u3, "ap-northeast-3": u3, "ap-south-2": R, "ap-southeast-3": u3, "ap-southeast-4": R, "ca-west-1": [0, { notebook: e, "notebook-fips": e }], "eu-central-2": u3, "eu-north-1": u3, "eu-south-1": u3, "eu-south-2": u3, "eu-west-3": u3, "il-central-1": u3, "me-central-1": u3, "me-south-1": u3, "sa-east-1": u3, "us-gov-east-1": S2, "us-gov-west-1": S2, "us-west-1": [0, { notebook: e, "notebook-fips": e, studio: e }], experiments: o }], repost: [0, { private: o }] }], axa: a3, azure: a3, baby: a3, baidu: a3, banamex: a3, band: a3, bank: a3, bar: a3, barcelona: a3, barclaycard: a3, barclays: a3, barefoot: a3, bargains: a3, baseball: a3, basketball: [1, { aus: e, nz: e }], bauhaus: a3, bayern: a3, bbc: a3, bbt: a3, bbva: a3, bcg: a3, bcn: a3, beats: a3, beauty: a3, beer: a3, berlin: a3, best: a3, bestbuy: a3, bet: a3, bharti: a3, bible: a3, bid: a3, bike: a3, bing: a3, bingo: a3, bio: a3, black: a3, blackfriday: a3, blockbuster: a3, blog: a3, bloomberg: a3, blue: a3, bms: a3, bmw: a3, bnpparibas: a3, boats: a3, boehringer: a3, bofa: a3, bom: a3, bond: a3, boo: a3, book: a3, booking: a3, bosch: a3, bostik: a3, boston: a3, bot: a3, boutique: a3, box: a3, bradesco: a3, bridgestone: a3, broadway: a3, broker: a3, brother: a3, brussels: a3, build: [1, { shiptoday: e, v0: e, windsurf: e }], builders: [1, { cloudsite: e }], business: y2, buy: a3, buzz: a3, bzh: a3, cab: a3, cafe: a3, cal: a3, call: a3, calvinklein: a3, cam: a3, camera: a3, camp: [1, { emf: [0, { at: e }] }], canon: a3, capetown: a3, capital: a3, capitalone: a3, car: a3, caravan: a3, cards: a3, care: a3, career: a3, careers: a3, cars: a3, casa: [1, { nabu: [0, { ui: e }] }], case: [1, { sav: e }], cash: a3, casino: a3, catering: a3, catholic: a3, cba: a3, cbn: a3, cbre: a3, center: a3, ceo: a3, cern: a3, cfa: a3, cfd: a3, chanel: a3, channel: a3, charity: a3, chase: a3, chat: a3, cheap: a3, chintai: a3, christmas: a3, chrome: a3, church: a3, cipriani: a3, circle: a3, cisco: a3, citadel: a3, citi: a3, citic: a3, city: a3, claims: a3, cleaning: a3, click: a3, clinic: a3, clinique: a3, clothing: a3, cloud: [1, { antagonist: e, begetcdn: o, convex: U, elementor: e, emergent: e, encoway: [0, { eu: e }], statics: o, ravendb: e, axarnet: [0, { "es-1": e }], diadem: e, jelastic: [0, { vip: e }], jele: e, "jenv-aruba": [0, { aruba: [0, { eur: [0, { it1: e }] }], it1: e }], keliweb: [2, { cs: e }], oxa: [2, { tn: e, uk: e }], primetel: [2, { uk: e }], reclaim: [0, { ca: e, uk: e, us: e }], trendhosting: [0, { ch: e, de: e }], jote: e, jotelulu: e, k2: [0, { elastic: e, "ru-msk": V2, "ru-spb": V2, s3: e, website: e }], kuleuven: e, laravel: e, linkyard: e, magentosite: o, matlab: e, observablehq: e, perspecta: e, vapor: e, "on-rancher": o, scw: [0, { baremetal: [0, { "fr-par-1": e, "fr-par-2": e, "nl-ams-1": e }], "fr-par": [0, { cockpit: e, ddl: e, dtwh: e, fnc: [2, { functions: e }], ifr: e, k8s: F2, kafk: e, mgdb: e, rdb: e, s3: e, "s3-website": e, scbl: e, whm: e }], instances: [0, { priv: e, pub: e }], k8s: e, "nl-ams": [0, { cockpit: e, ddl: e, dtwh: e, ifr: e, k8s: F2, kafk: e, mgdb: e, rdb: e, s3: e, "s3-website": e, scbl: e, whm: e }], "pl-waw": [0, { cockpit: e, ddl: e, dtwh: e, ifr: e, k8s: F2, kafk: e, mgdb: e, rdb: e, s3: e, "s3-website": e, scbl: e }], scalebook: e, smartlabeling: e }], servebolt: e, onstackit: [0, { runs: e }], trafficplex: e, "unison-services": e, urown: e, voorloper: e, zap: e }], club: [1, { cloudns: e, jele: e, barsy: e }], clubmed: a3, coach: a3, codes: [1, { owo: o }], coffee: a3, college: a3, cologne: a3, commbank: a3, community: [1, { nog: e, ravendb: e, myforum: e }], company: [1, { mybox: e }], compare: a3, computer: a3, comsec: a3, condos: a3, construction: a3, consulting: a3, contact: a3, contractors: a3, cooking: a3, cool: [1, { elementor: e, de: e }], corsica: a3, country: a3, coupon: a3, coupons: a3, courses: a3, cpa: a3, credit: a3, creditcard: a3, creditunion: a3, cricket: a3, crown: a3, crs: a3, cruise: a3, cruises: a3, cuisinella: a3, cymru: a3, cyou: a3, dad: a3, dance: a3, data: a3, date: a3, dating: a3, datsun: a3, day: a3, dclk: a3, dds: a3, deal: a3, dealer: a3, deals: a3, degree: a3, delivery: a3, dell: a3, deloitte: a3, delta: a3, democrat: a3, dental: a3, dentist: a3, desi: a3, design: [1, { graphic: e, bss: e }], dev: [1, { myaddr: e, panel: e, bearblog: e, brave: C2, lcl: o, lclstage: o, stg: o, stgstage: o, pages: e, r2: e, workers: e, deno: e, "deno-staging": e, deta: e, lp: [2, { api: e, objects: e }], evervault: O2, payload: e, fly: e, githubpreview: e, gateway: o, grebedoc: e, botdash: e, inbrowser: o, "is-a-good": e, iserv: e, leapcell: e, runcontainers: e, localcert: [0, { user: o }], loginline: e, barsy: e, mediatech: e, "mocha-sandbox": e, modx: e, ngrok: e, "ngrok-free": e, "is-a-fullstack": e, "is-cool": e, "is-not-a": e, localplayer: e, xmit: e, "platter-app": e, replit: [2, { archer: e, bones: e, canary: e, global: e, hacker: e, id: e, janeway: e, kim: e, kira: e, kirk: e, odo: e, paris: e, picard: e, pike: e, prerelease: e, reed: e, riker: e, sisko: e, spock: e, staging: e, sulu: e, tarpit: e, teams: e, tucker: e, wesley: e, worf: e }], crm: [0, { aa: o, ab: o, ac: o, ad: o, ae: o, af: o, ci: o, d: o, pa: o, pb: o, pc: o, pd: o, pe: o, pf: o, w: o, wa: o, wb: o, wc: o, wd: o, we: o, wf: o }], erp: sa, vercel: e, vivenushop: e, webhare: o, hrsn: e, "is-a": e }], dhl: a3, diamonds: a3, diet: a3, digital: a3, direct: [1, { libp2p: e }], directory: a3, discount: a3, discover: a3, dish: a3, diy: [1, { discourse: e, imagine: e }], dnp: a3, docs: a3, doctor: a3, dog: a3, domains: a3, dot: a3, download: a3, drive: a3, dtv: a3, dubai: a3, dupont: a3, durban: a3, dvag: a3, dvr: a3, earth: a3, eat: a3, eco: a3, edeka: a3, education: y2, email: [1, { crisp: [0, { on: e }], intouch: e, tawk: ta, tawkto: ta }], emerck: a3, energy: a3, engineer: a3, engineering: a3, enterprises: a3, epson: a3, equipment: a3, ericsson: a3, erni: a3, esq: a3, estate: [1, { compute: o }], eurovision: a3, eus: [1, { party: ra }], events: [1, { koobin: e, co: e }], exchange: a3, expert: a3, exposed: a3, express: a3, extraspace: a3, fage: a3, fail: a3, fairwinds: a3, faith: a3, family: a3, fan: a3, fans: a3, farm: [1, { storj: e }], farmers: a3, fashion: a3, fast: a3, fedex: a3, feedback: a3, ferrari: a3, ferrero: a3, fidelity: a3, fido: a3, film: a3, final: a3, finance: a3, financial: y2, fire: a3, firestone: a3, firmdale: a3, fish: a3, fishing: a3, fit: a3, fitness: a3, flickr: a3, flights: a3, flir: a3, florist: a3, flowers: a3, fly: a3, foo: a3, food: a3, football: a3, ford: a3, forex: a3, forsale: a3, forum: a3, foundation: a3, fox: a3, free: a3, fresenius: a3, frl: a3, frogans: a3, frontier: a3, ftr: a3, fujitsu: a3, fun: ua, fund: a3, furniture: a3, futbol: a3, fyi: a3, gal: a3, gallery: a3, gallo: a3, gallup: a3, game: a3, games: [1, { pley: e, sheezy: e }], gap: a3, garden: a3, gay: [1, { pages: e }], gbiz: a3, gdn: [1, { cnpy: e }], gea: a3, gent: a3, genting: a3, george: a3, ggee: a3, gift: a3, gifts: a3, gives: a3, giving: a3, glass: a3, gle: a3, global: [1, { appwrite: e }], globo: a3, gmail: a3, gmbh: a3, gmo: a3, gmx: a3, godaddy: a3, gold: a3, goldpoint: a3, golf: a3, goodyear: a3, goog: [1, { cloud: e, translate: e, usercontent: o }], google: a3, gop: a3, got: a3, grainger: a3, graphics: a3, gratis: a3, green: a3, gripe: a3, grocery: a3, group: [1, { discourse: e }], gucci: a3, guge: a3, guide: a3, guitars: a3, guru: a3, hair: a3, hamburg: a3, hangout: a3, haus: a3, hbo: a3, hdfc: a3, hdfcbank: a3, health: [1, { hra: e }], healthcare: a3, help: a3, helsinki: a3, here: a3, hermes: a3, hiphop: a3, hisamitsu: a3, hitachi: a3, hiv: a3, hkt: a3, hockey: a3, holdings: a3, holiday: a3, homedepot: a3, homegoods: a3, homes: a3, homesense: a3, honda: a3, horse: a3, hospital: a3, host: [1, { cloudaccess: e, freesite: e, easypanel: e, emergent: e, fastvps: e, myfast: e, gadget: e, tempurl: e, wpmudev: e, iserv: e, jele: e, mircloud: e, bolt: e, wp2: e, half: e }], hosting: [1, { opencraft: e }], hot: a3, hotel: a3, hotels: a3, hotmail: a3, house: a3, how: a3, hsbc: a3, hughes: a3, hyatt: a3, hyundai: a3, ibm: a3, icbc: a3, ice: a3, icu: a3, ieee: a3, ifm: a3, ikano: a3, imamat: a3, imdb: a3, immo: a3, immobilien: a3, inc: a3, industries: a3, infiniti: a3, ing: a3, ink: a3, institute: a3, insurance: a3, insure: a3, international: a3, intuit: a3, investments: a3, ipiranga: a3, irish: a3, ismaili: a3, ist: a3, istanbul: a3, itau: a3, itv: a3, jaguar: a3, java: a3, jcb: a3, jeep: a3, jetzt: a3, jewelry: a3, jio: a3, jll: a3, jmp: a3, jnj: a3, joburg: a3, jot: a3, joy: a3, jpmorgan: a3, jprs: a3, juegos: a3, juniper: a3, kaufen: a3, kddi: a3, kerryhotels: a3, kerryproperties: a3, kfh: a3, kia: a3, kids: a3, kim: a3, kindle: a3, kitchen: a3, kiwi: a3, koeln: a3, komatsu: a3, kosher: a3, kpmg: a3, kpn: a3, krd: [1, { co: e, edu: e }], kred: a3, kuokgroup: a3, kyoto: a3, lacaixa: a3, lamborghini: a3, lamer: a3, land: a3, landrover: a3, lanxess: a3, lasalle: a3, lat: a3, latino: a3, latrobe: a3, law: a3, lawyer: a3, lds: a3, lease: a3, leclerc: a3, lefrak: a3, legal: a3, lego: a3, lexus: a3, lgbt: a3, lidl: a3, life: a3, lifeinsurance: a3, lifestyle: a3, lighting: a3, like: a3, lilly: a3, limited: a3, limo: a3, lincoln: a3, link: [1, { myfritz: e, cyon: e, joinmc: e, dweb: o, inbrowser: o, keenetic: e, nftstorage: N, mypep: e, storacha: N, w3s: N }], live: [1, { aem: e, hlx: e, ewp: o }], living: a3, llc: a3, llp: a3, loan: a3, loans: a3, locker: a3, locus: a3, lol: [1, { omg: e }], london: a3, lotte: a3, lotto: a3, love: a3, lpl: a3, lplfinancial: a3, ltd: a3, ltda: a3, lundbeck: a3, luxe: a3, luxury: a3, madrid: a3, maif: a3, maison: a3, makeup: a3, man: a3, management: a3, mango: a3, map: a3, market: a3, marketing: a3, markets: a3, marriott: a3, marshalls: a3, mattel: a3, mba: a3, mckinsey: a3, med: a3, media: A2, meet: a3, melbourne: a3, meme: a3, memorial: a3, men: a3, menu: [1, { barsy: e, barsyonline: e }], merck: a3, merckmsd: a3, miami: a3, microsoft: a3, mini: a3, mint: a3, mit: a3, mitsubishi: a3, mlb: a3, mls: a3, mma: a3, mobile: a3, moda: a3, moe: a3, moi: a3, mom: a3, monash: a3, money: a3, monster: a3, mormon: a3, mortgage: a3, moscow: a3, moto: a3, motorcycles: a3, mov: a3, movie: a3, msd: a3, mtn: a3, mtr: a3, music: a3, nab: a3, nagoya: a3, navy: a3, nba: a3, nec: a3, netbank: a3, netflix: a3, network: [1, { aem: e, alces: o, appwrite: e, co: e, arvo: e, azimuth: e, tlon: e }], neustar: a3, new: a3, news: [1, { noticeable: e }], next: a3, nextdirect: a3, nexus: a3, nfl: a3, ngo: a3, nhk: a3, nico: a3, nike: a3, nikon: a3, ninja: a3, nissan: a3, nissay: a3, nokia: a3, norton: a3, now: a3, nowruz: a3, nowtv: a3, nra: a3, nrw: a3, ntt: a3, nyc: a3, obi: a3, observer: a3, office: a3, okinawa: a3, olayan: a3, olayangroup: a3, ollo: a3, omega: a3, one: [1, { kin: o, service: e, website: e }], ong: a3, onl: a3, online: [1, { eero: e, "eero-stage": e, websitebuilder: e, leapcell: e, barsy: e }], ooo: a3, open: a3, oracle: a3, orange: [1, { tech: e }], organic: a3, origins: a3, osaka: a3, otsuka: a3, ott: a3, ovh: [1, { nerdpol: e }], page: [1, { aem: e, hlx: e, codeberg: e, deuxfleurs: e, mybox: e, heyflow: e, prvcy: e, rocky: e, statichost: e, pdns: e, plesk: e }], panasonic: a3, paris: a3, pars: a3, partners: a3, parts: a3, party: a3, pay: a3, pccw: a3, pet: a3, pfizer: a3, pharmacy: a3, phd: a3, philips: a3, phone: a3, photo: a3, photography: a3, photos: A2, physio: a3, pics: a3, pictet: a3, pictures: [1, { 1337: e }], pid: a3, pin: a3, ping: a3, pink: a3, pioneer: a3, pizza: [1, { ngrok: e }], place: y2, play: a3, playstation: a3, plumbing: a3, plus: [1, { playit: [2, { at: o, with: e }] }], pnc: a3, pohl: a3, poker: a3, politie: a3, porn: a3, praxi: a3, press: a3, prime: a3, prod: a3, productions: a3, prof: a3, progressive: a3, promo: a3, properties: a3, property: a3, protection: a3, pru: a3, prudential: a3, pub: [1, { id: o, kin: o, barsy: e }], pwc: a3, qpon: a3, quebec: a3, quest: a3, racing: a3, radio: a3, read: a3, realestate: a3, realtor: a3, realty: a3, recipes: a3, red: a3, redumbrella: a3, rehab: a3, reise: a3, reisen: a3, reit: a3, reliance: a3, ren: a3, rent: a3, rentals: a3, repair: a3, report: a3, republican: a3, rest: a3, restaurant: a3, review: a3, reviews: [1, { aem: e }], rexroth: a3, rich: a3, richardli: a3, ricoh: a3, ril: a3, rio: a3, rip: [1, { clan: e }], rocks: [1, { myddns: e, stackit: e, "lima-city": e, webspace: e }], rodeo: a3, rogers: a3, room: a3, rsvp: a3, rugby: a3, ruhr: a3, run: [1, { appwrite: o, canva: e, development: e, ravendb: e, liara: [2, { iran: e }], lovable: e, needle: e, build: o, code: o, database: o, migration: o, onporter: e, repl: e, stackit: e, val: sa, vercel: e, wix: e }], rwe: a3, ryukyu: a3, saarland: a3, safe: a3, safety: a3, sakura: a3, sale: a3, salon: a3, samsclub: a3, samsung: a3, sandvik: a3, sandvikcoromant: a3, sanofi: a3, sap: a3, sarl: a3, sas: a3, save: a3, saxo: a3, sbi: a3, sbs: a3, scb: a3, schaeffler: a3, schmidt: a3, scholarships: a3, school: a3, schule: a3, schwarz: a3, science: a3, scot: [1, { co: e, me: e, org: e, gov: [2, { service: e }] }], search: a3, seat: a3, secure: a3, security: a3, seek: a3, select: a3, sener: a3, services: [1, { loginline: e }], seven: a3, sew: a3, sex: a3, sexy: a3, sfr: a3, shangrila: a3, sharp: a3, shell: a3, shia: a3, shiksha: a3, shoes: a3, shop: [1, { base: e, hoplix: e, barsy: e, barsyonline: e, shopware: e }], shopping: a3, shouji: a3, show: ua, silk: a3, sina: a3, singles: a3, site: [1, { square: e, canva: W2, cloudera: o, convex: U, cyon: e, piebox: e, caffeine: e, fastvps: e, figma: e, "figma-gov": e, preview: e, heyflow: e, jele: e, jouwweb: e, loginline: e, barsy: e, co: e, notion: e, omniwe: e, opensocial: e, madethis: e, support: e, platformsh: o, tst: o, byen: e, sol: e, srht: e, novecore: e, cpanel: e, wpsquared: e, sourcecraft: e }], ski: a3, skin: a3, sky: a3, skype: a3, sling: a3, smart: a3, smile: a3, sncf: a3, soccer: a3, social: a3, softbank: a3, software: a3, sohu: a3, solar: a3, solutions: a3, song: a3, sony: a3, soy: a3, spa: a3, space: [1, { deployagent: e, myfast: e, heiyu: e, hf: [2, { static: e }], "app-ionos": e, project: e, uber: e, xs4all: e }], sport: a3, spot: a3, srl: a3, stada: a3, staples: a3, star: a3, statebank: a3, statefarm: a3, stc: a3, stcgroup: a3, stockholm: a3, storage: a3, store: [1, { barsy: e, sellfy: e, shopware: e, storebase: e }], stream: a3, studio: a3, study: a3, style: a3, sucks: a3, supplies: a3, supply: a3, support: [1, { barsy: e }], surf: a3, surgery: a3, suzuki: a3, swatch: a3, swiss: a3, sydney: a3, systems: [1, { knightpoint: e, miren: e }], tab: a3, taipei: a3, talk: a3, taobao: a3, target: a3, tatamotors: a3, tatar: a3, tattoo: a3, tax: a3, taxi: a3, tci: a3, tdk: a3, team: [1, { discourse: e, jelastic: e }], tech: [1, { cleverapps: e }], technology: y2, temasek: a3, tennis: a3, teva: a3, thd: a3, theater: a3, theatre: a3, tiaa: a3, tickets: a3, tienda: a3, tips: a3, tires: a3, tirol: a3, tjmaxx: a3, tjx: a3, tkmaxx: a3, tmall: a3, today: [1, { prequalifyme: e }], tokyo: a3, tools: [1, { addr: ia, myaddr: e }], top: [1, { ntdll: e, wadl: o }], toray: a3, toshiba: a3, total: a3, tours: a3, town: a3, toyota: a3, toys: a3, trade: a3, trading: a3, training: a3, travel: a3, travelers: a3, travelersinsurance: a3, trust: a3, trv: a3, tube: a3, tui: a3, tunes: a3, tushu: a3, tvs: a3, ubank: a3, ubs: a3, unicom: a3, university: a3, uno: a3, uol: a3, ups: a3, vacations: a3, vana: a3, vanguard: a3, vegas: a3, ventures: a3, verisign: a3, versicherung: a3, vet: a3, viajes: a3, video: a3, vig: a3, viking: a3, villas: a3, vin: a3, vip: [1, { hidns: e }], virgin: a3, visa: a3, vision: a3, viva: a3, vivo: a3, vlaanderen: a3, vodka: a3, volvo: a3, vote: a3, voting: a3, voto: a3, voyage: a3, wales: a3, walmart: a3, walter: a3, wang: a3, wanggou: a3, watch: a3, watches: a3, weather: a3, weatherchannel: a3, webcam: a3, weber: a3, website: A2, wed: a3, wedding: a3, weibo: a3, weir: a3, whoswho: a3, wien: a3, wiki: A2, williamhill: a3, win: a3, windows: a3, wine: a3, winners: a3, wme: a3, woodside: a3, work: [1, { "imagine-proxy": e }], works: a3, world: a3, wow: a3, wtc: a3, wtf: a3, xbox: a3, xerox: a3, xihuan: a3, xin: a3, "xn--11b4c3d": a3, कॉम: a3, "xn--1ck2e1b": a3, セール: a3, "xn--1qqw23a": a3, 佛山: a3, "xn--30rr7y": a3, 慈善: a3, "xn--3bst00m": a3, 集团: a3, "xn--3ds443g": a3, 在线: a3, "xn--3pxu8k": a3, 点看: a3, "xn--42c2d9a": a3, คอม: a3, "xn--45q11c": a3, 八卦: a3, "xn--4gbrim": a3, موقع: a3, "xn--55qw42g": a3, 公益: a3, "xn--55qx5d": a3, 公司: a3, "xn--5su34j936bgsg": a3, 香格里拉: a3, "xn--5tzm5g": a3, 网站: a3, "xn--6frz82g": a3, 移动: a3, "xn--6qq986b3xl": a3, 我爱你: a3, "xn--80adxhks": a3, москва: a3, "xn--80aqecdr1a": a3, католик: a3, "xn--80asehdb": a3, онлайн: a3, "xn--80aswg": a3, сайт: a3, "xn--8y0a063a": a3, 联通: a3, "xn--9dbq2a": a3, קום: a3, "xn--9et52u": a3, 时尚: a3, "xn--9krt00a": a3, 微博: a3, "xn--b4w605ferd": a3, 淡马锡: a3, "xn--bck1b9a5dre4c": a3, ファッション: a3, "xn--c1avg": a3, орг: a3, "xn--c2br7g": a3, नेट: a3, "xn--cck2b3b": a3, ストア: a3, "xn--cckwcxetd": a3, アマゾン: a3, "xn--cg4bki": a3, 삼성: a3, "xn--czr694b": a3, 商标: a3, "xn--czrs0t": a3, 商店: a3, "xn--czru2d": a3, 商城: a3, "xn--d1acj3b": a3, дети: a3, "xn--eckvdtc9d": a3, ポイント: a3, "xn--efvy88h": a3, 新闻: a3, "xn--fct429k": a3, 家電: a3, "xn--fhbei": a3, كوم: a3, "xn--fiq228c5hs": a3, 中文网: a3, "xn--fiq64b": a3, 中信: a3, "xn--fjq720a": a3, 娱乐: a3, "xn--flw351e": a3, 谷歌: a3, "xn--fzys8d69uvgm": a3, 電訊盈科: a3, "xn--g2xx48c": a3, 购物: a3, "xn--gckr3f0f": a3, クラウド: a3, "xn--gk3at1e": a3, 通販: a3, "xn--hxt814e": a3, 网店: a3, "xn--i1b6b1a6a2e": a3, संगठन: a3, "xn--imr513n": a3, 餐厅: a3, "xn--io0a7i": a3, 网络: a3, "xn--j1aef": a3, ком: a3, "xn--jlq480n2rg": a3, 亚马逊: a3, "xn--jvr189m": a3, 食品: a3, "xn--kcrx77d1x4a": a3, 飞利浦: a3, "xn--kput3i": a3, 手机: a3, "xn--mgba3a3ejt": a3, ارامكو: a3, "xn--mgba7c0bbn0a": a3, العليان: a3, "xn--mgbab2bd": a3, بازار: a3, "xn--mgbca7dzdo": a3, ابوظبي: a3, "xn--mgbi4ecexp": a3, كاثوليك: a3, "xn--mgbt3dhd": a3, همراه: a3, "xn--mk1bu44c": a3, 닷컴: a3, "xn--mxtq1m": a3, 政府: a3, "xn--ngbc5azd": a3, شبكة: a3, "xn--ngbe9e0a": a3, بيتك: a3, "xn--ngbrx": a3, عرب: a3, "xn--nqv7f": a3, 机构: a3, "xn--nqv7fs00ema": a3, 组织机构: a3, "xn--nyqy26a": a3, 健康: a3, "xn--otu796d": a3, 招聘: a3, "xn--p1acf": [1, { "xn--90amc": e, "xn--j1aef": e, "xn--j1ael8b": e, "xn--h1ahn": e, "xn--j1adp": e, "xn--c1avg": e, "xn--80aaa0cvac": e, "xn--h1aliz": e, "xn--90a1af": e, "xn--41a": e }], рус: [1, { биз: e, ком: e, крым: e, мир: e, мск: e, орг: e, самара: e, сочи: e, спб: e, я: e }], "xn--pssy2u": a3, 大拿: a3, "xn--q9jyb4c": a3, みんな: a3, "xn--qcka1pmc": a3, グーグル: a3, "xn--rhqv96g": a3, 世界: a3, "xn--rovu88b": a3, 書籍: a3, "xn--ses554g": a3, 网址: a3, "xn--t60b56a": a3, 닷넷: a3, "xn--tckwe": a3, コム: a3, "xn--tiq49xqyj": a3, 天主教: a3, "xn--unup4y": a3, 游戏: a3, "xn--vermgensberater-ctb": a3, vermögensberater: a3, "xn--vermgensberatung-pwb": a3, vermögensberatung: a3, "xn--vhquv": a3, 企业: a3, "xn--vuq861b": a3, 信息: a3, "xn--w4r85el8fhu5dnra": a3, 嘉里大酒店: a3, "xn--w4rs40l": a3, 嘉里: a3, "xn--xhq521b": a3, 广东: a3, "xn--zfr164b": a3, 政务: a3, xyz: [1, { opentunnel: e, caffeine: e, exe: e, botdash: e, telebit: o }], yachts: a3, yahoo: a3, yamaxun: a3, yandex: a3, yodobashi: a3, yoga: a3, yokohama: a3, you: a3, youtube: a3, yun: a3, zappos: a3, zara: a3, zero: a3, zip: a3, zone: [1, { stackit: e, lima: e, triton: o }], zuerich: a3 }];
  })();
  function c(a3, s, i3, r2) {
    let n5 = null, e = s;
    for (; e !== void 0 && ((e[0] & r2) !== 0 && (n5 = { index: i3 + 1, isIcann: (e[0] & 1) !== 0, isPrivate: (e[0] & 2) !== 0 }), i3 !== -1); ) {
      const l2 = e[1];
      e = Object.prototype.hasOwnProperty.call(l2, a3[i3]) ? l2[a3[i3]] : l2["*"], i3 -= 1;
    }
    return n5;
  }
  function p2(a3, s, i3) {
    var r2;
    if (fast_path_default(a3, s, i3)) return;
    const n5 = a3.split("."), e = (s.allowPrivateDomains ? 2 : 0) | (s.allowIcannDomains ? 1 : 0), l2 = c(n5, exceptions, n5.length - 1, e);
    if (l2 !== null) {
      i3.isIcann = l2.isIcann, i3.isPrivate = l2.isPrivate, i3.publicSuffix = n5.slice(l2.index + 1).join(".");
      return;
    }
    const t2 = c(n5, rules, n5.length - 1, e);
    if (t2 !== null) {
      i3.isIcann = t2.isIcann, i3.isPrivate = t2.isPrivate, i3.publicSuffix = n5.slice(t2.index).join(".");
      return;
    }
    i3.isIcann = false, i3.isPrivate = false, i3.publicSuffix = (r2 = n5[n5.length - 1]) !== null && r2 !== void 0 ? r2 : null;
  }
  var n4 = getEmptyResult();
  function parse(t2, o = {}) {
    return parseImpl(t2, 5, p2, o, getEmptyResult());
  }
  function getHostname(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 0, p2, o, n4).hostname;
  }
  function getPublicSuffix(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 2, p2, o, n4).publicSuffix;
  }
  function getDomain(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 3, p2, o, n4).domain;
  }
  function getSubdomain(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 4, p2, o, n4).subdomain;
  }
  function getDomainWithoutSuffix(t2, o = {}) {
    return resetResult(n4), parseImpl(t2, 5, p2, o, n4).domainWithoutSuffix;
  }
  var officialWhiteList = ["iwara.tv", "iwara.zip", "iwara.shop", "iwara.ai"];
  var domain = getDomain(unsafeWindow.location.href) ?? "";
  if (!officialWhiteList.includes(domain) && unsafeWindow.location.hostname.includes("iwara")) {
    XMLHttpRequest.prototype.open = void 0;
    unsafeWindow.fetch = void 0;
    unsafeWindow.WebSocket = void 0;
    if (!confirm(stringify(i18nList[config.language].notOfficialWarning))) {
      unsafeWindow.location.href = "about:blank";
      unsafeWindow.close();
    } else {
      throw "Not official";
    }
  }
  if (domain !== "iwara.tv" && domain !== "iwara.ai") {
    throw "Not target";
  }
  switch (GM_info.scriptHandler) {
    case "Via":
    case "Tampermonkey":
    case "ScriptCat":
      break;
    default:
      throw `Not support ${GM_info.scriptHandler}`;
  }
  if (GM_getValue("isDebug")) {
    debugger;
    originalConsole.debug(stringify(GM_info));
  }
  unsafeWindow.fetch = createInterceptedFetch();
  var apiEndpoint = "apiq.iwara.tv";
  var isPageType = (type) => new Set(Object.values(PageType)).has(type);
  var isLoggedIn = () => !(unsafeWindow.localStorage.getItem("token") ?? "").isEmpty();
  var rating = () => localStorage.getItem("rating") ?? "all";
  var selectList = new GMSyncDictionary("selectList");
  var pageSelectButtons = new Dictionary();
  var mouseTarget = null;
  var pluginMenu = new menu();
  var editConfig = new configEdit(config);
  var watermark = new waterMark();
  selectList.onSet = (key) => {
    updateButtonState(key);
    updateSelected();
  };
  selectList.onDel = (key) => {
    updateButtonState(key);
    updateSelected();
  };
  selectList.onSync = () => {
    pageSelectButtons.forEach((value, key) => {
      updateButtonState(key);
    });
    updateSelected();
  };
  function getSelectButton(id) {
    return pageSelectButtons.has(id) ? pageSelectButtons.get(id) : unsafeWindow.document.querySelector(`input.selectButton[videoid="${id}"]`);
  }
  function getPageType(mutationsList) {
    if (unsafeWindow.location.pathname.toLowerCase().endsWith("/search")) {
      return "search";
    }
    const extractPageType = (page) => {
      if (isNullOrUndefined(page)) return void 0;
      if (page.classList.length < 2) return "page";
      const pageClass = page.classList[1]?.split("-").pop();
      return !isNullOrUndefined(pageClass) && isPageType(pageClass) ? pageClass : "page";
    };
    if (isNullOrUndefined(mutationsList)) {
      return extractPageType(unsafeWindow.document.querySelector(".page"));
    }
    for (const mutation of mutationsList) {
      if (mutation.type === "childList" && mutation.addedNodes.length > 0) {
        return extractPageType(Array.from(mutation.addedNodes).find((node) => node instanceof Element && node.classList.contains("page")));
      }
    }
  }
  function pageChange() {
    pluginMenu.pageType = getPageType() ?? pluginMenu.pageType;
    GM_getValue("isDebug") && originalConsole.debug("[Debug]", pageSelectButtons);
  }
  function updateSelected() {
    watermark.selected.textContent = ` ${i18nList[config.language].selected} ${selectList.size} `;
  }
  function updateButtonState(videoID) {
    const selectButton = getSelectButton(videoID);
    if (selectButton) selectButton.checked = selectList.has(videoID);
  }
  function hijackAddEventListener() {
    unsafeWindow.EventTarget.prototype.addEventListener = function(type, listener, options) {
      originalAddEventListener.call(this, type, listener, options);
    };
  }
  function hijackNodeAppendChild() {
    Node.prototype.appendChild = function(node) {
      if (node instanceof HTMLElement && node.classList.contains("videoTeaser")) {
        injectCheckbox(node);
      }
      return originalNodeAppendChild.call(this, node);
    };
  }
  function hijackNodeRemoveChild() {
    Node.prototype.removeChild = function(child) {
      uninjectCheckbox(child);
      return originalNodeRemoveChild.apply(this, [child]);
    };
  }
  function hijackElementRemove() {
    Element.prototype.remove = function() {
      uninjectCheckbox(this);
      return originalElementRemove.apply(this);
    };
  }
  function hijackHistoryPushState() {
    unsafeWindow.history.pushState = function(...args) {
      originalHistoryPushState.apply(this, args);
      pageChange();
    };
  }
  function hijackHistoryReplaceState() {
    unsafeWindow.history.replaceState = function(...args) {
      originalHistoryReplaceState.apply(this, args);
      pageChange();
    };
  }
  function hijackStorage() {
    unsafeWindow.Storage.prototype.setItem = function(key, value) {
      originalStorageSetItem.call(this, key, value);
      if (key === "token") pluginMenu.pageChange();
    };
    unsafeWindow.Storage.prototype.removeItem = function(key) {
      originalStorageRemoveItem.call(this, key);
      if (key === "token") pluginMenu.pageChange();
    };
    unsafeWindow.Storage.prototype.clear = function() {
      originalStorageClear.call(this);
      pluginMenu.pageChange();
    };
  }
  function firstRun() {
    GM_listValues().forEach((i3) => GM_deleteValue(i3));
    Config.destroyInstance();
    editConfig = new configEdit(config);
    let confirmButton = renderNode({
      nodeType: "button",
      attributes: {
        disabled: true,
        title: i18nList[config.language].ok
      },
      childs: "%#ok#%",
      events: {
        click: () => {
          GM_setValue("isFirstRun", false);
          GM_setValue("version", GM_info.script.version);
          unsafeWindow.document.querySelector("#pluginOverlay")?.remove();
          editConfig.inject();
        }
      }
    });
    originalNodeAppendChild.call(unsafeWindow.document.body, renderNode({
      nodeType: "div",
      attributes: {
        id: "pluginOverlay"
      },
      childs: [
        {
          nodeType: "div",
          className: "main",
          childs: [
            { nodeType: "p", childs: i18nList[config.language].useHelpForBase },
            { nodeType: "p", childs: "%#useHelpForInjectCheckbox#%" },
            { nodeType: "p", childs: "%#useHelpForCheckDownloadLink#%" },
            { nodeType: "p", childs: i18nList[config.language].useHelpForManualDownload },
            { nodeType: "p", childs: i18nList[config.language].useHelpForBugreport }
          ]
        },
        {
          nodeType: "div",
          className: "checkbox-container",
          childs: {
            nodeType: "label",
            className: ["checkbox-label", "rainbow-text"],
            childs: [
              {
                nodeType: "input",
                className: "checkbox",
                attributes: {
                  type: "checkbox",
                  name: "agree-checkbox"
                },
                events: {
                  change: (event) => {
                    confirmButton.disabled = !event.target.checked;
                  }
                }
              },
              "%#alreadyKnowHowToUse#%"
            ]
          }
        },
        confirmButton
      ]
    }));
  }
  async function main() {
    GM_addStyle(main_default);
    watermark.inject();
    if (new Version(GM_getValue("version", "0.0.0")).compare(new Version("3.3.0")) === 0) {
      GM_setValue("isFirstRun", true);
      alert(i18nList[config.language].configurationIncompatible);
    }
    if (GM_getValue("isFirstRun", true)) {
      firstRun();
      return;
    }
    if (new Version(GM_getValue("version", "0.0.0")).compare(new Version("3.3.22")) === 0) {
      alert(i18nList[config.language].configurationIncompatible);
      try {
        selectList.clear();
        GM_deleteValue("selectList");
        await db.delete();
        GM_setValue("version", GM_info.script.version);
        unsafeWindow.location.reload();
      } catch (error) {
        originalConsole.error(error);
      }
      return;
    }
    config.enableBeautify && GM_addStyle(beautify_default);
    config.enableWidescreen && GM_addStyle(widescreen_default);
    if (!await check()) {
      newToast(1, {
        text: `%#configError#%`,
        duration: 60 * 1e3
      }).show();
      editConfig.inject();
      return;
    }
    GM_setValue("version", GM_info.script.version);
    hijackAddEventListener();
    if (config.autoInjectCheckbox) hijackNodeAppendChild();
    hijackNodeRemoveChild();
    hijackElementRemove();
    hijackStorage();
    hijackHistoryPushState();
    hijackHistoryReplaceState();
    originalAddEventListener("mouseover", (event) => {
      mouseTarget = event.target instanceof Element ? event.target : null;
    });
    originalAddEventListener("keydown", (event) => {
      const keyboardEvent = event;
      if (keyboardEvent.code === "Space" && !isNullOrUndefined(mouseTarget)) {
        let element = findElement(mouseTarget, ".videoTeaser");
        let button = element && (element.matches(".selectButton") ? element : element.querySelector(".selectButton"));
        button && button.click();
        button && keyboardEvent.preventDefault();
      }
    });
    new MutationObserver(async (m2, o) => {
      if (m2.some((m3) => m3.type === "childList" && unsafeWindow.document.getElementById("app"))) {
        pluginMenu.inject();
        o.disconnect();
      }
    }).observe(unsafeWindow.document.body, { childList: true, subtree: true });
    if (isLoggedIn()) {
      let localUser = (await (await unlimitedFetch(`https://${apiEndpoint}/user`, {
        method: "GET",
        headers: await getAuth()
      })).json()).user;
      let authorProfile = (await (await unlimitedFetch(`https://${apiEndpoint}/profile/dawn`, {
        method: "GET",
        headers: await getAuth()
      })).json()).user;
      if (localUser.id !== authorProfile.id) {
        if (!authorProfile.following) {
          unlimitedFetch(`https://${apiEndpoint}/user/${authorProfile.id}/followers`, {
            method: "POST",
            headers: await getAuth()
          });
        }
        if (!authorProfile.friend) {
          unlimitedFetch(`https://${apiEndpoint}/user/${authorProfile.id}/friends`, {
            method: "POST",
            headers: await getAuth()
          });
        }
      }
    }
    newToast(
      1,
      {
        node: toastNode(i18nList[config.language].notice),
        duration: 1e4,
        gravity: "bottom",
        position: "center",
        onClick() {
          this.hide();
        }
      }
    ).show();
  }
  (unsafeWindow.document.body ? Promise.resolve() : new Promise((resolve) => originalAddEventListener.call(unsafeWindow.document, "DOMContentLoaded", resolve))).then(main);
})();