YouTube +

Вкладки для информации, комментариев, видео, плейлиста и скачивание видео и другие функции ↴

Verze ze dne 12. 06. 2025. Zobrazit nejnovější verzi.

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

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

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

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

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name            YouTube +
// @namespace       by
// @version         1.5
// @author          diorhc
// @description     Вкладки для информации, комментариев, видео, плейлиста и скачивание видео и другие функции ↴
// @description:en  Tabview YouTube and Download and others features ↴
// @match           https://*.youtube.com/*
// @include         https://www.youtube.com
// @include         *://*.youtube.com/**
// @exclude         *://accounts.youtube.com/*
// @exclude         *://www.youtube.com/live_chat_replay*
// @exclude         *://www.youtube.com/persist_identity*
// @exclude         /^https?://\w+\.youtube\.com\/live_chat.*$/
// @exclude         /^https?://\S+\.(txt|png|jpg|jpeg|gif|xml|svg|manifest|log|ini)[^\/]*$/
// @icon            https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @license         MIT
// @grant           none
// ==/UserScript==

if (typeof trustedTypes !== 'undefined' && trustedTypes.defaultPolicy === null) {
  let s = s => s;
  trustedTypes.createPolicy('default', { createHTML: s, createScriptURL: s, createScript: s });
}

const defaultPolicy = (typeof trustedTypes !== 'undefined' && trustedTypes.defaultPolicy) || { createHTML: s => s };
function createHTML(s) {
  return defaultPolicy.createHTML(s);
}

let trustHTMLErr = null;
try {
  document.createElement('div').innerHTML = createHTML('1');
} catch (e) {
  trustHTMLErr = e;
}

if (trustHTMLErr) {
  console.log(`trustHTMLErr`, trustHTMLErr);
  trustHTMLErr(); // exit userscript
}


// -----------------------------------------------------------------------------------------------------------------------------

const VAL_ROUNDED_A1 = 12;

const executionScript = (communicationKey) => {

  const DEBUG_5084 = false;


  if (typeof trustedTypes !== 'undefined' && trustedTypes.defaultPolicy === null) {
    let s = s => s;
    trustedTypes.createPolicy('default', { createHTML: s, createScriptURL: s, createScript: s });
  }

  const defaultPolicy = (typeof trustedTypes !== 'undefined' && trustedTypes.defaultPolicy) || { createHTML: s => s };
  function createHTML(s) {
    return defaultPolicy.createHTML(s);
  }

  let trustHTMLErr = null;
  try {
    document.createElement('div').innerHTML = createHTML('1');
  } catch (e) {
    trustHTMLErr = e;
  }

  if (trustHTMLErr) {
    console.log(`trustHTMLErr`, trustHTMLErr);
    trustHTMLErr(); // exit userscript
  }

  try {

    let executionFinished = 0;

    if (typeof CustomElementRegistry === 'undefined') return;
    if (CustomElementRegistry.prototype.define000) return;
    if (typeof CustomElementRegistry.prototype.define !== 'function') return;

    /** @type {HTMLElement} */
    const HTMLElement_ = HTMLElement.prototype.constructor;

    /**
     *  @param {Element} elm
     * @param {string} selector
     * @returns {Element | null}
     *  */
    const qsOne = (elm, selector) => {
      return HTMLElement_.prototype.querySelector.call(elm, selector);
    }

    /**
     *  @param {Element} elm
     * @param {string} selector
     * @returns {NodeListOf<Element>}
     *  */
    const qsAll = (elm, selector) => {
      return HTMLElement_.prototype.querySelectorAll.call(elm, selector);
    }

    const pdsBaseDF = Object.getOwnPropertyDescriptors(DocumentFragment.prototype);

    Object.defineProperties(DocumentFragment.prototype, {
      replaceChildren000: pdsBaseDF.replaceChildren,
    });

    const pdsBaseNode = Object.getOwnPropertyDescriptors(Node.prototype);
    // console.log(pdsBaseElement.setAttribute, pdsBaseElement.getAttribute)

    Object.defineProperties(Node.prototype, {
      appendChild000: pdsBaseNode.appendChild,
      insertBefore000: pdsBaseNode.insertBefore
    });

    // class BaseElement extends Element{

    // }
    const pdsBaseElement = Object.getOwnPropertyDescriptors(Element.prototype);
    // console.log(pdsBaseElement.setAttribute, pdsBaseElement.getAttribute)

    Object.defineProperties(Element.prototype, {
      setAttribute000: pdsBaseElement.setAttribute,
      getAttribute000: pdsBaseElement.getAttribute,
      hasAttribute000: pdsBaseElement.hasAttribute,
      removeAttribute000: pdsBaseElement.removeAttribute,
      querySelector000: pdsBaseElement.querySelector,
      replaceChildren000: pdsBaseElement.replaceChildren
    });

    Element.prototype.setAttribute111 = function (p, v) {
      v = `${v}`;
      if (this.getAttribute000(p) === v) return;
      this.setAttribute000(p, v)
    }

    Element.prototype.incAttribute111 = function (p) {
      let v = +this.getAttribute000(p) || 0;
      v = v > 1e9 ? v + 1 : 9;
      this.setAttribute000(p, `${v}`);
      return v;
    }

    Element.prototype.assignChildern111 = function (previousSiblings, node, nextSiblings) {
      // assume all previousSiblings, node, and nextSiblings are on the page
      //  -> only remove triggering is needed
      let nodeList = [];
      for (let t = this.firstChild; t instanceof Node; t = t.nextSibling) {
        if (t === node) continue;
        nodeList.push(t);
      }

      inPageRearrange = true;
      if (node.parentNode === this) {
        let fm = new DocumentFragment();
        if (nodeList.length > 0) {
          fm.replaceChildren000(...nodeList);
          // nodeList.length = 0;
        }
        // nodeList = null;
        if (previousSiblings && previousSiblings.length > 0) {
          fm.replaceChildren000(...previousSiblings);
          this.insertBefore000(fm, node);
        }
        if (nextSiblings && nextSiblings.length > 0) {
          fm.replaceChildren000(...nextSiblings);
          this.appendChild000(fm);
        }
        fm.replaceChildren000();
        fm = null;
      } else {
        if (!previousSiblings) previousSiblings = [];
        if (!nextSiblings) nextSiblings = [];
        this.replaceChildren000(...previousSiblings, node, ...nextSiblings);
      }
      inPageRearrange = false;
      if (nodeList.length > 0) {
        for (const t of nodeList) {
          if (t instanceof Element && t.isConnected === false) t.remove(); // remove triggering
        }
      }
      nodeList.length = 0;
      nodeList = null;
    }


    // ==============================================================================================================================================================================================================================================================================

    const DISABLE_FLAGS_SHADYDOM_FREE = true;

    /**
     * 
     * Minified Code from https://greasyfork.org/en/scripts/475632-ytconfighacks/code (ytConfigHacks)
     * Date: 2024.04.17
     * Minifier: https://www.toptal.com/developers/javascript-minifier
     * 
     */
    (() => {
      let e = "undefined" != typeof unsafeWindow ? unsafeWindow : this instanceof Window ?
        this : window; if (!e._ytConfigHacks) {
          let t = 4; class n extends Set {
            add(e) {
              if (t <= 0) return console.warn(
                "yt.config_ is already applied on the page."); "function" == typeof e && super.add(e)
            }
          } let a = (async () => { })()
            .constructor, i = e._ytConfigHacks = new n, l = () => { let t = e.ytcsi.originalYtcsi; t && (e.ytcsi = t, l = null) },
            c = null, o = () => {
              if (t >= 1) {
                let n = (e.yt || 0).config_ || (e.ytcfg || 0).data_ || 0; if ("string" == typeof n.
                  INNERTUBE_API_KEY && "object" == typeof n.EXPERIMENT_FLAGS) for (let a of (--t <= 0 && l && l(), c = !0, i)) a(n)
              }
            }, f = 1,
            d = t => {
              if (t = t || e.ytcsi) return e.ytcsi = new Proxy(t, { get: (e, t, n) => "originalYtcsi" === t ? e : (o(), c && --f <= 0 && l && l(), e[t]) })
                , !0
            }; d() || Object.defineProperty(e, "ytcsi", {
              get() { }, set: t => (t && (delete e.ytcsi, d(t)), !0), enumerable: !1, configurable: !0
            }); let { addEventListener: s, removeEventListener: y } = Document.prototype; function r(t) {
              o(),
                t && e.removeEventListener("DOMContentLoaded", r, !1)
            } new a(e => {
              if ("undefined" != typeof AbortSignal) s.call(document,
                "yt-page-data-fetched", e, { once: !0 }), s.call(document, "yt-navigate-finish", e, { once: !0 }), s.call(document, "spfdone", e,
                  { once: !0 }); else {
                let t = () => {
                  e(), y.call(document, "yt-page-data-fetched", t, !1), y.call(document, "yt-navigate-finish", t, !1),
                    y.call(document, "spfdone", t, !1)
                }; s.call(document, "yt-page-data-fetched", t, !1), s.call(document, "yt-navigate-finish", t, !1),
                  s.call(document, "spfdone", t, !1)
              }
            }).then(o), new a(e => {
              if ("undefined" != typeof AbortSignal) s.call(document, "yt-action", e,
                { once: !0, capture: !0 }); else { let t = () => { e(), y.call(document, "yt-action", t, !0) }; s.call(document, "yt-action", t, !0) }
            }).then(o),
              a.resolve().then(() => { "loading" !== document.readyState ? r() : e.addEventListener("DOMContentLoaded", r, !1) })
        }
    })();

    let configOnce = false;
    window._ytConfigHacks.add((config_) => {
      if (configOnce) return;
      configOnce = true;

      const EXPERIMENT_FLAGS = config_.EXPERIMENT_FLAGS || 0;
      const EXPERIMENTS_FORCED_FLAGS = config_.EXPERIMENTS_FORCED_FLAGS || 0;
      for (const flags of [EXPERIMENT_FLAGS, EXPERIMENTS_FORCED_FLAGS]) {
        if (flags) {
          // flags.kevlar_watch_metadata_refresh_no_old_secondary_data = false;
          // flags.live_chat_overflow_hide_chat = false;
          flags.web_watch_chat_hide_button_killswitch = false;
          flags.web_watch_theater_chat = false; // for re-openable chat (ytd-watch-flexy's liveChatCollapsed is always undefined)
          flags.suppress_error_204_logging = true;
          flags.kevlar_watch_grid = false;  // A/B testing for watch grid

          if (DISABLE_FLAGS_SHADYDOM_FREE) {
            flags.enable_shadydom_free_scoped_node_methods = false;
            flags.enable_shadydom_free_scoped_query_methods = false;
            flags.enable_shadydom_free_scoped_readonly_properties_batch_one = false;
            flags.enable_shadydom_free_parent_node = false;
            flags.enable_shadydom_free_children = false;
            flags.enable_shadydom_free_last_child = false;
          }
        }
      }

    });

    // ==============================================================================================================================================================================================================================================================================


    /* globals WeakRef:false */

    /** @type {(o: Object | null) => WeakRef | null} */
    const mWeakRef = typeof WeakRef === 'function' ? (o => o ? new WeakRef(o) : null) : (o => o || null); // typeof InvalidVar == 'undefined'

    /** @type {(wr: Object | null) => Object | null} */
    const kRef = (wr => (wr && wr.deref) ? wr.deref() : wr);


    /** @type {globalThis.PromiseConstructor} */
    const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.

    const delayPn = delay => new Promise((fn => setTimeout(fn, delay)));

    const insp = o => o ? (o.polymerController || o.inst || o || 0) : (o || 0);

    const setTimeout_ = setTimeout.bind(window);

    const PromiseExternal = ((resolve_, reject_) => {
      const h = (resolve, reject) => { resolve_ = resolve; reject_ = reject };
      return class PromiseExternal extends Promise {
        constructor(cb = h) {
          super(cb);
          if (cb === h) {
            /** @type {(value: any) => void} */
            this.resolve = resolve_;
            /** @type {(reason?: any) => void} */
            this.reject = reject_;
          }
        }
      };
    })();

    // ------------------------------------------------------------------------ nextBrowserTick ------------------------------------------------------------------------
    var nextBrowserTick = void 0 !== nextBrowserTick && nextBrowserTick.version >= 2 ? nextBrowserTick : (() => {
      "use strict"; const e = "undefined" != typeof self ? self : "undefined" != typeof global ? global : this;
      let t = !0; if (! function n(s) {
        return s ? t = !1 : e.postMessage && !e.importScripts && e.addEventListener ? (e.addEventListener("message", n, !1), e.postMessage("$$$", "*"), e.removeEventListener("message", n, !1), t) : void 0
      }()) return void console.warn("Your browser environment cannot use nextBrowserTick");
      const n = (async () => { })().constructor; let s = null;
      const o = new Map, { floor: r, random: i } = Math; let l;
      do { l = `$$nextBrowserTick$$${(i() + 8).toString().slice(2)}$$` } while (l in e); const a = l,
        c = a.length + 9;
      e[a] = 1;
      e.addEventListener("message", (e => {
        if (0 !== o.size) {
          const t = (e || 0).data; if ("string" == typeof t && t.length === c && e.source === (e.target || 1)) {
            const e = o.get(t);
            e && ("p" === t[0] && (s = null), o.delete(t), e())
          }
        }
      }), !1); const d = (t = o) => {
        if (t === o) {
          if (s) return s; let t;
          do { t = `p${a}${r(314159265359 * i() + 314159265359).toString(36)}` } while (o.has(t)); return s = new n((e => { o.set(t, e) })), e.postMessage(t, "*"), t = null, s
        } {
          let n;
          do { n = `f${a}${r(314159265359 * i() + 314159265359).toString(36)}` } while (o.has(n));
          o.set(n, t), e.postMessage(n, "*")
        }
      }; return d.version = 2, d
    })();

    // ------------------------------------------------------------------------ nextBrowserTick ------------------------------------------------------------------------

    const isPassiveArgSupport = (typeof IntersectionObserver === 'function');
    const bubblePassive = isPassiveArgSupport ? { capture: false, passive: true } : false;
    const capturePassive = isPassiveArgSupport ? { capture: true, passive: true } : true;



    class Attributer {
      constructor(list) {
        this.list = list;
        this.flag = 0;
      }
      makeString() {
        let k = 1;
        let s = '';
        let i = 0;
        while (this.flag >= k) {
          if (this.flag & k) {
            s += this.list[i];
          }
          i++;
          k <<= 1;
        }
        return s;
      }
    }

    const mLoaded = new Attributer('icp');

    const wrSelfMap = new WeakMap();

    /** @type {Object.<string, Element | null>} */
    const elements = new Proxy({
      related: null,
      comments: null,
      infoExpander: null,
    }, {
      get(target, prop) {
        return kRef(target[prop]);
      },
      set(target, prop, value) {
        if (value) {
          let wr = wrSelfMap.get(value);
          if (!wr) {
            wr = mWeakRef(value);
            wrSelfMap.set(value, wr);
          }
          target[prop] = wr;
        } else {
          target[prop] = null;
        }
        return true;
      }
    });
    const getMainInfo = () => {
      const infoExpander = elements.infoExpander;
      if (!infoExpander) return null;
      const mainInfo = infoExpander.matches('[tyt-main-info]') ? infoExpander : infoExpander.querySelector000('[tyt-main-info]');
      return mainInfo || null;
    }
    const asyncWrap = (asyncFn) => {
      return () => {
        Promise.resolve().then(asyncFn);
      };
    }


    let pageType = null;

    let pageLang = 'en';
    const langWords = {
      'en': {
        //'share':'Share',
        'info': 'Info',
        'videos': 'Videos',
        'playlist': 'Playlist'
      },
      'jp': {
        //'share':'共有',
        'info': '情報',
        'videos': '動画',
        'playlist': '再生リスト'
      },
      'tw': {
        //'share':'分享',
        'info': '資訊',
        'videos': '影片',
        'playlist': '播放清單'
      },
      'cn': {
        //'share':'分享',
        'info': '资讯',
        'videos': '视频',
        'playlist': '播放列表'
      },
      'du': {
        //'share':'Teilen',
        'info': 'Info',
        'videos': 'Videos',
        'playlist': 'Playlist'
      },
      'fr': {
        //'share':'Partager',
        'info': 'Info',
        'videos': 'Vidéos',
        'playlist': 'Playlist'
      },
      'kr': {
        //'share':'공유',
        'info': '정보',
        'videos': '동영상',
        'playlist': '재생목록'
      },
      'ru': {
        //'share':'Поделиться',
        'info': 'Описание',
        'videos': 'Видео',
        'playlist': 'Плейлист'
      }
    };

    const svgComments = `<path d="M80 27H12A12 12 90 0 0 0 39v42a12 12 90 0 0 12 12h12v20a2 2 90 0 0 3.4 2L47 93h33a12 
  12 90 0 0 12-12V39a12 12 90 0 0-12-12zM20 47h26a2 2 90 1 1 0 4H20a2 2 90 1 1 0-4zm52 28H20a2 2 90 1 1 0-4h52a2 2 90 
  1 1 0 4zm0-12H20a2 2 90 1 1 0-4h52a2 2 90 1 1 0 4zm36-58H40a12 12 90 0 0-12 12v6h52c9 0 16 7 16 16v42h0v4l7 7a2 2 90 
  0 0 3-1V71h2a12 12 90 0 0 12-12V17a12 12 90 0 0-12-12z"/>`.trim();

    const svgVideos = `<path d="M89 10c0-4-3-7-7-7H7c-4 0-7 3-7 7v70c0 4 3 7 7 7h75c4 0 7-3 7-7V10zm-62 2h13v10H27V12zm-9 
  66H9V68h9v10zm0-56H9V12h9v10zm22 56H27V68h13v10zm-3-25V36c0-2 2-3 4-2l12 8c2 1 2 4 0 5l-12 8c-2 1-4 0-4-2zm25 
  25H49V68h13v10zm0-56H49V12h13v10zm18 56h-9V68h9v10zm0-56h-9V12h9v10z"/>`.trim();

    const svgInfo = `<path d="M30 0C13.3 0 0 13.3 0 30s13.3 30 30 30 30-13.3 30-30S46.7 0 30 0zm6.2 46.6c-1.5.5-2.6 
  1-3.6 1.3a10.9 10.9 0 0 1-3.3.5c-1.7 0-3.3-.5-4.3-1.4a4.68 4.68 0 0 1-1.6-3.6c0-.4.2-1 .2-1.5a20.9 20.9 90 0 1 
  .3-2l2-6.8c.1-.7.3-1.3.4-1.9a8.2 8.2 90 0 0 .3-1.6c0-.8-.3-1.4-.7-1.8s-1-.5-2-.5a4.53 4.53 0 0 0-1.6.3c-.5.2-1 
  .2-1.3.4l.6-2.1c1.2-.5 2.4-1 3.5-1.3s2.3-.6 3.3-.6c1.9 0 3.3.6 4.3 1.3s1.5 2.1 1.5 3.5c0 .3 0 .9-.1 1.6a10.4 10.4 
  90 0 1-.4 2.2l-1.9 6.7c-.2.5-.2 1.1-.4 1.8s-.2 1.3-.2 1.6c0 .9.2 1.6.6 1.9s1.1.5 2.1.5a6.1 6.1 90 0 0 1.5-.3 9 9 90 
  0 0 1.4-.4l-.6 2.2zm-3.8-35.2a1 1 0 010 8.6 1 1 0 010-8.6z"/>`.trim();

    const svgPlayList = `<path d="M0 3h12v2H0zm0 4h12v2H0zm0 4h8v2H0zm16 0V7h-2v4h-4v2h4v4h2v-4h4v-2z"/>`.trim();

    const svgDiag1 = `<svg stroke="currentColor" fill="none"><path d="M8 2h2v2M7 5l3-3m-6 8H2V8m0 2l3-3"/></svg>`;
    const svgDiag2 = `<svg stroke="currentColor" fill="none"><path d="M7 3v2h2M7 5l3-3M5 9V7H3m-1 3l3-3"/></svg>`;


    const getGMT = () => {
      let m = new Date('2023-01-01T00:00:00Z');
      return m.getDate() === 1 ? `+${m.getHours()}` : `-${24 - m.getHours()}`;
    };

    function getWord(tag) {
      return langWords[pageLang][tag] || langWords['en'][tag] || '';
    }

    const svgElm = (w, h, vw, vh, p, m) => `<svg${m ? ` class=${m}` : ''} width="${w}" height="${h}" viewBox="0 0 ${vw} ${vh}" preserveAspectRatio="xMidYMid meet">${p}</svg>`

    let hiddenTabsByUserCSS = 0;

    function getTabsHTML() {

      const sTabBtnVideos = `${svgElm(16, 16, 90, 90, svgVideos)}<span>${getWord('videos')}</span>`;
      const sTabBtnInfo = `${svgElm(16, 16, 60, 60, svgInfo)}<span>${getWord('info')}</span>`;
      const sTabBtnPlayList = `${svgElm(16, 16, 20, 20, svgPlayList)}<span>${getWord('playlist')}</span>`;

      let str1 = `
        <paper-ripple class="style-scope yt-icon-button">
            <div id="background" class="style-scope paper-ripple" style="opacity:0;"></div>
            <div id="waves" class="style-scope paper-ripple"></div>
        </paper-ripple>
        `;

      let str_fbtns = `
    <div class="font-size-right">
    <div class="font-size-btn font-size-plus" tyt-di="8rdLQ">
    <svg width="12" height="12" viewbox="0 0 50 50" preserveAspectRatio="xMidYMid meet" 
    stroke="currentColor" stroke-width="6" stroke-linecap="round" vector-effect="non-scaling-size">
      <path d="M12 25H38M25 12V38"/>
    </svg>
    </div><div class="font-size-btn font-size-minus" tyt-di="8rdLQ">
    <svg width="12" height="12" viewbox="0 0 50 50" preserveAspectRatio="xMidYMid meet"
    stroke="currentColor" stroke-width="6" stroke-linecap="round" vector-effect="non-scaling-size">
      <path d="M12 25h26"/>
    </svg>
    </div>
    </div>
    `.replace(/[\r\n]+/g, '');

      const str_tabs = [
        `<a id="tab-btn1" tyt-di="q9Kjc" tyt-tab-content="#tab-info" class="tab-btn${(hiddenTabsByUserCSS & 1) === 1 ? ' tab-btn-hidden' : ''}">${sTabBtnInfo}${str1}${str_fbtns}</a>`,
        `<a id="tab-btn3" tyt-di="q9Kjc" tyt-tab-content="#tab-comments" class="tab-btn${(hiddenTabsByUserCSS & 2) === 2 ? ' tab-btn-hidden' : ''}">${svgElm(16, 16, 120, 120, svgComments)}<span id="tyt-cm-count"></span>${str1}${str_fbtns}</a>`,
        `<a id="tab-btn4" tyt-di="q9Kjc" tyt-tab-content="#tab-videos" class="tab-btn${(hiddenTabsByUserCSS & 4) === 4 ? ' tab-btn-hidden' : ''}">${sTabBtnVideos}${str1}${str_fbtns}</a>`,
        `<a id="tab-btn5" tyt-di="q9Kjc" tyt-tab-content="#tab-list" class="tab-btn tab-btn-hidden">${sTabBtnPlayList}${str1}${str_fbtns}</a>`
      ].join('');

      let addHTML = `
        <div id="right-tabs">
            <tabview-view-pos-thead></tabview-view-pos-thead>
            <header>
                <div id="material-tabs">
                    ${str_tabs}
                </div>
            </header>
            <div class="tab-content">
                <div id="tab-info" class="tab-content-cld tab-content-hidden" tyt-hidden userscript-scrollbar-render></div>
                <div id="tab-comments" class="tab-content-cld tab-content-hidden" tyt-hidden userscript-scrollbar-render></div>
                <div id="tab-videos" class="tab-content-cld tab-content-hidden" tyt-hidden userscript-scrollbar-render></div>
                <div id="tab-list" class="tab-content-cld tab-content-hidden" tyt-hidden userscript-scrollbar-render></div>
            </div>
        </div>
        `;

      return addHTML;

    }


    function getLang() {

      let lang = 'en';
      let htmlLang = ((document || 0).documentElement || 0).lang || '';
      switch (htmlLang) {
        case 'en':
        case 'en-GB':
          lang = 'en';
          break;
        case 'de':
        case 'de-DE':
          lang = 'du';
          break;
        case 'fr':
        case 'fr-CA':
        case 'fr-FR':
          lang = 'fr';
          break;
        case 'zh-Hant':
        case 'zh-Hant-HK':
        case 'zh-Hant-TW':
          lang = 'tw';
          break;
        case 'zh-Hans':
        case 'zh-Hans-CN':
          lang = 'cn';
          break;
        case 'ja':
        case 'ja-JP':
          lang = 'jp';
          break;
        case 'ko':
        case 'ko-KR':
          lang = 'kr';
          break;
        case 'ru':
        case 'ru-RU':
          lang = 'ru';
          break;
        default:
          lang = 'en';
      }

      return lang;

    }

    function getLangForPage() {

      let lang = getLang();

      if (langWords[lang]) pageLang = lang; else pageLang = 'en';

    }

    /** @type {Object.<string, number>} */
    const _locks = {}

    const lockGet = new Proxy(_locks,
      {
        get(target, prop) {
          return (target[prop] || 0);
        },
        set(target, prop, val) {
          return true;
        }
      }
    );

    const lockSet = new Proxy(_locks,
      {
        get(target, prop) {
          if (target[prop] > 1e9) target[prop] = 9;
          return (target[prop] = (target[prop] || 0) + 1);
        },
        set(target, prop, val) {
          return true;
        }
      }
    );

    // note: xxxxxxxxxAsyncLock is not expected for calling multiple time in a short period.
    //       it is just to split the process into microTasks.

    const videosElementProvidedPromise = new PromiseExternal();
    const navigateFinishedPromise = new PromiseExternal();

    let isRightTabsInserted = false;
    const rightTabsProvidedPromise = new PromiseExternal();

    const infoExpanderElementProvidedPromise = new PromiseExternal();

    const cmAttr = document.createComment('1');
    const cmAttrStack = [];
    const cmAttrStackPush = (f) => {
      cmAttrStack.push(f);
      cmAttr.data = `${(cmAttr.data & 7) + 1}`;
    }
    const cmAttrObs = new MutationObserver(() => {
      const l = cmAttrStack.length;
      for (let i = 0; i < l; i++) {
        cmAttrStack[i]();
      }
    });
    cmAttrObs.observe(cmAttr, { characterData: true });


    const funcCanCollapse = function (s) {
      // if (!s) return;
      const content = this.content || this.$.content;
      this.canToggle = this.shouldUseNumberOfLines && (this.alwaysCollapsed || this.collapsed || (this.isToggled === false))
        ? this.alwaysToggleable || this.isToggled || (content && content.offsetHeight < content.scrollHeight)
        : this.alwaysToggleable || this.isToggled || (content && content.scrollHeight > this.collapsedHeight)
    };

    const aoChatAttrChangeFn = async (lockId) => {
      if (lockGet['aoChatAttrAsyncLock'] !== lockId) return;

      const chatElm = elements.chat;
      const ytdFlexyElm = elements.flexy;
      // console.log(1882, chatElm, ytdFlexyElm)
      if (chatElm && ytdFlexyElm) {

        const isChatCollapsed = chatElm.hasAttribute000('collapsed');
        if (isChatCollapsed) {

          ytdFlexyElm.setAttribute111('tyt-chat-collapsed', '')
        } else {

          ytdFlexyElm.removeAttribute000('tyt-chat-collapsed')
        }

        ytdFlexyElm.setAttribute111('tyt-chat', isChatCollapsed ? '-' : '+');

      }
    };

    // const aoInfoAttrChangeFn = async (lockId) => {
    //   if (lockGet['aoInfoAttrAsyncLock'] !== lockId) return;
    // };

    // const zoInfoAttrChangeFn = async (lockId) => {
    //   if (lockGet['zoInfoAttrAsyncLock'] !== lockId) return;
    // };

    const aoPlayListAttrChangeFn = async (lockId) => {
      if (lockGet['aoPlayListAttrAsyncLock'] !== lockId) return;

      const playlistElm = elements.playlist;
      const ytdFlexyElm = elements.flexy;
      // console.log(1882, chatElm, ytdFlexyElm)
      if (playlistElm && ytdFlexyElm) {
        if (playlistElm.hasAttribute000('collapsed')) {
          ytdFlexyElm.removeAttribute000('tyt-playlist-expanded')
        } else {

          ytdFlexyElm.setAttribute111('tyt-playlist-expanded', '')
        }
      } else if (ytdFlexyElm) {

        ytdFlexyElm.removeAttribute000('tyt-playlist-expanded')
      }
    };

    const aoChat = new MutationObserver(() => {
      Promise.resolve(lockSet['aoChatAttrAsyncLock']).then(aoChatAttrChangeFn).catch(console.warn);
    });

    // const aoInfo = new MutationObserver(()=>{
    //   Promise.resolve(lockSet['aoInfoAttrAsyncLock']).then(aoInfoAttrChangeFn).catch(console.warn);
    // });

    // const zoInfo = new MutationObserver(()=>{
    //   Promise.resolve(lockSet['zoInfoAttrAsyncLock']).then(zoInfoAttrChangeFn).catch(console.warn);
    // });

    const aoPlayList = new MutationObserver(() => {
      Promise.resolve(lockSet['aoPlayListAttrAsyncLock']).then(aoPlayListAttrChangeFn).catch(console.warn);
    });

    const aoComment = new MutationObserver(async (mutations) => {
      const commentsArea = elements.comments;
      const ytdFlexyElm = elements.flexy;

      //tyt-comments-video-id //tyt-comments-data-status // hidden
      if (!commentsArea) return;
      let bfHidden = false;
      let bfCommentsVideoId = false;
      let bfCommentDisabled = false;
      for (const mutation of mutations) {
        if (mutation.attributeName === 'hidden' && mutation.target === commentsArea) {
          bfHidden = true;
        } else if (mutation.attributeName === 'tyt-comments-video-id' && mutation.target === commentsArea) {
          bfCommentsVideoId = true;
        } else if (mutation.attributeName === 'tyt-comments-data-status' && mutation.target === commentsArea) {
          bfCommentDisabled = true;
        }
      }

      if (bfHidden) {

        if (!commentsArea.hasAttribute000('hidden')) {
          Promise.resolve(commentsArea).then(eventMap['settingCommentsVideoId']).catch(console.warn);
        }

        Promise.resolve(lockSet['removeKeepCommentsScrollerLock']).then(removeKeepCommentsScroller).catch(console.warn);
      }

      if ((bfHidden || bfCommentsVideoId || bfCommentDisabled) && ytdFlexyElm) {

        const commentsDataStatus = +commentsArea.getAttribute000('tyt-comments-data-status');
        if (commentsDataStatus === 2) {
          ytdFlexyElm.setAttribute111('tyt-comment-disabled', '')
        } else if (commentsDataStatus === 1) {
          ytdFlexyElm.removeAttribute000('tyt-comment-disabled')
        }

        Promise.resolve(lockSet['checkCommentsShouldBeHiddenLock']).then(eventMap['checkCommentsShouldBeHidden']).catch(console.warn);


        const lockId = lockSet['rightTabReadyLock01'];
        await rightTabsProvidedPromise.then();
        if (lockGet['rightTabReadyLock01'] !== lockId) return;

        if (elements.comments !== commentsArea) return;
        if (commentsArea.isConnected === false) return;
        // console.log(7932, 'comments');

        if (commentsArea.closest('#tab-comments')) {
          const shouldTabVisible = !commentsArea.closest('[hidden]');
          document.querySelector('[tyt-tab-content="#tab-comments"]').classList.toggle('tab-btn-hidden', !shouldTabVisible);
        }

      }


    });

    const ioComment = new IntersectionObserver((entries) => {

      for (const entry of entries) {
        const target = entry.target;
        const cnt = insp(target);
        if (entry.isIntersecting && target instanceof HTMLElement_ && typeof cnt.calculateCanCollapse === 'function') {
          lockSet['removeKeepCommentsScrollerLock'];
          cnt.calculateCanCollapse(true);
          target.setAttribute111('io-intersected', '');
          const ytdFlexyElm = elements.flexy;
          if (ytdFlexyElm && !ytdFlexyElm.hasAttribute000('keep-comments-scroller')) {
            ytdFlexyElm.setAttribute111('keep-comments-scroller', '');
          }
        } else if (target.hasAttribute000('io-intersected')) {

          target.removeAttribute000('io-intersected');
        }
      }

    }, {
      threshold: [0],
      rootMargin: "32px" // enlarging viewport for getting intersection earlier
    });


    let bFixForResizedTabLater = false;
    let lastRoRightTabsWidth = 0;
    const roRightTabs = new ResizeObserver((entries) => {
      const entry = entries[entries.length - 1];
      const width = Math.round(entry.borderBoxSize.inlineSize);
      if (lastRoRightTabsWidth !== width) {
        lastRoRightTabsWidth = width;
        if ((tabAStatus & 2) === 2) {
          bFixForResizedTabLater = false;
          Promise.resolve(1).then(eventMap['fixForTabDisplay']);
        } else {
          bFixForResizedTabLater = true;
        }
      }
      // console.log('resize')
    });

    const switchToTab = (activeLink) => {

      if (typeof activeLink === 'string') {
        activeLink = document.querySelector(`a[tyt-tab-content="${activeLink}"]`) || null;
      }

      const ytdFlexyElm = elements.flexy;


      const links = document.querySelectorAll('#material-tabs a[tyt-tab-content]');

      //console.log(701, activeLink)

      for (const link of links) {
        const content = document.querySelector(link.getAttribute000('tyt-tab-content'));
        if (link && content) {
          if (link !== activeLink) {
            link.classList.remove("active");
            content.classList.add("tab-content-hidden");
            if (!content.hasAttribute000("tyt-hidden")) {
              content.setAttribute111("tyt-hidden", ""); // for https://greasyfork.org/en/scripts/456108
            }
          } else {
            link.classList.add("active");
            if (content.hasAttribute000("tyt-hidden")) {
              content.removeAttribute000("tyt-hidden"); // for https://greasyfork.org/en/scripts/456108
            }
            content.classList.remove("tab-content-hidden");
          }
        }
      }

      const switchingTo = activeLink ? activeLink.getAttribute000('tyt-tab-content') : '';
      if (switchingTo) {
        lastTab = lastPanel = switchingTo
      }

      if (ytdFlexyElm.getAttribute000('tyt-chat') === '') ytdFlexyElm.removeAttribute000('tyt-chat');
      ytdFlexyElm.setAttribute111('tyt-tab', switchingTo);

      if (switchingTo) {
        bFixForResizedTabLater = false;
        Promise.resolve(0).then(eventMap['fixForTabDisplay']);
      }

    }

    let tabAStatus = 0;
    const calculationFn = (r = 0, flag) => {
      const ytdFlexyElm = elements.flexy;
      if (!ytdFlexyElm) return r;
      if (flag & 1) {
        r |= 1;
        if (!ytdFlexyElm.hasAttribute000('theater')) r -= 1;
      }
      if (flag & 2) {
        r |= 2;
        if (!ytdFlexyElm.getAttribute000('tyt-tab')) r -= 2;
      }
      if (flag & 4) {
        r |= 4;
        if (ytdFlexyElm.getAttribute000('tyt-chat') !== '-') r -= 4;
      }
      if (flag & 8) {
        r |= 8;
        if (ytdFlexyElm.getAttribute000('tyt-chat') !== '+') r -= 8;
      }
      if (flag & 16) {
        r |= 16;
        if (!ytdFlexyElm.hasAttribute000('is-two-columns_')) r -= 16;
      }
      if (flag & 32) {
        r |= 32;
        if (!ytdFlexyElm.hasAttribute000('tyt-egm-panel_')) r -= 32;
      }
      if (flag & 64) {

        r |= 64;
        if (!document.fullscreenElement) r -= 64;
      }

      if (flag & 128) {
        r |= 128;
        if (!ytdFlexyElm.hasAttribute000('tyt-playlist-expanded')) r -= 128;
      }
      return r;

    }

    function isTheater() {
      const ytdFlexyElm = elements.flexy;
      return (ytdFlexyElm && ytdFlexyElm.hasAttribute000('theater'))
    }

    function ytBtnSetTheater() {
      if (!isTheater()) {
        const sizeBtn = document.querySelector('ytd-watch-flexy #ytd-player button.ytp-size-button')
        if (sizeBtn) sizeBtn.click();
      }
    }

    function ytBtnCancelTheater() {
      if (isTheater()) {
        const sizeBtn = document.querySelector('ytd-watch-flexy #ytd-player button.ytp-size-button')
        if (sizeBtn) sizeBtn.click();
      }
    }


    function ytBtnExpandChat() {
      let button = document.querySelector('ytd-live-chat-frame#chat[collapsed] > .ytd-live-chat-frame#show-hide-button')
      if (button) {
        button =
          button.querySelector000('div.yt-spec-touch-feedback-shape') ||
          button.querySelector000('ytd-toggle-button-renderer');
        if (button) button.click();
      }
    }

    function ytBtnCollapseChat() {
      let button = document.querySelector('ytd-live-chat-frame#chat:not([collapsed]) > .ytd-live-chat-frame#show-hide-button')
      if (button) {
        button =
          button.querySelector000('div.yt-spec-touch-feedback-shape') ||
          button.querySelector000('ytd-toggle-button-renderer');
        if (button) button.click();
      }
    }

    function ytBtnEgmPanelCore(arr) {

      if (!arr) return
      if (!('length' in arr)) arr = [arr]

      const ytdFlexyElm = elements.flexy;
      if (!ytdFlexyElm) return;

      let actions = []

      for (const entry of arr) {

        if (!entry) continue;

        let panelId = entry.panelId

        let toHide = entry.toHide
        let toShow = entry.toShow

        if (toHide === true && !toShow) {

          actions.push({
            "changeEngagementPanelVisibilityAction": {
              "targetId": panelId,
              "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN"
            }
          })

        } else if (toShow === true && !toHide) {

          actions.push({
            "showEngagementPanelEndpoint": {
              "panelIdentifier": panelId
            }
          })

        }

        if (actions.length > 0) {
          const cnt = insp(ytdFlexyElm);

          cnt.resolveCommand(
            {
              "signalServiceEndpoint": {
                "signal": "CLIENT_SIGNAL",
                "actions": actions
              }
            },

            {},
            false);
        }
        actions = null;

      }
    }

    /*
    function ytBtnCloseEngagementPanel( s) {
      //ePanel.setAttribute('visibility',"ENGAGEMENT_PANEL_VISIBILITY_HIDDEN");
   
      let panelId = s.getAttribute('target-id')
      scriptletDeferred.debounce(() => {
        document.dispatchEvent(new CustomEvent('tyt-engagement-panel-visibility-change', {
          detail: {
            panelId,
            toHide: true
          }
        }))
      })
   
    }
    
    function ytBtnCloseEngagementPanels() {
      if (isEngagementPanelExpanded()) {
        for (const s of document.querySelectorAll(
          `ytd-watch-flexy[flexy][tyt-tab] #panels.ytd-watch-flexy ytd-engagement-panel-section-list-renderer[target-id][visibility]:not([hidden])`
        )) {
          if (s.getAttribute('visibility') == "ENGAGEMENT_PANEL_VISIBILITY_EXPANDED") ytBtnCloseEngagementPanel(s);
        }
      }
    }
    */


    function ytBtnCloseEngagementPanels() {

      const actions = [];
      for (const panelElm of document.querySelectorAll(
        `ytd-watch-flexy[flexy][tyt-tab] #panels.ytd-watch-flexy ytd-engagement-panel-section-list-renderer[target-id][visibility]:not([hidden])`
      )) {
        if (panelElm.getAttribute('visibility') == "ENGAGEMENT_PANEL_VISIBILITY_EXPANDED" && !panelElm.closest('[hidden]')) {
          actions.push({
            panelId: panelElm.getAttribute000('target-id'),
            toHide: true
          });
        }
      }
      ytBtnEgmPanelCore(actions);
    }


    function ytBtnOpenPlaylist() {

      const cnt = insp(elements.playlist);
      if (cnt && typeof cnt.collapsed === 'boolean') {
        cnt.collapsed = false;
      }
    }
    function ytBtnClosePlaylist() {

      const cnt = insp(elements.playlist);
      if (cnt && typeof cnt.collapsed === 'boolean') {
        cnt.collapsed = true;
      }
    }

    const updateChatLocation498 = function () {
      /*
   
              updateChatLocation: function() {
              if (this.is !== "ytd-watch-grid" && y("web_watch_theater_chat")) {
                  var a = T(this.hostElement).querySelector("#chat-container")
                    , b = this.theater && (!this.fullscreen || y("web_watch_fullscreen_panels"));
                  this.watchWhileWindowSizeSufficient && this.liveChatPresentAndExpanded && b ? y("web_watch_theater_chat_beside_player") ? (b = T(this.hostElement).querySelector("#panels-full-bleed-container"),
                  (a == null ? void 0 : a.parentElement) !== b && b.append(a),
                  this.panelsBesidePlayer = !0) : y("web_watch_theater_fixed_chat") && (b = T(this.hostElement).querySelector("#columns"),
                  (a == null ? void 0 : a.parentElement) !== b && b.append(a),
                  this.fixedPanels = !0) : (y("web_watch_theater_chat_beside_player") ? this.panelsBesidePlayer = !1 : y("web_watch_theater_fixed_chat") && (this.fixedPanels = !1),
                  b = T(this.hostElement).querySelector("#playlist"),
                  a && b ? Fh(a, b) : Gm(new zk("Missing element when updating chat location",{
                      "chatContainer defined": !!a,
                      "playlist defined": !!b
                  })));
                  this.updatePageMediaQueries();
                  this.schedulePlayerSizeUpdate_()
              }
          },
   
          */

      // console.log('updateChatLocation498')
      if (this.is !== "ytd-watch-grid") {
        this.updatePageMediaQueries();
        this.schedulePlayerSizeUpdate_()
      }

    }

    const mirrorNodeWS = new WeakMap();

    /*
      const infoFix = () => {
        const infoExpander = elements.infoExpander;
        const ytdFlexyElm = elements.flexy;
        if (!infoExpander || !ytdFlexyElm) return;
        console.log(386, infoExpander, infoExpander.matches('#tab-info > [class]'))
        if (!infoExpander.matches('#tab-info > [class]')) return;
        // const elms = [...document.querySelectorAll('ytd-watch-metadata.ytd-watch-flexy div[slot="extra-content"], ytd-watch-metadata.ytd-watch-flexy ytd-metadata-row-container-renderer')].filter(elm=>{
        //   if(elm.parentNode.closest('div[slot="extra-content"], ytd-metadata-row-container-renderer')) return false;
        //    return true;
        // });
    
    
    
        const requireElements = [...document.querySelectorAll('ytd-watch-metadata.ytd-watch-flexy div[slot="extra-content"] > *, ytd-watch-metadata.ytd-watch-flexy #extra-content > *')].filter(elm => {
          return typeof elm.is == 'string'
        }).map(elm => {
          const is = elm.is;
          while (elm instanceof HTMLElement_) {
            const q = [...elm.querySelectorAll(is)].filter(e => insp(e).data);
            if (q.length >= 1) return q[0];
            elm = elm.parentNode;
          }
        }).filter(elm => !!elm && typeof elm.is === 'string');
        console.log(requireElements)
    
        const source = requireElements.map(entry=>({
          data: insp(entry).data,
          tag: insp(entry).is,
          elm: entry
        }))
    
        if (!document.querySelector('noscript#aythl')) {
          const noscript = document.createElement('noscript')
          noscript.id = 'aythl';
          ytdFlexyElm.insertBefore000(noscript, ytdFlexyElm.firstChild);
    
        }
        const noscript = document.querySelector('noscript#aythl');
    
        const clones = new Set();
        for (const {data, tag, elm} of source) {
    
          // const cloneNode = document.createElement(tag);
          let cloneNode = elm.cloneNode(true);
          // noscript.appendChild(cloneNode);
          // insp(cloneNode).data = null;
          insp(cloneNode).data = data;
          source.clone = cloneNode;
          clones.add(cloneNode);
        }
    
    
        // const elms = [...document.querySelectorAll('ytd-watch-metadata.ytd-watch-flexy div[slot="extra-content"]')].filter(elm => {
        //   if (elm.parentNode.closest('div[slot="extra-content"], ytd-metadata-row-container-renderer')) return false;
        //   return true;
        // });
    
        // let arr = [];
        // for(const elm of elms){
        //   if(elm.hasAttribute('slot')) arr.push(...elm.childNodes);
        //   else arr.push(elm);
        // }
        // arr = arr.filter(e=>e && e.nodeType === 1);
        // console.log(386,arr)
    
        // const clones = arr.map(e=>e.cloneNode(true));
    
        // for(let node = infoExpander.nextSibling; node instanceof Node; node = node.nextSibling) node.remove();
    
        // infoExpander.parentNode.assignChildern111(null, infoExpander, [...clones]);
        let removal = [];
        for(let node = infoExpander.nextSibling; node instanceof Node; node = node.nextSibling)removal.push(node);
        for(const node of removal) node.remove();
        for(const node of clones) infoExpander.parentNode.appendChild(node);
        
    
        for (const {data, tag, elm, clone} of source) {
    
          insp(clone).data = null;
          insp(clone).data = data;
        }
    
        // console.log(infoExpander.parentNode.childNodes)
      }
    */

    const dummyNode = document.createElement('noscript');

    // const __j4838__ = Symbol();
    const __j4836__ = Symbol();
    const __j5744__ = Symbol(); // original element
    const __j5733__ = Symbol(); // __lastChanged__

    const monitorDataChangedByDOMMutation = async function (mutations) {

      const nodeWR = this;
      const node = kRef(nodeWR);
      if (!node) return;

      const cnt = insp(node);
      const __lastChanged__ = cnt[__j5733__];


      const val = cnt.data ? (cnt.data[__j4836__] || 1) : 0;

      if (__lastChanged__ !== val) {
        cnt[__j5733__] = val > 0 ? (cnt.data[__j4836__] = Date.now()) : 0;

        await Promise.resolve(); // required for making sufficient delay for data rendering
        attributeInc(node, 'tyt-data-change-counter'); // next macro task

      }

    }

    const moChangeReflection = function (mutations) {

      const nodeWR = this;
      const node = kRef(nodeWR);
      if (!node) return;
      const originElement = kRef(node[__j5744__] || null) || null;
      if (!originElement) return;

      const cnt = insp(node);
      const oriCnt = insp(originElement);

      if (mutations) {

        let bfDataChangeCounter = false;
        for (const mutation of mutations) {

          if (mutation.attributeName === 'tyt-clone-refresh-count' && mutation.target === originElement) {
            bfDataChangeCounter = true;
          } else if (mutation.attributeName === 'tyt-data-change-counter' && mutation.target === originElement) {
            bfDataChangeCounter = true;
          }
        }
        if (bfDataChangeCounter && oriCnt.data) {
          node.replaceWith(dummyNode);
          cnt.data = Object.assign({}, oriCnt.data);
          dummyNode.replaceWith(node);
        }

      }
    }

    /*
    const moChangeReflection = async function (mutations) {
  
      const nodeWR = this;
      const node = kRef(nodeWR);
      if (!node) return;
      const originElement = kRef(node[__j5744__] || null) || null;
      if (!originElement) return;
  
      const cnt = insp(node);
      const oriCnt = insp(originElement);
  
      if(mutations){
  
        let bfDataChangeCounter = false;
        for (const mutation of mutations) {
          if (mutation.attributeName === 'tyt-data-change-counter' && mutation.target === originElement) {
            bfDataChangeCounter = true;
          }
        }
        if(bfDataChangeCounter && oriCnt.data){
          node.replaceWith(dummyNode);
          cnt.data = Object.assign({}, oriCnt.data);
          dummyNode.replaceWith(node);
        }
  
      } 
  
      // console.log(8348, originElement)
  
      if (cnt.isAttached === false) {
        // do nothing
        // don't call infoFix() as it shall be only called in ytd-expander::attached and yt-navigate-finish
      } else if (oriCnt.isAttached === false && cnt.isAttached === true) {
        if (node.isConnected && node.parentNode instanceof HTMLElement_) {
          node.parentNode.removeChild(node);
        } else {
          node.remove();
        }
        if (oriCnt.data !== null) {
          cnt.data = null;
        }
      } else if (oriCnt.isAttached === true && cnt.isAttached === true) {
        if (!oriCnt.data) {
          if(cnt.data){
            cnt.data = null;
          }
        } else if (!cnt.data || oriCnt.data[__j4838__] !== cnt.data[__j4838__]) {
          oriCnt.data[__j4838__] = Date.now();
          await Promise.resolve(); // required for making sufficient delay for data rendering
          attributeInc(originElement, 'tyt-data-change-counter'); // next macro task
        }
      }
  
    };
    */

    const attributeInc = (elm, prop) => {
      let v = (+elm.getAttribute000(prop) || 0) + 1;
      if (v > 1e9) v = 9;
      elm.setAttribute000(prop, v);
      return v;
    }


    /**
        * UC[-_a-zA-Z0-9+=.]{22}
        * https://support.google.com/youtube/answer/6070344?hl=en
        * The channel ID is the 24 character alphanumeric string that starts with 'UC' in the channel URL.
    */

    const isChannelId = (x) => {
      if (typeof x === 'string' && x.length === 24) {
        return /UC[-_a-zA-Z0-9+=.]{22}/.test(x);
      }
      return false;
    }


    const infoFix = (lockId) => {
      if (lockId !== null && lockGet['infoFixLock'] !== lockId) return;
      // console.log('((infoFix))')
      const infoExpander = elements.infoExpander;
      const infoContainer = (infoExpander ? infoExpander.parentNode : null) || document.querySelector('#tab-info');
      const ytdFlexyElm = elements.flexy;
      if (!infoContainer || !ytdFlexyElm) return;
      // console.log(386, infoExpander, infoExpander.matches('#tab-info > [class]'))
      if (infoExpander) {
        const match = infoExpander.matches('#tab-info > [class]') || infoExpander.matches('#tab-info > [tyt-main-info]');
        if (!match) return;
      }
      // const elms = [...document.querySelectorAll('ytd-watch-metadata.ytd-watch-flexy div[slot="extra-content"], ytd-watch-metadata.ytd-watch-flexy ytd-metadata-row-container-renderer')].filter(elm=>{
      //   if(elm.parentNode.closest('div[slot="extra-content"], ytd-metadata-row-container-renderer')) return false;
      //    return true;
      // });

      const requireElements = [...document.querySelectorAll('ytd-watch-metadata.ytd-watch-flexy div[slot="extra-content"] > *, ytd-watch-metadata.ytd-watch-flexy #extra-content > *')].filter(elm => {
        return typeof elm.is == 'string'
      }).map(elm => {
        const is = elm.is;
        while (elm instanceof HTMLElement_) {
          const q = [...elm.querySelectorAll(is)].filter(e => insp(e).data);
          if (q.length >= 1) return q[0];
          elm = elm.parentNode;
        }
      }).filter(elm => !!elm && typeof elm.is === 'string');
      // console.log(9162, requireElements)

      // if (!infoExpander && !requireElements.length) return;

      const source = requireElements.map(entry => {
        const inst = insp(entry);
        return {
          data: inst.data,
          tag: inst.is,
          elm: entry
        };
      });

      let noscript_ = document.querySelector('noscript#aythl');
      if (!noscript_) {
        noscript_ = document.createElement('noscript')
        noscript_.id = 'aythl';

        inPageRearrange = true;
        ytdFlexyElm.insertBefore000(noscript_, ytdFlexyElm.firstChild);
        inPageRearrange = false;
      }
      const noscript = noscript_;


      let requiredUpdate = false;
      const mirrorElmSet = new Set();
      const targetParent = infoContainer;
      for (const { data, tag: tag, elm: s } of source) {

        let mirrorNode = mirrorNodeWS.get(s)
        mirrorNode = mirrorNode ? kRef(mirrorNode) : mirrorNode;
        if (!mirrorNode) {
          const cnt = insp(s);
          const cProto = cnt.constructor.prototype;

          const element = document.createElement(tag);
          noscript.appendChild(element); // appendChild to trigger .attached()
          mirrorNode = element
          mirrorNode[__j5744__] = mWeakRef(s);

          const nodeWR = mWeakRef(mirrorNode);
          // if(!(insp(s)._dataChanged438)){
          //   insp(s)._dataChanged438 = async function(){

          //     await Promise.resolve(); // required for making sufficient delay for data rendering
          //     attributeInc(originElement, 'tyt-data-change-counter'); // next macro task
          //     moChangeReflection.call(nodeWR);
          //   }
          // }




          new MutationObserver(moChangeReflection.bind(nodeWR)).observe(s, { attributes: true, attributeFilter: ['tyt-clone-refresh-count', 'tyt-data-change-counter'] });


          s.jy8432 = 1;
          if (!(cProto instanceof Node) && !cProto._dataChanged496 && typeof cProto._createPropertyObserver === 'function') {


            cProto._dataChanged496 = function () {
              const cnt = this;
              const node = cnt.hostElement || cnt;
              if (node.jy8432) {

                // console.log('hello _dataChanged496', this.is);
                // await Promise.resolve(); // required for making sufficient delay for data rendering
                attributeInc(node, 'tyt-data-change-counter'); // next macro task
              }


            }

            cProto._createPropertyObserver('data', '_dataChanged496', undefined)

          } else if (!(cProto instanceof Node) && !cProto._dataChanged496 && cProto.useSignals === true && insp(s).signalProxy) {

            const dataSignal = cnt?.signalProxy?.signalCache?.data;
            if (dataSignal && typeof dataSignal.setWithPath === 'function' && !dataSignal.setWithPath573 && !dataSignal.controller573) {
              dataSignal.controller573 = mWeakRef(cnt);
              dataSignal.setWithPath573 = dataSignal.setWithPath;
              dataSignal.setWithPath = function () {
                const cnt = (kRef(this.controller573 || null) || null);
                cnt && typeof cnt._dataChanged496k === 'function' && Promise.resolve(cnt).then(cnt._dataChanged496k).catch(console.warn);
                return this.setWithPath573(...arguments)
              }
              cProto._dataChanged496 = function () {
                const cnt = this;
                const node = cnt.hostElement || cnt;
                if (node.jy8432) {
                  // console.log('hello _dataChanged496', this.is);
                  // await Promise.resolve(); // required for making sufficient delay for data rendering
                  attributeInc(node, 'tyt-data-change-counter'); // next macro task
                }
              }
              cProto._dataChanged496k = ((cnt) => cnt._dataChanged496());

            }

          }


          if (!cProto._dataChanged496) {

            new MutationObserver(monitorDataChangedByDOMMutation.bind(mirrorNode[__j5744__])).observe(s, { attributes: true, childList: true, subtree: true });

          }


          // new MutationObserver(moChangeReflection.bind(nodeWR)).observe(s, {attributes: true, childList: true, subtree: true});

          mirrorNodeWS.set(s, nodeWR);
          requiredUpdate = true;
        } else {

          if (mirrorNode.parentNode !== targetParent) {
            requiredUpdate = true;
          }
        }
        if (!requiredUpdate) {
          const cloneNodeCnt = insp(mirrorNode);
          if (cloneNodeCnt.data !== data) {
            // if(mirrorNode.parentNode !== noscript){
            //   noscript.appendChild(mirrorNode);
            // }
            // mirrorNode.replaceWith(dummyNode);
            // cloneNodeCnt.data = data;
            // dummyNode.replaceWith(mirrorNode);
            requiredUpdate = true;
          }
        }


        mirrorElmSet.add(mirrorNode);
        source.mirrored = mirrorNode;

      }

      const mirroElmArr = [...mirrorElmSet];
      mirrorElmSet.clear();

      if (!requiredUpdate) {
        let e = infoExpander ? -1 : 0;
        // DOM Tree Check
        for (let n = targetParent.firstChild; n instanceof Node; n = n.nextSibling) {
          let target = e < 0 ? infoExpander : mirroElmArr[e];
          e++;
          if (n !== target) {
            // target can be undefined if index overflow
            requiredUpdate = true;
            break;
          }
        }
        if (!requiredUpdate && e !== mirroElmArr.length + 1) requiredUpdate = true;
      }

      if (requiredUpdate) {
        if (infoExpander) {
          targetParent.assignChildern111(null, infoExpander, mirroElmArr);
        } else {
          targetParent.replaceChildren000(...mirroElmArr);
        }
        for (const mirrorElm of mirroElmArr) {
          // trigger data assignment and record refresh count by manual update
          const j = attributeInc(mirrorElm, 'tyt-clone-refresh-count');
          const oriElm = kRef(mirrorElm[__j5744__] || null) || null;
          if (oriElm) {
            oriElm.setAttribute111('tyt-clone-refresh-count', j)
          }
        }
      }

      mirroElmArr.length = 0;
      source.length = 0;

    }

    const layoutFix = (lockId) => {
      if (lockGet['layoutFixLock'] !== lockId) return;
      // console.log('((layoutFix))')

      const secondaryWrapper = document.querySelector('#secondary-inner.style-scope.ytd-watch-flexy > secondary-wrapper');
      // console.log(3838, !!chatContainer, !!(secondaryWrapper && secondaryInner), secondaryInner?.firstChild, secondaryInner?.lastChild , secondaryWrapper?.parentNode === secondaryInner)
      if (secondaryWrapper) {
        const secondaryInner = secondaryWrapper.parentNode;

        const chatContainer = document.querySelector('#columns.style-scope.ytd-watch-flexy [tyt-chat-container]');
        if (secondaryInner.firstChild !== secondaryInner.lastChild || (chatContainer && !chatContainer.closest('secondary-wrapper'))) {
          // console.log(38381)
          let w = [];
          let w2 = [];
          for (let node = secondaryInner.firstChild; node instanceof Node; node = node.nextSibling) {
            if (node === chatContainer && chatContainer) {

            } else if (node === secondaryWrapper) {

              for (let node2 = secondaryWrapper.firstChild; node2 instanceof Node; node2 = node2.nextSibling) {
                if (node2 === chatContainer && chatContainer) {
                } else {
                  if (node2.id === 'right-tabs' && chatContainer) {
                    w2.push(chatContainer);
                  }
                  w2.push(node2);
                }
              }
            } else {
              w.push(node);
            }
          }
          // console.log('qww', w, w2)

          inPageRearrange = true;
          secondaryWrapper.replaceChildren000(...w, ...w2);
          inPageRearrange = false;
          const chatElm = elements.chat;
          const chatCnt = insp(chatElm);
          if (chatCnt && typeof chatCnt.urlChanged === 'function' && secondaryWrapper.contains(chatElm)) {

            // setTimeout(() => chatCnt.urlChanged, 136);
            if (typeof chatCnt.urlChangedAsync12 === 'function') {
              console.log('elements.chat urlChangedAsync12', 61);
              chatCnt.urlChanged();
            } else {
              console.log('elements.chat urlChangedAsync12', 62);
              setTimeout(() => chatCnt.urlChanged(), 136);
            }
          }
        }
      }

    }

    let lastPanel = '';
    let lastTab = '';
    // let fixInitialTabState = 0;

    const aoEgmPanels = new MutationObserver(() => {
      // console.log(5094,3);
      Promise.resolve(lockSet['updateEgmPanelsLock']).then(updateEgmPanels).catch(console.warn);
    });

    const removeKeepCommentsScroller = async (lockId) => {
      if (lockGet['removeKeepCommentsScrollerLock'] !== lockId) return;
      await Promise.resolve();
      if (lockGet['removeKeepCommentsScrollerLock'] !== lockId) return;
      const ytdFlexyFlm = elements.flexy;
      if (ytdFlexyFlm) {
        ytdFlexyFlm.removeAttribute000('keep-comments-scroller');
      }
    }

    const updateEgmPanels = async (lockId) => {
      if (lockId !== lockGet['updateEgmPanelsLock']) return;
      await navigateFinishedPromise.then().catch(console.warn);
      if (lockId !== lockGet['updateEgmPanelsLock']) return;
      // console.log('updateEgmPanels::called');
      const ytdFlexyElm = elements.flexy;
      if (!ytdFlexyElm) return;
      let newVisiblePanels = [];
      let newHiddenPanels = [];
      let allVisiblePanels = [];
      for (const panelElm of document.querySelectorAll('[tyt-egm-panel][target-id][visibility]')) {
        const visibility = panelElm.getAttribute000('visibility');

        if (visibility === 'ENGAGEMENT_PANEL_VISIBILITY_HIDDEN' || panelElm.closest('[hidden]')) {
          if (panelElm.hasAttribute000('tyt-visible-at')) {
            panelElm.removeAttribute000('tyt-visible-at');
            newHiddenPanels.push(panelElm);
          }

        } else if (visibility === 'ENGAGEMENT_PANEL_VISIBILITY_EXPANDED' && !panelElm.closest('[hidden]')) {
          let visibleAt = panelElm.getAttribute000('tyt-visible-at');
          if (!visibleAt) {
            panelElm.setAttribute111('tyt-visible-at', Date.now());
            newVisiblePanels.push(panelElm);
          }
          allVisiblePanels.push(panelElm);
        }
      }
      if (newVisiblePanels.length >= 1 && allVisiblePanels.length >= 2) {
        const targetVisible = newVisiblePanels[newVisiblePanels.length - 1];

        const actions = [];
        for (const panelElm of allVisiblePanels) {
          if (panelElm === targetVisible) continue;
          actions.push({
            panelId: panelElm.getAttribute000('target-id'),
            toHide: true
          });
        }

        if (actions.length >= 1) {
          ytBtnEgmPanelCore(actions);
        }

      }
      if (allVisiblePanels.length >= 1) {
        ytdFlexyElm.setAttribute111('tyt-egm-panel_', '');
      } else {
        ytdFlexyElm.removeAttribute000('tyt-egm-panel_');
      }
      newVisiblePanels.length = 0;
      newVisiblePanels = null;
      newHiddenPanels.length = 0;
      newHiddenPanels = null;
      allVisiblePanels.length = 0;
      allVisiblePanels = null;
    }

    const checkElementExist = (css, exclude) => {
      for (const p of document.querySelectorAll(css)) {
        if (!p.closest(exclude)) return p;
      }
      return null;
    }

    let fixInitialTabStateK = 0;

    const { handleNavigateFactory } = (() => {


      let isLoadStartListened = false;

      function findLcComment(lc) {
        if (arguments.length === 1) {

          let element = document.querySelector(`#tab-comments ytd-comments ytd-comment-renderer #header-author a[href*="lc=${lc}"]`);
          if (element) {
            let commentRendererElm = closestFromAnchor.call(element, 'ytd-comment-renderer');
            if (commentRendererElm && lc) {
              return {
                lc,
                commentRendererElm
              }
            }
          }
        } else if (arguments.length === 0) {

          let element = document.querySelector(`#tab-comments ytd-comments ytd-comment-renderer > #linked-comment-badge span:not(:empty)`);
          if (element) {
            let commentRendererElm = closestFromAnchor.call(element, 'ytd-comment-renderer');
            if (commentRendererElm) {

              let header = _querySelector.call(commentRendererElm, '#header-author');
              if (header) {

                let anchor = _querySelector.call(header, 'a[href*="lc="]');
                if (anchor) {
                  let href = (anchor.getAttribute('href') || '');
                  let m = /[&?]lc=([\w_.-]+)/.exec(href); // dot = sub-comment
                  if (m) {
                    lc = m[1];
                  }
                }
              }

            }
            if (commentRendererElm && lc) {
              return {
                lc,
                commentRendererElm
              }
            }
          }
        }

        return null;

      }


      function lcSwapFuncA(targetLcId, currentLcId) {


        let done = 0;
        try {
          // console.log(currentLcId, targetLcId)

          let r1 = findLcComment(currentLcId).commentRendererElm;
          let r2 = findLcComment(targetLcId).commentRendererElm;


          if (typeof insp(r1).data.linkedCommentBadge === 'object' && typeof insp(r2).data.linkedCommentBadge === 'undefined') {

            let p = Object.assign({}, insp(r1).data.linkedCommentBadge)

            if (((p || 0).metadataBadgeRenderer || 0).trackingParams) {
              delete p.metadataBadgeRenderer.trackingParams;
            }

            const v1 = findContentsRenderer(r1)
            const v2 = findContentsRenderer(r2)


            if (v1.parent === v2.parent && (v2.parent.nodeName === 'YTD-COMMENTS' || v2.parent.nodeName === 'YTD-ITEM-SECTION-RENDERER')) {

            } else {
              // currently not supported
              return false;
            }



            if (v2.index >= 0) {
              if (v2.parent.nodeName === 'YTD-COMMENT-REPLIES-RENDERER') {


                if (lcSwapFuncB(targetLcId, currentLcId, p)) {
                  done = 1;
                }

                done = 1;
              } else {
                const v2pCnt = insp(v2.parent);
                const v2Conents = (v2pCnt.data || 0).contents || 0;
                if (!v2Conents) console.warn('v2Conents is not found');

                v2pCnt.data = Object.assign({}, v2pCnt.data, { contents: [].concat([v2Conents[v2.index]], v2Conents.slice(0, v2.index), v2Conents.slice(v2.index + 1)) });

                if (lcSwapFuncB(targetLcId, currentLcId, p)) {
                  done = 1;
                }
              }


            }



          }



        } catch (e) {
          console.warn(e)
        }
        return done === 1;
      }


      function lcSwapFuncB(targetLcId, currentLcId, _p) {

        let done = 0;
        try {

          let r1 = findLcComment(currentLcId).commentRendererElm;
          let r1cnt = insp(r1);
          let r2 = findLcComment(targetLcId).commentRendererElm;
          let r2cnt = insp(r2);

          const r1d = r1cnt.data;
          let p = Object.assign({}, _p)
          r1d.linkedCommentBadge = null;
          delete r1d.linkedCommentBadge;

          let q = Object.assign({}, r1d);
          q.linkedCommentBadge = null;
          delete q.linkedCommentBadge;

          r1cnt.data = Object.assign({}, q);
          r2cnt.data = Object.assign({}, r2cnt.data, { linkedCommentBadge: p });

          done = 1;

        } catch (e) {
          console.warn(e)
        }
        return done === 1;
      }

      const loadStartFx = async (evt) => {

        let media = (evt || 0).target || 0;
        if (media.nodeName === 'VIDEO' || media.nodeName === 'AUDIO') { }
        else return;

        const newMedia = media;

        const media1 = common.getMediaElement(0); // document.querySelector('#movie_player video[src]');
        const media2 = common.getMediaElements(2); // document.querySelectorAll('ytd-browse[role="main"] video[src]');

        if (media1 !== null && media2.length > 0) {
          if (newMedia !== media1 && media1.paused === false) {
            if (isVideoPlaying(media1)) {
              Promise.resolve(newMedia).then(video => video.paused === false && video.pause()).catch(console.warn);
            }
          } else if (newMedia === media1) {
            for (const s of media2) {
              if (s.paused === false) {
                Promise.resolve(s).then(s => s.paused === false && s.pause()).catch(console.warn);
                break;
              }
            }
          } else {
            Promise.resolve(media1).then(video1 => video1.paused === false && video1.pause()).catch(console.warn);
          }
        }

      }

      const getBrowsableEndPoint = (req) => {

        let valid = false;
        let endpoint = req ? req.command : null;
        if (endpoint && (endpoint.commandMetadata || 0).webCommandMetadata && endpoint.watchEndpoint) {
          let videoId = endpoint.watchEndpoint.videoId;
          let url = endpoint.commandMetadata.webCommandMetadata.url;

          if (typeof videoId === 'string' && typeof url === 'string' && url.indexOf('lc=') > 0) {

            let m = /^\/watch\?v=([\w_-]+)&lc=([\w_.-]+)$/.exec(url); // dot = sub-comment
            if (m && m[1] === videoId) {


              /*
              {
                "style": "BADGE_STYLE_TYPE_SIMPLE",
                "label": "注目のコメント",
                "trackingParams": "XXXXXX"
            }
              */

              let targetLc = findLcComment(m[2])
              let currentLc = targetLc ? findLcComment() : null;

              if (targetLc && currentLc) {


                let done = targetLc.lc === currentLc.lc ? 1 : lcSwapFuncA(targetLc.lc, currentLc.lc) ? 1 : 0

                if (done === 1) {

                  common.xReplaceState(history.state, url);
                  return;
                }
              }
            }

          }

        }



        /*
            
            {
              "type": 0,
              "command": endpoint,
              "form": {
                "tempData": {},
                "reload": false
              }
            }
  
        */

        if (endpoint && (endpoint.commandMetadata || 0).webCommandMetadata && endpoint.browseEndpoint && isChannelId(endpoint.browseEndpoint.browseId)) {
          valid = true;

        } else if (endpoint && (endpoint.browseEndpoint || endpoint.searchEndpoint) && !endpoint.urlEndpoint && !endpoint.watchEndpoint) {

          if (endpoint.browseEndpoint && endpoint.browseEndpoint.browseId === "FEwhat_to_watch") {
            // valid = false;
            const playerMedia = common.getMediaElement(1);
            if (playerMedia && playerMedia.paused === false) valid = true; // home page
          } else if (endpoint.commandMetadata && endpoint.commandMetadata.webCommandMetadata) {

            let meta = endpoint.commandMetadata.webCommandMetadata
            if (meta && /*meta.apiUrl &&*/ meta.url && meta.webPageType) {
              valid = true;
            }

          }
        }

        if (!valid) endpoint = null;

        return endpoint;
      }

      const shouldUseMiniPlayer = () => {

        const isSubTypeExist = document.querySelector('ytd-page-manager#page-manager > ytd-browse[page-subtype]');

        if (isSubTypeExist) return true;

        const movie_player = [...document.querySelectorAll('#movie_player')].filter(e => !e.closest('[hidden]'))[0];
        if (movie_player) {
          const media = qsOne(movie_player, 'video[class], audio[class]');
          if (media && media.currentTime > 3 && media.duration - media.currentTime > 3 && media.paused === false) {
            return true;
          }
        }
        return false;
        // return true;
        // return !!document.querySelector('ytd-page-manager#page-manager > ytd-browse[page-subtype]');
      }

      const conditionFulfillment = (req) => {
        const endpoint = req ? req.command : null;
        if (!endpoint) return;

        if (endpoint && (endpoint.commandMetadata || 0).webCommandMetadata && endpoint.watchEndpoint) {
        } else if (endpoint && (endpoint.commandMetadata || 0).webCommandMetadata && endpoint.browseEndpoint && isChannelId(endpoint.browseEndpoint.browseId)) {
        } else if (endpoint && (endpoint.browseEndpoint || endpoint.searchEndpoint) && !endpoint.urlEndpoint && !endpoint.watchEndpoint) {
        } else {
          return false;
        }


        if (!shouldUseMiniPlayer()) return false;

        /*
          // user would like to switch page immediately without playing the video;
          // attribute appear after playing video for more than 2s
          if (!document.head.dataset.viTime) return false;
          else {
            let currentVideo = common.getMediaElement(0);
            if (currentVideo && currentVideo.readyState > currentVideo.HAVE_CURRENT_DATA && currentVideo.currentTime > 2.2 && currentVideo.duration - 2.2 < currentVideo.currentTime) {
              // disable miniview browsing if the media is near to the end
              return false;
            }
          }
        */


        if (pageType !== "watch") return false;


        if (!checkElementExist('ytd-watch-flexy #player button.ytp-miniplayer-button.ytp-button', '[hidden]')) {
          return false;
        }

        return true;
      }

      let u38 = 0;
      const fixChannelAboutPopup = async (t38) => {

        let promise = new PromiseExternal();
        const f = () => {
          promise && promise.resolve();
          promise = null;
        }
        document.addEventListener('yt-navigate-finish', f, false);
        await promise.then();
        promise = null;
        document.removeEventListener('yt-navigate-finish', f, false);
        if (t38 !== u38) return;
        setTimeout(() => {
          const currentAbout = [...document.querySelectorAll('ytd-about-channel-renderer')].filter(e => !e.closest('[hidden]'))[0];
          let okay = false;
          if (!currentAbout) okay = true;
          else {
            const popupContainer = currentAbout.closest('ytd-popup-container');
            if (popupContainer) {
              const cnt = insp(popupContainer);
              let arr = null;
              try {
                arr = cnt.handleGetOpenedPopupsAction_()
              } catch (e) {

              }
              if (arr && arr.length === 0) okay = true;
            } else {
              okay = false;
            }
          }
          if (okay) {
            const descriptionModel = [...document.querySelectorAll('yt-description-preview-view-model')].filter(e => !e.closest('[hidden]'))[0];
            if (descriptionModel) {
              const button = [...descriptionModel.querySelectorAll('button')].filter(e => !e.closest('[hidden]') && `${e.textContent}`.trim().length > 0)[0];
              if (button) {
                button.click();
              }
            }
          }
        }, 80);

      }
      const handleNavigateFactory = (handleNavigate) => {

        return function (req) {

          if (u38 > 1e9) u38 = 9;
          const t38 = ++u38;

          const $this = this;
          const $arguments = arguments;

          let endpoint = null;


          if (conditionFulfillment(req)) {


            endpoint = getBrowsableEndPoint(req);

          }


          if (!endpoint || !shouldUseMiniPlayer()) return handleNavigate.apply($this, $arguments);

          // console.log('tabview-script-handleNavigate')

          const ytdAppElm = document.querySelector('ytd-app');
          const ytdAppCnt = insp(ytdAppElm);

          let object = null;
          try {
            object = ytdAppCnt.data.response.currentVideoEndpoint.watchEndpoint || null;
          } catch (e) {
            object = null;
          }

          if (typeof object !== 'object') object = null;

          const once = { once: true }; // browsers supporting async function can also use once option.

          if (object !== null && !('playlistId' in object)) {

            let wObject = mWeakRef(object)

            const N = 3;

            let count = 0;

            /*
              
              rcb(b) => a = playlistId = undefinded
              
              var scb = function(a, b, c, d) {
                      a.isInitialized() && (B("kevlar_miniplayer_navigate_to_shorts_killswitch") ? c || d ? ("watch" !== Xu(b) && "shorts" !== Xu(b) && os(a.miniplayerEl, "yt-cache-miniplayer-page-action", [b]),
                      qs(a.miniplayerEl, "yt-deactivate-miniplayer-action")) : "watch" === Xu(b) && rcb(b) && (qt.getInstance().playlistWatchPageActivation = !0,
                      a.activateMiniplayer(b)) : c ? ("watch" !== Xu(b) && os(a.miniplayerEl, "yt-cache-miniplayer-page-action", [b]),
                      qs(a.miniplayerEl, "yt-deactivate-miniplayer-action")) : d ? qs(a.miniplayerEl, "yt-pause-miniplayer-action") : "watch" === Xu(b) && rcb(b) && (qt.getInstance().playlistWatchPageActivation = !0,
                      a.activateMiniplayer(b)))
                  };
    
            */

            Object.defineProperty((kRef(wObject) || {}), 'playlistId', {
              get() {
                count++;
                if (count === N) {
                  delete this.playlistId;
                }
                return '*';
              },
              set(value) {
                delete this.playlistId; // remove property definition
                this.playlistId = value; // assign as normal property
              },
              enumerable: false,
              configurable: true
            });

            let playlistClearout = null;

            let timeoutid = 0;
            Promise.race([
              new Promise(r => {
                timeoutid = setTimeout(r, 4000)
              }),
              new Promise(r => {
                playlistClearout = () => {
                  if (timeoutid > 0) {
                    clearTimeout(timeoutid);
                    timeoutid = 0;
                  }
                  r();
                }
                document.addEventListener('yt-page-type-changed', playlistClearout, once);
              })
            ]).then(() => {

              if (timeoutid !== 0) {
                playlistClearout && document.removeEventListener('yt-page-type-changed', playlistClearout, once);
                timeoutid = 0;
              }
              playlistClearout = null;
              count = N - 1;
              let object = kRef(wObject)
              wObject = null;
              return object ? object.playlistId : null;
            }).catch(console.warn);

          }

          if (!isLoadStartListened) {
            isLoadStartListened = true;
            document.addEventListener('loadstart', loadStartFx, true)
          }

          const endpointURL = `${(endpoint?.commandMetadata?.webCommandMetadata?.url || '')}`;

          if (endpointURL && endpointURL.endsWith('/about') && /\/channel\/UC[-_a-zA-Z0-9+=.]{22}\/about/.test(endpointURL)) {
            fixChannelAboutPopup(t38);
          }

          handleNavigate.apply($this, $arguments);


        }

      };

      return { handleNavigateFactory };


    })();

    const common = (() => {


      let mediaModeLock = 0;
      const _getMediaElement = (i) => {
        if (mediaModeLock === 0) {
          let e = document.querySelector('.video-stream.html5-main-video') || document.querySelector('#movie_player video, #movie_player audio') || document.querySelector('body video[src], body audio[src]');
          if (e) {
            if (e.nodeName === 'VIDEO') mediaModeLock = 1;
            else if (e.nodeName === 'AUDIO') mediaModeLock = 2;
          }
        }
        if (!mediaModeLock) return null;
        if (mediaModeLock === 1) {
          switch (i) {
            case 1:
              return ('ytd-player#ytd-player video[src]');
            case 2:
              return ('ytd-browse[role="main"] video[src]');
            case 0:
            default:
              return ('#movie_player video[src]');
          }
        } else if (mediaModeLock === 2) {
          switch (i) {
            case 1:
              return ('ytd-player#ytd-player audio.video-stream.html5-main-video[src]');
            case 2:
              return ('ytd-browse[role="main"] audio.video-stream.html5-main-video[src]');
            case 0:
            default:
              return ('#movie_player audio.video-stream.html5-main-video[src]');
          }
        }
        return null;
      }

      return {


        xReplaceState(s, u) {
          try {
            history.replaceState(s, '', u);
          } catch (e) {
            // in case error occurs if replaceState is replaced by any external script / extension
          }
          if (s.endpoint) {
            try {
              const ytdAppElm = document.querySelector('ytd-app');
              const ytdAppCnt = insp(ytdAppElm);
              ytdAppCnt.replaceState(s.endpoint, '', u)
            } catch (e) {
            }
          }
        },
        getMediaElement(i) {
          let s = _getMediaElement(i) || '';
          if (s) return document.querySelector(s);
          return null;
        },
        getMediaElements(i) {
          let s = _getMediaElement(i) || '';
          if (s) return document.querySelectorAll(s);
          return [];
        }
      };
    })();

    let inPageRearrange = false;
    let tmpLastVideoId = '';
    // const nsMap = new Map();

    const getCurrentVideoId = () => {
      const ytdFlexyElm = elements.flexy;
      const ytdFlexyCnt = insp(ytdFlexyElm);
      if (ytdFlexyCnt && typeof ytdFlexyCnt.videoId === 'string') return ytdFlexyCnt.videoId;
      if (ytdFlexyElm && typeof ytdFlexyElm.videoId === 'string') return ytdFlexyElm.videoId;
      console.log('video id not found');
      return '';
    };

    const holdInlineExpanderAlwaysExpanded = (inlineExpanderCnt) => {
      console.log('holdInlineExpanderAlwaysExpanded')
      if (inlineExpanderCnt.alwaysShowExpandButton === true) inlineExpanderCnt.alwaysShowExpandButton = false;
      if (typeof (inlineExpanderCnt.collapseLabel || 0) === 'string') inlineExpanderCnt.collapseLabel = '';
      if (typeof (inlineExpanderCnt.expandLabel || 0) === 'string') inlineExpanderCnt.expandLabel = '';
      if (inlineExpanderCnt.showCollapseButton === true) inlineExpanderCnt.showCollapseButton = false;
      if (inlineExpanderCnt.showExpandButton === true) inlineExpanderCnt.showExpandButton = false;
      if (inlineExpanderCnt.expandButton instanceof HTMLElement_) {
        inlineExpanderCnt.expandButton = null;
        inlineExpanderCnt.expandButton.remove();
      }
    };

    const fixInlineExpanderDisplay = (inlineExpanderCnt) => {
      try {
        inlineExpanderCnt.updateIsAttributedExpanded();
      } catch (e) { }
      try {
        inlineExpanderCnt.updateIsFormattedExpanded();
      } catch (e) { }
      try {
        inlineExpanderCnt.updateTextOnSnippetTypeChange();
      } catch (e) { }
      try {
        inlineExpanderCnt.updateStyles();
      } catch (e) { }
    };

    const fixInlineExpanderMethods = (inlineExpanderCnt) => {
      if (inlineExpanderCnt && !inlineExpanderCnt.__$$idncjk8487$$__) {
        inlineExpanderCnt.__$$idncjk8487$$__ = true;
        inlineExpanderCnt.updateTextOnSnippetTypeChange = function () {
          true || this.isResetMutation && this.mutationCallback();
        }
        // inlineExpanderCnt.hasAttributedStringText = true;
        inlineExpanderCnt.isResetMutation = true;
        fixInlineExpanderDisplay(inlineExpanderCnt); // do the initial fix
      }
    };

    const fixInlineExpanderContent = () => {
      // console.log(21886,1)
      const mainInfo = getMainInfo();
      if (!mainInfo) return;
      // console.log(21886,2)
      const inlineExpanderElm = mainInfo.querySelector('ytd-text-inline-expander');
      const inlineExpanderCnt = insp(inlineExpanderElm);
      fixInlineExpanderMethods(inlineExpanderCnt);

      // console.log(21886, 3)
      // if (inlineExpanderCnt && inlineExpanderCnt.isExpanded === true && plugin.autoExpandInfoDesc.activated) {
      //   // inlineExpanderCnt.isExpandedChanged();
      //   // holdInlineExpanderAlwaysExpanded(inlineExpanderCnt);
      // }
      // if(inlineExpanderCnt){
      //   // console.log(21886,4, inlineExpanderCnt.isExpanded, inlineExpanderCnt.isTruncated)
      //   if (inlineExpanderCnt.isExpanded === false && inlineExpanderCnt.isTruncated === true) {
      //     // console.log(21881)
      //     inlineExpanderCnt.isTruncated = false;
      //   }
      // }
    }

    const plugin = {
      'minibrowser': {
        activated: false,
        toUse: true, // depends on shouldUseMiniPlayer()
        activate() {

          if (this.activated) return;

          const isPassiveArgSupport = (typeof IntersectionObserver === 'function');
          // https://caniuse.com/?search=observer
          // https://caniuse.com/?search=addEventListener%20passive

          if (!isPassiveArgSupport) return;

          this.activated = true;

          const ytdAppElm = document.querySelector('ytd-app');
          const ytdAppCnt = insp(ytdAppElm);


          if (!ytdAppCnt) return;

          const cProto = ytdAppCnt.constructor.prototype;

          if (!cProto.handleNavigate) return;

          if (cProto.handleNavigate.__ma355__) return;

          cProto.handleNavigate = handleNavigateFactory(cProto.handleNavigate);

          cProto.handleNavigate.__ma355__ = 1;
        }
      },
      'autoExpandInfoDesc': {
        activated: false,
        toUse: false, // false by default; once the expand is clicked, maintain the feature until the browser is closed.
        /** @type { MutationObserver | null } */
        mo: null,
        promiseReady: new PromiseExternal(),
        moFn(lockId) {

          if (lockGet['autoExpandInfoDescAttrAsyncLock'] !== lockId) return;

          const mainInfo = getMainInfo();

          if (!mainInfo) return;
          switch (((mainInfo || 0).nodeName || '').toLowerCase()) {
            case 'ytd-expander':
              if (mainInfo.hasAttribute000('collapsed')) {
                let success = false;
                try {
                  insp(mainInfo).handleMoreTap(new Event("tap"));
                  success = true;
                } catch (e) {
                }
                if (success) mainInfo.setAttribute111('tyt-no-less-btn', '');
              }
              break;
            case 'ytd-expandable-video-description-body-renderer':
              const inlineExpanderElm = mainInfo.querySelector('ytd-text-inline-expander');
              const inlineExpanderCnt = insp(inlineExpanderElm);
              if (inlineExpanderCnt && inlineExpanderCnt.isExpanded === false) {
                inlineExpanderCnt.isExpanded = true;
                inlineExpanderCnt.isExpandedChanged();
                // holdInlineExpanderAlwaysExpanded(inlineExpanderCnt);
              }
              break;
          }



        },
        activate() {
          if (this.activated) return;

          this.moFn = this.moFn.bind(this);
          this.mo = new MutationObserver(() => {
            Promise.resolve(lockSet['autoExpandInfoDescAttrAsyncLock']).then(this.moFn).catch(console.warn);
          });
          this.activated = true;
          this.promiseReady.resolve();
        },
        async onMainInfoSet(mainInfo) {
          await this.promiseReady.then();
          if (mainInfo.nodeName.toLowerCase() === 'ytd-expander') {
            this.mo.observe(mainInfo, { attributes: true, attributeFilter: ['collapsed', 'attr-8ifv7'] });
          } else {
            this.mo.observe(mainInfo, { attributes: true, attributeFilter: ['attr-8ifv7'] });
          }
          mainInfo.incAttribute111('attr-8ifv7');
        }
      },
      'fullChannelNameOnHover': {
        activated: false,
        toUse: true,
        /** @type { MutationObserver | null } */
        mo: null,
        /** @type { ResizeObserver | null} */
        ro: null,
        promiseReady: new PromiseExternal(),
        checkResize: 0,
        mouseEnterFn(evt) {

          const target = evt ? evt.target : null;
          if (!(target instanceof HTMLElement_)) return;
          const metaDataElm = target.closest('ytd-watch-metadata');
          metaDataElm.classList.remove('tyt-metadata-hover-resized');
          this.checkResize = Date.now() + 300;
          metaDataElm.classList.add('tyt-metadata-hover');
          // console.log('mouseEnter')

        },
        mouseLeaveFn(evt) {
          const target = evt ? evt.target : null;
          if (!(target instanceof HTMLElement_)) return;
          const metaDataElm = target.closest('ytd-watch-metadata');
          metaDataElm.classList.remove('tyt-metadata-hover-resized');
          metaDataElm.classList.remove('tyt-metadata-hover');
          // console.log('mouseLeaveFn')

        },
        moFn(lockId) {

          if (lockGet['fullChannelNameOnHoverAttrAsyncLock'] !== lockId) return;

          const uploadInfo = document.querySelector('#primary.ytd-watch-flexy ytd-watch-metadata #upload-info');
          if (!uploadInfo) return;

          const evtOpt = { passive: true, capture: false };
          uploadInfo.removeEventListener('pointerenter', this.mouseEnterFn, evtOpt);
          uploadInfo.removeEventListener('pointerleave', this.mouseLeaveFn, evtOpt);

          uploadInfo.addEventListener('pointerenter', this.mouseEnterFn, evtOpt);
          uploadInfo.addEventListener('pointerleave', this.mouseLeaveFn, evtOpt);



        },
        async onNavigateFinish() {
          await this.promiseReady.then();
          const uploadInfo = document.querySelector('#primary.ytd-watch-flexy ytd-watch-metadata #upload-info');
          if (!uploadInfo) return;
          this.mo.observe(uploadInfo, { attributes: true, attributeFilter: ['hidden', 'attr-3wb0k'] });
          uploadInfo.incAttribute111('attr-3wb0k');
          this.ro.observe(uploadInfo);
        },
        activate() {

          if (this.activated) return;

          const isPassiveArgSupport = (typeof IntersectionObserver === 'function');
          // https://caniuse.com/?search=observer
          // https://caniuse.com/?search=addEventListener%20passive

          if (!isPassiveArgSupport) return;

          this.activated = true;

          this.mouseEnterFn = this.mouseEnterFn.bind(this);
          this.mouseLeaveFn = this.mouseLeaveFn.bind(this);

          this.moFn = this.moFn.bind(this);
          this.mo = new MutationObserver(() => {
            Promise.resolve(lockSet['fullChannelNameOnHoverAttrAsyncLock']).then(this.moFn).catch(console.warn);
          });
          this.ro = new ResizeObserver((mutations) => {

            if (Date.now() > this.checkResize) return;
            for (const mutation of mutations) {
              const uploadInfo = mutation.target;
              if (uploadInfo && mutation.contentRect.width > 0 && mutation.contentRect.height > 0) {

                const metaDataElm = uploadInfo.closest('ytd-watch-metadata');
                if (metaDataElm.classList.contains('tyt-metadata-hover')) {

                  metaDataElm.classList.add('tyt-metadata-hover-resized');
                }

                break;

              }
            }
          });
          this.promiseReady.resolve();
        }
      }
    }

    if (sessionStorage.__$$tmp_UseAutoExpandInfoDesc$$__) plugin.autoExpandInfoDesc.toUse = true;

    // let shouldFixInfo = false;
    const __attachedSymbol__ = Symbol();

    const makeInitAttached = (tag) => {
      const inPageRearrange_ = inPageRearrange;
      inPageRearrange = false;
      for (const elm of document.querySelectorAll(`${tag}`)) {
        const cnt = insp(elm) || 0;
        if (typeof cnt.attached498 === 'function' && !elm[__attachedSymbol__]) Promise.resolve(elm).then(eventMap[`${tag}::attached`]).catch(console.warn);
      }
      inPageRearrange = inPageRearrange_;
    };

    const getGeneralChatElement = async () => {
      for (let i = 2; i-- > 0;) {
        let t = document.querySelector('#columns.style-scope.ytd-watch-flexy ytd-live-chat-frame#chat');
        if (t instanceof Element) return t;
        if (i > 0) {
          // try later
          console.log('ytd-live-chat-frame::attached - delayPn(200)')
          await delayPn(200);
        }
      }
      return null;
    };

    const nsTemplateObtain = () => {
      let nsTemplate = document.querySelector('ytd-watch-flexy noscript[ns-template]');
      if (!nsTemplate) {
        nsTemplate = document.createElement('noscript');
        nsTemplate.setAttribute('ns-template', '');
        document.querySelector('ytd-watch-flexy').appendChild(nsTemplate);
      }
      return nsTemplate;
    };

    const isPageDOM = (elm, selector) => {
      if (!elm || !(elm instanceof Element) || !(elm.nodeName)) return false;
      if (!elm.closest(selector)) return false;
      if (elm.isConnected !== true) return false;
      return true;
    };

    const invalidFlexyParent = (hostElement) => {
      if (hostElement instanceof HTMLElement) {
        const hasFlexyParent = HTMLElement.prototype.closest.call(hostElement, 'ytd-watch-flexy');  // eg short
        if (!hasFlexyParent) return true;
        const currentFlexy = elements.flexy;
        if (currentFlexy && currentFlexy !== hasFlexyParent) return true;
      }
      return false;
    }

    // const mutationComment = document.createComment('1');
    // let mutationPromise = new PromiseExternal();
    // const mutationPromiseObs = new MutationObserver(()=>{
    //   mutationPromise.resolve();
    //   mutationPromise = new PromiseExternal();
    // });
    // mutationPromiseObs.observe(mutationComment, {characterData: true});

    let headerMutationObserver = null;
    let headerMutationTmpNode = null;

    const eventMap = {

      'ceHack': () => {
        mLoaded.flag |= 2;
        document.documentElement.setAttribute111('tabview-loaded', mLoaded.makeString());

        retrieveCE('ytd-watch-flexy').then(eventMap['ytd-watch-flexy::defined']).catch(console.warn);
        retrieveCE('ytd-expander').then(eventMap['ytd-expander::defined']).catch(console.warn);
        retrieveCE('ytd-watch-next-secondary-results-renderer').then(eventMap['ytd-watch-next-secondary-results-renderer::defined']).catch(console.warn);
        retrieveCE('ytd-comments-header-renderer').then(eventMap['ytd-comments-header-renderer::defined']).catch(console.warn);
        retrieveCE('ytd-live-chat-frame').then(eventMap['ytd-live-chat-frame::defined']).catch(console.warn);
        retrieveCE('ytd-comments').then(eventMap['ytd-comments::defined']).catch(console.warn);
        retrieveCE('ytd-engagement-panel-section-list-renderer').then(eventMap['ytd-engagement-panel-section-list-renderer::defined']).catch(console.warn);
        retrieveCE('ytd-watch-metadata').then(eventMap['ytd-watch-metadata::defined']).catch(console.warn);
        retrieveCE('ytd-playlist-panel-renderer').then(eventMap['ytd-playlist-panel-renderer::defined']).catch(console.warn);
        retrieveCE('ytd-expandable-video-description-body-renderer').then(eventMap['ytd-expandable-video-description-body-renderer::defined']).catch(console.warn);

      },

      'fixForTabDisplay': (isResize) => {
        // isResize is true if the layout is resized (not due to tab switching)
        // youtube components shall handle the resize issue. can skip some checkings.

        bFixForResizedTabLater = false;
        for (const element of document.querySelectorAll('[io-intersected]')) {
          const cnt = insp(element);
          if (element instanceof HTMLElement_ && typeof cnt.calculateCanCollapse === 'function') {
            try {
              cnt.calculateCanCollapse(true);
            } catch (e) { }
          }
        }

        if (!isResize && lastTab === '#tab-info') {
          // #tab-info is now shown.
          // to fix the sizing issue (description info cards in tab info)
          for (const element of document.querySelectorAll('#tab-info ytd-video-description-infocards-section-renderer, #tab-info yt-chip-cloud-renderer, #tab-info ytd-horizontal-card-list-renderer, #tab-info yt-horizontal-list-renderer')) {
            const cnt = insp(element);
            if (element instanceof HTMLElement_ && typeof cnt.notifyResize === 'function') {
              try {
                cnt.notifyResize();
              } catch (e) { }
            }
          }
          // to fix expand/collapse sizing issue (inline-expander in tab info)
          // for example, expand button is required but not shown as it was rendered in the hidden state
          for (const element of document.querySelectorAll('#tab-info ytd-text-inline-expander')) {
            const cnt = insp(element);
            if (element instanceof HTMLElement_ && typeof cnt.resize === 'function') {
              cnt.resize(false); // reflow due to offsetWidth calling
            }
            fixInlineExpanderDisplay(cnt); // just in case
          }
        }

        if (!isResize && typeof lastTab === 'string' && lastTab.startsWith('#tab-')) {
          const tabContent = document.querySelector('.tab-content-cld:not(.tab-content-hidden)');
          if (tabContent) {
            const renderers = tabContent.querySelectorAll('yt-chip-cloud-renderer');
            for (const renderer of renderers) {
              const cnt = insp(renderer);
              if (typeof cnt.notifyResize === 'function') {
                try {
                  cnt.notifyResize();
                } catch (e) { }
              }
            }
          }
        }

      },

      'ytd-watch-flexy::defined': (cProto) => {

        if (!cProto.updateChatLocation498 && typeof cProto.updateChatLocation === 'function' && cProto.updateChatLocation.length === 0) {
          cProto.updateChatLocation498 = cProto.updateChatLocation;
          cProto.updateChatLocation = updateChatLocation498;
        }

      },



      'ytd-watch-next-secondary-results-renderer::defined': (cProto) => {
        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-watch-next-secondary-results-renderer::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-watch-next-secondary-results-renderer::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        makeInitAttached('ytd-watch-next-secondary-results-renderer');

      },

      'ytd-watch-next-secondary-results-renderer::attached': (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-watch-next-secondary-results-renderer::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        if (hostElement instanceof HTMLElement_ && hostElement.matches('#columns #related ytd-watch-next-secondary-results-renderer') && !hostElement.matches('#right-tabs ytd-watch-next-secondary-results-renderer, [hidden] ytd-watch-next-secondary-results-renderer')) {
          elements.related = hostElement.closest('#related');
          hostElement.setAttribute111('tyt-videos-list', '');
        }
        // console.log('ytd-watch-next-secondary-results-renderer::attached', hostElement);
      },

      'ytd-watch-next-secondary-results-renderer::detached': (hostElement) => {
        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-watch-next-secondary-results-renderer::detached');
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        if (hostElement.hasAttribute000('tyt-videos-list')) {
          elements.related = null;
          hostElement.removeAttribute000('tyt-videos-list');
        }
        console.log('ytd-watch-next-secondary-results-renderer::detached', hostElement);
      },


      'settingCommentsVideoId': (hostElement) => {
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        const cnt = insp(hostElement);
        const commentsArea = elements.comments;
        if (commentsArea !== hostElement || hostElement.isConnected !== true || cnt.isAttached !== true || !cnt.data || cnt.hidden !== false) return;
        const ytdFlexyElm = elements.flexy;
        const ytdFlexyCnt = ytdFlexyElm ? insp(ytdFlexyElm) : null;
        if (ytdFlexyCnt && ytdFlexyCnt.videoId) {
          hostElement.setAttribute111('tyt-comments-video-id', ytdFlexyCnt.videoId)
        } else {
          hostElement.removeAttribute000('tyt-comments-video-id')
        }
      },
      'checkCommentsShouldBeHidden': (lockId) => {

        if (lockGet['checkCommentsShouldBeHiddenLock'] !== lockId) return;

        // commentsArea's attribute: tyt-comments-video-id
        // ytdFlexyElm's attribute: video-id


        const commentsArea = elements.comments;
        const ytdFlexyElm = elements.flexy;
        if (commentsArea && ytdFlexyElm && !commentsArea.hasAttribute000('hidden')) {
          const ytdFlexyCnt = insp(ytdFlexyElm);
          if (typeof ytdFlexyCnt.videoId === 'string') {
            const commentsVideoId = commentsArea.getAttribute('tyt-comments-video-id');
            if (commentsVideoId && commentsVideoId !== ytdFlexyCnt.videoId) {
              commentsArea.setAttribute111('hidden', '');
              // removeKeepCommentsScroller();
            }
          }
        }

      },
      'ytd-comments::defined': (cProto) => {

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-comments::attached']).catch(console.warn);
            // Promise.resolve(this.hostElement).then(eventMap['ytd-comments::dataChanged_']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-comments::detached']).catch(console.warn);
            // Promise.resolve(this.hostElement).then(eventMap['ytd-comments::dataChanged_']).catch(console.warn);
            return this.detached498();
          }
        }

        cProto._createPropertyObserver('data', '_dataChanged498', undefined)
        cProto._dataChanged498 = function () {
          // console.log('_dataChanged498', this.hostElement)
          Promise.resolve(this.hostElement).then(eventMap['ytd-comments::_dataChanged498']).catch(console.warn);
        }


        // if (!cProto.dataChanged498_ && typeof cProto.dataChanged_ === 'function') {
        //   cProto.dataChanged498_ = cProto.dataChanged_;
        //   cProto.dataChanged_ = function () {
        //     Promise.resolve(this.hostElement).then(eventMap['ytd-comments::dataChanged_']).catch(console.warn);
        //     return this.dataChanged498_();
        //   }
        // }

        makeInitAttached('ytd-comments');

      },

      'ytd-comments::_dataChanged498': (hostElement) => {
        // console.log(18984, hostElement.hasAttribute('tyt-comments-area'))
        if (!hostElement.hasAttribute000('tyt-comments-area')) return;
        let commentsDataStatus = 0;
        const cnt = insp(hostElement);
        const data = cnt ? cnt.data : null
        const contents = data ? data.contents : null;
        if (data) {
          if (contents && contents.length === 1 && contents[0].messageRenderer) {
            commentsDataStatus = 2;
          }
          if (contents && contents.length > 1 && contents[0].commentThreadRenderer) {
            commentsDataStatus = 1;
          }
        }
        if (commentsDataStatus) {
          hostElement.setAttribute111('tyt-comments-data-status', commentsDataStatus);
          // ytdFlexyElm.setAttribute111('tyt-comment-disabled', '')
        } else {
          // ytdFlexyElm.removeAttribute000('tyt-comment-disabled')
          hostElement.removeAttribute000('tyt-comments-data-status')
        }
        Promise.resolve(hostElement).then(eventMap['settingCommentsVideoId']).catch(console.warn);
      },

      'ytd-comments::attached': async (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-comments::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        if (!hostElement || hostElement.id !== 'comments') return;
        // if (!hostElement || hostElement.closest('[hidden]')) return;
        elements.comments = hostElement;
        console.log('ytd-comments::attached')
        Promise.resolve(hostElement).then(eventMap['settingCommentsVideoId']).catch(console.warn);

        aoComment.observe(hostElement, { attributes: true });
        hostElement.setAttribute111('tyt-comments-area', '');

        const lockId = lockSet['rightTabReadyLock02'];
        await rightTabsProvidedPromise.then();
        if (lockGet['rightTabReadyLock02'] !== lockId) return;

        if (elements.comments !== hostElement) return;
        if (hostElement.isConnected === false) return;
        console.log(7932, 'comments');

        // if(!elements.comments || elements.comments.isConnected === false) return;
        if (hostElement && !hostElement.closest('#right-tabs')) {
          document.querySelector('#tab-comments').assignChildern111(null, hostElement, null);
        } else {

          const shouldTabVisible = elements.comments && elements.comments.closest('#tab-comments') && !elements.comments.closest('[hidden]');

          document.querySelector('[tyt-tab-content="#tab-comments"]').classList.toggle('tab-btn-hidden', !shouldTabVisible);

          //   document.querySelector('#tab-comments').classList.remove('tab-content-hidden')
          //   document.querySelector('[tyt-tab-content="#tab-comments"]').classList.remove('tab-btn-hidden')

          Promise.resolve(lockSet['removeKeepCommentsScrollerLock']).then(removeKeepCommentsScroller).catch(console.warn);

        }

      },
      'ytd-comments::detached': (hostElement) => {
        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-comments::detached');
        // console.log(858, hostElement)
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;

        if (hostElement.hasAttribute000('tyt-comments-area')) {
          // foComments.disconnect();
          // foComments.takeRecords();
          hostElement.removeAttribute000('tyt-comments-area');
          // document.querySelector('#tab-comments').classList.add('tab-content-hidden')
          // document.querySelector('[tyt-tab-content="#tab-comments"]').classList.add('tab-btn-hidden')


          aoComment.disconnect();
          aoComment.takeRecords();
          elements.comments = null;

          document.querySelector('[tyt-tab-content="#tab-comments"]').classList.add('tab-btn-hidden');

          Promise.resolve(lockSet['removeKeepCommentsScrollerLock']).then(removeKeepCommentsScroller).catch(console.warn);
        }


      },


      'ytd-comments-header-renderer::defined': (cProto) => {

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-comments-header-renderer::attached']).catch(console.warn);
            Promise.resolve(this.hostElement).then(eventMap['ytd-comments-header-renderer::dataChanged']).catch(console.warn); // force dataChanged on attached
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-comments-header-renderer::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        if (!cProto.dataChanged498 && typeof cProto.dataChanged === 'function') {
          cProto.dataChanged498 = cProto.dataChanged;
          cProto.dataChanged = function () {
            Promise.resolve(this.hostElement).then(eventMap['ytd-comments-header-renderer::dataChanged']).catch(console.warn);
            return this.dataChanged498();
          }
        }


        makeInitAttached('ytd-comments-header-renderer');


      },


      'ytd-comments-header-renderer::attached': (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-comments-header-renderer::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        if (!hostElement || !hostElement.classList.contains('ytd-item-section-renderer')) return;
        // console.log(12991, 'ytd-comments-header-renderer::attached')
        const targetElement = document.querySelector('[tyt-comments-area] ytd-comments-header-renderer');
        if (hostElement === targetElement) {
          hostElement.setAttribute111('tyt-comments-header-field', '');
        } else {
          const parentNode = hostElement.parentNode;
          if (parentNode instanceof HTMLElement_ && parentNode.querySelector('[tyt-comments-header-field]')) {
            hostElement.setAttribute111('tyt-comments-header-field', '')
          }
        }

      },

      'ytd-comments-header-renderer::detached': (hostElement) => {
        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-comments-header-renderer::detached');

        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        // console.log(12992, 'ytd-comments-header-renderer::detached')
        if (hostElement.hasAttribute000('field-of-cm-count')) {
          hostElement.removeAttribute000('field-of-cm-count');

          const cmCount = document.querySelector('#tyt-cm-count');
          if (cmCount && !document.querySelector('#tab-comments ytd-comments-header-renderer[field-of-cm-count]')) {
            cmCount.textContent = '';
          }
        }
        if (hostElement.hasAttribute000('tyt-comments-header-field')) {
          hostElement.removeAttribute000('tyt-comments-header-field');
        }

      },

      'ytd-comments-header-renderer::dataChanged': (hostElement) => {

        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;

        const ytdFlexyElm = elements.flexy;

        let b = false;
        const cnt = insp(hostElement);
        if (cnt && hostElement.closest('#tab-comments') && document.querySelector('#tab-comments ytd-comments-header-renderer') === hostElement) {
          b = true;
        } else if (hostElement instanceof HTMLElement_ && hostElement.parentNode instanceof HTMLElement_ && hostElement.parentNode.querySelector('[tyt-comments-header-field]')) {
          b = true;
        }
        if (b) {
          hostElement.setAttribute111('tyt-comments-header-field', '')
          ytdFlexyElm && ytdFlexyElm.removeAttribute000('tyt-comment-disabled');
        }

        if (hostElement.hasAttribute000('tyt-comments-header-field') && hostElement.isConnected === true) {
          if (!headerMutationObserver) {
            headerMutationObserver = new MutationObserver(eventMap['ytd-comments-header-renderer::deferredCounterUpdate']);
          }
          headerMutationObserver.observe(hostElement.parentNode, { subtree: false, childList: true })
          if (!headerMutationTmpNode) headerMutationTmpNode = document.createElementNS('http://www.w3.org/2000/svg', 'defs');
          const tmpNode = headerMutationTmpNode;
          hostElement.insertAdjacentElement("afterend", tmpNode);
          tmpNode.remove();
        }
      },

      'ytd-comments-header-renderer::deferredCounterUpdate': () => {

        const nodes = document.querySelectorAll('#tab-comments ytd-comments-header-renderer[class]');
        if (nodes.length === 1) {
          const hostElement = nodes[0];
          const cnt = insp(hostElement);
          const data = cnt.data;
          if (!data) return;
          let ez = '';
          if (data.commentsCount && data.commentsCount.runs && data.commentsCount.runs.length >= 1) {
            let max = -1;
            const z = data.commentsCount.runs.map(e => {
              let c = e.text.replace(/\D+/g, '').length;
              if (c > max) max = c;
              return [e.text, c];
            }).filter(a => a[1] === max);
            if (z.length >= 1) {
              ez = z[0][0];
            }
          } else if (data.countText && data.countText.runs && data.countText.runs.length >= 1) {
            let max = -1;
            const z = data.countText.runs.map(e => {
              let c = e.text.replace(/\D+/g, '').length;
              if (c > max) max = c;
              return [e.text, c];
            }).filter(a => a[1] === max);
            if (z.length >= 1) {
              ez = z[0][0];
            }
          }
          const cmCount = document.querySelector('#tyt-cm-count');
          if (ez) {
            hostElement.setAttribute111('field-of-cm-count', '');
            cmCount && (cmCount.textContent = ez.trim());
          } else {
            hostElement.removeAttribute000('field-of-cm-count');
            cmCount && (cmCount.textContent = '');
            console.warn('no text for #tyt-cm-count')
          }
        }
      },

      'ytd-expander::defined': (cProto) => {
        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-expander::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-expander::detached']).catch(console.warn);
            return this.detached498();
          }
        }
        if (!cProto.calculateCanCollapse498 && typeof cProto.calculateCanCollapse === 'function') {
          cProto.calculateCanCollapse498 = cProto.calculateCanCollapse;
          cProto.calculateCanCollapse = funcCanCollapse;


        }

        if (!cProto.childrenChanged498 && typeof cProto.childrenChanged === 'function') {
          cProto.childrenChanged498 = cProto.childrenChanged;
          cProto.childrenChanged = function () {
            Promise.resolve(this.hostElement).then(eventMap['ytd-expander::childrenChanged']).catch(console.warn);
            return this.childrenChanged498();
          }
        }

        /*
 
        console.log('ytd-expander::defined 01');
        
        CustomElementRegistry.prototype.get.call(customElements, 'ytd-expander').prototype.connectedCallback = connectedCallbackY(CustomElementRegistry.prototype.get.call(customElements, 'ytd-expander').prototype.connectedCallback)
        CustomElementRegistry.prototype.get.call(customElements, 'ytd-expander').prototype.disconnectedCallback = disconnectedCallbackY(CustomElementRegistry.prototype.get.call(customElements, 'ytd-expander').prototype.disconnectedCallback)
        
        console.log('ytd-expander::defined 02');
 
        */

        makeInitAttached('ytd-expander');

      },


      'ytd-expander::childrenChanged': (hostElement) => {

        if (hostElement instanceof Node && hostElement.hasAttribute000('hidden') && hostElement.hasAttribute000('tyt-main-info') && hostElement.firstElementChild) {
          hostElement.removeAttribute('hidden');
        }
      },

      'ytd-expandable-video-description-body-renderer::defined': (cProto) => {


        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-expandable-video-description-body-renderer::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-expandable-video-description-body-renderer::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        makeInitAttached('ytd-expandable-video-description-body-renderer')


      },

      'ytd-expandable-video-description-body-renderer::attached': async (hostElement) => {


        if (hostElement instanceof HTMLElement_ && isPageDOM(hostElement, '[tyt-info-renderer]') && !hostElement.matches('[tyt-main-info]')) {


          elements.infoExpander = hostElement;
          console.log(128384, elements.infoExpander)


          // console.log(1299, hostElement.parentNode, isRightTabsInserted)

          infoExpanderElementProvidedPromise.resolve();
          hostElement.setAttribute111('tyt-main-info', '');
          if (plugin.autoExpandInfoDesc.toUse) {
            plugin.autoExpandInfoDesc.onMainInfoSet(hostElement);
          }

          const lockId = lockSet['rightTabReadyLock03'];
          await rightTabsProvidedPromise.then();
          if (lockGet['rightTabReadyLock03'] !== lockId) return;

          if (elements.infoExpander !== hostElement) return;
          if (hostElement.isConnected === false) return;
          console.log(7932, 'infoExpander');

          elements.infoExpander.classList.add('tyt-main-info'); // add a classname for it

          const infoExpander = elements.infoExpander;
          // const infoExpanderBack = elements.infoExpanderBack;


          // console.log(5438,infoExpander, qt);

          // const dummy = document.createElement('noscript');
          // dummy.setAttribute000('id', 'info-expander-vid');
          // dummy.setAttribute000('video-id', getCurrentVideoId());
          // infoExpander.insertBefore000(dummy, infoExpander.firstChild);

          // aoInfo.observe(infoExpander, { attributes: true, attributeFilter: ['tyt-display-for', 'tyt-video-id'] });
          // zoInfo.observe(infoExpanderBack, { attributes: true, attributeFilter: ['hidden', 'attr-w20ts'], childList: true, subtree: true});
          // new MutationObserver(()=>{
          //   console.log(591499)
          // }).observe(infoExpanderBack, {childList: true, subtree: true})

          const inlineExpanderElm = infoExpander.querySelector('ytd-text-inline-expander');
          if (inlineExpanderElm) {
            const mo = new MutationObserver(() => {
              const p = document.querySelector('#tab-info ytd-text-inline-expander');
              sessionStorage.__$$tmp_UseAutoExpandInfoDesc$$__ = p && p.hasAttribute('is-expanded') ? '1' : '';
              if (p) fixInlineExpanderContent();
            });
            mo.observe(inlineExpanderElm, { attributes: ['is-expanded', 'attr-6v8qu', 'hidden'], subtree: true }); // hidden + subtree to trigger the fn by delayedUpdate
            inlineExpanderElm.incAttribute111('attr-6v8qu');
            const cnt = insp(inlineExpanderElm);

            if (cnt) fixInlineExpanderDisplay(cnt);

          }


          if (infoExpander && !infoExpander.closest('#right-tabs')) {
            document.querySelector('#tab-info').assignChildern111(null, infoExpander, null);
          } else {

            if (document.querySelector('[tyt-tab-content="#tab-info"]')) {
              const shouldTabVisible = elements.infoExpander && elements.infoExpander.closest('#tab-info');
              document.querySelector('[tyt-tab-content="#tab-info"]').classList.toggle('tab-btn-hidden', !shouldTabVisible);
            }
          }


          Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn); // required when the page is switched from channel to watch

          // if (infoExpander && infoExpander.closest('#right-tabs')) Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn);

          // infoExpanderBack.incAttribute111('attr-w20ts');

          // return;
        }


        DEBUG_5084 && console.log(5084, 'ytd-expandable-video-description-body-renderer::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;

        if (isPageDOM(hostElement, '#tab-info [tyt-main-info]')) {

          // const cnt = insp(hostElement);
          // if(cnt.data){
          //   cnt.data = Object.assign({}, cnt.data);
          // }


        } else if (!hostElement.closest('#tab-info')) {


          const bodyRenderer = hostElement;
          let bodyRendererNew = document.querySelector('ytd-expandable-video-description-body-renderer[tyt-info-renderer]');
          if (!bodyRendererNew) {
            bodyRendererNew = document.createElement('ytd-expandable-video-description-body-renderer');
            bodyRendererNew.setAttribute('tyt-info-renderer', '');
            nsTemplateObtain().appendChild(bodyRendererNew);
          }
          // document.querySelector('#tab-info').assignChildern111(null, bodyRendererNew, null);


          const cnt = insp(bodyRendererNew);
          cnt.data = Object.assign({}, insp(bodyRenderer).data);

          const inlineExpanderElm = bodyRendererNew.querySelector('ytd-text-inline-expander');
          const inlineExpanderCnt = insp(inlineExpanderElm);
          fixInlineExpanderMethods(inlineExpanderCnt);

          // insp(bodyRendererNew).data = insp(bodyRenderer).data;

          // if((bodyRendererNew.hasAttribute('hidden')?1:0)^(bodyRenderer.hasAttribute('hidden')?1:0)){
          //   if(bodyRenderer.hasAttribute('hidden')) bodyRendererNew.setAttribute('hidden', '');
          //   else bodyRendererNew.removeAttribute('hidden');
          // }

          elements.infoExpanderRendererBack = bodyRenderer;
          elements.infoExpanderRendererFront = bodyRendererNew;
          bodyRenderer.setAttribute('tyt-info-renderer-back', '');
          bodyRendererNew.setAttribute('tyt-info-renderer-front', '');

          // elements.infoExpanderBack = {{ytd-expander}};


        }



      },

      'ytd-expandable-video-description-body-renderer::detached': async (hostElement) => {
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        // console.log(5992, hostElement)
        if (hostElement.hasAttribute000('tyt-main-info')) {
          DEBUG_5084 && console.log(5084, 'ytd-expandable-video-description-body-renderer::detached');
          elements.infoExpander = null;
          hostElement.removeAttribute000('tyt-main-info');
        }
      },

      'ytd-expander::attached': async (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        // console.log(4959, hostElement)


        if (hostElement instanceof HTMLElement_ && hostElement.matches('[tyt-comments-area] #contents ytd-expander#expander') && !hostElement.matches('[hidden] ytd-expander#expander')) {

          hostElement.setAttribute111('tyt-content-comment-entry', '')
          ioComment.observe(hostElement);
        }

        // --------------

        // else if (hostElement instanceof HTMLElement_ && hostElement.matches('ytd-expander#expander.style-scope.ytd-expandable-video-description-body-renderer')) {
        //   //  && !hostElement.matches('#right-tabs ytd-expander#expander, [hidden] ytd-expander#expander')

        //   console.log(5084, 'ytd-expander::attached');
        //   const bodyRenderer = hostElement.closest('ytd-expandable-video-description-body-renderer');
        //   let bodyRendererNew = document.querySelector('ytd-expandable-video-description-body-renderer[tyt-info-renderer]');
        //   if (!bodyRendererNew) {
        //     bodyRendererNew = document.createElement('ytd-expandable-video-description-body-renderer');
        //     bodyRendererNew.setAttribute('tyt-info-renderer', '');
        //     nsTemplateObtain().appendChild(bodyRendererNew);
        //   }
        //   // document.querySelector('#tab-info').assignChildern111(null, bodyRendererNew, null);

        //   insp(bodyRendererNew).data = insp(bodyRenderer).data;
        //   // if((bodyRendererNew.hasAttribute('hidden')?1:0)^(bodyRenderer.hasAttribute('hidden')?1:0)){
        //   //   if(bodyRenderer.hasAttribute('hidden')) bodyRendererNew.setAttribute('hidden', '');
        //   //   else bodyRendererNew.removeAttribute('hidden');
        //   // }

        //   elements.infoExpanderRendererBack = bodyRenderer;
        //   elements.infoExpanderRendererFront = bodyRendererNew;
        //   bodyRenderer.setAttribute('tyt-info-renderer-back','')
        //   bodyRendererNew.setAttribute('tyt-info-renderer-front','')

        //   elements.infoExpanderBack = hostElement;

        // }

        // --------------

        // console.log('ytd-expander::attached', hostElement);



      },

      'ytd-expander::detached': (hostElement) => {
        // if (inPageRearrange) return;
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        // console.log(5992, hostElement)
        if (hostElement.hasAttribute000('tyt-content-comment-entry')) {
          ioComment.unobserve(hostElement);
          hostElement.removeAttribute000('tyt-content-comment-entry')
        } else if (hostElement.hasAttribute000('tyt-main-info')) {
          DEBUG_5084 && console.log(5084, 'ytd-expander::detached');
          elements.infoExpander = null;
          hostElement.removeAttribute000('tyt-main-info');
        }
        // console.log('ytd-expander::detached', hostElement);
      },


      'ytd-live-chat-frame::defined': (cProto) => {

        let lastDomAction = 0;

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            lastDomAction = Date.now();
            // console.log('chat868-attached', Date.now());
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-live-chat-frame::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            lastDomAction = Date.now();
            // console.log('chat868-detached', Date.now());
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-live-chat-frame::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        if (typeof cProto.urlChanged === 'function' && !cProto.urlChanged66 && !cProto.urlChangedAsync12 && cProto.urlChanged.length === 0) {
          cProto.urlChanged66 = cProto.urlChanged;
          let ath = 0;
          cProto.urlChangedAsync12 = async function () {
            await this.__urlChangedAsyncT689__;
            const t = ath = (ath & 1073741823) + 1;
            const chatframe = this.chatframe || (this.$ || 0).chatframe || 0;
            if (chatframe instanceof HTMLIFrameElement) {
              if (chatframe.contentDocument === null) {
                await Promise.resolve('#').catch(console.warn);
                if (t !== ath) return;
              }
              await new Promise(resolve => setTimeout_(resolve, 1)).catch(console.warn); // neccessary for Brave
              if (t !== ath) return;
              const isBlankPage = !this.data || this.collapsed;
              const p1 = new Promise(resolve => setTimeout_(resolve, 706)).catch(console.warn);
              const p2 = new Promise(resolve => {
                (new IntersectionObserver((entries, observer) => {
                  for (const entry of entries) {
                    const rect = entry.boundingClientRect || 0;
                    if (isBlankPage || (rect.width > 0 && rect.height > 0)) {
                      observer.disconnect();
                      resolve('#');
                      break;
                    }
                  }
                })).observe(chatframe);
              }).catch(console.warn);
              await Promise.race([p1, p2]);
              if (t !== ath) return;
            }
            this.urlChanged66();
          }
          cProto.urlChanged = function () {
            const t = this.__urlChangedAsyncT688__ = (this.__urlChangedAsyncT688__ & 1073741823) + 1;
            nextBrowserTick(() => {
              if (t !== this.__urlChangedAsyncT688__) return;
              this.urlChangedAsync12();
            });
          }
        }

        makeInitAttached('ytd-live-chat-frame');

      },

      'ytd-live-chat-frame::attached': async (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-live-chat-frame::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        if (!hostElement || hostElement.id !== 'chat') return;
        console.log('ytd-live-chat-frame::attached')

        const lockId = lockSet['ytdLiveAttachedLock'];
        const chatElem = await getGeneralChatElement();
        if (lockGet['ytdLiveAttachedLock'] !== lockId) return;

        if (chatElem === hostElement) {
          elements.chat = chatElem;
          aoChat.observe(chatElem, { attributes: true });
          const isFlexyReady = (elements.flexy instanceof Element);
          chatElem.setAttribute111('tyt-active-chat-frame', isFlexyReady ? 'CF' : 'C');

          const chatContainer = chatElem ? (chatElem.closest('#chat-container') || chatElem) : null;
          if (chatContainer && !chatContainer.hasAttribute000('tyt-chat-container')) {
            for (const p of document.querySelectorAll('[tyt-chat-container]')) {
              p.removeAttribute000('[tyt-chat-container]');
            }
            chatContainer.setAttribute111('tyt-chat-container', '')
          }
          const cnt = insp(hostElement);
          const q = cnt.__urlChangedAsyncT688__;
          const p = cnt.__urlChangedAsyncT689__ = new PromiseExternal();
          setTimeout_(() => {
            if (p !== cnt.__urlChangedAsyncT689__) return;
            if (cnt.isAttached === true && hostElement.isConnected === true) {
              p.resolve();
              if (q === cnt.__urlChangedAsyncT688__) {
                cnt.urlChanged();
              }
            }
          }, 320);
          Promise.resolve(lockSet['layoutFixLock']).then(layoutFix);
        } else {
          console.log('Issue found in ytd-live-chat-frame::attached', chatElem, hostElement);
        }
      },

      'ytd-live-chat-frame::detached': (hostElement) => {
        // if (inPageRearrange) return;
        DEBUG_5084 && console.log(5084, 'ytd-live-chat-frame::detached');

        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        console.log('ytd-live-chat-frame::detached')
        if (hostElement.hasAttribute000('tyt-active-chat-frame')) {
          aoChat.disconnect();
          aoChat.takeRecords();
          hostElement.removeAttribute000('tyt-active-chat-frame');
          elements.chat = null;

          const ytdFlexyElm = elements.flexy;
          if (ytdFlexyElm) {
            ytdFlexyElm.removeAttribute000('tyt-chat-collapsed')
            ytdFlexyElm.setAttribute111('tyt-chat', '');
          }
        }

      },

      'ytd-engagement-panel-section-list-renderer::defined': (cProto) => {

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-engagement-panel-section-list-renderer::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-engagement-panel-section-list-renderer::detached']).catch(console.warn);
            return this.detached498();
          }
        }
        makeInitAttached('ytd-engagement-panel-section-list-renderer');
      },

      'ytd-engagement-panel-section-list-renderer::bindTarget': (hostElement) => {


        if (hostElement.matches('#panels.ytd-watch-flexy > ytd-engagement-panel-section-list-renderer[target-id][visibility]')) {
          hostElement.setAttribute111('tyt-egm-panel', '');
          Promise.resolve(lockSet['updateEgmPanelsLock']).then(updateEgmPanels).catch(console.warn);
          aoEgmPanels.observe(hostElement, { attributes: true, attributeFilter: ['visibility', 'hidden'] });

          // console.log(5094, 2, 'ytd-engagement-panel-section-list-renderer::attached', hostElement);
        }

      },


      'ytd-engagement-panel-section-list-renderer::attached': (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-engagement-panel-section-list-renderer::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;
        // console.log('ytd-engagement-panel-section-list-renderer::attached', hostElement)
        // console.log(5094, 1, 'ytd-engagement-panel-section-list-renderer::attached', hostElement);

        if (!hostElement.matches('#panels.ytd-watch-flexy > ytd-engagement-panel-section-list-renderer')) return;


        if (hostElement.hasAttribute000('target-id') && hostElement.hasAttribute000('visibility')) {

          Promise.resolve(hostElement).then(eventMap['ytd-engagement-panel-section-list-renderer::bindTarget']).catch(console.warn);
        } else {

          hostElement.setAttribute000('tyt-egm-panel-jclmd', '');
          moEgmPanelReady.observe(hostElement, { attributes: true, attributeFilter: ['visibility', 'target-id'] });

        }
      },

      'ytd-engagement-panel-section-list-renderer::detached': (hostElement) => {
        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-engagement-panel-section-list-renderer::detached');
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;
        if (hostElement.hasAttribute000('tyt-egm-panel')) {
          hostElement.removeAttribute000('tyt-egm-panel');
          Promise.resolve(lockSet['updateEgmPanelsLock']).then(updateEgmPanels).catch(console.warn);
        } else if (hostElement.hasAttribute000('tyt-egm-panel-jclmd')) {
          hostElement.removeAttribute000('tyt-egm-panel-jclmd');
          moEgmPanelReadyClearFn();
        }
      },

      'ytd-watch-metadata::defined': (cProto) => {

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-watch-metadata::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-watch-metadata::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        makeInitAttached('ytd-watch-metadata');
      },



      'ytd-watch-metadata::attached': (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-watch-metadata::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;

        if (plugin.fullChannelNameOnHover.activated) plugin.fullChannelNameOnHover.onNavigateFinish();
      },

      'ytd-watch-metadata::detached': (hostElement) => {
        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-watch-metadata::detached');
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;

      },



      'ytd-playlist-panel-renderer::defined': (cProto) => {

        if (!cProto.attached498 && typeof cProto.attached === 'function') {
          cProto.attached498 = cProto.attached;
          cProto.attached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-playlist-panel-renderer::attached']).catch(console.warn);
            return this.attached498();
          }
        }
        if (!cProto.detached498 && typeof cProto.detached === 'function') {
          cProto.detached498 = cProto.detached;
          cProto.detached = function () {
            if (!inPageRearrange) Promise.resolve(this.hostElement).then(eventMap['ytd-playlist-panel-renderer::detached']).catch(console.warn);
            return this.detached498();
          }
        }

        makeInitAttached('ytd-playlist-panel-renderer');
      },



      'ytd-playlist-panel-renderer::attached': (hostElement) => {

        if (invalidFlexyParent(hostElement)) return;

        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-playlist-panel-renderer::attached');
        if (hostElement instanceof Element) hostElement[__attachedSymbol__] = true;
        if (!(hostElement instanceof HTMLElement_) || !(hostElement.classList.length > 0) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== true) return;
        // if (hostElement.__connectedFlg__ !== 4) return;
        // hostElement.__connectedFlg__ = 5;

        elements.playlist = hostElement;

        aoPlayList.observe(hostElement, { attributes: true, attributeFilter: ['hidden', 'collapsed', 'attr-1y6nu'] });
        hostElement.incAttribute111('attr-1y6nu')


      },

      'ytd-playlist-panel-renderer::detached': (hostElement) => {
        // if (inPageRearrange) return;

        DEBUG_5084 && console.log(5084, 'ytd-playlist-panel-renderer::detached');
        if (!(hostElement instanceof HTMLElement_) || hostElement.closest('noscript')) return;
        if (hostElement.isConnected !== false) return;
        // if (hostElement.__connectedFlg__ !== 8) return;
        // hostElement.__connectedFlg__ = 9;

      },





      '_yt_playerProvided': () => {
        mLoaded.flag |= 4;
        document.documentElement.setAttribute111('tabview-loaded', mLoaded.makeString());
      },
      'relatedElementProvided': (target) => {
        if (target.closest('[hidden]')) return;
        elements.related = target;
        console.log('relatedElementProvided')
        videosElementProvidedPromise.resolve();
      },
      'onceInfoExpanderElementProvidedPromised': () => {
        console.log('hide-default-text-inline-expander');
        const ytdFlexyElm = elements.flexy;
        if (ytdFlexyElm) {
          ytdFlexyElm.setAttribute111('hide-default-text-inline-expander', '');
        }
      },

      'refreshSecondaryInner': (lockId) => {


        if (lockGet['refreshSecondaryInnerLock'] !== lockId) return;
        /*
   
        ytd-watch-flexy:not([panels-beside-player]):not([fixed-panels]) #panels-full-bleed-container.ytd-watch-flexy{
            display: none;}
   
  #player-full-bleed-container.ytd-watch-flexy{
      position: relative;
      flex: 1;}
   
        */

        const ytdFlexyElm = elements.flexy;
        // if(ytdFlexyElm && ytdFlexyElm.matches('ytd-watch-flexy[fixed-panels][theater]')){
        //   // ytdFlexyElm.fixedPanels = true;
        //   ytdFlexyElm.removeAttribute000('fixed-panels');
        // }

        if (ytdFlexyElm && ytdFlexyElm.matches('ytd-watch-flexy[theater][flexy][full-bleed-player]:not([full-bleed-no-max-width-columns])')) {
          // ytdFlexyElm.fullBleedNoMaxWidthColumns = true;
          ytdFlexyElm.setAttribute111('full-bleed-no-max-width-columns', '');
        }

        const related = elements.related;
        if (related && related.isConnected && !related.closest('#right-tabs #tab-videos')) {
          document.querySelector('#tab-videos').assignChildern111(null, related, null);
        }
        const infoExpander = elements.infoExpander;
        if (infoExpander && infoExpander.isConnected && !infoExpander.closest('#right-tabs #tab-info')) {
          document.querySelector('#tab-info').assignChildern111(null, infoExpander, null);
        } else {
          // if (infoExpander && ytdFlexyElm && shouldFixInfo) {
          //   shouldFixInfo = false;
          //   Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn);
          // }
        }

        const commentsArea = elements.comments;
        if (commentsArea) {
          const isConnected = commentsArea.isConnected;
          if (isConnected && !commentsArea.closest('#right-tabs #tab-comments')) {
            const tab = document.querySelector('#tab-comments');
            tab.assignChildern111(null, commentsArea, null);
          } else {
            // if (!isConnected || tab.classList.contains('tab-content-hidden')) removeKeepCommentsScroller();
          }
        }







      },

      'yt-navigate-finish': (evt) => {

        const ytdAppElm = document.querySelector('ytd-page-manager#page-manager.style-scope.ytd-app');
        const ytdAppCnt = insp(ytdAppElm);
        pageType = ytdAppCnt ? (ytdAppCnt.data || 0).page : null;

        if (!document.querySelector('ytd-watch-flexy #player')) return;
        // shouldFixInfo = true;
        // console.log('yt-navigate-finish')
        const flexyArr = [...document.querySelectorAll('ytd-watch-flexy')].filter(e => !e.closest('[hidden]') && e.querySelector('#player'));
        if (flexyArr.length === 1) {
          // const lockId = lockSet['yt-navigate-finish-videos'];
          elements.flexy = flexyArr[0];
          if (isRightTabsInserted) {
            Promise.resolve(lockSet['refreshSecondaryInnerLock']).then(eventMap['refreshSecondaryInner']).catch(console.warn);
            Promise.resolve(lockSet['removeKeepCommentsScrollerLock']).then(removeKeepCommentsScroller).catch(console.warn);
          } else {
            navigateFinishedPromise.resolve();
            if (plugin.minibrowser.toUse) plugin.minibrowser.activate();
            if (plugin.autoExpandInfoDesc.toUse) plugin.autoExpandInfoDesc.activate();
            if (plugin.fullChannelNameOnHover.toUse) plugin.fullChannelNameOnHover.activate();
          }
          const chat = elements.chat;
          if (chat instanceof Element) {
            chat.setAttribute111('tyt-active-chat-frame', 'CF'); // chat and flexy ready
          }
          const infoExpander = elements.infoExpander;
          if (infoExpander && infoExpander.closest('#right-tabs')) {
            Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn);
          }
          Promise.resolve(lockSet['layoutFixLock']).then(layoutFix);
          if (plugin.fullChannelNameOnHover.activated) plugin.fullChannelNameOnHover.onNavigateFinish();
        }
      },

      'onceInsertRightTabs': () => {


        // if(lockId !== lockGet['yt-navigate-finish-videos']) return;
        const related = elements.related;
        let rightTabs = document.querySelector('#right-tabs');
        if (!document.querySelector('#right-tabs') && related) {
          getLangForPage();
          let docTmp = document.createElement('template');
          docTmp.innerHTML = createHTML(getTabsHTML());
          let newElm = docTmp.content.firstElementChild;
          if (newElm !== null) {
            inPageRearrange = true;
            related.parentNode.insertBefore000(newElm, related);
            inPageRearrange = false;
          }
          rightTabs = newElm;
          rightTabs.querySelector('[tyt-tab-content="#tab-comments"]').classList.add('tab-btn-hidden');

          const secondaryWrapper = document.createElement('secondary-wrapper');
          const secondaryInner = document.querySelector('#secondary-inner.style-scope.ytd-watch-flexy');

          inPageRearrange = true;
          secondaryWrapper.replaceChildren000(...secondaryInner.childNodes);
          secondaryInner.insertBefore000(secondaryWrapper, secondaryInner.firstChild);
          inPageRearrange = false;

          rightTabs.querySelector('#material-tabs').addEventListener('click', eventMap['tabs-btn-click'], true)

          inPageRearrange = true;
          if (!rightTabs.closest('secondary-wrapper')) secondaryWrapper.appendChild000(rightTabs);
          inPageRearrange = false;

        }
        if (rightTabs) {
          isRightTabsInserted = true;
          const ioTabBtns = new IntersectionObserver((entries) => {
            for (const entry of entries) {
              const rect = entry.boundingClientRect;
              entry.target.classList.toggle('tab-btn-visible', rect.width && rect.height)
            }
          }, { rootMargin: '0px' });
          for (const btn of document.querySelectorAll('.tab-btn[tyt-tab-content]')) {
            ioTabBtns.observe(btn);
          }
          if (!related.closest('#right-tabs')) {
            document.querySelector('#tab-videos').assignChildern111(null, related, null);
          }
          const infoExpander = elements.infoExpander;
          if (infoExpander && !infoExpander.closest('#right-tabs')) {
            document.querySelector('#tab-info').assignChildern111(null, infoExpander, null);
          }
          const commentsArea = elements.comments;
          if (commentsArea && !commentsArea.closest('#right-tabs')) {
            document.querySelector('#tab-comments').assignChildern111(null, commentsArea, null);
          }
          rightTabsProvidedPromise.resolve();
          roRightTabs.disconnect();
          roRightTabs.observe(rightTabs);
          const ytdFlexyElm = elements.flexy;
          const aoFlexy = new MutationObserver(eventMap['aoFlexyFn']);
          aoFlexy.observe(ytdFlexyElm, { attributes: true });
          // Promise.resolve(lockSet['tabsStatusCorrectionLock']).then(eventMap['tabsStatusCorrection']).catch(console.warn);

          Promise.resolve(lockSet['fixInitialTabStateLock']).then(eventMap['fixInitialTabStateFn']).catch(console.warn);

          ytdFlexyElm.incAttribute111('attr-7qlsy'); // tabsStatusCorrectionLock and video-id



        }

      },

      'aoFlexyFn': () => {

        Promise.resolve(lockSet['checkCommentsShouldBeHiddenLock']).then(eventMap['checkCommentsShouldBeHidden']).catch(console.warn);

        Promise.resolve(lockSet['refreshSecondaryInnerLock']).then(eventMap['refreshSecondaryInner']).catch(console.warn);

        Promise.resolve(lockSet['tabsStatusCorrectionLock']).then(eventMap['tabsStatusCorrection']).catch(console.warn);

        const videoId = getCurrentVideoId();
        if (videoId !== tmpLastVideoId) {
          tmpLastVideoId = videoId;
          Promise.resolve(lockSet['updateOnVideoIdChangedLock']).then(eventMap['updateOnVideoIdChanged']).catch(console.warn);
        }

      },

      'twoColumnChanged10': (lockId) => {

        if (lockId !== lockGet['twoColumnChanged10Lock']) return;
        for (const continuation of document.querySelectorAll('#tab-videos ytd-watch-next-secondary-results-renderer ytd-continuation-item-renderer')) {
          if (continuation.closest('[hidden]')) continue;
          const cnt = insp(continuation);
          if (typeof cnt.showButton === 'boolean') {
            if (cnt.showButton === false) continue;
            cnt.showButton = false;
            const behavior = (cnt.ytRendererBehavior || cnt);
            if (typeof behavior.invalidate === 'function') {
              behavior.invalidate(!1);
            }
          }
        }

      },

      'tabsStatusCorrection': (lockId) => {
        if (lockId !== lockGet['tabsStatusCorrectionLock']) return;
        const ytdFlexyElm = elements.flexy;
        if (!ytdFlexyElm) return;
        const p = tabAStatus;
        const q = calculationFn(p, 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128);

        let resetForPanelDisappeared = false;
        if (p !== q) {
          console.log(388, p, q)
          let actioned = false;
          if ((p & 128) === 0 && (q & 128) === 128) {
            lastPanel = 'playlist'
          } else if ((p & 8) === 0 && (q & 8) === 8) {
            lastPanel = 'chat'
          } else if ((((p & 4) == 4 && (q & (4 | 8)) == (0 | 0)) || ((p & 8) == 8 && (q & (4 | 8)) === (0 | 0))) && lastPanel === 'chat') {
            // 24 -> 16 = -8; 'd'
            lastPanel = (lastTab || '');
            resetForPanelDisappeared = true;
          } else if ((p & (4 | 8)) === 8 && (q & (4 | 8)) === 4 && lastPanel === 'chat') {
            // click close
            lastPanel = (lastTab || '');
            resetForPanelDisappeared = true;
          } else if ((p & 128) === 128 && (q & 128) === 0 && lastPanel === 'playlist') {

            lastPanel = (lastTab || '');
            resetForPanelDisappeared = true;
          }
          tabAStatus = q;

          let bFixForResizedTab = false;

          if ((q ^ 2) === 2 && bFixForResizedTabLater) {
            bFixForResizedTab = true;
          }

          if ((p & 16) === 16 & (q & 16) === 0) {
            Promise.resolve(lockSet['twoColumnChanged10Lock']).then(eventMap['twoColumnChanged10']).catch(console.warn);
          }

          if ((((p & 2) === 2) ^ ((q & 2) === 2)) && ((q & 2) === 2)) {
            bFixForResizedTab = true;
          }

          // p->q +2
          if ((p & 2) === 0 && (q & 2) === 2 && (p & 128) === 128 && (q & 128) === 128) {
            lastPanel = (lastTab || '');
            ytBtnClosePlaylist();
            actioned = true;
          }

          // p->q +8
          if ((p & (8 | 128)) === (0 | 128) && (q & (8 | 128)) === (8 | 128) && lastPanel === 'chat') {
            lastPanel = (lastTab || '');
            ytBtnClosePlaylist();
            actioned = true;
          }

          // p->q +128
          if ((p & (2 | 128)) === (2 | 0) && (q & (2 | 128)) === (2 | 128) && lastPanel === 'playlist') {
            switchToTab(null);
            actioned = true;
          }

          // p->q +128
          if ((p & (8 | 128)) === (8 | 0) && (q & (8 | 128)) === (8 | 128) && lastPanel === 'playlist') {
            lastPanel = (lastTab || '');
            ytBtnCollapseChat();
            actioned = true;
          }


          // p->q +128
          if ((p & (1 | 16 | 128)) == (1 | 16) && (q & (1 | 16 | 128)) == (1 | 16 | 128)) {
            ytBtnCancelTheater();
            actioned = true;
          }

          // p->q +1
          if ((p & (1 | 16 | 128)) == (16 | 128) && (q & (1 | 16 | 128)) == (1 | 16 | 128)) {
            lastPanel = (lastTab || '');
            ytBtnClosePlaylist();
            actioned = true;
          }

          if ((q & 64) === 64) {
            actioned = false;
          } else if ((p & 64) == 64 && (q & 64) === 0) {
            // p->q -64

            if ((q & 32) === 32) {
              ytBtnCloseEngagementPanels();
            }

            if ((q & (2 | 8)) === (2 | 8)) {
              if (lastPanel === 'chat') {

                switchToTab(null);
                actioned = true;
              } else if (lastPanel) {
                ytBtnCollapseChat();
                actioned = true;
              }
            }

          } else if ((p & (1 | 2 | 8 | 16 | 32)) === (1 | 0 | 0 | 16 | 0) && (q & (1 | 2 | 8 | 16 | 32)) === (1 | 0 | 8 | 16 | 0)) {
            // p->q +8
            ytBtnCancelTheater();
            actioned = true;
          } else if ((p & (1 | 16 | 32)) === (0 | 16 | 0) && (q & (1 | 16 | 32)) === (0 | 16 | 32) && (q & (2 | 8)) > 0) {
            // p->q +32
            if (q & 2) {
              switchToTab(null);
              actioned = true;
            }
            if (q & 8) {
              ytBtnCollapseChat();
              actioned = true;
            }
          } else if ((p & (1 | 16 | 8 | 2)) === (16 | 8) && (q & (1 | 16 | 8 | 2)) === (16) && (q & 128) === 0) {
            // p->q -8
            if (lastTab) {
              switchToTab(lastTab)
              actioned = true;
            }

          } else if ((p & 1) === 0 && (q & 1) === 1) {
            // p->q +1
            if ((q & 32) === 32) {
              ytBtnCloseEngagementPanels();
            }
            if ((p & 9) === 8 && (q & 9) === 9) {
              ytBtnCollapseChat();
            }
            switchToTab(null)
            actioned = true;

          } else if ((p & 3) === 1 && (q & 3) === 3) {
            // p->q +2
            ytBtnCancelTheater();
            actioned = true;
          } else if ((p & 10) === 2 && (q & 10) === 10) {
            // p->q +8
            switchToTab(null)
            actioned = true;

          } else if ((p & (8 | 32)) === (0 | 32) && (q & (8 | 32)) === (8 | 32)) {
            // p->q +8
            ytBtnCloseEngagementPanels();
            actioned = true;


          } else if ((p & (2 | 32)) === (0 | 32) && (q & (2 | 32)) === (2 | 32)) {
            // p->q +2
            ytBtnCloseEngagementPanels();
            actioned = true;

          } else if ((p & (2 | 8)) === (0 | 8) && (q & (2 | 8)) === (2 | 8)) {
            // p->q +2
            ytBtnCollapseChat();
            actioned = true;
            // if( lastPanel && (p & (1|16) === 16)  && (q & (1 | 16 | 8 | 2)) === (16) ){
            //   switchToTab(lastTab)
            //   actioned = true;
            // }
          } else if ((p & 1) === 1 && (q & (1 | 32)) === (0 | 0)) {
            // p->q -1
            if (lastPanel === 'chat') {
              ytBtnExpandChat()
              actioned = true;
            } else if (lastPanel === lastTab && lastTab) {
              switchToTab(lastTab)
              actioned = true;
            }
          }


          // 24 20
          // 8 16   4 16

          if (!actioned && (q & 128) === 128) {
            lastPanel = 'playlist'
            if ((q & 2) === 2) {
              switchToTab(null)
              actioned = true;
            }
          }

          if ((p & 2) === 2 && (q & (2 | 128)) === (0 | 128)) {
            // p->q -2

          } else if ((p & 8) === 8 && (q & (8 | 128)) === (0 | 128)) {
            // p->q -8

          } else if (!actioned && (p & (1 | 16)) === 16 && (q & (1 | 16 | 8 | 2 | 32 | 64)) === (16 | 0 | 0)) {
            console.log(388, 'd')
            if (lastPanel === 'chat') {
              console.log(388, 'd1c')
              ytBtnExpandChat()
              actioned = true;

            } else if (lastPanel === 'playlist') {
              console.log(388, 'd1p')
              ytBtnOpenPlaylist()
              actioned = true;

            } else if (lastTab) {
              console.log(388, 'd2t')
              switchToTab(lastTab)
              actioned = true;
            } else if (resetForPanelDisappeared) {
              // if lastTab is undefined
              console.log(388, 'd2d')
              Promise.resolve(lockSet['fixInitialTabStateLock']).then(eventMap['fixInitialTabStateFn']).catch(console.warn);
              actioned = true;
            }
          }


          if (bFixForResizedTab) {
            bFixForResizedTabLater = false;
            Promise.resolve(0).then(eventMap['fixForTabDisplay']).catch(console.warn);
          }

          if (((p & 16) === 16) ^ ((q & 16) === 16)) {
            Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn);
            Promise.resolve(lockSet['removeKeepCommentsScrollerLock']).then(removeKeepCommentsScroller).catch(console.warn);
            Promise.resolve(lockSet['layoutFixLock']).then(layoutFix).catch(console.warn);
          }
        }

      },

      'updateOnVideoIdChanged': (lockId) => {
        if (lockId !== lockGet['updateOnVideoIdChangedLock']) return;
        const videoId = tmpLastVideoId;
        if (!videoId) return;

        const bodyRenderer = elements.infoExpanderRendererBack;
        const bodyRendererNew = elements.infoExpanderRendererFront;

        if (bodyRendererNew && bodyRenderer) {

          insp(bodyRendererNew).data = insp(bodyRenderer).data;
          // if ((bodyRendererNew.hasAttribute('hidden') ? 1 : 0) ^ (bodyRenderer.hasAttribute('hidden') ? 1 : 0)) {
          //   if (bodyRenderer.hasAttribute('hidden')) bodyRendererNew.setAttribute('hidden', '');
          //   else bodyRendererNew.removeAttribute('hidden');
          // }

        }


        Promise.resolve(lockSet['infoFixLock']).then(infoFix).catch(console.warn);
      },

      'fixInitialTabStateFn': async (lockId) => {
        // console.log('fixInitialTabStateFn 0a');
        if (lockGet['fixInitialTabStateLock'] !== lockId) return;
        // console.log('fixInitialTabStateFn 0b');
        const delayTime = fixInitialTabStateK > 0 ? 200 : 1;
        await delayPn(delayTime);
        if (lockGet['fixInitialTabStateLock'] !== lockId) return;
        // console.log('fixInitialTabStateFn 0c');
        const kTab = document.querySelector('[tyt-tab]');
        const qTab = (!kTab || kTab.getAttribute('tyt-tab') === '') ? checkElementExist('ytd-watch-flexy[is-two-columns_]', '[hidden]') : null;
        if (checkElementExist('ytd-playlist-panel-renderer#playlist', '[hidden], [collapsed]')) {
          console.log('fixInitialTabStateFn 1p');
          switchToTab(null);
        } else if (checkElementExist('ytd-live-chat-frame#chat', '[hidden], [collapsed]')) {
          console.log('fixInitialTabStateFn 1a');
          switchToTab(null);
          if (checkElementExist('ytd-watch-flexy[theater]', '[hidden]')) {
            ytBtnCollapseChat();
          }
        } else if (qTab) {
          const hasTheater = qTab.hasAttribute('theater');
          if (!hasTheater) {
            console.log('fixInitialTabStateFn 1b');
            const btn0 = document.querySelector('.tab-btn-visible') // or default button
            if (btn0) {
              switchToTab(btn0);
            } else {
              switchToTab(null);
            }
          } else {
            console.log('fixInitialTabStateFn 1c');
            switchToTab(null);
          }
        } else {
          console.log('fixInitialTabStateFn 1z');
        }
        // console.log('fixInitialTabStateFn 0d');
        fixInitialTabStateK++;
      },

      'tabs-btn-click': (evt) => {

        const target = evt.target;
        if (target instanceof HTMLElement_ && target.classList.contains('tab-btn') && target.hasAttribute000('tyt-tab-content')) {

          evt.preventDefault();
          evt.stopPropagation();
          evt.stopImmediatePropagation();


          const activeLink = target;

          switchToTab(activeLink);

        }

      }

    }

    Promise.all([videosElementProvidedPromise, navigateFinishedPromise]).then(eventMap['onceInsertRightTabs']).catch(console.warn);
    Promise.all([navigateFinishedPromise, infoExpanderElementProvidedPromise]).then(eventMap['onceInfoExpanderElementProvidedPromised']).catch(console.warn);

    const isCustomElementsProvided = typeof customElements !== "undefined" && typeof (customElements || 0).whenDefined === "function";

    const promiseForCustomYtElementsReady = isCustomElementsProvided ? Promise.resolve(0) : new Promise((callback) => {
      const EVENT_KEY_ON_REGISTRY_READY = "ytI-ce-registry-created";
      if (typeof customElements === 'undefined') {
        if (!('__CE_registry' in document)) {
          // https://github.com/webcomponents/polyfills/
          Object.defineProperty(document, '__CE_registry', {
            get() {
              // return undefined
            },
            set(nv) {
              if (typeof nv == 'object') {
                delete this.__CE_registry;
                this.__CE_registry = nv;
                this.dispatchEvent(new CustomEvent(EVENT_KEY_ON_REGISTRY_READY));
              }
              return true;
            },
            enumerable: false,
            configurable: true
          })
        }
        let eventHandler = (evt) => {
          document.removeEventListener(EVENT_KEY_ON_REGISTRY_READY, eventHandler, false);
          const f = callback;
          callback = null;
          eventHandler = null;
          f();
        };
        document.addEventListener(EVENT_KEY_ON_REGISTRY_READY, eventHandler, false);
      } else {
        callback();
      }
    });

    const _retrieveCE = async (nodeName) => {
      try {
        isCustomElementsProvided || (await promiseForCustomYtElementsReady);
        await customElements.whenDefined(nodeName);
      } catch (e) {
        console.warn(e);
      }
    }


    const retrieveCE = async (nodeName) => {
      try {
        isCustomElementsProvided || (await promiseForCustomYtElementsReady);
        await customElements.whenDefined(nodeName);
        const dummy = document.querySelector(nodeName) || document.createElement(nodeName);
        const cProto = insp(dummy).constructor.prototype;
        return cProto;
      } catch (e) {
        console.warn(e);
      }
    }


    const moOverallRes = {
      _yt_playerProvided: () => (((window || 0)._yt_player || 0) || 0)
    }

    let promiseWaitNext = null;
    const moOverall = new MutationObserver(() => {
      if (promiseWaitNext) {
        promiseWaitNext.resolve();
        promiseWaitNext = null;
      }

      if (typeof moOverallRes._yt_playerProvided === 'function') {
        const r = moOverallRes._yt_playerProvided();
        if (r) {
          moOverallRes._yt_playerProvided = r;
          eventMap._yt_playerProvided();
        }
      }
    });

    moOverall.observe(document, { subtree: true, childList: true });


    const moEgmPanelReady = new MutationObserver(mutations => {
      for (const mutation of mutations) {
        const target = mutation.target;
        if (!target.hasAttribute000('tyt-egm-panel-jclmd')) continue;
        if (target.hasAttribute000('target-id') && target.hasAttribute000('visibility')) {
          target.removeAttribute000('tyt-egm-panel-jclmd');
          moEgmPanelReadyClearFn();
          Promise.resolve(target).then(eventMap['ytd-engagement-panel-section-list-renderer::bindTarget']).catch(console.warn);
        }
      }
    });

    const moEgmPanelReadyClearFn = () => {

      if (document.querySelector('[tyt-egm-panel-jclmd]') === null) {
        moEgmPanelReady.takeRecords();
        moEgmPanelReady.disconnect();
      }

    };

    document.addEventListener('yt-navigate-finish', eventMap['yt-navigate-finish'], false);

    document.addEventListener('animationstart', evt => {
      const f = eventMap[evt.animationName];
      if (typeof f === 'function') f(evt.target);
    }, capturePassive);

    // console.log('hi122')


    mLoaded.flag |= 1;
    document.documentElement.setAttribute111('tabview-loaded', mLoaded.makeString());

    promiseForCustomYtElementsReady.then(eventMap['ceHack']).catch(console.warn);


    executionFinished = 1;



  } catch (e) {
    console.log('error 0xF491');
    console.error(e);
  }

};
const styles = {
  'main': `
  @keyframes relatedElementProvided {
    0% {
      background-position-x: 3px;
    }
    100% {
      background-position-x: 4px;
    }
  }
  
  html[tabview-loaded="icp"] #related.ytd-watch-flexy {
    animation: relatedElementProvided 1ms linear 0s 1 normal forwards;
  }
  
  html[tabview-loaded="icp"] #right-tabs #related.ytd-watch-flexy,
  html[tabview-loaded="icp"] [hidden] #related.ytd-watch-flexy {
    animation: initial;
  }
  
  html[tabview-loaded="icp"] #right-tabs ytd-expander#expander,
  html[tabview-loaded="icp"] [hidden] ytd-expander#expander,
  html[tabview-loaded="icp"] ytd-comments ytd-expander#expander {
    animation: initial;
  }
  
  #secondary.ytd-watch-flexy {
    position: relative;
  }
  
  #secondary-inner.style-scope.ytd-watch-flexy {
    height: 100%;
  }
  
  secondary-wrapper {
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    box-sizing: border-box;
    padding: 0;
    margin: 0;
    border: 0;
    height: 100%;
    max-height: calc(100vh - var(--ytd-toolbar-height, 56px));
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    contain: strict;
    padding-top: var(--ytd-margin-6x);
    padding-right: var(--ytd-margin-6x);
    padding-bottom: var(--ytd-margin-6x);
  }
  
  #right-tabs {
    position: relative;
    display: flex;
    padding: 0;
    margin: 0;    
    flex-grow: 1;
    flex-direction: column;
  }
  
  [tyt-tab=""] #right-tabs {
    flex-grow: 0;
  }
  
  [tyt-tab=""] #right-tabs .tab-content {
    border: 0;
  }
  
  #right-tabs .tab-content {
    flex-grow: 1;
  }
  
  ytd-watch-flexy[hide-default-text-inline-expander] #primary.style-scope.ytd-watch-flexy ytd-text-inline-expander {
    display: none;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden {
    --comment-pre-load-sizing: 90px;
    visibility: collapse;
    z-index: -1;
    position: fixed !important;
    left: 2px;
    top: 2px;
    width: var(--comment-pre-load-sizing) !important;
    height: var(--comment-pre-load-sizing) !important;
    display: block !important;
    pointer-events: none !important;
    overflow: hidden;
    contain: strict;
    border: 0;
    margin: 0;
    padding: 0;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments > ytd-item-section-renderer#sections {
    display: block !important;
    overflow: hidden;
    height: var(--comment-pre-load-sizing);
    width: var(--comment-pre-load-sizing);
    contain: strict;
    border: 0;
    margin: 0;
    padding: 0;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments > ytd-item-section-renderer#sections > #contents {
    display: flex !important;
    flex-direction: row;
    gap: 60px;
    overflow: hidden;
    height: var(--comment-pre-load-sizing);
    width: var(--comment-pre-load-sizing);
    contain: strict;
    border: 0;
    margin: 0;
    padding: 0;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments #contents {
    --comment-pre-load-display: none;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments #contents > *:only-of-type,
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments #contents > *:last-child {
    --comment-pre-load-display: block;
  }
  
  ytd-watch-flexy:not([keep-comments-scroller]) #tab-comments.tab-content-hidden ytd-comments#comments #contents > * {
    display: var(--comment-pre-load-display) !important;
  }
  
  #right-tabs #material-tabs {
    position: relative;
    display: flex;
    padding: 0;
    border: 1px solid var(--ytd-searchbox-legacy-border-color);
    overflow: hidden;
  }
  
  [tyt-tab] #right-tabs #material-tabs {
    border-radius: var(--tyt-rounded-a1) var(--tyt-rounded-a1) var(--tyt-rounded-a1) var(--tyt-rounded-a1);
  }
  
  [tyt-tab^="#"] #right-tabs #material-tabs {
    border-radius: var(--tyt-rounded-a1) var(--tyt-rounded-a1) 0 0;
  }
  
  ytd-watch-flexy[flexy]:not([is-two-columns_]) #right-tabs #material-tabs {
    outline: 0;
  }
  
  #right-tabs #material-tabs a.tab-btn[tyt-tab-content] > * {
    pointer-events: none;
  }
  
  #right-tabs #material-tabs a.tab-btn[tyt-tab-content] > .font-size-right {
    pointer-events: initial;
    display: none;
  }
  
  ytd-watch-flexy #right-tabs .tab-content {
    padding: 0;
    box-sizing: border-box;
    display: block;
    border: 1px solid var(--ytd-searchbox-legacy-border-color);
    border-top: 0;
    position: relative;
    top: 0;
    display: flex;
    flex-direction: row;
    overflow: hidden;
    border-radius: 0 0 var(--tyt-rounded-a1) var(--tyt-rounded-a1);
  }
  
  ytd-watch-flexy:not([is-two-columns_]) #right-tabs .tab-content {
    height: 100%;
  }
  
  ytd-watch-flexy #right-tabs .tab-content-cld {
    box-sizing: border-box;
    position: relative;
    display: block;
    width: 100%;
    overflow: auto;
    --tab-content-padding: var(--ytd-margin-4x);
    padding: var(--tab-content-padding);
    contain: layout paint;
  }
  
  .tab-content-cld,
  #right-tabs,
  .tab-content {
    transition: none;
    animation: none;
  }
  
  ytd-watch-flexy[is-two-columns_] #right-tabs .tab-content-cld {
    height: 100%;
    width: 100%;
    contain: size layout paint style;
    position: absolute;
  }
  
  ytd-watch-flexy #right-tabs .tab-content-cld.tab-content-hidden {
    display: none;
    width: 100%;
    contain: size layout paint style;
  }
  
  @supports (color: var(--tabview-tab-btn-define)) {
    ytd-watch-flexy #right-tabs .tab-btn {
      background: var(--yt-spec-general-background-a);
    }
    
    html {
      --tyt-tab-btn-flex-grow: 1;
      --tyt-tab-btn-flex-basis: 0%;
      --tyt-tab-bar-color-1-def: #ff4533;
      --tyt-tab-bar-color-2-def: var(--yt-brand-light-red);
      --tyt-tab-bar-color-1: var(--main-color, var(--tyt-tab-bar-color-1-def));
      --tyt-tab-bar-color-2: var(--main-color, var(--tyt-tab-bar-color-2-def));
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content] {
      flex-grow: 1;
      flex-shrink: 1;
      flex-basis: 0%;
      flex-grow: var(--tyt-tab-btn-flex-grow);
      flex-basis: var(--tyt-tab-btn-flex-basis);
      position: relative;
      display: inline-block;
      text-decoration: none;
      text-transform: uppercase;
      --tyt-tab-btn-color: var(--yt-spec-text-secondary);
      color: var(--tyt-tab-btn-color);
      text-align: center;
      padding: 14px 8px 10px;
      border: 0;
      border-bottom: 4px solid transparent;
      font-weight: 500;
      font-size: 12px;
      line-height: 18px;
      cursor: pointer;
      transition: border 200ms linear 100ms;
      background-color: var(--ytd-searchbox-legacy-button-color);
      text-transform: var(--yt-button-text-transform, inherit);
      user-select: none !important;
      overflow: hidden;
      white-space: nowrap;
      text-overflow: clip;
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content] > svg {
      height: 18px;
      padding-right: 0px;
      vertical-align: bottom;
      opacity: .5;
      margin-right: 0px;
      color: var(--yt-button-color, inherit);
      fill: var(--iron-icon-fill-color, currentcolor);
      stroke: var(--iron-icon-stroke-color, none);
    }
    
    ytd-watch-flexy #right-tabs .tab-btn {
      --tabview-btn-txt-ml: 8px;
    }
    
    ytd-watch-flexy[tyt-comment-disabled] #right-tabs .tab-btn[tyt-tab-content="#tab-comments"] {
      --tabview-btn-txt-ml: 0px;
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content] > svg + span {
      margin-left: var(--tabview-btn-txt-ml);
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content] svg {
      pointer-events: none;
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content].active {
      font-weight: 500;
      outline: 0;
      --tyt-tab-btn-color: var(--yt-spec-text-primary);
      background-color: var(--ytd-searchbox-legacy-button-focus-color);
      border-bottom: 1px var(--tyt-tab-bar-color-1) solid;
      border-bottom-color: var(--tyt-tab-bar-color-2);
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content].active svg {
      opacity: .9
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content]:not(.active):hover {
      background-color: var(--ytd-searchbox-legacy-button-hover-color);
      --tyt-tab-btn-color: var(--yt-spec-text-primary);
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content]:not(.active):hover svg {
      opacity: .9
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content] {
      user-select: none !important;
    }
    
    ytd-watch-flexy #right-tabs .tab-btn[tyt-tab-content].tab-btn-hidden {
      display: none;
    }
    
    ytd-watch-flexy[tyt-comment-disabled] #right-tabs .tab-btn[tyt-tab-content="#tab-comments"],
    ytd-watch-flexy[tyt-comment-disabled] #right-tabs .tab-btn[tyt-tab-content="#tab-comments"]:hover {
      --tyt-tab-btn-color: var(--yt-spec-icon-disabled);
    }
    
    ytd-watch-flexy[tyt-comment-disabled] #right-tabs .tab-btn[tyt-tab-content="#tab-comments"] span#tyt-cm-count:empty {
      display: none;
    }
    
    ytd-watch-flexy #right-tabs .tab-btn span#tyt-cm-count:empty::after {
      display: inline-block;
      width: 4em;
      text-align: left;
      font-size: inherit;
      color: currentColor;
      transform: scaleX(0.8);
    }
  }
  
  @supports (color: var(--tyt-cm-count-define)) {
    ytd-watch-flexy {
      --tyt-x-loading-content-letter-spacing: 2px;
    }
    
    html {
      --tabview-text-loading: "Loading";
      --tabview-text-fetching: "Fetching";
      --tabview-panel-loading: var(--tabview-text-loading);
    }
    
    html:lang(ja) {
      --tabview-text-loading: "読み込み中";
      --tabview-text-fetching: "フェッチ..";
    }
    
    html:lang(ko) {
      --tabview-text-loading: "로딩..";
      --tabview-text-fetching: "가져오기..";
    }
    
    html:lang(zh-Hant) {
      --tabview-text-loading: "載入中";
      --tabview-text-fetching: "擷取中";
    }
    
    html:lang(zh-Hans) {
      --tabview-text-loading: "加载中";
      --tabview-text-fetching: "抓取中";
    }
    
    html:lang(ru) {
      --tabview-text-loading: "Загрузка";
      --tabview-text-fetching: "Получение";
    }
    
    ytd-watch-flexy #right-tabs .tab-btn span#tyt-cm-count:empty::after {
      content: var(--tabview-text-loading);
      letter-spacing: var(--tyt-x-loading-content-letter-spacing);
    }
  }
  
  @supports (color: var(--tabview-font-size-btn-define)) {
    .font-size-right {
      display: inline-flex;
      flex-direction: column;
      position: absolute;
      right: 0;
      top: 0;
      bottom: 0;
      width: 16px;
      padding: 4px 0;
      justify-content: space-evenly;
      align-content: space-evenly;
      pointer-events: none;
    }
    
    html body ytd-watch-flexy.style-scope .font-size-btn {
      user-select: none !important;
    }
    
    .font-size-btn {
      --tyt-font-size-btn-display: none;
      display: var(--tyt-font-size-btn-display, none);
      width: 12px;
      height: 12px;
      color: var(--yt-spec-text-secondary);
      background-color: var(--yt-spec-badge-chip-background);
      box-sizing: border-box;
      cursor: pointer;
      transform-origin: left top;
      margin: 0;
      padding: 0;
      position: relative;
      font-family: 'Menlo', 'Lucida Console', 'Monaco', 'Consolas', monospace;
      line-height: 100%;
      font-weight: 900;
      transition: background-color 90ms linear, color 90ms linear;
      pointer-events: all;
    }
    
    .font-size-btn:hover {
      background-color: var(--yt-spec-text-primary);
      color: var(--yt-spec-general-background-a);
    }
    
    @supports (zoom: 0.5) {
      .tab-btn .font-size-btn {
        --tyt-font-size-btn-display: none;
      }
      
      .tab-btn.active:hover .font-size-btn {
        --tyt-font-size-btn-display: inline-block;
      }
    }
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) #columns.ytd-watch-flexy {
    flex-direction: column;
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) #secondary.ytd-watch-flexy {
    display: block;
    width: 100%;
    box-sizing: border-box;
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) #secondary.ytd-watch-flexy secondary-wrapper {
    padding-left: var(--ytd-margin-6x);
    contain: content;
    height: initial;
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) #secondary.ytd-watch-flexy secondary-wrapper #right-tabs {
    overflow: auto;
  }
  
  [tyt-chat="+"] secondary-wrapper > [tyt-chat-container] {
    flex-grow: 1;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
  }
  
  [tyt-chat="+"] secondary-wrapper > [tyt-chat-container] > #chat {
    flex-grow: 1;
  }
  
  ytd-watch-flexy[is-two-columns_]:not([theater]) #columns.style-scope.ytd-watch-flexy {
    min-height: calc(100vh - var(--ytd-toolbar-height, 56px));
  }
  
  ytd-watch-flexy[is-two-columns_] ytd-live-chat-frame#chat {
    min-height: initial !important;
    height: initial !important;
  }
  
  ytd-watch-flexy[tyt-tab^="#"]:not([is-two-columns_]):not([tyt-chat="+"]) #right-tabs {
    min-height: var(--ytd-watch-flexy-chat-max-height)
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) #chat.ytd-watch-flexy {
    margin-top: 0;
  }
  
  body ytd-watch-flexy:not([is-two-columns_]) ytd-watch-metadata.ytd-watch-flexy {
    margin-bottom: 0;
  }
  
  ytd-watch-metadata.ytd-watch-flexy ytd-metadata-row-container-renderer {
    display: none;
  }
  
  #tab-info [show-expand-button] #expand-sizer.ytd-text-inline-expander {
    visibility: initial;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > #left-arrow-container.ytd-video-description-infocards-section-renderer > #left-arrow {
    border: 6px solid transparent;
    opacity: 0.65;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > #right-arrow-container.ytd-video-description-infocards-section-renderer > #right-arrow {
    border: 6px solid transparent;
    opacity: 0.65;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > #left-arrow-container.ytd-video-description-infocards-section-renderer > #left-arrow:hover {
    opacity: 1;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > #right-arrow-container.ytd-video-description-infocards-section-renderer > #right-arrow:hover {
    opacity: 1;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > div#left-arrow-container::before {
    content: '';
    background: transparent;
    width: 40px;
    display: block;
    height: 40px;
    position: absolute;
    left: -20px;
    top: 0;
    z-index: -1;
  }
  
  #tab-info #social-links.style-scope.ytd-video-description-infocards-section-renderer > div#right-arrow-container::before {
    content: '';
    background: transparent;
    width: 40px;
    display: block;
    height: 40px;
    position: absolute;
    right: -20px;
    top: 0;
    z-index: -1;
  }
  
  body ytd-watch-flexy[is-two-columns_][tyt-egm-panel_] #columns.style-scope.ytd-watch-flexy #panels.style-scope.ytd-watch-flexy {
    flex-grow: 1;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
  }
  
  body ytd-watch-flexy[is-two-columns_][tyt-egm-panel_] #columns.style-scope.ytd-watch-flexy #panels.style-scope.ytd-watch-flexy ytd-engagement-panel-section-list-renderer[target-id][visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED"] {
    height: initial;
    max-height: initial;
    min-height: initial;
    flex-grow: 1;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
  }
  
  secondary-wrapper [visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED"] ytd-transcript-renderer:not(:empty),
  secondary-wrapper [visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED"] #body.ytd-transcript-renderer:not(:empty),
  secondary-wrapper [visibility="ENGAGEMENT_PANEL_VISIBILITY_EXPANDED"] #content.ytd-transcript-renderer:not(:empty) {
    flex-grow: 1;
    height: initial;
    max-height: initial;
    min-height: initial;
  }
  
  secondary-wrapper #content.ytd-engagement-panel-section-list-renderer {
    position: relative;
  }
  
  secondary-wrapper #content.ytd-engagement-panel-section-list-renderer > [panel-target-id]:only-child {
    contain: style size;
  }
  
  secondary-wrapper #content.ytd-engagement-panel-section-list-renderer ytd-transcript-segment-list-renderer.ytd-transcript-search-panel-renderer {
    flex-grow: 1;
    contain: strict;
  }
  
  secondary-wrapper #content.ytd-engagement-panel-section-list-renderer ytd-transcript-segment-renderer.style-scope.ytd-transcript-segment-list-renderer {
    contain: layout paint style;
  }
  
  secondary-wrapper #content.ytd-engagement-panel-section-list-renderer ytd-transcript-segment-renderer.style-scope.ytd-transcript-segment-list-renderer > .segment {
    contain: layout paint style;
  }
  
  body ytd-watch-flexy[theater] #secondary.ytd-watch-flexy {
    margin-top: var(--ytd-margin-3x);
    padding-top: 0;
  }
  
  body ytd-watch-flexy[theater] secondary-wrapper {
    margin-top: 0;
    padding-top: 0;
  }
  
  body ytd-watch-flexy[theater] #chat.ytd-watch-flexy {
    margin-bottom: var(--ytd-margin-2x);
  }
  
  #tab-comments ytd-comments#comments [field-of-cm-count] {
    margin-top: 0;
  }
  
  #tab-info > ytd-expandable-video-description-body-renderer {
    margin-bottom: var(--ytd-margin-3x);
  }
  
  #tab-info [class]:last-child {
    margin-bottom: 0;
    padding-bottom: 0;
  }
  
  #tab-info ytd-rich-metadata-row-renderer ytd-rich-metadata-renderer {
    max-width: initial;
  }
  
  ytd-watch-flexy[is-two-columns_] secondary-wrapper #chat.ytd-watch-flexy {
    margin-bottom: var(--ytd-margin-3x);
  }
  
  ytd-watch-flexy[tyt-tab] tp-yt-paper-tooltip {
    white-space: nowrap;
    contain: content;
  }
  
  ytd-watch-info-text tp-yt-paper-tooltip.style-scope.ytd-watch-info-text {
    margin-bottom: -300px;
    margin-top: -96px;
  }
  
  [hide-default-text-inline-expander] #bottom-row #description.ytd-watch-metadata {
    font-size: 1.2rem;
    line-height: 1.8rem;
  }
  
  [hide-default-text-inline-expander] #bottom-row #description.ytd-watch-metadata yt-animated-rolling-number {
    font-size: inherit;
  }
  
  [hide-default-text-inline-expander] #bottom-row #description.ytd-watch-metadata #info-container.style-scope.ytd-watch-info-text {
    align-items: center;
  }
  
  ytd-watch-flexy[hide-default-text-inline-expander] {
    --tyt-bottom-watch-metadata-margin: 6px;
  }
  
  [hide-default-text-inline-expander] #bottom-row #description.ytd-watch-metadata > #description-inner.ytd-watch-metadata {
    margin: 6px 12px; 
  }
  
  [hide-default-text-inline-expander] ytd-watch-metadata[title-headline-xs] h1.ytd-watch-metadata {
    font-size: 1.8rem;
  }
  
  ytd-watch-flexy[is-two-columns_][hide-default-text-inline-expander] #below.style-scope.ytd-watch-flexy ytd-merch-shelf-renderer {
    padding: 0;
    border: 0;
    margin: 0;
  }
  
  ytd-watch-flexy[is-two-columns_][hide-default-text-inline-expander] #below.style-scope.ytd-watch-flexy ytd-watch-metadata.ytd-watch-flexy {
    margin-bottom: 6px;
  }
  
  #tab-info yt-video-attribute-view-model .yt-video-attribute-view-model--horizontal .yt-video-attribute-view-model__link-container .yt-video-attribute-view-model__hero-section {
    flex-shrink: 0;
  }
  
  #tab-info yt-video-attribute-view-model .yt-video-attribute-view-model__overflow-menu {
    background: var(--yt-emoji-picker-category-background-color);
    border-radius: 99px;
  }
  
  #tab-info yt-video-attribute-view-model .yt-video-attribute-view-model--image-square.yt-video-attribute-view-model--image-large .yt-video-attribute-view-model__hero-section {
    max-height: 128px;
  }
  
  #tab-info yt-video-attribute-view-model .yt-video-attribute-view-model--image-large .yt-video-attribute-view-model__hero-section {
    max-width: 128px;
  }
  
  #tab-info ytd-reel-shelf-renderer #items.yt-horizontal-list-renderer ytd-reel-item-renderer.yt-horizontal-list-renderer {
    max-width: 142px;
  }
  
  ytd-watch-info-text#ytd-watch-info-text.style-scope.ytd-watch-metadata #view-count.style-scope.ytd-watch-info-text {
    align-items: center;
  }
  
  ytd-watch-info-text#ytd-watch-info-text.style-scope.ytd-watch-metadata #date-text.style-scope.ytd-watch-info-text {
    align-items: center;
  }
  
  ytd-watch-info-text:not([detailed]) #info.ytd-watch-info-text a.yt-simple-endpoint.yt-formatted-string {
    pointer-events: none;
  }
  
  body ytd-app > ytd-popup-container > tp-yt-iron-dropdown > #contentWrapper > [slot="dropdown-content"] {
    backdrop-filter: none;
  }
  
  #tab-info [tyt-clone-refresh-count] {
    overflow: visible !important;
  }
  
  #tab-info #items.ytd-horizontal-card-list-renderer yt-video-attribute-view-model.ytd-horizontal-card-list-renderer {
    contain: layout;
  }
  
  #tab-info #thumbnail-container.ytd-structured-description-channel-lockup-renderer {
    flex-shrink: 0;
  }
  
  #tab-info ytd-media-lockup-renderer[is-compact] #thumbnail-container.ytd-media-lockup-renderer {
    flex-shrink: 0;
  }
  
  secondary-wrapper ytd-donation-unavailable-renderer {
    --ytd-margin-6x: var(--ytd-margin-2x);
    --ytd-margin-5x: var(--ytd-margin-2x);
    --ytd-margin-4x: var(--ytd-margin-2x);
    --ytd-margin-3x: var(--ytd-margin-2x);
  }
  
  [tyt-no-less-btn] #less {
    display: none;
  }
  
  .tyt-metadata-hover-resized #purchase-button,
  .tyt-metadata-hover-resized #sponsor-button,
  .tyt-metadata-hover-resized #analytics-button,
  .tyt-metadata-hover-resized #subscribe-button {
    display: none !important;
  }
  
  .tyt-metadata-hover #upload-info {
    max-width: max-content;
    min-width: max-content;
    flex-basis: 100vw;
    flex-shrink: 0;
  }
  
  #tab-info ytd-structured-description-playlist-lockup-renderer[collections] #playlist-thumbnail.style-scope.ytd-structured-description-playlist-lockup-renderer {
    max-width: 100%;
  }
  
  #tab-info ytd-structured-description-playlist-lockup-renderer[collections] #lockup-container.ytd-structured-description-playlist-lockup-renderer {
    padding: 1px;
  }
  
  #tab-info ytd-structured-description-playlist-lockup-renderer[collections] #thumbnail.ytd-structured-description-playlist-lockup-renderer {
    outline: 1px solid rgba(127, 127, 127, 0.5);
  }
  
  ytd-live-chat-frame#chat[collapsed] ytd-message-renderer ~ #show-hide-button.ytd-live-chat-frame > ytd-toggle-button-renderer.ytd-live-chat-frame {
    padding: 0;
  }
  
  .tyt-info-invisible {
    display: none;
  }
  
  [tyt-playlist-expanded] secondary-wrapper > ytd-playlist-panel-renderer#playlist {
    overflow: auto;
    flex-shrink: 1;
    flex-grow: 1;
    max-height: unset !important;
  }
  
  [tyt-playlist-expanded] secondary-wrapper > ytd-playlist-panel-renderer#playlist > #container {
    max-height: unset !important;
  }
  
  secondary-wrapper ytd-playlist-panel-renderer {
    --ytd-margin-6x: var(--ytd-margin-3x);
  }
  
  ytd-watch-flexy[theater] ytd-playlist-panel-renderer[collapsible][collapsed] .header.ytd-playlist-panel-renderer {
    padding: 6px 8px;
  }
  
  ytd-watch-flexy[theater] #playlist.ytd-watch-flexy {
    margin-bottom: var(--ytd-margin-2x);
  }
  
  ytd-watch-flexy[theater] #right-tabs .tab-btn[tyt-tab-content] {
    padding: 8px 4px 6px;
    border-bottom: 0px solid transparent;
  }
  
  ytd-watch-flexy {
    --tyt-bottom-watch-metadata-margin: 12px;  
  }
  
  ytd-watch-flexy[rounded-info-panel], 
  ytd-watch-flexy[rounded-player-large] {
    --tyt-rounded-a1: ${VAL_ROUNDED_A1}px;
  }
  
  #bottom-row.style-scope.ytd-watch-metadata .item.ytd-watch-metadata {
    margin-right: var(--tyt-bottom-watch-metadata-margin, 12px);
    margin-top: var(--tyt-bottom-watch-metadata-margin, 12px);
  }
  
  #cinematics {
    contain: layout style size;
  }

  .html5-endscreen.ytp-show-tiles ~ .ytp-offline-slate .ytp-offline-slate-background {
      background-image: none !important;
  }

  .more-button.ytd-comment-replies-renderer > #creator-thumbnail {
      margin: 4px 8px;
      line-height: 100%;
  }
      
  yt-icon.yt-player-error-message-renderer {
    color: var(--yt-spec-static-overlay-text-primary);
  }
  `
};
(async () => {
  const communicationKey = `ck-${Date.now()}-${Math.floor(Math.random() * 314159265359 + 314159265359).toString(36)}`;

  /** @type {globalThis.PromiseConstructor} */
  const Promise = (async () => { })().constructor; // YouTube hacks Promise in WaterFox Classic and "Promise.resolve(0)" nevers resolve.

  if (!document.documentElement) {
    await Promise.resolve(0);
    while (!document.documentElement) {
      await new Promise(resolve => nextBrowserTick(resolve)).then().catch(console.warn);
    }
  }
  const sourceURL = 'debug://tabview-youtube/tabview.execution.js'
  const textContent = `(${executionScript})("${communicationKey}");${"\n\n"}//# sourceURL=${sourceURL}${'\n'}`

  // const isMyScriptInChromeRuntime = () => typeof GM === 'undefined' && typeof ((((window || 0).chrome || 0).runtime || 0).getURL) === 'function';
  // const isGMAvailable = () => typeof GM !== 'undefined' && !isMyScriptInChromeRuntime();

  // if(isMyScriptInChromeRuntime()){
  //   let button = document.createElement('button');
  //   button.setAttribute('onclick', textContent);
  //   button.click();
  //   button = null;
  // }else{
  //   GM_addElement('script', {
  //     textContent: textContent
  //   });
  // }

  let button = document.createElement('button');
  button.setAttribute('onclick', createHTML(textContent)); // max size 10 million bytes
  button.click();
  button = null;


  let style = document.createElement('style');
  const sourceURLMainCSS = 'debug://tabview-youtube/tabview.main.css';
  style.textContent = `${styles['main'].trim()}${'\n\n'}/*# sourceURL=${sourceURLMainCSS} */${'\n'}`;
  document.documentElement.appendChild(style);

  //-----------------------------------------------------------------------------
  // YouTube enhancements module
  (function () {
    "use strict";

    const YouTubeEnhancer = {
      // Speed control variables
      speedControl: {
        currentSpeed: 1,
        activeAnimationId: null,
        storageKey: "youtube_playback_speed",
      },

      // Settings
      settings: {
        enableSpeedControl: true,
        enableScreenshot: true,
        enableCobaltTools: true,
        storageKey: "youtube_plus_settings",
      },

      // Cache DOM queries
      _cache: new Map(),

      // Initialize everything
      init() {
        if (!/youtube\.com/.test(location.host)) return;

        this.loadSettings();
        this.speedControl.currentSpeed = parseFloat(
          localStorage.getItem(this.speedControl.storageKey) || 1
        );

        this.insertStyles();
        this.addSettingsButtonToHeader();
        this.setupNavigationObserver();
        this.setupCurrentPage();
      },

      // Cached element getter
      getElement(selector, useCache = true) {
        if (useCache && this._cache.has(selector)) {
          const element = this._cache.get(selector);
          if (element?.isConnected) return element;
          this._cache.delete(selector);
        }
        
        const element = document.querySelector(selector);
        if (element && useCache) this._cache.set(selector, element);
        return element;
      },

      loadSettings() {
        try {
          const saved = localStorage.getItem(this.settings.storageKey);
          if (saved) Object.assign(this.settings, JSON.parse(saved));
        } catch (e) {
          console.error("Error loading settings:", e);
        }
      },

      saveSettings() {
        localStorage.setItem(this.settings.storageKey, JSON.stringify(this.settings));
        this.updatePageBasedOnSettings();
      },

      updatePageBasedOnSettings() {
        const settingsMap = {
          "ytp-screenshot-button": "enableScreenshot",
          "ytp-cobalt-button": "enableCobaltTools", 
          "speed-control-btn": "enableSpeedControl"
        };

        Object.entries(settingsMap).forEach(([className, setting]) => {
          const button = this.getElement(`.${className}`, false);
          if (button) button.style.display = this.settings[setting] ? "" : "none";
        });
      },

      setupCurrentPage() {
        this.waitForElement("#player-container-outer .html5-video-player, .ytp-right-controls", 5000)
          .then(() => {
            this.addCustomButtons();
            this.setupVideoObserver();
            this.applyCurrentSpeed();
            this.updatePageBasedOnSettings();
          })
          .catch(() => {});
      },

      insertStyles() {
        const styles = `
        :root {
          --yt-accent: #ff0000;
          --yt-accent-hover: #cc0000;
          --yt-bg-dark: rgba(28, 28, 28, 0.85);
          --yt-bg-light: rgba(255, 255, 255, 0.85);
          --yt-radius-sm: 4px;
          --yt-radius-md: 8px;
          --yt-radius-lg: 12px;
          --yt-transition: all 0.2s ease;
          --yt-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
          --yt-glass-bg: rgba(255, 255, 255, 0.1);
          --yt-glass-border: rgba(255, 255, 255, 0.2);
          --yt-glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
          --yt-glass-blur: 10px;
          --yt-modal-bg-opacity: 0.1;
          --yt-notification-bg-opacity: 0.9;
          --yt-panel-bg-opacity: 0.3;
          --yt-header-bg-opacity: 0.6;
          --yt-space-xs: 4px;
          --yt-space-sm: 8px;
          --yt-space-md: 16px;
          --yt-space-lg: 24px;
        }

        .ytp-screenshot-button, .ytp-cobalt-button, .ytp-pip-button {
          position: relative;
          bottom: 12px;
          width: 44px;
          transition: opacity 0.15s ease, transform 0.15s ease;
        }

        .ytp-screenshot-button:hover, .ytp-cobalt-button:hover, .ytp-pip-button:hover {
          transform: scale(1.1);
        }

        .speed-control-btn {
          width: 4em !important; 
          float: left; 
          text-align: center !important;
          border-radius: var(--yt-radius-sm);
          font-size: 13px;
          color: #fff;
          cursor: pointer;
          user-select: none;
          font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
          transition: color 0.2s ease;
        }

        .speed-control-btn:hover { 
          color: var(--yt-accent); 
          font-weight: bold; 
        }

        .speed-options {
          position: absolute !important;
          background-color: rgba(28, 28, 28, var(--yt-panel-bg-opacity)) !important;
          color: white !important;
          border-radius: var(--yt-radius-sm) !important;
          display: none;
          bottom: calc(100% + 10px) !important;
          width: 48px !important;
          z-index: 9999 !important;
          box-shadow: var(--yt-shadow);
          border: 1px solid var(--yt-glass-border);
          overflow: hidden;
        }

        .speed-option-item {
          cursor: pointer !important;
          height: 25px !important;
          line-height: 25px !important;
          font-size: 12px !important;
          text-align: center !important;
          transition: background-color 0.15s ease, color 0.15s ease;
        }

        .speed-option-active, .speed-option-item:hover {
          color: var(--yt-accent) !important;
          font-weight: bold !important;
          background-color: rgba(255, 255, 255, 0.1) !important;
        }

        #speed-indicator {
          position: absolute !important;
          margin: auto !important;
          top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important;
          border-radius: 20px !important;
          font-size: 30px !important;
          background-color: rgba(28, 28, 28, 0.8) !important;
          color: #fff !important;
          z-index: 99999 !important;
          width: 80px !important;
          height: 80px !important;
          line-height: 80px !important;
          text-align: center !important;
          display: none;
          box-shadow: var(--yt-shadow);
          backdrop-filter: blur(4px);
          -webkit-backdrop-filter: blur(4px);
          border: 1px solid rgba(255, 255, 255, 0.1);
        }

        .youtube-enhancer-notification {
          position: fixed;
          bottom: 70px;
          left: 50%;
          transform: translateX(-50%);
          background-color: rgba(28, 28, 28, var(--yt-notification-bg-opacity));
          color: white;
          padding: 10px 20px;
          border-radius: var(--yt-radius-sm);
          z-index: 9999;
          transition: opacity 0.5s, transform 0.3s;
          box-shadow: var(--yt-shadow);
          border: 1px solid var(--yt-glass-border);
          backdrop-filter: blur(var(--yt-glass-blur));
          -webkit-backdrop-filter: blur(var(--yt-glass-blur));
          font-weight: 500;
        }

        .ytp-plus-settings-button {
          background: transparent;
          border: none;
          color: var(--yt-spec-text-secondary);
          cursor: pointer;
          padding: var(--yt-space-sm);
          margin-right: var(--yt-space-sm);
          border-radius: 50%;
          display: flex;
          align-items: center;
          justify-content: center;
          transition: background-color 0.2s, transform 0.2s;
        }

        .ytp-plus-settings-button svg { width: 24px; height: 24px; }

        .ytp-plus-settings-button:hover {
          background-color: rgba(255, 255, 255, 0.1);
          transform: rotate(30deg);
        }

        .ytp-plus-settings-modal {
          position: fixed;
          top: 0; left: 0; right: 0; bottom: 0;
          background-color: rgba(0, 0, 0, var(--yt-modal-bg-opacity));
          display: flex;
          align-items: center;
          justify-content: center;
          z-index: 99999;
          backdrop-filter: blur(15px);
          -webkit-backdrop-filter: blur(15px);
        }

        .ytp-plus-settings-panel {
          background-color: rgba(34, 34, 34, var(--yt-panel-bg-opacity));
          color: var(--yt-spec-text-primary, #ffffff);
          border-radius: var(--yt-radius-lg);
          width: 700px;
          max-width: 90%;
          max-height: 90vh;
          overflow: hidden;
          box-shadow: var(--yt-glass-shadow);
          animation: ytEnhanceFadeIn 0.2s ease;
          backdrop-filter: blur(var(--yt-glass-blur));
          -webkit-backdrop-filter: blur(var(--yt-glass-blur));
          border: 1px solid var(--yt-glass-border);
          will-change: transform, opacity;
          display: flex;
          flex-direction: row;
        }

        .ytp-plus-settings-sidebar {
          width: 200px;
          background-color: rgba(20, 20, 20, var(--yt-header-bg-opacity));
          border-right: 1px solid rgba(255, 255, 255, 0.1);
          display: flex;
          flex-direction: column;
          backdrop-filter: blur(var(--yt-glass-blur));
          -webkit-backdrop-filter: blur(var(--yt-glass-blur));
        }

        .ytp-plus-settings-sidebar-header {
          padding: var(--yt-space-md) var(--yt-space-lg);
          border-bottom: 1px solid rgba(255, 255, 255, 0.1);
          display: flex;
          justify-content: space-between;
          align-items: center;
        }

        .ytp-plus-settings-title { 
          font-size: 18px; 
          font-weight: 500; 
          margin: 0; 
        }

        .ytp-plus-settings-sidebar-close {
          padding: var(--yt-space-md) var(--yt-space-lg);
          display: flex;
          justify-content: flex-end;
          background-color: transparent;
        }

        .ytp-plus-settings-close {
          background: none;
          border: none;
          cursor: pointer;
          padding: var(--yt-space-sm);
          margin: -8px;
          color: var(--yt-spec-text-primary, #ffffff);
          transition: color 0.2s, transform 0.2s;
        }

        .ytp-plus-settings-close:hover {
          color: var(--yt-accent);
          transform: scale(1.1);
        }

        .ytp-plus-settings-nav {
          flex: 1;
          padding: var(--yt-space-md) 0;
        }

        .ytp-plus-settings-nav-item {
          display: flex;
          align-items: center;
          padding: 12px var(--yt-space-lg);
          cursor: pointer;
          transition: background-color 0.2s, color 0.2s;
          font-size: 14px;
          border-left: 3px solid transparent;
        }

        .ytp-plus-settings-nav-item:hover {
          background-color: rgba(255, 255, 255, 0.05);
        }

        .ytp-plus-settings-nav-item.active {
          background-color: rgba(255, 0, 0, 0.1);
          border-left-color: var(--yt-accent);
          color: var(--yt-accent);
        }

        .ytp-plus-settings-nav-item svg {
          width: 18px;
          height: 18px;
          margin-right: 12px;
          opacity: 0.8;
        }

        .ytp-plus-settings-nav-item.active svg {
          opacity: 1;
        }

        .ytp-plus-settings-main {
          flex: 1;
          display: flex;
          flex-direction: column;
          overflow-y: auto;
        }

        .ytp-plus-settings-header {
          padding: var(--yt-space-md) var(--yt-space-lg);
          border-bottom: 1px solid rgba(255, 255, 255, 0.1);
          background-color: rgba(34, 34, 34, var(--yt-header-bg-opacity));
          backdrop-filter: blur(var(--yt-glass-blur));
          -webkit-backdrop-filter: blur(var(--yt-glass-blur));
        }

        .ytp-plus-settings-content { 
          flex: 1;
          padding: var(--yt-space-md) var(--yt-space-lg); 
          overflow-y: auto;
        }

        .ytp-plus-settings-section {
          margin-bottom: var(--yt-space-lg);
        }

        .ytp-plus-settings-section-title {
          font-size: 16px;
          font-weight: 500;
          margin-bottom: var(--yt-space-md);
          color: var(--yt-spec-text-primary);
        }

        .ytp-plus-settings-section.hidden {
          display: none;
        }

        .ytp-plus-settings-item {
          display: flex;
          align-items: center;
          margin-bottom: var(--yt-space-md);
          padding: 12px 16px;
          background-color: transparent;
          transition: transform 0.2s ease, background-color 0.3s ease;
          border-radius: var(--yt-radius-md);
        }

        .ytp-plus-settings-item:hover {
          background-color: rgba(255, 255, 255, 0.05);
          transform: translateX(5px);
        }

        .ytp-plus-settings-item-label { 
          flex: 1; 
          font-size: 14px; 
        }

        .ytp-plus-settings-item-description {
          font-size: 12px;
          color: var(--yt-spec-text-secondary);
          margin-top: 4px;
        }

        .ytp-plus-settings-checkbox {
          appearance: none;
          -webkit-appearance: none;
          -moz-appearance: none;
          width: 15px;
          height: 15px;
          right: 5%;
          transform-origin: center;
          border: 1px solid var(--yt-glass-border);
          border-radius: 50%;
          background-color: transparent;
          transition: all 250ms cubic-bezier(0.4, 0, 0.23, 1);
          cursor: pointer;
          position: absolute;
          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
        }

        .ytp-plus-settings-checkbox:hover {
          background-color: rgba(255, 255, 255, 0.15);
          transform: scale(1.1);
        }

        .ytp-plus-settings-checkbox::before {
          content: "";
          width: 4px;
          height: 2px;
          background: #fff;
          position: absolute;
          transform: rotate(45deg);
          top: 4px;
          left: 3px;
          transition: width 100ms ease 50ms, opacity 50ms;
          transform-origin: 0% 0%;
          opacity: 0;
        }

        .ytp-plus-settings-checkbox::after {
          content: "";
          width: 0;
          height: 2px;
          background: #fff;
          position: absolute;
          transform: rotate(305deg);
          top: 9px;
          left: 6px;
          transition: width 100ms ease, opacity 50ms;
          transform-origin: 0% 0%;
          opacity: 0;
        }

        .ytp-plus-settings-checkbox:checked {
          border-color: var(--yt-glass-border);
          transform: rotate(0deg) scale(1.2);
        }

        .ytp-plus-settings-checkbox:checked::before {
          width: 8px;
          opacity: 1;
          transition: width 150ms ease 100ms, opacity 150ms ease 100ms;
        }

        .ytp-plus-settings-checkbox:checked::after {
          width: 15px;
          opacity: 1;
          transition: width 150ms ease 250ms, opacity 150ms ease 250ms;
        }

        .ytp-plus-footer {
          padding: var(--yt-space-md) var(--yt-space-lg);
          border-top: 1px solid rgba(255, 255, 255, 0.1);
          display: flex;
          justify-content: flex-end;
          background-color: transparent;
        }

        .ytp-plus-button {
          padding: var(--yt-space-sm) var(--yt-space-md);
          border-radius: 18px;
          border: none;
          font-size: 14px;
          font-weight: 500;
          cursor: pointer;
          transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s;
        }

        .ytp-plus-button-primary {
          background-color: transparent;
          border: 1px solid var(--yt-glass-border);
          color: white;
        }

        .ytp-plus-button-primary:hover {
          background-color: var(--yt-accent);
          box-shadow: 0 4px 12px rgba(255, 0, 0, 0.3);
          transform: translateY(-2px);
        }

        @keyframes ytEnhanceFadeIn {
          from { opacity: 0; transform: scale(0.95); }
          to { opacity: 1; transform: scale(1); }
        }

        @media (max-width: 768px) {
          .ytp-plus-settings-panel { 
            width: 95%; 
            max-height: 80vh; 
            flex-direction: column;
          }
          .ytp-plus-settings-sidebar {
            width: 100%;
            max-height: 120px;
            flex-direction: row;
            overflow-x: auto;
          }
          .ytp-plus-settings-nav {
            display: flex;
            flex-direction: row;
            padding: 0;
          }
          .ytp-plus-settings-nav-item {
            white-space: nowrap;
            border-left: none;
            border-bottom: 3px solid transparent;
          }
          .ytp-plus-settings-nav-item.active {
            border-left: none;
            border-bottom-color: var(--yt-accent);
          }
          .ytp-plus-settings-item { padding: 10px 12px; }
          }
          .ytp-plus-settings-section h1{margin:-95px 90px 8px;font-family:'Montserrat',sans-serif;font-size:52px;font-weight:600;color:transparent;-webkit-text-stroke-width: 1px;-webkit-text-stroke-color: white;cursor: pointer;transition: color 0.2s ease;}
          .ytp-plus-settings-section h1:hover {color: var(--yt-accent);-webkit-text-stroke-width: 1px;-webkit-text-stroke-color: transparent;}
          `;

        if (!document.getElementById('yt-enhancer-styles')) {
          const styleEl = document.createElement("style");
          styleEl.id = 'yt-enhancer-styles';
          styleEl.textContent = styles;
          document.head.appendChild(styleEl);
        }
      },

      addSettingsButtonToHeader() {
        this.waitForElement("ytd-masthead #end", 5000)
          .then((headerEnd) => {
            if (!this.getElement(".ytp-plus-settings-button")) {
              const settingsButton = document.createElement("div");
              settingsButton.className = "ytp-plus-settings-button";
              settingsButton.setAttribute("title", "YouTube + Settings");
              settingsButton.innerHTML = `
                <svg width="24" height="24" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                  <path d="M39.23,26a16.52,16.52,0,0,0,.14-2,16.52,16.52,0,0,0-.14-2l4.33-3.39a1,1,0,0,0,.25-1.31l-4.1-7.11a1,1,0,0,0-1.25-.44l-5.11,2.06a15.68,15.68,0,0,0-3.46-2l-.77-5.43a1,1,0,0,0-1-.86H19.9a1,1,0,0,0-1,.86l-.77,5.43a15.36,15.36,0,0,0-3.46,2L9.54,9.75a1,1,0,0,0-1.25.44L4.19,17.3a1,1,0,0,0,.25,1.31L8.76,22a16.66,16.66,0,0,0-.14,2,16.52,16.52,0,0,0,.14,2L4.44,29.39a1,1,0,0,0-.25,1.31l4.1,7.11a1,1,0,0,0,1.25.44l5.11-2.06a15.68,15.68,0,0,0,3.46,2l.77,5.43a1,1,0,0,0,1,.86h8.2a1,1,0,0,0,1-.86l.77-5.43a15.36,15.36,0,0,0,3.46-2l5.11,2.06a1,1,0,0,0,1.25-.44l4.1-7.11a1,1,0,0,0-.25-1.31ZM24,31.18A7.18,7.18,0,1,1,31.17,24,7.17,7.17,0,0,1,24,31.18Z"/>
                </svg>
              `;

              settingsButton.addEventListener("click", this.openSettingsModal.bind(this));

              const avatarButton = headerEnd.querySelector("ytd-topbar-menu-button-renderer");
              if (avatarButton) {
                headerEnd.insertBefore(settingsButton, avatarButton);
              } else {
                headerEnd.appendChild(settingsButton);
              }
            }
          })
          .catch(() => {});
      },

      createSettingsModal() {
        const modal = document.createElement("div");
        modal.className = "ytp-plus-settings-modal";

        modal.innerHTML = `
          <div class="ytp-plus-settings-panel">
            <div class="ytp-plus-settings-sidebar">
              <div class="ytp-plus-settings-sidebar-header">
                <h2 class="ytp-plus-settings-title">Settings</h2>                
              </div>
              <div class="ytp-plus-settings-nav">
                <div class="ytp-plus-settings-nav-item active" data-section="basic">
                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                    <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
                    <circle cx="9" cy="9" r="2"/>
                    <path d="m21 15-3.086-3.086a2 2 0 0 0-1.414-.586H13l-2-2v3h6l3 3"/>
                  </svg>
                  Basic
                </div>
                <div class="ytp-plus-settings-nav-item" data-section="advanced">
                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                    <circle cx="12" cy="12" r="3"/>
                    <path d="m12 1 0 6m0 6 0 6"/>
                    <path d="m17.5 6.5-4.5 4.5m0 0-4.5 4.5m9-9L12 12l5.5 5.5"/>
                  </svg>
                  Advanced
                </div>
                <div class="ytp-plus-settings-nav-item" data-section="about">
                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                    <circle cx="12" cy="12" r="10"/>
                    <path d="m9 12 2 2 4-4"/>
                  </svg>
                  About
                </div>
              </div>
            </div>
            <div class="ytp-plus-settings-main">
              <div class="ytp-plus-settings-sidebar-close">
                <button class="ytp-plus-settings-close" aria-label="Close">
                  <svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                    <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/>
                  </svg>
                </button>
              </div>              
              <div class="ytp-plus-settings-content">                
                <div class="ytp-plus-settings-section" data-section="basic">
                  <div class="ytp-plus-settings-item">
                    <div>
                      <label class="ytp-plus-settings-item-label">Speed Control</label>
                      <div class="ytp-plus-settings-item-description">Add speed control buttons to video player</div>
                    </div>
                    <input type="checkbox" class="ytp-plus-settings-checkbox" data-setting="enableSpeedControl" ${this.settings.enableSpeedControl ? 'checked' : ''}>
                  </div>
                  <div class="ytp-plus-settings-item">
                    <div>
                      <label class="ytp-plus-settings-item-label">Screenshot Button</label>
                      <div class="ytp-plus-settings-item-description">Add screenshot capture button to video player</div>
                    </div>
                    <input type="checkbox" class="ytp-plus-settings-checkbox" data-setting="enableScreenshot" ${this.settings.enableScreenshot ? 'checked' : ''}>
                  </div>
                  <div class="ytp-plus-settings-item">
                    <div>
                      <label class="ytp-plus-settings-item-label">Download Button</label>
                      <div class="ytp-plus-settings-item-description">Add cobalt.tools download button to video player</div>
                    </div>
                    <input type="checkbox" class="ytp-plus-settings-checkbox" data-setting="enableCobaltTools" ${this.settings.enableCobaltTools ? 'checked' : ''}>
                  </div>
                </div>
                
                <div class="ytp-plus-settings-section hidden" data-section="advanced">
                </div>
                
                <div class="ytp-plus-settings-section hidden" data-section="about">
                  <svg class="app-icon" width="90" height="90" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" version="1.1">
                    <path d="m23.24,4.62c-0.85,0.45 -2.19,2.12 -4.12,5.13c-1.54,2.41 -2.71,4.49 -3.81,6.8c-0.55,1.14 -1.05,2.2 -1.13,2.35c-0.08,0.16 -0.78,0.7 -1.66,1.28c-1.38,0.91 -1.8,1.29 -1.4,1.28c0.08,0 0.67,-0.35 1.31,-0.77c0.64,-0.42 1.19,-0.76 1.2,-0.74c0.02,0.02 -0.1,0.31 -0.25,0.66c-1.03,2.25 -1.84,5.05 -1.84,6.37c0.01,1.89 0.84,2.67 2.86,2.67c1.08,0 1.94,-0.31 3.66,-1.29c1.84,-1.06 3.03,-1.93 4.18,-3.09c1.69,-1.7 2.91,-3.4 3.28,-4.59c0.59,-1.9 -0.1,-3.08 -2.02,-3.44c-0.87,-0.16 -2.85,-0.14 -3.75,0.06c-1.78,0.38 -2.74,0.76 -2.5,1c0.03,0.03 0.5,-0.1 1.05,-0.28c1.49,-0.48 2.34,-0.59 3.88,-0.53c1.64,0.07 2.09,0.19 2.69,0.75l0.46,0.43l0,0.87c0,0.74 -0.05,0.98 -0.35,1.6c-0.69,1.45 -2.69,3.81 -4.37,5.14c-0.93,0.74 -2.88,1.94 -4.07,2.5c-1.64,0.77 -3.56,0.72 -4.21,-0.11c-0.39,-0.5 -0.5,-1.02 -0.44,-2.11c0.05,-0.85 0.16,-1.32 0.67,-2.86c0.34,-1.01 0.86,-2.38 1.15,-3.04c0.52,-1.18 0.55,-1.22 1.6,-2.14c4.19,-3.65 8.42,-9.4 9.02,-12.26c0.2,-0.94 0.13,-1.46 -0.21,-1.7c-0.31,-0.22 -0.38,-0.21 -0.89,0.06m0.19,0.26c-0.92,0.41 -3.15,3.44 -5.59,7.6c-1.05,1.79 -3.12,5.85 -3.02,5.95c0.07,0.07 1.63,-1.33 2.58,-2.34c1.57,-1.65 3.73,-4.39 4.88,-6.17c1.31,-2.03 2.06,-4.11 1.77,-4.89c-0.13,-0.34 -0.16,-0.35 -0.62,-0.15m11.69,13.32c-0.3,0.6 -1.19,2.54 -1.98,4.32c-1.6,3.62 -1.67,3.71 -2.99,4.34c-1.13,0.54 -2.31,0.85 -3.54,0.92c-0.99,0.06 -1.08,0.04 -1.38,-0.19c-0.28,-0.22 -0.31,-0.31 -0.26,-0.7c0.03,-0.25 0.64,-1.63 1.35,-3.08c1.16,-2.36 2.52,-5.61 2.52,-6.01c0,-0.49 -0.36,0.19 -1.17,2.22c-0.51,1.26 -1.37,3.16 -1.93,4.24c-0.55,1.08 -1.04,2.17 -1.09,2.43c-0.1,0.59 0.07,1.03 0.49,1.28c0.78,0.46 3.3,0.06 5.13,-0.81l0.93,-0.45l-0.66,1.25c-0.7,1.33 -3.36,6.07 -4.31,7.67c-2.02,3.41 -3.96,5.32 -6.33,6.21c-2.57,0.96 -4.92,0.74 -6.14,-0.58c-0.81,-0.88 -0.82,-1.71 -0.04,-3.22c1.22,-2.36 6.52,-6.15 10.48,-7.49c0.52,-0.18 0.95,-0.39 0.95,-0.46c0,-0.21 -0.19,-0.18 -1.24,0.2c-1.19,0.43 -3.12,1.37 -4.34,2.11c-2.61,1.59 -5.44,4.09 -6.13,5.43c-1.15,2.2 -0.73,3.61 1.4,4.6c0.59,0.28 0.75,0.3 2.04,0.3c1.67,0 2.42,-0.18 3.88,-0.89c1.87,-0.92 3.17,-2.13 4.72,-4.41c0.98,-1.44 4.66,-7.88 5.91,-10.33c0.25,-0.49 0.68,-1.19 0.96,-1.56c0.28,-0.37 0.76,-1.15 1.06,-1.73c0.82,-1.59 2.58,-6.1 2.58,-6.6c0,-0.06 -0.07,-0.1 -0.17,-0.1c-0.1,0 -0.39,0.44 -0.71,1.09m-1.34,3.7c-0.93,2.08 -1.09,2.48 -0.87,2.2c0.19,-0.24 1.66,-3.65 1.6,-3.71c-0.02,-0.02 -0.35,0.66 -0.73,1.51" fill="none" fill-rule="evenodd" stroke="currentColor" />
                  </svg>
                    <h1>YouTube +</h1><br><br>
                  <div style="padding: 16px; background-color: transparent;border: 1px solid var(--yt-glass-border); border-radius: 8px; margin-bottom: 16px;">
                    <p style="margin: 0 0 12px 0; font-size: 14px; line-height: 1.5;">
                      Enhanced YouTube experience with useful features
                    </p>
                    <p style="margin: 0; font-size: 12px; color: var(--yt-spec-text-secondary);">
                      Version 1.5                      
                    </p>
                  </div>
                </div>
              </div>
              <div class="ytp-plus-footer">
                <button class="ytp-plus-button ytp-plus-button-primary" id="ytp-plus-save-settings">Save Changes</button>
              </div>
            </div>
          </div>
        `;

        // Event delegation for better performance
        modal.addEventListener('click', (e) => {
          if (e.target === modal) modal.remove();
          if (e.target.classList.contains('ytp-plus-settings-close') || e.target.closest('.ytp-plus-settings-close')) modal.remove();
          
          if (e.target.classList.contains('ytp-plus-settings-nav-item')) {
            // Handle sidebar navigation
            const section = e.target.dataset.section;
            modal.querySelectorAll('.ytp-plus-settings-nav-item').forEach(item => item.classList.remove('active'));
            modal.querySelectorAll('.ytp-plus-settings-section').forEach(section => section.classList.add('hidden'));
            
            e.target.classList.add('active');
            modal.querySelector(`.ytp-plus-settings-section[data-section="${section}"]`).classList.remove('hidden');
          }
          
          if (e.target.classList.contains('ytp-plus-settings-checkbox')) {
            const setting = e.target.dataset.setting;
            if (setting) {
              this.settings[setting] = e.target.checked;
            }
          }
          
          if (e.target.id === 'ytp-plus-save-settings') {
            this.saveSettings();
            modal.remove();
            this.showNotification("Settings saved");
          }
        });

        return modal;
      },

      openSettingsModal() {
        const existingModal = this.getElement(".ytp-plus-settings-modal", false);
        if (existingModal) existingModal.remove();
        document.body.appendChild(this.createSettingsModal());
      },

      waitForElement(selector, timeout = 5000) {
        return new Promise((resolve, reject) => {
          const element = document.querySelector(selector);
          if (element) return resolve(element);

          const observer = new MutationObserver(() => {
            const element = document.querySelector(selector);
            if (element) {
              observer.disconnect();
              resolve(element);
            }
          });

          observer.observe(document.body, { childList: true, subtree: true });
          setTimeout(() => {
            observer.disconnect();
            reject(new Error(`Element ${selector} not found within ${timeout}ms`));
          }, timeout);
        });
      },

      addCustomButtons() {
        const controls = this.getElement(".ytp-right-controls");
        if (!controls) return;

        if (!this.getElement(".ytp-screenshot-button")) this.addScreenshotButton(controls);
        if (!this.getElement(".ytp-cobalt-button")) this.addCobaltToolsButton(controls);
        if (!this.getElement(".speed-control-btn")) this.addSpeedControlButton(controls);

        if (!document.getElementById("speed-indicator")) {
          const indicator = document.createElement("div");
          indicator.id = "speed-indicator";
          const player = document.getElementById("movie_player");
          if (player) player.appendChild(indicator);
        }

        this.handleFullscreenChange();
      },

      addScreenshotButton(controls) {
        const button = document.createElement("button");
        button.className = "ytp-button ytp-screenshot-button";
        button.setAttribute("title", "Take screenshot");
        button.innerHTML = `
          <svg width="24" height="24" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="M19.83,8.77l-2.77,2.84H6.29A1.79,1.79,0,0,0,4.5,13.4V36.62a1.8,1.8,0,0,0,1.79,1.8H41.71a1.8,1.8,0,0,0,1.79-1.8V13.4a1.79,1.79,0,0,0-1.79-1.79H30.94L28.17,8.77Zm18.93,5.74a1.84,1.84,0,1,1,0,3.68A1.84,1.84,0,0,1,38.76,14.51ZM24,17.71a8.51,8.51,0,1,1-8.51,8.51A8.51,8.51,0,0,1,24,17.71Z"/>
          </svg>
        `;

        button.addEventListener("click", this.captureFrame.bind(this));
        controls.insertBefore(button, controls.firstChild);
      },

      addCobaltToolsButton(controls) {
        const button = document.createElement("button");
        button.className = "ytp-button ytp-cobalt-button";
        button.setAttribute("title", "Open in cobalt.tools");
        button.innerHTML = `
          <svg fill="currentColor" width="24" height="24" viewBox="0 0 256 256" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="M83.17188,112.83984a4.00026,4.00026,0,0,1,5.65624-5.6582L124,142.34473V40a4,4,0,0,1,8,0V142.34473l35.17188-35.16309a4.00026,4.00026,0,0,1,5.65624,5.6582l-42,41.98926a4.00088,4.00088,0,0,1-5.65624,0ZM216,148a4.0002,4.0002,0,0,0-4,4v56a4.00427,4.00427,0,0,1-4,4H48a4.00427,4.00427,0,0,1-4-4V152a4,4,0,0,0-8,0v56a12.01343,12.01343,0,0,0,12,12H208a12.01343,12.01343,0,0,0,12-12V152A4.0002,4.0002,0,0,0,216,148Z"/>
          </svg>
        `;

        button.addEventListener("click", this.openInCobaltTools.bind(this));
        controls.insertBefore(button, controls.firstChild);
      },

      addSpeedControlButton(controls) {
        const speedBtn = document.createElement("div");
        speedBtn.className = "ytp-button speed-control-btn";
        speedBtn.innerHTML = `<span>${this.speedControl.currentSpeed}×</span>`;

        const speedOptions = document.createElement("div");
        speedOptions.className = "speed-options";

        [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 2.0, 3.0].forEach((speed) => {
          const option = document.createElement("div");
          option.className = `speed-option-item${parseFloat(speed) === this.speedControl.currentSpeed ? " speed-option-active" : ""}`;
          option.textContent = `${speed}x`;
          option.dataset.speed = speed;
          option.addEventListener("click", () => this.changeSpeed(speed));
          speedOptions.appendChild(option);
        });

        speedBtn.appendChild(speedOptions);

        let isHovering = false;
        speedBtn.addEventListener("mouseenter", () => {
          isHovering = true;
          speedOptions.style.display = "block";
        });

        speedBtn.addEventListener("mouseleave", () => {
          isHovering = false;
          setTimeout(() => {
            if (!isHovering) speedOptions.style.display = "none";
          }, 150);
        });

        controls.insertBefore(speedBtn, controls.firstChild);
      },

      captureFrame() {
        const video = this.getElement("video", false);
        if (!video) return;

        const canvas = document.createElement("canvas");
        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        const ctx = canvas.getContext("2d");
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

        const videoTitle = document.title.replace(/\s-\sYouTube$/, "").trim();
        const link = document.createElement("a");
        link.href = canvas.toDataURL("image/png");
        link.download = `${videoTitle}.png`;
        link.click();
      },

      openInCobaltTools() {
        const videoId = new URLSearchParams(location.search).get("v");
        if (!videoId) return;

        navigator.clipboard
          .writeText(location.href)
          .then(() => this.showNotification("URL copied to clipboard"));

        window.open(`https://cobalt.tools/?url=https://www.youtube.com/watch?v=${videoId}`, "_blank");
      },

      showNotification(message, duration = 2000) {
        const existingNotification = this.getElement(".youtube-enhancer-notification", false);
        if (existingNotification) existingNotification.remove();

        const notification = document.createElement("div");
        notification.className = "youtube-enhancer-notification";
        notification.textContent = message;
        document.body.appendChild(notification);

        setTimeout(() => {
          notification.style.opacity = "0";
          setTimeout(() => notification.remove(), 500);
        }, duration);
      },

      handleFullscreenChange() {
        const isFullscreen = document.fullscreenElement || document.webkitFullscreenElement;
        document.querySelectorAll(".ytp-screenshot-button, .ytp-cobalt-button").forEach((button) => {
          button.style.bottom = isFullscreen ? "15px" : "12px";
        });
      },

      changeSpeed(speed) {
        speed = parseFloat(speed);
        this.speedControl.currentSpeed = speed;
        localStorage.setItem(this.speedControl.storageKey, speed);

        const speedBtn = this.getElement(".speed-control-btn span", false);
        if (speedBtn) speedBtn.textContent = `${speed}×`;

        document.querySelectorAll(".speed-option-item").forEach((option) => {
          option.classList.toggle("speed-option-active", parseFloat(option.dataset.speed) === speed);
        });

        this.applyCurrentSpeed();
        this.showSpeedIndicator(speed);
      },

      applyCurrentSpeed() {
        document.querySelectorAll("video").forEach((video) => {
          if (video && video.playbackRate !== this.speedControl.currentSpeed) {
            video.playbackRate = this.speedControl.currentSpeed;
          }
        });
      },

      setupVideoObserver() {
        if (this._speedInterval) clearInterval(this._speedInterval);
        this._speedInterval = setInterval(() => this.applyCurrentSpeed(), 1000);
      },

      setupNavigationObserver() {
        let lastUrl = location.href;

        document.addEventListener("fullscreenchange", this.handleFullscreenChange.bind(this));

        document.addEventListener("yt-navigate-finish", () => {
          if (location.href.includes("watch?v=")) this.setupCurrentPage();
          this.addSettingsButtonToHeader();
        });

        const observer = new MutationObserver(() => {
          if (lastUrl !== location.href) {
            lastUrl = location.href;
            if (location.href.includes("watch?v=")) {
              setTimeout(() => this.setupCurrentPage(), 500);
            }
            this.addSettingsButtonToHeader();
          }
        });

        observer.observe(document.body, { childList: true, subtree: true });
      },

      showSpeedIndicator(speed) {
        const indicator = document.getElementById("speed-indicator");
        if (!indicator) return;

        if (this.speedControl.activeAnimationId) {
          cancelAnimationFrame(this.speedControl.activeAnimationId);
        }

        indicator.textContent = `${speed}×`;
        indicator.style.display = "block";
        indicator.style.opacity = "0.8";

        let startTime = performance.now();
        const fadeOut = (timestamp) => {
          const elapsed = timestamp - startTime;
          const progress = Math.min(elapsed / 1500, 1);

          indicator.style.opacity = 0.8 * (1 - progress);

          if (progress < 1) {
            this.speedControl.activeAnimationId = requestAnimationFrame(fadeOut);
          } else {
            indicator.style.display = "none";
            this.speedControl.activeAnimationId = null;
          }
        };

        this.speedControl.activeAnimationId = requestAnimationFrame(fadeOut);
      },
    };

    document.readyState === "loading"
      ? document.addEventListener("DOMContentLoaded", YouTubeEnhancer.init.bind(YouTubeEnhancer))
      : YouTubeEnhancer.init();
  })();

  // Modern minimalistic scrollbars
  (function() {
    const scrollbarStyles = `
      :root {
        --scrollbar-width: 8px;
        --scrollbar-track: transparent;
        --scrollbar-thumb: rgba(144, 144, 144, 0.5);
        --scrollbar-thumb-hover: rgba(170, 170, 170, 0.7);
        --scrollbar-thumb-active: rgba(190, 190, 190, 0.9);
      }

      ::-webkit-scrollbar {
        width: var(--scrollbar-width) !important;
        height: var(--scrollbar-width) !important;
      }

      ::-webkit-scrollbar-track {
        background: var(--scrollbar-track) !important;
        border-radius: 4px !important;
      }

      ::-webkit-scrollbar-thumb {
        background: var(--scrollbar-thumb) !important;
        border-radius: 4px !important;
        transition: background 0.2s ease !important;
      }

      ::-webkit-scrollbar-thumb:hover {
        background: var(--scrollbar-thumb-hover) !important;
      }

      ::-webkit-scrollbar-thumb:active {
        background: var(--scrollbar-thumb-active) !important;
      }

      ::-webkit-scrollbar-corner {
        background: transparent !important;
      }

      * {
        scrollbar-width: thin;
        scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
      }

      html[dark] {
        --scrollbar-thumb: rgba(144, 144, 144, 0.4);
        --scrollbar-thumb-hover: rgba(170, 170, 170, 0.6);
        --scrollbar-thumb-active: rgba(190, 190, 190, 0.8);
      }
    `;

    const styleEl = document.createElement('style');
    styleEl.textContent = scrollbarStyles;
    document.head.appendChild(styleEl);
  })();

  // YouTube Picture-in-Picture settings
  (function () {
    "use strict";

    // PiP settings with defaults
    const pipSettings = {
      enabled: true,
      shortcut: { key: "P", shiftKey: true, altKey: false, ctrlKey: false },
      storageKey: "youtube_pip_settings"
    };

    // Load/save settings
    const loadSettings = () => {
      try {
        const saved = localStorage.getItem(pipSettings.storageKey);
        if (saved) Object.assign(pipSettings, JSON.parse(saved));
      } catch (e) {
        console.error("Error loading PiP settings:", e);
      }
    };

    const saveSettings = () => {
      try {
        localStorage.setItem(pipSettings.storageKey, JSON.stringify(pipSettings));
      } catch (e) {
        console.error("Error saving PiP settings:", e);
      }
    };

    // Toggle Picture-in-Picture
    const togglePictureInPicture = (video) => {
      if (!pipSettings.enabled || !video) return;
      
      if (document.pictureInPictureElement) {
        document.exitPictureInPicture()
          .then(() => localStorage.removeItem("pipActive"))
          .catch(console.error);
      } else {
        video.requestPictureInPicture()
          .then(() => localStorage.setItem("pipActive", "true"))
          .catch(console.error);
      }
    };

    // Add PiP settings to Advanced section of modal
    const addPipSettingsToModal = () => {
      // Wait for the advanced section to be available
      const advancedSection = document.querySelector('.ytp-plus-settings-section[data-section="advanced"]');
      if (!advancedSection || document.querySelector('.pip-settings-item')) return;
      
      // Add styles if they don't exist
      if (!document.getElementById('pip-styles')) {
        const style = document.createElement('style');
        style.id = 'pip-styles';
        style.textContent = `
          .pip-shortcut-editor { display: flex; align-items: center; gap: 8px; }
          .pip-shortcut-editor select, #pip-key {
            background: rgba(34, 34, 34, var(--yt-header-bg-opacity));
            color: var(--yt-spec-text-primary);
            border: 1px solid var(--yt-spec-10-percent-layer);
            border-radius: var(--yt-radius-sm);
            padding: 4px;
          }
        `;
        document.head.appendChild(style);
      }
      
      // Enable/disable toggle
      const enableItem = document.createElement('div');
      enableItem.className = 'ytp-plus-settings-item pip-settings-item';
      enableItem.innerHTML = `
        <div>
          <label class="ytp-plus-settings-item-label">Picture-in-Picture</label>
          <div class="ytp-plus-settings-item-description">Add Picture-in-Picture functionality with keyboard shortcut</div>
        </div>
        <input type="checkbox" class="ytp-plus-settings-checkbox" data-setting="enablePiP" id="pip-enable-checkbox" ${pipSettings.enabled ? 'checked' : ''}>
      `;
      advancedSection.appendChild(enableItem);
      
      // Shortcut settings
      const shortcutItem = document.createElement('div');
      shortcutItem.className = 'ytp-plus-settings-item pip-shortcut-item';
      shortcutItem.style.display = pipSettings.enabled ? 'flex' : 'none';
      
      const { ctrlKey, altKey, shiftKey } = pipSettings.shortcut;
      const modifierValue = ctrlKey && altKey && shiftKey ? 'ctrl+alt+shift' :
                          ctrlKey && altKey ? 'ctrl+alt' :
                          ctrlKey && shiftKey ? 'ctrl+shift' :
                          altKey && shiftKey ? 'alt+shift' :
                          ctrlKey ? 'ctrl' : altKey ? 'alt' : shiftKey ? 'shift' : 'none';
      
      shortcutItem.innerHTML = `
        <div>
          <label class="ytp-plus-settings-item-label">PiP Keyboard Shortcut</label>
          <div class="ytp-plus-settings-item-description">Customize keyboard combination to toggle PiP mode</div>
        </div>
        <div class="pip-shortcut-editor">
          <select id="pip-modifier-combo">
            ${['none', 'ctrl', 'alt', 'shift', 'ctrl+alt', 'ctrl+shift', 'alt+shift', 'ctrl+alt+shift']
              .map(v => `<option value="${v}" ${v === modifierValue ? 'selected' : ''}>${v === 'none' ? 'None' : v.replace(/\+/g, '+').split('+').map(k => k.charAt(0).toUpperCase() + k.slice(1)).join('+')}</option>`)
              .join('')}
          </select>
          <span>+</span>
          <input type="text" id="pip-key" value="${pipSettings.shortcut.key}" maxlength="1" style="width: 30px; text-align: center;">
        </div>
      `;
      advancedSection.appendChild(shortcutItem);
      
      // Event listeners
      document.getElementById('pip-enable-checkbox').addEventListener('change', (e) => {
        pipSettings.enabled = e.target.checked;
        shortcutItem.style.display = pipSettings.enabled ? 'flex' : 'none';
        saveSettings();
      });
      
      document.getElementById('pip-modifier-combo').addEventListener('change', (e) => {
        const value = e.target.value;
        pipSettings.shortcut.ctrlKey = value.includes('ctrl');
        pipSettings.shortcut.altKey = value.includes('alt');
        pipSettings.shortcut.shiftKey = value.includes('shift');
        saveSettings();
      });
      
      document.getElementById('pip-key').addEventListener('input', (e) => {
        if (e.target.value) {
          pipSettings.shortcut.key = e.target.value.toUpperCase();
          saveSettings();
        }
      });
      
      document.getElementById('pip-key').addEventListener('keydown', (e) => e.stopPropagation());
    };

    // Initialize
    loadSettings();
    
    // Event listeners
    document.addEventListener("keydown", (e) => {
      if (!pipSettings.enabled) return;
      const { shiftKey, altKey, ctrlKey, key } = pipSettings.shortcut;
      if (e.shiftKey === shiftKey && e.altKey === altKey && 
          e.ctrlKey === ctrlKey && e.key.toUpperCase() === key) {
        togglePictureInPicture(document.querySelector("video"));
        e.preventDefault();
      }
    });

    window.addEventListener("storage", (e) => {
      if (e.key === "pipActive" && e.newValue === null && document.pictureInPictureElement) {
        document.exitPictureInPicture().catch(console.error);
      } else if (e.key === pipSettings.storageKey) {
        loadSettings();
      }
    });

    window.addEventListener("load", () => {
      if (pipSettings.enabled && localStorage.getItem("pipActive") === "true" && !document.pictureInPictureElement) {
        const video = document.querySelector("video");
        if (video) togglePictureInPicture(video);
      }
    });

    // DOM observers for the settings modal
    const observer = new MutationObserver((mutations) => {
      for (const mutation of mutations) {
        for (const node of mutation.addedNodes) {
          if (node.classList?.contains('ytp-plus-settings-modal')) {
            setTimeout(addPipSettingsToModal, 100);
          }
        }
      }
      
      // Check for section changes
      if (document.querySelector('.ytp-plus-settings-nav-item[data-section="advanced"].active')) {
        // If advanced section is active and our settings aren't there yet, add them
        if (!document.querySelector('.pip-settings-item')) {
          setTimeout(addPipSettingsToModal, 50);
        }
      }
    });

    observer.observe(document.body, { childList: true, subtree: true });
    
    // Also observe for changes in the tab selection
    document.addEventListener('click', (e) => {
      if (e.target.classList && e.target.classList.contains('ytp-plus-settings-nav-item')) {
        if (e.target.dataset.section === 'advanced') {
          setTimeout(addPipSettingsToModal, 50);
        }
      }
    }, true);
  })();

  // YouTube Timecode Panel
  (function () {
    "use strict";

    // Configuration
    const timeSettings = {
      enabled: true,
      autoDetect: true,
      shortcut: { key: "T", shiftKey: true, altKey: false, ctrlKey: false },
      storageKey: 'youtube_timecode_settings',
      autoSave: true,
      highlightCurrentChapter: true,
      autoTrackPlayback: true,
      smoothScrolling: true,
      audioFeedback: false,
      export: true
    };

    // Caches and state
    const cache = { 
      timecodes: new Map(),
      dom: {},
      lastActiveIndex: null,
      trackingId: 0,
      intervals: new Set()
    };

    // Utils
    const loadSettings = () => {
      try {
        const saved = localStorage.getItem(timeSettings.storageKey);
        if (saved) Object.assign(timeSettings, JSON.parse(saved));
      } catch (e) {}
    };

    const saveSettings = () => {
      try {
        localStorage.setItem(timeSettings.storageKey, JSON.stringify(timeSettings));
      } catch (e) {}
    };

    const showNotification = (message, duration = 2000) => {
      let notification = document.querySelector('.youtube-enhancer-notification');
      if (!notification) {
        notification = document.createElement('div');
        notification.className = 'youtube-enhancer-notification';
        document.body.appendChild(notification);
      }
      notification.textContent = message;
      notification.style.opacity = '1';
      setTimeout(() => notification.style.opacity = '0', duration);
    };

    // Time utils
    const formatTime = seconds => {
      if (isNaN(seconds)) return "00:00";
      seconds = Math.round(seconds);
      const h = Math.floor(seconds / 3600);
      const m = Math.floor((seconds % 3600) / 60);
      const s = seconds % 60;
      return h > 0
        ? `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`
        : `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
    };

    const parseTimeString = timeStr => {
      const match = timeStr?.trim().match(/^(?:(\d+):)?(\d{1,2}):(\d{2})$/);
      if (!match) return null;
      const h = match[1] ? parseInt(match[1], 10) : 0;
      const m = parseInt(match[2], 10);
      const s = parseInt(match[3], 10);
      return (m < 60 && s < 60) ? h * 3600 + m * 60 + s : null;
    };

    // Timecode extraction
    const extractTimecodes = text => {
      if (!text) return [];
      const regex = /(?:\b|\s|\()(?:(?:(\d+):)?(\d{1,2}):(\d{2}))(?:\s*[-–—]\s*([^,\n\r<>]+?))?(?=\s|$|\)|,)/g;
      const timecodes = [];
      const seen = new Set();

      text.replace(regex, (match, hours, minutes, seconds, label) => {
        hours = hours ? parseInt(hours, 10) : 0;
        minutes = parseInt(minutes, 10);
        seconds = parseInt(seconds, 10);

        if (minutes < 60 && seconds < 60) {
          const time = hours * 3600 + minutes * 60 + seconds;
          const key = time.toString();

          if (!seen.has(key)) {
            seen.add(key);
            timecodes.push({
              time,
              label: label?.trim() || formatTime(time),
              originalText: match.trim()
            });
          }
        }
        return match;
      });

      return timecodes.sort((a, b) => a.time - b.time);
    };

    // Detection
    const detectTimecodes = () => {
      if (!timeSettings.enabled || !timeSettings.autoDetect) return [];

      const videoId = new URLSearchParams(window.location.search).get("v");
      if (!videoId) return [];

      const cacheKey = `detect_${videoId}`;
      if (cache.timecodes.has(cacheKey)) return cache.timecodes.get(cacheKey);

      const uniqueMap = new Map();

      // Extract from description
      const descSelectors = [
        "#description-inline-expander, #description-inline-expander yt-attributed-string",
        "#tab-info ytd-expandable-video-description-body-renderer"
      ];

      for (const selector of descSelectors) {
        const el = document.querySelector(selector);
        if (el) {
          extractTimecodes(el.textContent).forEach(tc => {
            uniqueMap.set(tc.time.toString(), tc);
          });
          break;
        }
      }

      // Get native chapters
      const chapters = getYouTubeChapters();
      chapters.forEach(chapter => {
        uniqueMap.set(chapter.time.toString(), chapter);
      });

      const result = Array.from(uniqueMap.values()).sort((a, b) => a.time - b.time);
      cache.timecodes.set(cacheKey, result);

      if (result.length > 0) {
        updateTimecodePanel(result);
        if (timeSettings.autoSave) saveTimecodesToStorage(result);
      }

      return result;
    };

    const getYouTubeChapters = () => {
      const selectors = [
        'ytd-macro-markers-list-renderer ytd-macro-markers-list-item-renderer',
        'ytd-chapter-list-renderer ytd-chapter-renderer'
      ];

      let items = [];
      for (const sel of selectors) {
        items = Array.from(document.querySelectorAll(sel));
        if (items.length) break;
      }

      if (!items.length) return [];

      const chapters = new Map();
      items.forEach(item => {
        const timeText = item.querySelector('.time-info, .timestamp')?.textContent;
        const titleText = item.querySelector('.marker-title, .chapter-title')?.textContent;

        if (timeText) {
          const time = parseTimeString(timeText.trim());
          if (time !== null) {
            chapters.set(time.toString(), {
              time,
              label: titleText?.trim() || formatTime(time),
              isChapter: true
            });
          }
        }
      });

      return Array.from(chapters.values()).sort((a, b) => a.time - b.time);
    };

    // Settings panel
    const addTimecodePanelSettings = () => {
      const advancedSection = document.querySelector('.ytp-plus-settings-section[data-section="advanced"]');
      if (!advancedSection || document.querySelector('.timecode-settings-item')) return;

      if (!document.getElementById('timecode-shortcut-styles')) {
        const style = document.createElement('style');
        style.id = 'timecode-shortcut-styles';
        style.textContent = `
          .timecode-shortcut-editor { display: flex; align-items: center; gap: 8px; }
          .timecode-shortcut-editor select, #timecode-key {
            background: rgba(34, 34, 34, var(--yt-header-bg-opacity));
            color: var(--yt-spec-text-primary);
            border: 1px solid var(--yt-spec-10-percent-layer);
            border-radius: var(--yt-radius-sm);
            padding: 4px;
          }
        `;
        document.head.appendChild(style);
      }

      const { ctrlKey, altKey, shiftKey } = timeSettings.shortcut;
      const modifierValue = [
        ctrlKey && altKey && shiftKey && 'ctrl+alt+shift',
        ctrlKey && altKey && 'ctrl+alt',
        ctrlKey && shiftKey && 'ctrl+shift', 
        altKey && shiftKey && 'alt+shift',
        ctrlKey && 'ctrl',
        altKey && 'alt',
        shiftKey && 'shift'
      ].find(Boolean) || 'none';

      const enableDiv = document.createElement('div');
      enableDiv.className = 'ytp-plus-settings-item timecode-settings-item';
      enableDiv.innerHTML = `
        <div>
          <label class="ytp-plus-settings-item-label">Timecode Panel</label>
          <div class="ytp-plus-settings-item-description">Enable video timecode/chapter panel with quick navigation</div>
        </div>
        <input type="checkbox" class="ytp-plus-settings-checkbox" data-setting="enabled" ${timeSettings.enabled ? 'checked' : ''}>
      `;

      const shortcutDiv = document.createElement('div');
      shortcutDiv.className = 'ytp-plus-settings-item timecode-settings-item timecode-shortcut-item';
      shortcutDiv.style.display = timeSettings.enabled ? 'flex' : 'none';
      shortcutDiv.innerHTML = `
        <div>
          <label class="ytp-plus-settings-item-label">Keyboard Shortcut</label>
          <div class="ytp-plus-settings-item-description">Customize keyboard combination to toggle timecode panel</div>
        </div>
        <div class="timecode-shortcut-editor">
          <select id="timecode-modifier-combo">
            ${['none', 'ctrl', 'alt', 'shift', 'ctrl+alt', 'ctrl+shift', 'alt+shift', 'ctrl+alt+shift']
              .map(v => `<option value="${v}" ${v === modifierValue ? 'selected' : ''}>${v === 'none' ? 'None' : v.split('+').map(k => k.charAt(0).toUpperCase() + k.slice(1)).join('+')}</option>`)
              .join('')}
          </select>
          <span>+</span>
          <input type="text" id="timecode-key" value="${timeSettings.shortcut.key}" maxlength="1" style="width: 30px; text-align: center;">
        </div>
      `;

      advancedSection.append(enableDiv, shortcutDiv);

      // Event listeners
      advancedSection.addEventListener('change', e => {
        if (e.target.matches('.ytp-plus-settings-checkbox[data-setting="enabled"]')) {
          timeSettings.enabled = e.target.checked;
          shortcutDiv.style.display = timeSettings.enabled ? 'flex' : 'none';
          toggleTimecodePanel(timeSettings.enabled);
          saveSettings();
        }
      });

      document.getElementById('timecode-modifier-combo')?.addEventListener('change', e => {
        const value = e.target.value;
        timeSettings.shortcut.ctrlKey = value.includes('ctrl');
        timeSettings.shortcut.altKey = value.includes('alt'); 
        timeSettings.shortcut.shiftKey = value.includes('shift');
        saveSettings();
      });

      document.getElementById('timecode-key')?.addEventListener('input', e => {
        if (e.target.value) {
          timeSettings.shortcut.key = e.target.value.toUpperCase();
          saveSettings();
        }
      });
    };

    // CSS
    const insertTimecodeStyles = () => {
      if (document.getElementById('timecode-panel-styles')) return;
      const style = document.createElement('style');
      style.id = 'timecode-panel-styles';
      style.textContent = `
        #timecode-panel{position:fixed;right:20px;top:80px;background:rgba(34,34,34,.9);border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.4);width:250px;max-height:70vh;z-index:9999;color:#fff;backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.1);transition:transform .3s,opacity .3s;overflow:hidden;display:flex;flex-direction:column}
        #timecode-panel.hidden{transform:translateX(270px);opacity:0;pointer-events:none}
        #timecode-panel.auto-tracking{border-color:rgba(255,0,0,.5)}
        #timecode-header{display:flex;justify-content:space-between;align-items:center;padding:12px;border-bottom:1px solid rgba(255,255,255,.1);background:rgba(0,0,0,.3);cursor:move}
        #timecode-title{font-weight:500;margin:0;font-size:14px;user-select:none;display:flex;align-items:center;gap:8px}
        #timecode-tracking-indicator{width:8px;height:8px;background:red;border-radius:50%;opacity:0;transition:opacity .3s}
        #timecode-panel.auto-tracking #timecode-tracking-indicator{opacity:1}
        #timecode-current-time{font-family:monospace;font-size:12px;padding:2px 6px;background:rgba(255,0,0,.3);border-radius:3px;margin-left:auto}
        #timecode-close{background:0 0;border:none;color:rgba(255,255,255,.7);cursor:pointer;width:24px;height:24px;padding:0;transition:color .2s;display:flex;align-items:center;justify-content:center}
        #timecode-close:hover{color:#fff}
        #timecode-list{overflow-y:auto;padding:8px 0;max-height:calc(70vh - 80px);scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.3) transparent}
        #timecode-list::-webkit-scrollbar{width:6px}
        #timecode-list::-webkit-scrollbar-thumb{background:rgba(255,255,255,.3);border-radius:3px}
        .timecode-item{padding:8px 12px;display:flex;align-items:center;cursor:pointer;transition:background-color .2s;border-left:3px solid transparent;position:relative}
        .timecode-item:hover{background:rgba(255,255,255,.1)}
        .timecode-item.active{background:rgba(255,0,0,.25);border-left-color:red}
        .timecode-item.active.pulse{animation:pulse .8s ease-out}
        @keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.02)}100%{transform:scale(1)}}
        .timecode-time{font-family:monospace;margin-right:10px;color:rgba(255,255,255,.8);font-size:13px;min-width:45px}
        .timecode-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;flex:1}
        .timecode-item.has-chapter .timecode-time{color:#ff4444}
        .timecode-progress{width:0;height:2px;background:#ff4444;position:absolute;bottom:0;left:0;transition:width .3s;opacity:.8}
        #timecode-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;text-align:center;color:rgba(255,255,255,.7);font-size:13px}
        #timecode-form{padding:10px;border-top:1px solid rgba(255,255,255,.1);display:none}
        #timecode-form.visible{display:block}
        #timecode-form input{width:100%;padding:6px 8px;background:rgba(0,0,0,.4);border:1px solid rgba(255,255,255,.3);border-radius:4px;color:#fff;font-size:13px;margin-bottom:8px}
        #timecode-form-buttons{display:flex;justify-content:flex-end;gap:8px}
        #timecode-form button{padding:5px 10px;border-radius:4px;border:none;cursor:pointer;font-size:12px}
        #timecode-form button.save{background:rgba(255,0,0,.8);color:#fff}
        #timecode-actions{display:flex;padding:10px;border-top:1px solid rgba(255,255,255,.1);gap:8px}
        #timecode-add-btn,#timecode-export-btn,#timecode-track-toggle{background:rgba(255,255,255,.15);color:#fff;border:none;border-radius:4px;padding:6px 10px;cursor:pointer;font-size:12px;flex:1;transition:background .2s}
        #timecode-add-btn:hover,#timecode-export-btn:hover,#timecode-track-toggle:hover{background:rgba(255,255,255,.25)}
        #timecode-track-toggle.active{background:rgba(255,0,0,.7)}
        @media (max-width:768px){#timecode-panel{right:10px;width:200px;max-height:50vh}}
      `;
      document.head.appendChild(style);
    };

    // Panel creation
    const createTimecodePanel = () => {
      if (cache.dom.panel) return cache.dom.panel;

      const panel = document.createElement('div');
      panel.id = 'timecode-panel';
      panel.className = timeSettings.enabled ? '' : 'hidden';
      if (timeSettings.autoTrackPlayback) panel.classList.add('auto-tracking');

      panel.innerHTML = `
        <div id="timecode-header">
          <h3 id="timecode-title">
            <div id="timecode-tracking-indicator"></div>
            Timecodes
            <span id="timecode-current-time"></span>
          </h3>
          <button id="timecode-close">×</button>
        </div>
        <div id="timecode-list"></div>
        <div id="timecode-empty">
          <div>No timecodes found</div>
          <div style="margin-top:5px;font-size:12px">Click + to add current time</div>
        </div>
        <div id="timecode-form">
          <input type="text" id="timecode-form-time" placeholder="Time (e.g., 1:30)">
          <input type="text" id="timecode-form-label" placeholder="Label (optional)">
          <div id="timecode-form-buttons">
            <button type="button" id="timecode-form-cancel">Cancel</button>
            <button type="button" id="timecode-form-save" class="save">Save</button>
          </div>
        </div>
        <div id="timecode-actions">
          <button id="timecode-add-btn">+ Add</button>
          <button id="timecode-export-btn" ${timeSettings.export ? '' : 'style="display:none"'}>Export</button>
          <button id="timecode-track-toggle" class="${timeSettings.autoTrackPlayback ? 'active' : ''}">${timeSettings.autoTrackPlayback ? 'Tracking' : 'Track'}</button>
        </div>
      `;

      // Cache DOM elements
      cache.dom = {
        panel,
        list: panel.querySelector('#timecode-list'),
        empty: panel.querySelector('#timecode-empty'),
        form: panel.querySelector('#timecode-form'),
        timeInput: panel.querySelector('#timecode-form-time'),
        labelInput: panel.querySelector('#timecode-form-label'),
        currentTime: panel.querySelector('#timecode-current-time'),
        trackToggle: panel.querySelector('#timecode-track-toggle')
      };

      // Event delegation
      panel.addEventListener('click', handlePanelClick);
      makeDraggable(panel);
      
      document.body.appendChild(panel);
      return panel;
    };

    // Event handling
    const handlePanelClick = e => {
      const { target } = e;
      const item = target.closest('.timecode-item');

      if (target.id === 'timecode-close') {
        toggleTimecodePanel(false);
      } else if (target.id === 'timecode-add-btn') {
        const video = document.querySelector('video');
        if (video) showTimecodeForm(video.currentTime);
      } else if (target.id === 'timecode-track-toggle') {
        timeSettings.autoTrackPlayback = !timeSettings.autoTrackPlayback;
        target.textContent = timeSettings.autoTrackPlayback ? 'Tracking' : 'Track';
        target.classList.toggle('active', timeSettings.autoTrackPlayback);
        cache.dom.panel.classList.toggle('auto-tracking', timeSettings.autoTrackPlayback);
        saveSettings();
        if (timeSettings.autoTrackPlayback) startTracking();
      } else if (target.id === 'timecode-export-btn') {
        exportTimecodes();
      } else if (target.id === 'timecode-form-cancel') {
        hideTimecodeForm();
      } else if (target.id === 'timecode-form-save') {
        saveTimecodeForm();
      } else if (item && !target.closest('.timecode-actions')) {
        const time = parseFloat(item.dataset.time);
        const video = document.querySelector('video');
        if (video && !isNaN(time)) {
          video.currentTime = time;
          if (video.paused) video.play();
          updateActiveItem(item);
        }
      }
    };

    // Form handling
    const showTimecodeForm = (currentTime, existingLabel = '') => {
      const { form, timeInput, labelInput } = cache.dom;
      form.classList.add('visible');
      timeInput.value = formatTime(currentTime);
      labelInput.value = existingLabel;
      requestAnimationFrame(() => labelInput.focus());
    };

    const hideTimecodeForm = () => {
      cache.dom.form.classList.remove('visible');
    };

    const saveTimecodeForm = () => {
      const { timeInput, labelInput } = cache.dom;
      const timeValue = timeInput.value.trim();
      const labelValue = labelInput.value.trim();

      const time = parseTimeString(timeValue);
      if (time === null) {
        showNotification("Invalid time format");
        return;
      }

      const timecodes = getCurrentTimecodes();
      const newTimecode = {
        time,
        label: labelValue || formatTime(time),
        isUserAdded: true
      };

      timecodes.push(newTimecode);
      const sorted = timecodes.sort((a, b) => a.time - b.time);
      
      updateTimecodePanel(sorted);
      saveTimecodesToStorage(sorted);
      hideTimecodeForm();
      showNotification("Timecode added");
    };

    // Export
    const exportTimecodes = () => {
      const timecodes = getCurrentTimecodes();
      if (!timecodes.length) {
        showNotification("No timecodes to export");
        return;
      }

      const videoTitle = document.title.replace(/\s-\sYouTube$/, "");
      let content = `${videoTitle}\n\nTimecodes:\n`;
      timecodes.forEach(tc => {
        content += `${formatTime(tc.time)} - ${tc.label}\n`;
      });

      if (navigator.clipboard?.writeText) {
        navigator.clipboard.writeText(content).then(() => {
          showNotification("Timecodes copied to clipboard");
        });
      }
    };

    // Panel updates
    const updateTimecodePanel = timecodes => {
      const { list, empty } = cache.dom;
      if (!list || !empty) return;

      const isEmpty = !timecodes.length;
      empty.style.display = isEmpty ? 'flex' : 'none';
      list.style.display = isEmpty ? 'none' : 'block';

      if (isEmpty) return;

      const fragment = document.createDocumentFragment();
      timecodes.forEach((tc, i) => {
        const item = document.createElement('div');
        item.className = 'timecode-item';
        if (tc.isChapter) item.classList.add('has-chapter');
        item.dataset.time = tc.time;
        item.dataset.index = i;

        const timeStr = formatTime(tc.time);
        const label = tc.label?.trim() || timeStr;

        item.innerHTML = `
          <div class="timecode-time">${timeStr}</div>
          <div class="timecode-label">${label.replace(/[<>&"']/g, c => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;', "'": '&#39;' })[c])}</div>
          <div class="timecode-progress"></div>
        `;

        fragment.appendChild(item);
      });

      list.innerHTML = '';
      list.appendChild(fragment);
    };

    const updateActiveItem = activeItem => {
      const items = cache.dom.list?.querySelectorAll('.timecode-item');
      if (!items) return;

      items.forEach(item => item.classList.remove('active', 'pulse'));
      if (activeItem) {
        activeItem.classList.add('active', 'pulse');
        setTimeout(() => activeItem.classList.remove('pulse'), 800);
      }
    };

    // Tracking
    const startTracking = () => {
      if (cache.trackingId) return;

      const track = () => {
        const video = document.querySelector('video');
        const { panel, currentTime, list } = cache.dom;

        if (!video || !panel || panel.classList.contains('hidden')) {
          cache.trackingId = requestAnimationFrame(track);
          return;
        }

        if (currentTime) {
          currentTime.textContent = formatTime(video.currentTime);
        }

        // Update active item
        const items = list?.querySelectorAll('.timecode-item');
        if (items?.length) {
          let activeIndex = -1;
          let nextIndex = -1;

          for (let i = 0; i < items.length; i++) {
            const time = parseFloat(items[i].dataset.time);
            if (video.currentTime >= time) {
              activeIndex = i;
            } else if (nextIndex === -1) {
              nextIndex = i;
            }
          }

          if (cache.lastActiveIndex !== activeIndex) {
            if (cache.lastActiveIndex !== null && items[cache.lastActiveIndex]) {
              items[cache.lastActiveIndex].classList.remove('active');
            }

            if (activeIndex >= 0) {
              items[activeIndex].classList.add('active');
              if (timeSettings.smoothScrolling) {
                items[activeIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
              }
            }

            cache.lastActiveIndex = activeIndex;
          }

          // Update progress
          if (activeIndex >= 0 && nextIndex >= 0) {
            const current = parseFloat(items[activeIndex].dataset.time);
            const next = parseFloat(items[nextIndex].dataset.time);
            const progress = ((video.currentTime - current) / (next - current)) * 100;
            const progressEl = items[activeIndex].querySelector('.timecode-progress');
            if (progressEl) {
              progressEl.style.width = `${Math.min(100, Math.max(0, progress))}%`;
            }
          }
        }

        cache.trackingId = requestAnimationFrame(track);
      };

      cache.trackingId = requestAnimationFrame(track);
    };

    // Drag functionality
    const makeDraggable = panel => {
      const header = panel.querySelector('#timecode-header');
      let isDragging = false, startX, startY, startLeft, startTop;

      header.addEventListener('mousedown', e => {
        if (e.button !== 0) return;
        isDragging = true;
        startX = e.clientX;
        startY = e.clientY;
        startLeft = panel.offsetLeft;
        startTop = panel.offsetTop;

        const move = e => {
          if (!isDragging) return;
          const x = Math.max(0, Math.min(window.innerWidth - panel.offsetWidth, startLeft + e.clientX - startX));
          const y = Math.max(0, Math.min(window.innerHeight - panel.offsetHeight, startTop + e.clientY - startY));
          panel.style.left = x + 'px';
          panel.style.top = y + 'px';
        };

        const stop = () => {
          isDragging = false;
          document.removeEventListener('mousemove', move);
          document.removeEventListener('mouseup', stop);
        };

        document.addEventListener('mousemove', move);
        document.addEventListener('mouseup', stop);
      });
    };

    // Storage
    const saveTimecodesToStorage = timecodes => {
      const videoId = new URLSearchParams(window.location.search).get("v");
      if (!videoId) return;

      try {
        const minimal = timecodes.map(tc => ({
          t: tc.time,
          l: tc.label?.trim() || formatTime(tc.time),
          c: tc.isChapter || false
        }));
        localStorage.setItem(`yt_tc_${videoId}`, JSON.stringify(minimal));
      } catch (e) {}
    };

    const loadTimecodesFromStorage = () => {
      const videoId = new URLSearchParams(window.location.search).get("v");
      if (!videoId) return null;

      try {
        const data = localStorage.getItem(`yt_tc_${videoId}`);
        return data ? JSON.parse(data).map(tc => ({
          time: tc.t,
          label: tc.l,
          isChapter: tc.c
        })).sort((a, b) => a.time - b.time) : null;
      } catch (e) {
        return null;
      }
    };

    const getCurrentTimecodes = () => {
      const items = cache.dom.list?.querySelectorAll('.timecode-item');
      if (!items) return [];

      return Array.from(items).map(item => ({
        time: parseFloat(item.dataset.time),
        label: item.querySelector('.timecode-label')?.textContent || formatTime(parseFloat(item.dataset.time)),
        isChapter: item.classList.contains('has-chapter')
      })).sort((a, b) => a.time - b.time);
    };

    // Toggle panel
    const toggleTimecodePanel = show => {
      const panel = cache.dom.panel || createTimecodePanel();
      if (show === undefined) show = panel.classList.contains('hidden');
      
      panel.classList.toggle('hidden', !show);

      if (show) {
        const saved = loadTimecodesFromStorage();
        if (saved?.length) {
          updateTimecodePanel(saved);
        } else if (timeSettings.autoDetect) {
          detectTimecodes();
        }
        
        if (timeSettings.autoTrackPlayback) startTracking();
      } else if (cache.trackingId) {
        cancelAnimationFrame(cache.trackingId);
        cache.trackingId = 0;
      }
    };

    // Navigation handling
    const setupNavigation = () => {
      let currentVideoId = new URLSearchParams(window.location.search).get("v");

      document.addEventListener('yt-navigate-finish', () => {
        const newVideoId = new URLSearchParams(window.location.search).get("v");
        if (newVideoId === currentVideoId || window.location.pathname !== '/watch') return;

        currentVideoId = newVideoId;
        cache.lastActiveIndex = null;
        cache.timecodes.clear();

        if (timeSettings.enabled && cache.dom.panel && !cache.dom.panel.classList.contains('hidden')) {
          const saved = loadTimecodesFromStorage();
          if (saved?.length) {
            updateTimecodePanel(saved);
          } else if (timeSettings.autoDetect) {
            setTimeout(detectTimecodes, 500);
          }
          if (timeSettings.autoTrackPlayback) startTracking();
        }
      });
    };

    // Keyboard shortcuts
    const setupKeyboard = () => {
      document.addEventListener('keydown', e => {
        if (e.target.matches('input, textarea, [contenteditable]')) return;

        const { key, shiftKey, altKey, ctrlKey } = timeSettings.shortcut;
        if (e.key.toUpperCase() === key && e.shiftKey === shiftKey && 
            e.altKey === altKey && e.ctrlKey === ctrlKey) {
          e.preventDefault();
          toggleTimecodePanel();
        }
      });
    };

    // Initialize
    const init = () => {
      loadSettings();
      insertTimecodeStyles();
      setupKeyboard();
      setupNavigation();

      // Settings modal observer
      const observer = new MutationObserver(mutations => {
        for (const mutation of mutations) {
          for (const node of mutation.addedNodes) {
            if (node.classList?.contains('ytp-plus-settings-modal')) {
              setTimeout(addTimecodePanelSettings, 100);
              return;
            }
          }
        }

        if (document.querySelector('.ytp-plus-settings-section[data-section="advanced"]:not(.hidden)') && 
            !document.querySelector('.timecode-settings-item')) {
          setTimeout(addTimecodePanelSettings, 50);
        }
      });

      observer.observe(document.body, { 
        childList: true, 
        subtree: true, 
        attributes: true, 
        attributeFilter: ['class'] 
      });

      document.addEventListener('click', e => {
        if (e.target.classList?.contains('ytp-plus-settings-nav-item') && 
            e.target.dataset.section === 'advanced') {
          setTimeout(addTimecodePanelSettings, 50);
        }
      }, true);

      if (timeSettings.enabled) {
        createTimecodePanel();
        const saved = loadTimecodesFromStorage();
        if (saved?.length) {
          updateTimecodePanel(saved);
        } else if (timeSettings.autoDetect) {
          setTimeout(detectTimecodes, 1000);
        }
        if (timeSettings.autoTrackPlayback) startTracking();
      }
    };

    // Cleanup
    window.addEventListener('beforeunload', () => {
      if (cache.trackingId) cancelAnimationFrame(cache.trackingId);
      cache.intervals.forEach(id => clearInterval(id));
    });

    // Start
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', init);
    } else {
      init();
    }
  })();

})();