{"version":3,"sources":["jsdelivr-header.js","/npm/@athari/monkeyutils@0.5.8/monkeyutils.u.js"],"names":[],"mappings":"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","file":"/npm/@athari/monkeyutils@0.5.8/monkeyutils.u.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@athari/monkeyutils@0.5.8/monkeyutils.u.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","((factory, global = this) => {\r\n  typeof module === 'object' && module.exports ? module.exports = factory() :\r\n  typeof define === 'function' && define.amd ? define([], factory) :\r\n  ((global?.globalThis ?? global ?? self).athari ??= {}).monkeyutils = factory();\r\n  //(global?.globalThis ?? global ?? self)[id] = factory();\r\n})(() => {\r\n  'use strict'\r\n\r\n  const O = Object, A = Array;\r\n  const mimeType = {\r\n    appJson: 'application/json',\r\n    appXHtml: 'application/xhtml+xml',\r\n    appXml: 'application/xml',\r\n    imageSvg: 'image/svg+xml',\r\n    multiFormData: 'multipart/form-data',\r\n    textHtml: 'text/html',\r\n    textPlain: 'text/plain',\r\n    textXml: 'text/xml',\r\n  };\r\n  const httpHeader = {\r\n    contentType: 'content-type',\r\n  };\r\n  const dl = {\r\n    arraybuffer: 'arraybuffer', blob: 'blob', bytes: 'bytes', form: 'form', html: 'html', json: 'json',\r\n    response: 'response', stream: 'stream', svg: 'svg', text: 'text', xhtml: 'xhtml', xml: 'xml',\r\n  };\r\n\r\n  // MARK: Types\r\n\r\n  const isBoolean = (v) => typeof v === 'boolean' || v instanceof Boolean;\r\n  const isArray = (v) => A.isArray(v);\r\n  const isNumber = (v) => (typeof v === 'number' || v instanceof Number) && !isNaN(v);\r\n  const isFiniteNumber = (v) => typeof v === 'number' && !isNaN(v) && isFinite(v);\r\n  const isFunction = (v) => typeof v === 'function';\r\n  const isObject = (v) => v !== null && typeof v === 'object' && !A.isArray(v);\r\n  const isString = (v) => typeof v === 'string' || v instanceof String;\r\n  const isSymbol = (v) => typeof v === 'symbol';\r\n  const isUndefined = (v) => v === undefined;\r\n\r\n  const isPropFluent = (prop, fluent) => O.getPrototypeOf(fluent).hasOwnProperty(prop);\r\n\r\n  const assignDeep = (target, ...sources) => {\r\n    if (!sources.length)\r\n      return target;\r\n    const source = sources.shift();\r\n    if (isObject(target) && isObject(source)) {\r\n      for (const key in source) {\r\n        if (isObject(source[key])) {\r\n          if (!target[key])\r\n            O.assign(target, { [key]: {} });\r\n          assignDeep(target[key], source[key]);\r\n        } else {\r\n          O.assign(target, { [key]: source[key] });\r\n        }\r\n      }\r\n    }\r\n    return assignDeep(target, ...sources);\r\n  };\r\n\r\n  // MARK: Time\r\n\r\n  class StatefulPromise extends Promise {\r\n    #success = null\r\n    #value = null\r\n    #error = null\r\n\r\n    constructor(executor) {\r\n      super((yay, nay) => {\r\n        executor(\r\n          value => ([ this.#success, this.#value ] = [ true, value ], yay(value)),\r\n          error => ([ this.#success, this.#error ] = [ false, error ], nay(error)),\r\n        );\r\n      });\r\n    }\r\n\r\n    get success() { return this.#success }\r\n    get value() { return this.#value }\r\n    get error() { return this.#error }\r\n\r\n    static resolve(value) { return super.resolve.call(StatefulPromise, value) }\r\n    static reject(error) { return super.reject.call(StatefulPromise, error) }\r\n  }\r\n\r\n  const now = typeof performance !== 'undefined' ? performance.now.bind(performance) : Date.now;\r\n\r\n  const delay = (ms) =>\r\n    new Promise(yay => setTimeout(yay, ms));\r\n\r\n  const waitForCallback = () => {\r\n    let yay, nay, promise = new Promise((y, n) => [ yay, nay ] = [ y, n ]);\r\n    return [ promise, yay, nay ];\r\n  };\r\n\r\n  const waitForEvent = (obj, eventName) =>\r\n    new Promise(yay => obj.addEventListener(eventName, yay, { once: true }));\r\n\r\n  const waitForDocumentReady = async (state = 'interactive') => {\r\n    const states = { loading: 0, interactive: 1, complete: 2 };\r\n    const currentState = states[document.readyState], neededState = states[state];\r\n    if (currentState >= neededState)\r\n      return document.readyState;\r\n    return await new Promise((yay) => document.addEventListener('readystatechange', () => {\r\n      if (document.readyState == state)\r\n        yay(document.readyState);\r\n    }))\r\n  };\r\n\r\n  const waitFor = async (predicate, ms = +Infinity) => {\r\n    for (let ret, timeout = now() + ms; now() < timeout; await delay(100))\r\n      if (ret = predicate())\r\n        return ret;\r\n    return null;\r\n  };\r\n\r\n  const waitForActionFast = (predicate) => {\r\n    let result = predicate(), none = {};\r\n    return result instanceof Promise\r\n      ? StatefulPromise.race([ result, none ]).then(\r\n        value => value !== none ? StatefulPromise.resolve(value) : new StatefulPromise(result.then.bind(result)),\r\n        error => StatefulPromise.reject(error),\r\n      )\r\n      : StatefulPromise.resolve(result);\r\n  };\r\n\r\n  const waitForFast = (predicate, onYay) => {\r\n    const result = predicate();\r\n    if (result)\r\n      return onYay(result);\r\n    const wait = waitFor(predicate), instant = {};\r\n    const promise = StatefulPromise.race([ wait, instant ]).then(\r\n      value => value !== instant ? StatefulPromise.resolve(value) : new StatefulPromise(wait.then.bind(wait)),\r\n      error => StatefulPromise.reject(error));\r\n    if (promise.success === false)\r\n      throw promise.error;\r\n    return promise.success === true ? onYay(promise.value) : promise.then(onYay);\r\n  };\r\n\r\n  const withTimeout = async (promise, ms) => {\r\n    let timer = null;\r\n    const timeout = new Promise((_, nay) =>\r\n      timer = setTimeout(() => nay(new Error(`Timed out after ${ms} ms.`)), ms));\r\n    try {\r\n      return await Promise.race([promise, timeout]);\r\n    } finally {\r\n      clearTimeout(timer);\r\n    }\r\n  };\r\n\r\n  // MARK: Strings\r\n\r\n  const h = s => S(s).escapeHTML();\r\n  const u = s => h(encodeURIComponent(s));\r\n  const f = (s, ...args) => s.replace(/%(\\d+)%/g, (m, i) => args[+i]);\r\n\r\n  const numberRange = (start, count) => Array(count).fill().map((_, i) => start + i);\r\n\r\n  const repeatValue = (value, count) => Array(count).fill(value);\r\n\r\n  const win1251ToUtf8Map = [\r\n    ...numberRange(0, 128), // ASCII\r\n    ...\"ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬\\xAD®Ї°±Ііґµ¶·ё№є»јЅѕї\".split(\"\").map(c => c.charCodeAt(0)),\r\n    ...numberRange(1040, 64), // Russian alphabet\r\n  ];\r\n\r\n  const utf8ToWin1251Map = win1251ToUtf8Map.reduce((o, v, i) => (v !== null && (o[v] = i), o), {});\r\n\r\n  const utf8ToEncoding = (str, map, options = {}) => {\r\n    options = Object.assign({ encode: false, fatal: false }, options);\r\n    const sb = [];\r\n    for (let i = 0; i < str.length; i++) {\r\n      const c = map[str.charCodeAt(i)];\r\n      if (c !== undefined)\r\n        sb.push(options.encode\r\n          ? (c < 128 ? str[i] : `%${c.toString(16)}`)\r\n          : String.fromCharCode(c));\r\n      else if (options.fatal)\r\n        throw new Error(`Unsupported character: ${str.charAt(i)}`);\r\n    }\r\n    return sb.join(\"\");\r\n  };\r\n\r\n  const utf8ToWin1251 = (str, options = {}) => utf8ToEncoding(str, utf8ToWin1251Map, options);\r\n\r\n  // MARK: URIs\r\n\r\n  const toUrl = (url) =>\r\n    url instanceof URL || url instanceof Location ? url : new URL(url, location?.href);\r\n\r\n  const urlSearch = (url) =>\r\n    O.fromEntries(new URLSearchParams(toUrl(url).search));\r\n\r\n  const matchUrl = (url, host, patterns = {}) => {\r\n    const p = new URLPattern({ hostname: `(www\\.)?${host}`, ...patterns }).exec(toUrl(url));\r\n    return p == null ? p : { ...p, ...p.hostname.groups, ...p.pathname.groups, ...p.search.groups, ...p.hash.groups };\r\n  };\r\n\r\n  const matchLocation = (host, patterns = {}, url = null) =>\r\n    matchUrl(url ?? location.href, host, patterns);\r\n\r\n  const adjustUrlSearch = (url, search) => {\r\n    url = toUrl(url);\r\n    const adjustedSearch = new URLSearchParams({ ...urlSearch(url), ...search });\r\n    return toUrl(`${url.origin}${url.pathname}?${adjustedSearch}`, url.href).toString();\r\n  }\r\n\r\n  const adjustLocationSearch = (search) =>\r\n    adjustUrlSearch(location, search);\r\n\r\n  /**\r\n   * @param {String|URL} url\r\n   * @param {'arraybuffer'|'blob'|'bytes'|'form'|'json'|'response'|'stream'|'text'|'html'|'svg'|'xhtml'|'xml'} type\r\n   * @param {RequestInit} init\r\n   * @param {*} options\r\n   * @returns {ArrayBuffer|Blob|Int8Array|FormData|Object|Response|ReadableStream|String|HTMLDocument|XMLDocument}\r\n   */\r\n  const download = async (url, type = null, init = {}, options = { encoding: null, fetch: null }) => {\r\n    const response = await (options.fetch ?? fetch)(url, assignDeep({\r\n      credentials: 'include',\r\n      headers: {\r\n        'accept-encoding': \"gzip, deflate, br, zstd\",\r\n      },\r\n    }, init));\r\n    if (!response.ok)\r\n      throw new Error(`Failed to download ${url} (${response.status} ${response.statusText})`);\r\n    const getText = async () => options.encoding == null\r\n      ? await response.text()\r\n      : new TextDecoder(options.encoding).decode(await response.arrayBuffer());\r\n    const getDom = async (mime) => new DOMParser().parseFromString(await getText(), mime);\r\n    const contentType = response.headers.get(httpHeader.contentType)?.split(\";\", 1)[0]?.toLowerCase() ?? 'none';\r\n    type ??= {\r\n      [mimeType.appJson]: dl.json,\r\n      [mimeType.appXHtml]: dl.xhtml,\r\n      [mimeType.appXml]: dl.xml,\r\n      [mimeType.imageSvg]: dl.svg,\r\n      [mimeType.multiFormData]: dl.form,\r\n      [mimeType.textHtml]: dl.html,\r\n      [mimeType.textXml]: dl.xml,\r\n    }[contentType] ?? Object.entries({\r\n      [dl.text]: /^text\\/.+|^application\\/(javascript|ecmascript)$/,\r\n      [dl.xml]: /\\+xml$/,\r\n    }).filter(([ _, re ]) => re.test(contentType)).map(([ type ]) => type)[0];\r\n    switch (type) {\r\n      case dl.arraybuffer:\r\n        return await response.arrayBuffer();\r\n      case dl.blob:\r\n        return await response.blob();\r\n      case dl.bytes:\r\n        return await response.bytes();\r\n      case dl.form:\r\n        return await response.formData();\r\n      case dl.json:\r\n        return await response.json();\r\n      case dl.response:\r\n        return response;\r\n      case dl.stream:\r\n        return response.body;\r\n      case dl.text:\r\n        return await getText();\r\n      case dl.html:\r\n        return await getDom(mimeType.textHtml);\r\n      case dl.svg:\r\n        return await getDom(mimeType.imageSvg);\r\n      case dl.xhtml:\r\n        return await getDom(mimeType.appXHtml);\r\n      case dl.xml:\r\n        return await getDom(mimeType.appXml);\r\n      default:\r\n        throw new RangeError(`unexpected type '${type}' (${httpHeader.contentType} '${contentType}')`);\r\n    }\r\n  };\r\n\r\n  // MARK: Errors\r\n\r\n  const throwError = (ex) => {\r\n    throw ex instanceof Error ? ex : new Error(ex);\r\n  };\r\n\r\n  const attempt = (actionOrName, action = null, log = console.error) => {\r\n    const handleError = ex => log(`Failed to ${action != null ? actionOrName : \"perform action\"} at location:`, location.href, \"error:\", ex);\r\n    try {\r\n      let ret = (action ?? actionOrName)();\r\n      if (ret instanceof Promise)\r\n        ret = ret.catch(handleError);\r\n      return ret;\r\n    } catch(ex) {\r\n      handleError(ex);\r\n    }\r\n  };\r\n\r\n  // MARK: Hacks\r\n\r\n  /** @callback GetterCallback @param {} field Field value @returns {} Final value to return from property */\r\n  /** @callback SetterCallback @param {} value New value   @returns {} Final value to assign to property */\r\n  /**\r\n   * @param {object|function} optionsOrSet Options\r\n   * @param {} optionsOrSet.value Initial value\r\n   * @param {GetterCallback} optionsOrSet.get Getter\r\n   * @param {SetterCallback} optionsOrSet.set Setter\r\n  */\r\n  const overrideProperty = (o, prop, optionsOrSet = {}) => {\r\n    let { value, get, set, log } = isObject(optionsOrSet) ? optionsOrSet : { set: optionsOrSet };\r\n    const logMessage = isString(log) ? log : prop;\r\n    const logAccess = (verb, value, accessor = true) => {\r\n      if (log != null && accessor) {\r\n        let clone = value;\r\n        if (value?.constructor === O)\r\n          attempt(\"clone value\", () => clone = structuredClone(value), console.warn);\r\n        console.info(`${verb} ${logMessage}`, clone);\r\n      }\r\n    };\r\n    if (O.hasOwn(o, prop)) {\r\n      if (value === undefined)\r\n        value = set != null ? set(o[prop]) : o[prop];\r\n      attempt(`delete ${prop} property`, () =>\r\n        delete o[prop]);\r\n    }\r\n    attempt(`define ${prop} property`, () =>\r\n      O.defineProperty(o, prop, {\r\n        get: () => {\r\n          logAccess(\"get retrieve\", value);\r\n          const ret = get != null ? get(value) : value;\r\n          logAccess(\"get override\", ret, get);\r\n          return ret;\r\n        },\r\n        set: (v) => {\r\n          logAccess(\"set original\", value);\r\n          value = set != null ? set(v) : v;\r\n          logAccess(\"set modified\", value, set);\r\n        },\r\n      }));\r\n  };\r\n\r\n  const overrideFunction = (o, prop, fun, out, proc) => {\r\n    const originalProp = o[prop];\r\n    let result;\r\n    try {\r\n      o[prop] = function(...args) {\r\n        const ret = fun?.(originalProp, ...args);\r\n        result = out ? out(ret, ...args) : ret;\r\n        return ret;\r\n      };\r\n      proc?.();\r\n    } finally {\r\n      if (proc != null)\r\n        o[prop] = originalProp;\r\n    }\r\n    return result;\r\n  };\r\n\r\n  const overrideFetch = (window, override = { fakeResponse: null, modifyRequestUrl: null, modifyRequestJson: null, modifyResponseJson: null }) => {\r\n    const tryParseJson = (s, message) => {\r\n      try {\r\n        return JSON.parse(s);\r\n      } catch (ex) {\r\n        console.error(message, ex);\r\n      }\r\n    }\r\n    const { fetch: originalFetch } = window;\r\n    window.fetch = async (...args) => {\r\n      let [ resource, options ] = args;\r\n      const url = toUrl(resource), search = urlSearch(url), requestUrl = url.toString();\r\n      const input = { resource, url, search };\r\n\r\n      // Fake response\r\n      if (override.fakeResponse != null) {\r\n        let fakeResponse = undefined;\r\n        override.fakeResponse(input, new class {\r\n          init = { status: 200, statusText: \"OK\" }\r\n          #setFakeResponse(body, headers) {\r\n            fakeResponse = new Response(body, O.assign(this.init, { headers }))\r\n          }\r\n          text(body) {\r\n            this.#setFakeResponse(body, { [httpHeader.contentType]: mimeType.textPlain });\r\n            console.info(\"fake text\", requestUrl, body);\r\n          }\r\n          json(body) {\r\n            this.#setFakeResponse(JSON.stringify(body), { [httpHeader.contentType]: mimeType.appJson });\r\n            console.info(\"fake json\", requestUrl, structuredClone(body));\r\n          }\r\n        });\r\n        if (fakeResponse !== undefined)\r\n          return fakeResponse;\r\n      }\r\n\r\n      // Modify query url\r\n      if (override.modifyRequestUrl != null) {\r\n        const modifiedRequestUrl = override.modifyRequestUrl(input);\r\n        if (modifiedRequestUrl !== undefined) {\r\n          console.info(\"redirect\", requestUrl, \" -> \", modifiedRequestUrl);\r\n          resource = modifiedRequestUrl.toString();\r\n        }\r\n      }\r\n\r\n      // Modify query body\r\n      if (override.modifyRequestJson != null && options.headers[httpHeader.contentType].includes(mimeType.appJson)) {\r\n        const requestJson = tryParseJson(options.body, \"invalid request json\");\r\n        if (requestJson !== undefined) {\r\n          const modifiedRequestJson = override.modifyRequestJson(input, requestJson);\r\n          if (modifiedRequestJson != null)\r\n            options.body = JSON.stringify(modifiedRequestJson);\r\n        }\r\n      }\r\n\r\n      // Perform query\r\n      const response = await originalFetch(resource, options);\r\n      const contentType = response.headers.get(httpHeader.contentType);\r\n      if (!contentType || !contentType.includes(mimeType.appJson))\r\n        return response;\r\n\r\n      let responseJson = undefined;\r\n      try {\r\n        responseJson = await response.clone().json();\r\n        console.info(\"original json\", requestUrl, structuredClone(responseJson));\r\n      } catch (ex) {\r\n        console.error(\"invalid response json\", requestUrl, ex);\r\n      }\r\n\r\n      // Modify response JSON\r\n      if (override.modifyResponseJson != null) {\r\n        const modifiedResponseJson = override.modifyResponseJson(input, responseJson);\r\n        if (modifiedResponseJson !== undefined) {\r\n          response.json = async () => modifiedResponseJson;\r\n          console.info(\"modified json\", requestUrl, structuredClone(responseJson));\r\n        }\r\n      }\r\n\r\n      return response;\r\n    };\r\n  };\r\n\r\n  const overrideXmlHttpRequest = (window, override = { on: {} }) => {\r\n    window.XMLHttpRequest = class extends window.XMLHttpRequest {\r\n      //#eventNames = Reflect.ownKeys(XMLHttpRequestEventTarget.prototype).filter(k => k.startsWith?.('on')).map(k => k.substring(2)).concat([ 'readystatechange' ])\r\n      #eventNames = [ 'abort', 'error', 'load', 'loadend', 'loadstart', 'progress', 'readystatechange', 'timeout' ]\r\n      #writablePropNames = [ 'responseType', 'timeout', 'withCredentials' ]\r\n      #readonlyPropNames = [ 'readyState', 'response', 'responseText', 'responseURL', 'responseXML', 'status', 'statusText', 'upload' ]\r\n      #on = { }\r\n      #onOverride = { }\r\n      #options = {\r\n        async: null,\r\n        body: null,\r\n        headers: {},\r\n        method: null,\r\n        mime: null,\r\n        mode: null,\r\n        password: null,\r\n        responseType: \"\",\r\n        timeout: 0,\r\n        url: null,\r\n        username: null,\r\n        withCredentials: false,\r\n      }\r\n      #props = {\r\n        readyState: undefined,\r\n        response: undefined,\r\n        responseHeaders: {},\r\n        responseText: undefined,\r\n        reponseURL: undefined,\r\n        reponseXML: undefined,\r\n        status: undefined,\r\n        statusText: undefined,\r\n        upload: undefined,\r\n      }\r\n\r\n      constructor(params) {\r\n        super(params);\r\n        Object.assign(this.#options, params);\r\n        Object.assign(this.#onOverride, override.on);\r\n        for (const eventName of this.#eventNames) {\r\n          Object.defineProperty(this, `on${eventName}`, {\r\n            get: () => this.#on[eventName]?.[0] ?? null,\r\n            set: v => this.#on[eventName] = [ v ],\r\n          });\r\n        }\r\n        for (const propName of this.#writablePropNames) {\r\n          Object.defineProperty(this, propName, {\r\n            get: () => this.#options[propName],\r\n            set: v => this.#options[propName] = v,\r\n          });\r\n        }\r\n        for (const propName of this.#readonlyPropNames) {\r\n          Object.defineProperty(this, propName, {\r\n            get: () => this.#props[propName] !== undefined ? this.#props[propName] : super[propName],\r\n            set: v => this.#props[propName] = v,\r\n          });\r\n        }\r\n      }\r\n\r\n      #createCustomEvent(eventName) {\r\n        return Object.defineProperties(new Event(eventName), {\r\n          target: { value: this, enumerable: true },\r\n          currentTarget: { value: this, enumerable: true },\r\n        });\r\n      }\r\n\r\n      #callSuperMethod(methodName, ...args) {\r\n        const call = () => super[methodName](...args);\r\n        console.log(`XMLHttpRequest.${methodName}`, args, this);\r\n        return this.#onOverride[methodName] != null\r\n          ? this.#onOverride[methodName](this.#createCustomEvent(methodName), call) : call();\r\n      }\r\n\r\n      addEventListener(type, listener, options) {\r\n        (this.#on[type] ??= []).push(listener);\r\n        //return super.addEventListener(type, listener, options);\r\n      }\r\n\r\n      removeEventListener(type, listener, options) {\r\n        if (this.#on[type] == null)\r\n          return;\r\n        const index = this.#on[type].indexOf(listener);\r\n        if (index != -1)\r\n          this.#on[type].splice(index, 1);\r\n        //return super.removeEventListener(type, listener, options);\r\n      }\r\n\r\n      overrideMimeType(mime) {\r\n        Object.assign(this.#options, { mime });\r\n        return super.overrideMimeType(mime);\r\n      }\r\n\r\n      setRequestHeader(name, value) {\r\n        name = name.toLowerCase();\r\n        this.#options.headers[name] = value;\r\n        return super.setRequestHeader(name, value);\r\n      }\r\n\r\n      getAllResponseHeaders() {\r\n        return super.getAllResponseHeaders()\r\n          .trimEnd().split(/[\\r\\n]+/)\r\n          .map(h => h.match(/: /)?.slice(1) ?? [ h ])\r\n          .map(([ hk, hv ]) => hv === undefined ? hk : `${hk}: ${this.#props.responseHeaders[hk.toLowerCase()] ?? hv}\\r\\n`)\r\n          .join(\"\");\r\n      }\r\n\r\n      getResponseHeader(name) {\r\n        name = name.toLowerCase();\r\n        return this.#props.responseHeaders[name] ?? super.getResponseHeader(name);\r\n      }\r\n\r\n      open(method = 'GET', url = location.href, async = true, username = null, password = null) {\r\n        Object.assign(this.#options, { method, url, async, username, password });\r\n        this.#callSuperMethod(this.open.name, method, url, async, username, password);\r\n      }\r\n\r\n      send(body) {\r\n        Object.assign(this.#options, { body });\r\n        for (const eventName of this.#eventNames) {\r\n          super.addEventListener(eventName, e => {\r\n            const on = (e) => this.#on[eventName]?.forEach(h => h(e));\r\n            const onOverride = this.#onOverride[eventName];\r\n            if (onOverride != null)\r\n              return onOverride(e, on)\r\n            else if (on != null)\r\n              return on(e);\r\n          });\r\n        }\r\n        this.#callSuperMethod(this.send.name, body);\r\n      }\r\n    }\r\n  };\r\n\r\n  const reviveConsole = async (window) => {\r\n    return waitForFast(() => document.body, body => {\r\n      body.insertAdjacentHTML('beforeEnd', /*html*/`<iframe style=\"display: none\">`);\r\n      window.console = body.lastChild.contentWindow.console;\r\n    });\r\n  }\r\n\r\n  // MARK: HTML\r\n\r\n  const setElementTagName = (elSource, tagName) => {\r\n    const el = document.createElement(tagName);\r\n    while (elSource.firstChild != null)\r\n      el.appendChild(elSource.firstChild);\r\n    for (let i = 0; i < elSource.attributes.length; i++)\r\n      el.attributes.setNamedItem(elSource.attributes[i].cloneNode());\r\n    elSource.replaceWith(el);\r\n    return el;\r\n  };\r\n\r\n  const wrapElement = (el, tagName, options = { copyAttrs: false }) => {\r\n    const wrapper = document.createElement(tagName);\r\n    if (options.copyAttrs)\r\n      for (let i = 0; i < el.attributes.length; i++)\r\n        wrapper.attributes.setNamedItem(el.attributes[i].cloneNode());\r\n    el.parentNode.insertBefore(wrapper, el);\r\n    wrapper.appendChild(el);\r\n    return wrapper;\r\n  };\r\n\r\n  // MARK: Fluent\r\n\r\n  const gmResources = () => O.fromEntries(O.entries(GM_info.script.resources).map(([, v]) => [v.name, v]));\r\n\r\n  const ress = (map = gmResources(), params = { props: [], wait: false }) => new Proxy(map, new class {\r\n    //constructor() { console.debug(\"res\", { map, ...params }); }\r\n    #fluent = new class {\r\n      get #path() { return params.props.join(\"-\") }\r\n      get wait() { return ress(map, { ...params, wait: true }) }\r\n      get bytes() { return map[this.#path].content } // Greasymonkey-only\r\n      get url() { return map[this.#path].url }\r\n      get data() { return params.wait ? GM.getResourceUrl(this.#path) : GM_getResourceURL(this.#path) }\r\n      get text() { return params.wait ? GM.getResourceText(this.#path) : GM_getResourceText(this.#path) }\r\n    }\r\n    get(_, prop) {\r\n      if (isPropFluent(prop, this.#fluent))\r\n        return this.#fluent[prop];\r\n      return ress(map, { ...params, props: params.props.concat(prop) });\r\n    }\r\n  });\r\n\r\n  const scripts = (res) => new Proxy({}, new class {\r\n    #scripts = {}\r\n    get(_, prop) { return this.#scripts[prop] ?? import(res.script[prop].url).then(js => this.#scripts[prop] = js) }\r\n  });\r\n\r\n  const els = (el = document, map = {}, params = {\r\n    method: 'querySelector', wait: false, wrap: null,\r\n    syntax: (o, p) => o[p] ?? p,\r\n  }) => new Proxy(map, new class {\r\n    //constructor() { console.debug(\"query\", { el, map, ...params }) }\r\n    #fluent = new class {\r\n      get self() { return el }\r\n      get all() { return els(el, map, { ...params, method: 'querySelectorAll' }) }\r\n      get is() { return els(el, map, { ...params, method: 'matches' }) }\r\n      get parent() { return els(el, map, { ...params, method: 'closest' }) }\r\n      get tag() { return els(el, map, { ...params, syntax: (_, p) => p }) }\r\n      get id() { return els(el, map, { ...params, syntax: (_, p) => `#${p}` }) }\r\n      get cls() { return els(el, map, { ...params, syntax: (_, p) => `.${p}` }) }\r\n      get wait() { return els(el, map, { ...params, wait: true }) }\r\n      get wrap() { return els(el, map, { ...params, wrap: map }) }\r\n      wraps(wrap) { return els(el, map, { ...params, wrap }) }\r\n    }\r\n    get(t, prop) {\r\n      if (isObject(t[prop]))\r\n        return els(el, t[prop], params);\r\n      if (isPropFluent(prop, this.#fluent))\r\n        return this.#fluent[prop];\r\n      const { method, wait, wrap, syntax } = params;\r\n      const query = () => el[method](syntax(t, prop) ?? throwError(prop));\r\n      const wrapper = wrap == null ? (i) => i : (i) => i != null ? els(i, wrap) : null;\r\n      return method == 'querySelectorAll' ? [...query()].map(wrapper) : wait ? waitFor(query).then(wrapper) : wrapper(query());\r\n    }\r\n  });\r\n\r\n  const opts = (map) => new Proxy(map, {\r\n    get: (t, prop) => GM_getValue(prop, t[prop]),\r\n    set: (t, prop, value) => (GM_setValue(prop, value), true),\r\n  });\r\n\r\n  const props = (el, map = {}) => new Proxy(map, new class {\r\n    get(t, prop) { return prop.startsWith('--') ? el.style.getPropertyValue(prop) : el.dataset[prop] }\r\n  });\r\n\r\n  // MARK: Export\r\n\r\n  return {\r\n    isBoolean, isArray, isNumber, isFiniteNumber, isFunction, isObject, isString, isSymbol, isUndefined, assignDeep,\r\n    delay, waitForCallback, waitForEvent, waitForDocumentReady, waitFor, withTimeout,\r\n    h, u, f, utf8ToWin1251,\r\n    toUrl, urlSearch, matchUrl, matchLocation, adjustUrlSearch, adjustLocationSearch, download,\r\n    throwError, attempt,\r\n    overrideProperty, overrideFunction, overrideFetch, overrideXmlHttpRequest, reviveConsole,\r\n    setElementTagName, wrapElement,\r\n    ress, scripts, els, opts, props,\r\n  };\r\n});"]}