ニコニコ動画 引用コメントツール

dアニメストア ニコニコ支店の引用コメント関連のツール

// ==UserScript==
// @name         ニコニコ動画 引用コメントツール
// @namespace    https://midra.me
// @version      3.3.5
// @description  dアニメストア ニコニコ支店の引用コメント関連のツール
// @author       Midra
// @license      MIT
// @match        https://www.nicovideo.jp/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=nicovideo.jp
// @run-at       document-start
// @noframes
// @grant        unsafeWindow
// @grant        GM_addStyle
// @grant        GM.addStyle
// @grant        GM_getValue
// @grant        GM.getValue
// @grant        GM_setValue
// @grant        GM.setValue
// @grant        GM_deleteValue
// @grant        GM.deleteValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @connect      nicovideo.jp
// ==/UserScript==

"use strict";
(() => {
  var __defProp = Object.defineProperty;
  var __export = (target, all) => {
    for (var name in all)
      __defProp(target, name, { get: all[name], enumerable: true });
  };
  var __accessCheck = (obj, member, msg) => {
    if (!member.has(obj))
      throw TypeError("Cannot " + msg);
  };
  var __privateGet = (obj, member, getter) => {
    __accessCheck(obj, member, "read from private field");
    return getter ? getter.call(obj) : member.get(obj);
  };
  var __privateAdd = (obj, member, value) => {
    if (member.has(obj))
      throw TypeError("Cannot add the same private member more than once");
    member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
  };
  var __privateSet = (obj, member, value, setter) => {
    __accessCheck(obj, member, "write to private field");
    setter ? setter.call(obj, value) : member.set(obj, value);
    return value;
  };

  // src/window.ts
  var globalWindow;
  if (typeof unsafeWindow !== "undefined") {
    globalWindow = unsafeWindow;
  } else {
    try {
      const elem = document.createElement("div");
      elem.setAttribute("onclick", "return window");
      const result = elem.onclick(null);
      globalWindow = result || window;
    } catch {
      globalWindow = window;
    }
  }
  var origFetch = globalWindow.fetch;

  // ../../UserScript/Library/extensionAPI.ts
  var isChromeExtension = () => Boolean(window["ECT:isChromeExtension"]);
  var generateUID = () => `${Array.from(Array(10)).map(() => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[Math.random() * 62 | 0]).join("")}_${Date.now()}`;
  var StorageAPI = {
    get(keys) {
      return new Promise(async (resolve, reject) => {
        if (isChromeExtension()) {
          try {
            const uid = generateUID();
            const onMessage = ({ data }) => {
              if (data.type === "MIDEXT:storage:get:return" && data.uid === uid) {
                window.removeEventListener("message", onMessage);
                data.error ? reject() : resolve(data.value);
              }
            };
            window.addEventListener("message", onMessage);
            window.postMessage({
              type: "MIDEXT:storage:get",
              keys,
              uid
            });
            setTimeout(() => {
              window.removeEventListener("message", onMessage);
              reject();
            }, 2500);
          } catch (e) {
            reject(e);
          }
        } else {
          let getValue = null;
          try {
            getValue = GM_getValue;
          } catch {
            try {
              getValue = GM.getValue;
            } catch {
            }
          }
          try {
            const items = {};
            for (const key of Array.isArray(keys) ? keys : [keys]) {
              if (typeof getValue === "function") {
                items[key] = getValue(key);
                if (items[key] instanceof Promise) {
                  items[key] = await items[key];
                }
              } else {
                const localItem = localStorage.getItem(key);
                items[key] = localItem !== null ? JSON.parse(localItem) : void 0;
              }
            }
            if (Array.isArray(keys)) {
              resolve(items);
            } else {
              resolve(items[keys]);
            }
          } catch (e) {
            reject(e);
          }
        }
      });
    },
    set(key, value) {
      return new Promise(async (resolve, reject) => {
        if (isChromeExtension()) {
          try {
            const uid = generateUID();
            const onMessage = ({ data }) => {
              if (data.type === "MIDEXT:storage:set:return" && data.uid === uid) {
                window.removeEventListener("message", onMessage);
                data.error ? reject() : resolve();
              }
            };
            window.addEventListener("message", onMessage);
            window.postMessage({
              type: "MIDEXT:storage:set",
              key,
              value,
              uid
            });
            setTimeout(() => {
              window.removeEventListener("message", onMessage);
              reject();
            }, 2500);
          } catch (e) {
            reject(e);
          }
        } else {
          let setValue = null;
          try {
            setValue = GM_setValue;
          } catch {
            try {
              setValue = GM.setValue;
            } catch {
            }
          }
          try {
            if (typeof setValue === "function") {
              const result = setValue(key, value);
              if (result instanceof Promise) {
                await result;
              }
            } else {
              localStorage.setItem(key, JSON.stringify(value));
            }
            resolve();
          } catch (e) {
            reject(e);
          }
        }
      });
    },
    remove(keys) {
      return new Promise(async (resolve, reject) => {
        if (isChromeExtension()) {
          try {
            const uid = generateUID();
            const onMessage = ({ data }) => {
              if (data.type === "MIDEXT:storage:remove:return" && data.uid === uid) {
                window.removeEventListener("message", onMessage);
                data.error ? reject() : resolve();
              }
            };
            window.addEventListener("message", onMessage);
            window.postMessage({
              type: "MIDEXT:storage:remove",
              keys,
              uid
            });
            setTimeout(() => {
              window.removeEventListener("message", onMessage);
              reject();
            }, 2500);
          } catch (e) {
            reject(e);
          }
        } else {
          let deleteValue = null;
          try {
            deleteValue = GM_deleteValue;
          } catch {
            try {
              deleteValue = GM.deleteValue;
            } catch {
            }
          }
          try {
            for (const key of Array.isArray(keys) ? keys : [keys]) {
              if (typeof deleteValue === "function") {
                const result = deleteValue(key);
                if (result instanceof Promise) {
                  await result;
                }
              } else {
                localStorage.removeItem(key);
              }
            }
            resolve();
          } catch (e) {
            reject(e);
          }
        }
      });
    }
  };
  var FetchAPI = (input, init) => {
    return new Promise((resolve, reject) => {
      if (isChromeExtension()) {
        try {
          const uid = generateUID();
          const onMessage = ({ data }) => {
            if (data.type === "MIDEXT:fetch:return" && data.uid === uid) {
              window.removeEventListener("message", onMessage);
              data.error ? reject() : resolve(data.response);
            }
          };
          window.addEventListener("message", onMessage);
          window.postMessage({
            type: "MIDEXT:fetch",
            input,
            init,
            uid
          });
          setTimeout(() => {
            window.removeEventListener("message", onMessage);
            reject("timeout");
          }, 5e3);
        } catch (e) {
          reject(e);
        }
      } else {
        try {
          if (typeof GM_xmlhttpRequest === "function") {
            GM_xmlhttpRequest({
              method: init?.method || "GET",
              url: input,
              headers: init?.headers,
              onload: (e) => {
                if (e.readyState === XMLHttpRequest.DONE) {
                  const headers = {};
                  e.responseHeaders.trim().split(/[\r\n]+/).forEach((line) => {
                    const parts = line.split(": ");
                    const header = parts.shift();
                    const value = parts.join(": ");
                    headers[header] = value;
                  });
                  resolve(new Response(e.responseText, {
                    status: e.status,
                    statusText: e.statusText,
                    headers
                  }));
                } else {
                  reject(e);
                }
              },
              onerror: (e) => reject(e)
            });
            setTimeout(() => {
              reject("timeout");
            }, 5e3);
          } else {
            throw new Error();
          }
        } catch {
          reject();
        }
      }
    });
  };

  // src/constants.ts
  var ECT_ID = "extra-comment-tools";
  var ECT_VERSION = "3.3.5";
  var DANIME_CHANNEL_ID = "ch2632720";
  var WATCH_V3_API = "https://www.nicovideo.jp/api/watch/v3";
  var THREADS_API_1 = "https://nvcomment.nicovideo.jp/v1/threads";
  var THREADS_API_2 = "https://nv-comment.nicovideo.jp/v1/threads";
  var CHANNEL_VIDEO_DANIME_LINKS_API = "https://public-api.ch.nicovideo.jp/v1/user/channelVideoDAnimeLinks";
  var SEARCH_V2_API = "https://snapshot.search.nicovideo.jp/api/v2/snapshot/video/contents/search";
  var NICORU_KEYS_API = " https://nvapi.nicovideo.jp/v1/comment/keys/nicoru";
  var ECT_MENU_GROUP = `<div class="VideoContextMenu-group"></div>`;
  var ECT_MENUITEM = `<div class="ContextMenuItem">\u5F15\u7528\u30B3\u30E1\u30F3\u30C8\u30C4\u30FC\u30EB</div>`;
  var VIDEOPICKER_TEMPLATE = `
<template id="ECT-VideoPicker-Template">
  <div id="ECT-VideoPicker" class="ect-flex-column">
    <section id="ECT-Header" class="ect-flex-row">
      <h1>\u5F15\u7528\u30B3\u30E1\u30F3\u30C8\u30C4\u30FC\u30EB&nbsp;&nbsp;<span id="ECT-Version"></span></h1>
      <div id="ECT-Button-Setting">
        <svg width="25" height="25" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.954 2.213a9.99 9.99 0 0 1 4.091-.002A3.994 3.994 0 0 0 16 5.073a3.993 3.993 0 0 0 3.457.26A9.99 9.99 0 0 1 21.5 8.88a3.994 3.994 0 0 0-1.5 3.124 3.99 3.99 0 0 0 1.502 3.124 10.042 10.042 0 0 1-2.046 3.543 3.993 3.993 0 0 0-4.76 1.468 3.993 3.993 0 0 0-.65 1.653 9.992 9.992 0 0 1-4.09.004A3.993 3.993 0 0 0 8 18.93a3.992 3.992 0 0 0-3.457-.26A9.99 9.99 0 0 1 2.5 15.124a3.994 3.994 0 0 0 1.106-4.856 3.993 3.993 0 0 0-1.108-1.39 10.043 10.043 0 0 1 2.046-3.543 3.993 3.993 0 0 0 4.76-1.468 4 4 0 0 0 .65-1.653v-.001ZM12 15.003a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z"></path></svg>
      </div>
    </section>

    <section id="ECT-NowExtraVideo" class="ect-flex-column">
      <h1>\u5F15\u7528\u4E2D\u306E\u52D5\u753B</h1>
      <div id="ECT-VideoInfo" class="ect-flex-column">
        <h2 id="ECT-VideoInfo-title"></h2>
        <div class="ect-flex-row">
          <div id="ECT-VideoInfo-thumb">
            <a id="ECT-VideoInfo-link" target="_blank" rel="noopener noreferrer">
              <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.91667 4.75V6.33333H3.95833V15.0417H12.6667V11.0833H14.25V15.8333C14.25 16.0433 14.1666 16.2447 14.0181 16.3931C13.8697 16.5416 13.6683 16.625 13.4583 16.625H3.16667C2.9567 16.625 2.75534 16.5416 2.60687 16.3931C2.45841 16.2447 2.375 16.0433 2.375 15.8333V5.54167C2.375 5.3317 2.45841 5.13034 2.60687 4.98187C2.75534 4.83341 2.9567 4.75 3.16667 4.75H7.91667ZM16.625 2.375V8.70833H15.0417V5.07696L8.87221 11.2472L7.75279 10.1278L13.9215 3.95833H10.2917V2.375H16.625Z"/></svg>
            </a>
            <div id="ECT-VideoInfo-remove">
              <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.50002 8.37822L13.4188 4.45947L14.5382 5.57889L10.6194 9.49764L14.5382 13.4164L13.4188 14.5358L9.50002 10.6163L5.58127 14.535L4.46185 13.4156L8.3806 9.49685L4.46185 5.5781L5.58127 4.45947L9.50002 8.37822Z"/></svg>
            </div>
            <div id="ECT-VideoInfo-duration">--:--</div>
          </div>
          <div id="ECT-VideoInfo-info" class="ect-flex-column">
            <div class="ect-flex-row">
              <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 7.5H13.5V12.9C13.5 13.0591 13.4368 13.2117 13.3243 13.3243C13.2117 13.4368 13.0591 13.5 12.9 13.5H2.1C1.94087 13.5 1.78826 13.4368 1.67574 13.3243C1.56321 13.2117 1.5 13.0591 1.5 12.9V7.5ZM10.5 2.7H12.9C13.0591 2.7 13.2117 2.76321 13.3243 2.87574C13.4368 2.98826 13.5 3.14087 13.5 3.3V6.3H1.5V3.3C1.5 3.14087 1.56321 2.98826 1.67574 2.87574C1.78826 2.76321 1.94087 2.7 2.1 2.7H4.5V1.5H5.7V2.7H9.3V1.5H10.5V2.7Z"/></svg>
              <p id="ECT-VideoInfo-date">----/--/-- --:--</p>
            </div>
            <div class="ect-flex-row">
              <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.45 6.57087L3.74167 2.17946C3.00833 1.72202 2 2.17946 2 3.09433V11.9686C2 12.7005 2.91667 13.2495 3.83333 12.8835L12.45 8.30913C13.1833 7.94318 13.1833 7.0283 12.45 6.57087"/></svg>
              <p id="ECT-VideoInfo-view">0</p>
            </div>
            <div class="ect-flex-row">
              <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.91667 2C2.67355 2 2.44039 2.08906 2.26849 2.24759C2.09658 2.40612 2 2.62113 2 2.84532V8.93164C2 9.43884 2.45833 9.77696 2.91667 9.77696H4.75V12.5665C4.75 12.9892 5.025 13.1583 5.48333 12.8201L8.875 9.77696H12.0833C12.6333 9.77696 13 9.43884 13 8.93164V2.84532C13 2.33813 12.6333 2 12.0833 2H2.91667Z"/></svg>
              <p id="ECT-VideoInfo-comment">0</p>
            </div>
            <div class="ect-flex-row">
              <svg width="15" height="15" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5 2h14a1 1 0 0 1 1 1v19.143a.5.5 0 0 1-.766.424L12 18.03l-7.234 4.536A.5.5 0 0 1 4 22.143V3a1 1 0 0 1 1-1Z"></path></svg>
              <p id="ECT-VideoInfo-genre"></p>
            </div>
          </div>
        </div>
      </div>
      <div id="ECT-CommentOffset" class="ect-flex-column">
        <div class="ect-flex-row">
          <h2>\u30B3\u30E1\u30F3\u30C8\u306E\u30AA\u30D5\u30BB\u30C3\u30C8</h2>
          <div class="ect-flex-row">
            <input type="number" id="ECT-CommentOffset-input" autocomplete="on" list="ECT-CommentOffset-list">
            <span>\u79D2</span>
          </div>
        </div>
        <div id="ECT-CommentOffset-Area">
          <div id="ECT-CommentOffset-Area-Inner">
            <div id="ECT-CommentOffset-Area-target">
              <div id="ECT-CommentOffset-Area-target-inner"></div>
            </div>
            <div id="ECT-CommentOffset-Area-extra" style="--length: 80%; --offset: -15%;"></div>
          </div>
          <span id="ECT-CommentOffset-Area-Duration-start">0:00</span>
          <span id="ECT-CommentOffset-Area-Duration-end">24:10</span>
        </div>
      </div>
    </section>
    <section id="ECT-Search" class="ect-flex-column">
      <h1>\u691C\u7D22</h1>
      <div id="ECT-SearchBar" class="ect-flex-row">
        <input type="text" id="ECT-SearchBar-input" autocomplete="on" list="ECT-SearchBar-list" placeholder="\u691C\u7D22\u30AD\u30FC\u30EF\u30FC\u30C9\u304B\u52D5\u753B\u306EURL">
        <div id="ECT-SearchBar-button">
          <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.0206 11.078L14.876 13.9326L13.9326 14.876L11.078 12.0206C10.0158 12.8721 8.69465 13.3353 7.33331 13.3333C4.02131 13.3333 1.33331 10.6453 1.33331 7.33331C1.33331 4.02131 4.02131 1.33331 7.33331 1.33331C10.6453 1.33331 13.3333 4.02131 13.3333 7.33331C13.3353 8.69465 12.8721 10.0158 12.0206 11.078ZM10.6833 10.5833C11.5294 9.71324 12.0019 8.54693 12 7.33331C12 4.75465 9.91131 2.66665 7.33331 2.66665C4.75465 2.66665 2.66665 4.75465 2.66665 7.33331C2.66665 9.91131 4.75465 12 7.33331 12C8.54693 12.0019 9.71324 11.5294 10.5833 10.6833L10.6833 10.5833V10.5833Z"/></svg>
        </div>
      </div>
      <div id="ECT-SearchResult" class="ect-flex-column"></div>
      <div class="ect-loading">
        <svg width="50" height="50" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18.364 5.636 16.95 7.05A7 7 0 1 0 19 12h2a9 9 0 1 1-2.636-6.364Z"></path></svg>
      </div>
    </section>
    <div id="ECT-Buttons" class="ect-flex-row">
      <div id="ECT-Button-Close" class="ect-button ect-button--solid">\u9589\u3058\u308B</div>
      <div id="ECT-Button-Ok" class="ect-button ect-button--fill">\u6C7A\u5B9A</div>
    </div>
  </div>
</template>

<template id="ECT-SearchResult-Item-Template">
  <div class="ECT-SearchResult-Item ect-flex-column">
    <div class="ect-flex-row">
      <div class="ECT-SearchResult-Item-thumb">
        <div class="ECT-SearchResult-Item-duration">--:--</div>
      </div>
      <p class="ECT-SearchResult-Item-title"></p>
    </div>
    <div class="ECT-SearchResult-Item-info ect-flex-row">
      <div class="ect-flex-row">
        <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 7.5H13.5V12.9C13.5 13.0591 13.4368 13.2117 13.3243 13.3243C13.2117 13.4368 13.0591 13.5 12.9 13.5H2.1C1.94087 13.5 1.78826 13.4368 1.67574 13.3243C1.56321 13.2117 1.5 13.0591 1.5 12.9V7.5ZM10.5 2.7H12.9C13.0591 2.7 13.2117 2.76321 13.3243 2.87574C13.4368 2.98826 13.5 3.14087 13.5 3.3V6.3H1.5V3.3C1.5 3.14087 1.56321 2.98826 1.67574 2.87574C1.78826 2.76321 1.94087 2.7 2.1 2.7H4.5V1.5H5.7V2.7H9.3V1.5H10.5V2.7Z"/></svg>
        <p class="ECT-SearchResult-Item-date">----/--/-- --:--</p>
      </div>
      <div class="ect-flex-row">
        <div class="ect-flex-row">
          <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.45 6.57087L3.74167 2.17946C3.00833 1.72202 2 2.17946 2 3.09433V11.9686C2 12.7005 2.91667 13.2495 3.83333 12.8835L12.45 8.30913C13.1833 7.94318 13.1833 7.0283 12.45 6.57087"/></svg>
          <p class="ECT-SearchResult-Item-view">0</p>
        </div>
        <div class="ect-flex-row">
          <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.91667 2C2.67355 2 2.44039 2.08906 2.26849 2.24759C2.09658 2.40612 2 2.62113 2 2.84532V8.93164C2 9.43884 2.45833 9.77696 2.91667 9.77696H4.75V12.5665C4.75 12.9892 5.025 13.1583 5.48333 12.8201L8.875 9.77696H12.0833C12.6333 9.77696 13 9.43884 13 8.93164V2.84532C13 2.33813 12.6333 2 12.0833 2H2.91667Z"/></svg>
          <p class="ECT-SearchResult-Item-comment">0</p>
        </div>
      </div>
    </div>
  </div>
</template>
`;

  // src/style.ts
  var style_default = `#ECT-VideoPicker,#ECT-VideoPicker *,#ECT-VideoPicker ::after,#ECT-VideoPicker ::before{transition:150ms ease-in-out}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-info *,#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset h2,#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-info *,#ECT-VideoPicker .ect-button{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ect-flex-row{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center}.ect-flex-column{display:flex;flex-direction:column;flex-wrap:nowrap}.ect-popup{gap:10px;position:fixed;z-index:9999999;max-width:40vw;max-height:80px;padding:10px 15px;color:#fff;background-color:#2389ff;border-radius:8px;box-shadow:1px 1px 20px 0px rgba(0,0,0,.35);filter:opacity(0);overflow:hidden;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;will-change:filter;transition:250ms ease-in-out}.ect-popup--error{background-color:#ff3456}.ect-popup--x-left{left:50px}.ect-popup--x-center{left:50%;transform:translateX(-50%)}.ect-popup--x-right{right:50px}.ect-popup--y-top{top:50px}.ect-popup--y-bottom{bottom:50px}.ect-popup--show{filter:opacity(1)}.ect-popup--hidden{filter:opacity(0)}.ect-popup>*:empty{display:none}.ect-popup .ect-popup-icon{flex-shrink:0}.ect-popup .ect-popup-icon *{fill:#fff;color:#fff}.ect-popup .ect-popup-text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow-wrap:break-word;overflow:hidden}#midconfig-wrapper,#ECT-VideoPicker-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;background-color:rgba(0,0,0,.5019607843)}#midconfig-wrapper{z-index:9999998}#ECT-VideoPicker-wrapper{z-index:9999997}.midconfig-panel{width:550px;height:490px;position:fixed;top:50%;left:50%;transform:translate(-50%, -50%)}#ECT-VideoPicker{display:flex;flex-direction:column;flex-wrap:nowrap;position:fixed;bottom:20px;right:20px;justify-content:space-between;width:420px;height:800px;min-height:600px;max-height:90vh;border-radius:10px;background-color:var(--back1);border:1px solid var(--text3);box-shadow:1px 1px 10px -2px var(--text3);overflow:hidden}#ECT-VideoPicker{--accent1: #EB5528;--accent2: #EB552826;--accent3: #EB55281a;--accent-text: #fff;--back1: #fff;--back2: #e0e0e059;--back3: #e0e0e0bf;--text1: #3c3c3c;--text2: #8a8a8a;--text3: #e0e0e0;--red1: #ff3456;--red2: #ff345626;--font-size-Base: 14px;--font-size-L: calc(var(--font-size-Base) + 2px);--font-size-M: var(--font-size-Base);--font-size-S: calc(var(--font-size-Base) - 2px);--font-size-SS: calc(var(--font-size-Base) - 4px)}#ECT-VideoPicker[theme=dark]{--accent1: #EB5528;--accent2: #EB552836;--accent3: #EB55281a;--accent-text: #fff;--back1: #333;--back2: #50505059;--back3: #505050bf;--text1: #f1f1f1;--text2: #a0a0a0;--text3: #505050}@media(prefers-color-scheme: dark){#ECT-VideoPicker[theme=auto]{--accent1: #EB5528;--accent2: #EB552836;--accent3: #EB55281a;--accent-text: #fff;--back1: #333;--back2: #50505059;--back3: #505050bf;--text1: #f1f1f1;--text2: #a0a0a0;--text3: #505050}}#ECT-VideoPicker input[type=text],#ECT-VideoPicker input[type=number]{padding:0 10px;border:1px solid var(--text3);border-radius:8px;background-color:rgba(0,0,0,0)}#ECT-VideoPicker ::-webkit-scrollbar{width:10px}#ECT-VideoPicker ::-webkit-scrollbar-track{background-color:rgba(0,0,0,0)}#ECT-VideoPicker ::-webkit-scrollbar-thumb{background-color:var(--text2);border-left:5px solid rgba(0,0,0,0);background-clip:padding-box}#ECT-VideoPicker ::-moz-placeholder{color:var(--text2)}#ECT-VideoPicker ::placeholder{color:var(--text2)}#ECT-VideoPicker *{scrollbar-width:thin;scrollbar-color:var(--text2) rgba(0,0,0,0)}#ECT-VideoPicker,#ECT-VideoPicker *,#ECT-VideoPicker ::after,#ECT-VideoPicker ::before{margin:0;padding:0;box-sizing:border-box;font-family:-apple-system,sans-serif;font-size:var(--font-size-M);font-weight:400;color:var(--text1);fill:var(--text1)}#ECT-VideoPicker svg{display:inline-block;width:unset;height:unset;pointer-events:none}#ECT-VideoPicker input[type=text]:focus,#ECT-VideoPicker input[type=number]:focus{outline:none;border-color:var(--accent1)}#ECT-VideoPicker input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}#ECT-VideoPicker input[type=number]::-webkit-outer-spin-button,#ECT-VideoPicker input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none}#ECT-VideoPicker input::-webkit-calendar-picker-indicator{display:none !important}#ECT-VideoPicker .ect-button{display:inline-block;width:inherit;height:30px;line-height:30px;text-align:center;background-color:var(--back1);border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}#ECT-VideoPicker .ect-button:hover{filter:opacity(0.7)}#ECT-VideoPicker .ect-button:hover:active{filter:opacity(0.5)}#ECT-VideoPicker .ect-button--solid{color:var(--accent1)}#ECT-VideoPicker .ect-button--outline{line-height:28px;color:var(--accent1);border:1px solid var(--accent1)}#ECT-VideoPicker .ect-button--outline:hover{color:var(--accent-text);background-color:var(--accent1);filter:none}#ECT-VideoPicker .ect-button--outline:hover:active{filter:opacity(0.7)}#ECT-VideoPicker .ect-button--fill-alpha{color:var(--accent1);background-color:var(--accent2)}#ECT-VideoPicker .ect-button--fill{color:var(--accent-text);background-color:var(--accent1)}#ECT-VideoPicker .ect-button--solid-red{color:var(--red1)}#ECT-VideoPicker .ect-button--outline-red{line-height:28px;color:var(--red1);border:1px solid var(--red1)}#ECT-VideoPicker .ect-button--outline-red:hover{color:#fff;background-color:var(--red1);filter:none}#ECT-VideoPicker .ect-button--outline-red:hover:active{filter:opacity(0.7)}#ECT-VideoPicker .ect-button--fill-alpha-red{color:var(--red1);background-color:var(--red2)}#ECT-VideoPicker .ect-button--fill-red{color:#fff;background-color:var(--red1)}#ECT-VideoPicker .ect-loading{display:none;align-items:center;justify-content:center}#ECT-VideoPicker .ect-loading svg{will-change:transform;animation:ect-loading-animation 1.2s cubic-bezier(0.8, 0.4, 0.3, 0.8) infinite}#ECT-VideoPicker .ect-loading svg *{fill:var(--text2);color:var(--text2)}#ECT-VideoPicker .ect-isLoading>.ect-loading{display:flex}@keyframes ect-loading-animation{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-thumb,#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb{position:relative;aspect-ratio:16/9;background-color:#000;background-image:var(--thumb-url);background-repeat:no-repeat;background-size:cover;background-position:center;border:4px solid #252525;border-radius:8px}#ECT-VideoPicker h1{font-size:var(--font-size-L);font-weight:700;min-height:30px;line-height:30px}#ECT-VideoPicker h2{font-size:var(--font-size-M);font-weight:600;min-height:25px;line-height:25px}#ECT-VideoPicker h3{font-size:var(--font-size-S);font-weight:600}#ECT-VideoPicker ul{list-style:none}#ECT-VideoPicker>*{width:100%}#ECT-VideoPicker>section{padding:10px 10px 0}#ECT-VideoPicker #ECT-NowExtraVideo>h1,#ECT-VideoPicker #ECT-Search>h1{min-height:30px;line-height:30px;padding-left:5px;color:#fff;background:linear-gradient(90deg, var(--accent1), transparent);border:none;border-radius:8px 0 0 8px}#ECT-VideoPicker #ECT-Header{justify-content:space-between}#ECT-VideoPicker #ECT-Header #ECT-Button-Setting{display:flex;justify-content:center;align-items:center;width:30px;height:30px;cursor:pointer}#ECT-VideoPicker #ECT-Header #ECT-Button-Setting:hover svg *{fill:var(--accent1);color:var(--accent1)}#ECT-VideoPicker #ECT-NowExtraVideo{gap:10px}#ECT-VideoPicker #ECT-NowExtraVideo>h1~*{padding:0 5px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo{gap:5px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo>.ect-flex-row{gap:5px;justify-content:space-between;align-items:flex-start}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb{width:180px;min-width:180px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb *{font-size:var(--font-size-S);fill:#fff;color:#fff}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb>*{position:absolute;display:flex;align-items:center;justify-content:center}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-link{display:none;top:0;left:0;width:25px;height:25px;background-color:rgba(37,37,37,.5);border-radius:4px 0 6px 0;cursor:pointer}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-link[href^=http]{display:flex}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-link:hover{background-color:rgba(37,37,37,.75)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-remove{display:none;top:0;right:0;width:25px;height:25px;background-color:rgba(255,52,86,.5);border-radius:0 4px 0 6px;cursor:pointer}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-remove:hover{background-color:rgba(255,52,86,.75)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb #ECT-VideoInfo-duration{bottom:0;right:0;width:50px;height:25px;line-height:25px;text-align:center;background-color:rgba(37,37,37,.75);border-radius:6px 0 4px 0}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-thumb[style*="--thumb-url:"] #ECT-VideoInfo-remove{display:flex}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo[data-channel-id] #ECT-VideoInfo-thumb{border-color:#d9a300}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo[data-channel-id="2632720"] #ECT-VideoInfo-thumb,#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo[data-channel-id=ch2632720] #ECT-VideoInfo-thumb{border-color:#eb5528}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-info{gap:5px;width:100%}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-info *{font-size:var(--font-size-S)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-VideoInfo #ECT-VideoInfo-info .ect-flex-row{gap:5px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset{gap:5px;overflow:hidden}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset>.ect-flex-row{justify-content:space-between}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset>.ect-flex-row>.ect-flex-row{gap:5px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-input{width:60px;height:25px;padding:0;text-align:center}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area{position:relative;padding-bottom:20px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area>span{display:inline;position:absolute;bottom:0;width:40px;height:20px;line-height:20px;font-size:var(--font-size-SS);color:var(--text2);text-align:center}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area-Duration-start{left:calc(15% - 20px)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area-Duration-end{right:calc(15% - 20px)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner{position:relative;width:calc(100% - 2px);height:23px;border:1px solid var(--text3);box-sizing:content-box;overflow:hidden;z-index:1}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner>*{position:absolute;height:23px}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner::before,#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner::after{content:"";display:block;position:absolute;width:1px;width:30.5%;height:23px;background-color:var(--text3);z-index:2}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner::before{left:15%;border-left:1px solid var(--text2)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner::after{right:15%;border-right:1px solid var(--text2)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner #ECT-CommentOffset-Area-target{display:flex;align-items:center;justify-content:center;left:15%;width:70%}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner #ECT-CommentOffset-Area-target #ECT-CommentOffset-Area-target-inner{width:12%;height:calc(100% + 2px);border-top:1px dashed var(--back1);border-bottom:1px dashed var(--back1)}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner #ECT-CommentOffset-Area-extra{left:var(--offset, 15%);width:var(--length, 0%);border-left:3px solid var(--accent1);border-right:3px solid var(--accent1);background-color:var(--accent2);z-index:3}#ECT-VideoPicker #ECT-NowExtraVideo #ECT-CommentOffset #ECT-CommentOffset-Area #ECT-CommentOffset-Area-Inner #ECT-CommentOffset-Area-extra:not([style*="--length:"]){display:none}#ECT-VideoPicker #ECT-Search{position:relative;height:100%;overflow:hidden}#ECT-VideoPicker #ECT-Search.ect-isLoading>div:not(.ect-loading){filter:opacity(0.5)}#ECT-VideoPicker #ECT-Search #ECT-SearchBar{padding:10px 0;border-bottom:1px solid var(--text3)}#ECT-VideoPicker #ECT-Search #ECT-SearchBar #ECT-SearchBar-input{width:100%;height:32px;border-right-width:0;border-radius:8px 0 0 8px}#ECT-VideoPicker #ECT-Search #ECT-SearchBar #ECT-SearchBar-button{display:flex;align-items:center;justify-content:center;width:32px;min-width:32px;height:32px;min-height:32px;background-color:var(--accent1);border-radius:0 8px 8px 0;cursor:pointer}#ECT-VideoPicker #ECT-Search #ECT-SearchBar #ECT-SearchBar-button svg *{fill:var(--accent-text);color:var(--accent-text)}#ECT-VideoPicker #ECT-Search #ECT-SearchBar #ECT-SearchBar-button:hover{filter:opacity(0.7)}#ECT-VideoPicker #ECT-Search #ECT-SearchBar #ECT-SearchBar-button:hover:active{filter:opacity(0.5)}#ECT-VideoPicker #ECT-Search #ECT-SearchResult{gap:5px;overflow-y:auto;padding:10px 0}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ect-flex-row,#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ect-flex-column{gap:5px}#ECT-VideoPicker #ECT-Search #ECT-SearchResult.ect-isLoading #ECT-SearchResult-Items{filter:opacity(0.4)}#ECT-VideoPicker #ECT-Search #ECT-SearchResult:empty{display:none}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item{padding:5px;border:2px solid var(--back3);border-radius:8px;cursor:pointer}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item--selected{border-color:var(--accent1);background-color:var(--accent3);cursor:none;pointer-events:none}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item:not(#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item--selected):hover{background-color:var(--back2)}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item:not(#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item--selected):hover:active{background-color:var(--back3)}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item>.ect-flex-row:first-child{align-items:flex-start}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-thumb{border-width:2px;border-radius:6px;width:90px;min-width:90px}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-thumb .ECT-SearchResult-Item-duration{position:absolute;bottom:0;right:0;width:40px;height:20px;line-height:20px;text-align:center;font-size:var(--font-size-SS);color:#fff;background-color:rgba(37,37,37,.75);border-radius:6px 0 4px 0}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item[data-channel-id] .ECT-SearchResult-Item-thumb{border-color:#d9a300}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item[data-channel-id="2632720"] .ECT-SearchResult-Item-thumb,#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item[data-channel-id=ch2632720] .ECT-SearchResult-Item-thumb{border-color:#eb5528}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-title{width:calc(100% - 90px);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;font-size:var(--font-size-M);line-height:1.4}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-info *{font-size:var(--font-size-S)}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-info .ect-flex-row{width:50%}#ECT-VideoPicker #ECT-Search #ECT-SearchResult .ECT-SearchResult-Item .ECT-SearchResult-Item-info>.ect-flex-row:last-child{justify-content:space-between}#ECT-VideoPicker #ECT-Search .ect-loading{position:absolute;top:43px;bottom:0;left:0;right:0}#ECT-VideoPicker #ECT-Buttons{justify-content:space-between;padding:5px;border-top:1px solid var(--text3)}#ECT-VideoPicker #ECT-Buttons>.ect-button{width:33.3333333333%}`;

  // src/apis/getVideoData.ts
  var getVideoData = async (videoId) => {
    if (videoId === void 0) {
      throw new Error("[ECT] ERROR: videoId is undefined");
    }
    try {
      const requestQuery = {
        actionTrackId: `${Array.from(Array(10)).map(() => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[Math.random() * 62 | 0]).join("")}_${Date.now()}`
      };
      const res = await origFetch(`${WATCH_V3_API}/${videoId}?${new URLSearchParams(requestQuery)}`, {
        method: "GET",
        headers: {
          "x-frontend-id": "6",
          "x-frontend-version": "0"
        }
      });
      if (res.ok) {
        const json = await res.json();
        if (json.data !== void 0) {
          return json.data;
        }
      }
    } catch (e) {
      throw new Error(e);
    }
  };
  var getVideoData_default = getVideoData;

  // src/apis/getThreads.ts
  var getThreads = async (videoData, when) => {
    if (videoData === void 0) {
      throw new Error("[ECT] ERROR: videoData is undefined");
    }
    try {
      const res = await origFetch(THREADS_API_2, {
        method: "POST",
        headers: {
          "x-client-os-type": "others",
          "x-frontend-id": "6",
          "x-frontend-version": "0"
        },
        body: JSON.stringify({
          additionals: {
            when: typeof when === "number" ? when : void 0
          },
          params: videoData.comment?.nvComment?.params || {},
          threadKey: videoData.comment?.nvComment?.threadKey
        })
      });
      if (res.ok) {
        const json = await res.json();
        if (json?.data !== void 0) {
          return json.data.threads;
        }
      }
    } catch (e) {
      throw new Error(e);
    }
    throw new Error("[ECT] ERROR: getThreads");
  };
  var getThreads_default = getThreads;

  // src/apis/getLinkedVideoId.ts
  var getLinkedVideoId = async (videoId) => {
    if (videoId === void 0) {
      throw new Error("[ECT] ERROR: videoId is undefined");
    }
    try {
      const requestQuery = {
        videoId,
        _frontendId: "6"
      };
      const res = await origFetch(`${CHANNEL_VIDEO_DANIME_LINKS_API}?${new URLSearchParams(requestQuery)}`);
      if (res.ok) {
        const json = await res.json();
        if (json.data !== void 0) {
          return json.data.items[0].linkedVideoId;
        }
      }
    } catch (e) {
      throw new Error(e);
    }
    throw new Error("[ECT] ERROR: getLinkedVideoId");
  };
  var getLinkedVideoId_default = getLinkedVideoId;

  // src/apis/getNicoruKey.ts
  var getNicoruKey = async (threadId, fork) => {
    if (threadId === void 0 || fork === void 0) {
      throw new Error("[ECT] ERROR: threadId or fork is undefined");
    }
    try {
      const requestQuery = {
        threadId,
        fork
      };
      const res = await origFetch(`${NICORU_KEYS_API}?${new URLSearchParams(requestQuery)}`, {
        method: "GET",
        headers: {
          "x-frontend-id": "6",
          "x-frontend-version": "0"
        },
        credentials: "include"
      });
      if (res.ok) {
        const json = await res.json();
        if (json.data !== void 0) {
          return json.data.nicoruKey;
        }
      }
    } catch (e) {
      throw new Error(e);
    }
    throw new Error("[ECT] ERROR: getNicoruKey");
  };
  var getNicoruKey_default = getNicoruKey;

  // src/utils/getDocElem.ts
  var getDocElem = (name) => {
    return name === "head" && document.head || name === "body" && document.body || document.documentElement;
  };
  var getDocElem_default = getDocElem;

  // src/utils/injectStyle.ts
  var injectStyle = (css) => {
    const style = document.createElement("style");
    style.textContent = css;
    getDocElem_default("head").appendChild(style);
  };
  var injectStyle_default = injectStyle;

  // src/utils/generateDocumentByHTML.ts
  var generateDocumentByHTML = (html) => {
    const elem = document.createElement("html");
    elem.insertAdjacentHTML("beforeend", html);
    return elem;
  };
  var generateDocumentByHTML_default = generateDocumentByHTML;

  // src/utils/generateElementByHTML.ts
  var generateElementByHTML = (html) => {
    const elem = document.createElement("div");
    elem.insertAdjacentHTML("beforeend", html);
    return elem.firstElementChild;
  };
  var generateElementByHTML_default = generateElementByHTML;

  // src/utils/filterObject.ts
  var filterObject = (obj) => {
    if (obj !== null && obj !== void 0 && typeof obj === "object" && !Array.isArray(obj)) {
      for (const key of Object.keys(obj)) {
        if (obj[key] === null || obj[key] === void 0) {
          delete obj[key];
        } else {
          filterObject(obj[key]);
        }
      }
    }
  };
  var filterObject_default = filterObject;

  // src/utils/convertToRoman.ts
  var convertToRoman = (num) => {
    const decimal = [1e3, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
    const romanNumeral = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];
    let result = "";
    decimal.forEach((val, idx) => {
      while (val <= num) {
        result += romanNumeral[idx];
        num -= val;
      }
    });
    return result || num.toString();
  };
  var convertToRoman_default = convertToRoman;

  // src/utils/fixRomanNum.ts
  var fixRomanNum = (str) => {
    const ronamNum = [null, "\u2170", "\u2171", "\u2172", "\u2173", "\u2174", "\u2175", "\u2176", "\u2177", "\u2178", "\u2179", "\u217A", "\u217B"];
    return str.replace(/[ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻ]/, (char) => {
      const idx = ronamNum.indexOf(char);
      return idx !== -1 ? convertToRoman_default(Number(idx)).toLowerCase() : char;
    });
  };
  var fixRomanNum_default = fixRomanNum;

  // src/utils/normalizeText.ts
  var normalizeText = (text, isLowerCase = true) => {
    if (isLowerCase) {
      text = text.toLowerCase();
    }
    text = fixRomanNum_default(text);
    text = text.replace(/[-−\(\)()「」「」『』【】[]〈〉《》〔〕{}{}\[\]]/g, " ");
    text = text.replace(/[a-z0-9]/g, (s) => String.fromCharCode(s.charCodeAt(0) - 65248));
    text = text.replace(/./g, (s) => ({
      "\u301C": "~",
      "\uFF1F": "?",
      "\uFF01": "!",
      "\u201D": '"',
      "\u2019": "'",
      "\xB4": "'",
      "\uFF40": "`",
      "\uFF1A": ":",
      "\uFF0C": ",",
      "\uFF0E": ".",
      "\u30FB": "\uFF65",
      "\uFF0F": "/",
      "\uFF03": "#",
      "\uFF04": "$",
      "\uFF05": "%",
      "\uFF06": "&",
      "\uFF1D": "=",
      "\uFF20": "@"
    })[s] || s);
    text = text.replace(/\s+/g, " ").trim();
    return text;
  };
  var normalizeText_default = normalizeText;

  // src/utils/extractWorkTitle.ts
  var extractWorkTitle = (title) => {
    title = normalizeText_default(title, false);
    const splitedTitle = title.split(" ");
    if (splitedTitle.length === 3) {
      const num = Number(splitedTitle[1]);
      if (Number.isFinite(num)) {
        splitedTitle[1] = `${num}\u8A71`;
        title = splitedTitle.join(" ");
      }
    }
    title = title.replace(/第?(\d+|[一二三四五六七八九十百千万]+)話|episode(\d+)|#(\d+)/g, "{EPISODE_NUMBER}");
    return title.split("{EPISODE_NUMBER}")[0].trim();
  };
  var extractWorkTitle_default = extractWorkTitle;

  // src/utils/zeroPadding.ts
  var zeroPadding = (num, len) => {
    const zeroStr = Array.from(Array(len)).map(() => "0").join("");
    return (zeroStr + num).slice(len * -1);
  };
  var zeroPadding_default = zeroPadding;

  // src/utils/numberToKansuji.ts
  var numberToKansuji = (num) => {
    let result = "";
    if (typeof num === "number" && 0 < num && num < 1e5) {
      const kansujiA = ["", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D"];
      const kansujiB = ["", "\u5341", "\u767E", "\u5343", "\u4E07"];
      const numAry = Array.from(num.toString()).map((v) => Number(v));
      numAry.reverse().forEach((n, idx, ary) => {
        if (n === 0) {
          return;
        } else if (idx === 0) {
          result = `${kansujiA[n]}${result}`;
        } else if (n === 1) {
          if (3 <= idx && 5 <= ary.length) {
            result = `${kansujiA[n]}${kansujiB[idx]}${result}`;
          } else {
            result = `${kansujiB[idx]}${result}`;
          }
        } else {
          result = `${kansujiA[n]}${kansujiB[idx]}${result}`;
        }
      });
    }
    return result !== "" ? result : null;
  };
  var numberToKansuji_default = numberToKansuji;

  // src/utils/kansujiToNumber.ts
  var kansujiToNumber = (kansuji) => {
    let result = 0;
    if (typeof kansuji === "string") {
      const kansujiA = ["", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u4E03", "\u516B", "\u4E5D"];
      const kansujiB = ["", "\u5341", "\u767E", "\u5343", "\u4E07"];
      const numberB = [1, 10, 100, 1e3, 1e4];
      let isKansuji = false;
      const kansujiAry = Array.from(kansuji);
      for (const char of kansujiAry) {
        isKansuji || (isKansuji = Boolean([...kansujiA, ...kansujiB].find((v) => v === char)));
      }
      if (isKansuji) {
        kansujiAry.forEach((char, idx, ary) => {
          if (char === null) {
            return;
          }
          const idxA = kansujiA.findIndex((v) => v === char);
          const idxB = kansujiB.findIndex((v) => v === char);
          if (idxA !== -1) {
            if (idx + 1 < kansujiAry.length) {
              const nextIdxB = kansujiB.findIndex((v) => v === ary[idx + 1]);
              if (nextIdxB !== -1) {
                result += idxA * numberB[nextIdxB];
                ary[idx + 1] = null;
              }
            } else {
              result += idxA;
            }
          }
          if (idxB !== -1) {
            if (idx + 1 < kansujiAry.length) {
              const nextIdxB = kansujiB.findIndex((v) => v === ary[idx + 1]);
              if (nextIdxB !== -1) {
                result += numberB[idxB] * numberB[nextIdxB];
                ary[idx + 1] = null;
              } else {
                result += numberB[idxB];
              }
            } else {
              result += numberB[idxB];
            }
          }
        });
      }
    }
    return 0 < result ? result : null;
  };
  var kansujiToNumber_default = kansujiToNumber;

  // src/utils/optimizeEpisodeNumberForSearch.ts
  var optimizeEpisodeNumberForSearch = (title) => {
    const splitedTitle = title.split(" ");
    if (splitedTitle.length === 3) {
      const num = Number(splitedTitle[1]);
      if (Number.isFinite(num)) {
        splitedTitle[1] = `${num}\u8A71`;
        title = splitedTitle.join(" ");
      }
    }
    title = title.replace(/第?(\d+|[一二三四五六七八九十百千万]+)話|episode(\d+)|#(\d+)/g, (_, p1, p2, p3) => {
      let num = Number(p1 || p2 || p3);
      if (Number.isNaN(num)) {
        num = kansujiToNumber_default(p1);
      }
      if (num < 10) {
        return ` ${num} OR ${zeroPadding_default(num, 2)} OR ${numberToKansuji_default(num)} `;
      } else {
        return ` ${num} OR ${numberToKansuji_default(num)} `;
      }
    });
    title = title.replace(/\s+/g, " ").trim();
    return title;
  };
  var optimizeEpisodeNumberForSearch_default = optimizeEpisodeNumberForSearch;

  // src/utils/optimizeTitleForSearch.ts
  var optimizeTitleForSearch = (title) => {
    if (typeof title === "string") {
      title = normalizeText_default(title);
      title = optimizeEpisodeNumberForSearch_default(title);
      title = title.replace(/\s+/g, " ").trim();
      return title;
    } else {
      return "";
    }
  };
  var optimizeTitleForSearch_default = optimizeTitleForSearch;

  // src/utils/normalizeEpisodeNumber.ts
  var normalizeEpisodeNumber = (str) => {
    return str.replace(/第?(\d+|[一二三四五六七八九十百千万]+)話|episode(\d+)|#(\d+)|\s(\d+)\s/g, (_, p1, p2, p3, p4) => {
      const num = Number(p1 || p2 || p3 || p4);
      if (Number.isFinite(num)) {
        return num.toString();
      } else {
        return kansujiToNumber_default(p1).toString();
      }
    });
  };
  var normalizeEpisodeNumber_default = normalizeEpisodeNumber;

  // src/utils/isEqualTitle.ts
  var isEqualTitle = (titleA, titleB) => {
    let result = false;
    if (typeof titleA === "string" && titleA !== "" && typeof titleB === "string" && titleB !== "") {
      result = titleA === titleB;
      if (!result) {
        titleA = normalizeText_default(titleA);
        titleA = normalizeEpisodeNumber_default(titleA);
        titleA = titleA.replace(/\s+/g, "").trim();
        titleB = normalizeText_default(titleB);
        titleB = normalizeEpisodeNumber_default(titleB);
        titleB = titleB.replace(/\s+/g, "").trim();
        result = titleA === titleB;
      }
    }
    return result;
  };
  var isEqualTitle_default = isEqualTitle;

  // src/utils/reloadComment.ts
  var reloadComment = () => {
    const commentTab = getDocElem_default("body").getElementsByClassName("PlayerPanelContainer-tabItem")[0];
    commentTab?.click();
    setTimeout(() => {
      const reloadButton = getDocElem_default("body").getElementsByClassName("ReloadButton")[0];
      reloadButton?.click();
    }, 100);
  };
  var reloadComment_default = reloadComment;

  // src/utils/formatDuration.ts
  var formatDuration = (seconds) => {
    return `${zeroPadding_default(Math.floor(seconds / 60), 2)}:${zeroPadding_default(Math.floor(seconds % 60), 2)}`;
  };
  var formatDuration_default = formatDuration;

  // src/utils/formatDate.ts
  var formatDate = (date) => {
    if (typeof date === "string") {
      date = new Date(date);
    }
    if (Number.isNaN(date.getTime())) {
      return "----/--/-- --:--";
    }
    let result = `${date.getFullYear()}/${zeroPadding_default(date.getMonth() + 1, 2)}/${zeroPadding_default(date.getDate(), 2)}`;
    result += ` ${zeroPadding_default(date.getHours(), 2)}:${zeroPadding_default(date.getMinutes(), 2)}`;
    return result;
  };
  var formatDate_default = formatDate;

  // src/utils/popup.ts
  var POPUP = `
<div class="ect-popup ect-flex-row">
  <div class="ect-popup-icon"></div>
  <div class="ect-popup-text"></div>
</div>
`;
  var ICON_INFORMATION = '<svg width="25" height="25" viewBox="0 0 24 24" fill="#ffffff" xmlns="http://www.w3.org/2000/svg"><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10Zm0-2a8 8 0 1 0 0-16.001A8 8 0 0 0 12 20ZM11 7h2v2h-2V7Zm0 4h2v6h-2v-6Z"></path></svg>';
  var ICON_ERROR_WARNING = '<svg width="25" height="25" viewBox="0 0 24 24" fill="#ffffff" xmlns="http://www.w3.org/2000/svg"><path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10Zm0-2a8 8 0 1 0 0-16.001A8 8 0 0 0 12 20Zm-1-5h2v2h-2v-2Zm0-8h2v6h-2V7Z"></path></svg>';
  var hide = (elm) => {
    elm.classList.remove("ect-popup--show");
    elm.classList.add("ect-popup--hidden");
    setTimeout(() => elm.remove(), 500);
  };
  var popup = (text, option = {
    positionX: "center",
    positionY: "top",
    type: "default",
    duration: 3e3
  }) => {
    Array.from(document.querySelectorAll(".ect-popup")).forEach(
      (elm) => hide(elm)
    );
    const popup2 = generateElementByHTML_default(POPUP);
    popup2.classList.add(`ect-popup--x-${option.positionX}`);
    popup2.classList.add(`ect-popup--y-${option.positionY}`);
    popup2.querySelector(".ect-popup-text").textContent = text;
    if (option.type === "warning") {
      popup2.classList.add("ect-popup--error");
      popup2.querySelector(".ect-popup-icon").insertAdjacentHTML("beforeend", ICON_ERROR_WARNING);
    } else {
      popup2.querySelector(".ect-popup-icon").insertAdjacentHTML("beforeend", ICON_INFORMATION);
    }
    popup2.addEventListener("click", () => hide(popup2));
    const visibleDuration = document.body.classList.contains("is-fullscreen") ? option.duration / 2 : option.duration;
    setTimeout(() => {
      popup2.classList.add("ect-popup--show");
      setTimeout(() => hide(popup2), visibleDuration);
    }, 100);
    document.body.appendChild(popup2);
  };
  var popup_default = popup;

  // src/apis/searchVideo.ts
  var searchVideo = async (query) => {
    if (query === void 0) {
      throw new Error("[ECT] ERROR: query is undefined");
    }
    try {
      const requestQuery = {
        q: query.q,
        targets: query.targets.join(),
        fields: query.fields?.join() || ["contentId", "title", "channelId", "lengthSeconds", "tags"].join(),
        _sort: query._sort || "+startTime",
        _offset: query._offset,
        _limit: query._limit || "5",
        _context: "ect"
      };
      if (query.filters !== void 0) {
        for (const val of Object.entries(query.filters)) {
          if (Array.isArray(val[1]) && val[1].length === 2) {
            if (val[1][0] !== null) {
              requestQuery[`filters[${val[0]}][gte]`] = val[1][0];
            }
            if (val[1][1] !== null) {
              requestQuery[`filters[${val[0]}][lte]`] = val[1][1];
            }
          } else if (val[1] !== null) {
            requestQuery[`filters[${val[0]}][0]`] = val[1];
          }
        }
      }
      filterObject_default(requestQuery);
      const res = await FetchAPI(`${SEARCH_V2_API}?${new URLSearchParams(requestQuery)}`, {
        method: "GET",
        headers: {
          "User-Agent": "ECT/1.0"
        }
      });
      if (res.ok) {
        let json;
        if (res instanceof Response) {
          json = await res.json();
        } else {
          json = res.json;
        }
        if (json?.data !== void 0) {
          return json.data;
        }
      }
    } catch (e) {
      throw new Error(e);
    }
    throw new Error("[ECT] ERROR: searchVideo");
  };
  var searchVideo_default = searchVideo;

  // ../../UserScript/Library/MidConfig/src/types.ts
  var isConfigItemData = (data) => {
    if (data != null && typeof data === "object" && !Array.isArray(data)) {
      return Object.keys(data).length === 3 && data.hasOwnProperty("checked") && data.hasOwnProperty("value") && data.hasOwnProperty("default");
    }
    return false;
  };
  var isConfigJsonData = (data) => {
    if (data != null && typeof data === "object" && !Array.isArray(data)) {
      return Object.keys(data).length === 2 && data.hasOwnProperty("version") && data.hasOwnProperty("data");
    }
    return false;
  };

  // ../../UserScript/Library/MidConfig/src/constants.ts
  var SVG_CHECKMARK = '<svg class="midconfig-svg-checkmark" width="16" height="16" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9.86 17.997a1.002 1.002 0 0 1-.73-.32l-4.86-5.17a1.001 1.001 0 0 1 1.46-1.37l4.12 4.39 8.41-9.2a1 1 0 1 1 1.48 1.34l-9.14 10a1.002 1.002 0 0 1-.73.33h-.01Z"></path></svg>';
  var SVG_ARROW_DOWN = '<svg class="midconfig-svg-arrow-down" width="30" height="30" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 16.001a1 1 0 0 1-.64-.23l-6-5a1.001 1.001 0 0 1 1.28-1.54l5.36 4.48 5.36-4.32a1 1 0 0 1 1.41.15 1 1 0 0 1-.14 1.46l-6 4.83a1 1 0 0 1-.63.17Z"></path></svg>';
  var STYLE = '#midconfig{display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:space-between;width:100%;height:100%;border-radius:10px;background-color:var(--back1);border:1px solid var(--text3);box-shadow:1px 1px 10px -2px var(--text3);overflow:hidden}#midconfig{--accent1: #2389ff;--accent2: #238aff26;--accent-text: #fff;--back1: #fff;--text1: #3c3c3c;--text2: #8a8a8a;--text3: #e0e0e0;--red1: #ff3456;--red2: #ff345626}#midconfig[theme=dark]{--accent1: #298cff;--accent2: #298cff36;--accent-text: #fff;--back1: #333;--text1: #f1f1f1;--text2: #a0a0a0;--text3: #505050}@media(prefers-color-scheme: dark){#midconfig[theme=auto]{--accent1: #298cff;--accent2: #298cff36;--accent-text: #fff;--back1: #333;--text1: #f1f1f1;--text2: #a0a0a0;--text3: #505050}}#midconfig #midconfig,#midconfig *,#midconfig ::after,#midconfig ::before{transition:150ms ease-in-out}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=text],#midconfig .midconfig-select-container>select{padding:0 10px;border:1px solid var(--text3);border-radius:8px;background-color:rgba(0,0,0,0)}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-label-container>label>span,#midconfig .midconfig-main>.midconfig-page-item .midconfig-group>.midconfig-group-header>span,#midconfig .midconfig-tab>.midconfig-tab-item,#midconfig .midconfig-button,#midconfig .midconfig-select-container>select{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}#midconfig ::-webkit-scrollbar{width:7px}#midconfig ::-webkit-scrollbar-track{background-color:rgba(0,0,0,0);margin:1px 0}#midconfig ::-webkit-scrollbar-thumb{background-color:var(--text2);border-radius:3px;border-right:1px solid rgba(0,0,0,0);border-left:1px solid rgba(0,0,0,0);background-clip:padding-box}#midconfig *{scrollbar-width:thin;scrollbar-color:var(--text2) rgba(0,0,0,0)}#midconfig,#midconfig *,#midconfig ::after,#midconfig ::before{margin:0;padding:0;box-sizing:border-box;font-family:-apple-system,sans-serif;font-size:14px;font-weight:400;color:var(--text1)}#midconfig :not(input){-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#midconfig svg{display:inline-block;fill:var(--text2);pointer-events:none}#midconfig input{-webkit-appearance:none;-moz-appearance:none;appearance:none}#midconfig input[type=checkbox]{display:none}#midconfig input[type=checkbox]+label{cursor:pointer}#midconfig input[type=checkbox]+label>svg.midconfig-svg-checkmark{width:16px;height:16px;min-width:16px;min-height:16px;margin:2px;border:2px solid var(--text3);border-radius:4px;fill:rgba(0,0,0,0);transition-property:background-color,border}#midconfig input[type=checkbox]:checked+label>svg.midconfig-svg-checkmark{background-color:var(--accent1);border:none;fill:var(--accent-text)}#midconfig .midconfig-select-container{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;position:relative}#midconfig .midconfig-select-container>select{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:100%}#midconfig .midconfig-select-container>select:focus{outline:none}#midconfig .midconfig-select-container>svg.midconfig-svg-arrow-down{position:absolute;top:3px;right:3px;width:24px;height:24px;min-width:24px;min-height:24px}#midconfig .midconfig-button-container{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;width:100%}#midconfig .midconfig-button-container__disable>.midconfig-button,#midconfig .midconfig-button-container.midconfig-button-empty>.midconfig-button{opacity:.25;pointer-events:none}#midconfig .midconfig-button{display:inline-block;width:inherit;height:30px;line-height:30px;text-align:center;background-color:var(--back1);border-radius:8px;cursor:pointer}#midconfig .midconfig-button:hover{filter:opacity(0.7)}#midconfig .midconfig-button:hover:active{filter:opacity(0.5)}#midconfig .midconfig-button--solid{color:var(--accent1)}#midconfig .midconfig-button--outline{line-height:28px;color:var(--accent1);border:1px solid var(--accent1)}#midconfig .midconfig-button--outline:hover{color:var(--accent-text);background-color:var(--accent1);filter:none}#midconfig .midconfig-button--outline:hover:active{filter:opacity(0.7)}#midconfig .midconfig-button--fill-alpha{color:var(--accent1);background-color:var(--accent2)}#midconfig .midconfig-button--fill{color:var(--accent-text);background-color:var(--accent1)}#midconfig .midconfig-button--solid-red{color:var(--red1)}#midconfig .midconfig-button--outline-red{line-height:28px;color:var(--red1);border:1px solid var(--red1)}#midconfig .midconfig-button--outline-red:hover{color:#fff;background-color:var(--red1);filter:none}#midconfig .midconfig-button--outline-red:hover:active{filter:opacity(0.7)}#midconfig .midconfig-button--fill-alpha-red{color:var(--red1);background-color:var(--red2)}#midconfig .midconfig-button--fill-red{color:#fff;background-color:var(--red1)}#midconfig>*{width:100%}#midconfig .midconfig-tab{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:5px;padding:5px 5px 0;border-bottom:1px solid var(--text3)}#midconfig .midconfig-tab>.midconfig-tab-item{display:inline-block;width:inherit;height:30px;line-height:30px;padding:0 0 5px;text-align:center;color:var(--text2);cursor:pointer;box-sizing:content-box}#midconfig .midconfig-tab>.midconfig-tab-item::after{content:"";display:block;position:relative;top:1px;width:100%;height:4px;background-color:var(--accent1);border-radius:2px;opacity:0}#midconfig .midconfig-tab>.midconfig-tab-item__selected{font-weight:600;color:var(--accent1)}#midconfig .midconfig-tab>.midconfig-tab-item__selected::after{opacity:1}#midconfig .midconfig-main{height:100%;padding:10px 8px 10px 10px;overflow-y:scroll}#midconfig .midconfig-main>.midconfig-page-item{display:none}#midconfig .midconfig-main>.midconfig-page-item__selected{display:flex;flex-direction:column;flex-wrap:nowrap;gap:5px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group>.midconfig-group-header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;height:30px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group>.midconfig-group-header>svg.midconfig-svg-arrow-down{width:30px;height:inherit;max-width:30px;max-height:30px;min-width:30px;min-height:30px;transform:scale(-1, -1)}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group>.midconfig-group-items{display:flex;flex-direction:column;flex-wrap:nowrap;gap:5px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group>.midconfig-group-items>.midconfig-item>.midconfig-label-container{padding-left:15px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group.midconfig-accordion>.midconfig-group-header{cursor:pointer}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group.midconfig-accordion__close>.midconfig-group-header>svg.midconfig-svg-arrow-down{transform:scale(1, 1)}#midconfig .midconfig-main>.midconfig-page-item .midconfig-group.midconfig-accordion__close>.midconfig-group-items{display:none}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;gap:5px;height:30px;overflow:hidden}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item:not(.midconfig-item-checkbox)>*{width:50%;overflow:hidden}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>*{width:100%;height:inherit}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>*>*{width:100%;height:inherit}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-label-container>label{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:5px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:5px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=text]:focus{outline:none;border-color:var(--accent1)}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=color]{width:30px;height:30px;min-width:30px;min-height:30px;border:none;border-radius:50%;overflow:hidden;cursor:pointer}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=color]::-webkit-color-swatch-wrapper{padding:0}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=color]::-moz-color-swatch-wrapper{padding:0}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=color]::-webkit-color-swatch{border:1px solid var(--text3);border-radius:50%}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=color]::-moz-color-swatch{border:1px solid var(--text3);border-radius:50%}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=range]{width:65%;height:6px;background:linear-gradient(90deg, var(--accent1) var(--range-progress, 0), var(--text3) var(--range-progress, 0));border-radius:3px;transition:none}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:12px;height:12px;background-color:var(--accent1);border-radius:6px;border:none;cursor:ew-resize}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=range]::-moz-range-thumb{-moz-appearance:none;appearance:none;width:12px;height:12px;background-color:var(--accent1);border-radius:6px;border:none;cursor:ew-resize}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item>.midconfig-input-container>input[type=range]+input[type=text]{width:35%;padding:0;text-align:center}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item.midconfig-button-container>.midconfig-label-container{width:100%}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item.midconfig-button-container>.midconfig-button{max-width:120px;min-width:90px}#midconfig .midconfig-main>.midconfig-page-item .midconfig-item__disable>.midconfig-input-container{opacity:.25;pointer-events:none}#midconfig .midconfig-main>.midconfig-page-item .midconfig-divider{display:block;width:100%;height:1px;background-color:var(--text3);margin:2px 0}#midconfig .midconfig-bottom{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:5px;padding:5px;border-top:1px solid var(--text3)}';

  // ../../UserScript/Library/MidConfig/src/Items/index.ts
  var Items_exports = {};
  __export(Items_exports, {
    Button: () => Button_default,
    ButtonEmpty: () => ButtonEmpty_default,
    CheckBox: () => CheckBox_default,
    Color: () => Color_default,
    Divider: () => Divider_default,
    Group: () => Group_default,
    Item: () => Item_default,
    Range: () => Range_default,
    Select: () => Select_default,
    Text: () => Text_default
  });

  // ../../UserScript/Library/MidConfig/src/utils/generateUID.ts
  var generateUID2 = (len = 10) => {
    const str = `abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`;
    return `${Array.from(Array(len)).map(() => str[Math.random() * str.length | 0]).join("")}-${Date.now()}`;
  };
  var generateUID_default = generateUID2;

  // ../../UserScript/Library/MidConfig/src/utils/fullWidthToHalfWidth.ts
  var fullWidthToHalfWidth = (str) => {
    return str.replace("\uFF03", "#").replace(/[a-z0-9]/g, (s) => String.fromCharCode(s.charCodeAt(0) - 65248));
  };
  var fullWidthToHalfWidth_default = fullWidthToHalfWidth;

  // ../../UserScript/Library/MidConfig/src/utils/setTextWithTitle.ts
  var setTextWithTitle = (elem, text) => {
    elem.textContent = text;
    elem.addEventListener("mouseover", ({ target }) => {
      if (target instanceof HTMLElement) {
        if (0 < target.scrollWidth - target.offsetWidth) {
          target.title = target.textContent || "";
        } else {
          target.title = "";
        }
      }
    });
  };
  var setTextWithTitle_default = setTextWithTitle;

  // ../../UserScript/Library/MidConfig/src/utils/isColorCode.ts
  var isColorCode = (hex) => {
    return /^#?[a-fA-F0-9]{6}$/.test(hex);
  };
  var isColorCode_default = isColorCode;

  // ../../UserScript/Library/MidConfig/src/utils/defineCustomElement.ts
  var defineCustomElement = (name, constructor) => {
    if (customElements.constructor.prototype.get.call(customElements, "midconfig-panel") === void 0) {
      customElements.constructor.prototype.define.call(customElements, name, constructor);
    }
  };
  var defineCustomElement_default = defineCustomElement;

  // ../../UserScript/Library/MidConfig/src/Items/Item.ts
  var _initData, _uid, _value, _labalContainer, _inputContainer, _inputCheckbox;
  var _Item = class extends HTMLElement {
    constructor(initData) {
      super();
      __privateAdd(this, _initData, void 0);
      __privateAdd(this, _uid, void 0);
      __privateAdd(this, _value, void 0);
      __privateAdd(this, _labalContainer, void 0);
      __privateAdd(this, _inputContainer, void 0);
      __privateAdd(this, _inputCheckbox, null);
      __privateSet(this, _initData, initData);
      __privateSet(this, _uid, `midconfig-${generateUID_default()}`);
      __privateSet(this, _value, initData.default);
      this.classList.add(_Item.NAME);
      this.classList.add(this.tagName.toLowerCase());
      __privateSet(this, _labalContainer, document.createElement("div"));
      __privateGet(this, _labalContainer).classList.add("midconfig-label-container");
      const label = document.createElement("label");
      const span = document.createElement("span");
      setTextWithTitle_default(span, initData.label);
      label.appendChild(span);
      __privateGet(this, _labalContainer).insertAdjacentElement("beforeend", label);
      if (initData.withCheckBox === true) {
        label.setAttribute("for", __privateGet(this, _uid));
        label.insertAdjacentHTML("afterbegin", SVG_CHECKMARK);
        __privateSet(this, _inputCheckbox, document.createElement("input"));
        __privateGet(this, _inputCheckbox).type = "checkbox";
        __privateGet(this, _inputCheckbox).id = __privateGet(this, _uid);
        __privateGet(this, _inputCheckbox).checked = Boolean(initData.checked);
        if (!this.checked) {
          this.classList.add(`${_Item.NAME}__disable`);
        }
        __privateGet(this, _inputCheckbox).addEventListener("change", () => {
          if (this.checked) {
            this.classList.remove(`${_Item.NAME}__disable`);
          } else {
            this.classList.add(`${_Item.NAME}__disable`);
          }
          if (typeof __privateGet(this, _initData).onChange === "function") {
            __privateGet(this, _initData).onChange({
              target: this,
              id: __privateGet(this, _initData).id,
              value: null,
              checked: this.checked
            });
          }
        });
        __privateGet(this, _labalContainer).insertAdjacentElement("afterbegin", __privateGet(this, _inputCheckbox));
      }
      __privateSet(this, _inputContainer, document.createElement("div"));
      __privateGet(this, _inputContainer).classList.add("midconfig-input-container");
      this.appendChild(__privateGet(this, _labalContainer));
      this.appendChild(__privateGet(this, _inputContainer));
    }
    get initData() {
      return __privateGet(this, _initData);
    }
    get uid() {
      return __privateGet(this, _uid);
    }
    get value() {
      return __privateGet(this, _value);
    }
    get checked() {
      if (__privateGet(this, _inputCheckbox) !== null) {
        return __privateGet(this, _inputCheckbox).checked;
      } else {
        return null;
      }
    }
    get labalContainer() {
      return __privateGet(this, _labalContainer);
    }
    get inputContainer() {
      return __privateGet(this, _inputContainer);
    }
    get inputCheckbox() {
      return __privateGet(this, _inputCheckbox);
    }
    set checked(data) {
      if (typeof data === "boolean" && __privateGet(this, _inputCheckbox) !== null) {
        if (data === __privateGet(this, _inputCheckbox).checked) {
          return;
        }
        __privateGet(this, _inputCheckbox).checked = data;
        if (this.checked) {
          this.classList.remove(`${_Item.NAME}__disable`);
        } else {
          this.classList.add(`${_Item.NAME}__disable`);
        }
        if (typeof __privateGet(this, _initData).onChange === "function") {
          __privateGet(this, _initData).onChange({
            target: this,
            id: __privateGet(this, _initData).id,
            value: null,
            checked: this.checked
          });
        }
      }
    }
    set _value(data) {
      if (typeof data === "string" || typeof data === "number" || typeof data === "boolean") {
        if (data === __privateGet(this, _value)) {
          return;
        }
        __privateSet(this, _value, data);
        if (typeof __privateGet(this, _initData).onChange === "function") {
          __privateGet(this, _initData).onChange({
            target: this,
            id: __privateGet(this, _initData).id,
            value: __privateGet(this, _value),
            checked: this.checked
          });
        }
      }
    }
    getValue() {
      return this.value;
    }
    setValue(data) {
      if (typeof data === "string" || typeof data === "number" || typeof data === "boolean") {
        this._value = data;
      }
    }
    getData() {
      return {
        checked: this.checked,
        value: this.value,
        default: __privateGet(this, _initData).default
      };
    }
    setData(data) {
      this.setValue(data.value);
      this.checked = data.checked;
    }
    reset() {
      this.setValue(__privateGet(this, _initData).default);
      this.checked = Boolean(__privateGet(this, _initData).checked);
    }
  };
  var Item = _Item;
  _initData = new WeakMap();
  _uid = new WeakMap();
  _value = new WeakMap();
  _labalContainer = new WeakMap();
  _inputContainer = new WeakMap();
  _inputCheckbox = new WeakMap();
  Item.NAME = "midconfig-item";
  defineCustomElement_default(Item.NAME, Item);
  var Item_default = Item;

  // ../../UserScript/Library/MidConfig/src/Items/Text.ts
  var _inputText;
  var Text = class extends Item_default {
    constructor(initData, option) {
      super(initData);
      __privateAdd(this, _inputText, void 0);
      __privateSet(this, _inputText, document.createElement("input"));
      __privateGet(this, _inputText).type = "text";
      __privateGet(this, _inputText).value = initData.default;
      __privateGet(this, _inputText).spellcheck = false;
      __privateGet(this, _inputText).setAttribute("autocorrect", "off");
      if (typeof option?.maxlength === "number") {
        __privateGet(this, _inputText).maxLength = option.maxlength;
      }
      if (typeof option?.minlength === "number") {
        __privateGet(this, _inputText).minLength = option.minlength;
      }
      if (typeof option?.placeholder === "string") {
        __privateGet(this, _inputText).placeholder = option.placeholder;
      } else {
        __privateGet(this, _inputText).placeholder = initData.default;
      }
      __privateGet(this, _inputText).addEventListener("change", () => {
        this.setValue(__privateGet(this, _inputText).value);
      });
      this.inputContainer.appendChild(__privateGet(this, _inputText));
    }
    setValue(data) {
      if (typeof data === "number") {
        data = data.toString();
      }
      if (typeof data === "string") {
        data = data.trim();
        __privateGet(this, _inputText).value = data;
        this._value = data;
      }
    }
  };
  _inputText = new WeakMap();
  defineCustomElement_default("midconfig-item-text", Text);
  var Text_default = Text;

  // ../../UserScript/Library/MidConfig/src/Items/CheckBox.ts
  var CheckBox = class extends Item_default {
    constructor(initData) {
      initData.withCheckBox = true;
      initData.checked || (initData.checked = initData.default);
      super(initData);
      this.inputContainer.remove();
    }
    get value() {
      return Boolean(this.inputCheckbox?.checked);
    }
    setValue(data) {
      if (typeof data === "boolean" && this.inputCheckbox !== null) {
        this.inputCheckbox.checked = data;
        this._value = data;
      }
    }
  };
  defineCustomElement_default("midconfig-item-checkbox", CheckBox);
  var CheckBox_default = CheckBox;

  // ../../UserScript/Library/MidConfig/src/Items/Color.ts
  var _inputColor, _inputText2;
  var Color = class extends Item_default {
    constructor(initData, option) {
      super(initData);
      __privateAdd(this, _inputColor, void 0);
      __privateAdd(this, _inputText2, void 0);
      initData.default = initData.default.toUpperCase();
      __privateSet(this, _inputColor, document.createElement("input"));
      __privateGet(this, _inputColor).type = "color";
      __privateGet(this, _inputColor).value = initData.default;
      __privateSet(this, _inputText2, document.createElement("input"));
      __privateGet(this, _inputText2).type = "text";
      __privateGet(this, _inputText2).value = initData.default;
      __privateGet(this, _inputText2).spellcheck = false;
      __privateGet(this, _inputText2).setAttribute("autocorrect", "off");
      __privateGet(this, _inputText2).maxLength = 7;
      __privateGet(this, _inputText2).minLength = 6;
      if (typeof option?.placeholder === "string") {
        __privateGet(this, _inputText2).placeholder = option.placeholder;
      } else {
        __privateGet(this, _inputText2).placeholder = initData.default;
      }
      const changeHandler = ({ target }) => {
        if (target instanceof HTMLInputElement) {
          if (target.value === "") {
            target.value = this.initData.default;
          }
          target.value = fullWidthToHalfWidth_default(target.value);
          this.setValue(target.value);
        }
      };
      __privateGet(this, _inputColor).addEventListener("change", changeHandler);
      __privateGet(this, _inputText2).addEventListener("change", changeHandler);
      this.inputContainer.appendChild(__privateGet(this, _inputColor));
      this.inputContainer.appendChild(__privateGet(this, _inputText2));
    }
    setValue(data) {
      if (typeof data === "string") {
        data = data.trim().toUpperCase();
        if (!isColorCode_default(data)) {
          data = this.initData.default;
        }
        if (!data.startsWith("#")) {
          data = `#${data}`;
        }
        __privateGet(this, _inputColor).value = data;
        __privateGet(this, _inputText2).value = data;
        this._value = data;
      }
    }
  };
  _inputColor = new WeakMap();
  _inputText2 = new WeakMap();
  defineCustomElement_default("midconfig-item-color", Color);
  var Color_default = Color;

  // ../../UserScript/Library/MidConfig/src/Items/Range.ts
  var _inputRange, _inputText3;
  var Range = class extends Item_default {
    constructor(initData, option) {
      super(initData);
      __privateAdd(this, _inputRange, void 0);
      __privateAdd(this, _inputText3, void 0);
      __privateSet(this, _inputRange, document.createElement("input"));
      __privateGet(this, _inputRange).type = "range";
      __privateGet(this, _inputRange).value = initData.default.toString();
      __privateGet(this, _inputRange).max = option.max.toString();
      __privateGet(this, _inputRange).min = option.min.toString();
      __privateGet(this, _inputRange).step = option.step.toString();
      __privateGet(this, _inputRange).style.setProperty(
        "--range-progress",
        `${(initData.default - option.min) / (option.max - option.min) * 100}%`
      );
      __privateSet(this, _inputText3, document.createElement("input"));
      __privateGet(this, _inputText3).type = "text";
      __privateGet(this, _inputText3).value = initData.default.toString();
      __privateGet(this, _inputText3).spellcheck = false;
      __privateGet(this, _inputText3).setAttribute("autocorrect", "off");
      __privateGet(this, _inputText3).maxLength = (option.max + option.step).toString().length;
      if (typeof option.placeholder === "string") {
        __privateGet(this, _inputText3).placeholder = option.placeholder;
      } else {
        __privateGet(this, _inputText3).placeholder = initData.default.toString();
      }
      __privateGet(this, _inputRange).addEventListener("input", () => {
        __privateGet(this, _inputRange).style.setProperty(
          "--range-progress",
          `${(Number(__privateGet(this, _inputRange).value) - Number(__privateGet(this, _inputRange).min)) / (Number(__privateGet(this, _inputRange).max) - Number(__privateGet(this, _inputRange).min)) * 100}%`
        );
        __privateGet(this, _inputText3).value = __privateGet(this, _inputRange).value;
      });
      const changeHandler = ({ target }) => {
        if (target instanceof HTMLInputElement) {
          if (target.value === "") {
            target.value = this.initData.default;
          }
          target.value = fullWidthToHalfWidth_default(target.value);
          this.setValue(target.value);
        }
      };
      __privateGet(this, _inputRange).addEventListener("change", changeHandler);
      __privateGet(this, _inputText3).addEventListener("change", changeHandler);
      this.inputContainer.appendChild(__privateGet(this, _inputRange));
      this.inputContainer.appendChild(__privateGet(this, _inputText3));
    }
    setValue(data) {
      if (typeof data === "string") {
        data = Number(data);
      }
      if (Number.isNaN(data)) {
        data = this.initData.default;
      }
      if (typeof data === "number" && data <= Number(__privateGet(this, _inputRange).max) && Number(__privateGet(this, _inputRange).min) <= data) {
        __privateGet(this, _inputRange).value = data.toString();
        __privateGet(this, _inputText3).value = data.toString();
        __privateGet(this, _inputRange).style.setProperty(
          "--range-progress",
          `${(Number(__privateGet(this, _inputRange).value) - Number(__privateGet(this, _inputRange).min)) / (Number(__privateGet(this, _inputRange).max) - Number(__privateGet(this, _inputRange).min)) * 100}%`
        );
        this._value = data;
      }
    }
  };
  _inputRange = new WeakMap();
  _inputText3 = new WeakMap();
  defineCustomElement_default("midconfig-item-range", Range);
  var Range_default = Range;

  // ../../UserScript/Library/MidConfig/src/Items/Select.ts
  var _select, _options;
  var Select = class extends Item_default {
    constructor(initData, options) {
      super(initData);
      __privateAdd(this, _select, void 0);
      __privateAdd(this, _options, []);
      const selectContainer = document.createElement("div");
      selectContainer.classList.add("midconfig-select-container");
      __privateSet(this, _select, document.createElement("select"));
      for (const { text, value } of options) {
        const option = document.createElement("option");
        option.text = text;
        option.value = value;
        if (value === initData.default) {
          option.selected = true;
        }
        __privateGet(this, _select).appendChild(option);
        __privateGet(this, _options).push(option);
      }
      __privateGet(this, _select).addEventListener("change", () => {
        this.setValue(__privateGet(this, _select).value);
      });
      selectContainer.appendChild(__privateGet(this, _select));
      selectContainer.insertAdjacentHTML("beforeend", SVG_ARROW_DOWN);
      this.inputContainer.appendChild(selectContainer);
    }
    setValue(data) {
      if (typeof data === "string") {
        data = data.trim();
        const targetOption = __privateGet(this, _options).find((v) => v.value === data);
        if (targetOption !== void 0) {
          targetOption.selected = true;
          this._value = data;
        }
      }
    }
  };
  _select = new WeakMap();
  _options = new WeakMap();
  defineCustomElement_default("midconfig-item-select", Select);
  var Select_default = Select;

  // ../../UserScript/Library/MidConfig/src/Items/Button.ts
  var _initData2, _disable, _labalContainer2;
  var _Button = class extends HTMLElement {
    constructor(initData) {
      super();
      __privateAdd(this, _initData2, void 0);
      __privateAdd(this, _disable, void 0);
      __privateAdd(this, _labalContainer2, null);
      __privateSet(this, _initData2, initData);
      this.disable = Boolean(initData.disable);
      this.classList.add("midconfig-item");
      this.classList.add(this.tagName.toLowerCase());
      if (typeof initData.label === "string") {
        __privateSet(this, _labalContainer2, document.createElement("div"));
        __privateGet(this, _labalContainer2).classList.add("midconfig-label-container");
        const label = document.createElement("label");
        const span = document.createElement("span");
        setTextWithTitle_default(span, initData.label);
        label.appendChild(span);
        __privateGet(this, _labalContainer2).appendChild(label);
        this.appendChild(__privateGet(this, _labalContainer2));
      }
      const button = document.createElement("div");
      button.classList.add("midconfig-button");
      button.classList.add(`midconfig-button--${initData.type}`);
      setTextWithTitle_default(button, initData.text);
      button.addEventListener("click", async () => {
        await __privateGet(this, _initData2).onClick(__privateGet(this, _initData2).id);
      });
      this.appendChild(button);
    }
    get initData() {
      return __privateGet(this, _initData2);
    }
    get disable() {
      return __privateGet(this, _disable);
    }
    get labalContainer() {
      return __privateGet(this, _labalContainer2);
    }
    set disable(v) {
      __privateSet(this, _disable, Boolean(v));
      if (__privateGet(this, _disable)) {
        this.classList.add(`${_Button.NAME}__disable`);
      } else {
        this.classList.remove(`${_Button.NAME}__disable`);
      }
    }
  };
  var Button = _Button;
  _initData2 = new WeakMap();
  _disable = new WeakMap();
  _labalContainer2 = new WeakMap();
  Button.NAME = "midconfig-button-container";
  defineCustomElement_default(Button.NAME, Button);
  var Button_default = Button;

  // ../../UserScript/Library/MidConfig/src/Items/ButtonEmpty.ts
  var ButtonEmpty = class extends Button_default {
    constructor() {
      super({
        id: "",
        text: "",
        type: "solid",
        onClick: () => null
      });
      this.classList.add("midconfig-button-container");
    }
  };
  ButtonEmpty.NAME = "midconfig-button-empty";
  defineCustomElement_default(ButtonEmpty.NAME, ButtonEmpty);
  var ButtonEmpty_default = ButtonEmpty;

  // ../../UserScript/Library/MidConfig/src/Items/Divider.ts
  var Divider = class extends HTMLElement {
    constructor() {
      super();
      this.classList.add(this.tagName.toLowerCase());
    }
  };
  Divider.NAME = "midconfig-divider";
  defineCustomElement_default(Divider.NAME, Divider);
  var Divider_default = Divider;

  // ../../UserScript/Library/MidConfig/src/Items/Group.ts
  var _initData3, _isOpen;
  var _Group = class extends HTMLElement {
    constructor(initData) {
      super();
      __privateAdd(this, _initData3, void 0);
      __privateAdd(this, _isOpen, void 0);
      __privateSet(this, _initData3, initData);
      __privateSet(this, _isOpen, Boolean(initData.isAccordionOpen));
      this.classList.add(_Group.NAME);
      const header = document.createElement("div");
      header.classList.add(`${_Group.NAME}-header`);
      const span = document.createElement("span");
      setTextWithTitle_default(span, initData.label);
      header.appendChild(span);
      const items = document.createElement("div");
      items.classList.add(`${_Group.NAME}-items`);
      for (const item of initData.items) {
        items.appendChild(item);
      }
      if (initData.isAccordion) {
        this.classList.add("midconfig-accordion");
        if (!__privateGet(this, _isOpen)) {
          this.classList.add("midconfig-accordion__close");
        }
        header.insertAdjacentHTML("beforeend", SVG_ARROW_DOWN);
        header.addEventListener("click", () => __privateGet(this, _isOpen) ? this.close() : this.open());
      }
      this.appendChild(header);
      this.appendChild(items);
    }
    get initData() {
      return __privateGet(this, _initData3);
    }
    get isOpen() {
      return __privateGet(this, _isOpen);
    }
    open() {
      __privateSet(this, _isOpen, true);
      this.classList.remove("midconfig-accordion__close");
    }
    close() {
      __privateSet(this, _isOpen, false);
      this.classList.add("midconfig-accordion__close");
    }
    getData() {
      const data = {};
      __privateGet(this, _initData3).items.forEach((item) => {
        if (item instanceof Item_default) {
          data[item.initData.id] = item.getData();
        }
      });
      return data;
    }
    setData(values) {
      Object.keys(values).forEach((id) => {
        __privateGet(this, _initData3).items.forEach((item) => {
          if (item instanceof Item_default && item.initData.id === id) {
            item.setData(values[id]);
          }
        });
      });
    }
    reset() {
      __privateGet(this, _initData3).items.forEach((v) => v instanceof Item_default && v.reset());
    }
  };
  var Group = _Group;
  _initData3 = new WeakMap();
  _isOpen = new WeakMap();
  Group.NAME = "midconfig-group";
  defineCustomElement_default(Group.NAME, Group);
  var Group_default = Group;

  // ../../UserScript/Library/MidConfig/src/index.ts
  var _initData4, _shadowInner, _tab, _main, _bottom, _ready;
  var _Panel = class extends HTMLElement {
    constructor(initData, isDev2) {
      super();
      __privateAdd(this, _initData4, void 0);
      __privateAdd(this, _shadowInner, null);
      __privateAdd(this, _tab, void 0);
      __privateAdd(this, _main, void 0);
      __privateAdd(this, _bottom, void 0);
      __privateAdd(this, _ready, false);
      __privateSet(this, _initData4, initData);
      this.classList.add(_Panel.NAME);
      __privateSet(this, _tab, document.createElement("div"));
      __privateGet(this, _tab).classList.add("midconfig-tab");
      __privateSet(this, _main, document.createElement("div"));
      __privateGet(this, _main).classList.add("midconfig-main");
      __privateSet(this, _bottom, document.createElement("div"));
      __privateGet(this, _bottom).classList.add("midconfig-bottom");
      initData.tabs.forEach((tab, idx) => {
        const tabItem = document.createElement("div");
        tabItem.classList.add("midconfig-tab-item");
        setTextWithTitle_default(tabItem, tab.label);
        const pageItem = document.createElement("div");
        pageItem.classList.add("midconfig-page-item");
        tab.child.forEach((item) => pageItem.appendChild(item));
        if (idx === 0) {
          tabItem.classList.add("midconfig-tab-item__selected");
          pageItem.classList.add("midconfig-page-item__selected");
        }
        tabItem.addEventListener("click", () => {
          Array.from(__privateGet(this, _tab).children).forEach((item) => {
            item.classList.remove("midconfig-tab-item__selected");
          });
          tabItem.classList.add("midconfig-tab-item__selected");
          Array.from(__privateGet(this, _main).children).forEach((page) => {
            page.classList.remove("midconfig-page-item__selected");
          });
          pageItem.classList.add("midconfig-page-item__selected");
        });
        __privateGet(this, _tab).appendChild(tabItem);
        __privateGet(this, _main).appendChild(pageItem);
      });
      initData.buttons.forEach((button) => {
        delete button.initData.label;
        button.labalContainer?.remove();
        __privateGet(this, _bottom).appendChild(button);
      });
      if (!Boolean(isDev2)) {
        __privateSet(this, _shadowInner, document.createElement("div"));
        __privateGet(this, _shadowInner).id = "midconfig";
        __privateGet(this, _shadowInner).appendChild(__privateGet(this, _tab));
        __privateGet(this, _shadowInner).appendChild(__privateGet(this, _main));
        __privateGet(this, _shadowInner).appendChild(__privateGet(this, _bottom));
        const shadow = this.attachShadow({ mode: "closed" });
        shadow.appendChild(__privateGet(this, _shadowInner));
        const style = document.createElement("style");
        style.textContent = STYLE;
        shadow.appendChild(style);
      } else {
        this.id = "midconfig";
        this.appendChild(__privateGet(this, _tab));
        this.appendChild(__privateGet(this, _main));
        this.appendChild(__privateGet(this, _bottom));
        _Panel.addStyle(STYLE);
      }
      this.style.display = isDev2 ? "flex" : "block";
      this.setTheme(initData.theme);
    }
    get initData() {
      return __privateGet(this, _initData4);
    }
    get key() {
      return `midconfig-${__privateGet(this, _initData4).id}`;
    }
    get ready() {
      return __privateGet(this, _ready);
    }
    async init() {
      if (!__privateGet(this, _ready)) {
        await this.load();
        __privateSet(this, _ready, true);
      }
    }
    getValue(key, json) {
      let result = void 0;
      const parsedKey = key.split(">").map((v) => v.trim());
      if (parsedKey.length < 2 || 3 < parsedKey.length) {
        return;
      }
      const data = isConfigJsonData(json) ? json.data : this.getJSON().data;
      Object.keys(data).forEach((tabId) => {
        if (tabId !== parsedKey[0]) {
          return;
        }
        const tab = data[tabId];
        Object.keys(tab).forEach((itemId) => {
          if (itemId !== parsedKey[1]) {
            return;
          }
          const item = tab[itemId];
          if (isConfigItemData(item)) {
            result = item;
          } else {
            Object.keys(item).forEach((id) => {
              if (id !== parsedKey[2]) {
                return;
              }
              const groupItem = item[id];
              if (isConfigItemData(groupItem)) {
                result = groupItem;
              }
            });
          }
        });
      });
      return result;
    }
    getJSON() {
      const json = {
        version: __privateGet(this, _initData4).version,
        data: {}
      };
      __privateGet(this, _initData4).tabs.forEach((tab) => {
        var _a, _b;
        (_a = json.data)[_b = tab.id] || (_a[_b] = {});
        tab.child.forEach((item) => {
          if (item instanceof Item_default || item instanceof Group_default) {
            json.data[tab.id][item.initData.id] = item.getData();
          }
        });
      });
      return json;
    }
    setJSON(json) {
      if (!isConfigJsonData(json)) {
        return false;
      }
      try {
        Object.keys(json.data).forEach((tabId) => {
          const targetTab = __privateGet(this, _initData4).tabs.filter((v) => v.id === tabId);
          targetTab.forEach((tab) => {
            Object.keys(json.data[tabId]).forEach((itemId) => {
              const data = json.data[tabId][itemId];
              const targetItem = tab.child.filter((item) => {
                if (item instanceof Item_default || item instanceof Group_default) {
                  return item.initData.id === itemId;
                }
              });
              targetItem.forEach((item) => {
                if (isConfigItemData(data)) {
                  if (item instanceof Item_default) {
                    item.setData(data);
                  }
                } else {
                  if (item instanceof Group_default) {
                    item.setData(data);
                  }
                }
              });
            });
          });
        });
        return true;
      } catch (e) {
        console.error(e);
      }
      return false;
    }
    async save() {
      try {
        const value = this.getJSON();
        await StorageAPI.set(this.key, value);
      } catch (e) {
        console.error(e);
      }
    }
    async load() {
      try {
        const value = await StorageAPI.get(this.key);
        if (isConfigJsonData(value)) {
          this.setJSON(value);
        }
      } catch (e) {
        console.error(e);
      }
    }
    async reset() {
      __privateGet(this, _initData4).tabs.forEach((tab) => {
        tab.child.forEach((item) => {
          if (item instanceof Item_default || item instanceof Group_default) {
            item.reset();
          }
        });
      });
      await StorageAPI.remove(this.key);
    }
    export() {
      const value = JSON.stringify(this.getJSON());
      window.prompt("\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8", value);
    }
    setTheme(theme = "auto") {
      if (["auto", "light", "dark"].includes(theme)) {
        (__privateGet(this, _shadowInner) || this).setAttribute("theme", theme);
      }
    }
    static addStyle(style) {
      let GMAddStyle = null;
      try {
        GMAddStyle || (GMAddStyle = GM_addStyle);
      } catch {
      }
      try {
        GMAddStyle || (GMAddStyle = GM && GM.addStyle);
      } catch {
      }
      try {
        if (typeof GMAddStyle === "function") {
          GMAddStyle(style);
        } else {
          const styleElem = document.createElement("style");
          styleElem.textContent = style;
          document.head.appendChild(styleElem);
        }
      } catch (e) {
        console.error(e);
      }
    }
  };
  var Panel = _Panel;
  _initData4 = new WeakMap();
  _shadowInner = new WeakMap();
  _tab = new WeakMap();
  _main = new WeakMap();
  _bottom = new WeakMap();
  _ready = new WeakMap();
  Panel.NAME = "midconfig-panel";
  defineCustomElement_default(Panel.NAME, Panel);

  // src/config.ts
  var tempConfigJson = "";
  var midconfig = new Panel({
    id: ECT_ID,
    version: 2,
    theme: "light",
    tabs: [
      {
        id: "general",
        label: "\u5168\u822C",
        child: [
          new Items_exports.CheckBox({
            id: "mergeExtraMain",
            label: "\u300C\u5F15\u7528\u30B3\u30E1\u30F3\u30C8\u300D\u3092\u300C\u30C1\u30E3\u30F3\u30CD\u30EB\u30B3\u30E1\u30F3\u30C8\u300D\u306B\u7D71\u5408",
            default: true
          }),
          new Items_exports.CheckBox({
            id: "mergeExtraEasy",
            label: "\u300C\u5F15\u7528\u304B\u3093\u305F\u3093\u30B3\u30E1\u30F3\u30C8\u300D\u3092\u300C\u304B\u3093\u305F\u3093\u30B3\u30E1\u30F3\u30C8\u300D\u306B\u7D71\u5408",
            default: true
          }),
          new Items_exports.Divider(),
          new Items_exports.CheckBox({
            id: "mergeExtraFromDanime",
            label: "\u300Cd\u30A2\u30CB\u30E1\u30B9\u30C8\u30A2 \u30CB\u30B3\u30CB\u30B3\u652F\u5E97\u300D\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u5F15\u7528\u30FB\u7D71\u5408",
            default: false
          }),
          new Items_exports.CheckBox({
            id: "forcedExtra",
            label: "\u30B3\u30E1\u30F3\u30C8\u3092\u81EA\u52D5\u3067\u5F15\u7528\u30FB\u7D71\u5408",
            default: false
          }),
          new Items_exports.Divider(),
          new Items_exports.CheckBox({
            id: "deleteExtra",
            label: "\u300C\u5F15\u7528\u30B3\u30E1\u30F3\u30C8\u300D\u3068\u300C\u5F15\u7528\u304B\u3093\u305F\u3093\u30B3\u30E1\u30F3\u30C8\u300D\u3092\u975E\u8868\u793A",
            default: false
          }),
          new Items_exports.CheckBox({
            id: "deleteEasy",
            label: "\u300C\u304B\u3093\u305F\u3093\u30B3\u30E1\u30F3\u30C8\u300D\u3068\u300C\u5F15\u7528\u304B\u3093\u305F\u3093\u30B3\u30E1\u30F3\u30C8\u300D\u3092\u975E\u8868\u793A",
            default: false
          }),
          new Items_exports.Divider(),
          new Items_exports.CheckBox({
            id: "showPopupMsg",
            label: "\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A",
            default: true
          }),
          new Items_exports.CheckBox({
            id: "showMergedCommentCount",
            label: "\u7D71\u5408\u3057\u305F\u30B3\u30E1\u30F3\u30C8\u306E\u6570\u3092\u30B3\u30E1\u30F3\u30C8\u6570\u6A2A\u306B\u8868\u793A",
            default: true
          }),
          new Items_exports.CheckBox({
            id: "showExtraViewCount",
            label: "\u5F15\u7528\u3057\u305F\u52D5\u753B\u306E\u518D\u751F\u6570\u3092\u518D\u751F\u6570\u6A2A\u306B\u8868\u793A",
            default: false
          }),
          new Items_exports.CheckBox({
            id: "showKawaiiPct",
            label: "\u30B3\u30E1\u30F3\u30C8\u306E\u300C\u304B\u308F\u3044\u3044\u300D\u7387\u3092\u8868\u793A",
            default: false
          })
        ]
      },
      {
        id: "search",
        label: "\u691C\u7D22\u6761\u4EF6",
        child: [
          new Items_exports.Text({
            id: "lengthSecondsDiff",
            label: "\u518D\u751F\u6642\u9593\u306E\u5DEE (\u79D2)",
            default: "60",
            withCheckBox: true,
            checked: true,
            onChange({ target, value }) {
              if (typeof value === "string") {
                if (/^[0-90-9]+$/.test(value)) {
                  target.setValue(
                    value.replace(/[0-9]/g, (s) => String.fromCharCode(s.charCodeAt(0) - 65248))
                  );
                } else {
                  target.setValue(
                    value.replace(/[^\d]/g, "")
                  );
                }
              }
            }
          }),
          new Items_exports.CheckBox({
            id: "onlyChannel",
            label: "\u30C1\u30E3\u30F3\u30CD\u30EB\u306E\u52D5\u753B\u306E\u307F",
            default: true
          }),
          new Items_exports.Group({
            id: "targets",
            label: "\u691C\u7D22\u5BFE\u8C61\u306E\u30D5\u30A3\u30FC\u30EB\u30C9",
            items: [
              new Items_exports.CheckBox({
                id: "title",
                label: "\u30BF\u30A4\u30C8\u30EB",
                default: true
              }),
              new Items_exports.CheckBox({
                id: "description",
                label: "\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u8AAC\u660E\u6587",
                default: false
              }),
              new Items_exports.CheckBox({
                id: "tags",
                label: "\u30BF\u30B0",
                default: false
              })
            ]
          }),
          new Items_exports.Group({
            id: "sort",
            label: "\u30BD\u30FC\u30C8\u9806",
            items: [
              new Items_exports.Select({
                id: "direction",
                label: "\u65B9\u5411",
                default: "+"
              }, [
                { text: "\u6607\u9806", value: "+" },
                { text: "\u964D\u9806", value: "-" }
              ]),
              new Items_exports.Select({
                id: "field",
                label: "\u30D5\u30A3\u30FC\u30EB\u30C9",
                default: "startTime"
              }, [
                { text: "\u518D\u751F\u6570", value: "viewCounter" },
                { text: "\u518D\u751F\u6642\u9593", value: "lengthSeconds" },
                { text: "\u6295\u7A3F\u6642\u9593", value: "startTime" },
                { text: "\u30B3\u30E1\u30F3\u30C8\u6570", value: "commentCounter" },
                { text: "\u6700\u7D42\u30B3\u30E1\u30F3\u30C8\u6642\u9593", value: "lastCommentTime" }
              ])
            ]
          })
        ]
      },
      {
        id: "other",
        label: "\u305D\u306E\u4ED6",
        child: [
          new Items_exports.Button({
            id: "import",
            type: "solid",
            label: "\u8A2D\u5B9A\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3059\u308B",
            text: "\u30A4\u30F3\u30DD\u30FC\u30C8",
            onClick: async () => {
              const value = window.prompt("\u30A4\u30F3\u30DD\u30FC\u30C8");
              if (value) {
                let result = false;
                try {
                  result = midconfig.setJSON(JSON.parse(value));
                } catch (e) {
                  console.error(e);
                }
                window.alert(result ? "\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F" : "\u30A4\u30F3\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F");
              }
            }
          }),
          new Items_exports.Button({
            id: "export",
            type: "solid",
            label: "\u8A2D\u5B9A\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3059\u308B",
            text: "\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8",
            onClick: async () => {
              window.prompt("\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8", JSON.stringify(midconfig.getJSON()));
            }
          }),
          new Items_exports.Button({
            id: "reset",
            type: "outline-red",
            label: "\u8A2D\u5B9A\u3092\u30EA\u30BB\u30C3\u30C8\u3059\u308B",
            text: "\u30EA\u30BB\u30C3\u30C8",
            onClick: async () => {
              if (window.confirm("\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3059\u304B\uFF1F")) {
                await midconfig.reset();
              }
            }
          })
        ]
      }
    ],
    buttons: [
      new Items_exports.Button({
        id: "cancel",
        text: "\u30AD\u30E3\u30F3\u30BB\u30EB",
        type: "solid",
        onClick: async () => {
          closeConfig();
        }
      }),
      new Items_exports.ButtonEmpty(),
      new Items_exports.ButtonEmpty(),
      new Items_exports.Button({
        id: "save",
        text: "\u4FDD\u5B58",
        type: "fill",
        onClick: async () => {
          await midconfig.save();
          if (tempConfigJson !== JSON.stringify(midconfig.getJSON())) {
            reloadComment_default();
          }
          closeConfig();
        }
      })
    ]
  });
  var openConfig = () => {
    if (document.getElementById("midconfig-wrapper") === null) {
      const wrapper = document.createElement("div");
      wrapper.id = "midconfig-wrapper";
      wrapper.appendChild(midconfig);
      wrapper.addEventListener("click", ({ target }) => {
        if (target instanceof HTMLElement && target.id === "midconfig-wrapper") {
          closeConfig();
        }
      });
      document.body.appendChild(wrapper);
      tempConfigJson = JSON.stringify(midconfig.getJSON());
    }
  };
  var closeConfig = () => {
    document.getElementById("midconfig-wrapper")?.remove();
    tempConfigJson = "";
  };
  var getConfig = () => {
    const json = midconfig.getJSON();
    const general = json.data["general"];
    const search = json.data["search"];
    return {
      general: {
        mergeExtraMain: general["mergeExtraMain"].value,
        mergeExtraEasy: general["mergeExtraEasy"].value,
        mergeExtraFromDanime: general["mergeExtraFromDanime"].value,
        forcedExtra: general["forcedExtra"].value,
        deleteExtra: general["deleteExtra"].value,
        deleteEasy: general["deleteEasy"].value,
        showPopupMsg: general["showPopupMsg"].value,
        showMergedCommentCount: general["showMergedCommentCount"].value,
        showExtraViewCount: general["showExtraViewCount"].value,
        showKawaiiPct: general["showKawaiiPct"].value
      },
      search: {
        lengthSecondsDiff: search["lengthSecondsDiff"],
        onlyChannel: search["onlyChannel"].value,
        targets: Object.keys(search["targets"]).filter((v) => search["targets"][v].value),
        sort: {
          direction: search["sort"]["direction"].value,
          field: search["sort"]["field"].value
        }
      }
    };
  };
  document.addEventListener("ECT:openConfig", openConfig);
  document.addEventListener("ECT:closeConfig", closeConfig);

  // src/videoPicker.ts
  var getVideoPickerTemplate = () => {
    const frag = document.getElementById("ECT-VideoPicker-Template").content.cloneNode(true);
    return frag.firstElementChild;
  };
  var getSearchResultItemTemplate = () => {
    const frag = document.getElementById(
      "ECT-SearchResult-Item-Template"
    ).content.cloneNode(true);
    return frag.firstElementChild;
  };
  var getElementByClassName = (target, name) => {
    return target.getElementsByClassName(name)[0];
  };
  var ECT_VP = {
    util: {
      convertVideoDataToSearchResult(videoData) {
        return {
          contentId: videoData.video.id,
          channelId: parseInt((videoData.channel?.id?.match(/\d+/) || [])[0]),
          title: videoData.video.title,
          startTime: videoData.video.registeredAt,
          lengthSeconds: videoData.video.duration,
          viewCounter: videoData.video.count.view,
          commentCounter: videoData.video.count.comment,
          genre: videoData.genre?.label || "",
          thumbnailUrl: videoData.video.thumbnail.url
        };
      }
    },
    nowExtraVideo: {
      set(data) {
        if (document.getElementById("ECT-VideoPicker-wrapper") === null) {
          return;
        }
        const videoData = globalWindow["ECT_DATA"] && globalWindow["ECT_DATA"]["videoData"];
        ECT_VP.nowExtraVideo.reset();
        document.getElementById("ECT-VideoInfo").dataset.videoId = data.contentId;
        if (Number.isFinite(data.channelId)) {
          document.getElementById("ECT-VideoInfo").dataset.channelId = data.channelId.toString();
        }
        document.getElementById("ECT-VideoInfo-title").textContent = data.title;
        document.getElementById("ECT-VideoInfo-thumb").style.setProperty(
          "--thumb-url",
          `url('${data.thumbnailUrl}.M'),url('${data.thumbnailUrl}')`
        );
        document.getElementById("ECT-VideoInfo-link").setAttribute(
          "href",
          `https://www.nicovideo.jp/watch/${data.contentId}`
        );
        document.getElementById("ECT-VideoInfo-duration").textContent = formatDuration_default(data.lengthSeconds);
        if (Number.isFinite(videoData.video.duration)) {
          document.getElementById("ECT-CommentOffset-Area-extra").style.setProperty(
            "--length",
            `${Math.floor(
              (data.lengthSeconds - videoData.video.duration) / 30 * 0.15 * 100 * 100
            ) / 100 + 70}%`
          );
        }
        document.getElementById("ECT-VideoInfo-date").textContent = formatDate_default(data.startTime);
        document.getElementById("ECT-VideoInfo-view").textContent = data.viewCounter.toLocaleString();
        document.getElementById("ECT-VideoInfo-comment").textContent = data.commentCounter.toLocaleString();
        document.getElementById("ECT-VideoInfo-genre").textContent = data.genre;
        const ect_videopicker = globalWindow["ECT_VIDEOPICKER"];
        if (ect_videopicker !== void 0 && ect_videopicker[videoData.video.id]?.id === data.contentId) {
          ECT_VP.nowExtraVideo.offset.set(
            ect_videopicker[videoData.video.id].offset || 0
          );
        }
      },
      reset() {
        if (document.getElementById("ECT-VideoPicker-wrapper") === null) {
          return;
        }
        delete document.getElementById("ECT-VideoInfo").dataset.videoId;
        delete document.getElementById("ECT-VideoInfo").dataset.channelId;
        document.getElementById("ECT-VideoInfo-title").textContent = "";
        document.getElementById("ECT-VideoInfo-thumb").style.removeProperty("--thumb-url");
        document.getElementById("ECT-VideoInfo-link").removeAttribute("href");
        document.getElementById("ECT-VideoInfo-duration").textContent = "--:--";
        document.getElementById("ECT-CommentOffset-Area-extra").style.removeProperty("--length");
        document.getElementById("ECT-CommentOffset-Area-extra").style.removeProperty("--offset");
        document.getElementById("ECT-VideoInfo-date").textContent = "----/--/-- --:--";
        document.getElementById("ECT-VideoInfo-view").textContent = "0";
        document.getElementById("ECT-VideoInfo-comment").textContent = "0";
        document.getElementById("ECT-VideoInfo-genre").textContent = "";
        ECT_VP.nowExtraVideo.offset.set("");
        for (const elem of document.getElementById("ECT-SearchResult").children) {
          elem.classList.remove("ECT-SearchResult-Item--selected");
        }
      },
      offset: {
        get() {
          const num = parseInt(
            document.getElementById(
              "ECT-CommentOffset-input"
            ).value
          );
          return Number.isFinite(num) ? num : 0;
        },
        set(num) {
          num = parseInt(num.toString());
          if (Number.isFinite(num)) {
            ;
            document.getElementById(
              "ECT-CommentOffset-input"
            ).value = num.toString();
            ECT_VP.nowExtraVideo.offset.onChange(num);
          } else {
            ;
            document.getElementById(
              "ECT-CommentOffset-input"
            ).value = "";
            ECT_VP.nowExtraVideo.offset.onChange(0);
          }
        },
        onChange(num) {
          document.getElementById("ECT-CommentOffset-Area-extra").style.setProperty(
            "--offset",
            `${Math.floor(num / 2 * 100) / 100 + 15}%`
          );
        }
      }
    },
    search: {
      setItem(target, data) {
        target.setAttribute("ect-data", JSON.stringify(data));
        target.dataset.videoId = data.contentId;
        if (Number.isFinite(data.channelId)) {
          target.dataset.channelId = data.channelId.toString();
        }
        getElementByClassName(
          target,
          "ECT-SearchResult-Item-thumb"
        ).style.setProperty("--thumb-url", `url('${data.thumbnailUrl}')`);
        getElementByClassName(
          target,
          "ECT-SearchResult-Item-duration"
        ).textContent = formatDuration_default(data.lengthSeconds);
        getElementByClassName(target, "ECT-SearchResult-Item-title").textContent = data.title;
        const formatedDate = formatDate_default(data.startTime);
        getElementByClassName(target, "ECT-SearchResult-Item-date").textContent = formatedDate;
        const formatedViewCount = 9999 < data.viewCounter ? `${(Math.round(data.viewCounter / 1e4 * 10) / 10).toLocaleString()}\u4E07` : data.viewCounter.toLocaleString();
        getElementByClassName(target, "ECT-SearchResult-Item-view").textContent = formatedViewCount;
        const formatedCommentCount = 9999 < data.commentCounter ? `${(Math.round(data.commentCounter / 1e4 * 10) / 10).toLocaleString()}\u4E07` : data.commentCounter.toLocaleString();
        getElementByClassName(
          target,
          "ECT-SearchResult-Item-comment"
        ).textContent = formatedCommentCount;
      },
      setInput(text) {
        const input = document.getElementById(
          "ECT-SearchBar-input"
        );
        input.value = text;
      },
      getInput() {
        return document.getElementById("ECT-SearchBar-input").value.trim();
      },
      async fetch() {
        if (document.getElementById("ECT-VideoPicker-wrapper") === null || globalWindow["ECT_DATA"] === void 0 || globalWindow["ECT_DATA"]["videoData"] === void 0) {
          return;
        }
        const videoData = globalWindow["ECT_DATA"]["videoData"];
        const extraVideoData = globalWindow["ECT_DATA"]["extraVideoData"];
        const search = document.getElementById("ECT-Search");
        search.classList.add("ect-isLoading");
        const text = ECT_VP.search.getInput();
        const searchResult = document.getElementById("ECT-SearchResult");
        while (searchResult.firstChild) {
          searchResult.removeChild(searchResult.lastChild);
        }
        if (text !== "") {
          let videoId = null;
          if (text.startsWith("https://www.nicovideo.jp/watch/")) {
            const url = new URL(text);
            if (/\/(sm|nm|so)?\d+$/.test(url.pathname)) {
              videoId = url.pathname.split("/").slice(-1)[0];
            }
          }
          if (videoId) {
            const data = await getVideoData_default(videoId);
            const items = document.createDocumentFragment();
            const searchResultItem = getSearchResultItemTemplate().cloneNode(
              true
            );
            ECT_VP.search.setItem(searchResultItem, {
              "contentId": data.video.id,
              "title": data.video.title,
              "description": data.video.description,
              "channelId": Number(
                ((data.channel?.id || "").match(/(\d+)/) || [])[0]
              ),
              "viewCounter": data.video.count.view,
              "lengthSeconds": data.video.duration,
              "thumbnailUrl": data.video.thumbnail.url,
              "startTime": data.video.registeredAt,
              "commentCounter": data.video.count.comment,
              "genre": data.genre.label,
              "genre.keyword": data.genre.label
            });
            if (extraVideoData !== void 0 && data.video.id === extraVideoData.video.id) {
              searchResultItem.classList.add("ECT-SearchResult-Item--selected");
            }
            items.appendChild(searchResultItem);
            searchResult.appendChild(items);
          } else {
            try {
              const config = getConfig();
              let lengthSecondsDiff = null;
              if (config["search"]["lengthSecondsDiff"].checked) {
                const num = Number(config["search"]["lengthSecondsDiff"].value);
                lengthSecondsDiff = Number.isFinite(num) ? num : 60;
              }
              const response = await searchVideo_default({
                q: text,
                targets: 0 < config["search"]["targets"].length ? config["search"]["targets"] : ["title"],
                fields: [
                  "contentId",
                  "title",
                  "channelId",
                  "viewCounter",
                  "lengthSeconds",
                  "thumbnailUrl",
                  "startTime",
                  "commentCounter",
                  "genre"
                ],
                filters: {
                  "categoryTags": "\u30A2\u30CB\u30E1",
                  "genre.keyword": "\u30A2\u30CB\u30E1",
                  "lengthSeconds": lengthSecondsDiff !== null ? [
                    videoData.video.duration - lengthSecondsDiff,
                    videoData.video.duration + lengthSecondsDiff
                  ] : null
                },
                _sort: `${config["search"]["sort"]["direction"]}${config["search"]["sort"]["field"]}`,
                _limit: "50"
              });
              if (0 < response.length) {
                const searchResultItemBase = getSearchResultItemTemplate();
                const items = document.createDocumentFragment();
                for (const data of response) {
                  if (data.contentId !== videoData.video.id && (config["search"]["onlyChannel"] ? data.channelId !== null && `ch${data.channelId}` !== videoData.channel.id : true)) {
                    const searchResultItem = searchResultItemBase.cloneNode(
                      true
                    );
                    if (extraVideoData !== void 0 && data.contentId === extraVideoData.video.id) {
                      searchResultItem.classList.add(
                        "ECT-SearchResult-Item--selected"
                      );
                    }
                    ECT_VP.search.setItem(searchResultItem, data);
                    items.appendChild(searchResultItem);
                  }
                }
                searchResult.appendChild(items);
              }
            } catch {
            }
          }
        }
        search.classList.remove("ect-isLoading");
      }
    },
    history: {
      push(target = [], value, max = 5) {
        if (value !== 0 && value !== "") {
          const idx = target.indexOf(value);
          if (idx !== -1) {
            target.push(target.splice(idx, 1)[0]);
          } else {
            target.push(value);
          }
          while (max < target.length) {
            target.shift();
          }
        }
      }
    }
  };
  var initializeVideoPicker = async () => {
    if (document.getElementById("ECT-VideoPicker-wrapper") === null || globalWindow["ECT_DATA"] === void 0 || globalWindow["ECT_DATA"]["videoData"] === void 0) {
      return;
    }
    const config = getConfig();
    globalWindow["ECT_VIDEOPICKER"] = await StorageAPI.get("ECT_VIDEOPICKER") || globalWindow["ECT_VIDEOPICKER"] || {};
    globalWindow["ECT_VIDEOPICKER_HISTORY"] = await StorageAPI.get("ECT_VIDEOPICKER_HISTORY") || globalWindow["ECT_VIDEOPICKER_HISTORY"] || {};
    const videoData = globalWindow["ECT_DATA"]["videoData"];
    const extraVideoData = globalWindow["ECT_DATA"]["extraVideoData"];
    if (extraVideoData !== void 0) {
      ECT_VP.nowExtraVideo.set(
        ECT_VP.util.convertVideoDataToSearchResult(extraVideoData)
      );
    } else {
      ECT_VP.nowExtraVideo.reset();
    }
    document.getElementById("ECT-CommentOffset-Area-Duration-end").textContent = formatDuration_default(videoData.video.duration);
    ECT_VP.search.setInput(extractWorkTitle_default(videoData.video.title));
    const ect_videopicker_history = globalWindow["ECT_VIDEOPICKER_HISTORY"];
    if (ect_videopicker_history !== void 0) {
      if (Array.isArray(ect_videopicker_history.offset) && 0 < ect_videopicker_history.offset.length) {
        document.getElementById("ECT-CommentOffset-list")?.remove();
        const datalistForOffset = document.createElement("datalist");
        datalistForOffset.id = "ECT-CommentOffset-list";
        for (const offset of ect_videopicker_history.offset.reverse()) {
          const option = document.createElement("option");
          option.value = offset.toString();
          datalistForOffset.appendChild(option);
        }
        document.getElementById("ECT-CommentOffset-input").insertAdjacentElement("afterend", datalistForOffset);
      }
    }
    let lengthSecondsDiff = null;
    if (config["search"]["lengthSecondsDiff"].checked) {
      const num = Number(config["search"]["lengthSecondsDiff"].value);
      lengthSecondsDiff = Number.isFinite(num) ? num : 60;
    }
    if (lengthSecondsDiff !== null) {
      if (lengthSecondsDiff <= 60) {
        const offsetInput = document.getElementById("ECT-CommentOffset-input");
        offsetInput.max = lengthSecondsDiff.toString();
        offsetInput.min = (lengthSecondsDiff * -1).toString();
      }
    } else {
      document.getElementById("ECT-CommentOffset-Area").style.setProperty("display", "none");
    }
  };
  var closeVideoPicker = () => {
    document.getElementById("ECT-VideoPicker-wrapper")?.remove();
  };
  var openVideoPicker = () => {
    if (document.getElementById("ECT-VideoPicker-wrapper") !== null || globalWindow["ECT_DATA"] === void 0 || globalWindow["ECT_DATA"]["videoData"] === void 0) {
      return;
    }
    const wrapper = document.createElement("div");
    wrapper.id = "ECT-VideoPicker-wrapper";
    wrapper.appendChild(getVideoPickerTemplate());
    wrapper.addEventListener("click", ({ target }) => {
      if (target instanceof HTMLElement && target.id === "ECT-VideoPicker-wrapper") {
        closeVideoPicker();
      }
    });
    document.body.appendChild(wrapper);
    document.getElementById("ECT-Version").textContent = `v${ECT_VERSION}`;
    setTimeout(
      async (videoData) => {
        await initializeVideoPicker();
        document.getElementById("ECT-Button-Setting").addEventListener("click", openConfig);
        document.getElementById("ECT-VideoInfo-remove").addEventListener("click", () => {
          ECT_VP.nowExtraVideo.reset();
        });
        document.getElementById("ECT-CommentOffset-input").addEventListener("input", ({ target }) => {
          if (!(target instanceof HTMLInputElement))
            return;
          let num = target.value.trim() !== "" ? parseInt(target.value) : null;
          if (Number.isFinite(num)) {
            target.value = num.toString();
            ECT_VP.nowExtraVideo.offset.onChange(num);
          } else if (target.value.trim() === "") {
            ECT_VP.nowExtraVideo.offset.onChange(0);
          }
        });
        document.getElementById("ECT-SearchBar-input").addEventListener("keydown", async ({ code, isComposing }) => {
          if (code === "Enter" && !isComposing) {
            await ECT_VP.search.fetch();
          }
        });
        document.getElementById("ECT-SearchBar-button").addEventListener("click", async () => {
          await ECT_VP.search.fetch();
        });
        document.getElementById("ECT-SearchResult").addEventListener("click", ({ target }) => {
          if (!(target instanceof HTMLElement))
            return;
          const item = target.closest(".ECT-SearchResult-Item");
          if (item instanceof HTMLElement) {
            for (const elem of item.parentElement.children) {
              elem.classList.remove("ECT-SearchResult-Item--selected");
            }
            const data = JSON.parse(item.getAttribute("ect-data"));
            ECT_VP.nowExtraVideo.set(data);
            item.classList.add("ECT-SearchResult-Item--selected");
          }
        });
        document.getElementById("ECT-Button-Close").addEventListener("click", () => {
          closeVideoPicker();
        });
        document.getElementById("ECT-Button-Ok").addEventListener("click", async () => {
          const ect_videopicker = globalWindow["ECT_VIDEOPICKER"];
          const ect_videopicker_history = globalWindow["ECT_VIDEOPICKER_HISTORY"];
          const extraVideoId = document.getElementById("ECT-VideoInfo").getAttribute("data-video-id");
          const extraVideoOffset = ECT_VP.nowExtraVideo.offset.get();
          if (extraVideoId != null) {
            if (ect_videopicker[videoData.video.id]?.id !== extraVideoId || ect_videopicker[videoData.video.id]?.offset !== extraVideoOffset) {
              ect_videopicker[videoData.video.id] = {
                id: extraVideoId,
                offset: extraVideoOffset
              };
              ect_videopicker_history.offset || (ect_videopicker_history.offset = []);
              ECT_VP.history.push(
                ect_videopicker_history.offset,
                extraVideoOffset
              );
              await StorageAPI.set("ECT_VIDEOPICKER", ect_videopicker);
              await StorageAPI.set(
                "ECT_VIDEOPICKER_HISTORY",
                ect_videopicker_history
              );
              reloadComment_default();
            }
          } else if (ect_videopicker[videoData.video.id] !== void 0) {
            delete ect_videopicker[videoData.video.id];
            await StorageAPI.set("ECT_VIDEOPICKER", ect_videopicker);
            reloadComment_default();
          }
          closeVideoPicker();
        });
        await ECT_VP.search.fetch();
        setTimeout(() => {
          const selected = document.body.getElementsByClassName(
            "ECT-SearchResult-Item--selected"
          )[0];
          selected?.scrollIntoView({ behavior: "auto", block: "center" });
        }, 100);
      },
      0,
      globalWindow["ECT_DATA"]["videoData"]
    );
  };
  document.addEventListener("ECT:openVideoPicker", openVideoPicker);
  document.addEventListener("ECT:closeVideoPicker", closeVideoPicker);

  // src/index.ts
  var isDev = true;
  var initialize = () => {
    injectStyle_default(style_default);
    if (!isChromeExtension()) {
      let GMRegisterMenuCommand = null;
      try {
        GMRegisterMenuCommand = GM_registerMenuCommand;
      } catch {
        try {
          GMRegisterMenuCommand = GM.registerMenuCommand;
        } catch {
        }
      }
      if (typeof GMRegisterMenuCommand === "function") {
        GMRegisterMenuCommand("\u958B\u304F", () => {
          document.dispatchEvent(new Event("ECT:open"));
        });
      }
    }
    getDocElem_default("body").insertAdjacentHTML("beforeend", VIDEOPICKER_TEMPLATE);
    document.addEventListener("ECT:open", () => {
      if (globalWindow["ECT_DATA"] !== void 0 && globalWindow["ECT_DATA"]["videoData"] !== void 0) {
        if (document.getElementById("ECT-VideoPicker-wrapper") === null) {
          openVideoPicker();
        } else {
          closeVideoPicker();
          closeConfig();
        }
      } else {
        if (document.getElementById("midconfig-wrapper") === null) {
          openConfig();
        } else {
          closeVideoPicker();
          closeConfig();
        }
      }
    });
  };
  var asyncInitialized = false;
  var asyncInitCnt = 0;
  var asyncInitialize = () => new Promise((resolve) => {
    if (!asyncInitialized) {
      setTimeout(() => {
        if (!asyncInitialized) {
          Promise.all([
            midconfig.init(),
            StorageAPI.get("ECT_VIDEOPICKER")
          ]).then((value) => {
            console.log("[ECT] config:", getConfig());
            globalWindow["ECT_VIDEOPICKER"] = value[1] || {};
            console.log(
              "[ECT] ECT_VIDEOPICKER:",
              globalWindow["ECT_VIDEOPICKER"]
            );
          }).finally(() => {
            asyncInitialized = true;
            asyncInitCnt = null;
            resolve();
          });
        } else {
          resolve();
        }
      }, 200 * asyncInitCnt++);
    } else {
      resolve();
    }
  });
  (() => {
    initialize();
    asyncInitialize();
    if (location.pathname.startsWith("/watch/")) {
      const ECT = {
        get videoId() {
          return location.pathname.split("/")[2];
        },
        getChannnelThreadsData(videoData) {
          return videoData?.comment?.threads?.filter((thread) => {
            return {
              main: "community",
              easy: "easy"
            }[thread.forkLabel] === thread.label;
          }) || [];
        },
        getExtraThreadsData(videoData) {
          return videoData?.comment?.threads?.filter((thread) => {
            return {
              main: "extra-community",
              easy: "extra-easy"
            }[thread.forkLabel] === thread.label;
          }) || [];
        },
        async getManualVideo(videoId, when) {
          try {
            const manualVideoData = await getVideoData_default(videoId);
            const manualVideoThreads = await getThreads_default(manualVideoData, when);
            return {
              videoData: manualVideoData,
              threads: manualVideoThreads
            };
          } catch (e) {
            if (isDev)
              console.error("[ECT] ERROR:", e);
          }
        },
        async getLinkedVideo(videoId, when) {
          try {
            const linkedVideoId = await getLinkedVideoId_default(videoId);
            const linkedVideoData = await getVideoData_default(linkedVideoId);
            const linkedVideoThreads = await getThreads_default(linkedVideoData, when);
            return {
              videoData: linkedVideoData,
              threads: linkedVideoThreads
            };
          } catch (e) {
          }
        },
        async getIdenticalVideo(videoData, when) {
          if (videoData === void 0 || videoData.video === void 0) {
            throw new Error("[ECT] ERROR: videoData is undefined");
          }
          try {
            const searchTitle = optimizeTitleForSearch_default(videoData.video.title);
            const duration = videoData.video.duration;
            console.log("[ECT] search title:", searchTitle);
            let searchResult;
            let filteredResult;
            try {
              const query = {
                targets: ["title"],
                filters: {
                  "categoryTags": "\u30A2\u30CB\u30E1",
                  "genre.keyword": "\u30A2\u30CB\u30E1",
                  "lengthSeconds": Number.isFinite(duration) ? [duration - 2, duration + 2] : null
                }
              };
              filterObject_default(query);
              searchResult = await searchVideo_default({
                q: searchTitle,
                ...query
              });
              console.log("[ECT] search result (1):", searchResult);
              if (!Array.isArray(searchResult) || searchResult.length <= 1) {
                searchResult = await searchVideo_default({
                  q: videoData.video.title,
                  ...query
                });
                console.log("[ECT] search result (2):", searchResult);
              }
              if (Array.isArray(searchResult) && 0 < searchResult.length) {
                filteredResult = searchResult.filter(
                  (val) => isEqualTitle_default(val.title, videoData.video.title) && val.contentId !== videoData.video.id && (val.channelId !== null || val.contentId.startsWith("so"))
                );
              }
            } catch (e) {
              if (isDev)
                console.error("[ECT] ERROR:", e);
            }
            if (!Array.isArray(filteredResult) || filteredResult[0] === void 0) {
              try {
                const query = {
                  genre: "anime",
                  sort: "f",
                  order: "d",
                  l_range: 1200 < duration ? "2" : null
                };
                filterObject_default(query);
                const res = await origFetch(
                  `https://www.nicovideo.jp/search/${encodeURIComponent(
                    searchTitle
                  )}?${new URLSearchParams(query)}`
                );
                const elem = generateDocumentByHTML_default(await res.text());
                searchResult = Array.from(
                  elem.querySelectorAll(
                    '.item[data-video-item][data-video-id^="so"]'
                  )
                ).filter((item) => {
                  const videoLength = item.getElementsByClassName("videoLength")[0].textContent.trim().split(":");
                  const videoDuration = videoLength.length === 2 ? Number(videoLength[0]) * 60 + Number(videoLength[1]) : 0;
                  return Math.abs(videoDuration - duration) <= 2;
                }).map((item) => ({
                  contentId: item.dataset.videoId,
                  title: item.querySelector(".itemTitle > a")?.title?.trim()
                }));
                console.log("[ECT] search result (3):", searchResult);
                if (Array.isArray(searchResult) && 0 < searchResult.length) {
                  filteredResult = searchResult.filter(
                    (val) => isEqualTitle_default(val.title, videoData.video.title) && val.contentId !== videoData.video.id && (val.channelId !== null || val.contentId.startsWith("so"))
                  );
                }
              } catch (e) {
                if (isDev)
                  console.error("[ECT] ERROR:", e);
              }
            }
            console.log("[ECT] search result (filtered):", filteredResult);
            if (Array.isArray(filteredResult) && filteredResult[0] !== void 0) {
              const identicalVideoData = await getVideoData_default(
                filteredResult[0].contentId
              );
              if (identicalVideoData?.channel?.isOfficialAnime) {
                const identicalVideoThreads = await getThreads_default(
                  identicalVideoData,
                  when
                );
                return {
                  videoData: identicalVideoData,
                  threads: identicalVideoThreads
                };
              }
            }
          } catch (e) {
            if (isDev)
              console.error("[ECT] ERROR:", e);
          }
        }
      };
      let origExtraThreadsOldNums = null;
      let origExtraThreads = null;
      globalWindow.fetch = new Proxy(globalWindow.fetch, {
        apply: async (target, thisArg, argArray) => {
          await asyncInitialize();
          if (argArray[1]?.method?.toUpperCase() === "POST") {
            if ((argArray[0].startsWith(THREADS_API_1) || argArray[0].startsWith(THREADS_API_2)) && argArray[0].endsWith("/nicorus") && origExtraThreadsOldNums !== null && origExtraThreads !== null) {
              try {
                console.log(
                  "[ECT] %c fetch (/nicorus) %c",
                  "color:white;background-color:blue;",
                  ""
                );
                const splitedUrl = argArray[0].split("/");
                const body = typeof argArray[1]?.body === "string" ? JSON.parse(argArray[1].body) : null;
                if (body !== null) {
                  const oldNums = origExtraThreadsOldNums[`${splitedUrl[5]}-${body.fork}`];
                  const oldNo = oldNums[body.no];
                  body.no = oldNo || body.no;
                  let isExtraComment = false;
                  for (const thread of origExtraThreads) {
                    if (!isExtraComment && thread.fork === body.fork) {
                      if (oldNo !== void 0) {
                        isExtraComment = Boolean(
                          thread.comments?.find(
                            (cmt) => cmt.no === oldNo && cmt.body === body.content
                          )
                        );
                        if (isExtraComment) {
                          splitedUrl[5] = thread.id;
                          body.videoId = thread.videoId;
                          body.nicoruKey = await getNicoruKey_default(
                            splitedUrl[5],
                            body.fork
                          );
                        }
                      }
                    }
                  }
                  argArray[0] = splitedUrl.join("/");
                  argArray[1].body = JSON.stringify(body);
                }
              } catch (e) {
                if (isDev)
                  console.error("[ECT] ERROR:", e);
              }
            }
          }
          let promise;
          try {
            promise = Reflect.apply(target, thisArg, argArray);
          } catch {
            promise = Promise.resolve(Response.error());
          }
          if (argArray[1]?.method?.toUpperCase() === "POST") {
            if (argArray[0] === THREADS_API_1 || argArray[0] === THREADS_API_2) {
              closeVideoPicker();
              const config = getConfig();
              let body = null;
              try {
                body = typeof argArray[1]?.body === "string" ? JSON.parse(argArray[1].body) : null;
              } catch (e) {
                if (isDev)
                  console.error("[ECT] ERROR:", e);
              }
              const pastCommentTime = body?.additionals?.when;
              let videoData;
              let extraVideoData;
              let manualVideo;
              let linkedVideo;
              let identicalVideo;
              let extraThreadsData = [];
              let channelThreadsData = [];
              let videoPickerData;
              origExtraThreads = null;
              origExtraThreadsOldNums = null;
              globalWindow["ECT_DATA"] = {};
              try {
                setTimeout(() => {
                  const removeElems = [
                    ...getDocElem_default("body").getElementsByClassName(
                      "FormattedNumber-mergedComment"
                    ),
                    ...getDocElem_default("body").getElementsByClassName(
                      "FormattedNumber-extraView"
                    ),
                    ...getDocElem_default("body").getElementsByClassName(
                      "KawaiiPctMeta"
                    )
                  ];
                  for (const elem of removeElems) {
                    elem.remove();
                  }
                }, 0);
                console.log(
                  "[ECT] %c fetch (/threads) %c",
                  "color:white;background-color:blue;",
                  ""
                );
                videoData = await getVideoData_default(ECT.videoId);
                if (!videoData?.channel?.isOfficialAnime) {
                  return promise;
                }
                globalWindow["ECT_DATA"]["videoData"] = videoData;
                console.log("[ECT] videoData:", videoData);
                videoPickerData = globalWindow["ECT_VIDEOPICKER"][videoData.video.id];
                console.log("[ECT] videoPickerData:", videoPickerData);
                if (videoPickerData !== void 0) {
                  manualVideo = await ECT.getManualVideo(
                    videoPickerData.id,
                    pastCommentTime
                  );
                  if (manualVideo !== void 0) {
                    extraThreadsData = ECT.getChannnelThreadsData(
                      manualVideo.videoData
                    );
                    if (extraThreadsData.length !== 0) {
                      extraVideoData = manualVideo.videoData;
                    }
                    if (videoPickerData.offset !== 0) {
                      const offsetMs = videoPickerData.offset * 1e3;
                      for (const thread of manualVideo.threads) {
                        for (const comment of thread.comments) {
                          comment.vposMs += offsetMs;
                        }
                        thread.comments = thread.comments.filter(
                          (comment) => 0 <= comment.vposMs && comment.vposMs <= videoData.video.duration * 1e3
                        );
                      }
                    }
                  }
                }
                console.log("[ECT] manualVideo:", manualVideo);
                if (videoData.channel.id === DANIME_CHANNEL_ID && extraThreadsData.length === 0) {
                  extraThreadsData = ECT.getExtraThreadsData(videoData);
                  if (extraThreadsData.length !== 0) {
                    extraVideoData = await getVideoData_default(
                      extraThreadsData[0].videoId
                    );
                  }
                } else if (!config["general"]["deleteExtra"] && config["general"]["mergeExtraFromDanime"] && extraThreadsData.length === 0) {
                  linkedVideo = await ECT.getLinkedVideo(
                    ECT.videoId,
                    pastCommentTime
                  );
                  if (linkedVideo !== void 0 && Math.abs(
                    videoData.video.duration - linkedVideo.videoData.video.duration
                  ) <= 2) {
                    extraThreadsData = ECT.getChannnelThreadsData(
                      linkedVideo.videoData
                    );
                    if (extraThreadsData.length !== 0) {
                      extraVideoData = linkedVideo.videoData;
                    }
                  }
                }
                console.log("[ECT] linkedVideo:", linkedVideo);
                if (!config["general"]["deleteExtra"] && config["general"]["forcedExtra"] && extraThreadsData.length === 0 && (videoData.channel.id === DANIME_CHANNEL_ID || config["general"]["mergeExtraFromDanime"])) {
                  identicalVideo = await ECT.getIdenticalVideo(
                    videoData,
                    pastCommentTime
                  );
                  if (identicalVideo !== void 0) {
                    extraThreadsData = ECT.getChannnelThreadsData(
                      identicalVideo.videoData
                    );
                    if (extraThreadsData.length !== 0) {
                      extraVideoData = identicalVideo.videoData;
                    }
                  }
                }
                console.log("[ECT] identicalVideo:", identicalVideo);
                console.log("[ECT] extraThreadsData:", extraThreadsData);
                channelThreadsData = ECT.getChannnelThreadsData(videoData);
                console.log("[ECT] channelThreadsData:", channelThreadsData);
                globalWindow["ECT_DATA"]["extraVideoData"] = extraVideoData;
                console.log("[ECT] extraVideoData:", extraVideoData);
              } catch (e) {
                if (isDev)
                  console.error("[ECT] ERROR:", e);
              }
              const response = await promise;
              try {
                const json = await response.json();
                console.log("[ECT] json:", json);
                let jsonThreads = json.data?.threads;
                if (Boolean(jsonThreads?.length)) {
                  let mergedCommentCount = 0;
                  for (const extraThreadData of extraThreadsData) {
                    try {
                      const extraThreadIdx = jsonThreads.findIndex(
                        (thread) => extraThreadData.id.toString() === thread.id && extraThreadData.forkLabel === thread.fork
                      );
                      if (config["general"]["deleteExtra"] && extraThreadIdx !== -1) {
                        delete jsonThreads[extraThreadIdx];
                      } else {
                        const targetThreadData = channelThreadsData.find(
                          (channelThread) => extraThreadData.forkLabel === channelThread.forkLabel && extraThreadData.label.indexOf(channelThread.label) !== -1
                        );
                        if (targetThreadData === void 0) {
                          continue;
                        }
                        const targetThreadIdx = jsonThreads.findIndex(
                          (thread) => targetThreadData.id.toString() === thread.id && targetThreadData.forkLabel === thread.fork
                        );
                        if (targetThreadIdx === -1) {
                          continue;
                        }
                        if (config["general"]["mergeExtraMain"] && extraThreadData.forkLabel === "main" || config["general"]["mergeExtraEasy"] && extraThreadData.forkLabel === "easy" && !config["general"]["deleteEasy"] || config["general"]["forcedExtra"] && identicalVideo !== void 0) {
                          let extraThread;
                          if (extraThreadIdx !== -1) {
                            extraThread = jsonThreads[extraThreadIdx];
                            delete jsonThreads[extraThreadIdx];
                          } else {
                            extraThread = (manualVideo || linkedVideo || identicalVideo)?.threads?.find(
                              (thread) => extraThreadData.id.toString() === thread.id && extraThreadData.forkLabel === thread.fork
                            );
                          }
                          if (extraThread == null) {
                            continue;
                          }
                          origExtraThreads || (origExtraThreads = []);
                          origExtraThreads.push(
                            JSON.parse(
                              JSON.stringify({
                                videoId: extraThreadData.videoId,
                                ...extraThread
                              })
                            )
                          );
                          mergedCommentCount += extraThread.commentCount;
                          const targetThread = jsonThreads[targetThreadIdx];
                          targetThread.comments.push(...extraThread.comments);
                          targetThread.comments.sort((a, b) => {
                            return new Date(a.postedAt).getTime() - new Date(b.postedAt).getTime();
                          });
                          const oldNums = [];
                          const commentsLength = targetThread.comments.length;
                          for (let no = 1; no <= commentsLength; no++) {
                            const comment = targetThread.comments[no - 1];
                            oldNums[no] = comment.no;
                            comment.no = no;
                          }
                          origExtraThreadsOldNums || (origExtraThreadsOldNums = {});
                          origExtraThreadsOldNums[`${targetThreadData.id}-${targetThreadData.forkLabel}`] = oldNums;
                          targetThread.commentCount += extraThread.commentCount;
                        }
                      }
                      jsonThreads = jsonThreads.filter(Boolean);
                    } catch (e) {
                      if (isDev)
                        console.error("[ECT] ERROR:", e);
                    }
                  }
                  if (config["general"]["deleteEasy"]) {
                    jsonThreads = jsonThreads.filter((v) => v.fork !== "easy");
                  }
                  if (config["general"]["showMergedCommentCount"] && mergedCommentCount !== 0) {
                    setTimeout(
                      (cnt) => {
                        const counter = document.querySelector(
                          ".CommentCountMeta-counter > .FormattedNumber"
                        );
                        counter?.insertAdjacentHTML(
                          "afterend",
                          `<span class="FormattedNumber-mergedComment">&nbsp;(+${cnt.toLocaleString()})</span>`
                        );
                      },
                      0,
                      mergedCommentCount
                    );
                  }
                  console.log(
                    `[ECT] \u7D71\u5408\u3057\u305F\u5F15\u7528\u30B3\u30E1\u30F3\u30C8\u6570: ${mergedCommentCount}`
                  );
                }
                if (config["general"]["showExtraViewCount"] && Boolean(extraVideoData?.video?.count?.view)) {
                  setTimeout(
                    (cnt) => {
                      const counter = document.querySelector(
                        ".VideoViewCountMeta-counter > .FormattedNumber"
                      );
                      counter?.insertAdjacentHTML(
                        "afterend",
                        `<span class="FormattedNumber-extraView">&nbsp;(+${cnt.toLocaleString()})</span>`
                      );
                    },
                    0,
                    extraVideoData.video.count.view
                  );
                }
                if (config["general"]["showKawaiiPct"]) {
                  let cmtCnt = 0;
                  let kawaiiCnt = 0;
                  for (const thread of jsonThreads) {
                    cmtCnt += thread.comments.length;
                    kawaiiCnt += thread.comments.filter(
                      (v) => /かわいい/.test(v.body)
                    ).length;
                  }
                  const kawaiiPct = Math.round(kawaiiCnt / cmtCnt * 10 * 100) / 10;
                  if (0 < kawaiiPct) {
                    setTimeout(
                      (pct) => {
                        try {
                          const commentCount = getDocElem_default("body").getElementsByClassName(
                            "CommentCountMeta"
                          )[0];
                          const kawaiiPctElem = commentCount?.cloneNode(true);
                          if (kawaiiPctElem instanceof HTMLElement) {
                            kawaiiPctElem.classList.add("KawaiiPctMeta");
                            kawaiiPctElem.getElementsByClassName(
                              "CommentCountMeta-title"
                            )[0].textContent = "\u304B\u308F\u3044\u3044\u7387";
                            kawaiiPctElem.getElementsByClassName(
                              "CommentCountMeta-counter"
                            )[0].textContent = `${pct}%`;
                            commentCount.insertAdjacentElement(
                              "afterend",
                              kawaiiPctElem
                            );
                          }
                        } catch (e) {
                          if (isDev)
                            console.error("[ECT] ERROR:", e);
                        }
                      },
                      0,
                      kawaiiPct
                    );
                  }
                }
                if (jsonThreads !== void 0) {
                  json.data.threads = jsonThreads;
                  if (config["general"]["showPopupMsg"]) {
                    if (manualVideo !== void 0) {
                      popup_default(
                        `\u300E${manualVideo.videoData.video.title}\u300F\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u624B\u52D5\u3067\u5F15\u7528\u3057\u3066\u3044\u307E\u3059`
                      );
                    } else if (identicalVideo !== void 0) {
                      popup_default(
                        `\u300E${identicalVideo.videoData.video.title}\u300F\u306E\u30B3\u30E1\u30F3\u30C8\u3092\u81EA\u52D5\u3067\u5F15\u7528\u3057\u307E\u3057\u305F`
                      );
                    }
                  }
                }
                return new Response(JSON.stringify(json), {
                  status: response.status,
                  statusText: response.statusText,
                  headers: response.headers
                });
              } catch (e) {
                if (isDev)
                  console.error("[ECT] ERROR:", e);
              }
            }
          }
          return promise;
        }
      });
      const obs_opt = {
        childList: true,
        subtree: true
      };
      const obs = new MutationObserver((mutationRecord) => {
        for (const { addedNodes } of mutationRecord) {
          for (const added of addedNodes) {
            if (added instanceof HTMLElement && added.classList.contains("ContextMenu-wrapper")) {
              obs.disconnect();
              const menuContainer = added.getElementsByClassName(
                "VideoContextMenuContainer"
              )[0];
              if (menuContainer instanceof HTMLElement) {
                const menuGroup = generateElementByHTML_default(ECT_MENU_GROUP);
                const ectButton = generateElementByHTML_default(ECT_MENUITEM);
                ectButton.addEventListener("click", () => {
                  document.dispatchEvent(new Event("ECT:open"));
                });
                menuGroup.appendChild(ectButton);
                menuContainer.appendChild(menuGroup);
              }
              obs.observe(getDocElem_default("body"), obs_opt);
            }
          }
        }
      });
      obs.observe(getDocElem_default("body"), obs_opt);
    }
  })();
})();