GM Api Test

用于测试您的油猴脚本管理器对油猴函数的支持程度

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         GM Api Test
// @namespace    https://github.com/WhiteSevs/TamperMonkeyScript
// @version      2026.5.11
// @author       WhiteSevs
// @description  用于测试您的油猴脚本管理器对油猴函数的支持程度
// @license      GPL-3.0-only
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAACM9JREFUeF7tnUmsFUUUhj9klFmMsxiJGsUBFk4xbDAa16AG1EQUQSDRMBjBuHFrBCNDNBFkUEhUiApro9EFxKi4AAc0xmBEcUrQx6SIov2Te5+Xy323q/t2v9fd59Ty3erq+k99r7rqVNWpfuSb5gL3A2OAUcAwYAgwEDgj31eXrvQTwHHgT+AI0AUcADYBq/NS0y+Hgh+qNfqkWkPn8ApzRQqMHTUY1mepPisAxgGq2A3A8Cwr6GWdZoHDwE5A/2h7O7VPFgBsBqYAgzqtjD+fyAJ/AduA6YmeasrcCQArgZnAiE4q4M92bIFDwAZgQZqS0gBwDfA2cGGaF/ozuVlgP3AH8HmSNyQFYEbU8GuAwUle4nl7zQLHgDnAxtA3JgFgaTQ9WRxasOfrUwssA5aE1CAUgK21gV5ImZ6nGBbQAHFqXFVCAFgLzIoryH8vpAXWAbPb1SwOAI3yM3U8FNJM1a6U/AWaJbRM7QCYDLxXbduYUXcr8H4rtT0BMBbYDYw2Y6JqC/0dmBB9yvc1y+wJgO+Bi6ptE3PqfgAuDgFAHr755sxjQ/CqZo9hqx7goLt3K0uD3MYjG9U1A6CFnWmVle/CZIEtjQtIjQBoSfdLX9WrPCVaRbyqvpTcCICmfJr6eaq+BTQl1NSQRgCOAmdWX7srBP4AhjYCsDDas7fcTWPKAosiP8+Keg+wq+YoMGUB42Ll6JtYB+BvoL9xg1iT/w8wQAB492+t6f/Xu0gAbAe0hduTPQvsEABfAOPtaXfFkUNojwDQIoFv8LTJw34BoKVCHdvyZM8CXQJAZ9F8l6+9xpfiYwJA0wE/qGkTgBMC4F+b2l113RXsABhmwXsAw43vPYDxxncAHICT+wF8DGAYBAfAcOP7J8B44zsADoCPAawz4GMA4wQ4AA6ATwMtM+A9gOXWrx0McUeQYQi8BzDc+O4HMN74DoAD4I4g6wz4GMA4AQ6AA+COIMsMeA9gufXdEWS89R0AB8A/AcYZcAAcAJ8FWGbAewDLre+DQOOt7wA4AP4JMM6AA+AA+CzAMgPeA1hufR8EGm99B8AB8E+AcQZ6GwBFJVdo2q+B74BvatfU1K8819X0us7ksujG0kuAy6M7bq4GBpa0nQqvtzcAOAzsjBp1UwfX0N4d3XHzAHALcHbBYSiV3jwB6Ioun3wphyvn5wJPFTC+cSn15gGAbqV6C7g35//UF2u9wpCc3xNXfKn1Zg2AbqPSbdV746yW0e/nRWOG1/vwtrPS680KAB0wXQPMy6hhkxaj3mBO0y1oSctIkr8yerMAQFeQXVG7dyCJEbPOq8uuNbvI++q7SuntFIDuCwizbs0OysvzAszK6e0EgF8AfYOLmH4Gzs24YpXUmxaAE8A50TXzBzI2clbFjQF+zfAehMrqTQvAE9HVo0uzaq2cylkSjQeeyajsyupNA0ARv4M9tXMW44FK600KwClXj2f035VnMeNqaw2DUr5E9yldCmhMUYakMdm3QLBzLCkAcrrk7eHL2tCvRRDck7LQ1X3o20hZZeQTkbs8KCUBQL7u0UGlFi9Tmqvx9kdrGfItlDEF3wWZBIBnc1jY6S3jLgMeT/gyeTXVA5QxqQdQTxCbQgE4CgyLLa3YGY5EM5ehgVVUj3FWYN6iZvstpMcOBeBj4KaiKg2s10fAjYF5yzTy70lS0AwoFIBFEU0rAo1X1GwLoytylwdWbmY0+n85MG9Rsz0IbIirXAgAull0QFxBJfldW7T6x9RVecq6Ba1Z2vG4tgsB4DPgupI0cFw1PwWujcmkPBPiCirJ77vj2i4EgDcB7cmrQnoDuCtGiCm9IQDou/lYFVofeA7QeKZdMqU3BIBHo5W/FyoCwCPA8zFaTOkNAeB24N2KAHAb8E6MFlN6QwC4IPKH/1QRAM6P/OQ/xmgxpdcBOJ0GB6DJJqa6RMCU3pAewNSgCDClNwQAU9OimrvYzLRXAMjVe0abgZEpx0jkObOk94QA0LanwW0AkDtxYkVmAbsC3LyW9B4TAHG7ZUwtjgCW9HYJgJDtQ7M6ONtflM5Dh1bXBVbGit79AkARO8bHGMbMBomaHazo3SMAtgOTYgBQ1IsRgf89Rc12CBgeWDkrencIgNANhNY2hVrQO08AKOnAR9wuGGvbwquuV7uFBtUBCNpAWIvGYelgSJUPwpwc59QBCB0hWzsaVmW9J2c6dQD0GQgdJJVphBzas7UbG1ZRb/cgtxGAJMYqw5m5RGfkYmYHVdPbDXUjAElO0ipI0tgCxAXqqd10pm9fhkGjqqT3lM9aIwAy5ubIMTQtcK6sYEmhR60Ci8wsm46yZR0sqip6twDT65ZuBkB/P5jA6VPE72OST1lS4squV+O8kY2iWwGwMor9Mz+BZRQ8Sa7kvo4XpLhAe3IIDtVsijLrXQUsiANAv4csEDWWoyBKT/Zh3CDFA3o6w6BQcfyXUW/LeAetegCJV9j2T2L2CbQyUm+HTtXAdb2hULFp9R4DrgfqYfm7264nAJRhBvBK3L9Ci997K3iyQr/cKXdmijpm+UgZ9CrU/sZWotsBoPwKBbc4pbXyCp+uaB8PR3v3RqWsV16PFVWv7KVPZMsUB4Ae2gpM6cBqmpKp63m1gxgDOtt/X+3TVNSpZ91ERdK7DZjaru1CANDzayPHinzHnSZtQNVI/avAK2OurM0w4s70d1qvvJ7vS73a/TQ7TlgoACpHUTM04PJUfAtocS82OohkJAFA+SfXPgllDRdX/KbrrIba4KsuX7OxoJQUABWqNYAPShxDL8gwJcwk340u1dIaSHBKA0C9cHkM9Vko+17BYGMVNKPcu+ruT/Hwhda1EwDq79ACkmYJfT0fD9VclXzyP2iU372wk0ZYFgDovXUP1c05rMKl0VXlZ7Qq+WFWl3NlBUCjwTVn16dB7uSyTt+KBpCmk/KlqKvPNF5jHgA0w6AIY1qpk+dO4WYVylw7kNsdSC1aA/RGfbTApJ26OqupsLbyLGqFVZHNMm30RjH/AX1V4etVAz1zAAAAAElFTkSuQmCC
// @supportURL   https://github.com/WhiteSevs/TamperMonkeyScript/issues
// @match        *://*/*
// @require      https://fastly.jsdelivr.net/gh/WhiteSevs/TamperMonkeyScript@86be74b83fca4fa47521cded28377b35e1d7d2ac/lib/CoverUMD/index.js
// @resource     ViewerCSS  https://fastly.jsdelivr.net/npm/[email protected]/dist/viewer.min.css
// @connect      *
// @grant        GM.addElement
// @grant        GM.addStyle
// @grant        GM.addValueChangeListener
// @grant        GM.audio
// @grant        GM.cookie
// @grant        GM.deleteValue
// @grant        GM.deleteValues
// @grant        GM.download
// @grant        GM.getResourceText
// @grant        GM.getResourceUrl
// @grant        GM.getTab
// @grant        GM.getTabs
// @grant        GM.getValue
// @grant        GM.getValues
// @grant        GM.info
// @grant        GM.listValues
// @grant        GM.log
// @grant        GM.notification
// @grant        GM.openInTab
// @grant        GM.registerMenuCommand
// @grant        GM.removeValueChangeListener
// @grant        GM.saveTab
// @grant        GM.setClipboard
// @grant        GM.setValue
// @grant        GM.setValues
// @grant        GM.unregisterMenuCommand
// @grant        GM.webRequest
// @grant        GM.xmlHttpRequest
// @grant        GM_addElement
// @grant        GM_addStyle
// @grant        GM_addValueChangeListener
// @grant        GM_audio
// @grant        GM_cookie
// @grant        GM_deleteValue
// @grant        GM_deleteValues
// @grant        GM_download
// @grant        GM_getResourceText
// @grant        GM_getResourceURL
// @grant        GM_getTab
// @grant        GM_getTabs
// @grant        GM_getValue
// @grant        GM_getValues
// @grant        GM_info
// @grant        GM_listValues
// @grant        GM_log
// @grant        GM_notification
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_removeValueChangeListener
// @grant        GM_saveTab
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_setValues
// @grant        GM_unregisterMenuCommand
// @grant        GM_webRequest
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @grant        window.close
// @grant        window.focus
// @grant        window.onurlchange
// @run-at       document-start
// ==/UserScript==

(function () {
  "use strict";
  function CompatibleProcessing() {
    try {
      if (typeof Object.assign !== "function")
        Object.assign = function (...args) {
          const target = Object(args[0] || {});
          if (args.length > 1)
            [...args].splice(1, args.length - 1).forEach((sourceItem) => {
              for (const sourceKey in sourceItem)
                if (Object.prototype.hasOwnProperty.call(sourceItem, sourceKey))
                  target[sourceKey] = sourceItem[sourceKey];
            });
          return target;
        };
    } catch (error) {
      console.warn("Qmsg CompatibleProcessing Object.assign error", error);
    }
    try {
      if (!("classList" in document.documentElement))
        Object.defineProperty(HTMLElement.prototype, "classList", {
          get: function () {
            const self = this;
            function update(fn) {
              return function (value) {
                const classes = self.className.split(/\s+/g);
                fn(classes, classes.indexOf(value), value);
                self.className = classes.join(" ");
              };
            }
            return {
              add: update(function (classes, index, value) {
                if (!~index) classes.push(value);
              }),
              remove: update(function (classes, index) {
                if (~index) classes.splice(index, 1);
              }),
              toggle: update(function (classes, index, value) {
                if (~index) classes.splice(index, 1);
                else classes.push(value);
              }),
              contains: function (value) {
                return !!~self.className.split(/\s+/g).indexOf(value);
              },
              item: function (index) {
                return self.className.split(/\s+/g)[index] || null;
              },
            };
          },
        });
    } catch (error) {
      console.warn("Qmsg CompatibleProcessing HTMLElement.prototype.classList warning", error);
    }
  }
  var QmsgDefaultConfig = {
    INS_DEFAULT: {},
    get PLUGIN_NAME() {
      return "qmsg";
    },
    get NAMESPACE() {
      return "qmsg";
    },
    get config() {
      return {
        parent: document.body || document.documentElement,
        useShadowRoot: true,
        shadowRootMode: "open",
        animation: true,
        autoClose: true,
        listenEventToPauseAutoClose: true,
        listenEventToCloseInstance: true,
        content: "",
        isHTML: false,
        position: "top",
        showClose: false,
        maxNums: 5,
        onClose: null,
        showIcon: true,
        showReverse: false,
        timeout: 2500,
        type: "info",
        zIndex: 5e4,
        style: "",
        customClass: "",
        isLimitWidth: false,
        limitWidthNum: 200,
        limitWidthWrap: "no-wrap",
        consoleLogContent: false,
        afterRender: null,
      };
    },
  };
  var QmsgHeaderCloseIcon = `
	<svg width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
		<rect width="48" height="48" fill="white" fill-opacity="0.01"/>
		<path d="M14 14L34 34" stroke="#909399" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
		<path d="M14 34L34 14" stroke="#909399" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
	</svg>`;
  var QmsgIcon = {
    info: `
		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64q190.016 4.992 316.512 131.488T960 512q-4.992 190.016-131.488 316.512T512 960q-190.016-4.992-316.512-131.488T64 512q4.992-190.016 131.488-316.512T512 64zm67.008 275.008q26.016 0 43.008-15.488t16.992-41.504-16.992-41.504-42.496-15.488-42.496 15.488-16.992 41.504 16.992 41.504 42.016 15.488zm12 360q0-6.016.992-16T592 664l-52.992 60.992q-8 8.992-16.512 14.016T508 742.016q-8.992-4-8-14.016l88-276.992q4.992-28-8.992-48t-44.992-24q-35.008.992-76.512 29.504t-72.512 72.512v15.008q-.992 10.016 0 19.008l52.992-60.992q8-8.992 16.512-14.016T468 437.024q10.016 4.992 7.008 16l-87.008 276q-7.008 24.992 7.008 44.512T444 800.032q50.016-.992 84-28.992t63.008-72z" fill="#909399"/>
		</svg>`,
    warning: `

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64C264.64 64 64 264.64 64 512c0 247.424 200.64 448 448 448 247.488 0 448-200.576 448-448 0-247.36-200.512-448-448-448zm0 704c-26.432 0-48-21.504-48-48s21.568-48 48-48c26.624 0 48 21.504 48 48s-21.376 48-48 48zm48-240c0 26.56-21.376 48-48 48-26.432 0-48-21.44-48-48V304c0-26.56 21.568-48 48-48 26.624 0 48 21.44 48 48v224z" fill="#E6A23C"/>
		</svg>`,
    error: `

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64C264.58 64 64 264.58 64 512s200.58 448 448 448 448-200.57 448-448S759.42 64 512 64zm158.39 561.14a32 32 0 1 1-45.25 45.26L512 557.26 398.86 670.4a32 32 0 0 1-45.25-45.26L466.75 512 353.61 398.86a32 32 0 0 1 45.25-45.25L512 466.74l113.14-113.13a32 32 0 0 1 45.25 45.25L557.25 512z" fill="#F56C6C"/>
		</svg>`,
    success: `

		<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="16" height="16">
			<path d="M512 64q190.016 4.992 316.512 131.488T960 512q-4.992 190.016-131.488 316.512T512 960q-190.016-4.992-316.512-131.488T64 512q4.992-190.016 131.488-316.512T512 64zm-56 536l-99.008-99.008q-12-11.008-27.488-11.008t-27.008 11.488-11.488 26.496 11.008 27.008l127.008 127.008q11.008 11.008 27.008 11.008t27.008-11.008l263.008-263.008q15.008-15.008 9.504-36.512t-27.008-27.008-36.512 9.504z" fill="#67C23A"/>
		</svg>`,
    loading: `
		<svg class="animate-turn" width="16" height="16" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
			<path fill="#fff" fill-opacity=".01" d="M0 0h48v48H0z"/>
			<path d="M4 24c0 11.046 8.954 20 20 20s20-8.954 20-20S35.046 4 24 4" stroke="#409eff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
			<path d="M36 24c0-6.627-5.373-12-12-12s-12 5.373-12 12 5.373 12 12 12" stroke="#409eff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
		</svg>`,
  };
  var QmsgInstStorage = {
    insInfoList: [],
    remove(uuid) {
      let flag = false;
      for (let index = 0; index < QmsgInstStorage.insInfoList.length; index++)
        if (QmsgInstStorage.insInfoList[index].uuid === uuid) {
          QmsgInstStorage.insInfoList.splice(index, 1);
          flag = true;
          break;
        }
      return flag;
    },
  };
  var QmsgCoreDefaultApi = {
    document,
    window,
    globalThis,
    self,
    setTimeout: globalThis.setTimeout.bind(globalThis),
    setInterval: globalThis.setInterval.bind(globalThis),
    clearTimeout: globalThis.clearTimeout.bind(globalThis),
    clearInterval: globalThis.clearInterval.bind(globalThis),
  };
  var QmsgCoreApi = Object.assign({}, QmsgCoreDefaultApi);
  var QmsgCore = {
    init(option) {
      if (!option) option = Object.assign({}, QmsgCoreDefaultApi);
      Object.assign(QmsgCoreApi, option);
    },
    get document() {
      return QmsgCoreApi.document;
    },
    get window() {
      return QmsgCoreApi.window;
    },
    get globalThis() {
      return QmsgCoreApi.globalThis;
    },
    get self() {
      return QmsgCoreApi.self;
    },
    get setTimeout() {
      return QmsgCoreApi.setTimeout;
    },
    get setInterval() {
      return QmsgCoreApi.setInterval;
    },
    get clearTimeout() {
      return QmsgCoreApi.clearTimeout;
    },
    get clearInterval() {
      return QmsgCoreApi.clearInterval;
    },
  };
  var QmsgUtils = {
    toStr(target) {
      return JSON.stringify(target, (_key, value) => {
        if (typeof value === "object" && value != null && value instanceof Node) return String(value);
        return value;
      });
    },
    getNameSpacify(...args) {
      return [QmsgDefaultConfig.NAMESPACE, ...args].join("-");
    },
    isNumber(text) {
      return /^\d+$/.test(text);
    },
    getUUID() {
      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (value) {
        const randValue = (Math.random() * 16) | 0;
        return (value == "x" ? randValue : (randValue & 3) | 8).toString(16);
      });
    },
    mergeArgs(content = "", config) {
      const opts = {};
      if (arguments.length === 0) return opts;
      if (config != null) {
        opts.content = content;
        if (typeof config === "object" && config != null) return Object.assign(opts, config);
      } else if (typeof content === "object" && content != null) return Object.assign(opts, content);
      else opts.content = content;
      return opts;
    },
    toDynamicObject(defaultObj, ...other_objs) {
      const __obj__ = Object.assign({}, defaultObj ?? {});
      Object.keys(__obj__).forEach((keyName) => {
        let objValue = __obj__[keyName];
        Object.defineProperty(__obj__, keyName, {
          get() {
            const findIndex = other_objs.findIndex((other_obj) => {
              return (
                typeof other_obj === "object" && other_obj != null && other_obj.hasOwnProperty.call(other_obj, keyName)
              );
            });
            if (findIndex !== -1) return other_objs[findIndex][keyName];
            else return objValue;
          },
          set(newValue) {
            objValue = newValue;
          },
        });
      });
      return __obj__;
    },
    setTimeout(callback, timeout) {
      return QmsgCore.setTimeout(callback, timeout);
    },
    clearTimeout(timeId) {
      if (timeId != null) QmsgCore.clearTimeout(timeId);
    },
    setInterval(callback, timeout) {
      QmsgCore.setInterval(callback, timeout);
    },
    clearInterval(timeId) {
      if (timeId != null) QmsgCore.clearInterval(timeId);
    },
    setSafeHTML($el, text) {
      if (globalThis.trustedTypes && typeof globalThis.trustedTypes.createPolicy === "function")
        $el.innerHTML = globalThis.trustedTypes
          .createPolicy("safe-innerHTML", { createHTML: (html) => html })
          .createHTML(text);
      else $el.innerHTML = text;
    },
  };
  var QmsgAnimation = {
    $state: {
      opening: "MessageMoveIn",
      done: "",
      closing: "MessageMoveOut",
    },
    $name: {
      startNameList: ["animationName", "WebkitAnimationName", "MozAnimationName", "msAnimationName", "OAnimationName"],
      endNameList: ["animationend", "webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend"],
    },
    __CAN_ANIMATION__: void 0,
    get CAN_ANIMATION() {
      this.__CAN_ANIMATION__ =
        this.__CAN_ANIMATION__ ?? this.getStyleAnimationNameValue(document.createElement("div")) != null;
      return this.__CAN_ANIMATION__;
    },
    getStyleAnimationNameValue(element) {
      for (let index = 0; index < this.$name.startNameList.length; index++) {
        const animationName = this.$name.startNameList[index];
        const animationNameValue = element.style[animationName];
        if (animationNameValue != null) return animationNameValue;
      }
    },
    setStyleAnimationName(element, animationNameValue = "") {
      this.$name.startNameList.forEach((animationName) => {
        if (animationName in element.style) element.style[animationName] = animationNameValue;
      });
    },
  };
  var QmsgCSS = {
    css: `
    @charset "utf-8";
.qmsg.qmsg-wrapper {
  position: fixed;
  top: 16px;
  left: 0;
  z-index: 50000;
  display: flex;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  width: 100%;
  color: rgba(0, 0, 0, 0.55);
  list-style: none;
  font-variant: tabular-nums;
  font-size: 13px;
  line-height: 1;
  font-feature-settings: "tnum";
  pointer-events: none;
  flex-direction: column;
}
.qmsg.qmsg-data-position-center,
.qmsg.qmsg-data-position-left,
.qmsg.qmsg-data-position-right {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.qmsg.qmsg-data-position-bottom,
.qmsg.qmsg-data-position-bottomleft,
.qmsg.qmsg-data-position-bottomright {
  position: fixed;
  top: unset;
  bottom: 0;
  bottom: 8px;
  left: 50%;
  transform: translate(-50%, 0);
}
.qmsg.qmsg-data-position-bottomleft .qmsg-item,
.qmsg.qmsg-data-position-left .qmsg-item,
.qmsg.qmsg-data-position-topleft .qmsg-item {
  text-align: left;
}
.qmsg.qmsg-data-position-bottom .qmsg-item,
.qmsg.qmsg-data-position-center .qmsg-item,
.qmsg.qmsg-data-position-top .qmsg-item {
  text-align: center;
}
.qmsg.qmsg-data-position-bottomright .qmsg-item,
.qmsg.qmsg-data-position-right .qmsg-item,
.qmsg.qmsg-data-position-topright .qmsg-item {
  text-align: right;
}
.qmsg .qmsg-item {
  position: relative;
  padding: 8px;
  text-align: center;
  -webkit-animation-duration: 0.3s;
  animation-duration: 0.3s;
}
.qmsg .qmsg-item .qmsg-count {
  position: absolute;
  top: -4px;
  left: -4px;
  display: inline-block;
  height: 16px;
  min-width: 16px;
  border-radius: 2px;
  background-color: red;
  color: #fff;
  text-align: center;
  font-size: 12px;
  line-height: 16px;
  -webkit-animation-duration: 0.3s;
  animation-duration: 0.3s;
}
.qmsg .qmsg-item:first-child {
  margin-top: -8px;
}
.qmsg .qmsg-content-wrapper {
  position: relative;
  display: inline-block;
  padding: 10px 12px;
  max-width: 80%;
  min-width: 40px;
  border-radius: 4px;
  background: #fff;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  text-align: center;
  pointer-events: all;
}
.qmsg .qmsg-content-wrapper .qmsg-content-text[data-limitWidthWrap="no-wrap"] {
  white-space: nowrap;
}
.qmsg .qmsg-content-wrapper .qmsg-content-text[data-limitWidthWrap="ellipsis"] {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.qmsg .qmsg-content-wrapper .qmsg-content-text[data-limitWidthWrap="wrap"] {
  white-space: normal;
}
.qmsg .qmsg-content-wrapper [class^="qmsg-content-"]:not(.qmsg-content-text) {
  display: flex;
  align-items: center;
}
.qmsg .qmsg-icon {
  position: relative;
  top: 0;
  display: inline-block;
  margin-right: 8px;
  color: inherit;
  vertical-align: -0.125em;
  text-align: center;
  text-transform: none;
  font-style: normal;
  font-size: 16px;
  line-height: 0;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.qmsg .qmsg-icon svg {
  display: inline-block;
}
.qmsg .qmsg-content-info .qmsg-icon {
  color: #1890ff;
}
.qmsg .qmsg-icon-close {
  margin: 0;
  margin-left: 8px;
  padding: 0;
  outline: 0;
  border: none;
  background-color: transparent;
  color: rgba(0, 0, 0, 0.45);
  font-size: 12px;
  cursor: pointer;
  transition: color 0.3s;
}
.qmsg .qmsg-icon-close:hover > svg path {
  stroke: #555;
}
.qmsg .animate-turn {
  animation: MessageTurn 1s linear infinite;
  -webkit-animation: MessageTurn 1s linear infinite;
}


    @keyframes MessageTurn {
  0% {
    -webkit-transform: rotate(0);
  }
  25% {
    -webkit-transform: rotate(90deg);
  }
  50% {
    -webkit-transform: rotate(180deg);
  }
  75% {
    -webkit-transform: rotate(270deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
  }
}
@-webkit-keyframes MessageTurn {
  0% {
    -webkit-transform: rotate(0);
  }
  25% {
    -webkit-transform: rotate(90deg);
  }
  50% {
    -webkit-transform: rotate(180deg);
  }
  75% {
    -webkit-transform: rotate(270deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
  }
}
@-webkit-keyframes MessageMoveOut {
  0% {
    max-height: 150px;
    opacity: 1;
  }
  to {
    max-height: 0;
    opacity: 0;
  }
}
@keyframes MessageMoveOut {
  0% {
    max-height: 150px;
    opacity: 1;
  }
  to {
    max-height: 0;
    opacity: 0;
  }
}
@-webkit-keyframes MessageMoveIn {
  0% {
    opacity: 0;
    transform: translateY(-100%);
    transform-origin: 0 0;
  }
  to {
    opacity: 1;
    transform: translateY(0);
    transform-origin: 0 0;
  }
}
@keyframes MessageMoveIn {
  0% {
    opacity: 0;
    transform: translateY(-100%);
    transform-origin: 0 0;
  }
  to {
    opacity: 1;
    transform: translateY(0);
    transform-origin: 0 0;
  }
}
@-webkit-keyframes MessageShake {
  0%,
  100% {
    opacity: 1;
    transform: translateX(0);
  }
  25%,
  75% {
    opacity: 0.75;
    transform: translateX(-4px);
  }
  50% {
    opacity: 0.25;
    transform: translateX(4px);
  }
}
@keyframes MessageShake {
  0%,
  100% {
    opacity: 1;
    transform: translateX(0);
  }
  25%,
  75% {
    opacity: 0.75;
    transform: translateX(-4px);
  }
  50% {
    opacity: 0.25;
    transform: translateX(4px);
  }
}

  `,
    getStyleElement() {
      const $style = document.createElement("style");
      $style.setAttribute("type", "text/css");
      $style.setAttribute("data-type", QmsgDefaultConfig.PLUGIN_NAME);
      QmsgUtils.setSafeHTML($style, QmsgCSS.css);
      return $style;
    },
  };
  var QmsgMsg = class {
    timeId = void 0;
    startTime;
    endTime;
    setting;
    settingStr;
    settingJSON;
    uuid;
    state;
    repeatNum;
    $el = {
      $item: null,
      get $content() {
        const $el = this.$item.querySelector('[class^="qmsg-content-"] .qmsg-content-text');
        if (!$el) throw new TypeError("QmsgInst $content is null");
        return $el;
      },
    };
    constructor(config, uuid) {
      this.timeId = void 0;
      this.startTime = Date.now();
      this.endTime = null;
      this.setting = QmsgUtils.toDynamicObject(QmsgDefaultConfig.config, config, QmsgDefaultConfig.INS_DEFAULT);
      this.settingStr = QmsgUtils.toStr(this.setting);
      this.settingJSON = Object.assign({}, this.setting);
      this.uuid = uuid;
      this.state = "opening";
      this.$el.$item = document.createElement("div");
      this.repeatNum = 1;
      this.detectionType();
      this.initEl();
      if (
        typeof this.setting.consoleLogContent === "function"
          ? this.setting.consoleLogContent(this)
          : this.setting.consoleLogContent
      )
        console.log(this.setting.content);
      Reflect.set(this.$el.$item, "data-inst", this);
      if (typeof this.setting.afterRender === "function") this.setting.afterRender(this);
    }
    initEl() {
      const that = this;
      if (this.setting.customClass && typeof this.setting.customClass === "string")
        this.$el.$item.classList.add(this.setting.customClass);
      const $svg = QmsgIcon[this.setting.type || "info"];
      let contentClassName = QmsgUtils.getNameSpacify("content-" + this.setting.type || "info");
      if (this.setting.showClose) contentClassName += " " + QmsgUtils.getNameSpacify("content-with-close");
      const content = this.setting.content || "";
      const $closeSvg = QmsgHeaderCloseIcon;
      let $closeIcon = "";
      if (this.setting.showClose) $closeIcon = `<i class="qmsg-icon qmsg-icon-close">${$closeSvg}</i>`;
      const $content = document.createElement("span");
      $content.className = "qmsg-content-text";
      const positionClassName = QmsgUtils.getNameSpacify("data-position", this.setting.position.toLowerCase());
      if (this.setting.isHTML) QmsgUtils.setSafeHTML($content, content);
      else $content.innerText = content;
      if (this.setting.isLimitWidth) {
        let limitWidthNum = this.setting.limitWidthNum;
        if (typeof limitWidthNum === "string") {
          if (QmsgUtils.isNumber(limitWidthNum)) limitWidthNum = limitWidthNum + "px";
        } else limitWidthNum = limitWidthNum.toString() + "px";
        $content.style.maxWidth = limitWidthNum;
        $content.style.width = limitWidthNum;
        $content.setAttribute("data-limitWidthWrap", this.setting.limitWidthWrap);
      } else $content.setAttribute("data-limitWidthWrap", "no-wrap");
      QmsgUtils.setSafeHTML(
        this.$el.$item,
        `
			<div class="qmsg-content-wrapper">
				<div class="${contentClassName}">
				${this.setting.showIcon ? `<i class="qmsg-icon">${$svg}</i>` : ""}
					${$content.outerHTML}
					${$closeIcon}
				</div>
			</div>
			`
      );
      const $contentContainer = this.$el.$item.querySelector(".qmsg-content-wrapper");
      this.$el.$item.classList.add(QmsgUtils.getNameSpacify("item"));
      this.$el.$item.setAttribute(QmsgUtils.getNameSpacify("uuid"), this.uuid);
      let $shadowContainer;
      let $shadowRoot;
      let $wrapper;
      $shadowContainer = document.querySelector(".qmsg-shadow-container");
      $shadowRoot = this.setting.useShadowRoot ? $shadowContainer?.shadowRoot : $shadowContainer;
      if (!$shadowContainer) {
        $shadowContainer = document.createElement("div");
        $shadowContainer.className = "qmsg-shadow-container";
        if (this.setting.useShadowRoot)
          $shadowRoot = $shadowContainer.attachShadow({ mode: this.setting.shadowRootMode });
        else $shadowRoot = $shadowContainer;
        $shadowRoot.appendChild(QmsgCSS.getStyleElement());
        if (this.setting.style != null) {
          const __$ownStyle__ = document.createElement("style");
          __$ownStyle__.setAttribute("type", "text/css");
          __$ownStyle__.setAttribute("data-id", this.uuid);
          QmsgUtils.setSafeHTML(__$ownStyle__, this.setting.style);
          $contentContainer.insertAdjacentElement("afterend", __$ownStyle__);
        }
        this.setting.parent.appendChild($shadowContainer);
      }
      if ($shadowRoot == null)
        throw new TypeError("QmsgInst " + QmsgDefaultConfig.PLUGIN_NAME + " $shadowRoot is null");
      $wrapper = $shadowRoot.querySelector(
        `.${QmsgDefaultConfig.NAMESPACE}.${QmsgUtils.getNameSpacify("wrapper")}.${positionClassName}`
      );
      if (!$wrapper) {
        $wrapper = document.createElement("div");
        $wrapper.classList.add(
          QmsgDefaultConfig.NAMESPACE,
          QmsgUtils.getNameSpacify("wrapper"),
          QmsgUtils.getNameSpacify("is-initialized"),
          positionClassName
        );
        $shadowRoot.appendChild($wrapper);
      }
      if (this.setting.showReverse) $wrapper.style.flexDirection = "column-reverse";
      else $wrapper.style.flexDirection = "column";
      let zIndex = this.setting.zIndex;
      if (typeof zIndex === "function") zIndex = zIndex();
      if (!isNaN(zIndex)) $wrapper.style.zIndex = zIndex.toString();
      $wrapper.appendChild(this.$el.$item);
      this.setState(this.$el.$item, "opening");
      if (this.setting.showClose) {
        const $closeIcon = this.$el.$item.querySelector(".qmsg-icon-close");
        if ($closeIcon)
          $closeIcon.addEventListener("click", () => {
            that.close();
          });
      }
      const animationendEvent = () => {
        if (QmsgAnimation.getStyleAnimationNameValue(that.$el.$item) === QmsgAnimation.$state.closing) {
          that.endTime = Date.now();
          that.destroy();
        }
        QmsgAnimation.setStyleAnimationName(this.$el.$item);
      };
      QmsgAnimation.$name.endNameList.forEach(function (animationendName) {
        that.$el.$item.addEventListener(animationendName, animationendEvent);
      });
      if (this.setting.autoClose && this.setting.listenEventToPauseAutoClose) {
        this.resetAutoCloseTimer();
        const enterEvent = () => {
          this.clearAutoCloseTimer();
        };
        const leaveEvent = () => {
          if (this.timeId != null) {
            console.warn("QmsgInst timeId is not null,mouseenter may be not first trigger,timeId:" + this.timeId);
            return;
          }
          this.startAutoCloseTimer();
        };
        let isRemoveMouseEvent = false;
        this.$el.$item.addEventListener("mouseenter", enterEvent);
        this.$el.$item.addEventListener("mouseleave", leaveEvent);
        this.$el.$item.addEventListener(
          "touchstart",
          () => {
            if (!isRemoveMouseEvent) {
              isRemoveMouseEvent = true;
              this.$el.$item.removeEventListener("mouseenter", enterEvent);
              this.$el.$item.removeEventListener("mouseleave", leaveEvent);
            }
            enterEvent();
          },
          { passive: true }
        );
        this.$el.$item.addEventListener("touchend", leaveEvent);
        this.$el.$item.addEventListener("touchcancel", leaveEvent);
      }
    }
    detectionType() {
      if (this.setting.timeout != null && typeof this.setting.timeout === "string")
        this.setting.timeout = parseInt(this.setting.timeout);
      if (isNaN(this.setting.timeout)) this.setting.timeout = QmsgDefaultConfig.config.timeout;
      if (
        !(
          this.setting.timeout != null &&
          parseInt(this.setting.timeout.toString()) >= 0 &&
          parseInt(this.setting.timeout.toString()) <= Number.MAX_VALUE
        )
      )
        this.setting.timeout = QmsgDefaultConfig.config.timeout;
      if (typeof this.setting.zIndex === "function") this.setting.zIndex = this.setting.zIndex();
      if (this.setting.zIndex != null && typeof this.setting.zIndex === "string")
        this.setting.zIndex = parseInt(this.setting.zIndex);
      if (isNaN(this.setting.zIndex))
        this.setting.zIndex =
          typeof QmsgDefaultConfig.config.zIndex === "function"
            ? QmsgDefaultConfig.config.zIndex()
            : QmsgDefaultConfig.config.zIndex;
    }
    setState(element, state) {
      if (!state || !QmsgAnimation.$state[state]) return;
      this.state = state;
      QmsgAnimation.setStyleAnimationName(element, QmsgAnimation.$state[state]);
    }
    setRepeatNumIncreasing() {
      this.repeatNum++;
    }
    setMsgCount() {
      const countClassName = QmsgUtils.getNameSpacify("count");
      const $content = this.$el.$item.querySelector(
        `.${QmsgDefaultConfig.NAMESPACE}.${QmsgUtils.getNameSpacify("wrapper")} [class^="qmsg-content-"]`
      );
      if (!$content) throw new TypeError("QmsgInst $content is null");
      let $count = $content.querySelector("." + countClassName);
      if (!$count) {
        $count = document.createElement("span");
        $count.classList.add(countClassName);
        $content.appendChild($count);
      }
      const repeatNum = this.repeatNum;
      QmsgUtils.setSafeHTML($count, repeatNum.toString());
      QmsgAnimation.setStyleAnimationName($count);
      QmsgAnimation.setStyleAnimationName($count, "MessageShake");
      this.resetAutoCloseTimer();
    }
    clearAutoCloseTimer() {
      QmsgUtils.clearTimeout(this.timeId);
      this.timeId = void 0;
      this.startTime = null;
      this.endTime = null;
    }
    startAutoCloseTimer() {
      if (this.setting.autoClose && this.setting.listenEventToPauseAutoClose) {
        this.startTime = Date.now();
        this.endTime = null;
        this.timeId = QmsgUtils.setTimeout(() => {
          this.close();
        }, this.setting.timeout);
      }
    }
    resetAutoCloseTimer() {
      this.clearAutoCloseTimer();
      this.startAutoCloseTimer();
    }
    close() {
      this.setState(this.$el.$item, "closing");
      if (QmsgAnimation.CAN_ANIMATION) QmsgInstStorage.remove(this.uuid);
      else this.destroy();
      const onCloseCallBack = this.setting.onClose;
      if (onCloseCallBack && typeof onCloseCallBack === "function") onCloseCallBack.call(this);
    }
    destroy() {
      this.endTime = Date.now();
      this.$el.$item.remove();
      QmsgUtils.clearTimeout(this.timeId);
      QmsgInstStorage.remove(this.uuid);
      this.timeId = void 0;
    }
    setText(text) {
      const $content = this.$el.$content;
      $content.innerText = text;
      this.setting.content = text;
    }
    setHTML(text) {
      const $content = this.$el.$content;
      QmsgUtils.setSafeHTML($content, text);
      this.setting.content = text;
    }
  };
  function QmsgInstHandler(config = {}) {
    const optionStr = QmsgUtils.toStr(config);
    const setting = QmsgUtils.toDynamicObject(QmsgDefaultConfig.config, config, QmsgDefaultConfig.INS_DEFAULT);
    const settingStr = QmsgUtils.toStr(setting);
    let qmsgItemInfo = QmsgInstStorage.insInfoList.find((item) => {
      return item.configStr === optionStr && item.inst.settingStr === settingStr;
    });
    let qmsgInst = qmsgItemInfo?.inst;
    if (qmsgInst == null) {
      const uuid = QmsgUtils.getUUID();
      const qmsgInstStorageInfo = {
        uuid,
        configStr: optionStr,
        inst: new QmsgMsg(setting, uuid),
      };
      QmsgInstStorage.insInfoList.push(qmsgInstStorageInfo);
      const QmsgListLength = QmsgInstStorage.insInfoList.length;
      const maxNums = qmsgInstStorageInfo.inst.setting.maxNums;
      if (QmsgListLength > maxNums)
        for (let index = 0; index < QmsgListLength - maxNums; index++) {
          const item = QmsgInstStorage.insInfoList[index];
          item && item.inst.setting.autoClose && item.inst.close();
        }
      qmsgItemInfo = qmsgInstStorageInfo;
      qmsgInst = qmsgInstStorageInfo.inst;
    } else {
      if (!qmsgInst.repeatNum) qmsgInst.repeatNum = 2;
      else if (qmsgInst.repeatNum >= 99);
      else qmsgInst.setRepeatNumIncreasing();
      qmsgInst.setMsgCount();
    }
    if (qmsgInst) qmsgInst.$el.$item.setAttribute("data-count", qmsgInst?.repeatNum.toString());
    else throw new Error("QmsgInst is null");
    return qmsgInst;
  }
  var QmsgEvent = {
    visibilitychange: {
      eventConfig: {
        callback() {
          if (document.visibilityState === "visible")
            for (let index = 0; index < QmsgInstStorage.insInfoList.length; index++) {
              const qmsgInst = QmsgInstStorage.insInfoList[index].inst;
              const qmsgSetting = qmsgInst.setting;
              const now = Date.now();
              if (
                qmsgSetting.type !== "loading" &&
                qmsgSetting.autoClose &&
                typeof qmsgInst.endTime !== "number" &&
                typeof qmsgInst.startTime === "number" &&
                typeof qmsgSetting.timeout === "number" &&
                now - qmsgInst.startTime >= qmsgSetting.timeout
              )
                qmsgInst.close();
            }
        },
        option: { capture: true },
      },
      addEvent() {
        if ("visibilityState" in document)
          document.addEventListener(
            "visibilitychange",
            QmsgEvent.visibilitychange.eventConfig.callback,
            QmsgEvent.visibilitychange.eventConfig.option
          );
        else console.error("Qmsg addEvent visibilityState not support");
      },
      removeEvent() {
        document.removeEventListener(
          "visibilitychange",
          QmsgEvent.visibilitychange.eventConfig.callback,
          QmsgEvent.visibilitychange.eventConfig.option
        );
      },
    },
  };
  var version$3 = "1.7.2";
  CompatibleProcessing();
  var Qmsg = class {
    $data;
    $eventUtils;
    constructor(config) {
      this.$data = {
        version: version$3,
        config: QmsgDefaultConfig,
        icon: QmsgIcon,
        instanceStorage: QmsgInstStorage,
      };
      this.$eventUtils = QmsgEvent;
      this.$eventUtils.visibilitychange.addEvent();
      this.config(config);
    }
    config(globalConfig) {
      const that = QmsgDefaultConfig;
      if (globalConfig == null) return that.INS_DEFAULT;
      if (typeof globalConfig !== "object") return that.INS_DEFAULT;
      for (const key in globalConfig) {
        if (!Object.hasOwn(globalConfig, key)) continue;
        const descriptor = Object.getOwnPropertyDescriptor(globalConfig, key);
        if (descriptor)
          if ("get" in descriptor) {
            Reflect.deleteProperty(that.INS_DEFAULT, key);
            Object.defineProperty(that.INS_DEFAULT, key, {
              get: descriptor.get,
              configurable: true,
              enumerable: true,
            });
          } else if ("value" in descriptor) {
            Reflect.deleteProperty(that.INS_DEFAULT, key);
            Object.defineProperty(that.INS_DEFAULT, key, {
              get: () => descriptor.value,
              configurable: true,
              enumerable: true,
            });
          } else throw new TypeError("Qmsg.config: descriptor.get or descriptor.value is null");
        else Reflect.set(that.INS_DEFAULT, key, globalConfig[key]);
      }
      return that.INS_DEFAULT;
    }
    info(content, config) {
      const params = QmsgUtils.mergeArgs(content, config);
      params.type = "info";
      return QmsgInstHandler.call(this, params);
    }
    warning(content, config) {
      const params = QmsgUtils.mergeArgs(content, config);
      params.type = "warning";
      return QmsgInstHandler.call(this, params);
    }
    success(content, config) {
      const params = QmsgUtils.mergeArgs(content, config);
      params.type = "success";
      return QmsgInstHandler.call(this, params);
    }
    error(content, config) {
      const params = QmsgUtils.mergeArgs(content, config);
      params.type = "error";
      return QmsgInstHandler.call(this, params);
    }
    loading(content, config) {
      const params = QmsgUtils.mergeArgs(content, config);
      params.type = "loading";
      params.autoClose = false;
      return QmsgInstHandler.call(this, params);
    }
    remove(uuid) {
      QmsgInstStorage.remove(uuid);
    }
    closeAll() {
      for (let index = QmsgInstStorage.insInfoList.length - 1; index >= 0; index--) {
        const item = QmsgInstStorage.insInfoList[index];
        item && item.inst && item.inst.close();
      }
    }
  };
  var qmsg = new Qmsg();
  var _GM = typeof GM != "undefined" ? GM : void 0;
  var _GM_addElement = typeof GM_addElement != "undefined" ? GM_addElement : void 0;
  var _GM_addStyle = typeof GM_addStyle != "undefined" ? GM_addStyle : void 0;
  var _GM_addValueChangeListener = typeof GM_addValueChangeListener != "undefined" ? GM_addValueChangeListener : void 0;
  var _GM_cookie = typeof GM_cookie != "undefined" ? GM_cookie : void 0;
  var _GM_deleteValue = typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0;
  var _GM_deleteValues = typeof GM_deleteValues != "undefined" ? GM_deleteValues : void 0;
  var _GM_download = typeof GM_download != "undefined" ? GM_download : void 0;
  var _GM_getResourceText = typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0;
  var _GM_getResourceURL = typeof GM_getResourceURL != "undefined" ? GM_getResourceURL : void 0;
  var _GM_getTab = typeof GM_getTab != "undefined" ? GM_getTab : void 0;
  var _GM_getTabs = typeof GM_getTabs != "undefined" ? GM_getTabs : void 0;
  var _GM_getValue = typeof GM_getValue != "undefined" ? GM_getValue : void 0;
  var _GM_getValues = typeof GM_getValues != "undefined" ? GM_getValues : void 0;
  var _GM_info = typeof GM_info != "undefined" ? GM_info : void 0;
  var _GM_listValues = typeof GM_listValues != "undefined" ? GM_listValues : void 0;
  var _GM_log = typeof GM_log != "undefined" ? GM_log : void 0;
  var _GM_notification = typeof GM_notification != "undefined" ? GM_notification : void 0;
  var _GM_openInTab = typeof GM_openInTab != "undefined" ? GM_openInTab : void 0;
  var _GM_registerMenuCommand = typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0;
  var _GM_removeValueChangeListener =
    typeof GM_removeValueChangeListener != "undefined" ? GM_removeValueChangeListener : void 0;
  var _GM_saveTab = typeof GM_saveTab != "undefined" ? GM_saveTab : void 0;
  var _GM_setClipboard = typeof GM_setClipboard != "undefined" ? GM_setClipboard : void 0;
  var _GM_setValue = typeof GM_setValue != "undefined" ? GM_setValue : void 0;
  var _GM_setValues = typeof GM_setValues != "undefined" ? GM_setValues : void 0;
  var _GM_unregisterMenuCommand = typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0;
  var _GM_webRequest = typeof GM_webRequest != "undefined" ? GM_webRequest : void 0;
  var _GM_xmlhttpRequest = typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0;
  var _GM_audio = typeof GM_audio != "undefined" ? GM_audio : void 0;
  var _unsafeWindow = typeof unsafeWindow != "undefined" ? unsafeWindow : void 0;
  var _monkeyWindow = window;
  var version$2 = "2.0.8";
  var WindowApi$1 = class {
    defaultApi = {
      document,
      window,
      globalThis,
      self,
      top,
      setTimeout: globalThis.setTimeout.bind(globalThis),
      setInterval: globalThis.setInterval.bind(globalThis),
      clearTimeout: globalThis.clearTimeout.bind(globalThis),
      clearInterval: globalThis.clearInterval.bind(globalThis),
    };
    api;
    constructor(option) {
      if (option) {
        if (option.globalThis == null) option.globalThis = option.window;
        if (option.self == null) option.self = option.window;
      }
      if (!option) option = Object.assign({}, this.defaultApi);
      this.api = Object.assign({}, option);
    }
    get document() {
      return this.api.document;
    }
    get window() {
      return this.api.window;
    }
    get globalThis() {
      return this.api.globalThis;
    }
    get self() {
      return this.api.self;
    }
    get top() {
      return this.api.top;
    }
    get setTimeout() {
      return this.api.setTimeout;
    }
    get clearTimeout() {
      return this.api.clearTimeout;
    }
    get setInterval() {
      return this.api.setInterval;
    }
    get clearInterval() {
      return this.api.clearInterval;
    }
  };
  var CommonUtils$1 = {
    windowApi: new WindowApi$1({
      document,
      window,
      top,
      setTimeout: globalThis.setTimeout.bind(globalThis),
      clearTimeout: globalThis.clearTimeout.bind(globalThis),
      setInterval: globalThis.setInterval.bind(globalThis),
      clearInterval: globalThis.clearInterval.bind(globalThis),
    }),
    isShow($el) {
      return Boolean($el.getClientRects().length);
    },
    createSafeHTML(text) {
      if (window.trustedTypes)
        return window.trustedTypes.createPolicy("safe-innerHTML", { createHTML: (html) => html }).createHTML(text);
      else return text;
    },
    setSafeHTML($el, text) {
      $el.innerHTML = this.createSafeHTML(text);
    },
    forceShow($el) {
      const $clone = $el.cloneNode(true);
      $clone.setAttribute("style", "visibility: hidden !important;display:block !important;");
      this.windowApi.document.documentElement.appendChild($clone);
      return {
        recovery() {
          $clone.remove();
        },
      };
    },
    getStyleValue(element, styleName) {
      let view = null;
      let styles = null;
      if (element instanceof CSSStyleDeclaration) styles = element;
      else {
        view = element.ownerDocument.defaultView;
        if (!view || !view.opener) view = window;
        styles = view.getComputedStyle(element);
      }
      const value = parseFloat(styles[styleName]);
      if (isNaN(value)) return 0;
      else return value;
    },
    isWin(obj) {
      if (typeof obj !== "object") return false;
      if (obj instanceof Node) return false;
      if (obj === globalThis) return true;
      if (obj === window) return true;
      if (obj === self) return true;
      if (obj === globalThis) return true;
      if (obj === window) return true;
      if (obj === self) return true;
      if (typeof unsafeWindow !== "undefined" && obj === unsafeWindow) return true;
      if (obj?.Math?.toString() !== "[object Math]") return false;
      return true;
    },
    isDOM($el) {
      return $el instanceof Node;
    },
    delete(obj, propName) {
      if (typeof Reflect === "object" && Reflect != null && Reflect.deleteProperty)
        return Reflect.deleteProperty(obj, propName);
      else delete obj[propName];
    },
    isNodeList($el) {
      return Array.isArray($el) || $el instanceof NodeList;
    },
    getAnimationEndNameList() {
      return ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend"];
    },
    getTransitionEndNameList() {
      return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
    },
  };
  var ElementSelector = class {
    windowApi;
    constructor(windowApiOption) {
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    selector(selector, parent) {
      return this.selectorAll(selector, parent)[0];
    }
    selectorAll(selector, parent) {
      const context = this;
      parent = parent || context.windowApi.document;
      selector = selector.trim();
      if (selector.startsWith("xpath:")) {
        selector = selector.replace(/^xpath:/i, "");
        const xpathResult = context.windowApi.document.evaluate(
          selector,
          parent,
          null,
          XPathResult.ORDERED_NODE_ITERATOR_TYPE,
          null
        );
        const result = [];
        let iterateNext = xpathResult.iterateNext();
        while (iterateNext) {
          result.push(iterateNext);
          iterateNext = xpathResult.iterateNext();
        }
        return result;
      } else if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($elItem) => {
          return $elItem?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($elItem) => {
          let domText = $elItem.textContent;
          if (domText == null) domText = $elItem.innerText;
          if (domText == null) return false;
          return domText.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($elItem) => {
          let domText = $elItem.textContent;
          if (domText == null) domText = $elItem.innerText;
          if (domText == null) return false;
          return !!domText.match(regexp);
        });
      } else return Array.from(parent.querySelectorAll(selector));
    }
    matches($el, selector) {
      selector = selector.trim();
      if ($el == null) return false;
      if ($el instanceof Document) return false;
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let domText = $el.textContent;
        if (domText == null) domText = $el.innerText;
        if (domText == null) return false;
        return $el.matches(selector) && domText.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let domText = $el.textContent;
        if (domText == null) domText = $el.innerText;
        if (domText == null) return false;
        return $el.matches(selector) && !!domText.match(regexp);
      } else return $el.matches(selector);
    }
    closest($el, selector) {
      selector = selector.trim();
      if ($el == null) return null;
      if ($el instanceof Document) return null;
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") return $closest;
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          const content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          let domText = $el.textContent;
          if (domText == null) domText = $el.innerText;
          if (typeof domText === "string" && domText.match(regexp)) return $closest;
        }
        return null;
      } else return $el?.closest(selector);
    }
  };
  var elementSelector = new ElementSelector();
  var isDOM = function ($el) {
    return $el instanceof Node;
  };
  var Utils$1 = class {
    windowApi;
    constructor(option) {
      this.windowApi = new WindowApi$1(option);
    }
    isJQuery(target) {
      let result = false;
      if (typeof jQuery === "object" && target instanceof jQuery) result = true;
      if (target == null) return false;
      if (typeof target === "object")
        for (const jQueryPropsName of [
          "add",
          "addBack",
          "addClass",
          "after",
          "ajaxComplete",
          "ajaxError",
          "ajaxSend",
          "ajaxStart",
          "ajaxStop",
          "ajaxSuccess",
          "animate",
          "append",
          "appendTo",
          "attr",
          "before",
          "bind",
          "blur",
          "change",
          "children",
          "clearQueue",
          "click",
          "clone",
          "closest",
          "constructor",
          "contents",
          "contextmenu",
          "css",
          "data",
          "dblclick",
          "delay",
          "delegate",
          "dequeue",
          "each",
          "empty",
          "end",
          "eq",
          "extend",
          "fadeIn",
          "fadeOut",
          "fadeTo",
          "fadeToggle",
          "filter",
          "find",
          "first",
          "focus",
          "focusin",
          "focusout",
          "get",
          "has",
          "hasClass",
          "height",
          "hide",
          "hover",
          "html",
          "index",
          "init",
          "innerHeight",
          "innerWidth",
          "insertAfter",
          "insertBefore",
          "is",
          "jquery",
          "keydown",
          "keyup",
          "last",
          "load",
          "map",
          "mousedown",
          "mouseenter",
          "mouseleave",
          "mousemove",
          "mouseout",
          "mouseover",
          "mouseup",
          "next",
          "nextAll",
          "not",
          "off",
          "offset",
          "offsetParent",
          "on",
          "one",
          "outerHeight",
          "outerWidth",
          "parent",
          "parents",
          "position",
          "prepend",
          "prependTo",
          "prev",
          "prevAll",
          "prevUntil",
          "promise",
          "prop",
          "pushStack",
          "queue",
          "ready",
          "remove",
          "removeAttr",
          "removeClass",
          "removeData",
          "removeProp",
          "replaceAll",
          "replaceWith",
          "resize",
          "scroll",
          "scrollLeft",
          "scrollTop",
          "select",
          "show",
          "siblings",
          "slice",
          "slideDown",
          "slideToggle",
          "slideUp",
          "text",
          "toggle",
          "toggleClass",
          "trigger",
          "triggerHandler",
          "unbind",
          "width",
          "wrap",
        ])
          if (!(jQueryPropsName in target)) {
            result = false;
            break;
          } else result = true;
      return result;
    }
    assign(target = {}, source = {}, isAdd = false) {
      const UtilsContext = this;
      if (Array.isArray(source)) {
        if (
          !source.filter((item) => {
            return typeof item === "object";
          }).length
        )
          return source;
      }
      if (source == null) return target;
      if (target == null) target = {};
      let iteratorTarget;
      if (isAdd) iteratorTarget = source;
      else iteratorTarget = target;
      for (const keyName in iteratorTarget) {
        if (!isAdd && !(keyName in source)) continue;
        const targetValue = Reflect.get(target, keyName);
        const sourceValue = Reflect.get(source, keyName);
        if (typeof sourceValue === "object" && sourceValue != null && keyName in target && !isDOM(sourceValue)) {
          let childObjectValue;
          if (Array.isArray(sourceValue)) {
            if (Array.isArray(targetValue)) targetValue.length = 0;
            childObjectValue = sourceValue;
          } else childObjectValue = UtilsContext.assign(targetValue, sourceValue, isAdd);
          Reflect.set(target, keyName, childObjectValue);
        } else Reflect.set(target, keyName, sourceValue);
      }
      return target;
    }
    mutationObserver(target, observer_config) {
      const that = this;
      observer_config = that.assign(
        {
          callback: () => {},
          config: {
            subtree: void 0,
            childList: void 0,
            attributes: void 0,
            attributeFilter: void 0,
            attributeOldValue: void 0,
            characterData: void 0,
            characterDataOldValue: void 0,
          },
          immediate: false,
        },
        observer_config
      );
      const mutationObserver = new (
        this.windowApi.window.MutationObserver ||
        this.windowApi.window.webkitMutationObserver ||
        this.windowApi.window.MozMutationObserver
      )(function (mutations, observer) {
        if (typeof observer_config.callback === "function") observer_config.callback(mutations, observer);
      });
      if (Array.isArray(target) || target instanceof NodeList)
        target.forEach((item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      else if (that.isJQuery(target))
        target.each((_, item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      else mutationObserver.observe(target, observer_config.config);
      if (observer_config.immediate) {
        if (typeof observer_config.callback === "function") observer_config.callback([], mutationObserver);
      }
      return mutationObserver;
    }
  };
  var utils$2 = new Utils$1();
  var ElementWait = class extends ElementSelector {
    windowApi;
    constructor(windowApiOption) {
      super(windowApiOption);
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    wait(checkFn, timeout, parent) {
      const UtilsContext = this;
      const __timeout__ = typeof timeout === "number" ? timeout : 0;
      return new Promise((resolve) => {
        const observer = utils$2.mutationObserver(parent || UtilsContext.windowApi.document, {
          config: {
            subtree: true,
            childList: true,
            attributes: true,
          },
          immediate: true,
          callback(_, __observer__) {
            const result = checkFn();
            if (result.success) {
              if (typeof __observer__?.disconnect === "function") __observer__.disconnect();
              resolve(result.data);
            }
          },
        });
        if (__timeout__ > 0)
          setTimeout(() => {
            if (typeof observer?.disconnect === "function") observer.disconnect();
            resolve(null);
          }, __timeout__);
      });
    }
    waitNode(...args) {
      args = args.filter((arg) => arg !== void 0);
      const UtilsContext = this;
      const selector = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "string" && !Array.isArray(args[0]) && typeof args[0] !== "function")
        throw new TypeError("DOMUtils.waitNode 第一个参数必须是string|string[]|Function");
      if (args.length === 1);
      else if (args.length === 2) {
        const secondParam = args[1];
        if (typeof secondParam === "number") timeout = secondParam;
        else if (typeof secondParam === "object" && secondParam instanceof Node) parent = secondParam;
        else throw new TypeError("DOMUtils.waitNode 第二个参数必须是number|Node");
      } else if (args.length === 3) {
        const secondParam = args[1];
        const thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") timeout = thirdParam;
          else throw new TypeError("DOMUtils.waitNode 第三个参数必须是number");
        } else throw new TypeError("DOMUtils.waitNode 第二个参数必须是Node");
      } else throw new TypeError("DOMUtils.waitNode 参数个数错误");
      function getNode() {
        if (Array.isArray(selector)) {
          const result = [];
          for (let index = 0; index < selector.length; index++) {
            const node = elementSelector.selector(selector[index]);
            if (node) result.push(node);
          }
          if (result.length === selector.length) return result;
        } else if (typeof selector === "function") return selector();
        else return elementSelector.selector(selector, parent);
      }
      return UtilsContext.wait(
        () => {
          const node = getNode();
          if (node)
            return {
              success: true,
              data: node,
            };
          else
            return {
              success: false,
              data: node,
            };
        },
        timeout,
        parent
      );
    }
    waitAnyNode(...args) {
      args = args.filter((arg) => arg !== void 0);
      const UtilsContext = this;
      const selectorList = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "object" && !Array.isArray(args[0]))
        throw new TypeError("DOMUtils.waitAnyNode 第一个参数必须是string[]");
      if (args.length === 1);
      else if (args.length === 2) {
        const secondParam = args[1];
        if (typeof secondParam === "number") timeout = secondParam;
        else if (typeof secondParam === "object" && secondParam instanceof Node) parent = secondParam;
        else throw new TypeError("DOMUtils.waitAnyNode 第二个参数必须是number|Node");
      } else if (args.length === 3) {
        const secondParam = args[1];
        const thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") timeout = thirdParam;
          else throw new TypeError("DOMUtils.waitAnyNode 第三个参数必须是number");
        } else throw new TypeError("DOMUtils.waitAnyNode 第二个参数必须是Node");
      } else throw new TypeError("DOMUtils.waitAnyNode 参数个数错误");
      const promiseList = selectorList.map((selector) => {
        return UtilsContext.waitNode(selector, parent, timeout);
      });
      return Promise.any(promiseList);
    }
    waitNodeList(...args) {
      args = args.filter((arg) => arg !== void 0);
      const UtilsContext = this;
      const selector = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (typeof args[0] !== "string" && !Array.isArray(args[0]))
        throw new TypeError("DOMUtils.waitNodeList 第一个参数必须是string|string[]");
      if (args.length === 1);
      else if (args.length === 2) {
        const secondParam = args[1];
        if (typeof secondParam === "number") timeout = secondParam;
        else if (typeof secondParam === "object" && secondParam instanceof Node) parent = secondParam;
        else throw new TypeError("DOMUtils.waitNodeList 第二个参数必须是number|Node");
      } else if (args.length === 3) {
        const secondParam = args[1];
        const thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") timeout = thirdParam;
          else throw new TypeError("DOMUtils.waitNodeList 第三个参数必须是number");
        } else throw new TypeError("DOMUtils.waitNodeList 第二个参数必须是Node");
      } else throw new TypeError("DOMUtils.waitNodeList 参数个数错误");
      function getNodeList() {
        if (Array.isArray(selector)) {
          const result = [];
          for (let index = 0; index < selector.length; index++) {
            const nodeList = elementSelector.selectorAll(selector[index], parent);
            if (nodeList.length) result.push(nodeList);
          }
          if (result.length === selector.length) return result;
        } else {
          const nodeList = elementSelector.selectorAll(selector, parent);
          if (nodeList.length) return nodeList;
        }
      }
      return UtilsContext.wait(
        () => {
          const node = getNodeList();
          if (node)
            return {
              success: true,
              data: node,
            };
          else
            return {
              success: false,
              data: node,
            };
        },
        timeout,
        parent
      );
    }
    waitAnyNodeList(...args) {
      args = args.filter((arg) => arg !== void 0);
      const UtilsContext = this;
      const selectorList = args[0];
      let parent = UtilsContext.windowApi.document;
      let timeout = 0;
      if (!Array.isArray(args[0])) throw new TypeError("DOMUtils.waitAnyNodeList 第一个参数必须是string[]");
      if (args.length === 1);
      else if (args.length === 2) {
        const secondParam = args[1];
        if (typeof secondParam === "number") timeout = secondParam;
        else if (typeof secondParam === "object" && secondParam instanceof Node) parent = secondParam;
        else throw new TypeError("DOMUtils.waitAnyNodeList 第二个参数必须是number|Node");
      } else if (args.length === 3) {
        const secondParam = args[1];
        const thirdParam = args[2];
        if (typeof secondParam === "object" && secondParam instanceof Node) {
          parent = secondParam;
          if (typeof thirdParam === "number") timeout = thirdParam;
          else throw new TypeError("DOMUtils.waitAnyNodeList 第三个参数必须是number");
        } else throw new TypeError("DOMUtils.waitAnyNodeList 第二个参数必须是Node");
      } else throw new TypeError("DOMUtils.waitAnyNodeList 参数个数错误");
      const promiseList = selectorList.map((selector) => {
        return UtilsContext.waitNodeList(selector, parent, timeout);
      });
      return Promise.any(promiseList);
    }
  };
  new ElementWait();
  var ElementAnimate = class extends ElementWait {
    windowApi;
    constructor(windowApiOption) {
      super(windowApiOption);
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    animate(element, styles, duration = 1e3, callback = null) {
      const context = this;
      if (typeof element === "string") element = elementSelector.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          context.animate($ele, styles, duration, callback);
        });
        return;
      }
      if (typeof duration !== "number" || duration <= 0) throw new TypeError("duration must be a positive number");
      if (typeof callback !== "function" && callback !== void 0)
        throw new TypeError("callback must be a function or null");
      if (typeof styles !== "object" || styles === void 0) throw new TypeError("styles must be an object");
      if (Object.keys(styles).length === 0) throw new Error("styles must contain at least one property");
      const start = performance.now();
      const from = {};
      const to = {};
      for (const prop in styles) {
        from[prop] = element.style[prop] || context.windowApi.globalThis.getComputedStyle(element)[prop];
        to[prop] = styles[prop];
      }
      const timer = setInterval(function () {
        let progress = (performance.now() - start) / duration;
        if (progress > 1) progress = 1;
        for (const prop in styles) element.style[prop] = from[prop] + (to[prop] - from[prop]) * progress + "px";
        if (progress === 1) {
          clearInterval(timer);
          if (callback) callback();
        }
      }, 10);
    }
    show(target, checkVisiblie = true) {
      const context = this;
      if (target == null) return;
      if (typeof target === "string") target = elementSelector.selectorAll(target);
      if (target instanceof NodeList || target instanceof Array) {
        target = target;
        for (const element of target) context.show(element, checkVisiblie);
      } else {
        target = target;
        target.style.display = "";
        if (checkVisiblie) {
          if (!CommonUtils$1.isShow(target)) target.style.setProperty("display", "unset", "important");
        }
      }
    }
    hide(target, checkVisiblie = true) {
      const context = this;
      if (target == null) return;
      if (typeof target === "string") target = elementSelector.selectorAll(target);
      if (target instanceof NodeList || target instanceof Array) {
        target = target;
        for (const element of target) context.hide(element, checkVisiblie);
      } else {
        target = target;
        target.style.display = "none";
        if (checkVisiblie) {
          if (CommonUtils$1.isShow(target)) target.style.setProperty("display", "none", "important");
        }
      }
    }
    fadeIn(element, duration = 400, callback) {
      if (element == null) return;
      const context = this;
      if (typeof element === "string") element = elementSelector.selectorAll(element);
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          context.fadeIn($ele, duration, callback);
        });
        return;
      }
      element.style.opacity = "0";
      element.style.display = "";
      let start = null;
      let timer = null;
      function step(timestamp) {
        if (!start) start = timestamp;
        const progress = timestamp - start;
        element = element;
        element.style.opacity = Math.min(progress / duration, 1).toString();
        if (progress < duration) context.windowApi.window.requestAnimationFrame(step);
        else {
          if (callback && typeof callback === "function") callback();
          context.windowApi.window.cancelAnimationFrame(timer);
        }
      }
      timer = context.windowApi.window.requestAnimationFrame(step);
    }
    fadeOut(element, duration = 400, callback) {
      const context = this;
      if (element == null) return;
      if (typeof element === "string") element = elementSelector.selectorAll(element);
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          context.fadeOut($ele, duration, callback);
        });
        return;
      }
      element.style.opacity = "1";
      let start = null;
      let timer = null;
      function step(timestamp) {
        if (!start) start = timestamp;
        const progress = timestamp - start;
        element = element;
        element.style.opacity = Math.max(1 - progress / duration, 0).toString();
        if (progress < duration) context.windowApi.window.requestAnimationFrame(step);
        else {
          element.style.display = "none";
          if (typeof callback === "function") callback();
          context.windowApi.window.cancelAnimationFrame(timer);
        }
      }
      timer = context.windowApi.window.requestAnimationFrame(step);
    }
    toggle(element, checkVisiblie) {
      const context = this;
      if (typeof element === "string") element = elementSelector.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          context.toggle($ele);
        });
        return;
      }
      if (context.windowApi.globalThis.getComputedStyle(element).getPropertyValue("display") === "none")
        context.show(element, checkVisiblie);
      else context.hide(element, checkVisiblie);
    }
  };
  new ElementAnimate();
  var GlobalData$1 = {
    domEventSymbol: Symbol("events_" + (((1 + Math.random()) * 65536) | 0).toString(16).substring(1)),
  };
  var OriginPrototype$2 = {
    Object: {
      defineProperty: Object.defineProperty,
      defineProperties: Object.defineProperties,
    },
  };
  var ElementEvent = class extends ElementAnimate {
    windowApi;
    constructor(windowApiOption) {
      super(windowApiOption);
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    getAnimationEndNameList() {
      return CommonUtils$1.getAnimationEndNameList();
    }
    getTransitionEndNameList() {
      return CommonUtils$1.getTransitionEndNameList();
    }
    on(element, eventType, selector, callback, option) {
      const getOption = function (args, startIndex, option) {
        const currentParam = args[startIndex];
        if (typeof currentParam === "boolean") {
          option.capture = currentParam;
          if (typeof args[startIndex + 1] === "boolean") option.once = args[startIndex + 1];
          if (typeof args[startIndex + 2] === "boolean") option.passive = args[startIndex + 2];
        } else if (currentParam && typeof currentParam === "object") {
          for (const key in option) if (Reflect.has(currentParam, key)) Reflect.set(option, key, currentParam[key]);
        }
        return option;
      };
      const that = this;
      const args = arguments;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null)
        return {
          off() {},
          emit() {},
        };
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType))
        eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof eventType === "string")
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
      let selectorList = [];
      if (Array.isArray(selector))
        selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof selector === "string") selectorList.push(selector);
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false,
        once: false,
        passive: false,
        isComposedPath: false,
        overrideTarget: true,
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else listenerOption = getOption(args, 4, listenerOption);
      $elList.forEach(($elItem) => {
        const targetIsWindow = CommonUtils$1.isWin($elItem);
        eventTypeList.forEach((eventName) => {
          const checkOptionOnceToRemoveEventListener = () => {
            if (listenerOption.once) this.off($elItem, eventName, selector, callback, option);
          };
          const handlerCallBack = function (event) {
            if (listenerOption.isPreventEvent) that.preventEvent(event);
            let call_this = void 0;
            let call_event = void 0;
            let call_$selector = void 0;
            let execCallback = false;
            if (selectorList.length) {
              let $target;
              if (listenerOption.isComposedPath) {
                const composedPath = event.composedPath();
                if (!composedPath.length && event.target) composedPath.push(event.target);
                $target = composedPath[0];
              } else $target = event.target;
              const $parent = targetIsWindow ? that.windowApi.document.documentElement : $elItem;
              if (
                selectorList.find((selectors) => {
                  if (that.matches($target, selectors)) return true;
                  const $closestMatches = that.closest($target, selectors);
                  if ($closestMatches && $parent?.contains?.($closestMatches)) {
                    $target = $closestMatches;
                    return true;
                  }
                  return false;
                })
              ) {
                if (listenerOption.overrideTarget)
                  try {
                    const originTarget = event.target;
                    OriginPrototype$2.Object.defineProperties(event, {
                      target: {
                        get() {
                          return $target;
                        },
                      },
                      originTarget: {
                        get() {
                          return originTarget;
                        },
                      },
                    });
                  } catch {}
                execCallback = true;
                call_this = $target;
                call_event = event;
                call_$selector = $target;
              }
            } else {
              execCallback = true;
              call_this = $elItem;
              call_event = event;
            }
            if (execCallback) {
              const result = listenerCallBack.call(call_this, call_event, call_$selector);
              checkOptionOnceToRemoveEventListener();
              if (typeof result === "boolean" && !result) return false;
            }
          };
          $elItem.addEventListener(eventName, handlerCallBack, listenerOption);
          const elementEvents = Reflect.get($elItem, GlobalData$1.domEventSymbol) || {};
          elementEvents[eventName] = elementEvents[eventName] || [];
          elementEvents[eventName].push({
            selector: selectorList,
            option: listenerOption,
            handlerCallBack,
            callback: listenerCallBack,
          });
          Reflect.set($elItem, GlobalData$1.domEventSymbol, elementEvents);
        });
      });
      return {
        off: (filter) => {
          that.off($elList, eventTypeList, selectorList, listenerCallBack, listenerOption, filter);
        },
        emit: (extraDetails, useDispatchToTriggerEvent) => {
          that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
        },
      };
    }
    off(element, eventType, selector, callback, option, filter) {
      const getOption = function (args1, startIndex, option) {
        const currentParam = args1[startIndex];
        if (typeof currentParam === "boolean") option.capture = currentParam;
        else if (currentParam && typeof currentParam === "object" && "capture" in currentParam)
          option.capture = currentParam.capture;
        return option;
      };
      const that = this;
      const args = arguments;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        $elList = $elList.concat(Array.from(element));
      } else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType))
        eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof eventType === "string")
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
      let selectorList = [];
      if (Array.isArray(selector))
        selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof selector === "string") selectorList.push(selector);
      let listenerCallBack = callback;
      let listenerOption = { capture: false };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else listenerOption = getOption(args, 4, listenerOption);
      if (args.length === 5 && typeof args[4] === "function" && typeof filter !== "function") filter = option;
      $elList.forEach(($elItem) => {
        const elementEvents = Reflect.get($elItem, GlobalData$1.domEventSymbol) || {};
        eventTypeList.forEach((eventName) => {
          const handlers = elementEvents[eventName] || [];
          const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
          for (let index = 0; index < handlersFiltered.length; index++) {
            const handler = handlersFiltered[index];
            let flag = true;
            if (flag && listenerCallBack && handler.callback !== listenerCallBack) flag = false;
            if (flag && selectorList.length && Array.isArray(handler.selector)) {
              if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) flag = false;
            }
            if (
              flag &&
              typeof handler.option.capture === "boolean" &&
              listenerOption.capture !== handler.option.capture
            )
              flag = false;
            if (flag) {
              $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
              for (let i = handlers.length - 1; i >= 0; i--) if (handlers[i] === handler) handlers.splice(i, 1);
            }
          }
          if (handlers.length === 0) {
            CommonUtils$1.delete(elementEvents, eventType);
            if (Object.keys(elementEvents).length === 0) CommonUtils$1.delete($elItem, GlobalData$1.domEventSymbol);
          }
        });
        Reflect.set($elItem, GlobalData$1.domEventSymbol, elementEvents);
      });
    }
    offAll(element, eventType) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType)) eventTypeList = eventTypeList.concat(eventType);
      else if (typeof eventType === "string") eventTypeList = eventTypeList.concat(eventType.split(" "));
      $elList.forEach(($elItem) => {
        [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData$1.domEventSymbol])].forEach((__symbol__) => {
          if (!__symbol__.toString().startsWith("Symbol(events_")) return;
          const elementEvents = Reflect.get($elItem, __symbol__) || {};
          (eventTypeList.length ? eventTypeList : Object.keys(elementEvents)).forEach((eventName) => {
            const handlers = elementEvents[eventName];
            if (!handlers) return;
            for (const handler of handlers)
              $elItem.removeEventListener(eventName, handler.handlerCallBack, { capture: handler.option.capture });
            const events = Reflect.get($elItem, __symbol__);
            CommonUtils$1.delete(events, eventName);
            if (Object.keys(events).length === 0) CommonUtils$1.delete($elItem, __symbol__);
          });
        });
      });
    }
    onReady(...args) {
      const callback = args[0];
      let resolve = void 0;
      const that = this;
      const listenTargetList = [
        {
          target: that.windowApi.document,
          eventType: "DOMContentLoaded",
          callback: () => {
            ReadyChecker.completed();
          },
        },
        {
          target: that.windowApi.window,
          eventType: "load",
          callback: () => {
            ReadyChecker.completed();
          },
        },
      ];
      const ReadyChecker = {
        init() {
          if (args.length === 0)
            return new Promise((__resolve__) => {
              resolve = __resolve__;
              ReadyChecker.check();
            });
          else ReadyChecker.check();
        },
        check() {
          if (ReadyChecker.isReady())
            setTimeout(() => {
              ReadyChecker.completed();
            }, 0);
          else ReadyChecker.onCompleted();
        },
        isReady() {
          try {
            if (
              that.windowApi.document.readyState === "complete" ||
              (that.windowApi.document.readyState !== "loading" && !that.windowApi.document.documentElement.doScroll)
            )
              return true;
            else return false;
          } catch {
            return false;
          }
        },
        completed() {
          ReadyChecker.offCompleted();
          if (typeof callback === "function") callback();
          if (typeof resolve === "function") resolve();
        },
        onCompleted() {
          for (const item of listenTargetList) that.on(item.target, item.eventType, item.callback);
        },
        offCompleted() {
          for (const item of listenTargetList) that.off(item.target, item.eventType, item.callback);
        },
      };
      return ReadyChecker.init();
    }
    emit(element, eventType, extraDetails, useDispatchToTriggerEvent = true) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      const addExtraProp = (event, obj) => {
        if (event instanceof Event && typeof obj === "object" && obj != null && !Array.isArray(obj))
          Object.keys(obj).forEach((keyName) => {
            const value = Reflect.get(obj, keyName);
            Reflect.set(event, keyName, value);
          });
      };
      let eventTypeList = [];
      let __event__ = null;
      if (Array.isArray(eventType))
        eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
      else if (typeof eventType === "string") eventTypeList = eventType.split(" ");
      else if (eventType instanceof Event) {
        __event__ = eventType;
        addExtraProp(__event__, extraDetails);
      }
      $elList.forEach(($elItem) => {
        const elementEvents = Reflect.get($elItem, GlobalData$1.domEventSymbol) || {};
        const dispatchEvent = (event, eventTypeItem) => {
          if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents)
            elementEvents[eventTypeItem].forEach((eventsItem) => {
              eventsItem.handlerCallBack(event);
            });
          else $elItem.dispatchEvent(event);
        };
        if (__event__) {
          const event = __event__;
          const eventTypeItem = event.type;
          dispatchEvent(event, eventTypeItem);
        } else
          eventTypeList.forEach((eventTypeItem) => {
            const event = new Event(eventTypeItem);
            addExtraProp(event, extraDetails);
            dispatchEvent(event, eventTypeItem);
          });
      });
    }
    click(element, handler, details, useDispatchToEmit) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          that.click($ele, handler, details, useDispatchToEmit);
        });
        return;
      }
      if (handler == null) that.emit(element, "click", details, useDispatchToEmit);
      else return that.on(element, "click", null, handler);
    }
    blur(element, handler, details, useDispatchToEmit) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          that.focus($ele, handler, details, useDispatchToEmit);
        });
        return;
      }
      if (handler === null) that.emit(element, "blur", details, useDispatchToEmit);
      else return that.on(element, "blur", null, handler);
    }
    focus(element, handler, details, useDispatchToEmit) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        element.forEach(($ele) => {
          that.focus($ele, handler, details, useDispatchToEmit);
        });
        return;
      }
      if (handler == null) that.emit(element, "focus", details, useDispatchToEmit);
      else return that.on(element, "focus", null, handler);
    }
    onHover(element, handler, option) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      if (CommonUtils$1.isNodeList(element)) {
        const listenerList = [];
        element.forEach(($ele) => {
          const listener = that.onHover($ele, handler, option);
          listenerList.push(listener);
        });
        return {
          off() {
            listenerList.forEach((listener) => {
              if (!listener) return;
              listener.off();
            });
          },
        };
      }
      const mouseenter_listener = that.on(element, "mouseenter", null, handler, option);
      const mouseleave_listener = that.on(element, "mouseleave", null, handler, option);
      return {
        off() {
          mouseenter_listener.off();
          mouseleave_listener.off();
        },
      };
    }
    onAnimationend(element, handler, option) {
      const that = this;
      if (typeof element === "string") element = that.selector(element);
      if (element == null) return;
      const defaultOption = { once: true };
      Object.assign(defaultOption, option || {});
      const eventNameList = CommonUtils$1.getAnimationEndNameList();
      that.on(element, eventNameList, null, handler, defaultOption);
      if (!defaultOption.once)
        return {
          off() {
            that.off(element, eventNameList, null, handler, defaultOption);
          },
        };
    }
    onTransitionend(element, handler, option) {
      const that = this;
      if (typeof element === "string") element = that.selector(element);
      if (element == null) return;
      const defaultOption = { once: true };
      Object.assign(defaultOption, option || {});
      const eventNameList = CommonUtils$1.getTransitionEndNameList();
      that.on(element, eventNameList, null, handler, defaultOption);
      if (!defaultOption.once)
        return {
          off() {
            that.off(element, eventNameList, null, handler, defaultOption);
          },
        };
    }
    onKeyup(element, handler, option) {
      const that = this;
      if (element == null) return;
      if (typeof element === "string") element = that.selectorAll(element);
      if (CommonUtils$1.isNodeList(element)) {
        const listenerList = [];
        element.forEach(($ele) => {
          const listener = that.onKeyup($ele, handler, option);
          listenerList.push(listener);
        });
        return {
          off() {
            listenerList.forEach((listener) => {
              if (!listener) return;
              listener.off();
            });
          },
        };
      }
      return that.on(element, "keyup", null, handler, option);
    }
    onKeydown(element, handler, option) {
      const that = this;
      if (element == null) return;
      if (typeof element === "string") element = that.selectorAll(element);
      if (CommonUtils$1.isNodeList(element)) {
        const listenerList = [];
        element.forEach(($ele) => {
          const listener = that.onKeydown($ele, handler, option);
          listenerList.push(listener);
        });
        return {
          off() {
            listenerList.forEach((listener) => {
              if (!listener) return;
              listener.off();
            });
          },
        };
      }
      return that.on(element, "keydown", null, handler, option);
    }
    onKeyboard(element, eventName = "keydown", handler, options) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      const keyboardEventCallBack = function (event) {
        const keyName = event.key || event.code;
        const keyValue = event.charCode || event.keyCode || event.which;
        const otherCodeList = [];
        if (event.ctrlKey) otherCodeList.push("ctrl");
        if (event.altKey) otherCodeList.push("alt");
        if (event.metaKey) otherCodeList.push("meta");
        if (event.shiftKey) otherCodeList.push("shift");
        if (typeof handler === "function") handler(keyName, keyValue, otherCodeList, event);
      };
      return that.on(element, eventName, keyboardEventCallBack, options);
    }
    onInput($el, handler, option) {
      let isComposite = false;
      const __callback = async (event) => {
        if (isComposite) return;
        await handler(event);
      };
      const __composition_start_callback = () => {
        isComposite = true;
      };
      const __composition_end_callback = () => {
        isComposite = false;
        this.emit($el, "input", { isComposite });
      };
      const inputListener = this.on($el, "input", __callback, option);
      const compositionStartListener = this.on($el, "compositionstart", __composition_start_callback, option);
      const compositionEndListener = this.on($el, "compositionend", __composition_end_callback, option);
      return {
        off() {
          inputListener.off();
          compositionStartListener.off();
          compositionEndListener.off();
        },
        emit(details, useDispatchToEmit) {
          inputListener.emit(details, useDispatchToEmit);
        },
      };
    }
    onOneOrDouble(...args) {
      const $el = args[0];
      let selector = void 0;
      let handler;
      let options;
      if (args.length === 2)
        if (typeof args[1] === "function") handler = args[1];
        else throw new TypeError("handler is not a function");
      else if (args.length === 3)
        if (typeof args[1] === "function") {
          handler = args[1];
          options = args[2];
        } else {
          selector = args[1];
          handler = args[2];
        }
      else if (args.length === 4) {
        selector = args[1];
        handler = args[2];
        options = args[3];
      } else throw new Error("args length error");
      let eventNodeMap = new WeakMap();
      let isDouble = false;
      let timer = void 0;
      let eventType = "pointerup";
      let checkClickTime = 200;
      if (typeof options === "object" && options != null) {
        if (typeof options.eventType === "string" || Array.isArray(options.eventType)) eventType = options.eventType;
        if (typeof options.checkClickTime === "number") checkClickTime = options.checkClickTime;
      }
      const callback = (evt, option, $selector) => {
        if ($selector) return handler(evt, $selector, option);
        else return handler(evt, option);
      };
      const pointerUpListener = this.on(
        $el,
        eventType,
        selector,
        (evt, $selector) => {
          clearTimeout(timer);
          timer = void 0;
          if (isDouble && eventNodeMap.has($selector)) {
            isDouble = false;
            eventNodeMap.delete($selector);
            callback(evt, { isDouble: true }, $selector);
          } else {
            timer = setTimeout(() => {
              isDouble = false;
              callback(evt, { isDouble: false }, $selector);
            }, checkClickTime);
            isDouble = true;
            eventNodeMap.set($selector, evt);
          }
        },
        options
      );
      return {
        off() {
          pointerUpListener.off();
          eventNodeMap = null;
        },
        emit(event, option) {
          callback(event, option || { isDouble: false });
        },
      };
    }
    preventEvent(...args) {
      const stopEvent = (event, onlyStopPropagation) => {
        event?.stopPropagation();
        event?.stopImmediatePropagation();
        if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) return;
        event?.preventDefault();
        return false;
      };
      if (args[0] instanceof Event) {
        const onlyStopPropagation = args[1];
        return stopEvent(args[0], onlyStopPropagation);
      } else {
        const $el = args[0];
        let eventNameList = args[1];
        let selector = void 0;
        let capture = false;
        let onlyStopPropagation = false;
        if (typeof eventNameList === "string") eventNameList = [eventNameList];
        let option = void 0;
        if (args.length === 2);
        else if (typeof args[2] === "string" || Array.isArray(args[2])) {
          selector = args[2];
          if (typeof args[3] === "object" && args[3] != null) option = args[3];
        } else if (typeof args[2] === "object" && args[2] != null && !Array.isArray(args[2])) option = args[2];
        else throw new TypeError("Invalid argument");
        if (option) {
          capture = Boolean(option.capture);
          onlyStopPropagation = Boolean(option.onlyStopPropagation);
        }
        return this.on(
          $el,
          eventNameList,
          selector,
          (evt) => {
            return stopEvent(evt, onlyStopPropagation);
          },
          { capture }
        );
      }
    }
  };
  new ElementEvent();
  var ElementHandler = class extends ElementEvent {
    windowApi;
    constructor(windowApiOption) {
      super(windowApiOption);
      this.windowApi = new WindowApi$1(windowApiOption);
    }
    getElementSelector($el) {
      const that = this;
      if (!$el) return void 0;
      if (!$el.parentElement) return void 0;
      if ($el.id) return `#${$el.id}`;
      let selector = that.getElementSelector($el.parentElement);
      if (!selector) return $el.tagName.toLowerCase();
      if ($el.parentElement.querySelectorAll($el.tagName).length > 1) {
        const index = Array.prototype.indexOf.call($el.parentElement.children, $el) + 1;
        selector += ` > ${$el.tagName.toLowerCase()}:nth-child(${index})`;
      } else selector += ` > ${$el.tagName.toLowerCase()}`;
      return selector;
    }
  };
  new ElementHandler();
  var domUtils$2 = new (class DOMUtils$1 extends ElementHandler {
    constructor(option) {
      super(option);
    }
    version = version$2;
    noConflict() {
      const that = this;
      if (that.windowApi.window.DOMUtils) CommonUtils$1.delete(window, "DOMUtils");
      that.windowApi.window.DOMUtils = this;
      return this;
    }
    attr($el, attrName, attrValue) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el))
        if (attrValue == null) return that.attr($el[0], attrName, attrValue);
        else {
          $el.forEach(($elItem) => {
            that.attr($elItem, attrName, attrValue);
          });
          return;
        }
      if (attrValue == null) return $el.getAttribute(attrName);
      else $el.setAttribute(attrName, attrValue);
    }
    createElement(tagName, property, attributes) {
      const that = this;
      const $el = that.windowApi.document.createElement(tagName);
      if (typeof property === "string") {
        that.html($el, property);
        return $el;
      }
      if (property == null) property = {};
      if (attributes == null) attributes = {};
      Object.keys(property).forEach((key) => {
        const value = property[key];
        if (key === "innerHTML") {
          that.html($el, value);
          return;
        }
        $el[key] = value;
      });
      Object.keys(attributes).forEach((key) => {
        let value = attributes[key];
        if (typeof value === "object") value = JSON.stringify(value);
        else if (typeof value === "function") value = value.toString();
        $el.setAttribute(key, value);
      });
      return $el;
    }
    css($el, property, value) {
      const that = this;
      function handlePixe(propertyName, propertyValue) {
        const allowAddPixe = ["width", "height", "top", "left", "right", "bottom", "font-size"];
        if (typeof propertyValue === "number") propertyValue = propertyValue.toString();
        if (typeof propertyValue === "string" && allowAddPixe.includes(propertyName) && propertyValue.match(/[0-9]$/gi))
          propertyValue = propertyValue + "px";
        return propertyValue;
      }
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        if (typeof property === "string")
          if (value == null) return that.css($el[0], property);
          else {
            $el.forEach(($elItem) => {
              that.css($elItem, property);
            });
            return;
          }
        else if (typeof property === "object") {
          $el.forEach(($elItem) => {
            that.css($elItem, property);
          });
          return;
        }
        return;
      }
      const setStyleProperty = (propertyName, propertyValue) => {
        if (typeof propertyValue === "string" && propertyValue.trim().endsWith("!important")) {
          propertyValue = propertyValue
            .trim()
            .replace(/!important$/gi, "")
            .trim();
          $el.style.setProperty(propertyName, propertyValue, "important");
        } else {
          propertyValue = handlePixe(propertyName, propertyValue);
          $el.style.setProperty(propertyName, propertyValue);
        }
      };
      if (typeof property === "string")
        if (value == null) return that.windowApi.globalThis.getComputedStyle($el).getPropertyValue(property);
        else setStyleProperty(property, value);
      else if (typeof property === "object")
        for (const prop in property) {
          const value = property[prop];
          setStyleProperty(prop, value);
        }
      else throw new TypeError("property must be string or object");
    }
    text($el, text) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        if (text == null) return that.text($el[0]);
        else
          $el.forEach(($elItem) => {
            that.text($elItem, text);
          });
        return;
      }
      if (text == null) return $el.textContent || $el.innerText;
      else {
        if (text instanceof Node) text = text.textContent || text.innerText;
        if ("textContent" in $el) $el.textContent = text;
        else if ("innerText" in $el) $el.innerText = text;
      }
    }
    html($el, html) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        if (html == null) return that.html($el[0]);
        else
          $el.forEach(($elItem) => {
            that.html($elItem, html);
          });
        return;
      }
      if (html == null) return $el.innerHTML;
      else {
        if (html instanceof Element) html = html.innerHTML;
        if ("innerHTML" in $el) CommonUtils$1.setSafeHTML($el, html);
      }
    }
    getTransform($el, isShow = false) {
      const that = this;
      let transform_left = 0;
      let transform_top = 0;
      if (!(isShow || (!isShow && CommonUtils$1.isShow($el)))) {
        const { recovery } = CommonUtils$1.forceShow($el);
        const transformInfo = that.getTransform($el, true);
        recovery();
        return transformInfo;
      }
      const elementTransform = that.windowApi.globalThis.getComputedStyle($el).transform;
      if (elementTransform != null && elementTransform !== "none" && elementTransform !== "") {
        const elementTransformSplit = elementTransform.match(/\((.+)\)/)?.[1].split(",");
        if (elementTransformSplit) {
          transform_left = Math.abs(parseInt(elementTransformSplit[4]));
          transform_top = Math.abs(parseInt(elementTransformSplit[5]));
        } else {
          transform_left = 0;
          transform_top = 0;
        }
      }
      return {
        transformLeft: transform_left,
        transformTop: transform_top,
      };
    }
    val($el, value) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        if (value == null) return that.val($el[0]);
        else
          $el.forEach(($elItem) => {
            that.val($elItem, value);
          });
        return;
      }
      if (value == null)
        if ($el.localName === "input" && ($el.type === "checkbox" || $el.type === "radio")) return $el.checked;
        else return $el.value;
      else if ($el.localName === "input" && ($el.type === "checkbox" || $el.type === "radio")) $el.checked = !!value;
      else $el.value = value;
    }
    prop($el, propName, propValue) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        if (propValue == null) return that.prop($el[0], propName);
        else
          $el.forEach(($elItem) => {
            that.prop($elItem, propName, propValue);
          });
        return;
      }
      if (propValue == null) return Reflect.get($el, propName);
      else if ($el instanceof Element && propName === "innerHTML") that.html($el, propValue);
      else Reflect.set($el, propName, propValue);
    }
    removeAttr($el, attrName) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.removeAttr($elItem, attrName);
        });
        return;
      }
      $el.removeAttribute(attrName);
    }
    removeClass($el, className) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.removeClass($elItem, className);
        });
        return;
      }
      if (className == null) $el.className = "";
      else {
        if (!Array.isArray(className)) className = className.trim().split(" ");
        className.forEach((itemClassName) => {
          $el.classList.remove(itemClassName);
        });
      }
    }
    removeProp($el, propName) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.removeProp($elItem, propName);
        });
        return;
      }
      CommonUtils$1.delete($el, propName);
    }
    addClass($el, className) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.addClass($elItem, className);
        });
        return;
      }
      if (!Array.isArray(className)) className = className.split(" ");
      className.forEach((itemClassName) => {
        if (itemClassName.trim() == "") return;
        $el.classList.add(itemClassName);
      });
    }
    hasClass($el, className) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return false;
      if (CommonUtils$1.isNodeList($el)) {
        let flag = true;
        for (let index = 0; index < $el.length; index++) {
          const $elItem = $el[index];
          flag = flag && that.hasClass($elItem, className);
        }
        return flag;
      }
      if (!$el?.classList) return false;
      if (!Array.isArray(className)) className = className.split(" ");
      for (let index = 0; index < className.length; index++) {
        const item = className[index].trim();
        if (!$el.classList.contains(item)) return false;
      }
      return true;
    }
    append($el, ...args) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.append($elItem, ...args);
        });
        return;
      }
      const handler = ($ele, $target) => {
        if ($ele instanceof DocumentFragment) {
          if (typeof $target === "string") $target = this.toElement($target, true, false);
          $ele.appendChild($target);
        } else if (typeof $target === "string")
          $ele.insertAdjacentHTML("beforeend", CommonUtils$1.createSafeHTML($target));
        else $ele.appendChild($target);
      };
      const $fragment = this.windowApi.document.createDocumentFragment();
      args.forEach((argItem) => {
        if (CommonUtils$1.isNodeList(argItem))
          argItem.forEach((it) => {
            handler($fragment, it);
          });
        else handler($fragment, argItem);
      });
      handler($el, $fragment);
    }
    prepend($el, ...args) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.prepend($elItem, ...args);
        });
        return;
      }
      const handler = ($ele, $target) => {
        if ($ele instanceof DocumentFragment) {
          if (typeof $target === "string") $target = this.toElement($target, true, false);
          $ele.appendChild($target);
        } else if (typeof $target === "string")
          $ele.insertAdjacentHTML("afterbegin", CommonUtils$1.createSafeHTML($target));
        else {
          const $firstChild = $ele.firstChild;
          if ($firstChild) $ele.insertBefore($target, $firstChild);
          else $ele.prepend($target);
        }
      };
      const $fragment = this.windowApi.document.createDocumentFragment();
      args.forEach((argItem) => {
        if (CommonUtils$1.isNodeList(argItem))
          argItem.forEach((it) => {
            handler($fragment, it);
          });
        else handler($fragment, argItem);
      });
      handler($el, $fragment);
    }
    after($el, ...args) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.after($elItem, ...args);
        });
        return;
      }
      const handler = ($ele, $target) => {
        if ($ele instanceof DocumentFragment) {
          if (typeof $target === "string") $target = this.toElement($target, true, false);
          $ele.appendChild($target);
        } else if (typeof $target === "string")
          $ele.insertAdjacentHTML("afterend", CommonUtils$1.createSafeHTML($target));
        else {
          const $parent = $el.parentElement;
          const $nextSlibling = $el.nextSibling;
          if ($parent && $nextSlibling) $parent.insertBefore($target, $nextSlibling);
          else $el.after($target);
        }
      };
      const $fragment = this.windowApi.document.createDocumentFragment();
      args.forEach((argItem) => {
        if (CommonUtils$1.isNodeList(argItem))
          argItem.forEach((it) => {
            handler($fragment, it);
          });
        else handler($fragment, argItem);
      });
      handler($el, $fragment);
    }
    before($el, ...args) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.before($elItem, ...args);
        });
        return;
      }
      const handler = ($ele, $target) => {
        if ($ele instanceof DocumentFragment) {
          if (typeof $target === "string") $target = this.toElement($target, true, false);
          $ele.appendChild($target);
        } else if (typeof $target === "string")
          $el.insertAdjacentHTML("beforebegin", CommonUtils$1.createSafeHTML($target));
        else {
          const $parent = $el.parentElement;
          if ($parent) $parent.insertBefore($target, $el);
          else $el.before($target);
        }
      };
      const $fragment = this.windowApi.document.createDocumentFragment();
      args.forEach((argItem) => {
        if (CommonUtils$1.isNodeList(argItem))
          argItem.forEach((it) => {
            handler($fragment, it);
          });
        else handler($fragment, argItem);
      });
      handler($el, $fragment);
    }
    remove($el) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.remove($elItem);
        });
        return;
      }
      $el.querySelectorAll("*").forEach(($elItem) => {
        if (!($elItem instanceof Element)) return;
        this.offAll($elItem);
      });
      this.offAll($el);
      if (typeof $el.remove === "function") $el.remove();
      else if ($el.parentElement) $el.parentElement.removeChild($el);
      else if ($el.parentNode) $el.parentNode.removeChild($el);
    }
    empty($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.empty($elItem);
        });
        return;
      }
      if ($el.innerHTML) CommonUtils$1.setSafeHTML($el, "");
      else if ($el.textContent) $el.textContent = "";
    }
    offset($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el == null) return;
      const rect = $el.getBoundingClientRect();
      return {
        top: rect.top + that.windowApi.globalThis.scrollY,
        left: rect.left + that.windowApi.globalThis.scrollX,
      };
    }
    width($el, isShow = false) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if (CommonUtils$1.isWin($el)) return that.windowApi.window.document.documentElement.clientWidth;
      if ($el.nodeType === 9) {
        $el = $el;
        return Math.max(
          $el.body.scrollWidth,
          $el.documentElement.scrollWidth,
          $el.body.offsetWidth,
          $el.documentElement.offsetWidth,
          $el.documentElement.clientWidth
        );
      }
      if (isShow || (!isShow && CommonUtils$1.isShow($el))) {
        $el = $el;
        if (parseFloat(CommonUtils$1.getStyleValue($el, "width").toString()) > 0)
          return parseFloat(CommonUtils$1.getStyleValue($el, "width").toString());
        if ($el.offsetWidth > 0) {
          const borderLeftWidth = CommonUtils$1.getStyleValue($el, "borderLeftWidth");
          const borderRightWidth = CommonUtils$1.getStyleValue($el, "borderRightWidth");
          const paddingLeft = CommonUtils$1.getStyleValue($el, "paddingLeft");
          const paddingRight = CommonUtils$1.getStyleValue($el, "paddingRight");
          const backHeight =
            parseFloat($el.offsetWidth.toString()) -
            parseFloat(borderLeftWidth.toString()) -
            parseFloat(borderRightWidth.toString()) -
            parseFloat(paddingLeft.toString()) -
            parseFloat(paddingRight.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        $el = $el;
        const { recovery } = CommonUtils$1.forceShow($el);
        const width = that.width($el, true);
        recovery();
        return width;
      }
    }
    height($el, isShow = false) {
      const that = this;
      if (CommonUtils$1.isWin($el)) return that.windowApi.window.document.documentElement.clientHeight;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el.nodeType === 9) {
        $el = $el;
        return Math.max(
          $el.body.scrollHeight,
          $el.documentElement.scrollHeight,
          $el.body.offsetHeight,
          $el.documentElement.offsetHeight,
          $el.documentElement.clientHeight
        );
      }
      if (isShow || (!isShow && CommonUtils$1.isShow($el))) {
        $el = $el;
        if (parseFloat(CommonUtils$1.getStyleValue($el, "height").toString()) > 0)
          return parseFloat(CommonUtils$1.getStyleValue($el, "height").toString());
        if ($el.offsetHeight > 0) {
          const borderTopWidth = CommonUtils$1.getStyleValue($el, "borderTopWidth");
          const borderBottomWidth = CommonUtils$1.getStyleValue($el, "borderBottomWidth");
          const paddingTop = CommonUtils$1.getStyleValue($el, "paddingTop");
          const paddingBottom = CommonUtils$1.getStyleValue($el, "paddingBottom");
          const backHeight =
            parseFloat($el.offsetHeight.toString()) -
            parseFloat(borderTopWidth.toString()) -
            parseFloat(borderBottomWidth.toString()) -
            parseFloat(paddingTop.toString()) -
            parseFloat(paddingBottom.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        $el = $el;
        const { recovery } = CommonUtils$1.forceShow($el);
        const height = that.height($el, true);
        recovery();
        return height;
      }
    }
    outerWidth($el, isShow = false) {
      const that = this;
      if (CommonUtils$1.isWin($el)) return that.windowApi.window.innerWidth;
      if (typeof $el === "string") $el = that.selector($el);
      $el = $el;
      if (isShow || (!isShow && CommonUtils$1.isShow($el))) {
        const style = that.windowApi.globalThis.getComputedStyle($el, null);
        const marginLeft = CommonUtils$1.getStyleValue(style, "marginLeft");
        const marginRight = CommonUtils$1.getStyleValue(style, "marginRight");
        return $el.offsetWidth + marginLeft + marginRight;
      } else {
        const { recovery } = CommonUtils$1.forceShow($el);
        const outerWidth = that.outerWidth($el, true);
        recovery();
        return outerWidth;
      }
    }
    outerHeight($el, isShow = false) {
      const that = this;
      if (CommonUtils$1.isWin($el)) return that.windowApi.window.innerHeight;
      if (typeof $el === "string") $el = that.selector($el);
      $el = $el;
      if (isShow || (!isShow && CommonUtils$1.isShow($el))) {
        const style = that.windowApi.globalThis.getComputedStyle($el, null);
        const marginTop = CommonUtils$1.getStyleValue(style, "marginTop");
        const marginBottom = CommonUtils$1.getStyleValue(style, "marginBottom");
        return $el.offsetHeight + marginTop + marginBottom;
      } else {
        const { recovery } = CommonUtils$1.forceShow($el);
        const outerHeight = that.outerHeight($el, true);
        recovery();
        return outerHeight;
      }
    }
    replaceWith($el, $newEl) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.replaceWith($elItem, $newEl);
        });
        return;
      }
      if (typeof $newEl === "string") $newEl = that.toElement($newEl, false, false);
      const $parent = $el.parentElement;
      if ($parent) $parent.replaceChild($newEl, $el);
      else {
        that.after($el, $newEl);
        this.remove($el);
      }
    }
    wrap($el, wrapperHTML) {
      const that = this;
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        $el.forEach(($elItem) => {
          that.wrap($elItem, wrapperHTML);
        });
        return;
      }
      $el = $el;
      const $wrapper = that.windowApi.document.createElement("div");
      that.html($wrapper, wrapperHTML);
      const wrapperFirstChild = $wrapper.firstChild;
      $el.parentElement.insertBefore(wrapperFirstChild, $el);
      wrapperFirstChild.appendChild($el);
    }
    prev($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el == null) return;
      return $el.previousElementSibling;
    }
    next($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el == null) return;
      return $el.nextElementSibling;
    }
    siblings($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el == null) return;
      return Array.from($el.parentElement.children).filter(($child) => $child !== $el);
    }
    parent($el) {
      const that = this;
      if (typeof $el === "string") $el = that.selector($el);
      if ($el == null) return;
      if (CommonUtils$1.isNodeList($el)) {
        const resultArray = [];
        $el.forEach(($elItem) => {
          resultArray.push(that.parent($elItem));
        });
        return resultArray;
      } else return $el.parentElement;
    }
    toElement(html, useParser = false, isComplete = false) {
      const that = this;
      html = html.trim();
      function parseHTMLByDOMParser() {
        const parser = new DOMParser();
        if (isComplete) return parser.parseFromString(html, "text/html");
        else return parser.parseFromString(html, "text/html").body.firstChild;
      }
      function parseHTMLByCreateDom() {
        const $el = that.windowApi.document.createElement("div");
        that.html($el, html);
        if (isComplete) return $el;
        else return $el.firstElementChild ?? $el.firstChild;
      }
      if (useParser) return parseHTMLByDOMParser();
      else return parseHTMLByCreateDom();
    }
    toElements(html, useParser = false) {
      const that = this;
      html = html.trim();
      function parseHTMLByDOMParser() {
        const parser = new DOMParser();
        return Array.from(parser.parseFromString(html, "text/html").body.childNodes);
      }
      function parseHTMLByCreateDom() {
        const $el = that.windowApi.document.createElement("div");
        that.html($el, html);
        return Array.from($el.childNodes);
      }
      if (useParser) return parseHTMLByDOMParser();
      else return parseHTMLByCreateDom();
    }
    serialize($form) {
      if (!($form instanceof HTMLFormElement)) throw new TypeError("DOMUtils.serialize 参数必须是HTMLFormElement");
      const elements = $form.elements;
      const serializedArray = [];
      for (let index = 0; index < elements.length; index++) {
        const $el = elements[index];
        if (
          $el.name &&
          !$el.disabled &&
          ($el.checked ||
            ["text", "hidden", "password", "textarea", "select-one", "select-multiple"].includes($el.type))
        )
          if ($el.type === "select-multiple") {
            for (let j = 0; j < $el.options.length; j++)
              if ($el.options[j].selected)
                serializedArray.push({
                  name: $el.name,
                  value: $el.options[j].value,
                });
          } else
            serializedArray.push({
              name: $el.name,
              value: $el.value,
            });
      }
      return serializedArray
        .map((item) => `${encodeURIComponent(item.name)}=${encodeURIComponent(item.value)}`)
        .join("&");
    }
    createDOMUtils(option) {
      return new DOMUtils$1(option);
    }
    getTextBoundingRect($input, selectionStart, selectionEnd) {
      const that = this;
      if (!$input || !("value" in $input)) return $input;
      if (selectionStart == null) selectionStart = $input.selectionStart || 0;
      if (selectionEnd == null) selectionEnd = $input.selectionEnd || 0;
      if (typeof selectionStart == "string") selectionStart = parseFloat(selectionStart);
      if (typeof selectionStart != "number" || isNaN(selectionStart)) selectionStart = 0;
      if (selectionStart < 0) selectionStart = 0;
      else selectionStart = Math.min($input.value.length, selectionStart);
      if (typeof selectionEnd == "string") selectionEnd = parseFloat(selectionEnd);
      if (typeof selectionEnd != "number" || isNaN(selectionEnd) || selectionEnd < selectionStart)
        selectionEnd = selectionStart;
      if (selectionEnd < 0) selectionEnd = 0;
      else selectionEnd = Math.min($input.value.length, selectionEnd);
      if (typeof $input.createTextRange == "function") {
        const range = $input.createTextRange();
        range.collapse(true);
        range.moveStart("character", selectionStart);
        range.moveEnd("character", selectionEnd - selectionStart);
        return range.getBoundingClientRect();
      }
      const offset = getInputOffset(),
        width = getInputCSS("width", true),
        height = getInputCSS("height", true);
      let topPos = offset.top;
      let leftPos = offset.left;
      let cssDefaultStyles = "white-space:pre;padding:0;margin:0;";
      const listOfModifiers = [
        "direction",
        "font-family",
        "font-size",
        "font-size-adjust",
        "font-variant",
        "font-weight",
        "font-style",
        "letter-spacing",
        "line-height",
        "text-align",
        "text-indent",
        "text-transform",
        "word-wrap",
        "word-spacing",
      ];
      topPos += getInputCSS("padding-top", true);
      topPos += getInputCSS("border-top-width", true);
      leftPos += getInputCSS("padding-left", true);
      leftPos += getInputCSS("border-left-width", true);
      leftPos += 1;
      for (let index = 0; index < listOfModifiers.length; index++) {
        const property = listOfModifiers[index];
        cssDefaultStyles += property + ":" + getInputCSS(property, false) + ";";
      }
      const text = $input.value || "G",
        textLen = text.length,
        fakeClone = that.windowApi.document.createElement("div");
      if (selectionStart > 0) appendPart(0, selectionStart);
      const fakeRange = appendPart(selectionStart, selectionEnd);
      if (textLen > selectionEnd) appendPart(selectionEnd, textLen);
      fakeClone.style.cssText = cssDefaultStyles;
      fakeClone.style.position = "absolute";
      fakeClone.style.top = topPos + "px";
      fakeClone.style.left = leftPos + "px";
      fakeClone.style.width = width + "px";
      fakeClone.style.height = height + "px";
      that.windowApi.document.body.appendChild(fakeClone);
      const returnValue = fakeRange.getBoundingClientRect();
      fakeClone?.parentNode?.removeChild(fakeClone);
      return returnValue;
      function appendPart(start, end) {
        const span = that.windowApi.document.createElement("span");
        span.style.cssText = cssDefaultStyles;
        span.textContent = text.substring(start, end);
        fakeClone.appendChild(span);
        return span;
      }
      function getInputOffset() {
        const body = that.windowApi.document.body,
          win = that.windowApi.document.defaultView,
          docElem = that.windowApi.document.documentElement,
          $box = that.windowApi.document.createElement("div");
        $box.style.paddingLeft = $box.style.width = "1px";
        body.appendChild($box);
        const isBoxModel = $box.offsetWidth == 2;
        body.removeChild($box);
        const $boxRect = $input.getBoundingClientRect();
        const clientTop = docElem.clientTop || body.clientTop || 0,
          clientLeft = docElem.clientLeft || body.clientLeft || 0,
          scrollTop = win.pageYOffset || (isBoxModel && docElem.scrollTop) || body.scrollTop,
          scrollLeft = win.pageXOffset || (isBoxModel && docElem.scrollLeft) || body.scrollLeft;
        return {
          top: $boxRect.top + scrollTop - clientTop,
          left: $boxRect.left + scrollLeft - clientLeft,
        };
      }
      function getInputCSS(prop, isNumber) {
        const val = that.windowApi.document.defaultView.getComputedStyle($input, null).getPropertyValue(prop);
        if (isNumber) return parseFloat(val);
        else return val;
      }
    }
    addStyle(cssText) {
      if (typeof cssText !== "string") throw new Error("DOMUtils.addStyle 参数cssText 必须为String类型");
      const $css = this.createElement("style", {
        type: "text/css",
        innerHTML: cssText,
      });
      if (this.windowApi.document.head) this.windowApi.document.head.appendChild($css);
      else if (this.windowApi.document.documentElement.childNodes.length === 0)
        this.windowApi.document.documentElement.appendChild($css);
      else
        this.windowApi.document.documentElement.insertBefore(
          $css,
          this.windowApi.document.documentElement.childNodes[0]
        );
      return $css;
    }
    checkUserClickInNode($el) {
      const that = this;
      if (!CommonUtils$1.isDOM($el))
        throw new Error("DOMUtils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
      const clickEvent = that.windowApi.window.event;
      const touchEvent = that.windowApi.window.event;
      const $click = clickEvent?.composedPath()?.[0];
      const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
      const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
      const {
        left: elementPosXLeft,
        right: elementPosXRight,
        top: elementPosYTop,
        bottom: elementPosYBottom,
      } = $el.getBoundingClientRect();
      if (
        clickPosX >= elementPosXLeft &&
        clickPosX <= elementPosXRight &&
        clickPosY >= elementPosYTop &&
        clickPosY <= elementPosYBottom
      )
        return true;
      else if (($click && $el.contains($click)) || $click == $el) return true;
      else return false;
    }
    deleteParentNode($el, parentSelector) {
      if ($el == null) return;
      if (!CommonUtils$1.isDOM($el))
        throw new Error("DOMUtils.deleteParentNode 参数 target 必须为 Node|HTMLElement 类型");
      if (typeof parentSelector !== "string")
        throw new Error("DOMUtils.deleteParentNode 参数 targetSelector 必须为 string 类型");
      let result = false;
      const $parent = domUtils$2.closest($el, parentSelector);
      if ($parent) {
        this.remove($parent);
        result = true;
      }
      return result;
    }
    *findElementsWithText($el, text, filter) {
      const that = this;
      if ($el.outerHTML.includes(text))
        if ($el.children.length === 0) {
          if (!(typeof filter === "function" ? filter($el) : false)) yield $el;
        } else {
          const $text = Array.from($el.childNodes).filter(($child) => $child.nodeType === Node.TEXT_NODE);
          for (const $child of $text)
            if ($child.textContent.includes(text)) {
              if (!(typeof filter === "function" ? filter($el) : false)) yield $child;
            }
        }
      for (let index = 0; index < $el.children.length; index++) {
        const $child = $el.children[index];
        yield* that.findElementsWithText($child, text, filter);
      }
    }
    findVisibleElement($el) {
      let $current = $el;
      while ($current) {
        if ($current.getBoundingClientRect().length) return $current;
        $current = $current.parentElement;
      }
      return null;
    }
    setElementSelection($el, childTextNode, startIndex, endIndex) {
      const range = this.windowApi.document.createRange();
      range.selectNodeContents($el);
      if (childTextNode) {
        if (childTextNode.nodeType !== Node.TEXT_NODE) throw new TypeError("childTextNode必须是#text元素");
        if (startIndex != null && endIndex != null) {
          range.setStart(childTextNode, startIndex);
          range.setEnd(childTextNode, endIndex);
        }
      }
      const selection = this.windowApi.globalThis.getSelection();
      if (selection) {
        selection.removeAllRanges();
        selection.addRange(range);
      }
    }
  })();
  var version$1 = "4.2.8";
  var GlobalConfig = {
    config: {},
    setGlobalConfig(config) {
      Reflect.ownKeys(config).forEach((keyName) => {
        Reflect.set(GlobalConfig.config, keyName, Reflect.get(config, keyName));
      });
    },
    getGlobalConfig() {
      const result = {};
      Object.keys(GlobalConfig.config).forEach((keyName) => {
        const configValue = Reflect.get(GlobalConfig.config, keyName);
        if (keyName === "style") {
          const style = configValue == null ? "" : typeof configValue === "function" ? configValue() : configValue;
          if (typeof style === "string") result.style = style;
        } else if (keyName === "zIndex")
          result.zIndex = () => {
            let zIndex = configValue == null ? "" : typeof configValue === "function" ? configValue() : configValue;
            if (typeof zIndex === "string") {
              const newIndex = (zIndex = Number(zIndex));
              if (!Number.isNaN(newIndex)) return newIndex;
            } else if (!Number.isNaN(zIndex)) return zIndex;
            return 0;
          };
        else if (keyName === "mask") {
          const mask = GlobalConfig.config.mask == null ? {} : GlobalConfig.config.mask;
          if (typeof mask === "object" && mask != null) result.mask = mask;
        } else Reflect.set(result, keyName, configValue);
      });
      return result;
    },
  };
  var EventEmiter = class {
    [Symbol.toStringTag] = "EventEmiter";
    type;
    data = new Map();
    constructor(type) {
      this.type = type;
    }
    on(eventName, callback) {
      const eventList = this.data.get(eventName) ?? [];
      eventList.push({
        type: this.type,
        time: Date.now(),
        callback,
      });
      this.data.set(eventName, eventList);
      return {
        off: () => {
          this.off(eventName, callback);
        },
        emit: (...args) => {
          this.emit(eventName, ...args);
        },
      };
    }
    off(eventName, callback) {
      const eventList = this.data.get(eventName) ?? [];
      let isOffSuccess = false;
      for (let index = eventList.length - 1; index >= 0; index--)
        if (eventList[index].callback === callback) {
          isOffSuccess = true;
          eventList.splice(index, 1);
        }
      if (eventList.length === 0) this.data.delete(eventName);
      else if (isOffSuccess) this.data.set(eventName, eventList);
    }
    async emit(eventName, ...args) {
      const eventList = this.data.get(eventName) ?? [];
      for (const item of eventList) await item.callback(...args);
    }
    offAll(eventName) {
      if (typeof eventName === "string") this.data.delete(eventName);
      else this.data.clear();
    }
    getAllEvents(eventName) {
      if (typeof eventName === "string") return this.data.get(eventName);
      else return Array.from(this.data.values());
    }
  };
  var PopsIcon = {
    $data: {
      min: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="min">\r\n  <path fill="currentColor" d="M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64z"></path>\r\n</svg>\r\n',
      mise: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="mise">\r\n  <path\r\n    fill="currentColor"\r\n    d="M885.333333 85.333333H330.410667a53.333333 53.333333 0 0 0-53.333334 53.333334v106.666666H138.666667A53.333333 53.333333 0 0 0 85.333333 298.666667v586.666666a53.333333 53.333333 0 0 0 53.333334 53.333334H725.333333a53.333333 53.333333 0 0 0 53.333334-53.333334V746.154667h106.666666c29.44 0 53.333333-23.893333 53.333334-53.333334V138.666667A53.333333 53.333333 0 0 0 885.333333 85.333333zM725.333333 692.821333v192.512H138.666667V298.666667H725.333333v394.154666z m157.866667 0H778.666667V298.666667a53.333333 53.333333 0 0 0-53.333334-53.333334H330.410667v-106.666666h554.922666l-2.133333 554.154666z"></path>\r\n</svg>\r\n',
      max: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="max">\r\n  <path\r\n    fill="currentColor"\r\n    d="m160 96.064 192 .192a32 32 0 0 1 0 64l-192-.192V352a32 32 0 0 1-64 0V96h64v.064zm0 831.872V928H96V672a32 32 0 1 1 64 0v191.936l192-.192a32 32 0 1 1 0 64l-192 .192zM864 96.064V96h64v256a32 32 0 1 1-64 0V160.064l-192 .192a32 32 0 1 1 0-64l192-.192zm0 831.872-192-.192a32 32 0 0 1 0-64l192 .192V672a32 32 0 1 1 64 0v256h-64v-.064z"></path>\r\n</svg>\r\n',
      close:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="close">\r\n	<path\r\n		fill="currentColor"\r\n		d="M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"></path>\r\n</svg>\r\n',
      edit: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="edit">\r\n  <path\r\n    fill="currentColor"\r\n    d="M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z"></path>\r\n  <path\r\n    fill="currentColor"\r\n    d="m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z"></path>\r\n</svg>\r\n',
      share:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="share">\r\n  <path\r\n    fill="currentColor"\r\n    d="m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z"></path>\r\n</svg>\r\n',
      delete:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="delete">\r\n  <path\r\n    fill="currentColor"\r\n    d="M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z"></path>\r\n</svg>\r\n',
      search:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="search">\r\n  <path\r\n    fill="currentColor"\r\n    d="m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704z"></path>\r\n</svg>\r\n',
      upload:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="upload">\r\n  <path\r\n    fill="currentColor"\r\n    d="M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64zm384-578.304V704h-64V247.296L237.248 490.048 192 444.8 508.8 128l316.8 316.8-45.312 45.248L544 253.696z"></path>\r\n</svg>\r\n',
      loading:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="loading">\r\n  <path\r\n    fill="currentColor"\r\n    d="M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"></path>\r\n</svg>\r\n',
      next: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="next">\r\n  <path\r\n    fill="currentColor"\r\n    d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n',
      prev: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="prev">\r\n  <path\r\n    fill="currentColor"\r\n    d="M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n',
      eleme:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="eleme">\r\n  <path\r\n    fill="currentColor"\r\n    d="M300.032 188.8c174.72-113.28 408-63.36 522.24 109.44 5.76 10.56 11.52 20.16 17.28 30.72v.96a22.4 22.4 0 0 1-7.68 26.88l-352.32 228.48c-9.6 6.72-22.08 3.84-28.8-5.76l-18.24-27.84a54.336 54.336 0 0 1 16.32-74.88l225.6-146.88c9.6-6.72 12.48-19.2 5.76-28.8-.96-1.92-1.92-3.84-3.84-4.8a267.84 267.84 0 0 0-315.84-17.28c-123.84 81.6-159.36 247.68-78.72 371.52a268.096 268.096 0 0 0 370.56 78.72 54.336 54.336 0 0 1 74.88 16.32l17.28 26.88c5.76 9.6 3.84 21.12-4.8 27.84-8.64 7.68-18.24 14.4-28.8 21.12a377.92 377.92 0 0 1-522.24-110.4c-113.28-174.72-63.36-408 111.36-522.24zm526.08 305.28a22.336 22.336 0 0 1 28.8 5.76l23.04 35.52a63.232 63.232 0 0 1-18.24 87.36l-35.52 23.04c-9.6 6.72-22.08 3.84-28.8-5.76l-46.08-71.04c-6.72-9.6-3.84-22.08 5.76-28.8l71.04-46.08z"></path>\r\n</svg>\r\n',
      elemePlus:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="elemePlus">\r\n  <path\r\n    d="M839.7 734.7c0 33.3-17.9 41-17.9 41S519.7 949.8 499.2 960c-10.2 5.1-20.5 5.1-30.7 0 0 0-314.9-184.3-325.1-192-5.1-5.1-10.2-12.8-12.8-20.5V368.6c0-17.9 20.5-28.2 20.5-28.2L466 158.6c12.8-5.1 25.6-5.1 38.4 0 0 0 279 161.3 309.8 179.2 17.9 7.7 28.2 25.6 25.6 46.1-.1-5-.1 317.5-.1 350.8zM714.2 371.2c-64-35.8-217.6-125.4-217.6-125.4-7.7-5.1-20.5-5.1-30.7 0L217.6 389.1s-17.9 10.2-17.9 23v297c0 5.1 5.1 12.8 7.7 17.9 7.7 5.1 256 148.5 256 148.5 7.7 5.1 17.9 5.1 25.6 0 15.4-7.7 250.9-145.9 250.9-145.9s12.8-5.1 12.8-30.7v-74.2l-276.5 169v-64c0-17.9 7.7-30.7 20.5-46.1L745 535c5.1-7.7 10.2-20.5 10.2-30.7v-66.6l-279 169v-69.1c0-15.4 5.1-30.7 17.9-38.4l220.1-128zM919 135.7c0-5.1-5.1-7.7-7.7-7.7h-58.9V66.6c0-5.1-5.1-5.1-10.2-5.1l-30.7 5.1c-5.1 0-5.1 2.6-5.1 5.1V128h-56.3c-5.1 0-5.1 5.1-7.7 5.1v38.4h69.1v64c0 5.1 5.1 5.1 10.2 5.1l30.7-5.1c5.1 0 5.1-2.6 5.1-5.1v-56.3h64l-2.5-38.4z"\r\n    fill="currentColor"></path>\r\n</svg>\r\n',
      chromeFilled:
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" xml:space="preserve" data-type="chromeFilled">\r\n	<path\r\n		d="M938.67 512.01c0-44.59-6.82-87.6-19.54-128H682.67a212.372 212.372 0 0 1 42.67 128c.06 38.71-10.45 76.7-30.42 109.87l-182.91 316.8c235.65-.01 426.66-191.02 426.66-426.67z"\r\n		fill="currentColor"></path>\r\n	<path\r\n		d="M576.79 401.63a127.92 127.92 0 0 0-63.56-17.6c-22.36-.22-44.39 5.43-63.89 16.38s-35.79 26.82-47.25 46.02a128.005 128.005 0 0 0-2.16 127.44l1.24 2.13a127.906 127.906 0 0 0 46.36 46.61 127.907 127.907 0 0 0 63.38 17.44c22.29.2 44.24-5.43 63.68-16.33a127.94 127.94 0 0 0 47.16-45.79v-.01l1.11-1.92a127.984 127.984 0 0 0 .29-127.46 127.957 127.957 0 0 0-46.36-46.91z"\r\n		fill="currentColor"></path>\r\n	<path\r\n		d="M394.45 333.96A213.336 213.336 0 0 1 512 298.67h369.58A426.503 426.503 0 0 0 512 85.34a425.598 425.598 0 0 0-171.74 35.98 425.644 425.644 0 0 0-142.62 102.22l118.14 204.63a213.397 213.397 0 0 1 78.67-94.21zM512.01 938.68H512zM414.76 701.95a213.284 213.284 0 0 1-89.54-86.81L142.48 298.6c-36.35 62.81-57.13 135.68-57.13 213.42 0 203.81 142.93 374.22 333.95 416.55h.04l118.19-204.71a213.315 213.315 0 0 1-122.77-21.91z"\r\n		fill="currentColor"></path>\r\n</svg>\r\n',
      cpu: '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="cpu">\r\n  <path\r\n    fill="currentColor"\r\n    d="M320 256a64 64 0 0 0-64 64v384a64 64 0 0 0 64 64h384a64 64 0 0 0 64-64V320a64 64 0 0 0-64-64H320zm0-64h384a128 128 0 0 1 128 128v384a128 128 0 0 1-128 128H320a128 128 0 0 1-128-128V320a128 128 0 0 1 128-128z"></path>\r\n  <path\r\n    fill="currentColor"\r\n    d="M512 64a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm160 0a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm-320 0a32 32 0 0 1 32 32v128h-64V96a32 32 0 0 1 32-32zm160 896a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zm160 0a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zm-320 0a32 32 0 0 1-32-32V800h64v128a32 32 0 0 1-32 32zM64 512a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm0-160a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm0 320a32 32 0 0 1 32-32h128v64H96a32 32 0 0 1-32-32zm896-160a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32zm0-160a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32zm0 320a32 32 0 0 1-32 32H800v-64h128a32 32 0 0 1 32 32z"></path>\r\n</svg>\r\n',
      videoPlay:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="videoPlay">\r\n  <path\r\n    fill="currentColor"\r\n    d="M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 832a384 384 0 0 0 0-768 384 384 0 0 0 0 768zm-48-247.616L668.608 512 464 375.616v272.768zm10.624-342.656 249.472 166.336a48 48 0 0 1 0 79.872L474.624 718.272A48 48 0 0 1 400 678.336V345.6a48 48 0 0 1 74.624-39.936z"></path>\r\n</svg>\r\n',
      videoPause:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="videoPause">\r\n  <path\r\n    fill="currentColor"\r\n    d="M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 832a384 384 0 0 0 0-768 384 384 0 0 0 0 768zm-96-544q32 0 32 32v256q0 32-32 32t-32-32V384q0-32 32-32zm192 0q32 0 32 32v256q0 32-32 32t-32-32V384q0-32 32-32z"></path>\r\n</svg>\r\n',
      headset:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="headset">\r\n  <path\r\n    fill="currentColor"\r\n    d="M896 529.152V512a384 384 0 1 0-768 0v17.152A128 128 0 0 1 320 640v128a128 128 0 1 1-256 0V512a448 448 0 1 1 896 0v256a128 128 0 1 1-256 0V640a128 128 0 0 1 192-110.848zM896 640a64 64 0 0 0-128 0v128a64 64 0 0 0 128 0V640zm-768 0v128a64 64 0 0 0 128 0V640a64 64 0 1 0-128 0z"></path>\r\n</svg>\r\n',
      monitor:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="monitor">\r\n  <path\r\n    fill="currentColor"\r\n    d="M544 768v128h192a32 32 0 1 1 0 64H288a32 32 0 1 1 0-64h192V768H192A128 128 0 0 1 64 640V256a128 128 0 0 1 128-128h640a128 128 0 0 1 128 128v384a128 128 0 0 1-128 128H544zM192 192a64 64 0 0 0-64 64v384a64 64 0 0 0 64 64h640a64 64 0 0 0 64-64V256a64 64 0 0 0-64-64H192z"></path>\r\n</svg>\r\n',
      documentCopy:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="documentCopy">\r\n  <path\r\n    fill="currentColor"\r\n    d="M128 320v576h576V320H128zm-32-64h640a32 32 0 0 1 32 32v640a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V288a32 32 0 0 1 32-32zM960 96v704a32 32 0 0 1-32 32h-96v-64h64V128H384v64h-64V96a32 32 0 0 1 32-32h576a32 32 0 0 1 32 32zM256 672h320v64H256v-64zm0-192h320v64H256v-64z"></path>\r\n</svg>\r\n',
      picture:
        '<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" data-type="picture">\r\n  <path\r\n    fill="currentColor"\r\n    d="M160 160v704h704V160H160zm-32-64h768a32 32 0 0 1 32 32v768a32 32 0 0 1-32 32H128a32 32 0 0 1-32-32V128a32 32 0 0 1 32-32z"></path>\r\n  <path\r\n    fill="currentColor"\r\n    d="M384 288q64 0 64 64t-64 64q-64 0-64-64t64-64zM185.408 876.992l-50.816-38.912L350.72 556.032a96 96 0 0 1 134.592-17.856l1.856 1.472 122.88 99.136a32 32 0 0 0 44.992-4.864l216-269.888 49.92 39.936-215.808 269.824-.256.32a96 96 0 0 1-135.04 14.464l-122.88-99.072-.64-.512a32 32 0 0 0-44.8 5.952L185.408 876.992z"></path>\r\n</svg>\r\n',
      circleClose:
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="circleClose">\r\n	<path\r\n		fill="currentColor"\r\n		d="m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z"></path>\r\n	<path\r\n		fill="currentColor"\r\n		d="M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"></path>\r\n</svg>\r\n',
      view: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="view">\r\n  <path\r\n    fill="currentColor"\r\n    d="M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.192 160.192 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160"></path>\r\n</svg>\r\n',
      hide: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="hide">\r\n  <path\r\n    fill="currentColor"\r\n    d="M876.8 156.8c0-9.6-3.2-16-9.6-22.4-6.4-6.4-12.8-9.6-22.4-9.6-9.6 0-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176C44.8 438.4 0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4 6.4 6.4 12.8 9.6 22.4 9.6 9.6 0 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4Zm-646.4 528c-76.8-70.4-128-128-153.6-172.8 28.8-48 80-105.6 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4Zm140.8-96c-12.8-22.4-19.2-48-19.2-76.8 0-44.8 16-83.2 48-112 32-28.8 67.2-48 112-48 28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6-28.8 48-80 105.6-153.6 172.8-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176C979.199 585.6 1024 528 1024 512s-48.001-73.6-134.401-176Z"></path>\r\n  <path\r\n    fill="currentColor"\r\n    d="M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112-32 28.8-67.2 48-112 48Z"></path>\r\n</svg>\r\n',
      keyboard:
        '<svg viewBox="0 0 1123 1024" xmlns="http://www.w3.org/2000/svg" data-type="keyboard">\r\n  <path\r\n    d="M1014.122186 1024H109.753483A109.753483 109.753483 0 0 1 0 914.246517V392.917471a109.753483 109.753483 0 0 1 109.753483-109.753484h904.368703a109.753483 109.753483 0 0 1 109.753484 109.753484v521.329046a109.753483 109.753483 0 0 1-109.753484 109.753483zM109.753483 370.966774a21.950697 21.950697 0 0 0-21.950696 21.950697v521.329046a21.950697 21.950697 0 0 0 21.950696 21.950696h904.368703a21.950697 21.950697 0 0 0 21.950697-21.950696V392.917471a21.950697 21.950697 0 0 0-21.950697-21.950697z"></path>\r\n  <path\r\n    d="M687.056806 891.198285H307.309753a43.901393 43.901393 0 0 1 0-87.802787h379.747053a43.901393 43.901393 0 0 1 0 87.802787zM175.605573 803.395498a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM432.428725 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM690.349411 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM947.172562 414.868167a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM175.605573 546.572347a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM304.017149 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM432.428725 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM690.349411 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 546.572347a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM818.760986 803.395498a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM175.605573 678.276527a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394zM304.017149 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM432.428725 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM561.937835 678.276527a43.901393 43.901393 0 1 0 43.901393 43.901394 43.901393 43.901393 0 0 0-43.901393-43.901394zM948.270096 803.395498a43.901393 43.901393 0 1 0 43.901394 43.901394 43.901393 43.901393 0 0 0-43.901394-43.901394z"></path>\r\n  <path\r\n    d="M881.320472 766.079314H689.251876a43.901393 43.901393 0 0 1 0-87.802787h192.068596a21.950697 21.950697 0 0 0 21.950696-21.950696v-65.85209a43.901393 43.901393 0 0 1 87.802787 0v65.85209a109.753483 109.753483 0 0 1-109.753483 109.753483zM305.114684 502.670954H175.605573a43.901393 43.901393 0 0 1 0-87.802787h129.509111a43.901393 43.901393 0 0 1 0 87.802787zM563.03537 365.4791a43.901393 43.901393 0 0 1-43.901394-43.901394v-105.363344A109.753483 109.753483 0 0 1 628.88746 106.460879h61.461951a21.950697 21.950697 0 0 0 21.950696-21.950697V43.901393a43.901393 43.901393 0 0 1 87.802787 0v40.608789a109.753483 109.753483 0 0 1-109.753483 109.753484h-61.461951a21.950697 21.950697 0 0 0-21.950697 21.950696v105.363344a43.901393 43.901393 0 0 1-43.901393 43.901394z"></path>\r\n</svg>\r\n',
      arrowRight:
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="arrowRight">\r\n	<path\r\n		d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n',
      arrowLeft:
        '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" data-type="arrowLeft">\r\n	<path\r\n		d="M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"></path>\r\n</svg>\r\n',
    },
    hasIcon(iconName) {
      return Object.keys(PopsIcon.$data).includes(iconName);
    },
    getIcon(iconName) {
      return PopsIcon.$data[iconName];
    },
    deleteIcon(iconName) {
      return Reflect.deleteProperty(PopsIcon.$data, iconName);
    },
    setIcon(iconName, iconHTML) {
      Reflect.set(PopsIcon.$data, iconName, iconHTML);
    },
  };
  var PopsCommonCSSClassName = {
    flexCenter: "pops-flex-items-center",
    flexYCenter: "pops-flex-y-center",
    flexXCenter: "pops-flex-x-center",
    hide: "pops-hide",
    hideImportant: "pops-hide-important",
    noBorder: "pops-no-border",
    noBorderImportant: "pops-no-border-important",
    userSelectNone: "pops-user-select-none",
    lineHeightCenter: "pops-line-height-center",
    widthFill: "pops-width-fill",
    textIsDisabled: "pops-text-is-disabled",
    textIsDisabledImportant: "pops-text-is-disabled-important",
  };
  var OriginPrototype$1 = {
    Object: {
      defineProperty: Object.defineProperty,
      defineProperties: Object.defineProperties,
    },
  };
  var PopsCoreDefaultApi = {
    document,
    window,
    globalThis,
    self,
    setTimeout: globalThis.setTimeout.bind(globalThis),
    setInterval: globalThis.setInterval.bind(globalThis),
    clearTimeout: globalThis.clearTimeout.bind(globalThis),
    clearInterval: globalThis.clearInterval.bind(globalThis),
  };
  var PopsCoreApi = Object.assign({}, PopsCoreDefaultApi);
  var PopsCore = {
    init(option) {
      if (!option) option = Object.assign({}, PopsCoreDefaultApi);
      Object.assign(PopsCoreApi, option);
    },
    get document() {
      return PopsCoreApi.document;
    },
    get window() {
      return PopsCoreApi.window;
    },
    get globalThis() {
      return PopsCoreApi.globalThis;
    },
    get self() {
      return PopsCoreApi.self;
    },
    get setTimeout() {
      return PopsCoreApi.setTimeout;
    },
    get setInterval() {
      return PopsCoreApi.setInterval;
    },
    get clearTimeout() {
      return PopsCoreApi.clearTimeout;
    },
    get clearInterval() {
      return PopsCoreApi.clearInterval;
    },
  };
  var PopsSafeUtils = {
    getSafeHTML(text) {
      if (window.trustedTypes)
        return window.trustedTypes.createPolicy("safe-innerHTML", { createHTML: (html) => html }).createHTML(text);
      else return text;
    },
    setSafeHTML($el, text) {
      $el.innerHTML = this.getSafeHTML(text);
    },
  };
  var n$1 = "clientX",
    e$2 = "clientY",
    t$1 = 16,
    c$3 = "start",
    o$1 = "move",
    s$1 = "cancel",
    u$3 = "end",
    a$2 = "left",
    i$3 = "right",
    r$4 = "up",
    d$1 = "down",
    m$2 = {
      4: "start",
      5: "move",
      1: "end",
      3: "cancel",
    };
  function v$1(n) {
    return m$2[n];
  }
  function b(n, e, t) {
    const c = {
      1: {
        0: { move: 4 },
        4: {
          move: 5,
          end: 1,
          cancel: 3,
        },
        5: {
          move: 5,
          end: 1,
          cancel: 3,
        },
      },
      0: {
        4: {
          move: 2,
          end: 1,
          cancel: 3,
        },
        5: {
          start: 2,
          move: 2,
          end: 1,
          cancel: 3,
        },
      },
    }[Number(n)][e];
    return (void 0 !== c && c[t]) || 0;
  }
  function g$1(n) {
    [1, 3, 2].includes(n.state) && (n.state = 0);
  }
  function h$3(n) {
    return [5, 1, 3].includes(n);
  }
  function j(n) {
    if (n.disabled) return ((n.state = 0), true);
  }
  function O(n, e) {
    return Object.assign(Object.assign(Object.assign({}, n), e), {
      state: 0,
      disabled: false,
    });
  }
  function p$3(n) {
    return Math.round(100 * n) / 100;
  }
  var x = (r) => Math.sqrt(r.x * r.x + r.y * r.y),
    y = (r, a) => r.x * a.x + r.y * a.y,
    e$1 = (r, a) => {
      var t = x(r) * x(a);
      if (0 === t) return 0;
      var h = y(r, a) / t;
      return (h > 1 && (h = 1), Math.acos(h));
    },
    n = (r, a) => r.x * a.y - a.x * r.y,
    o = (r) => (r / Math.PI) * 180,
    s = (r, a) => {
      var t = e$1(r, a);
      return (n(r, a) > 0 && (t *= -1), o(t));
    },
    u$2 = (x, y) => {
      if (0 !== x || 0 !== y) return Math.abs(x) >= Math.abs(y) ? (0 < x ? i$3 : a$2) : 0 < y ? d$1 : r$4;
    };
  function p$2() {
    let n = 0,
      e = 0;
    return function (o, r) {
      const { prevVecotr: i, startVecotr: a, activeVecotr: c } = r;
      return (
        c && ((e = Math.round(s(c, i))), (n = Math.round(s(c, a)))),
        {
          angle: n,
          deltaAngle: e,
        }
      );
    };
  }
  function d() {
    return function (t) {
      const { prevInput: e } = t;
      let o$1 = 0,
        r = 0,
        i = 0;
      if (void 0 !== e && ((o$1 = t.x - e.x), (r = t.y - e.y), 0 !== o$1 || 0 !== r)) {
        const t = Math.sqrt(Math.pow(o$1, 2) + Math.pow(r, 2));
        i = Math.round(o(Math.acos(Math.abs(o$1) / t)));
      }
      return {
        deltaX: o$1,
        deltaY: r,
        deltaXYAngle: i,
      };
    };
  }
  function h$2() {
    let t,
      n = 0,
      u = 0,
      s = 0,
      p = 0,
      d = 0;
    return function (h) {
      const { phase: l, startInput: f } = h;
      return (
        c$3 === l
          ? ((n = 0), (u = 0), (s = 0), (p = 0), (d = 0))
          : o$1 === l &&
            ((n = Math.round(h.points[0][n$1] - f.points[0][n$1])),
            (u = Math.round(h.points[0][e$2] - f.points[0][e$2])),
            (s = Math.abs(n)),
            (p = Math.abs(u)),
            (d = Math.round(
              x({
                x: s,
                y: p,
              })
            )),
            (t = u$2(n, u))),
        {
          displacementX: n,
          displacementY: u,
          distanceX: s,
          distanceY: p,
          distance: d,
          overallDirection: t,
        }
      );
    };
  }
  function l$1() {
    let t = 1;
    return function (n, o) {
      let r = 1;
      const { prevVecotr: i, startVecotr: a, activeVecotr: c } = o;
      return (
        c && ((r = p$3(x(c) / x(i))), (t = p$3(x(c) / x(a)))),
        {
          scale: t,
          deltaScale: r,
        }
      );
    };
  }
  function f() {
    let t,
      n,
      e = 0,
      r = 0,
      i = 0,
      a = 0;
    return function (c) {
      if (void 0 !== c) {
        n = n || c.startInput;
        const u = c.timestamp - n.timestamp;
        if (t$1 < u) {
          const s = c.x - n.x,
            p = c.y - n.y;
          ((i = Math.round((s / u) * 100) / 100),
            (a = Math.round((p / u) * 100) / 100),
            (e = Math.abs(i)),
            (r = Math.abs(a)),
            (t = u$2(s, p)),
            (n = c));
        }
      }
      return {
        velocityX: e,
        velocityY: r,
        speedX: i,
        speedY: a,
        direction: t,
      };
    };
  }
  function M() {
    let t = 0;
    return function (n) {
      const { phase: e } = n;
      return (c$3 === e && (t = n.pointLength), { maxPointLength: t });
    };
  }
  function v(t) {
    return {
      x: t.points[1][n$1] - t.points[0][n$1],
      y: t.points[1][e$2] - t.points[0][e$2],
    };
  }
  function m$1() {
    let t, n, e;
    return function (o) {
      const { prevInput: r, startMultiInput: i } = o;
      return (
        void 0 !== i && void 0 !== r && o.id !== i.id && 1 < r.pointLength && 1 < o.pointLength
          ? ((t = v(i)), (n = v(r)), (e = v(o)))
          : (e = void 0),
        {
          startVecotr: t,
          prevVecotr: n,
          activeVecotr: e,
        }
      );
    };
  }
  var m = {
    name: "tap",
    pointLength: 1,
    tapTimes: 1,
    waitNextTapTime: 300,
    maxDistance: 2,
    maxDistanceFromPrevTap: 9,
    maxPressTime: 250,
  };
  function r$3(r, s) {
    const c = O(m, s);
    let p,
      u,
      x$1,
      T = 0;
    function f() {
      ((T = 0), (p = void 0), (u = void 0));
    }
    return (
      r.compute([h$2, M], (t) => {
        if (j(c)) return;
        const { phase: i, x: o, y: m } = t;
        u$3 === i &&
          ((c.state = 0),
          !(function () {
            const { startInput: e, pointLength: n, timestamp: a } = t,
              i = a - e.timestamp,
              { distance: o, maxPointLength: m } = t;
            return m === c.pointLength && 0 === n && c.maxDistance >= o && c.maxPressTime > i;
          })()
            ? (f(), (c.state = 2))
            : (clearTimeout(x$1),
              (function (t, e) {
                if (void 0 !== p) {
                  const n = x({
                    x: t.x - p.x,
                    y: t.y - p.y,
                  });
                  return ((p = t), e.maxDistanceFromPrevTap >= n);
                }
                return ((p = t), true);
              })(
                {
                  x: o,
                  y: m,
                },
                c
              ) &&
              (function (t) {
                const e = performance.now();
                if (void 0 === u) return ((u = e), true);
                {
                  const n = e - u;
                  return ((u = e), n < t);
                }
              })(c.waitNextTapTime)
                ? T++
                : (T = 1),
              0 == T % c.tapTimes
                ? ((c.state = 1), r.emit2(c.name, t, c), f())
                : (x$1 = setTimeout(
                    () => {
                      ((c.state = 2), f());
                    },
                    c.waitNextTapTime
                  ))));
      }),
      c
    );
  }
  function e(e) {
    e.use(r$3, {
      name: "doubletap",
      tapTimes: 2,
    });
    const a = e.get("doubletap");
    let o;
    return (
      e.beforeEach((t, e) => {
        "tap" === t
          ? (clearTimeout(o),
            (o = setTimeout(
              () => {
                [0, 2].includes(a.state) && e();
              },
              300
            )))
          : e();
      }),
      a
    );
  }
  var t = class {
    constructor() {
      this.__map = {};
    }
    beforeEach(t) {
      this.__interceptor = t;
    }
    on(t, i) {
      const s = Array.isArray(t) ? t : [t];
      for (const t of s) {
        this.__map[t] = this.__map[t] || [];
        const s = this.__map[t];
        s && s.push(i);
      }
      return this;
    }
    emit(t, i, s) {
      void 0 !== this.__interceptor
        ? this.__interceptor(t, () => {
            (this.__emit(t, i), s && s());
          })
        : (this.__emit(t, i), s && s());
    }
    __emit(t, i) {
      const s = this.__map[t];
      if (Array.isArray(s) && (null == s ? void 0 : s.length)) for (const _ of s) _(i, t);
      this.event = i;
    }
    off(t, i) {
      const s = this.__map[t];
      if (void 0 !== s)
        if (void 0 === i) delete this.__map[t];
        else {
          const t = s.findIndex((t) => t === i);
          s.splice(t, 1);
        }
    }
    destroy() {
      this.__map = {};
    }
  };
  function r$2() {
    let t,
      o,
      i,
      r,
      a = 0;
    return function (u) {
      if (((t = o), void 0 !== u)) {
        a = Number.MAX_SAFE_INTEGER > a ? ++a : 1;
        const h = (function (t, o) {
          const { phase: i, points: r, changedPoints: a, nativeEvent: u } = t,
            h = r.length,
            p = c$3 === i,
            g = (u$3 === i && 0 === h) || s$1 === i,
            l = Date.now(),
            { x: d, y: m } = c$2(r) || c$2(a),
            { currentTarget: v } = u;
          return Object.assign(t, {
            id: o,
            x: d,
            y: m,
            timestamp: l,
            isStart: p,
            isEnd: g,
            pointLength: h,
            currentTarget: v,
            getOffset(t = v) {
              const e = t.getBoundingClientRect();
              return {
                x: d - Math.round(e.left),
                y: m - Math.round(e.top),
              };
            },
          });
        })(u, a);
        o = h;
        const { isStart: p, pointLength: g } = h;
        return (
          p && ((i = h), (t = void 0), (r = 1 < g ? h : void 0)),
          Object.assign(Object.assign({}, h), {
            prevInput: t,
            startMultiInput: r,
            startInput: i,
          })
        );
      }
    };
  }
  function c$2(t) {
    const { length: e } = t;
    if (0 < e) {
      if (1 === e) {
        const { clientX: e, clientY: n } = t[0];
        return {
          x: Math.round(e),
          y: Math.round(n),
        };
      }
      const n = t.reduce((t, e) => ((t.x += e[n$1]), (t.y += e[e$2]), t), {
        x: 0,
        y: 0,
      });
      return {
        x: Math.round(n.x / e),
        y: Math.round(n.y / e),
      };
    }
  }
  function a$1(t, e, n, s) {
    const o = {};
    for (const t in n) ["target", "currentTarget", "type"].includes(t) || (o[t] = n[t]);
    let i;
    return (
      document.createEvent
        ? ((i = document.createEvent("HTMLEvents")),
          i.initEvent(t, null == s ? void 0 : s.bubbles, null == s ? void 0 : s.cancelable))
        : (i = new Event(t, s)),
      Object.assign(i, o, {
        match: () => n.targets && 0 < n.targets.length && n.targets.every((t) => i.currentTarget.contains(t)),
      }),
      e.dispatchEvent(i)
    );
  }
  function u$1(t, e) {
    const { preventDefault: n } = e;
    return ((s = n), "[object Function]" === Object.prototype.toString.call(s) ? n(t) : !!n);
    var s;
  }
  var h$1 = ["touchstart", "touchmove", "touchend", "touchcancel", "mousedown"],
    p$1 = ["mousemove", "mouseup"];
  var g = {
    domEvents: {
      bubbles: true,
      cancelable: true,
    },
    preventDefault: (t) => {
      if (t.target && "tagName" in t.target) {
        const { tagName: e } = t.target;
        return !/^(?:INPUT|TEXTAREA|BUTTON|SELECT)$/.test(e);
      }
      return false;
    },
  };
  var l = class extends t {
    constructor(t, e) {
      (super(),
        (this.v = "2.1.3"),
        (this.__computeFunctionList = []),
        (this.__computeFunctionCreatorList = []),
        (this.__pluginContexts = []),
        (this.__isIgnoreMouse = false),
        (this.el = t),
        (this.c = {}),
        (this.__options = Object.assign(Object.assign({}, g), e)));
      const n = (function (t) {
          const e = r$2();
          return function (n) {
            const s = [],
              o = [];
            Array.from(n.touches).forEach(({ clientX: e, clientY: n, target: i }) => {
              null != t &&
                t.contains(i) &&
                (s.push(i),
                o.push({
                  clientX: e,
                  clientY: n,
                  target: i,
                }));
            });
            const i = Array.from(n.changedTouches).map(({ clientX: t, clientY: e, target: n }) => ({
              clientX: t,
              clientY: e,
              target: n,
            }));
            return e({
              phase: n.type.replace("touch", ""),
              changedPoints: i,
              points: o,
              nativeEvent: n,
              target: n.target,
              targets: s,
            });
          };
        })(this.el),
        s = (function () {
          let t,
            e = false,
            n = null;
          const s = r$2();
          return function (o) {
            const { clientX: i, clientY: r, type: c, button: a, target: u } = o;
            let h,
              p = [
                {
                  clientX: i,
                  clientY: r,
                  target: u,
                },
              ];
            if ("mousedown" === c && 0 === a) ((n = u), (e = true), (h = "start"));
            else {
              if (!e) return;
              "mousemove" === c ? (h = "move") : "mouseup" === c && ((p = []), (h = "end"), (e = false));
            }
            const g = t || [
              {
                clientX: i,
                clientY: r,
                target: u,
              },
            ];
            if (
              ((t = [
                {
                  clientX: i,
                  clientY: r,
                  target: u,
                },
              ]),
              void 0 !== h)
            )
              return s({
                phase: h,
                changedPoints: g,
                points: p,
                target: n,
                targets: [n],
                nativeEvent: o,
              });
          };
        })();
      if (
        ((this.__inputCreatorMap = {
          touchstart: n,
          touchmove: n,
          touchend: n,
          touchcancel: n,
          mousedown: s,
          mousemove: s,
          mouseup: s,
        }),
        this.on("at:after", (t) => {
          const { target: e, __type: n } = t,
            { domEvents: s } = this.__options;
          s && void 0 !== this.el && e && (a$1(n, e, t, s), a$1("at:after", e, t, s));
        }),
        void 0 !== t)
      ) {
        t.style.webkitTapHighlightColor = "rgba(0,0,0,0)";
        let e = false;
        try {
          const t = {};
          (Object.defineProperty(t, "passive", {
            get() {
              e = !0;
            },
          }),
            window.addEventListener("_", () => {}, t));
        } catch (t) {}
        this.on(
          "u",
          (function (t, e, n) {
            return (
              h$1.forEach((s) => {
                t.addEventListener(s, e, n);
              }),
              p$1.forEach((t) => {
                window.addEventListener(t, e, n);
              }),
              () => {
                (h$1.forEach((n) => {
                  t.removeEventListener(n, e);
                }),
                  p$1.forEach((t) => {
                    window.removeEventListener(t, e);
                  }));
              }
            );
          })(
            t,
            this.catchEvent.bind(this),
            false === this.__options.preventDefault && e ? { passive: true } : { passive: false }
          )
        );
      }
    }
    use(t, e) {
      this.__pluginContexts.push(t(this, e));
    }
    catchEvent(t) {
      const e = this.__inputCreatorMap[t.type](t);
      if (void 0 !== e) {
        const n = () => t.stopPropagation(),
          s = () => t.stopImmediatePropagation(),
          o = () => t.preventDefault();
        if (u$1(t, this.__options)) o();
        else if (
          ("touchstart" === t.type
            ? (this.__isIgnoreMouse = true)
            : "touchmove" === t.type && (this.__isIgnoreMouse = false),
          this.__isIgnoreMouse && t.type.startsWith("mouse"))
        )
          return void ("mouseup" === t.type && (this.__isIgnoreMouse = false));
        (this.emit("input", e), this.emit2(`at:${e.phase}`, e, {}));
        const i = {};
        (this.__computeFunctionList.forEach((t) => {
          const n = t(e, i);
          if (void 0 !== n) for (const t in n) i[t] = n[t];
        }),
          this.emit(
            "computed",
            Object.assign(Object.assign(Object.assign({}, e), i), {
              stopPropagation: n,
              stopImmediatePropagation: s,
              preventDefault: o,
            })
          ));
      }
    }
    compute(t, e) {
      for (const e of t)
        this.__computeFunctionCreatorList.includes(e) ||
          (this.__computeFunctionCreatorList.push(e), this.__computeFunctionList.push(e()));
      this.on("computed", e);
    }
    beforeEach(t) {
      super.beforeEach((e, n) => {
        var s;
        (null === (s = this.c) || void 0 === s ? void 0 : s.name) ? t(e, n) : n();
      });
    }
    get(t) {
      return this.__pluginContexts.find((e) => t === e.name);
    }
    set(t) {
      this.__options = Object.assign(Object.assign({}, this.__options), t);
    }
    emit2(t, e, n) {
      ((this.c = n),
        this.emit(t, Object.assign(Object.assign({}, e), { type: t }), () => {
          this.emit(
            "at:after",
            Object.assign(Object.assign({}, e), {
              name: t,
              __type: t,
            })
          );
        }));
    }
    destroy() {
      (this.emit("u"), super.destroy());
    }
  };
  var p = {
    name: "pan",
    threshold: 10,
    pointLength: 1,
  };
  function u(u, d$1) {
    const f$1 = O(p, d$1);
    return (
      u.compute([f, h$2, d], (t) => {
        if ((g$1(f$1), j(f$1))) return;
        const c = (function () {
          const { pointLength: e, distance: n } = t;
          return f$1.pointLength === e && f$1.threshold <= n;
        })();
        if (((f$1.state = b(c, f$1.state, t.phase)), c || h$3(f$1.state))) {
          const { name: e } = f$1;
          (u.emit2(e, t, f$1),
            u.emit2(e + v$1(f$1.state), t, f$1),
            ![u$3, s$1].includes(t.phase) && t.direction && u.emit2(e + t.direction, t, f$1));
        }
      }),
      f$1
    );
  }
  var c$1 = {
    name: "swipe",
    threshold: 10,
    velocity: 0.3,
    pointLength: 1,
  };
  function a(a, r) {
    const s = O(c$1, r);
    return (
      a.compute([h$2, f, M], (t) => {
        if (
          ((s.state = 0),
          !s.disabled &&
            (function () {
              if (u$3 !== t.phase) return false;
              const { velocityX: o, velocityY: n, distance: i, maxPointLength: c } = t;
              return c === s.pointLength && 0 === t.points.length && s.threshold < i && s.velocity < Math.max(o, n);
            })())
        ) {
          const { name: e } = s;
          ((s.state = 1), a.emit2(e, t, s), a.emit2(e + t.direction, t, s));
        }
      }),
      s
    );
  }
  var r$1 = {
    name: "press",
    pointLength: 1,
    maxDistance: 9,
    minPressTime: 251,
  };
  function c(c, u) {
    const p = O(r$1, u);
    let f = 0;
    return (
      c.compute([h$2], (t) => {
        if (j(p)) return;
        const { phase: o, startInput: r, pointLength: u } = t;
        if (c$3 === o && p.pointLength === u)
          (g$1(p),
            clearTimeout(f),
            (f = setTimeout(
              () => {
                ((p.state = 1), c.emit2(p.name, t, p));
              },
              p.minPressTime
            )));
        else if (u$3 === o && 1 === p.state) c.emit2(`${p.name}${r$4}`, t, p);
        else if (1 !== p.state) {
          const e = t.timestamp - r.timestamp;
          (!(function () {
            const { distance: e } = t;
            return e && p.maxDistance > e;
          })() ||
            (p.minPressTime > e && [u$3, s$1].includes(o))) &&
            (clearTimeout(f), (p.state = 2));
        }
      }),
      p
    );
  }
  var i$2 = {
    name: "pinch",
    threshold: 0,
    pointLength: 2,
  };
  function r(r, m) {
    const p = O(i$2, m);
    return (
      r.compute([m$1, l$1], (t) => {
        if ((g$1(p), j(p))) return;
        const c = (function () {
          const { pointLength: e, scale: n, deltaScale: o, phase: a } = t;
          return p.pointLength === e && p.threshold < Math.abs(n - 1);
        })();
        p.state = b(c, p.state, t.phase);
        const { name: h } = p;
        if (c || h$3(p.state)) {
          r.emit2(h, t, p);
          const { deltaScale: e } = t;
          1 !== e && r.emit2(h + (1 < e ? "in" : "out"), t, p);
        }
        const i = v$1(p.state);
        i && r.emit2(h + i, t, p);
      }),
      p
    );
  }
  var h = {
    name: "rotate",
    threshold: 0,
    pointLength: 2,
  };
  function i$1(i, m) {
    const u = O(h, m);
    return (
      i.compute([m$1, p$2], (t) => {
        if (j(u)) return;
        g$1(u);
        const r = (function () {
          const { pointLength: e, angle: n } = t;
          return u.pointLength === e && u.threshold < Math.abs(n);
        })();
        u.state = b(r, u.state, t.phase);
        const { name: c } = u;
        (r || h$3(u.state)) && i.emit2(c, t, u);
        const h = v$1(u.state);
        h && i.emit2(c + h, t, u);
      }),
      u
    );
  }
  var i = class extends l {
    constructor(t, u$1) {
      (super(t, u$1), this.use(r$3), this.use(u), this.use(a), this.use(c), this.use(r), this.use(i$1));
    }
  };
  ((i.STATE_POSSIBLE = 0),
    (i.STATE_START = 4),
    (i.STATE_MOVE = 5),
    (i.STATE_END = 1),
    (i.STATE_CANCELLED = 3),
    (i.STATE_FAILED = 2),
    (i.STATE_RECOGNIZED = 1),
    (i.tap = r$3),
    (i.pan = u),
    (i.swipe = a),
    (i.press = c),
    (i.rotate = i$1),
    (i.pinch = r),
    (i.doubletap = e));
  var PopsUtils = class {
    sleep(timeout) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(true);
        }, timeout);
      });
    }
    isWin(target) {
      if (typeof target !== "object") return false;
      if (target instanceof Node) return false;
      if (target === globalThis) return true;
      if (target === window) return true;
      if (target === self) return true;
      if (target === PopsCore.globalThis) return true;
      if (target === PopsCore.window) return true;
      if (target === PopsCore.self) return true;
      if (typeof unsafeWindow !== "undefined" && target === unsafeWindow) return true;
      if (target?.Math?.toString() !== "[object Math]") return false;
      return true;
    }
    isDOM(target) {
      return target instanceof Node;
    }
    isNodeList($ele) {
      return Array.isArray($ele) || $ele instanceof NodeList;
    }
    delete(target, propName) {
      if (typeof Reflect === "object" && typeof Reflect.deleteProperty === "function")
        Reflect.deleteProperty(target, propName);
      else delete target[propName];
    }
    assign(target = {}, source = {}, isAdd = false) {
      const UtilsContext = this;
      if (Array.isArray(source)) {
        if (
          !source.filter((item) => {
            return typeof item === "object";
          }).length
        )
          return source;
      }
      if (source == null) return target;
      if (target == null) target = {};
      let iteratorTarget;
      if (isAdd) iteratorTarget = source;
      else iteratorTarget = target;
      for (const keyName in iteratorTarget) {
        if (!isAdd && !(keyName in source)) continue;
        const targetValue = Reflect.get(target, keyName);
        const sourceValue = Reflect.get(source, keyName);
        if (
          typeof sourceValue === "object" &&
          sourceValue != null &&
          keyName in target &&
          !UtilsContext.isDOM(sourceValue) &&
          !(sourceValue instanceof EventEmiter)
        ) {
          let childObjectValue;
          if (Array.isArray(sourceValue)) {
            if (Array.isArray(targetValue)) targetValue.length = 0;
            childObjectValue = sourceValue;
          } else childObjectValue = UtilsContext.assign(targetValue, sourceValue, isAdd);
          Reflect.set(target, keyName, childObjectValue);
        } else Reflect.set(target, keyName, sourceValue);
      }
      return target;
    }
    getRandomGUID() {
      if (typeof PopsCore.globalThis?.crypto?.randomUUID === "function") return PopsCore.globalThis.crypto.randomUUID();
      else
        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
          const randomValue = (Math.random() * 16) | 0;
          return (charStr === "x" ? randomValue : (randomValue & 3) | 8).toString(16);
        });
    }
    contains(...args) {
      const [context, target] = args;
      if (args.length === 1) return this.contains(PopsCore.document.body || PopsCore.document.documentElement, args[0]);
      else {
        if (target == null) return false;
        if (typeof target[Symbol.iterator] === "function") {
          let flag = true;
          for (const targetNode of target)
            if (!context.contains(targetNode)) {
              flag = false;
              break;
            }
          return flag;
        } else return context.contains(target);
      }
    }
    formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
      const time = text == null ? new Date() : new Date(text);
      function checkTime(timeNum) {
        if (timeNum < 10) return "0" + timeNum;
        return timeNum;
      }
      function timeSystemChange(hourNum) {
        return hourNum > 12 ? hourNum - 12 : hourNum;
      }
      const timeRegexp = {
        yyyy: time.getFullYear(),
        MM: checkTime(time.getMonth() + 1),
        dd: checkTime(time.getDate()),
        HH: checkTime(time.getHours()),
        hh: checkTime(timeSystemChange(time.getHours())),
        mm: checkTime(time.getMinutes()),
        ss: checkTime(time.getSeconds()),
      };
      Object.keys(timeRegexp).forEach(function (key) {
        const replaecRegexp = new RegExp(key, "g");
        formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
      });
      return formatType;
    }
    formatByteToSize(byteSize, addType = true) {
      byteSize = parseInt(byteSize.toString());
      if (isNaN(byteSize)) throw new TypeError("Utils.formatByteToSize 参数 byteSize 格式不正确");
      let result = 0;
      let resultType = "KB";
      const sizeData = {};
      sizeData.B = 1;
      sizeData.KB = 1024;
      sizeData.MB = sizeData.KB * sizeData.KB;
      sizeData.GB = sizeData.MB * sizeData.KB;
      sizeData.TB = sizeData.GB * sizeData.KB;
      sizeData.PB = sizeData.TB * sizeData.KB;
      sizeData.EB = sizeData.PB * sizeData.KB;
      sizeData.ZB = sizeData.EB * sizeData.KB;
      sizeData.YB = sizeData.ZB * sizeData.KB;
      sizeData.BB = sizeData.YB * sizeData.KB;
      sizeData.NB = sizeData.BB * sizeData.KB;
      sizeData.DB = sizeData.NB * sizeData.KB;
      for (const key in sizeData) {
        result = byteSize / sizeData[key];
        resultType = key;
        if (sizeData.KB >= result) break;
      }
      result = result.toFixed(2);
      result = addType ? result + resultType.toString() : parseFloat(result.toString());
      return result;
    }
    AnyTouch = () => {
      return i;
    };
    AnyTouchDoubleTapPlugin = () => {
      return e;
    };
    isPhone(userAgent = PopsCore.globalThis.navigator.userAgent) {
      return Boolean(/(iPhone|iPad|iPod|iOS|Android)/i.test(userAgent));
    }
    setTimeout(callback, timeout = 0) {
      return PopsCore.setTimeout(callback, timeout);
    }
    clearTimeout(timeId) {
      return PopsCore.clearTimeout(timeId);
    }
    setInterval(callback, timeout = 0) {
      return PopsCore.setInterval(callback, timeout);
    }
    clearInterval(timeId) {
      return PopsCore.clearInterval(timeId);
    }
    setArray(target, key, newArr) {
      if (target == null) return;
      if (!Array.isArray(newArr)) return;
      const arr = target[key];
      if (Array.isArray(target[key])) arr.length = 0;
      else target[key] = [];
      target[key] = newArr;
    }
    getMaxZIndexNodeInfoFromPoint($el, deviation) {
      if (typeof $el === "function") $el = $el();
      if (typeof $el === "number") {
        deviation = $el;
        $el = void 0;
      }
      if (typeof deviation !== "number" || Number.isNaN(deviation)) deviation = 10;
      const maxZIndexCompare = 2 * Math.pow(10, 9);
      const positionDistance = 10;
      const defaultCalcPostion = [];
      const maxPostionX = globalThis.innerWidth;
      const maxPostionY = globalThis.innerHeight;
      const gridXCount = 8;
      const gridYCount = 8;
      for (let i = 0; i < gridXCount; i++)
        for (let j = 0; j < gridYCount; j++) {
          const position = {
            x: globalThis.innerWidth * (i / gridXCount) + positionDistance,
            y: globalThis.innerHeight * (j / gridYCount) + positionDistance,
          };
          if (position.x > maxPostionX) position.x = maxPostionX;
          if (position.y > maxPostionY) position.y = maxPostionY;
          defaultCalcPostion.push(position);
        }
      const delayHandlerElementPostionList = defaultCalcPostion;
      if ($el) {
        delayHandlerElementPostionList.length = 0;
        if (Array.isArray($el)) delayHandlerElementPostionList.push(...$el);
        else delayHandlerElementPostionList.push($el);
      }
      const positionInfoList = delayHandlerElementPostionList
        .map((position) => {
          let $position;
          let positionX;
          let positionY;
          if (position instanceof HTMLElement) {
            $position = position;
            const nodeRect = position.getBoundingClientRect();
            positionX = nodeRect.x + nodeRect.width / 2;
            positionY = nodeRect.y + nodeRect.height / 2;
          } else {
            $position = document.elementFromPoint(position.x, position.y);
            positionX = position.x;
            positionY = position.y;
          }
          const shadowRoot = $position?.shadowRoot;
          if (shadowRoot) $position = shadowRoot.elementFromPoint(positionX, positionY);
          if (!($position instanceof HTMLElement)) return;
          let $parent = $position;
          let zIndex = 0;
          let $maxZIndexNode = null;
          let rect = {
            x: 0,
            y: 0,
            width: 0,
            height: 0,
            top: 0,
            right: 0,
            bottom: 0,
            left: 0,
          };
          while ($parent) {
            const nodeStyle = globalThis.getComputedStyle($parent);
            const nodeZIndex = parseInt(nodeStyle.zIndex);
            if (nodeStyle.position !== "static" && !isNaN(nodeZIndex)) {
              if (nodeZIndex > zIndex) {
                zIndex = nodeZIndex;
                $maxZIndexNode = $parent;
              }
            }
            $parent = $parent.parentElement;
          }
          if ($maxZIndexNode) {
            const maxRect = $maxZIndexNode.getBoundingClientRect();
            rect = {
              x: maxRect.x,
              y: maxRect.y,
              width: maxRect.width,
              height: maxRect.height,
              top: maxRect.top,
              right: maxRect.right,
              bottom: maxRect.bottom,
              left: maxRect.left,
            };
          }
          const calcZIndex = zIndex + deviation;
          if (calcZIndex >= maxZIndexCompare) return;
          return {
            zIndex: calcZIndex,
            originZIndex: zIndex,
            node: $maxZIndexNode,
            positionNode: $position,
            positionX,
            positionY,
            rect,
          };
        })
        .filter((it) => it != null);
      positionInfoList.sort((a, b) => {
        if (a.zIndex < b.zIndex) return 1;
        else if (a.zIndex > b.zIndex) return -1;
        else return 0;
      });
      return positionInfoList;
    }
  };
  var popsUtils = new PopsUtils();
  var GlobalData = {
    domEventSymbol: Symbol("events_" + (((1 + Math.random()) * 65536) | 0).toString(16).substring(1)),
  };
  var CommonUtils = {
    isWin: popsUtils.isWin.bind(popsUtils),
    delete: popsUtils.delete.bind(popsUtils),
    isNodeList: popsUtils.isNodeList.bind(popsUtils),
  };
  var PopsDOMUtilsEvent = class {
    get windowApi() {
      return PopsCore.window;
    }
    on(element, eventType, selector, callback, option) {
      const getOption = function (args, startIndex, option) {
        const currentParam = args[startIndex];
        if (typeof currentParam === "boolean") {
          option.capture = currentParam;
          if (typeof args[startIndex + 1] === "boolean") option.once = args[startIndex + 1];
          if (typeof args[startIndex + 2] === "boolean") option.passive = args[startIndex + 2];
        } else if (currentParam && typeof currentParam === "object") {
          for (const key in option) if (Reflect.has(currentParam, key)) Reflect.set(option, key, currentParam[key]);
        }
        return option;
      };
      const that = this;
      const args = arguments;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null)
        return {
          off() {},
          emit() {},
        };
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType))
        eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof eventType === "string")
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
      let selectorList = [];
      if (Array.isArray(selector))
        selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof selector === "string") selectorList.push(selector);
      let listenerCallBack = callback;
      let listenerOption = {
        capture: false,
        once: false,
        passive: false,
        isComposedPath: false,
        overrideTarget: true,
      };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else listenerOption = getOption(args, 4, listenerOption);
      $elList.forEach(($elItem) => {
        const targetIsWindow = CommonUtils.isWin($elItem);
        eventTypeList.forEach((eventName) => {
          const checkOptionOnceToRemoveEventListener = () => {
            if (listenerOption.once) this.off($elItem, eventName, selector, callback, option);
          };
          const handlerCallBack = function (event) {
            if (listenerOption.isPreventEvent) that.preventEvent(event);
            let call_this = void 0;
            let call_event = void 0;
            let call_$selector = void 0;
            let execCallback = false;
            if (selectorList.length) {
              let $target;
              if (listenerOption.isComposedPath) {
                const composedPath = event.composedPath();
                if (!composedPath.length && event.target) composedPath.push(event.target);
                $target = composedPath[0];
              } else $target = event.target;
              const $parent = targetIsWindow ? that.windowApi.document.documentElement : $elItem;
              if (
                selectorList.find((selectors) => {
                  if (that.matches($target, selectors)) return true;
                  const $closestMatches = that.closest($target, selectors);
                  if ($closestMatches && $parent?.contains?.($closestMatches)) {
                    $target = $closestMatches;
                    return true;
                  }
                  return false;
                })
              ) {
                if (listenerOption.overrideTarget)
                  try {
                    const originTarget = event.target;
                    OriginPrototype$1.Object.defineProperties(event, {
                      target: {
                        get() {
                          return $target;
                        },
                      },
                      originTarget: {
                        get() {
                          return originTarget;
                        },
                      },
                    });
                  } catch {}
                execCallback = true;
                call_this = $target;
                call_event = event;
                call_$selector = $target;
              }
            } else {
              execCallback = true;
              call_this = $elItem;
              call_event = event;
            }
            if (execCallback) {
              const result = listenerCallBack.call(call_this, call_event, call_$selector);
              checkOptionOnceToRemoveEventListener();
              if (typeof result === "boolean" && !result) return false;
            }
          };
          $elItem.addEventListener(eventName, handlerCallBack, listenerOption);
          const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
          elementEvents[eventName] = elementEvents[eventName] || [];
          elementEvents[eventName].push({
            selector: selectorList,
            option: listenerOption,
            handlerCallBack,
            callback: listenerCallBack,
          });
          Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
        });
      });
      return {
        off: (filter) => {
          that.off($elList, eventTypeList, selectorList, listenerCallBack, listenerOption, filter);
        },
        emit: (extraDetails, useDispatchToTriggerEvent) => {
          that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
        },
      };
    }
    off(element, eventType, selector, callback, option, filter) {
      const getOption = function (args1, startIndex, option) {
        const currentParam = args1[startIndex];
        if (typeof currentParam === "boolean") option.capture = currentParam;
        else if (currentParam && typeof currentParam === "object" && "capture" in currentParam)
          option.capture = currentParam.capture;
        return option;
      };
      const that = this;
      const args = arguments;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) {
        element = element;
        $elList = $elList.concat(Array.from(element));
      } else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType))
        eventTypeList = eventTypeList.concat(eventType.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof eventType === "string")
        eventTypeList = eventTypeList.concat(eventType.split(" ").filter((it) => it !== ""));
      let selectorList = [];
      if (Array.isArray(selector))
        selectorList = selectorList.concat(selector.filter((it) => typeof it === "string" && it.toString() !== ""));
      else if (typeof selector === "string") selectorList.push(selector);
      let listenerCallBack = callback;
      let listenerOption = { capture: false };
      if (typeof selector === "function") {
        listenerCallBack = selector;
        listenerOption = getOption(args, 3, listenerOption);
      } else listenerOption = getOption(args, 4, listenerOption);
      if (args.length === 5 && typeof args[4] === "function" && typeof filter !== "function") filter = option;
      $elList.forEach(($elItem) => {
        const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
        eventTypeList.forEach((eventName) => {
          const handlers = elementEvents[eventName] || [];
          const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
          for (let index = 0; index < handlersFiltered.length; index++) {
            const handler = handlersFiltered[index];
            let flag = true;
            if (flag && listenerCallBack && handler.callback !== listenerCallBack) flag = false;
            if (flag && selectorList.length && Array.isArray(handler.selector)) {
              if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) flag = false;
            }
            if (
              flag &&
              typeof handler.option.capture === "boolean" &&
              listenerOption.capture !== handler.option.capture
            )
              flag = false;
            if (flag) {
              $elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
              for (let i = handlers.length - 1; i >= 0; i--) if (handlers[i] === handler) handlers.splice(i, 1);
            }
          }
          if (handlers.length === 0) {
            CommonUtils.delete(elementEvents, eventType);
            if (Object.keys(elementEvents).length === 0) CommonUtils.delete($elItem, GlobalData.domEventSymbol);
          }
        });
        Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
      });
    }
    offAll(element, eventType) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      let eventTypeList = [];
      if (Array.isArray(eventType)) eventTypeList = eventTypeList.concat(eventType);
      else if (typeof eventType === "string") eventTypeList = eventTypeList.concat(eventType.split(" "));
      $elList.forEach(($elItem) => {
        [...new Set([...Object.getOwnPropertySymbols($elItem), GlobalData.domEventSymbol])].forEach((__symbol__) => {
          if (!__symbol__.toString().startsWith("Symbol(events_")) return;
          const elementEvents = Reflect.get($elItem, __symbol__) || {};
          (eventTypeList.length ? eventTypeList : Object.keys(elementEvents)).forEach((eventName) => {
            const handlers = elementEvents[eventName];
            if (!handlers) return;
            for (const handler of handlers)
              $elItem.removeEventListener(eventName, handler.handlerCallBack, { capture: handler.option.capture });
            const events = Reflect.get($elItem, __symbol__);
            CommonUtils.delete(events, eventName);
            if (Object.keys(events).length === 0) CommonUtils.delete($elItem, __symbol__);
          });
        });
      });
    }
    onReady(callback) {
      const that = this;
      if (typeof callback !== "function") return;
      function checkDOMReadyState() {
        try {
          if (
            document.readyState === "complete" ||
            (document.readyState !== "loading" && !document.documentElement.doScroll)
          )
            return true;
          else return false;
        } catch {
          return false;
        }
      }
      function completed() {
        removeDomReadyListener();
        callback();
      }
      const targetList = [
        {
          target: PopsCore.document,
          eventType: "DOMContentLoaded",
          callback: completed,
        },
        {
          target: PopsCore.window,
          eventType: "load",
          callback: completed,
        },
      ];
      function addDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          const item = targetList[index];
          that.on(item.target, item.eventType, item.callback);
        }
      }
      function removeDomReadyListener() {
        for (let index = 0; index < targetList.length; index++) {
          const item = targetList[index];
          that.off(item.target, item.eventType, item.callback);
        }
      }
      if (checkDOMReadyState()) popsUtils.setTimeout(callback, 0);
      else addDomReadyListener();
    }
    emit(element, eventType, extraDetails, useDispatchToTriggerEvent = true) {
      const that = this;
      if (typeof element === "string") element = that.selectorAll(element);
      if (element == null) return;
      let $elList = [];
      if (element instanceof NodeList || Array.isArray(element)) $elList = $elList.concat(Array.from(element));
      else $elList.push(element);
      const addExtraProp = (event, obj) => {
        if (event instanceof Event && typeof obj === "object" && obj != null && !Array.isArray(obj))
          Object.keys(obj).forEach((keyName) => {
            const value = Reflect.get(obj, keyName);
            Reflect.set(event, keyName, value);
          });
      };
      let eventTypeList = [];
      let __event__ = null;
      if (Array.isArray(eventType))
        eventTypeList = eventType.filter((it) => typeof it === "string" && it.trim() !== "");
      else if (typeof eventType === "string") eventTypeList = eventType.split(" ");
      else if (eventType instanceof Event) {
        __event__ = eventType;
        addExtraProp(__event__, extraDetails);
      }
      $elList.forEach(($elItem) => {
        const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
        const dispatchEvent = (event, eventTypeItem) => {
          if (useDispatchToTriggerEvent == false && eventTypeItem in elementEvents)
            elementEvents[eventTypeItem].forEach((eventsItem) => {
              eventsItem.handlerCallBack(event);
            });
          else $elItem.dispatchEvent(event);
        };
        if (__event__) {
          const event = __event__;
          const eventTypeItem = event.type;
          dispatchEvent(event, eventTypeItem);
        } else
          eventTypeList.forEach((eventTypeItem) => {
            const event = new Event(eventTypeItem);
            addExtraProp(event, extraDetails);
            dispatchEvent(event, eventTypeItem);
          });
      });
    }
    onKeyup(element, handler, option) {
      const that = this;
      if (element == null) return;
      if (typeof element === "string") element = that.selectorAll(element);
      if (CommonUtils.isNodeList(element)) {
        const listenerList = [];
        element.forEach(($ele) => {
          const listener = that.onKeyup($ele, handler, option);
          listenerList.push(listener);
        });
        return {
          off() {
            listenerList.forEach((listener) => {
              if (!listener) return;
              listener.off();
            });
          },
        };
      }
      return that.on(element, "keyup", null, handler, option);
    }
    onKeydown(element, handler, option) {
      const that = this;
      if (element == null) return;
      if (typeof element === "string") element = that.selectorAll(element);
      if (CommonUtils.isNodeList(element)) {
        const listenerList = [];
        element.forEach(($ele) => {
          const listener = that.onKeydown($ele, handler, option);
          listenerList.push(listener);
        });
        return {
          off() {
            listenerList.forEach((listener) => {
              if (!listener) return;
              listener.off();
            });
          },
        };
      }
      return that.on(element, "keydown", null, handler, option);
    }
    preventEvent(...args) {
      const stopEvent = (event, onlyStopPropagation) => {
        event?.stopPropagation();
        event?.stopImmediatePropagation();
        if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) return;
        event?.preventDefault();
        return false;
      };
      if (args[0] instanceof Event) {
        const onlyStopPropagation = args[1];
        return stopEvent(args[0], onlyStopPropagation);
      } else {
        const $el = args[0];
        let eventNameList = args[1];
        let selector = void 0;
        let capture = false;
        let onlyStopPropagation = false;
        if (typeof eventNameList === "string") eventNameList = [eventNameList];
        let option = void 0;
        if (args.length === 2);
        else if (typeof args[2] === "string" || Array.isArray(args[2])) {
          selector = args[2];
          if (typeof args[3] === "object" && args[3] != null) option = args[3];
        } else if (typeof args[2] === "object" && args[2] != null && !Array.isArray(args[2])) option = args[2];
        else throw new TypeError("Invalid argument");
        if (option) {
          capture = Boolean(option.capture);
          onlyStopPropagation = Boolean(option.onlyStopPropagation);
        }
        return this.on(
          $el,
          eventNameList,
          selector,
          (evt) => {
            return stopEvent(evt, onlyStopPropagation);
          },
          { capture }
        );
      }
    }
    selector(selector) {
      return this.selectorAll(selector)[0];
    }
    selectorAll(selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return $ele?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return ($ele?.textContent || $ele?.innerText)?.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(PopsCore.document.querySelectorAll(selector)).filter(($ele) => {
          return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
        });
      } else return Array.from(PopsCore.document.querySelectorAll(selector));
    }
    matches($el, selector) {
      selector = selector.trim();
      if ($el == null) return false;
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") content = "";
        return $el.matches(selector) && content?.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") content = "";
        return $el.matches(selector) && Boolean(content?.match(regexp));
      } else return $el.matches(selector);
    }
    closest($el, selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") return $closest;
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          const content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          const content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.match(regexp)) return $closest;
        }
        return null;
      } else return $el?.closest(selector);
    }
    onInput($el, callback, option) {
      let isComposite = false;
      const __callback = async (event) => {
        if (isComposite) return;
        await callback(event);
      };
      const __composition_start_callback = () => {
        isComposite = true;
      };
      const __composition_end_callback = () => {
        isComposite = false;
        this.emit($el, "input", { isComposite });
      };
      const inputListener = this.on($el, "input", __callback, option);
      const compositionStartListener = this.on($el, "compositionstart", __composition_start_callback, option);
      const compositionEndListener = this.on($el, "compositionend", __composition_end_callback, option);
      return {
        off: () => {
          inputListener.off();
          compositionStartListener.off();
          compositionEndListener.off();
        },
      };
    }
  };
  var PopsDOMUtils = class extends PopsDOMUtilsEvent {
    getAnimationEndNameList() {
      return ["webkitAnimationEnd", "mozAnimationEnd", "MSAnimationEnd", "oanimationend", "animationend"];
    }
    getTransitionEndNameList() {
      return ["webkitTransitionEnd", "mozTransitionEnd", "MSTransitionEnd", "otransitionend", "transitionend"];
    }
    offset(element, calcScroll = true) {
      const rect = element.getBoundingClientRect();
      const win = element.ownerDocument.defaultView;
      return new DOMRect(
        calcScroll ? parseFloat((rect.left + (win?.pageXOffset || 0)).toString()) : rect.left,
        calcScroll ? parseFloat((rect.top + (win?.pageYOffset || 0)).toString()) : rect.top,
        rect.width,
        rect.height
      );
    }
    width(element, isShow = false, parent) {
      const DOMUtilsContext = this;
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      if (popsUtils.isWin(element)) return PopsCore.window.document.documentElement.clientWidth;
      if (element.nodeType === 9) {
        element = element;
        return Math.max(
          element.body.scrollWidth,
          element.documentElement.scrollWidth,
          element.body.offsetWidth,
          element.documentElement.offsetWidth,
          element.documentElement.clientWidth
        );
      }
      if (isShow || (!isShow && popsDOMUtils.isShow(element))) {
        element = element;
        if (parseFloat(popsDOMUtils.getStyleValue(element, "width").toString()) > 0)
          return parseFloat(popsDOMUtils.getStyleValue(element, "width").toString());
        if (element.offsetWidth > 0) {
          const borderLeftWidth = popsDOMUtils.getStyleValue(element, "borderLeftWidth");
          const borderRightWidth = popsDOMUtils.getStyleValue(element, "borderRightWidth");
          const paddingLeft = popsDOMUtils.getStyleValue(element, "paddingLeft");
          const paddingRight = popsDOMUtils.getStyleValue(element, "paddingRight");
          const backHeight =
            parseFloat(element.offsetWidth.toString()) -
            parseFloat(borderLeftWidth.toString()) -
            parseFloat(borderRightWidth.toString()) -
            parseFloat(paddingLeft.toString()) -
            parseFloat(paddingRight.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        const { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        const width = DOMUtilsContext.width(cloneNode, true, parent);
        recovery();
        return width;
      }
    }
    height(element, isShow = false, parent) {
      const DOMUtilsContext = this;
      if (popsUtils.isWin(element)) return PopsCore.window.document.documentElement.clientHeight;
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      if (element.nodeType === 9) {
        element = element;
        return Math.max(
          element.body.scrollHeight,
          element.documentElement.scrollHeight,
          element.body.offsetHeight,
          element.documentElement.offsetHeight,
          element.documentElement.clientHeight
        );
      }
      if (isShow || (!isShow && popsDOMUtils.isShow(element))) {
        element = element;
        if (parseFloat(popsDOMUtils.getStyleValue(element, "height").toString()) > 0)
          return parseFloat(popsDOMUtils.getStyleValue(element, "height").toString());
        if (element.offsetHeight > 0) {
          const borderTopWidth = popsDOMUtils.getStyleValue(element, "borderTopWidth");
          const borderBottomWidth = popsDOMUtils.getStyleValue(element, "borderBottomWidth");
          const paddingTop = popsDOMUtils.getStyleValue(element, "paddingTop");
          const paddingBottom = popsDOMUtils.getStyleValue(element, "paddingBottom");
          const backHeight =
            parseFloat(element.offsetHeight.toString()) -
            parseFloat(borderTopWidth.toString()) -
            parseFloat(borderBottomWidth.toString()) -
            parseFloat(paddingTop.toString()) -
            parseFloat(paddingBottom.toString());
          return parseFloat(backHeight.toString());
        }
        return 0;
      } else {
        element = element;
        const { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        const height = DOMUtilsContext.height(cloneNode, true, parent);
        recovery();
        return height;
      }
    }
    outerWidth(element, isShow = false, parent) {
      const DOMUtilsContext = this;
      if (popsUtils.isWin(element)) return PopsCore.window.innerWidth;
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      element = element;
      if (isShow || (!isShow && popsDOMUtils.isShow(element))) {
        const style = getComputedStyle(element, null);
        const marginLeft = popsDOMUtils.getStyleValue(style, "marginLeft");
        const marginRight = popsDOMUtils.getStyleValue(style, "marginRight");
        return element.offsetWidth + marginLeft + marginRight;
      } else {
        const { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        const outerWidth = DOMUtilsContext.outerWidth(cloneNode, true, parent);
        recovery();
        return outerWidth;
      }
    }
    outerHeight(element, isShow = false, parent) {
      const DOMUtilsContext = this;
      if (popsUtils.isWin(element)) return PopsCore.window.innerHeight;
      if (typeof element === "string") element = this.selector(element);
      element = element;
      if (isShow || (!isShow && popsDOMUtils.isShow(element))) {
        const style = getComputedStyle(element, null);
        const marginTop = popsDOMUtils.getStyleValue(style, "marginTop");
        const marginBottom = popsDOMUtils.getStyleValue(style, "marginBottom");
        return element.offsetHeight + marginTop + marginBottom;
      } else {
        const { cloneNode, recovery } = popsDOMUtils.showElement(element, parent);
        const outerHeight = DOMUtilsContext.outerHeight(cloneNode, true, parent);
        recovery();
        return outerHeight;
      }
    }
    addClassName($el, ...args) {
      if ($el == null) return;
      if (!($el instanceof Element)) return;
      if (args.length === 0) return;
      args.forEach((argItem) => {
        if (argItem == null) return;
        if (Array.isArray(argItem)) {
          this.addClassName($el, ...argItem);
          return;
        }
        if (typeof argItem === "function") argItem = argItem();
        if (typeof argItem !== "string") return;
        if (argItem.trim() === "") return;
        const classNameList = argItem.split(" ").filter((item) => item.trim() !== "");
        $el.classList.add(...classNameList);
      });
    }
    removeClassName($el, ...args) {
      if ($el == null) return;
      if (!($el instanceof Element)) return;
      if (args.length === 0) return;
      args.forEach((argItem) => {
        if (argItem == null) return;
        if (Array.isArray(argItem)) {
          this.removeClassName($el, ...argItem);
          return;
        }
        if (typeof argItem === "function") argItem = argItem();
        if (typeof argItem !== "string") return;
        if (argItem.trim() === "") return;
        const classNameList = argItem.split(" ").filter((item) => item.trim() !== "");
        $el.classList.remove(...classNameList);
      });
    }
    containsClassName($el, className) {
      if ($el == null) return false;
      if (typeof className !== "string") return false;
      if (className.trim() === "") return false;
      return $el.classList.contains(className);
    }
    css($el, property, value) {
      const that = this;
      function handlePixe(propertyName, propertyValue) {
        const allowAddPixe = ["width", "height", "top", "left", "right", "bottom", "font-size"];
        if (typeof propertyValue === "number") propertyValue = propertyValue.toString();
        if (typeof propertyValue === "string" && allowAddPixe.includes(propertyName) && propertyValue.match(/[0-9]$/gi))
          propertyValue = propertyValue + "px";
        return propertyValue;
      }
      if (typeof $el === "string") $el = that.selectorAll($el);
      if ($el == null) return;
      if (Array.isArray($el) || $el instanceof NodeList) {
        if (typeof property === "string")
          if (value == null) return that.css($el[0], property);
          else {
            $el.forEach(($elItem) => {
              that.css($elItem, property);
            });
            return;
          }
        else if (typeof property === "object") {
          $el.forEach(($elItem) => {
            that.css($elItem, property);
          });
          return;
        }
        return;
      }
      const setStyleProperty = (propertyName, propertyValue) => {
        if (typeof propertyValue === "string" && propertyValue.trim().endsWith("!important")) {
          propertyValue = propertyValue
            .trim()
            .replace(/!important$/gi, "")
            .trim();
          $el.style.setProperty(propertyName, propertyValue, "important");
        } else {
          propertyValue = handlePixe(propertyName, propertyValue);
          $el.style.setProperty(propertyName, propertyValue);
        }
      };
      if (typeof property === "string")
        if (value == null) return PopsCore.globalThis.getComputedStyle($el).getPropertyValue(property);
        else setStyleProperty(property, value);
      else if (typeof property === "object")
        for (const prop in property) {
          const value = property[prop];
          setStyleProperty(prop, value);
        }
      else throw new TypeError("property must be string or object");
    }
    createElement(tagName, property, attributes) {
      const $temp = PopsCore.document.createElement(tagName);
      if (typeof property === "string") {
        PopsSafeUtils.setSafeHTML($temp, property);
        return $temp;
      }
      if (property == null) property = {};
      if (attributes == null) attributes = {};
      Object.keys(property).forEach((key) => {
        const value = property[key];
        if (key === "innerHTML") {
          PopsSafeUtils.setSafeHTML($temp, value);
          return;
        }
        Reflect.set($temp, key, value);
      });
      Object.keys(attributes).forEach((key) => {
        let value = attributes[key];
        if (typeof value === "object") value = JSON.stringify(value);
        else if (typeof value === "function") value = value.toString();
        $temp.setAttribute(key, value);
      });
      return $temp;
    }
    parseTextToDOM(elementString) {
      elementString = elementString.replace(/^[\n|\s]*/g, "").replace(/[\n|\s]*$/g, "");
      return this.createElement("div", { innerHTML: elementString }).firstChild;
    }
    getTextBoundingRect(input, selectionStart, selectionEnd, debug) {
      if (!input || !("value" in input)) return input;
      if (typeof selectionStart == "string") selectionStart = parseFloat(selectionStart);
      if (typeof selectionStart != "number" || isNaN(selectionStart)) selectionStart = 0;
      if (selectionStart < 0) selectionStart = 0;
      else selectionStart = Math.min(input.value.length, selectionStart);
      if (typeof selectionEnd == "string") selectionEnd = parseFloat(selectionEnd);
      if (typeof selectionEnd != "number" || isNaN(selectionEnd) || selectionEnd < selectionStart)
        selectionEnd = selectionStart;
      if (selectionEnd < 0) selectionEnd = 0;
      else selectionEnd = Math.min(input.value.length, selectionEnd);
      if (typeof input.createTextRange == "function") {
        const range = input.createTextRange();
        range.collapse(true);
        range.moveStart("character", selectionStart);
        range.moveEnd("character", selectionEnd - selectionStart);
        return range.getBoundingClientRect();
      }
      const offset = getInputOffset();
      let topPos = offset.top;
      let leftPos = offset.left;
      const width = getInputCSS("width", true);
      const height = getInputCSS("height", true);
      let cssDefaultStyles = "white-space:pre;padding:0;margin:0;";
      const listOfModifiers = [
        "direction",
        "font-family",
        "font-size",
        "font-size-adjust",
        "font-variant",
        "font-weight",
        "font-style",
        "letter-spacing",
        "line-height",
        "text-align",
        "text-indent",
        "text-transform",
        "word-wrap",
        "word-spacing",
      ];
      topPos += getInputCSS("padding-top", true);
      topPos += getInputCSS("border-top-width", true);
      leftPos += getInputCSS("padding-left", true);
      leftPos += getInputCSS("border-left-width", true);
      leftPos += 1;
      for (let i = 0; i < listOfModifiers.length; i++) {
        const property = listOfModifiers[i];
        cssDefaultStyles += property + ":" + getInputCSS(property, false) + ";";
      }
      const text = input.value || "G",
        textLen = text.length,
        fakeClone = document.createElement("div");
      if (selectionStart > 0) appendPart(0, selectionStart);
      const fakeRange = appendPart(selectionStart, selectionEnd);
      if (textLen > selectionEnd) appendPart(selectionEnd, textLen);
      fakeClone.style.cssText = cssDefaultStyles;
      fakeClone.style.position = "absolute";
      fakeClone.style.top = topPos + "px";
      fakeClone.style.left = leftPos + "px";
      fakeClone.style.width = width + "px";
      fakeClone.style.height = height + "px";
      PopsCore.document.body.appendChild(fakeClone);
      const returnValue = fakeRange.getBoundingClientRect();
      if (!debug) fakeClone.parentNode.removeChild(fakeClone);
      return returnValue;
      function appendPart(start, end) {
        const span = document.createElement("span");
        span.style.cssText = cssDefaultStyles;
        span.textContent = text.substring(start, end);
        fakeClone.appendChild(span);
        return span;
      }
      function getInputOffset() {
        const body = document.body,
          win = document.defaultView,
          docElem = document.documentElement,
          box = document.createElement("div");
        box.style.paddingLeft = box.style.width = "1px";
        body.appendChild(box);
        const isBoxModel = box.offsetWidth == 2;
        body.removeChild(box);
        const boxRect = input.getBoundingClientRect();
        const clientTop = docElem.clientTop || body.clientTop || 0,
          clientLeft = docElem.clientLeft || body.clientLeft || 0,
          scrollTop = win?.pageYOffset || (isBoxModel && docElem.scrollTop) || body.scrollTop,
          scrollLeft = win?.pageXOffset || (isBoxModel && docElem.scrollLeft) || body.scrollLeft;
        return {
          top: boxRect.top + scrollTop - clientTop,
          left: boxRect.left + scrollLeft - clientLeft,
        };
      }
      function getInputCSS(prop, isnumber) {
        const val = PopsCore.document.defaultView.getComputedStyle(input, null).getPropertyValue(prop);
        if (isnumber) return parseFloat(val);
        else return val;
      }
    }
    cssHide(ele, isImportant = false) {
      if (ele == null) return;
      if (isImportant) popsDOMUtils.addClassName(ele, PopsCommonCSSClassName.hideImportant);
      else popsDOMUtils.addClassName(ele, PopsCommonCSSClassName.hide);
    }
    cssShow(ele) {
      if (ele == null) return;
      popsDOMUtils.removeClassName(ele, PopsCommonCSSClassName.hide);
      popsDOMUtils.removeClassName(ele, PopsCommonCSSClassName.hideImportant);
    }
    toElement(html, useParser = false, isComplete = false) {
      function parseHTMLByDOMParser() {
        const parser = new DOMParser();
        if (isComplete) return parser.parseFromString(html, "text/html");
        else return parser.parseFromString(html, "text/html").body.firstChild;
      }
      function parseHTMLByCreateDom() {
        const $temp = PopsCore.document.createElement("div");
        PopsSafeUtils.setSafeHTML($temp, html);
        if (isComplete) return $temp;
        else return $temp.firstChild;
      }
      if (useParser) return parseHTMLByDOMParser();
      else return parseHTMLByCreateDom();
    }
    append(element, content) {
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      function elementAppendChild(ele, text) {
        if (typeof content === "string") ele.insertAdjacentHTML("beforeend", PopsSafeUtils.getSafeHTML(text));
        else ele.appendChild(text);
      }
      if (Array.isArray(content) || content instanceof NodeList) {
        const fragment = PopsCore.document.createDocumentFragment();
        content.forEach((ele) => {
          if (typeof ele === "string") ele = this.toElement(ele, true, false);
          fragment.appendChild(ele);
        });
        element.appendChild(fragment);
      } else elementAppendChild(element, content);
    }
    appendHead($ele) {
      if (PopsCore.document.head) PopsCore.document.head.appendChild($ele);
      else PopsCore.document.documentElement.appendChild($ele);
    }
    appendBody($ele) {
      if (PopsCore.document.body) PopsCore.document.body.appendChild($ele);
      else PopsCore.document.documentElement.appendChild($ele);
    }
    isShow(element) {
      return Boolean(element.getClientRects().length);
    }
    showElement($ele, ownParent) {
      const $cloneNode = $ele.cloneNode(true);
      $cloneNode.setAttribute("style", "visibility: hidden !important;display:block !important;");
      let $parent = PopsCore.document.documentElement;
      const $root = $ele.getRootNode();
      if (ownParent == null)
        if ($root == $ele) $parent = PopsCore.document.documentElement;
        else $parent = $root;
      else $parent = ownParent;
      $parent.appendChild($cloneNode);
      return {
        cloneNode: $cloneNode,
        recovery() {
          popsDOMUtils.remove($cloneNode);
        },
      };
    }
    getStyleValue(element, styleName) {
      let view = null;
      let styles = null;
      if (element instanceof CSSStyleDeclaration) styles = element;
      else {
        view = element.ownerDocument.defaultView;
        if (!view || !view.opener) view = window;
        styles = view.getComputedStyle(element);
      }
      const value = parseFloat(styles[styleName]);
      if (isNaN(value)) return 0;
      else return value;
    }
    before(element, content) {
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      if (typeof content === "string") element.insertAdjacentHTML("beforebegin", PopsSafeUtils.getSafeHTML(content));
      else element.parentElement.insertBefore(content, element);
    }
    after(element, content) {
      if (typeof element === "string") element = this.selector(element);
      if (element == null) return;
      if (typeof content === "string") element.insertAdjacentHTML("afterend", PopsSafeUtils.getSafeHTML(content));
      else element.parentElement.insertBefore(content, element.nextSibling);
    }
    getKeyFrames(sheet) {
      const result = {};
      Object.keys(sheet.cssRules).forEach((key) => {
        if (sheet.cssRules[key].type === 7 && sheet.cssRules[key].name.startsWith("pops-anim-"))
          result[sheet.cssRules[key].name] = sheet.cssRules[key];
      });
      return result;
    }
    calcColor() {
      function useChangeColor() {
        const hexToRgb = (str) => {
          let hexs = "";
          if (!/^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(str)) {
            console.warn("输入错误的hex");
            return "";
          }
          str = str.replace("#", "");
          hexs = str.match(/../g);
          for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16);
          return hexs;
        };
        const rgbToHex = (r, g, b) => {
          const reg = /^\d{1,3}$/;
          if (!reg.test(r) || !reg.test(g) || !reg.test(b)) {
            console.warn("输入错误的rgb颜色值");
            return "";
          }
          const hexs = [r.toString(16), g.toString(16), b.toString(16)];
          for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`;
          return `#${hexs.join("")}`;
        };
        const getDarkColor = (color, level) => {
          if (!/^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(color)) {
            console.warn("输入错误的hex颜色值");
            return "";
          }
          const rgb = useChangeColor().hexToRgb(color);
          for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level));
          return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2]);
        };
        const getLightColor = (color, level) => {
          if (!/^#(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/.test(color)) {
            console.warn("输入错误的hex颜色值");
            return "";
          }
          const rgb = useChangeColor().hexToRgb(color);
          for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);
          return useChangeColor().rgbToHex(rgb[0], rgb[1], rgb[2]);
        };
        return {
          hexToRgb,
          rgbToHex,
          getDarkColor,
          getLightColor,
        };
      }
      return useChangeColor();
    }
    getTransform(element) {
      let transform_left = 0;
      let transform_top = 0;
      const elementTransform = PopsCore.globalThis.getComputedStyle(element).transform;
      if (elementTransform !== "none" && elementTransform != null && elementTransform !== "") {
        const elementTransformSplit = elementTransform.match(/\((.+)\)/)?.[1]?.split?.(",");
        transform_left = Math.abs(parseInt(elementTransformSplit[4]));
        transform_top = Math.abs(parseInt(elementTransformSplit[5]));
      }
      return {
        transformLeft: transform_left,
        transformTop: transform_top,
      };
    }
    remove($el) {
      if (typeof $el === "string") $el = this.selectorAll($el);
      if ($el == null) return;
      if (CommonUtils.isNodeList($el)) {
        $el.forEach(($elItem) => {
          this.remove($elItem);
        });
        return;
      }
      $el.querySelectorAll("*").forEach(($elItem) => {
        if (!($elItem instanceof Element)) return;
        this.offAll($elItem);
      });
      this.offAll($el);
      if (typeof $el.remove === "function") $el.remove();
      else if ($el.parentElement) $el.parentElement.removeChild($el);
      else if ($el.parentNode) $el.parentNode.removeChild($el);
    }
  };
  var popsDOMUtils = new PopsDOMUtils();
  var PopsElementHandler = {
    createMask(guid, zIndex = 101, style = "") {
      zIndex = zIndex - 100;
      if (style.startsWith(";")) style = style.replace(";", "");
      return `<div class="pops-mask" data-guid="${guid}" style="z-index:${zIndex};${style}"></div>`;
    },
    createAnim(guid, type, config, html = "", bottomBtnHTML = "", zIndex) {
      const __config__ = config;
      let popsAnimStyle = "";
      let popsStyle = "";
      const popsPosition = __config__.position || "";
      if (config.zIndex != null) popsAnimStyle += `z-index: ${zIndex};`;
      if (__config__.width != null) popsStyle += `width: ${__config__.width};`;
      if (__config__.height != null) popsStyle += `height: ${__config__.height};`;
      const hasBottomBtn = bottomBtnHTML.trim() === "" ? false : true;
      const popsClassNameList = ["pops"];
      if (config.class) popsClassNameList.push(...config.class.split(" "));
      return `
		<div class="pops-anim" anim="${__config__.animation || ""}" style="${popsAnimStyle}" data-guid="${guid}">${config.style != null ? `<style tyle="text/css" data-name="style">${config.style}</style>` : ""}
    ${config.lightStyle != null ? `<style tyle="text/css" data-name="lightStyle">@media (prefers-color-scheme: light) {${config.lightStyle}}</style>` : ""}
    ${config.darkStyle != null ? `<style tyle="text/css" data-name="darkStyle">@media (prefers-color-scheme: dark) {${config.darkStyle}}</style>` : ""}
			<div class="${popsClassNameList.join(" ")}" data-bottom-btn="${hasBottomBtn}" type-value="${type}" style="${popsStyle}" position="${popsPosition}" data-guid="${guid}">${html}</div>
		</div>`;
    },
    createHeader(type, config) {
      if (!config.btn) return "";
      const confirm_config = config;
      if (type !== "iframe" && !confirm_config.btn?.close?.enable) return "";
      let resultHTML = "";
      let closeHTML = "";
      const iframe_config = config;
      if (type === "iframe" && iframe_config.topRightButton?.trim() !== "") {
        let topRightButtonHTML = "";
        iframe_config.topRightButton.split("|").forEach((item) => {
          item = item.toLowerCase();
          topRightButtonHTML += `
                <button class="pops-header-control" type="button" data-type="${item}">
                    <i class="pops-icon">${PopsIcon.getIcon(item)}</i>
                </button>`;
        });
        resultHTML = `
            <div class="pops-header-controls" data-margin>${topRightButtonHTML}</div>`;
      } else {
        if (confirm_config.btn?.close?.enable)
          closeHTML = `
                <div class="pops-header-controls">
                    <button class="pops-header-control" type="button" data-type="close" data-header>
                    	<i class="pops-icon">${PopsIcon.getIcon("close")}</i>
                    </button>
                </div>`;
        resultHTML = closeHTML;
      }
      return resultHTML;
    },
    createHeaderStyle(type, config) {
      return {
        headerStyle: config?.title?.html ? config?.title?.style || "" : "",
        headerPStyle: config?.title?.html ? "" : config?.title?.style || "",
      };
    },
    createBottom(type, config) {
      if (config.btn == null) return "";
      const confirm_config = config;
      if (!(config.btn?.ok?.enable || confirm_config.btn?.cancel?.enable || confirm_config.btn?.other?.enable))
        return "";
      let btnStyle = "";
      let resultHTML = "";
      let okHTML = "";
      let cancelHTML = "";
      let ohterHTML = "";
      if (config.btn.position) btnStyle += `justify-content: ${config.btn.position};`;
      if (confirm_config.btn.reverse) btnStyle += "flex-direction: row-reverse;";
      if (config.btn?.ok?.enable) {
        let okButtonSizeClassName = "";
        if (config.btn.ok.size === "large") okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
        else if (config.btn.ok.size === "small") okButtonSizeClassName = "pops-button-" + config.btn.ok.size;
        let okIconHTML = "";
        const okIcon = confirm_config.btn.ok.icon;
        if (okIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(okIcon)) iconHTML = PopsIcon.getIcon(okIcon);
          else iconHTML = okIcon;
          iconHTML = iconHTML || "";
          okIconHTML = `<i class="pops-bottom-icon" is-loading="${config.btn.ok.iconIsLoading}">${iconHTML}</i>`;
        }
        okHTML = `
            <button 
				class="pops-${type}-btn-ok ${okButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.ok?.type}"
				data-has-icon="${(confirm_config.btn.ok.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.ok?.rightIcon}"
            >${okIconHTML}<span>${config.btn.ok.text}</span>
            </button>`;
      }
      if (confirm_config.btn?.cancel?.enable) {
        let cancelButtonSizeClassName = "";
        if (confirm_config.btn.cancel.size === "large")
          cancelButtonSizeClassName = "pops-button-" + confirm_config.btn.cancel.size;
        else if (confirm_config.btn.cancel.size === "small")
          cancelButtonSizeClassName = "pops-button-" + confirm_config.btn.cancel.size;
        let cancelIconHTML = "";
        const cancelIcon = confirm_config.btn.cancel.icon;
        if (cancelIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(cancelIcon)) iconHTML = PopsIcon.getIcon(cancelIcon);
          else iconHTML = cancelIcon;
          iconHTML = iconHTML || "";
          cancelIconHTML = `<i class="pops-bottom-icon" is-loading="${confirm_config.btn.cancel.iconIsLoading}">${iconHTML}</i>`;
        }
        cancelHTML = `
            <button
				class="pops-${type}-btn-cancel ${cancelButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.cancel.type}"
				data-has-icon="${(confirm_config.btn.cancel.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.cancel.rightIcon}"
            >${cancelIconHTML}<span>${confirm_config.btn.cancel.text}</span>
            </button>`;
      }
      if (confirm_config.btn?.other?.enable) {
        let otherButtonSizeClassName = "";
        if (confirm_config.btn.other.size === "large")
          otherButtonSizeClassName = "pops-button-" + confirm_config.btn.other.size;
        else if (confirm_config.btn.other.size === "small")
          otherButtonSizeClassName = "pops-button-" + confirm_config.btn.other.size;
        let otherIconHTML = "";
        const otherIcon = confirm_config.btn.other.icon;
        if (otherIcon !== "") {
          let iconHTML = "";
          if (PopsIcon.hasIcon(otherIcon)) iconHTML = PopsIcon.getIcon(otherIcon);
          iconHTML = iconHTML || "";
          otherIconHTML = `<i class="pops-bottom-icon" is-loading="${confirm_config.btn.other.iconIsLoading}">${iconHTML}</i>`;
        }
        ohterHTML = `
            <button
				class="pops-${type}-btn-other ${otherButtonSizeClassName}"
				type="button"
				data-type="${confirm_config.btn.other.type}"
				data-has-icon="${(confirm_config.btn.other.icon || "") !== ""}"
				data-rightIcon="${confirm_config.btn.other.rightIcon}"
            >${otherIconHTML}<span>${confirm_config.btn.other.text}</span>
            </button>`;
      }
      if (confirm_config.btn.merge) {
        let flexStyle = "display: flex;";
        if (confirm_config.btn.mergeReverse) flexStyle += "flex-direction: row-reverse;";
        else flexStyle += "flex-direction: row;";
        resultHTML = `
            <div class="pops-botttom-btn-controls pops-${type}-btn" style="${btnStyle}">${ohterHTML}<div 
                    class="pops-${type}-btn-merge"
                    style="${flexStyle}">${okHTML}${cancelHTML}</div>
            </div>
            `;
      } else
        resultHTML = `<div class="pops-botttom-btn-controls pops-${type}-btn" style="${btnStyle}">${okHTML}${cancelHTML}${ohterHTML}</div>`;
      return resultHTML;
    },
    createContentStyle(type, config) {
      return {
        contentStyle: config?.content?.html ? config?.content?.style || "" : "",
        contentPStyle: config?.content?.html ? "" : config?.content?.style || "",
      };
    },
    parseElement(html) {
      return popsDOMUtils.parseTextToDOM(html);
    },
    addStyle($parent, style) {
      if (style == null) return;
      const $css = popsDOMUtils.createElement(
        "style",
        { innerHTML: style },
        {
          type: "text/css",
          "data-name": "general",
        }
      );
      $parent.appendChild($css);
      return $css;
    },
    addLightStyle($parent, style) {
      const darkCSS = `
      @media (prefers-color-scheme: light) {
        ${style ?? ""}
      }
    `;
      const $css = this.addStyle($parent, darkCSS);
      if (!$css) return;
      $css.setAttribute("data-name", "light");
      return $css;
    },
    addDarkStyle($parent, style) {
      const darkCSS = `
      @media (prefers-color-scheme: dark) {
        ${style ?? ""}
      }
    `;
      const $css = this.addStyle($parent, darkCSS);
      if (!$css) return;
      $css.setAttribute("data-name", "dark");
      return $css;
    },
  };
  var PopsCSS = {
    index:
      '@charset "utf-8";\n.pops * {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  -webkit-tap-highlight-color: transparent;\n  /* 代替::-webkit-scrollbar */\n  scrollbar-width: thin;\n}\n.pops {\n  --pops-bg-opacity: 1;\n  --pops-bd-opacity: 1;\n  --pops-font-size: 16px;\n  interpolate-size: allow-keywords;\n  --pops-color: #000000;\n  --pops-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  --pops-bd-color: rgb(235, 238, 245, var(--pops-bd-opacity));\n  --pops-box-shadow-color: rgba(0, 0, 0, 0.12);\n  --pops-title-color: #000000;\n  --pops-title-border-color: var(--pops-bd-color);\n  --pops-content-color: #000000;\n  --pops-bottom-btn-controls-border-color: var(--pops-bd-color);\n  --pops-components-is-disabled-text-color: #a8abb2;\n  --pops-components-is-disabled-bg-color: #f5f7fa;\n}\n@media (prefers-color-scheme: dark) {\n  .pops {\n    --pops-mask-bg-opacity: 0.8;\n    --pops-color: #ffffff;\n    --pops-dark-color: #262626;\n    --pops-bg-color: rgb(17, 17, 17, var(--pops-bg-opacity));\n    --pops-bd-color: rgb(55, 55, 55, var(--pops-bd-opacity));\n    --pops-box-shadow-color: rgba(81, 81, 81, 0.12);\n    --pops-title-color: #e8e8e8;\n    --pops-title-border-color: var(--pops-bd-color);\n    --pops-content-color: #e5e5e5;\n    --pops-components-is-disabled-text-color: #a8abb2;\n    --pops-components-is-disabled-bg-color: #262727;\n  }\n}\n.pops {\n  color: var(--pops-color);\n  background-color: var(--pops-bg-color);\n  border: 1px solid var(--pops-bd-color);\n  border-radius: 4px;\n  font-size: var(--pops-font-size);\n  line-height: normal;\n  box-shadow: 0 0 12px var(--pops-box-shadow-color);\n  box-sizing: border-box;\n  overflow: hidden;\n  transition: all 0.35s;\n  display: flex;\n  flex-direction: column;\n}\n.pops-anim {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.pops-anim[anim=""] {\n  top: unset;\n  right: unset;\n  bottom: unset;\n  left: unset;\n  width: unset;\n  height: unset;\n  transition: none;\n}\n/* 底部图标动画和样式 */\n.pops i.pops-bottom-icon[is-loading="true"] {\n  animation: rotating 2s linear infinite;\n}\n.pops i.pops-bottom-icon {\n  height: 1em;\n  width: 1em;\n  line-height: normal;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  fill: currentColor;\n  color: inherit;\n  font-size: inherit;\n}\n\n/* 遮罩层样式 */\n.pops-mask {\n  --pops-mask-bg-opacity: 0.4;\n  --pops-mask-bg-color: rgba(0, 0, 0, var(--pops-mask-bg-opacity));\n}\n.pops-mask {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n  background-color: var(--pops-mask-bg-color);\n  box-shadow: none;\n  transition: none;\n}\n\n.pops-header-controls button.pops-header-control[type][data-header] {\n  float: right;\n  margin: 0 0;\n  outline: 0;\n  border: 0;\n  border-color: rgb(136, 136, 136, var(--pops-bd-opacity));\n  background-color: transparent;\n  color: #888;\n  cursor: pointer;\n}\n.pops-header-controls button.pops-header-control[data-type="max"],\n.pops-header-controls button.pops-header-control[data-type="mise"],\n.pops-header-controls button.pops-header-control[data-type="min"] {\n  outline: 0 !important;\n  border: 0;\n  border-color: rgb(136, 136, 136, var(--pops-bd-opacity));\n  background-color: transparent;\n  color: rgb(136, 136, 136);\n  cursor: pointer;\n  transition: all 0.3s ease-in-out;\n}\nbutton.pops-header-control i {\n  color: rgb(144, 147, 153);\n  font-size: inherit;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  fill: currentColor;\n}\nbutton.pops-header-control svg {\n  height: 1.25em;\n  width: 1.25em;\n}\nbutton.pops-header-control {\n  right: 15px;\n  padding: 0;\n  border: none;\n  outline: 0;\n  background: 0 0;\n  cursor: pointer;\n  position: unset;\n  line-height: normal;\n}\nbutton.pops-header-control i:hover {\n  color: rgb(64, 158, 255);\n}\n.pops-header-controls[data-margin] button.pops-header-control {\n  margin: 0 6px;\n  display: flex;\n  align-items: center;\n}\n.pops[type-value] .pops-header-controls {\n  display: flex;\n  gap: 6px;\n}\n\n/* 代码块 <code> */\n.pops code {\n  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;\n  font-size: 0.85em;\n  color: #000;\n  background-color: #f0f0f0;\n  border-radius: 3px;\n  border: 0;\n  padding: 0.2em 0;\n  white-space: normal;\n  background: #f5f5f5;\n  text-wrap: wrap;\n  text-align: left;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.4;\n  -moz-tab-size: 8;\n  -o-tab-size: 8;\n  tab-size: 8;\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n  direction: ltr;\n}\n\n.pops code::before,\n.pops code::after {\n  letter-spacing: -0.2em;\n  content: "\\00a0";\n}\n\n/* 标题 */\n.pops .pops-title {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-bottom: 1px solid var(--pops-title-border-color);\n  width: 100%;\n  height: var(--container-title-height);\n}\n/* 标题-普通文本 */\n.pops .pops-title p[pops] {\n  color: var(--pops-title-color);\n  width: 100%;\n  height: 100%;\n  align-content: center;\n  overflow: hidden;\n  text-indent: 15px;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  font-weight: 500;\n  line-height: normal;\n}\n\n/* 内容 */\n.pops .pops-content {\n  width: 100%;\n  /*height: calc(\n		100% - var(--container-title-height) - var(--container-bottom-btn-height)\n	);*/\n  flex: 1;\n  overflow: auto;\n  word-break: break-word;\n}\n/* 内容-普通文本 */\n.pops .pops-content p[pops] {\n  color: var(--pops-content-color);\n  padding: 5px 10px;\n  text-indent: 15px;\n}\n\n/* 底部-按钮组 */\n.pops .pops-botttom-btn-controls {\n  display: flex;\n  padding: 10px 10px 10px 10px;\n  width: 100%;\n  height: var(--container-bottom-btn-height);\n  max-height: var(--container-bottom-btn-height);\n  line-height: normal;\n  border-top: 1px solid var(--pops-bottom-btn-controls-border-color);\n  text-align: right;\n  align-items: center;\n}\n',
    ninePalaceGridPosition:
      '.pops[position="top_left"] {\n  position: fixed;\n  top: 0;\n  left: 0;\n}\n.pops[position="top"] {\n  position: fixed;\n  top: 0;\n  left: 50%;\n  transform: translateX(-50%);\n}\n.pops[position="top_right"] {\n  position: fixed;\n  top: 0;\n  right: 0;\n}\n.pops[position="center_left"] {\n  position: fixed;\n  top: 50%;\n  left: 0;\n  transform: translateY(-50%);\n}\n.pops[position="center"] {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n}\n.pops[position="center_right"] {\n  position: fixed;\n  top: 50%;\n  right: 0;\n  transform: translateY(-50%);\n}\n.pops[position="bottom_left"] {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n}\n.pops[position="bottom"] {\n  position: fixed;\n  bottom: 0;\n  left: 50%;\n  transform: translate(-50%, 0);\n}\n.pops[position="bottom_right"] {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n}\n',
    scrollbar:
      "/* ::-webkit-scrollbar 是非标准的css */\n/* https://caniuse.com/?search=%20%3A%3A-webkit-scrollbar */\n.pops ::-webkit-scrollbar {\n  width: 6px;\n  height: 0;\n}\n\n/* 滚动条轨道 */\n.pops ::-webkit-scrollbar-track {\n  width: 0;\n}\n/* 滚动条滑块 */\n.pops ::-webkit-scrollbar-thumb {\n  min-height: 28px;\n  border-radius: 2em;\n  background: rgb(204, 204, 204, var(--pops-bg-opacity, 1));\n  background-clip: padding-box;\n}\n/* 滚动条滑块 */\n.pops ::-webkit-scrollbar-thumb:hover {\n  background: rgb(178, 178, 178, var(--pops-bg-opacity, 1));\n}\n",
    button:
      '.pops {\n  --button-font-size: 14px;\n  --button-height: 32px;\n  --button-color: rgb(51, 51, 51);\n  --button-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n  --button-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n  --button-margin-top: 0px;\n  --button-margin-bottom: 0px;\n  --button-margin-left: 5px;\n  --button-margin-right: 5px;\n  --button-padding-top: 6px;\n  --button-padding-bottom: 6px;\n  --button-padding-left: 12px;\n  --button-padding-right: 12px;\n  --button-radius: 4px;\n\n  --container-title-height: 55px;\n  --container-bottom-btn-height: 55px;\n\n  /* default按钮 */\n  --button-default-color: #333333;\n  --button-default-bd-color: #dcdfe6;\n  --button-default-bg-color: #ffffff;\n  --button-default-active-color: #409eff;\n  --button-default-active-bd-color: #409eff;\n  --button-default-active-bg-color: #ecf5ff;\n  --button-default-hover-color: #409eff;\n  --button-default-hover-bd-color: #c6e2ff;\n  --button-default-hover-bg-color: #ecf5ff;\n  --button-default-focus-visible-outline-color: #a0cfff;\n  --button-default-focus-visible-outline: 2px solid var(--button-default-focus-visible-outline-color);\n  --button-default-focus-visible-outline-offset: 1px;\n  --button-default-disabled-color: #a8abb2;\n  --button-default-disabled-bd-color: #ffffff;\n  --button-default-disabled-bg-color: #e4e7ed;\n\n  /* primary按钮 */\n  --button-primary-color: #ffffff;\n  --button-primary-bd-color: #409eff;\n  --button-primary-bg-color: #409eff;\n  --button-primary-active-color: #ffffff;\n  --button-primary-active-bd-color: #337ecc;\n  --button-primary-active-bg-color: #337ecc;\n  --button-primary-hover-color: #ffffff;\n  --button-primary-hover-bd-color: #79bbff;\n  --button-primary-hover-bg-color: #79bbff;\n  --button-primary-focus-visible-outline-color: #a0cfff;\n  --button-primary-focus-visible-outline: 2px solid var(--button-primary-focus-visible-outline-color);\n  --button-primary-focus-visible-outline-offset: 1px;\n  --button-primary-disabled-color: #ffffff80;\n  --button-primary-disabled-bd-color: #a0cfff;\n  --button-primary-disabled-bg-color: #a0cfff;\n\n  /* success按钮 */\n  --button-success-color: #ffffff;\n  --button-success-bd-color: #4cae4c;\n  --button-success-bg-color: #5cb85c;\n  --button-success-active-color: #ffffff;\n  --button-success-active-bd-color: #529b2e;\n  --button-success-active-bg-color: #529b2e;\n  --button-success-hover-color: #ffffff;\n  --button-success-hover-bd-color: #95d475;\n  --button-success-hover-bg-color: #95d475;\n  --button-success-focus-visible-outline-color: #b3e19d;\n  --button-success-focus-visible-outline: 2px solid var(--button-success-focus-visible-outline-color);\n  --button-success-focus-visible-outline-offset: 1px;\n  --button-success-disabled-color: #ffffff80;\n  --button-success-disabled-bd-color: #b3e19d;\n  --button-success-disabled-bg-color: #b3e19d;\n\n  /* info按钮 */\n  --button-info-color: #ffffff;\n  --button-info-bd-color: #909399;\n  --button-info-bg-color: #909399;\n  --button-info-active-color: #ffffff;\n  --button-info-active-bd-color: #73767a;\n  --button-info-active-bg-color: #73767a;\n  --button-info-hover-color: #ffffff;\n  --button-info-hover-bd-color: #b1b3b8;\n  --button-info-hover-bg-color: #b1b3b8;\n  --button-info-focus-visible-outline-color: #c8c9cc;\n  --button-info-focus-visible-outline: 2px solid var(--button-info-focus-visible-outline-color);\n  --button-info-focus-visible-outline-offset: 1px;\n  --button-info-disabled-color: #ffffff80;\n  --button-info-disabled-bd-color: #c8c9cc;\n  --button-info-disabled-bg-color: #c8c9cc;\n\n  /* warning按钮 */\n  --button-warning-color: #ffffff;\n  --button-warning-bd-color: #e6a23c;\n  --button-warning-bg-color: #e6a23c;\n  --button-warning-active-color: #ffffff;\n  --button-warning-active-bd-color: #b88230;\n  --button-warning-active-bg-color: #b88230;\n  --button-warning-hover-color: #ffffff80;\n  --button-warning-hover-bd-color: #eebe77;\n  --button-warning-hover-bg-color: #eebe77;\n  --button-warning-focus-visible-outline-color: #f3d19e;\n  --button-warning-focus-visible-outline: 2px solid var(--button-warning-focus-visible-outline-color);\n  --button-warning-focus-visible-outline-offset: 1px;\n  --button-warning-disabled-color: #ffffff80;\n  --button-warning-disabled-bd-color: #f3d19e;\n  --button-warning-disabled-bg-color: #f3d19e;\n\n  /* danger按钮 */\n  --button-danger-color: #ffffff;\n  --button-danger-bd-color: #f56c6c;\n  --button-danger-bg-color: #f56c6c;\n  --button-danger-active-color: #ffffff;\n  --button-danger-active-bd-color: #c45656;\n  --button-danger-active-bg-color: #c45656;\n  --button-danger-hover-color: #ffffff;\n  --button-danger-hover-bd-color: #f89898;\n  --button-danger-hover-bg-color: #f89898;\n  --button-danger-focus-visible-outline-color: #fab6b6;\n  --button-danger-focus-visible-outline: 2px solid var(--button-danger-focus-visible-outline-color);\n  --button-danger-focus-visible-outline-offset: 1px;\n  --button-danger-disabled-color: #ffffff80;\n  --button-danger-disabled-bd-color: #fab6b6;\n  --button-danger-disabled-bg-color: #fab6b6;\n\n  /* xiaomi-primary按钮 */\n  --button-xiaomi-primary-color: #ffffff;\n  --button-xiaomi-primary-bd-color: #ff5c00;\n  --button-xiaomi-primary-bg-color: #ff5c00;\n  --button-xiaomi-primary-active-color: #ffffff;\n  --button-xiaomi-primary-active-bd-color: #da4f00;\n  --button-xiaomi-primary-active-bg-color: #da4f00;\n  --button-xiaomi-primary-hover-color: #ffffff;\n  --button-xiaomi-primary-hover-bd-color: #ff7e29;\n  --button-xiaomi-primary-hover-bg-color: #ff7e29;\n  --button-xiaomi-primary-focus-visible-outline-color: #ffa061;\n  --button-xiaomi-primary-focus-visible-outline: 2px solid var(--button-xiaomi-primary-focus-visible-outline-color);\n  --button-xiaomi-primary-focus-visible-outline-offset: 1px;\n  --button-xiaomi-primary-disabled-color: #ffffff80;\n  --button-xiaomi-primary-disabled-bd-color: #fad5b6;\n  --button-xiaomi-primary-disabled-bg-color: #fad5b6;\n\n  /* violet按钮 */\n  --button-violet-color: #ffffff;\n  --button-violet-bd-color: #626aef;\n  --button-violet-bg-color: #626aef;\n  --button-violet-active-color: #ffffff;\n  --button-violet-active-bd-color: #8188f2;\n  --button-violet-active-bg-color: #8188f2;\n  --button-violet-hover-color: #ffffff;\n  --button-violet-hover-bd-color: #4b50ad;\n  --button-violet-hover-bg-color: #4b50ad;\n  --button-violet-focus-visible-outline-color: #2a598a;\n  --button-violet-focus-visible-outline: 2px solid var(--button-violet-focus-visible-outline-color);\n  --button-violet-focus-visible-outline-offset: 1px;\n  --button-violet-disabled-color: #ffffff80;\n  --button-violet-disabled-bd-color: #3b3f82;\n  --button-violet-disabled-bg-color: #3b3f82;\n}\n\n@media (prefers-color-scheme: dark) {\n  .pops {\n    /* default按钮 */\n    --button-default-color: #cfd3dc;\n    --button-default-bd-color: #4c4d4f;\n    --button-default-bg-color: transparent;\n    --button-default-active-color: #409eff;\n    --button-default-active-bd-color: #409eff;\n    --button-default-active-bg-color: #18222c;\n    --button-default-hover-color: #409eff;\n    --button-default-hover-bd-color: #213d5b;\n    --button-default-hover-bg-color: #18222c;\n    --button-default-focus-visible-outline-color: #2a598a;\n    --button-default-focus-visible-outline: 2px solid var(--button-default-focus-visible-outline-color);\n    --button-default-focus-visible-outline-offset: 1px;\n    --button-default-disabled-color: #ffffff80;\n    --button-default-disabled-bd-color: #414243;\n    --button-default-disabled-bg-color: transparent;\n\n    /* primary按钮 */\n    --button-primary-color: #ffffff;\n    --button-primary-bd-color: #409eff;\n    --button-primary-bg-color: #409eff;\n    --button-primary-active-color: #ffffff;\n    --button-primary-active-bd-color: #66b1ff;\n    --button-primary-active-bg-color: #66b1ff;\n    --button-primary-hover-color: #ffffff;\n    --button-primary-hover-bd-color: #3375b9;\n    --button-primary-hover-bg-color: #3375b9;\n    --button-primary-focus-visible-outline-color: #2a598a;\n    --button-primary-focus-visible-outline: 2px solid var(--button-primary-focus-visible-outline-color);\n    --button-primary-focus-visible-outline-offset: 1px;\n    --button-primary-disabled-color: #ffffff80;\n    --button-primary-disabled-bd-color: #2a598a;\n    --button-primary-disabled-bg-color: #2a598a;\n\n    /* success按钮 */\n    --button-success-color: #ffffff;\n    --button-success-bd-color: #67c23a;\n    --button-success-bg-color: #67c23a;\n    --button-success-active-color: #ffffff;\n    --button-success-active-bd-color: #85ce61;\n    --button-success-active-bg-color: #85ce61;\n    --button-success-hover-color: #ffffff;\n    --button-success-hover-bd-color: #4e8e2f;\n    --button-success-hover-bg-color: #4e8e2f;\n    --button-success-focus-visible-outline-color: #3e6b27;\n    --button-success-focus-visible-outline: 2px solid var(--button-success-focus-visible-outline-color);\n    --button-success-focus-visible-outline-offset: 1px;\n    --button-success-disabled-color: #ffffff80;\n    --button-success-disabled-bd-color: #3e6b27;\n    --button-success-disabled-bg-color: #3e6b27;\n\n    /* info按钮 */\n    --button-info-color: #ffffff;\n    --button-info-bd-color: #909399;\n    --button-info-bg-color: #909399;\n    --button-info-active-color: #ffffff;\n    --button-info-active-bd-color: #a6a9ad;\n    --button-info-active-bg-color: #a6a9ad;\n    --button-info-hover-color: #ffffff;\n    --button-info-hover-bd-color: #6b6d71;\n    --button-info-hover-bg-color: #6b6d71;\n    --button-info-focus-visible-outline-color: #525457;\n    --button-info-focus-visible-outline: 2px solid var(--button-info-focus-visible-outline-color);\n    --button-info-focus-visible-outline-offset: 1px;\n    --button-info-disabled-color: #ffffff80;\n    --button-info-disabled-bd-color: #525457;\n    --button-info-disabled-bg-color: #525457;\n\n    /* warning按钮 */\n    --button-warning-color: #ffffff;\n    --button-warning-bd-color: #e6a23c;\n    --button-warning-bg-color: #e6a23c;\n    --button-warning-active-color: #ffffff;\n    --button-warning-active-bd-color: #ebb563;\n    --button-warning-active-bg-color: #ebb563;\n    --button-warning-hover-color: #ffffff80;\n    --button-warning-hover-bd-color: #a77730;\n    --button-warning-hover-bg-color: #a77730;\n    --button-warning-focus-visible-outline-color: #7d5b28;\n    --button-warning-focus-visible-outline: 2px solid var(--button-warning-focus-visible-outline-color);\n    --button-warning-focus-visible-outline-offset: 1px;\n    --button-warning-disabled-color: #ffffff80;\n    --button-warning-disabled-bd-color: #7d5b28;\n    --button-warning-disabled-bg-color: #7d5b28;\n\n    /* danger按钮 */\n    --button-danger-color: #ffffff;\n    --button-danger-bd-color: #f56c6c;\n    --button-danger-bg-color: #f56c6c;\n    --button-danger-active-color: #ffffff;\n    --button-danger-active-bd-color: #f78989;\n    --button-danger-active-bg-color: #f78989;\n    --button-danger-hover-color: #ffffff;\n    --button-danger-hover-bd-color: #b25252;\n    --button-danger-hover-bg-color: #b25252;\n    --button-danger-focus-visible-outline-color: #854040;\n    --button-danger-focus-visible-outline: 2px solid var(--button-danger-focus-visible-outline-color);\n    --button-danger-focus-visible-outline-offset: 1px;\n    --button-danger-disabled-color: #ffffff80;\n    --button-danger-disabled-bd-color: #854040;\n    --button-danger-disabled-bg-color: #854040;\n  }\n}\n.pops[data-bottom-btn="false"] {\n  --container-bottom-btn-height: 0px;\n}\n.pops button {\n  white-space: nowrap;\n  float: right;\n  display: inline-block;\n  margin: var(--button-margin-top) var(--button-margin-right) var(--button-margin-bottom) var(--button-margin-left);\n  padding: var(--button-padding-top) var(--button-padding-right) var(--button-padding-bottom) var(--button-padding-left);\n  outline: 0;\n}\n.pops button[data-has-icon="false"] .pops-bottom-icon {\n  display: none;\n}\n.pops button {\n  border-radius: var(--button-radius);\n  box-shadow: none;\n  font-weight: 400;\n  font-size: var(--button-font-size);\n  cursor: pointer;\n  transition: all 0.3s ease-in-out;\n}\n.pops button {\n  display: flex;\n  align-items: center;\n  height: var(--button-height);\n  line-height: normal;\n  box-sizing: border-box;\n  border: 1px solid var(--button-bd-color);\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops button {\n  color: var(--button-color);\n  border-color: var(--button-bd-color);\n  background-color: var(--button-bg-color);\n}\n.pops button:active {\n  color: var(--button-color);\n  border-color: var(--button-bd-color);\n  background-color: var(--button-bg-color);\n  outline: 0;\n}\n.pops button:hover {\n  color: var(--button-color);\n  border-color: var(--button-bd-color);\n  background-color: var(--button-bg-color);\n}\n.pops button:focus-visible {\n  color: var(--button-color);\n  border-color: var(--button-bd-color);\n  background-color: var(--button-bg-color);\n}\n.pops button:disabled {\n  cursor: not-allowed;\n  color: var(--button-color);\n  border-color: var(--button-bd-color);\n  background-color: var(--button-bg-color);\n}\n.pops button.pops-button-large {\n  --button-height: 32px;\n  --button-padding-top: 12px;\n  --button-padding-bottom: 12px;\n  --button-padding-left: 19px;\n  --button-padding-right: 19px;\n  --button-font-size: 14px;\n  --button-border-radius: 4px;\n}\n\n.pops button.pops-button-small {\n  --button-height: 24px;\n  --button-padding-top: 5px;\n  --button-padding-bottom: 5px;\n  --button-padding-left: 11px;\n  --button-padding-right: 11px;\n  --button-font-size: 12px;\n  --button-border-radius: 4px;\n}\n.pops-panel-button-no-icon .pops-panel-button_inner i {\n  display: none;\n}\n.pops-panel-button-right-icon .pops-panel-button_inner {\n  flex-direction: row-reverse;\n}\n.pops-panel-button .pops-panel-button_inner i:has(svg),\n.pops-panel-button-right-icon .pops-panel-button-text {\n  margin-right: 6px;\n}\n\n.pops button[data-type="default"] {\n  --button-color: var(--button-default-color);\n  --button-bd-color: var(--button-default-bd-color);\n  --button-bg-color: var(--button-default-bg-color);\n}\n.pops button[data-type="default"]:active {\n  --button-color: var(--button-default-active-color);\n  --button-bd-color: var(--button-default-active-bd-color);\n  --button-bg-color: var(--button-default-active-bg-color);\n}\n.pops button[data-type="default"]:hover {\n  --button-color: var(--button-default-hover-color);\n  --button-bd-color: var(--button-default-hover-bd-color);\n  --button-bg-color: var(--button-default-hover-bg-color);\n}\n.pops button[data-type="default"]:focus-visible {\n  outline: var(--button-default-focus-visible-outline);\n  outline-offset: var(--button-default-focus-visible-outline-offset);\n}\n.pops button[data-type="default"]:disabled {\n  --button-color: var(--button-default-disabled-color);\n  --button-bd-color: var(--button-default-disabled-bd-color);\n  --button-bg-color: var(--button-default-disabled-bg-color);\n}\n\n.pops button[data-type="primary"] {\n  --button-color: var(--button-primary-color);\n  --button-bd-color: var(--button-primary-bd-color);\n  --button-bg-color: var(--button-primary-bg-color);\n}\n.pops button[data-type="primary"]:active {\n  --button-color: var(--button-primary-active-color);\n  --button-bd-color: var(--button-primary-active-bd-color);\n  --button-bg-color: var(--button-primary-active-bg-color);\n}\n.pops button[data-type="primary"]:hover {\n  --button-color: var(--button-primary-hover-color);\n  --button-bd-color: var(--button-primary-hover-bd-color);\n  --button-bg-color: var(--button-primary-hover-bg-color);\n}\n.pops button[data-type="primary"]:focus-visible {\n  outline: var(--button-primary-focus-visible-outline);\n  outline-offset: var(--button-primary-focus-visible-outline-offset);\n}\n.pops button[data-type="primary"]:disabled {\n  --button-color: var(--button-primary-disabled-color);\n  --button-bd-color: var(--button-primary-disabled-bd-color);\n  --button-bg-color: var(--button-primary-disabled-bg-color);\n}\n\n.pops button[data-type="success"] {\n  --button-color: var(--button-success-color);\n  --button-bd-color: var(--button-success-bd-color);\n  --button-bg-color: var(--button-success-bg-color);\n}\n.pops button[data-type="success"]:active {\n  --button-color: var(--button-success-active-color);\n  --button-bd-color: var(--button-success-active-bd-color);\n  --button-bg-color: var(--button-success-active-bg-color);\n}\n.pops button[data-type="success"]:hover {\n  --button-color: var(--button-success-hover-color);\n  --button-bd-color: var(--button-success-hover-bd-color);\n  --button-bg-color: var(--button-success-hover-bg-color);\n}\n.pops button[data-type="success"]:focus-visible {\n  outline: var(--button-success-focus-visible-outline);\n  outline-offset: var(--button-success-focus-visible-outline-offset);\n}\n.pops button[data-type="success"]:disabled {\n  --button-color: var(--button-success-disabled-color);\n  --button-bd-color: var(--button-success-disabled-bd-color);\n  --button-bg-color: var(--button-success-disabled-bg-color);\n}\n\n.pops button[data-type="info"] {\n  --button-color: var(--button-info-color);\n  --button-bd-color: var(--button-info-bd-color);\n  --button-bg-color: var(--button-info-bg-color);\n}\n.pops button[data-type="info"]:active {\n  --button-color: var(--button-info-active-color);\n  --button-bd-color: var(--button-info-active-bd-color);\n  --button-bg-color: var(--button-info-active-bg-color);\n}\n.pops button[data-type="info"]:hover {\n  --button-color: var(--button-info-hover-color);\n  --button-bd-color: var(--button-info-hover-bd-color);\n  --button-bg-color: var(--button-info-hover-bg-color);\n}\n.pops button[data-type="info"]:focus-visible {\n  outline: var(--button-info-focus-visible-outline);\n  outline-offset: var(--button-info-focus-visible-outline-offset);\n}\n.pops button[data-type="info"]:disabled {\n  --button-color: var(--button-info-disabled-color);\n  --button-bd-color: var(--button-info-disabled-bd-color);\n  --button-bg-color: var(--button-info-disabled-bg-color);\n}\n\n.pops button[data-type="warning"] {\n  --button-color: var(--button-warning-color);\n  --button-bd-color: var(--button-warning-bd-color);\n  --button-bg-color: var(--button-warning-bg-color);\n}\n.pops button[data-type="warning"]:active {\n  --button-color: var(--button-warning-active-color);\n  --button-bd-color: var(--button-warning-active-bd-color);\n  --button-bg-color: var(--button-warning-active-bg-color);\n}\n.pops button[data-type="warning"]:hover {\n  --button-color: var(--button-warning-hover-color);\n  --button-bd-color: var(--button-warning-hover-bd-color);\n  --button-bg-color: var(--button-warning-hover-bg-color);\n}\n.pops button[data-type="warning"]:focus-visible {\n  outline: var(--button-warning-focus-visible-outline);\n  outline-offset: var(--button-warning-focus-visible-outline-offset);\n}\n.pops button[data-type="warning"]:disabled {\n  --button-color: var(--button-warning-disabled-color);\n  --button-bd-color: var(--button-warning-disabled-bd-color);\n  --button-bg-color: var(--button-warning-disabled-bg-color);\n}\n\n.pops button[data-type="danger"] {\n  --button-color: var(--button-danger-color);\n  --button-bd-color: var(--button-danger-bd-color);\n  --button-bg-color: var(--button-danger-bg-color);\n}\n.pops button[data-type="danger"]:active {\n  --button-color: var(--button-danger-active-color);\n  --button-bd-color: var(--button-danger-active-bd-color);\n  --button-bg-color: var(--button-danger-active-bg-color);\n}\n.pops button[data-type="danger"]:hover {\n  --button-color: var(--button-danger-hover-color);\n  --button-bd-color: var(--button-danger-hover-bd-color);\n  --button-bg-color: var(--button-danger-hover-bg-color);\n}\n.pops button[data-type="danger"]:focus-visible {\n  outline: var(--button-danger-focus-visible-outline);\n  outline-offset: var(--button-danger-focus-visible-outline-offset);\n}\n.pops button[data-type="danger"]:disabled {\n  --button-color: var(--button-danger-disabled-color);\n  --button-bd-color: var(--button-danger-disabled-bd-color);\n  --button-bg-color: var(--button-danger-disabled-bg-color);\n}\n\n.pops button[data-type="xiaomi-primary"] {\n  --button-color: var(--button-xiaomi-primary-color);\n  --button-bd-color: var(--button-xiaomi-primary-bd-color);\n  --button-bg-color: var(--button-xiaomi-primary-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:active {\n  --button-color: var(--button-xiaomi-primary-active-color);\n  --button-bd-color: var(--button-xiaomi-primary-active-bd-color);\n  --button-bg-color: var(--button-xiaomi-primary-active-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:hover {\n  --button-color: var(--button-xiaomi-primary-hover-color);\n  --button-bd-color: var(--button-xiaomi-primary-hover-bd-color);\n  --button-bg-color: var(--button-xiaomi-primary-hover-bg-color);\n}\n.pops button[data-type="xiaomi-primary"]:focus-visible {\n  outline: var(--button-xiaomi-primary-focus-visible-outline);\n  outline-offset: var(--button-xiaomi-primary-focus-visible-outline-offset);\n}\n.pops button[data-type="xiaomi-primary"]:disabled {\n  --button-color: var(--button-xiaomi-primary-disabled-color);\n  --button-bd-color: var(--button-xiaomi-primary-disabled-bd-color);\n  --button-bg-color: var(--button-xiaomi-primary-disabled-bg-color);\n}\n\n.pops button[data-type="violet"] {\n  --button-color: var(--button-violet-color);\n  --button-bd-color: var(--button-violet-bd-color);\n  --button-bg-color: var(--button-violet-bg-color);\n}\n.pops button[data-type="violet"]:active {\n  --button-color: var(--button-violet-active-color);\n  --button-bd-color: var(--button-violet-active-bd-color);\n  --button-bg-color: var(--button-violet-active-bg-color);\n}\n.pops button[data-type="violet"]:hover {\n  --button-color: var(--button-violet-hover-color);\n  --button-bd-color: var(--button-violet-hover-bd-color);\n  --button-bg-color: var(--button-violet-hover-bg-color);\n}\n.pops button[data-type="violet"]:focus-visible {\n  outline: var(--button-violet-focus-visible-outline);\n  outline-offset: var(--button-violet-focus-visible-outline-offset);\n}\n.pops button[data-type="violet"]:disabled {\n  --button-color: var(--button-violet-disabled-color);\n  --button-bd-color: var(--button-violet-disabled-bd-color);\n  --button-bg-color: var(--button-violet-disabled-bg-color);\n}\n',
    common:
      ".pops-flex-items-center {\n  display: flex;\n  align-items: center;\n}\n.pops-flex-y-center {\n  display: flex;\n  justify-content: space-between;\n}\n.pops-flex-x-center {\n  display: flex;\n  align-content: center;\n}\n.pops-hide {\n  display: none;\n}\n.pops-hide-important {\n  display: none !important;\n}\n.pops-no-border {\n  border: 0;\n}\n.pops-no-border-important {\n  border: 0 !important;\n}\n.pops-user-select-none {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops-line-height-center {\n  line-height: normal;\n  align-content: center;\n}\n.pops-width-fill {\n  width: 100%;\n  width: -moz-available;\n  width: -webkit-fill-available;\n}\n.pops-height-fill {\n  height: 100%;\n  height: -moz-available;\n  height: -webkit-fill-available;\n}\n.pops-text-is-disabled {\n  --pops-text-is-disabled-color: #a8abb2;\n  --pops-panel-forms-container-item-left-desc-text-color: var(--pops-text-is-disabled-color);\n  color: var(--pops-text-is-disabled-color);\n}\n.pops-text-is-disabled-important {\n  --pops-text-is-disabled-color: #a8abb2;\n  --pops-panel-forms-container-item-left-desc-text-color: var(--pops-text-is-disabled-color) !important;\n  color: var(--pops-text-is-disabled-color) !important;\n}\n",
    anim: '@keyframes rotating {\n  0% {\n    transform: rotate(0);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes iframeLoadingChange_85 {\n  0% {\n    background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n  }\n  20% {\n    background: linear-gradient(to right, #4995dd, #ead0d0, rgb(123 185 246));\n  }\n  40% {\n    background: linear-gradient(to right, #4995dd, #f4b7b7, rgb(112 178 244));\n  }\n  60% {\n    background: linear-gradient(to right, #4995dd, #ec9393, rgb(80 163 246));\n  }\n  80% {\n    background: linear-gradient(to right, #4995dd, #e87f7f, rgb(25 139 253));\n  }\n  100% {\n    background: linear-gradient(to right, #4995dd, #ee2c2c, rgb(0 124 247));\n  }\n  from {\n    width: 75%;\n  }\n  to {\n    width: 100%;\n  }\n}\n@keyframes iframeLoadingChange {\n  0% {\n    background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n  }\n  20% {\n    background: linear-gradient(to right, #4995dd, #ead0d0, rgb(123 185 246));\n  }\n  40% {\n    background: linear-gradient(to right, #4995dd, #f4b7b7, rgb(112 178 244));\n  }\n  60% {\n    background: linear-gradient(to right, #4995dd, #ec9393, rgb(80 163 246));\n  }\n  80% {\n    background: linear-gradient(to right, #4995dd, #e87f7f, rgb(25 139 253));\n  }\n  100% {\n    background: linear-gradient(to right, #4995dd, #ee2c2c, rgb(0 124 247));\n  }\n  from {\n    width: 0;\n  }\n  to {\n    width: 75%;\n  }\n}\n\n@keyframes searchSelectFalIn {\n  from {\n    opacity: 0;\n    display: none;\n  }\n  to {\n    display: block;\n    opacity: 1;\n  }\n}\n@keyframes searchSelectFalOut {\n  from {\n    display: block;\n    opacity: 1;\n  }\n  to {\n    opacity: 0;\n    display: none;\n  }\n}\n\n@keyframes pops-anim-wait-rotate {\n  form {\n    transform: rotate(0);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes pops-anim-spread {\n  0% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n  100% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n}\n@keyframes pops-anim-shake {\n  0%,\n  100% {\n    transform: translateX(0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    transform: translateX(-10px);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    transform: translateX(10px);\n  }\n}\n@keyframes pops-anim-rolling-left {\n  0% {\n    opacity: 0;\n    transform: translateX(-100%) rotate(-120deg);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0) rotate(0);\n  }\n}\n@keyframes pops-anim-rolling-right {\n  0% {\n    opacity: 0;\n    transform: translateX(100%) rotate(120deg);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0) rotate(0);\n  }\n}\n@keyframes pops-anim-slide-top {\n  0% {\n    opacity: 0;\n    transform: translateY(-200%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@keyframes pops-anim-slide-bottom {\n  0% {\n    opacity: 0;\n    transform: translateY(200%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@keyframes pops-anim-slide-left {\n  0% {\n    opacity: 0;\n    transform: translateX(-200%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes pops-anim-slide-right {\n  0% {\n    transform: translateX(200%);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes pops-anim-fadein {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes pops-anim-fadein-zoom {\n  0% {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@keyframes pops-anim-fadein-alert {\n  0% {\n    transform: scale(0.5);\n  }\n  45% {\n    transform: scale(1.05);\n  }\n  80% {\n    transform: scale(0.95);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n@keyframes pops-anim-don {\n  0% {\n    opacity: 0;\n    transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  2.08333% {\n    transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  4.16667% {\n    transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  6.25% {\n    transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  8.33333% {\n    transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  10.4167% {\n    transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  12.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  14.5833% {\n    transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  16.6667% {\n    transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  18.75% {\n    transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  20.8333% {\n    transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  22.9167% {\n    transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  25% {\n    transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  27.0833% {\n    transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  29.1667% {\n    transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  31.25% {\n    transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  33.3333% {\n    transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  35.4167% {\n    transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  37.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  39.5833% {\n    transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  41.6667% {\n    transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  43.75% {\n    transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  45.8333% {\n    transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  47.9167% {\n    transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  50% {\n    opacity: 1;\n    transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  52.0833% {\n    transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  54.1667% {\n    transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  56.25% {\n    transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  58.3333% {\n    transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  60.4167% {\n    transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  62.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  64.5833% {\n    transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  66.6667% {\n    transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  68.75% {\n    transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  70.8333% {\n    transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  72.9167% {\n    transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  75% {\n    transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  77.0833% {\n    transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  79.1667% {\n    transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  81.25% {\n    transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  83.3333% {\n    transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  85.4167% {\n    transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  87.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  89.5833% {\n    transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  91.6667% {\n    transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  93.75% {\n    transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  95.8333% {\n    transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  97.9167% {\n    transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  100% {\n    opacity: 1;\n    transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n}\n@keyframes pops-anim-roll {\n  0% {\n    transform: perspective(1000px) rotate3d(1, 0, 0, 90deg);\n  }\n  100% {\n    transform: perspective(1000px) rotate3d(1, 0, 0, 0deg);\n  }\n}\n@keyframes pops-anim-sandra {\n  0% {\n    opacity: 0;\n    transform: scale3d(1.1, 1.1, 1);\n  }\n  100% {\n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pops-anim-gather {\n  0% {\n    opacity: 0;\n    transform: scale(5, 0);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1, 1);\n  }\n}\n@keyframes pops-anim-spread-reverse {\n  0% {\n    opacity: 1;\n    transform: scaleX(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n}\n@keyframes pops-anim-shake-reverse {\n  0%,\n  100% {\n    transform: translateX(10px);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    transform: translateX(-10px);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    transform: translateX(0);\n  }\n}\n@keyframes pops-anim-rolling-left-reverse {\n  0% {\n    opacity: 1;\n    transform: translateX(0) rotate(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(-100%) rotate(-120deg);\n  }\n}\n@keyframes pops-anim-rolling-right-reverse {\n  0% {\n    opacity: 1;\n    transform: translateX(0) rotate(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(100%) rotate(120deg);\n  }\n}\n@keyframes pops-anim-slide-top-reverse {\n  0% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-200%);\n  }\n}\n@keyframes pops-anim-slide-bottom-reverse {\n  0% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(200%);\n  }\n}\n@keyframes pops-anim-slide-left-reverse {\n  0% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateX(-200%);\n  }\n}\n@keyframes pops-anim-slide-right-reverse {\n  0% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n  100% {\n    transform: translateX(200%);\n  }\n}\n@keyframes pops-anim-fadein-reverse {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes pops-anim-fadein-zoom-reverse {\n  0% {\n    opacity: 1;\n    transform: scale(1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n}\n@keyframes pops-anim-fadein-alert-reverse {\n  0% {\n    transform: scale(1);\n  }\n  45% {\n    transform: scale(0.95);\n  }\n  80% {\n    transform: scale(1.05);\n  }\n  100% {\n    transform: scale(0.5);\n  }\n}\n@keyframes pops-anim-don-reverse {\n  100% {\n    opacity: 0;\n    transform: matrix3d(0.7, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  97.9167% {\n    transform: matrix3d(0.75266, 0, 0, 0, 0, 0.76342, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  95.8333% {\n    transform: matrix3d(0.81071, 0, 0, 0, 0, 0.84545, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  93.75% {\n    transform: matrix3d(0.86808, 0, 0, 0, 0, 0.9286, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  91.6667% {\n    transform: matrix3d(0.92038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  89.5833% {\n    transform: matrix3d(0.96482, 0, 0, 0, 0, 1.05202, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  87.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 1.08204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  85.4167% {\n    transform: matrix3d(1.02563, 0, 0, 0, 0, 1.09149, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  83.3333% {\n    transform: matrix3d(1.04227, 0, 0, 0, 0, 1.08453, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  81.25% {\n    transform: matrix3d(1.05102, 0, 0, 0, 0, 1.06666, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  79.1667% {\n    transform: matrix3d(1.05334, 0, 0, 0, 0, 1.04355, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  77.0833% {\n    transform: matrix3d(1.05078, 0, 0, 0, 0, 1.02012, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  75% {\n    transform: matrix3d(1.04487, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  72.9167% {\n    transform: matrix3d(1.03699, 0, 0, 0, 0, 0.98534, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  70.8333% {\n    transform: matrix3d(1.02831, 0, 0, 0, 0, 0.97688, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  68.75% {\n    transform: matrix3d(1.01973, 0, 0, 0, 0, 0.97422, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  66.6667% {\n    transform: matrix3d(1.01191, 0, 0, 0, 0, 0.97618, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  64.5833% {\n    transform: matrix3d(1.00526, 0, 0, 0, 0, 0.98122, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  62.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 0.98773, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  60.4167% {\n    transform: matrix3d(0.99617, 0, 0, 0, 0, 0.99433, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  58.3333% {\n    transform: matrix3d(0.99368, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  56.25% {\n    transform: matrix3d(0.99237, 0, 0, 0, 0, 1.00413, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  54.1667% {\n    transform: matrix3d(0.99202, 0, 0, 0, 0, 1.00651, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  52.0833% {\n    transform: matrix3d(0.99241, 0, 0, 0, 0, 1.00726, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  50% {\n    opacity: 1;\n    transform: matrix3d(0.99329, 0, 0, 0, 0, 1.00671, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  47.9167% {\n    transform: matrix3d(0.99447, 0, 0, 0, 0, 1.00529, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  45.8333% {\n    transform: matrix3d(0.99577, 0, 0, 0, 0, 1.00346, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  43.75% {\n    transform: matrix3d(0.99705, 0, 0, 0, 0, 1.0016, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  41.6667% {\n    transform: matrix3d(0.99822, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  39.5833% {\n    transform: matrix3d(0.99921, 0, 0, 0, 0, 0.99884, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  37.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 0.99816, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  35.4167% {\n    transform: matrix3d(1.00057, 0, 0, 0, 0, 0.99795, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  33.3333% {\n    transform: matrix3d(1.00095, 0, 0, 0, 0, 0.99811, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  31.25% {\n    transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99851, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  29.1667% {\n    transform: matrix3d(1.00119, 0, 0, 0, 0, 0.99903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  27.0833% {\n    transform: matrix3d(1.00114, 0, 0, 0, 0, 0.99955, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  25% {\n    transform: matrix3d(1.001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  22.9167% {\n    transform: matrix3d(1.00083, 0, 0, 0, 0, 1.00033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  20.8333% {\n    transform: matrix3d(1.00063, 0, 0, 0, 0, 1.00052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  18.75% {\n    transform: matrix3d(1.00044, 0, 0, 0, 0, 1.00058, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  16.6667% {\n    transform: matrix3d(1.00027, 0, 0, 0, 0, 1.00053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  14.5833% {\n    transform: matrix3d(1.00012, 0, 0, 0, 0, 1.00042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  12.5% {\n    transform: matrix3d(1, 0, 0, 0, 0, 1.00027, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  10.4167% {\n    transform: matrix3d(0.99991, 0, 0, 0, 0, 1.00013, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  8.33333% {\n    transform: matrix3d(0.99986, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  6.25% {\n    transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99991, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  4.16667% {\n    transform: matrix3d(0.99982, 0, 0, 0, 0, 0.99985, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  2.08333% {\n    transform: matrix3d(0.99983, 0, 0, 0, 0, 0.99984, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n  0% {\n    opacity: 1;\n    transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  }\n}\n@keyframes pops-anim-roll-reverse {\n  0% {\n    transform: perspective(1000px) rotate3d(1, 0, 0, 0deg);\n  }\n  100% {\n    transform: perspective(1000px) rotate3d(1, 0, 0, 90deg);\n  }\n}\n@keyframes pops-anim-sandra-reverse {\n  0% {\n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n  100% {\n    opacity: 0;\n    transform: scale3d(1.1, 1.1, 1);\n  }\n}\n@keyframes pops-anim-gather-reverse {\n  0% {\n    opacity: 0;\n    transform: scale(5, 0);\n  }\n  100% {\n    opacity: 0;\n    transform: scale(5, 0);\n  }\n}\n\n@-webkit-keyframes pops-motion-fadeInTop {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-30px);\n    transform: translateY(-30px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes pops-motion-fadeInTop {\n  0% {\n    opacity: 0;\n    transform: translateY(-30px);\n    -ms-transform: translateY(-30px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n    -ms-transform: translateX(0);\n  }\n}\n@-webkit-keyframes pops-motion-fadeOutTop {\n  0% {\n    opacity: 10;\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateY(-30px);\n    transform: translateY(-30px);\n  }\n}\n@keyframes pops-motion-fadeOutTop {\n  0% {\n    opacity: 1;\n    transform: translateY(0);\n    -ms-transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-30px);\n    -ms-transform: translateY(-30px);\n  }\n}\n@-webkit-keyframes pops-motion-fadeInBottom {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(20px);\n    transform: translateY(20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes pops-motion-fadeInBottom {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(20px);\n    transform: translateY(20px);\n    -ms-transform: translateY(20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n    -ms-transform: translateY(0);\n  }\n}\n@-webkit-keyframes pops-motion-fadeOutBottom {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateY(20px);\n    transform: translateY(20px);\n  }\n}\n@keyframes pops-motion-fadeOutBottom {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n    -ms-transform: translateY(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateY(20px);\n    transform: translateY(20px);\n    -ms-transform: translateY(20px);\n  }\n}\n@-webkit-keyframes pops-motion-fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateX(-20px);\n    transform: translateX(-20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes pops-motion-fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateX(-30px);\n    transform: translateX(-30px);\n    -ms-transform: translateX(-30px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n    -ms-transform: translateX(0);\n  }\n}\n@-webkit-keyframes pops-motion-fadeOutLeft {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-30px);\n    transform: translateX(-30px);\n  }\n}\n@keyframes pops-motion-fadeOutLeft {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n    -ms-transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(-20px);\n    transform: translateX(-20px);\n    -ms-transform: translateX(-20px);\n  }\n}\n@-webkit-keyframes pops-motion-fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateX(20px);\n    transform: translateX(20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes pops-motion-fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateX(20px);\n    transform: translateX(20px);\n    -ms-transform: translateX(20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n    -ms-transform: translateX(0);\n  }\n}\n@-webkit-keyframes pops-motion-fadeOutRight {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(20px);\n    transform: translateX(20px);\n  }\n}\n@keyframes pops-motion-fadeOutRight {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n    -ms-transform: translateX(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateX(20px);\n    transform: translateX(20px);\n    -ms-transform: translateX(20px);\n  }\n}\n\n/* 动画 */\n.pops-anim[anim="pops-anim-spread"] {\n  animation: pops-anim-spread 0.3s;\n}\n.pops-anim[anim="pops-anim-shake"] {\n  animation: pops-anim-shake 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-left"] {\n  animation: pops-anim-rolling-left 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-right"] {\n  animation: pops-anim-rolling-right 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-top"] {\n  animation: pops-anim-slide-top 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-bottom"] {\n  animation: pops-anim-slide-bottom 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-left"] {\n  animation: pops-anim-slide-left 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-right"] {\n  animation: pops-anim-slide-right 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein"] {\n  animation: pops-anim-fadein 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-zoom"] {\n  animation: pops-anim-fadein-zoom 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-alert"] {\n  animation: pops-anim-fadein-alert 0.3s;\n}\n.pops-anim[anim="pops-anim-don"] {\n  animation: pops-anim-don 0.3s;\n}\n.pops-anim[anim="pops-anim-roll"] {\n  animation: pops-anim-roll 0.3s;\n}\n.pops-anim[anim="pops-anim-sandra"] {\n  animation: pops-anim-sandra 0.3s;\n}\n.pops-anim[anim="pops-anim-gather"] {\n  animation: pops-anim-gather 0.3s;\n}\n.pops-anim[anim="pops-anim-spread-reverse"] {\n  animation: pops-anim-spread-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-shake-reverse"] {\n  animation: pops-anim-shake-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-left-reverse"] {\n  animation: pops-anim-rolling-left-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-rolling-right-reverse"] {\n  animation: pops-anim-rolling-right-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-top-reverse"] {\n  animation: pops-anim-slide-top-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-bottom-reverse"] {\n  animation: pops-anim-slide-bottom-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-left-reverse"] {\n  animation: pops-anim-slide-left-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-slide-right-reverse"] {\n  animation: pops-anim-slide-right-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-reverse"] {\n  animation: pops-anim-fadein-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-zoom-reverse"] {\n  animation: pops-anim-fadein-zoom-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-fadein-alert-reverse"] {\n  animation: pops-anim-fadein-alert-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-don-reverse"] {\n  animation: pops-anim-don-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-roll-reverse"] {\n  animation: pops-anim-roll-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-sandra-reverse"] {\n  animation: pops-anim-sandra-reverse 0.3s;\n}\n.pops-anim[anim="pops-anim-gather-reverse"] {\n  animation: pops-anim-gather-reverse 0.3s;\n}\n',
    alertCSS: "",
    confirmCSS: "",
    promptCSS:
      '.pops[type-value="prompt"] {\n  --input-color: #000000;\n  --input-bg-color: none;\n  --input-placeholder-color: #a1a4ac;\n}\n.pops[type-value="prompt"] input[pops],\n.pops[type-value="prompt"] textarea[pops] {\n  width: 100%;\n  height: 100%;\n  outline: 0;\n  border: 0;\n  color: var(--input-color);\n  background-color: var(--input-bg-color);\n}\n\n.pops[type-value="prompt"] input[pops] {\n  padding: 5px 10px;\n}\n.pops[type-value="prompt"] textarea[pops] {\n  padding: 5px 10px;\n  resize: none;\n}\n\n.pops[type-value="prompt"] input[pops]::placeholder,\n.pops[type-value="prompt"] textarea[pops]::placeholder {\n  color: var(--input-placeholder-color);\n}\n@media (prefers-color-scheme: dark) {\n  .pops[type-value="prompt"] {\n    --input-color: #ffffff;\n    --input-bg-color: #333333;\n    --input-placeholder-color: #8d9095;\n  }\n}\n',
    loadingCSS:
      '.pops[type-value="loading"] {\n  --loading-bd-color: rgba(0, 0, 0, 0.2);\n  --loading-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  --loading-box-shadow-color: rgb(0 0 0 / 50%);\n  --loading-icon-color: rgba(100, 149, 237, 0.1);\n  --loading-icon-bd-top-color: rgb(100, 149, 237, var(--pops-bd-opacity));\n}\n.pops[type-value="loading"] {\n  position: absolute;\n  top: 272.5px;\n  top: 50%;\n  left: 26px;\n  left: 50%;\n  display: flex;\n  overflow: hidden;\n  padding: 10px 15px;\n  max-width: 100%;\n  max-height: 100%;\n  min-width: 0;\n  min-height: 0;\n  border: 1px solid var(--loading-bd-color);\n  border-radius: 5px;\n  background-color: var(--loading-bg-color);\n  box-shadow: 0 0 5px var(--loading-box-shadow-color);\n  vertical-align: middle;\n  transition: all 0.35s;\n  transform: translate(-50%, -50%);\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  align-content: center;\n}\n.pops[type-value="loading"]:before {\n  float: left;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  border: 0.3em solid var(--loading-icon-color);\n  border-top: 0.3em solid var(--loading-icon-bd-top-color);\n  border-radius: 50%;\n  content: " ";\n  vertical-align: middle;\n  font-size: inherit;\n  animation: pops-anim-wait-rotate 1.2s linear infinite;\n}\n.pops[type-value="loading"] .pops-loading-content {\n  position: static;\n  top: 0;\n  bottom: 0;\n  float: left;\n  overflow: hidden;\n  width: auto;\n  font-size: inherit;\n  line-height: normal;\n  align-content: center;\n}\n\n@media (prefers-color-scheme: dark) {\n  .pops[type-value="loading"] {\n    --loading-bg-color: #222222;\n  }\n}\n',
    iframeCSS:
      '.pops[type-value="iframe"] {\n  --container-title-height: 55px;\n  transition:\n    width 0.35s ease,\n    height 0.35s ease;\n}\n.pops[type-value="iframe"] .pops-content {\n  overflow: hidden;\n}\n.pops-loading {\n  position: absolute;\n  top: 40px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 5;\n  background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n}\n.pops-loading:before {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 3;\n  display: block;\n  margin: -20px 0 0 -20px;\n  padding: 20px;\n  border: 4px solid rgb(221, 221, 221, var(--pops-bd-opacity));\n  border-radius: 50%;\n  content: "";\n  border-top-color: transparent;\n  animation: pops-anim-wait-rotate 1.2s linear infinite;\n}\n.pops[type-value="iframe"].pops[type-module="min"] {\n  bottom: 0;\n  max-width: 200px;\n  max-height: 53px;\n  position: unset;\n}\n.pops[type-value="iframe"].pops[type-module="min"] .pops-header-control[data-type="min"] {\n  display: none;\n}\n.pops[type-value="iframe"].pops-iframe-unset-top {\n  top: unset !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-left {\n  left: unset !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-transform {\n  transform: none !important;\n}\n.pops[type-value="iframe"].pops-iframe-unset-transition {\n  transition: none !important;\n}\n.pops[type-value="iframe"].pops[type-module="max"] {\n  width: 100% !important;\n  height: 100% !important;\n}\n.pops[type-value="iframe"] iframe[pops] {\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.pops-iframe-content-global-loading {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 999999;\n  width: 0;\n  height: 4px;\n  background: linear-gradient(to right, #4995dd, #fff, rgb(202 224 246));\n  animation: iframeLoadingChange 2s forwards;\n}\n\n.pops-anim:has(.pops[type-value="iframe"].pops[type-module="min"]) {\n  position: unset;\n}\n',
    tooltipCSS:
      '.pops-tip {\n  --pops-bg-opacity: 1;\n  --tooltip-color: #4e4e4e;\n  --tooltip-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  --tooltip-bd-radius: 2px;\n  --tooltip-box-shadow-left-color: rgba(0, 0, 0, 0.24);\n  --tooltip-box-shadow-right-color: rgba(0, 0, 0, 0.12);\n  --tooltip-font-size: 14px;\n  --tooltip-padding-top: 13px;\n  --tooltip-padding-right: 13px;\n  --tooltip-padding-bottom: 13px;\n  --tooltip-padding-left: 13px;\n\n  --tooltip-arrow-box-shadow-left-color: rgba(0, 0, 0, 0.24);\n  --tooltip-arrow-box-shadow-right-color: rgba(0, 0, 0, 0.12);\n  --tooltip-arrow--after-color: rgb(78, 78, 78);\n  --tooltip-arrow--after-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  --tooltip-arrow--after-width: 12px;\n  --tooltip-arrow--after-height: 12px;\n}\n.pops-tip {\n  padding: var(--tooltip-padding-top) var(--tooltip-padding-right) var(--tooltip-padding-bottom)\n    var(--tooltip-padding-left);\n  max-width: 400px;\n  max-height: 300px;\n  border-radius: var(--tooltip-bd-radius);\n  background-color: var(--tooltip-bg-color);\n  box-shadow:\n    0 1.5px 4px var(--tooltip-box-shadow-left-color),\n    0 1.5px 6px var(--tooltip-box-shadow-right-color);\n  color: var(--tooltip-color);\n  font-size: var(--tooltip-font-size);\n}\n.pops-tip[data-position="absolute"] {\n  position: absolute;\n}\n.pops-tip[data-position="fixed"] {\n  position: fixed;\n}\n\n.pops-tip .pops-tip-arrow {\n  position: absolute;\n  top: 100%;\n  left: 50%;\n  overflow: hidden;\n  width: 100%;\n  height: 12.5px;\n  transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow::after {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  width: var(--tooltip-arrow--after-width);\n  height: var(--tooltip-arrow--after-height);\n  background: var(--tooltip-arrow--after-bg-color);\n  color: var(--tooltip-arrow--after-color);\n  box-shadow:\n    0 1px 7px var(--tooltip-arrow-box-shadow-left-color),\n    0 1px 7px var(--tooltip-arrow-box-shadow-right-color);\n  content: "";\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n}\n\n.pops-tip .pops-tip-arrow[data-position="bottom"] {\n  position: absolute;\n  top: 100%;\n  left: 50%;\n  overflow: hidden;\n  width: 100%;\n  height: 12.5px;\n  transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="bottom"]:after {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  width: var(--tooltip-arrow--after-width);\n  height: var(--tooltip-arrow--after-height);\n  background: var(--tooltip-arrow--after-bg-color);\n  box-shadow:\n    0 1px 7px var(--tooltip-arrow-box-shadow-left-color),\n    0 1px 7px var(--tooltip-arrow-box-shadow-right-color);\n  content: "";\n  transform: translateX(-50%) translateY(-50%) rotate(45deg);\n}\n\n.pops-tip .pops-tip-arrow[data-position="left"] {\n  top: 50%;\n  left: -12.5px;\n  width: 12.5px;\n  height: 50px;\n  transform: translateY(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="left"]:after {\n  position: absolute;\n  top: 50%;\n  left: 100%;\n  content: "";\n}\n\n.pops-tip .pops-tip-arrow[data-position="right"] {\n  top: 50%;\n  right: -12.5px;\n  left: auto;\n  width: 12.5px;\n  height: 50px;\n  transform: translateY(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="right"]:after {\n  position: absolute;\n  top: 50%;\n  left: 0;\n  content: "";\n}\n\n.pops-tip .pops-tip-arrow[data-position="top"] {\n  top: -12.5px;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n.pops-tip .pops-tip-arrow[data-position="top"]:after {\n  position: absolute;\n  top: 100%;\n  left: 50%;\n  content: "";\n}\n\n.pops-tip[data-motion] {\n  -webkit-animation-duration: 0.25s;\n  animation-duration: 0.25s;\n  -webkit-animation-fill-mode: forwards;\n  animation-fill-mode: forwards;\n}\n.pops-tip[data-motion="fadeOutRight"] {\n  -webkit-animation-name: pops-motion-fadeOutRight;\n  animation-name: pops-motion-fadeOutRight;\n}\n.pops-tip[data-motion="fadeInTop"] {\n  -webkit-animation-name: pops-motion-fadeInTop;\n  animation-name: pops-motion-fadeInTop;\n  animation-timing-function: cubic-bezier(0.49, 0.49, 0.13, 1.3);\n}\n.pops-tip[data-motion="fadeOutTop"] {\n  -webkit-animation-name: pops-motion-fadeOutTop;\n  animation-name: pops-motion-fadeOutTop;\n  animation-timing-function: cubic-bezier(0.32, 0.37, 0.06, 0.87);\n}\n.pops-tip[data-motion="fadeInBottom"] {\n  -webkit-animation-name: pops-motion-fadeInBottom;\n  animation-name: pops-motion-fadeInBottom;\n}\n.pops-tip[data-motion="fadeOutBottom"] {\n  -webkit-animation-name: pops-motion-fadeOutBottom;\n  animation-name: pops-motion-fadeOutBottom;\n}\n.pops-tip[data-motion="fadeInLeft"] {\n  -webkit-animation-name: pops-motion-fadeInLeft;\n  animation-name: pops-motion-fadeInLeft;\n}\n.pops-tip[data-motion="fadeOutLeft"] {\n  -webkit-animation-name: pops-motion-fadeOutLeft;\n  animation-name: pops-motion-fadeOutLeft;\n}\n.pops-tip[data-motion="fadeInRight"] {\n  -webkit-animation-name: pops-motion-fadeInRight;\n  animation-name: pops-motion-fadeInRight;\n}\n\n/* github的样式 */\n.pops-tip.github-tooltip {\n  --tooltip-bg-opacity: 1;\n  --tooltip-color: #ffffff;\n  --tooltip-bg-color: rgb(36, 41, 47, var(--tooltip-bg-opacity));\n  --tooltip-bd-radius: 6px;\n  --tooltip-padding-top: 6px;\n  --tooltip-padding-right: 8px;\n  --tooltip-padding-bottom: 6px;\n  --tooltip-padding-left: 8px;\n\n  --tooltip-arrow--after-color: rgb(255, 255, 255);\n  --tooltip-arrow--after-bg-color: rgb(36, 41, 47, var(--tooltip-bg-opacity));\n  --tooltip-arrow--after-width: 8px;\n  --tooltip-arrow--after-height: 8px;\n}\n\n@media (prefers-color-scheme: dark) {\n  .pops-tip {\n    --tooltip-color: #ffffff;\n    --tooltip-bg-color: #fafafa;\n    --tooltip-arrow--after-color: #fafafa;\n    --tooltip-arrow--after-bg-color: rgb(250, 250, 250, var(--pops-bg-opacity));\n  }\n}\n',
    drawerCSS:
      '.pops[type-value="drawer"] {\n  position: fixed;\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  box-shadow:\n    0px 16px 48px 16px rgba(0, 0, 0, 0.08),\n    0px 12px 32px rgba(0, 0, 0, 0.12),\n    0px 8px 16px -8px rgba(0, 0, 0, 0.16);\n  overflow: hidden;\n  transition: all 0.3s;\n}\n\n.pops[type-value="drawer"][direction="top"] {\n  width: 100%;\n  left: 0;\n  right: 0;\n  top: 0;\n}\n.pops[type-value="drawer"][direction="bottom"] {\n  width: 100%;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.pops[type-value="drawer"][direction="left"] {\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  left: 0;\n}\n.pops[type-value="drawer"][direction="right"] {\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  right: 0;\n}\n',
    folderCSS:
      '.pops-folder-list {\n  --folder-arrow-fill-color: #d4d7de;\n  --folder-arrow-active-fill-color: #06a7ff;\n  --header-breadcrumb-text-color: #06a7ff;\n  --header-breadcrumb-all-files-text-color: var(--header-breadcrumb-text-color);\n  --header-breadcrumb-all-files-first-text-color: var(--header-breadcrumb-text-color);\n  --header-breadcrumb-all-files-last-text-color: #999999;\n  --table-header-row-text-color: #818999;\n  --table-body-td-text-color: rgb(247, 248, 250, var(--pops-bg-opacity));\n  --table-body-th-text-color: rgb(247, 248, 250, var(--pops-bg-opacity));\n  --table-body-row-text-color: #05082c;\n  --table-body-row-file-name-text-color: #05082c;\n  --table-body-row-hover-bd-color: rgb(245, 246, 247, var(--pops-bg-opacity));\n  --table-body-row-hover-bg-color: rgb(245, 246, 247, var(--pops-bg-opacity));\n  --table-body-row-file-name-hover-text-color: #06a7ff;\n  --table-body-row-content-text-color: #818999;\n}\n.pops-folder-list .cursor-p {\n  cursor: pointer;\n}\n.pops-folder-list a {\n  background: 0 0;\n  text-decoration: none;\n  -webkit-tap-highlight-color: transparent;\n  color: var(--header-breadcrumb-text-color);\n}\ntable.pops-folder-list-table__body,\ntable.pops-folder-list-table__header {\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: collapse;\n  border-spacing: 0;\n  padding: 0 20px;\n}\ntable.pops-folder-list-table__body,\ntable.pops-folder-list-table__header {\n  height: 100%;\n  background: 0 0;\n  overflow: hidden;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  -ms-flex-direction: column;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n}\ntable.pops-folder-list-table__body {\n  height: 100%;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops-folder-list table tr {\n  line-height: normal;\n  align-content: center;\n}\n.pops-folder-list-table__header-row {\n  height: 50px;\n  line-height: normal;\n  align-content: center;\n  color: var(--table-header-row-text-color);\n  text-align: left;\n  font-size: 12px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops-folder-list-table__body-row {\n  height: 50px;\n  line-height: normal;\n  align-content: center;\n  color: var(--table-body-row-text-color);\n  font-size: 12px;\n}\n.pops-folder-list-table__body-row:hover {\n  background-color: var(--table-body-row-hover-bg-color);\n  border-color: var(--table-body-row-hover-bd-color);\n  border: 0;\n  outline: none;\n}\n.pops-folder-list table th {\n  border: 0;\n  border-bottom: 1px solid var(--table-body-th-text-color);\n}\n.pops-folder-list table td {\n  border: 0;\n  border-bottom: 1px solid var(--table-body-td-text-color);\n  position: relative;\n}\n.pops-folder-list .list-name-text {\n  display: inline-block;\n  padding-left: 12px;\n  line-height: normal;\n  align-content: center;\n  max-width: 176px;\n}\n.pops-folder-list-file-name > div {\n  display: flex;\n  align-items: center;\n}\n\n.pops-mobile-folder-list-file-name {\n  display: flex;\n  align-items: center;\n}\n.pops-mobile-folder-list-file-name > div {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n  align-items: flex-start;\n  padding: 6px 0px;\n  flex-direction: column;\n}\n.pops-mobile-folder-list-file-name img.pops-folder-list-file-icon {\n  width: 45px;\n  height: 45px;\n}\n.pops-mobile-folder-list-file-name a.pops-folder-list-file-name-title-text {\n  padding-left: unset;\n  max-width: 250px;\n  overflow-x: hidden;\n  font-weight: 400;\n  line-height: unset;\n  margin-bottom: 4px;\n  white-space: normal;\n  text-overflow: unset;\n}\n\n/* 修改滚动 */\n.pops-folder-content {\n  overflow: hidden !important;\n}\n.pops-folder-content .pops-folder-list {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n.pops-folder-content .pops-folder-list-table__body-div {\n  height: 100%;\n  flex: 1 auto;\n  overflow: auto;\n  padding-bottom: 0;\n}\n.pops-mobile-folder-content .pops-folder-list-table__body-div {\n  height: 100%;\n  flex: 1 auto;\n  overflow: auto;\n  padding-bottom: 0;\n}\n.pops-folder-content table.pops-folder-list-table__body {\n  overflow: auto;\n}\n.pops-folder-content .pops-folder-list-table__header-div {\n  flex: 0;\n}\n.pops-mobile-folder-content .pops-folder-list-table__header-div {\n  display: none;\n}\n\n.pops-folder-list .pops-folder-list-file-name-title-text {\n  color: var(--table-body-row-file-name-text-color);\n}\n.pops-folder-list .pops-folder-list-file-name-title-text:hover {\n  text-decoration: none;\n  color: var(--table-body-row-file-name-hover-text-color);\n}\n.pops-folder-list .text-ellip {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.pops-folder-list .content {\n  color: var(--table-body-row-content-text-color);\n  position: relative;\n  width: 100%;\n  text-align: left;\n}\n.pops-folder-list .inline-block-v-middle {\n  display: inline-block;\n  vertical-align: middle;\n}\n.pops-folder-list .flex-a-i-center {\n  display: flex;\n  align-items: center;\n}\n.pops-folder-list .u-file-icon {\n  display: inline-block;\n  vertical-align: middle;\n}\n.pops-folder-list .u-file-icon--list {\n  width: 32px;\n  height: 32px;\n}\n.pops-folder-list .pops-folder-list-file-icon {\n  line-height: normal;\n  align-content: center;\n  position: relative;\n  vertical-align: middle;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-primary {\n  flex: 1;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n  -ms-flex-direction: row;\n  flex-direction: row;\n  min-height: 17px;\n  flex-wrap: wrap;\n}\n.pops-folder-list .pops-folder-list-table__sort {\n  display: inline-flex;\n  margin-left: 4px;\n  flex-direction: column;\n}\n\n.pops-folder-list .pops-folder-icon-arrow {\n  width: 10px;\n  height: 10px;\n  fill: var(--folder-arrow-fill-color);\n}\n.pops-folder-list .pops-folder-icon-active {\n  fill: var(--folder-arrow-active-fill-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb {\n  padding: 4px 20px;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n  -ms-flex-direction: row;\n  flex-direction: row;\n  -webkit-box-pack: start;\n  -webkit-justify-content: start;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n  min-height: 35px;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles {\n  font-size: 12px;\n  color: var(--header-breadcrumb-all-files-text-color);\n  line-height: normal;\n  align-content: center;\n  font-weight: 700;\n  display: inline-block;\n  max-width: 140px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  word-wrap: normal;\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:last-child a {\n  color: var(--header-breadcrumb-all-files-last-text-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:first-child a {\n  font-size: 14px;\n  color: var(--header-breadcrumb-all-files-first-text-color);\n}\n.pops-folder-list .pops-folder-file-list-breadcrumb .iconArrow {\n  width: 16px;\n  height: 16px;\n}\n.pops-folder-list .iconArrow {\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAASCAMAAABYd88+AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABFUExURUdwTOLi4uLi4t7e3uPj49/f397e3t3d3f///97e3vDw8N3d3d7e3t3d3d3d3ejo6N/f397e3t7e3t3d3d/f393d3d3d3RK+NoEAAAAWdFJOUwAnM4YPU/iQA+UIeMDaHhY41i7zX7UebpjFAAAAUElEQVQI15XOORaAIAwE0LATXHCd+x9VfCiksXCq+UUWou8oZ1vXHrt7YVBiYkW4gdMKYFIC4CSATWCNHWPuM6HuHkr1x3N0ZrBu/9gl0b9c3+kF7C7hS1YAAAAASUVORK5CYII=)\n    55% 50%/6px 9px no-repeat;\n}\n\n@media (prefers-color-scheme: dark) {\n  .pops[type-value="folder"] {\n    --pops-title-border-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n    --pops-bottom-btn-controls-border-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n  }\n  .pops-folder-list {\n    --header-breadcrumb-text-color: #06a7ff;\n    --header-breadcrumb-all-files-text-color: var(--header-breadcrumb-text-color);\n    --header-breadcrumb-all-files-first-text-color: var(--header-breadcrumb-text-color);\n    --header-breadcrumb-all-files-last-text-color: #818999;\n    --table-body-row-text-color: #f7f8fa;\n    --table-body-td-text-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n    --table-body-th-text-color: rgb(73, 83, 102, var(--pops-bg-opacity));\n    --table-body-td-text-color: #495366;\n    --table-body-row-hover-bd-color: #1f2022;\n    --table-body-row-hover-bg-color: #1f2022;\n    --table-body-row-file-name-text-color: #f7f8fa;\n  }\n}\n',
    panelCSS:
      '.pops[type-value="panel"] {\n  --pops-bg-color: #f2f2f2;\n  --pops-color: #333333;\n  --panel-title-bg-color: #ffffff;\n\n  --panel-aside-bg-color: #ffffff;\n  --panel-aside-hover-color: rgb(64, 158, 255);\n  --panel-aside-hover-bg-color: rgba(64, 158, 255, 0.1);\n\n  --pops-panel-forms-margin-top-bottom: 10px;\n  --pops-panel-forms-margin-left-right: 20px;\n  --pops-panel-forms-header-icon-size: calc(var(--pops-panel-forms-container-li-padding-left-right) + 1px);\n  --pops-panel-forms-header-padding-top-bottom: 15px;\n  --pops-panel-forms-header-padding-left-right: 10px;\n  --pops-panel-forms-container-item-left-text-gap: 6px;\n  --pops-panel-forms-container-item-left-desc-text-size: 0.8em;\n  --pops-panel-forms-container-item-left-desc-text-color: #6c6c6c;\n  --pops-panel-forms-container-item-bg-color: #ffffff;\n  --pops-panel-forms-container-item-title-color: #333;\n  --pops-panel-forms-container-item-border-radius: 6px;\n  --pops-panel-forms-container-item-margin-top-bottom: 10px;\n  --pops-panel-forms-container-item-margin-left-right: var(--pops-panel-forms-margin-left-right);\n  --pops-panel-forms-container-li-border-color: var(--pops-bd-color);\n  --pops-panel-forms-container-li-padding-top-bottom: 12px;\n  --pops-panel-forms-container-li-padding-left-right: 16px;\n\n  --pops-panel-forms-container-deepMenu-item-active-bg: #e9e9e9;\n}\n.pops[type-value="panel"] {\n  color: var(--pops-color);\n  background: var(--pops-bg-color);\n}\n.pops[type-value] .pops-panel-title {\n  background: var(--panel-title-bg-color);\n}\n\n/* ↓panel的CSS↓ */\n/* 左侧的列表 */\naside.pops-panel-aside {\n  box-sizing: border-box;\n  flex-shrink: 0;\n  max-width: 200px;\n  min-width: 100px;\n  height: 100%;\n  background: var(--panel-aside-bg-color);\n  border-right: 1px solid var(--panel-aside-bg-color);\n  font-size: 0.9em;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\naside.pops-panel-aside .pops-panel-aside-top-container {\n  overflow: auto;\n}\naside.pops-panel-aside ul li {\n  margin: 6px 8px;\n  border-radius: 4px;\n  padding: 6px 10px;\n  cursor: default;\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n}\naside.pops-panel-aside .pops-is-visited,\naside.pops-panel-aside ul li:not(.pops-panel-disabled-aside-hover-css):hover {\n  color: var(--panel-aside-hover-color);\n  background: var(--panel-aside-hover-bg-color);\n}\n/* 左侧的列表 */\n\n/* 底部的容器 */\n.pops-panel-bottom-wrapper {\n  background: var(--panel-aside-bg-color);\n  border-top: 1px solid #ebeef5;\n}\n.pops-panel-bottom-wrapper:has(.pops-panel-bottom-left-container:empty):has(.pops-panel-bottom-right-container:empty) {\n  border-top: 0;\n}\n.pops-panel-bottom-container {\n  display: flex;\n  flex-wrap: nowrap;\n  justify-content: space-between;\n}\n.pops-panel-bottom-left-container {\n}\n.pops-panel-bottom-right-container {\n}\n.pops-panel-bottom-wrapper .pops-panel-bottom-item {\n  list-style-type: none;\n  margin: 6px 8px;\n  border-radius: 4px;\n  padding: 6px 10px;\n  cursor: default;\n}\n.pops-panel-bottom-wrapper:not(.pops-panel-disable-bottom-item-hover-css) .pops-panel-bottom-item:hover {\n  color: var(--panel-aside-hover-color);\n  background: var(--panel-aside-hover-bg-color);\n}\n/* 底部的容器 */\n\n.pops-panel-content {\n  display: flex;\n  flex-direction: row;\n  flex: 1;\n  overflow: auto;\n  flex-basis: auto;\n  box-sizing: border-box;\n  min-width: 0;\n  bottom: 0 !important;\n}\n\n.pops-panel-section-wrapper {\n  width: 100%;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\n\nsection.pops-panel-container {\n  width: 100%;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\nsection.pops-panel-container .pops-panel-container-header-ul,\nsection.pops-panel-container .pops-panel-deepMenu-container-header-ul {\n  border-bottom: 1px solid rgba(223, 223, 223, var(--pops-bg-opacity));\n  flex: 0 auto;\n}\nsection.pops-panel-container .pops-panel-container-header-ul li,\nsection.pops-panel-container .pops-panel-container-header-ul li.pops-panel-container-header-title-text {\n  display: flex;\n  justify-content: flex-start !important;\n  margin: 0px !important;\n  padding: var(--pops-panel-forms-header-padding-top-bottom)\n    calc(var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right));\n  text-align: left;\n}\nsection.pops-panel-container ul.pops-panel-container-main-ul {\n  overflow: auto;\n  /*flex: 1;*/\n}\nsection.pops-panel-container > ul li:not(.pops-panel-forms-container-item) {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin: var(--pops-panel-forms-margin-top-bottom)\n    calc(var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-margin-left-right));\n  gap: 10px;\n}\nsection.pops-panel-container .pops-panel-forms-container-item-header-text {\n  margin: 10px;\n  margin-left: calc(\n    var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right)\n  );\n  font-size: 0.9em;\n  text-align: left;\n  color: var(--pops-panel-forms-container-item-title-color);\n}\nsection.pops-panel-container li.pops-panel-forms-container-item {\n  /* 去除<li>左侧的圆点 */\n  display: block;\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul.pops-panel-forms-container-item-formlist {\n  border-radius: var(--pops-panel-forms-container-item-border-radius);\n  background: var(--pops-panel-forms-container-item-bg-color);\n  margin: var(--pops-panel-forms-container-item-margin-top-bottom) var(--pops-panel-forms-margin-left-right);\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul.pops-panel-forms-container-item-formlist li {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: var(--pops-panel-forms-container-li-padding-top-bottom)\n    var(--pops-panel-forms-container-li-padding-left-right);\n  margin: 0px 0px;\n  border-bottom: 1px solid var(--pops-panel-forms-container-li-border-color);\n  text-align: left;\n}\n/*section.pops-panel-container\n	.pops-panel-forms-container-item\n	ul\n	li.pops-panel-deepMenu-nav-item {\n	padding: var(--pops-panel-forms-container-li-padding-top-bottom) 0px;\n	margin: 0px var(--pops-panel-forms-container-li-padding-left-right);\n	border-bottom: 1px solid var(--pops-panel-forms-container-li-border-color);\n}*/\nsection.pops-panel-container\n  .pops-panel-forms-container-item\n  ul.pops-panel-forms-container-item-formlist\n  li:last-child {\n  border: 0px;\n}\n/* 左侧的文字 */\nsection.pops-panel-container .pops-panel-item-left-text {\n  display: flex;\n  flex-direction: column;\n  gap: var(--pops-panel-forms-container-item-left-text-gap);\n}\n\n/* 左侧的主文字 */\n/*section.pops-panel-container .pops-panel-item-left-main-text {\n	\n}*/\n/* 左侧的描述文字 */\nsection.pops-panel-container .pops-panel-item-left-desc-text {\n  font-size: var(--pops-panel-forms-container-item-left-desc-text-size);\n  color: var(--pops-panel-forms-container-item-left-desc-text-color);\n}\n\n/* 折叠面板 */\nsection.pops-panel-container .pops-panel-forms-fold {\n  border-radius: var(--pops-panel-forms-container-item-border-radius);\n  background: var(--pops-panel-forms-container-item-bg-color);\n  margin: var(--pops-panel-forms-margin-top-bottom) var(--pops-panel-forms-margin-left-right);\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-fold-container {\n  display: flex;\n  align-items: center;\n  fill: #6c6c6c;\n  justify-content: space-between;\n  margin: 0px var(--pops-panel-forms-container-li-padding-left-right) !important;\n  padding: var(--pops-panel-forms-container-li-padding-top-bottom) 0px !important;\n}\nsection.pops-panel-container .pops-panel-forms-fold[data-fold-enable] .pops-panel-forms-fold-container-icon {\n  transform: rotate(90deg);\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-fold-container-icon {\n  width: 15px;\n  height: 15px;\n  display: flex;\n  align-items: center;\n  transform: rotate(-90deg);\n  transition: transform 0.3s;\n}\n/* 折叠状态 */\nsection.pops-panel-container .pops-panel-forms-fold[data-fold-enable] .pops-panel-forms-container-item-formlist {\n  height: 0;\n}\n/* 非折叠状态 */\nsection.pops-panel-container .pops-panel-forms-fold ul.pops-panel-forms-container-item-formlist {\n  margin: 0;\n}\nsection.pops-panel-container .pops-panel-forms-fold .pops-panel-forms-container-item-formlist {\n  transition: height 0.3s;\n  overflow: hidden;\n  border-radius: unset;\n  background: unset;\n  margin: 0;\n  height: calc-size(auto, size);\n}\n/* 折叠面板 */\n\n/* 姑且认为小于600px的屏幕为移动端 */\n@media (max-width: 600px) {\n  /* 兼容移动端CSS */\n  .pops[type-value="panel"] {\n    --pops-panel-forms-margin-left-right: 10px;\n  }\n  .pops[type-value="panel"] {\n    width: 92%;\n    width: 92vw;\n    width: 92dvw;\n  }\n  .pops[type-value="panel"] .pops-panel-content aside.pops-panel-aside {\n    max-width: 20%;\n    min-width: auto;\n  }\n  .pops[type-value="panel"] section.pops-panel-container .pops-panel-forms-container-item > div {\n    text-align: left;\n    --pops-panel-forms-margin-left-right: 0px;\n  }\n  .pops[type-value="panel"] section.pops-panel-container .pops-panel-forms-container-item ul {\n    margin: 0px !important;\n  }\n  .pops[type-value="panel"] section.pops-panel-container > ul > li {\n    margin: 10px 10px;\n  }\n  .pops[type-value="panel"] section.pops-panel-container > ul > li div:nth-child(2) {\n    max-width: 55%;\n  }\n  .pops[type-value="panel"] .pops-panel-select .el-select__selected-item.el-select__placeholder {\n    max-width: -moz-available;\n    max-width: -webkit-fill-available;\n  }\n  .pops[type-value="panel"] section.pops-panel-container > ul > li .pops-panel-input span.pops-panel-input__suffix {\n    padding: 0 4px;\n  }\n  .pops[type-value="panel"] section.pops-panel-container .pops-panel-select select {\n    min-width: 88px !important;\n    width: -moz-available;\n    width: -webkit-fill-available;\n  }\n  .pops[type-value="panel"] section.pops-panel-container .pops-panel-container-header-ul li {\n    font-size: 16px;\n  }\n  .pops[type-value="panel"] .pops-panel-title p[pops],\n  .pops[type-value="panel"] section.pops-panel-container > ul li,\n  .pops[type-value="panel"] aside.pops-panel-aside ul li {\n    font-size: 14px;\n  }\n}\n/* switch的CSS */\n.pops-panel-switch {\n  --panel-switch-core-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n  --panel-switch-core-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n  --panel-switch-circle-color: #dcdfe6;\n  --panel-switch-circle-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  --panel-switch-checked-circle-color: #409eff;\n  --panel-switch-checked-core-bd-color: rgb(64, 158, 255, var(--pops-bd-opacity));\n  --panel-switch-checked-core-bg-color: rgb(64, 158, 255, var(--pops-bg-opacity));\n}\n.pops-panel-switch {\n  display: inline-flex;\n  flex-direction: row-reverse;\n  align-items: center;\n  position: relative;\n  font-size: 14px;\n  line-height: normal;\n  align-content: center;\n  height: 32px;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops-panel-switch input.pops-panel-switch__input {\n  position: absolute;\n  width: 0;\n  height: 0;\n  opacity: 0;\n  margin: 0;\n}\n.pops-panel-switch:has(input.pops-panel-switch__input:disabled),\n.pops-panel-switch[data-disabled],\n.pops-panel-switch[data-disabled] .pops-panel-switch__core,\n.pops-panel-switch input.pops-panel-switch__input:disabled + .pops-panel-switch__core {\n  cursor: not-allowed;\n  opacity: 0.6;\n}\n.pops-panel-switch span.pops-panel-switch__core {\n  display: inline-flex;\n  position: relative;\n  align-items: center;\n  min-width: 40px;\n  height: 20px;\n  border: 1px solid var(--panel-switch-core-bd-color);\n  outline: 0;\n  border-radius: 10px;\n  box-sizing: border-box;\n  background: var(--panel-switch-core-bg-color);\n  cursor: pointer;\n  transition:\n    border-color 0.3s,\n    background-color 0.3s;\n}\n.pops-panel-switch .pops-panel-switch__action {\n  position: absolute;\n  left: 1px;\n  border-radius: 100%;\n  transition: all 0.3s;\n  width: 16px;\n  height: 16px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  background-color: var(--panel-switch-circle-bg-color);\n  color: var(--panel-switch-circle-color);\n}\n.pops-panel-switch.pops-panel-switch-is-checked span.pops-panel-switch__core {\n  border-color: var(--panel-switch-checked-core-bd-color);\n  background-color: var(--panel-switch-checked-core-bg-color);\n}\n.pops-panel-switch.pops-panel-switch-is-checked .pops-panel-switch__action {\n  left: calc(100% - 17px);\n  color: var(--panel-switch-checked-circle-color);\n}\n/* switch的CSS */\n\n/* slider旧的CSS */\nsection.pops-panel-container .pops-panel-slider:has(> input[type="range"]) {\n  overflow: hidden;\n  height: 25px;\n  line-height: normal;\n  align-content: center;\n  display: flex;\n  align-items: center;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"] {\n  height: 6px;\n  background: rgb(228, 231, 237, var(--pops-bg-opacity));\n  outline: 0;\n  -webkit-appearance: none;\n  appearance: none;\n  width: 100%;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-webkit-slider-thumb {\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  border: 1px solid rgb(64, 158, 255, var(--pops-bd-opacity));\n  background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  box-shadow:\n    0 0 2px rgba(0, 0, 0, 0.3),\n    0 3px 5px rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  -webkit-appearance: none;\n  appearance: none;\n  border-image: linear-gradient(#409eff, #409eff) 0 fill/9 25 9 0/0 0 0 100vw;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-moz-range-thumb {\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  border: 1px solid rgb(64, 159, 255, var(--pops-bd-opacity));\n  background-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n  box-shadow:\n    0 0 2px rgba(0, 0, 0, 0.3),\n    0 3px 5px rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  -webkit-appearance: none;\n  appearance: none;\n}\nsection.pops-panel-container .pops-panel-slider input[type="range"]::-moz-range-progress {\n  height: 6px;\n  border-image: linear-gradient(#409eff, #409eff) 0 fill/9 25 9 0/0 0 0 100vw;\n}\n/* slider旧的CSS */\n\n/* slider的CSS */\n.pops-slider {\n  --pops-slider-color-white: #ffffff;\n  --pops-slider-color-primary: #409eff;\n  --pops-slider-color-info: #909399;\n  --pops-slider-text-color-placeholder: #a8abb2;\n  --pops-slider-border-color-light: #e4e7ed;\n  --pops-slider-border-radius-circle: 100%;\n  --pops-slider-transition-duration-fast: 0.2s;\n\n  --pops-slider-main-bg-color: var(--pops-slider-color-primary);\n  --pops-slider-runway-bg-color: var(--pops-slider-border-color-light);\n  --pops-slider-stop-bg-color: var(--pops-slider-color-white);\n  --pops-slider-disabled-color: var(--pops-slider-text-color-placeholder);\n  --pops-slider-border-radius: 3px;\n  --pops-slider-height: 6px;\n  --pops-slider-button-size: 20px;\n  --pops-slider-button-wrapper-size: 36px;\n  --pops-slider-button-wrapper-offset: -15px;\n}\n\n.pops-slider {\n  width: 100%;\n  height: 32px;\n  display: flex;\n  align-items: center;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.pops-slider-width {\n  flex: 0 0 52%;\n  margin-left: 10px;\n}\n\n.pops-slider__runway {\n  flex: 1;\n  height: var(--pops-slider-height);\n  background-color: var(--pops-slider-runway-bg-color);\n  border-radius: var(--pops-slider-border-radius);\n  position: relative;\n  cursor: pointer;\n}\n\n.pops-slider__runway.show-input {\n  margin-right: 30px;\n  width: auto;\n}\n\n.pops-slider__runway.pops-slider-is-disabled {\n  cursor: default;\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__bar {\n  background-color: var(--pops-slider-disabled-color);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button {\n  border-color: var(--pops-slider-disabled-color);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n  cursor: not-allowed;\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n  transform: scale(1);\n}\n\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button:hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.hover,\n.pops-slider__runway.pops-slider-is-disabled .pops-slider__button.dragging {\n  cursor: not-allowed;\n}\n\n.pops-slider__input {\n  flex-shrink: 0;\n  width: 130px;\n}\n\n.pops-slider__bar {\n  height: var(--pops-slider-height);\n  background-color: var(--pops-slider-main-bg-color);\n  border-top-left-radius: var(--pops-slider-border-radius);\n  border-bottom-left-radius: var(--pops-slider-border-radius);\n  position: absolute;\n}\n\n.pops-slider__button-wrapper {\n  height: var(--pops-slider-button-wrapper-size);\n  width: var(--pops-slider-button-wrapper-size);\n  position: absolute;\n  z-index: 1;\n  top: var(--pops-slider-button-wrapper-offset);\n  transform: translate(-50%);\n  background-color: transparent;\n  text-align: center;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  line-height: normal;\n  outline: none;\n}\n\n.pops-slider__button-wrapper:after {\n  display: inline-block;\n  content: "";\n  height: 100%;\n  vertical-align: middle;\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover {\n  cursor: grab;\n}\n\n.pops-slider__button {\n  display: inline-block;\n  width: var(--pops-slider-button-size);\n  height: var(--pops-slider-button-size);\n  vertical-align: middle;\n  border: solid 2px var(--pops-slider-main-bg-color);\n  background-color: var(--pops-slider-color-white);\n  border-radius: 50%;\n  box-sizing: border-box;\n  transition: var(--pops-slider-transition-duration-fast);\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover,\n.pops-slider__button.dragging {\n  transform: scale(1.2);\n}\n\n.pops-slider__button:hover,\n.pops-slider__button.hover {\n  cursor: grab;\n}\n\n.pops-slider__button.dragging {\n  cursor: grabbing;\n}\n\n.pops-slider__stop {\n  position: absolute;\n  height: var(--pops-slider-height);\n  width: var(--pops-slider-height);\n  border-radius: var(--pops-slider-border-radius-circle);\n  background-color: var(--pops-slider-stop-bg-color);\n  transform: translate(-50%);\n}\n\n.pops-slider__marks {\n  top: 0;\n  left: 12px;\n  width: 18px;\n  height: 100%;\n}\n\n.pops-slider__marks-text {\n  position: absolute;\n  transform: translate(-50%);\n  font-size: 14px;\n  color: var(--pops-slider-color-info);\n  margin-top: 15px;\n  white-space: pre;\n}\n\n.pops-slider.is-vertical {\n  position: relative;\n  display: inline-flex;\n  width: auto;\n  height: 100%;\n  flex: 0;\n}\n\n.pops-slider.is-vertical .pops-slider__runway {\n  width: var(--pops-slider-height);\n  height: 100%;\n  margin: 0 16px;\n}\n\n.pops-slider.is-vertical .pops-slider__bar {\n  width: var(--pops-slider-height);\n  height: auto;\n  border-radius: 0 0 3px 3px;\n}\n\n.pops-slider.is-vertical .pops-slider__button-wrapper {\n  top: auto;\n  left: var(--pops-slider-button-wrapper-offset);\n  transform: translateY(50%);\n}\n\n.pops-slider.is-vertical .pops-slider__stop {\n  transform: translateY(50%);\n}\n\n.pops-slider.is-vertical .pops-slider__marks-text {\n  margin-top: 0;\n  left: 15px;\n  transform: translateY(50%);\n}\n\n.pops-slider--large {\n  height: 40px;\n}\n\n.pops-slider--small {\n  height: 24px;\n}\n/* slider的CSS */\n\n/* input的CSS */\n.pops-panel-input {\n  --el-disabled-text-color: #a8abb2;\n  --el-disabled-bg-color: #f5f7fa;\n  --el-disabled-border-color: #e4e7ed;\n  --el-color-danger: #f56c6c;\n\n  --pops-panel-components-input-border-radius: 4px;\n  --pops-panel-components-input-text-color: #000000;\n  --pops-panel-components-input-text-bg-color: transparent;\n  --pops-panel-components-input-text-default-padding: 8px;\n  --pops-panel-components-input-bd-color: #dcdfe6;\n  --pops-panel-components-input-bg-color: #ffffff;\n  --pops-panel-components-input-hover-bd-color: #c0c4cc;\n  --pops-panel-components-input-focus-bd-color: #409eff;\n  --pops-panel-components-input-suffix-color: #a8abb2;\n  --pops-panel-components-input-suffix-bg-color: #ffffff;\n}\n.pops-panel-input {\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  position: relative;\n  box-shadow: none;\n  width: 200px;\n  border: 0px;\n}\n.pops-panel-input_inner {\n  display: flex;\n  align-items: center;\n  width: 100%;\n  border: 1px solid var(--pops-panel-components-input-bd-color);\n  border-radius: var(--pops-panel-components-input-border-radius);\n  background-color: var(--pops-panel-components-input-bg-color);\n  box-shadow: none;\n}\n.pops-panel-input_inner:hover {\n  border: 1px solid var(--pops-panel-components-input-hover-bd-color);\n}\n.pops-panel-input:has(input:disabled):hover {\n  --pops-panel-components-input-hover-bd-color: var(--pops-panel-components-input-bd-color);\n}\n.pops-panel-input_inner:has(input:focus) {\n  outline: 0;\n  border: 1px solid var(--pops-panel-components-input-focus-bd-color);\n  border-radius: var(--pops-panel-components-input-border-radius);\n  box-shadow: none;\n}\n.pops-panel-input input {\n  display: inline-flex;\n  justify-content: center;\n  text-align: start;\n  align-items: center;\n  align-content: center;\n  white-space: nowrap;\n  cursor: text;\n  box-sizing: border-box;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  vertical-align: middle;\n  -webkit-appearance: none;\n  appearance: none;\n  color: var(--pops-panel-components-input-text-color);\n  background-color: var(--pops-panel-components-input-text-bg-color);\n  outline: 0;\n  transition: 0.1s;\n  border: 0;\n  font-size: 14px;\n  font-weight: 500;\n  line-height: normal;\n  height: 32px;\n  width: 100%;\n  flex: 1;\n  /*margin-right: calc(1em + 8px);*/\n  margin: 0px;\n  padding: var(--pops-panel-components-input-text-default-padding);\n}\n.pops-panel-input input[type="search"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n  display: none;\n}\n/* 颜色选择器不需要那么宽 */\n.pops-panel-input:has(input[type="color"]) {\n  width: 50px;\n}\n.pops-panel-input input[type="color"] {\n  padding: 0px;\n}\n.pops-panel-input_inner:has(input[type="file"]) {\n  border: 0px;\n  background: transparent;\n}\n.pops-panel-input input[type="file"] {\n  padding: 0px;\n  line-height: 32px;\n}\n.pops-panel-input span.pops-panel-input__suffix {\n  display: inline-flex;\n  white-space: nowrap;\n  flex-shrink: 0;\n  flex-wrap: nowrap;\n  height: 100%;\n  height: -moz-available;\n  height: -webkit-fill-available;\n  text-align: center;\n  color: var(--pops-panel-components-input-suffix-color);\n  background: var(--pops-panel-components-input-suffix-bg-color);\n  transition: all 0.3s;\n  pointer-events: none;\n  padding: 0 8px;\n  position: relative;\n  right: 0px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n  border: 1px solid transparent;\n}\n.pops-panel-input span.pops-panel-input__suffix-inner {\n  pointer-events: all;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n/* 如果包含清空图标的按钮,则默认隐藏清空图标,当:hover、:focus、:focus-within、:active时显示清空图标 */\n.pops-panel-input span.pops-panel-input__suffix:has(svg[data-type="circleClose"]) {\n  display: none;\n}\n.pops-panel-input:hover span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:focus span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:focus-within span.pops-panel-input__suffix:has(svg[data-type="circleClose"]),\n.pops-panel-input:active span.pops-panel-input__suffix:has(svg[data-type="circleClose"]) {\n  display: inline-flex;\n}\n/* 当清空图标显示时或查看图标存在时,则隐藏输入框的padding-right */\n.pops-panel-input:hover:has(span.pops-panel-input__suffix svg[data-type="circleClose"]) input,\n.pops-panel-input:focus:has(span.pops-panel-input__suffix svg[data-type="circleClose"]) input,\n.pops-panel-input:focus-within:has(span.pops-panel-input__suffix svg[data-type="circleClose"]) input,\n.pops-panel-input:active:has(span.pops-panel-input__suffix svg[data-type="circleClose"]) input,\n.pops-panel-input:has(span.pops-panel-input__suffix svg[data-type="view"]) input,\n.pops-panel-input:has(span.pops-panel-input__suffix svg[data-type="hide"]) input {\n  padding-right: 0;\n}\n.pops-panel-input .pops-panel-icon {\n  cursor: pointer;\n}\n.pops-panel-input .pops-panel-icon {\n  height: inherit;\n  line-height: normal;\n  align-content: center;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  transition: all 0.3s;\n}\n.pops-panel-input .pops-panel-icon svg {\n  height: 1em;\n  width: 1em;\n}\n\n.pops-input-disabled {\n  background-color: var(--pops-components-is-disabled-bg-color);\n  border-radius: 4px;\n}\n.pops-panel-input.pops-input-disabled:hover {\n  --pops-panel-components-input-hover-bd-color: var(--pops-panel-components-input-bd-color);\n}\n.pops-panel-input input:disabled,\n.pops-panel-input input:disabled + .pops-panel-input__suffix {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  color: var(--el-disabled-text-color);\n  -webkit-text-fill-color: var(--el-disabled-text-color);\n  cursor: not-allowed;\n}\n.pops-panel-input input:disabled + .pops-panel-input__suffix {\n  display: none;\n}\n/* 校验样式 */\n.pops-panel-input:has(.pops-panel-input-valid-error) {\n  --pops-panel-components-input-bd-color: var(--el-color-danger) !important;\n  --pops-panel-components-input-hover-bd-color: var(--pops-panel-components-input-bd-color);\n  --pops-panel-components-input-focus-bd-color: var(--pops-panel-components-input-bd-color);\n}\n.pops-panel-input .pops-panel-input-valid-error {\n  width: 100%;\n  color: var(--el-color-danger);\n  font-weight: 500;\n  font-size: 0.8em;\n  box-sizing: border-box;\n  vertical-align: middle;\n  display: inline-flex;\n  position: relative;\n}\n/* input的CSS */\n\n/* textarea的CSS */\n.pops-panel-textarea {\n  --pops-panel-components-textarea-text-color: #000000;\n  --pops-panel-components-textarea-text-bg-color: #ffffff;\n  --pops-panel-components-textarea-bd-color: #dcdfe6;\n  --pops-panel-components-textarea-hover-bd-color: #c0c4cc;\n  --pops-panel-components-textarea-focus-bd-color: #409eff;\n}\n.pops-panel-textarea textarea {\n  width: 100%;\n  /*vertical-align: bottom;*/\n  position: relative;\n  display: block;\n  resize: none;\n  padding: 5px 11px;\n  /*line-height: 1;*/\n  box-sizing: border-box;\n  font-size: inherit;\n  font-family: inherit;\n  color: var(--pops-panel-components-textarea-text-color);\n  background-color: var(--pops-panel-components-textarea-text-bg-color);\n  background-image: none;\n  -webkit-appearance: none;\n  appearance: none;\n  box-shadow: none;\n  border-radius: 0;\n  transition: box-shadow 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\n  border: 1px solid var(--pops-panel-components-textarea-bd-color);\n}\n.pops-panel-textarea textarea:hover {\n  border-color: var(--pops-panel-components-textarea-hover-bd-color);\n}\n.pops-panel-textarea:has(textarea:disabled):hover {\n  --pops-panel-components-textarea-hover-bd-color: var(--pops-panel-components-textarea-bd-color);\n}\n.pops-panel-textarea-disable {\n  --pops-panel-components-textarea-text-bg-color: var(--pops-components-is-disabled-bg-color) !important;\n  --pops-panel-components-textarea-text-color: var(--pops-components-is-disabled-text-color);\n}\n.pops-panel-textarea-disable textarea {\n  cursor: not-allowed;\n}\n.pops-panel-textarea textarea:focus {\n  outline: 0;\n  border-color: var(--pops-panel-components-textarea-focus-bd-color);\n}\n/* textarea的CSS */\n\n/* select的CSS */\n.pops-panel-select {\n  --pops-panel-components-select-disabled-text-color: #a8abb2;\n  --pops-panel-components-select-text-color: #000000;\n  --pops-panel-components-select-bd-color: rgb(184, 184, 184, var(--pops-bd-opacity));\n  --pops-panel-components-select-hover-bd-color: rgb(184, 184, 184, var(--pops-bd-opacity));\n  --pops-panel-components-select-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n}\n.pops-panel-select {\n  border: 0;\n}\n.pops-panel-select select {\n  width: 100%;\n  height: 32px;\n  line-height: normal;\n  align-content: center;\n  min-width: 200px;\n  border: 1px solid var(--pops-panel-components-select-bd-color);\n  border-radius: 5px;\n  text-align: center;\n  outline: 0;\n  color: var(--pops-panel-components-select-text-color);\n  background-color: var(--pops-panel-components-select-bg-color);\n  box-shadow: none;\n}\n.pops-panel-select select:hover {\n  border: 1px solid var(--pops-panel-components-select-hover-bd-color);\n}\n.pops-panel-select-disable {\n  --pops-panel-components-select-text-color: var(--pops-components-is-disabled-text-color);\n  --pops-panel-components-select-bg-color: var(--pops-components-is-disabled-bg-color);\n}\n.pops-panel-select-disable select {\n  cursor: not-allowed;\n}\n.pops-panel-select-disable select:hover {\n  box-shadow: none;\n  --pops-panel-components-select-hover-bd-color: var(--pops-panel-components-select-bd-color);\n}\n.pops-panel-select select:focus {\n  border: 1px solid rgb(64, 158, 255, var(--pops-bd-opacity));\n  box-shadow: none;\n}\n/* select的CSS */\n\n/* select dialog 的CSS */\n.pops-panel-select[data-mode="dialog"] {\n}\n/* select dialog 的CSS */\n\n/* select horizontal 的CSS */\n.pops-panel-select[data-mode="horizontal"] {\n  --pops-panel-components-select-horizontal-selected-text-color: #626aef;\n  --pops-panel-components-select-horizontal-selected-bg-color: #eff0fd;\n}\n.pops-panel-select[data-mode="horizontal"] .el-select__wrapper {\n  padding: 0;\n  gap: 0;\n  border: 0;\n}\n.pops-panel-select[data-mode="horizontal"] .select-item {\n  flex: 1;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border: 1px solid var(--el-border-color);\n  height: -moz-available;\n  height: -webkit-fill-available;\n  border-left: 0;\n}\n.pops-panel-select[data-mode="horizontal"] .select-item:hover {\n  color: var(--el-color-primary);\n}\n.pops-panel-select[data-mode="horizontal"] .select-item:first-child {\n  border-left: 1px solid var(--el-border-color);\n  border-top-left-radius: var(--el-border-radius-base);\n  border-bottom-left-radius: var(--el-border-radius-base);\n}\n.pops-panel-select[data-mode="horizontal"] .select-item:last-child {\n  border-top-right-radius: var(--el-border-radius-base);\n  border-bottom-right-radius: var(--el-border-radius-base);\n}\n.pops-panel-select[data-mode="horizontal"] .select-item.select__selected-item {\n  color: var(--pops-panel-components-select-horizontal-selected-text-color);\n  background-color: var(--pops-panel-components-select-horizontal-selected-bg-color);\n  border-color: var(--pops-panel-components-select-horizontal-selected-bg-color);\n}\n.pops-panel-select[data-mode="horizontal"] .select-item:has(+ .select__selected-item) {\n  border-right: 0;\n}\n.pops-panel-select[data-mode="horizontal"] .select-item[disabled] {\n  color: var(--pops-panel-components-select-disabled-text-color);\n  --pops-panel-components-select-horizontal-selected-text-color: var(\n    --pops-panel-components-select-disabled-text-color\n  );\n  cursor: not-allowed;\n  background: unset;\n}\n/* select horizontal 的CSS */\n\n/* select-multiple的CSS*/\n.pops-panel-select-multiple,\n.pops-panel-select {\n  --el-border-radius-base: 4px;\n  --el-fill-color-blank: #ffffff;\n  --el-transition-duration: 0.3s;\n  --el-border-color: #cbcbcb;\n  --el-text-color-placeholder: #a8abb2;\n  --color: inherit;\n  --el-select-input-color: #a8abb2;\n  --el-select-input-font-size: 14px;\n  --el-text-color-regular: #606266;\n  --el-color-info: #909399;\n  --el-color-info-light-9: #f4f4f5;\n  --el-color-info-light-8: #e9e9eb;\n  --el-color-primary-light-9: #ecf5ff;\n  --el-color-primary-light-8: #d9ecff;\n  --el-color-primary: #409eff;\n  --el-color-white: #ffffff;\n  width: 200px;\n}\n.pops-panel-select .el-select__wrapper,\n.pops-panel-select-multiple .el-select__wrapper {\n  display: flex;\n  align-items: center;\n  position: relative;\n  box-sizing: border-box;\n  cursor: pointer;\n  text-align: left;\n  font-size: 14px;\n  padding: 4px 12px;\n  gap: 6px;\n  min-height: 32px;\n  line-height: normal;\n  align-content: center;\n  border-radius: var(--el-border-radius-base);\n  background-color: var(--el-fill-color-blank);\n  transition: var(--el-transition-duration);\n  transform: translateZ(0);\n  border: 1px solid var(--el-border-color);\n}\n.pops-panel-select .el-select__wrapper.is-focused,\n.pops-panel-select-multiple .el-select__wrapper.is-focused {\n  --el-border-color: var(--el-color-primary);\n}\n.pops-panel-select .el-select__selection,\n.pops-panel-select-multiple .el-select__selection {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  flex: 1;\n  min-width: 0;\n  gap: 6px;\n}\n.pops-panel-select .el-select__selection[data-selected-text-align="left"] {\n  justify-content: left;\n}\n.pops-panel-select .el-select__selection[data-selected-text-align="center"] {\n  justify-content: center;\n}\n.pops-panel-select .el-select__selection[data-selected-text-align="right"] {\n  justify-content: right;\n}\n.pops-panel-select .el-select__selected-item,\n.pops-panel-select-multiple .el-select__selected-item {\n  display: flex;\n  flex-wrap: wrap;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.pops-panel-select .el-select__selected-item span {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.pops-panel-select .el-select__selected-item.el-select__choose_tag .el-tag,\n.pops-panel-select-multiple .el-select__selected-item.el-select__choose_tag .el-tag {\n  max-width: 200px;\n}\n.pops-panel-select .el-select__input-wrapper,\n.pops-panel-select-multiple .el-select__input-wrapper {\n  max-width: 100%;\n}\n.pops-panel-select .el-select__selection.is-near,\n.pops-panel-select-multiple .el-select__selection.is-near {\n  margin-left: -8px;\n}\n.pops-panel-select .el-select__placeholder,\n.pops-panel-select-multiple .el-select__placeholder {\n  position: absolute;\n  display: block;\n  top: 50%;\n  transform: translateY(-50%);\n  width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  color: var(--el-input-text-color, var(--el-text-color-regular));\n}\n.pops-panel-select .el-select__placeholder.is-transparent,\n.pops-panel-select-multiple .el-select__placeholder.is-transparent {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  color: var(--el-text-color-placeholder);\n}\n.pops-panel-select .el-select__prefix,\n.pops-panel-select .el-select__suffix,\n.pops-panel-select-multiple .el-select__prefix,\n.pops-panel-select-multiple .el-select__suffix {\n  display: flex;\n  align-items: center;\n  flex-shrink: 0;\n  gap: 6px;\n  color: var(--el-input-icon-color, var(--el-text-color-placeholder));\n}\n.pops-panel-select .el-icon,\n.pops-panel-select-multiple .el-icon {\n  --color: inherit;\n  height: 1em;\n  width: 1em;\n  line-height: normal;\n  align-content: center;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  fill: currentColor;\n  color: var(--color);\n  font-size: inherit;\n}\n.pops-panel-select .el-icon svg,\n.pops-panel-select-multiple .el-icon svg {\n  height: 1em;\n  width: 1em;\n}\n.pops-panel-select .el-select__caret,\n.pops-panel-select-multiple .el-select__caret {\n  color: var(--el-select-input-color);\n  font-size: var(--el-select-input-font-size);\n  transition: transform var(--el-transition-duration);\n  transform: rotate(0);\n  cursor: pointer;\n}\n/* 把箭头旋转 */\n.pops-panel-select[data-show-option] .el-select__caret,\n.pops-panel-select-multiple[data-show-option] .el-select__caret {\n  transform: rotate(180deg);\n}\n.pops-panel-select-multiple .el-tag {\n  --el-tag-font-size: 12px;\n  --el-tag-border-radius: 4px;\n  --el-tag-border-radius-rounded: 9999px;\n}\n.pops-panel-select-multiple .el-tag {\n  background-color: var(--el-tag-bg-color);\n  border-color: var(--el-tag-border-color);\n  color: var(--el-tag-text-color);\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  vertical-align: middle;\n  height: 24px;\n  padding: 0 9px;\n  font-size: var(--el-tag-font-size);\n  line-height: normal;\n  align-content: center;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: var(--el-tag-border-radius);\n  box-sizing: border-box;\n  white-space: nowrap;\n  --el-icon-size: 14px;\n  --el-tag-bg-color: var(--el-color-primary-light-9);\n  --el-tag-border-color: var(--el-color-primary-light-8);\n  --el-tag-hover-color: var(--el-color-primary);\n}\n.pops-panel-select-multiple .el-select__selection .el-tag {\n  cursor: pointer;\n  border-color: transparent;\n}\n.pops-panel-select-multiple .el-tag.el-tag--info {\n  --el-tag-bg-color: var(--el-color-info-light-9);\n  --el-tag-border-color: var(--el-color-info-light-8);\n  --el-tag-hover-color: var(--el-color-info);\n}\n.pops-panel-select-multiple .el-tag.el-tag--info {\n  --el-tag-text-color: var(--el-color-info);\n}\n.pops-panel-select-multiple .el-tag.is-closable {\n  padding-right: 5px;\n}\n.pops-panel-select-multiple .el-select__selection .el-tag .el-tag__content {\n  min-width: 0;\n}\n.pops-panel-select-multiple .el-tag .el-tag__close {\n  flex-shrink: 0;\n  color: var(--el-tag-text-color);\n}\n.pops-panel-select-multiple .el-tag .el-tag__close:hover {\n  color: var(--el-color-white);\n  background-color: var(--el-tag-hover-color);\n}\n.pops-panel-select-multiple .el-tag .el-icon {\n  border-radius: 50%;\n  cursor: pointer;\n  font-size: calc(var(--el-icon-size) - 2px);\n  height: var(--el-icon-size);\n  width: var(--el-icon-size);\n}\n.pops-panel-select-multiple .el-tag .el-tag__close {\n  margin-left: 6px;\n}\n.pops-panel-select-multiple .el-select__tags-text {\n  display: block;\n  line-height: normal;\n  align-content: center;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n/* 禁用样式 */\n.pops-panel-select-disable {\n  --el-fill-color-blank: #f5f7fa;\n  --color: #a8abb2;\n  --el-border-color: #cbcbcb;\n}\n.pops-panel-select-disable .el-tag.el-tag--info {\n  --el-tag-bg-color: #e7e7e7;\n  --el-tag-text-color: var(--pops-components-is-disabled-text-color);\n}\n.pops-panel-select-disable .el-select__selection .el-tag,\n.pops-panel-select-disable .el-tag .el-tag__close:hover,\n.pops-panel-select-disable .el-select__wrapper,\n.pops-panel-select-disable .el-select__caret {\n  cursor: not-allowed;\n}\n/* select-multiple的CSS*/\n\n/* deepMenu的css */\n.pops-panel-deepMenu-nav-item {\n  cursor: pointer;\n}\n.pops-panel-deepMenu-nav-item:active {\n  background: var(--pops-panel-forms-container-deepMenu-item-active-bg);\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul li.pops-panel-deepMenu-nav-item:active {\n  padding: var(--pops-panel-forms-container-li-padding-top-bottom)\n    var(--pops-panel-forms-container-li-padding-left-right);\n  margin: 0px;\n}\n/* 去除上个兄弟item的底部边框颜色 */\nsection.pops-panel-container .pops-panel-forms-container-item ul li:has(+ .pops-panel-deepMenu-nav-item:active) {\n  border-bottom: 1px solid transparent;\n}\n/* 第一个和最后一个跟随圆角 */\nsection.pops-panel-container .pops-panel-forms-container-item ul li.pops-panel-deepMenu-nav-item:first-child:active {\n  border-top-left-radius: var(--pops-panel-forms-container-item-border-radius);\n  border-top-right-radius: var(--pops-panel-forms-container-item-border-radius);\n}\nsection.pops-panel-container .pops-panel-forms-container-item ul li.pops-panel-deepMenu-nav-item:last-child:active {\n  border-bottom-left-radius: var(--pops-panel-forms-container-item-border-radius);\n  border-bottom-right-radius: var(--pops-panel-forms-container-item-border-radius);\n}\n.pops-panel-deepMenu-nav-item .pops-panel-deepMenu {\n  display: flex;\n  align-items: center;\n  color: #6c6c6c;\n  fill: #6c6c6c;\n}\n.pops-panel-deepMenu-nav-item .pops-panel-deepMenu-arrowRight-icon {\n  width: 15px;\n  height: 15px;\n  display: flex;\n  align-items: center;\n}\nsection.pops-panel-deepMenu-container .pops-panel-container-header-ul li.pops-panel-deepMenu-container-header {\n  display: flex;\n  align-items: center;\n  width: -moz-available;\n  width: -webkit-fill-available;\n  padding: var(--pops-panel-forms-header-padding-top-bottom)\n    calc(\n      var(--pops-panel-forms-margin-left-right) + var(--pops-panel-forms-container-li-padding-left-right) -\n        var(--pops-panel-forms-header-icon-size)\n    );\n  gap: 0px;\n}\n.pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon {\n  width: var(--pops-panel-forms-header-icon-size);\n  height: var(--pops-panel-forms-header-icon-size);\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n}\n/* 修复safari上图标大小未正常显示 */\n.pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon > svg {\n  width: inherit;\n  height: inherit;\n}\n/* deepMenu的css */\n\n/* 文字对齐 */\n.pops-panel-item-left-desc-text:has(code) {\n  display: flex;\n  align-items: baseline;\n  flex-wrap: wrap;\n}\n\n@media (prefers-color-scheme: dark) {\n  .pops[type-value="panel"] {\n    --pops-bg-color: #000000;\n    --pops-color: #f2f2f2;\n    --panel-title-bg-color: #000000;\n    --panel-aside-bg-color: #262626;\n    --pops-panel-forms-container-item-left-desc-text-color: #6c6c6c;\n    --pops-panel-forms-container-item-bg-color: #262626;\n    --pops-panel-forms-container-item-title-color: #c1c1c1;\n\n    --pops-panel-forms-container-li-border-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n    --pops-panel-forms-container-deepMenu-item-active-bg: #333333;\n  }\n  .pops[type-value="panel"] .pops-panel-deepMenu-container .pops-panel-deepMenu-container-left-arrow-icon {\n    fill: #f2f2f2;\n  }\n\n  /* switch的CSS */\n  .pops-panel-switch {\n    --panel-switch-core-bd-color: rgb(220, 223, 230, var(--pops-bd-opacity));\n    --panel-switch-core-bg-color: rgb(220, 223, 230, var(--pops-bg-opacity));\n    --panel-switch-circle-color: #dcdfe6;\n    --panel-switch-circle-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));\n    --panel-switch-checked-circle-color: #409eff;\n    --panel-switch-checked-core-bd-color: rgb(64, 158, 255, var(--pops-bd-opacity));\n    --panel-switch-checked-core-bg-color: rgb(64, 158, 255, var(--pops-bg-opacity));\n  }\n  /* select的CSS */\n  .pops-panel-select {\n    --pops-panel-components-select-text-color: #f2f2f2;\n    --pops-panel-components-select-bd-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n    --pops-panel-components-select-bg-color: #141414;\n  }\n  /* select-multiple的CSS*/\n  .pops-panel-select-multiple {\n    --el-fill-color-blank: #141414;\n    --el-border-color: #4c4d4f;\n    --el-text-color-placeholder: #a8abb2;\n    --el-select-input-color: #a8abb2;\n    --el-text-color-regular: #606266;\n    --el-color-info: #909399;\n    --el-color-info-light-8: #e9e9eb;\n    --el-color-primary-light-9: #ecf5ff;\n    --el-color-primary-light-8: #d9ecff;\n    --el-color-primary: #409eff;\n    --el-color-white: #ffffff;\n  }\n  .pops-panel-select-multiple .el-tag {\n    --el-color-info-light-9: #202121;\n  }\n  .pops-panel-select-multiple-disable {\n    --el-border-color: rgb(51, 51, 51, var(--pops-bd-opacity));\n  }\n  .pops-panel-select-multiple-disable .el-tag.el-tag--info {\n    --el-tag-bg-color: #2f2f2f;\n  }\n  /* select-multiple的CSS*/\n  /* slider的CSS */\n  .pops-slider {\n    --pops-slider-border-color-light: #414243;\n  }\n  /* input的CSS */\n  .pops-panel-input {\n    --pops-panel-components-input-text-color: #f2f2f2;\n    --pops-panel-components-input-bd-color: #4f5052;\n    --pops-panel-components-input-bg-color: #141414;\n    --pops-panel-components-input-hover-bd-color: #6f7175;\n    --pops-panel-components-input-focus-bd-color: #409eff;\n    --pops-panel-components-input-suffix-color: #a8abb2;\n    --pops-panel-components-input-suffix-bg-color: var(--pops-dark-color);\n  }\n  /* textarea的CSS */\n  .pops-panel-textarea {\n    --pops-panel-components-textarea-text-color: #f2f2f2;\n    --pops-panel-components-textarea-text-bg-color: #141414;\n    --pops-panel-components-textarea-bd-color: #4f5052;\n    --pops-panel-components-textarea-hover-bd-color: #6f7175;\n    --pops-panel-components-textarea-focus-bd-color: #409eff;\n  }\n  .pops-panel-textarea-disable {\n    --pops-panel-components-textarea-text-color: var(--pops-components-is-disabled-text-color);\n    --pops-panel-components-textarea-text-bg-color: var(--pops-components-is-disabled-bg-color);\n  }\n  /* slider */\n  .pops-slider {\n    --pops-slider-text-color-placeholder: #8d9095;\n  }\n}\n',
    rightClickMenu:
      '.pops-rightClickMenu {\n  --pops-right-context-color: #000000;\n  --pops-right-context-bg-color: rgb(255, 255, 255, 0.733);\n  --pops-right-context-backdrop-filter: blur(10px);\n  --pops-right-context-z-index: 10000;\n  --pops-right-context-bd-radius: 6px;\n  --pops-right-context-menu-shadow-color: rgb(114, 114, 114, 0.251);\n  --pops-right-context-menu-row-bd-radius: 6px;\n  --pops-right-context-menu-row-visited-color: rgb(0, 0, 0, 0.067);\n  --pops-right-context-menu-row-hover-color: rgb(0, 0, 0, 0.067);\n}\n.pops-rightClickMenu * {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  -webkit-tap-highlight-color: transparent;\n  scrollbar-width: thin;\n}\n.pops-rightClickMenu {\n  position: fixed;\n  z-index: var(--pops-right-context-z-index);\n  text-align: center;\n  border-radius: var(--pops-right-context-bd-radius);\n  font-size: 16px;\n  font-weight: 500;\n  color: var(--pops-right-context-color);\n  background: var(--pops-right-context-bg-color);\n  box-shadow: 0 0.25rem 0.5rem 0.125rem var(--pops-right-context-menu-shadow-color);\n  -webkit-backdrop-filter: var(--pops-right-context-backdrop-filter);\n  backdrop-filter: var(--pops-right-context-backdrop-filter);\n}\n.pops-rightClickMenu[data-position="absolute"] {\n  position: absolute;\n}\n/* scale动画 */\n.pops-rightClickMenu-anim-scale {\n  transition:\n    opacity 150ms cubic-bezier(0.2, 0, 0.2, 1),\n    transform 150ms cubic-bezier(0.2, 0, 0.2, 1);\n  transform: scale(0.85);\n}\n.pops-rightClickMenu-anim-scale-open {\n  transform: scale(1);\n}\n.pops-rightClickMenu-anim-scale-not-open {\n  opacity: 0;\n}\n/* 展开动画 */\n.pops-rightClickMenu-anim-grid {\n  display: grid;\n  transition: 0.3s;\n  grid-template-rows: 0fr;\n}\n.pops-rightClickMenu-anim-show {\n  grid-template-rows: 1fr;\n}\n.pops-rightClickMenu-is-visited {\n  background: var(--pops-right-context-menu-row-visited-color);\n}\ni.pops-rightClickMenu-icon {\n  height: 1em;\n  width: 1em;\n  line-height: normal;\n  align-content: center;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  fill: currentColor;\n  color: inherit;\n  font-size: inherit;\n  margin-right: 6px;\n}\ni.pops-rightClickMenu-icon[is-loading="true"] {\n  animation: rotating 2s linear infinite;\n}\n.pops-rightClickMenu li:hover {\n  background: var(--pops-right-context-menu-row-hover-color);\n  cursor: pointer;\n}\n.pops-rightClickMenu ul {\n  margin: 0;\n  padding: 0;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n  overflow: hidden;\n}\n.pops-rightClickMenu ul li {\n  padding: 5px 10px;\n  margin: 5px 5px;\n  border-radius: var(--pops-right-context-menu-row-bd-radius);\n  display: flex;\n  width: -moz-available;\n  width: -webkit-fill-available;\n  text-align: left;\n  align-items: center;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n@media (prefers-color-scheme: dark) {\n  /*.pops-rightClickMenu {\n		--pops-right-context-menu-shadow-color: #3c3c3c;\n	}*/\n}\n@media (hover: hover) {\n  .pops-rightClickMenu ul li:active {\n    transform: scale(0.98);\n  }\n}\n',
    panelComponents_Select:
      ".pops {\n  max-height: 300px;\n}\n.select-container {\n  --el-font-size-base: 14px;\n  --el-text-color-regular: #606266;\n  --el-color-primary: #409eff;\n  --el-fill-color-light: #f5f7fa;\n  --el-disable-color: #a8abb2;\n}\n.select-item {\n  cursor: pointer;\n  font-size: var(--el-font-size-base);\n  padding: 0 20px 0 20px;\n  position: relative;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  color: var(--el-text-color-regular);\n  min-height: 34px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: flex-start;\n  box-sizing: border-box;\n}\n.select-item[aria-disabled],\n.select-item[disabled] {\n  cursor: not-allowed;\n  color: var(--el-disable-color);\n  background: unset;\n}\n.select-item:hover {\n  background-color: var(--el-fill-color-light);\n}\n.select-item.select-item-is-selected:has(.pops-panel-input input) {\n  background-color: #e7e7e7;\n}\n.select-item.select-item-is-selected {\n  color: var(--el-color-primary);\n  font-weight: 700;\n}\n.select-item.select-item-is-selected:not(:has(.pops-panel-input))::after {\n  content: \"\";\n  position: absolute;\n  top: 50%;\n  right: 12px;\n  border-top: none;\n  border-right: none;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-color: var(--el-color-primary);\n  mask: url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\")\n    no-repeat;\n  mask-size: 100% 100%;\n  -webkit-mask: url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\")\n    no-repeat;\n  -webkit-mask-size: 100% 100%;\n  transform: translateY(-50%);\n  width: 12px;\n  height: 12px;\n}\n\n.select-item .pops-panel-input {\n  width: 100%;\n  margin: 5px 0px;\n}\n.select-item .pops-panel-input:has(.pops-panel-input-valid-error) {\n  margin-bottom: 0px;\n}\n\n.select-item .select-item-text {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n@media (prefers-color-scheme: dark) {\n  .select-container {\n    --el-text-color-regular: #f2f2f2;\n    --el-disable-color: #8d9095;\n    --el-fill-color-light: #262727;\n  }\n}\n",
    skeletonCSS:
      ".pops-skeleton-item {\n  --el-skeleton-color: #f0f2f5;\n  --el-skeleton-to-color: #e6e8eb;\n  width: 100%;\n  height: 18px;\n  border-radius: 4px;\n  background: var(--el-skeleton-color);\n  display: inline-block;\n}\n.pops-skeleton-item[data-circle] {\n  border-radius: 50%;\n}\n.pops-skeleton-item[data-img] {\n  width: unset;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 0px;\n}\n.pops-skeleton-item[data-img] svg {\n  color: #dcdfe6;\n  fill: currentcolor;\n  width: 22%;\n  height: 22%;\n}\n.pops-skeleton-item[data-animated] {\n  background: linear-gradient(\n    90deg,\n    var(--el-skeleton-color) 25%,\n    var(--el-skeleton-to-color) 37%,\n    var(--el-skeleton-color) 63%\n  );\n  background-size: 400% 100%;\n  animation: pops-el-skeleton-loading 1.4s ease infinite;\n}\n@keyframes pops-el-skeleton-loading {\n  0% {\n    background-position: 100% 50%;\n  }\n  100% {\n    background-position: 0 50%;\n  }\n}\n",
  };
  var PopsAnimation = {
    $data: {},
    $flag: { isInit: false },
    init() {
      if (!this.$flag.isInit) {
        this.$flag.isInit = true;
        const $style = popsDOMUtils.createElement("style", { innerHTML: PopsCSS.anim });
        popsDOMUtils.appendHead($style);
        this.$data = null;
        this.$data = popsDOMUtils.getKeyFrames($style.sheet);
        popsUtils.setTimeout(() => {
          popsDOMUtils.remove($style);
        }, 50);
      }
    },
    hasAnim(name) {
      return Object.prototype.hasOwnProperty.call(this.$data, name);
    },
    createSwitchElementWithAnimation($el, $next, option) {
      const animOptions = {
        duration: 220,
        easing: "ease-in-out",
        ...(option.animOptions ?? {}),
      };
      if (option.useAnimation == null) option.useAnimation = true;
      return {
        async enter() {
          const transitionEndCallback = async () => {
            popsDOMUtils.cssHide($el, true);
            await option.enterToAddElementCallback();
          };
          if (option.useAnimation && typeof document.startViewTransition == "function") {
            const transition = document.startViewTransition(transitionEndCallback);
            await transition.ready;
            await $next.animate([{ transform: "translateX(100%)" }, { transform: "translateX(0)" }], animOptions)
              .finished;
            await transition.finished;
          } else await transitionEndCallback();
        },
        async exit() {
          const transitionEndCallback = async () => {
            popsDOMUtils.cssShow($el);
            popsDOMUtils.remove($next);
            if (typeof option.exitToRemoveElementCallback === "function") await option.exitToRemoveElementCallback();
          };
          if (option.useAnimation && typeof document.startViewTransition == "function") {
            const leaveTransition = document.startViewTransition(transitionEndCallback);
            await leaveTransition.ready;
            await Promise.all([
              $next.animate([{ transform: "translateX(0)" }, { transform: "translateX(100%)" }], animOptions).finished,
              $el.animate([{ transform: "translateX(-100%)" }, { transform: "translateX(0)" }], animOptions).finished,
            ]);
            await leaveTransition.finished;
          } else await transitionEndCallback();
        },
      };
    },
  };
  var PopsInstData = {
    alert: [],
    confirm: [],
    drawer: [],
    folder: [],
    iframe: [],
    loading: [],
    panel: [],
    prompt: [],
    rightClickMenu: [],
    tooltip: [],
  };
  var PopsInstanceUtils = {
    getPopsMaxZIndex(deviation = 10) {
      deviation = Number.isNaN(deviation) ? 10 : deviation;
      const maxZIndex = 2 * Math.pow(10, 9);
      let zIndex = 0;
      let maxZIndexNode = null;
      Object.keys(PopsInstData).forEach((instKeyName) => {
        const instData = PopsInstData[instKeyName];
        for (let index = 0; index < instData.length; index++) {
          const inst = instData[index];
          const $elList = [inst.$anim, inst.$pops, inst.$mask].filter((it) => it instanceof HTMLElement);
          const maxNodeZIndexInfo = popsUtils.getMaxZIndexNodeInfoFromPoint($elList)[0];
          if (maxNodeZIndexInfo) {
            const nodeZIndex = maxNodeZIndexInfo.zIndex;
            if (nodeZIndex > zIndex) {
              zIndex = nodeZIndex;
              maxZIndexNode = maxNodeZIndexInfo.node || maxNodeZIndexInfo.positionNode;
            }
          }
        }
      });
      zIndex += deviation;
      const isOverMaxZIndex = zIndex >= maxZIndex;
      if (isOverMaxZIndex) zIndex = maxZIndex;
      return {
        zIndex,
        animElement: maxZIndexNode,
        isOverMaxZIndex,
      };
    },
    sortElementListByProperty(getBeforeValueFun, getAfterValueFun, sortByDesc = true) {
      if (typeof sortByDesc !== "boolean") throw new TypeError("参数 sortByDesc 必须为boolean类型");
      if (getBeforeValueFun == null || getAfterValueFun == null)
        throw new Error("获取前面的值或后面的值的方法不能为空");
      return function (after_obj, before_obj) {
        const beforeValue = getBeforeValueFun(before_obj);
        const afterValue = getAfterValueFun(after_obj);
        if (sortByDesc)
          if (afterValue > beforeValue) return -1;
          else if (afterValue < beforeValue) return 1;
          else return 0;
        else if (afterValue < beforeValue) return -1;
        else if (afterValue > beforeValue) return 1;
        else return 0;
      };
    },
    isHide($el) {
      let flag = false;
      if (
        popsDOMUtils.containsClassName($el, PopsCommonCSSClassName.hide) ||
        popsDOMUtils.containsClassName($el, PopsCommonCSSClassName.hideImportant)
      )
        flag = true;
      else {
        if ($el instanceof HTMLElement) {
          const style = $el.style;
          flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
        }
        if (!flag) {
          const style = globalThis.getComputedStyle($el);
          flag = style.display.includes("none") || style.visibility.includes("hidden") || style.opacity !== "0";
        }
      }
      return flag;
    },
    isNodeInPopsNode($el) {
      return !!($el.closest(".pops") || $el.matches(".pops"));
    },
    isAnimNode($el) {
      return !!(
        $el?.localName?.toLowerCase() === "div" &&
        $el.className &&
        $el.className === "pops-anim" &&
        $el.hasAttribute("anim")
      );
    },
  };
  var PopsInstHandler = {
    async removeInstance(totalInstConfigList, guid, isAll = false) {
      const removeInst = async (instCommonConfig) => {
        await instCommonConfig.emitter.emit("pops:before-destory", instCommonConfig);
        popsDOMUtils.offAll(instCommonConfig.$shadowRoot);
        popsDOMUtils.remove(instCommonConfig?.$anim);
        popsDOMUtils.remove(instCommonConfig?.$pops);
        popsDOMUtils.remove(instCommonConfig?.$mask);
        popsDOMUtils.remove(instCommonConfig?.$shadowContainer);
        await instCommonConfig.emitter.emit("pops:destory");
        await instCommonConfig.emitter.offAll();
      };
      const asyncInstTask = [];
      for (const instConfigList of totalInstConfigList)
        for (let index = 0; index < instConfigList.length; index++) {
          const instConfigItem = instConfigList[index];
          if (isAll || (typeof guid === "string" && instConfigItem.guid === guid)) {
            const animName = instConfigItem.$anim.getAttribute("anim");
            if (PopsAnimation.hasAnim(animName)) {
              const reverseAnimName = animName + "-reverse";
              popsDOMUtils.css(instConfigItem.$anim, "width", "100%");
              popsDOMUtils.css(instConfigItem.$anim, "height", "100%");
              popsDOMUtils.css(instConfigItem.$anim, "animation-name", reverseAnimName);
              if (PopsAnimation.hasAnim(popsDOMUtils.css(instConfigItem.$anim, "animation-name")))
                asyncInstTask.push(
                  new Promise((resolve) => {
                    popsDOMUtils.on(
                      instConfigItem.$anim,
                      popsDOMUtils.getAnimationEndNameList(),
                      async () => {
                        await removeInst(instConfigItem);
                        resolve();
                      },
                      { capture: true }
                    );
                  })
                );
              else asyncInstTask.push(removeInst(instConfigItem));
            } else asyncInstTask.push(removeInst(instConfigItem));
            instConfigList.splice(index, 1);
            index--;
          }
        }
      await Promise.all(asyncInstTask);
      return totalInstConfigList;
    },
    show(config, popsType, instConfigList, guid, $anim, $mask) {
      return new Promise(async (resolve) => {
        const $pops = $anim.querySelector(".pops[type-value]");
        const fintInst = instConfigList.find((instConfigItem) => instConfigItem.guid === guid);
        if (fintInst) {
          const checkVisible = () => {
            if (!PopsInstanceUtils.isHide($anim)) return true;
            else return false;
          };
          const startAnim = async () => {
            if (popsType === "drawer") {
              const drawerConfig = config;
              await popsUtils.sleep(drawerConfig.openDelay ?? 0);
              if ($mask) popsDOMUtils.css($mask, "display", "");
              const direction = drawerConfig.direction;
              const size = drawerConfig.size.toString();
              if (["top", "bottom"].includes(direction)) $pops.style.setProperty("height", size);
              else if (["left", "right"].includes(direction)) $pops.style.setProperty("width", size);
              else console.error("未知direction:", direction);
            } else {
              instConfigItem.$anim.style.width = "";
              instConfigItem.$anim.style.height = "";
              Reflect.set(instConfigItem.$anim.style, "animation-name", animName);
            }
            instConfigItem.$anim.style.display = "";
            if (instConfigItem.$mask) instConfigItem.$mask.style.display = "";
          };
          const endCallback = () => {
            fintInst.emitter.emit("pops:show", instConfigItem);
          };
          const instConfigItem = fintInst;
          const animName = instConfigItem.$anim.getAttribute("anim").replace("-reverse", "");
          fintInst.emitter.emit("pops:before-show", instConfigItem);
          if (checkVisible() && PopsAnimation.hasAnim(animName)) {
            const animationendCallBack = () => {
              listener.off();
              endCallback();
              resolve();
            };
            const listener = popsDOMUtils.on(
              instConfigItem.$anim,
              popsDOMUtils.getAnimationEndNameList(),
              animationendCallBack,
              { capture: true }
            );
            await startAnim();
          } else {
            await startAnim();
            endCallback();
            resolve();
          }
        } else {
          console.error("show-error: 该实例未存储");
          resolve();
        }
      });
    },
    hide(config, popsType, instConfigList, guid, $anim, $mask) {
      return new Promise(async (resolve) => {
        const $pops = $anim.querySelector(".pops[type-value]");
        const fintInst = instConfigList.find((instConfigItem) => instConfigItem.guid === guid);
        if (fintInst) {
          const checkVisible = () => {
            if (!PopsInstanceUtils.isHide($anim)) return true;
            else return false;
          };
          const startAnim = async () => {
            if (popsType === "drawer") {
              const drawerConfig = config;
              await popsUtils.sleep(drawerConfig.closeDelay ?? 0);
              if ($mask) popsDOMUtils.css($mask, "display", "none");
              const direction = drawerConfig.direction;
              const size = "0";
              if (["top", "bottom"].includes(direction)) $pops.style.setProperty("height", size);
              else if (["left", "right"].includes(direction)) $pops.style.setProperty("width", size);
              else console.error("未知direction: ", direction);
            } else {
              instConfigItem.$anim.style.width = "100%";
              instConfigItem.$anim.style.height = "100%";
              Reflect.set(instConfigItem.$anim.style, "animation-name", reverseAnimName);
            }
          };
          const endCallback = () => {
            instConfigItem.$anim.style.display = "none";
            if (instConfigItem.$mask) instConfigItem.$mask.style.display = "none";
            fintInst.emitter.emit("pops:hide", instConfigItem);
          };
          const instConfigItem = fintInst;
          const reverseAnimName = instConfigItem.$anim.getAttribute("anim").replace("-reverse", "") + "-reverse";
          fintInst.emitter.emit("pops:before-hide", instConfigItem);
          if (!checkVisible() && PopsAnimation.hasAnim(reverseAnimName)) {
            const animationendCallBack = () => {
              listener.off();
              endCallback();
              resolve();
            };
            const listener = popsDOMUtils.on(
              instConfigItem.$anim,
              popsDOMUtils.getAnimationEndNameList(),
              animationendCallBack,
              {
                capture: true,
                once: true,
              }
            );
            await startAnim();
          } else {
            await startAnim();
            endCallback();
            resolve();
          }
        } else {
          console.error("hide-error: 该实例未存储");
          resolve();
        }
      });
    },
    async close(config, popsType, instConfigList, guid, $anim) {
      PopsInstData.rightClickMenu.forEach((itemConfig) => {
        const config = itemConfig.config;
        if (config.$target instanceof HTMLElement) {
          const $root = config.$target.getRootNode();
          if ($root instanceof HTMLElement && $root.parentElement == null)
            itemConfig.emitter.emit("pops:before-destory", itemConfig);
        }
      });
      PopsInstData.tooltip.forEach((itemConfig) => {
        const config = itemConfig.config;
        if (config.$target instanceof HTMLElement) {
          const $root = config.$target.getRootNode();
          if ($root instanceof HTMLElement && $root.parentElement == null)
            itemConfig.emitter.emit("pops:before-destory", itemConfig);
        }
      });
      await new Promise(async (resolve) => {
        const $pops = $anim.querySelector(".pops[type-value]");
        const drawerConfig = config;
        const startAnim = () => {
          const transtionEndCallback = async (event) => {
            if (event.propertyName !== "transform") return;
            listener.off();
            await PopsInstHandler.removeInstance([instConfigList], guid);
            resolve();
          };
          const listener = popsDOMUtils.on($pops, popsDOMUtils.getTransitionEndNameList(), transtionEndCallback, {
            once: true,
          });
          if (globalThis.getComputedStyle($pops).transform !== "none") {
            listener.emit({ propertyName: "transform" });
            return;
          }
          if (["top"].includes(drawerConfig.direction)) $pops.style.setProperty("transform", "translateY(-100%)");
          else if (["bottom"].includes(drawerConfig.direction))
            $pops.style.setProperty("transform", "translateY(100%)");
          else if (["left"].includes(drawerConfig.direction)) $pops.style.setProperty("transform", "translateX(-100%)");
          else if (["right"].includes(drawerConfig.direction)) $pops.style.setProperty("transform", "translateX(100%)");
          else console.error("未知direction: ", drawerConfig.direction);
        };
        if (popsType === "drawer") {
          await popsUtils.sleep(drawerConfig.closeDelay ?? 0);
          startAnim();
        } else {
          await PopsInstHandler.removeInstance([instConfigList], guid);
          resolve();
        }
      });
    },
    drag($move, options) {
      options = Object.assign(
        {
          limit: true,
          extraDistance: 3,
          container: PopsCore.globalThis,
          emitClick: true,
        },
        options
      );
      let isMove = false;
      let clickElementLeftOffset = 0;
      let clickElementTopOffset = 0;
      const anyTouchElement = new (popsUtils.AnyTouch())(options.dragElement, {
        preventDefault(event) {
          if (typeof options.preventEvent === "function") return options.preventEvent(event);
          else return true;
        },
      });
      popsDOMUtils.css(options.dragElement, { cursor: "move" });
      function changeMoveElementStyle(element) {
        const old_transitionDuration = element.style.transitionDuration;
        if (globalThis.getComputedStyle(element).transitionDuration !== "0s") element.style.transitionDuration = "0s";
        return () => {
          element.style.transitionDuration = old_transitionDuration;
        };
      }
      function getContainerWidthOrHeight(container) {
        container = container ?? globalThis;
        return {
          width: popsDOMUtils.width(container),
          height: popsDOMUtils.height(container),
        };
      }
      function getContainerTopOrLeft(container) {
        container = container ?? globalThis;
        if (popsUtils.isWin(container))
          return {
            left: 0,
            top: 0,
          };
        else {
          const rect = container.getBoundingClientRect();
          return {
            left: rect.left,
            top: rect.top,
          };
        }
      }
      let transformInfo = popsDOMUtils.getTransform($move);
      let resumeMoveElementStyle = null;
      anyTouchElement.on("pan", function (event) {
        if (!isMove) {
          isMove = true;
          const rect = options.dragElement.getBoundingClientRect();
          clickElementLeftOffset = event.x - rect.left;
          clickElementTopOffset = event.y - rect.top;
          transformInfo = popsDOMUtils.getTransform($move);
          resumeMoveElementStyle = changeMoveElementStyle($move);
          if (typeof options.startCallBack === "function")
            options.startCallBack($move, clickElementLeftOffset, clickElementTopOffset);
        }
        let currentMoveLeftOffset = event.x - clickElementLeftOffset + transformInfo.transformLeft;
        let currentMoveTopOffset = event.y - clickElementTopOffset + transformInfo.transformTop;
        if (event.phase === "move") {
          if (options.limit) {
            const maxLeftOffset =
              getContainerWidthOrHeight(options.container).width -
              popsDOMUtils.width($move) +
              transformInfo.transformLeft;
            const { left: minLeftOffset, top: minTopOffset } = getContainerTopOrLeft(options.container);
            const maxTopOffset =
              getContainerWidthOrHeight(options.container).height -
              popsDOMUtils.height($move) +
              transformInfo.transformTop;
            if (currentMoveLeftOffset > maxLeftOffset) currentMoveLeftOffset = maxLeftOffset;
            if (currentMoveTopOffset > maxTopOffset) currentMoveTopOffset = maxTopOffset;
            if (currentMoveLeftOffset - options.extraDistance * 2 < minLeftOffset + transformInfo.transformLeft) {
              currentMoveLeftOffset = minLeftOffset + transformInfo.transformLeft;
              currentMoveLeftOffset += options.extraDistance;
            } else currentMoveLeftOffset -= options.extraDistance;
            if (currentMoveTopOffset - options.extraDistance * 2 < minTopOffset + transformInfo.transformTop) {
              currentMoveTopOffset = minTopOffset + transformInfo.transformTop;
              currentMoveTopOffset += options.extraDistance;
            } else currentMoveTopOffset -= options.extraDistance;
          }
          if (typeof options.moveCallBack === "function")
            options.moveCallBack($move, currentMoveLeftOffset, currentMoveTopOffset);
          popsDOMUtils.css($move, {
            left: currentMoveLeftOffset + "px",
            top: currentMoveTopOffset + "px",
          });
        }
        if (event.phase === "end") {
          isMove = false;
          if (typeof resumeMoveElementStyle === "function") {
            resumeMoveElementStyle();
            resumeMoveElementStyle = null;
          }
          if (typeof options.endCallBack === "function")
            options.endCallBack($move, currentMoveLeftOffset, currentMoveTopOffset);
        }
      });
      if (options.emitClick)
        anyTouchElement.on(["tap"], function (event) {
          event.changedPoints.forEach((item) => {
            popsDOMUtils.emit(item.target, "click", void 0, true);
          });
        });
    },
  };
  var PopsHandler = {
    handlerShadow(config) {
      const $shadowContainer = popsDOMUtils.createElement("div", { className: "pops-shadow-container" });
      let $shadowRoot;
      if (config.useShadowRoot) $shadowRoot = $shadowContainer.attachShadow({ mode: "open" });
      else $shadowRoot = $shadowContainer;
      if (config.stopKeyDownEventPropagation)
        popsDOMUtils.on(
          $shadowRoot,
          "keydown",
          [
            'input[type="text"]',
            'input[type="password"]',
            'input[type="number"]',
            'input[type="email"]',
            'input[type="url"]',
            'input[type="search"]',
            "input:not([type])",
            "textarea",
          ],
          (evt) => {
            evt.stopImmediatePropagation();
            evt.stopPropagation();
          },
          {
            capture: true,
            overrideTarget: false,
          }
        );
      return {
        $shadowContainer,
        $shadowRoot,
      };
    },
    handleInit($styleParent, css) {
      PopsAnimation.init();
      if (!arguments.length) return;
      if ($styleParent == null) return;
      if (css == null) return;
      if (typeof css === "string") {
        if (css.trim() === "") return;
        css = [{ css }];
      } else
        css = css.map((item) => {
          if (typeof item === "string") return { css: item };
          else return item;
        });
      for (const cssItem of css) {
        const $css = popsDOMUtils.createElement("style", {}, { "data-type": "PopsHandler.handleInit" });
        $css.textContent = cssItem.css;
        if (typeof cssItem.name === "string") $css.setAttribute("data-name", cssItem.name);
        $styleParent.appendChild($css);
      }
    },
    handleMask(config = {}) {
      const result = { maskElement: popsDOMUtils.parseTextToDOM(config.maskHTML) };
      let isMaskClick = false;
      const clickEvent = (event) => {
        popsDOMUtils.preventEvent(event);
        const targetInst = PopsInstData[config.type];
        const continueExec = () => {
          if (config.config.mask.clickEvent.toClose)
            return PopsInstHandler.close(config.config, config.type, targetInst, config.guid, config.animElement);
          else if (config.config.mask.clickEvent.toHide)
            return PopsInstHandler.hide(
              config.config,
              config.type,
              targetInst,
              config.guid,
              config.animElement,
              result.maskElement
            );
        };
        if (typeof config.config.mask.clickCallBack === "function")
          config.config.mask.clickCallBack(continueExec, config.config);
        else continueExec();
        return false;
      };
      if (config.config.mask.clickEvent.toClose || config.config.mask.clickEvent.toHide) {
        popsDOMUtils.on(config.animElement, "pointerup", (event) => {
          const $click = event.composedPath()[0];
          isMaskClick = PopsInstanceUtils.isAnimNode($click);
        });
        popsDOMUtils.on(config.animElement, "click", (event) => {
          const $click = event.composedPath()[0];
          if (isMaskClick && PopsInstanceUtils.isAnimNode($click)) return clickEvent(event);
        });
        popsDOMUtils.on(result.maskElement, "click", (event) => {
          isMaskClick = true;
          clickEvent(event);
        });
      }
      return result;
    },
    handleQueryElement(animElement, type) {
      return {
        $pops: animElement.querySelector(".pops[type-value"),
        $btnOk: animElement.querySelector(`.pops-${type}-btn-ok`),
        $btnCancel: animElement.querySelector(`.pops-${type}-btn-cancel`),
        $btnOther: animElement.querySelector(`.pops-${type}-btn-other`),
        $title: animElement.querySelector(`.pops-${type}-title`),
        $input: animElement.querySelector(`.pops-${type}-content textarea[pops]`)
          ? animElement.querySelector(`.pops-${type}-content textarea[pops]`)
          : animElement.querySelector(`.pops-${type}-content input[pops]`),
        $headerControls: animElement.querySelector(".pops-header-controls"),
        $iframe: animElement.querySelector("iframe[pops]"),
        $loading: animElement.querySelector(".pops-loading"),
        $content: animElement.querySelector(`.pops-${type}-content`),
        $panelRightSectionWrapper: animElement.querySelector(`.pops-${type}-section-wrapper`),
        $panelLeftAside: animElement.querySelector(`.pops-${type}-content aside.pops-${type}-aside`),
        $panelContentSectionContainer: animElement.querySelector(
          `.pops-${type}-content section.pops-${type}-container`
        ),
        $panelBottomWrapper: animElement.querySelector(`.pops-${type}-bottom-wrapper`),
        $panelBottomContainer: animElement.querySelector(`.pops-${type}-bottom-container`),
        $panelBottomLeftContainer: animElement.querySelector(`.pops-${type}-bottom-left-container`),
        $panelBottomRightContainer: animElement.querySelector(`.pops-${type}-bottom-right-container`),
        $contentLoading: animElement.querySelector(`.pops-${type}-content-global-loading`),
        $headerBtnMin: animElement.querySelector(".pops-header-control[data-type='min']"),
        $headerBtnMax: animElement.querySelector(".pops-header-control[data-type='max']"),
        $headerBtnMise: animElement.querySelector(".pops-header-control[data-type='mise']"),
        $headerBtnClose: animElement.querySelector(".pops-header-control[data-type='close']"),
        $folderList: animElement.querySelector(".pops-folder-list"),
        $folderHeaderNav: animElement.querySelector(".pops-folder-list .pops-folder-list-table__header-div"),
        $folderHeaderRow: animElement.querySelector(
          ".pops-folder-list .pops-folder-list-table__header-div .pops-folder-list-table__header-row"
        ),
        $folderTbody: animElement.querySelector(".pops-folder-list .pops-folder-list-table__body-div tbody"),
        $folderHeaderBreadcrumbPrimary: animElement.querySelector(
          ".pops-folder-list .pops-folder-file-list-breadcrumb-primary"
        ),
        $folderSortFileName: animElement.querySelector('.pops-folder-list-table__sort[data-sort="fileName"]'),
        $folderSortLatestTime: animElement.querySelector('.pops-folder-list-table__sort[data-sort="latestTime"]'),
        $folderSortFileSize: animElement.querySelector('.pops-folder-list-table__sort[data-sort="fileSize"]'),
      };
    },
    handleEventConfig(config, guid, $shadowContainer, $shadowRoot, type, $anim, $pops, emitter, $mask) {
      return {
        $shadowContainer,
        $shadowRoot,
        $el: $anim,
        $anim,
        $pops,
        $mask,
        mode: type,
        guid,
        emitter,
        close() {
          return PopsInstHandler.close(config, type, PopsInstData[type], guid, $anim);
        },
        hide() {
          return PopsInstHandler.hide(config, type, PopsInstData[type], guid, $anim, $mask);
        },
        show($parent) {
          if ($parent) $parent.appendChild(PopsInstData[type][0].$shadowRoot);
          return PopsInstHandler.show(config, type, PopsInstData[type], guid, $anim, $mask);
        },
      };
    },
    handleLoadingEventConfig(config, guid, type, $anim, $pops, emitter, $mask) {
      return {
        $el: $anim,
        $anim,
        $pops,
        $mask,
        mode: type,
        guid,
        emitter,
        close() {
          return PopsInstHandler.close(config, type, PopsInstData[type], guid, $anim);
        },
        hide() {
          return PopsInstHandler.hide(config, type, PopsInstData[type], guid, $anim, $mask);
        },
        show() {
          return PopsInstHandler.show(config, type, PopsInstData[type], guid, $anim, $mask);
        },
      };
    },
    handleResultConfig(config) {
      const resultDetails = Object.assign({}, config);
      popsUtils.delete(resultDetails, "type");
      popsUtils.delete(resultDetails, "function");
      return resultDetails;
    },
    handleClickEvent(type, $btn, eventConfig, callback) {
      if (typeof callback !== "function") return;
      return popsDOMUtils.on(
        $btn,
        "click",
        (event) => {
          callback(Object.assign(eventConfig, { type }), event);
        },
        { capture: true }
      );
    },
    handleKeyboardEvent(keyName, otherKeyList = [], callback) {
      const keyboardEvent = function (event) {
        const _keyName = event.code || event.key;
        const _keyValue = event.charCode || event.keyCode || event.which;
        if (otherKeyList.includes("ctrl") && !event.ctrlKey) return;
        if (otherKeyList.includes("alt") && !event.altKey) return;
        if (otherKeyList.includes("meta") && !event.metaKey) return;
        if (otherKeyList.includes("shift") && !event.shiftKey) return;
        if (typeof keyName === "string" && keyName === _keyName) callback && callback(event);
        else if (typeof keyName === "number" && keyName === _keyValue) callback && callback(event);
      };
      return popsDOMUtils.on(PopsCore.globalThis, "keydown", keyboardEvent, { capture: true });
    },
    handlePromptClickEvent(type, inputElement, $btn, eventConfig, callback) {
      popsDOMUtils.on(
        $btn,
        "click",
        (event) => {
          const extraParam = {
            type,
            text: inputElement.value,
          };
          callback(Object.assign(eventConfig, extraParam), event);
        },
        { capture: true }
      );
    },
    getTargerOrFunctionValue(target) {
      if (typeof target === "function") return target();
      else return target;
    },
    handleOnly(type, config) {
      if (config.only)
        if (type === "loading" || type === "tooltip" || type === "rightClickMenu") {
          const inst = PopsInstData[type];
          if (inst) PopsInstHandler.removeInstance([inst], "", true);
        } else
          PopsInstHandler.removeInstance(
            [
              PopsInstData.alert,
              PopsInstData.confirm,
              PopsInstData.drawer,
              PopsInstData.folder,
              PopsInstData.iframe,
              PopsInstData.panel,
              PopsInstData.prompt,
            ],
            "",
            true
          );
      if (type !== "rightClickMenu") config = this.handleZIndex(config);
      return config;
    },
    handleZIndex(config) {
      const originZIndex = config.zIndex;
      const handler = () => {
        let deviation = 100;
        deviation += PopsHandler.getTargerOrFunctionValue(originZIndex) ?? 0;
        let maxZIndex = deviation;
        const pointZIndex = popsUtils.getMaxZIndexNodeInfoFromPoint(deviation)[0]?.zIndex ?? 0;
        maxZIndex = Math.max(maxZIndex, pointZIndex);
        return maxZIndex === deviation ? maxZIndex : maxZIndex + deviation;
      };
      config.zIndex = handler;
      return config;
    },
    handlePush(type, value) {
      PopsInstData[type].push(value);
    },
  };
  var PopsAlertDefaultConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: "",
      },
      content: {
        text: "默认内容",
        html: false,
        style: "",
      },
      btn: {
        position: "flex-end",
        ok: {
          size: void 0,
          enable: true,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback: function (eventConfig) {
            eventConfig.close();
          },
        },
        close: {
          enable: true,
          callback: function (eventConfig) {
            eventConfig.close();
          },
        },
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      forbiddenScroll: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsAlert = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "alert";
      let config = PopsAlertDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "alertCSS",
          css: PopsCSS.alertCSS,
        },
      ]);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
			<div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $headerBtnClose: $headerCloseBtn,
        $btnOk: btnOkElement,
        $title,
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      PopsHandler.handleClickEvent("close", $headerCloseBtn, evtConfig, config.btn.close?.callback);
      PopsHandler.handleClickEvent("ok", btnOkElement, evtConfig, config.btn.ok?.callback);
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) $anim.after($mask);
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      return result;
    },
  };
  var PopsConfirmDefaultConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: "",
      },
      content: {
        text: "默认内容",
        html: false,
        style: "",
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        close: {
          enable: true,
          callback(eventConfig) {
            eventConfig.close();
          },
        },
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      forbiddenScroll: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsConfirm = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "confirm";
      let config = PopsConfirmDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "confirmCSS",
          css: PopsCSS.confirmCSS,
        },
      ]);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
                        <div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $title,
        $headerBtnClose: $btnClose,
        $btnOk,
        $btnCancel,
        $btnOther,
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      PopsHandler.handleClickEvent("close", $btnClose, evtConfig, config.btn.close.callback);
      PopsHandler.handleClickEvent("ok", $btnOk, evtConfig, config.btn.ok.callback);
      PopsHandler.handleClickEvent("cancel", $btnCancel, evtConfig, config.btn.cancel.callback);
      PopsHandler.handleClickEvent("other", $btnOther, evtConfig, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) $anim.after($mask);
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      return result;
    },
  };
  var PopsDrawerDefaultConfig = () => {
    return {
      title: {
        enable: true,
        position: "center",
        text: "默认标题",
        html: false,
        style: "",
      },
      content: {
        text: "默认内容",
        html: false,
        style: "",
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        close: {
          enable: true,
          callback(eventConfig) {
            eventConfig.close();
          },
        },
      },
      mask: {
        enable: true,
        clickEvent: {
          toClose: true,
          toHide: false,
        },
        clickCallBack: null,
      },
      useShadowRoot: true,
      class: "",
      zIndex: 1e4,
      only: false,
      direction: "right",
      size: "30%",
      lockScroll: false,
      closeOnPressEscape: true,
      openDelay: 0,
      closeDelay: 0,
      borderRadius: 0,
      style: null,
      lightStyle: null,
      darkStyle: null,
      forbiddenScroll: false,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsDrawer = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "drawer";
      let config = PopsDrawerDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "drawerCSS",
          css: PopsCSS.drawerCSS,
        },
      ]);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const { contentStyle, contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            ${config.title.enable ? `<div class="pops-title pops-${popsType}-title" style="${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="width: 100%;text-align: ${config.title.position};${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>` : ""}
            <div class="pops-content pops-${popsType}-content" style="${contentStyle}">${config.content.html ? config.content.text : `<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>`}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops: popsElement,
        $headerBtnClose: headerCloseBtnElement,
        $btnCancel: btnCancelElement,
        $btnOk: btnOkElement,
        $btnOther: btnOtherElement,
      } = PopsHandler.handleQueryElement($anim, popsType);
      const $pops = popsElement;
      const $headerCloseBtn = headerCloseBtnElement;
      const $btnCancel = btnCancelElement;
      const $btnOk = btnOkElement;
      const $btnOther = btnOtherElement;
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      $pops.setAttribute("direction", config.direction);
      if (config.direction === "top") {
        $pops.style.setProperty("height", "0");
        $pops.style.setProperty("border-radius", `0px 0px ${config.borderRadius}px ${config.borderRadius}px`);
      } else if (config.direction === "bottom") {
        $pops.style.setProperty("height", "0");
        $pops.style.setProperty("border-radius", `${config.borderRadius}px ${config.borderRadius}px 0px 0px`);
      } else if (config.direction === "left") {
        $pops.style.setProperty("width", "0");
        $pops.style.setProperty("border-radius", `0px ${config.borderRadius}px 0px ${config.borderRadius}px`);
      } else if (config.direction === "right") {
        $pops.style.setProperty("width", "0");
        $pops.style.setProperty("border-radius", `${config.borderRadius}px 0px ${config.borderRadius}px 0px`);
      }
      if (config.closeOnPressEscape) {
        const listener = PopsHandler.handleKeyboardEvent("Escape", [], function () {
          evtConfig.close();
        });
        emitter.on("pops:destory", () => {
          listener.off();
        });
      }
      [
        {
          type: "close",
          ele: $headerCloseBtn,
        },
        {
          type: "cancel",
          ele: $btnCancel,
        },
        {
          type: "ok",
          ele: $btnOk,
        },
        {
          type: "other",
          ele: $btnOther,
        },
      ].forEach((item) => {
        PopsHandler.handleClickEvent(item.type, item.ele, evtConfig, (evtConfig, event) => {
          const callback = config.btn[item.type].callback;
          if (typeof callback === "function") callback(evtConfig, event);
        });
      });
      $elList.forEach((element) => {
        element.style.setProperty("display", "none");
        if (["top"].includes(config.direction)) {
          $pops.style.setProperty("height", config.size.toString());
          $pops.style.setProperty("transform", "translateY(-100%)");
        } else if (["bottom"].includes(config.direction)) {
          $pops.style.setProperty("height", config.size.toString());
          $pops.style.setProperty("transform", "translateY(100%)");
        } else if (["left"].includes(config.direction)) {
          $pops.style.setProperty("width", config.size.toString());
          $pops.style.setProperty("transform", "translateX(-100%)");
        } else if (["right"].includes(config.direction)) {
          $pops.style.setProperty("width", config.size.toString());
          $pops.style.setProperty("transform", "translateX(100%)");
        }
        element.style.setProperty("display", "");
      });
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      popsUtils.setTimeout(() => {
        popsUtils.setTimeout(() => {
          $pops.style.setProperty("transform", "");
        }, config.openDelay);
      }, 50);
      if ($mask != null) $anim.after($mask);
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      return result;
    },
  };
  var PopsLoadingDefaultConfig = () => {
    return {
      $parent: document.body || document.documentElement,
      content: {
        text: "加载中...",
        icon: "loading",
        style: "",
      },
      useShadowRoot: true,
      class: "",
      only: false,
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      animation: "pops-anim-fadein-zoom",
      forbiddenScroll: false,
      isAbsolute: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      addIndexCSS: true,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsLoading = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "loading";
      let config = PopsLoadingDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const { contentPStyle } = PopsElementHandler.createContentStyle("loading", config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            <div class="pops-content pops-${popsType}-content">${
              config.addIndexCSS
                ? `
                <style data-model-name="index">${PopsCSS.index}</style>
                <style data-model-name="anim">${PopsCSS.anim}</style>
                <style data-model-name="common">${PopsCSS.common}</style>
                <style data-model-name="skeleton">${PopsCSS.skeletonCSS}</style>
                `
                : ""
            }
                <style data-model-name="loadingCSS">
                    ${PopsCSS.loadingCSS}
                </style>
            ${config.style != null ? `<style>${config.style}</style>` : ""}
            	<p pops class="pops-${popsType}-content-text" style="${contentPStyle}">${config.content.text}</p>
            </div>`,
        "",
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const { $pops } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleLoadingEventConfig(config, guid, popsType, $anim, $pops, emitter, $mask);
      popsDOMUtils.append(config.$parent, $elList);
      if ($mask != null) $anim.after($mask);
      PopsHandler.handlePush(popsType, {
        $shadowContainer: $pops,
        $shadowRoot: $pops,
        guid,
        $anim,
        $pops,
        $mask,
        emitter,
        config,
      });
      if (config.isAbsolute) {
        popsDOMUtils.css($anim, "position", "absolute !important");
        $mask && popsDOMUtils.css($mask, "position", "absolute !important");
      }
      return PopsHandler.handleResultConfig(evtConfig);
    },
  };
  var PopsFolderDefaultConfig = () => {
    return {
      title: {
        text: "pops.Folder",
        position: "center",
        html: false,
        style: "",
      },
      sort: {
        name: "latestTime",
        isDesc: false,
        callback() {},
      },
      folder: [
        {
          fileName: "测试文件夹",
          fileSize: 0,
          fileType: "",
          createTime: 0,
          latestTime: 0,
          isFolder: true,
          index: 0,
          clickEvent() {
            return [
              {
                fileName: "测试文件夹2222",
                fileSize: 0,
                fileType: "",
                createTime: 0,
                latestTime: 0,
                isFolder: true,
                index: 0,
                clickEvent() {
                  return [
                    {
                      fileName: "内部-测试文件.zip",
                      fileSize: 1025e3,
                      fileType: "zip",
                      createTime: 1702038410440,
                      latestTime: 1702039602126,
                      isFolder: false,
                      index: 1,
                      clickEvent(event, config) {
                        console.log("下载文件:", config);
                        return {
                          autoDownload: true,
                          url: "https://update.greatest.deepsurf.us/scripts/456485/pops.js",
                          mode: "aBlank",
                        };
                      },
                    },
                  ];
                },
              },
            ];
          },
        },
        {
          fileName: "测试文件.apk",
          fileSize: 30125682,
          fileType: "apk",
          createTime: 1702036410440,
          latestTime: 1702039410440,
          isFolder: false,
          index: 1,
          clickEvent() {
            console.log("下载文件:", this.fileName);
            return {
              autoDownload: true,
              url: "https://update.greatest.deepsurf.us/scripts/456485/pops.js",
              mode: "openBlank",
            };
          },
        },
      ],
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "primary",
          callback(evtConfig) {
            evtConfig.close();
          },
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(evtConfig) {
            evtConfig.close();
          },
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(evtConfig) {
            evtConfig.close();
          },
        },
        close: {
          enable: true,
          callback(evtConfig) {
            evtConfig.close();
          },
        },
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "500px",
      height: window.innerHeight < 450 ? "70vh" : "400px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      forbiddenScroll: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var Folder_ICON = {
    folder:
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABRUExURUxpcf++Hv/ZU//OPv/DL/+9Gv/BI/+4Bf+4Ef/XcP/LOP/TSf/RRP/WTv/JM/+3Ef+9Ff/bhf+5BP/DJf+yDv/imv/kqv/bXP/w0v/fd//calQXUgwAAAAKdFJOUwB///8d3L9enl8sr20gAAACN0lEQVRYw+2Y65abIBRGE1EzVbyNSW18/wctHA6XYw4q9Ee7Vt2AgOHbcVyTOMztdnFxcXFMWf7gKHN190VRKDpFC0iNqB5ZvqpXzJRxHoF7hrAa9/hK9j2oYIA2QA/UqXeyNg5QDBrshhHbUH8xxO+uT7sOJ/tU5a4wh0eK8KmKHTxd28Bfo16pqphep5l6I+R/p8xr668kVghVceH8M5EZYnGhnBKRceGqmaZXPPw2xbO+1xU+8axwe8NfzkIV7xVZdF0AVhi+rWdxIfgmwloE6CkrDCPwJbYUeFgK61icxFcNKyxIxE+WgnllQ0y4+HffzZ8WZtJlCDtz+CzqaaFaVGiWBNEOZZ15zihsT2CFnXk4QStsLohTU3FC+Af8I8JWV1fa1jy8u+hnOUy2vnd5SkeGrJBfHZwDbxe87pfxQvejmMZZYxxdYSoyVyixSvtXFLJ7hWq5xCRNSTozczzHCj8T54kI5d8QCtvZAodDIa7DgRkJaII2hBfaJC7EOE7D076XuIoVBu8oN3kpBLVt4YXBVaUSFSbS5Akb00znSoPn9KCJCN0am7SnGhganC4kKhR2MV0vvEn4M7bFhM3GIZqtgfiPr9BdSAYnrnCX3rQeB/2xsKcHouiBBhpO+phQL9CdjmKqsRkXpkMz57dmfTY1v3k8is26zvN2A6yIbKVqm/tMjFBMp5jpxrWKbsB1dJw/AsC3Lt/YEaK7x1t5r7aLj3ned/fRj1TK3H9wXFxc/F/8BgM0jBZ4nc19AAAAAElFTkSuQmCC",
    zip: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFQUExURUxpcYHaOWDM+pryU4TbPXLU/XHT/X3Y/nrZpIffP/+gI4La/+9QTvhycXjQL4fbQvBUUoXaQHrSMf+cJPl2dfBXVf+KMDu99IveRv+ZJf+NLv+PLIncRPdvbV7L+VnJ+P/u5HDS/P+DD1PG93fV/U3D9kTB9WfP+2vR/GLN+nvSM86bL33UNf/69f/+/XzTNP+vVf/iyf/06sOCRsGhYP2Jh/t8e4TVPX3QNat7jnzCMfxfXXrUMP/UqJPoTX/cM/aDLOVjKP/jw/9yC/98HP+GLP/Ec2C63f+iQ4TjNvOiasmpZLuTpfaQgfjEu4HGOPKGeHDC4s2YXU+02/Ozn/B0J+1oYHvSNGnM9P/r291KSNGeZIHGObeOn5zzVM6PHkS978mNUt+EO/GadPOgbZzyVJvyVNG6g66AksCer4LGOc7Mp/eWh/SZVu6adP6VKOSF/TkAAAAKdFJOUwDf39+Af5/9MKAONWYwAAADB0lEQVRYw+3Y+U/TYBjAcUDYIahlA3bCimM3Y64MERWdeExFOhDoxkTnDuTm///R9+jx9MjbtcT4S78sIVnCh+c9mjDGxry8vLz+TwGffxp2/Ql0vYJbJuXzE76AvTc1rc9//gx0vqxg+XwON+XY8+8+BO22NayQKxQKSzZiwMj5D/TgQZtORjASe9U+QKHQfplAilEuhfIxQT/g6P4bwEZbGS1FS08wQR1GzpOCYfSFX7XGEtDSJPaEQCPH2cagwmEwpdfSmQwbXIEaOlAMhsNkRvQ9jEANy9CYoA7Dt6PdqIVBtUY6rdOy2SwbVLEcvR5G8DCjWkSzA3VPAbkcJlCHZbORCBPUY+h+pKzArKZF7MAcvLf4PDUwRsDfikU1O9DwFKDzPKzFYjGMkW8yGIExQbpO9SlAB0BANQxGDDFBdbS0ctdMYMQReHn5Te0n6aIPwf7WBWoLdsEEN57PoR6RFnGSVIdgfV6J47gZHPdqVBBzG6IobutCb+w5B+dkcE5Ys0iQZJBzPOENAsvG1oQ910u+EcplvroDqvLlsrDveEJlyXvox8Xbz6BbEf2KfdcTIlA4On4KOj4SNJBzAQpmUHAxobrkE4E3gyf7YECHE1qAPAWd7+EiAXleHMI/RYYiz5/c41AQaO4+YNXKq7oHpe2dqqmd7XnXhyJJg8Hd8CtoeDcYSDPuwflOp/NOF3qjwzm42Oc/SN/ler3eer8O6q+b6jHBszfRaDSZTD7BzaI2m6UEqPTyxWqrUiwWQ6HQY9zrt1+Y4B8ZTDLASoV4o4G/EJiMat7s5un9QDKhDBLSPGGl4mTJeA+T8pLphFeleCIeTyTwK04mJJvofg9PS3GQMqGjPdSfsjVYdA82jSA6lJa7CWdNEy6QCVedLPnMYg8XQHTJFecTwottAJ3dwwcWSzaBrRY8lHEmGJQvtjbhlQWomzDI/vAIn5TRlmzzkXnSvIcfQWZw0u4D86Rhyc3uB1CXgOCUbT206uA4PJRm9z2oKz/LFBwPjvAvAi8vL69/0l8fxm2XCv5p+gAAAABJRU5ErkJggg==",
    mp4: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABXUExURUxpcZKU/5eZ/4SG/5CS/5eb/6Sm/4WG/5uc/6eq/4uM/4iJ/6Ci/5ye/6eo/6Ol/46P/5mb/5eY/5GS//39/5SV//X1/6Ol/+3u/+Li/3Z498/Q/7u8/zCK/WcAAAAKdFJOUwB7Pf+fHN2gn59fp7PNAAACSElEQVRYw+3Ya3OjIBQG4FqamnDzTkT9/79zOQdUzG0PJjP7YX2DeAR5EtKZTu3X15EjR46Q851dnuY7nTtd9Kv8nlK9X60/Kl60/qh4wjUFNjx8XSznIlHMClgICadC+2PWYShFvFwpSRAvBSl0MYDyVpB7xfOyLXmVrl2h99cQPw49VTzLV7lGNVF8DW5CExNAeSaCSsHdyi9SUPi2Ds2h/KY4K+epbZANpYoKmRHBGy6qbt7qnAzKaZzU86SDtje91Z8Ddd+2renHIh6sEsFKVS64stKmhRg7rRi2yrM0MEoAW2Osrh4kFaxnEPd9/SiI+94N1jW0qu5icN13Xfl7iCBqPlsQ9y3nObyJCNYr2G9Bt28VzRPBroYWQGNMiy+Dlel116WBP24BrOlcGgC9NaNWdjjV4T0/NHAJgnF6O/Fo/l2wt6Nm4i2w6OOMExtYmQ42Tdd00BxoV85O9TCI0k26hDckgc2acgXtKIeB8WabvaCFL89xZfMuKG1vgZsa2O2dRwbdUng1vBut48bK7dZ9ezgOrC/diQSWUdg0jrhb4a3bJIOCVYrDD6N8HCLol0PP2QC7fexxTgN5yctF4Mxz8wE953gDdHQwSiDQmK9Lr3IamJCcAObPl4u9oBAL4EohRESGC+FrGoiOX+E/lYD4y3kg0CRQJOSfggwbFksZZhg2GKOAGQscrFrE+RrachaC8hfsN7uLCJ24myE9BuQb52HmGcqO3fPtc2jXB3RiTuNy+hPpKcv/mmzHfzOOHDny/+YPi6+BG+WQsHsAAAAASUVORK5CYII=",
    apk: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABXUExURUxpcXnGVmm8P2q8QHzIV4bNYXXDTWu8P3nFUYfNY26/RIPLXoDJWobNYXHASH3HVnXDTXnFUfT/7onPZej/2/v/+Ov+4cDypVmtLqvjjt38y57afsvyti89dh4AAAAKdFJOUwAQ3/8n3Xugn58KiJgCAAACeElEQVRYw+2Y2ZajIBBAuxuTtIhsKgTx/79zisUlaZ0pPPM048WwBa6FkpyYj4+Li4sLNNW9PqQq133W3e+4lSqr24GpPWms08S23ZhCmnvatsxYtZE4/a229BQZ78nxk27TXWKsWwwFRhA2ITXz3FBp1maxsc6OLF1Usb6cocBYNynAnKcs55tm22CNdYPl9vmXhUhj3bA8PpaMLdUNqc1qZIQggRRUi42lPIvmEzDMZazZBiHYOy9dd4TwezPXj1Pzqgxd7dpVlwnVNAzjS0SiM4N2a893mVC6MF2BsvO+64QQzTgMfadKhSIdQvFJD9p3duyNMf3khB0G44gSLCWcUKxwBhEZM2S0Af/E5TqgVKiI18MrRnKV3mRnhNy/+QbdbQIsF3oTFmr0vGJY8sjUGaGCBEcPht65UIDK2+C3UuUhaKFKSUmngen5tCE07Z+kh7bxMp9RKZRQLYg+CgmZQqk94SaUli8jyoTSx/lmsrHUvR1TqU4KuY3zddKtFVjzOSEd9S7G8UJhDEBKAp+4Hg7Itpg+C6WSKKEMgE8Se4CnaYAsEAbo8wDC5yGFQndAd1II13AfR08JOYlfg3BTTCzD3UktRwqFHJLk/DjCcBE5Wgi6BLH7xtHHuxKG4IRACJKTdhr3sISmM0r+QAgffIaS1u3uwlnIC4WckP1tuPhKhRDjHquvdMlrSdcmncvQgRLCDEpTtr6SNjX5klGkEM+/IyTxmF/bKlkLghbGrZE2SPLFFs1dZLuXMMJ71m1m0vkMdOmI71KC+QVbkQJQjyoPvA+zYnig/8L6vpDPUhUyxgfuSSr9ifH4I/cT/2ZcXFz8v/wC1sx9JR+88xQAAAAASUVORK5CYII=",
    gif: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcf+ubP+eUP+iWP+xcP+nX/+lXf+SO/uPSv+dUP6kX/+XRP+VQP+SO/+jWf+oYf+hVf///f+mXf+tav+ubf+rZ/+eUP+wcP+pZP/s3P+aSf/z6P/48v/UsvqFOf+6hP/jzf/Hmv/cwS4F5mYAAAALdFJOUwDdez2foByg/p/2onNSOQAAAh5JREFUWMPtmNuSoyAQQGeMUaZUxBveRfP/H7lc1VRJptF92Kr1INqtcKqNSSrk6+vm5uYGzMPzrTzcdYFff+I7cPV91/VfNZr6ykNb6WwMypW6tOBk9EoALka/KMtCTCr05OKi0S9AwI02YXXW+KwqMVluMqw4SimjtUGNzwoK0HgobC4Yn42iat6DanfKnPZdhCAersK0KcfXWOtYbPtrTeNBhGnapCt1n2VZX6cWnjDhjjETjNeFudrhWQpfeS7PqJ5vI0DCXJLKPVmkcMH5MQ5CBaGvIRtehIhkGVp2VmgqwgixhSEkciYeDz4jxDkWyD1F0zQhKrJZ3zzG+jKPQMLNJiAd6ogImHw1+1UngQh/8DHqefMS9/ycFhJVIC+ROAvJnrodRn7ARBfIS+TJirOwEp88JsTGx0skF4Tyfd3nZCtQ+c8KG3OXW4FZ1lJHIeUQ1dVXQzY0vMDBbLJEKjsFCxX1oOmHPe02wlHYDsewk0LWW5jPCfPZJuyZm7BTbWmtzHoMTNgpcPuBUg+CCSkfSTv2wTdXskKoUFGMdhhyqlASTcjOlLgLu3iyk0QOwjDqePsFfgeiA4VqykefCUK40KZ457wwuiaMBZFokc7EQTUTiigGCWMH/m1hAhR624TETFSh7Em8Np5DfsE+EgdAy4BQD473M9+SNYPcMV/fImh9CLiWCkKYL4SvSAMv/BXvxL8ZNzc3/y9/ADVfok94AIhIAAAAAElFTkSuQmCC",
    txt: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABIUExURUxpcTOL+DSL+DqO+Veb/mKl/kmX+zWL+U6a+2ao/0aW+0CS+kyZ/GCk/mWn/1yi/lef/VGc/Pr9/+jz/2+s+46//b3a/4O3/AJIojgAAAAKdFJOUwDf//8d3U+en52O09RGAAACF0lEQVRYw+2Y63ajIBCAW8ZqHC5KrZv3f9MFhpuJTQfrjz1n/SDIbT4npw2pfXu7uLi4YNOP39O367rRvOKja/V9GHOqcTTmVGNnzLlGl6A2WvvWxGsqJo9ajKMuGP0dDcbxSWTShKlGfOOoebCNRTidYxynDXrb1dUU0ziGEF3ZdHHoza14xocMXzJyhLdpmme/e6ag2XeobqYCnBRvs98fm32meId56nnCErk+czfVhlub0CyfOyzaHhTa9XOX9aDQqnU/w7uyjULrcC3i+ocI4iUOVkQ7+8IVeptXWgUgMXD3xjv1UYCyCa6QUAiC0E64fMUBYBTOrUJnROmBryCEMEAsCbYKrSIkCSXS0LYLla8U6K4KSYi+H5ZsWmcJY1ohmpos3OLWmoSF9JajX9m8ckyIRfjIrzM8KERfq5J/yridZwrDx0HF6suOMF24QoXJGijCR/gZboB/TZgDYyd9lqU8mqGPlGQMJR8OfiDjZNjDEQ5S0hlDZ4ushWkqwxSWJCgezOKYIMsw7Ri4wi0g3HfBKuF55bBQTNod1WcKw9kv6yShTQgUQA6A6IsjAEmFJ4RXOF24W+gBcIUxAaiapChi/zolw5rfC+GYUKTqG1G11Vxo2Bn6AJLk8NiPC6JBKOjXLv0ZEruwN2AJe8GCnKzHgEGw4STonm/fub535rNUx8xx4D+RdsPP9Af+m3FxcfH/8hcLt2QJ3T9wuwAAAABJRU5ErkJggg==",
    exe: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAB4UExURUxpcVq2/kOv/0uw/163/1Cz/0+x/zGp/zad+0Ku/165/Tms/zWq/zKp/1i1/1W1/1K0/0Wv/0Cu/06y//7//0qx/1q2/1y3/1+3/j6p/vf7/y+o/9zu/+r2/yqM9xCa/4LK/8De/3ay/p7P/n3B/rLW/12n+xyf/0XRgzgAAAALdFJOUwDdez2eoByg/Z+vFPUOhAAAAoZJREFUWMPtmOt2mzAMgNuEBDquhhgwgWwMQt//DSfJ3BJIJ3P6a+MLviDkDxE4OaVvbzs7OztsjgfrJUdz3flH/hXvZ1Pfe55/q9HK8iyDluOW4xz3cHcYzIxnMqSZNi3BuJHxALIsTXHLsB+nuOlzmRktbUl71RIKGhitNA3gMxEM3TgxM1rog2UB0vcoopAezIxWwIRrPM0XhX17jJgZT+ETwWwSPBzgGRfCL7C4wojSI91FEfVDJBo2hPNLcYqeCKmFs71pcuAJw0cbkCRREq1wMq4wQVnQNkAbJtuESYKWiAbUtXVVENU9p1iiT4NzrjChRQnNmqK4DBSNDuoj0NjCkbScdGgsUzlXmgplWl4eKcpkZjQVSnHv6yuqapjdhZycLKGUkI+bFK22VOW9ae79xRe5NkInWcIPSOxR5IC7292ArqYqi1qNCfKDIxyzRV7pp8W53RxstX56oMRNQqEaEpTdzVGAc+tKCjRqNLIuWYpBWOsCwScAMOoSaxIKdoWCkEI4dYm06JNkbClQO32KFAZCIWLnN9GBUOoSOwq0TjzkGAnxGhFHxU8B/RUYC2PlEGpcrobIxgpjpYmfI1OAJ4zjWOCaWN+UBTUdxyyeMB5wq8sqlTummAn9V0Jvs7BYpfS3CstqlQ1CRdnX9tcqraFQwcNB98T7/LnKp0cJ+PywhG7s9vjXVXxXp0DHE7qT0lXuK+gIR2g/ydSjV01zZSR8Xdoc26jCbxN6rut5HuZTR/s0eH03xVlCz4B/Q3hYWefDxxua7/s6CAPnL9ijv8DzX8F6DbB9Npwrhvdb5wq5V4bPYb5Lne3lrwKcYDG1+W+k54P9Vw4b/puxs7Pz//IHkvGjBU3hWj4AAAAASUVORK5CYII=",
    qm: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA2UExURUxpcdbc4MzO1dTZ3dTZ3s/T2c/T083Q1tXb4NDX287R19HV2+zv8PX29/3+/uPn6b3CzcTI0ZN/xtQAAAAKdFJOUwD////dexCfoCcDaycKAAACJElEQVRYw+2Y4XaDIAyFF2gnEizy/i87SJCCa13i9m9eLAQlHxfsOdZ+fFy6dOmSWPPdvdM063GfDo500yLnG8CfEh3AnxLnQ5bVE+810XYAu4dqiK7m2wH8C4+OKbahcsSfVnQeHTSLjLLNsW0boCE6u5nYbNrNFwe1a6VEVzM3hrUjic5Qc/uUOnyqslsHhosyoutYe/Zek9rhT5oVQNzl4qv4Lgbi92QsIY5UJwRiPUoO5gpiFmDDtsbpHCIXCMsjawnAE2AzjEIgki2kFMRIOEJGLDjEOpPM4UQZvOIiaLxMBKxnGSoEjgqPTmF38QQQHoOgu2RlQDcC4wiMv3XowwgMfrg86YDl+5dvCR/lnjyWJUQ4DczfPxaRngpwDhiZ9UpwCrgcCFRATyUeAaNXOfQFGN7jwkI3O48SAb2n6cNChY7abJ1cW08SLrnIUvZGCT2yVLQKL3aYZcKhvMIhD03xiBeTHugPiNHqgWaFGN6UCKtRA31a6UkSC4BrDsrTZU3KPSzzm7QafjjFWtcJIK3J6IA8PBNJaatrf914xsiBI3KnZGiAkTrcllMcmJfiLREDeXbDKYbrSqDQdD3xXa5J1HLsa98/O164h93Kvke7Uzrguy3spASafwK8a4CSX7BzGZj6rLSL66c0oleVyfRJyYyInipacX6hvzVbae8ymX4G6bvUPA0rTa+WTv5kb1L8J8b0o+4n/s24dOnS/9UX8vFAaEzio+4AAAAASUVORK5CYII=",
    php: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcTbUrDrbszvetTXYrDnasjXQqTPIojfTrDvftTTMpjPKpDnZsTPIozXOqDjXrzHGoTbRqjfUre7/++T++Pf//SfCmxm3j1fXt7Hx4UvNrNL78XHfw8T26o3o0eeFKfsAAAAKdFJOUwA9//8c3Xign5/8SMcgAAADDklEQVRYw+2Y65qjIAyGp9ppRxBERcTj/V/mJsHTtN3dMNt/66dAEsjbgE/7jPPxcerUqVNsXW7Zb3WJx12z9E/6vMbyPtP0rcQsTd9KvKbpe4k3SkneR8wWVrL0yb8SM2QkQYGZYEsITnckMUteKX2KsImvgS/EJT4B86XtXhwx2xD5kp3nCwVHaHTnbOJXsuWv2Utd+WOJ+RcLmJOSpREw30T01U7yCx9Y0H0g+W6YIZRsYRxvfODGK/KiQHtqGjsePwU/MmMCi+84GArfgEZ0izBHHecQvzAFQaGyMBTFDDzbV2iuYWhcYBEgB1Ww42Yw1fdoDHDR3I00JhaAs1ndOCCUUS2lzLa2HgNj3TT1OIKLxIruiAorFPQz1GU9muEIx+CHeRxYQFwaUih/dmCVeISTMx1EBl9t4gKD/FAjz6AJoHp2znV1U0/+Z0A/1XXdOaex1hrYvRBtT8H8J8AcUyflBO64A3sQZSmJaOdIYInXDAzbtxIdPVCxYJoWnjQ86hhgCXkgKsoYNEsPkHo0OGN6/KAZglg5E4gSdIRTT/CRqhXEhmJt1+uwKgYYTmvqwdahWr3zXDxQOyDCF2NKwEHK7IhnkdeqMhqIRD9Za6cKjhC/cnCE/cIzOgqo6SrFQhz1DP0gZElG4C1rmEAQVKiR2A1dLzos1AmtyQWepjUgFlBvAqLyvYONWjhC9HuvWiTrCOB9X66la9vWjMCzHurSBlwndTRQaIFVQJPGGUFHqJBD7r4BLbhbFmsGkiUeYbdsFPxwhTV3ToVrfQKToZlxGqbRoRlmwhTNsYFbCsg4P3rY6pNgngWUa4IMjZ6MO0TlNssDEoS6BaLgl1qtrkTRiEt4wJAm9pKUXIuSa30xFUqp5IPEY0CqEOIB1Yo8cNSjFRZxgUrReuzRRlfto5ShgVjALU+9lDyabCBXHOBtW20eLBOaMSaM4HL+gr1gmtlBmG82NjrrHFys14A7MgizGQepbQpuzo7xBfw74lnrNPdd6no3LN35b6TX2/2vuv3gvxmnTp36f/ULf0R1znQ7804AAAAASUVORK5CYII=",
    pdf: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABUUExURUxpcf9zfP9ldv98gP92fP9+gf9we/9md/9yfP9/gv9/gf93fv90ff9od/9ref9ve/9ldv/x8f/q6v/8/PlYaP/g4f6lq/63vP2Ejv6Um/7Iy//S1LO+3cAAAAAKdFJOUwA93/8c3Xugn58XiwqYAAACVklEQVRYw+2Y23KjMAxAmzolxXc7tYHw//+5kmxI2tBWMDx0ZjkhMr6dkWoeSl5eDg4ODticmvZbTut151b+xNt5re9Nyl2NrZS7Gs9S7mts5M7GVu5sJKH4KhDbjS1shu2CKA36yj2ZaZ5vbGdNbT9zH+MaW8GFaeQLmcYF4XAbu37J2HKFiparyReu12ta+oOKEztDVXwKP+mKdKV3H8a7ZkWGqmxWihIEoVLT+FyA4tTc4g68VI39LHyGI3yva0WVKl1KzroOimkOvu8rhJNWmY6Eg17IcL0QcFRzkGovofZYc/C7ZahNBuHNbs+wpHKPrscH2yqt4YIBbGlOc4WPYK8rp/w4WhexhPoJem6SeJ7YKMRTDteQdxN2odDvIXRwpRBSjhD6rUJXL/xoPUBynRohjkL0Geh1nWILYblzk/cWQhx0DymGFDFCvqSDFSyhc64YCzKisBvDA1HqsoAvLBmil44khk/EXNesEhIiF1eMMaVaMWa8UahyimRLacy98xmdwM3ZTcKhbE+pG9xHIY+QaOf9JmFGW4hpIJU31npsMZgtJZMP60MJ2GDIGl/cbo3QAs5aUeqNqfe2DtVgax86bCFQE0wZ6lvSERzhpW6hE0np5r198sysEBqL5wm+D/sDlxUZep+73MMJ7CQs5/mLjys0pqSIj4uh8mdM7dTIE8KmCZLXW1MnHma5Qj4sofnrwmZhn3+I0Ph5gvMf7Am2ELjX0z21ZKozJUDDeg24eDaciuH99pXre2W+S52ZOV74b6Tn5vIrzYZfMw4ODv5f/gEm33Cvx+zPHgAAAABJRU5ErkJggg==",
    Null: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAA2UExURUxpcdbc4MzO1dTZ3dTZ3s/T2c/T083Q1tXb4NDX287R19HV2+zv8PX29/3+/uPn6b3CzcTI0ZN/xtQAAAAKdFJOUwD////dexCfoCcDaycKAAACJElEQVRYw+2Y4XaDIAyFF2gnEizy/i87SJCCa13i9m9eLAQlHxfsOdZ+fFy6dOmSWPPdvdM063GfDo500yLnG8CfEh3AnxLnQ5bVE+810XYAu4dqiK7m2wH8C4+OKbahcsSfVnQeHTSLjLLNsW0boCE6u5nYbNrNFwe1a6VEVzM3hrUjic5Qc/uUOnyqslsHhosyoutYe/Zek9rhT5oVQNzl4qv4Lgbi92QsIY5UJwRiPUoO5gpiFmDDtsbpHCIXCMsjawnAE2AzjEIgki2kFMRIOEJGLDjEOpPM4UQZvOIiaLxMBKxnGSoEjgqPTmF38QQQHoOgu2RlQDcC4wiMv3XowwgMfrg86YDl+5dvCR/lnjyWJUQ4DczfPxaRngpwDhiZ9UpwCrgcCFRATyUeAaNXOfQFGN7jwkI3O48SAb2n6cNChY7abJ1cW08SLrnIUvZGCT2yVLQKL3aYZcKhvMIhD03xiBeTHugPiNHqgWaFGN6UCKtRA31a6UkSC4BrDsrTZU3KPSzzm7QafjjFWtcJIK3J6IA8PBNJaatrf914xsiBI3KnZGiAkTrcllMcmJfiLREDeXbDKYbrSqDQdD3xXa5J1HLsa98/O164h93Kvke7Uzrguy3spASafwK8a4CSX7BzGZj6rLSL66c0oleVyfRJyYyInipacX6hvzVbae8ymX4G6bvUPA0rTa+WTv5kb1L8J8b0o+4n/s24dOnS/9UX8vFAaEzio+4AAAAASUVORK5CYII=",
    ipa: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABUUExURUxpcUOv/zar/1K0/1Cz/0+x/1q2/jGp/0Ku/163/zGp/1a1/zus/1q2/02y/0ew/0Gu//f8/164/+/4/+f1/9fu/yek/73j/6TY/xad/43O/3nG/21bnhoAAAAKdFJOUwB7//+gJ92gn59E+c9oAAACbUlEQVRYw+2Y27aqIBRAd5iVsLiICKT//5+Hi5hmdcD2wxnjOIPF4jZdPXX5+Tk4ODjIpj41b6l3+Br5iUupsr5I+avGVB99GvcaayqpI4ioz2MWJnGl0HiiNCpfIuNeibFZ6OQ6ysdqgbGhWeQbvZDQGMjCQOYlUmZsCHFXSIoTNEWvjXu5xjNZQVOgC3Hkskv4ict+YfXa2GQJq4r4lkI1z+UoSUhj9w+p84QrSEqGvpeLaeC0QzhBTdca8bx63i+0bavGvULmG1sNUrXKIu7SxU6ZcLoV7jM2qN5ixKJwkrJMIVtRxWG0g9Z8teQpEKZbZLB2kAzf9WiNsXL9uOIKiVVd23bKDLZ3icss+UpovMWTxlYZUii8hZPcvRgfZs+MkYKFPR/YLUfI3VkP41RtfL3Ugk/brmcKw3F3YdwU2A0a0q7nnC0MmI1QUeBLbkVC4YTzKzZViS+EYLpnFOd7hOK9UO4QCi6CUsCgNkYreNp2TeQJEzCqFyWKJdlC7hvwPji6h1d1hkSVr7O0QoGNCjqlQvdDp/phT4WTcOyjxvuS+hshCKM2GATlQogd9FTign7UMD0NMoUw4S4gbZ+MvdUo7PltgDxhOu3QyARj7/Gj4RoWFFXoC0GaGacydhhsSEgoML2FYiEAvovRjuzuAPdBxe8YSiu8wpPRox0hWfvyhWgOgLHWGDnc6JLZFbJrltDfjneQv4fiEJdR3ExZlhB9BFazXxCif0aIF/ExxmQKOE94SofxQxrTqWMHig3lfIOt8Qb0dpr1U+WKs8l5xw7I9UHmb6n6+qv1xT8xrn/ltOffjIODg/+WP3HMcIG4JOLbAAAAAElFTkSuQmCC",
    doc: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABIUExURUxpcTSL+DmO+VSd/k6Y/Vmg/kOT+jSL+UeW+1uh/1ig/k6a/T6R+l2i/0SU+0mX/Oz1//n8/y6G99fp/3ex/J7I/77b/4u9/gFOo+kAAAAKdFJOUwD///8n3Xugn58WcbRuAAACn0lEQVRYw+2Ya3ekIAyGCzozHQFRUPz//3RzQaSXbYPtOfthfccoCcljEM9pZ15eLl26dEms/v78q/oTvKf7SrdWZH9z7leJT+d+ldhTzQCfooH9oUw0Ee8D1qPyZXBsOxDdFuJzkKiBKAM2EIVAObEGdtlqv0SkRAB2XTfgQSMao5M/FKHpmxDYvdHO2G9S69YE/FD+5i5szxMdfq1eBDSYasiMYY8DJkcPuwuAr12uxNO2LgaHGWCM29Yhe3g7yZpfTa41xq/THJ3BNunUGZ8gMnAAs15FQBbUjHGe57W4IDfN87T44suAXUZ6WwFZCwDnZSx+S4cA1AeQnwEBp2X054DjAVxiXPclzyeAno4d6I2DwbT5/Rky0IuBnnjeH8AVrrC7PgPtniED+l0Z6D1txTwn7w8gp5wEJuLh+1KA/jRwWv2GFGwymR8CFQEH7DMmRG0ZOLYCucAyEFFx0REvWwGOcuAIgnw4qwgrRdCUVNhgMEFgQiBO4yEGkqyielB0IahEw5mBWSeBcQ1KB7fjfw5MXlmrw5rdRf8QGJegrbVqTNltBtrRVsC4agU+tLjECkhJIiA0A+koBqYBGsSI4kUD0I6cJAVSOjw12ljcEcJDi0PKQBKkSDvkfAJGeAU138PSy5iBvIYmIO1rTAu8MiUwJogYVVIkwMcBVAb+jFKDOQCL3lZ3BOyjCQhLROkKSBHVDNRQSqb28gyliOIImQioK0ExC2E5oqp5GZBrbVX3PmJ3p7nD7/TPgEpXD0oVU8XN00oGpEqsUQc5UxWb2k0EVG/F2Ix4LwnwXld+AtF1WPIfbK8aJPqq8pDzJCsG4YICV4S9NByUUFwt/C7VP7AgUBGcw0cmTQZhf/wjxuNb3c/8mnHp0qX/Vn8A5AVWOPvxckoAAAAASUVORK5CYII=",
    xls: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcYXMX2m8Pmm8P3zJWYbNYXvGVGu9QHrGU4jOZITMX4fOY4HKW3fET3LBSm+/RnrGU37IV2u9QWm7P22+Q+r94PP/7dv2zfv/+GGyNlmsLsfrtaTZiLPhm5TQdN9r514AAAAKdFJOUwB/e98c3T2gn5+4KvYSAAACu0lEQVRYw+2Y63qjIBCGmzRtqhwV1Arq/V/mDgMeYtLtkM2/9ROBGWZe0aB96NvboUOHDpH1eSp+1Gc+7lKwv+njksv7YOylxIKxlxIvjL2WeGIvJhYlY1BYiRU0ZahZcqYjh1ggJCqmL8bcCVejE4tyL/awSybeA38QlXgL5PsuzyYWMYmvhfNECS3nWDCGRiw4T0lr2bjwLCOSnyjAL56hz2wg2yNuHadM4NA0vpyNCs6pa7ot8osIrGI6a76/Wx96FVZ8Asc3OmIAEVghDw7WQX47Qq8KNo+212ihjwSsFsmxjcQo1oHZdpNYIzKBVnokDmiVvgV1Q/88UPQCic0EhvZN5Cn9DDAmyb5Kt1lV8Is3TTc4k3iaDNRah/DQaOngwYWJMZgg8MYeblhrHIOWDFxl3QREmKMeuq4bVS8TLooIrDZE44bw7FpvpnGYeYvyZ6iF6cdAbCbn3J6XCxSR6JDYTb2RuzEaUKQMEbLgkH2a45A8cw0tDXgjAMve+kTc6wmgECOsPhGJ7BXA8D43ggdi05X/DsTvQ8Nc6fFN4c8AJRyhBOEXsPXKwAJHYnimOChzZihThmRxUVe9hAWORB8vJCOXBJSAk1E8vMiN186KhTjKTQAFeMVwgVn43HzpDFgKliMShwQTdOCsMgC6CXkr0as1IhMoPHxhht4kgnXKw1+9wa4R1yygMnoYJ9cvM6qdHMfB1PnAhDAufGHU5gpgoiP6FA2oIFBFGUi30UQIOmqFXaXIwK2supW1N5584C8iAu+mdW+kmga04caCQpqdLWXTwDwaeiSgzRAVWGNZzrVb12tTk4E1CKuUbdGyyZWGoijAc30nu1xhrzNl8/0o0dSPRdoGXGuTVMezNvVibioQ5Y5hf/u+JPygefiduJe6XA1JV/qO9HK+/qrzE//NOHTo0P+rP7x4jQVHYv00AAAAAElFTkSuQmCC",
    ppt: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAByUExURUxpcf+ubP+iWP+SO/+nX/+lXfyPQv+SO/+dUP+xcP+ua/+VQP+jWf+XRP+cS/+eT/+UPf+ZSP+gVP+qZf+saP+SOv+mXv+wcP+ta/+ubf+oYv/79//x5f/m0vmEO//MpP/Sr/+9i//Zu/7Dl/ufY/2zfqeIp1YAAAALdFJOUwDdPXugHPygn596VuVMqAAAAl1JREFUWMPtmOtyqjAQgNuqUBQSEi9cDHJR3v8Vzy5JJHi03dAz0x+HD3LZTfIZ6tCZ+Pa2sLCwQOZjG73kw1+3ibKveN/4+t6z7J8a7f6Kp7bC27gp7mTFC7yM28nS/OfGKC9y0OSIafJi6A1FJ3IPY5SToBuj/JAfDkMxNSzHzpDN9e1jXB+IUI1/CfemjJGfcb0HDvbe23rvZGxMM673dCKqsJwsK+916SYQyn+KdemQVec7qmqy8oGtr7A5T6kfhGsP4QlLd/7aSBKeRuJueFSNUmi8nspxfJ6wuWn6Gv+gleM7neYI1fViucIeVTtLGOv5slMg5FITXGCLqo6dCTRhfIoRqLVQ2lA0Sqkujk0MGZLQrEZAqKwQ4ChspDOBIvyMR2QzEUr4plXNnQmfnkI+FbYQVf0coTRlFGZt22KgOm78UlKFckQL4VuulaHqA2dczhFWICwro6uuAfuJkDXVIJSNfvu69jLZIFnIXWHLZXKrkf52Cbi/kHOORmg4q2FbLePMvnwJw5HhA3GcU4UWK+QiQATjD/gKhRW+4idCePCZQjaihQK7nLnYyFeYjMKnPjZnh90TIfMSCsG0QrDk2lVdD5EQOoE9HDYTBE2IizRJ33RNkYgJzOkTdzgKg6zNggeh8BSGxqWF8HYEj5bkXtGEiUsa7IYWDM8IvYXf8GvCHZLglZgIG33ZLvZ2JOHOg98Vpvc2HQOHNKUJV6kHK8rh+8m64ysh6RgQpsdjaq7hhmK6OmeGIU95YjjfBkciAfEstQlpvpB+It2swm9Zzfg1Y2Fh4f/lD1FNqKcd3wCLAAAAAElFTkSuQmCC",
    png: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcf+ubP+eUP+iWP+xcP+nX/+lXf+SO/uPSv+dUP6kX/+XRP+VQP+SO/+jWf+oYf+hVf///f+mXf+tav+ubf+rZ/+eUP+wcP+pZP/s3P+aSf/z6P/48v/UsvqFOf+6hP/jzf/Hmv/cwS4F5mYAAAALdFJOUwDdez2foByg/p/2onNSOQAAAh5JREFUWMPtmNuSoyAQQGeMUaZUxBveRfP/H7lc1VRJptF92Kr1INqtcKqNSSrk6+vm5uYGzMPzrTzcdYFff+I7cPV91/VfNZr6ykNb6WwMypW6tOBk9EoALka/KMtCTCr05OKi0S9AwI02YXXW+KwqMVluMqw4SimjtUGNzwoK0HgobC4Yn42iat6DanfKnPZdhCAersK0KcfXWOtYbPtrTeNBhGnapCt1n2VZX6cWnjDhjjETjNeFudrhWQpfeS7PqJ5vI0DCXJLKPVmkcMH5MQ5CBaGvIRtehIhkGVp2VmgqwgixhSEkciYeDz4jxDkWyD1F0zQhKrJZ3zzG+jKPQMLNJiAd6ogImHw1+1UngQh/8DHqefMS9/ycFhJVIC+ROAvJnrodRn7ARBfIS+TJirOwEp88JsTGx0skF4Tyfd3nZCtQ+c8KG3OXW4FZ1lJHIeUQ1dVXQzY0vMDBbLJEKjsFCxX1oOmHPe02wlHYDsewk0LWW5jPCfPZJuyZm7BTbWmtzHoMTNgpcPuBUg+CCSkfSTv2wTdXskKoUFGMdhhyqlASTcjOlLgLu3iyk0QOwjDqePsFfgeiA4VqykefCUK40KZ457wwuiaMBZFokc7EQTUTiigGCWMH/m1hAhR624TETFSh7Em8Np5DfsE+EgdAy4BQD473M9+SNYPcMV/fImh9CLiWCkKYL4SvSAMv/BXvxL8ZNzc3/y9/ADVfok94AIhIAAAAAElFTkSuQmCC",
    html: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcTbUrDrbszvetTXYrDnasjXQqTPIojfTrDvftTTMpjPKpDnZsTPIozXOqDjXrzHGoTbRqjfUre7/++T++Pf//SfCmxm3j1fXt7Hx4UvNrNL78XHfw8T26o3o0eeFKfsAAAAKdFJOUwA9//8c3Xign5/8SMcgAAADDklEQVRYw+2Y65qjIAyGp9ppRxBERcTj/V/mJsHTtN3dMNt/66dAEsjbgE/7jPPxcerUqVNsXW7Zb3WJx12z9E/6vMbyPtP0rcQsTd9KvKbpe4k3SkneR8wWVrL0yb8SM2QkQYGZYEsITnckMUteKX2KsImvgS/EJT4B86XtXhwx2xD5kp3nCwVHaHTnbOJXsuWv2Utd+WOJ+RcLmJOSpREw30T01U7yCx9Y0H0g+W6YIZRsYRxvfODGK/KiQHtqGjsePwU/MmMCi+84GArfgEZ0izBHHecQvzAFQaGyMBTFDDzbV2iuYWhcYBEgB1Ww42Yw1fdoDHDR3I00JhaAs1ndOCCUUS2lzLa2HgNj3TT1OIKLxIruiAorFPQz1GU9muEIx+CHeRxYQFwaUih/dmCVeISTMx1EBl9t4gKD/FAjz6AJoHp2znV1U0/+Z0A/1XXdOaex1hrYvRBtT8H8J8AcUyflBO64A3sQZSmJaOdIYInXDAzbtxIdPVCxYJoWnjQ86hhgCXkgKsoYNEsPkHo0OGN6/KAZglg5E4gSdIRTT/CRqhXEhmJt1+uwKgYYTmvqwdahWr3zXDxQOyDCF2NKwEHK7IhnkdeqMhqIRD9Za6cKjhC/cnCE/cIzOgqo6SrFQhz1DP0gZElG4C1rmEAQVKiR2A1dLzos1AmtyQWepjUgFlBvAqLyvYONWjhC9HuvWiTrCOB9X66la9vWjMCzHurSBlwndTRQaIFVQJPGGUFHqJBD7r4BLbhbFmsGkiUeYbdsFPxwhTV3ToVrfQKToZlxGqbRoRlmwhTNsYFbCsg4P3rY6pNgngWUa4IMjZ6MO0TlNssDEoS6BaLgl1qtrkTRiEt4wJAm9pKUXIuSa30xFUqp5IPEY0CqEOIB1Yo8cNSjFRZxgUrReuzRRlfto5ShgVjALU+9lDyabCBXHOBtW20eLBOaMSaM4HL+gr1gmtlBmG82NjrrHFys14A7MgizGQepbQpuzo7xBfw74lnrNPdd6no3LN35b6TX2/2vuv3gvxmnTp36f/ULf0R1znQ7804AAAAASUVORK5CYII=",
    js: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABpUExURUxpcUOv/0uw/zar/0+x/0Gj/Fq2/jOp/0ew/123/zKp/1S0/zqs/1Gz/123/02y/1i2/kWv/0mx/0Ct/1y1/vb7/1i2//7//zel+zOe+e32/9zt/5nN/ieV9oDG/avZ/83m/77h/2S6/HhIljsAAAAKdFJOUwB7Pf8c+92gn59dd850AAAC8klEQVRYw+3Yi3KjIBQG4CbGpgaMNyQIiJf3f8g9B8Rqp9mCszO7M5u/Kgj6iRrb2Le3V1555ZXgnE/Z05zjuUt2/13eL7He+/0+457zlpk/i1jRjo/ZCQC2Hx6LH+MF92EOhIJt9LtviRJPFsMgY0vPr2aUmDmFlY5i68q2ZBFiVpYcf3jpwjnDFoZ15mZsChczRKxkC86Xlc+4erCY+T34TvENnPuxh4rZdiR8M0BeLlfCwcFiRqxGcOJYJxB3AEJ4STiuEuzhYWJGvqYkz5IdA58FDnQ+AOb5bOY8/948BYAfFoEJZ6gWWraK5S5kaffLkHP+yPepxsejHep9I1nKj3iwThWAOi3y7xIIbnYuPOiHCH0Fzm6jIBC2LZZ9IJUHi2JpsYsocJeqW8Fv8g+AtQcrEOuDYF3Xbl8oNmBtJiXlONxtb23nILDepfEgmdr2AdVWGduBxz0Cpp1qARTVAFwrJSwVX3vjwapZwEI+HnLSelKtNHFgZYNYBROCLYB3BLu+F2YYWGW7YItgsK58PJjjpTRCdL0QYu2NGOFXMJ3wGqrBFEI0fwIUbJT2Jkv96R0AGw/SjuhR2Q+OjgWbBqHakAZCEZRaNKLrajPgMOUM/bBFEw5CcngqNJQilwAaATTckG6GS9kOjU8QaLekGh2dixnPWDHBBk0o3GRzEBRGoQgBTw6dgAdPDXda2D8INBqE09Mo2siRdWKQ9smDRw/GSw+MsOv0KG3UxPoOnmV7i/GzqLsVvAaPkMJTxvQ0juOgU/AoHGBSSqpxgseFokgDwSsFjuIt7fsUvlqmPXo0gWduNsbMokcPN4FFGOgCJ927oOcPsa65xIA0ARIjbsnSkMDvBZHQo+AC7ISdFgwmid8xwfqmZjtcxdWDwGQNXebniQR/zl8Eb3Za8rV2s/MtEDwlN4hdLFkbkm2LXQn5Bnu+hQbIoNeAa7B4CzljeL9NQ7008F3qEjjGa/gb6eV0/TGnA//NeOWVV/7f/AJAsosfySCrjgAAAABJRU5ErkJggg==",
    css: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUxpcXvGVGm8P3zGVXzJWYbNYXbDTWu8QHnFUofNZITMX3zHVXTCS22+Q3jEUIHKW4jOZGq9QHDAR////mi6PvP97pbRd/v++tXwx+b33afbjV2vMrznpsnquGjfsnAAAAAKdFJOUwA936wc3Xign58XA1ZcAAACuUlEQVRYw+2Y2XbjIAyGm540qc1qAl7j93/NkQTEdJsKtxdzzvg3iSVAH8JRFufp6dChQ4fYOl2aL3Wqx50b+ze9nGt5L9b+KrGx9leJZ4ppv2C11KqIlxTUUnib6akn2TXEBigY3RKtJdncgRb1VBCb9o0Ikq0Hvob4Dvil2EQukE18CzSfmlXEJoaaTDCtMYmFZ2Oo0SCP2BiTgrZWdNGjjUjTsIEP2TvIRrsv7KRTJbDtpwCaKEkb7b4EXhjA1zJgHG63YYiQfhrQG8vxVz5QECMAYRrv5Oj7OAEx9MUEJlCkJhA49cJLjJZe9BMChcnju4DjsihtBEgtC1wCAAph4sEDik0EVJpsYGqVgVk1QJOBMjkgHYFGxGbErgzl5uufZPgZUBJQ7wbqeYC6ewcc5t1AM0PdDfcMBI5coRCn2USPD9QUYMcAvGmW6FC8lj0uEcYWHc0F6igxwwW8DasjJ/ZJhynewpzmaDYQAbhh3LEuRHuGrHWaVJOh1PcplNmgMOsw3p2szRCB3vf4oq7ybYLD2HuvdwC18wvUIZRNAaSyWbyrBErasZaKCttFj9agwu6kTBeFCZQQgA2qJAJpAVQEYoeMs1hAuSkCNz8Ciwk7gMOofgi8FvHx83DrUONtV4auBIbZJldYKsPe1QJdIjpn4TtkCGHUDnvGEPCzwbo0DBOunC3jRJJ0ag30VrPo2onex6tym3jAjHPOt+sEWuMS0bY+DspaIEotvp/n2SDDeQFmr5a9GZL8QurQ7qLtdwEfQcqDusJWJY8LVBClElahMj06xRALqB5y6jtVAtU/Duw+I3TpGQ9oHOAF5r6TSo8PHYrzC/bUcQVI1m3AFSd7FpKzY7i/fQaaj0Sf0dsCNOLpeGbeS52vnY/K52R3yeji6cq/Iz1frt/qsuPfjEOHDv2/+gP0toi4gXoofgAAAABJRU5ErkJggg==",
    epub: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcXXDTXvGVGm8P33HVnzJWYbNYWm7PYjOZXPBSmu8QG6/RXPBSoHKW4TMX37IV3nFUYbNYonOZOv+4fX/7/z/+1utMK3gkuL412O1OFOpJ7ripNf4xXK6TKHWhX88Tv4AAAAKdFJOUwB7Pd+gHN2gn59lNj8pAAACeklEQVRYw+3Y2XaqMBQG4GK10gxCgDII8v6P2T0kMhR7dujl4QcMCcm3Ni7tkr69HTly5Ig4pyR9mVM8d0mL3/JxifU+Xkhup5jyQudmkpuNuEjx4ii0fHlWUIt7lJiwsZVpOEZMnSQRYnpzsGH8WmyphxdcGJaL6U0WsSgFxeIStOtTGy2eeZGddmu9gq21tNMcmXi21i+adtsMQ8MdOm5M2lQMrtKUVVU2GxdO+8Cm/IJsickukL1N8SwEM9wzS2cZeVXlRT9uuZGBmfey7OmVfU9Nk3HoKhwiMFuEvaaum4XoEw8G736ve7rr8W8gfF64PqXqrsX3sv8TSF4Lns5zPWKF7ZjvAHPcYZt5jFft2Bm+RpsYpCBRVegpxqEz1p3BSzQHDhFI2JPg+3162LGjYy4CRKKt8AuM9c086BRDC+8kJwI0AxDVsPYMeNAZIsBPD/ZYYfsAIh/beX34l6c30aDOeyxrKHyB8/rKPtPxYP3AGksQDbxrw8J71FGggS033T2IpstHu/Du+OHBaZ+yClei6+7wVf7pQWSgMQYPTWJZloPt6g48N0CnJY9n5EYEhsn5JN40jJBXes+TQjBkEp33qD7ttXhwLi69kFhwJm568eAkbnpScL5IPcXJ09EVatq4CSJ5ylvabyKQpkKoEC/Cb5vg8bjhCTJQMxeCd62KQqG3jhA0k0ivCr973gvXTAz4I6qr6436ZOBVb4lqi9P6KgSV5vXzVz8YXvlEDoZlrE2KmholrVC9iN4Yk4AJLdW0XqvQeO454HXJL9iTiojoMeAq9yR3DM+371LvXfgsdRHWeJU/kV6S6z+T7PhvxpEjR/7ffAMGOojXQYbbiwAAAABJRU5ErkJggg==",
    psd: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABdUExURUxpcUOv/0uw/zer/123/0+x/1q2/jOp/zSm+Uew/zKp/zys/1O0/1e1/0Ku/0+z/1q2/0mx//7//164/vf8/9vw/+r2/yie86HX/sno/7Dd/5TR/W6//H/H/Eyv911ykpAAAAAKdFJOUwB7Pf+fHN2g/p8jQekrAAACx0lEQVRYw+2Y7WKrIAyG12JXJn4xEQG193+ZJwnYOdedE7r9O74qBQyPARNb+/Jy6NChQ2ydT8W3OufjLkX/N71ecnmvff+rxC/+dT8jXnB8162sLhK7T/As4glgHR1xT0Vs0iW6PGKxYXxo35FBJGC9B37p4BOLdXhd42e9QdaxXecRi5opLpEN5BITsKL9oao8YkGoqkpIrJAIRY2azuFR8IB31bvPXQuY5zzgA8hOJwbwbTWevY3yof+GV3Hm/NZG29ab9yhjrOsq6E57C2Ub9zcWMEoP7x8yvqPOalOicoANAu0AsuCqce0j5QJNmPt+cQMQ7fwzoI7AaURNdueizgRq3CJQKiXl6GH2Xn/QyIAN1BqsdQS6BmvSAXDQO6ERF6hX4BSrAYGNnp3HqJw1eYhlDlCRh1TtcA2DmixFJkTl3ct8IE65whC3S49YSzG0PAt8H1wIAaPGeFxI46cJmiY8DYS0M4YyZZawkGaGIJpDmJs8YANbAqZk9ouUOPFwgyAapWySEQvYRBHQrI+bUSoKb+unVkoVTXTDA9LFCWiG4JxbejnKppG0mHiTa4JpKHM9TKk3Iq+RcvKDoRvUJptngBJFU1RyvM3BU14/AxQEVI1aByNxHG/OYtb8ALiqcq5SAlYTgW0+UO2BkHjWzbqZTPRQsYEwS4Xzi0BFY2Gb4R5jFGEawlMNjOAcDxgFgWzspO6S0xC/tYwNcJsQp9Q1B7h4COgNEHLOD9YO3kUeigO8rgB5629SbYljvSzLfBtH8QxQYJBsgfhdEKP8zssCAlEKsQViD4V5arGBQgmBKEGVeNBwkZpCxS4hWECRoWyg+m3gb3lYRvPyXpapsjlRZnlYpm2tf7pEmcqSBzyVDyUe9nJ+wZ73gx+jolivAdeSLc6M4f1WcnmS+S51Yfp45b+RXk7Xf+r0xL8Zhw4d+n/1B13vfAhtdKi2AAAAAElFTkSuQmCC",
    dwg: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUxpcXvGVIbNYXvHVHzJWYbNYXbDTWu9QHrGU4jOZHLBSW+/RYDJWmy+QoXMYHzHVYjOZHfET2m7P4LLXf3/+/T+7u3+5MXrsaXbiVyuMZjUeNb2xOP81bPjmuZ7vy0AAAAKdFJOUwA9z1wc33ign591Bg7OAAACdUlEQVRYw+2Yi3KjIBRAm51UI4gKxMei+f/f3PsQNU3SXtzOdGfWo0W4wBGFau3b28HBwYGYU1a85JSuOxfNZ/w6p/rem895TzQWTfOtxjP1qWCDtJoLK1WyMcM+VUUu1pJ3ls6nSDEW1UpTvSLBWFRf0iQZXwn93jFuhd7fK/2SJhgL9Hh0ecp5P4tn3xzwYmPhX0En2SL7nXkirEIPNA/xspAIL9Cw9CUmsV85dG3bBcjNgSUjeVJcykeG9nrtAmX9/MNJtk9Yk7B5cqbLvymsdwjr2LOmBIVtU3OMQ9xGJIQOQHSFGzBegR5zoV4Qj7DeQiumbVGIx26gEXICpAvr4bqlHe5r04WWhB1BQvsdwo5uX4/GvxCGgejBMv4mJpwZjoY0IY7C9nSZNB+jI1DY8tXfsJGVCi3Rt8tUjBoDelrn5mbBJxVi29qqG60XXDLtqFjYXudQd1N8VqEQUUNPTNA/jhCyE0cHRUNMEiq+cbiwV2E3cFTvGKHjqQ34bB0Jespy1NlkIQwR0aG7I2iOJwmVje1BG6atbwpQxbUqZYRq3ej9NIJ1GjGHwk21SKgiFndL7xQU0jvFLlWERJhHE3ehuQnTNI2WZmOxUQuhcDsK44xzJCx5vdyRJFzRYQShf6xQ+U8J9VOh3inU4NMAaTULccWUmopUrRQ3kAkfqQJgn1TsFBpaO+77hHp+xOwXmo9DhNVoOLipMlKh0dibd8waLq7HWDBGJDQJ/IgwM3zHIm5JlpQ33CV/wZ6wj1t7UT4KaLY5R4noMyB3EXN32BRiRHLF8H2rnRAt/JY65zJfLv8iPWf5l2Q7/ptxcHDw//IHYWiLelDcDu8AAAAASUVORK5CYII=",
  };
  var PopsFolder = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "folder";
      let config = PopsFolderDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "folderCSS",
          css: PopsCSS.folderCSS,
        },
      ]);
      Reflect.set(Folder_ICON, "docx", Folder_ICON.doc);
      Reflect.set(Folder_ICON, "rtf", Folder_ICON.doc);
      Reflect.set(Folder_ICON, "xlsx", Folder_ICON.xls);
      Reflect.set(Folder_ICON, "pptx", Folder_ICON.ppt);
      Reflect.set(Folder_ICON, "dmg", Folder_ICON.ipa);
      Reflect.set(Folder_ICON, "json", Folder_ICON.js);
      const zipIconList = [
        "rar",
        "7z",
        "arj",
        "bz2",
        "cab",
        "iso",
        "jar",
        "lz",
        "lzh",
        "tar",
        "uue",
        "xz",
        "z",
        "zipx",
        "zst",
        "001",
      ];
      const imageIconList = ["jpg", "jpeg", "ico", "webp"];
      const codeLanguageIconList = ["htm", "py", "vue", "bat", "sh", "vbs", "java", "kt"];
      const androidIconList = ["apk", "apkm", "xapk"];
      zipIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.zip;
      });
      imageIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.png;
      });
      codeLanguageIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.html;
      });
      androidIconList.forEach((keyName) => {
        Folder_ICON[keyName] = Folder_ICON.apk;
      });
      if (config?.folder) Reflect.set(config, "folder", config.folder);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content ${popsUtils.isPhone() ? "pops-mobile-folder-content" : ""}">
                <div class="pops-folder-list">
                    <div class="pops-folder-file-list-breadcrumb">
						<div class="pops-folder-file-list-breadcrumb-primary">
							<span class="pops-folder-file-list-breadcrumb-allFiles cursor-p" title="全部文件">
								<a>全部文件</a>
							</span>
						</div>
                    </div>
                    <div class="pops-folder-list-table__header-div">
						<table class="pops-folder-list-table__header">
							<colgroup>
								<col width="52%">
								<col width="24%">
								<col width="16%">
							</colgroup>
							<thead>
								<tr class="pops-folder-list-table__header-row">
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>文件名</span>
											<div class="pops-folder-list-table__sort" data-sort="fileName">
												<div class="pops-folder-icon-arrow" data-sort="按文件名排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>修改时间</span>
											<div class="pops-folder-list-table__sort" data-sort="latestTime">
												<div class="pops-folder-icon-arrow" title="按修改时间排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
									<th class="pops-folder-list-table__header-th cursor-p">
										<div class="text-ellip content flex-a-i-center">
											<span>大小</span>
											<div class="pops-folder-list-table__sort" data-sort="fileSize">
												<div class="pops-folder-icon-arrow" title="按大小排序">
													<svg
														viewBox="0 0 1024 1024"
														xmlns="http://www.w3.org/2000/svg">
														<path
															d="M509.624392 5.882457 57.127707 458.379143 962.121078 458.379143Z"
															class="pops-folder-icon-arrow-up"></path>
														<path
															d="M509.624392 1024 962.121078 571.503314 57.127707 571.503314Z"
															class="pops-folder-icon-arrow-down"></path>
													</svg>
												</div>
											</div>
										</div>
									</th>
								</tr>
							</thead>
						</table>
                    </div>
                    <div class="pops-folder-list-table__body-div">
						<table class="pops-folder-list-table__body">
							<colgroup>
							${
                popsUtils.isPhone()
                  ? `<col width="100%">`
                  : `
								<col width="52%">
								<col width="24%">
								<col width="16%">`
              }
							</colgroup>
							<tbody></tbody>
						</table>
                    </div>
                </div>
            </div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $title,
        $content,
        $folderTbody: folderListBodyElement,
        $folderHeaderBreadcrumbPrimary: folderFileListBreadcrumbPrimaryElement,
        $headerBtnClose: $btnCloseBtn,
        $btnOk: btnOkElement,
        $btnCancel: btnCancelElement,
        $btnOther: btnOtherElement,
        $folderSortFileName: folderListSortFileNameElement,
        $folderSortLatestTime: folderListSortLatestTimeElement,
        $folderSortFileSize: folderListSortFileSizeElement,
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      PopsHandler.handleClickEvent("close", $btnCloseBtn, evtConfig, config.btn.close.callback);
      PopsHandler.handleClickEvent("ok", btnOkElement, evtConfig, config.btn.ok.callback);
      PopsHandler.handleClickEvent("cancel", btnCancelElement, evtConfig, config.btn.cancel.callback);
      PopsHandler.handleClickEvent("other", btnOtherElement, evtConfig, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) $anim.after($mask);
      class PopsFolder {
        init() {
          config.folder.sort();
          this.initFolderView(config.folder);
          const $allFiles = folderFileListBreadcrumbPrimaryElement.querySelector(
            ".pops-folder-list .pops-folder-file-list-breadcrumb-allFiles:first-child"
          );
          Reflect.set($allFiles, "data-config", config.folder);
          popsDOMUtils.on($allFiles, "click", (event) => {
            this.setBreadcrumbClickEvent(event, true, config.folder);
          });
          popsDOMUtils.on(
            folderListSortFileNameElement.closest("th"),
            "click",
            (event) => {
              this.arrowToSortFolderInfoView(folderListSortFileNameElement, event, "fileName");
            },
            { capture: true }
          );
          popsDOMUtils.on(
            folderListSortLatestTimeElement.closest("th"),
            "click",
            (event) => {
              this.arrowToSortFolderInfoView(folderListSortLatestTimeElement, event, "latestTime");
            },
            { capture: true }
          );
          popsDOMUtils.on(
            folderListSortFileSizeElement.closest("th"),
            "click",
            (event) => {
              this.arrowToSortFolderInfoView(folderListSortFileSizeElement, event, "fileSize");
            },
            { capture: true }
          );
          if (config.sort.name === "fileName")
            popsDOMUtils.emit(folderListSortFileNameElement, "click", { notChangeSortRule: true });
          else if (config.sort.name === "latestTime")
            popsDOMUtils.emit(folderListSortLatestTimeElement, "click", { notChangeSortRule: true });
          else if (config.sort.name === "fileSize")
            popsDOMUtils.emit(folderListSortFileSizeElement, "click", { notChangeSortRule: true });
        }
        handlerWithBeforeCreateFileOrFolderInfoNode(folderData) {
          let { fileSize } = folderData;
          const { fileName, latestTime, isFolder = false } = folderData;
          folderData.latestTime = folderData.latestTime ?? "-";
          folderData.fileSize = folderData.fileSize ?? "-";
          const $folder = popsDOMUtils.createElement("tr");
          const $fileName = popsDOMUtils.createElement("td");
          const $fileTime = popsDOMUtils.createElement("td");
          const $fileFormatSize = popsDOMUtils.createElement("td");
          let show_latestTime = "";
          let show_fileSize = "";
          let fileType = "";
          let fileIcon = "";
          if (isFolder) {
            fileType = "";
            fileIcon = Folder_ICON.folder;
            show_latestTime = "";
            fileSize = "";
            show_fileSize = "";
          } else {
            if (typeof latestTime === "function") show_latestTime = latestTime().showText;
            else if (typeof latestTime === "number") show_latestTime = popsUtils.formatTime(latestTime);
            else if (typeof latestTime === "string") show_latestTime = latestTime;
            if (typeof fileSize === "number") show_fileSize = popsUtils.formatByteToSize(fileSize, true);
            else if (typeof fileSize === "string") show_fileSize = fileSize;
            const findIconKeyName = Object.keys(Folder_ICON).find((keyName) => {
              if (fileName.toLowerCase().endsWith("." + keyName)) {
                fileType = keyName;
                fileIcon = Reflect.get(Folder_ICON, keyName);
                return true;
              }
            });
            if (findIconKeyName) {
              fileIcon = Reflect.get(Folder_ICON, findIconKeyName);
              fileType = findIconKeyName;
            } else {
              fileType = "Null";
              fileIcon = Folder_ICON.Null;
            }
          }
          if (typeof folderData.fileIcon === "string") fileIcon = folderData.fileIcon;
          $folder.className = "pops-folder-list-table__body-row";
          $fileName.className = "pops-folder-list-table__body-td";
          $fileTime.className = "pops-folder-list-table__body-td";
          $fileFormatSize.className = "pops-folder-list-table__body-td";
          return {
            $folder,
            $fileName,
            $fileTime,
            $fileFormatSize,
            data: {
              fileType,
              fileIcon,
              show_latestTime,
              show_fileSize,
            },
          };
        }
        createFolderRowElement(folderData) {
          const { $folder, $fileName, $fileTime, $fileFormatSize, data } =
            this.handlerWithBeforeCreateFileOrFolderInfoNode(folderData);
          const { fileName } = folderData;
          PopsSafeUtils.setSafeHTML(
            $fileName,
            `
          <div class="pops-folder-list-file-name cursor-p">
            <div>
              <img src="${data.fileIcon}" alt="${data.fileType}" class="pops-folder-list-file-icon u-file-icon u-file-icon--list">
              <a href="javascript:;" title="${fileName}" class="pops-folder-list-file-name-title-text inline-block-v-middle text-ellip list-name-text">${fileName}</a>
            </div>
          </div>`
          );
          PopsSafeUtils.setSafeHTML(
            $fileTime,
            `
          <div class="pops-folder-list__time">
            <span>${data.show_latestTime}</span>
          </div>`
          );
          PopsSafeUtils.setSafeHTML(
            $fileFormatSize,
            `
          <div class="pops-folder-list-format-size">
            <span>${data.show_fileSize}</span>
          </div>`
          );
          Reflect.set($fileName, "__value__", folderData);
          Reflect.set($fileTime, "__value__", folderData);
          Reflect.set($fileFormatSize, "__value__", folderData);
          Reflect.set($folder, "__value__", folderData);
          $folder.appendChild($fileName);
          $folder.appendChild($fileTime);
          $folder.appendChild($fileFormatSize);
          return {
            folderElement: $folder,
            fileNameElement: $fileName,
            fileTimeElement: $fileTime,
            fileFormatSize: $fileFormatSize,
          };
        }
        createFolderRowElementByMobile(folderData) {
          const { $folder, $fileName, data } = this.handlerWithBeforeCreateFileOrFolderInfoNode(folderData);
          const { fileName } = folderData;
          PopsSafeUtils.setSafeHTML(
            $fileName,
            `
          <div class="pops-folder-list-file-name pops-mobile-folder-list-file-name cursor-p">
            <img src="${data.fileIcon}" alt="${data.fileType}" class="pops-folder-list-file-icon u-file-icon u-file-icon--list">
            <div>
              <a title="${fileName}" class="pops-folder-list-file-name-title-text inline-block-v-middle text-ellip list-name-text">${fileName}</a>
              <span>${data.show_latestTime} ${data.show_fileSize}</span>
            </div>
          </div>`
          );
          Reflect.set($fileName, "__value__", folderData);
          Reflect.set($folder, "__value__", folderData);
          $folder.appendChild($fileName);
          return {
            folderElement: $folder,
            fileNameElement: $fileName,
          };
        }
        clearFolderInfoView() {
          PopsSafeUtils.setSafeHTML(folderListBodyElement, "");
        }
        createHeaderArrowIcon() {
          return popsDOMUtils.createElement("div", { className: "iconArrow" });
        }
        createBreadcrumb(folderName, folderDataConfig) {
          return popsDOMUtils.createElement(
            "span",
            {
              className: "pops-folder-file-list-breadcrumb-allFiles cursor-p",
              innerHTML: `<a>${folderName}</a>`,
              "data-config": folderDataConfig,
            },
            { title: folderName }
          );
        }
        setBreadcrumbClickEvent(clickEvent, isTop, dataConfigList) {
          this.clearFolderInfoView();
          const currentBreadcrumb = clickEvent.target.closest("span.pops-folder-file-list-breadcrumb-allFiles");
          if (currentBreadcrumb)
            while (currentBreadcrumb.nextElementSibling) popsDOMUtils.remove(currentBreadcrumb.nextElementSibling);
          else console.error("获取导航按钮失败");
          const loadingMask = PopsLoading.init({
            $parent: $content,
            content: { text: "获取文件列表中..." },
            mask: {
              enable: true,
              clickEvent: {
                toClose: false,
                toHide: false,
              },
            },
            addIndexCSS: false,
          });
          this.initFolderView(dataConfigList);
          loadingMask.close();
        }
        async enterFolder(clickEvent, dataConfig) {
          this.clearFolderInfoView();
          const loadingMask = PopsLoading.init({
            $parent: $content,
            content: { text: "获取文件列表中..." },
            mask: { enable: true },
            addIndexCSS: false,
          });
          let childConfig;
          if (typeof dataConfig.clickEvent === "function") {
            const result = await dataConfig.clickEvent(clickEvent, dataConfig);
            if (Array.isArray(result)) childConfig = result;
          } else if (Array.isArray(dataConfig.clickEvent)) childConfig = dataConfig.clickEvent;
          if (childConfig) {
            folderFileListBreadcrumbPrimaryElement.appendChild(this.createHeaderArrowIcon());
            const $breadcrumbAllFiles = this.createBreadcrumb(dataConfig.fileName, childConfig);
            folderFileListBreadcrumbPrimaryElement.appendChild($breadcrumbAllFiles);
            popsDOMUtils.on($breadcrumbAllFiles, "click", (event) => {
              this.setBreadcrumbClickEvent(event, false, childConfig);
            });
            this.initFolderView(childConfig);
          }
          loadingMask.close();
        }
        updateFileLink($row, downloadInfo) {
          const downloadUrl = typeof downloadInfo?.url === "string" ? downloadInfo.url.trim() : "";
          if (downloadUrl !== "" && downloadUrl !== "null" && downloadUrl !== "undefined") {
            $row.querySelector("a").setAttribute("href", downloadUrl);
            return downloadUrl;
          }
        }
        async onFileClick(evt, $row, dataConfig) {
          let downloadInfo;
          if (typeof dataConfig.clickEvent === "function") {
            const result = await dataConfig.clickEvent(evt, dataConfig);
            if (typeof result === "object" && result != null && !Array.isArray(result)) downloadInfo = result;
          } else if (
            typeof dataConfig.clickEvent === "object" &&
            dataConfig.clickEvent != null &&
            !Array.isArray(dataConfig.clickEvent)
          )
            downloadInfo = dataConfig.clickEvent;
          if (downloadInfo) {
            const downloadUrl = this.updateFileLink($row, downloadInfo);
            if (downloadUrl) {
              if (typeof downloadInfo.mode === "string")
                if (downloadInfo.mode === "a" || downloadInfo.mode === "aBlank") {
                  const $anchor = popsDOMUtils.createElement("a");
                  if (downloadInfo.mode === "aBlank") $anchor.setAttribute("target", "_blank");
                  $anchor.href = downloadUrl;
                  $anchor.click();
                } else if (downloadInfo.mode === "open" || downloadInfo.mode === "openBlank")
                  if (downloadInfo.mode === "openBlank") globalThis.open(downloadUrl, "_blank");
                  else globalThis.open(downloadUrl);
                else if (downloadInfo.mode === "iframe") {
                  const $downloadIframe = popsDOMUtils.createElement("iframe");
                  $downloadIframe.src = downloadUrl;
                  $downloadIframe.onload = function () {
                    popsUtils.setTimeout(() => {
                      popsDOMUtils.remove($downloadIframe);
                    }, 1e3);
                  };
                  $shadowRoot.appendChild($downloadIframe);
                  popsUtils.setTimeout(() => {
                    popsDOMUtils.remove($downloadIframe);
                  }, 180 * 1e3);
                } else console.error("未知的下载模式", downloadInfo);
            }
          }
        }
        sortFolderConfig(folderDataConfigList, sortName = "fileName", isDesc = false) {
          const onlyFolderDataConfigList = folderDataConfigList.filter((value) => {
            return value.isFolder;
          });
          const onlyFileDataConfigList = folderDataConfigList.filter((value) => {
            return !value.isFolder;
          });
          if (sortName === "fileName") {
            onlyFolderDataConfigList.sort((leftConfig, rightConfig) => {
              const beforeVal = leftConfig[sortName].toString();
              const afterVal = rightConfig[sortName].toString();
              let compareVal = beforeVal.localeCompare(afterVal);
              if (isDesc) {
                if (compareVal > 0) compareVal = -1;
                else if (compareVal < 0) compareVal = 1;
              }
              return compareVal;
            });
            onlyFileDataConfigList.sort((leftConfig, rightConfig) => {
              const beforeVal = leftConfig[sortName].toString();
              const afterVal = rightConfig[sortName].toString();
              let compareVal = beforeVal.localeCompare(afterVal);
              if (isDesc) {
                if (compareVal > 0) compareVal = -1;
                else if (compareVal < 0) compareVal = 1;
              }
              return compareVal;
            });
          } else {
            onlyFolderDataConfigList.sort((beforeConfig, afterConfig) => {
              let beforeVal = beforeConfig[sortName];
              let afterVal = afterConfig[sortName];
              if (typeof beforeVal === "function") beforeVal = beforeVal().timeStamp;
              if (typeof afterVal === "function") afterVal = afterVal().timeStamp;
              if (sortName === "fileSize") {
                beforeVal = parseFloat(beforeVal.toString());
                afterVal = parseFloat(afterVal.toString());
              } else if (sortName === "latestTime") {
                beforeVal = new Date(beforeVal || "").getTime();
                afterVal = new Date(afterVal || "").getTime();
              }
              if (beforeVal > afterVal)
                if (isDesc) return -1;
                else return 1;
              else if (beforeVal < afterVal)
                if (isDesc) return 1;
                else return -1;
              else return 0;
            });
            onlyFileDataConfigList.sort((beforeConfig, afterConfig) => {
              let beforeVal = beforeConfig[sortName];
              let afterVal = afterConfig[sortName];
              if (typeof beforeVal === "function") beforeVal = beforeVal().timeStamp;
              if (typeof afterVal === "function") afterVal = afterVal().timeStamp;
              if (sortName === "fileSize") {
                beforeVal = parseFloat(beforeVal.toString());
                afterVal = parseFloat(afterVal.toString());
              } else if (sortName === "latestTime") {
                beforeVal = new Date(beforeVal).getTime();
                afterVal = new Date(afterVal).getTime();
              }
              if (beforeVal > afterVal)
                if (isDesc) return -1;
                else return 1;
              else if (beforeVal < afterVal)
                if (isDesc) return 1;
                else return -1;
              else return 0;
            });
          }
          return [...onlyFolderDataConfigList, ...onlyFileDataConfigList];
        }
        initFolderView(dataConfig) {
          this.sortFolderConfig(dataConfig, config.sort.name, config.sort.isDesc).forEach((item) => {
            if (item.isFolder) {
              const { folderElement, fileNameElement } = popsUtils.isPhone()
                ? this.createFolderRowElementByMobile(item)
                : this.createFolderRowElement(item);
              popsDOMUtils.on(fileNameElement, "click", (event) => {
                this.enterFolder(event, item);
              });
              folderListBodyElement.appendChild(folderElement);
            } else {
              const { folderElement, fileNameElement } = popsUtils.isPhone()
                ? this.createFolderRowElementByMobile(item)
                : this.createFolderRowElement(item);
              popsDOMUtils.on(fileNameElement, "click", (event) => {
                popsDOMUtils.preventEvent(event);
                this.onFileClick(event, fileNameElement, item);
              });
              if (typeof item.clickEvent === "object" && item.clickEvent !== null && !Array.isArray(item.clickEvent))
                this.updateFileLink(fileNameElement, item.clickEvent);
              folderListBodyElement.appendChild(folderElement);
            }
          });
        }
        removeArrowActiveStatus() {
          [
            ...Array.from(folderListSortFileNameElement.querySelectorAll(".pops-folder-icon-active")),
            ...Array.from(folderListSortLatestTimeElement.querySelectorAll(".pops-folder-icon-active")),
            ...Array.from(folderListSortFileSizeElement.querySelectorAll(".pops-folder-icon-active")),
          ].forEach(($elItem) => popsDOMUtils.removeClassName($elItem, "pops-folder-icon-active"));
        }
        changeArrowActive(arrowUp, arrowDown, isDesc) {
          this.removeArrowActiveStatus();
          popsDOMUtils.addClassName(isDesc ? arrowDown : arrowUp, "pops-folder-icon-active");
        }
        arrowToSortFolderInfoView($target, event, sortName) {
          if (!Reflect.get(event, "notChangeSortRule")) {
            config.sort.name = sortName;
            config.sort.isDesc = !config.sort.isDesc;
          }
          const $arrowUp = $target.querySelector(".pops-folder-icon-arrow-up");
          const $arrowDown = $target.querySelector(".pops-folder-icon-arrow-down");
          this.changeArrowActive($arrowUp, $arrowDown, config.sort.isDesc);
          if (
            typeof config.sort.callback === "function" &&
            config.sort.callback($target, event, config.sort.name, config.sort.isDesc)
          )
            return;
          const childrenList = [];
          Array.from(folderListBodyElement.children).forEach(($tr) => {
            const __value__ = Reflect.get($tr, "__value__");
            Reflect.set(__value__, "target", $tr);
            childrenList.push(__value__);
          });
          this.sortFolderConfig(childrenList, config.sort.name, config.sort.isDesc).forEach((item) => {
            folderListBodyElement.appendChild(item.target);
          });
        }
      }
      const popsFolder = new PopsFolder();
      popsFolder.init();
      Reflect.set($pops, "data-pops-folder", popsFolder);
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      return result;
    },
  };
  var PopsIframeDefaultConfig = () => {
    return {
      title: {
        position: "center",
        text: "",
        html: false,
        style: "",
      },
      loading: {
        enable: true,
        icon: true,
        text: "",
      },
      useShadowRoot: true,
      class: "",
      url: window.location.href,
      only: false,
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      animation: "pops-anim-fadein-zoom",
      position: "center",
      drag: true,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      topRightButton: "min|max|mise|close",
      sandbox: false,
      forbiddenScroll: false,
      loadEndCallBack() {},
      btn: {
        min: { callback() {} },
        max: { callback() {} },
        mise: { callback() {} },
        close: { callback() {} },
      },
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsIframe = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "iframe";
      let config = PopsIframeDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      if (config.url == null) throw new TypeError("config.url must not be null.");
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "iframeCSS",
          css: PopsCSS.iframeCSS,
        },
      ]);
      const maskExtraStyle =
        config.animation != null && config.animation != "" && config.animation ? "position:absolute;" : "";
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex, maskExtraStyle);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const iframeLoadingHTML = '<div class="pops-loading"></div>';
      const titleText = config.title.text.trim() !== "" ? config.title.text : config.url;
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? titleText : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${titleText}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content">
                <div class="pops-${popsType}-content-global-loading"></div>
                <iframe src="${config.url}" pops ${config.sandbox ? "sandbox='allow-forms allow-same-origin allow-scripts'" : ""}>
                </iframe>
			</div>${config.loading.enable ? iframeLoadingHTML : ""}`,
        "",
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $headerBtnClose,
        $headerControls,
        $title,
        $iframe,
        $loading,
        $contentLoading,
        $headerBtnMin,
        $headerBtnMax,
        $headerBtnMise,
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $iframeContainer = popsDOMUtils.selector(".pops-iframe-container");
      if (!$iframeContainer) {
        $iframeContainer = popsDOMUtils.createElement("div", { className: "pops-iframe-container" });
        $iframeContainer.style.cssText =
          "display: flex;position: fixed;bottom: 0px;flex-flow: wrap-reverse;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;";
        popsDOMUtils.appendBody($iframeContainer);
      }
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      evtConfig.$iframe = $iframe;
      const result = PopsHandler.handleResultConfig(evtConfig);
      popsDOMUtils.on($anim, popsDOMUtils.getAnimationEndNameList(), function () {
        $anim.style.width = "0%";
        $anim.style.height = "0%";
      });
      popsDOMUtils.on($iframe, "load", () => {
        popsDOMUtils.remove($loading);
        $contentLoading.style.animation = "iframeLoadingChange_85 0.3s forwards";
        popsDOMUtils.on($contentLoading, popsDOMUtils.getAnimationEndNameList(), () => {
          popsDOMUtils.remove($contentLoading);
        });
        if (config.title.text.trim() === "" && $iframe.contentDocument)
          $title.querySelector("p").innerText = $iframe.contentDocument.title;
        config.loadEndCallBack(evtConfig);
      });
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      $iframeContainer.appendChild($shadowContainer);
      if ($mask != null) $anim.after($mask);
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      const TYPE_MODULE = "type-module";
      let origin_left = "";
      let origin_top = "";
      let origin_is_max = false;
      popsDOMUtils.on(
        $headerBtnMin,
        "click",
        (event) => {
          event.preventDefault();
          event.stopPropagation();
          origin_left = $pops.style.left;
          origin_top = $pops.style.top;
          popsDOMUtils.addClassName(
            $pops,
            "pops-iframe-unset-top",
            "pops-iframe-unset-left",
            "pops-iframe-unset-transform"
          );
          $pops.style.transitionDuration = "";
          $pops.setAttribute(TYPE_MODULE, "min");
          $headerControls.setAttribute("type", "min");
          $headerBtnMax.style.setProperty("display", "none");
          $headerBtnMise.style.setProperty("display", "");
          if (typeof config?.btn?.min?.callback === "function") config.btn.min.callback(evtConfig, event);
          emitter.emit("pops:iframe-min", evtConfig, event);
        },
        { capture: true }
      );
      popsDOMUtils.on(
        $headerBtnMax,
        "click",
        (event) => {
          event.preventDefault();
          event.stopPropagation();
          if ($pops.getAttribute(TYPE_MODULE) !== "min") {
            origin_left = $pops.style.left;
            origin_top = $pops.style.top;
          }
          origin_is_max = true;
          $pops.style.transitionDuration = "";
          $pops.style.transform = "";
          $pops.removeAttribute(TYPE_MODULE);
          popsDOMUtils.addClassName(
            $pops,
            "pops-iframe-unset-transition",
            "pops-iframe-unset-left",
            "pops-iframe-unset-top",
            "pops-iframe-unset-transform"
          );
          popsDOMUtils.removeClassName($pops, "pops-iframe-unset-transition");
          $pops.setAttribute(TYPE_MODULE, "max");
          $headerControls.setAttribute("type", "max");
          $headerBtnMax.style.setProperty("display", "none");
          $headerBtnMise.style.setProperty("display", "");
          if (typeof config?.btn?.max?.callback === "function") config.btn.max.callback(evtConfig, event);
          emitter.emit("pops:iframe-max", evtConfig, event);
        },
        { capture: true }
      );
      $headerBtnMise?.style?.setProperty("display", "none");
      popsDOMUtils.on(
        $headerBtnMise,
        "click",
        (event) => {
          event.preventDefault();
          event.stopPropagation();
          if (origin_is_max && $pops.getAttribute(TYPE_MODULE) === "min") {
            popsDOMUtils.addClassName(
              $pops,
              "pops-iframe-unset-transition",
              "pops-iframe-unset-left",
              "pops-iframe-unset-top",
              "pops-iframe-unset-transform"
            );
            popsDOMUtils.removeClassName($pops, "pops-iframe-unset-transition");
            $pops.setAttribute(TYPE_MODULE, "max");
            $headerControls.setAttribute("type", "max");
          } else {
            origin_is_max = false;
            $pops.style.left = origin_left;
            $pops.style.top = origin_top;
            $pops.style.transitionDuration = "";
            $pops.style.transform = "";
            $headerControls.removeAttribute("type");
            $pops.removeAttribute(TYPE_MODULE);
            popsDOMUtils.removeClassName(
              $pops,
              "pops-iframe-unset-top",
              "pops-iframe-unset-left",
              "pops-iframe-unset-transform"
            );
            $headerBtnMax.style.setProperty("display", "");
            $headerBtnMise.style.setProperty("display", "none");
          }
          if (typeof config?.btn?.mise?.callback === "function") config.btn.mise.callback(evtConfig, event);
          emitter.emit("pops:iframe-mise", evtConfig, event);
        },
        { capture: true }
      );
      popsDOMUtils.on(
        $headerBtnClose,
        "click",
        async (event) => {
          event.preventDefault();
          event.stopPropagation();
          await PopsInstHandler.removeInstance([PopsInstData.iframe], guid, false);
          if (typeof config?.btn?.close?.callback === "function") config.btn.close.callback(evtConfig, event);
        },
        { capture: true }
      );
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      return result;
    },
  };
  var PopsPanelDefaultConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "center",
        html: false,
        style: "",
      },
      content: [
        {
          id: "whitesev-panel-config-1",
          title: "菜单配置1",
          headerTitle: "菜单配置1",
          isDefault: true,
          attributes: {
            "data-test": "test",
            "data-test-2": "test2",
          },
          views: [
            {
              className: "forms-1",
              text: "区域设置",
              type: "container",
              views: [
                {
                  className: "panel-switch",
                  text: "switch",
                  type: "switch",
                  disabled: false,
                  description: "",
                  getValue() {
                    return true;
                  },
                  callback(event, value) {
                    console.log("按钮开启状态:", value);
                  },
                },
                {
                  className: "panel-slider",
                  text: "slider",
                  type: "slider",
                  description: "",
                  disabled: false,
                  getToolTipContent(value) {
                    return String(value);
                  },
                  isShowHoverTip: true,
                  step: 1,
                  getValue() {
                    return 50;
                  },
                  callback(event, value) {
                    console.log("滑块当前数值:", value);
                  },
                  min: 1,
                  max: 100,
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
                  description: "",
                  disable: false,
                  buttonIsRightIcon: false,
                  buttonIcon: "view",
                  buttonIconIsLoading: true,
                  buttonType: "default",
                  buttonText: "default按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  },
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
                  buttonIcon: "eleme",
                  buttonIconIsLoading: true,
                  buttonType: "warning",
                  buttonText: "warning按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  },
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
                  buttonIcon: "chromeFilled",
                  buttonIconIsLoading: true,
                  buttonType: "danger",
                  buttonText: "danger按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  },
                },
                {
                  className: "panel-button",
                  text: "button",
                  type: "button",
                  buttonIcon: "upload",
                  buttonIconIsLoading: false,
                  buttonType: "info",
                  buttonText: "info按钮",
                  callback(event) {
                    console.log("点击按钮", event);
                  },
                },
              ],
            },
          ],
        },
        {
          id: "whitesev-panel-config-2",
          title: "菜单配置2",
          headerTitle: "菜单配置2",
          isDefault: false,
          attributes: {
            "data-value": "value",
            "data-value-2": "value2",
          },
          views: [
            {
              className: "panel-input",
              text: "input",
              type: "input",
              getValue() {
                return "50";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-number",
              text: "input-number",
              type: "input",
              inputType: "number",
              getValue() {
                return "50";
              },
              callback(event, value, valueAsNumber) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", valueAsNumber);
                if (valueAsNumber > 60)
                  return {
                    valid: false,
                    message: "输入值不能大于60,当前:" + value,
                  };
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-password",
              text: "input-password",
              type: "input",
              inputType: "password",
              placeholder: "请输入密码",
              getValue() {
                return "123456";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("密码输入框内容改变:", value);
              },
            },
            {
              className: "panel-input-file",
              text: "input-file",
              type: "input",
              inputType: "file",
              getValue() {
                return "";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("内容改变:", value);
              },
              placeholder: "请输入密码",
            },
            {
              className: "panel-input-date",
              text: "input-date",
              type: "input",
              inputType: "date",
              placeholder: "请输入内容",
              getValue() {
                const date = new Date();
                let hour = date.getHours().toString();
                let minutes = date.getMinutes().toString();
                if (hour.length === 1) hour = `0${hour}`;
                if (minutes.length === 1) minutes = `0${minutes}`;
                return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
              },
              callback(event, value, valueAsNumber, valueAsDate) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value, valueAsNumber, valueAsDate);
              },
            },
            {
              className: "panel-input-datetime-local",
              text: "input-datetime-local",
              type: "input",
              inputType: "datetime-local",
              getValue() {
                const date = new Date();
                let hour = date.getHours().toString();
                let minutes = date.getMinutes().toString();
                if (hour.length === 1) hour = `0${hour}`;
                if (minutes.length === 1) minutes = `0${minutes}`;
                return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}T${hour}:${minutes}`;
              },
              callback(event, value, valueAsNumber, valueAsDate) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value, valueAsNumber, valueAsDate);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-time",
              text: "input-time",
              type: "input",
              inputType: "time",
              getValue() {
                return "11:30";
              },
              callback(event, value, valueAsNumber, valueAsDate) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value, valueAsNumber, valueAsDate);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-month",
              text: "input-month",
              type: "input",
              inputType: "month",
              getValue() {
                const date = new Date();
                return `${date.getFullYear()}-${date.getMonth() + 1}`;
              },
              callback(event, value, valueAsNumber, valueAsDate) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value, valueAsNumber, valueAsDate);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-week",
              text: "input-week",
              type: "input",
              inputType: "week",
              getValue() {
                return `${new Date().getFullYear()}-W01`;
              },
              callback(event, value, valueAsNumber, valueAsDate) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value, valueAsNumber, valueAsDate);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-search",
              text: "input-search",
              type: "input",
              inputType: "search",
              getValue() {
                return "search test";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-color",
              text: "input-color",
              type: "input",
              inputType: "color",
              getValue() {
                return "#ff0000";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("输入框内容改变:", value);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-email",
              text: "input-email",
              type: "input",
              inputType: "email",
              getValue() {
                return "[email protected]";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                const $input = event.target;
                console.log("输入框内容改变:", value, $input.validity);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-tel",
              text: "input-tel",
              type: "input",
              inputType: "tel",
              getValue() {
                return "11111111111";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                const $input = event.target;
                console.log("输入框内容改变:", value, $input.validity);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-input-url",
              text: "input-url",
              type: "input",
              inputType: "url",
              getValue() {
                return "https://github.com/";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                const $input = event.target;
                console.log("输入框内容改变:", value, $input.validity);
              },
              placeholder: "请输入内容",
            },
            {
              className: "panel-textarea",
              text: "textarea",
              type: "textarea",
              getValue() {
                return "50";
              },
              callback(event, value) {
                popsDOMUtils.preventEvent(event);
                console.log("textarea输入框内容改变:", value);
              },
              placeholder: "请输入内容",
            },
            {
              type: "container",
              text: "",
              views: [
                {
                  className: "panel-select-disabled",
                  text: "select-disabled",
                  type: "select",
                  disabled: true,
                  getValue() {
                    return "text";
                  },
                  callback(isSelectedInfo) {
                    if (isSelectedInfo == null) return;
                    console.log(`select当前选项:${isSelectedInfo.value},当前选项文本:${isSelectedInfo.text}`);
                  },
                  data: [
                    {
                      value: "all",
                      text: "所有",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "text",
                      text: "文本",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "html",
                      text: "超文本",
                      disable() {
                        return false;
                      },
                    },
                  ],
                },
                {
                  className: "panel-select-multiple-disabled",
                  type: "select-multiple",
                  text: "select-multiple-disabled",
                  disabled: true,
                  placeholder: "请至少选择一个选项",
                  getValue() {
                    return ["select-1", "select-2"];
                  },
                  callback(selectInfo) {
                    console.log(`select值改变,多选信息`, selectInfo);
                  },
                  clickCallBack(event, isSelectedInfo) {
                    console.log("点击", event, isSelectedInfo);
                  },
                  closeIconClickCallBack(event, data) {
                    console.log("点击关闭图标的事件", data);
                  },
                  data: [
                    {
                      value: "select-1",
                      text: "单选1",
                      isHTML: false,
                    },
                    {
                      value: "select-2",
                      text: "单选2",
                      isHTML: false,
                    },
                    {
                      value: "select-3",
                      text: "单选3",
                      isHTML: false,
                    },
                    {
                      value: "select-4",
                      text: "单选4",
                      isHTML: false,
                    },
                  ],
                },
                {
                  className: "panel-select-native",
                  text: "select-native",
                  type: "select",
                  mode: "native",
                  getValue() {
                    return "all";
                  },
                  callback(isSelectedInfo) {
                    if (isSelectedInfo == null) return;
                    console.log(`select当前选项:${isSelectedInfo.value},当前选项文本:${isSelectedInfo.text}`);
                  },
                  data: [
                    {
                      value: "all",
                      text: "所有",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "text",
                      text: "文本",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "html",
                      text: "超文本",
                      disable() {
                        return false;
                      },
                    },
                  ],
                },
                {
                  className: "panel-select-dialog",
                  text: "select-dialog",
                  type: "select",
                  mode: "dialog",
                  getValue() {
                    return window.localStorage.getItem("select-dialog-customInput") || "";
                  },
                  callback(isSelectedInfo) {
                    if (isSelectedInfo == null) {
                      console.warn(`select当前选项为空`);
                      return;
                    }
                    if (isSelectedInfo.addCustomInput)
                      if (isSelectedInfo.value === "") {
                        if (isSelectedInfo.customInputStoreKey) {
                          console.log(`select删除自定义输入的值`);
                          window.localStorage.removeItem(isSelectedInfo.customInputStoreKey);
                        }
                      } else {
                        console.log(
                          `select当前自定义输入框内容:${isSelectedInfo.value},当前选项显示文本:${isSelectedInfo.text}`
                        );
                        if (isSelectedInfo.customInputStoreKey)
                          window.localStorage.setItem(isSelectedInfo.customInputStoreKey, isSelectedInfo.value);
                      }
                    else
                      console.log(`select当前选项:${isSelectedInfo.value},当前选项显示文本:${isSelectedInfo.text}`);
                  },
                  data: [
                    {
                      value: "all",
                      text: "所有",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "text",
                      text: "文本",
                      disable(value, selectInfo) {
                        if (selectInfo?.value === "all") return true;
                        return false;
                      },
                    },
                    {
                      value: "html",
                      text: "超文本",
                      disable(value, selectInfo) {
                        if (selectInfo?.value === "all") return true;
                        return false;
                      },
                    },
                    {
                      value: "own",
                      text: "自定义",
                      disable(value, selectInfo) {
                        if (selectInfo?.value === "all") return true;
                        return false;
                      },
                    },
                    {
                      value: window.localStorage.getItem("select-dialog-customInput") || "",
                      text: window.localStorage.getItem("select-dialog-customInput") || "",
                      addCustomInput: true,
                      customInputStoreKey: "select-dialog-customInput",
                      onValid(dataOption) {
                        if (dataOption.value === "123") {
                          console.error("非规范值");
                          return {
                            valid: false,
                            message: "非规范值",
                          };
                        }
                        return { valid: true };
                      },
                    },
                  ],
                },
                {
                  className: "panel-select-horizontal",
                  text: "select-horizontal",
                  type: "select",
                  mode: "horizontal",
                  getValue() {
                    return "text";
                  },
                  callback(isSelectedInfo) {
                    if (isSelectedInfo == null) return;
                    console.log(`select当前选项:${isSelectedInfo.value},当前选项文本:${isSelectedInfo.text}`);
                  },
                  data: [
                    {
                      value: "all",
                      text: "所有",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "text",
                      text: "文本",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "html",
                      text: "超文本",
                      disable() {
                        return false;
                      },
                    },
                    {
                      value: "own",
                      text: "自定义",
                      disable() {
                        return true;
                      },
                    },
                  ],
                },
                {
                  className: "panel-select-multiple",
                  type: "select-multiple",
                  text: "select-multiple",
                  placeholder: "请至少选择一个选项",
                  getValue() {
                    return ["select-1", "select-2"];
                  },
                  callback(selectInfo) {
                    console.log(`select值改变,多选信息`, selectInfo);
                  },
                  clickCallBack(event, isSelectedInfo) {
                    console.log("点击", event, isSelectedInfo);
                  },
                  closeIconClickCallBack(event, data) {
                    console.log("点击关闭图标的事件", data);
                  },
                  data: [
                    {
                      value: "select-1",
                      text: "单选1",
                      isHTML: false,
                      disable(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-5"].includes(it.value)) !== -1;
                      },
                    },
                    {
                      value: "select-2",
                      text: "单选2",
                      isHTML: false,
                      disable(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-5"].includes(it.value)) !== -1;
                      },
                    },
                    {
                      value: "select-3",
                      text: "单选3",
                      isHTML: false,
                      disable(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-2", "select-5"].includes(it.value)) !== -1;
                      },
                    },
                    {
                      value: "select-4",
                      text: "单选4",
                      isHTML: false,
                      disable(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-3", "select-5"].includes(it.value)) !== -1;
                      },
                    },
                    {
                      value: "select-5",
                      text(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-4"].includes(it.value)) !== -1
                          ? "单选5-禁用"
                          : "单选5";
                      },
                      isHTML: false,
                      disable(value, allSelectedInfo) {
                        return allSelectedInfo.findIndex((it) => ["select-4"].includes(it.value)) !== -1;
                      },
                    },
                  ],
                },
              ],
            },
            {
              type: "container",
              text: "deep菜单",
              views: [
                {
                  type: "deepMenu",
                  className: "panel-deepMenu",
                  text: "deepMenu",
                  description: "二级菜单",
                  rightText: "自定义配置",
                  arrowRightIcon: true,
                  afterAddToUListCallBack(viewConfig, container) {
                    console.log(viewConfig, container);
                  },
                  clickCallBack(event, viewConfig) {
                    console.log("进入子配置", event, viewConfig);
                  },
                  views: [
                    {
                      className: "forms-1",
                      text: "区域设置",
                      type: "container",
                      views: [
                        {
                          className: "panel-switch",
                          text: "switch",
                          type: "switch",
                          getValue() {
                            return true;
                          },
                          callback(event, value) {
                            console.log("按钮开启状态:", value);
                          },
                        },
                        {
                          className: "panel-slider",
                          text: "slider",
                          type: "slider",
                          getValue() {
                            return 50;
                          },
                          callback(event, value) {
                            console.log("滑块当前数值:", value);
                          },
                          min: 1,
                          max: 100,
                        },
                        {
                          className: "panel-button",
                          text: "button",
                          type: "button",
                          buttonIcon: "eleme",
                          buttonIconIsLoading: true,
                          buttonType: "warning",
                          buttonText: "warning按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          },
                        },
                        {
                          className: "panel-button",
                          text: "button",
                          type: "button",
                          buttonIcon: "chromeFilled",
                          buttonIconIsLoading: true,
                          buttonType: "danger",
                          buttonText: "danger按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          },
                        },
                        {
                          className: "panel-button",
                          text: "button",
                          type: "button",
                          buttonIcon: "upload",
                          buttonIconIsLoading: false,
                          buttonType: "info",
                          buttonText: "info按钮",
                          callback(event) {
                            console.log("点击按钮", event);
                          },
                        },
                      ],
                    },
                  ],
                },
                {
                  type: "deepMenu",
                  className: "panel-deepMenu2",
                  text: "deepMenu2",
                  description: "二级菜单",
                  rightText: "自定义配置",
                  arrowRightIcon: true,
                  afterAddToUListCallBack(viewConfig, container) {
                    console.log(viewConfig, container);
                  },
                  clickCallBack(event, viewConfig) {
                    console.log("进入子配置", event, viewConfig);
                  },
                  views: [],
                },
              ],
            },
            {
              type: "container",
              isFold: true,
              text: "折叠菜单",
              afterAddToUListCallBack(viewConfig, container) {
                console.log(viewConfig, container);
              },
              views: [
                {
                  className: "panel-switch",
                  text: "switch",
                  type: "switch",
                  getValue() {
                    return true;
                  },
                  callback(event, value) {
                    console.log("按钮开启状态:", value);
                  },
                },
              ],
            },
          ],
        },
        {
          id: "whitesev-panel-bottom-config-1",
          title: `
					<a rel="nofollow" href="https://www.npmjs.com/package/@whitesev/pops" target="_blank"><img src="https://img.shields.io/npm/v/@whitesev/pops?label=pops" alt="npm pops version"></a>
				`,
          isBottom: true,
          disableAsideItemHoverCSS: true,
          attributes: {
            "data-value": "value",
            "data-value-2": "value2",
          },
          views: [],
          clickFirstCallback: function () {
            return false;
          },
        },
        {
          id: "whitesev-panel-bottom-config-2",
          title: "版本:xxx.xx.xx",
          isBottom: true,
          attributes: {
            "data-value": "value",
            "data-value-2": "value2",
          },
          views: [],
          clickFirstCallback: function () {
            return false;
          },
        },
      ],
      bottomContentConfig: [],
      btn: {
        close: {
          enable: true,
          callback(event) {
            event.close();
          },
        },
      },
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      useShadowRoot: true,
      class: "",
      mobileClassName: "pops-panel-is-mobile",
      isMobile: false,
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "700px",
      height: window.innerHeight < 450 ? "70vh" : "500px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      useDeepMenuSwtichAnimation: true,
      zIndex: 1e4,
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      forbiddenScroll: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      listenEscapeKeyUpToExitDeepMenu: true,
      emitter: null,
    };
  };
  var PopsMathFloatUtils = {
    isFloat(num) {
      return Number(num) === num && num % 1 !== 0;
    },
    add(number1, number2) {
      let number1length, number2length;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch {
        number2length = 0;
      }
      const powValue = Math.pow(10, Math.max(number1length, number2length));
      return Math.round(number1 * powValue + number2 * powValue) / powValue;
    },
    sub(number1, number2) {
      let number1length, number2length;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch {
        number2length = 0;
      }
      const powValue = Math.pow(10, Math.max(number1length, number2length));
      const fixedValue = number1length >= number2length ? number1length : number2length;
      return (Math.round(number1 * powValue - number2 * powValue) / powValue).toFixed(fixedValue);
    },
    division(number1, number2) {
      let number1length, number2length;
      try {
        number1length = number1.toString().split(".")[1].length;
      } catch {
        number1length = 0;
      }
      try {
        number2length = number2.toString().split(".")[1].length;
      } catch {
        number2length = 0;
      }
      return (
        (Number(number1.toString().replace(".", "")) / Number(number2.toString().replace(".", ""))) *
        Math.pow(10, number2length - number1length)
      );
    },
  };
  var PopsTooltipDefaultConfig = () => {
    return {
      useShadowRoot: true,
      $target: null,
      content: "默认文字",
      isDiffContent: false,
      position: "top",
      className: "",
      isFixed: false,
      alwaysShow: false,
      onShowEventName: "mouseenter touchstart",
      onCloseEventName: "mouseleave touchend touchcancel",
      zIndex: 1e4,
      only: false,
      eventOption: {
        once: false,
        passive: false,
        capture: true,
      },
      showBeforeCallBack() {},
      showAfterCallBack() {},
      closeBeforeCallBack() {},
      closeAfterCallBack() {},
      delayCloseTime: 100,
      showArrow: true,
      arrowDistance: 12.5,
      otherDistance: 0,
      style: "",
      lightStyle: null,
      darkStyle: null,
      emitter: null,
    };
  };
  var ToolTip = class {
    $el = {
      $shadowContainer: null,
      $shadowRoot: null,
      $toolTip: null,
      $content: null,
      $arrow: null,
    };
    emitter;
    $data = {
      config: null,
      guid: null,
      timeId_close_TouchEvent: [],
      timeId_close_MouseEvent: [],
    };
    constructor(config, guid, ShadowInfo, emitter) {
      this.emitter = emitter;
      this.$data.config = config;
      this.$data.guid = guid;
      this.$el.$shadowContainer = ShadowInfo.$shadowContainer;
      this.$el.$shadowRoot = ShadowInfo.$shadowRoot;
      this.show = this.show.bind(this);
      this.close = this.close.bind(this);
      this.toolTipAnimationFinishEvent = this.toolTipAnimationFinishEvent.bind(this);
      this.toolTipMouseEnterEvent = this.toolTipMouseEnterEvent.bind(this);
      this.toolTipMouseLeaveEvent = this.toolTipMouseLeaveEvent.bind(this);
      this.init();
    }
    init() {
      const toolTipInfo = this.createToolTip();
      this.$el.$toolTip = toolTipInfo.$toolTipContainer;
      this.$el.$content = toolTipInfo.$toolTipContent;
      this.$el.$arrow = toolTipInfo.$toolTipArrow;
      this.changeContent();
      this.changeZIndex();
      this.changePosition();
      if (!this.$data.config.alwaysShow) {
        this.offEvent();
        this.onEvent();
      }
    }
    createToolTip() {
      const $toolTipContainer = popsDOMUtils.createElement(
        "div",
        {
          className: "pops-tip",
          innerHTML: `
				<div class="pops-tip-content" style="text-align: center;"></div>
				<div class="pops-tip-arrow"></div>
			`,
        },
        {
          "data-position": this.$data.config.isFixed ? "fixed" : "absolute",
          "data-guid": this.$data.guid,
        }
      );
      const $toolTipContent = $toolTipContainer.querySelector(".pops-tip-content");
      const $toolTipArrow = $toolTipContainer.querySelector(".pops-tip-arrow");
      popsDOMUtils.addClassName($toolTipContainer, this.$data.config.className);
      $toolTipContainer.style.zIndex = PopsHandler.getTargerOrFunctionValue(this.$data.config.zIndex).toString();
      PopsElementHandler.addStyle($toolTipContainer, this.$data.config.style);
      PopsElementHandler.addLightStyle($toolTipContainer, this.$data.config.lightStyle);
      PopsElementHandler.addDarkStyle($toolTipContainer, this.$data.config.darkStyle);
      if (!this.$data.config.showArrow) popsDOMUtils.remove($toolTipArrow);
      return {
        $toolTipContainer,
        $toolTipArrow,
        $toolTipContent,
      };
    }
    getContent() {
      return typeof this.$data.config.content === "function" ? this.$data.config.content() : this.$data.config.content;
    }
    changeContent(text) {
      if (text == null) text = this.getContent();
      if (this.$data.config.isDiffContent) {
        const contentPropKey = "data-content";
        const originContentText = Reflect.get(this.$el.$content, contentPropKey);
        if (typeof originContentText === "string") {
          if (originContentText === text) return;
        }
        Reflect.set(this.$el.$content, contentPropKey, text);
      }
      PopsSafeUtils.setSafeHTML(this.$el.$content, text);
    }
    getZIndex() {
      return PopsHandler.getTargerOrFunctionValue(this.$data.config.zIndex);
    }
    changeZIndex() {
      const zIndex = this.getZIndex();
      this.$el.$toolTip.style.setProperty("z-index", zIndex.toString());
    }
    calcToolTipPosition(targetElement, arrowDistance, otherDistance, event) {
      const offsetInfo = popsDOMUtils.offset(targetElement, !this.$data.config.isFixed);
      const targetElement_width = offsetInfo.width;
      const targetElement_height = offsetInfo.height;
      const targetElement_top = offsetInfo.top;
      const targetElement_left = offsetInfo.left;
      const toolTipElement_width = popsDOMUtils.outerWidth(this.$el.$toolTip);
      const toolTipElement_height = popsDOMUtils.outerHeight(this.$el.$toolTip);
      const targetElement_X_center_pos = targetElement_left + targetElement_width / 2 - toolTipElement_width / 2;
      const targetElement_Y_center_pos = targetElement_top + targetElement_height / 2 - toolTipElement_height / 2;
      let mouseX = 0;
      let mouseY = 0;
      if (event != null)
        if (event instanceof MouseEvent || event instanceof PointerEvent) {
          mouseX = event.pageX;
          mouseY = event.y;
        } else if (event instanceof TouchEvent) {
          const touchEvent = event.touches[0];
          mouseX = touchEvent.pageX;
          mouseY = touchEvent.pageY;
        } else {
          if (typeof event.clientX === "number") mouseX = event.clientX;
          if (typeof event.clientY === "number") mouseY = event.clientY;
        }
      return {
        TOP: {
          left: targetElement_X_center_pos - otherDistance,
          top: targetElement_top - toolTipElement_height - arrowDistance,
          arrow: "bottom",
          motion: "fadeInTop",
        },
        RIGHT: {
          left: targetElement_left + targetElement_width + arrowDistance,
          top: targetElement_Y_center_pos + otherDistance,
          arrow: "left",
          motion: "fadeInRight",
        },
        BOTTOM: {
          left: targetElement_X_center_pos - otherDistance,
          top: targetElement_top + targetElement_height + arrowDistance,
          arrow: "top",
          motion: "fadeInBottom",
        },
        LEFT: {
          left: targetElement_left - toolTipElement_width - arrowDistance,
          top: targetElement_Y_center_pos + otherDistance,
          arrow: "right",
          motion: "fadeInLeft",
        },
        FOLLOW: {
          left: mouseX + otherDistance,
          top: mouseY + otherDistance,
          arrow: "follow",
          motion: "",
        },
      };
    }
    changePosition(event) {
      const position = this.calcToolTipPosition(
        this.$data.config.$target,
        this.$data.config.arrowDistance,
        this.$data.config.otherDistance,
        event
      )[this.$data.config.position.toUpperCase()];
      if (position) {
        this.$el.$toolTip.style.left = position.left + "px";
        this.$el.$toolTip.style.top = position.top + "px";
        this.$el.$toolTip.setAttribute("data-motion", position.motion);
        this.$el.$arrow.setAttribute("data-position", position.arrow);
      } else console.error("不存在该位置", this.$data.config.position);
    }
    onEvent() {
      this.onToolTipAnimationFinishEvent();
      this.onShowEvent();
      this.onCloseEvent();
      this.onToolTipMouseEnterEvent();
      this.onToolTipMouseLeaveEvent();
    }
    offEvent() {
      this.offToolTipAnimationFinishEvent();
      this.offShowEvent();
      this.offCloseEvent();
      this.offToolTipMouseEnterEvent();
      this.offToolTipMouseLeaveEvent();
    }
    addCloseTimeoutId(type, timeId) {
      if (type === "MouseEvent") this.$data.timeId_close_MouseEvent.push(timeId);
      else this.$data.timeId_close_TouchEvent.push(timeId);
    }
    clearCloseTimeoutId(type, timeId) {
      const timeIdList =
        type === "MouseEvent" ? this.$data.timeId_close_MouseEvent : this.$data.timeId_close_TouchEvent;
      for (let index = 0; index < timeIdList.length; index++) {
        const currentTimeId = timeIdList[index];
        if (typeof timeId === "number") {
          if (timeId == currentTimeId) {
            popsUtils.clearTimeout(timeId);
            timeIdList.splice(index, 1);
            break;
          }
        } else {
          popsUtils.clearTimeout(currentTimeId);
          timeIdList.splice(index, 1);
          index--;
        }
      }
    }
    show(...args) {
      const event = args[0];
      const eventType = event instanceof MouseEvent ? "MouseEvent" : "TouchEvent";
      this.clearCloseTimeoutId(eventType);
      if (typeof this.$data.config.showBeforeCallBack === "function") {
        const result = this.$data.config.showBeforeCallBack(this.$el.$toolTip);
        if (typeof result === "boolean" && !result) return;
      }
      if (!popsUtils.contains(this.$el.$shadowRoot, this.$el.$toolTip)) {
        this.init();
        popsDOMUtils.append(this.$el.$shadowRoot, this.$el.$toolTip);
      }
      if (!popsUtils.contains(this.$el.$shadowContainer)) {
        this.emitter.emit("pops:before-append-to-page", this.$el.$shadowRoot, this.$el.$shadowContainer);
        popsDOMUtils.append(document.body, this.$el.$shadowContainer);
      }
      this.changeContent();
      this.changePosition(event);
      if (typeof this.$data.config.showAfterCallBack === "function")
        this.$data.config.showAfterCallBack(this.$el.$toolTip);
    }
    onShowEvent() {
      popsDOMUtils.on(
        this.$data.config.$target,
        this.$data.config.onShowEventName,
        this.show,
        this.$data.config.eventOption
      );
    }
    offShowEvent() {
      popsDOMUtils.off(
        this.$data.config.$target,
        this.$data.config.onShowEventName,
        this.show,
        this.$data.config.eventOption
      );
    }
    close(...args) {
      const event = args[0];
      const eventType = event instanceof MouseEvent ? "MouseEvent" : "TouchEvent";
      if (event && event instanceof MouseEvent) {
        const $target = event.composedPath()[0];
        if ($target != this.$data.config.$target && $target != this.$el.$toolTip) return;
      }
      if (typeof this.$data.config.closeBeforeCallBack === "function") {
        const result = this.$data.config.closeBeforeCallBack(this.$el.$toolTip);
        if (typeof result === "boolean" && !result) return;
      }
      if (
        this.$data.config.delayCloseTime == null ||
        (typeof this.$data.config.delayCloseTime === "number" && this.$data.config.delayCloseTime <= 0)
      )
        this.$data.config.delayCloseTime = 100;
      const timeId = popsUtils.setTimeout(() => {
        this.clearCloseTimeoutId(eventType, timeId);
        if (this.$el.$toolTip == null) return;
        const motion = this.$el.$toolTip.getAttribute("data-motion");
        if (motion == null || motion.trim() === "") this.toolTipAnimationFinishEvent();
        else
          this.$el.$toolTip.setAttribute(
            "data-motion",
            this.$el.$toolTip.getAttribute("data-motion").replace("fadeIn", "fadeOut")
          );
      }, this.$data.config.delayCloseTime);
      this.addCloseTimeoutId(eventType, timeId);
      if (typeof this.$data.config.closeAfterCallBack === "function")
        this.$data.config.closeAfterCallBack(this.$el.$toolTip);
    }
    onCloseEvent() {
      popsDOMUtils.on(
        this.$data.config.$target,
        this.$data.config.onCloseEventName,
        this.close,
        this.$data.config.eventOption
      );
    }
    offCloseEvent() {
      popsDOMUtils.off(
        this.$data.config.$target,
        this.$data.config.onCloseEventName,
        this.close,
        this.$data.config.eventOption
      );
    }
    destory() {
      if (this.$el.$toolTip) popsDOMUtils.remove(this.$el.$toolTip);
      this.$el.$toolTip = null;
      this.$el.$arrow = null;
      this.$el.$content = null;
    }
    toolTipAnimationFinishEvent() {
      if (!this.$el.$toolTip) return;
      if (this.$el.$toolTip.getAttribute("data-motion").includes("In")) return;
      this.destory();
    }
    onToolTipAnimationFinishEvent() {
      popsDOMUtils.on(this.$el.$toolTip, popsDOMUtils.getAnimationEndNameList(), this.toolTipAnimationFinishEvent);
    }
    offToolTipAnimationFinishEvent() {
      popsDOMUtils.off(this.$el.$toolTip, popsDOMUtils.getAnimationEndNameList(), this.toolTipAnimationFinishEvent);
    }
    toolTipMouseEnterEvent() {
      this.clearCloseTimeoutId("MouseEvent");
      this.clearCloseTimeoutId("TouchEvent");
    }
    onToolTipMouseEnterEvent() {
      this.clearCloseTimeoutId("MouseEvent");
      this.clearCloseTimeoutId("TouchEvent");
      popsDOMUtils.on(
        this.$el.$toolTip,
        "mouseenter touchstart",
        this.toolTipMouseEnterEvent,
        this.$data.config.eventOption
      );
    }
    offToolTipMouseEnterEvent() {
      popsDOMUtils.off(
        this.$el.$toolTip,
        "mouseenter touchstart",
        this.toolTipMouseEnterEvent,
        this.$data.config.eventOption
      );
    }
    toolTipMouseLeaveEvent(event) {
      this.close(event);
    }
    onToolTipMouseLeaveEvent() {
      popsDOMUtils.on(
        this.$el.$toolTip,
        "mouseleave touchend touchcancel",
        this.toolTipMouseLeaveEvent,
        this.$data.config.eventOption
      );
    }
    offToolTipMouseLeaveEvent() {
      popsDOMUtils.off(
        this.$el.$toolTip,
        "mouseleave touchend touchcancel",
        this.toolTipMouseLeaveEvent,
        this.$data.config.eventOption
      );
    }
  };
  var PopsTooltip = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "tooltip";
      let config = PopsTooltipDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      if (!(config.$target instanceof HTMLElement)) throw new TypeError("config.target 必须是HTMLElement类型");
      config = PopsHandler.handleOnly(popsType, config);
      if (config.position === "follow") {
        config.onShowEventName = config.onShowEventName.trim();
        const showEventNameSplit = config.onShowEventName.split(" ");
        ["mousemove", "touchmove"].forEach((it) => {
          if (showEventNameSplit.includes(it)) return;
          config.onShowEventName += ` ${it}`;
        });
      }
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "tooltipCSS",
          css: PopsCSS.tooltipCSS,
        },
      ]);
      const toolTip = new ToolTip(
        config,
        guid,
        {
          $shadowContainer,
          $shadowRoot,
        },
        emitter
      );
      if (config.alwaysShow) toolTip.show();
      return {
        guid,
        config,
        $shadowContainer,
        $shadowRoot,
        toolTip,
        emitter,
      };
    },
  };
  var PanelHandlerComponents = () => {
    return {
      asideULElement: null,
      asideBottomULElement: null,
      sectionContainerHeaderULElement: null,
      sectionContainerULElement: null,
      $el: {
        $pops: null,
        $content: null,
        $panelRightSectionWrapper: null,
        $panelLeftAside: null,
        $panelContentSectionContainer: null,
        $panelBottomWrapper: null,
        $panelBottomContainer: null,
        $panelBottomLeftContainer: null,
        $panelBottomRightContainer: null,
      },
      $data: { nodeStoreConfigKey: "data-view-config" },
      $config: {},
      emitter: null,
      init(data) {
        const PopsType = "panel";
        this.$el = { ...data.$el };
        this.$config = data.config;
        this.emitter = data.emitter;
        this.asideULElement = this.$el.$panelLeftAside.querySelector(`ul.pops-${PopsType}-aside-top-container`);
        this.asideBottomULElement = this.$el.$panelLeftAside.querySelector(
          `ul.pops-${PopsType}-aside-bottom-container`
        );
        this.sectionContainerHeaderULElement = this.$el.$panelContentSectionContainer.querySelector(
          `ul.pops-${PopsType}-container-header-ul`
        );
        this.sectionContainerULElement = this.$el.$panelContentSectionContainer.querySelector(
          `ul.pops-${PopsType}-container-main-ul`
        );
        let $defaultAsideItem = null;
        let isScrollToDefaultView = false;
        data.config.content.forEach((asideItemConfig) => {
          const $asideLiElement = this.createAsideItem(asideItemConfig);
          this.onAsideItemClick($asideLiElement, asideItemConfig);
          if (typeof asideItemConfig.isBottom === "function" ? asideItemConfig.isBottom() : asideItemConfig.isBottom)
            this.asideBottomULElement.appendChild($asideLiElement);
          else this.asideULElement.appendChild($asideLiElement);
          if ($defaultAsideItem == null) {
            let flag = false;
            if (typeof asideItemConfig.isDefault === "function") flag = Boolean(asideItemConfig.isDefault());
            else flag = Boolean(asideItemConfig.isDefault);
            if (flag) {
              $defaultAsideItem = $asideLiElement;
              isScrollToDefaultView = Boolean(asideItemConfig.scrollToDefaultView);
            }
          }
          if (typeof asideItemConfig.afterRender === "function")
            asideItemConfig.afterRender({
              asideConfig: asideItemConfig,
              $asideLiElement,
            });
        });
        (data.config?.bottomContentConfig || []).forEach((bottomItemConfig) => {
          const $bottomLiElement = this.createBottomItem(bottomItemConfig);
          this.onBottomItemClick($bottomLiElement, bottomItemConfig);
          if (bottomItemConfig.position === "left" || bottomItemConfig.position == null)
            this.$el.$panelBottomLeftContainer.appendChild($bottomLiElement);
          else if (bottomItemConfig.position === "right")
            this.$el.$panelBottomRightContainer.appendChild($bottomLiElement);
          else throw new Error("pops.panel:bottomContentConfig.position参数错误");
          if (typeof bottomItemConfig.afterRender === "function")
            bottomItemConfig.afterRender({
              $bottomWrapper: this.$el.$panelBottomWrapper,
              $bottomContainer: this.$el.$panelBottomContainer,
              $bottomLeftContainer: this.$el.$panelBottomLeftContainer,
              $bottomRightContainer: this.$el.$panelBottomRightContainer,
            });
        });
        if ($defaultAsideItem == null && this.asideULElement.children.length)
          $defaultAsideItem = this.asideULElement.children[0];
        if ($defaultAsideItem) {
          $defaultAsideItem.click();
          if (isScrollToDefaultView) $defaultAsideItem?.scrollIntoView();
        } else console.error("pops.panel:左侧容器没有项");
      },
      clearContainer() {
        Reflect.deleteProperty(this.$el.$panelContentSectionContainer, this.$data.nodeStoreConfigKey);
        PopsSafeUtils.setSafeHTML(this.sectionContainerHeaderULElement, "");
        PopsSafeUtils.setSafeHTML(this.sectionContainerULElement, "");
        this.clearDeepMenuContainer();
      },
      clearDeepMenuContainer() {
        this.$el.$panelRightSectionWrapper
          ?.querySelectorAll("section.pops-panel-deepMenu-container")
          .forEach(($el) => popsDOMUtils.remove($el));
      },
      clearAsideItemIsVisited() {
        this.$el.$panelLeftAside.querySelectorAll(".pops-is-visited").forEach(($el) => {
          popsDOMUtils.removeClassName($el, "pops-is-visited");
        });
      },
      setAsideItemIsVisited($el) {
        popsDOMUtils.addClassName($el, "pops-is-visited");
      },
      setElementAttributes($el, attributes) {
        if (attributes == null) return;
        if (Array.isArray(attributes))
          attributes.forEach((attrObject) => {
            this.setElementAttributes($el, attrObject);
          });
        else
          Object.keys(attributes).forEach((attributeName) => {
            $el.setAttribute(attributeName, attributes[attributeName]);
          });
      },
      setElementProps($el, props) {
        if (props == null) return;
        if (typeof props !== "object") return;
        Object.keys(props).forEach((propName) => {
          const value = props[propName];
          if (propName === "innerHTML") {
            PopsSafeUtils.setSafeHTML($el, value);
            return;
          }
          Reflect.set($el, propName, value);
        });
      },
      setElementClassName($el, className) {
        popsDOMUtils.addClassName($el, className);
      },
      createBottomItem(bottomItemConfig) {
        const text = typeof bottomItemConfig.text === "function" ? bottomItemConfig.text() : bottomItemConfig.text;
        const className = Array.isArray(bottomItemConfig.className)
          ? bottomItemConfig.className.join(" ")
          : bottomItemConfig.className || "";
        const $li = popsDOMUtils.createElement("li", {
          className: ["pops-panel-bottom-item", "pops-user-select-none", className].join(" "),
          innerHTML: text,
        });
        this.setElementAttributes($li, bottomItemConfig.attributes);
        this.setElementProps($li, bottomItemConfig.props);
        const disablHoverCSSClassName = "pops-panel-disable-bottom-item-hover-css";
        if (
          typeof bottomItemConfig.disableHoverCSS === "function"
            ? bottomItemConfig.disableHoverCSS()
            : bottomItemConfig.disableHoverCSS
        )
          popsDOMUtils.addClassName($li, disablHoverCSSClassName);
        else popsDOMUtils.removeClassName($li, disablHoverCSSClassName);
        return $li;
      },
      onBottomItemClick($bottomItem, bottomItemConfig) {
        popsDOMUtils.on($bottomItem, "click", async (event) => {
          if (typeof bottomItemConfig.clickCallback === "function") {
            const asideClickCallbackResult = await bottomItemConfig.clickCallback(event);
            if (typeof asideClickCallbackResult === "boolean" && !asideClickCallbackResult) return;
          }
        });
      },
      createAsideItem(asideConfig) {
        const text = typeof asideConfig.title === "function" ? asideConfig.title() : asideConfig.title;
        const $li = popsDOMUtils.createElement("li", {
          id: asideConfig.id,
          innerHTML: text,
        });
        Reflect.set($li, "__forms__", asideConfig.views);
        this.setElementClassName($li, "pops-panel-aside-item");
        this.setElementClassName($li, asideConfig.className);
        this.setElementAttributes($li, asideConfig.attributes);
        this.setElementProps($li, asideConfig.props);
        const disablHoverCSSClassName = "pops-panel-disabled-aside-hover-css";
        if (
          typeof asideConfig.disableAsideItemHoverCSS === "function"
            ? asideConfig.disableAsideItemHoverCSS()
            : asideConfig.disableAsideItemHoverCSS
        )
          popsDOMUtils.addClassName($li, disablHoverCSSClassName);
        else popsDOMUtils.removeClassName($li, disablHoverCSSClassName);
        return $li;
      },
      createSectionContainerItem_switch(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-switch">
					<input class="pops-panel-switch__input" type="checkbox">
					<span class="pops-panel-switch__core">
						<div class="pops-panel-switch__action">
						</div>
					</span>
				</div>`
        );
        const PopsPanelSwitch = {
          [Symbol.toStringTag]: "PopsPanelSwitch",
          $data: { value: Boolean(viewConfig.getValue()) },
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            switch: $li.querySelector(".pops-panel-switch"),
            input: $li.querySelector(".pops-panel-switch__input"),
            core: $li.querySelector(".pops-panel-switch__core"),
          },
          init() {
            this.setStatus(this.$data.value);
            if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled) this.disable();
            this.onClick();
          },
          onClick() {
            popsDOMUtils.on(this.$ele.core, "click", async (event) => {
              if (this.$ele.input.disabled || this.$ele.switch.hasAttribute("data-disabled")) return;
              const status = this.getStatus();
              if (typeof viewConfig.beforeSwitchStatusChangeCallBack === "function") {
                const flag = await viewConfig.beforeSwitchStatusChangeCallBack(event, status);
                if (typeof flag === "boolean" && !flag) return;
              }
              this.$data.value = !status;
              this.setStatus(this.$data.value);
              if (typeof viewConfig.callback === "function") await viewConfig.callback(event, this.$data.value);
            });
          },
          setStatus(isChecked = false) {
            isChecked = Boolean(isChecked);
            this.$ele.input.checked = isChecked;
            if (isChecked) popsDOMUtils.addClassName(this.$ele.switch, "pops-panel-switch-is-checked");
            else popsDOMUtils.removeClassName(this.$ele.switch, "pops-panel-switch-is-checked");
          },
          getReverseStatus() {
            return !this.getStatus();
          },
          getStatus() {
            let checkedValue = false;
            if (popsDOMUtils.containsClassName(this.$ele.switch, "pops-panel-switch-is-checked")) checkedValue = true;
            return checkedValue;
          },
          disable() {
            this.$ele.input.disabled = true;
            this.$ele.switch.setAttribute("data-disabled", "true");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          notDisable() {
            this.$ele.input.disabled = false;
            this.$ele.switch.removeAttribute("data-disabled");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
        };
        PopsPanelSwitch.init();
        Reflect.set($li, "data-switch", PopsPanelSwitch);
        return {
          $el: $li,
          handler: PopsPanelSwitch,
        };
      },
      createSectionContainerItem_slider(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text" style="flex: 1;">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-slider pops-slider-width">
					<div class="pops-slider__runway">
						<div class="pops-slider__bar" style="width: 0%; left: 0%"></div>
						<div class="pops-slider__button-wrapper" style="left: 0%">
							<div class="pops-slider__button"></div>
						</div>
					</div>
				</div>`
        );
        const PopsPanelSlider = {
          [Symbol.toStringTag]: "PopsPanelSlider",
          value: viewConfig.getValue(),
          min: viewConfig.min,
          max: viewConfig.max,
          step: viewConfig.step || 1,
          $data: {
            isMove: false,
            isInitDragPosition: false,
            isCheckingStopDragMove: false,
            totalWidth: 0,
            stepPx: 0,
            dragWidth: 0,
            dragPercent: 0,
            stepBlockMap: new Map(),
            tooltip: null,
          },
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            slider: $li.querySelector(".pops-slider"),
            runAway: $li.querySelector(".pops-slider__runway"),
            bar: $li.querySelector(".pops-slider__bar"),
            buttonWrapper: $li.querySelector(".pops-slider__button-wrapper"),
            button: $li.querySelector(".pops-slider__button"),
          },
          $interval: { isCheck: false },
          $tooltip: null,
          init() {
            this.initEleData();
            this.setToolTipEvent();
            this.setPanEvent();
            this.onRunAwayClick();
            this.intervalInit();
            if (this.isDisabledDragWithConfig()) this.disableDrag();
          },
          intervalInit(checkStepTime = 200, maxTime = 1e4) {
            if (this.$interval.isCheck) return;
            this.$interval.isCheck = true;
            let isSuccess = false;
            const oldTotalWidth = this.$data.totalWidth;
            let timer = void 0;
            const interval = setInterval(() => {
              if (isSuccess) {
                this.$interval.isCheck = false;
                clearTimeout(timer);
                clearInterval(interval);
              } else {
                this.initTotalWidth();
                if (this.$data.totalWidth !== 0) {
                  isSuccess = true;
                  if (this.$data.totalWidth !== oldTotalWidth) {
                    if (PopsMathFloatUtils.isFloat(this.step)) this.initFloatStepMap();
                    else this.initStepMap();
                    this.initSliderPosition();
                  }
                }
              }
            }, checkStepTime);
            timer = setTimeout(() => {
              clearInterval(interval);
            }, maxTime);
          },
          initEleData() {
            this.$ele.slider.setAttribute("data-min", this.min.toString());
            this.$ele.slider.setAttribute("data-max", this.max.toString());
            this.$ele.slider.setAttribute("data-value", this.value.toString());
            this.$ele.slider.setAttribute("data-step", this.step.toString());
            Reflect.set(this.$ele.slider, "data-min", this.min);
            Reflect.set(this.$ele.slider, "data-max", this.max);
            Reflect.set(this.$ele.slider, "data-value", this.value);
            Reflect.set(this.$ele.slider, "data-step", this.step);
          },
          initTotalWidth() {
            this.$data.totalWidth = popsDOMUtils.width(this.$ele.runAway);
          },
          initStepMap() {
            let index = 0;
            const blockNums = (this.max - this.min) / this.step;
            this.$data.stepPx = this.$data.totalWidth / blockNums;
            let widthPx = 0;
            for (let stepValue = this.min; stepValue <= this.max; stepValue += this.step) {
              const value = this.formatValue(stepValue);
              let info;
              if (value === this.min)
                info = {
                  value,
                  px: 0,
                  pxLeft: 0,
                  pxRight: this.$data.stepPx / 2,
                  percent: 0,
                };
              else
                info = {
                  value,
                  px: widthPx,
                  pxLeft: widthPx - this.$data.stepPx / 2,
                  pxRight: widthPx + this.$data.stepPx / 2,
                  percent: widthPx / this.$data.totalWidth,
                };
              this.$data.stepBlockMap.set(index, info);
              index++;
              widthPx += this.$data.stepPx;
            }
          },
          initFloatStepMap() {
            let index = 0;
            const blockNums = (this.max - this.min) / this.step;
            this.$data.stepPx = this.$data.totalWidth / blockNums;
            let widthPx = 0;
            for (
              let stepValue = this.min;
              stepValue <= this.max;
              stepValue = PopsMathFloatUtils.add(stepValue, this.step)
            ) {
              const value = this.formatValue(stepValue);
              let info;
              if (value === this.min)
                info = {
                  value,
                  px: 0,
                  pxLeft: 0,
                  pxRight: this.$data.stepPx / 2,
                  percent: 0,
                };
              else
                info = {
                  value,
                  px: widthPx,
                  pxLeft: widthPx - this.$data.stepPx / 2,
                  pxRight: widthPx + this.$data.stepPx / 2,
                  percent: widthPx / this.$data.totalWidth,
                };
              this.$data.stepBlockMap.set(index, info);
              index++;
              widthPx += this.$data.stepPx;
            }
          },
          initSliderPosition() {
            let percent = 0;
            for (const [, stepBlockInfo] of this.$data.stepBlockMap.entries())
              if (stepBlockInfo.value == this.value) {
                percent = stepBlockInfo.percent;
                this.$data.dragWidth = stepBlockInfo.px;
                break;
              }
            percent = this.formatValue(percent * 100);
            this.setSliderPosition(percent);
          },
          isFloat(num) {
            return Number(num) === num && num % 1 !== 0;
          },
          valueChangeCallBack(event, value) {
            if (typeof viewConfig.callback === "function") viewConfig.callback(event, value);
          },
          getDragInfo(dragX) {
            let result = this.$data.stepBlockMap.get(0);
            for (const [, stepBlockInfo] of this.$data.stepBlockMap.entries())
              if (stepBlockInfo.pxLeft <= dragX && dragX < stepBlockInfo.pxRight) {
                result = stepBlockInfo;
                break;
              }
            return result;
          },
          getSliderPositonPercent(dragWidth) {
            return dragWidth / this.$data.totalWidth;
          },
          formatValue(num) {
            if (PopsMathFloatUtils.isFloat(this.step)) num = parseFloat(num.toFixed(2));
            else num = parseInt(num.toString());
            return num;
          },
          setSliderPosition(percent) {
            if (parseInt(percent.toString()) === 1) percent = 1;
            if (percent > 1) percent = percent / 100;
            this.$ele.buttonWrapper.style.left = `${percent * 100}%`;
            this.$ele.bar.style.width = `${percent * 100}%`;
          },
          disableDrag() {
            popsDOMUtils.addClassName(this.$ele.runAway, "pops-slider-is-disabled");
            popsDOMUtils.addClassName(this.$ele.runAway, PopsCommonCSSClassName.textIsDisabled);
          },
          allowDrag() {
            popsDOMUtils.removeClassName(this.$ele.runAway, "pops-slider-is-disabled");
            popsDOMUtils.removeClassName(this.$ele.runAway, PopsCommonCSSClassName.textIsDisabled);
          },
          isDisabledDrag() {
            return popsDOMUtils.containsClassName(this.$ele.runAway, "pops-slider-is-disabled");
          },
          isDisabledDragWithConfig() {
            const isDisabled = typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled;
            if (typeof isDisabled === "boolean") return isDisabled;
            else return false;
          },
          onRunAwayClick() {
            popsDOMUtils.on(
              this.$ele.runAway,
              "click",
              (event) => {
                if (event.target !== this.$ele.runAway && event.target !== this.$ele.bar) return;
                const clickX = parseFloat(event.offsetX.toString());
                if (!this.dragStartCallBack()) return;
                this.dragMoveCallBack(event, clickX, this.value);
                this.dragEndCallBack(clickX);
              },
              { capture: false }
            );
          },
          dragStartCallBack() {
            if (this.isDisabledDragWithConfig()) {
              this.disableDrag();
              return false;
            }
            if (!this.$data.isMove) {
              if (this.isDisabledDrag()) this.allowDrag();
              this.$data.isMove = true;
            }
            return true;
          },
          dragMoveCallBack(event, dragX, oldValue) {
            let dragPercent = 0;
            if (dragX <= 0) {
              dragPercent = 0;
              this.value = this.min;
            } else if (dragX >= this.$data.totalWidth) {
              dragPercent = 1;
              this.value = this.max;
            } else {
              const dragInfo = this.getDragInfo(dragX);
              dragPercent = dragInfo.percent;
              this.value = this.formatValue(dragInfo.value);
            }
            this.$data.dragPercent = dragPercent;
            this.setSliderPosition(this.$data.dragPercent);
            this.showToolTip();
            if (oldValue !== this.value) this.valueChangeCallBack(event, this.value);
          },
          dragEndCallBack(dragX) {
            this.$data.isMove = false;
            if (dragX <= 0) this.$data.dragWidth = 0;
            else if (dragX >= this.$data.totalWidth) this.$data.dragWidth = this.$data.totalWidth;
            else this.$data.dragWidth = dragX;
            this.closeToolTip();
          },
          setPanEvent() {
            const AnyTouch = popsUtils.AnyTouch();
            this.$tooltip = new AnyTouch(this.$ele.button, {
              preventDefault() {
                return false;
              },
            });
            let currentDragX = 0;
            this.$tooltip.on("at:move", (event) => {
              if (!this.dragStartCallBack()) return;
              const oldValue = this.value;
              const runAwayRect = this.$ele.runAway.getBoundingClientRect();
              let displacementX = event.x - (runAwayRect.left + globalThis.screenX);
              if (displacementX <= 0) displacementX = 0;
              else if (displacementX >= runAwayRect.width) displacementX = runAwayRect.width;
              currentDragX = displacementX;
              this.dragMoveCallBack(event, currentDragX, oldValue);
            });
            this.$tooltip.on("at:end", () => {
              this.dragEndCallBack(currentDragX);
            });
          },
          showToolTip() {
            this.$data.tooltip.toolTip.show();
          },
          closeToolTip() {
            this.$data.tooltip.toolTip.close();
          },
          checkStopDragMove() {
            if (this.$data.isCheckingStopDragMove) return;
            this.$data.isCheckingStopDragMove = true;
            const interval = setInterval(() => {
              if (!this.$data.isMove) {
                this.$data.isCheckingStopDragMove = false;
                this.closeToolTip();
                clearInterval(interval);
              }
            }, 200);
            setTimeout(() => {
              this.$data.isCheckingStopDragMove = false;
              clearInterval(interval);
            }, 2e3);
          },
          setToolTipEvent() {
            function getToolTipContent() {
              if (typeof viewConfig.getToolTipContent === "function")
                return viewConfig.getToolTipContent(PopsPanelSlider.value);
              else return PopsPanelSlider.value.toString();
            }
            const tooltip = PopsTooltip.init({
              $target: this.$ele.button,
              content: getToolTipContent,
              zIndex: () => {
                return popsUtils.getMaxZIndexNodeInfoFromPoint(this.$ele.button)[0].zIndex;
              },
              isFixed: true,
              className: "github-tooltip",
              only: false,
              eventOption: {
                capture: true,
                passive: true,
              },
              showBeforeCallBack: () => {
                if (
                  !(typeof viewConfig.isShowHoverTip === "function"
                    ? viewConfig.isShowHoverTip()
                    : typeof viewConfig.isShowHoverTip === "boolean"
                      ? viewConfig.isShowHoverTip
                      : true)
                )
                  return false;
                this.intervalInit();
              },
              showAfterCallBack: () => {
                tooltip.toolTip.changeContent(getToolTipContent());
              },
              closeBeforeCallBack: () => {
                if (this.$data.isMove) {
                  this.checkStopDragMove();
                  return false;
                }
              },
              alwaysShow: false,
              position: "top",
              arrowDistance: 10,
            });
            this.$data.tooltip = tooltip;
          },
        };
        PopsPanelSlider.init();
        Reflect.set($li, "data-slider", PopsPanelSlider);
        return {
          $el: $li,
          handler: PopsPanelSlider,
        };
      },
      createSectionContainerItem_input(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        const defaultInputType = "text";
        const inputType = viewConfig.inputType || defaultInputType;
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-input">
          <div class="pops-panel-input_inner">
					  <input type="${inputType}" placeholder="${viewConfig.placeholder ?? ""}">
          </div>
				</div>
				`
        );
        const PopsPanelInput = {
          [Symbol.toStringTag]: "PopsPanelInput",
          $el: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            panelInput: $li.querySelector(".pops-panel-input"),
            panelInputInner: $li.querySelector(".pops-panel-input_inner"),
            input: $li.querySelector("input"),
            suffix: popsDOMUtils.createElement("span"),
            suffixInner: null,
            icon: null,
          },
          $data: {
            value: viewConfig.getValue(),
            isVisible: false,
          },
          init() {
            this.initEle();
            this.setInputValue(this.$data.value);
            if (viewConfig.inputType === "password") {
              this.setCircleIcon(PopsIcon.getIcon("view"));
              this.onIconClick();
            } else if (this.$el.input.value != "" && this.isTextInputType()) {
              this.setCircleIcon(PopsIcon.getIcon("circleClose"));
              this.onIconClick();
            } else this.hideCircleIconWrapper();
            this.onValueChange();
            if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled) this.disable();
            if (typeof viewConfig.handlerCallBack === "function") viewConfig.handlerCallBack($li, this.$el.input);
          },
          initEle() {
            this.$el.input.parentElement.insertBefore(this.$el.suffix, this.$el.input.nextSibling);
            popsDOMUtils.addClassName(this.$el.suffix, "pops-panel-input__suffix");
            PopsSafeUtils.setSafeHTML(
              this.$el.suffix,
              `
						<span class="pops-panel-input__suffix-inner">
							<i class="pops-panel-icon"></i>
						</span>
					`
            );
            this.$el.suffixInner = this.$el.suffix.querySelector(".pops-panel-input__suffix-inner");
            this.$el.icon = this.$el.suffix.querySelector(".pops-panel-icon");
            popsDOMUtils.addClassName(this.$el.panelInput, PopsCommonCSSClassName.userSelectNone);
          },
          isTextInputType() {
            return ["text", "search", "email", "tel", "url"].includes(viewConfig.inputType || defaultInputType);
          },
          isDateInputType() {
            return ["date", "datetime-local", "month", "time", "week"].includes(
              viewConfig.inputType || defaultInputType
            );
          },
          isNumberInputType() {
            return ["number"].includes(viewConfig.inputType || defaultInputType);
          },
          disable() {
            this.$el.input.disabled = true;
            popsDOMUtils.addClassName(this.$el.panelInput, "pops-input-disabled");
            popsDOMUtils.addClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          notDisable() {
            this.$el.input.disabled = false;
            popsDOMUtils.removeClassName(this.$el.panelInput, "pops-input-disabled");
            popsDOMUtils.removeClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          isDisabled() {
            return this.$el.input.disabled;
          },
          setInputValue(value = "") {
            if (typeof value === "number" && this.isNumberInputType()) this.$el.input.valueAsNumber = value;
            else if (typeof value === "object" && value instanceof Date && this.isDateInputType())
              this.$el.input.valueAsDate = value;
            else this.$el.input.value = value.toString();
          },
          setInputType(typeValue = "text") {
            this.$el.input.setAttribute("type", typeValue);
          },
          removeCircleIcon() {
            PopsSafeUtils.setSafeHTML(this.$el.icon, "");
          },
          setCircleIcon(svgHTML = PopsIcon.getIcon("circleClose")) {
            PopsSafeUtils.setSafeHTML(this.$el.icon, svgHTML);
          },
          hideCircleIconWrapper() {
            popsDOMUtils.cssHide(this.$el.suffix, true);
          },
          showCircleIconWrapper() {
            popsDOMUtils.cssShow(this.$el.suffix);
          },
          onIconClick() {
            popsDOMUtils.on(this.$el.icon, "click", (evt) => {
              popsDOMUtils.preventEvent(evt);
              if (this.isDisabled()) return;
              this.removeCircleIcon();
              if (inputType === "password")
                if (this.$data.isVisible) {
                  this.$data.isVisible = false;
                  this.setInputType("text");
                  this.setCircleIcon(PopsIcon.getIcon("hide"));
                } else {
                  this.$data.isVisible = true;
                  this.setInputType("password");
                  this.setCircleIcon(PopsIcon.getIcon("view"));
                }
              else {
                this.setInputValue("");
                this.$el.input.focus();
                this.$el.input.dispatchEvent(new Event("input"));
              }
            });
          },
          onValueChange() {
            popsDOMUtils.on(this.$el.input, ["input", "propertychange"], (event) => {
              this.$data.value = this.$el.input.value;
              if (inputType !== "password") {
                if (this.$el.input.value !== "" && this.$el.icon.innerHTML === "" && this.isTextInputType()) {
                  this.setCircleIcon(PopsIcon.getIcon("circleClose"));
                  this.onIconClick();
                  this.showCircleIconWrapper();
                } else if (this.$el.input.value === "") this.removeCircleIcon();
              }
              if (typeof viewConfig.callback === "function") {
                let ret;
                if (viewConfig.inputType === "number")
                  ret = viewConfig.callback(event, this.$el.input.value, this.$el.input.valueAsNumber);
                else if (this.isDateInputType())
                  ret = viewConfig.callback(
                    event,
                    this.$el.input.value,
                    this.$el.input.valueAsNumber,
                    this.$el.input.valueAsDate
                  );
                else ret = viewConfig.callback(event, this.$el.input.value);
                if (ret)
                  if (ret.valid) this.removeValidErrorMsg();
                  else this.addValidErrorMsg(ret.message);
                else this.removeValidErrorMsg();
              }
            });
          },
          emitValueChange() {
            this.$el.input.dispatchEvent(new Event("input"));
          },
          addValidErrorMsg(msg) {
            if (msg == null) return;
            const $validErrorMsg =
              this.$el.panelInput.querySelector(".pops-panel-input-valid-error") ||
              popsDOMUtils.createElement("div", {
                className: "pops-panel-input-valid-error",
                innerHTML: `<span></span>`,
              });
            const $validErrorMsgSpan = $validErrorMsg.querySelector("span");
            if ($validErrorMsgSpan.innerHTML !== msg) PopsSafeUtils.setSafeHTML($validErrorMsgSpan, msg);
            if (!$validErrorMsg.parentElement) popsDOMUtils.after(this.$el.panelInputInner, $validErrorMsg);
          },
          removeValidErrorMsg() {
            const $validErrorMsg = this.$el.panelInput.querySelector(".pops-panel-input-valid-error");
            popsDOMUtils.remove($validErrorMsg);
          },
        };
        PopsPanelInput.init();
        Reflect.set($li, "data-input", PopsPanelInput);
        return {
          $el: $li,
          handler: PopsPanelInput,
        };
      },
      createSectionContainerItem_textarea(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-textarea">
					<textarea placeholder="${viewConfig.placeholder ?? ""}"></textarea>
				</div>
			`
        );
        const PopsPanelTextArea = {
          [Symbol.toStringTag]: "PopsPanelTextArea",
          $ele: {
            itemLeftTextContainer: $li.querySelector(".pops-panel-item-left-text"),
            panelTextarea: $li.querySelector(".pops-panel-textarea"),
            textarea: $li.querySelector(".pops-panel-textarea textarea"),
          },
          $data: { value: viewConfig.getValue() },
          init() {
            this.setValue(this.$data.value);
            this.onValueChange();
            if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled) this.disable();
          },
          disable() {
            this.$ele.textarea.setAttribute("disabled", "true");
            popsDOMUtils.addClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable");
            popsDOMUtils.addClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          notDisable() {
            this.$ele.textarea.removeAttribute("disabled");
            popsDOMUtils.removeClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable");
            popsDOMUtils.removeClassName(this.$ele.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
          },
          isDisabled() {
            return (
              this.$ele.textarea.hasAttribute("disabled") ||
              popsDOMUtils.containsClassName(this.$ele.panelTextarea, "pops-panel-textarea-disable")
            );
          },
          setValue(value) {
            this.$ele.textarea.value = value;
          },
          onValueChange() {
            popsDOMUtils.on(this.$ele.textarea, ["input", "propertychange"], (event) => {
              const value = this.$ele.textarea.value;
              this.$data.value = value;
              if (typeof viewConfig.callback === "function") viewConfig.callback(event, value);
            });
          },
        };
        PopsPanelTextArea.init();
        Reflect.set($li, "data-textarea", PopsPanelTextArea);
        return {
          $el: $li,
          handler: PopsPanelTextArea,
        };
      },
      createSectionContainerItem_select(viewConfig) {
        const that = this;
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-select">
					<select></select>
				</div>
				`
        );
        const $itemLeftContainer = $li.querySelector(".pops-panel-item-left-text");
        const $container = $li.querySelector(".pops-panel-select");
        const $select = $li.querySelector(".pops-panel-select select");
        const width = (typeof viewConfig.width === "number" ? `${viewConfig.width}px` : viewConfig.width) ?? "200px";
        popsDOMUtils.css($container, "width", width);
        const mode = viewConfig.mode ?? "native";
        let handler;
        if (mode === "native") {
          const PopsPanelSelectNative = {
            [Symbol.toStringTag]: "PopsPanelSelectNative",
            $el: {
              itemLeftTextContainer: $itemLeftContainer,
              $container,
              $select,
            },
            $eleKey: {
              disable: "__disable__",
              value: "__value__",
              viewConfig: "data-view-config",
            },
            $data: {
              data: [],
              defaultValue: viewConfig.getValue(),
            },
            init() {
              this.$el.$container.setAttribute("data-mode", mode);
              this.$data.data = typeof viewConfig.data === "function" ? viewConfig.data() : viewConfig.data;
              popsDOMUtils.addClassName(this.$el.$container, PopsCommonCSSClassName.userSelectNone);
              this.initOption();
              this.onValueChange();
              this.onClick();
              if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled)
                this.disable();
            },
            setNodeValue($ele, key, value) {
              Reflect.set($ele, key, value);
            },
            getNodeValue($ele, key) {
              return Reflect.get($ele, key);
            },
            disable() {
              this.$el.$select.setAttribute("disabled", "true");
              popsDOMUtils.addClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.addClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            notDisable() {
              this.$el.$select.removeAttribute("disabled");
              popsDOMUtils.removeClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.removeClassName(this.$el.itemLeftTextContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            isDisabled() {
              return (
                this.$el.$select.hasAttribute("disabled") ||
                popsDOMUtils.containsClassName(this.$el.$container, "pops-panel-select-disable")
              );
            },
            initOption() {
              this.$data.data.forEach((dataItem) => {
                const optionElement = popsDOMUtils.createElement("option");
                this.setNodeValue(optionElement, this.$eleKey.value, dataItem.value);
                this.setNodeValue(optionElement, this.$eleKey.disable, dataItem.disable);
                this.setNodeValue(optionElement, this.$eleKey.viewConfig, dataItem.views);
                if (dataItem.value === this.$data.defaultValue) this.setOptionSelected(optionElement);
                if (typeof dataItem.text === "function")
                  optionElement.innerText = dataItem.text(dataItem.value, dataItem);
                else optionElement.innerText = dataItem.text;
                this.$el.$select.appendChild(optionElement);
              });
            },
            setOptionSelected($option) {
              $option.setAttribute("selected", "true");
            },
            setSelectOptionsDisableStatus() {
              if (this.$el.$select.options && this.$el.$select.options.length)
                Array.from(this.$el.$select.options).forEach((optionItem) => {
                  this.setOptionDisableStatus(optionItem);
                });
            },
            setOptionDisableStatus($option) {
              let disable = false;
              const optionDisableAttr = this.getNodeValue($option, this.$eleKey.disable);
              if (optionDisableAttr === "function") {
                const value = this.getNodeValue($option, this.$eleKey.value);
                disable = Boolean(optionDisableAttr(value));
              }
              if (disable) $option.setAttribute("disabled", "true");
              else $option.removeAttribute("disabled");
            },
            getSelectOptionInfo($option) {
              return {
                value: this.getNodeValue($option, this.$eleKey.value),
                text: $option.innerText || $option.textContent,
                views: this.getNodeValue($option, this.$eleKey.viewConfig),
                $option,
              };
            },
            onValueChange() {
              popsDOMUtils.on(this.$el.$select, "change", () => {
                const $isSelectedElement = this.$el.$select[this.$el.$select.selectedIndex];
                const selectInfo = this.getSelectOptionInfo($isSelectedElement);
                this.setSelectOptionsDisableStatus();
                if (typeof viewConfig.callback === "function") viewConfig.callback(selectInfo);
                const views = typeof selectInfo.views === "function" ? selectInfo.views() : selectInfo.views;
                if (Array.isArray(views)) {
                  const childUListClassName = "pops-panel-select-child-forms";
                  while ($li.nextElementSibling)
                    if (popsDOMUtils.containsClassName($li.nextElementSibling, childUListClassName))
                      popsDOMUtils.remove($li.nextElementSibling);
                    else break;
                  const $childUList = popsDOMUtils.createElement("ul");
                  $childUList.className = childUListClassName;
                  popsDOMUtils.after($li, $childUList);
                  that.uListContainerAddItem(viewConfig, { ulElement: $childUList });
                }
              });
            },
            onClick() {
              popsDOMUtils.on(this.$el.$select, "click", (event) => {
                this.setSelectOptionsDisableStatus();
                if (typeof viewConfig.clickCallBack === "function") {
                  const $isSelectedElement = this.$el.$select[this.$el.$select.selectedIndex];
                  const selectInfo = this.getSelectOptionInfo($isSelectedElement);
                  viewConfig.clickCallBack(event, selectInfo);
                }
              });
            },
          };
          PopsPanelSelectNative.init();
          Reflect.set($li, "data-select", PopsPanelSelectNative);
          handler = PopsPanelSelectNative;
        } else if (mode === "dialog") {
          const PopsPanelSelect = {
            [Symbol.toStringTag]: "PopsPanelSelect",
            $el: {
              $itemLeftContainer,
              $container: void 0,
              $wrapper: void 0,
              $section: void 0,
              $selectedInputWrapper: void 0,
              $selectedPlaceHolderWrapper: void 0,
              $suffix: void 0,
              $suffixIcon: void 0,
              $selectDialogContainer: void 0,
            },
            $data: {
              data: [],
              defaultValue: viewConfig.getValue(),
              selectedData: void 0,
              isValidSuccess: true,
              rotateKey: "data-show-option",
            },
            init() {
              this.initDefault();
              this.initEl();
              this.initPlaceHolder();
              this.renderSelectText();
              this.onShowSelectDialogClick();
              if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled)
                this.disable();
            },
            initDefault() {
              this.$data.data = typeof viewConfig.data === "function" ? viewConfig.data() : viewConfig.data;
              this.$data.data.forEach((dataItem) => {
                if (this.$data.defaultValue.includes(dataItem.value)) {
                  this.resetCurrentSelectedInfo();
                  this.updateSelectedInfo(dataItem);
                }
              });
            },
            initEl() {
              this.$el.$container = $container;
              this.$el.$container.setAttribute("data-mode", mode);
              PopsSafeUtils.setSafeHTML(
                this.$el.$container,
                `
              <div class="el-select__wrapper">
                <div class="el-select__selection">
                  <!-- 这个是用于手动输入的,这里暂不适配 -->
                  <div class="el-select__selected-item el-select__input-wrapper"></div>
                  <!-- 这个是placeholder -->
                  <div class="el-select__selected-item el-select__placeholder"></div>
                </div>
                <!-- 下拉箭头 -->
                <div class="el-select__suffix">
                  <i class="el-icon el-select__caret el-select__icon">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
                      <path fill="currentColor" d="M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z"></path>
                    </svg>
                  </i>
                </div>
              </div>`
              );
              this.$el.$wrapper = $li.querySelector(".el-select__wrapper");
              this.$el.$section = $li.querySelector(".el-select__selection");
              this.$el.$selectedInputWrapper = $li.querySelector(".el-select__selected-item.el-select__input-wrapper");
              this.$el.$selectedPlaceHolderWrapper = $li.querySelector(
                ".el-select__selected-item.el-select__placeholder"
              );
              this.$el.$suffix = $li.querySelector(".el-select__suffix");
              this.$el.$suffixIcon = $li.querySelector(".el-select__suffix .el-icon");
              this.hideInputWrapper();
            },
            initPlaceHolder() {
              let placeholder = "--请选择--";
              if (typeof viewConfig.placeholder === "string") placeholder = viewConfig.placeholder;
              else if (typeof viewConfig.placeholder === "function") {
                const placeholderResult = viewConfig.placeholder();
                if (typeof placeholderResult === "string") placeholder = placeholderResult;
              }
              this.$el.$section.setAttribute("data-selected-text-align", viewConfig.selectedTextAlign || "left");
              const $placeholder = popsDOMUtils.createElement("span", { innerText: placeholder });
              this.$el.$selectedPlaceHolderWrapper.appendChild($placeholder);
            },
            renderSelectText() {
              let item = this.$data.data.find((dataItem) => {
                return dataItem.value === this.$data.selectedData?.value;
              });
              if (item == null) {
                if (this.$data.selectedData && this.$data.selectedData.addCustomInput) item = this.$data.selectedData;
              }
              if (item != null) {
                const text = typeof item.text === "function" ? item.text(item.value, item) : item.text;
                if (item.isHTML) PopsSafeUtils.setSafeHTML(this.$el.$selectedInputWrapper, text);
                else
                  PopsSafeUtils.setSafeHTML(
                    this.$el.$selectedInputWrapper,
                    `
                  <span>${text}</span>
                `
                  );
                this.showInputWrapper();
                this.hidePlaceHolderWrapper();
              } else {
                this.hideInputWrapper();
                this.showPlaceHolderWrapper();
              }
            },
            disable() {
              popsDOMUtils.addClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.addClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            cancleDisable() {
              popsDOMUtils.removeClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.removeClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            isDisabled() {
              return (
                popsDOMUtils.containsClassName(this.$el.$container, "pops-panel-select-disable") ||
                popsDOMUtils.containsClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled)
              );
            },
            onShowSelectDialogClick() {
              const defaultCSS = PopsCSS.panelComponents_Select;
              popsDOMUtils.on(this.$el.$container, "click", () => {
                if (this.isDisabled()) return;
                const { style, lightStyle, darkStyle, ...userConfirmConfig } =
                  viewConfig.selectConfirmDialogConfig || {};
                const dialogCloseCallback = () => {
                  if (this.$data.selectedData?.addCustomInput && !this.$data.isValidSuccess) return false;
                  else
                    this.getAllSelectItems(false).forEach((it) => {
                      if (!it.data.addCustomInput) return;
                      it.data.value = "";
                      it.data.text = "";
                      this.onValueChangeCallback(it.data);
                    });
                  this.renderSelectText();
                  this.$el.$selectDialogContainer = null;
                  this.$el.$container.removeAttribute(this.$data.rotateKey);
                };
                this.$el.$container.setAttribute(this.$data.rotateKey, String(true));
                const confirmConfig = popsUtils.assign(
                  {
                    title: {
                      text: "请勾选需要选择的选项",
                      position: "center",
                    },
                    content: {
                      text: `<ul class="select-container"></ul>`,
                      html: true,
                    },
                    btn: {
                      ok: { enable: false },
                      close: {
                        enable: true,
                        callback(evtConfig) {
                          const ret = dialogCloseCallback();
                          if (typeof ret === "boolean" && !ret) return;
                          evtConfig.close();
                        },
                      },
                    },
                    mask: {
                      enable: true,
                      clickCallBack(continueExec) {
                        const ret = dialogCloseCallback();
                        if (typeof ret === "boolean" && !ret) return;
                        continueExec();
                      },
                      clickEvent: { toClose: true },
                    },
                    drag: true,
                    dragLimit: true,
                    width: "300px",
                    height: "auto",
                    style: `
                  ${defaultCSS}

                  ${PopsCSS.panelCSS}

								  ${style || ""}
								  `,
                    lightStyle,
                    darkStyle,
                  },
                  userConfirmConfig
                );
                const $selectContainer = PopsAlert.init(confirmConfig).$shadowRoot.querySelector(".select-container");
                this.$data.data.forEach((item) => {
                  if (item.addCustomInput) {
                    const customInputDataOption = item;
                    const $customInputSelecItem = this.createSelectItemElement(customInputDataOption);
                    const context = this;
                    const PanelInput = that.createSectionContainerItem_input({
                      type: "input",
                      text: "",
                      getValue() {
                        return customInputDataOption.value;
                      },
                      callback(evt, value) {
                        customInputDataOption.text = value;
                        customInputDataOption.value = value;
                        if (typeof customInputDataOption.onValid === "function") {
                          const ret = customInputDataOption.onValid(customInputDataOption);
                          context.$data.isValidSuccess = ret.valid;
                          if (ret.valid) PanelInputHandler.removeValidErrorMsg();
                          else {
                            PanelInputHandler.addValidErrorMsg(ret.message);
                            return ret;
                          }
                        }
                        context.updateSelectedInfo(customInputDataOption);
                        context.onValueChangeCallback(customInputDataOption);
                      },
                    });
                    const PanelInputHandler = PanelInput.handler;
                    const $inputContainer = PanelInput.$el.querySelector(".pops-panel-input");
                    PopsSafeUtils.setSafeHTML($customInputSelecItem, "");
                    $customInputSelecItem.appendChild($inputContainer);
                    $selectContainer.appendChild($customInputSelecItem);
                    this.onSelectItemClick(customInputDataOption, $customInputSelecItem);
                  } else {
                    const $select = this.createSelectItemElement(item);
                    $selectContainer.appendChild($select);
                    this.onSelectItemClick(item, $select);
                  }
                });
                this.$el.$selectDialogContainer = $selectContainer;
                this.updateAllSelectItemStatus();
              });
            },
            onValueChangeCallback(data, isUpdateSelectItem = true) {
              isUpdateSelectItem && this.updateAllSelectItemStatus();
              if (typeof viewConfig.callback === "function") viewConfig.callback(data || this.$data.selectedData);
            },
            updateAllSelectItemStatus() {
              this.getAllSelectItems(false).forEach(($selectInfo) => {
                const { data, $select } = $selectInfo;
                this.setSelectItemText(data, $selectInfo.$select);
                if (typeof data.disable === "function" && data.disable(data.value, this.$data.selectedData)) {
                  this.removeItemSelected($select);
                  this.setSelectItemDisabled($select);
                } else this.removeSelectItemDisabled($select);
                if (this.$data.selectedData != null && this.$data.selectedData.value === data.value)
                  this.setItemSelected($select);
                else this.removeItemSelected($select);
              });
            },
            resetAllSelectedItemStatus() {
              const allSelectedItems = this.getAllSelectItems(true);
              if (allSelectedItems.length) this.resetCurrentSelectedInfo();
              allSelectedItems.forEach(($selectInfo) => {
                const { data, $select } = $selectInfo;
                this.setSelectItemText(data, $selectInfo.$select);
                this.removeItemSelected($select);
                this.removeSelectItemDisabled($select);
              });
            },
            setItemSelected($el) {
              if (this.isItemSelected($el)) return;
              popsDOMUtils.addClassName($el, "select-item-is-selected");
            },
            removeItemSelected($el) {
              popsDOMUtils.removeClassName($el, "select-item-is-selected");
            },
            isItemSelected($el) {
              return popsDOMUtils.containsClassName($el, "select-item-is-selected");
            },
            getItemDataOption($el) {
              return Reflect.get($el, "data-info");
            },
            addSelectedItemInfo(data) {
              this.resetCurrentSelectedInfo();
              this.updateSelectedInfo(data);
              this.onValueChangeCallback(data);
            },
            removeSelectedItemInfo() {
              this.updateSelectedInfo();
              this.onValueChangeCallback();
            },
            updateSelectedInfo(data) {
              this.$data.selectedData = void 0;
              if (data) {
                if (data.addCustomInput && data.value.toString() === "") return;
                this.$data.selectedData = data;
              }
            },
            resetCurrentSelectedInfo() {
              this.updateSelectedInfo();
            },
            getAllSelectItems(onlySelected = true) {
              return Array.from(this.$el.$selectDialogContainer?.querySelectorAll(".select-item") ?? [])
                .map(($select) => {
                  const result = {
                    data: this.getItemDataOption($select),
                    $select,
                  };
                  if (onlySelected) {
                    if (this.isItemSelected($select)) return result;
                    return;
                  } else return result;
                })
                .filter((item) => {
                  return item != null;
                });
            },
            createSelectItemElement(data) {
              const $select = popsDOMUtils.createElement("li", {
                className: "select-item",
                innerHTML: `<span class="select-item-text"></span>`,
              });
              this.setSelectItemText(data, $select);
              Reflect.set($select, "data-info", data);
              return $select;
            },
            setSelectItemText(data, $select) {
              const text = typeof data.text === "function" ? data.text(data.value, this.$data.selectedData) : data.text;
              const $selectSpan = $select.querySelector(".select-item-text");
              if (!$selectSpan) return;
              if (data.isHTML) PopsSafeUtils.setSafeHTML($selectSpan, text);
              else $selectSpan.innerText = text;
            },
            setSelectItemDisabled($select) {
              $select.setAttribute("aria-disabled", "true");
              $select.setAttribute("disabled", "true");
            },
            removeSelectItemDisabled($select) {
              $select.removeAttribute("aria-disabled");
              $select.removeAttribute("disabled");
            },
            isSelectItemDisabled($select) {
              return $select.hasAttribute("disabled") || $select.ariaDisabled;
            },
            onSelectItemClick(data, $select) {
              const updateCustomInputStatus = () => {
                this.setItemSelected($select);
                this.addSelectedItemInfo(data);
              };
              popsDOMUtils.on($select, "click", (event) => {
                popsDOMUtils.preventEvent(event);
                const $click = event.target;
                if (data?.addCustomInput && $click instanceof HTMLInputElement) {
                  updateCustomInputStatus();
                  return;
                }
                if (this.isSelectItemDisabled($select)) return;
                if (typeof viewConfig.clickCallBack === "function") {
                  const clickResult = viewConfig.clickCallBack(event, this.$data.selectedData);
                  if (typeof clickResult === "boolean" && !clickResult) return;
                }
                if (data?.addCustomInput) updateCustomInputStatus();
                else if (this.isItemSelected($select)) {
                  this.removeItemSelected($select);
                  this.removeSelectedItemInfo();
                } else {
                  this.setItemSelected($select);
                  this.addSelectedItemInfo(data);
                }
              });
            },
            showInputWrapper() {
              popsDOMUtils.cssShow(this.$el.$selectedInputWrapper);
            },
            hideInputWrapper() {
              popsDOMUtils.cssHide(this.$el.$selectedInputWrapper, true);
            },
            showPlaceHolderWrapper() {
              popsDOMUtils.cssShow(this.$el.$selectedPlaceHolderWrapper);
            },
            hidePlaceHolderWrapper() {
              popsDOMUtils.cssHide(this.$el.$selectedPlaceHolderWrapper, true);
            },
          };
          PopsPanelSelect.init();
          Reflect.set($li, "data-select", PopsPanelSelect);
          handler = PopsPanelSelect;
        } else if (mode === "horizontal") {
          const PopsPanelSelectHorizontal = {
            [Symbol.toStringTag]: "PopsPanelSelectHorizontal",
            $el: {
              $itemLeftContainer,
              $container,
              $wrapper: void 0,
            },
            $data: {
              data: [],
              defaultValue: viewConfig.getValue(),
              selectedData: void 0,
              rotateKey: "data-show-option",
            },
            init() {
              this.initDefault();
              this.initEl();
              if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled)
                this.disable();
            },
            initDefault() {
              this.$data.data = typeof viewConfig.data === "function" ? viewConfig.data() : viewConfig.data;
              if (!this.$data.data.length) throw new Error("PopsPanelSelect: data is empty");
            },
            initEl() {
              this.$el.$container.setAttribute("data-mode", mode);
              PopsSafeUtils.setSafeHTML(
                this.$el.$container,
                `
              <div class="el-select__wrapper">
              </div>`
              );
              this.$el.$wrapper = $li.querySelector(".el-select__wrapper");
              this.$data.data.forEach((dataItem) => {
                const $item = this.createSelectItemElement(dataItem);
                this.onSelectItemClick(dataItem, $item);
                if (this.$data.defaultValue === dataItem.value) this.addSelectedItemInfo(dataItem);
                this.$el.$wrapper.appendChild($item);
              });
              this.updateAllSelectItemStatus();
            },
            disable() {
              popsDOMUtils.addClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.addClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            cancleDisable() {
              popsDOMUtils.removeClassName(this.$el.$container, "pops-panel-select-disable");
              popsDOMUtils.removeClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            },
            isDisabled() {
              return (
                popsDOMUtils.containsClassName(this.$el.$container, "pops-panel-select-disable") ||
                popsDOMUtils.containsClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled)
              );
            },
            createSelectItemElement(data) {
              const $select = popsDOMUtils.createElement("div", {
                className: "select-item",
                innerHTML: `
                <span class="select-item-text"></span>
              `,
              });
              this.setSelectItemText(data, $select);
              Reflect.set($select, "data-info", data);
              return $select;
            },
            setSelectItemText(data, $select) {
              const text = typeof data.text === "function" ? data.text(data.value, this.$data.selectedData) : data.text;
              const $selectSpan = $select.querySelector(".select-item-text");
              if (!$selectSpan) return;
              if (data.isHTML) PopsSafeUtils.setSafeHTML($selectSpan, text);
              else $selectSpan.innerText = text;
            },
            onSelectItemClick(data, $el) {
              popsDOMUtils.on($el, "click", (event) => {
                popsDOMUtils.preventEvent(event);
                if (this.isDisabled()) return;
                if (this.isSelectItemDisabled($el)) return;
                if (typeof viewConfig.clickCallBack === "function") {
                  const clickResult = viewConfig.clickCallBack(event, this.$data.selectedData);
                  if (typeof clickResult === "boolean" && !clickResult) return;
                }
                if (this.isItemSelected($el)) {
                  this.removeItemSelected($el);
                  this.removeSelectedItemInfo();
                } else {
                  this.setItemSelected($el);
                  this.addSelectedItemInfo(data);
                }
              });
            },
            onValueChangeCallback(data, isUpdateSelectItem = true) {
              isUpdateSelectItem && this.updateAllSelectItemStatus();
              if (typeof viewConfig.callback === "function") viewConfig.callback(data || this.$data.selectedData);
            },
            updateAllSelectItemStatus() {
              this.getAllSelectItems(false).forEach(($selectInfo) => {
                const { data, $select } = $selectInfo;
                this.setSelectItemText(data, $selectInfo.$select);
                if (typeof data.disable === "function" && data.disable(data.value, this.$data.selectedData)) {
                  this.removeItemSelected($select);
                  this.setSelectItemDisabled($select);
                } else this.removeSelectItemDisabled($select);
                if (this.$data.selectedData != null && this.$data.selectedData.value === data.value)
                  this.setItemSelected($select);
                else this.removeItemSelected($select);
              });
            },
            resetAllSelectedItemStatus() {
              const allSelectedItems = this.getAllSelectItems(true);
              if (allSelectedItems.length) this.resetCurrentSelectedInfo();
              allSelectedItems.forEach(($selectInfo) => {
                const { data, $select } = $selectInfo;
                this.setSelectItemText(data, $selectInfo.$select);
                this.removeItemSelected($select);
                this.removeSelectItemDisabled($select);
              });
            },
            addSelectedItemInfo(data) {
              this.resetCurrentSelectedInfo();
              this.updateSelectedInfo(data);
              this.onValueChangeCallback(data);
            },
            removeSelectedItemInfo() {
              this.updateSelectedInfo();
              this.onValueChangeCallback();
            },
            updateSelectedInfo(data) {
              this.$data.selectedData = void 0;
              if (data) {
                if (data.addCustomInput && data.value.toString() === "") return;
                this.$data.selectedData = data;
              }
            },
            resetCurrentSelectedInfo() {
              this.updateSelectedInfo();
            },
            setSelectItemDisabled($select) {
              $select.setAttribute("aria-disabled", "true");
              $select.setAttribute("disabled", "true");
            },
            removeSelectItemDisabled($select) {
              $select.removeAttribute("aria-disabled");
              $select.removeAttribute("disabled");
            },
            isSelectItemDisabled($select) {
              return $select.hasAttribute("disabled") || $select.ariaDisabled;
            },
            setItemSelected($select) {
              if (this.isItemSelected($select)) return;
              popsDOMUtils.addClassName($select, "select__selected-item");
            },
            removeItemSelected($select) {
              popsDOMUtils.removeClassName($select, "select__selected-item");
            },
            isItemSelected($select) {
              return popsDOMUtils.containsClassName($select, "select__selected-item");
            },
            getAllSelectItems(onlySelected = true) {
              return Array.from(this.$el.$wrapper?.querySelectorAll(".select-item") ?? [])
                .map(($select) => {
                  const result = {
                    data: this.getItemDataOption($select),
                    $select,
                  };
                  if (onlySelected) {
                    if (this.isItemSelected($select)) return result;
                    return;
                  } else return result;
                })
                .filter((item) => {
                  return item != null;
                });
            },
            getItemDataOption($el) {
              return Reflect.get($el, "data-info");
            },
          };
          PopsPanelSelectHorizontal.init();
          Reflect.set($li, "data-select", PopsPanelSelectHorizontal);
          handler = PopsPanelSelectHorizontal;
        }
        return {
          $el: $li,
          handler,
        };
      },
      createSectionContainerItem_select_multiple(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-select-multiple">
					<div class="el-select__wrapper">
						<div class="el-select__selection">
							<!-- 这个是用于手动输入的,这里暂不适配 -->
							<div class="el-select__selected-item el-select__input-wrapper">
		
							</div>
							<!-- 这个是placeholder -->
							<div class="el-select__selected-item el-select__placeholder">
							</div>
						</div>
						<!-- 下拉箭头 -->
						<div class="el-select__suffix">
							<i class="el-icon el-select__caret el-select__icon">
								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
									<path fill="currentColor" d="M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z"></path>
								</svg>
							</i>
						</div>
					</div>
				</div>
				`
        );
        const PopsPanelSelectMultiple = {
          [Symbol.toStringTag]: "PopsPanelSelectMultiple",
          $el: {
            $itemLeftContainer: $li.querySelector(".pops-panel-item-left-text"),
            $container: void 0,
            $wrapper: void 0,
            $section: void 0,
            $selectedInputWrapper: void 0,
            $selectedPlaceHolderWrapper: void 0,
            $suffix: void 0,
            $suffixIcon: void 0,
            $selectContainer: void 0,
          },
          $data: {
            defaultValue: viewConfig.getValue(),
            selectedDataList: [],
            rotateKey: "data-show-option",
          },
          init() {
            this.initDefault();
            this.inintEl();
            this.initPlaceHolder();
            this.initTagElement();
            this.onShowSelectDialogClick();
            if (typeof viewConfig.disabled === "function" ? viewConfig.disabled() : viewConfig.disabled) this.disable();
          },
          initDefault() {
            viewConfig.data.forEach((dataItem) => {
              if (this.$data.defaultValue.includes(dataItem.value)) this.$data.selectedDataList.push(dataItem);
            });
          },
          inintEl() {
            this.$el.$container = $li.querySelector(".pops-panel-select-multiple");
            this.$el.$wrapper = $li.querySelector(".el-select__wrapper");
            this.$el.$section = $li.querySelector(".el-select__selection");
            this.$el.$selectedInputWrapper = $li.querySelector(".el-select__selected-item.el-select__input-wrapper");
            this.$el.$selectedPlaceHolderWrapper = $li.querySelector(
              ".el-select__selected-item.el-select__placeholder"
            );
            this.$el.$suffix = $li.querySelector(".el-select__suffix");
            this.$el.$suffixIcon = $li.querySelector(".el-select__suffix .el-icon");
            this.hideInputWrapper();
          },
          initPlaceHolder() {
            let placeholder = "";
            if (typeof viewConfig.placeholder === "string") placeholder = viewConfig.placeholder;
            else if (typeof viewConfig.placeholder === "function") {
              const placeholderResult = viewConfig.placeholder();
              if (typeof placeholderResult === "string") placeholder = placeholderResult;
            }
            const $placeholder = popsDOMUtils.createElement("span", { innerText: placeholder });
            this.$el.$selectedPlaceHolderWrapper.appendChild($placeholder);
          },
          initTagElement() {
            viewConfig.data.forEach((dataItem) => {
              if (this.$data.selectedDataList.find((item) => item.value === dataItem.value)) {
                const selectedInfo = this.createTagItem(dataItem);
                this.addTagItem(selectedInfo.$tag);
                this.onSelectItemCloseIconClick({
                  $tag: selectedInfo.$tag,
                  $closeIcon: selectedInfo.$closeIcon,
                  value: dataItem.value,
                  text: dataItem.text,
                });
              }
            });
            this.checkTagEmpty();
          },
          createTagItem(data) {
            const $tag = popsDOMUtils.createElement("div", {
              className: "el-select__selected-item el-select__choose_tag",
              innerHTML: `
						<span class="el-tag is-closable el-tag--info el-tag--default el-tag--light">
							<span class="el-tag__content">
								<span class="el-select__tags-text"></span>
							</span>
							<!-- 关闭tag的图标 -->
							<i class="el-icon el-tag__close">
								<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
									<path fill="currentColor" d="M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"></path>
								</svg>
							</i>
						</span>
						`,
            });
            const $tagText = $tag.querySelector(".el-select__tags-text");
            const $closeIcon = $tag.querySelector(".el-icon.el-tag__close");
            const text = typeof data.text === "function" ? data.text(data, this.$data.selectedDataList) : data.text;
            if (data.isHTML) PopsSafeUtils.setSafeHTML($tagText, text);
            else $tagText.innerText = text;
            return {
              $tag,
              $tagText,
              $closeIcon,
            };
          },
          addTagItem($tag) {
            this.setSectionIsNear();
            if (this.$el.$section.contains(this.$el.$selectedInputWrapper)) {
              const $prev = this.$el.$selectedInputWrapper.previousElementSibling;
              if ($prev) popsDOMUtils.after($prev, $tag);
              else popsDOMUtils.before(this.$el.$selectedInputWrapper, $tag);
            } else if (this.$el.$section.contains(this.$el.$selectedPlaceHolderWrapper)) {
              const $prev = this.$el.$selectedPlaceHolderWrapper.previousElementSibling;
              if ($prev) popsDOMUtils.after($prev, $tag);
              else popsDOMUtils.before(this.$el.$selectedPlaceHolderWrapper, $tag);
            } else this.$el.$section.appendChild($tag);
            this.hideInputWrapper();
            this.hidePlaceHolderWrapper();
          },
          updateTagItem() {
            this.$el.$section.querySelectorAll(".el-select__choose_tag").forEach(($elItem) => {
              popsDOMUtils.remove($elItem);
            });
            this.initTagElement();
          },
          onValueChange(selectedDataList) {
            this.updateAllSelectItems();
            if (typeof viewConfig.callback === "function")
              viewConfig.callback(selectedDataList || this.$data.selectedDataList);
          },
          updateAllSelectItems() {
            this.getAllSelectItemInfo(false).forEach(($selectInfo) => {
              const { data, $select } = $selectInfo;
              this.setSelectItemText(data, $selectInfo.$select);
              if (typeof data.disable === "function" && data.disable(data.value, this.$data.selectedDataList)) {
                this.disableSelectItem($select);
                this.removeSelectedInfo(data, false);
                this.removeItemSelected($select);
              } else this.cancleDisableSelectItem($select);
              if (this.$data.selectedDataList.find((it) => it.value === data.value)) this.setItemSelected($select);
              else this.removeItemSelected($select);
            });
          },
          setItemSelected($select) {
            if (this.isItemSelected($select)) return;
            popsDOMUtils.addClassName($select, "select-item-is-selected");
          },
          removeItemSelected($select) {
            popsDOMUtils.removeClassName($select, "select-item-is-selected");
          },
          isItemSelected($select) {
            return popsDOMUtils.containsClassName($select, "select-item-is-selected");
          },
          addItemSelected(dataList, $select) {
            const info = this.getSelectedItemInfo($select);
            if (!dataList.find((item) => item.value === info.value)) dataList.push(info);
            this.onValueChange(dataList);
          },
          getSelectedItemInfo($select) {
            return Reflect.get($select, "data-info");
          },
          removeSelectedItemInfo(dataList, $select) {
            const info = this.getSelectedItemInfo($select);
            const findIndex = dataList.findIndex((item) => item.value === info.value);
            if (findIndex !== -1) dataList.splice(findIndex, 1);
            this.onValueChange(dataList);
          },
          getAllSelectItemInfo(onlySelected = true) {
            return Array.from(this.$el.$selectContainer?.querySelectorAll(".select-item") ?? [])
              .map(($select) => {
                const result = {
                  data: this.getSelectedItemInfo($select),
                  $select,
                };
                if (onlySelected) {
                  if (this.isItemSelected($select)) return result;
                  return;
                } else return result;
              })
              .filter((item) => {
                return item != null;
              });
          },
          createSelectItemElement(data) {
            const $select = popsDOMUtils.createElement("li", {
              className: "select-item",
              innerHTML: `
							<span class="select-item-text"></span>
						`,
            });
            this.setSelectItemText(data, $select);
            Reflect.set($select, "data-info", data);
            return $select;
          },
          setSelectItemText(data, $select) {
            const text =
              typeof data.text === "function" ? data.text(data.value, this.$data.selectedDataList) : data.text;
            const $selectSpan = $select.querySelector(".select-item-text");
            if (data.isHTML) PopsSafeUtils.setSafeHTML($selectSpan, text);
            else $selectSpan.innerText = text;
          },
          disableSelectItem($select) {
            $select.setAttribute("aria-disabled", "true");
            $select.setAttribute("disabled", "true");
          },
          cancleDisableSelectItem($select) {
            $select.removeAttribute("aria-disabled");
            $select.removeAttribute("disabled");
          },
          isSelectItemDisabled($select) {
            return $select.hasAttribute("disabled") || $select.ariaDisabled;
          },
          onSelectItemClick(dataList, $select) {
            popsDOMUtils.on($select, "click", (event) => {
              popsDOMUtils.preventEvent(event);
              if (this.isSelectItemDisabled($select)) return;
              if (typeof viewConfig.clickCallBack === "function") {
                const allSelectedInfo = this.getAllSelectItemInfo().map((it) => it.data);
                const clickResult = viewConfig.clickCallBack(event, allSelectedInfo);
                if (typeof clickResult === "boolean" && !clickResult) return;
              }
              if (this.isItemSelected($select)) {
                this.removeItemSelected($select);
                this.removeSelectedItemInfo(dataList, $select);
              } else {
                this.setItemSelected($select);
                this.addItemSelected(dataList, $select);
              }
            });
          },
          onShowSelectDialogClick() {
            const defaultCSS = PopsCSS.panelComponents_Select;
            popsDOMUtils.on(this.$el.$container, "click", () => {
              if (this.isDisabled()) return;
              const selectInfo = this.$data.selectedDataList;
              const { style, lightStyle, darkStyle, ...userConfirmConfig } = viewConfig.selectConfirmDialogConfig || {};
              const dialogCloseCallback = () => {
                this.$data.selectedDataList = [...selectInfo];
                this.updateTagItem();
                this.$el.$selectContainer = null;
                this.$el.$container.removeAttribute(this.$data.rotateKey);
              };
              this.$el.$container.setAttribute(this.$data.rotateKey, String(true));
              const confirmConfig = popsUtils.assign(
                {
                  title: {
                    text: "请勾选需要选择的选项",
                    position: "center",
                  },
                  content: {
                    text: `<ul class="select-container"></ul>`,
                    html: true,
                  },
                  btn: {
                    ok: { enable: false },
                    close: {
                      enable: true,
                      callback(evtConfig) {
                        evtConfig.close();
                        dialogCloseCallback();
                      },
                    },
                  },
                  mask: {
                    enable: true,
                    clickCallBack(continueExec) {
                      continueExec();
                      dialogCloseCallback();
                    },
                    clickEvent: { toClose: true },
                  },
                  drag: true,
                  dragLimit: true,
                  width: "300px",
                  height: "auto",
                  style: `
                  ${defaultCSS}

								  ${style || ""}
								`,
                  lightStyle,
                  darkStyle,
                },
                userConfirmConfig
              );
              const $selectContainer = PopsAlert.init(confirmConfig).$shadowRoot.querySelector(".select-container");
              viewConfig.data.forEach((item) => {
                const $select = this.createSelectItemElement(item);
                $selectContainer.appendChild($select);
                this.onSelectItemClick(selectInfo, $select);
              });
              this.$el.$selectContainer = $selectContainer;
              this.updateAllSelectItems();
            });
          },
          onSelectItemCloseIconClick(data) {
            popsDOMUtils.on(
              data.$closeIcon,
              "click",
              (event) => {
                popsDOMUtils.preventEvent(event);
                if (this.isDisabled()) return;
                if (typeof viewConfig.closeIconClickCallBack === "function") {
                  const result = viewConfig.closeIconClickCallBack(event, {
                    $tag: data.$tag,
                    $closeIcon: data.$closeIcon,
                    value: data.value,
                    text: typeof data.text === "function" ? data.text.bind(data) : data.text,
                  });
                  if (typeof result === "boolean" && !result) return;
                }
                this.removeSelectedTagItem(data.$tag);
                this.removeSelectedInfo({
                  value: data.value,
                  text: data.text,
                });
              },
              { capture: true }
            );
          },
          checkTagEmpty() {
            if (!this.$el.$section.querySelectorAll(".el-select__choose_tag").length) {
              this.showPlaceHolderWrapper();
              this.removeSectionIsNear();
            }
          },
          removeSelectedTagItem($tag) {
            popsDOMUtils.remove($tag);
            this.checkTagEmpty();
          },
          removeSelectedInfo(data, emitValueChangeCallBack = true) {
            for (let index = 0; index < this.$data.selectedDataList.length; index++)
              if (this.$data.selectedDataList[index].value === data.value) {
                this.$data.selectedDataList.splice(index, 1);
                break;
              }
            emitValueChangeCallBack && this.onValueChange();
          },
          showInputWrapper() {
            popsDOMUtils.cssShow(this.$el.$selectedInputWrapper);
          },
          hideInputWrapper() {
            popsDOMUtils.cssHide(this.$el.$selectedInputWrapper, true);
          },
          showPlaceHolderWrapper() {
            popsDOMUtils.cssShow(this.$el.$selectedPlaceHolderWrapper);
          },
          hidePlaceHolderWrapper() {
            popsDOMUtils.cssHide(this.$el.$selectedPlaceHolderWrapper, true);
          },
          setSectionIsNear() {
            popsDOMUtils.addClassName(this.$el.$section, "is-near");
          },
          removeSectionIsNear() {
            popsDOMUtils.removeClassName(this.$el.$section, "is-near");
          },
          disable() {
            popsDOMUtils.addClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            popsDOMUtils.addClassName(this.$el.$container, "pops-panel-select-disable");
          },
          isDisabled() {
            return popsDOMUtils.containsClassName(this.$el.$container, "pops-panel-select-disable");
          },
          cancleDisable() {
            popsDOMUtils.removeClassName(this.$el.$itemLeftContainer, PopsCommonCSSClassName.textIsDisabled);
            popsDOMUtils.removeClassName(this.$el.$container, "pops-panel-select-disable");
          },
        };
        PopsPanelSelectMultiple.init();
        Reflect.set($li, "data-select-multiple", PopsPanelSelectMultiple);
        return {
          $el: $li,
          handler: PopsPanelSelectMultiple,
        };
      },
      createSectionContainerItem_button(viewConfig) {
        const $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-button">
					<button class="pops-panel-button_inner" type="button">
						<i class="pops-bottom-icon"></i>
						<span class="pops-panel-button-text"></span>
					</button>
				</div>
				`
        );
        const PopsPanelButton = {
          [Symbol.toStringTag]: "PopsPanelButton",
          $ele: {
            panelButton: $li.querySelector(".pops-panel-button"),
            button: $li.querySelector(".pops-panel-button .pops-panel-button_inner"),
            icon: $li.querySelector(".pops-panel-button .pops-bottom-icon"),
            spanText: $li.querySelector(".pops-panel-button .pops-panel-button-text"),
          },
          $data: {},
          init() {
            this.$ele.panelButton.appendChild(this.$ele.button);
            this.initButton();
            this.onButtonClick();
          },
          initButton() {
            if (typeof viewConfig.buttonIcon === "string" && viewConfig.buttonIcon.trim() !== "") {
              if (PopsIcon.hasIcon(viewConfig.buttonIcon)) this.setIconSVG(PopsIcon.getIcon(viewConfig.buttonIcon));
              else this.setIconSVG(viewConfig.buttonIcon);
              this.showIcon();
            } else this.hideIcon();
            let buttonText = viewConfig.buttonText;
            if (typeof viewConfig.buttonText === "function") buttonText = viewConfig.buttonText();
            this.setButtonType(viewConfig.buttonType);
            if (viewConfig.buttonIsRightIcon) this.setIconRight();
            else this.setIconLeft();
            if (viewConfig.disable) this.disable();
            this.setButtonText(buttonText);
            this.setIconLoadingStatus(viewConfig.buttonIconIsLoading);
          },
          disable() {
            this.$ele.button.setAttribute("disabled", "true");
          },
          notDisable() {
            this.$ele.button.removeAttribute("disabled");
          },
          hideIcon() {
            popsDOMUtils.addClassName(this.$ele.panelButton, "pops-panel-button-no-icon");
          },
          showIcon() {
            popsDOMUtils.removeClassName(this.$ele.panelButton, "pops-panel-button-no-icon");
          },
          setIconSVG(svgHTML) {
            PopsSafeUtils.setSafeHTML(this.$ele.icon, svgHTML);
          },
          setIconLoadingStatus(status) {
            this.$ele.icon.setAttribute("is-loading", Boolean(status).toString());
          },
          setHasIcon(value) {
            this.$ele.button.setAttribute("data-icon", Boolean(value).toString());
          },
          setButtonType(typeValue) {
            this.$ele.button.setAttribute("data-type", typeValue);
          },
          setIconRight() {
            popsDOMUtils.addClassName(this.$ele.button, "pops-panel-button-right-icon");
          },
          setIconLeft() {
            popsDOMUtils.removeClassName(this.$ele.button, "pops-panel-button-right-icon");
          },
          setButtonText(text) {
            PopsSafeUtils.setSafeHTML(this.$ele.spanText, text);
          },
          onButtonClick() {
            popsDOMUtils.on(this.$ele.button, "click", (event) => {
              if (typeof viewConfig.callback === "function") viewConfig.callback(event);
            });
          },
        };
        PopsPanelButton.init();
        Reflect.set($li, "data-button", PopsPanelButton);
        return {
          $el: $li,
          handler: PopsPanelButton,
        };
      },
      createSectionContainerItem_deepMenu(viewConfig) {
        const that = this;
        const $li = popsDOMUtils.createElement("li");
        popsDOMUtils.addClassName($li, "pops-panel-deepMenu-nav-item");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        let leftDescriptionText = "";
        if (viewConfig.description)
          leftDescriptionText = `<p class="pops-panel-item-left-desc-text">${viewConfig.description}</p>`;
        const arrowRightIcon = typeof viewConfig.arrowRightIcon === "boolean" ? viewConfig.arrowRightIcon : true;
        let arrowRightIconHTML = "";
        if (arrowRightIcon)
          arrowRightIconHTML = `<i class="pops-panel-deepMenu-arrowRight-icon">${PopsIcon.getIcon("arrowRight")}</i>`;
        let rightText = "";
        if (viewConfig.rightText) rightText = `<p class="pops-panel-item-right-text">${viewConfig.rightText}</p>`;
        PopsSafeUtils.setSafeHTML(
          $li,
          `
				<div class="pops-panel-item-left-text">
					<p class="pops-panel-item-left-main-text">${viewConfig.text}</p>${leftDescriptionText}</div>
				<div class="pops-panel-deepMenu">${rightText}${arrowRightIconHTML}</div>
				`
        );
        const PopsPanelDeepMenu = {
          [Symbol.toStringTag]: "PopsPanelDeepMenu",
          $ele: {
            get parentSection() {
              return that.$el.$panelContentSectionContainer;
            },
          },
          init() {
            this.onLiClick();
          },
          initContainerItem($container, formItemConfig) {
            const containerViewConfig = formItemConfig;
            if (containerViewConfig.type === "container") {
              const childViewConfig = containerViewConfig["views"];
              const $itemLi = popsDOMUtils.createElement("li");
              const $itemUL = popsDOMUtils.createElement("ul");
              popsDOMUtils.addClassName($itemUL, "pops-panel-forms-container-item-formlist");
              popsDOMUtils.addClassName($itemLi, "pops-panel-forms-container-item");
              const formHeaderDivElement = popsDOMUtils.createElement("div", {
                className: "pops-panel-forms-container-item-header-text",
              });
              PopsSafeUtils.setSafeHTML(formHeaderDivElement, containerViewConfig["text"]);
              if (containerViewConfig.isFold) {
                PopsSafeUtils.setSafeHTML(
                  formHeaderDivElement,
                  `
								<p>${containerViewConfig.text}</p>
								<i class="pops-panel-forms-fold-container-icon">
									<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
										<path d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>
									</svg>
								</i>
							`
                );
                popsDOMUtils.on(formHeaderDivElement, "click", () => {
                  if ($itemLi.hasAttribute("data-fold-enable")) $itemLi.removeAttribute("data-fold-enable");
                  else $itemLi.setAttribute("data-fold-enable", "");
                });
                popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold-container");
                popsDOMUtils.addClassName(formHeaderDivElement, PopsCommonCSSClassName.userSelectNone);
                $itemLi.setAttribute("data-fold-enable", "");
                popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold");
                $itemLi.appendChild(formHeaderDivElement);
              } else $itemLi.appendChild(formHeaderDivElement);
              that.setElementClassName($itemLi, formItemConfig.className);
              that.setElementAttributes($itemLi, formItemConfig.attributes);
              that.setElementProps($itemLi, formItemConfig.props);
              $itemLi.appendChild($itemUL);
              $container.appendChild($itemLi);
              childViewConfig.forEach((childViewConfig) => {
                that.uListContainerAddItem(childViewConfig, {
                  ulElement: $itemUL,
                  sectionContainerULElement: that.sectionContainerULElement,
                  formContainerListElement: $itemLi,
                  formHeaderDivElement,
                });
              });
              if (typeof containerViewConfig.afterAddToUListCallBack === "function")
                containerViewConfig.afterAddToUListCallBack(viewConfig, {
                  target: $itemLi,
                  ulElement: $itemUL,
                  sectionContainerULElement: that.sectionContainerULElement,
                  formContainerListElement: $itemLi,
                  formHeaderDivElement,
                });
            } else that.uListContainerAddItem(viewConfig, { ulElement: that.sectionContainerULElement });
          },
          async gotoDeepMenu(event, liElement) {
            const $currentSection = liElement.closest("section.pops-panel-container");
            const $deepMenuSection = popsDOMUtils.createElement("section", {
              className: "pops-panel-container pops-panel-deepMenu-container",
            });
            Reflect.set($deepMenuSection, that.$data.nodeStoreConfigKey, viewConfig);
            const $deepMenuHeaderUL = popsDOMUtils.createElement("ul", {
              className: "pops-panel-container-header-ul pops-panel-deepMenu-container-header-ul",
            });
            const $deepMenuMain = popsDOMUtils.createElement("ul", { className: "pops-panel-container-main-ul" });
            const headerTitleText = viewConfig.headerTitle ?? viewConfig.text;
            const $header = popsDOMUtils.createElement("li", {
              className: "pops-panel-container-header-title-text pops-panel-deepMenu-container-header",
              innerHTML: `<p class="pops-panel-deepMenu-container-header-title-text">${headerTitleText}</p>`,
            });
            const $headerLeftArrow = popsDOMUtils.createElement("i", {
              className: "pops-panel-deepMenu-container-left-arrow-icon",
              innerHTML: PopsIcon.getIcon("arrowLeft"),
            });
            const switchAnim = PopsAnimation.createSwitchElementWithAnimation($currentSection, $deepMenuSection, {
              useAnimation: that.$config.useDeepMenuSwtichAnimation,
              enterToAddElementCallback: () => {
                popsDOMUtils.on(
                  $headerLeftArrow,
                  "click",
                  async (event) => {
                    popsDOMUtils.preventEvent(event);
                    await switchAnim.exit();
                    that.emitRenderRightContainer($currentSection);
                  },
                  { once: true }
                );
                popsDOMUtils.before($header.firstElementChild, $headerLeftArrow);
                $deepMenuHeaderUL.appendChild($header);
                $deepMenuSection.appendChild($deepMenuHeaderUL);
                $deepMenuSection.appendChild($deepMenuMain);
                if (viewConfig.views && Array.isArray(viewConfig.views))
                  for (let index = 0; index < viewConfig.views.length; index++) {
                    const formItemConfig = viewConfig.views[index];
                    this.initContainerItem($deepMenuMain, formItemConfig);
                  }
                that.$el.$panelRightSectionWrapper.appendChild($deepMenuSection);
              },
            });
            await switchAnim.enter();
            if (typeof viewConfig.afterEnterDeepMenuCallBack === "function")
              viewConfig.afterEnterDeepMenuCallBack(viewConfig, {
                $sectionContainer: $deepMenuSection,
                $sectionContainerHeaderContainer: $deepMenuHeaderUL,
                $sectionContainerHeader: $header,
                $sectionBodyContainer: $deepMenuMain,
              });
            that.emitRenderRightContainer($deepMenuSection);
          },
          onLiClick() {
            popsDOMUtils.on($li, "click", async (event) => {
              if (typeof viewConfig.clickCallBack === "function") {
                if (await viewConfig.clickCallBack(event, viewConfig)) return;
              }
              await this.gotoDeepMenu(event, $li);
            });
          },
        };
        PopsPanelDeepMenu.init();
        Reflect.set($li, "data-deepMenu", PopsPanelDeepMenu);
        return {
          $el: $li,
          handler: PopsPanelDeepMenu,
        };
      },
      createSectionContainerItem_own(viewConfig) {
        let $li = popsDOMUtils.createElement("li");
        Reflect.set($li, this.$data.nodeStoreConfigKey, viewConfig);
        this.setElementClassName($li, viewConfig.className);
        this.setElementAttributes($li, viewConfig.attributes);
        this.setElementProps($li, viewConfig.props);
        $li = viewConfig.createLIElement($li);
        return { $el: $li };
      },
      createSectionContainerItem(viewConfig) {
        const componentType = viewConfig.type;
        if (componentType === "switch") return this.createSectionContainerItem_switch(viewConfig);
        else if (componentType === "slider") return this.createSectionContainerItem_slider(viewConfig);
        else if (componentType === "input") return this.createSectionContainerItem_input(viewConfig);
        else if (componentType === "textarea") return this.createSectionContainerItem_textarea(viewConfig);
        else if (componentType === "select") return this.createSectionContainerItem_select(viewConfig);
        else if (componentType === "select-multiple")
          return this.createSectionContainerItem_select_multiple(viewConfig);
        else if (componentType === "button") return this.createSectionContainerItem_button(viewConfig);
        else if (componentType === "deepMenu") return this.createSectionContainerItem_deepMenu(viewConfig);
        else if (componentType === "own") return this.createSectionContainerItem_own(viewConfig);
        else console.error("尚未实现的type类型", viewConfig);
      },
      createSectionContainerItem_forms(viewConfig) {
        const that = this;
        const containerConfig = viewConfig;
        if (containerConfig.type === "container") {
          const childForms = viewConfig["views"];
          const formContainerListElement = popsDOMUtils.createElement("li");
          const formContainerULElement = popsDOMUtils.createElement("ul");
          popsDOMUtils.addClassName(formContainerListElement, "pops-panel-forms-container-item");
          popsDOMUtils.addClassName(formContainerULElement, "pops-panel-forms-container-item-formlist");
          const formHeaderDivElement = popsDOMUtils.createElement("div", {
            className: "pops-panel-forms-container-item-header-text",
          });
          PopsSafeUtils.setSafeHTML(formHeaderDivElement, containerConfig["text"]);
          if (containerConfig.isFold) {
            PopsSafeUtils.setSafeHTML(
              formHeaderDivElement,
              `
						<p>${containerConfig.text}</p>
						<i class="pops-panel-forms-fold-container-icon">
							<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
								<path d="M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"></path>
							</svg>
						</i>
					`
            );
            popsDOMUtils.on(formHeaderDivElement, "click", () => {
              if (formContainerListElement.hasAttribute("data-fold-enable"))
                formContainerListElement.removeAttribute("data-fold-enable");
              else formContainerListElement.setAttribute("data-fold-enable", "");
            });
            popsDOMUtils.addClassName(formHeaderDivElement, "pops-panel-forms-fold-container");
            popsDOMUtils.addClassName(formHeaderDivElement, PopsCommonCSSClassName.userSelectNone);
            formContainerListElement.setAttribute("data-fold-enable", "");
            popsDOMUtils.addClassName(formContainerListElement, "pops-panel-forms-fold");
            formContainerListElement.appendChild(formHeaderDivElement);
          } else formContainerListElement.appendChild(formHeaderDivElement);
          that.setElementClassName(formContainerListElement, viewConfig.className);
          that.setElementAttributes(formContainerListElement, viewConfig.attributes);
          that.setElementProps(formContainerListElement, viewConfig.props);
          childForms.forEach((childViewConfig) => {
            that.uListContainerAddItem(childViewConfig, {
              ulElement: formContainerULElement,
              sectionContainerULElement: that.sectionContainerULElement,
              formContainerListElement,
              formHeaderDivElement,
            });
          });
          formContainerListElement.appendChild(formContainerULElement);
          that.sectionContainerULElement.appendChild(formContainerListElement);
          if (typeof containerConfig.afterAddToUListCallBack === "function")
            containerConfig.afterAddToUListCallBack(containerConfig, {
              target: formContainerListElement,
              ulElement: formContainerULElement,
              sectionContainerULElement: that.sectionContainerULElement,
              formContainerListElement,
              formHeaderDivElement,
            });
        } else that.uListContainerAddItem(viewConfig, { ulElement: that.sectionContainerULElement });
      },
      emitRenderRightContainer($container) {
        const dataViewConfig = Reflect.get($container, this.$data.nodeStoreConfigKey);
        this.emitter.emit("pops:renderRightContainer", { viewConfig: dataViewConfig });
      },
      uListContainerAddItem(viewConfig, containerOptions) {
        const itemInfo = this.createSectionContainerItem(viewConfig);
        if (itemInfo) containerOptions["ulElement"].appendChild(itemInfo.$el);
        if (typeof viewConfig.afterAddToUListCallBack === "function")
          viewConfig.afterAddToUListCallBack(viewConfig, {
            ...containerOptions,
            target: itemInfo?.$el,
          });
      },
      onAsideItemClick($asideItem, asideConfig) {
        popsDOMUtils.on($asideItem, "click", async (event) => {
          if (typeof asideConfig.clickFirstCallback === "function") {
            const clickFirstCallbackResult = await asideConfig.clickFirstCallback(
              event,
              this.sectionContainerHeaderULElement,
              this.sectionContainerULElement
            );
            if (typeof clickFirstCallbackResult === "boolean" && !clickFirstCallbackResult) return;
          }
          this.clearContainer();
          const rightContainerViewConfig = Reflect.get($asideItem, "__forms__");
          Reflect.set(this.$el.$panelContentSectionContainer, this.$data.nodeStoreConfigKey, rightContainerViewConfig);
          popsDOMUtils.cssShow(this.$el.$panelContentSectionContainer);
          this.clearAsideItemIsVisited();
          this.setAsideItemIsVisited($asideItem);
          const title = typeof asideConfig.title === "function" ? asideConfig.title() : asideConfig.title;
          let headerTitleText =
            typeof asideConfig.headerTitle === "function" ? asideConfig.headerTitle() : asideConfig.headerTitle;
          headerTitleText = headerTitleText ?? title;
          if (typeof headerTitleText === "string" && headerTitleText.trim() !== "") {
            const $containerHeaderTitle = popsDOMUtils.createElement("li");
            popsDOMUtils.addClassName($containerHeaderTitle, "pops-panel-container-header-title-text");
            Reflect.set($containerHeaderTitle, "__asideConfig__", asideConfig);
            PopsSafeUtils.setSafeHTML($containerHeaderTitle, headerTitleText);
            this.sectionContainerHeaderULElement.appendChild($containerHeaderTitle);
          }
          rightContainerViewConfig.forEach((viewConfig) => {
            this.createSectionContainerItem_forms(viewConfig);
          });
          if (typeof asideConfig.clickCallback === "function") {
            const asideClickCallbackResult = await asideConfig.clickCallback(
              event,
              this.sectionContainerHeaderULElement,
              this.sectionContainerULElement
            );
            if (typeof asideClickCallbackResult === "boolean" && !asideClickCallbackResult) return;
          }
          this.emitRenderRightContainer(this.$el.$panelContentSectionContainer);
        });
      },
    };
  };
  var PopsPanel = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "panel";
      let config = PopsPanelDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "panelCSS",
          css: PopsCSS.panelCSS,
        },
      ]);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
			<div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
			<div class="pops-content pops-${popsType}-content">
				<aside class="pops-${popsType}-aside pops-user-select-none">
					<ul class="pops-${popsType}-aside-top-container"></ul>
					<ul class="pops-${popsType}-aside-bottom-container"></ul>
				</aside>
				<div class="pops-${popsType}-section-wrapper">
					<section class="pops-${popsType}-container">
						<ul class="pops-${popsType}-container-header-ul"></ul>
						<ul class="pops-${popsType}-container-main-ul"></ul>
					</section>
				</div>
			</div>
      <div class="pops-${popsType}-bottom-wrapper">
        <section class="pops-${popsType}-bottom-container">
          <ul class="pops-${popsType}-bottom-left-container"></ul>
          <ul class="pops-${popsType}-bottom-right-container"></ul>
        </section>
      </div>
      `,
        "",
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $headerBtnClose,
        $title,
        $content,
        $panelRightSectionWrapper,
        $panelLeftAside,
        $panelContentSectionContainer,
        $panelBottomWrapper,
        $panelBottomContainer,
        $panelBottomLeftContainer,
        $panelBottomRightContainer,
      } = PopsHandler.handleQueryElement($anim, popsType);
      if (config.isMobile || popsUtils.isPhone()) popsDOMUtils.addClassName($pops, config.mobileClassName);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      PopsHandler.handleClickEvent("close", $headerBtnClose, evtConfig, config.btn?.close?.callback);
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) $anim.after($mask);
      PanelHandlerComponents().init({
        config,
        $el: {
          $pops,
          $content,
          $panelRightSectionWrapper,
          $panelLeftAside,
          $panelContentSectionContainer,
          $panelBottomWrapper,
          $panelBottomContainer,
          $panelBottomLeftContainer,
          $panelBottomRightContainer,
        },
        emitter,
      });
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      if (config.listenEscapeKeyUpToExitDeepMenu) {
        const escapeListener = popsDOMUtils.onKeyup(
          globalThis,
          (evt) => {
            if (evt.key === "Escape" && !evt.ctrlKey && !evt.shiftKey && !evt.altKey && !evt.metaKey) {
              const $exitBtn = $panelRightSectionWrapper.querySelector(
                ".pops-panel-deepMenu-container-left-arrow-icon"
              );
              if ($exitBtn) $exitBtn.click();
            }
          },
          { capture: true }
        );
        emitter.on("pops:before-destory", () => {
          escapeListener?.off();
        });
      }
      return result;
    },
  };
  var PopsPromptDefaultConfig = () => {
    return {
      title: {
        text: "默认标题",
        position: "left",
        html: false,
        style: "",
      },
      content: {
        text: "",
        select: false,
        password: false,
        row: false,
        focus: true,
        placeholder: "默认提示",
        style: "",
      },
      btn: {
        merge: false,
        mergeReverse: false,
        reverse: false,
        position: "flex-end",
        ok: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "确定",
          type: "success",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        cancel: {
          enable: true,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "关闭",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        other: {
          enable: false,
          size: void 0,
          icon: void 0,
          rightIcon: false,
          iconIsLoading: false,
          text: "其它按钮",
          type: "default",
          callback(eventConfig) {
            eventConfig.close();
          },
        },
        close: {
          enable: true,
          callback(eventConfig) {
            eventConfig.close();
          },
        },
      },
      useShadowRoot: true,
      class: "",
      only: false,
      width: window.innerWidth < 550 ? "88vw" : "350px",
      height: window.innerHeight < 450 ? "70vh" : "200px",
      position: "center",
      animation: "pops-anim-fadein-zoom",
      zIndex: 1e4,
      mask: {
        enable: false,
        clickEvent: {
          toClose: false,
          toHide: false,
        },
        clickCallBack: null,
      },
      drag: false,
      dragLimit: true,
      dragExtraDistance: 3,
      dragMoveCallBack() {},
      dragEndCallBack() {},
      forbiddenScroll: false,
      style: null,
      lightStyle: null,
      darkStyle: null,
      stopKeyDownEventPropagation: true,
      emitter: null,
    };
  };
  var PopsPrompt = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "prompt";
      let config = PopsPromptDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "ninePalaceGridPosition",
          css: PopsCSS.ninePalaceGridPosition,
        },
        {
          name: "scrollbar",
          css: PopsCSS.scrollbar,
        },
        {
          name: "button",
          css: PopsCSS.button,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "promptCSS",
          css: PopsCSS.promptCSS,
        },
      ]);
      const zIndex = PopsHandler.getTargerOrFunctionValue(config.zIndex);
      const maskHTML = PopsElementHandler.createMask(guid, zIndex);
      const headerBtnHTML = PopsElementHandler.createHeader(popsType, config);
      const bottomBtnHTML = PopsElementHandler.createBottom(popsType, config);
      const { headerStyle, headerPStyle } = PopsElementHandler.createHeaderStyle(popsType, config);
      const { contentPStyle } = PopsElementHandler.createContentStyle(popsType, config);
      const animHTML = PopsElementHandler.createAnim(
        guid,
        popsType,
        config,
        `
            <div class="pops-title pops-${popsType}-title" style="text-align: ${config.title.position};${headerStyle}">${config.title.html ? config.title.text : `<p pops class="pops-${popsType}-title-text" style="${headerPStyle}">${config.title.text}</p>`}${headerBtnHTML}</div>
            <div class="pops-content pops-${popsType}-content" style="${contentPStyle}">${config.content.row ? '<textarea name="pops-input-text" pops="" placeholder="' + config.content.placeholder + '"></textarea>' : '<input name="pops-input-text" pops="" placeholder="' + config.content.placeholder + '" type="' + (config.content.password ? "password" : "text") + '">'}</div>${bottomBtnHTML}`,
        bottomBtnHTML,
        zIndex
      );
      const $anim = PopsElementHandler.parseElement(animHTML);
      const {
        $pops,
        $input,
        $headerBtnClose: $btnClose,
        $btnOk,
        $btnCancel,
        $btnOther,
        $title,
      } = PopsHandler.handleQueryElement($anim, popsType);
      let $mask = void 0;
      const $elList = [$anim];
      if (config.mask.enable) {
        $mask = PopsHandler.handleMask({
          type: popsType,
          guid,
          config,
          animElement: $anim,
          maskHTML,
        }).maskElement;
        $elList.push($mask);
      }
      const evtConfig = PopsHandler.handleEventConfig(
        config,
        guid,
        $shadowContainer,
        $shadowRoot,
        popsType,
        $anim,
        $pops,
        emitter,
        $mask
      );
      const result = PopsHandler.handleResultConfig(evtConfig);
      $input.value = config.content.text;
      PopsHandler.handlePromptClickEvent("close", $input, $btnClose, evtConfig, config.btn.close.callback);
      PopsHandler.handlePromptClickEvent("ok", $input, $btnOk, evtConfig, config.btn.ok.callback);
      PopsHandler.handlePromptClickEvent("cancel", $input, $btnCancel, evtConfig, config.btn.cancel.callback);
      PopsHandler.handlePromptClickEvent("other", $input, $btnOther, evtConfig, config.btn.other.callback);
      popsDOMUtils.append($shadowRoot, $elList);
      emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
      popsDOMUtils.appendBody($shadowContainer);
      if ($mask != null) $anim.after($mask);
      PopsHandler.handlePush(popsType, {
        guid,
        $anim,
        $pops,
        $mask,
        $shadowContainer,
        $shadowRoot,
        config,
        emitter,
      });
      if (config.drag)
        PopsInstHandler.drag($pops, {
          dragElement: $title,
          limit: config.dragLimit,
          extraDistance: config.dragExtraDistance,
          moveCallBack: config.dragMoveCallBack,
          endCallBack: config.dragEndCallBack,
        });
      if (config.content.focus) $input.focus();
      if (config.content.select) $input.select();
      return result;
    },
  };
  var PopsRightClickMenuDefaultConfig = () => {
    return {
      $target: document.documentElement,
      targetSelector: null,
      position: "fixed",
      data: [
        {
          icon: PopsIcon.getIcon("search"),
          iconIsLoading: false,
          text: "搜索",
          item: [],
          callback(clickEvent, contextMenuEvent, $li) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
          },
        },
        {
          icon: PopsIcon.getIcon("documentCopy"),
          iconIsLoading: false,
          text: "复制",
          item: [],
          callback(clickEvent, contextMenuEvent, $li) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
          },
        },
        {
          icon: PopsIcon.getIcon("delete"),
          text: "删除",
          iconIsLoading: false,
          item: [],
          callback(clickEvent, contextMenuEvent, $li) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
          },
        },
        {
          icon: PopsIcon.getIcon("loading"),
          iconIsLoading: true,
          text: "加载",
          item: [],
          callback(clickEvent, contextMenuEvent, $li) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
            return false;
          },
        },
        {
          icon: PopsIcon.getIcon("elemePlus"),
          iconIsLoading: true,
          text: "饿了么",
          callback(clickEvent, contextMenuEvent, $li) {
            console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
            return false;
          },
          item: [
            {
              icon: "",
              iconIsLoading: false,
              text: "处理文件",
              item: [],
              callback(clickEvent, contextMenuEvent, $li) {
                console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
              },
            },
            {
              icon: "",
              iconIsLoading: false,
              text: "其它处理",
              callback(clickEvent, contextMenuEvent, $li) {
                console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
                return false;
              },
              item: [
                {
                  icon: PopsIcon.getIcon("view"),
                  iconIsLoading: false,
                  text: "查看",
                  item: [],
                  callback(clickEvent, contextMenuEvent, $li) {
                    console.log("点击:" + this.text, [clickEvent, contextMenuEvent, $li]);
                  },
                },
              ],
            },
          ],
        },
      ],
      chileMenuLeftOrRightDistance: 0,
      childMenuTopOrBottomDistance: 0,
      useShadowRoot: true,
      className: "",
      isAnimation: false,
      useScaleAnimation: true,
      only: false,
      zIndex: 1e4,
      preventDefault: true,
      style: null,
      lightStyle: null,
      darkStyle: null,
      limitPositionXInView: true,
      limitPositionYInView: true,
      beforeShowCallBack() {},
      emitter: null,
    };
  };
  var PopsRightClickMenu = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "rightClickMenu";
      let config = PopsRightClickMenuDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      config = PopsHandler.handleOnly(popsType, config);
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
        {
          name: "rightClickMenu",
          css: PopsCSS.rightClickMenu,
        },
      ]);
      PopsElementHandler.addStyle($shadowRoot, config.style);
      PopsElementHandler.addLightStyle($shadowRoot, config.lightStyle);
      PopsElementHandler.addDarkStyle($shadowRoot, config.darkStyle);
      const PopsContextMenu = {
        $data: { menuDataKey: "data-menu" },
        $el: { $root: null },
        windowCheckClickEvent(event) {
          if (!PopsContextMenu.$el.$root) return;
          const $click = event.target;
          if ($click.closest(`.pops-${popsType}`)) return;
          if ($click.className && $click.className === "pops-shadow-container" && $click.shadowRoot != null) {
            PopsContextMenu.shadowRootCheckClickEvent(event);
            return;
          }
          PopsContextMenu.closeAllMenu(PopsContextMenu.$el.$root);
        },
        shadowRootCheckClickEvent(event) {
          if (!PopsContextMenu.$el.$root) return;
          if (event.composedPath()[0].closest(`.pops-${popsType}`)) return;
          PopsContextMenu.closeAllMenu(PopsContextMenu.$el.$root);
        },
        addWindowCheckClickListener() {
          popsDOMUtils.on(globalThis, "click touchstart", PopsContextMenu.windowCheckClickEvent, { capture: true });
          if (config.$target instanceof Node) {
            const $shadowRoot = config.$target.getRootNode();
            if ($shadowRoot instanceof ShadowRoot)
              popsDOMUtils.on($shadowRoot, "click touchstart", PopsContextMenu.shadowRootCheckClickEvent, {
                capture: true,
              });
          }
        },
        removeWindowCheckClickListener() {
          popsDOMUtils.off(globalThis, "click touchstart", PopsContextMenu.windowCheckClickEvent, { capture: true });
          if (config.$target instanceof Node) {
            const $shadowRoot = config.$target.getRootNode();
            if ($shadowRoot instanceof ShadowRoot)
              popsDOMUtils.off($shadowRoot, "click touchstart", PopsContextMenu.windowCheckClickEvent, {
                capture: true,
              });
          }
        },
        async contextMenuEvent(event, selectorTarget) {
          if (config.preventDefault) popsDOMUtils.preventEvent(event);
          PopsHandler.handleOnly(popsType, config);
          if (PopsContextMenu.$el.$root) PopsContextMenu.closeAllMenu(PopsContextMenu.$el.$root);
          selectorTarget = selectorTarget ?? config.$target;
          const beforeShowCallBackResult = await config?.beforeShowCallBack(event);
          if (typeof beforeShowCallBackResult === "boolean" && !beforeShowCallBackResult) return;
          const rootElement = PopsContextMenu.showMenu(event, config.data, selectorTarget);
          PopsContextMenu.$el.$root = rootElement;
          if (config.only) {
            PopsHandler.handlePush(popsType, {
              $shadowRoot,
              $shadowContainer,
              guid,
              $anim: rootElement,
              $pops: rootElement,
              config,
              emitter,
            });
            emitter.on("pops:before-destory", () => {
              PopsContextMenu.closeAllMenu(rootElement);
            });
            emitter.on("pops:destory", () => {
              PopsContextMenu.closeAllMenu(rootElement);
            });
          }
        },
        addContextMenuEvent(target, selector) {
          popsDOMUtils.on(target, "contextmenu", selector, PopsContextMenu.contextMenuEvent);
        },
        removeContextMenuEvent(target, selector) {
          popsDOMUtils.off(target, "contextmenu", selector, PopsContextMenu.contextMenuEvent);
        },
        animationCloseMenu($menu) {
          const transitionEndEvent = (event) => {
            popsDOMUtils.off($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, { capture: true });
            popsDOMUtils.remove($menu);
          };
          if (popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-show`)) {
            popsDOMUtils.on($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, { capture: true });
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-show`);
          } else if (
            popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-scale`) &&
            popsDOMUtils.containsClassName($menu, `pops-${popsType}-anim-scale-open`)
          ) {
            popsDOMUtils.on($menu, popsDOMUtils.getTransitionEndNameList(), transitionEndEvent, { capture: true });
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-scale-open`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-not-open`);
          } else popsDOMUtils.remove($menu);
        },
        closeAllMenu($root) {
          if ($root == null) return;
          const rootElementMenuData = Reflect.get($root, PopsContextMenu.$data.menuDataKey);
          if (rootElementMenuData?.root) $root = rootElementMenuData.root;
          rootElementMenuData.child.forEach((childMenuElement) => {
            this.animationCloseMenu(childMenuElement);
          });
          this.animationCloseMenu($root);
          PopsContextMenu.$el.$root = null;
        },
        createMenuContainerElement(isChildren) {
          const $menu = popsDOMUtils.createElement(
            "div",
            {
              className: `pops-${popsType}`,
              innerHTML: `<ul class="pops-${popsType}-wrapper"></ul>`,
            },
            { "data-position": config.position }
          );
          const zIndex = this.getMenuZIndex();
          if (zIndex > 1e4) $menu.style.zIndex = zIndex.toString();
          if (isChildren) $menu.setAttribute("is-children", "true");
          if (config.isAnimation) popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-grid`);
          if (config.useScaleAnimation) {
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-not-open`);
          }
          return $menu;
        },
        getMenuZIndex() {
          return PopsHandler.getTargerOrFunctionValue(config.zIndex);
        },
        getOffset($menu, mousePosition, parentInfo) {
          const result = {
            top: 0,
            right: 0,
            bottom: 0,
            left: 0,
          };
          const menuElementWidth = popsDOMUtils.width($menu);
          const menuElementHeight = popsDOMUtils.height($menu);
          const limitDistance = 1;
          let maxPageLeftOffset = popsDOMUtils.width(globalThis) - limitDistance;
          let maxPageTopOffset = popsDOMUtils.height(globalThis) - limitDistance;
          if (config.position === "absolute") {
            maxPageLeftOffset += globalThis.scrollX;
            maxPageTopOffset += globalThis.scrollY;
          }
          const maxLeftOffset = maxPageLeftOffset - menuElementWidth;
          const maxTopOffset = maxPageTopOffset - menuElementHeight;
          const chileMenuLeftOrRightDistance = config.chileMenuLeftOrRightDistance;
          const childMenuTopOrBottomDistance = config.childMenuTopOrBottomDistance;
          let currentLeftOffset = mousePosition.x;
          let currentTopOffset = mousePosition.y;
          currentLeftOffset = currentLeftOffset < 0 ? 0 : currentLeftOffset;
          currentTopOffset = currentTopOffset < 0 ? 0 : currentTopOffset;
          if (config.limitPositionXInView && currentLeftOffset + chileMenuLeftOrRightDistance >= maxLeftOffset) {
            if (parentInfo) {
              const mainMenuOffset = popsDOMUtils.offset(parentInfo.$menu);
              currentLeftOffset =
                maxPageLeftOffset - mainMenuOffset.left - chileMenuLeftOrRightDistance + limitDistance;
            } else currentLeftOffset = limitDistance + chileMenuLeftOrRightDistance;
            if (currentLeftOffset < 0) currentLeftOffset = 0;
            else if (currentLeftOffset > maxLeftOffset) currentLeftOffset = maxLeftOffset;
            result.right = currentLeftOffset;
            Reflect.deleteProperty(result, "left");
          } else {
            currentLeftOffset = currentLeftOffset + chileMenuLeftOrRightDistance;
            result.left = currentLeftOffset;
            Reflect.deleteProperty(result, "right");
          }
          if (config.limitPositionYInView && currentTopOffset + childMenuTopOrBottomDistance >= maxTopOffset) {
            if (parentInfo) {
              const parentItemOffset = popsDOMUtils.offset(parentInfo.$parentItem, false);
              currentTopOffset =
                maxPageTopOffset - parentItemOffset.bottom - childMenuTopOrBottomDistance + limitDistance;
            } else currentTopOffset = limitDistance + childMenuTopOrBottomDistance;
            if (currentTopOffset < 0) currentTopOffset = limitDistance;
            else if (currentTopOffset > maxTopOffset) currentTopOffset = maxTopOffset;
            result.bottom = currentTopOffset;
            Reflect.deleteProperty(result, "top");
          } else {
            currentTopOffset = currentTopOffset + childMenuTopOrBottomDistance;
            result.top = currentTopOffset;
            Reflect.deleteProperty(result, "bottom");
          }
          return result;
        },
        showMenu(menuEvent, dataConfig, $listenerRootNode) {
          const menuElement = this.createMenuContainerElement(false);
          Reflect.set(menuElement, PopsContextMenu.$data.menuDataKey, { child: [] });
          PopsContextMenu.addMenuLiELement(menuEvent, menuElement, menuElement, dataConfig, $listenerRootNode);
          popsDOMUtils.append($shadowRoot, menuElement);
          if (!document.contains($shadowContainer)) {
            emitter.emit("pops:before-append-to-page", $shadowRoot, $shadowContainer);
            popsDOMUtils.appendBody($shadowContainer);
          }
          this.handlerShowMenuCSS(menuElement, menuEvent);
          return menuElement;
        },
        showClildMenu(menuEvent, posInfo, dataConfig, $root, $targetLi, $listenerRootNode) {
          const menuElement = this.createMenuContainerElement(true);
          Reflect.set(menuElement, PopsContextMenu.$data.menuDataKey, {
            parent: $targetLi,
            root: $root,
          });
          Reflect.get($root, PopsContextMenu.$data.menuDataKey).child.push(menuElement);
          PopsContextMenu.addMenuLiELement(menuEvent, $root, menuElement, dataConfig, $listenerRootNode);
          popsDOMUtils.append($shadowRoot, menuElement);
          const $parentMenu = $targetLi.closest(".pops-rightClickMenu");
          this.handlerShowMenuCSS(menuElement, posInfo, {
            $menu: $parentMenu,
            $parentItem: $targetLi,
          });
          return menuElement;
        },
        handlerShowMenuCSS($menu, posInfo, parentInfo) {
          const offset = this.getOffset(
            $menu,
            {
              x: posInfo.clientX,
              y: posInfo.clientY,
            },
            parentInfo
          );
          popsDOMUtils.css($menu, { ...offset });
          if (config.isAnimation) popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-show`);
          if (config.useScaleAnimation) {
            popsDOMUtils.removeClassName($menu, `pops-${popsType}-anim-scale-not-open`);
            popsDOMUtils.addClassName($menu, `pops-${popsType}-anim-scale-open`);
          }
        },
        addMenuLiELement(menuEvent, $root, $menu, dataConfig, $listenerRootNode) {
          const menuEventTarget = menuEvent.target;
          const menuULElement = $menu.querySelector("ul");
          dataConfig.forEach((item) => {
            const menuLiElement = popsDOMUtils.parseTextToDOM(`<li></li>`);
            if (typeof item.icon === "string" && item.icon.trim() !== "") {
              const iconSVGHTML = PopsIcon.getIcon(item.icon) ?? item.icon;
              const iconElement = popsDOMUtils.parseTextToDOM(
                `<i class="pops-${popsType}-icon" is-loading="${item.iconIsLoading ?? false}">${iconSVGHTML}</i>`
              );
              menuLiElement.appendChild(iconElement);
            }
            const text = typeof item.text === "function" ? item.text() : item.text;
            menuLiElement.insertAdjacentHTML("beforeend", PopsSafeUtils.getSafeHTML(`<span>${text}</span>`));
            if (item.item && Array.isArray(item.item))
              popsDOMUtils.addClassName(menuLiElement, `pops-${popsType}-item`);
            let isEmitTouchEvent = false;
            function liElementHoverEvent(event) {
              if (event.type === "touchstart") isEmitTouchEvent = true;
              if (isEmitTouchEvent && event.type === "mouseenter") return;
              Array.from(menuULElement.children).forEach((liElement) => {
                popsDOMUtils.removeClassName(liElement, `pops-${popsType}-is-visited`);
                const li_menuData = Reflect.get(liElement, PopsContextMenu.$data.menuDataKey);
                if (!li_menuData) return;
                function removeElement($el) {
                  if (!$el) return;
                  $el.querySelectorAll("ul li").forEach(($ele) => {
                    const menuData = Reflect.get($ele, PopsContextMenu.$data.menuDataKey);
                    if (menuData?.child) removeElement(menuData.child);
                  });
                  popsDOMUtils.remove($el);
                }
                removeElement(li_menuData.child);
              });
              const root_menuData = Reflect.get($root, PopsContextMenu.$data.menuDataKey);
              for (let index = 0; index < root_menuData.child.length; index++) {
                const element = root_menuData.child[index];
                if (!$shadowRoot.contains(element)) {
                  root_menuData.child.splice(index, 1);
                  index--;
                }
              }
              popsDOMUtils.addClassName(menuLiElement, `pops-${popsType}-is-visited`);
              if (!item.item) return;
              const rect = menuLiElement.getBoundingClientRect();
              const childMenu = PopsContextMenu.showClildMenu(
                menuEvent,
                {
                  clientX: rect.left + popsDOMUtils.outerWidth(menuLiElement),
                  clientY: rect.top,
                },
                item.item,
                $root,
                menuLiElement,
                $listenerRootNode
              );
              Reflect.set(menuLiElement, PopsContextMenu.$data.menuDataKey, { child: childMenu });
            }
            async function liElementClickEvent(clickEvent) {
              if (typeof item.callback === "function") {
                try {
                  OriginPrototype$1.Object.defineProperty(menuEvent, "target", {
                    get() {
                      return menuEventTarget;
                    },
                  });
                } catch {}
                const callbackResult = await item.callback(clickEvent, menuEvent, menuLiElement, $listenerRootNode);
                if (typeof callbackResult === "boolean" && callbackResult == false) return;
              }
              Array.from(menuULElement.children).forEach((liEle) => {
                popsDOMUtils.off(liEle, "mouseenter touchstart");
              });
              PopsContextMenu.closeAllMenu($root);
            }
            popsDOMUtils.on(menuLiElement, "mouseenter touchstart", liElementHoverEvent);
            popsDOMUtils.on(menuLiElement, "click", liElementClickEvent);
            menuULElement.appendChild(menuLiElement);
          });
        },
      };
      PopsContextMenu.addContextMenuEvent(config.$target, config.targetSelector);
      PopsContextMenu.addWindowCheckClickListener();
      return {
        guid,
        config,
        addWindowCheckClickListener: PopsContextMenu.addWindowCheckClickListener,
        removeWindowCheckClickListener: PopsContextMenu.removeWindowCheckClickListener,
        addContextMenuEvent: PopsContextMenu.addContextMenuEvent,
        removeContextMenuEvent: PopsContextMenu.removeContextMenuEvent,
        removeInitEventListener: {
          contextMenu() {
            PopsContextMenu.removeContextMenuEvent(config.$target, config.targetSelector);
          },
          windowClick() {
            PopsContextMenu.removeWindowCheckClickListener();
          },
        },
        PopsContextMenu,
      };
    },
  };
  var PopsSearchSuggestionDefaultConfig = () => {
    const data = [];
    for (let index = 0; index < 10; index++)
      data.push({
        value: `测试${index}`,
        enableDeleteButton: true,
        deleteButtonClickCallback(event, $dataItem, dataItem, config) {
          const value = dataItem.value;
          console.log("删除当前项:" + value, [event, $dataItem, dataItem, config]);
          return true;
        },
        itemView(dateItem) {
          return `${dateItem.value}-html`;
        },
        clickCallback(event, $dataItem, dataItem, config) {
          const isUpdateInputValue = index % 2 === 0 ? true : false;
          const value = dataItem.value;
          if (isUpdateInputValue)
            console.log("item项的点击回调,更新input内的值:" + value, [event, $dataItem, dataItem, config, value]);
          else console.log("item项的点击回调:" + value, [event, $dataItem, dataItem, config, value]);
          return isUpdateInputValue;
        },
        selectCallback(event, $dataItem, dataItem, config) {
          const value = dataItem.value;
          console.log("item项的选中回调:" + value, [event, $dataItem, dataItem, config]);
        },
      });
    return {
      $target: null,
      $inputTarget: null,
      $selfDocument: document,
      data,
      useShadowRoot: true,
      className: "",
      isAbsolute: true,
      isAnimation: false,
      useFoldAnimation: true,
      useArrow: false,
      width: "250px",
      maxHeight: "300px",
      followTargetWidth: true,
      topDistance: 0,
      position: "auto",
      positionTopToReverse: true,
      zIndex: 1e4,
      searchingTip: "正在搜索中...",
      toSearhNotResultHTML: '<li data-none="true">暂无其它数据</li>',
      toHideWithNotResult: false,
      followPosition: "target",
      async inputTargetChangeRefreshShowDataCallback(value, data) {
        console.log("当前输入框的值是:", value);
        return data.filter((it) => it.value.includes(value));
      },
      style: "",
      lightStyle: null,
      darkStyle: null,
      emitter: null,
    };
  };
  var PopsSearchSuggestion = {
    init(__config__) {
      const guid = popsUtils.getRandomGUID();
      const popsType = "searchSuggestion";
      let config = PopsSearchSuggestionDefaultConfig();
      config = popsUtils.assign(config, GlobalConfig.getGlobalConfig());
      config = popsUtils.assign(config, __config__);
      if (config.$inputTarget == null) config.$inputTarget = config.$target;
      const emitter = config.emitter ?? new EventEmiter(popsType);
      const { $shadowContainer, $shadowRoot } = PopsHandler.handlerShadow(config);
      PopsHandler.handleInit($shadowRoot, [
        {
          name: "index",
          css: PopsCSS.index,
        },
        {
          name: "anim",
          css: PopsCSS.anim,
        },
        {
          name: "common",
          css: PopsCSS.common,
        },
        {
          name: "skeleton",
          css: PopsCSS.skeletonCSS,
        },
      ]);
      PopsElementHandler.addStyle($shadowRoot, config.style);
      PopsElementHandler.addLightStyle($shadowRoot, config.lightStyle);
      PopsElementHandler.addDarkStyle($shadowRoot, config.darkStyle);
      const defaultListenerOption = {
        capture: true,
        passive: true,
      };
      const SearchSuggestion = {
        emitter,
        selfDocument: config.$selfDocument,
        $el: {
          root: null,
          $dropdownWrapper: null,
          $dropdownContainer: null,
          $arrow: null,
          $dynamicCSS: null,
        },
        $evt: { offInputChangeEvtHandler: [] },
        $data: {
          isEmpty: true,
          storeNodeHandlerKey: "data-SearchSuggestion",
        },
        init($parent = document.body || document.documentElement) {
          SearchSuggestion.initEl();
          SearchSuggestion.update(SearchSuggestion.getData());
          SearchSuggestion.updateStyleSheet();
          SearchSuggestion.hide();
          $shadowRoot.appendChild(SearchSuggestion.$el.root);
          $parent.appendChild($shadowContainer);
        },
        initEl() {
          SearchSuggestion.$el.root = SearchSuggestion.createSearchSelectElement();
          Reflect.set(SearchSuggestion.$el.root, this.$data.storeNodeHandlerKey, SearchSuggestion);
          SearchSuggestion.$el.$dynamicCSS = SearchSuggestion.$el.root.querySelector("style[data-dynamic]");
          SearchSuggestion.$el.$dropdownWrapper = SearchSuggestion.$el.root.querySelector(
            `.pops-${popsType}-search-suggestion-dropdown-wrapper`
          );
          SearchSuggestion.$el.$dropdownContainer = SearchSuggestion.$el.root.querySelector(
            `ul.pops-${popsType}-search-suggestion-dropdown-container`
          );
          SearchSuggestion.$el.$arrow = SearchSuggestion.$el.root.querySelector(
            `.pops-${popsType}-search-suggestion-arrow`
          );
        },
        getData() {
          return typeof config.data === "function" ? config.data() : config.data;
        },
        setData(data) {
          config.data = data;
        },
        createSearchSelectElement() {
          const $el = popsDOMUtils.createElement(
            "div",
            {
              className: `pops pops-${popsType}-search-suggestion`,
              innerHTML: `
						<style type="text/css">
							.pops-${popsType}-animation{
								-moz-animation: searchSelectFalIn 0.5s 1 linear;
								-webkit-animation: searchSelectFalIn 0.5s 1 linear;
								-o-animation: searchSelectFalIn 0.5s 1 linear;
								-ms-animation: searchSelectFalIn 0.5s 1 linear;
							}
						</style>
						<style type="text/css">
							.pops-${popsType}-search-suggestion-arrow{
								--suggestion-arrow-box-shadow-left-color: rgba(0, 0, 0, 0.24);
								--suggestion-arrow-box-shadow-right-color: rgba(0, 0, 0, 0.12);
								--suggestion-arrow--after-color: rgb(78, 78, 78);
								--suggestion-arrow--after-bg-color: rgb(255, 255, 255, var(--pops-bg-opacity));
								--suggestion-arrow--after-width: 10px;
								--suggestion-arrow--after-height: 10px;
							}
							.pops-${popsType}-search-suggestion-arrow{
								position: absolute;
								top: 100%;
								left: 50%;
								overflow: hidden;
								width: 100%;
								height: 12.5px;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 0;
								left: 50%;
								width: var(--suggestion-arrow--after-width);
								height: var(--suggestion-arrow--after-height);
								background: var(--suggestion-arrow--after-bg-color);
								color: var(--suggestion-arrow--after-color);
								box-shadow:
									0 1px 7px var(--suggestion-arrow-box-shadow-left-color),
									0 1px 7px var(--suggestion-arrow-box-shadow-right-color);
								content: "";
								transform: translateX(-50%) translateY(-50%) rotate(45deg);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="top"] .pops-${popsType}-search-suggestion-arrow{
								position: absolute;
								top: 100%;
								left: 50%;
								overflow: hidden;
								width: 100%;
								height: 12.5px;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="top"] .pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 0;
								left: 50%;
								width: var(--suggestion-arrow--after-width);
								height: var(--suggestion-arrow--after-height);
								background: var(--suggestion-arrow--after-bg-color);
								box-shadow:
									0 1px 7px var(--suggestion-arrow-box-shadow-left-color),
									0 1px 7px var(--suggestion-arrow-box-shadow-right-color);
								content: "";
								transform: translateX(-50%) translateY(-50%) rotate(45deg);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="bottom"] .pops-${popsType}-search-suggestion-arrow{
								top: -12.5px;
								left: 50%;
								transform: translateX(-50%);
							}
							.pops-${popsType}-search-suggestion[data-popper-placement^="bottom"] .pops-${popsType}-search-suggestion-arrow::after{
								position: absolute;
								top: 100%;
								left: 50%;
								content: "";
							}
						</style>
						<style type="text/css" data-dynamic="true">
							${SearchSuggestion.getDynamicCSS()}
						</style>
						<style>
							.el-zoom-in-top-animation{
								--el-transition-md-fade: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1),
									opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1);
								transition: var(--el-transition-md-fade);
								transform-origin: center top;
							}
							.el-zoom-in-top-animation[data-popper-placement^="top"] {
								transform-origin: center bottom;
							}
							.el-zoom-in-top-animation-hide{
								opacity: 0;
								transform: scaleY(0);
							}
							.el-zoom-in-top-animation-show{
								opacity: 1;
								transform: scaleY(1);
							}
						</style>
						<style type="text/css" data-user-css>
							${config.style || ""}
						</style>
            <div class="pops-${popsType}-search-suggestion-dropdown-wrapper">
              <ul class="pops-${popsType}-search-suggestion-dropdown-container ${PopsCommonCSSClassName.userSelectNone}">${config.toSearhNotResultHTML}</ul>
            </div>
            <!-- 箭头 -->
						${config.useArrow ? `<div class="pops-${popsType}-search-suggestion-arrow"></div>` : ""}
         				 `,
            },
            {
              "data-guid": guid,
              "type-value": popsType,
            }
          );
          if (config.className !== "" && config.className != null) popsDOMUtils.addClassName($el, config.className);
          if (config.isAnimation) popsDOMUtils.addClassName($el, `pops-${popsType}-animation`);
          if (config.useFoldAnimation) popsDOMUtils.addClassName($el, "el-zoom-in-top-animation");
          return $el;
        },
        getDynamicCSS() {
          return `
				.pops-${popsType}-search-suggestion{
					--search-suggestion-bg-color: #ffffff;
					--search-suggestion-box-shadow-color: rgb(0 0 0 / 20%);
					--search-suggestion-item-color: #515a6e;
					--search-suggestion-item-none-color: #8e8e8e;
					--search-suggestion-item-is-hover-bg-color: #f5f7fa;
					--search-suggestion-item-is-select-bg-color: #409eff;
				}
				.pops-${popsType}-search-suggestion{
					border: initial;
					overflow: initial;
					position: ${config.isAbsolute ? "absolute" : "fixed"};
					z-index: ${PopsHandler.getTargerOrFunctionValue(config.zIndex)};
				}
        .pops-${popsType}-search-suggestion-dropdown-wrapper{
					max-height: ${config.maxHeight};
					border-radius: 4px;
					box-shadow: 0 1px 6px var(--search-suggestion-box-shadow-color);
					background-color: var(--search-suggestion-bg-color);
					padding: 5px 0;
					overflow-x: hidden;
					overflow-y: auto;
        }
				.pops-${popsType}-search-suggestion-dropdown-wrapper ul.pops-${popsType}-search-suggestion-dropdown-container{
					box-sizing: border-box;
				}
				// 建议框在上面时
				.pops-${popsType}-search-suggestion[data-top-reverse] ul.pops-${popsType}-search-suggestion-dropdown-container{
					display: flex;
					flex-direction: column-reverse;
				}
				.pops-${popsType}-search-suggestion[data-top-reverse] ul.pops-${popsType}-search-suggestion-dropdown-container li{
					flex-shrink: 0;
				}
				ul.pops-${popsType}-search-suggestion-dropdown-container li{
					padding: 7px;
					margin: 0;
					clear: both;
					color: var(--search-suggestion-item-color);
					font-size: 14px;
					list-style: none;
					cursor: pointer;
					transition: background .2s ease-in-out;
					overflow: hidden;
					text-overflow: ellipsis;
					width: 100%;
				}
				ul.pops-${popsType}-search-suggestion-dropdown-container li[data-none]{
					text-align: center;
					font-size: 12px;
					color: var(--search-suggestion-item-none-color);
				}
				ul.pops-${popsType}-search-suggestion-dropdown-container li:not([data-none]):hover{
					background-color: var(--search-suggestion-item-is-hover-bg-color);
				}
				@media (prefers-color-scheme: dark){
					.pops-${popsType}-search-suggestion{
						--search-suggestion-bg-color: #1d1e1f;
						--search-suggestion-item-color: #cfd3d4;
						--search-suggestion-item-is-hover-bg-color: rgba(175, 175, 175, .1);
					}
				}
				`;
        },
        getItemDataValue(data) {
          return data;
        },
        createSearchItemLiElement(dataItem, dateItemIndex) {
          const dataValue = SearchSuggestion.getItemDataValue(dataItem);
          const $li = popsDOMUtils.createElement("li", {
            className: `pops-${popsType}-search-suggestion-dropdown-item`,
            "data-index": dateItemIndex,
            "data-value": dataValue,
          });
          Reflect.set($li, "data-index", dateItemIndex);
          Reflect.set($li, "data-value", dataValue);
          const $itemInner = dataItem.itemView(dataItem, $li, config);
          if (typeof $itemInner === "string") PopsSafeUtils.setSafeHTML($li, $itemInner);
          else popsDOMUtils.append($li, $itemInner);
          const enableDeleteButton = dataItem.enableDeleteButton;
          if (typeof enableDeleteButton === "boolean" && enableDeleteButton) {
            const $deleteIcon = SearchSuggestion.createItemDeleteIcon();
            popsDOMUtils.append($li, $deleteIcon);
          }
          popsDOMUtils.addClassName($li, PopsCommonCSSClassName.flexCenter);
          popsDOMUtils.addClassName($li, PopsCommonCSSClassName.flexYCenter);
          return $li;
        },
        setSearchItemClickEvent($searchItem) {
          popsDOMUtils.on(
            $searchItem,
            "click",
            async (event) => {
              popsDOMUtils.preventEvent(event);
              const $click = event.target;
              const data = SearchSuggestion.getData();
              const dataItem = Reflect.get($searchItem, "data-value");
              if (Boolean($click.closest(`.pops-${popsType}-delete-icon`))) {
                if (typeof dataItem.deleteButtonClickCallback === "function") {
                  const result = await dataItem.deleteButtonClickCallback(event, $searchItem, dataItem, config);
                  if (typeof result === "boolean" && result) {
                    data.splice(data.indexOf(dataItem), 1);
                    popsDOMUtils.remove($searchItem);
                  }
                }
                if (!SearchSuggestion.$el.$dropdownContainer.children.length) SearchSuggestion.clear();
                SearchSuggestion.updateStyleSheet();
              } else if (typeof dataItem.clickCallback === "function") {
                const result = await dataItem.clickCallback(event, $searchItem, dataItem, config);
                if (typeof result === "boolean" && result) {
                  if (
                    config.$inputTarget instanceof HTMLInputElement ||
                    config.$inputTarget instanceof HTMLTextAreaElement
                  )
                    config.$inputTarget.value = String(dataItem.value);
                }
              }
            },
            { capture: true }
          );
        },
        setSearchItemSelectEvent($li) {},
        setInputChangeEvent(option = defaultListenerOption) {
          if (!(config.$inputTarget instanceof HTMLInputElement || config.$inputTarget instanceof HTMLTextAreaElement))
            return;
          config.$inputTarget.setAttribute("autocomplete", "off");
          const listenerHandler = popsDOMUtils.onInput(
            config.$inputTarget,
            async () => {
              const data = SearchSuggestion.getData();
              const queryDataResult = await config.inputTargetChangeRefreshShowDataCallback(
                config.$inputTarget.value,
                data,
                config
              );
              SearchSuggestion.update(queryDataResult);
              SearchSuggestion.updateStyleSheet();
            },
            option
          );
          SearchSuggestion.$evt.offInputChangeEvtHandler.push(listenerHandler.off);
        },
        removeInputChangeEvent() {
          for (let index = 0; index < SearchSuggestion.$evt.offInputChangeEvtHandler.length; index++) {
            const handler = SearchSuggestion.$evt.offInputChangeEvtHandler[index];
            handler();
            SearchSuggestion.$evt.offInputChangeEvtHandler.splice(index, 1);
            index--;
          }
        },
        showEvent() {
          SearchSuggestion.updateStyleSheet();
          if (config.toHideWithNotResult)
            if (SearchSuggestion.$data.isEmpty) SearchSuggestion.hide(true);
            else SearchSuggestion.show();
          else SearchSuggestion.show();
        },
        setShowEvent(option = defaultListenerOption) {
          if (config.followPosition === "target")
            popsDOMUtils.on([config.$target], ["focus", "click"], SearchSuggestion.showEvent, option);
          else if (config.followPosition === "input")
            popsDOMUtils.on([config.$inputTarget], ["focus", "click"], SearchSuggestion.showEvent, option);
          else if (config.followPosition === "inputCursor")
            popsDOMUtils.on([config.$inputTarget], ["focus", "click", "input"], SearchSuggestion.showEvent, option);
          else throw new Error("未知followPosition:" + config.followPosition);
        },
        removeShowEvent(option = defaultListenerOption) {
          popsDOMUtils.off(
            [config.$target, config.$inputTarget],
            ["focus", "click"],
            SearchSuggestion.showEvent,
            option
          );
          popsDOMUtils.off([config.$inputTarget], ["input"], SearchSuggestion.showEvent, option);
        },
        hideEvent(event) {
          if (event.target instanceof Node) {
            if ($shadowContainer.contains(event.target)) return;
            if (config.$target.contains(event.target)) return;
            if (config.$inputTarget.contains(event.target)) return;
            SearchSuggestion.hide(true);
          }
        },
        setHideEvent(option = defaultListenerOption) {
          if (Array.isArray(SearchSuggestion.selfDocument))
            SearchSuggestion.selfDocument.forEach(($checkParent) => {
              popsDOMUtils.on($checkParent, ["click", "touchstart"], SearchSuggestion.hideEvent, option);
            });
          else
            popsDOMUtils.on(SearchSuggestion.selfDocument, ["click", "touchstart"], SearchSuggestion.hideEvent, option);
        },
        removeHideEvent(option = defaultListenerOption) {
          if (Array.isArray(SearchSuggestion.selfDocument))
            SearchSuggestion.selfDocument.forEach(($checkParent) => {
              popsDOMUtils.off($checkParent, ["click", "touchstart"], SearchSuggestion.hideEvent, option);
            });
          else
            popsDOMUtils.off(
              SearchSuggestion.selfDocument,
              ["click", "touchstart"],
              SearchSuggestion.hideEvent,
              option
            );
        },
        setAllEvent(option = defaultListenerOption) {
          SearchSuggestion.setInputChangeEvent(option);
          SearchSuggestion.setHideEvent(option);
          SearchSuggestion.setShowEvent(option);
        },
        removeAllEvent(option = defaultListenerOption) {
          SearchSuggestion.removeInputChangeEvent();
          SearchSuggestion.removeHideEvent(option);
          SearchSuggestion.removeShowEvent(option);
        },
        createItemDeleteIcon(size = 16, fill = "#bababa") {
          return popsDOMUtils.parseTextToDOM(`
					<svg class="pops-${popsType}-delete-icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" fill="${fill}">
						<path d="M512 883.2A371.2 371.2 0 1 0 140.8 512 371.2 371.2 0 0 0 512 883.2z m0 64a435.2 435.2 0 1 1 435.2-435.2 435.2 435.2 0 0 1-435.2 435.2z"></path>
						<path d="M557.056 512l122.368 122.368a31.744 31.744 0 1 1-45.056 45.056L512 557.056l-122.368 122.368a31.744 31.744 0 1 1-45.056-45.056L466.944 512 344.576 389.632a31.744 31.744 0 1 1 45.056-45.056L512 466.944l122.368-122.368a31.744 31.744 0 1 1 45.056 45.056z"></path>
					</svg>
        			`);
        },
        setPromptsInSearch() {
          const $isSearching = popsDOMUtils.createElement("li", {
            className: `pops-${popsType}-search-suggestion-dropdown-searching-item`,
            innerHTML: config.searchingTip,
          });
          SearchSuggestion.addItem($isSearching);
        },
        removePromptsInSearch() {
          popsDOMUtils.remove(
            SearchSuggestion.$el.$dropdownContainer.querySelector(
              `li.pops-${popsType}-search-suggestion-dropdown-searching-item`
            )
          );
        },
        changeHintULElementPosition(target = config.$target ?? config.$inputTarget, checkPositonAgain = true) {
          let targetRect = null;
          if (config.followPosition === "inputCursor")
            targetRect = popsDOMUtils.getTextBoundingRect(
              config.$inputTarget,
              config.$inputTarget.selectionStart || 0,
              config.$inputTarget.selectionEnd || 0,
              false
            );
          else targetRect = config.isAbsolute ? popsDOMUtils.offset(target) : target.getBoundingClientRect();
          if (targetRect == null) return;
          let documentHeight = document.documentElement.clientHeight;
          if (config.isAbsolute) documentHeight = popsDOMUtils.height(document);
          const documentWidth = popsDOMUtils.width(document);
          const arrowHeight = config.useArrow ? popsDOMUtils.height(SearchSuggestion.$el.$arrow) : 0;
          let position = config.position;
          if (config.position === "auto")
            if (
              targetRect.bottom + (popsDOMUtils.height(SearchSuggestion.$el.$dropdownWrapper) + arrowHeight) >
              documentHeight
            )
              position = "top";
            else position = "bottom";
          if (position === "top") {
            if (config.positionTopToReverse) SearchSuggestion.$el.root.setAttribute("data-top-reverse", "true");
            if (config.useFoldAnimation) SearchSuggestion.$el.root.setAttribute("data-popper-placement", "top");
            const bottom = documentHeight - targetRect.top + config.topDistance + arrowHeight;
            SearchSuggestion.$el.root.style.top = "";
            SearchSuggestion.$el.root.style.bottom = bottom + "px";
          } else if (position === "bottom") {
            if (config.useFoldAnimation)
              SearchSuggestion.$el.root.setAttribute("data-popper-placement", "bottom-center");
            const top = targetRect.height + targetRect.top + config.topDistance + arrowHeight;
            SearchSuggestion.$el.root.removeAttribute("data-top-reverse");
            SearchSuggestion.$el.root.style.bottom = "";
            SearchSuggestion.$el.root.style.top = top + "px";
          }
          let left = targetRect.left;
          const hintUIWidth = popsDOMUtils.width(SearchSuggestion.$el.$dropdownWrapper);
          if (hintUIWidth > documentWidth) left = left + documentWidth - hintUIWidth;
          SearchSuggestion.$el.root.style.left = left + "px";
          if (checkPositonAgain) SearchSuggestion.changeHintULElementPosition(target, !checkPositonAgain);
        },
        changeHintULElementWidth(target = config.$target ?? config.$inputTarget) {
          const targetRect = target.getBoundingClientRect();
          if (config.followTargetWidth) SearchSuggestion.$el.$dropdownWrapper.style.width = targetRect.width + "px";
          else SearchSuggestion.$el.$dropdownWrapper.style.width = config.width;
        },
        updateDynamicCSS() {
          const cssText = SearchSuggestion.getDynamicCSS();
          PopsSafeUtils.setSafeHTML(SearchSuggestion.$el.$dynamicCSS, cssText);
        },
        updateStyleSheet() {
          SearchSuggestion.updateDynamicCSS();
          SearchSuggestion.changeHintULElementWidth();
          SearchSuggestion.changeHintULElementPosition();
        },
        addItem($item) {
          SearchSuggestion.$el.$dropdownContainer.appendChild($item);
        },
        update(updateData = []) {
          if (!Array.isArray(updateData)) throw new TypeError("传入的数据不是数组");
          const data = updateData;
          if (data.length) {
            SearchSuggestion.$data.isEmpty = false;
            if (config.toHideWithNotResult) SearchSuggestion.show();
            SearchSuggestion.clear(true);
            const fragment = document.createDocumentFragment();
            data.forEach((item, index) => {
              const $item = SearchSuggestion.createSearchItemLiElement(item, index);
              SearchSuggestion.setSearchItemClickEvent($item);
              SearchSuggestion.setSearchItemSelectEvent($item);
              fragment.appendChild($item);
            });
            SearchSuggestion.addItem(fragment);
          } else SearchSuggestion.clear();
        },
        clear(onlyClearView = false) {
          PopsSafeUtils.setSafeHTML(SearchSuggestion.$el.$dropdownContainer, "");
          if (onlyClearView) return;
          SearchSuggestion.$data.isEmpty = true;
          let $noResult;
          if (typeof config.toSearhNotResultHTML === "string")
            $noResult = popsDOMUtils.parseTextToDOM(config.toSearhNotResultHTML);
          else $noResult = config.toSearhNotResultHTML();
          SearchSuggestion.addItem($noResult);
          if (config.toHideWithNotResult) SearchSuggestion.hide();
        },
        hide(useAnimationToHide = false) {
          if (config.useFoldAnimation) {
            if (!useAnimationToHide)
              popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-hide");
            popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-show");
          } else SearchSuggestion.$el.root.style.display = "none";
        },
        show() {
          SearchSuggestion.$el.root.style.display = "";
          if (config.useFoldAnimation) {
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation");
            popsDOMUtils.removeClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-hide");
            popsDOMUtils.addClassName(SearchSuggestion.$el.root, "el-zoom-in-top-animation-show");
          }
        },
      };
      return SearchSuggestion;
    },
  };
  var pops = new (class Pops {
    config = {
      version: version$1,
      cssText: PopsCSS,
      iconSVG: PopsIcon.$data,
      animation: PopsAnimation.$data,
      instData: PopsInstData,
    };
    fn = {
      Utils: popsUtils,
      DOMUtils: popsDOMUtils,
      InstanceUtils: PopsInstanceUtils,
      MathFloatUtils: PopsMathFloatUtils,
      InstHandler: PopsInstHandler,
      PanelHandlerComponents,
      Animation: PopsAnimation,
      EventEmiter,
      CommonCSSClassName: PopsCommonCSSClassName,
    };
    noConflict() {
      if (typeof PopsCore.globalThis.pops === "object") popsUtils.delete(PopsCore.globalThis, "pops");
      if (typeof unsafeWindow === "object" && unsafeWindow != null && typeof unsafeWindow.pops === "object")
        popsUtils.delete(unsafeWindow, "pops");
      return new Pops();
    }
    isPhone(userAgent) {
      return popsUtils.isPhone(userAgent);
    }
    GlobalConfig = GlobalConfig;
    alert = (config) => {
      return PopsAlert.init(config);
    };
    confirm = (config) => {
      return PopsConfirm.init(config);
    };
    prompt = (config) => {
      return PopsPrompt.init(config);
    };
    loading = (config) => {
      return PopsLoading.init(config);
    };
    iframe = (config) => {
      return PopsIframe.init(config);
    };
    tooltip = (config) => {
      return PopsTooltip.init(config);
    };
    drawer = (config) => {
      return PopsDrawer.init(config);
    };
    folder = (config) => {
      return PopsFolder.init(config);
    };
    panel = (config) => {
      return PopsPanel.init(config);
    };
    rightClickMenu = (config) => {
      return PopsRightClickMenu.init(config);
    };
    searchSuggestion = (config) => {
      return PopsSearchSuggestion.init(config);
    };
  })();
  var createCache = (lastNumberWeakMap) => {
    return (collection, nextNumber) => {
      lastNumberWeakMap.set(collection, nextNumber);
      return nextNumber;
    };
  };
  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER === void 0 ? 9007199254740991 : Number.MAX_SAFE_INTEGER;
  var TWO_TO_THE_POWER_OF_TWENTY_NINE = 536870912;
  var TWO_TO_THE_POWER_OF_THIRTY = TWO_TO_THE_POWER_OF_TWENTY_NINE * 2;
  var createGenerateUniqueNumber = (cache, lastNumberWeakMap) => {
    return (collection) => {
      const lastNumber = lastNumberWeakMap.get(collection);
      let nextNumber =
        lastNumber === void 0 ? collection.size : lastNumber < TWO_TO_THE_POWER_OF_THIRTY ? lastNumber + 1 : 0;
      if (!collection.has(nextNumber)) return cache(collection, nextNumber);
      if (collection.size < TWO_TO_THE_POWER_OF_TWENTY_NINE) {
        while (collection.has(nextNumber)) nextNumber = Math.floor(Math.random() * TWO_TO_THE_POWER_OF_THIRTY);
        return cache(collection, nextNumber);
      }
      if (collection.size > MAX_SAFE_INTEGER)
        throw new Error(
          "Congratulations, you created a collection of unique numbers which uses all available integers!"
        );
      while (collection.has(nextNumber)) nextNumber = Math.floor(Math.random() * MAX_SAFE_INTEGER);
      return cache(collection, nextNumber);
    };
  };
  var LAST_NUMBER_WEAK_MAP = new WeakMap();
  var generateUniqueNumber = createGenerateUniqueNumber(createCache(LAST_NUMBER_WEAK_MAP), LAST_NUMBER_WEAK_MAP);
  var createBrokerFactory =
    (createOrGetOngoingRequests, extendBrokerImplementation, generateUniqueNumber, isMessagePort) =>
    (brokerImplementation) => {
      const fullBrokerImplementation = extendBrokerImplementation(brokerImplementation);
      return (sender) => {
        const ongoingRequests = createOrGetOngoingRequests(sender);
        sender.addEventListener("message", ({ data: message }) => {
          const { id } = message;
          if (id !== null && ongoingRequests.has(id)) {
            const { reject, resolve } = ongoingRequests.get(id);
            ongoingRequests.delete(id);
            if (message.error === void 0) resolve(message.result);
            else reject(new Error(message.error.message));
          }
        });
        if (isMessagePort(sender)) sender.start();
        const call = (method, params = null, transferables = []) => {
          return new Promise((resolve, reject) => {
            const id = generateUniqueNumber(ongoingRequests);
            ongoingRequests.set(id, {
              reject,
              resolve,
            });
            if (params === null)
              sender.postMessage(
                {
                  id,
                  method,
                },
                transferables
              );
            else
              sender.postMessage(
                {
                  id,
                  method,
                  params,
                },
                transferables
              );
          });
        };
        const notify = (method, params, transferables = []) => {
          sender.postMessage(
            {
              id: null,
              method,
              params,
            },
            transferables
          );
        };
        let functions = {};
        for (const [key, handler] of Object.entries(fullBrokerImplementation))
          functions = {
            ...functions,
            [key]: handler({
              call,
              notify,
            }),
          };
        return { ...functions };
      };
    };
  var createCreateOrGetOngoingRequests = (ongoingRequestsMap) => (sender) => {
    if (ongoingRequestsMap.has(sender)) return ongoingRequestsMap.get(sender);
    const ongoingRequests = new Map();
    ongoingRequestsMap.set(sender, ongoingRequests);
    return ongoingRequests;
  };
  var createExtendBrokerImplementation = (portMap) => (partialBrokerImplementation) => ({
    ...partialBrokerImplementation,
    connect: ({ call }) => {
      return async () => {
        const { port1, port2 } = new MessageChannel();
        const portId = await call("connect", { port: port1 }, [port1]);
        portMap.set(port2, portId);
        return port2;
      };
    },
    disconnect: ({ call }) => {
      return async (port) => {
        const portId = portMap.get(port);
        if (portId === void 0) throw new Error("The given port is not connected.");
        await call("disconnect", { portId });
      };
    },
    isSupported: ({ call }) => {
      return () => call("isSupported");
    },
  });
  var isMessagePort = (sender) => {
    return typeof sender.start === "function";
  };
  var createBroker = createBrokerFactory(
    createCreateOrGetOngoingRequests(new WeakMap()),
    createExtendBrokerImplementation(new WeakMap()),
    generateUniqueNumber,
    isMessagePort
  );
  var createClearIntervalFactory = (scheduledIntervalsState) => (clear) => (timerId) => {
    if (typeof scheduledIntervalsState.get(timerId) === "symbol") {
      scheduledIntervalsState.set(timerId, null);
      clear(timerId).then(() => {
        scheduledIntervalsState.delete(timerId);
      });
    }
  };
  var createClearTimeoutFactory = (scheduledTimeoutsState) => (clear) => (timerId) => {
    if (typeof scheduledTimeoutsState.get(timerId) === "symbol") {
      scheduledTimeoutsState.set(timerId, null);
      clear(timerId).then(() => {
        scheduledTimeoutsState.delete(timerId);
      });
    }
  };
  var createSetIntervalFactory =
    (generateUniqueNumber, scheduledIntervalsState) =>
    (set) =>
    (func, delay = 0, ...args) => {
      const symbol = Symbol();
      const timerId = generateUniqueNumber(scheduledIntervalsState);
      scheduledIntervalsState.set(timerId, symbol);
      const schedule = () =>
        set(delay, timerId).then(() => {
          const state = scheduledIntervalsState.get(timerId);
          if (state === void 0) throw new Error("The timer is in an undefined state.");
          if (state === symbol) {
            func(...args);
            if (scheduledIntervalsState.get(timerId) === symbol) schedule();
          }
        });
      schedule();
      return timerId;
    };
  var createSetTimeoutFactory =
    (generateUniqueNumber, scheduledTimeoutsState) =>
    (set) =>
    (func, delay = 0, ...args) => {
      const symbol = Symbol();
      const timerId = generateUniqueNumber(scheduledTimeoutsState);
      scheduledTimeoutsState.set(timerId, symbol);
      set(delay, timerId).then(() => {
        const state = scheduledTimeoutsState.get(timerId);
        if (state === void 0) throw new Error("The timer is in an undefined state.");
        if (state === symbol) {
          scheduledTimeoutsState.delete(timerId);
          func(...args);
        }
      });
      return timerId;
    };
  var scheduledIntervalsState = new Map([[0, null]]);
  var scheduledTimeoutsState = new Map([[0, null]]);
  var createClearInterval = createClearIntervalFactory(scheduledIntervalsState);
  var createClearTimeout = createClearTimeoutFactory(scheduledTimeoutsState);
  var createSetInterval = createSetIntervalFactory(generateUniqueNumber, scheduledIntervalsState);
  var createSetTimeout = createSetTimeoutFactory(generateUniqueNumber, scheduledTimeoutsState);
  var wrap = createBroker({
    clearInterval: ({ call }) =>
      createClearInterval((timerId) =>
        call("clear", {
          timerId,
          timerType: "interval",
        })
      ),
    clearTimeout: ({ call }) =>
      createClearTimeout((timerId) =>
        call("clear", {
          timerId,
          timerType: "timeout",
        })
      ),
    setInterval: ({ call }) =>
      createSetInterval((delay, timerId) =>
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "interval",
        })
      ),
    setTimeout: ({ call }) =>
      createSetTimeout((delay, timerId) =>
        call("set", {
          delay,
          now: performance.timeOrigin + performance.now(),
          timerId,
          timerType: "timeout",
        })
      ),
  });
  var load = (url) => {
    return wrap(new Worker(url));
  };
  var createLoadOrReturnBroker = (loadBroker, worker) => {
    let broker = null;
    return () => {
      if (broker !== null) return broker;
      const blob = new Blob([worker], { type: "application/javascript; charset=utf-8" });
      const url = URL.createObjectURL(blob);
      broker = loadBroker(url);
      setTimeout(() => URL.revokeObjectURL(url));
      return broker;
    };
  };
  var loadOrReturnBroker = createLoadOrReturnBroker(
    load,
    `(()=>{var e={455(e,t){!function(e){"use strict";var t=function(e){return function(t){var r=e(t);return t.add(r),r}},r=function(e){return function(t,r){return e.set(t,r),r}},n=void 0===Number.MAX_SAFE_INTEGER?9007199254740991:Number.MAX_SAFE_INTEGER,o=536870912,s=2*o,a=function(e,t){return function(r){var a=t.get(r),i=void 0===a?r.size:a<s?a+1:0;if(!r.has(i))return e(r,i);if(r.size<o){for(;r.has(i);)i=Math.floor(Math.random()*s);return e(r,i)}if(r.size>n)throw new Error("Congratulations, you created a collection of unique numbers which uses all available integers!");for(;r.has(i);)i=Math.floor(Math.random()*n);return e(r,i)}},i=new WeakMap,u=r(i),c=a(u,i),l=t(c);e.addUniqueNumber=l,e.generateUniqueNumber=c}(t)}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,r),s.exports}(()=>{"use strict";const e=-32603,t=-32602,n=-32601,o=(e,t)=>Object.assign(new Error(e),{status:t}),s=t=>o('The handler of the method called "'.concat(t,'" returned an unexpected result.'),e),a=(t,r)=>async({data:{id:a,method:i,params:u}})=>{const c=r[i];try{if(void 0===c)throw(e=>o('The requested method called "'.concat(e,'" is not supported.'),n))(i);const r=void 0===u?c():c(u);if(void 0===r)throw(t=>o('The handler of the method called "'.concat(t,'" returned no required result.'),e))(i);const l=r instanceof Promise?await r:r;if(null===a){if(void 0!==l.result)throw s(i)}else{if(void 0===l.result)throw s(i);const{result:e,transferables:r=[]}=l;t.postMessage({id:a,result:e},r)}}catch(e){const{message:r,status:n=-32603}=e;t.postMessage({error:{code:n,message:r},id:a})}};var i=r(455);const u=new Map,c=(e,r,n)=>({...r,connect:({port:t})=>{t.start();const n=e(t,r),o=(0,i.generateUniqueNumber)(u);return u.set(o,()=>{n(),t.close(),u.delete(o)}),{result:o}},disconnect:({portId:e})=>{const r=u.get(e);if(void 0===r)throw(e=>o('The specified parameter called "portId" with the given value "'.concat(e,'" does not identify a port connected to this worker.'),t))(e);return r(),{result:null}},isSupported:async()=>{if(await new Promise(e=>{const t=new ArrayBuffer(0),{port1:r,port2:n}=new MessageChannel;r.onmessage=({data:t})=>e(null!==t),n.postMessage(t,[t])})){const e=n();return{result:e instanceof Promise?await e:e}}return{result:!1}}}),l=(e,t,r=()=>!0)=>{const n=c(l,t,r),o=a(e,n);return e.addEventListener("message",o),()=>e.removeEventListener("message",o)},d=(e,t)=>r=>{const n=t.get(r);if(void 0===n)return Promise.resolve(!1);const[o,s]=n;return e(o),t.delete(r),s(!1),Promise.resolve(!0)},m=(e,t,r,n)=>(o,s,a)=>{const i=o+s-t.timeOrigin,u=i-t.now();return new Promise(t=>{e.set(a,[r(n,u,i,e,t,a),t])})},f=new Map,h=d(globalThis.clearTimeout,f),p=new Map,v=d(globalThis.clearTimeout,p),w=((e,t)=>{const r=(n,o,s,a)=>{const i=n-e.now();i>0?o.set(a,[t(r,i,n,o,s,a),s]):(o.delete(a),s(!0))};return r})(performance,globalThis.setTimeout),g=m(f,performance,globalThis.setTimeout,w),T=m(p,performance,globalThis.setTimeout,w);l(self,{clear:async({timerId:e,timerType:t})=>({result:await("interval"===t?h(e):v(e))}),set:async({delay:e,now:t,timerId:r,timerType:n})=>({result:await("interval"===n?g:T)(e,t,r)})})})()})();`
  );
  var clearInterval$1 = (timerId) => loadOrReturnBroker().clearInterval(timerId);
  var clearTimeout$1 = (timerId) => loadOrReturnBroker().clearTimeout(timerId);
  var setInterval$1 = (...args) => loadOrReturnBroker().setInterval(...args);
  var setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
  var version = "2.12.2";
  var ajaxHooker = function () {
    const version = "1.4.8";
    const hookInst = {
      hookFns: [],
      filters: [],
    };
    const win = window.unsafeWindow || document.defaultView || window;
    let winAh = win.__ajaxHooker;
    const resProto = win.Response.prototype;
    const xhrResponses = ["response", "responseText", "responseXML"];
    const fetchResponses = ["arrayBuffer", "blob", "formData", "json", "text"];
    const xhrExtraProps = ["responseType", "timeout", "withCredentials"];
    const fetchExtraProps = [
      "cache",
      "credentials",
      "integrity",
      "keepalive",
      "mode",
      "priority",
      "redirect",
      "referrer",
      "referrerPolicy",
      "signal",
    ];
    const xhrAsyncEvents = ["readystatechange", "load", "loadend"];
    const getType = {}.toString.call.bind({}.toString);
    const getDescriptor = Object.getOwnPropertyDescriptor.bind(Object);
    const emptyFn = () => {};
    const errorFn = (e) => console.error(e);
    function isThenable(obj) {
      return obj && ["object", "function"].includes(typeof obj) && typeof obj.then === "function";
    }
    function catchError(fn, ...args) {
      try {
        const result = fn(...args);
        if (isThenable(result)) return result.then(null, errorFn);
        return result;
      } catch (err) {
        console.error(err);
      }
    }
    function defineProp(obj, prop, getter, setter) {
      Object.defineProperty(obj, prop, {
        configurable: true,
        enumerable: true,
        get: getter,
        set: setter,
      });
    }
    function readonly(obj, prop, value = obj[prop]) {
      defineProp(obj, prop, () => value, emptyFn);
    }
    function writable(obj, prop, value = obj[prop]) {
      Object.defineProperty(obj, prop, {
        configurable: true,
        enumerable: true,
        writable: true,
        value,
      });
    }
    function parseHeaders(obj) {
      const headers = {};
      switch (getType(obj)) {
        case "[object String]":
          for (const line of obj.trim().split(/[\r\n]+/)) {
            const [header, value] = line.split(/(?<=^[^:]+)\s*:\s*/);
            if (!value) continue;
            const lheader = header.toLowerCase();
            headers[lheader] = lheader in headers ? `${headers[lheader]}, ${value}` : value;
          }
          break;
        case "[object Headers]":
          for (const [key, val] of obj) headers[key] = val;
          break;
        case "[object Object]":
          return { ...obj };
      }
      return headers;
    }
    function stopImmediatePropagation() {
      this.ajaxHooker_isStopped = true;
    }
    class SyncThenable {
      then(fn) {
        fn && fn();
        return new SyncThenable();
      }
    }
    class AHRequest {
      constructor(request) {
        this.request = request;
        this.requestClone = { ...this.request };
      }
      _recoverRequestKey(key) {
        if (key in this.requestClone) this.request[key] = this.requestClone[key];
        else delete this.request[key];
      }
      shouldFilter(filters) {
        const { type, url, method, async } = this.request;
        return (
          filters.length &&
          !filters.find((obj) => {
            switch (true) {
              case obj.type && obj.type !== type:
              case getType(obj.url) === "[object String]" && !url.includes(obj.url):
              case getType(obj.url) === "[object RegExp]" && !obj.url.test(url):
              case obj.method && obj.method.toUpperCase() !== method.toUpperCase():
              case "async" in obj && obj.async !== async:
                return false;
            }
            return true;
          })
        );
      }
      waitForRequestKeys() {
        const winHookInsts = win.__ajaxHooker.hookInsts;
        if (!this.request.async) {
          winHookInsts.forEach(({ hookFns, filters }) => {
            if (this.shouldFilter(filters)) return;
            hookFns.forEach((fn) => {
              if (getType(fn) === "[object Function]") catchError(fn, this.request);
            });
            for (const key in this.request) if (isThenable(this.request[key])) this._recoverRequestKey(key);
          });
          return new SyncThenable();
        }
        const promises = [];
        const ignoreKeys = new Set(["type", "async", "response"]);
        winHookInsts.forEach(({ hookFns, filters }) => {
          if (this.shouldFilter(filters)) return;
          promises.push(
            Promise.all(hookFns.map((fn, index) => catchError(fn, this.request, index))).then(() => {
              const requestKeys = [];
              for (const key in this.request) !ignoreKeys.has(key) && requestKeys.push(key);
              return Promise.all(
                requestKeys.map((key) =>
                  Promise.resolve(this.request[key]).then(
                    (val) => (this.request[key] = val),
                    () => this._recoverRequestKey(key)
                  )
                )
              );
            })
          );
        });
        return Promise.all(promises);
      }
      waitForResponseKeys(response) {
        const responseKeys = this.request.type === "xhr" ? xhrResponses : fetchResponses;
        if (!this.request.async) {
          if (getType(this.request.response) === "[object Function]") {
            catchError(this.request.response, response);
            responseKeys.forEach((key) => {
              if ("get" in getDescriptor(response, key) || isThenable(response[key])) delete response[key];
            });
          }
          return new SyncThenable();
        }
        return Promise.resolve(catchError(this.request.response, response)).then(() =>
          Promise.all(
            responseKeys.map((key) => {
              const descriptor = getDescriptor(response, key);
              if (descriptor && "value" in descriptor)
                return Promise.resolve(descriptor.value).then(
                  (val) => (response[key] = val),
                  () => delete response[key]
                );
              else delete response[key];
            })
          )
        );
      }
    }
    const proxyHandler = {
      get(target, prop) {
        const descriptor = getDescriptor(target, prop);
        if (descriptor && !descriptor.configurable && !descriptor.writable && !descriptor.get) return target[prop];
        const ah = target.__ajaxHooker;
        if (ah && ah.proxyProps) {
          if (prop in ah.proxyProps) {
            const pDescriptor = ah.proxyProps[prop];
            if ("get" in pDescriptor) return pDescriptor.get();
            if (typeof pDescriptor.value === "function") return pDescriptor.value.bind(ah);
            return pDescriptor.value;
          }
          if (typeof target[prop] === "function") return target[prop].bind(target);
        }
        return target[prop];
      },
      set(target, prop, value) {
        const descriptor = getDescriptor(target, prop);
        if (descriptor && !descriptor.configurable && !descriptor.writable && !descriptor.set) return true;
        const ah = target.__ajaxHooker;
        if (ah && ah.proxyProps && prop in ah.proxyProps) {
          const pDescriptor = ah.proxyProps[prop];
          pDescriptor.set ? pDescriptor.set(value) : (pDescriptor.value = value);
        } else target[prop] = value;
        return true;
      },
    };
    class XhrHooker {
      constructor(xhr) {
        const ah = this;
        Object.assign(ah, {
          originalXhr: xhr,
          proxyXhr: new Proxy(xhr, proxyHandler),
          resThenable: new SyncThenable(),
          proxyProps: {},
          proxyEvents: {},
        });
        xhr.addEventListener("readystatechange", (e) => {
          if (ah.proxyXhr.readyState === 4 && ah.request && typeof ah.request.response === "function") {
            const response = {
              finalUrl: ah.proxyXhr.responseURL,
              status: ah.proxyXhr.status,
              responseHeaders: parseHeaders(ah.proxyXhr.getAllResponseHeaders()),
            };
            const tempValues = {};
            for (const key of xhrResponses) {
              try {
                tempValues[key] = ah.originalXhr[key];
              } catch (err) {}
              defineProp(
                response,
                key,
                () => {
                  return (response[key] = tempValues[key]);
                },
                (val) => {
                  delete response[key];
                  response[key] = val;
                }
              );
            }
            ah.resThenable = new AHRequest(ah.request).waitForResponseKeys(response).then(() => {
              for (const key of xhrResponses)
                ah.proxyProps[key] = {
                  get: () => {
                    if (!(key in response)) response[key] = tempValues[key];
                    return response[key];
                  },
                };
            });
          }
          ah.dispatchEvent(e);
        });
        xhr.addEventListener("load", (e) => ah.dispatchEvent(e));
        xhr.addEventListener("loadend", (e) => ah.dispatchEvent(e));
        for (const evt of xhrAsyncEvents) {
          const onEvt = "on" + evt;
          ah.proxyProps[onEvt] = {
            get: () => ah.proxyEvents[onEvt] || null,
            set: (val) => ah.addEvent(onEvt, val),
          };
        }
        for (const method of ["setRequestHeader", "addEventListener", "removeEventListener", "open", "send"])
          ah.proxyProps[method] = { value: ah[method] };
      }
      toJSON() {}
      addEvent(type, event) {
        if (type.startsWith("on")) this.proxyEvents[type] = typeof event === "function" ? event : null;
        else {
          if (typeof event === "object" && event !== null) event = event.handleEvent;
          if (typeof event !== "function") return;
          this.proxyEvents[type] = this.proxyEvents[type] || new Set();
          this.proxyEvents[type].add(event);
        }
      }
      removeEvent(type, event) {
        if (type.startsWith("on")) this.proxyEvents[type] = null;
        else {
          if (typeof event === "object" && event !== null) event = event.handleEvent;
          this.proxyEvents[type] && this.proxyEvents[type].delete(event);
        }
      }
      dispatchEvent(e) {
        e.stopImmediatePropagation = stopImmediatePropagation;
        defineProp(e, "target", () => this.proxyXhr);
        defineProp(e, "currentTarget", () => this.proxyXhr);
        defineProp(e, "srcElement", () => this.proxyXhr);
        this.proxyEvents[e.type] &&
          this.proxyEvents[e.type].forEach((fn) => {
            this.resThenable.then(() => !e.ajaxHooker_isStopped && fn.call(this.proxyXhr, e));
          });
        if (e.ajaxHooker_isStopped) return;
        const onEvent = this.proxyEvents["on" + e.type];
        onEvent && this.resThenable.then(onEvent.bind(this.proxyXhr, e));
      }
      setRequestHeader(header, value) {
        this.originalXhr.setRequestHeader(header, value);
        if (!this.request) return;
        const headers = this.request.headers;
        headers[header] = header in headers ? `${headers[header]}, ${value}` : value;
      }
      addEventListener(...args) {
        if (xhrAsyncEvents.includes(args[0])) this.addEvent(args[0], args[1]);
        else this.originalXhr.addEventListener(...args);
      }
      removeEventListener(...args) {
        if (xhrAsyncEvents.includes(args[0])) this.removeEvent(args[0], args[1]);
        else this.originalXhr.removeEventListener(...args);
      }
      open(method, url, async = true, ...args) {
        this.request = {
          type: "xhr",
          url: url.toString(),
          method: method.toUpperCase(),
          abort: false,
          headers: {},
          data: null,
          response: null,
          async: !!async,
        };
        this.openArgs = args;
        this.resThenable = new SyncThenable();
        ["responseURL", "readyState", "status", "statusText", ...xhrResponses].forEach((key) => {
          delete this.proxyProps[key];
        });
        return this.originalXhr.open(method, url, async, ...args);
      }
      send(data) {
        const ah = this;
        const xhr = ah.originalXhr;
        const request = ah.request;
        if (!request) return xhr.send(data);
        request.data = data;
        new AHRequest(request).waitForRequestKeys().then(() => {
          if (request.abort) {
            if (typeof request.response === "function") {
              Object.assign(ah.proxyProps, {
                responseURL: { value: request.url },
                readyState: { value: 4 },
                status: { value: 200 },
                statusText: { value: "OK" },
              });
              xhrAsyncEvents.forEach((evt) => xhr.dispatchEvent(new Event(evt)));
            }
          } else {
            xhr.open(request.method, request.url, request.async, ...ah.openArgs);
            for (const header in request.headers) xhr.setRequestHeader(header, request.headers[header]);
            for (const prop of xhrExtraProps) if (prop in request) xhr[prop] = request[prop];
            xhr.send(request.data);
          }
        });
      }
    }
    function fakeXHR() {
      const xhr = new winAh.realXHR();
      if ("__ajaxHooker" in xhr) console.warn("检测到不同版本的ajaxHooker,可能发生冲突!");
      xhr.__ajaxHooker = new XhrHooker(xhr);
      return xhr.__ajaxHooker.proxyXhr;
    }
    fakeXHR.prototype = win.XMLHttpRequest.prototype;
    Object.keys(win.XMLHttpRequest).forEach((key) => (fakeXHR[key] = win.XMLHttpRequest[key]));
    function fakeFetch(url, options = {}) {
      if (!url) return winAh.realFetch.call(win, url, options);
      return new Promise(async (resolve, reject) => {
        const init = {};
        if (getType(url) === "[object Request]") {
          init.method = url.method;
          init.headers = url.headers;
          if (url.body) init.body = await url.arrayBuffer();
          for (const prop of fetchExtraProps) init[prop] = url[prop];
          url = url.url;
        }
        url = url.toString();
        Object.assign(init, options);
        init.method = init.method || "GET";
        init.headers = init.headers || {};
        const request = {
          type: "fetch",
          url,
          method: init.method.toUpperCase(),
          abort: false,
          headers: parseHeaders(init.headers),
          data: init.body,
          response: null,
          async: true,
        };
        const req = new AHRequest(request);
        await req.waitForRequestKeys();
        if (request.abort) {
          if (typeof request.response === "function") {
            const response = {
              finalUrl: request.url,
              status: 200,
              responseHeaders: {},
            };
            await req.waitForResponseKeys(response);
            const key = fetchResponses.find((k) => k in response);
            let val = response[key];
            if (key === "json" && typeof val === "object") val = catchError(JSON.stringify.bind(JSON), val);
            const res = new Response(val, {
              status: 200,
              statusText: "OK",
            });
            defineProp(res, "type", () => "basic");
            defineProp(res, "url", () => request.url);
            resolve(res);
          } else reject(new DOMException("aborted", "AbortError"));
          return;
        }
        init.method = request.method;
        init.headers = request.headers;
        init.body = request.data;
        for (const prop of fetchExtraProps) if (prop in request) init[prop] = request[prop];
        winAh.realFetch.call(win, request.url, init).then((res) => {
          if (typeof request.response === "function") {
            const response = {
              finalUrl: res.url,
              status: res.status,
              responseHeaders: parseHeaders(res.headers),
            };
            if (res.ok)
              fetchResponses.forEach(
                (key) =>
                  (res[key] = function () {
                    if (key in response) return Promise.resolve(response[key]);
                    return resProto[key].call(this).then((val) => {
                      response[key] = val;
                      return req.waitForResponseKeys(response).then(() => (key in response ? response[key] : val));
                    });
                  })
              );
            else catchError(request.response, response);
          }
          resolve(res);
        }, reject);
      });
    }
    function fakeFetchClone() {
      const descriptors = Object.getOwnPropertyDescriptors(this);
      const res = winAh.realFetchClone.call(this);
      Object.defineProperties(res, descriptors);
      return res;
    }
    winAh = win.__ajaxHooker = winAh || {
      version,
      fakeXHR,
      fakeFetch,
      fakeFetchClone,
      realXHR: win.XMLHttpRequest,
      realFetch: win.fetch,
      realFetchClone: resProto.clone,
      hookInsts: new Set(),
    };
    if (winAh.version !== version) console.warn("检测到不同版本的ajaxHooker,可能发生冲突!");
    win.XMLHttpRequest = winAh.fakeXHR;
    win.fetch = winAh.fakeFetch;
    resProto.clone = winAh.fakeFetchClone;
    winAh.hookInsts.add(hookInst);
    class AHFunction extends Function {
      call(thisArg, ...args) {
        if (thisArg && thisArg.__ajaxHooker && thisArg.__ajaxHooker.proxyXhr === thisArg)
          thisArg = thisArg.__ajaxHooker.originalXhr;
        return Reflect.apply(this, thisArg, args);
      }
      apply(thisArg, args) {
        if (thisArg && thisArg.__ajaxHooker && thisArg.__ajaxHooker.proxyXhr === thisArg)
          thisArg = thisArg.__ajaxHooker.originalXhr;
        return Reflect.apply(this, thisArg, args || []);
      }
    }
    function hookSecsdk(csrf) {
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestSetRequestHeader, AHFunction.prototype);
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestOpen, AHFunction.prototype);
      Object.setPrototypeOf(csrf.nativeXMLHttpRequestSend, AHFunction.prototype);
    }
    if (win.secsdk) {
      if (win.secsdk.csrf && win.secsdk.csrf.nativeXMLHttpRequestOpen) hookSecsdk(win.secsdk.csrf);
    } else
      defineProp(win, "secsdk", emptyFn, (secsdk) => {
        delete win.secsdk;
        win.secsdk = secsdk;
        defineProp(secsdk, "csrf", emptyFn, (csrf) => {
          delete secsdk.csrf;
          secsdk.csrf = csrf;
          if (csrf.nativeXMLHttpRequestOpen) hookSecsdk(csrf);
        });
      });
    const removeHook = (fn, onlyRemove = false) => {
      let flag = false;
      for (let index = hookInst.hookFns.length - 1; index >= 0; index--)
        if (fn === hookInst.hookFns[index]) {
          hookInst.hookFns.splice(index, 1);
          flag = true;
          if (onlyRemove) break;
        }
      return flag;
    };
    const removeFilter = () => {
      if (Array.isArray(hookInst.filters)) hookInst.filters.length = 0;
      else hookInst.filters = [];
    };
    return {
      hook: (fn) => {
        hookInst.hookFns.push(fn);
        return {
          remove: () => {
            return removeHook(fn, true);
          },
        };
      },
      filter: (arr) => {
        if (Array.isArray(arr)) hookInst.filters = arr;
        return { remove: removeFilter };
      },
      protect: () => {
        readonly(win, "XMLHttpRequest", winAh.fakeXHR);
        readonly(win, "fetch", winAh.fakeFetch);
        readonly(resProto, "clone", winAh.fakeFetchClone);
      },
      unhook: () => {
        winAh.hookInsts.delete(hookInst);
        if (!winAh.hookInsts.size) {
          writable(win, "XMLHttpRequest", winAh.realXHR);
          writable(win, "fetch", winAh.realFetch);
          writable(resProto, "clone", winAh.realFetchClone);
          delete win.__ajaxHooker;
        }
      },
      removeHook,
      removeFilter,
    };
  };
  var AjaxHooker1_2_4 = function () {
    return (function () {
      const win = window.unsafeWindow || document.defaultView || window;
      const hookFns = [];
      const realXhr = win.XMLHttpRequest;
      const resProto = win.Response.prototype;
      const toString = Object.prototype.toString;
      const realFetch = win.fetch;
      const xhrResponses = ["response", "responseText", "responseXML"];
      const fetchResponses = ["arrayBuffer", "blob", "formData", "json", "text"];
      const xhrAsyncEvents = ["readystatechange", "load", "loadend"];
      let filter;
      function emptyFn() {}
      function errorFn(err) {
        console.error(err);
      }
      function defineProp(obj, prop, getter, setter) {
        Object.defineProperty(obj, prop, {
          configurable: true,
          enumerable: true,
          get: getter,
          set: setter,
        });
      }
      function readonly(obj, prop, value = obj[prop]) {
        defineProp(obj, prop, () => value, emptyFn);
      }
      function writable(obj, prop, value = obj[prop]) {
        Object.defineProperty(obj, prop, {
          configurable: true,
          enumerable: true,
          writable: true,
          value,
        });
      }
      function toFilterObj(obj) {
        return {
          type: obj.type,
          url: obj.url,
          method: obj.method && obj.method.toUpperCase(),
        };
      }
      function shouldFilter(type, url, method) {
        return (
          filter &&
          !filter.find(
            (obj) =>
              (!obj.type || obj.type === type) &&
              (!obj.url ||
                (toString.call(obj.url) === "[object String]" ? url.includes(obj.url) : obj.url.test(url))) &&
              (!obj.method || obj.method === method.toUpperCase())
          )
        );
      }
      function lookupGetter(obj, prop) {
        let getter;
        let proto = obj;
        while (proto) {
          const descriptor = Object.getOwnPropertyDescriptor(proto, prop);
          getter = descriptor && descriptor.get;
          if (getter) break;
          proto = Object.getPrototypeOf(proto);
        }
        return getter ? getter.bind(obj) : emptyFn;
      }
      function waitForHookFns(request) {
        return Promise.all(hookFns.map((fn) => Promise.resolve(fn(request)).then(emptyFn, errorFn)));
      }
      function waitForRequestKeys(request, requestClone) {
        return Promise.all(
          ["url", "method", "abort", "headers", "data"].map((key) => {
            return Promise.resolve(request[key]).then(
              (val) => (request[key] = val),
              () => (request[key] = requestClone[key])
            );
          })
        );
      }
      function fakeEventSIP() {
        this.ajaxHooker_stopped = true;
      }
      function xhrDelegateEvent(e) {
        const xhr = e.target;
        e.stopImmediatePropagation = fakeEventSIP;
        xhr.__ajaxHooker.hookedEvents[e.type].forEach((fn) => !e.ajaxHooker_stopped && fn.call(xhr, e));
        const onEvent = xhr.__ajaxHooker.hookedEvents["on" + e.type];
        typeof onEvent === "function" && onEvent.call(xhr, e);
      }
      function xhrReadyStateChange(e) {
        if (e.target.readyState === 4)
          e.target.dispatchEvent(new CustomEvent("ajaxHooker_responseReady", { detail: e }));
        else e.target.__ajaxHooker.delegateEvent(e);
      }
      function xhrLoadAndLoadend(e) {
        e.target.__ajaxHooker.delegateEvent(e);
      }
      function fakeXhrOpen(method, url, ...args) {
        const ah = this.__ajaxHooker;
        ah.url = url.toString();
        ah.method = method.toUpperCase();
        ah.openArgs = args;
        ah.headers = {};
        return ah.originalMethods.open(method, url, ...args);
      }
      function fakeXhr() {
        const xhr = new realXhr();
        let ah = xhr.__ajaxHooker;
        if (!ah) {
          ah = xhr.__ajaxHooker = {
            headers: {},
            hookedEvents: {
              readystatechange: new Set(),
              load: new Set(),
              loadend: new Set(),
            },
            delegateEvent: xhrDelegateEvent,
            originalGetters: {},
            originalMethods: {},
          };
          xhr.addEventListener("readystatechange", xhrReadyStateChange);
          xhr.addEventListener("load", xhrLoadAndLoadend);
          xhr.addEventListener("loadend", xhrLoadAndLoadend);
          for (const key of xhrResponses) ah.originalGetters[key] = lookupGetter(xhr, key);
          for (const method of ["open", "setRequestHeader", "addEventListener", "removeEventListener"])
            ah.originalMethods[method] = xhr[method].bind(xhr);
          xhr.open = fakeXhrOpen;
          xhr.setRequestHeader = (header, value) => {
            ah.originalMethods.setRequestHeader(header, value);
            if (xhr.readyState === 1)
              if (ah.headers[header]) ah.headers[header] += ", " + value;
              else ah.headers[header] = value;
          };
          xhr.addEventListener = function (...args) {
            if (xhrAsyncEvents.includes(args[0])) ah.hookedEvents[args[0]].add(args[1]);
            else ah.originalMethods.addEventListener(...args);
          };
          xhr.removeEventListener = function (...args) {
            if (xhrAsyncEvents.includes(args[0])) ah.hookedEvents[args[0]].delete(args[1]);
            else ah.originalMethods.removeEventListener(...args);
          };
          xhrAsyncEvents.forEach((evt) => {
            const onEvt = "on" + evt;
            defineProp(
              xhr,
              onEvt,
              () => {
                return ah.hookedEvents[onEvt] || null;
              },
              (val) => {
                ah.hookedEvents[onEvt] = typeof val === "function" ? val : null;
              }
            );
          });
        }
        const realSend = xhr.send.bind(xhr);
        xhr.send = function (data) {
          if (xhr.readyState !== 1) return realSend(data);
          ah.delegateEvent = xhrDelegateEvent;
          xhrResponses.forEach((prop) => {
            delete xhr[prop];
          });
          if (shouldFilter("xhr", ah.url, ah.method)) {
            xhr.addEventListener("ajaxHooker_responseReady", (e) => {
              ah.delegateEvent(e.detail);
            });
            return realSend(data);
          }
          try {
            const request = {
              type: "xhr",
              url: ah.url,
              method: ah.method,
              abort: false,
              headers: ah.headers,
              data,
              response: null,
            };
            const requestClone = { ...request };
            waitForHookFns(request).then(() => {
              waitForRequestKeys(request, requestClone).then(() => {
                if (request.abort) return;
                ah.originalMethods.open(request.method, request.url, ...ah.openArgs);
                for (const header in request.headers)
                  ah.originalMethods.setRequestHeader(header, request.headers[header]);
                data = request.data;
                xhr.addEventListener("ajaxHooker_responseReady", (e) => {
                  try {
                    if (typeof request.response === "function") {
                      const arg = {
                        finalUrl: xhr.responseURL,
                        status: xhr.status,
                        responseHeaders: {},
                      };
                      for (const line of xhr
                        .getAllResponseHeaders()
                        .trim()
                        .split(/[\r\n]+/)) {
                        const parts = line.split(/:\s*/);
                        if (parts.length === 2) {
                          const lheader = parts[0].toLowerCase();
                          if (arg.responseHeaders[lheader]) arg.responseHeaders[lheader] += ", " + parts[1];
                          else arg.responseHeaders[lheader] = parts[1];
                        }
                      }
                      xhrResponses.forEach((prop) => {
                        defineProp(
                          arg,
                          prop,
                          () => {
                            return (arg[prop] = ah.originalGetters[prop]());
                          },
                          (val) => {
                            delete arg[prop];
                            arg[prop] = val;
                          }
                        );
                        defineProp(xhr, prop, () => {
                          const val = ah.originalGetters[prop]();
                          xhr.dispatchEvent(
                            new CustomEvent("ajaxHooker_readResponse", {
                              detail: {
                                prop,
                                val,
                              },
                            })
                          );
                          return val;
                        });
                      });
                      xhr.addEventListener("ajaxHooker_readResponse", (e) => {
                        arg[e.detail.prop] = e.detail.val;
                      });
                      const resPromise = Promise.resolve(request.response(arg)).then(() => {
                        const task = [];
                        xhrResponses.forEach((prop) => {
                          const descriptor = Object.getOwnPropertyDescriptor(arg, prop);
                          if (descriptor && "value" in descriptor)
                            task.push(
                              Promise.resolve(descriptor.value).then((val) => {
                                arg[prop] = val;
                                defineProp(xhr, prop, () => {
                                  xhr.dispatchEvent(
                                    new CustomEvent("ajaxHooker_readResponse", {
                                      detail: {
                                        prop,
                                        val,
                                      },
                                    })
                                  );
                                  return val;
                                });
                              }, emptyFn)
                            );
                        });
                        return Promise.all(task);
                      }, errorFn);
                      const eventsClone = {};
                      xhrAsyncEvents.forEach((type) => {
                        eventsClone[type] = new Set([...ah.hookedEvents[type]]);
                        eventsClone["on" + type] = ah.hookedEvents["on" + type];
                      });
                      ah.delegateEvent = (event) =>
                        resPromise.then(() => {
                          event.stopImmediatePropagation = fakeEventSIP;
                          eventsClone[event.type].forEach((fn) => !event.ajaxHooker_stopped && fn.call(xhr, event));
                          const onEvent = eventsClone["on" + event.type];
                          typeof onEvent === "function" && onEvent.call(xhr, event);
                        });
                    }
                  } catch (err) {
                    console.error(err);
                  }
                  ah.delegateEvent(e.detail);
                });
                realSend(data);
              });
            });
          } catch (err) {
            console.error(err);
            realSend(data);
          }
        };
        return xhr;
      }
      function hookFetchResponse(response, arg, callback) {
        fetchResponses.forEach((prop) => {
          response[prop] = () =>
            new Promise((resolve, reject) => {
              resProto[prop].call(response).then((res) => {
                if (prop in arg) resolve(arg[prop]);
                else
                  try {
                    arg[prop] = res;
                    Promise.resolve(callback(arg)).then(() => {
                      if (prop in arg)
                        Promise.resolve(arg[prop]).then(
                          (val) => resolve((arg[prop] = val)),
                          () => resolve(res)
                        );
                      else resolve(res);
                    }, errorFn);
                  } catch (err) {
                    console.error(err);
                    resolve(res);
                  }
              }, reject);
            });
        });
      }
      function fakeFetch(url, init) {
        if (url && typeof url.toString === "function") {
          url = url.toString();
          init = init || {};
          init.method = init.method || "GET";
          init.headers = init.headers || {};
          if (shouldFilter("fetch", url, init.method)) return realFetch.call(win, url, init);
          const request = {
            type: "fetch",
            url,
            method: init.method.toUpperCase(),
            abort: false,
            headers: {},
            data: init.body,
            response: null,
          };
          if (toString.call(init.headers) === "[object Headers]")
            for (const [key, val] of init.headers) request.headers[key] = val;
          else request.headers = { ...init.headers };
          const requestClone = { ...request };
          return new Promise((resolve, reject) => {
            try {
              waitForHookFns(request).then(() => {
                waitForRequestKeys(request, requestClone).then(() => {
                  if (request.abort) return reject("aborted");
                  url = request.url;
                  init.method = request.method;
                  init.headers = request.headers;
                  init.body = request.data;
                  realFetch.call(win, url, init).then((response) => {
                    if (typeof request.response === "function") {
                      const arg = {
                        finalUrl: response.url,
                        status: response.status,
                        responseHeaders: {},
                      };
                      for (const [key, val] of response.headers) arg.responseHeaders[key] = val;
                      hookFetchResponse(response, arg, request.response);
                      response.clone = () => {
                        const resClone = resProto.clone.call(response);
                        hookFetchResponse(resClone, arg, request.response);
                        return resClone;
                      };
                    }
                    resolve(response);
                  }, reject);
                });
              });
            } catch (err) {
              console.error(err);
              return realFetch.call(win, url, init);
            }
          });
        } else return realFetch.call(win, url, init);
      }
      win.XMLHttpRequest = fakeXhr;
      Object.keys(realXhr).forEach((key) => (fakeXhr[key] = realXhr[key]));
      fakeXhr.prototype = realXhr.prototype;
      win.fetch = fakeFetch;
      const removeHook = (fn, onlyRemove = false) => {
        let flag = false;
        for (let index = hookFns.length - 1; index >= 0; index--)
          if (fn === hookFns[index]) {
            hookFns.splice(index, 1);
            flag = true;
            if (onlyRemove) break;
          }
        return flag;
      };
      const removeFilter = () => {
        if (Array.isArray(filter)) filter.length = 0;
        else filter = void 0;
      };
      return {
        hook: (fn) => {
          hookFns.push(fn);
          return {
            remove: () => {
              return removeHook(fn, true);
            },
          };
        },
        filter: (arr) => {
          filter = Array.isArray(arr) && arr.map(toFilterObj);
          return { remove: removeFilter };
        },
        protect: () => {
          readonly(win, "XMLHttpRequest", fakeXhr);
          readonly(win, "fetch", fakeFetch);
        },
        unhook: () => {
          writable(win, "XMLHttpRequest", realXhr);
          writable(win, "fetch", realFetch);
        },
        removeHook,
        removeFilter,
      };
    })();
  };
  var ColorConversion = class {
    isHex(str) {
      if (typeof str !== "string") return false;
      if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) return false;
      return true;
    }
    hexToRgba(hex, opacity) {
      if (!this.isHex(hex)) throw new TypeError(`输入错误的hex:${hex}`);
      return hex && hex.replace(/\s+/g, "").length === 7
        ? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
        : "";
    }
    hexToRgb(hex) {
      if (!this.isHex(hex)) throw new TypeError(`输入错误的hex:${hex}`);
      hex = hex.replace("#", "");
      const hxs = hex.match(/../g);
      for (let index = 0; index < 3; index++) {
        const value = parseInt(hxs[index], 16);
        Reflect.set(hxs, index, value);
      }
      return hxs;
    }
    rgbToHex(redValue, greenValue, blueValue) {
      const validPattern = /^\d{1,3}$/;
      if (
        !validPattern.test(redValue.toString()) ||
        !validPattern.test(greenValue.toString()) ||
        !validPattern.test(blueValue.toString())
      )
        throw new TypeError("输入错误的rgb颜色值");
      const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
      for (let index = 0; index < 3; index++) if (hexs[index].length == 1) hexs[index] = `0${hexs[index]}`;
      return `#${hexs.join("")}`;
    }
    getDarkColor(color, level) {
      if (!this.isHex(color)) throw new TypeError(`输入错误的hex:${color}`);
      if (typeof level !== "number") level = Number(level);
      if (isNaN(level)) throw new TypeError(`输入错误的level:${level}`);
      if (level < 0 || level > 1) throw new TypeError(`level must between 0~1.0: ${level}`);
      const rgbc = this.hexToRgb(color);
      for (let index = 0; index < 3; index++) {
        const rgbcItemValue = rgbc[index];
        let value = Math.floor(Number(rgbcItemValue) * (1 - level));
        if (value > 255) value = 255;
        else if (value < 0) value = 0;
        Reflect.set(rgbc, index, value);
      }
      return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }
    getLightColor(color, level) {
      if (!this.isHex(color)) throw new TypeError(`输入错误的hex:${color}`);
      if (typeof level !== "number") level = Number(level);
      if (isNaN(level)) throw new TypeError(`输入错误的level:${level}`);
      if (level < 0 || level > 1) throw new TypeError(`level must between 0~1.0: ${level}`);
      const rgbc = this.hexToRgb(color);
      for (let index = 0; index < 3; index++) {
        const rgbcItemValue = Number(rgbc[index]);
        let value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
        if (value > 255) value = 255;
        else if (value < 0) value = 0;
        Reflect.set(rgbc, index, value);
      }
      return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
    }
  };
  var TryCatch = function (...args) {
    let callbackFunction = null;
    let context = null;
    let handleError = () => {};
    let defaultDetails = { log: true };
    const TryCatchCore = {
      config(paramDetails) {
        defaultDetails = Object.assign(defaultDetails, paramDetails);
        return TryCatchCore;
      },
      error(handler) {
        handleError = handler;
        return TryCatchCore;
      },
      run(callback, __context__) {
        callbackFunction = callback;
        context = __context__ || this;
        const result = executeTryCatch(callbackFunction, handleError, context);
        return result !== void 0 ? result : TryCatchCore;
      },
    };
    function executeTryCatch(callback, handleErrorFunc, funcThis) {
      let result = void 0;
      try {
        if (typeof callback === "string") result = new Function(callback).apply(funcThis, args);
        else result = callback.apply(funcThis, args);
      } catch (error) {
        if (defaultDetails.log) {
          callback = callback;
          console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
          console.log(`%c ${error}`, "color: #f20000");
          console.trace(callback);
        }
        if (handleErrorFunc)
          if (typeof handleErrorFunc === "string")
            result = new Function(handleErrorFunc).apply(funcThis, [...args, error]);
          else result = handleErrorFunc.apply(funcThis, [...args, error]);
      }
      return result;
    }
    return TryCatchCore;
  };
  var CommonUtil$1 = class {
    assign(target = {}, source = {}, isAdd = false) {
      const UtilsContext = this;
      if (Array.isArray(source)) {
        if (
          !source.filter((item) => {
            return typeof item === "object";
          }).length
        )
          return source;
      }
      if (source == null) return target;
      if (target == null) target = {};
      let iteratorTarget;
      if (isAdd) iteratorTarget = source;
      else iteratorTarget = target;
      for (const keyName in iteratorTarget) {
        if (!isAdd && !(keyName in source)) continue;
        const targetValue = Reflect.get(target, keyName);
        const sourceValue = Reflect.get(source, keyName);
        if (
          typeof sourceValue === "object" &&
          sourceValue != null &&
          keyName in target &&
          !UtilsContext.isDOM(sourceValue)
        ) {
          let childObjectValue;
          if (Array.isArray(sourceValue)) {
            if (Array.isArray(targetValue)) targetValue.length = 0;
            childObjectValue = sourceValue;
          } else childObjectValue = UtilsContext.assign(targetValue, sourceValue, isAdd);
          Reflect.set(target, keyName, childObjectValue);
        } else Reflect.set(target, keyName, sourceValue);
      }
      return target;
    }
    isNull(...args) {
      let result = true;
      const checkList = [...args];
      for (const obj of checkList) {
        let flag = false;
        if (obj === null || obj === void 0) flag = true;
        else
          switch (typeof obj) {
            case "object":
              if (typeof obj[Symbol.iterator] === "function")
                if (obj instanceof Map) flag = obj.size === 0;
                else {
                  const length = obj.length;
                  if (typeof length === "number") flag = length === 0;
                }
              else if (obj?.toString() === "[object Object]") flag = Object.keys(obj).length === 0;
              break;
            case "number":
              flag = isNaN(obj) ? true : obj === 0;
              break;
            case "string": {
              const trimStr = obj.trim();
              flag = trimStr.trim() === "" || trimStr === "null" || trimStr === "undefined";
              break;
            }
            case "boolean":
              flag = !obj;
              break;
            case "function": {
              const funcStr = obj.toString().replace(/\s/g, "");
              flag = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
              break;
            }
          }
        result = result && flag;
      }
      return result;
    }
    isDOM(target) {
      return target instanceof Node;
    }
    isNotNull(...args) {
      return !this.isNull.apply(this, args);
    }
    deepClone(obj) {
      const UtilsContext = this;
      if (obj === void 0) return void 0;
      if (obj === null) return null;
      const clone = obj instanceof Array ? [] : {};
      for (const [key, value] of Object.entries(obj))
        if (typeof value === "object") Reflect.set(clone, key, UtilsContext.deepClone(value));
        else Reflect.set(clone, key, value);
      return clone;
    }
    coverObjectFunctionThis(target, objectThis) {
      if (typeof target !== "object" || target === null) throw new Error("target must be object");
      objectThis = objectThis || target;
      Object.keys(target).forEach((key) => {
        if (typeof target[key] === "function") target[key] = target[key].bind(objectThis);
      });
    }
    toJSON(data, errorCallBack) {
      let result = {};
      if (data == null) return result;
      if (typeof data === "object") return data;
      TryCatch()
        .config({ log: false })
        .error(() => {
          TryCatch()
            .error(() => {
              try {
                result = new Function(`return ${data}`)();
              } catch (error2) {
                if (typeof errorCallBack === "function") errorCallBack(error2);
              }
            })
            .run(() => {
              if (
                data &&
                /^[\],:{}\s]*$/.test(
                  data
                    .replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
                    .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
                    .replace(/(?:^|:|,)(?:\s*\[)+/g, "")
                )
              )
                result = new Function(`return ${data}`)();
              else if (typeof errorCallBack === "function") errorCallBack(new Error("target is not JSON object"));
            });
        })
        .run(() => {
          data = data.trim();
          result = JSON.parse(data);
        });
      return result;
    }
  };
  var commonUtil = new CommonUtil$1();
  var UtilsDictionary = class {
    items;
    constructor(...args) {
      this.items = new Map();
      if (args.length === 1) {
        const data = args[0];
        if (Array.isArray(data))
          for (let index = 0; index < data.length; index++) {
            const item = data[index];
            if (Array.isArray(item)) {
              const [key, value] = item;
              this.set(key, value);
            }
          }
        else if (typeof data === "object" && data != null) {
          for (const key in data) if (Reflect.has(data, key)) this.set(key, data[key]);
        }
      } else if (args.length === 2) {
        const [key, value] = args;
        this.set(key, value);
      }
    }
    [Symbol.dispose]() {
      this.clear();
    }
    async [Symbol.asyncDispose]() {
      this.clear();
    }
    get length() {
      return this.size();
    }
    get entries() {
      const that = this;
      return function* () {
        const itemKeys = that.keys();
        for (const keyName of itemKeys) yield [keyName, that.get(keyName)];
      };
    }
    get [Symbol.iterator]() {
      return () => {
        return this.entries();
      };
    }
    has(key) {
      return this.items.has(key);
    }
    get(key) {
      return this.items.get(key);
    }
    set(key, val) {
      if (key === void 0) throw new Error("Utils.Dictionary().set 参数 key 不能为undefined");
      this.items.set(key, val);
    }
    delete(key) {
      if (this.has(key)) return this.items.delete(key);
      return false;
    }
    keys() {
      const keys = this.items.keys();
      if (typeof keys.toArray === "function") return keys.toArray();
      else return [...keys];
    }
    values() {
      const values = this.items.values();
      if (typeof values.toArray === "function") return values.toArray();
      else return [...values];
    }
    clear() {
      this.items.clear();
    }
    size() {
      return this.items.size;
    }
    getItems() {
      return this.items;
    }
    concat(data) {
      data.forEach((value, key) => {
        this.items.set(key, value);
      });
    }
    forEach(cb) {
      this.items.forEach((value, key) => {
        cb(value, key, this);
      });
    }
    find(cb) {
      for (const [key, value] of this.items.entries()) {
        const result = cb(value, key, this);
        if (result) return result;
      }
    }
    startsWith(key) {
      const keys = this.keys();
      for (const keyName of keys) if (String(keyName).startsWith(key)) return true;
      return false;
    }
    getStartsWith(key) {
      let result = void 0;
      const keys = this.keys();
      for (const keyName of keys)
        if (String(keyName).startsWith(String(key))) {
          result = this.get(keyName);
          break;
        }
      return result;
    }
  };
  var WindowApi = class {
    defaultApi = {
      document,
      window,
      globalThis,
      self,
      top,
      setTimeout: globalThis.setTimeout.bind(globalThis),
      setInterval: globalThis.setInterval.bind(globalThis),
      clearTimeout: globalThis.clearTimeout.bind(globalThis),
      clearInterval: globalThis.clearInterval.bind(globalThis),
    };
    api;
    constructor(option) {
      if (option) {
        if (option.globalThis == null) option.globalThis = option.window;
        if (option.self == null) option.self = option.window;
      }
      if (!option) option = Object.assign({}, this.defaultApi);
      this.api = Object.assign({}, option);
    }
    get document() {
      return this.api.document;
    }
    get window() {
      return this.api.window;
    }
    get globalThis() {
      return this.api.globalThis;
    }
    get self() {
      return this.api.self;
    }
    get top() {
      return this.api.top;
    }
    get setTimeout() {
      return this.api.setTimeout;
    }
    get setInterval() {
      return this.api.setInterval;
    }
    get clearTimeout() {
      return this.api.clearTimeout;
    }
    get clearInterval() {
      return this.api.clearInterval;
    }
  };
  var DOMUtils = class {
    windowApi;
    constructor(option) {
      this.windowApi = new WindowApi(option);
    }
    selector(selector, parent) {
      return this.selectorAll(selector, parent)[0];
    }
    selectorAll(selector, parent) {
      const context = this;
      parent = parent || context.windowApi.document;
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return $ele?.innerHTML?.trim() === "";
        });
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return ($ele?.textContent || $ele?.innerText)?.includes(text);
        });
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
          return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
        });
      } else return Array.from(parent.querySelectorAll(selector));
    }
    matches($el, selector) {
      selector = selector.trim();
      if ($el == null) return false;
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        return $el.matches(selector) && $el?.innerHTML?.trim() === "";
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") content = "";
        return $el.matches(selector) && content?.includes(text);
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        let content = $el?.textContent || $el?.innerText;
        if (typeof content !== "string") content = "";
        return $el.matches(selector) && Boolean(content?.match(regexp));
      } else return $el.matches(selector);
    }
    closest($el, selector) {
      selector = selector.trim();
      if (selector.match(/[^\s]{1}:empty$/gi)) {
        selector = selector.replace(/:empty$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest && $closest?.innerHTML?.trim() === "") return $closest;
        return null;
      } else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
        const text = selector.match(/:contains\(("|')(.*)("|')\)$/i)[2];
        selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          const content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.includes(text)) return $closest;
        }
        return null;
      } else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
        let pattern = selector.match(/:regexp\(("|')(.*)("|')\)$/i)[2];
        const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
        let flags = "";
        if (flagMatch) {
          pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
          flags = flagMatch[3];
        }
        const regexp = new RegExp(pattern, flags);
        selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
        const $closest = $el?.closest(selector);
        if ($closest) {
          const content = $el?.textContent || $el?.innerText;
          if (typeof content === "string" && content.match(regexp)) return $closest;
        }
        return null;
      } else return $el?.closest(selector);
    }
  };
  var domUtils$1 = new DOMUtils();
  var GBKEncoder = class {
    #data;
    #U2Ghash = {};
    #G2Uhash = {};
    constructor() {
      const dataText = this.handleText(
        "4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364"
      );
      let index = 0;
      this.#data = dataText.match(/..../g);
      for (let i = 129; i <= 254; i++)
        for (let j = 64; j <= 254; j++)
          this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
      for (const key in this.#U2Ghash) {
        const u2ghashValue = Reflect.get(this.#U2Ghash, key);
        Reflect.set(this.#G2Uhash, u2ghashValue, key);
      }
    }
    handleText(text) {
      text = text
        .replace(/#(\d+)\$/g, function (_, b) {
          return Array(+b + 3).join("#");
        })
        .replace(/#/g, "####")
        .replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
          return dt.replace(/../g, function (a) {
            if (a != "##") return hd + a;
            else return a;
          });
        });
      return text;
    }
    isAscii(unicode) {
      return unicode <= 127 && unicode >= 0;
    }
    encode(str) {
      const that = this;
      return [...str].reduce((result, val) => {
        return result + toGBK(val);
      }, "");
      function toGBK(val) {
        let result = "";
        for (let i = 0; i < val.length; i++) {
          const codePoint = val.codePointAt(i);
          const code = String.fromCodePoint(codePoint);
          let key = codePoint.toString(16);
          key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
          i += code.length - 1;
          if (that.isAscii(codePoint)) {
            result += encodeURIComponent(code);
            continue;
          }
          if (that.#U2Ghash[key]) {
            result += that.#U2Ghash[key];
            continue;
          }
          result += toGBK(`&#${codePoint};`);
        }
        return result;
      }
    }
    decode(str) {
      const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
      const UTFMatcher = /%[0-9A-F]{2}/;
      let utf = true;
      const that = this;
      while (utf) {
        const gbkMatch = str.match(GBKMatcher);
        const utfMatch = str.match(UTFMatcher);
        utf = Boolean(utfMatch);
        if (gbkMatch && gbkMatch in that.#G2Uhash)
          str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
        else str = str.replace(utfMatch, decodeURIComponent(utfMatch));
      }
      return str;
    }
  };
  var Hooks = class {
    initEnv() {
      Function.prototype.hook = function (_, hookFunc, context) {
        let _context = null;
        let _funcName = null;
        _context = context || window;
        _funcName = getFuncName(this);
        _context[`realFunc_${_funcName}`] = this;
        if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
          console.log("Already has been hooked,unhook first");
          return false;
        }
        function getFuncName(fn) {
          const patten = fn.toString().match(/function\s+(\w+)\s*\(/);
          if (patten) return patten[1];
          return "";
        }
        try {
          new Function(
            "_context",
            "_funcName",
            "hookFunc",
            `_context[_funcName] = function ${_funcName}() {
        let args = Array.prototype.slice.call(arguments, 0);
        let obj = this;
        hookFunc.apply(obj, args);
        return _context['realFunc_${_funcName}'].apply(obj, args);
    };`
          )(_context, _funcName, hookFunc);
          _context[_funcName].prototype.isHooked = true;
          return true;
        } catch (e) {
          console.log("Hook failed,check the params.", e);
          return false;
        }
      };
      Function.prototype.unhook = function (_, funcName, context) {
        let _context = null;
        let _funcName = null;
        _context = context || window;
        _funcName = funcName;
        if (!_context[_funcName].prototype.isHooked) {
          console.log("No function is hooked on");
          return false;
        }
        _context[_funcName] = _context[`realFunc${_funcName}`];
        Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
        return true;
      };
    }
    cleanEnv() {
      if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook"))
        Reflect.deleteProperty(Function.prototype, "hook");
      if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook"))
        Reflect.deleteProperty(Function.prototype, "unhook");
      return true;
    }
  };
  var GenerateUUID = function () {
    if (typeof window?.crypto?.randomUUID === "function") return window.crypto.randomUUID();
    else
      return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
        const randomValue = (Math.random() * 16) | 0;
        return (charStr === "x" ? randomValue : (randomValue & 3) | 8).toString(16);
      });
  };
  var Httpx = class {
    GM_Api = { xmlHttpRequest: null };
    HttpxRequestHook = {
      $config: { configList: [] },
      async beforeRequestCallBack(details) {
        if (typeof details.allowInterceptConfig === "boolean") {
          if (!details.allowInterceptConfig) return details;
        } else if (details.allowInterceptConfig != null) {
          if (
            typeof details.allowInterceptConfig.beforeRequest === "boolean" &&
            !details.allowInterceptConfig.beforeRequest
          )
            return details;
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          const item = this.$config.configList[index];
          if (typeof item.fn === "function") {
            if ((await item.fn(details)) == null) return;
          }
        }
        return details;
      },
      add(fn) {
        if (typeof fn === "function") {
          const uuid = GenerateUUID();
          this.$config.configList.push({
            id: uuid,
            fn,
          });
          return uuid;
        } else console.warn("[Httpx-HttpxRequestHook.addBeforeRequestCallBack] fn is not a function");
      },
      delete(id) {
        if (typeof id === "string") {
          const findIndex = this.$config.configList.findIndex((item) => item.id === id);
          if (findIndex !== -1) {
            this.$config.configList.splice(findIndex, 1);
            return true;
          }
        }
        return false;
      },
      clearAll() {
        this.$config.configList = [];
      },
    };
    HttpxResponseHook = {
      $config: { configList: [] },
      async successResponseCallBack(response, details) {
        if (typeof details.allowInterceptConfig === "boolean") {
          if (!details.allowInterceptConfig) return details;
        } else if (details.allowInterceptConfig != null) {
          if (
            typeof details.allowInterceptConfig.afterResponseSuccess === "boolean" &&
            !details.allowInterceptConfig.afterResponseSuccess
          )
            return details;
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          const item = this.$config.configList[index];
          if (typeof item.successFn === "function") {
            if ((await item.successFn(response, details)) == null) return;
          }
        }
        return response;
      },
      async errorResponseCallBack(data) {
        if (typeof data.details.allowInterceptConfig === "boolean") {
          if (!data.details.allowInterceptConfig) return data;
        } else if (data.details.allowInterceptConfig != null) {
          if (
            typeof data.details.allowInterceptConfig.afterResponseError === "boolean" &&
            !data.details.allowInterceptConfig.afterResponseError
          )
            return data;
        }
        for (let index = 0; index < this.$config.configList.length; index++) {
          const item = this.$config.configList[index];
          if (typeof item.errorFn === "function") {
            if ((await item.errorFn(data)) == null) return;
          }
        }
        return data;
      },
      add(successFn, errorFn) {
        const id = GenerateUUID();
        this.$config.configList.push({
          id,
          successFn,
          errorFn,
        });
        return id;
      },
      delete(id) {
        if (typeof id === "string") {
          const findIndex = this.$config.configList.findIndex((item) => item.id === id);
          if (findIndex !== -1) {
            this.$config.configList.splice(findIndex, 1);
            return true;
          }
        }
        return false;
      },
      clearAll() {
        this.$config.configList = [];
      },
    };
    HttpxRequestOption = {
      context: this,
      handleBeforeRequestOptionArgs(...args) {
        const option = { url: void 0 };
        if (typeof args[0] === "string") {
          const url = args[0];
          option.url = url;
          if (typeof args[1] === "object") {
            const optionArg = args[1];
            commonUtil.assign(option, optionArg, true);
            option.url = url;
          }
        } else {
          const optionArg = args[0];
          commonUtil.assign(option, optionArg, true);
        }
        return option;
      },
      getRequestOption(method, userRequestOption, resolve, reject) {
        const that = this;
        let url = userRequestOption.url || this.context.#defaultRequestOption.url;
        if (typeof url === "string") {
          url = url.trim();
          if (url.startsWith("http://") || url.startsWith("https://"));
          else if (typeof this.context.#defaultInitOption.baseURL === "string")
            url = this.context.#defaultInitOption.baseURL + url;
        }
        const requestOption = {
          url,
          method: (method || "GET").toString().toUpperCase().trim(),
          timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
          responseType: userRequestOption.responseType || this.context.#defaultRequestOption.responseType,
          headers: commonUtil.deepClone(this.context.#defaultRequestOption.headers),
          data: userRequestOption.data || this.context.#defaultRequestOption.data,
          redirect: userRequestOption.redirect || this.context.#defaultRequestOption.redirect,
          cookie: userRequestOption.cookie || this.context.#defaultRequestOption.cookie,
          cookiePartition: userRequestOption.cookiePartition || this.context.#defaultRequestOption.cookiePartition,
          binary: userRequestOption.binary || this.context.#defaultRequestOption.binary,
          nocache: userRequestOption.nocache || this.context.#defaultRequestOption.nocache,
          revalidate: userRequestOption.revalidate || this.context.#defaultRequestOption.revalidate,
          context: commonUtil.deepClone(userRequestOption.context || this.context.#defaultRequestOption.context),
          overrideMimeType: userRequestOption.overrideMimeType || this.context.#defaultRequestOption.overrideMimeType,
          anonymous: userRequestOption.anonymous || this.context.#defaultRequestOption.anonymous,
          fetch: userRequestOption.fetch || this.context.#defaultRequestOption.fetch,
          fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
          allowInterceptConfig: {
            beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig.beforeRequest,
            afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseSuccess,
            afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig.afterResponseError,
          },
          user: userRequestOption.user || this.context.#defaultRequestOption.user,
          password: userRequestOption.password || this.context.#defaultRequestOption.password,
          onabort(...args) {
            that.context.HttpxResponseCallBack.onAbort(userRequestOption, resolve, reject, args);
          },
          onerror(...args) {
            that.context.HttpxResponseCallBack.onError(userRequestOption, resolve, reject, args);
          },
          onloadstart(...args) {
            that.context.HttpxResponseCallBack.onLoadStart(userRequestOption, args);
          },
          onprogress(...args) {
            that.context.HttpxResponseCallBack.onProgress(userRequestOption, args);
          },
          onreadystatechange(...args) {
            that.context.HttpxResponseCallBack.onReadyStateChange(userRequestOption, args);
          },
          ontimeout(...args) {
            that.context.HttpxResponseCallBack.onTimeout(userRequestOption, resolve, reject, args);
          },
          onload(...args) {
            that.context.HttpxResponseCallBack.onLoad(userRequestOption, resolve, reject, args);
          },
        };
        if (typeof userRequestOption.allowInterceptConfig === "boolean")
          Object.keys(requestOption.allowInterceptConfig).forEach((keyName) => {
            Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
          });
        else if (
          typeof userRequestOption.allowInterceptConfig === "object" &&
          userRequestOption.allowInterceptConfig != null
        )
          Object.keys(requestOption.allowInterceptConfig).forEach((keyName) => {
            const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
            if (typeof value === "boolean" && Reflect.has(requestOption.allowInterceptConfig, keyName))
              Reflect.set(requestOption.allowInterceptConfig, keyName, value);
          });
        if (typeof this.context.GM_Api.xmlHttpRequest !== "function") requestOption.fetch = true;
        if (typeof requestOption.headers === "object") {
          if (typeof userRequestOption.headers === "object")
            Object.keys(requestOption.headers).forEach((keyName) => {
              if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null)
                Reflect.deleteProperty(requestOption.headers, keyName);
              else requestOption.headers[keyName] = userRequestOption?.headers?.[keyName];
            });
        } else Reflect.set(requestOption, "headers", userRequestOption.headers);
        if (typeof requestOption.fetchInit === "object") {
          if (typeof userRequestOption.fetchInit === "object")
            Object.keys(requestOption.fetchInit).forEach((keyName) => {
              if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null)
                Reflect.deleteProperty(requestOption.fetchInit, keyName);
              else Reflect.set(requestOption.fetchInit, keyName, Reflect.get(userRequestOption.fetchInit, keyName));
            });
        } else Reflect.set(requestOption, "fetchInit", userRequestOption.fetchInit);
        if (typeof requestOption.cookiePartition === "object" && requestOption.cookiePartition != null) {
          if (
            Reflect.has(requestOption.cookiePartition, "topLevelSite") &&
            typeof requestOption.cookiePartition.topLevelSite !== "string"
          )
            Reflect.deleteProperty(requestOption.cookiePartition, "topLevelSite");
        }
        try {
          new URL(requestOption.url);
        } catch {
          if (requestOption.url.startsWith("//")) requestOption.url = globalThis.location.protocol + requestOption.url;
          else if (requestOption.url.startsWith("/"))
            requestOption.url = globalThis.location.origin + requestOption.url;
          else requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
        }
        if (requestOption.fetchInit && !requestOption.fetch) Reflect.deleteProperty(requestOption, "fetchInit");
        try {
          const processData = userRequestOption.processData ?? true;
          if (requestOption.data != null && processData) {
            const method = requestOption.method;
            if (method === "GET" || method === "HEAD") {
              const urlInst = new URL(requestOption.url);
              let urlSearch = "";
              let deleteData = false;
              if (typeof requestOption.data === "string") {
                deleteData = true;
                urlSearch = requestOption.data;
              } else if (typeof requestOption.data === "object") {
                deleteData = true;
                urlSearch = new URLSearchParams(requestOption.data).toString();
              }
              if (deleteData) Reflect.deleteProperty(requestOption, "data");
              if (urlSearch.trim() != "")
                if (urlInst.search.trim() === "") urlInst.search = urlSearch;
                else if (urlInst.search.trim().endsWith("&")) urlInst.search = urlInst.search + urlSearch;
                else urlInst.search = `${urlInst.search}&${urlSearch}`;
              requestOption.url = urlInst.toString();
            } else if (method === "POST" && requestOption.headers != null) {
              const headersKeyList = Object.keys(requestOption.headers);
              const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
                return (
                  headerKey.trim().toLowerCase() === "content-type" &&
                  typeof requestOption.headers[headerKey] === "string"
                );
              });
              if (ContentTypeIndex !== -1) {
                const contentTypeKey = headersKeyList[ContentTypeIndex];
                const contentType = requestOption.headers[contentTypeKey].toLowerCase();
                if (contentType.includes("application/json")) {
                  if (requestOption.data instanceof FormData) {
                    const entries = {};
                    requestOption.data.forEach((value, key) => {
                      entries[key] = value;
                    });
                    requestOption.data = JSON.stringify(entries);
                  } else if (typeof requestOption.data === "object")
                    requestOption.data = JSON.stringify(requestOption.data);
                } else if (contentType.includes("application/x-www-form-urlencoded")) {
                  if (typeof requestOption.data === "object")
                    requestOption.data = new URLSearchParams(requestOption.data).toString();
                } else if (contentType.includes("multipart/form-data")) {
                  if (requestOption.data instanceof FormData)
                    Reflect.deleteProperty(requestOption.headers, contentTypeKey);
                }
              }
            }
          }
        } catch (error) {
          console.warn("Httpx ==> 转换data参数错误", error);
        }
        return requestOption;
      },
      removeRequestNullOption(option) {
        Object.keys(option).forEach((keyName) => {
          const optionValue = option[keyName];
          if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
            Reflect.deleteProperty(option, keyName);
            return;
          }
        });
        if (commonUtil.isNull(option.url)) throw new TypeError(`Utils.Httpx 参数url不能为空:${option.url}`);
        return option;
      },
      handleFetchOption(option) {
        const fetchRequestOption = {};
        if ((option.method === "GET" || option.method === "HEAD") && option.data != null)
          Reflect.deleteProperty(option, "data");
        const abortController = new AbortController();
        const signal = abortController.signal;
        signal.onabort = () => {
          option.onabort({
            isFetch: true,
            responseText: "",
            response: null,
            readyState: 4,
            responseHeaders: "",
            status: 0,
            statusText: "",
            error: "aborted",
          });
        };
        fetchRequestOption.method = option.method ?? "GET";
        fetchRequestOption.headers = option.headers;
        fetchRequestOption.body = option.data;
        fetchRequestOption.mode = "cors";
        fetchRequestOption.credentials = "include";
        fetchRequestOption.cache = "no-cache";
        fetchRequestOption.redirect = "follow";
        fetchRequestOption.referrerPolicy = "origin-when-cross-origin";
        fetchRequestOption.signal = signal;
        Object.assign(fetchRequestOption, option.fetchInit || {});
        return {
          fetchOption: option,
          fetchRequestOption,
          abortController,
        };
      },
    };
    HttpxResponseCallBack = {
      context: this,
      async onAbort(details, resolve, _reject, argsResult) {
        if (typeof details?.onabort === "function") details.onabort.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.onabort === "function")
          this.context.#defaultRequestOption.onabort.apply(this, argsResult);
        let response = argsResult;
        if (response.length) response = response[0];
        if (
          (await this.context.HttpxResponseHook.errorResponseCallBack({
            type: "onabort",
            error: new Error("request canceled"),
            response: null,
            details,
          })) == null
        )
          return;
        resolve({
          data: response,
          details,
          msg: "请求被取消",
          status: false,
          statusCode: -1,
          type: "onabort",
        });
      },
      async onTimeout(details, resolve, _reject, argsResult) {
        if (typeof details?.ontimeout === "function") details.ontimeout.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.ontimeout === "function")
          this.context.#defaultRequestOption.ontimeout.apply(this, argsResult);
        let response = argsResult;
        if (response.length) response = response[0];
        if (
          (await this.context.HttpxResponseHook.errorResponseCallBack({
            type: "ontimeout",
            error: new Error("request timeout"),
            response,
            details,
          })) == null
        )
          return;
        resolve({
          data: response,
          details,
          msg: "请求超时",
          status: false,
          statusCode: 0,
          type: "ontimeout",
        });
      },
      async onError(details, resolve, _reject, argsResult) {
        if (typeof details?.onerror === "function") details.onerror.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.onerror === "function")
          this.context.#defaultRequestOption.onerror.apply(this, argsResult);
        let response = argsResult;
        if (response.length) response = response[0];
        if (
          (await this.context.HttpxResponseHook.errorResponseCallBack({
            type: "onerror",
            error: new Error("request error"),
            response,
            details,
          })) == null
        )
          return;
        resolve({
          data: response,
          details,
          msg: "请求异常",
          status: false,
          statusCode: response["status"],
          type: "onerror",
        });
      },
      async onLoad(details, resolve, _reject, argsResult) {
        const originResponse = argsResult[0];
        if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"]))
          if (typeof originResponse["response"] === "object")
            TryCatch().run(() => {
              originResponse["responseText"] = JSON.stringify(originResponse["response"]);
            });
          else originResponse["responseText"] = originResponse["response"];
        if (
          originResponse["response"] == null &&
          typeof originResponse["responseText"] === "string" &&
          originResponse["responseText"].trim() !== ""
        ) {
          const httpxResponseText = originResponse.responseText;
          let httpxResponse = httpxResponseText;
          if (details.responseType === "json") httpxResponse = commonUtil.toJSON(httpxResponseText);
          else if (details.responseType === "document")
            httpxResponse = new DOMParser().parseFromString(httpxResponseText, "text/html");
          else if (details.responseType === "arraybuffer") httpxResponse = new TextEncoder().encode(httpxResponseText);
          else if (details.responseType === "blob") {
            const arrayBuffer = new TextEncoder().encode(httpxResponseText);
            httpxResponse = new Blob([arrayBuffer]);
          }
          try {
            if (!Reflect.set(originResponse, "response", httpxResponse)) {
              console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
              try {
                Reflect.set(originResponse, "httpxResponse", httpxResponse);
              } catch {
                console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
              }
            }
          } catch {
            console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
            try {
              Reflect.set(originResponse, "httpxResponse", httpxResponse);
            } catch {
              console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
            }
          }
        }
        const originResponseURL = Reflect.get(originResponse, "responseURL");
        if (originResponse["finalUrl"] == null && originResponseURL != null)
          Reflect.set(originResponse, "finalUrl", originResponseURL);
        if (Math.floor(originResponse.status / 100) === 2) {
          if ((await this.context.HttpxResponseHook.successResponseCallBack(originResponse, details)) == null) return;
          resolve({
            data: originResponse,
            details,
            msg: "请求成功",
            status: true,
            statusCode: originResponse.status,
            type: "onload",
          });
        } else this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
      },
      onLoadStart(details, argsResult) {
        if (typeof details?.onloadstart === "function") details.onloadstart.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.onloadstart === "function")
          this.context.#defaultRequestOption.onloadstart.apply(this, argsResult);
      },
      onReadyStateChange(details, argsResult) {
        if (typeof details?.onreadystatechange === "function") details.onreadystatechange.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.onreadystatechange === "function")
          this.context.#defaultRequestOption.onreadystatechange.apply(this, argsResult);
      },
      onProgress(details, argsResult) {
        if (typeof details?.onprogress === "function") details.onprogress.apply(this, argsResult);
        else if (typeof this.context.#defaultRequestOption?.onprogress === "function")
          this.context.#defaultRequestOption.onprogress.apply(this, argsResult);
      },
    };
    HttpxRequest = {
      context: this,
      async request(details) {
        if (this.context.#defaultInitOption.logDetails)
          console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
        if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
          if ((await this.context.HttpxRequestHook.beforeRequestCallBack(details)) == null) return;
        }
        if (details.fetch) {
          const { fetchOption, fetchRequestOption, abortController } =
            this.context.HttpxRequestOption.handleFetchOption(details);
          return this.fetch(fetchOption, fetchRequestOption, abortController);
        } else return this.xmlHttpRequest(details);
      },
      xmlHttpRequest(details) {
        return this.context.GM_Api.xmlHttpRequest(details);
      },
      fetch(option, fetchRequestOption, abortController) {
        fetch(option.url, fetchRequestOption)
          .then(async (fetchResponse) => {
            const httpxResponse = {
              isFetch: true,
              finalUrl: fetchResponse.url,
              readyState: 4,
              status: fetchResponse.status,
              statusText: fetchResponse.statusText,
              response: "",
              responseFetchHeaders: fetchResponse.headers,
              responseHeaders: "",
              responseText: "",
              responseType: option.responseType,
              responseXML: void 0,
            };
            Object.assign(httpxResponse, option.context || {});
            fetchResponse.headers.forEach((value, key) => {
              httpxResponse.responseHeaders += `${key}: ${value}\n`;
            });
            const fetchResponseType = fetchResponse.headers.get("Content-Type");
            if (
              option.responseType === "stream" ||
              (fetchResponse.headers.has("Content-Type") &&
                fetchResponse.headers.get("Content-Type").includes("text/event-stream"))
            ) {
              Reflect.set(httpxResponse, "isStream", true);
              Reflect.set(httpxResponse, "response", fetchResponse.body);
              Reflect.deleteProperty(httpxResponse, "responseText");
              Reflect.deleteProperty(httpxResponse, "responseXML");
              option.onload(httpxResponse);
              return;
            }
            let response = "";
            let responseText = "";
            let responseXML = "";
            const arrayBuffer = await fetchResponse.arrayBuffer();
            let encoding = "utf-8";
            if (fetchResponse.headers.has("Content-Type")) {
              const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
              if (charsetMatched) {
                encoding = charsetMatched[1];
                encoding = encoding.toLowerCase();
              }
            }
            encoding = encoding.replace(/('|")/gi, "");
            responseText = new TextDecoder(encoding).decode(arrayBuffer);
            response = responseText;
            if (option.responseType === "arraybuffer") response = arrayBuffer;
            else if (option.responseType === "blob") response = new Blob([arrayBuffer]);
            else if (
              option.responseType === "json" ||
              (typeof fetchResponseType === "string" && fetchResponseType.includes("application/json"))
            )
              response = commonUtil.toJSON(responseText);
            else if (option.responseType === "document" || option.responseType == null)
              response = new DOMParser().parseFromString(responseText, "text/html");
            responseXML = new DOMParser().parseFromString(responseText, "text/xml");
            httpxResponse.response = response;
            httpxResponse.responseText = responseText;
            httpxResponse.responseXML = responseXML;
            option.onload(httpxResponse);
          })
          .catch((error) => {
            if (error.name === "AbortError") return;
            option.onerror({
              isFetch: true,
              finalUrl: option.url,
              readyState: 4,
              status: 0,
              statusText: "",
              responseHeaders: "",
              responseText: "",
              error,
            });
          });
        option.onloadstart({
          isFetch: true,
          finalUrl: option.url,
          readyState: 1,
          responseHeaders: "",
          responseText: "",
          status: 0,
          statusText: "",
        });
        return {
          abort() {
            abortController.abort();
          },
        };
      },
    };
    #defaultRequestOption = {
      url: void 0,
      timeout: 5e3,
      async: false,
      responseType: void 0,
      headers: void 0,
      data: void 0,
      redirect: void 0,
      cookie: void 0,
      cookiePartition: void 0,
      binary: void 0,
      nocache: void 0,
      revalidate: void 0,
      context: void 0,
      overrideMimeType: void 0,
      anonymous: void 0,
      fetch: void 0,
      fetchInit: void 0,
      allowInterceptConfig: {
        beforeRequest: true,
        afterResponseSuccess: true,
        afterResponseError: true,
      },
      user: void 0,
      password: void 0,
      onabort() {},
      onerror() {},
      ontimeout() {},
      onloadstart() {},
      onreadystatechange() {},
      onprogress() {},
    };
    #defaultInitOption = {
      baseURL: void 0,
      logDetails: false,
    };
    constructor(option = {}) {
      if (typeof option.xmlHttpRequest !== "function")
        console.warn(
          "[Httpx-constructor] 未传入GM_xmlhttpRequest函数或传入的GM_xmlhttpRequest不是Function,将默认使用window.fetch"
        );
      commonUtil.coverObjectFunctionThis(this);
      this.interceptors.request.context = this;
      this.interceptors.response.context = this;
      this.config(option);
    }
    config(option = {}) {
      if (typeof option.xmlHttpRequest === "function") this.GM_Api.xmlHttpRequest = option.xmlHttpRequest;
      this.#defaultRequestOption = commonUtil.assign(this.#defaultRequestOption, option);
      this.#defaultInitOption = commonUtil.assign(this.#defaultInitOption, option);
    }
    interceptors = {
      request: {
        context: null,
        use(fn) {
          if (typeof fn !== "function") {
            console.warn("[Httpx-interceptors-request] 请传入拦截器函数");
            return;
          }
          return this.context.HttpxRequestHook.add(fn);
        },
        eject(id) {
          return this.context.HttpxRequestHook.delete(id);
        },
        ejectAll() {
          this.context.HttpxRequestHook.clearAll();
        },
      },
      response: {
        context: null,
        use(successFn, errorFn) {
          if (typeof successFn !== "function" && typeof errorFn !== "function") {
            console.warn("[Httpx-interceptors-response] 必须传入一个拦截器函数");
            return;
          }
          return this.context.HttpxResponseHook.add(successFn, errorFn);
        },
        eject(id) {
          return this.context.HttpxResponseHook.delete(id);
        },
        ejectAll() {
          this.context.HttpxResponseHook.clearAll();
        },
      },
    };
    setXMLHttpRequest(httpRequest) {
      this.GM_Api.xmlHttpRequest = httpRequest;
    }
    get(...args) {
      const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "GET";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
    post(...args) {
      const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "POST";
      return this.request(useRequestOption);
    }
    head(...args) {
      const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "HEAD";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
    options(...args) {
      const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "OPTIONS";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
    delete(...args) {
      const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      useRequestOption.method = "DELETE";
      return this.request(useRequestOption, (option) => {
        Reflect.deleteProperty(option, "onprogress");
      });
    }
    put(...args) {
      const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
      userRequestOption.method = "PUT";
      return this.request(userRequestOption);
    }
    request(details, beforeRequestOption) {
      const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
      let abortFn = null;
      const promise = new globalThis.Promise(async (resolve, reject) => {
        let requestOption = this.HttpxRequestOption.getRequestOption(
          userRequestOption.method,
          userRequestOption,
          (resultOption) => {
            resolve(resultOption);
          },
          (...args) => {
            reject(...args);
          }
        );
        requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
        if (typeof beforeRequestOption === "function") beforeRequestOption(requestOption);
        const requestResult = await this.HttpxRequest.request(requestOption);
        if (requestResult != null && typeof requestResult.abort === "function")
          abortFn = () => {
            requestResult.abort();
          };
      });
      promise.abort = () => {
        if (typeof abortFn === "function") abortFn();
      };
      return promise;
    }
  };
  var indexedDB = class {
    #dbName;
    #storeName;
    #dbVersion;
    #indexedDB =
      globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
    #db = {};
    #statusCode = {
      operationSuccess: {
        code: 200,
        msg: "操作成功",
      },
      operationFailed: {
        code: 401,
        msg: "操作失败",
      },
      empty: {
        code: 201,
        msg: "操作成功,但是没有数据",
      },
      openFailed: {
        code: 91001,
        msg: "打开数据库失败",
      },
      saveFailed: {
        code: 91002,
        msg: "保存数据失败",
      },
      getFailed: {
        code: 91003,
        msg: "获取数据失败",
      },
      deleteFailed: {
        code: 91004,
        msg: "删除数据失败",
      },
      deleteAllFailed: {
        code: 91005,
        msg: "清空数据库失败",
      },
      regexpGetFailed: {
        code: 91006,
        msg: "正则获取数据失败",
      },
    };
    constructor(dbName = "default_db", storeName = "default_form", dbVersion = 1) {
      this.#dbName = dbName;
      this.#storeName = storeName;
      this.#dbVersion = dbVersion;
      if (!this.#indexedDB) {
        window.alert("很抱歉,您的浏览器不支持indexedDB");
        throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
      }
    }
    createStore(dbName) {
      return this.#db[dbName].transaction(this.#storeName, "readwrite").objectStore(this.#storeName);
    }
    open(callback, dbName) {
      const that = this;
      if (!that.#db[dbName]) {
        const request = that.#indexedDB.open(dbName, that.#dbVersion);
        request.onerror = function (event) {
          callback(null, {
            code: that.#statusCode.openFailed.code,
            msg: that.#statusCode.openFailed.msg,
            event,
          });
        };
        request.onsuccess = function (event) {
          if (!that.#db[dbName]) {
            const target = event.target;
            that.#db[dbName] = target.result;
          }
          callback(that.createStore(dbName));
        };
        request.onupgradeneeded = function (event) {
          const target = event.target;
          that.#db[dbName] = target.result;
          const store = that.#db[dbName].createObjectStore(that.#storeName, { keyPath: "key" });
          store.transaction.oncomplete = function () {
            callback(store);
          };
        };
      } else callback(this.createStore(dbName));
    }
    async save(key, value) {
      const that = this;
      return new Promise((resolve) => {
        const dbName = this.#dbName;
        const inData = {
          key,
          value,
        };
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.saveFailed.code,
              msg: that.#statusCode.saveFailed.msg,
            });
          else {
            const request = idbStore.put(inData);
            request.onsuccess = function (event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event,
              });
            };
            request.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.saveFailed.code,
                msg: that.#statusCode.saveFailed.msg,
                event,
              });
            };
          }
        }, dbName);
      });
    }
    async has(key) {
      const that = this;
      return new Promise((resolve) => {
        const dbName = this.#dbName;
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.getFailed.code,
              msg: that.#statusCode.getFailed.msg,
            });
          else {
            const request = idbStore.get(key);
            request.onsuccess = function (event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event,
              });
            };
            request.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                event,
              });
            };
          }
        }, dbName);
      });
    }
    async get(key) {
      const that = this;
      return new Promise((resolve) => {
        const dbName = this.#dbName;
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.getFailed.code,
              msg: that.#statusCode.getFailed.msg,
              data: void 0,
            });
          else {
            const request = idbStore.get(key);
            request.onsuccess = function (event) {
              const result = event.target.result;
              const data = result ? result.value : void 0;
              if (data == null)
                resolve({
                  success: true,
                  code: that.#statusCode.empty.code,
                  msg: that.#statusCode.empty.msg,
                  data,
                  event,
                  result,
                });
              else
                resolve({
                  success: true,
                  code: that.#statusCode.operationSuccess.code,
                  msg: that.#statusCode.operationSuccess.msg,
                  data,
                  event,
                  result,
                });
            };
            request.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                data: void 0,
                event,
              });
            };
          }
        }, dbName);
      });
    }
    async regexpGet(key) {
      let list = [];
      const that = this;
      return new Promise((resolve) => {
        const dbName = that.#dbName;
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.regexpGetFailed.code,
              msg: that.#statusCode.regexpGetFailed.msg,
              data: [],
            });
          else {
            const request = idbStore.getAll();
            request.onsuccess = function (event) {
              const result = event.target.result;
              if (result.length !== 0)
                result.forEach((dataItem) => {
                  const __key = dataItem["key"];
                  const __value = dataItem["value"];
                  if (__key.match(key)) list = list.concat(__value);
                });
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                data: list,
                event,
              });
            };
            request.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.getFailed.code,
                msg: that.#statusCode.getFailed.msg,
                data: [],
                event,
              });
            };
          }
        }, dbName);
      });
    }
    async delete(key) {
      const that = this;
      return new Promise((resolve) => {
        const dbName = that.#dbName;
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.deleteFailed.code,
              msg: that.#statusCode.deleteFailed.msg,
            });
          else {
            const request = idbStore.delete(key);
            request.onsuccess = function (event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event,
              });
            };
            request.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.deleteFailed.code,
                msg: that.#statusCode.deleteFailed.msg,
                event,
              });
            };
          }
        }, dbName);
      });
    }
    async deleteAll() {
      const that = this;
      return new Promise((resolve) => {
        const dbName = that.#dbName;
        this.open(function (idbStore) {
          if (idbStore == null)
            resolve({
              success: false,
              code: that.#statusCode.deleteAllFailed.code,
              msg: that.#statusCode.deleteAllFailed.msg,
            });
          else {
            const operateResult = idbStore.clear();
            operateResult.onsuccess = function (event) {
              resolve({
                success: true,
                code: that.#statusCode.operationSuccess.code,
                msg: that.#statusCode.operationSuccess.msg,
                event,
              });
            };
            operateResult.onerror = function (event) {
              resolve({
                success: false,
                code: that.#statusCode.deleteAllFailed.code,
                msg: that.#statusCode.deleteAllFailed.msg,
                event,
              });
            };
          }
        }, dbName);
      });
    }
  };
  var LockFunction = class {
    #flag = false;
    #delayTime = 0;
    #callback;
    #timeId = void 0;
    lock;
    unlock;
    run;
    isLock;
    constructor(callback, context, delayTime) {
      const that = this;
      this.#callback = callback;
      if (typeof context === "number") this.#delayTime = context;
      else this.#delayTime = delayTime;
      this.lock = function () {
        that.#flag = true;
        clearTimeout(that.#timeId);
      };
      this.unlock = function () {
        that.#timeId = setTimeout(() => {
          that.#flag = false;
        }, that.#delayTime);
      };
      this.isLock = function () {
        return that.#flag;
      };
      this.run = async function (...args) {
        if (that.isLock()) return;
        that.lock();
        await that.#callback.apply(this, args);
        that.unlock();
      };
    }
  };
  var Log = class {
    #disable = false;
    tag = "Utils.Log";
    #console = null;
    #logCount = 0;
    #details = {
      tag: true,
      successColor: "background: #0eac0eff;",
      errorColor: "background: #FF0000;",
      infoColor: "background: #6495ed;",
      warnColor: "background: #ff8c00;",
      debug: false,
      autoClearConsole: false,
      logMaxCount: 999,
    };
    #commonStyleConfig = {
      commonStyle: "color: #ffffff; padding: 3px; border-radius: 3px;line-height: 1;margin-right: 6px;",
      tagStyle: "background: #6495ed;",
      callerNameStyle: "background: #78909C;",
    };
    constructor(__GM_info, console = window.console) {
      if (typeof __GM_info === "string") this.tag = __GM_info;
      else if (typeof __GM_info === "object" && typeof __GM_info?.script?.name === "string")
        this.tag = __GM_info.script.name;
      this.#console = console;
    }
    parseErrorStack(stack) {
      const result = {
        name: "",
        position: "",
      };
      for (let stackString of stack) {
        stackString = stackString.trim();
        const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
        const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
        if (stackFunctionNameMatch == null) continue;
        if (stackFunctionNamePositionMatch == null) continue;
        const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
        const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
        if (
          stackFunctionName === "" ||
          stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)
        )
          continue;
        else {
          result.name = stackFunctionName;
          result.position = stackFunctionNamePosition;
          break;
        }
      }
      if (result.position === "") {
        const lastStackString = stack[stack.length - 1].trim();
        if (lastStackString.startsWith("at chrome-extension://")) {
          const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
          if (lastStackMatch) result.position = lastStackMatch[lastStackMatch.length - 1];
        }
      }
      if (result.position === "") result.position = stack[stack.length - 1].trim().replace(/^at[\s]*/g, "");
      return result;
    }
    checkClearConsole() {
      this.#logCount++;
      if (this.#details.autoClearConsole && this.#logCount > this.#details.logMaxCount) {
        this.#console.clear();
        this.#logCount = 0;
      }
    }
    printContent(msg, tagColor) {
      this.checkClearConsole();
      const stackSplit = new Error().stack.split("\n");
      stackSplit.splice(0, 2);
      const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
      const tagName = this.tag;
      const that = this;
      const msgColorDetails = [];
      let consoleHTML = `%c${tagName}`;
      if (typeof tagColor === "string" && tagColor.trim() !== "")
        msgColorDetails.push(that.#commonStyleConfig.commonStyle + tagColor);
      else msgColorDetails.push(that.#commonStyleConfig.commonStyle + that.#commonStyleConfig.tagStyle);
      if (callerName.trim() == "");
      else {
        consoleHTML = `${consoleHTML}%c${callerName}`;
        msgColorDetails.push(that.#commonStyleConfig.commonStyle + that.#commonStyleConfig.callerNameStyle);
      }
      if (Array.isArray(msg)) that.#console.log(`${consoleHTML}`, ...msgColorDetails, ...msg);
      else that.#console.log(`${consoleHTML}`, ...msgColorDetails, msg);
      if (this.#details.debug) this.#console.log(callerPosition);
    }
    info(...args) {
      if (this.#disable) return;
      this.printContent(args, this.#details.infoColor);
    }
    warn(...args) {
      if (this.#disable) return;
      this.printContent(args, this.#details.warnColor);
    }
    error(...args) {
      if (this.#disable) return;
      this.printContent(args, this.#details.errorColor);
    }
    success(...args) {
      if (this.#disable) return;
      this.printContent(args, this.#details.successColor);
    }
    table(msg) {
      if (this.#disable) return;
      this.checkClearConsole();
      const stack = new Error().stack.split("\n");
      stack.splice(0, 1);
      const errorStackParse = this.parseErrorStack(stack);
      const stackFunctionName = errorStackParse.name;
      const stackFunctionNamePosition = errorStackParse.position;
      const callerName = stackFunctionName;
      const msgColorDetails = [
        `${this.#commonStyleConfig.commonStyle + this.#details.infoColor}`,
        `${this.#commonStyleConfig.commonStyle + this.#commonStyleConfig.callerNameStyle}`,
      ];
      this.#console.log(`%c${this.tag}%c${callerName}%c`, msgColorDetails);
      this.#console.table(msg);
      if (this.#details.debug) this.#console.log(stackFunctionNamePosition);
    }
    config(paramDetails) {
      this.#details = Object.assign(this.#details, paramDetails);
    }
    disable() {
      this.#disable = true;
    }
    recovery() {
      this.#disable = false;
    }
  };
  var ModuleRaid = class {
    constructor(opts) {
      this.moduleID = Math.random().toString(36).substring(7);
      this.functionArguments = [
        [
          [0],
          [
            (_e, _t, i) => {
              this.modules = i.c;
              this.constructors = i.m;
              this.get = i;
            },
          ],
        ],
        [
          [1e3],
          {
            [this.moduleID]: (_e, _t, i) => {
              this.modules = i.c;
              this.constructors = i.m;
              this.get = i;
            },
          },
          [[this.moduleID]],
        ],
      ];
      this.arrayArguments = [
        [
          [this.moduleID],
          {},
          (e) => {
            const mCac = e.m;
            Object.keys(mCac).forEach((mod) => {
              try {
                this.modules[mod] = e(mod);
              } catch (err) {
                this.log(`[arrayArguments/1] Failed to require(${mod}) with error:\n${err}\n${err.stack}`);
              }
            });
            this.get = e;
          },
        ],
        this.functionArguments[1],
      ];
      this.modules = {};
      this.constructors = [];
      let options = {
        target: window,
        entrypoint: "webpackJsonp",
        debug: false,
        strict: false,
      };
      if (typeof opts === "object") options = Object.assign(Object.assign({}, options), opts);
      this.target = options.target;
      this.entrypoint = options.entrypoint;
      this.debug = options.debug;
      this.strict = options.strict;
      this.detectEntrypoint();
      this.fillModules();
      this.replaceGet();
      this.setupPushEvent();
    }
    log(message) {
      if (this.debug) console.warn(`[moduleRaid] ${message}`);
    }
    replaceGet() {
      if (this.get === null) this.get = (key) => this.modules[key];
    }
    fillModules() {
      if (typeof this.target[this.entrypoint] === "function")
        this.functionArguments.forEach((argument, index) => {
          try {
            if (this.modules && Object.keys(this.modules).length > 0) return;
            this.target[this.entrypoint](...argument);
          } catch (err) {
            this.log(`moduleRaid.functionArguments[${index}] failed:\n${err}\n${err.stack}`);
          }
        });
      else
        this.arrayArguments.forEach((argument, index) => {
          try {
            if (this.modules && Object.keys(this.modules).length > 0) return;
            this.target[this.entrypoint].push(argument);
          } catch (err) {
            this.log(
              `Pushing moduleRaid.arrayArguments[${index}] into ${this.entrypoint} failed:\n${err}\n${err.stack}`
            );
          }
        });
      if (this.modules && Object.keys(this.modules).length == 0) {
        let moduleEnd = false;
        let moduleIterator = 0;
        if (
          typeof this.target[this.entrypoint] != "function" ||
          !this.target[this.entrypoint]([], [], [moduleIterator])
        )
          throw Error("Unknown Webpack structure");
        while (!moduleEnd)
          try {
            this.modules[moduleIterator] = this.target[this.entrypoint]([], [], [moduleIterator]);
            moduleIterator++;
          } catch (err) {
            moduleEnd = true;
          }
      }
    }
    setupPushEvent() {
      const originalPush = this.target[this.entrypoint].push;
      this.target[this.entrypoint].push = (...args) => {
        const result = Reflect.apply(originalPush, this.target[this.entrypoint], args);
        document.dispatchEvent(new CustomEvent("moduleraid:webpack-push", { detail: args }));
        return result;
      };
    }
    detectEntrypoint() {
      if (this.target[this.entrypoint] != void 0) return;
      if (this.strict)
        throw Error(
          `Strict mode is enabled and entrypoint at window.${this.entrypoint} couldn't be found. Please specify the correct one!`
        );
      let windowObjects = Object.keys(this.target);
      windowObjects = windowObjects
        .filter((object) => object.toLowerCase().includes("chunk") || object.toLowerCase().includes("webpack"))
        .filter((object) => typeof this.target[object] === "function" || Array.isArray(this.target[object]));
      if (windowObjects.length > 1)
        throw Error(
          `Multiple possible endpoints have been detected, please create a new moduleRaid instance with a specific one:\n${windowObjects.join(", ")}`
        );
      if (windowObjects.length === 0) throw Error("No Webpack JSONP entrypoints could be detected");
      this.log(`Entrypoint has been detected at window.${windowObjects[0]} and set for injection`);
      this.entrypoint = windowObjects[0];
    }
    searchObject(object, query) {
      for (const key in object) {
        const value = object[key];
        const lowerCaseQuery = query.toLowerCase();
        if (typeof value != "object") {
          if (key.toString().toLowerCase().includes(lowerCaseQuery)) return true;
          if (typeof value != "object") {
            if (value.toString().toLowerCase().includes(lowerCaseQuery)) return true;
          } else if (this.searchObject(value, query)) return true;
        }
      }
      return false;
    }
    findModule(query) {
      const results = [];
      const modules = Object.keys(this.modules);
      if (modules.length === 0) throw new Error("There are no modules to search through!");
      modules.forEach((key) => {
        const module = this.modules[key.toString()];
        if (module === void 0) return;
        try {
          if (typeof query === "string") {
            query = query.toLowerCase();
            switch (typeof module) {
              case "string":
                if (module.toLowerCase().includes(query)) results.push(module);
                break;
              case "function":
                if (module.toString().toLowerCase().includes(query)) results.push(module);
                break;
              case "object":
                if (this.searchObject(module, query)) results.push(module);
                break;
            }
          } else if (typeof query === "function") {
            if (query(module)) results.push(module);
          } else throw new TypeError(`findModule can only find via string and function, ${typeof query} was passed`);
        } catch (err) {
          this.log(`There was an error while searching through module '${key}':\n${err}\n${err.stack}`);
        }
      });
      return results;
    }
    findConstructor(query) {
      const results = [];
      const constructors = Object.keys(this.constructors);
      if (constructors.length === 0) throw new Error("There are no constructors to search through!");
      constructors.forEach((key) => {
        const constructor = this.constructors[key];
        try {
          if (typeof query === "string") {
            query = query.toLowerCase();
            if (constructor.toString().toLowerCase().includes(query))
              results.push([this.constructors[key], this.modules[key]]);
          } else if (typeof query === "function") {
            if (query(constructor)) results.push([this.constructors[key], this.modules[key]]);
          }
        } catch (err) {
          this.log(`There was an error while searching through constructor '${key}':\n${err}\n${err.stack}`);
        }
      });
      return results;
    }
  };
  var Progress = class {
    #config = {
      canvasNode: null,
      deg: 95,
      progress: 0,
      lineWidth: 10,
      lineBgColor: "#1e637c",
      lineColor: "#25deff",
      textColor: "#000000",
      fontSize: 22,
      circleRadius: 50,
    };
    #ctx;
    #width;
    #height;
    constructor(paramConfig) {
      this.#config = commonUtil.assign(this.#config, paramConfig);
      if (!(this.#config.canvasNode instanceof HTMLCanvasElement))
        throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
      const ctx = this.#config.canvasNode.getContext("2d");
      if (ctx == null) throw new Error("Utils.Progress 获取画笔失败");
      this.#ctx = ctx;
      this.#width = this.#config.canvasNode.width;
      this.#height = this.#config.canvasNode.height;
      if (window.devicePixelRatio) {
        this.#config.canvasNode.style.width = `${this.#width}px`;
        this.#config.canvasNode.style.height = `${this.#height}px`;
        this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
        this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
        this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
      }
      this.#ctx.lineWidth = this.#config.lineWidth;
    }
    draw() {
      const degActive = (this.#config.progress * 360) / 100;
      this.#ctx.clearRect(0, 0, this.#width, this.#height);
      this.#ctx.beginPath();
      this.#ctx.arc(this.#width / 2, this.#height / 2, this.#config.circleRadius, 1, 8);
      this.#ctx.strokeStyle = this.#config.lineBgColor;
      this.#ctx.stroke();
      this.#ctx.beginPath();
      this.#ctx.arc(
        this.#width / 2,
        this.#height / 2,
        this.#config.circleRadius,
        -Math.PI / 2,
        (degActive * Math.PI) / 180 - Math.PI / 2
      );
      this.#ctx.strokeStyle = this.#config.lineColor;
      this.#ctx.stroke();
      const txt = `${parseInt(this.#config.progress.toString())}%`;
      this.#ctx.font = `${this.#config.fontSize}px SimHei`;
      const w = this.#ctx.measureText(txt).width;
      const h = this.#config.fontSize / 2;
      this.#ctx.fillStyle = this.#config.textColor;
      this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
    }
  };
  var DocumentCookieHandler = class {
    windowApi = {
      window,
      document,
    };
    constructor(windowApiOption) {
      if (windowApiOption) this.windowApi = Object.assign({}, windowApiOption);
    }
    getCookiesList() {
      if (this.windowApi.document.cookie.trim() === "") return [];
      return this.windowApi.document.cookie.split(";");
    }
    get(cookieName) {
      if (typeof cookieName !== "string") throw new TypeError(".get 参数cookieName 必须为字符串");
      const cookies = this.getCookiesList();
      let findValue = void 0;
      for (const cookieItem of cookies) {
        const itemSplit = cookieItem.trim().split("=");
        const itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        const itemValue = decodeURIComponent(itemSplit.join(""));
        if (itemName === cookieName) {
          findValue = {
            domain: this.windowApi.window.location.hostname,
            expirationDate: null,
            hostOnly: true,
            httpOnly: false,
            name: cookieName,
            path: "/",
            sameSite: "unspecified",
            secure: true,
            session: false,
            value: itemValue,
          };
          break;
        }
      }
      return findValue;
    }
    list(option, callback) {
      if (option == null) throw new Error(".list 参数不能为空");
      const resultData = [];
      let error;
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          domain: this.windowApi.window.location.hostname,
          name: "",
          path: "/",
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        this.getCookiesList().forEach((item) => {
          item = item.trim();
          const itemSplit = item.split("=");
          const itemName = itemSplit[0];
          itemSplit.splice(0, 1);
          const itemValue = decodeURIComponent(itemSplit.join(""));
          const nameRegexp =
            defaultOption.name instanceof RegExp ? defaultOption.name : new RegExp(`^${defaultOption.name}`, "g");
          if (itemName.match(nameRegexp))
            resultData.push({
              domain: this.windowApi.window.location.hostname,
              expirationDate: null,
              hostOnly: true,
              httpOnly: false,
              name: itemName,
              path: "/",
              sameSite: "unspecified",
              secure: true,
              session: false,
              value: itemValue,
            });
        });
      } catch (e) {
        error = e;
      }
      if (typeof callback === "function") callback(resultData, error);
      else
        return {
          cookies: resultData,
          error,
        };
    }
    getList(option) {
      if (option == null) throw new Error(".list 参数不能为空");
      const resultData = [];
      let defaultOption = {
        url: this.windowApi.window.location.href,
        domain: this.windowApi.window.location.hostname,
        name: "",
        path: "/",
      };
      defaultOption = commonUtil.assign(defaultOption, option);
      this.getCookiesList().forEach((item) => {
        item = item.trim();
        const itemSplit = item.split("=");
        const itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        const itemValue = decodeURIComponent(itemSplit.join(""));
        const nameRegexp =
          defaultOption.name instanceof RegExp ? defaultOption.name : new RegExp(`^${defaultOption.name}`, "g");
        if (itemName.match(nameRegexp))
          resultData.push({
            domain: this.windowApi.window.location.hostname,
            expirationDate: null,
            hostOnly: true,
            httpOnly: false,
            name: itemName,
            path: "/",
            sameSite: "unspecified",
            secure: true,
            session: false,
            value: itemValue,
          });
      });
      return resultData;
    }
    set(option, callback) {
      let errorInfo;
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          name: "",
          value: "",
          domain: "",
          path: "/",
          secure: true,
          httpOnly: false,
          expirationDate: Math.floor(Date.now()) + 3600 * 24 * 30,
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        const life = defaultOption.expirationDate
          ? defaultOption.expirationDate
          : Math.floor(Date.now()) + 3600 * 24 * 30;
        let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
        if (commonUtil.isNull(defaultOption.domain)) cookieStr += `; domain=${defaultOption.domain}`;
        this.windowApi.document.cookie = cookieStr;
      } catch (error) {
        errorInfo = error;
      } finally {
        if (typeof callback === "function") callback(errorInfo);
      }
    }
    delete(option, callback) {
      let errorInfo;
      try {
        let defaultOption = {
          url: this.windowApi.window.location.href,
          name: "",
          path: "/",
          firstPartyDomain: "",
        };
        defaultOption = commonUtil.assign(defaultOption, option);
        let cookieStr = `${defaultOption.name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${defaultOption.path}`;
        if (commonUtil.isNull(defaultOption.firstPartyDomain))
          cookieStr += `; domain=${defaultOption.firstPartyDomain};`;
        this.windowApi.document.cookie = cookieStr;
      } catch (error) {
        errorInfo = error;
      } finally {
        if (typeof callback === "function") callback(errorInfo);
      }
    }
    parseCookie(cookieStr) {
      if (cookieStr.trim() === "") return [];
      const cookies = cookieStr.split(";");
      const result = [];
      for (const cookieItem of cookies) {
        const itemSplit = cookieItem.trim().split("=");
        const itemName = itemSplit[0];
        itemSplit.splice(0, 1);
        const itemValue = decodeURIComponent(itemSplit.join(""));
        result.push({
          key: itemName,
          value: itemValue,
        });
      }
      return result;
    }
  };
  var GMMenu = class {
    GM_Api = {
      getValue: null,
      setValue: null,
      registerMenuCommand: null,
      unregisterMenuCommand: null,
    };
    MenuHandle = {
      context: this,
      $data: {
        data: [],
        key: "GM_Menu_Local_Map",
      },
      $default: {
        autoReload: true,
        isStoreValue: true,
      },
      $emoji: {
        success: "✅",
        error: "❌",
      },
      init() {
        for (let index = 0; index < this.$data.data.length; index++) {
          const menuOption = this.$data.data[index]["data"];
          menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
          if (typeof menuOption.showText !== "function")
            menuOption.showText = (menuText, menuEnable) => {
              if (menuEnable) return `${this.$emoji.success} ${menuText}`;
              else return `${this.$emoji.error} ${menuText}`;
            };
        }
      },
      register(menuOptions) {
        const that = this;
        if (menuOptions == null) throw new TypeError("register菜单数据不能为空");
        if (!Array.isArray(menuOptions)) menuOptions = [menuOptions];
        for (let index = 0; index < menuOptions.length; index++) {
          const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
          const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
          const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
          menuOptions[index].id = menuId;
          cloneMenuOptionData.deleteMenu = function () {
            that.context.GM_Api.unregisterMenuCommand(menuId);
          };
          Reflect.deleteProperty(menuOptions[index], "handleData");
          menuOptions[index].handleData = cloneMenuOptionData;
        }
      },
      getLocalMenuData(key, defaultValue) {
        const localData = this.context.GM_Api.getValue(this.$data.key, {});
        if (key in localData) return localData[key];
        else return defaultValue;
      },
      setLocalMenuData(key, value) {
        const localData = this.context.GM_Api.getValue(this.$data.key, {});
        localData[key] = value;
        this.context.GM_Api.setValue(this.$data.key, localData);
      },
      handleInitDetail(menuOption) {
        menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
        if (typeof menuOption.showText !== "function")
          menuOption.showText = (menuText, menuEnable) => {
            if (menuEnable) return `${this.$emoji.success} ${menuText}`;
            else return `${this.$emoji.error} ${menuText}`;
          };
        return menuOption;
      },
      handleMenuData(menuOption) {
        const that = this;
        const menuLocalDataItemKey = menuOption.key;
        const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
        const showText = menuOption.showText(menuOption.text, defaultEnable);
        menuOption.autoReload =
          typeof menuOption.autoReload !== "boolean" ? this.$default.autoReload : menuOption.autoReload;
        menuOption.isStoreValue =
          typeof menuOption.isStoreValue !== "boolean" ? this.$default.isStoreValue : menuOption.isStoreValue;
        function clickCallBack(event) {
          const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
          if (menuOption.isStoreValue) that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
          if (typeof menuOption.callback === "function")
            menuOption.callback({
              key: menuLocalDataItemKey,
              enable: !localEnable,
              oldEnable: localEnable,
              event,
              storeValue(value) {
                that.setLocalMenuData(menuLocalDataItemKey, value);
              },
            });
          if (menuOption.autoReload) window.location.reload();
          else that.context.update();
        }
        return {
          showText,
          clickCallBack,
        };
      },
      getMenuData(menuKey) {
        return this.$data.data.find((item) => item.data.key === menuKey);
      },
      getMenuOption(menuKey) {
        return this.$data.data.find((item) => item.data.key === menuKey)?.data;
      },
      getMenuHandledOption(menuKey) {
        return this.$data.data.find((item) => item.handleData.key === menuKey)?.handleData;
      },
    };
    constructor(constructOptions) {
      this.GM_Api.getValue = constructOptions.GM_getValue;
      this.GM_Api.setValue = constructOptions.GM_setValue;
      this.GM_Api.registerMenuCommand = constructOptions.GM_registerMenuCommand;
      this.GM_Api.unregisterMenuCommand = constructOptions.GM_unregisterMenuCommand;
      this.MenuHandle.$default.autoReload =
        typeof constructOptions.autoReload === "boolean" ? constructOptions.autoReload : true;
      for (const keyName of Object.keys(this.GM_Api))
        if (typeof this.GM_Api[keyName] !== "function")
          throw new Error(`Utils.GM_Menu 请在脚本开头加上 @grant  ${keyName},且传入该对象`);
      this.add(constructOptions?.data || []);
    }
    __add(options) {
      if (Array.isArray(options))
        for (let index = 0; index < options.length; index++) {
          const option = options[index];
          this.MenuHandle.$data.data.push({
            data: option,
            id: void 0,
          });
        }
      else
        this.MenuHandle.$data.data.push({
          data: options,
          id: void 0,
        });
    }
    add(options) {
      this.__add(options);
      this.update();
      return {
        destory: () => {
          if (!Array.isArray(options)) options = [options];
          options.forEach((option) => {
            this.delete(option.key);
          });
        },
      };
    }
    update(options) {
      let menuOptionList = [];
      if (Array.isArray(options)) menuOptionList = [...menuOptionList, ...options];
      else if (options != null) menuOptionList = [...menuOptionList, options];
      menuOptionList.forEach((option) => {
        const oldMenuOption = this.MenuHandle.getMenuOption(option.key);
        if (oldMenuOption) Object.assign(oldMenuOption, option);
        else this.__add(option);
      });
      this.MenuHandle.$data.data.forEach((value) => {
        if (value.handleData) value.handleData.deleteMenu();
      });
      this.MenuHandle.init();
      this.MenuHandle.register(this.MenuHandle.$data.data);
    }
    delete(menuId) {
      if (typeof menuId === "string") {
        const __menuId = this.getMenuId(menuId);
        if (__menuId != null) menuId = __menuId;
      }
      this.GM_Api.unregisterMenuCommand(menuId);
    }
    getEnable(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey).enable;
    }
    getText(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey).text;
    }
    getShowTextValue(menuKey) {
      const text = this.getText(menuKey);
      const enable = this.getEnable(menuKey);
      return this.MenuHandle.getMenuHandledOption(menuKey).showText(text, enable);
    }
    getMenuId(menuKey) {
      let result = null;
      for (let index = 0; index < this.MenuHandle.$data.data.length; index++) {
        const option = this.MenuHandle.$data.data[index];
        if (option.handleData?.key === menuKey) {
          result = option.id;
          break;
        }
      }
      return result;
    }
    getAccessKey(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.accessKey;
    }
    getAutoClose(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.autoClose;
    }
    getAutoReload(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.autoReload;
    }
    getCallBack(menuKey) {
      return this.MenuHandle.getMenuHandledOption(menuKey)?.callback;
    }
    getEnableTrueEmoji() {
      return this.MenuHandle.$emoji.success;
    }
    getEnableFalseEmoji() {
      return this.MenuHandle.$emoji.error;
    }
    getLocalStorageKeyName() {
      return this.MenuHandle.$data.key;
    }
    setValue(menuKey, value) {
      this.MenuHandle.setLocalMenuData(menuKey, value);
    }
    setEnable(menuKey, value) {
      this.setValue(menuKey, Boolean(value));
    }
    setEnableTrueEmoji(emojiString) {
      if (typeof emojiString !== "string") throw new TypeError("参数emojiString必须是string类型");
      this.MenuHandle.$emoji.success = emojiString;
    }
    setEnableFalseEmoji(emojiString) {
      if (typeof emojiString !== "string") throw new TypeError("参数emojiString必须是string类型");
      this.MenuHandle.$emoji.error = emojiString;
    }
    setLocalStorageKeyName(keyName) {
      if (typeof keyName !== "string") throw new TypeError("参数keyName必须是string类型");
      this.MenuHandle.$data.key = keyName;
    }
  };
  var VueUtils = {
    ReactiveFlags: { IS_REACTIVE: Symbol("isReactive") },
    isObject(value) {
      return typeof value === "object" && value !== null;
    },
    isFunction(val) {
      return typeof val === "function";
    },
    isReactive(value) {
      return !!(value && value[VueUtils.ReactiveFlags.IS_REACTIVE]);
    },
    isArray(value) {
      return Array.isArray(value);
    },
  };
  var ReactiveEffect = class {
    deps = [];
    active = true;
    fn;
    scheduler;
    options;
    constructor(fn, scheduler, options) {
      this.fn = fn;
      this.scheduler = scheduler;
      this.options = options;
    }
    run(cb) {
      if (!this.active) this.fn();
      try {
        if (typeof cb === "function") cb(this);
        return this.fn();
      } finally {
        if (typeof cb === "function") cb(void 0);
      }
    }
    stop() {
      if (this.active) {
        if (this.deps && this.deps.length) {
          this.deps.forEach((dep) => {
            dep.delete(this);
          });
          this.deps.length = 0;
        }
        this.active = false;
      }
    }
  };
  var RefImpl = class {
    _value;
    _isRef = true;
    _rawValue;
    _vue;
    constructor(vueIns, rawValue) {
      this._vue = vueIns;
      this._rawValue = rawValue;
      this._value = this._vue.toReactive(rawValue);
    }
    get value() {
      return this._value;
    }
    set value(newValue) {
      if (newValue !== this._rawValue) {
        this._value = this._vue.toReactive(newValue);
        this._rawValue = newValue;
      }
    }
  };
  var ObjectRefImpl = class {
    object;
    key;
    constructor(object, key) {
      this.object = object;
      this.key = key;
    }
    get value() {
      return this.object[this.key];
    }
    set value(newValue) {
      this.object[this.key] = newValue;
    }
  };
  var Vue = class {
    reactMap = new WeakMap();
    targetMap = new WeakMap();
    activeEffect = void 0;
    constructor() {}
    reactive(target) {
      const that = this;
      if (!(typeof target === "object" && target !== null)) return;
      if (VueUtils.isReactive(target)) return target;
      const exisProxy = this.reactMap.get(target);
      if (exisProxy) return exisProxy;
      const proxy = new Proxy(target, {
        get(target, key, receiver) {
          if (key === VueUtils.ReactiveFlags.IS_REACTIVE) return true;
          that.track(target, "get", key);
          return Reflect.get(target, key, receiver);
        },
        set(target, key, value, receiver) {
          const oldValue = target[key];
          const result = Reflect.set(target, key, value, receiver);
          that.trigger(target, "set", key, oldValue, value);
          return result;
        },
      });
      that.reactMap.set(target, proxy);
      return proxy;
    }
    watch(source, changeCallBack, options) {
      let getter;
      if (VueUtils.isReactive(source)) getter = () => this.traversal(source);
      else if (VueUtils.isFunction(source)) getter = source;
      else return;
      let oldValue;
      const unwatch = () => {
        effect.stop();
      };
      const job = () => {
        const newValue = effect.run((activeEffect) => {
          this.activeEffect = activeEffect;
        });
        changeCallBack(newValue, oldValue);
        if (options?.once) unwatch();
        oldValue = newValue;
      };
      const effect = new ReactiveEffect(getter, job, {
        triggerMethod: "not-same",
        ...(options ?? {}),
      });
      oldValue = effect.run((activeEffect) => {
        this.activeEffect = activeEffect;
      });
      if (options) {
        if (options.immediate) job();
      }
      return { unwatch };
    }
    toReactive(value) {
      return VueUtils.isObject(value) ? this.reactive(value) : value;
    }
    ref(value) {
      return new RefImpl(this, value);
    }
    toRef(object, key) {
      return new ObjectRefImpl(object, key);
    }
    toRefs(object) {
      const result = VueUtils.isArray(object) ? new Array(object.length) : {};
      for (const key in object) result[key] = this.toRef(object, key);
      return result;
    }
    trigger(target, type, key, oldValue, value) {
      const depsMap = this.targetMap.get(target);
      if (!depsMap) return;
      const effects = depsMap.get(key);
      this.triggerEffect(effects, type, "effects", oldValue, value);
    }
    triggerEffect(effects, _type, _name, oldValue, value) {
      if (effects) {
        const isSame = oldValue === value;
        effects.forEach((effect) => {
          if (effect.options.triggerMethod === "not-same") {
            if (isSame) return;
            if (effect.scheduler) effect.scheduler();
            else effect.run();
          } else if (effect.options.triggerMethod === "set")
            if (effect.scheduler) effect.scheduler();
            else effect.run();
        });
      }
    }
    track(target, _type, key) {
      if (!this.activeEffect) return;
      let depsMap = this.targetMap.get(target);
      if (!depsMap) this.targetMap.set(target, (depsMap = new Map()));
      let dep = depsMap.get(key);
      if (!dep) depsMap.set(key, (dep = new Set()));
      this.trackEffect(dep);
    }
    trackEffect(dep) {
      if (this.activeEffect) {
        if (!dep.has(this.activeEffect)) {
          dep.add(this.activeEffect);
          this.activeEffect.deps.push(dep);
        }
      }
    }
    traversal(value, set = new Set()) {
      if (!VueUtils.isObject(value)) return value;
      if (set.has(value)) return value;
      set.add(value);
      for (const key in value) this.traversal(value[key], set);
      return value;
    }
  };
  var CookieManagerApiNameList = ["document.cookie", "cookieStore", "GM_cookie", "GM.cookie"];
  var isSupportGM_cookie = () => {
    if (
      ((typeof GM_cookie === "object" && GM_cookie) || typeof GM_cookie === "function") &&
      typeof GM_cookie?.list === "function" &&
      typeof GM_cookie?.set === "function" &&
      typeof GM_cookie?.delete === "function"
    )
      return true;
    return false;
  };
  var isSupportGM_async_cookie = () => {
    if (
      ((typeof GM === "object" && GM) || typeof GM === "function") &&
      ((typeof GM?.cookie === "object" && GM?.cookie) || typeof GM?.cookie === "function") &&
      typeof GM?.cookie?.list === "function" &&
      typeof GM?.cookie?.set === "function" &&
      typeof GM?.cookie?.delete === "function"
    )
      return true;
    return false;
  };
  var __GM_cookie__ = isSupportGM_cookie() ? GM_cookie : void 0;
  var __GM_async_cookie__ = isSupportGM_async_cookie() ? GM?.cookie : void 0;
  var __document_cookie__ = new DocumentCookieHandler();
  var CookieManagerService = class {
    __defaultCookieHandler = "document.cookie";
    __option = {};
    constructor(option = { baseCookieHandler: this.__defaultCookieHandler }) {
      this.setOptions(option);
    }
    get totalCookieManagerApiNameList() {
      return CookieManagerApiNameList;
    }
    get baseCookieHandler() {
      const baseCookieHandler =
        (typeof this.__option.baseCookieHandler === "function"
          ? this.__option.baseCookieHandler(this.__defaultCookieHandler)
          : this.__option.baseCookieHandler) ?? this.__defaultCookieHandler;
      if (typeof baseCookieHandler === "string") {
        if (!this.totalCookieManagerApiNameList.includes(baseCookieHandler))
          throw new Error(`unknown cookie handler: ${baseCookieHandler}`);
      } else throw new TypeError(`unknown cookie handler type: ${baseCookieHandler}`);
      return baseCookieHandler;
    }
    get cookieManager() {
      if (this.baseCookieHandler === "GM_cookie")
        return {
          list(options, callback) {
            __GM_cookie__.list(options, (result) => {
              callback(result);
            });
          },
          set(cookieInfo, callback) {
            __GM_cookie__.set(cookieInfo, (result) => {
              callback(result);
            });
          },
          delete(cookieInfo, callback) {
            __GM_cookie__.delete(cookieInfo, (result) => {
              callback(result);
            });
          },
        };
      else if (this.baseCookieHandler === "GM.cookie")
        return {
          list(_options, callback) {
            __GM_async_cookie__.list().then((result) => {
              callback(result);
            });
          },
          set(cookieInfo, callback) {
            __GM_async_cookie__
              .set(cookieInfo)
              .then((result) => {
                callback(result ?? null);
              })
              .catch((reason) => {
                callback(reason);
              });
          },
          delete(cookieInfo, callback) {
            __GM_async_cookie__
              .delete(cookieInfo)
              .then((result) => {
                callback(result ?? null);
              })
              .catch((reason) => {
                callback(reason);
              });
          },
        };
      else if (this.baseCookieHandler === "cookieStore") {
        const cookieStore = globalThis.cookieStore;
        return {
          list(_options, callback) {
            cookieStore
              .getAll()
              .then((result) => {
                result.forEach((it) => {
                  if (it.domain == null) it.domain = globalThis.location.hostname;
                });
                callback(result);
              })
              .catch((reason) => {
                console.error(reason);
              });
          },
          set(cookieInfo, callback) {
            cookieStore
              .set(cookieInfo)
              .then(() => {
                callback();
              })
              .catch((reason) => {
                callback(reason);
              });
          },
          delete(cookieInfo, callback) {
            cookieStore
              .delete(cookieInfo)
              .then(() => {
                callback();
              })
              .catch((reason) => {
                callback(reason);
              });
          },
        };
      } else return __document_cookie__;
    }
    get isSupportGM_cookie() {
      return isSupportGM_cookie();
    }
    get isSupportGM_async_cookie() {
      return isSupportGM_async_cookie();
    }
    get isSupportCookieStore() {
      const __cookie_store__ = globalThis.cookieStore;
      if (__cookie_store__ == null) return false;
      if (typeof __cookie_store__.set !== "function") return false;
      if (typeof __cookie_store__.getAll !== "function") return false;
      if (typeof __cookie_store__.delete !== "function") return false;
      if (typeof __cookie_store__.get !== "function") return false;
      if (typeof __cookie_store__.addEventListener !== "function") return false;
      if (typeof __cookie_store__.removeEventListener !== "function") return false;
      if (typeof __cookie_store__.dispatchEvent !== "function") return false;
      return true;
    }
    setOptions(option) {
      this.__option = option;
    }
    listAll() {
      return new Promise((resolve, reject) => {
        try {
          this.cookieManager.list({}, (cookieListResult) => {
            let __cookieListResult__ = cookieListResult || [];
            __cookieListResult__ = __cookieListResult__.sort((a, b) => a.name.localeCompare(b.name));
            resolve(__cookieListResult__);
          });
        } catch (error) {
          console.error(error);
          reject(error);
        }
      });
    }
    clear(filter) {
      return new Promise((resolve, reject) => {
        try {
          this.cookieManager.list({}, async (cookieListResult) => {
            const __cookieListResult__ = cookieListResult || [];
            const result = {
              success: 0,
              error: 0,
              ignore: 0,
            };
            for (let index = 0; index < __cookieListResult__.length; index++) {
              const cookieListItem = __cookieListResult__[index];
              if (typeof filter === "function" && filter(cookieListItem)) {
                result.ignore++;
                continue;
              }
              if (
                await new Promise((deleteResolve) => {
                  this.delete(cookieListItem).then((deleteResult) => {
                    deleteResolve(deleteResult);
                  });
                })
              )
                result.error++;
              else result.success++;
            }
            resolve(result);
          });
        } catch (error) {
          console.error(error);
          reject(error);
        }
      });
    }
    get(cookieInfo, callback) {
      return new Promise(async (resolve, reject) => {
        try {
          const cookieInfos = await this.listAll();
          const name = typeof cookieInfo === "string" ? cookieInfo : cookieInfo.name;
          resolve(
            cookieInfos.find((item) => {
              return item.name === name;
            })
          );
        } catch (error) {
          console.error(error);
          callback?.(error);
          reject(error);
        }
      });
    }
    add(cookieInfo, callback) {
      return new Promise((resolve, reject) => {
        try {
          Reflect.deleteProperty(cookieInfo, "hostOnly");
          this.cookieManager.set(cookieInfo, (error) => {
            callback?.(error);
            resolve(error);
          });
        } catch (error) {
          console.error(error);
          reject(error);
        }
      });
    }
    delete(cookieInfo, callback) {
      return new Promise((resolve, reject) => {
        try {
          if (typeof cookieInfo === "string") cookieInfo = { name: cookieInfo };
          this.cookieManager.delete(cookieInfo, (error) => {
            callback?.(error);
            resolve(error);
          });
        } catch (error) {
          console.error(error);
          reject(error);
        }
      });
    }
    update(cookieInfo, callback) {
      return new Promise(async (resolve) => {
        let result;
        try {
          if (this.baseCookieHandler === "document.cookie" || this.baseCookieHandler === "cookieStore") {
            const deleteError = await this.delete(cookieInfo);
            if (deleteError) throw new TypeError(deleteError.toString());
          }
          const addError = await this.add(cookieInfo);
          if (addError) throw new TypeError(addError.toString());
        } catch (error) {
          result = error;
        } finally {
          callback?.(result);
          resolve(result);
        }
      });
    }
  };
  var utils$1 = new (class Utils {
    windowApi;
    constructor(option) {
      this.windowApi = new WindowApi(option);
    }
    version = version;
    assign = commonUtil.assign.bind(commonUtil);
    async asyncReplaceAll(string, pattern, asyncFn) {
      const that = this;
      if (typeof string !== "string") throw new TypeError("string必须是字符串");
      if (typeof asyncFn !== "function") throw new TypeError("asyncFn必须是函数");
      let reg;
      if (typeof pattern === "string") reg = new RegExp(that.toRegExpStr(pattern), "g");
      else if (pattern instanceof RegExp) {
        if (!pattern.global) throw new TypeError("pattern必须是全局匹配");
        reg = new RegExp(pattern);
      } else throw new TypeError("pattern必须是正则对象");
      let result = [];
      let match;
      let lastIndex = 0;
      while ((match = reg.exec(string)) !== null) {
        const item = asyncFn(match[0]);
        const prefix = string.slice(lastIndex, match.index);
        lastIndex = match.index + match[0].length;
        result.push(item);
        result.push(prefix);
      }
      result.push(string.slice(lastIndex));
      result = await Promise.all(result);
      return result.join("");
    }
    ajaxHooker = () => {
      return ajaxHooker();
    };
    oldAjaxHooker = () => {
      return AjaxHooker1_2_4();
    };
    canvasClickByPosition(canvasElement, clientX = 0, clientY = 0, view = this.windowApi.window) {
      if (!(canvasElement instanceof HTMLCanvasElement))
        throw new Error("Utils.canvasClickByPosition 参数canvasElement必须是canvas元素");
      clientX = parseInt(clientX.toString());
      clientY = parseInt(clientY.toString());
      const eventInit = {
        cancelBubble: true,
        cancelable: true,
        clientX,
        clientY,
        view,
        detail: 1,
      };
      canvasElement.dispatchEvent(new MouseEvent("mousedown", eventInit));
      canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
    }
    cloneFormData(formData, filterFn) {
      const clonedFormData = new FormData();
      formData.forEach((value, key) => {
        const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
        if (typeof isFilter === "boolean" && isFilter) return;
        clonedFormData.append(key, value);
      });
      return clonedFormData;
    }
    createOverload() {
      const fnMap = new Map();
      function overload(...args) {
        const key = args.map((it) => typeof it).join(",");
        const fn = fnMap.get(key);
        if (!fn) throw new TypeError("没有找到对应的实现");
        return fn.apply(this, args);
      }
      overload.addImpl = function (...args) {
        const fn = args.pop();
        if (typeof fn !== "function") throw new TypeError("最后一个参数必须是函数");
        const key = args.join(",");
        fnMap.set(key, fn);
      };
      return overload;
    }
    ColorConversion = ColorConversion;
    deepClone = commonUtil.deepClone.bind(commonUtil);
    debounce(fn, delay = 0) {
      let timer = null;
      const that = this;
      return function (...args) {
        clearTimeout(timer);
        timer = setTimeout(function () {
          fn.apply(that, args);
        }, delay);
      };
    }
    Dictionary = UtilsDictionary;
    downloadBase64(base64Data, fileName, isIFrame = false) {
      if (typeof base64Data !== "string") throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
      if (typeof fileName !== "string") throw new Error("Utils.downloadBase64 参数 fileName 必须为 string 类型");
      if (isIFrame) {
        const $iframe = this.windowApi.document.createElement("iframe");
        $iframe.style.display = "none";
        $iframe.src = base64Data;
        (this.windowApi.document.body || this.windowApi.document.documentElement).appendChild($iframe);
        setTimeout(() => {
          $iframe.contentWindow.document.execCommand("SaveAs", true, fileName);
          (this.windowApi.document.body || this.windowApi.document.documentElement).removeChild($iframe);
        }, 100);
      } else {
        const linkElement = this.windowApi.document.createElement("a");
        linkElement.setAttribute("target", "_blank");
        linkElement.download = fileName;
        linkElement.href = base64Data;
        linkElement.click();
      }
    }
    findWebPageVisibleText(str = "", caseSensitive = false) {
      let TRange = null;
      let strFound;
      if (this.windowApi.globalThis.find) {
        const windowFind = this.windowApi.self.find;
        strFound = windowFind(str, caseSensitive, true, true, false);
        if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode)
          strFound = windowFind(str, caseSensitive, true, true, false);
        if (!strFound) {
          strFound = windowFind(str, 0, 1);
          while (windowFind(str, 0, 1)) continue;
        }
      } else if (navigator.appName.indexOf("Microsoft") != -1) {
        if (TRange != null) {
          TRange = TRange;
          TRange.collapse(false);
          strFound = TRange.findText(str);
          if (strFound) TRange.select();
        }
        if (TRange == null || strFound == 0) {
          TRange = this.windowApi.self.document.body.createTextRange();
          strFound = TRange.findText(str);
          if (strFound) TRange.select();
        }
      } else if (navigator.appName == "Opera") {
        alert("Opera browsers not supported, sorry...");
        return;
      }
      return strFound ? true : false;
    }
    formatByteToSize(byteSize, addType = true, unit = "1024") {
      byteSize = parseInt(byteSize.toString());
      if (isNaN(byteSize)) throw new Error("Utils.formatByteToSize 参数 byteSize 格式不正确");
      let result = 0;
      let resultType = "KB";
      const sizeData = {};
      const unitNumber = Number(unit);
      sizeData.B = 1;
      sizeData.KB = unitNumber;
      sizeData.MB = sizeData.KB * sizeData.KB;
      sizeData.GB = sizeData.MB * sizeData.KB;
      sizeData.TB = sizeData.GB * sizeData.KB;
      sizeData.PB = sizeData.TB * sizeData.KB;
      sizeData.EB = sizeData.PB * sizeData.KB;
      sizeData.ZB = sizeData.EB * sizeData.KB;
      sizeData.YB = sizeData.ZB * sizeData.KB;
      sizeData.BB = sizeData.YB * sizeData.KB;
      sizeData.NB = sizeData.BB * sizeData.KB;
      sizeData.DB = sizeData.NB * sizeData.KB;
      for (const key in sizeData) {
        result = byteSize / sizeData[key];
        resultType = key;
        if (sizeData.KB >= result) break;
      }
      result = result.toFixed(2);
      result = addType ? result + resultType.toString() : parseFloat(result.toString());
      return result;
    }
    getNodeListValue(...args) {
      let resultArray = [];
      for (const arg of args) {
        let value = arg;
        if (typeof arg === "function") value = arg();
        if (value.length !== 0) {
          resultArray = [...value];
          break;
        }
      }
      return resultArray;
    }
    getNonNullValue(...args) {
      let resultValue = args[args.length - 1];
      const that = this;
      for (const argValue of args)
        if (that.isNotNull(argValue)) {
          resultValue = argValue;
          break;
        }
      return resultValue;
    }
    formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
      const time = text == null ? new Date() : new Date(text);
      function checkTime(timeNum) {
        if (timeNum < 10) return `0${timeNum}`;
        return timeNum;
      }
      function timeSystemChange(hourNum) {
        return hourNum > 12 ? hourNum - 12 : hourNum;
      }
      const timeRegexp = {
        yyyy: time.getFullYear(),
        MM: checkTime(time.getMonth() + 1),
        dd: checkTime(time.getDate()),
        HH: checkTime(time.getHours()),
        hh: checkTime(timeSystemChange(time.getHours())),
        mm: checkTime(time.getMinutes()),
        ss: checkTime(time.getSeconds()),
      };
      Object.keys(timeRegexp).forEach(function (key) {
        const replaecRegexp = new RegExp(key, "g");
        formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
      });
      return formatType;
    }
    formatToTimeStamp(text) {
      if (typeof text !== "string") throw new Error("Utils.formatToTimeStamp 参数 text 必须为 string 类型");
      if (text.length === 8) {
        const today = new Date();
        text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
      }
      text = text.substring(0, 19);
      text = text.replace(/-/g, "/");
      return new Date(text).getTime();
    }
    GBKEncoder = GBKEncoder;
    getArrayLastValue(target) {
      return target[target.length - 1];
    }
    getArrayRealValue(...args) {
      let result = null;
      for (let arg of args) {
        if (typeof arg === "function") arg = arg();
        if (arg != null) {
          result = arg;
          break;
        }
      }
      return result;
    }
    getDaysDifference(timestamp1 = Date.now(), timestamp2 = Date.now(), type = "天") {
      type = type.trim();
      if (timestamp1.toString().length === 10) timestamp1 = timestamp1 * 1e3;
      if (timestamp2.toString().length === 10) timestamp2 = timestamp2 * 1e3;
      const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
      const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
      const oneSecond = 1e3;
      const oneMinute = 60 * oneSecond;
      const oneHour = 60 * oneMinute;
      const oneDay = 24 * oneHour;
      const oneMonth = 30 * oneDay;
      const oneYear = 12 * oneMonth;
      const bigDate = new Date(bigTimeStamp);
      const smallDate = new Date(smallTimeStamp);
      let remainderValue = 1;
      if (type === "年") remainderValue = oneYear;
      else if (type === "月") remainderValue = oneMonth;
      else if (type === "天") remainderValue = oneDay;
      else if (type === "时") remainderValue = oneHour;
      else if (type === "分") remainderValue = oneMinute;
      else if (type === "秒") remainderValue = oneSecond;
      let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
      if (type === "auto") {
        const timeDifference = bigTimeStamp - smallTimeStamp;
        diffValue = Math.floor(timeDifference / (24 * 3600 * 1e3));
        if (diffValue > 0) diffValue = `${diffValue}天`;
        else {
          const leave1 = timeDifference % (24 * 3600 * 1e3);
          const hours = Math.floor(leave1 / (3600 * 1e3));
          if (hours > 0) diffValue = `${hours}小时`;
          else {
            const leave2 = leave1 % (3600 * 1e3);
            const minutes = Math.floor(leave2 / (60 * 1e3));
            if (minutes > 0) diffValue = `${minutes}分钟`;
            else {
              const leave3 = leave2 % (60 * 1e3);
              diffValue = `${Math.round(leave3 / 1e3)}秒`;
            }
          }
        }
      }
      return diffValue;
    }
    getMaxValue(...args) {
      const result = [...args];
      const newResult = [];
      if (result.length === 0) return;
      if (result.length > 1) {
        if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
          const data = result[0];
          const handleDataFunc = result[1];
          Object.keys(data).forEach((keyName) => {
            newResult.push(handleDataFunc(keyName, data[keyName]));
          });
        } else if (result.length === 2 && Array.isArray(result[0]) && typeof result[1] === "function") {
          const data = result[0];
          const handleDataFunc = result[1];
          data.forEach((value, index, __data__) => {
            newResult.push(handleDataFunc(value, index, __data__));
          });
        } else
          result.forEach((item) => {
            if (!isNaN(parseFloat(item))) newResult.push(parseFloat(item));
          });
        return Math.max(...newResult);
      } else {
        result[0].forEach((item) => {
          if (!isNaN(parseFloat(item))) newResult.push(parseFloat(item));
        });
        return Math.max(...newResult);
      }
    }
    getMaxZIndexNodeInfo(deviation = 1, target = this.windowApi.document, ignoreCallBack) {
      deviation = Number.isNaN(deviation) ? 1 : deviation;
      const that = this;
      const maxZIndexCompare = 2 * Math.pow(10, 9);
      let zIndex = 0;
      let maxZIndexNode = null;
      const isVisibleNode = function ($css, $el) {
        let flag = true;
        if (!($el instanceof HTMLElement)) flag = false;
        else if (typeof $el.checkVisibility === "function") flag = $el.checkVisibility();
        else
          flag =
            $css.position !== "static" &&
            $css.display !== "none" &&
            $css.visibility !== "hidden" &&
            $css.opacity !== "0";
        return flag;
      };
      const queryMaxZIndex = function ($el) {
        if (typeof ignoreCallBack === "function") {
          const ignoreResult = ignoreCallBack($el);
          if (typeof ignoreResult === "boolean" && !ignoreResult) return;
        }
        const nodeStyle = that.windowApi.globalThis.getComputedStyle($el);
        if (isVisibleNode(nodeStyle, $el)) {
          const nodeZIndex = parseInt(nodeStyle.zIndex);
          if (!isNaN(nodeZIndex)) {
            if (nodeZIndex > zIndex) {
              zIndex = nodeZIndex;
              maxZIndexNode = $el;
            }
          }
          if ($el.shadowRoot != null && $el instanceof ShadowRoot)
            $el.shadowRoot.querySelectorAll("*").forEach(($shadowEle) => {
              queryMaxZIndex($shadowEle);
            });
        }
      };
      target.querySelectorAll("*").forEach(($elItem) => {
        queryMaxZIndex($elItem);
      });
      zIndex += deviation;
      if (zIndex >= maxZIndexCompare) zIndex = maxZIndexCompare;
      return {
        node: maxZIndexNode,
        zIndex,
      };
    }
    getMaxZIndexNodeInfoFromPoint($el, deviation) {
      if (typeof $el === "function") $el = $el();
      if (typeof $el === "number") {
        deviation = $el;
        $el = void 0;
      }
      if (typeof deviation !== "number" || Number.isNaN(deviation)) deviation = 10;
      const maxZIndexCompare = 2 * Math.pow(10, 9);
      const positionDistance = 10;
      const defaultCalcPostion = [];
      const maxPostionX = globalThis.innerWidth;
      const maxPostionY = globalThis.innerHeight;
      const gridXCount = 8;
      const gridYCount = 8;
      for (let i = 0; i < gridXCount; i++)
        for (let j = 0; j < gridYCount; j++) {
          const position = {
            x: globalThis.innerWidth * (i / gridXCount) + positionDistance,
            y: globalThis.innerHeight * (j / gridYCount) + positionDistance,
          };
          if (position.x > maxPostionX) position.x = maxPostionX;
          if (position.y > maxPostionY) position.y = maxPostionY;
          defaultCalcPostion.push(position);
        }
      const delayHandlerElementPostionList = defaultCalcPostion;
      if ($el) {
        delayHandlerElementPostionList.length = 0;
        if (Array.isArray($el)) delayHandlerElementPostionList.push(...$el);
        else delayHandlerElementPostionList.push($el);
      }
      const positionInfoList = delayHandlerElementPostionList
        .map((position) => {
          let $position;
          let positionX;
          let positionY;
          if (position instanceof HTMLElement) {
            $position = position;
            const nodeRect = position.getBoundingClientRect();
            positionX = nodeRect.x + nodeRect.width / 2;
            positionY = nodeRect.y + nodeRect.height / 2;
          } else {
            $position = document.elementFromPoint(position.x, position.y);
            positionX = position.x;
            positionY = position.y;
          }
          const shadowRoot = $position?.shadowRoot;
          if (shadowRoot) $position = shadowRoot.elementFromPoint(positionX, positionY);
          if (!($position instanceof HTMLElement)) return;
          let $parent = $position;
          let zIndex = 0;
          let $maxZIndexNode = null;
          let rect = {
            x: 0,
            y: 0,
            width: 0,
            height: 0,
            top: 0,
            right: 0,
            bottom: 0,
            left: 0,
          };
          while ($parent) {
            const nodeStyle = globalThis.getComputedStyle($parent);
            const nodeZIndex = parseInt(nodeStyle.zIndex);
            if (nodeStyle.position !== "static" && !isNaN(nodeZIndex)) {
              if (nodeZIndex > zIndex) {
                zIndex = nodeZIndex;
                $maxZIndexNode = $parent;
              }
            }
            $parent = $parent.parentElement;
          }
          if ($maxZIndexNode) {
            const maxRect = $maxZIndexNode.getBoundingClientRect();
            rect = {
              x: maxRect.x,
              y: maxRect.y,
              width: maxRect.width,
              height: maxRect.height,
              top: maxRect.top,
              right: maxRect.right,
              bottom: maxRect.bottom,
              left: maxRect.left,
            };
          }
          const calcZIndex = zIndex + deviation;
          if (calcZIndex >= maxZIndexCompare) return;
          return {
            zIndex: calcZIndex,
            originZIndex: zIndex,
            node: $maxZIndexNode,
            positionNode: $position,
            positionX,
            positionY,
            rect,
          };
        })
        .filter((it) => it != null);
      positionInfoList.sort((a, b) => {
        if (a.zIndex < b.zIndex) return 1;
        else if (a.zIndex > b.zIndex) return -1;
        else return 0;
      });
      return positionInfoList;
    }
    getMaxZIndex(deviation = 1, target = this.windowApi.document, ignoreCallBack) {
      return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
    }
    getMinValue(...args) {
      const result = [...args];
      let newResult = [];
      if (result.length === 0) return;
      if (result.length > 1) {
        if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
          const data = result[0];
          const handleDataFunc = result[1];
          Object.keys(data).forEach((keyName) => {
            newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
          });
        } else
          result.forEach((item) => {
            if (!isNaN(parseFloat(item))) newResult = [...newResult, parseFloat(item)];
          });
        return Math.min(...newResult);
      } else {
        result[0].forEach((item) => {
          if (!isNaN(parseFloat(item))) newResult = [...newResult, parseFloat(item)];
        });
        return Math.min(...newResult);
      }
    }
    getRandomAndroidUA() {
      const that = this;
      return `Mozilla/5.0 (Linux; Android ${that.getRandomValue(12, 14)}; ${that.getRandomValue([
        "LDN-LX3",
        "RNE-L03",
        "ASUS_X00ID Build/NMF26F",
        "WAS-LX3",
        "PRA-LX3",
        "MYA-L03",
        "Moto G Play",
        "Moto C Build/NRD90M.063",
        "Redmi Note 4 Build/NRD90M",
        "HUAWEI VNS-L21 Build/HUAWEIVNS-L21",
        "VTR-L09",
        "TRT-LX3",
        "M2003J15SC Build/RP1A.200720.011; wv",
        "MI 13 Build/OPR1.170623.027; wv",
      ])}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${that.getRandomValue(130, 140)}.${that.getRandomValue(0, 0)}.${that.getRandomValue(2272, 6099)}.${that.getRandomValue(1, 218)} Mobile Safari/537.36`;
    }
    getRandomPCUA() {
      const that = this;
      return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${that.getRandomValue(130, 140)}.${that.getRandomValue(0, 0)}.${that.getRandomValue(2272, 6099)}.${that.getRandomValue(1, 218)} Safari/537.36`;
    }
    getRandomValue(...args) {
      const result = [...args];
      if (result.length > 1)
        if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
          const leftNumber = result[0] > result[1] ? result[1] : result[0];
          const rightNumber = result[0] > result[1] ? result[0] : result[1];
          return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
        } else return result[Math.floor(Math.random() * result.length)];
      else if (result.length === 1) {
        const paramData = result[0];
        if (Array.isArray(paramData)) return paramData[Math.floor(Math.random() * paramData.length)];
        else if (typeof paramData === "object" && Object.keys(paramData).length > 0)
          return paramData[Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)]];
        else return paramData;
      }
    }
    getReactInstance(element) {
      const result = {};
      if (element == null) return result;
      Object.keys(element).forEach((domPropsName) => {
        if (domPropsName.startsWith("__react")) {
          const propsName = domPropsName.replace(/__(.+)\$.+/i, "$1");
          const propsValue = Reflect.get(element, domPropsName);
          if (propsName in result) console.error(`重复属性 ${domPropsName}`);
          else Reflect.set(result, propsName, propsValue);
        }
      });
      return result;
    }
    getSymbol(target, keyName) {
      if (typeof target !== "object") throw new TypeError("target不是一个对象");
      const objectsSymbols = Object.getOwnPropertySymbols(target);
      if (typeof keyName === "string") {
        const findSymbol = objectsSymbols.find((key) => {
          return key.toString() === keyName;
        });
        if (findSymbol) return target[findSymbol];
      } else if (typeof keyName === "symbol") {
        const findSymbol = objectsSymbols.find((key) => {
          return key === keyName;
        });
        if (findSymbol) return target[findSymbol];
      } else {
        const result = {};
        objectsSymbols.forEach((item) => {
          result[item] = target[item];
        });
        return result;
      }
    }
    getTextLength(text) {
      return new TextEncoder().encode(text).length;
    }
    getTextStorageSize(text, addType = true) {
      const that = this;
      return that.formatByteToSize(that.getTextLength(text), addType);
    }
    getThunderUrl(url) {
      if (url == null) throw new TypeError("url不能为空");
      if (typeof url !== "string") throw new TypeError("url必须是string类型");
      if (url.trim() === "") throw new TypeError("url不能为空字符串或纯空格");
      return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
    }
    DocumentCookieHandler = DocumentCookieHandler;
    CookieManagerService = CookieManagerService;
    GM_Menu = GMMenu;
    Hooks = Hooks;
    Httpx = Httpx;
    indexedDB = indexedDB;
    isNativeFunc(target) {
      return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
    }
    isNearBottom(...args) {
      let nearBottomHeight = 50;
      const checkWindow = () => {
        const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
        const viewportHeight =
          this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
        const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
        return scrollTop + viewportHeight >= maxScrollHeight;
      };
      const checkNode = ($ele) => {
        const scrollTop = $ele.scrollTop;
        const viewportHeight = $ele.clientHeight;
        return scrollTop >= $ele.scrollHeight - viewportHeight - nearBottomHeight;
      };
      const firstArg = args[0];
      if (args.length === 0 || typeof args[0] === "number") return checkWindow();
      else if (typeof args[0] === "object" && args[0] instanceof HTMLElement) {
        if (typeof args[1] === "number" && !Number.isNaN(args[1])) nearBottomHeight = args[1];
        return checkNode(args[0]);
      } else throw new TypeError(`参数1类型错误${typeof firstArg}`);
    }
    isDOM = commonUtil.isDOM.bind(commonUtil);
    isFullscreenEnabled() {
      return !!(
        this.windowApi.document.fullscreenEnabled ||
        this.windowApi.document.webkitFullScreenEnabled ||
        this.windowApi.document.mozFullScreenEnabled ||
        this.windowApi.document.msFullScreenEnabled
      );
    }
    isJQuery(target) {
      let result = false;
      if (typeof jQuery === "object" && target instanceof jQuery) result = true;
      if (target == null) return false;
      if (typeof target === "object")
        for (const jQueryPropsName of [
          "add",
          "addBack",
          "addClass",
          "after",
          "ajaxComplete",
          "ajaxError",
          "ajaxSend",
          "ajaxStart",
          "ajaxStop",
          "ajaxSuccess",
          "animate",
          "append",
          "appendTo",
          "attr",
          "before",
          "bind",
          "blur",
          "change",
          "children",
          "clearQueue",
          "click",
          "clone",
          "closest",
          "constructor",
          "contents",
          "contextmenu",
          "css",
          "data",
          "dblclick",
          "delay",
          "delegate",
          "dequeue",
          "each",
          "empty",
          "end",
          "eq",
          "extend",
          "fadeIn",
          "fadeOut",
          "fadeTo",
          "fadeToggle",
          "filter",
          "find",
          "first",
          "focus",
          "focusin",
          "focusout",
          "get",
          "has",
          "hasClass",
          "height",
          "hide",
          "hover",
          "html",
          "index",
          "init",
          "innerHeight",
          "innerWidth",
          "insertAfter",
          "insertBefore",
          "is",
          "jquery",
          "keydown",
          "keyup",
          "last",
          "load",
          "map",
          "mousedown",
          "mouseenter",
          "mouseleave",
          "mousemove",
          "mouseout",
          "mouseover",
          "mouseup",
          "next",
          "nextAll",
          "not",
          "off",
          "offset",
          "offsetParent",
          "on",
          "one",
          "outerHeight",
          "outerWidth",
          "parent",
          "parents",
          "position",
          "prepend",
          "prependTo",
          "prev",
          "prevAll",
          "prevUntil",
          "promise",
          "prop",
          "pushStack",
          "queue",
          "ready",
          "remove",
          "removeAttr",
          "removeClass",
          "removeData",
          "removeProp",
          "replaceAll",
          "replaceWith",
          "resize",
          "scroll",
          "scrollLeft",
          "scrollTop",
          "select",
          "show",
          "siblings",
          "slice",
          "slideDown",
          "slideToggle",
          "slideUp",
          "sort",
          "splice",
          "text",
          "toArray",
          "toggle",
          "toggleClass",
          "trigger",
          "triggerHandler",
          "unbind",
          "width",
          "wrap",
        ])
          if (!(jQueryPropsName in target)) {
            result = false;
            break;
          } else result = true;
      return result;
    }
    isPhone(userAgent = navigator.userAgent) {
      return Boolean(/(iPhone|iPad|iPod|iOS|Android|Mobile)/i.test(userAgent));
    }
    isSameChars(targetStr, coefficient = 1) {
      if (typeof targetStr !== "string") throw new TypeError("参数 str 必须是 string 类型");
      if (targetStr.length < 2) return false;
      targetStr = targetStr.toLowerCase();
      const targetCharMap = {};
      let targetStrLength = 0;
      for (const char of targetStr) {
        if (Reflect.has(targetCharMap, char)) targetCharMap[char]++;
        else targetCharMap[char] = 1;
        targetStrLength++;
      }
      let result = false;
      for (const char in targetCharMap)
        if (targetCharMap[char] / targetStrLength >= coefficient) {
          result = true;
          break;
        }
      return result;
    }
    isNotNull = commonUtil.isNotNull.bind(commonUtil);
    isNull = commonUtil.isNull.bind(commonUtil);
    isThemeDark() {
      return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
    }
    isVisible(element, inView = false) {
      let needCheckDomList = [];
      if (element instanceof Array || element instanceof NodeList) {
        element = element;
        needCheckDomList = [...element];
      } else needCheckDomList = [element];
      let result = true;
      for (const domItem of needCheckDomList) {
        if (this.windowApi.window.getComputedStyle(domItem).display === "none") result = false;
        else {
          const domClientRect = domItem.getBoundingClientRect();
          if (inView) {
            const viewportWidth =
              this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
            const viewportHeight =
              this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
            result = !(
              domClientRect.right < 0 ||
              domClientRect.left > viewportWidth ||
              domClientRect.bottom < 0 ||
              domClientRect.top > viewportHeight
            );
          } else result = Boolean(domItem.getClientRects().length);
        }
        if (!result) break;
      }
      return result;
    }
    isWebView_Via() {
      let result = true;
      const that = this;
      if (typeof this.windowApi.top.window.via === "object") {
        for (const key in Object.values(this.windowApi.top.window.via))
          if (Reflect.has(this.windowApi.top.window.via, key)) {
            const objValueFunc = this.windowApi.top.window.via[key];
            if (typeof objValueFunc === "function" && that.isNativeFunc(objValueFunc)) result = true;
            else {
              result = false;
              break;
            }
          }
      } else result = false;
      return result;
    }
    isWebView_X() {
      let result = true;
      const that = this;
      if (typeof this.windowApi.top.window.mbrowser === "object") {
        for (const key in Object.values(this.windowApi.top.window.mbrowser))
          if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
            const objValueFunc = this.windowApi.top.window.mbrowser[key];
            if (typeof objValueFunc === "function" && that.isNativeFunc(objValueFunc)) result = true;
            else {
              result = false;
              break;
            }
          }
      } else result = false;
      return result;
    }
    parseObjectToArray(target) {
      if (typeof target !== "object") throw new Error("Utils.parseObjectToArray 参数 target 必须为 object 类型");
      let result = [];
      Object.keys(target).forEach(function (keyName) {
        const value = Reflect.get(target, keyName);
        result = result.concat(value);
      });
      return result;
    }
    LockFunction = LockFunction;
    Log = Log;
    mergeArrayToString(data, handleFunc) {
      if (!(data instanceof Array)) throw new Error("Utils.mergeArrayToString 参数 data 必须为 Array 类型");
      let content = "";
      if (typeof handleFunc === "function")
        data.forEach((item) => {
          content += handleFunc(item);
        });
      else if (typeof handleFunc === "string")
        data.forEach((item) => {
          content += item[handleFunc];
        });
      else
        data.forEach((item) => {
          Object.values(item)
            .filter((item2) => typeof item2 === "string")
            .forEach((item3) => {
              content += item3;
            });
        });
      return content;
    }
    mutationObserver(target, observer_config) {
      const that = this;
      observer_config = that.assign(
        {
          callback: () => {},
          config: {
            subtree: void 0,
            childList: void 0,
            attributes: void 0,
            attributeFilter: void 0,
            attributeOldValue: void 0,
            characterData: void 0,
            characterDataOldValue: void 0,
          },
          immediate: false,
          once: false,
        },
        observer_config
      );
      const windowMutationObserver =
        this.windowApi.window.MutationObserver ||
        this.windowApi.window.webkitMutationObserver ||
        this.windowApi.window.MozMutationObserver;
      const handler = (mutations, observer) => {
        if (observer_config.once) observer.disconnect();
        if (typeof observer_config.callback === "function") observer_config.callback(mutations, observer);
      };
      const mutationObserver = new windowMutationObserver(function (mutations, observer) {
        handler(mutations, observer);
      });
      if (Array.isArray(target) || target instanceof NodeList)
        target.forEach((item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      else if (that.isJQuery(target))
        target.each((_, item) => {
          mutationObserver.observe(item, observer_config.config);
        });
      else mutationObserver.observe(target, observer_config.config);
      if (observer_config.immediate) handler([], mutationObserver);
      return mutationObserver;
    }
    mutationVisible($el, callback, options) {
      if (typeof IntersectionObserver === "undefined") throw new TypeError("IntersectionObserver is not defined");
      if ($el == null) throw new TypeError("mutatuinVisible target is null");
      options = options || {};
      let defaultOptions = {
        root: null,
        rootMargin: "0px 0px 0px 0px",
        threshold: [0.01, 0.99],
      };
      defaultOptions = this.assign(defaultOptions, options);
      const handler = (entries, observer) => {
        if (options.once) observer.disconnect();
        if (typeof callback === "function") callback(entries, observer);
      };
      const intersectionObserver = new IntersectionObserver((entries, observer) => {
        if (entries[0].isIntersecting) handler(entries, observer);
      }, defaultOptions);
      if (Array.isArray($el))
        $el.forEach(($elItem) => {
          intersectionObserver.observe($elItem);
        });
      else intersectionObserver.observe($el);
      if (options.immediate) handler([], intersectionObserver);
      return intersectionObserver;
    }
    noConflict() {
      if (this.windowApi.window.Utils) Reflect.deleteProperty(this.windowApi.window, "Utils");
      this.windowApi.window.Utils = utils$1;
      return utils$1;
    }
    noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
      const that = this;
      if (typeof needReleaseObject !== "object")
        throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
      if (typeof needReleaseName !== "string")
        throw new Error("Utils.noConflictFunc 参数 needReleaseName 必须为 string 类型");
      if (!Array.isArray(functionNameList))
        throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
      const needReleaseKey = `__${needReleaseName}`;
      function releaseAll() {
        if (typeof that.windowApi.window[needReleaseKey] !== "undefined") return;
        that.windowApi.window[needReleaseKey] = that.deepClone(needReleaseObject);
        Object.values(needReleaseObject).forEach((value) => {
          if (typeof value === "function") needReleaseObject[value.name] = () => {};
        });
      }
      function releaseOne() {
        Array.from(functionNameList).forEach((item) => {
          Object.values(needReleaseObject).forEach((value) => {
            if (typeof value === "function") {
              if (typeof that.windowApi.window[needReleaseKey] === "undefined")
                that.windowApi.window[needReleaseKey] = {};
              if (item === value.name) {
                that.windowApi.window[needReleaseKey][value.name] = needReleaseObject[value.name];
                needReleaseObject[value.name] = () => {};
              }
            }
          });
        });
      }
      function recoveryAll() {
        if (typeof that.windowApi.window[needReleaseKey] === "undefined") return;
        Object.assign(needReleaseObject, that.windowApi.window[needReleaseKey]);
        Reflect.deleteProperty(that.windowApi.window, "needReleaseKey");
      }
      function recoveryOne() {
        if (typeof that.windowApi.window[needReleaseKey] === "undefined") return;
        Array.from(functionNameList).forEach((item) => {
          if (that.windowApi.window[needReleaseKey][item]) {
            needReleaseObject[item] = that.windowApi.window[needReleaseKey][item];
            Reflect.deleteProperty(that.windowApi.window[needReleaseKey], item);
            if (Object.keys(that.windowApi.window[needReleaseKey]).length === 0)
              Reflect.deleteProperty(window, needReleaseKey);
          }
        });
      }
      if (release)
        if (functionNameList.length === 0) releaseAll();
        else releaseOne();
      else if (functionNameList.length === 0) recoveryAll();
      else recoveryOne();
    }
    parseBase64ToBlob(dataUri) {
      if (typeof dataUri !== "string") throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
      const dataUriSplit = dataUri.split(","),
        dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1],
        dataUriBase64Str = atob(dataUriSplit[1]);
      let dataUriLength = dataUriBase64Str.length;
      const u8arr = new Uint8Array(dataUriLength);
      while (dataUriLength--) u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
      return new Blob([u8arr], { type: dataUriMime });
    }
    parseBase64ToFile(dataUri, fileName = "example") {
      if (typeof dataUri !== "string") throw new Error("Utils.parseBase64ToFile 参数 dataUri 必须为 string 类型");
      if (typeof fileName !== "string") throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
      const dataUriSplit = dataUri.split(","),
        dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1],
        dataUriBase64Str = atob(dataUriSplit[1]);
      let dataUriLength = dataUriBase64Str.length;
      const u8arr = new Uint8Array(dataUriLength);
      while (dataUriLength--) u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
      return new File([u8arr], fileName, { type: dataUriMime });
    }
    parseInt(matchList = [], defaultValue = 0) {
      if (matchList == null) return parseInt(defaultValue.toString());
      let parseValue = parseInt(matchList[matchList.length - 1]);
      if (isNaN(parseValue)) parseValue = parseInt(defaultValue.toString());
      return parseValue;
    }
    async parseBlobToFile(blobUrl, fileName = "example") {
      return new Promise((resolve, reject) => {
        fetch(blobUrl)
          .then((response) => response.blob())
          .then((blob) => {
            resolve(new File([blob], fileName, { type: blob.type }));
          })
          .catch((error) => {
            console.error("Error:", error);
            reject(error);
          });
      });
    }
    parseCDATA(text = "") {
      let result = "";
      const cdataMatch = /<!\[CDATA\[([\s\S]*)\]\]>/.exec(text.trim());
      if (cdataMatch && cdataMatch.length > 1) result = cdataMatch[cdataMatch.length - 1];
      return result;
    }
    async parseFileToBase64(fileObj) {
      const reader = new FileReader();
      reader.readAsDataURL(fileObj);
      return new Promise((resolve) => {
        reader.onload = function (event) {
          resolve(event.target.result);
        };
      });
    }
    parseFromString(text, mimeType = "text/html") {
      return new DOMParser().parseFromString(text, mimeType);
    }
    toRegExp(text, flags = "gi") {
      let regExp;
      flags = flags.toLowerCase();
      if (typeof text === "string") {
        const pattern = this.toRegExpStr(text);
        regExp = new RegExp(pattern, flags);
      } else if (text instanceof RegExp) regExp = text;
      else throw new Error("Utils.toRegExp 参数text必须是string|Regexp类型");
      return regExp;
    }
    toRegExpStr(text) {
      if (typeof text !== "string") throw new TypeError("toRegExpStr 参数text必须是string类型");
      return text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
    }
    Progress = Progress;
    hookEvent_isTrusted(isTrustValue = true, filter) {
      function trustEvent(event) {
        return new Proxy(event, {
          get: function (target, property) {
            if (property === "isTrusted") return isTrustValue;
            else return Reflect.get(target, property);
          },
        });
      }
      if (filter == null)
        filter = function (typeName) {
          return typeName === "click";
        };
      const originalListener = EventTarget.prototype.addEventListener;
      EventTarget.prototype.addEventListener = function (...args) {
        const type = args[0];
        const callback = args[1];
        if (filter(type)) {
          if (typeof callback === "function")
            args[1] = function (event) {
              callback.call(this, trustEvent(event));
            };
          else if (typeof callback === "object" && "handleEvent" in callback) {
            const oldHandleEvent = callback["handleEvent"];
            args[1]["handleEvent"] = function (event) {
              if (event == null) return;
              try {
                event instanceof Proxy;
                oldHandleEvent.call(this, trustEvent(event));
              } catch {
                Reflect.set(event, "isTrusted", isTrustValue);
              }
            };
          }
        }
        return originalListener.apply(this, args);
      };
    }
    reverseNumber(num) {
      let reversedNum = 0;
      let isNegative = false;
      if (num < 0) {
        isNegative = true;
        num = Math.abs(num);
      }
      while (num > 0) {
        reversedNum = reversedNum * 10 + (num % 10);
        num = Math.floor(num / 10);
      }
      return isNegative ? -reversedNum : reversedNum;
    }
    copy(
      data,
      info = {
        type: "text",
        mimetype: "text/plain",
      }
    ) {
      if (typeof data === "object")
        if (data instanceof Element) data = data.outerHTML;
        else data = JSON.stringify(data);
      else if (typeof data !== "string") data = data.toString();
      let textType = typeof info === "object" ? info.type : info;
      if (textType.includes("html")) textType = "text/html";
      else textType = "text/plain";
      const that = this;
      class UtilsClipboard {
        #resolve;
        #copyData;
        #copyDataType;
        constructor(resolve, copyData, copyDataType) {
          this.#resolve = resolve;
          this.#copyData = copyData;
          this.#copyDataType = copyDataType;
        }
        async init() {
          let copyStatus = false;
          await this.requestClipboardPermission();
          if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText()))
            try {
              copyStatus = await this.copyDataByClipboard();
            } catch (error) {
              console.error("复制失败,使用第二种方式,error👉", error);
              copyStatus = this.copyTextByTextArea();
            }
          else copyStatus = this.copyTextByTextArea();
          this.#resolve(copyStatus);
          this.destroy();
        }
        destroy() {
          this.#resolve = null;
          this.#copyData = null;
          this.#copyDataType = null;
        }
        isText() {
          return this.#copyDataType.includes("text");
        }
        hasClipboard() {
          return navigator?.clipboard != null;
        }
        hasClipboardWrite() {
          return navigator?.clipboard?.write != null;
        }
        hasClipboardWriteText() {
          return navigator?.clipboard?.writeText != null;
        }
        copyTextByTextArea() {
          try {
            const copyElement = that.windowApi.document.createElement("textarea");
            copyElement.value = this.#copyData;
            copyElement.setAttribute("type", "text");
            copyElement.setAttribute("style", "opacity:0;position:absolute;");
            copyElement.setAttribute("readonly", "readonly");
            that.windowApi.document.body.appendChild(copyElement);
            copyElement.select();
            that.windowApi.document.execCommand("copy");
            that.windowApi.document.body.removeChild(copyElement);
            return true;
          } catch (error) {
            console.error("复制失败,error👉", error);
            return false;
          }
        }
        requestClipboardPermission() {
          return new Promise((resolve) => {
            if (navigator.permissions && navigator.permissions.query)
              navigator.permissions
                .query({ name: "clipboard-write" })
                .then(() => {
                  resolve(true);
                })
                .catch((error) => {
                  console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
                  resolve(false);
                });
            else resolve(false);
          });
        }
        copyDataByClipboard() {
          return new Promise((resolve, reject) => {
            if (this.isText())
              navigator.clipboard
                .writeText(this.#copyData)
                .then(() => {
                  resolve(true);
                })
                .catch((error) => {
                  reject(error);
                });
            else {
              const textBlob = new Blob([this.#copyData], { type: this.#copyDataType });
              navigator.clipboard
                .write([new ClipboardItem({ [this.#copyDataType]: textBlob })])
                .then(() => {
                  resolve(true);
                })
                .catch((error) => {
                  reject(error);
                });
            }
          });
        }
      }
      return new Promise((resolve) => {
        const utilsClipboard = new UtilsClipboard(resolve, data, textType);
        if (that.windowApi.document.hasFocus()) utilsClipboard.init();
        else
          that.windowApi.window.addEventListener(
            "focus",
            () => {
              utilsClipboard.init();
            },
            { once: true }
          );
      });
    }
    async getClipboardInfo() {
      return new Promise((resolve) => {
        function readClipboardText() {
          navigator.clipboard
            .readText()
            .then((clipboardText) => {
              resolve({
                error: null,
                content: clipboardText,
              });
            })
            .catch((error) => {
              resolve({
                error,
                content: "",
              });
            });
        }
        function requestPermissionsWithClipboard() {
          navigator.permissions
            .query({ name: "clipboard-read" })
            .then(() => {
              readClipboardText();
            })
            .catch(() => {
              readClipboardText();
            });
        }
        function checkClipboardApi() {
          if (typeof navigator?.clipboard?.readText !== "function") return false;
          if (typeof navigator?.permissions?.query !== "function") return false;
          return true;
        }
        if (!checkClipboardApi()) {
          resolve({
            error: new Error("当前环境不支持读取剪贴板Api"),
            content: "",
          });
          return;
        }
        if (document.hasFocus()) requestPermissionsWithClipboard();
        else
          window.addEventListener(
            "focus",
            () => {
              requestPermissionsWithClipboard();
            },
            { once: true }
          );
      });
    }
    setTimeout(callback, delayTime = 0) {
      if (typeof callback !== "function" && typeof callback !== "string")
        throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
      if (typeof delayTime !== "number") throw new TypeError("Utils.setTimeout 参数 delayTime 必须为 number 类型");
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(this.tryCatch().run(callback));
        }, delayTime);
      });
    }
    sleep(delayTime = 0) {
      if (typeof delayTime !== "number") throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(void 0);
        }, delayTime);
      });
    }
    dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
      const that = this;
      function initMouseEvent(eventName, offSetX, offSetY) {
        const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
        const mouseEvent = that.windowApi.document.createEvent("MouseEvents");
        mouseEvent.initMouseEvent(
          eventName,
          true,
          true,
          win,
          0,
          offSetX,
          offSetY,
          offSetX,
          offSetY,
          false,
          false,
          false,
          false,
          0,
          null
        );
        return mouseEvent;
      }
      const sliderElement = typeof selector === "string" ? domUtils$1.selector(selector) : selector;
      if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element))
        throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
      const rect = sliderElement.getBoundingClientRect(),
        x0 = rect.x || rect.left,
        y0 = rect.y || rect.top,
        x1 = x0 + offsetX,
        y1 = y0;
      sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
      sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
      sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
      sliderElement.dispatchEvent(initMouseEvent("mouseout", x1, y1));
    }
    enterFullScreen(element = this.windowApi.document.documentElement, options) {
      try {
        if (element.requestFullscreen) element.requestFullscreen(options);
        else if (element.webkitRequestFullScreen) element.webkitRequestFullScreen();
        else if (element.mozRequestFullScreen) element.mozRequestFullScreen();
        else if (element.msRequestFullscreen) element.msRequestFullscreen();
        else throw new TypeError("该浏览器不支持全屏API");
      } catch (err) {
        console.error(err);
      }
    }
    exitFullScreen($el = this.windowApi.document.documentElement) {
      if ($el.exitFullscreen) return $el.exitFullscreen();
      else if ($el.msExitFullscreen) return $el.msExitFullscreen();
      else if ($el.mozCancelFullScreen) return $el.mozCancelFullScreen();
      else if ($el.webkitCancelFullScreen) return $el.webkitCancelFullScreen();
      else
        return new Promise((_, reject) => {
          reject(new TypeError("该浏览器不支持全屏API"));
        });
    }
    sortListByProperty(data, getComparePropertyValue, sortByDesc = true) {
      const that = this;
      if (typeof getComparePropertyValue !== "function" && typeof getComparePropertyValue !== "string")
        throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
      if (typeof sortByDesc !== "boolean")
        throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
      const getTargetValue = function (target) {
        return typeof getComparePropertyValue === "string"
          ? target[getComparePropertyValue]
          : getComparePropertyValue(target);
      };
      const sortFunc = function (afterInst, beforeInst) {
        const beforeValue = getTargetValue(beforeInst);
        const afterValue = getTargetValue(afterInst);
        if (sortByDesc)
          if (beforeValue < afterValue) return -1;
          else if (beforeValue > afterValue) return 1;
          else return 0;
        else if (beforeValue > afterValue) return -1;
        else if (beforeValue < afterValue) return 1;
        else return 0;
      };
      const sortNodeFunc = function (nodeList, getNodeListFunc) {
        const nodeListLength = nodeList.length;
        for (let index = 0; index < nodeListLength - 1; index++)
          for (let index2 = 0; index2 < nodeListLength - 1 - index; index2++) {
            const beforeNode = nodeList[index2];
            const afterNode = nodeList[index2 + 1];
            const beforeValue = getTargetValue(beforeNode);
            const afterValue = getTargetValue(afterNode);
            if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
              const temp = beforeNode.nextElementSibling;
              afterNode.after(beforeNode);
              if (temp == null) temp.parentNode.appendChild(afterNode);
              else temp.before(afterNode);
              nodeList = getNodeListFunc();
            }
          }
      };
      let result = data;
      let getDataFunc = null;
      if (data instanceof Function) {
        getDataFunc = data;
        const newData = getDataFunc();
        data = newData;
        result = newData;
      }
      if (Array.isArray(data)) data.sort(sortFunc);
      else if (data instanceof NodeList || that.isJQuery(data)) {
        sortNodeFunc(data, getDataFunc);
        result = getDataFunc();
      } else throw new Error("Utils.sortListByProperty 参数 data 必须为 Array|NodeList|jQuery 类型");
      return result;
    }
    stringTitleToUpperCase(targetString, otherStrToLowerCase = false) {
      let newTargetString = targetString.slice(0, 1).toUpperCase();
      if (otherStrToLowerCase) newTargetString = newTargetString + targetString.slice(1).toLowerCase();
      else newTargetString = newTargetString + targetString.slice(1);
      return newTargetString;
    }
    startsWith(target, searchString, position = 0) {
      const that = this;
      if (position > target.length) return false;
      if (position !== 0) target = target.slice(position, target.length);
      let searchStringRegexp = searchString;
      if (typeof searchString === "string") searchStringRegexp = new RegExp(`^${searchString}`);
      else if (Array.isArray(searchString)) {
        let flag = false;
        for (const searcStr of searchString)
          if (!that.startsWith(target, searcStr, position)) {
            flag = true;
            break;
          }
        return flag;
      }
      return Boolean(target.match(searchStringRegexp));
    }
    firstLetterToLowercase(text, otherToUpperCase = false) {
      let newTargetString = text.slice(0, 1).toLowerCase();
      if (otherToUpperCase) newTargetString = newTargetString + text.slice(1).toUpperCase();
      else newTargetString = newTargetString + text.slice(1);
      return newTargetString;
    }
    toJSON = commonUtil.toJSON.bind(commonUtil);
    toSearchParamsStr(obj, addPrefix) {
      const that = this;
      let searhParamsStr = "";
      if (Array.isArray(obj))
        obj.forEach((item) => {
          if (searhParamsStr === "") searhParamsStr += that.toSearchParamsStr(item);
          else searhParamsStr += `&${that.toSearchParamsStr(item)}`;
        });
      else searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
      if (addPrefix && !searhParamsStr.startsWith("?")) searhParamsStr = `?${searhParamsStr}`;
      return searhParamsStr;
    }
    searchParamStrToObj(searhParamsStr) {
      const params = {};
      if (searhParamsStr == null) return params;
      (searhParamsStr instanceof URLSearchParams ? searhParamsStr : new URLSearchParams(searhParamsStr)).forEach(
        (value, key) => {
          Reflect.set(params, key, value);
        }
      );
      return params;
    }
    tryCatch = TryCatch;
    uniqueArray(
      uniqueArrayData = [],
      compareArrayData,
      compareFun = (item, item2) => {
        return item === item2;
      }
    ) {
      if (typeof compareArrayData === "function") {
        const compareFn = compareArrayData;
        const seen = new Set();
        const result = [];
        for (const item of uniqueArrayData) {
          const identfier = compareFn(item);
          if (!seen.has(identfier)) {
            seen.add(identfier);
            result.push(item);
          }
        }
        return result;
      } else {
        const compareSet = new Set(compareArrayData);
        const result = [];
        for (let i = 0; i < uniqueArrayData.length; i++) {
          const item = uniqueArrayData[i];
          let flag = false;
          for (const compareItem of compareSet)
            if (compareFun(item, compareItem)) {
              flag = true;
              break;
            }
          if (!flag) result.push(item);
        }
        return result;
      }
    }
    waitArrayLoopToEnd(data, handleFunc) {
      const that = this;
      if (typeof handleFunc !== "function" && typeof handleFunc !== "string")
        throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
      return Promise.all(
        Array.from(data).map(async (item, index) => {
          await that.tryCatch(index, item).run(handleFunc);
        })
      );
    }
    waitProperty(target, propertyName) {
      return new Promise((resolve) => {
        let obj = target;
        if (typeof target === "function") obj = target();
        if (Reflect.has(obj, propertyName)) resolve(obj[propertyName]);
        else
          Object.defineProperty(obj, propertyName, {
            set: function (value) {
              try {
                resolve(value);
              } catch (error) {
                console.error("Error setting property:", error);
              }
            },
          });
      });
    }
    waitPropertyByInterval(checkFn, propertyName, intervalTimer = 250, maxTime = -1) {
      if (checkFn == null) throw new TypeError("checkObj 不能为空对象 ");
      let isResolve = false;
      return new Promise((resolve, reject) => {
        const interval = setInterval(() => {
          let inst = checkFn;
          if (typeof checkFn === "function") inst = checkFn();
          if (typeof inst !== "object") return;
          if (inst == null) return;
          if ((typeof propertyName === "function" && propertyName(inst)) || Reflect.has(inst, propertyName)) {
            isResolve = true;
            clearInterval(interval);
            resolve(inst[propertyName]);
          }
        }, intervalTimer);
        if (maxTime !== -1)
          setTimeout(() => {
            if (!isResolve) {
              clearInterval(interval);
              reject();
            }
          }, maxTime);
      });
    }
    async waitVueByInterval($el, propertyName, timer = 250, maxTime = -1, vueName = "__vue__") {
      if ($el == null) throw new Error("Utils.waitVueByInterval 参数element 不能为空");
      let flag = false;
      const that = this;
      try {
        await that.waitPropertyByInterval(
          $el,
          function (targetElement) {
            if (targetElement == null) return false;
            if (!(vueName in targetElement)) return false;
            if (propertyName == null) return true;
            const $vueEl = targetElement[vueName];
            if (typeof propertyName === "string") {
              if (propertyName in $vueEl) {
                flag = true;
                return true;
              }
            } else if (propertyName($vueEl)) {
              flag = true;
              return true;
            }
            return false;
          },
          timer,
          maxTime
        );
      } catch {
        return flag;
      }
      return flag;
    }
    watchObject(target, propertyName, getCallBack, setCallBack) {
      if (typeof getCallBack !== "function" && typeof setCallBack !== "function") return;
      if (typeof getCallBack === "function")
        Object.defineProperty(target, propertyName, {
          get() {
            if (typeof getCallBack === "function") return getCallBack(target[propertyName]);
            else return target[propertyName];
          },
        });
      else if (typeof setCallBack === "function")
        Object.defineProperty(target, propertyName, {
          set(value) {
            if (typeof setCallBack === "function") setCallBack(value);
          },
        });
      else
        Object.defineProperty(target, propertyName, {
          get() {
            if (typeof getCallBack === "function") return getCallBack(target[propertyName]);
            else return target[propertyName];
          },
          set(value) {
            if (typeof setCallBack === "function") setCallBack(value);
          },
        });
    }
    queryProperty(target, handler) {
      if (target == null) return;
      const handleResult = handler(target);
      if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) return handleResult.data;
      return this.queryProperty(handleResult.data, handler);
    }
    async asyncQueryProperty(target, handler) {
      if (target == null) return;
      const handleResult = await handler(target);
      if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) return handleResult.data;
      return await this.asyncQueryProperty(handleResult.data, handler);
    }
    createUtils(option) {
      return new Utils(option);
    }
    toFormData(data, isEncode = false, valueAutoParseToStr = false) {
      const formData = new FormData();
      Object.keys(data).forEach((key) => {
        let value = data[key];
        if (valueAutoParseToStr) value = JSON.stringify(value);
        if (typeof value === "number") value = value.toString();
        if (isEncode && typeof value === "string") value = encodeURIComponent(value);
        if (value instanceof File) formData.append(key, value, value.name);
        else formData.append(key, value);
      });
      return formData;
    }
    toUrl(text) {
      if (typeof text !== "string") throw new TypeError("toUrl: text must be string");
      text = text.trim();
      if (text === "") throw new TypeError("toUrl: text must not be empty");
      if (text.startsWith("//")) text = this.windowApi.globalThis.location.protocol + text;
      else if (text.startsWith("/")) text = this.windowApi.globalThis.location.origin + text;
      return new URL(text);
    }
    coverObjectFunctionThis = commonUtil.coverObjectFunctionThis.bind(commonUtil);
    generateUUID = GenerateUUID;
    Vue = Vue;
    ModuleRaid = ModuleRaid;
    workerSetTimeout(callback, timeout = 0) {
      try {
        return setTimeout$1(callback, timeout);
      } catch {
        return this.windowApi.setTimeout(callback, timeout);
      }
    }
    workerClearTimeout(timeId) {
      try {
        if (timeId != null) clearTimeout$1(timeId);
      } catch {
        this.windowApi.clearTimeout(timeId);
      }
    }
    workerSetInterval(callback, timeout = 0) {
      try {
        return setInterval$1(callback, timeout);
      } catch {
        return this.windowApi.setInterval(callback, timeout);
      }
    }
    workerClearInterval(timeId) {
      try {
        if (timeId != null) clearInterval$1(timeId);
      } catch {
        this.windowApi.clearInterval(timeId);
      }
    }
    createFunction(...args) {
      let isAsync = args[args.length - 1];
      if (typeof isAsync === "boolean") args.splice(args.length - 1, 1);
      else isAsync = false;
      if (isAsync) {
        const AsyncFunctionConstructor = Object.getPrototypeOf(async function () {}).constructor;
        return new AsyncFunctionConstructor(...args);
      } else {
        const FunctionConstructor = Object.getPrototypeOf(function () {}).constructor;
        return new FunctionConstructor(...args);
      }
    }
    hasWorkerCSP(timeout = 1500) {
      return new Promise((resolve) => {
        let flag = true;
        let timeId = void 0;
        let worker = void 0;
        let workerBlobUrl = void 0;
        const workerJs = `
(() => {
    this.addEventListener(
    "message",
    function () {
        this.postMessage({
          success: true,
        });
    },
    {
        capture: true,
    }
    );
})();`;
        const finishCallBack = () => {
          clearTimeout(timeId);
          if (worker != null) worker.terminate();
          if (typeof workerBlobUrl === "string") {
            globalThis.URL.revokeObjectURL(workerBlobUrl);
            workerBlobUrl = void 0;
          }
          resolve(flag);
        };
        try {
          const workerScript = new Blob([workerJs], { type: "application/javascript" });
          workerBlobUrl = globalThis.URL.createObjectURL(workerScript);
          if (globalThis.trustedTypes && typeof globalThis.trustedTypes.createPolicy === "function")
            workerBlobUrl = globalThis.trustedTypes
              .createPolicy("workerPolicy", { createScriptURL: (url) => url })
              .createScriptURL(workerBlobUrl);
          worker = new Worker(workerBlobUrl);
          worker.onmessage = (data) => {
            if (data.data.success) {
              flag = false;
              finishCallBack();
            }
          };
          timeId = setTimeout(() => {
            finishCallBack();
          }, timeout);
          worker.postMessage("test");
        } catch {
          flag = true;
          finishCallBack();
        } finally {
          if (typeof workerBlobUrl === "string") {
            globalThis.URL.revokeObjectURL(workerBlobUrl);
            workerBlobUrl = void 0;
          }
        }
      });
    }
    calcPositionDistance(...args) {
      let position = {
        x: 0,
        y: 0,
      };
      let otherPosition = {
        x: 0,
        y: 0,
      };
      if (typeof args[0] === "object" && args[0] != null && typeof args[1] === "object" && args[1] != null) {
        position = args[0];
        otherPosition = args[1];
      } else if (args.length === 4) {
        position = {
          x: args[0],
          y: args[1],
        };
        otherPosition = {
          x: args[2],
          y: args[3],
        };
      } else throw new Error("Invalid arguments");
      if (typeof position.x === "string") position.x = Number(position.x);
      if (isNaN(position.x)) throw new Error(`Invalid x: ${position.x}`);
      if (typeof position.y === "string") position.y = Number(position.y);
      if (isNaN(position.y)) throw new Error(`Invalid y: ${position.y}`);
      if (typeof otherPosition.x === "string") otherPosition.x = Number(otherPosition.x);
      if (isNaN(otherPosition.x)) throw new Error(`Invalid x: ${otherPosition.x}`);
      if (typeof otherPosition.y === "string") otherPosition.y = Number(otherPosition.y);
      if (isNaN(otherPosition.y)) throw new Error(`Invalid y: ${otherPosition.y}`);
      return Math.sqrt(Math.pow(otherPosition.x - position.x, 2) + Math.pow(otherPosition.y - position.y, 2));
    }
  })();
  var PanelSettingConfig = {
    qmsg_config_position: {
      key: "qmsg-config-position",
      defaultValue: "bottom",
    },
    qmsg_config_maxnums: {
      key: "qmsg-config-maxnums",
      defaultValue: 3,
    },
    qmsg_config_showreverse: {
      key: "qmsg-config-showreverse",
      defaultValue: false,
    },
    httpx_cookie_manager_enable: {
      key: "httpx-use-cookie-enable",
      defaultValue: false,
    },
    httpx_cookie_manager_use_document_cookie: {
      key: "httpx-use-document-cookie",
      defaultValue: false,
    },
  };
  var CommonUtil = {
    waitRemove(...args) {
      args.forEach((selector) => {
        if (typeof selector !== "string") return;
        domUtils$2.waitNodeList(selector).then((nodeList) => {
          nodeList.forEach(($el) => $el.remove());
        });
      });
    },
    createBlockCSSNode(...args) {
      let selectorList = [];
      if (args.length === 0) return;
      if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") return;
      args.forEach((selector) => {
        if (Array.isArray(selector)) selectorList = selectorList.concat(selector);
        else selectorList.push(selector);
      });
      return domUtils$2.createElement("style", {
        type: "text/css",
        innerHTML: `${selectorList.join(",\n")}{display: none !important;}`,
      });
    },
    addBlockCSS(...args) {
      let selectorList = [];
      if (args.length === 0) return;
      if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") return;
      args.forEach((selector) => {
        if (Array.isArray(selector)) selectorList = selectorList.concat(selector);
        else selectorList.push(selector);
      });
      selectorList = selectorList.map((it) => it.trim()).filter((it) => it !== "");
      if (selectorList.length) return addStyle(`${selectorList.join(",\n")}{display: none !important;}`);
    },
    setGMResourceCSS(resourceMapData) {
      const cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : null;
      if (typeof cssText === "string" && cssText) return addStyle(cssText);
      else return CommonUtil.loadStyleLink(resourceMapData.url);
    },
    async loadStyleLink(url) {
      let $link = document.createElement("link");
      $link.rel = "stylesheet";
      $link.type = "text/css";
      $link.href = url;
      return new Promise((resolve) => {
        domUtils$2.onReady(() => {
          document.head.appendChild($link);
          resolve($link);
        });
      });
    },
    async loadScript(url) {
      let $script = document.createElement("script");
      $script.src = url;
      return new Promise((resolve) => {
        $script.onload = () => {
          resolve(null);
        };
        (document.head || document.documentElement).appendChild($script);
      });
    },
    fixUrl(url) {
      url = url.trim();
      if (url.startsWith("data:")) return url;
      if (url.match(/^http(s|):\/\//i)) return url;
      else if (url.startsWith("//")) {
        if (url.startsWith("///")) {
        } else url = window.location.protocol + url;
        return url;
      } else {
        if (!url.startsWith("/")) url += "/";
        url = window.location.origin + url;
        return url;
      }
    },
    fixHttps(url) {
      if (url.startsWith("https://")) return url;
      if (!url.startsWith("http://")) return url;
      try {
        let urlInstance = new URL(url);
        urlInstance.protocol = "https:";
        return urlInstance.toString();
      } catch {
        return url;
      }
    },
    lockScroll(...args) {
      let $hidden = document.createElement("style");
      $hidden.innerHTML = `
			.pops-overflow-hidden-important {
				overflow: hidden !important;
			}
		`;
      let $elList = [document.documentElement, document.body].concat(...(args || []));
      $elList.forEach(($el) => {
        $el.classList.add("pops-overflow-hidden-important");
      });
      (document.head || document.documentElement).appendChild($hidden);
      return {
        recovery() {
          $elList.forEach(($el) => {
            $el.classList.remove("pops-overflow-hidden-important");
          });
          $hidden.remove();
        },
      };
    },
    async getClipboardText() {
      function readClipboardText(resolve) {
        navigator.clipboard
          .readText()
          .then((clipboardText) => {
            resolve(clipboardText);
          })
          .catch((error) => {
            log.error("读取剪贴板内容失败👉", error);
            resolve("");
          });
      }
      function requestPermissionsWithClipboard(resolve) {
        navigator.permissions
          .query({ name: "clipboard-read" })
          .then(() => {
            readClipboardText(resolve);
          })
          .catch((error) => {
            log.error("申请剪贴板权限失败,尝试直接读取👉", error.message ?? error.name ?? error.stack);
            readClipboardText(resolve);
          });
      }
      function checkClipboardApi() {
        if (typeof navigator?.clipboard?.readText !== "function") return false;
        if (typeof navigator?.permissions?.query !== "function") return false;
        return true;
      }
      return new Promise((resolve) => {
        if (!checkClipboardApi()) {
          resolve("");
          return;
        }
        if (document.hasFocus()) requestPermissionsWithClipboard(resolve);
        else
          window.addEventListener(
            "focus",
            () => {
              requestPermissionsWithClipboard(resolve);
            },
            { once: true }
          );
      });
    },
    escapeHtml(unsafe) {
      return unsafe
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;")
        .replace(/©/g, "&copy;")
        .replace(/®/g, "&reg;")
        .replace(/™/g, "&trade;")
        .replace(/→/g, "&rarr;")
        .replace(/←/g, "&larr;")
        .replace(/↑/g, "&uarr;")
        .replace(/↓/g, "&darr;")
        .replace(/—/g, "&mdash;")
        .replace(/–/g, "&ndash;")
        .replace(/…/g, "&hellip;")
        .replace(/ /g, "&nbsp;")
        .replace(/\r\n/g, "<br>")
        .replace(/\r/g, "<br>")
        .replace(/\n/g, "<br>")
        .replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
    },
    interval(fn, intervalTime, timeout = 5e3) {
      let timeId;
      let maxTimeout = timeout - intervalTime;
      let intervalTimeCount = intervalTime;
      let loop = async (isTimeout) => {
        const result = await fn(isTimeout);
        if ((typeof result === "boolean" && result) || isTimeout) {
          utils.workerClearTimeout(timeId);
          return;
        }
        intervalTimeCount += intervalTime;
        if (intervalTimeCount > maxTimeout) {
          loop(true);
          return;
        }
        timeId = utils.workerSetTimeout(() => {
          loop(false);
        }, intervalTime);
      };
      loop(false);
    },
    findParentNode($el, selector, parentSelector) {
      if (parentSelector) {
        let $parent = domUtils$2.closest($el, parentSelector);
        if ($parent) return $parent.querySelector(selector);
      } else {
        if (domUtils$2.matches($el, selector)) return $el;
        return domUtils$2.closest($el, selector);
      }
    },
    toStr(data, space = 2) {
      const undefinedReplacedStr = `__undefined__placeholder__replaced__str__` + performance.now();
      return JSON.stringify(
        data,
        (key, value) => {
          return value === void 0 ? undefinedReplacedStr : value;
        },
        space
      ).replace(new RegExp(`"${undefinedReplacedStr}"`, "g"), "undefined");
    },
    isVerticalScreen() {
      return !globalThis.screen.orientation.type.includes("landscape");
    },
    isMobileDevice(size = 768) {
      if (this.isVerticalScreen()) return globalThis.innerWidth < size;
      else return globalThis.innerHeight < size;
    },
    isTopWindow() {
      const win = typeof _unsafeWindow === "object" && _unsafeWindow != null ? _unsafeWindow : window;
      return win.top === win.self;
    },
    formatVideoDuration(duration) {
      if (typeof duration !== "number") duration = parseInt(duration);
      if (isNaN(duration)) return duration.toString();
      const zeroPadding = function (num) {
        if (num < 10) return `0${num}`;
        else return num;
      };
      if (duration < 60) return `0:${zeroPadding(duration)}`;
      else if (duration >= 60 && duration < 3600) return `${Math.floor(duration / 60)}:${zeroPadding(duration % 60)}`;
      else {
        const hours = Math.floor(duration / 3600);
        const minutes = Math.floor(duration / 60) % 60;
        const seconds = duration % 60;
        return `${hours}:${zeroPadding(minutes)}:${zeroPadding(seconds)}`;
      }
    },
    formatTimeStamp(time, endTime) {
      if (typeof time === "number") {
        if (time < 0xe8d4a51000) {
          const padZeroLength = String(Date.now()).length - String(time).length;
          time = time * Math.pow(10, padZeroLength);
        }
      }
      let result = time;
      let oldTime = new Date(typeof time === "string" ? time.replace(/-/g, "/") : time);
      let timeDifference = new Date(endTime ?? Date.now()).getTime() - oldTime.getTime();
      let days = Math.floor(timeDifference / (24 * 3600 * 1e3));
      if (days > 0)
        if (days > 7) result = utils.formatTime(oldTime.getTime());
        else result = days + "天前";
      else {
        let leave1 = timeDifference % (24 * 3600 * 1e3);
        let hours = Math.floor(leave1 / (3600 * 1e3));
        if (hours > 0) result = hours + "小时前";
        else {
          let leave2 = leave1 % (3600 * 1e3);
          let minutes = Math.floor(leave2 / (60 * 1e3));
          if (minutes > 0) result = minutes + "分钟前";
          else {
            let leave3 = leave2 % (60 * 1e3);
            result = Math.round(leave3 / 1e3) + "秒前";
          }
        }
      }
      return result;
    },
  };
  var utils = utils$1.noConflict();
  var domUtils = domUtils$2.noConflict();
  var __pops__ = pops;
  var log = new utils.Log(_GM_info, _unsafeWindow.console || _monkeyWindow.console);
  var SCRIPT_NAME = _GM_info?.script?.name || void 0;
  var AnyTouch = pops.fn.Utils.AnyTouch();
  log.config({
    debug: false,
    logMaxCount: 250,
    autoClearConsole: true,
    tag: true,
  });
  var getPageMaxZIndex = () => {
    const deviation = 100;
    const popsZIndex = pops.fn.InstanceUtils.getPopsMaxZIndex()?.zIndex ?? 0;
    const pointZIndex = utils.getMaxZIndexNodeInfoFromPoint()[0]?.zIndex ?? 0;
    return Math.max(deviation, popsZIndex, pointZIndex);
  };
  qmsg.config({
    isHTML: true,
    autoClose: true,
    showClose: false,
    consoleLogContent(qmsgInst) {
      const qmsgType = qmsgInst.setting.type;
      if (qmsgType === "loading") return false;
      const content = qmsgInst.setting.content;
      if (qmsgType === "warning") log.warn(content);
      else if (qmsgType === "error") log.error(content);
      else log.info(content);
      return false;
    },
    get position() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_position.key,
        PanelSettingConfig.qmsg_config_position.defaultValue
      );
    },
    get maxNums() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_maxnums.key,
        PanelSettingConfig.qmsg_config_maxnums.defaultValue
      );
    },
    get showReverse() {
      return Panel.getValue(
        PanelSettingConfig.qmsg_config_showreverse.key,
        PanelSettingConfig.qmsg_config_showreverse.defaultValue
      );
    },
    get zIndex() {
      return getPageMaxZIndex();
    },
  });
  __pops__.GlobalConfig.setGlobalConfig({
    zIndex: () => {
      return getPageMaxZIndex();
    },
    mask: {
      enable: true,
      clickEvent: {
        toClose: false,
        toHide: false,
      },
    },
    drag: true,
  });
  var MenuRegister = new utils.GM_Menu({
    GM_getValue: _GM_getValue,
    GM_setValue: _GM_setValue,
    GM_registerMenuCommand: _GM_registerMenuCommand,
    GM_unregisterMenuCommand: _GM_unregisterMenuCommand,
  });
  var httpx = new utils.Httpx({
    xmlHttpRequest: _GM_xmlhttpRequest,
    logDetails: false,
  });
  httpx.interceptors.request.use((data) => {
    return data;
  });
  httpx.interceptors.response.use(
    (response) => {
      return response;
    },
    (data) => {
      log.error("[Httpx-HttpxRequest.response] 响应错误", { data });
      if (data.type === "onabort") qmsg.warning("请求取消", { consoleLogContent: true });
      else if (data.type === "onerror") qmsg.error("请求异常", { consoleLogContent: true });
      else if (data.type === "ontimeout") qmsg.error("请求超时", { consoleLogContent: true });
      else qmsg.error("其它错误", { consoleLogContent: true });
      return data;
    }
  );
  (_unsafeWindow.Object.defineProperty,
    _unsafeWindow.Object.keys,
    _unsafeWindow.Object.values,
    _unsafeWindow.Function.prototype.apply,
    _unsafeWindow.Function.prototype.call,
    _unsafeWindow.Element.prototype.appendChild,
    _unsafeWindow.setTimeout.bind(_unsafeWindow),
    _unsafeWindow.clearTimeout.bind(_unsafeWindow),
    _unsafeWindow.setInterval.bind(_unsafeWindow),
    _unsafeWindow.clearInterval.bind(_unsafeWindow));
  var addStyle = domUtils.addStyle.bind(domUtils);
  CommonUtil.addBlockCSS.bind(CommonUtil);
  domUtils$2.selector.bind(domUtils$2);
  domUtils$2.selectorAll.bind(domUtils$2);
  var cookieManager = new utils.CookieManagerService({ baseCookieHandler: "GM_cookie" });
  if (!cookieManager.isSupportGM_cookie)
    if (cookieManager.isSupportCookieStore) cookieManager.setOptions({ baseCookieHandler: "cookieStore" });
    else cookieManager.setOptions({ baseCookieHandler: "document.cookie" });
  new utils.DocumentCookieHandler();
  var KEY = "GM_Panel";
  var ATTRIBUTE_INIT = "data-init";
  var ATTRIBUTE_KEY = "data-key";
  var ATTRIBUTE_DEFAULT_VALUE = "data-default-value";
  var ATTRIBUTE_INIT_MORE_VALUE = "data-init-more-value";
  var ATTRIBUTE_PLUGIN_SEARCH_CONFIG = "data-plugin-search-config";
  var PanelSizeUtil = {
    followBrowserSize: false,
    get width() {
      return PanelSizeUtil.followBrowserSize ? globalThis.outerWidth : globalThis.innerWidth;
    },
    get height() {
      return PanelSizeUtil.followBrowserSize ? globalThis.outerHeight : globalThis.innerHeight;
    },
  };
  var PanelUISize = {
    setting: {
      get width() {
        if (PanelSizeUtil.width < 550) return "88vw";
        else if (PanelSizeUtil.width < 700) return "550px";
        else return "700px";
      },
      get height() {
        if (PanelSizeUtil.height < 450) return "70vh";
        else if (PanelSizeUtil.height < 550) return "450px";
        else return "550px";
      },
    },
    settingMiddle: {
      get width() {
        return PanelSizeUtil.width < 350 ? "88vw" : "350px";
      },
      get height() {
        return PanelSizeUtil.height < 450 ? "88vh" : "450px";
      },
    },
    settingBig: {
      get width() {
        return PanelSizeUtil.width < 800 ? "92vw" : "800px";
      },
      get height() {
        return PanelSizeUtil.height < 600 ? "80vh" : "600px";
      },
    },
    info: {
      get width() {
        return PanelSizeUtil.width < 350 ? "88vw" : "350px";
      },
      get height() {
        return PanelSizeUtil.height < 250 ? "88vh" : "250px";
      },
    },
  };
  var PanelContent = {
    $data: {
      __contentConfig: null,
      get contentConfig() {
        if (this.__contentConfig == null) this.__contentConfig = new utils.Dictionary();
        return this.__contentConfig;
      },
      __defaultBottomContentConfig: [],
    },
    addContentConfig(configList) {
      if (!Array.isArray(configList)) configList = [configList];
      let index = this.$data.contentConfig.keys().length;
      this.$data.contentConfig.set(index, configList);
    },
    getAllContentConfig() {
      return this.$data.contentConfig.values().flat();
    },
    getConfig(index = 0) {
      return this.$data.contentConfig.get(index) ?? [];
    },
    getDefaultBottomContentConfig(config) {
      if (this.$data.__defaultBottomContentConfig.length) return this.$data.__defaultBottomContentConfig;
      let isDoubleClick = false;
      let timer = void 0;
      const translateCallback = (text, translateMap) => {
        if (config && typeof config.translateCallback === "function")
          return config.translateCallback(text, translateMap);
        else {
          if (typeof translateMap === "object" && translateMap)
            for (const key in translateMap) text = text.replaceAll(`{{${key}}}`, translateMap[key]);
          return text;
        }
      };
      const exportToFile = (fileName, fileData) => {
        if (typeof fileData !== "string") fileData = CommonUtil.toStr(fileData);
        const blob = new Blob([fileData]);
        const blobUrl = globalThis.URL.createObjectURL(blob);
        domUtils
          .createElement("a", {
            href: blobUrl,
            download: fileName,
          })
          .click();
        utils.workerSetTimeout(() => {
          globalThis.URL.revokeObjectURL(blobUrl);
        }, 500);
      };
      const dbclick_callback = () => {
        const importConfig = (importEndCallBack) => {
          const $alert = __pops__.alert({
            title: {
              text: translateCallback("请选择导入方式"),
              position: "center",
            },
            content: {
              text: `
            <div class="btn-control" data-mode="local">${translateCallback("本地导入")}</div>
            <div class="btn-control" data-mode="network">${translateCallback("网络导入")}</div>
            <div class="btn-control" data-mode="clipboard">${translateCallback("剪贴板导入")}</div>`,
              html: true,
            },
            btn: {
              ok: { enable: false },
              close: {
                enable: true,
                callback(details) {
                  details.close();
                },
              },
            },
            drag: true,
            mask: { enable: true },
            width: PanelUISize.info.width,
            height: PanelUISize.info.height,
            style: `
          .btn-control{
            display: inline-block;
            margin: 10px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            cursor: pointer;
          }
          .btn-control:hover{
            color: #409eff;
            border-color: #c6e2ff;
            background-color: #ecf5ff;
          }`,
          });
          const $local = $alert.$shadowRoot.querySelector(".btn-control[data-mode='local']");
          const $network = $alert.$shadowRoot.querySelector(".btn-control[data-mode='network']");
          const $clipboard = $alert.$shadowRoot.querySelector(".btn-control[data-mode='clipboard']");
          const updateConfigToStorage = async (data) => {
            if (confirm(translateCallback("是否清空脚本存储的配置?(如果点击取消按钮,则仅做配置覆盖处理)")))
              if (typeof _GM_listValues === "function")
                if (typeof _GM_deleteValue === "function") {
                  _GM_listValues().forEach((key) => {
                    _GM_deleteValue(key);
                  });
                  qmsg.success(translateCallback("已清空脚本存储的配置"));
                } else qmsg.error(translateCallback("不支持GM_deleteValue函数,无法执行删除脚本配置"));
              else qmsg.error(translateCallback("不支持GM_listValues函数,无法清空脚本存储的配置"));
            if (typeof _GM_setValues === "function") _GM_setValues(data);
            else
              Object.keys(data).forEach((key) => {
                const value = data[key];
                _GM_setValue(key, value);
              });
            qmsg.success(translateCallback("配置导入完毕"));
            importEndCallBack?.();
          };
          const importFile = (configText) => {
            return new Promise(async (resolve) => {
              const data = utils.toJSON(configText);
              if (Object.keys(data).length === 0) qmsg.warning(translateCallback("解析为空配置,不导入"));
              else await updateConfigToStorage(data);
              resolve(true);
            });
          };
          domUtils.on($local, "click", (event) => {
            domUtils.preventEvent(event);
            $alert.close();
            const $input = domUtils.createElement("input", {
              type: "file",
              accept: ".json",
            });
            domUtils.on($input, ["propertychange", "input"], () => {
              if (!$input.files?.length) return;
              const uploadFile = $input.files[0];
              const fileReader = new FileReader();
              fileReader.onload = () => {
                importFile(fileReader.result);
              };
              fileReader.readAsText(uploadFile, "UTF-8");
            });
            $input.click();
          });
          domUtils.on($network, "click", (event) => {
            domUtils.preventEvent(event);
            $alert.close();
            const $prompt = __pops__.prompt({
              title: {
                text: translateCallback("网络导入"),
                position: "center",
              },
              content: {
                text: "",
                placeholder: translateCallback("请填写URL"),
                focus: true,
              },
              btn: {
                close: {
                  enable: true,
                  callback(details) {
                    details.close();
                  },
                },
                ok: {
                  text: translateCallback("导入"),
                  callback: async (details) => {
                    const url = details.text;
                    if (utils.isNull(url)) {
                      qmsg.error(translateCallback("请填入完整的url"));
                      return;
                    }
                    const $loading = qmsg.loading(translateCallback("正在获取配置..."));
                    const response = await httpx.get(url, { allowInterceptConfig: false });
                    $loading.close();
                    if (!response.status) {
                      log.error(response);
                      qmsg.error(translateCallback("获取配置失败"), { consoleLogContent: true });
                      return;
                    }
                    if (!(await importFile(response.data.responseText))) return;
                    details.close();
                  },
                },
                cancel: { enable: false },
              },
              drag: true,
              mask: { enable: true },
              width: PanelUISize.info.width,
              height: "auto",
            });
            const $promptInput = $prompt.$shadowRoot.querySelector("input");
            const $promptOk = $prompt.$shadowRoot.querySelector(".pops-prompt-btn-ok");
            domUtils.on($promptInput, ["input", "propertychange"], () => {
              if (domUtils.val($promptInput) === "") domUtils.attr($promptOk, "disabled", "true");
              else domUtils.removeAttr($promptOk, "disabled");
            });
            domUtils.onKeyboard($promptInput, "keydown", (keyName, keyValue, otherCodeList) => {
              if (keyName === "Enter" && otherCodeList.length === 0) {
                if (domUtils.val($promptInput) !== "") domUtils.emit($promptOk, "click");
              }
            });
            domUtils.emit($promptInput, "input");
          });
          domUtils.on($clipboard, "click", async (event) => {
            domUtils.preventEvent(event);
            $alert.close();
            let clipboardText = await CommonUtil.getClipboardText();
            if (clipboardText.trim() === "") {
              qmsg.warning(translateCallback("获取到的剪贴板内容为空"));
              return;
            }
            if (!(await importFile(clipboardText))) return;
          });
        };
        const exportConfig = (
          fileName = `${SCRIPT_NAME}_panel-setting-${utils.formatTime(Date.now(), "yyyy_MM_dd_HH_mm_ss")}.json`,
          fileData
        ) => {
          const $alert = __pops__.alert({
            title: {
              text: translateCallback("请选择导出方式"),
              position: "center",
            },
            content: {
              text: `
            <div class="btn-control" data-mode="export-to-file">${translateCallback("导出至文件")}</div>
            <div class="btn-control" data-mode="export-to-clipboard">${translateCallback("导出至剪贴板")}</div>
            `,
              html: true,
            },
            btn: {
              ok: { enable: false },
              close: {
                enable: true,
                callback(details) {
                  details.close();
                },
              },
            },
            drag: true,
            mask: { enable: true },
            width: PanelUISize.info.width,
            height: PanelUISize.info.height,
            style: `
          .btn-control{
            display: inline-block;
            margin: 10px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            cursor: pointer;
          }
          .btn-control:hover{
            color: #409eff;
            border-color: #c6e2ff;
            background-color: #ecf5ff;
          }`,
          });
          const $exportToFile = $alert.$shadowRoot.querySelector(".btn-control[data-mode='export-to-file']");
          const $exportToClipboard = $alert.$shadowRoot.querySelector(".btn-control[data-mode='export-to-clipboard']");
          domUtils.on($exportToFile, "click", (event) => {
            domUtils.preventEvent(event);
            try {
              exportToFile(fileName, fileData);
              $alert.close();
            } catch (error) {
              qmsg.error(error.toString(), { consoleLogContent: true });
            }
          });
          domUtils.on($exportToClipboard, "click", async () => {
            if (await utils.copy(fileData)) {
              qmsg.success(translateCallback("复制成功"));
              $alert.close();
            } else qmsg.error(translateCallback("复制失败"));
          });
        };
        const $textarea = __pops__
          .confirm({
            title: {
              text: translateCallback("配置"),
              position: "center",
            },
            content: {
              text: `<textarea name="config-value" id="config" readonly></textarea>`,
              html: true,
            },
            btn: {
              ok: {
                enable: true,
                type: "primary",
                text: translateCallback("导入"),
                callback() {
                  importConfig();
                },
              },
              cancel: {
                enable: true,
                text: translateCallback("导出"),
                callback() {
                  exportConfig(void 0, configDataStr);
                },
              },
            },
            width: PanelSizeUtil.width < 450 ? "90vw" : "450px",
            height: "auto",
            style: `
          .pops-content textarea {
            --textarea-bd-color: #dcdfe6;
            display: inline-block;
            resize: vertical;
            padding: 5px 15px;
            margin: 0;
            line-height: normal;
            box-sizing: border-box;
            color: #606266;
            border: 0;
            border-radius: 0;
            outline: none;
            -webkit-appearance: none;
            -moz-appearance: none;
            appearance: none;
            background: none;
            width: 100%;
            height: 100%;
            appearance: none;
            resize: none;
          }
          .pops-content textarea{
            height: 500px;
          }
          .pops-content textarea:focus {
            --textarea-bd-color: #3677f0;
          }
          .pops-content textarea:hover {
            --textarea-bd-color: #c0c4cc;
          }
        `,
          })
          .$shadowRoot.querySelector("textarea");
        const configData = {};
        if (typeof _GM_listValues === "function")
          _GM_listValues().forEach((key) => {
            const value = _GM_getValue(key);
            Reflect.set(configData, key, value);
          });
        else {
          qmsg.warning(translateCallback("不支持函数GM_listValues,仅导出菜单配置"));
          const panelLocalValue = _GM_getValue(KEY);
          Reflect.set(configData, KEY, panelLocalValue);
        }
        const configDataStr = CommonUtil.toStr(configData);
        $textarea.value = configDataStr;
      };
      const click_callback = () => {
        let supportURL = _GM_info?.script?.supportURL || _GM_info?.script?.namespace;
        if (typeof supportURL === "string" && utils.isNotNull(supportURL)) window.open(supportURL, "_blank");
      };
      return [
        {
          id: "script-version",
          title: translateCallback(`版本:{{version}}`, {
            version: _GM_info?.script?.version || translateCallback("未知"),
          }),
          isBottom: true,
          views: [],
          clickFirstCallback() {
            return false;
          },
          afterRender(config) {
            new AnyTouch(config.$asideLiElement).on("tap", function () {
              clearTimeout(timer);
              timer = void 0;
              if (isDoubleClick) {
                isDoubleClick = false;
                dbclick_callback();
              } else {
                timer = setTimeout(() => {
                  isDoubleClick = false;
                  click_callback();
                }, 200);
                isDoubleClick = true;
              }
            });
          },
        },
      ];
    },
    setDefaultBottomContentConfig(config) {
      this.$data.__defaultBottomContentConfig = config;
    },
  };
  var PanelMenu = {
    $data: {
      __menuOption: [
        {
          key: "show_pops_panel_setting",
          text: "⚙ 设置",
          autoReload: false,
          isStoreValue: false,
          showText(text) {
            return text;
          },
          callback: () => {
            Panel.showPanel(PanelContent.getConfig(0));
          },
        },
      ],
      get menuOption() {
        return this.__menuOption;
      },
    },
    init() {
      this.initExtensionsMenu();
    },
    initExtensionsMenu() {
      if (!CommonUtil.isTopWindow()) return;
      MenuRegister.add(this.$data.menuOption);
    },
    addMenuOption(option) {
      if (!Array.isArray(option)) option = [option];
      this.$data.menuOption.push(...option);
    },
    updateMenuOption(option) {
      if (!Array.isArray(option)) option = [option];
      option.forEach((optionItem) => {
        let findIndex = this.$data.menuOption.findIndex((it) => {
          return it.key === optionItem.key;
        });
        if (findIndex !== -1) this.$data.menuOption[findIndex] = optionItem;
      });
    },
    getMenuOption(index = 0) {
      return this.$data.menuOption[index];
    },
    deleteMenuOption(index = 0) {
      this.$data.menuOption.splice(index, 1);
    },
  };
  var PanelMenuResultsHandler = class {
    data = {
      storeNodeList: [],
      destoryFnList: [],
    };
    option = {};
    constructor(option) {
      this.option = option;
    }
    handlerResult(enableValue, args) {
      const dynamicMenuStoreNodeList = [];
      const dynamicDestoryFnList = [];
      let resultValueList = [];
      if (Array.isArray(args)) resultValueList = resultValueList.concat(args);
      else {
        const handleArgs = (obj) => {
          if (typeof obj === "object" && obj != null)
            if (obj instanceof Element) resultValueList.push(obj);
            else if (Array.isArray(obj)) handleArgs(obj);
            else {
              const { $css, destory } = obj;
              if ($css != null) {
                if (Array.isArray($css)) resultValueList = resultValueList.concat($css);
                else if ($css instanceof Element) resultValueList.push($css);
              }
              if (typeof destory === "function") resultValueList.push(destory);
            }
          else resultValueList.push(obj);
        };
        handleArgs(args);
      }
      const handleResult = (it) => {
        if (it == null) return;
        if (it instanceof Element) {
          dynamicMenuStoreNodeList.push(it);
          return;
        }
        if (typeof it === "function") {
          dynamicDestoryFnList.push(it);
          return;
        }
      };
      for (const it of resultValueList) {
        const flag = handleResult(it);
        if (typeof flag === "boolean" && !flag) break;
        if (Array.isArray(it))
          for (const it2 of it) {
            const flag2 = handleResult(it2);
            if (typeof flag2 === "boolean" && !flag2) break;
          }
      }
      this.clearStoreNodeList();
      this.execDestoryFnAndClear();
      if (enableValue) {
        this.data.storeNodeList = this.data.storeNodeList.concat(dynamicMenuStoreNodeList);
        this.data.destoryFnList = this.data.destoryFnList.concat(dynamicDestoryFnList);
      }
    }
    getEnableStatus(key) {
      const value = this.option.getValue(key);
      return Boolean(value);
    }
    clearStoreNodeList = () => {
      for (let index = this.data.storeNodeList.length - 1; index >= 0; index--) {
        this.data.storeNodeList[index]?.remove();
        this.data.storeNodeList.splice(index, 1);
      }
    };
    execDestoryFnAndClear = () => {
      for (let index = this.data.destoryFnList.length - 1; index >= 0; index--) {
        const destoryFnItem = this.data.destoryFnList[index];
        destoryFnItem();
        this.data.destoryFnList.splice(index, 1);
      }
    };
    checkMenuExec() {
      let flag = false;
      if (typeof this.option.checkExec === "function") flag = this.option.checkExec(this.option.keyList);
      else flag = this.option.keyList.every((key) => this.getEnableStatus(key));
      return flag;
    }
  };
  var StorageUtils = class {
    storageKey;
    listenerData;
    cacheData;
    callbacks = [];
    constructor(key) {
      if (typeof key === "string") {
        const trimKey = key.trim();
        if (trimKey == "") throw new Error("key can not be empty string");
        this.storageKey = trimKey;
      } else throw new TypeError("key must be a string");
      this.listenerData = new utils$1.Dictionary();
      this.getLocalValue = this.getLocalValue.bind(this);
      this.setLocalValue = this.setLocalValue.bind(this);
      this.destory = this.destory.bind(this);
      this.set = this.set.bind(this);
      this.get = this.get.bind(this);
      this.getAll = this.getAll.bind(this);
      this.delete = this.delete.bind(this);
      this.has = this.has.bind(this);
      this.keys = this.keys.bind(this);
      this.values = this.values.bind(this);
      this.clear = this.clear.bind(this);
      this.addValueChangeListener = this.addValueChangeListener.bind(this);
      this.removeValueChangeListener = this.removeValueChangeListener.bind(this);
      this.emitValueChangeListener = this.emitValueChangeListener.bind(this);
    }
    [Symbol.dispose]() {
      this.destory();
    }
    async [Symbol.asyncDispose]() {
      this.destory();
    }
    destory() {
      this.cacheData = null;
      for (let index = this.callbacks.length - 1; index >= 0; index--) {
        const cb = this.callbacks[index];
        cb();
        this.callbacks.splice(index, 1);
      }
    }
    getLocalValue() {
      if (this.cacheData == null) {
        let localValue = _GM_getValue(this.storageKey);
        if (localValue == null) {
          localValue = {};
          this.setLocalValue(localValue);
        }
        this.destory();
        this.cacheData = localValue;
        const listenerId = _GM_addValueChangeListener(this.storageKey, (name, oldValue, newValue) => {
          this.cacheData = null;
          this.cacheData = newValue;
        });
        this.callbacks.push(() => {
          _GM_removeValueChangeListener(listenerId);
        });
        return localValue;
      } else return this.cacheData;
    }
    setLocalValue(value) {
      this.cacheData = null;
      this.cacheData = value;
      _GM_setValue(this.storageKey, value);
    }
    set(key, value) {
      const oldValue = this.get(key);
      const localValue = this.getLocalValue();
      Reflect.set(localValue, key, value);
      this.setLocalValue(localValue);
      this.emitValueChangeListener(key, value, oldValue);
    }
    get(key, defaultValue) {
      const localValue = this.getLocalValue();
      return Reflect.get(localValue, key) ?? defaultValue;
    }
    getAll() {
      return this.getLocalValue();
    }
    delete(key) {
      const oldValue = this.get(key);
      const localValue = this.getLocalValue();
      Reflect.deleteProperty(localValue, key);
      this.setLocalValue(localValue);
      this.emitValueChangeListener(key, void 0, oldValue);
    }
    has(key) {
      const localValue = this.getLocalValue();
      return Reflect.has(localValue, key);
    }
    keys() {
      const localValue = this.getLocalValue();
      return Reflect.ownKeys(localValue);
    }
    values() {
      const localValue = this.getLocalValue();
      return Reflect.ownKeys(localValue).map((key) => Reflect.get(localValue, key));
    }
    clear() {
      this.destory();
      _GM_deleteValue(this.storageKey);
    }
    addValueChangeListener(key, callback) {
      const listenerId = Math.random();
      const listenerData = this.listenerData.get(key) || [];
      listenerData.push({
        id: listenerId,
        key,
        callback,
      });
      this.listenerData.set(key, listenerData);
      return listenerId;
    }
    removeValueChangeListener(listenerId) {
      let flag = false;
      for (const [key, listenerData] of this.listenerData.entries()) {
        for (let index = 0; index < listenerData.length; index++) {
          const value = listenerData[index];
          if (
            (typeof listenerId === "string" && value.key === listenerId) ||
            (typeof listenerId === "number" && value.id === listenerId)
          ) {
            listenerData.splice(index, 1);
            index--;
            flag = true;
          }
        }
        this.listenerData.set(key, listenerData);
      }
      return flag;
    }
    async emitValueChangeListener(...args) {
      const [key, newValue, oldValue] = args;
      if (!this.listenerData.has(key)) return;
      const listenerData = this.listenerData.get(key);
      for (let index = 0; index < listenerData.length; index++) {
        const data = listenerData[index];
        if (typeof data.callback === "function") {
          let __newValue;
          let __oldValue;
          if (args.length === 1) {
          } else if (args.length === 2) __newValue = newValue;
          else if (args.length === 3) {
            __newValue = newValue;
            __oldValue = oldValue;
          }
          await data.callback(key, __newValue, __oldValue);
        }
      }
    }
  };
  var PopsPanelStorageApi = new StorageUtils(KEY);
  var Panel = {
    $data: {
      __contentConfigInitDefaultValue: null,
      __onceExecMenuData: null,
      __urlChangeReloadMenuExecOnce: null,
      __onceExecData: null,
      __panelConfig: {},
      $panel: null,
      panelContent: [],
      get contentConfigInitDefaultValue() {
        if (this.__contentConfigInitDefaultValue == null) this.__contentConfigInitDefaultValue = new utils.Dictionary();
        return this.__contentConfigInitDefaultValue;
      },
      contentConfigInitDisabledKeys: [],
      get onceExecMenuData() {
        if (this.__onceExecMenuData == null) this.__onceExecMenuData = new utils.Dictionary();
        return this.__onceExecMenuData;
      },
      get urlChangeReloadMenuExecOnce() {
        if (this.__urlChangeReloadMenuExecOnce == null) this.__urlChangeReloadMenuExecOnce = new utils.Dictionary();
        return this.__urlChangeReloadMenuExecOnce;
      },
      get onceExecData() {
        if (this.__onceExecData == null) this.__onceExecData = new utils.Dictionary();
        return this.__onceExecData;
      },
      get scriptName() {
        return SCRIPT_NAME;
      },
      get panelConfig() {
        return this.__panelConfig;
      },
      set panelConfig(value) {
        this.__panelConfig = value;
      },
      key: KEY,
      attributeKeyName: ATTRIBUTE_KEY,
      attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE,
    },
    init() {
      this.initContentDefaultValue();
      PanelMenu.init();
    },
    initContentDefaultValue() {
      const initDefaultValue = (config) => {
        if (!config.attributes) return;
        if (config.type === "button" || config.type === "container" || config.type === "deepMenu") return;
        const attributes = config.attributes;
        const __attr_init__ = attributes[ATTRIBUTE_INIT];
        if (typeof __attr_init__ === "function") {
          const __attr_result__ = __attr_init__();
          if (typeof __attr_result__ === "boolean" && !__attr_result__) return;
        }
        const menuDefaultConfig = new Map();
        const key = attributes[ATTRIBUTE_KEY];
        if (key != null) {
          const defaultValue = attributes[ATTRIBUTE_DEFAULT_VALUE];
          menuDefaultConfig.set(key, defaultValue);
        }
        const moreMenuDefaultConfig = attributes[ATTRIBUTE_INIT_MORE_VALUE];
        if (typeof moreMenuDefaultConfig === "object" && moreMenuDefaultConfig)
          Object.keys(moreMenuDefaultConfig).forEach((key) => {
            const defaultValue = moreMenuDefaultConfig[key];
            menuDefaultConfig.set(key, defaultValue);
          });
        if (!menuDefaultConfig.size) {
          log.warn("请先配置键", config);
          return;
        }
        if (config.type === "switch") {
          const disabled = typeof config.disabled === "function" ? config.disabled() : config.disabled;
          if (typeof disabled === "boolean" && disabled)
            this.$data.contentConfigInitDisabledKeys.push(...menuDefaultConfig.keys());
        }
        for (const [__key, __defaultValue] of menuDefaultConfig.entries()) this.setDefaultValue(__key, __defaultValue);
      };
      const loopInitDefaultValue = (configList) => {
        for (let index = 0; index < configList.length; index++) {
          const configItem = configList[index];
          initDefaultValue(configItem);
          const childViews = configItem.views;
          if (childViews && Array.isArray(childViews)) loopInitDefaultValue(childViews);
        }
      };
      const contentConfigList = [...PanelContent.getAllContentConfig()];
      for (let index = 0; index < contentConfigList.length; index++) {
        const leftContentConfigItem = contentConfigList[index];
        if (!leftContentConfigItem.views) continue;
        const rightContentConfigList = leftContentConfigItem.views;
        if (rightContentConfigList && Array.isArray(rightContentConfigList))
          loopInitDefaultValue(rightContentConfigList);
      }
      this.$data.contentConfigInitDisabledKeys = [...new Set(this.$data.contentConfigInitDisabledKeys)];
    },
    setDefaultValue(key, defaultValue) {
      if (this.$data.contentConfigInitDefaultValue.has(key))
        log.warn("该key已存在,初始化默认值失败: ", {
          key,
          initValue: this.$data.contentConfigInitDefaultValue.get(key),
        });
      this.$data.contentConfigInitDefaultValue.set(key, defaultValue);
    },
    getDefaultValue(key) {
      return this.$data.contentConfigInitDefaultValue.get(key);
    },
    setValue(key, value) {
      PopsPanelStorageApi.set(key, value);
    },
    getValue(key, defaultValue) {
      const localValue = PopsPanelStorageApi.get(key);
      if (localValue == null) {
        if (this.$data.contentConfigInitDefaultValue.has(key)) return this.$data.contentConfigInitDefaultValue.get(key);
        return defaultValue;
      }
      return localValue;
    },
    deleteValue(key) {
      PopsPanelStorageApi.delete(key);
    },
    hasKey(key) {
      return PopsPanelStorageApi.has(key);
    },
    addValueChangeListener(key, callback, option) {
      const listenerId = PopsPanelStorageApi.addValueChangeListener(key, callback);
      if (option?.immediate || option?.immediateAll) {
        const value = this.getValue(key);
        if (option?.immediate) callback(key, value, value);
        else if (option?.immediateAll) Panel.emitMenuValueChange(key, value, value);
      }
      return listenerId;
    },
    removeValueChangeListener(listenerId) {
      PopsPanelStorageApi.removeValueChangeListener(listenerId);
    },
    emitMenuValueChange(key, newValue, oldValue) {
      PopsPanelStorageApi.emitValueChangeListener(key, newValue, oldValue);
    },
    async exec(queryKey, callback, checkExec, once = true) {
      let queryKeyFn;
      if (typeof queryKey === "string" || Array.isArray(queryKey)) queryKeyFn = () => queryKey;
      else queryKeyFn = queryKey;
      let isArrayKey = false;
      const queryKeyResult = queryKeyFn();
      let keyList = [];
      if (Array.isArray(queryKeyResult)) {
        isArrayKey = true;
        keyList = queryKeyResult;
      } else keyList.push(queryKeyResult);
      const findNotInDataKey = keyList.find((it) => !this.$data.contentConfigInitDefaultValue.has(it));
      if (findNotInDataKey) {
        log.warn(`${findNotInDataKey} 键不存在`);
        return;
      }
      const storageKey = JSON.stringify(keyList);
      if (once) {
        if (this.$data.onceExecMenuData.has(storageKey)) return this.$data.onceExecMenuData.get(storageKey);
      }
      const listenerIdList = [];
      const panelMenuResultsHandler = new PanelMenuResultsHandler({
        keyList,
        getValue: (key) => {
          const value = this.getValue(key);
          return Boolean(value);
        },
        checkExec(keyList) {
          let flag = false;
          if (typeof checkExec === "function") flag = checkExec(keyList);
          else flag = keyList.every((key) => this.getValue(key));
          return flag;
        },
      });
      const valueChangeCallback = async (valueOption) => {
        const execFlag = panelMenuResultsHandler.checkMenuExec();
        let callbackResult = [];
        if (execFlag) {
          const valueList = keyList.map((key) => this.getValue(key));
          callbackResult = await callback({
            key: keyList,
            triggerKey: valueOption?.key,
            value: isArrayKey ? valueList : valueList[0],
            addStoreValue: (...args) => {
              return panelMenuResultsHandler.handlerResult(execFlag, args);
            },
          });
        }
        panelMenuResultsHandler.handlerResult(execFlag, callbackResult);
      };
      if (once)
        keyList.forEach((key) => {
          const listenerId = this.addValueChangeListener(key, (key, newValue, oldValue) => {
            return valueChangeCallback({
              key,
              newValue,
              oldValue,
            });
          });
          listenerIdList.push(listenerId);
        });
      await valueChangeCallback();
      const result = {
        checkMenuExec: panelMenuResultsHandler.checkMenuExec.bind(panelMenuResultsHandler),
        keyList,
        reload() {
          this.clearStoreNodeList();
          this.execDestoryFnAndClear();
          valueChangeCallback();
        },
        clear() {
          panelMenuResultsHandler.clearStoreNodeList();
          this.execDestoryFnAndClear();
          this.removeValueChangeListener();
          this.clearOnceExecMenuData();
        },
        clearStoreNodeList: panelMenuResultsHandler.clearStoreNodeList.bind(panelMenuResultsHandler),
        execDestoryFnAndClear: panelMenuResultsHandler.execDestoryFnAndClear.bind(panelMenuResultsHandler),
        removeValueChangeListener: () => {
          listenerIdList.forEach((listenerId) => {
            this.removeValueChangeListener(listenerId);
          });
        },
        clearOnceExecMenuData() {
          if (once) Panel.$data.onceExecMenuData.delete(storageKey);
        },
      };
      this.$data.onceExecMenuData.set(storageKey, result);
      return result;
    },
    async execMenu(key, callback, isReverse = false, once = false) {
      return await this.exec(
        key,
        async (...args) => {
          return await callback(...args);
        },
        (keyList) => {
          return keyList.every((__key__) => {
            let flag = !!this.getValue(__key__);
            if (Panel.$data.contentConfigInitDisabledKeys.includes(__key__)) {
              flag = false;
              log.warn(`.execMenu${once ? "Once" : ""} ${__key__} 被禁用`);
            }
            if (isReverse) flag = !flag;
            return flag;
          });
        },
        once
      );
    },
    async execMenuOnce(key, callback, isReverse = false, listenUrlChange = false) {
      const result = await this.execMenu(key, callback, isReverse, true);
      if (listenUrlChange) {
        if (result) {
          const urlChangeCallback = () => {
            result.reload();
          };
          this.removeUrlChangeWithExecMenuOnceListener(key);
          this.addUrlChangeWithExecMenuOnceListener(key, urlChangeCallback);
        }
      }
      return result;
    },
    async execMoreMenu(menus, allExecCallback, isReverse = false, once = false, listenUrlChange = false) {
      const results = await Promise.all(
        menus.map(async ([key, callback]) => {
          return await this.execMenu(
            key,
            (...args) => {
              return callback(...args);
            },
            isReverse,
            once
          );
        })
      );
      const panelMenuResultsHandler = new PanelMenuResultsHandler({
        keyList: menus.map(([key]) => key),
        getValue: (key) => {
          const value = this.getValue(key);
          return Boolean(value);
        },
      });
      const listenerIdList = [];
      const __destory__ = (removeListener = false) => {
        panelMenuResultsHandler.clearStoreNodeList();
        panelMenuResultsHandler.execDestoryFnAndClear();
        if (removeListener) {
          for (const listenerId of listenerIdList) this.removeValueChangeListener(listenerId);
          for (const result of results) if (result) this.removeUrlChangeWithExecMenuOnceListener(result.keyList);
        }
      };
      const __allExecCallback__ = () => {
        const allExecFlag = results.every((result) => {
          if (result) return result.checkMenuExec();
          else return true;
        });
        __destory__(false);
        if (allExecFlag) {
          const execResult = allExecCallback();
          panelMenuResultsHandler.handlerResult(allExecFlag, execResult);
        }
      };
      __allExecCallback__();
      for (const result of results)
        if (result) {
          const listenerId = this.addValueChangeListener(result.keyList[0], () => {
            __allExecCallback__();
          });
          listenerIdList.push(listenerId);
          if (listenUrlChange) {
            const urlChangeCallback = () => {
              result.reload();
            };
            this.removeUrlChangeWithExecMenuOnceListener(result.keyList);
            this.addUrlChangeWithExecMenuOnceListener(result.keyList, urlChangeCallback);
          }
        }
      return {
        clear() {
          for (const result of results) result?.clear();
          this.execDestoryFnAndClear();
          this.removeValueChangeListener();
        },
        execDestoryFnAndClear() {
          for (const result of results) result?.execDestoryFnAndClear();
          __destory__(false);
        },
        removeValueChangeListener() {
          for (const result of results) result?.removeValueChangeListener();
          __destory__(true);
        },
      };
    },
    async execMoreMenuOnce(menus, allExecCallback, isReverse = false, listenUrlChange = false) {
      return await this.execMoreMenu(menus, allExecCallback, isReverse, true, listenUrlChange);
    },
    deleteExecMenuOnce(key) {
      key = this.transformKey(key);
      this.$data.onceExecMenuData.delete(key);
      this.$data.urlChangeReloadMenuExecOnce.delete(key);
      return PopsPanelStorageApi.removeValueChangeListener(key);
    },
    onceExec(key, callback, runWithMenuEnable = false) {
      key = this.transformKey(key);
      if (typeof key !== "string") throw new TypeError("key 必须是字符串");
      if (this.$data.onceExecData.has(key)) return;
      if (runWithMenuEnable) {
        if (
          (Array.isArray(key) ? key : [key]).findIndex((it) => {
            if (!!!Panel.getValue(it)) return true;
          }) !== -1
        )
          return;
      }
      callback();
      this.$data.onceExecData.set(key, 1);
    },
    deleteOnceExec(key) {
      key = this.transformKey(key);
      this.$data.onceExecData.delete(key);
    },
    addUrlChangeWithExecMenuOnceListener(key, callback) {
      key = this.transformKey(key);
      this.$data.urlChangeReloadMenuExecOnce.set(key, callback);
      return {
        off: () => {
          return this.removeUrlChangeWithExecMenuOnceListener(key);
        },
      };
    },
    removeUrlChangeWithExecMenuOnceListener(key) {
      key = this.transformKey(key);
      this.$data.urlChangeReloadMenuExecOnce.delete(key);
    },
    hasUrlChangeWithExecMenuOnceListener(key) {
      key = this.transformKey(key);
      return this.$data.urlChangeReloadMenuExecOnce.has(key);
    },
    async emitUrlChangeWithExecMenuOnceEvent(config) {
      const values = this.$data.urlChangeReloadMenuExecOnce.values();
      for (const callback of values) await callback(config);
    },
    showPanel(
      content,
      title = `${SCRIPT_NAME}-设置`,
      preventDefaultContentConfig = false,
      preventRegisterSearchPlugin = false
    ) {
      this.$data.$panel = null;
      this.$data.panelContent = [];
      const checkHasBottomVersionContentConfig =
        content.findIndex((it) => {
          return (
            (typeof it.isBottom === "function" ? it.isBottom() : Boolean(it.isBottom)) && it.id === "script-version"
          );
        }) !== -1;
      if (!preventDefaultContentConfig && !checkHasBottomVersionContentConfig)
        content.push(...PanelContent.getDefaultBottomContentConfig());
      const $panel = __pops__.panel({
        title: {
          text: title,
          position: "center",
          html: false,
          style: "",
        },
        content,
        btn: {
          close: {
            enable: true,
            callback: (details) => {
              details.close();
              this.$data.$panel = null;
            },
          },
        },
        mask: {
          enable: true,
          clickEvent: {
            toClose: true,
            toHide: false,
          },
          clickCallBack: (originalRun) => {
            originalRun();
            this.$data.$panel = null;
          },
        },
        width: PanelUISize.setting.width,
        height: PanelUISize.setting.height,
        drag: true,
        only: true,
        style: `
      .pops-switch-shortcut-wrapper{
        margin-right: 5px;
        display: inline-flex;
      }
      .pops-switch-shortcut-wrapper:hover .pops-bottom-icon{
        cursor: pointer;
      }
      `,
        ...this.$data.panelConfig,
      });
      this.$data.$panel = $panel;
      this.$data.panelContent = content;
      if (!preventRegisterSearchPlugin)
        this.registerConfigSearch({
          $panel,
          content,
        });
      return {
        $panel,
        content,
      };
    },
    registerConfigSearch(config) {
      const { $panel, content } = config;
      const translateCallback = (text, translateMap) => {
        if (typeof config.translateCallback === "function") return config.translateCallback(text, translateMap);
        else {
          if (typeof translateMap === "object" && translateMap)
            for (const key in translateMap) text = text.replaceAll(`{{${key}}}`, translateMap[key]);
          return text;
        }
      };
      const asyncQueryProperty = async (target, handler) => {
        if (target == null) return;
        const handleResult = await handler(target);
        if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) return handleResult.data;
        return await asyncQueryProperty(handleResult.data, handler);
      };
      const scrollToElementAndListen = ($el, callback) => {
        const observer = new IntersectionObserver(
          (entries) => {
            entries.forEach((entry) => {
              if (entry.isIntersecting) {
                callback?.();
                observer.disconnect();
              }
            });
          },
          {
            root: null,
            threshold: 1,
          }
        );
        observer.observe($el);
        $el.scrollIntoView({
          behavior: "smooth",
          block: "center",
        });
      };
      const addFlashingClass = ($el) => {
        const flashingClassName = "pops-flashing";
        domUtils.onAnimationend($el, () => {
          $el.classList.remove(flashingClassName);
        });
        $el.classList.add(flashingClassName);
      };
      const dbclick_callback = (evt) => {
        if (evt.type === "dblclick" && isMobileTouch) return;
        domUtils.preventEvent(evt);
        const $alert = __pops__.alert({
          title: {
            text: translateCallback("搜索配置"),
            position: "center",
          },
          content: {
            text: `
						<div class="search-wrapper">
							<input class="search-config-text" name="search-config" type="text" placeholder="${translateCallback("请输入需要搜素的配置名称")}">
						</div>
						<div class="search-result-wrapper"></div>
					`,
            html: true,
          },
          btn: { ok: { enable: false } },
          mask: { clickEvent: { toClose: true } },
          width: PanelUISize.settingMiddle.width,
          height: "auto",
          drag: true,
          style: `
					${__pops__.config.cssText.panelCSS}

					.search-wrapper{
						border-bottom: 1px solid rgb(235, 238, 245, 1);
					}
					.pops-content:has(.search-result-wrapper:empty) .search-wrapper{
						border-bottom: 0;
					}
					.search-config-text{
						width: 100%;
						border: 0;
						height: 32px;
						padding: 0px 10px;
						outline: none;
					}
					.search-result-wrapper{
						max-height: 400px;
						overflow: auto;
					}
					.search-result-item{
						cursor: pointer;
						padding: 5px 10px;
						display: flex;
						flex-direction: column;
					}
					.search-result-item:hover{
						background-color: #D8F1FD;
					}
					.search-result-item-path{
						display: flex;
            align-items: center;
            flex-wrap: wrap;
					}
					.search-result-item-description{
						font-size: 0.8em;
						color: #6c6c6c;
					}
					${config.searchDialogStyle ?? ""}
				`,
        });
        const $searchInput = $alert.$shadowRoot.querySelector(".search-config-text");
        const $searchResultWrapper = $alert.$shadowRoot.querySelector(".search-result-wrapper");
        $searchInput.focus();
        const clearSearchResult = () => {
          domUtils.empty($searchResultWrapper);
        };
        const createSearchResultItem = (pathInfo) => {
          const searchPath = utils.queryProperty(pathInfo, (target) => {
            if (target?.next)
              return {
                isFind: false,
                data: target.next,
              };
            else
              return {
                isFind: true,
                data: target,
              };
          });
          const $item = domUtils.createElement("div", {
            className: "search-result-item",
            innerHTML: `
							<div class="search-result-item-path">${searchPath.matchedData?.path}</div>
							<div class="search-result-item-description">${searchPath.matchedData?.description ?? ""}</div>
						`,
          });
          const panelHandlerComponents = __pops__.fn.PanelHandlerComponents();
          domUtils.on($item, "click", () => {
            const $targetAsideItem = $panel.$shadowRoot.querySelectorAll(
              "aside.pops-panel-aside .pops-panel-aside-top-container li"
            )[pathInfo.index];
            if (!$targetAsideItem) {
              qmsg.error(translateCallback(`左侧项下标{{index}}不存在`, { index: pathInfo.index }));
              return;
            }
            $targetAsideItem.scrollIntoView({
              behavior: "smooth",
              block: "center",
            });
            $targetAsideItem.click();
            asyncQueryProperty(pathInfo.next, async (target) => {
              if (target?.next) {
                const $findDeepMenu = await domUtils.waitNode(() => {
                  return Array.from($panel.$shadowRoot.querySelectorAll(".pops-panel-deepMenu-nav-item")).find(
                    ($deepMenu) => {
                      const viewConfig = Reflect.get($deepMenu, panelHandlerComponents.$data.nodeStoreConfigKey);
                      return typeof viewConfig === "object" && viewConfig != null && viewConfig.text === target.name;
                    }
                  );
                }, 2500);
                if ($findDeepMenu) $findDeepMenu.click();
                else {
                  qmsg.error(translateCallback("未找到对应的二级菜单"));
                  return {
                    isFind: true,
                    data: target,
                  };
                }
                return {
                  isFind: false,
                  data: target.next,
                };
              } else {
                const $findTargetMenu = await domUtils.waitNode(() => {
                  return Array.from($panel.$shadowRoot.querySelectorAll(`li:not(.pops-panel-deepMenu-nav-item)`)).find(
                    ($menuItem) => {
                      return (
                        Reflect.get($menuItem, panelHandlerComponents.$data.nodeStoreConfigKey) ===
                        target.matchedData?.formConfig
                      );
                    }
                  );
                }, 2500);
                if ($findTargetMenu) {
                  scrollToElementAndListen($findTargetMenu);
                  const $fold = $findTargetMenu.closest(`.pops-panel-forms-fold[data-fold-enable]`);
                  if ($fold) {
                    $fold.querySelector(".pops-panel-forms-fold-container").click();
                    await utils.sleep(500);
                  }
                  scrollToElementAndListen($findTargetMenu, () => {
                    addFlashingClass($findTargetMenu);
                  });
                } else qmsg.error(translateCallback("未找到对应的菜单项"));
                return {
                  isFind: true,
                  data: target,
                };
              }
            });
          });
          return $item;
        };
        const execSearch = (searchText) => {
          const searchTextRegExp = new RegExp(searchText, "i");
          const searchConfigResult = [];
          const loopContentConfig = (configList, path) => {
            for (let index = 0; index < configList.length; index++) {
              const configItem = configList[index];
              const childViewConfig = configItem.views;
              if (childViewConfig && Array.isArray(childViewConfig)) {
                const deepMenuPath = utils.deepClone(path);
                if (configItem.type === "deepMenu") {
                  const deepNext = utils.queryProperty(deepMenuPath, (target) => {
                    if (target?.next)
                      return {
                        isFind: false,
                        data: target.next,
                      };
                    else
                      return {
                        isFind: true,
                        data: target,
                      };
                  });
                  deepNext.next = { name: configItem.text };
                }
                loopContentConfig(childViewConfig, deepMenuPath);
              } else {
                let text;
                let description;
                if (configItem.type === "own") {
                  let searchConfig = Reflect.get(configItem.attributes || {}, ATTRIBUTE_PLUGIN_SEARCH_CONFIG);
                  if (searchConfig) {
                    if (typeof searchConfig === "function") searchConfig = searchConfig();
                    if (typeof searchConfig.text === "string") text = searchConfig.text;
                    if (typeof searchConfig.desc === "string") description = searchConfig.desc;
                  }
                } else {
                  text = configItem.text;
                  description = Reflect.get(configItem, "description");
                }
                const delayMatchedTextList = [text, description];
                const matchedIndex = delayMatchedTextList.findIndex((configText) => {
                  if (typeof configText !== "string") return;
                  return configText.match(searchTextRegExp);
                });
                if (matchedIndex !== -1) {
                  const matchedPath = utils.deepClone(path);
                  const deepNext = utils.queryProperty(matchedPath, (target) => {
                    if (target?.next)
                      return {
                        isFind: false,
                        data: target.next,
                      };
                    else
                      return {
                        isFind: true,
                        data: target,
                      };
                  });
                  deepNext.next = {
                    name: text,
                    matchedData: {
                      path: "",
                      formConfig: configItem,
                      matchedText: delayMatchedTextList[matchedIndex],
                      description,
                    },
                  };
                  const pathList = [];
                  utils.queryProperty(matchedPath, (target) => {
                    const name = target?.name;
                    if (typeof name === "string" && name.trim() !== "") pathList.push(name);
                    if (target?.next)
                      return {
                        isFind: false,
                        data: target.next,
                      };
                    else
                      return {
                        isFind: true,
                        data: target,
                      };
                  });
                  const pathStr = pathList.join(CommonUtil.escapeHtml(" - "));
                  deepNext.next.matchedData.path = pathStr;
                  searchConfigResult.push(matchedPath);
                }
              }
            }
          };
          for (let index = 0; index < content.length; index++) {
            const leftContentConfigItem = content[index];
            if (!leftContentConfigItem.views) continue;
            if (leftContentConfigItem.isBottom && leftContentConfigItem.id === "script-version") continue;
            const rightContentConfigList = leftContentConfigItem.views;
            if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
              let text = leftContentConfigItem.title;
              if (typeof text === "function") text = text();
              loopContentConfig(rightContentConfigList, {
                index,
                name: text,
              });
            }
          }
          const $fragment = document.createDocumentFragment();
          for (const pathInfo of searchConfigResult) {
            const $resultItem = createSearchResultItem(pathInfo);
            $fragment.appendChild($resultItem);
          }
          clearSearchResult();
          $searchResultWrapper.append($fragment);
        };
        domUtils.on(
          $searchInput,
          "input",
          utils.debounce((evt2) => {
            domUtils.preventEvent(evt2);
            const searchText = domUtils.val($searchInput).trim();
            if (searchText === "") {
              clearSearchResult();
              return;
            }
            execSearch(searchText);
          }, 200)
        );
      };
      $panel.$shadowRoot
        .querySelectorAll(`aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`)
        .forEach(($asideItem) => {
          domUtils.on($asideItem, "dblclick", dbclick_callback);
        });
      const clickMap = new WeakMap();
      let isDoubleClick = false;
      let timer = void 0;
      let isMobileTouch = false;
      domUtils.on(
        $panel.$shadowRoot,
        "touchend",
        `aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`,
        (evt, $selector) => {
          isMobileTouch = true;
          clearTimeout(timer);
          timer = void 0;
          if (isDoubleClick && clickMap.has($selector)) {
            isDoubleClick = false;
            clickMap.delete($selector);
            dbclick_callback(evt);
          } else {
            timer = setTimeout(() => {
              isDoubleClick = false;
            }, 200);
            isDoubleClick = true;
            clickMap.set($selector, evt);
          }
        },
        { capture: true }
      );
      $panel.$shadowRoot.appendChild(
        domUtils.createElement("style", {
          type: "text/css",
          textContent: `
    			.pops-flashing{
    				animation: double-blink 1.5s ease-in-out;
    			}
    			@keyframes double-blink {
    				 0% {
    					background-color: initial;
    				}
    				25% {
    					background-color: yellow;
    				}
    				50% {
    					background-color: initial;
    				}
    				75% {
    					background-color: yellow;
    				}
    				100% {
    					background-color: initial;
    				}
    			}
    		`,
        })
      );
    },
    transformKey(key) {
      if (Array.isArray(key))
        if (key.length > 1) {
          const keyArray = key.sort();
          return JSON.stringify(keyArray);
        } else return key[0];
      else return key;
    },
    getDynamicValue(key, defaultValue) {
      let isInit = false;
      let __value = defaultValue;
      const listenerId = this.addValueChangeListener(key, (_, newValue) => {
        __value = newValue;
      });
      return {
        get value() {
          if (!isInit) {
            isInit = true;
            __value = Panel.getValue(key, defaultValue);
          }
          return __value;
        },
        destory() {
          Panel.removeValueChangeListener(listenerId);
        },
      };
    },
  };
  var injectDocumentTime = "";
  if (document.documentElement)
    if (document.head)
      if (document.body)
        injectDocumentTime = `<html>
    <head>
	    ...${document.head.childNodes.length} nodes
	</head>
    <body>
        ...${document.body.childNodes.length} nodes
    </body>
</html>

注入速度等级:4
`;
      else if (document.head.childNodes.length)
        injectDocumentTime = `<html>
	<head>
	    ...${document.head.childNodes.length} nodes
	</head>
</html>
		
注入速度等级:3`;
      else
        injectDocumentTime = `<html>
	<head></head>
</html>

注入速度等级:2`;
    else
      injectDocumentTime = `<html>
</html>

注入速度等级:1`;
  else
    injectDocumentTime = `document.documentElement is null
	
注入速度等级:0`;
  var setTimeoutLog = (handler, timeout, ...args) => {
    return setTimeout(async () => {
      try {
        await handler(...args);
      } catch (error) {
        qmsg.error(error.toString());
      }
    }, timeout);
  };
  var LocalStorageApi = {
    $storageKey: "gm-api-test-storage-config",
    set(key, value) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      let configJSON = utils.toJSON(config);
      configJSON[key] = value;
      window.localStorage.setItem(
        LocalStorageApi.$storageKey,
        JSON.stringify(configJSON, (key, value) => {
          return typeof value === "function" ? value.tString() : value;
        })
      );
    },
    get(key, defaultValue) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      return utils.toJSON(config)[key] ?? defaultValue;
    },
    delete(key) {
      let config = window.localStorage.getItem(LocalStorageApi.$storageKey) ?? "{}";
      let configJSON = utils.toJSON(config);
      Reflect.deleteProperty(configJSON, key);
      window.localStorage.setItem(
        LocalStorageApi.$storageKey,
        JSON.stringify(configJSON, (key, value) => {
          return typeof value === "function" ? value.tString() : value;
        })
      );
    },
  };
  var StorageApi = {
    set(key, value) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport())
        _GM_setValue(key, value);
      else LocalStorageApi.set(key, value);
    },
    get(key, defaultValue) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport())
        return _GM_getValue(key, defaultValue);
      else return LocalStorageApi.get(key, defaultValue);
    },
    delete(key) {
      if (GMTotal.setValue.isSupport() && GMTotal.getValue.isSupport() && GMTotal.deleteValue.isSupport())
        _GM_deleteValue(key);
      else LocalStorageApi.delete(key);
    },
  };
  var PanelKeyConfig = { asideLastVisit: "aside-last-visit" };
  var Tag = {
    success: "√ ",
    error: "× ",
    warn: "!!! ",
    info: "",
  };
  var TagUtil = {
    setTagList($el, tagList) {
      domUtils.html($el, "");
      let tagHTML = "";
      tagList.forEach((tagItem) => {
        tagHTML += `
				<p class="${tagItem.tag}">${tagItem.text ?? ""}</p>
			`;
      });
      domUtils.html($el, tagHTML);
    },
    setTag($el, tag, text) {
      TagUtil.clearTag($el);
      domUtils.addClass($el, tag);
      if (typeof text === "string") domUtils.html($el, text);
    },
    clearTag($el) {
      Object.keys(Tag).forEach((tagName) => {
        domUtils.removeClass($el, tagName);
      });
    },
  };
  var UIOwn = function (createLIElement, initConfig, searchConfig, attr, props, afterAddToUListCallBack) {
    const result = {
      type: "own",
      attributes: attr || {},
      props: props || {},
      createLIElement,
      afterAddToUListCallBack,
    };
    if (typeof initConfig === "object" && initConfig !== null && Object.keys(initConfig).length > 0)
      Reflect.set(result.attributes, ATTRIBUTE_INIT_MORE_VALUE, initConfig);
    else Reflect.set(result.attributes, ATTRIBUTE_INIT, () => false);
    if (typeof searchConfig === "object" && searchConfig !== null)
      Reflect.set(result.attributes, ATTRIBUTE_PLUGIN_SEARCH_CONFIG, searchConfig);
    return result;
  };
  var UIInfo = (config) => {
    return UIOwn(
      ($li) => {
        let $item = domUtils.createElement("div", {
          className: "pops-panel-item-left-text",
          innerHTML: `
					<p class="pops-panel-item-left-main-text"></p>
					<p class="pops-panel-item-left-desc-text"></p>
				`,
        });
        $li.appendChild($item);
        return $li;
      },
      void 0,
      void 0,
      void 0,
      void 0,
      async (formConfig, container) => {
        let $target = container.target;
        let $leftContainer = $target.querySelector(".pops-panel-item-left-text");
        let $text = $target.querySelector(".pops-panel-item-left-main-text");
        let $desc = $target.querySelector(".pops-panel-item-left-desc-text");
        let detail = await config();
        if (detail.tag == null) domUtils.html($text, detail.text);
        else domUtils.html($text, Tag[detail.tag] + detail.text);
        if (detail.description == null || detail.description === "") domUtils.hide($desc, false);
        domUtils.html($desc, detail.description || "");
        let classNameList = ["support-info"];
        if (detail.tag != null) classNameList.push(detail.tag);
        domUtils.addClass($text, classNameList);
        if (typeof detail.afterRender === "function")
          try {
            detail.afterRender({
              ...container,
              $leftContainer,
              $leftText: $text,
              $leftDesc: $desc,
            });
          } catch (error) {
            console.log(error);
            TagUtil.setTag($text, "error", "afterRender 函数执行错误" + error);
          }
      }
    );
  };
  var GlobalUtil = {
    getWindow() {
      return GMTotal.unsafeWindow.isSupport() ? _unsafeWindow : window;
    },
  };
  var TestUIBase = class {};
  var ApiTestBase = class extends TestUIBase {
    isSupportGM() {
      return typeof _GM === "object" && _GM != null;
    }
  };
  var ApiAsyncTestBase = class extends ApiTestBase {};
  var TamperMonkeyUtils = {
    getApiDocUrl(navName, text) {
      text = text ?? navName;
      return `<a href="https://www.tampermonkey.net/documentation.php?ext=gcal&version=#api:${navName}" target="_blank">${text}</a>`;
    },
  };
  var ApiTest_addElement = class extends ApiAsyncTestBase {
    getApiName() {
      return "GM_addElement";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addElement",
        isSupport: this.isSupportGM() && typeof _GM.addElement === "function",
      };
    }
    isSupport() {
      return typeof _GM_addElement === "function";
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(Reflect.apply(_GM_addElement, this, args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addElement,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              let $script = null;
              let $script_page = null;
              let win = GlobalUtil.getWindow();
              let el_script_id = apiNameTag + "_test_script_exec";
              let winPropName = `${el_script_id}_test_str`;
              try {
                $script = await data.fn("script", {
                  id: el_script_id,
                  textContent: `window["${winPropName}"] = "bar";`,
                });
                $script_page = document.querySelector("#" + el_script_id);
                if ($script == null)
                  return {
                    text: `${data.name} returns is null`,
                    tag: "error",
                  };
                if (!($script instanceof HTMLElement))
                  return {
                    text: `${data.name} returns is not style element`,
                    tag: "error",
                  };
                if (typeof win[winPropName] !== "string")
                  return {
                    text: `${data.name} script element is not work`,
                    tag: "error",
                  };
                Reflect.deleteProperty(win, winPropName);
                return {
                  text: CommonUtil.escapeHtml("支持添加<script>元素且执行js"),
                  tag: "success",
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              } finally {
                if ($script_page) $script_page.remove();
              }
            }),
            UIInfo(async () => {
              let $el_div = null;
              let $el_page = null;
              let el_id = apiNameTag + "_test2";
              try {
                $el_div = await data.fn(document.body, "div", {
                  "data-src": "https://example.com/image.png",
                  id: el_id,
                });
                if ($el_div == null)
                  return {
                    text: data.name + " returns is null",
                    tag: "error",
                  };
                if (!($el_div instanceof HTMLElement))
                  return {
                    text: data.name + " returns is not style element",
                    tag: "error",
                  };
                $el_page = document.querySelector("#" + el_id);
                if (!$el_page)
                  return {
                    text: "不支持3个参数",
                    tag: "error",
                  };
                const shadowRoot = $el_page.attachShadow({ mode: "closed" });
                await data.fn(shadowRoot, "style", { textContent: "div { color: black; };" });
                if (!shadowRoot.querySelector("style"))
                  return {
                    text: "不支持3个参数的shadowRoot",
                    tag: "error",
                  };
                if ($el_div == null)
                  return {
                    text: "传入3个参数但是返回为空",
                    tag: "error",
                  };
                if (!$el_page.hasAttribute("data-src"))
                  return {
                    text: "不支持设置自定义属性data-src",
                    tag: "error",
                  };
                return {
                  text: "支持3个参数并返回元素对象",
                  tag: "success",
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              } finally {
                if ($el_page) $el_page.remove();
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_addStyle = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_addStyle === "function";
    }
    getApiName() {
      return "GM_addStyle";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addStyle",
        isSupport: this.isSupportGM() && typeof _GM.addStyle === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-GM_addStyle" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(Reflect.apply(_GM_addStyle, this, args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addStyle,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              let $test = null;
              let $testCSS = null;
              try {
                $test = domUtils.createElement("div", {
                  id: apiNameTag,
                  innerText: apiNameTag + " test",
                });
                document.body.appendChild($test);
                $testCSS = await data.fn(`
							#${apiNameTag} {
								background-color: rgb(255, 0, 0);
							}
						`);
                if ($testCSS == null)
                  return {
                    text: `${data.name} returns is null`,
                    tag: "error",
                  };
                if (!($testCSS instanceof HTMLStyleElement))
                  return {
                    text: `${data.name} returns is not HTMLStyleElement`,
                    tag: "error",
                  };
                if (window.getComputedStyle($test).backgroundColor !== "rgb(255, 0, 0)")
                  return {
                    text: `${data.name} test element background is not rgb(255, 0, 0)`,
                    tag: "error",
                  };
                return {
                  text: CommonUtil.escapeHtml("支持添加CSS字符串并返回元素对象"),
                  tag: "success",
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              } finally {
                $test?.remove();
                $testCSS?.remove();
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_addValueChangeListener = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_addValueChangeListener === "function";
    }
    getApiName() {
      return "GM_addValueChangeListener";
    }
    getAsyncApiOption() {
      return {
        name: "GM.addValueChangeListener",
        isSupport: this.isSupportGM() && typeof _GM.addValueChangeListener === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_addValueChangeListener(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.addValueChangeListener,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = apiNameTag + "_key_1";
              return UIInfo(() => {
                return {
                  text: "测试监听数据存储改变",
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeoutId = void 0;
                    let listenerId = void 0;
                    let tagTextList = [];
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        tagTextList.length = 0;
                        clearTimeout(timeoutId);
                        TagUtil.setTag(container.$leftText, "info", "等待触发回调");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let delaySetValue = utils.formatTime(Date.now());
                        listenerId =
                          listenerId ??
                          (await data.fn(localStorageDataKey, function (key, oldValue, newValue, remote) {
                            console.log(arguments);
                            clearTimeout(timeoutId);
                            tagTextList.push({
                              tag: "success",
                              text: "支持触发回调",
                            });
                            if (typeof key !== "string")
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数key,当前类型:${typeof key}`,
                              });
                            else
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数key,当前类型:${typeof key}`,
                              });
                            if (typeof newValue !== typeof delaySetValue)
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数newValue,当前类型:${typeof delaySetValue}`,
                              });
                            else
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数newValue,当前类型:${typeof delaySetValue}`,
                              });
                            if (typeof remote !== "boolean")
                              tagTextList.push({
                                tag: "error",
                                text: `不支持回调参数remote,当前类型:${typeof remote}`,
                              });
                            else
                              tagTextList.push({
                                tag: "success",
                                text: `支持回调参数remote,当前类型:${typeof remote}`,
                              });
                            TagUtil.setTagList(container.$leftText, tagTextList);
                          }));
                        console.log(data.name + " listenerId:" + listenerId + " typeof:" + typeof listenerId);
                        if (typeof listenerId !== "number" && typeof listenerId !== "string")
                          tagTextList.push({
                            tag: "warn",
                            text: "listenerId类型不是number或string",
                          });
                        else
                          tagTextList.push({
                            tag: "success",
                            text: "listenerId类型:" + typeof listenerId,
                          });
                        timeoutId = setTimeout(() => {
                          tagTextList.push({
                            tag: "error",
                            text: "不支持触发回调",
                          });
                          TagUtil.setTagList(container.$leftText, tagTextList);
                        }, 3e3);
                        _GM_setValue(localStorageDataKey, delaySetValue);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_cookie = class extends ApiAsyncTestBase {
    isSupport() {
      return (typeof _GM_cookie === "object" || typeof _GM_cookie === "function") && _GM_cookie != null;
    }
    getApiOption() {
      let isSupport = this.isSupport();
      return {
        isSupportList: isSupport && typeof _GM_cookie.list === "function",
        isSupportSet: isSupport && typeof _GM_cookie.set === "function",
        isSupportDelete: isSupport && typeof _GM_cookie.delete === "function",
      };
    }
    getApiName() {
      return "GM_cookie";
    }
    getAsyncApiOption() {
      let isSupportAsync =
        this.isSupportGM() &&
        (typeof _GM.cookie === "object" || typeof _GM.cookie === "function") &&
        _GM.cookie != null;
      return {
        name: "GM.cookie",
        isSupport: isSupportAsync,
        isSupportList: isSupportAsync && typeof _GM.cookie.list === "function",
        isSupportSet: isSupportAsync && typeof _GM.cookie.set === "function",
        isSupportDelete: isSupportAsync && typeof _GM.cookie.delete === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiInfo = this.getApiOption();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName + ".list", `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: `支持 ${apiName},类型 ${typeof _GM_cookie}`,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      let firstFormList = result["views"][0].views;
      if (this.isSupport())
        firstFormList.push(
          UIInfo(() => {
            return apiInfo.isSupportList
              ? {
                  text: `支持 ${apiName}.list`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.list`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiInfo.isSupportSet
              ? {
                  text: `支持 ${apiName}.set`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.set`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiInfo.isSupportDelete
              ? {
                  text: `支持 ${apiName}.delete`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.delete`,
                  tag: "error",
                };
          })
        );
      if (apiAsyncInfo.isSupport)
        firstFormList.push(
          UIInfo(() => {
            return apiAsyncInfo.isSupportList
              ? {
                  text: `支持 ${apiAsyncInfo.name}.list`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.list`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupportSet
              ? {
                  text: `支持 ${apiAsyncInfo.name}.set`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.set`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupportDelete
              ? {
                  text: `支持 ${apiAsyncInfo.name}.delete`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.delete`,
                  tag: "error",
                };
          })
        );
      else
        firstFormList.push(
          UIInfo(() => {
            return {
              text: "不支持 " + apiAsyncInfo.name,
              tag: "error",
            };
          })
        );
      if (this.isSupport()) {
        let newCookieInfo = {
          name: "test",
          value: "1",
          expirationDate: (Date.now() + 1440 * 60 * 1e3) / 1e3,
        };
        [
          {
            name: apiName,
            list: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.list(details, (cookies, error) => {
                  if (error) reject(error);
                  else resolve(cookies);
                });
              });
            },
            set: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.set(details, (error) => {
                  if (error) reject(error);
                  else resolve(void 0);
                });
              });
            },
            delete: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_cookie.delete(details, (error) => {
                  if (error) reject(error);
                  else resolve(void 0);
                });
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            list: _GM.cookie?.list,
            set: _GM.cookie?.set,
            delete: _GM.cookie?.delete,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试list获取所有Cookie"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        const cookies = await data.list({});
                        console.log(cookies);
                        if (Array.isArray(cookies))
                          __pops__.alert({
                            title: {
                              text: data.name + ".list",
                              position: "center",
                            },
                            content: {
                              text: JSON.stringify(cookies, null, 4),
                              html: true,
                            },
                            drag: true,
                            mask: { enable: true },
                            width: PanelUISize.setting.width,
                            height: PanelUISize.setting.height,
                            style: `
															.pops-alert-content{
																white-space: pre-wrap;
															}
														`,
                          });
                        else alert("获取的cookie信息不是数组");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试set新增Cookie"),
                  tag: "info",
                  description: JSON.stringify(newCookieInfo),
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        await data.set(newCookieInfo);
                        qmsg.success(data.name + " set cookie success");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                let deleteCookieInfo = { name: "test" };
                return {
                  text: CommonUtil.escapeHtml("测试delete删除Cookie"),
                  tag: "info",
                  description: JSON.stringify(deleteCookieInfo),
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        await data.delete(deleteCookieInfo);
                        qmsg.success(data.name + " delete cookie success");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      }
      return result;
    }
  };
  var ApiTest_deleteValue = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_deleteValue === "function";
    }
    getApiName() {
      return "GM_deleteValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.deleteValue",
        isSupport: this.isSupportGM() && typeof _GM.deleteValue === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.name
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_deleteValue(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.deleteValue,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} null`;
              let localStorageDataValue = null;
              return UIInfo(() => {
                return {
                  text: "测试存储null值并删除",
                  description: `"${localStorageDataKey}": ${localStorageDataValue}`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        _GM_setValue(localStorageDataKey, localStorageDataValue);
                        await data.fn(localStorageDataKey);
                        let value = _GM_getValue(localStorageDataKey);
                        if (typeof value === "object" && value === null) qmsg.error("该值未删除,读取的值:" + value);
                        else qmsg.success("成功删除该值");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_deleteValues = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_deleteValues === "function";
    }
    getApiName() {
      return "GM_deleteValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.deleteValues",
        isSupport: this.isSupportGM() && typeof _GM.deleteValues === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_deleteValues(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.deleteValues,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataValue = {
                GM_deleteValues_key_1: 555,
                "GM.deleteValues_key_2": 666,
              };
              return UIInfo(() => {
                return {
                  text: "测试存储对象然后删除再读取",
                  description: `${JSON.stringify(localStorageDataValue)}`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        _GM_setValues(localStorageDataValue);
                        let localKeys = Object.keys(localStorageDataValue);
                        let values = _GM_getValues(localKeys);
                        if (JSON.stringify(values) !== JSON.stringify(localStorageDataValue)) {
                          qmsg.error("写入失败,写入的数据和读取的数据不相同");
                          return;
                        }
                        await data.fn(localKeys);
                        let values2 = _GM_getValues(localKeys);
                        if (values2 == null) qmsg.warning("删除情况未知,因为读取到的数据为null");
                        else if (typeof values2 === "object" && JSON.stringify(values2) === "{}")
                          qmsg.success("删除成功,读取的数据为{}");
                        else {
                          qmsg.error("删除情况未知,因为读取到的数据类型不是object");
                          console.log(values2);
                        }
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_download = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_download === "function";
    }
    getApiName() {
      return "GM_download";
    }
    getAsyncApiOption() {
      return {
        name: "GM.download",
        isSupport: this.isSupportGM() && typeof _GM.download === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                let options = args[0];
                if (typeof args[0] === "string") {
                  const name = args[1];
                  options = { url: args[0] };
                  if (typeof name === "string") options.name = name;
                }
                if (typeof options.onload === "function") {
                  const oldOnLoad = options.onload;
                  options.onload = (...args2) => {
                    oldOnLoad(...args2);
                    resolve(ret);
                  };
                }
                if (typeof options.onerror === "function") {
                  const oldOnError = options.onerror;
                  options.onerror = (...args2) => {
                    oldOnError(...args2);
                    resolve(ret);
                  };
                }
                if (typeof options.onprogress === "function") {
                  const oldOnProgress = options.onprogress;
                  options.onprogress = (...args2) => {
                    oldOnProgress(...args2);
                  };
                }
                if (typeof options.ontimeout === "function") {
                  const oldOnTimeout = options.ontimeout;
                  options.ontimeout = (...args2) => {
                    oldOnTimeout(...args2);
                    resolve(ret);
                  };
                }
                const ret = _GM_download(options);
                return ret;
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.download,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              const downloadUrl = "https://httpbin.org/image/png";
              const fileName = "test.png";
              return UIInfo(() => {
                return {
                  text: "下载图片:" + downloadUrl,
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let abortDownloadFn = null;
                    let isSuccessDownload = false;
                    let isDownloadEnd = false;
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        let $loading = qmsg.loading("下载中...", {
                          showClose: true,
                          onClose() {
                            if (!isSuccessDownload && typeof abortDownloadFn === "function") abortDownloadFn();
                          },
                        });
                        const result = await data.fn({
                          url: downloadUrl,
                          name: fileName,
                          onload() {
                            isSuccessDownload = true;
                            $loading.close();
                            qmsg.success(`下载 ${fileName} 已完成`);
                          },
                          onprogress(details) {
                            if (
                              typeof details === "object" &&
                              "loaded" in details &&
                              "total" in details &&
                              !isDownloadEnd
                            ) {
                              let formatProgressNum = ((details.loaded / details.total) * 100).toFixed(2);
                              $loading.setText(`下载中...${formatProgressNum}%`);
                              if (details.loaded === details.total) isDownloadEnd = true;
                            }
                          },
                          onerror(error) {
                            $loading.close();
                            console.error("下载失败error👉", error);
                            if (typeof error === "object" && error["error"])
                              qmsg.error(`下载 ${fileName} 失败或已取消 原因:${error["error"]}`, { timeout: 6e3 });
                            else qmsg.error(`下载 ${fileName} 失败或已取消`);
                          },
                          ontimeout() {
                            $loading.close();
                            qmsg.error(`下载 ${fileName} 请求超时`);
                          },
                        });
                        if (typeof result === "object" && result != null && "abort" in result)
                          abortDownloadFn = result.abort;
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })(),
            (() => {
              const downloadUrl = "https://media.w3.org/2010/05/sintel/trailer.mp4";
              const fileName = "test.mp4";
              return UIInfo(() => {
                return {
                  text: "下载视频:" + downloadUrl,
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let abortDownloadFn = null;
                    let isSuccessDownload = false;
                    let isDownloadEnd = false;
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        let $loading = qmsg.loading("下载中...", {
                          showClose: true,
                          onClose() {
                            if (!isSuccessDownload && typeof abortDownloadFn === "function") abortDownloadFn();
                          },
                        });
                        const result = await data.fn({
                          url: downloadUrl,
                          name: fileName,
                          onload() {
                            isSuccessDownload = true;
                            $loading.close();
                            qmsg.success(`下载 ${fileName} 已完成`);
                          },
                          onprogress(details) {
                            if (
                              typeof details === "object" &&
                              "loaded" in details &&
                              "total" in details &&
                              !isDownloadEnd
                            ) {
                              let formatProgressNum = ((details.loaded / details.total) * 100).toFixed(2);
                              $loading.setText(`下载中...${formatProgressNum}%`);
                              if (details.loaded === details.total) isDownloadEnd = true;
                            }
                          },
                          onerror(error) {
                            $loading.close();
                            console.error("下载失败error👉", error);
                            if (typeof error === "object" && error["error"])
                              qmsg.error(`下载 ${fileName} 失败或已取消 原因:${error["error"]}`, { timeout: 6e3 });
                            else qmsg.error(`下载 ${fileName} 失败或已取消`);
                          },
                          ontimeout() {
                            $loading.close();
                            qmsg.error(`下载 ${fileName} 请求超时`);
                          },
                        });
                        if (typeof result === "object" && result != null && "abort" in result)
                          abortDownloadFn = result.abort;
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_getResourceText = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getResourceText === "function";
    }
    getApiName() {
      return "GM_getResourceText";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getResourceText",
        isSupport: this.isSupportGM() && typeof _GM.getResourceText === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_getResourceText(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getResourceText,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              try {
                if (typeof (await data.fn("ViewerCSS")) === "string")
                  return {
                    text: CommonUtil.escapeHtml("支持通过@resource引用资源字符串"),
                    tag: "success",
                  };
                else
                  return {
                    text: CommonUtil.escapeHtml(data.name + " return is not string"),
                    tag: "error",
                  };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_getResourceUrl = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getResourceURL === "function";
    }
    getApiName() {
      return "GM_getResourceURL";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getResourceUrl",
        isSupport: this.isSupportGM() && typeof _GM.getResourceUrl === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(Reflect.apply(_GM_getResourceURL, this, args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getResourceUrl,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(async () => {
              try {
                let resourceBase64Data = await data.fn("ViewerCSS");
                if (typeof resourceBase64Data !== "string")
                  return {
                    text: CommonUtil.escapeHtml(`${data.name} return is not string`),
                    tag: "error",
                  };
                resourceBase64Data = resourceBase64Data.trim();
                if (resourceBase64Data.startsWith("data:text/css;base64"))
                  if (
                    resourceBase64Data.startsWith(
                      "data:text/css;base64,LyohCiAqIFZpZXdlci5qcyB2MS4xMS43CiAqIGh0dHBzOi8vZmVuZ3"
                    )
                  )
                    return {
                      text: CommonUtil.escapeHtml("支持通过@resource引用资源并进行base64编码"),
                      tag: "success",
                    };
                  else
                    return {
                      text: CommonUtil.escapeHtml(
                        "支持通过@resource引用资源并进行base64编码,但是base64编码的实现方式不同"
                      ),
                      tag: "warn",
                    };
                else
                  return {
                    text: CommonUtil.escapeHtml("支持通过@resource引用资源,但是未对资源进行base64编码"),
                    tag: "warn",
                  };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_getTab = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getTab === "function";
    }
    getApiName() {
      return "GM_getTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getTab",
        isSupport: this.isSupportGM() && typeof _GM.getTab === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async () => {
              return new Promise((resolve) => {
                _GM_getTab((...args) => {
                  resolve(...args);
                });
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getTab,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              return {
                text: "测试获取当前Tab",
                description: "",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    domUtils.preventEvent(event);
                    try {
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "error", "等待3s内触发回调函数");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "超时,不支持触发回调函数");
                      }, 3e3);
                      let tab = await data.fn();
                      clearTimeout(timeId);
                      console.log(data.name + " callback tab", tab);
                      if (typeof tab === "object" && tab != null)
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数",
                          },
                          {
                            tag: "success",
                            text: "入参tab为object类型",
                          },
                        ]);
                      else
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数",
                          },
                          {
                            tag: "error",
                            text: "入参tab不为object类型",
                          },
                        ]);
                      alert(JSON.stringify(tab));
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            })
          );
        });
      return result;
    }
  };
  var ApiTest_getTabs = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getTabs === "function";
    }
    getApiName() {
      return "GM_getTabs";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getTabs",
        isSupport: this.isSupportGM() && typeof _GM.getTabs === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async () => {
              return new Promise((resolve) => {
                _GM_getTabs((...args) => {
                  resolve(...args);
                });
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getTabs,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              return {
                text: "测试获取所有Tab",
                description: "",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
								<div class="pops-panel-button pops-panel-button-no-icon">
									<button class="pops-panel-button_inner" type="button" data-type="default">
										<i class="pops-bottom-icon" is-loading="false"></i>
										<span class="pops-panel-button-text">点击测试</span>
									</button>
								</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    try {
                      domUtils.preventEvent(event);
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "error", "等待3s内触发回调函数");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "超时,不支持触发回调函数");
                      }, 3e3);
                      let tabs = await data.fn();
                      clearTimeout(timeId);
                      console.log(data.name + " callback tabs", tabs);
                      if (typeof tabs === "object" && tabs != null)
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数",
                          },
                          {
                            tag: "success",
                            text: "入参tab为object类型",
                          },
                        ]);
                      else
                        TagUtil.setTagList(container.$leftText, [
                          {
                            tag: "success",
                            text: "支持触发回调函数",
                          },
                          {
                            tag: "error",
                            text: "入参tab不为object类型",
                          },
                        ]);
                      alert(JSON.stringify(tabs));
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            })
          );
        });
      return result;
    }
  };
  var ApiTest_getValue = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getValue === "function";
    }
    getApiName() {
      return "GM_getValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getValue",
        isSupport: this.isSupportGM() && typeof _GM.getValue === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_getValue(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getValue,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            ...[
              {
                key: `Test ${apiNameTag} boolean`,
                value: true,
                text: function () {
                  return `存储boolean类型并读取`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} number`,
                value: 1,
                text: function () {
                  return `存储number类型并读取`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} string`,
                value: "测试字符串",
                text: function () {
                  return `存储string类型并读取`;
                },
                desc: function () {
                  return `"${this.key}": "${this.value}"`;
                },
              },
              {
                key: `Test ${apiNameTag} undefined`,
                value: void 0,
                text: function () {
                  return `存储undefined类型并读取`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} null`,
                value: null,
                text: function () {
                  return `存储object类型的null并读取`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} object`,
                value: { "object key": "object value" },
                text: function () {
                  return `存储object类型并读取`;
                },
                desc: function () {
                  return `"${this.key}": ${JSON.stringify(this.value)}`;
                },
              },
            ].map((it) => {
              return (() => {
                let localStorageDataKey = it.key;
                let localStorageDataValue = it.value;
                return UIInfo(() => {
                  return {
                    text: it.text(),
                    description: it.desc(),
                    tag: "info",
                    afterRender(container) {
                      let $button = domUtils.toElement(
                        `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                        false,
                        false
                      );
                      domUtils.after(container.$leftContainer, $button);
                      domUtils.on($button, "click", async (event) => {
                        domUtils.preventEvent(event);
                        try {
                          _GM_setValue(localStorageDataKey, localStorageDataValue);
                          let value = await data.fn(localStorageDataKey);
                          if (typeof value === typeof localStorageDataValue) {
                            if (localStorageDataValue === null && localStorageDataValue != value) {
                              qmsg.error("读取成功,但存储类型和读取类型不同,存储类型为null,但读取类型不为null");
                              return;
                            }
                            qmsg.success("读取成功,存储类型和读取类型一致");
                          } else qmsg.error("读取成功,但存储类型和读取类型不同");
                        } catch (error) {
                          qmsg.error(error.toString());
                        }
                      });
                    },
                  };
                });
              })();
            }),
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} null with defaultValue`;
              let localStorageDefaultValue = 123;
              return UIInfo(() => {
                return {
                  text: "存储object类型的null,读取时指定默认值为" + localStorageDefaultValue,
                  description: `${apiNameTag}("${localStorageDataKey}", ${localStorageDefaultValue})`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        await data.fn(localStorageDataKey, null);
                        let value = await data.fn(localStorageDataKey, localStorageDefaultValue);
                        if (typeof value === "object" && value == null) qmsg.success("读取的值是存储的值:" + value);
                        else qmsg.error("读取的值不是存储的值:" + value);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })(),
            (() => {
              let localStorageDataKey = `Test ${apiNameTag} defaultValue`;
              let localStorageDefaultValue = 123;
              return UIInfo(() => {
                return {
                  text: "不存储,测试调用默认值",
                  description: `${apiNameTag}("${localStorageDataKey}", ${localStorageDefaultValue})`,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        let value = await data.fn(localStorageDataKey, localStorageDefaultValue);
                        if (typeof value === typeof localStorageDefaultValue)
                          qmsg.success("读取的值是默认值:" + value);
                        else qmsg.error("读取的值不是默认值:" + value);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_getValues = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_getValues === "function";
    }
    getApiName() {
      return "GM_getValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.getValues",
        isSupport: this.isSupportGM() && typeof _GM.getValues === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_getValues(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.getValues,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            UIInfo(() => {
              return {
                text: "测试直接读取",
                description: "没有入参",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  domUtils.on($button, "click", async (event) => {
                    domUtils.preventEvent(event);
                    try {
                      let value = await data.fn();
                      qmsg.info("请在控制台查看读取的数据");
                      console.log(value);
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            }),
            UIInfo(() => {
              let localStorageDataValue = utils.toJSON(`{
								"${apiNameTag}-test-key-non-exists-1": 1111,
								"${apiNameTag}-test-key-non-exists-2": 2222,
							}`);
              return {
                text: "测试读取不存在的数据",
                description: "数据默认值:" + JSON.stringify(localStorageDataValue),
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  domUtils.on($button, "click", async (event) => {
                    domUtils.preventEvent(event);
                    try {
                      let value = await data.fn(localStorageDataValue);
                      console.log(value);
                      if (value == null) qmsg.error("读取失败,读取的数据为null");
                      else if (JSON.stringify(value) === JSON.stringify(localStorageDataValue))
                        qmsg.success("读取成功,读取的数据和默认值相同");
                      else qmsg.error("读取成功,但读取的数据和默认值不同");
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            }),
            (() => {
              let localStorageDataValue = utils.toJSON(`{
							"${apiNameTag}-test-key-1": 1,
							"${apiNameTag}-test-key-2": 2,
						}`);
              return UIInfo(() => {
                return {
                  text: "测试存储对象并读取",
                  description: JSON.stringify(localStorageDataValue),
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        _GM_setValues(localStorageDataValue);
                        let keys = Object.keys(localStorageDataValue);
                        let value = await data.fn(keys);
                        console.log(value);
                        if (value == null) qmsg.error("读取失败,读取的数据为null");
                        else if (JSON.stringify(value) === JSON.stringify(localStorageDataValue))
                          qmsg.success("读取成功,写入的数据和读取的数据相同");
                        else qmsg.error("读取成功,但写入的数据和读取的数据不同");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_info = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_info === "object" && _GM_info != null;
    }
    getApiName() {
      return "GM_info";
    }
    getAsyncApiOption() {
      return {
        name: "GM.info",
        isSupport: this.isSupportGM() && typeof _GM.info === "object",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(GM)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: _GM_info,
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.info,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            ...[
              {
                value: data.fn?.downloadMode,
                type: "string",
                text: `${data.name}.downloadMode`,
                notExistsTag: "error",
              },
              {
                value: data.fn?.scriptHandler,
                type: "string",
                text: `${data.name}.scriptHandler`,
              },
              {
                value: data.fn?.scriptMetaStr,
                type: "string",
                text: `${data.name}.scriptMetaStr`,
              },
              {
                value: data.fn?.version,
                type: "string",
                text: `${data.name}.version`,
              },
              {
                value: data.fn?.script,
                type: "object",
                text: `${data.name}.script`,
              },
              {
                value: data.fn?.script?.name,
                type: "string",
                text: `${data.name}.script.name`,
              },
              {
                value: data.fn?.script?.author,
                type: "string",
                text: `${data.name}.script.author`,
              },
              {
                value: data.fn?.script?.description,
                type: "string",
                text: `${data.name}.script.description`,
              },
              {
                value: data.fn?.script?.version,
                type: "string",
                text: `${data.name}.script.version`,
              },
            ].map((it) =>
              UIInfo(() => {
                try {
                  if (it.value != null && typeof it.value === it.type)
                    return {
                      text: "支持 " + it.text + " 类型:" + it.type,
                      tag: "success",
                    };
                  else
                    return {
                      text: "不支持 " + it.text + " 类型:" + it.type,
                      tag: it.notExistsTag ?? "error",
                    };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error",
                  };
                }
              })
            )
          );
        });
      return result;
    }
  };
  var ApiTest_listValues = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_listValues === "function";
    }
    getApiName() {
      return "GM_listValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.listValues",
        isSupport: this.isSupportGM() && typeof _GM.listValues === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_listValues(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.listValues,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              return {
                text: "查看存储的所有键名",
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  domUtils.on($button, "click", async (event) => {
                    domUtils.preventEvent(event);
                    try {
                      let ret = await data.fn();
                      console.log(data.name + " call result", ret);
                      if (Array.isArray(ret))
                        if (ret.find((it) => typeof it !== "string")) qmsg.error("返回值数组中存在非string类型");
                        else alert(JSON.stringify(ret, null, 4));
                      else qmsg.error("返回值不是数组");
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            })
          );
        });
      return result;
    }
  };
  var ApiTest_log = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_log === "function";
    }
    getApiName() {
      return "GM_log";
    }
    getAsyncApiOption() {
      return {
        name: "GM.log",
        isSupport: this.isSupportGM() && typeof _GM.log === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_log(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.log,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                let logText = "test " + data.name;
                return {
                  text: CommonUtil.escapeHtml("请在控制台查看输出"),
                  tag: "info",
                  description: "test " + data.name,
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        await data.fn(logText);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_notification = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_notification === "function";
    }
    getApiName() {
      return "GM_notification";
    }
    getAsyncApiOption() {
      return {
        name: "GM.notification",
        isSupport: this.isSupportGM() && typeof _GM.notification === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (details) => {
              return new Promise((resolve) => {
                let originClick = details.onclick;
                let fnResult = _GM_notification({
                  ...details,
                  onclick(...args) {
                    if (typeof originClick === "function") Reflect.apply(originClick, this, args);
                    resolve(fnResult ?? true);
                  },
                });
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.notification,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name.replace(".", "__async__");
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("点击通知的内容测试url"),
                  tag: "info",
                  description: "https://example.com/",
                  afterRender(container) {
                    container.target;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/",
                        });
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                let $info = void 0;
                return {
                  text: "测试通知的timeout",
                  description: "请勿点击通知",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let updateText = utils.debounce(() => {
                      try {
                        clearTimeout(timeId);
                        domUtils.html(container.$leftText, `<p class="success">测试成功,触发</p>`);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    }, 800);
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        let timeCount = 10;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result = `正在等待触发超时:5000ms`;
                          calcTimeCount--;
                          return result;
                        };
                        TagUtil.setTag(container.$leftText, "info", tipInfoText());
                        timeId = setTimeoutLog(() => {
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发ondone回调");
                        }, timeCount * 1e3);
                        await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/",
                          timeout: 5e3,
                          ondone() {
                            updateText();
                          },
                        });
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after($info, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                let $info = void 0;
                let isClick = false;
                let isPrevent = false;
                let isDone = false;
                let text = "点击通知的内容测试onclick、ondone函数";
                return {
                  text,
                  description: "https://example.com/",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let intervalId = void 0;
                    let updateText = utils.debounce(() => {
                      try {
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let clickText = "";
                        let clickTag = "success";
                        let doneText = "";
                        let doneTag = "success";
                        if (isClick) {
                          clickText += "支持 onclick 函数";
                          if (isPrevent) {
                            clickText = clickText.trim();
                            clickText += "且支持提供 event 参数";
                          } else {
                            clickText += "但是不支持提供 event 参数";
                            clickTag = "warn";
                          }
                        } else {
                          clickText += "不支持 onclick 函数";
                          clickTag = "error";
                        }
                        if (isDone) doneText += "支持 ondone 函数";
                        else {
                          doneText += "不支持 ondone 函数";
                          doneTag = "error";
                        }
                        domUtils.html(
                          container.$leftText,
                          `
												<p class="${clickTag}">${clickText}</p>
												<p class="${doneTag}">${doneText}</p>`
                        );
                        isClick = false;
                        isDone = false;
                        isPrevent = false;
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    }, 800);
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let timeCount = 10;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result = `正在等待触发回调,请在规定时间内点击弹窗的【关闭】按钮或者内容:${calcTimeCount}s`;
                          calcTimeCount--;
                          return result;
                        };
                        domUtils.text(container.$leftText, tipInfoText());
                        domUtils.text(container.$leftDesc, text);
                        domUtils.show(container.$leftDesc, false);
                        timeId = setTimeoutLog(() => {
                          clearInterval(intervalId);
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调");
                        }, timeCount * 1e3);
                        intervalId = setInterval(() => {
                          domUtils.text(container.$leftText, tipInfoText());
                        }, 1e3);
                        await data.fn({
                          title: `测试 ${data.name} 标题`,
                          text: `测试 ${data.name} 内容`,
                          url: "https://example.com/",
                          onclick: (event) => {
                            console.log(event);
                            isClick = true;
                            if (event && typeof event.preventDefault === "function") {
                              isPrevent = true;
                              event.preventDefault();
                            }
                            updateText();
                          },
                          ondone() {
                            isDone = true;
                            updateText();
                          },
                        });
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after($info, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                let $info = void 0;
                let beforeContent = "123";
                let afterContent = "456";
                let notificationOption = {
                  title: "测试通知的内容更新(tag)",
                  text: beforeContent,
                  tag: "notification_tag_" + Date.now(),
                };
                let desc = `更新前:${beforeContent},更新后:${afterContent}`;
                return {
                  text: notificationOption.title,
                  description: desc,
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    $info = container.$leftContainer;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId = void 0;
                    let intervalId = void 0;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        let timeCount = 5;
                        let calcTimeCount = timeCount;
                        let tipInfoText = () => {
                          let result = `${calcTimeCount}s后通知的内容将更新为:${afterContent}`;
                          calcTimeCount--;
                          return result;
                        };
                        domUtils.text(container.$leftDesc, tipInfoText());
                        domUtils.show(container.$leftDesc, false);
                        timeId = setTimeout(async () => {
                          clearInterval(intervalId);
                          domUtils.text(container.$leftDesc, desc);
                          data.fn({
                            ...notificationOption,
                            text: afterContent,
                          });
                        }, timeCount * 1e3);
                        intervalId = setInterval(() => {
                          domUtils.text(container.$leftDesc, tipInfoText());
                        }, 1e3);
                        await data.fn(notificationOption);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after($info, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_openInTab = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_openInTab === "function";
    }
    getApiName() {
      return "GM_openInTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.openInTab",
        isSupport: this.isSupportGM() && typeof _GM.openInTab === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_openInTab(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.openInTab,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "后台打开 active: false",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result = await data.fn("https://www.example.com/", { active: false });
                        if (typeof result === "object")
                          if (result == null) TagUtil.setTag(container.$leftText, "error", "返回值为null");
                          else {
                            let support_close = "close" in result && typeof result.close === "function";
                            let support_closed = "closed" in result && typeof result.closed === "boolean";
                            let support_onclose = "onclose" in result;
                            domUtils.html(
                              container.$leftText,
                              `
													${support_close ? `<p class="success">支持 .close()</p>` : `<p class="error">不支持 .close()</p>`}
													${support_closed ? `<p class="success">支持 .closed</p>` : `<p class="error">不支持 .closed</p>`}
													${support_onclose ? `<p class="success">支持设置属性 .onclose</p>` : `<p class="error">不支持设置属性 .onclose</p>`}
										`
                            );
                          }
                        else TagUtil.setTag(container.$leftText, "error", "返回值不是对象:" + typeof result);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "配置 active: true",
                  description: "",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    let timeId;
                    let blurEvent = () => {
                      clearTimeout(timeId);
                      TagUtil.setTag(container.$leftText, "success", "测试新标签页打开成功");
                    };
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        domUtils.off(_unsafeWindow, "blur", blurEvent, { capture: true });
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待页面失去焦点...");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        domUtils.on(_unsafeWindow, "blur", blurEvent, {
                          capture: true,
                          once: true,
                        });
                        await data.fn("https://www.example.com/", { active: true });
                        timeId = setTimeoutLog(() => {
                          domUtils.off(_unsafeWindow, "blur", blurEvent, { capture: true });
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未打开新标签页并获取焦点");
                        }, 3e3);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "测试调用返回值 .close()",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待调用 .close()");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result = await data.fn("https://www.example.com/");
                        if (result && typeof result?.close === "function")
                          timeId = setTimeoutLog(() => {
                            try {
                              result.close();
                              TagUtil.setTag(container.$leftText, "success", "成功调用 .close()");
                            } catch (error) {
                              TagUtil.setTag(container.$leftText, "error", "调用 .close() 方法失败 " + error);
                            }
                          }, 1e3);
                        else TagUtil.setTag(container.$leftText, "error", "返回对象中不支持 .close() 方法");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "测试监听关闭是否生效 .onclose",
                  tag: "info",
                  afterRender(container) {
                    container.target;
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    let timeId;
                    let timeId2;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId2);
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "info", "等待触发监听 .onclose");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let result = await data.fn("https://www.example.com/");
                        if (typeof result === "object" && result != null)
                          result.onclose = () => {
                            clearTimeout(timeId);
                            clearTimeout(timeId2);
                            TagUtil.setTag(container.$leftText, "success", "成功触发 .onclose");
                          };
                        if (result && typeof result?.close === "function")
                          timeId = setTimeoutLog(() => {
                            try {
                              result.close();
                              timeId2 = setTimeoutLog(() => {
                                TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调 .onclose");
                              }, 2e3);
                            } catch (error) {
                              TagUtil.setTag(container.$leftText, "error", "调用 .close() 方法失败 " + error);
                            }
                          }, 1e3);
                        else TagUtil.setTag(container.$leftText, "error", "返回对象中不支持 .close() 方法");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_registerMenuCommand = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_registerMenuCommand === "function";
    }
    getApiName() {
      return "GM_registerMenuCommand";
    }
    getAsyncApiOption() {
      return {
        name: "GM.registerMenuCommand",
        isSupport: this.isSupportGM() && typeof _GM.registerMenuCommand === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_registerMenuCommand(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.registerMenuCommand,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "注册菜单 ==> Test Menu",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    let intervalId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        clearInterval(intervalId);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let intervalCheckCount = 10;
                        let setCheckText = () => {
                          let result = `已执行注册菜单,请在${intervalCheckCount}s内点击菜单项`;
                          intervalCheckCount--;
                          return result;
                        };
                        TagUtil.setTag(container.$leftText, "info", setCheckText());
                        intervalId = setInterval(() => {
                          TagUtil.setTag(container.$leftText, "info", setCheckText());
                        }, 1e3);
                        timeId = setTimeoutLog(() => {
                          clearInterval(intervalId);
                          TagUtil.setTag(container.$leftText, "error", "测试超时,未触发回调");
                        }, 10 * 1e3);
                        const menuCommandId = await data.fn("Test Menu", (event) => {
                          try {
                            clearInterval(intervalId);
                            clearTimeout(timeId);
                            TagUtil.clearTag(container.$leftText);
                            let checkResultText = [];
                            checkResultText.push({
                              tag: "success",
                              text: "支持注册菜单",
                            });
                            if (event)
                              checkResultText.push({
                                tag: "success",
                                text: "支持点击回调且有event参数",
                              });
                            else
                              checkResultText.push({
                                tag: "warn",
                                text: "支持点击回调但是没有event参数",
                              });
                            if (typeof menuCommandId === "number" || typeof menuCommandId === "string")
                              checkResultText.push({
                                tag: "success",
                                text: "函数返回值是string|number",
                              });
                            else
                              checkResultText.push({
                                tag: "error",
                                text: "函数返回值不是string|number:" + typeof menuCommandId,
                              });
                            domUtils.html(
                              container.$leftText,
                              checkResultText.map((it) => `<p class="${it.tag}">${it.text}</p>`).join("\n")
                            );
                          } catch (error) {
                            qmsg.error(error.toString(), { consoleLogContent: true });
                          }
                        });
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: "注册并更新菜单 ==> Test Update Menu",
                  description: "请自行验证是否成功更新菜单文字为:Test Update Menu Success!!!",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        const menuCommandId = await data.fn("Test Update Menu", (event) => {});
                        qmsg.info("已注册菜单,3s后自动更新", { timeout: 3e3 });
                        clearTimeout(timeId);
                        timeId = setTimeoutLog(async () => {
                          await data.fn("Test Update Menu Success!!!", () => {}, { id: menuCommandId });
                          qmsg.success("已执行更新菜单命令,请自行验证");
                        }, 3e3);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_removeValueChangeListener = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_removeValueChangeListener === "function";
    }
    getApiName() {
      return "GM_removeValueChangeListener";
    }
    getAsyncApiOption() {
      return {
        name: "GM.removeValueChangeListener",
        isSupport: this.isSupportGM() && typeof _GM.removeValueChangeListener === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_removeValueChangeListener(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.removeValueChangeListener,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataKey = apiName + "_key_1";
              return UIInfo(() => {
                return {
                  text: "测试移除监听器",
                  description: ``,
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let tagTextList = [];
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        tagTextList.length = 0;
                        TagUtil.setTag(container.$leftText, "info", "等待移除监听器");
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        let delaySetValue = utils.formatTime(Date.now());
                        let listenerId = _GM_addValueChangeListener(
                          localStorageDataKey,
                          function (key, oldValue, newValue, remote) {
                            console.log(arguments);
                            tagTextList.push({
                              tag: "error",
                              text: "未成功移除监听器",
                            });
                            TagUtil.setTagList(container.$leftText, tagTextList);
                          }
                        );
                        await data.fn(listenerId);
                        tagTextList.push({
                          tag: "success",
                          text: "支持移除监听器",
                        });
                        TagUtil.setTagList(container.$leftText, tagTextList);
                        _GM_setValue(localStorageDataKey, delaySetValue);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_saveTab = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_saveTab === "function";
    }
    getApiName() {
      return "GM_saveTab";
    }
    getAsyncApiOption() {
      return {
        name: "GM.saveTab",
        isSupport: this.isSupportGM() && typeof _GM.saveTab === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        result["views"][1].views.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil.escapeHtml("TODO"),
                tag: "info",
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error",
              };
            }
          })
        );
      return result;
    }
  };
  var ApiTest_setClipboard = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setClipboard === "function";
    }
    getApiName() {
      return "GM_setClipboard";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setClipboard",
        isSupport: this.isSupportGM() && typeof _GM.setClipboard === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                if (typeof args[2] === "function") {
                  const cb = args[2];
                  args[2] = (...args2) => {
                    cb(...args2);
                    resolve(void 0);
                  };
                }
                _GM_setClipboard(...args);
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: async (...args) => {
              const cb = args[2];
              await _GM.setClipboard(...args);
              if (typeof cb === "function") cb();
            },
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              return {
                text: "复制内容到剪贴板:Test " + data.name,
                tag: "info",
                afterRender(container) {
                  let $button = domUtils.toElement(
                    `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                    false,
                    false
                  );
                  domUtils.after(container.$leftContainer, $button);
                  let timeId;
                  domUtils.on($button, "click", async (event) => {
                    try {
                      domUtils.preventEvent(event);
                      clearTimeout(timeId);
                      qmsg.info("等待3s内触发成功复制的回调");
                      timeId = setTimeoutLog(() => {
                        TagUtil.setTag(container.$leftText, "error", "不支持触发回调函数");
                      }, 3e3);
                      await data.fn("Test " + data.name, "text", () => {
                        clearTimeout(timeId);
                        TagUtil.setTag(container.$leftText, "success", "支持触发回调函数");
                      });
                    } catch (error) {
                      qmsg.error(error.toString());
                    }
                  });
                },
              };
            })
          );
        });
      return result;
    }
  };
  var ApiTest_setValue = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setValue === "function";
    }
    getApiName() {
      return "GM_setValue";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setValue",
        isSupport: this.isSupportGM() && typeof _GM.setValue === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_setValue(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.setValue,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          let apiNameTag = data.name;
          data.formList.push(
            ...[
              {
                key: `Test ${apiNameTag} boolean`,
                value: true,
                text: function () {
                  return `存储boolean类型`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} number`,
                value: 1,
                text: function () {
                  return `存储number类型`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} string`,
                value: "测试字符串",
                text: function () {
                  return `存储string类型`;
                },
                desc: function () {
                  return `"${this.key}": "${this.value}"`;
                },
              },
              {
                key: `Test ${apiNameTag} undefined`,
                value: void 0,
                text: function () {
                  return `存储undefined类型`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} null`,
                value: null,
                text: function () {
                  return `存储object类型的null`;
                },
                desc: function () {
                  return `"${this.key}": ${this.value}`;
                },
              },
              {
                key: `Test ${apiNameTag} object`,
                value: { "object key": "object value" },
                text: function () {
                  return `存储object类型`;
                },
                desc: function () {
                  return `"${this.key}": ${JSON.stringify(this.value)}`;
                },
              },
            ].map((it) => {
              return (() => {
                let localStorageDataKey = it.key;
                let localStorageDataValue = it.value;
                return UIInfo(() => {
                  return {
                    text: it.text(),
                    description: it.desc(),
                    tag: "info",
                    afterRender(container) {
                      let $button = domUtils.toElement(
                        `
										<div class="pops-panel-button pops-panel-button-no-icon">
											<button class="pops-panel-button_inner" type="button" data-type="default">
												<i class="pops-bottom-icon" is-loading="false"></i>
												<span class="pops-panel-button-text">点击测试</span>
											</button>
										</div>
									`,
                        false,
                        false
                      );
                      domUtils.after(container.$leftContainer, $button);
                      domUtils.on($button, "click", async (event) => {
                        domUtils.preventEvent(event);
                        try {
                          await data.fn(localStorageDataKey, localStorageDataValue);
                          qmsg.info("执行写入完毕,请自行查看是否成功写入");
                        } catch (error) {
                          qmsg.error(error.toString());
                        }
                      });
                    },
                  };
                });
              })();
            })
          );
        });
      return result;
    }
  };
  var ApiTest_setValues = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_setValues === "function";
    }
    getApiName() {
      return "GM_setValues";
    }
    getAsyncApiOption() {
      return {
        name: "GM.setValues",
        isSupport: this.isSupportGM() && typeof _GM.setValues === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_setValues(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.setValues,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            (() => {
              let localStorageDataValue = {
                foo: 1,
                bar: 2,
              };
              return UIInfo(() => {
                return {
                  text: "测试存储对象",
                  description: JSON.stringify(localStorageDataValue),
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    domUtils.on($button, "click", async (event) => {
                      domUtils.preventEvent(event);
                      try {
                        await data.fn(localStorageDataValue);
                        qmsg.info("执行写入完毕,请自行查看是否成功写入");
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              });
            })()
          );
        });
      return result;
    }
  };
  var ApiTest_unregisterMenuCommand = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_unregisterMenuCommand === "function";
    }
    getApiName() {
      return "GM_unregisterMenuCommand";
    }
    getAsyncApiOption() {
      return {
        name: "GM.unregisterMenuCommand",
        isSupport: this.isSupportGM() && typeof _GM.unregisterMenuCommand === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        [
          {
            name: apiName,
            fn: async (...args) => {
              return new Promise((resolve) => {
                resolve(_GM_unregisterMenuCommand(...args));
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            fn: _GM.unregisterMenuCommand,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: "注册并卸载菜单 ==> Test UnRegister Menu",
                  description: "请自行验证是否成功卸载菜单",
                  tag: "info",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击测试</span>
										</button>
									</div>
								`,
                      false,
                      false
                    );
                    domUtils.after(container.$leftContainer, $button);
                    let timeId;
                    domUtils.on($button, "click", (event) => {
                      try {
                        domUtils.preventEvent(event);
                        clearTimeout(timeId);
                        const menuCommandId = _GM_registerMenuCommand("Test UnRegister Menu", (event) => {});
                        qmsg.info("已注册菜单,10s后自动执行卸载", { timeout: 10 * 1e3 });
                        clearTimeout(timeId);
                        timeId = setTimeoutLog(async () => {
                          await data.fn(menuCommandId);
                          qmsg.success("已执行卸载菜单命令,请自行验证");
                        }, 10 * 1e3);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var ApiTest_unsafeWindow = class extends ApiAsyncTestBase {
    getApiName() {
      return "unsafeWindow";
    }
    getAsyncApiOption() {}
    isSupport() {
      return typeof _unsafeWindow === "object" && _unsafeWindow != null;
    }
    getUIOption() {
      let apiName = this.getApiName();
      let result = {
        id: "aside-" + apiName,
        title: apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        result["views"][1].views.push(
          UIInfo(() => {
            let key = "test-gm-window";
            let flag = _monkeyWindow == _unsafeWindow;
            _monkeyWindow[key] = key;
            flag = typeof _unsafeWindow[key] !== "string";
            Reflect.deleteProperty(_monkeyWindow, key);
            if (flag)
              return {
                text: "window已被Proxy代理",
                tag: "success",
              };
            else
              return {
                text: "window未被Proxy代理,定义全局变量时会影响到页面变量",
                tag: "warn",
              };
          })
        );
      return result;
    }
  };
  var ApiTest_webRequest = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_webRequest === "function";
    }
    getApiName() {
      return "GM_webRequest";
    }
    getAsyncApiOption() {
      return {
        name: "GM.webRequest",
        isSupport: this.isSupportGM() && typeof _GM.webRequest === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        result["views"][1].views.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil.escapeHtml("TODO"),
                tag: "info",
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error",
              };
            }
          })
        );
      return result;
    }
  };
  var ApiTest_xmlHttpRequest = class extends ApiAsyncTestBase {
    isSupport() {
      return typeof _GM_xmlhttpRequest === "function";
    }
    getApiName() {
      return "GM_xmlhttpRequest";
    }
    getAsyncApiOption() {
      return {
        name: "GM.xmlHttpRequest",
        isSupport: this.isSupportGM() && typeof _GM.xmlHttpRequest === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName, `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: "支持 " + apiName,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
              UIInfo(() =>
                apiAsyncInfo.isSupport
                  ? {
                      text: "支持 " + apiAsyncInfo.name,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiAsyncInfo.name,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
        ],
      };
      if (this.isSupport())
        result["views"][1].views.push(
          UIInfo(() => {
            try {
              return {
                text: CommonUtil.escapeHtml("TODO"),
                tag: "info",
              };
            } catch (error) {
              console.error(error);
              return {
                text: "执行错误 " + error,
                tag: "error",
              };
            }
          })
        );
      return result;
    }
  };
  var ApiTest_GM = class extends ApiAsyncTestBase {
    getApiName() {
      return "GM";
    }
    getAsyncApiOption() {}
    isSupport() {
      return typeof _GM === "object" && _GM != null;
    }
    getUIOption() {}
  };
  var ApiTest_audio = class extends ApiAsyncTestBase {
    isSupport() {
      return (
        (typeof _GM_audio === "object" || typeof _GM_audio === "function") &&
        _GM_audio != null &&
        typeof _GM_audio?.setMute === "function" &&
        typeof _GM_audio?.getState === "function" &&
        typeof _GM_audio?.addStateChangeListener === "function" &&
        typeof _GM_audio?.removeStateChangeListener === "function"
      );
    }
    getApiOption() {
      let isSupport = this.isSupport();
      return {
        isSupport_setMute: isSupport && typeof _GM_audio?.setMute === "function",
        isSupport_getState: isSupport && typeof _GM_audio?.getState === "function",
        isSupport_addStateChangeListener: isSupport && typeof _GM_audio?.addStateChangeListener === "function",
        isSupport_removeStateChangeListener: isSupport && typeof _GM_audio?.removeStateChangeListener === "function",
      };
    }
    getApiName() {
      return "GM_audio";
    }
    getAsyncApiOption() {
      let isSupportAsync =
        this.isSupportGM() &&
        (typeof _GM.audio === "object" || typeof _GM.audio === "function") &&
        _GM.audio != null &&
        typeof _GM.audio?.setMute === "function" &&
        typeof _GM.audio?.getState === "function" &&
        typeof _GM.audio?.addStateChangeListener === "function" &&
        typeof _GM.audio?.removeStateChangeListener === "function";
      return {
        name: "GM.audio",
        isSupport: isSupportAsync,
        isSupport_setMute: isSupportAsync && typeof _GM.audio?.setMute === "function",
        isSupport_getState: isSupportAsync && typeof _GM.audio?.getState === "function",
        isSupport_addStateChangeListener: isSupportAsync && typeof _GM.audio?.addStateChangeListener === "function",
        isSupport_removeStateChangeListener:
          isSupportAsync && typeof _GM.audio?.removeStateChangeListener === "function",
      };
    }
    getUIOption() {
      let apiName = this.getApiName();
      let apiInfo = this.getApiOption();
      let apiAsyncInfo = this.getAsyncApiOption();
      let result = {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName + ".setMute", `${apiName} & ${apiAsyncInfo.name}`)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "函数测试",
            views: [
              UIInfo(() =>
                this.isSupport()
                  ? {
                      text: `支持 ${apiName},类型:${typeof _GM_audio}`,
                      tag: "success",
                    }
                  : {
                      text: "不支持 " + apiName,
                      tag: "error",
                    }
              ),
            ],
          },
          {
            type: "container",
            text: "功能测试",
            views: [],
          },
          {
            type: "container",
            text: "功能测试(异步)",
            views: [],
          },
        ],
      };
      let firstFormList = result["views"][0].views;
      if (this.isSupport())
        firstFormList.push(
          UIInfo(() => {
            return apiInfo.isSupport_setMute
              ? {
                  text: `支持 ${apiName}.setMute`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.setMute`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_getState
              ? {
                  text: `支持 ${apiName}.getState`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.getState`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_addStateChangeListener
              ? {
                  text: `支持 ${apiName}.addStateChangeListener`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.addStateChangeListener`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiInfo.isSupport_removeStateChangeListener
              ? {
                  text: `支持 ${apiName}.removeStateChangeListener`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiName}.removeStateChangeListener`,
                  tag: "error",
                };
          })
        );
      if (apiAsyncInfo.isSupport)
        firstFormList.push(
          UIInfo(() => {
            return apiAsyncInfo.isSupport_setMute
              ? {
                  text: `支持 ${apiAsyncInfo.name}.setMute`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.setMute`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_getState
              ? {
                  text: `支持 ${apiAsyncInfo.name}.getState`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.getState`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_addStateChangeListener
              ? {
                  text: `支持 ${apiAsyncInfo.name}.addStateChangeListener`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.addStateChangeListener`,
                  tag: "error",
                };
          }),
          UIInfo(() => {
            return apiAsyncInfo.isSupport_removeStateChangeListener
              ? {
                  text: `支持 ${apiAsyncInfo.name}.removeStateChangeListener`,
                  tag: "success",
                }
              : {
                  text: `不支持 ${apiAsyncInfo.name}.removeStateChangeListener`,
                  tag: "error",
                };
          })
        );
      else
        firstFormList.push(
          UIInfo(() => {
            return {
              text: "不支持 " + apiAsyncInfo.name,
              tag: "error",
            };
          })
        );
      if (this.isSupport())
        [
          {
            name: apiName,
            setMute: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_audio.setMute(details, (error) => {
                  if (error) reject(error);
                  else resolve(void 0);
                });
              });
            },
            getState: async (...args) => {
              return new Promise((resolve, reject) => {
                const [details, cb] = args;
                _GM_audio.getState((info) => {
                  if (!info) reject(new Error("failed to read state"));
                  resolve(info);
                });
              });
            },
            addStateChangeListener: async (...args) => {
              return new Promise((resolve, reject) => {
                const [cb] = args;
                _GM_audio.addStateChangeListener(cb, (err) => {
                  if (err) reject(err);
                  else resolve(void 0);
                });
              });
            },
            removeStateChangeListener: async (...args) => {
              return new Promise((resolve, reject) => {
                const [cb] = args;
                _GM_audio.removeStateChangeListener(cb, (err) => {
                  if (err) reject(err);
                  else resolve(void 0);
                });
              });
            },
            formList: result["views"][1].views,
          },
          {
            name: apiAsyncInfo.name,
            setMute: async (...args) => {
              const [details] = args;
              return await _GM.audio?.setMute(details);
            },
            getState: async (...args) => {
              const stat = await _GM.audio?.getState();
              if (typeof stat === "object" && stat != null) {
                if (typeof stat?.isMuted !== "boolean") throw new Error("GM.audio.getState 返回值类型错误");
                return stat;
              } else throw new Error("返回值不是一个对象");
            },
            addStateChangeListener: _GM.audio?.addStateChangeListener,
            removeStateChangeListener: _GM.audio?.removeStateChangeListener,
            formList: result["views"][2].views,
          },
        ].forEach((data) => {
          data.name;
          data.formList.push(
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试设置当前tab静音"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
                                        <div class="pops-panel-button pops-panel-button-no-icon">
                                            <button class="pops-panel-button_inner" type="button" data-type="default">
                                                <i class="pops-bottom-icon" is-loading="false"></i>
                                                <span class="pops-panel-button-text">点击执行</span>
                                            </button>
                                        </div>
                                        `,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        const stat = await data.setMute({ isMuted: true });
                        console.log(data.name + ".setMute result:", stat);
                        if (stat === void 0) TagUtil.setTag(container.$leftText, "success", "执行成功");
                        else TagUtil.setTag(container.$leftText, "warn", "执行成功,但返回值类型不同:" + stat);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试取消当前tab静音"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
                                        <div class="pops-panel-button pops-panel-button-no-icon">
                                            <button class="pops-panel-button_inner" type="button" data-type="default">
                                                <i class="pops-bottom-icon" is-loading="false"></i>
                                                <span class="pops-panel-button-text">点击执行</span>
                                            </button>
                                        </div>
                                        `,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        const state = await data.setMute({ isMuted: false });
                        console.log(data.name + ".setMute result:", state);
                        if (state === void 0) TagUtil.setTag(container.$leftText, "success", "执行成功");
                        else TagUtil.setTag(container.$leftText, "warn", "执行成功,但返回值类型不同:" + state);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("获取当前tab静音状态信息"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        const stateInfo = await data.getState();
                        console.log(data.name + ".getState result:", stateInfo);
                        if (typeof stateInfo === "object" && stateInfo !== null) {
                          const propSupport = [];
                          if (typeof stateInfo?.isMuted === "boolean")
                            propSupport.push(`
                                                        <p class="support-info success">支持属性:isMuted,当前类型:${typeof stateInfo?.isMuted}</p>    
                                                    `);
                          else
                            propSupport.push(`
                                                        <p class="support-info error">不支持属性:isMuted,当前类型:${typeof stateInfo?.isMuted}</p>    
                                                    `);
                          if (
                            ("muteReason" in stateInfo && typeof stateInfo?.muteReason === "string") ||
                            stateInfo?.muteReason === void 0
                          )
                            propSupport.push(`
                                                        <p class="support-info success">支持属性:muteReason,当前类型:${typeof stateInfo?.muteReason}</p>    
                                                    `);
                          else
                            propSupport.push(`
                                                        <p class="support-info error">不支持属性:muteReason,当前类型:${typeof stateInfo?.muteReason}</p>    
                                                    `);
                          if (typeof stateInfo?.isAudible === "boolean")
                            propSupport.push(`
                                                        <p class="support-info success">支持属性:isAudible,当前类型:${typeof stateInfo?.isAudible}</p>
                                                    `);
                          else
                            propSupport.push(`
                                                        <p class="support-info error">不支持属性:isAudible,当前类型:${typeof stateInfo?.isAudible}</p>
                                                    `);
                          TagUtil.setTag(container.$leftText, "success", propSupport.join("\n"));
                        } else TagUtil.setTag(container.$leftText, "error", "返回值类型错误:" + typeof stateInfo);
                        domUtils.text(container.$leftDesc, this.text);
                        domUtils.show(container.$leftDesc, false);
                        alert(JSON.stringify(stateInfo, null, 4));
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试监听静音状态改变"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        await data.addStateChangeListener((statusInfo) => {
                          console.log(data.name + ".addStateChangeListener callback change value:", statusInfo);
                          alert(JSON.stringify(statusInfo, null, 4));
                        });
                        await utils.sleep(500);
                        await data.setMute({ isMuted: true });
                        await utils.sleep(500);
                        await data.setMute({ isMuted: false });
                      } catch (error) {
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            }),
            UIInfo(() => {
              try {
                return {
                  text: CommonUtil.escapeHtml("测试移除监听器"),
                  tag: "info",
                  description: "点击按钮进行测试",
                  afterRender(container) {
                    let $button = domUtils.toElement(
                      `
									<div class="pops-panel-button pops-panel-button-no-icon">
										<button class="pops-panel-button_inner" type="button" data-type="default">
											<i class="pops-bottom-icon" is-loading="false"></i>
											<span class="pops-panel-button-text">点击执行</span>
										</button>
									</div>
									`,
                      false,
                      false
                    );
                    let isSuccessRemove = true;
                    let $loading;
                    domUtils.on($button, "click", async (event) => {
                      try {
                        domUtils.preventEvent(event);
                        let listener = (statusInfo) => {
                          isSuccessRemove = false;
                          qmsg.error("移除监听器失败");
                        };
                        $loading = qmsg.loading("处理监听器中...");
                        await data.addStateChangeListener(listener);
                        await data.removeStateChangeListener(listener);
                        $loading.setText("等待500ms,设置当前Tab静音");
                        await utils.sleep(500);
                        await data.setMute({ isMuted: true });
                        $loading.setText("等待500ms,设置当前Tab取消静音");
                        await utils.sleep(500);
                        await data.setMute({ isMuted: false });
                        $loading.close();
                        if (isSuccessRemove) qmsg.success("移除监听器成功");
                      } catch (error) {
                        $loading?.close();
                        qmsg.error(error.toString());
                      }
                    });
                    domUtils.after(container.$leftContainer, $button);
                  },
                };
              } catch (error) {
                console.error(error);
                return {
                  text: "执行错误 " + error,
                  tag: "error",
                };
              }
            })
          );
        });
      return result;
    }
  };
  var GMTotal = {
    unsafeWindow: new ApiTest_unsafeWindow(),
    GM: new ApiTest_GM(),
    addElement: new ApiTest_addElement(),
    addStyle: new ApiTest_addStyle(),
    download: new ApiTest_download(),
    getResourceText: new ApiTest_getResourceText(),
    getResourceUrl: new ApiTest_getResourceUrl(),
    info: new ApiTest_info(),
    log: new ApiTest_log(),
    notification: new ApiTest_notification(),
    openInTab: new ApiTest_openInTab(),
    registerMenuCommand: new ApiTest_registerMenuCommand(),
    unregisterMenuCommand: new ApiTest_unregisterMenuCommand(),
    setClipboard: new ApiTest_setClipboard(),
    getTab: new ApiTest_getTab(),
    saveTab: new ApiTest_saveTab(),
    getTabs: new ApiTest_getTabs(),
    setValue: new ApiTest_setValue(),
    getValue: new ApiTest_getValue(),
    deleteValue: new ApiTest_deleteValue(),
    listValues: new ApiTest_listValues(),
    setValues: new ApiTest_setValues(),
    getValues: new ApiTest_getValues(),
    deleteValues: new ApiTest_deleteValues(),
    addValueChangeListener: new ApiTest_addValueChangeListener(),
    removeValueChangeListener: new ApiTest_removeValueChangeListener(),
    xmlHttpRequest: new ApiTest_xmlHttpRequest(),
    webRequest: new ApiTest_webRequest(),
    cookie: new ApiTest_cookie(),
    audio: new ApiTest_audio(),
  };
  var GrantTest_close = class extends ApiTestBase {
    getApiName() {
      return "window.close ";
    }
    getAsyncApiOption() {}
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      return {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "功能测试",
            views: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil.escapeHtml("测试window.close"),
                    tag: "info",
                    description: "点击按钮执行该函数",
                    afterRender(container) {
                      let $button = domUtils.toElement(
                        `
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
											`,
                        false,
                        false
                      );
                      domUtils.on($button, "click", (event) => {
                        domUtils.preventEvent(event);
                        try {
                          _monkeyWindow.close();
                        } catch (error) {
                          qmsg.error(error.toString(), { consoleLogContent: true });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    },
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error",
                  };
                }
              }),
            ],
          },
        ],
      };
    }
  };
  var GrantTest_focus = class extends ApiTestBase {
    getApiName() {
      return "window.focus ";
    }
    getAsyncApiOption() {}
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      return {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "功能测试",
            views: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil.escapeHtml("测试window.focus"),
                    tag: "info",
                    description: "点击按钮执行该函数",
                    afterRender(container) {
                      let $button = domUtils.toElement(
                        `
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
										`,
                        false,
                        false
                      );
                      let blurEvent = () => {
                        setTimeout(() => {
                          _monkeyWindow.focus();
                        }, 3e3);
                      };
                      domUtils.on($button, "click", (event) => {
                        domUtils.preventEvent(event);
                        window.removeEventListener("blur", blurEvent, { capture: true });
                        window.addEventListener("blur", blurEvent, {
                          capture: true,
                          once: true,
                        });
                        try {
                          qmsg.info("请切换至其它Tab页面,切换完毕3秒后会自动调用该函数");
                        } catch (error) {
                          qmsg.error(error.toString(), { consoleLogContent: true });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    },
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error",
                  };
                }
              }),
            ],
          },
        ],
      };
    }
  };
  var GrantTest_onurlchange = class extends ApiTestBase {
    getApiName() {
      return "window.onurlchange ";
    }
    getAsyncApiOption() {}
    isSupport() {
      return true;
    }
    getUIOption() {
      let apiName = this.getApiName();
      return {
        id: "aside-" + apiName,
        title: "" + apiName,
        headerTitle: `${TamperMonkeyUtils.getApiDocUrl(apiName)}`,
        scrollToDefaultView: true,
        isDefault() {
          return StorageApi.get(PanelKeyConfig.asideLastVisit) === apiName;
        },
        clickCallback(data) {
          StorageApi.set(PanelKeyConfig.asideLastVisit, apiName);
        },
        views: [
          {
            type: "container",
            text: "功能测试",
            views: [
              UIInfo(() => {
                try {
                  return {
                    text: CommonUtil.escapeHtml("测试window.onurlchange"),
                    tag: "info",
                    description: "点击按钮进行测试",
                    afterRender(container) {
                      let $button = domUtils.toElement(
                        `
											<div class="pops-panel-button pops-panel-button-no-icon">
												<button class="pops-panel-button_inner" type="button" data-type="default">
													<i class="pops-bottom-icon" is-loading="false"></i>
													<span class="pops-panel-button-text">点击执行</span>
												</button>
											</div>
											`,
                        false,
                        false
                      );
                      let urlChangeEvent = (info) => {
                        clearTimeout(timeId);
                        console.log("urlchange event info ==> ", info);
                        qmsg.success("urlchange event ==> url is changed");
                      };
                      let timeId;
                      domUtils.on($button, "click", (event) => {
                        try {
                          domUtils.preventEvent(event);
                          clearTimeout(timeId);
                          if (_monkeyWindow.onurlchange === null) {
                            _monkeyWindow.removeEventListener("urlchange", urlChangeEvent);
                            _monkeyWindow.addEventListener("urlchange", urlChangeEvent);
                            window.history.pushState({}, "", "#/onurlchange");
                            timeId = setTimeout(() => {
                              qmsg.error("urlchange event is not trigger");
                            }, 1e3);
                          } else qmsg.error("window.onurlchange is not null");
                        } catch (error) {
                          qmsg.error(error.toString(), { consoleLogContent: true });
                        }
                      });
                      domUtils.after(container.$leftContainer, $button);
                    },
                  };
                } catch (error) {
                  console.error(error);
                  return {
                    text: "执行错误 " + error,
                    tag: "error",
                  };
                }
              }),
            ],
          },
        ],
      };
    }
  };
  var Component_Common = () => {
    let supportApiNameList = [];
    let notSupportApiNameList = [];
    Object.keys(GMTotal).forEach((keyName) => {
      let value = GMTotal[keyName];
      let apiName = value.getApiName();
      let isSupport = value.isSupport();
      let apiAsyncInfo = value.getAsyncApiOption();
      if (isSupport)
        supportApiNameList.push({
          name: apiName,
          isSupport,
        });
      else
        notSupportApiNameList.push({
          name: apiName,
          isSupport,
        });
      if (apiAsyncInfo)
        if (apiAsyncInfo.isSupport)
          supportApiNameList.push({
            name: apiAsyncInfo.name,
            isSupport: apiAsyncInfo.isSupport,
            leftTargetSelector: "#aside-" + apiName,
          });
        else
          notSupportApiNameList.push({
            name: apiAsyncInfo.name,
            isSupport: apiAsyncInfo.isSupport,
            leftTargetSelector: "#aside-" + apiName,
          });
    });
    let createFeatureItem = (config) => {
      let $item = domUtils.createElement("div", {
        className: "gm-api-features-item",
        innerHTML: `
				<div class="gm-api-features-item__label">${config.name}</div>
				<div class="gm-api-features-item__value">
					<span style="font-size: 16px; font-weight: 700;">
						${
              config.isSupport
                ? `
							<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 512 512" fill="currentColor">
								<path d="M448 71.9c-17.3-13.4-41.5-9.3-54.1 9.1L214 344.2l-99.1-107.3c-14.6-16.6-39.1-17.4-54.7-1.8-15.6 15.5-16.4 41.6-1.7 58.1 0 0 120.4 133.6 137.7 147 17.3 13.4 41.5 9.3 54.1-9.1l206.3-301.7c12.6-18.5 8.7-44.2-8.6-57.5z" fill="#3b9f04"></path>
							</svg>
						`
                : `
							<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 512 512" fill="currentColor">
								<path fill="#FF473E" d="m330.443 256l136.765-136.765c14.058-14.058 14.058-36.85 0-50.908l-23.535-23.535c-14.058-14.058-36.85-14.058-50.908 0L256 181.557L119.235 44.792c-14.058-14.058-36.85-14.058-50.908 0L44.792 68.327c-14.058 14.058-14.058 36.85 0 50.908L181.557 256L44.792 392.765c-14.058 14.058-14.058 36.85 0 50.908l23.535 23.535c14.058 14.058 36.85 14.058 50.908 0L256 330.443l136.765 136.765c14.058 14.058 36.85 14.058 50.908 0l23.535-23.535c14.058-14.058 14.058-36.85 0-50.908L330.443 256z"></path>
							</svg>
						`
            }
						
					</span>
				</div>
			`,
      });
      domUtils.on($item, "click", (event) => {
        domUtils.preventEvent(event);
        let shadowRoot = $item.getRootNode();
        let selector = utils.isNotNull(config.leftTargetSelector) ? config.leftTargetSelector : "#aside-" + config.name;
        let $left = shadowRoot.querySelector(selector);
        if ($left) {
          $left.click();
          $left.scrollIntoView({ behavior: "smooth" });
        }
      });
      return $item;
    };
    return {
      id: "component-common",
      title: "通用",
      scrollToDefaultView: true,
      isDefault() {
        return StorageApi.get(PanelKeyConfig.asideLastVisit) === "component-common";
      },
      clickCallback(data) {
        StorageApi.set(PanelKeyConfig.asideLastVisit, "component-common");
      },
      views: [
        {
          type: "container",
          text: "@run-at document-start<br>注:注入速度等级越低,注入的速度越快<br>范围:0~4",
          views: [
            UIInfo(() => {
              return {
                text: CommonUtil.escapeHtml(injectDocumentTime),
                tag: "info",
              };
            }),
          ],
        },
        {
          type: "container",
          text: "特性",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.fontSize = "1.2em";
            container.formHeaderDivElement.style.fontWeight = "700";
          },
          views: [],
        },
        {
          type: "container",
          text: "不支持列表",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.color = "rgb(216, 30, 6)";
            container.formHeaderDivElement.style.fontWeight = "600";
            if (notSupportApiNameList.length === 0) container.formContainerListElement?.remove();
          },
          views: [
            UIOwn(($li) => {
              const $container = domUtils.createElement("div", { className: "gm-api-features-not-support" });
              const $fragment = document.createDocumentFragment();
              notSupportApiNameList.forEach((config) => {
                $fragment.append(createFeatureItem(config));
              });
              $container.appendChild($fragment);
              $li.appendChild($container);
              return $li;
            }),
          ],
        },
        {
          type: "container",
          text: "支持列表",
          afterAddToUListCallBack(formConfig, container) {
            container.formHeaderDivElement.style.fontWeight = "600";
            if (supportApiNameList.length === 0) container.formContainerListElement?.remove();
          },
          views: [
            UIOwn(($li) => {
              const $container = domUtils.createElement("div", { className: "gm-api-features-support" });
              const $fragment = document.createDocumentFragment();
              supportApiNameList.forEach((config) => {
                $fragment.append(createFeatureItem(config));
              });
              $container.appendChild($fragment);
              $li.appendChild($container);
              return $li;
            }),
          ],
        },
      ],
    };
  };
  if (CommonUtil.isTopWindow()) {
    let showPanel = () => {
      Panel.showPanel(PanelContent.getConfig(0), void 0, void 0, true);
    };
    let defaultMenuOption = PanelMenu.getMenuOption(0);
    defaultMenuOption.callback = () => {
      showPanel();
    };
    PanelMenu.updateMenuOption(defaultMenuOption);
    let configList = [Component_Common()];
    Object.keys(GMTotal).forEach((keyName) => {
      let option = GMTotal[keyName].getUIOption();
      if (option) configList.push(option);
    });
    configList.push(new GrantTest_onurlchange().getUIOption());
    configList.push(new GrantTest_close().getUIOption());
    configList.push(new GrantTest_focus().getUIOption());
    PanelContent.addContentConfig(configList);
    Panel.$data.panelConfig = {
      style: `
		.success{
			color: green;
		}
		.error{
			color: red;
		}
		.warn,.warning{
			color: orange;
		}
		.info{
			color: #909090;
		}
		.support-info{
			font-weight: bold;
		}


		.gm-api-features-not-support,
		.gm-api-features-support{
			display: flex;
			gap: 8px;
			flex-wrap: wrap;
		}
		.gm-api-features-item{
			display: flex;
			align-items: center;
			width: 200px;
			max-width: 200px !important;
			justify-content: space-between;
			cursor: pointer;
			transition: all ease-out .1s;
			padding: 8px 16px;
			border-radius: 4px;
			font-size: 14px;
		}
		.gm-api-features-item:hover{
			box-shadow: 0 2px 5px 3px #0000001a;
		}
		.gm-api-features-item__label{
		}
		.gm-api-features-item__value span{
			display: flex;
			align-items: center;
		}
	`,
    };
    Panel.init();
    showPanel();
  }
})();